diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/FormalSettlementController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/FormalSettlementController.java index d128ed17..af725976 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/FormalSettlementController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/FormalSettlementController.java @@ -232,6 +232,13 @@ public class FormalSettlementController extends BladeController { @Operation(summary = "推送金蝶(应付单/应收单)") public R syncKingdee(@RequestParam Long id) { return R.data(formalSettlementService.syncKingdee(id)); } + @PostMapping("/invoice-assign-kingdee") + @ApiOperationSupport(order = 14) + @Operation(summary = "发票登记确认推送金蝶(先票后款:认领收票单逐单 A302-6 指定应付)") + public R invoiceAssignKingdee(@RequestParam Long id) { + return R.data(formalSettlementService.pushInvoiceAssignKingdee(id)); + } + @PostMapping("/sync-kingdee-ar-result") @ApiOperationSupport(order = 15) @Operation(summary = "手动勾稽金蝶应收单(A302-4 回写纠偏)") diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IFormalSettlementService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IFormalSettlementService.java index daf1d429..54ecb4a3 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IFormalSettlementService.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IFormalSettlementService.java @@ -62,6 +62,16 @@ public interface IFormalSettlementService extends BaseService */ String doSyncKingdee(Long id); + /** + * 发票登记确认推送金蝶(先票后款路径B:结算单审批通过后"发票登记"关联收票单 → 指定应付)。 + * 前置:付款结算单 + 审批通过 + 财务应付单已同步;对本单认领且收票单已推(pushed)的 + * 逐单调 A302-6 指定应付,单笔失败整体报因(已指定的幂等跳过,可重试) + * + * @param settlementId 正式结算单id + * @return 推送结果描述 + */ + String pushInvoiceAssignKingdee(Long settlementId); + /** * 独立事务落"生成失败"状态并记失败原因(在推送事务回滚、行锁释放后执行,与付款/收票口径统一); * 仅更新审批通过且未同步的单据,未审批/已同步/已删除单据自动跳过,保持原状态 diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java index 0e978b4f..cf2759e9 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java @@ -1004,6 +1004,8 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl entryGroups = kingdeeApBillSyncSupport.resolveEntryGroups(settlement, details, context); KingdeeApBillSyncSupport.BfiApBillPushOutcome outcome = kingdeeApBillSyncSupport.pushApBill( apBillSrcCode, settlement, entryGroups, settlement.getFormalSettlementNo(), context); @@ -1038,11 +1040,58 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl details = detailMapper.selectList(Wrappers.lambdaQuery() + .eq(FormalSettlementDetail::getFormalSettlementId, settlementId) + .eq(FormalSettlementDetail::getIsDeleted, 0) + .orderByAsc(FormalSettlementDetail::getLineNo)); + if (Func.isEmpty(details)) { + throw new ServiceException("推送失败:正式结算单无结算明细,无法组装财务应付单防重键"); + } + String apBillSrcCode = kingdeeApBillSyncSupport.apBillSrcCode(settlement, details); + String assignFailures = invoiceReceiptService.assignClaimedReceipts(settlement.getId(), apBillSrcCode); + if (Func.isNotBlank(assignFailures)) { + log.warn("正式结算单[{}]发票登记推送金蝶存在失败:{}", settlement.getFormalSettlementNo(), assignFailures); + throw new ServiceException("发票登记推送金蝶完成,存在失败(已指定的幂等跳过,处理后可重试):" + assignFailures); + } + log.info("正式结算单[{}]发票登记推送金蝶完成:认领收票单已全部指定应付,应付单防重键={}", + settlement.getFormalSettlementNo(), apBillSrcCode); + return "发票登记推送金蝶成功:认领收票单已指定应付"; + } + @Override public String syncKingdeeArResult() { return kingdeeSyncLockSupport.runSingleFlight(AR_RESULT_SYNC_LOCK_PREFIX, bfiProperties.getArResult().getLockLeaseSeconds(), @@ -1246,6 +1295,13 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl allInvoiceNos = new LinkedHashSet<>(existingNumbers); + allInvoiceNos.addAll(invoiceNumbers); + invoiceReceiptService.syncSettlementReceiptRelations(settlement.getId(), new ArrayList<>(allInvoiceNos)); + } } private String createPayment(FormalSettlement settlement, BigDecimal appliedAmount, String remark) { @@ -1716,6 +1772,10 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl(invoiceNumbers)); + } } private void refreshSettlementAmount(FormalSettlement settlement) {