diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ReceiptClaimRecordController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ReceiptClaimRecordController.java index 3db05ad5..3b7b80fc 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ReceiptClaimRecordController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ReceiptClaimRecordController.java @@ -83,16 +83,9 @@ public class ReceiptClaimRecordController extends BladeController { @PostMapping("/void") @ApiOperationSupport(order = 4) - @Operation(summary = "作废认领记录并生成金蝶认领冲单") + @Operation(summary = "作废认领记录(作废后同步合同合规系统)") public R voidClaim(@RequestParam Long id) { receiptClaimRecordService.voidClaim(id); return R.success("作废成功"); } - - @PostMapping("/query-kingdee-result") - @ApiOperationSupport(order = 5) - @Operation(summary = "查询金蝶认领结果(A301-1 收款单查询回写)") - public R queryKingdeeResult() { - return R.data(receiptClaimRecordService.refreshKingdeeResult()); - } } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IReceiptClaimRecordService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IReceiptClaimRecordService.java index efd68227..38eb870f 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IReceiptClaimRecordService.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IReceiptClaimRecordService.java @@ -46,11 +46,4 @@ public interface IReceiptClaimRecordService extends BaseService { void updateAttachments(ReceiptClaimAttachmentsRequest request); void voidClaim(Long id); - - /** - * A301-1 收款单查询回写认领结果:按来源单据编码匹配金蝶收款单,推进金蝶单据状态 - * - * @return 回写条数 - */ - int refreshKingdeeResult(); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptClaimRecordServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptClaimRecordServiceImpl.java index dc68308c..15d509ff 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptClaimRecordServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptClaimRecordServiceImpl.java @@ -33,12 +33,6 @@ import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.utils.Func; -import org.springblade.thirdparty.bfi.constant.BfiConstant; -import org.springblade.thirdparty.bfi.pojo.dto.BfiRecBillQueryDTO; -import org.springblade.thirdparty.bfi.pojo.vo.BfiRecBillVO; -import org.springblade.thirdparty.bfi.service.IBfiService; -import org.springblade.thirdparty.bfi.util.BfiUtil; -import org.springblade.transport.constant.KingdeeBfiConstant; import org.springblade.transport.mapper.FormalSettlementMapper; import org.springblade.transport.mapper.KingdeeReceiptFlowMapper; import org.springblade.transport.mapper.ReceiptClaimMapper; @@ -53,20 +47,21 @@ import org.springblade.transport.pojo.entity.ReceiptFlowRecord; import org.springblade.transport.pojo.vo.ReceiptClaimRecordVO; import org.springblade.transport.service.IReceiptClaimRecordService; import org.springblade.transport.service.IFormalSettlementService; +import org.springblade.transport.support.hcs.HcsClaimSyncSupport; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; @@ -84,21 +79,13 @@ public class ReceiptClaimRecordServiceImpl extends BaseServiceImpl selectPage(IPage page, @@ -203,10 +190,6 @@ public class ReceiptClaimRecordServiceImpl extends BaseServiceImpl relations = claimSettlementMapper.selectList( Wrappers.lambdaQuery() @@ -256,9 +239,8 @@ public class ReceiptClaimRecordServiceImpl extends BaseServiceImpl - * 回写口径:A301-1 契约本身不支持按来源单号过滤,故按近 30 天业务日期窗口全量翻页后, - * 以金蝶收款单 sourcebillnumber == 流水 awrp_src_code(A301-3 推送时按流水生成、重试复用)在本地匹配; - * 仅推进金蝶回写状态与补登收款单号,不改本地认领金额/分摊;名下未作废认领主单冗余展示字段级联刷新。 - * - * @return 回写条数 - */ - @Override - public int refreshKingdeeResult() { - List pending = receiptFlowMapper.selectList( - Wrappers.lambdaQuery() - .eq(KingdeeReceiptFlow::getPushStatus, KingdeeBfiConstant.RECEIPT_CLAIM_PUSH_PUSHED) - .in(KingdeeReceiptFlow::getKingdeeBillStatus, - List.of(KingdeeBfiConstant.KINGDEE_STATUS_PUSHED, APPROVED)) - .eq(KingdeeReceiptFlow::getStatus, 1) - .orderByAsc(KingdeeReceiptFlow::getId)); - if (pending.isEmpty()) { - log.info("金蝶认领结果回写:无待回写流水(已推送/已审核且未终态)"); - return 0; - } - Set srcCodes = pending.stream() - .map(KingdeeReceiptFlow::getAwrpSrcCode) - .filter(Func::isNotEmpty) - .collect(Collectors.toSet()); - if (srcCodes.isEmpty()) { - return 0; - } - log.info("金蝶认领结果回写:待回写流水 {} 条", pending.size()); - - LocalDate end = LocalDate.now(); - LocalDate begin = end.minusDays(RESULT_WINDOW_DAYS); - long start = System.currentTimeMillis(); - log.info("调用BFI接口 收款单查询开始,业务日期窗口 {} ~ {}", begin, end); - List rows = BfiUtil.queryAllPages(pageNo -> { - BfiRecBillQueryDTO dto = new BfiRecBillQueryDTO(); - dto.setPageNo(pageNo); - dto.setPageSize(RESULT_PAGE_SIZE); - dto.setBeginBizdate(begin.format(DateTimeFormatter.ISO_LOCAL_DATE)); - dto.setEndBizdate(end.format(DateTimeFormatter.ISO_LOCAL_DATE)); - return bfiService.queryRecBill(dto); + // 作废事务提交后同步合规 C107-3(fdStatus=1 已作废,失败仅记日志不回滚作废) + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override + public void afterCommit() { + hcsClaimSyncSupport.voidClaimToHcs(claim.getId()); + } }); - log.info("调用BFI接口 收款单查询结束 耗时:{}ms,拉取 {} 条", System.currentTimeMillis() - start, rows.size()); - - // 窗口内收款单按 sourcebillnumber 匹配待回写来源编码,同键多单取首条 - Map matched = rows.stream() - .filter(row -> Func.isNotEmpty(row.getSourcebillnumber())) - .filter(row -> srcCodes.contains(row.getSourcebillnumber())) - .collect(Collectors.toMap(BfiRecBillVO::getSourcebillnumber, Function.identity(), - (first, second) -> first, HashMap::new)); - int updated = 0; - for (KingdeeReceiptFlow flow : pending) { - BfiRecBillVO bill = matched.get(flow.getAwrpSrcCode()); - if (bill == null) { - // 窗口内未查到:金蝶回单延迟/状态未同步,不改状态,由下次回写或人工处置兜底 - continue; - } - // 推送成功时金蝶收款单号先以来源编码占位(A301-3 响应 number 为空,取回执 keys.awrp_src_code), - // 回写命中后以金蝶真实收款单号覆盖 - if (Func.isNotEmpty(bill.getBillno())) { - flow.setKingdeeBillNo(bill.getBillno()); - } - flow.setKingdeeBillStatus(billStatusOf(bill.getBillstatus())); - receiptFlowMapper.updateById(flow); - // 级联刷新名下未作废认领主单的冗余展示字段 - baseMapper.update(null, Wrappers.lambdaUpdate() - .eq(ReceiptClaim::getReceiptFlowId, flow.getId()) - .eq(ReceiptClaim::getClaimStatus, CLAIMED) - .set(ReceiptClaim::getKingdeeBillNo, flow.getKingdeeBillNo()) - .set(ReceiptClaim::getKingdeeBillStatus, flow.getKingdeeBillStatus())); - updated++; - log.info("金蝶认领结果回写 flowId:{},awrpSrcCode:{},金蝶收款单号:{},状态:{} → {}", - flow.getId(), flow.getAwrpSrcCode(), bill.getBillno(), bill.getBillstatus(), - flow.getKingdeeBillStatus()); - } - log.info("金蝶认领结果回写完成:匹配 {} 条,更新 {} 条", matched.size(), updated); - return updated; - } - - /** - * 金蝶收款单单据状态 → 本地认领金蝶状态 - * - * @param billStatus 金蝶 billstatus(A暂存/B已提交/C已审核/D已收款/G已退单) - * @return 本地状态 - */ - private String billStatusOf(String billStatus) { - if (BfiConstant.BILL_STATUS_RECEIVED.equals(billStatus)) { - return KingdeeBfiConstant.KINGDEE_STATUS_RECEIVED; - } - if (BfiConstant.BILL_STATUS_AUDITED.equals(billStatus)) { - return APPROVED; - } - if (BfiConstant.BILL_STATUS_DRAFT.equals(billStatus) - || BfiConstant.BILL_STATUS_SUBMITTED.equals(billStatus)) { - return KingdeeBfiConstant.KINGDEE_STATUS_PUSHED; - } - // 其余状态(含 G 已退单)按处理失败回收,提示人工在金蝶核查 - log.warn("金蝶收款单状态[{}]未匹配映射,认领回写按 failed 处理", billStatus); - return KingdeeBfiConstant.KINGDEE_STATUS_FAILED; } private void fillStatusNames(ReceiptClaimRecordVO record) { @@ -399,17 +287,6 @@ public class ReceiptClaimRecordServiceImpl extends BaseServiceImpl