From 5d1f977abd2453d2e70e0e2419c63b660034f153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sat, 10 Oct 2026 16:00:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BB=98=E6=AC=BE=E7=94=B3=E8=AF=B7?= =?UTF-8?q?=E7=BA=B3=E5=85=A5=E9=87=91=E8=9D=B6=E5=8D=95=E6=8D=AE=E9=94=81?= =?UTF-8?q?=E5=AE=9A=E4=B8=8E=E8=A7=A3=E9=94=81=E6=B5=81=E7=A8=8B=EF=BC=88?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E5=90=8E=E9=94=81=E5=8D=95-=E5=88=A0?= =?UTF-8?q?=E5=8D=95=E5=9B=9E=E8=B0=83=E8=BF=98=E5=8E=9F-=E4=BD=9C?= =?UTF-8?q?=E5=BA=9F=E5=AE=88=E5=8D=AB-=E9=94=81=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pojo/vo/PaymentApplicationVO.java | 3 + .../impl/KingdeeBillLockServiceImpl.java | 18 ++++++ .../impl/PaymentApplicationServiceImpl.java | 59 ++++++++++++++++++- ...BusiData锁定-unLockNotifyBusiData回调-失败补偿-删单还原).md | 34 +++++++---- 4 files changed, 103 insertions(+), 11 deletions(-) diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/PaymentApplicationVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/PaymentApplicationVO.java index 0d74f7f4..d8bc998f 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/PaymentApplicationVO.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/PaymentApplicationVO.java @@ -46,6 +46,9 @@ public class PaymentApplicationVO extends PaymentApplication { @TableField(exist = false) private Integer attachmentCount; @TableField(exist = false) private String attachmentSyncStatus; @TableField(exist = false) private String attachmentSyncStatusName; + @TableField(exist = false) private String kingdeeLockStatus; + @TableField(exist = false) private String kingdeeLockFailReason; + @TableField(exist = false) private Integer kingdeeTryCount; @TableField(exist = false) private List invoices; @TableField(exist = false) private List paymentRecords; @TableField(exist = false) private List settlements; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/KingdeeBillLockServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/KingdeeBillLockServiceImpl.java index 6198c49e..d3982a09 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/KingdeeBillLockServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/KingdeeBillLockServiceImpl.java @@ -24,12 +24,15 @@ import org.springblade.transport.constant.TransportBusiConstant; import org.springblade.transport.mapper.FormalSettlementMapper; import org.springblade.transport.mapper.InvoiceApplicationMapper; import org.springblade.transport.mapper.KingdeeBillLockMapper; +import org.springblade.transport.mapper.PaymentApplicationMapper; import org.springblade.transport.pojo.entity.FormalSettlement; import org.springblade.transport.pojo.entity.InvoiceApplication; import org.springblade.transport.pojo.entity.KingdeeBillLock; +import org.springblade.transport.pojo.entity.PaymentApplication; import org.springblade.transport.service.IFormalSettlementService; import org.springblade.transport.service.IInvoiceApplicationService; import org.springblade.transport.service.IKingdeeBillLockService; +import org.springblade.transport.service.IPaymentApplicationService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -66,6 +69,7 @@ public class KingdeeBillLockServiceImpl extends ServiceImpl targetBillNos) { @@ -210,6 +214,20 @@ public class KingdeeBillLockServiceImpl extends ServiceImpl { + PaymentApplication application = paymentApplicationMapper.selectById(lockRecord.getSourceBillId()); + if (application == null || Objects.equals(application.getIsDeleted(), 1)) { + log.warn("金蝶删单回调源付款申请不存在:id={}", lockRecord.getSourceBillId()); + return; + } + if (TransportBusiConstant.VOIDED.equals(application.getApprovalStatus())) { + log.info("金蝶删单回调源付款申请[{}]已作废(幂等跳过)", application.getPaymentNo()); + return; + } + // 复用 ADR-0005 解锁口径:不作废源单,kingdeeStatus→生成失败、清编号内码(原值留档), + // 不自动重推,人工核实后重新推送(A103-2 勾稽预检防重复推单) + SpringUtil.getBean(IPaymentApplicationService.class).unlockBill(application.getId(), "金蝶删单回调"); + } default -> log.warn("金蝶删单回调暂不支持的单据类型:targetBillType={}(映射预留)", lockRecord.getTargetBillType()); } } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java index 41efc41b..a82aa259 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java @@ -51,6 +51,7 @@ import org.springblade.thirdparty.bfi.util.BfiUtil; import org.springblade.transport.config.BfiProperties; import org.springblade.transport.constant.KingdeeAttachmentConstant; import org.springblade.transport.constant.KingdeeBfiConstant; +import org.springblade.transport.constant.KingdeeLockConstant; import org.springblade.transport.constant.TransportBusiConstant; import org.springblade.transport.mapper.BillLedgerMapper; import org.springblade.transport.mapper.BillLedgerUsageMapper; @@ -82,6 +83,7 @@ import org.springblade.transport.pojo.entity.FormalSettlement; import org.springblade.transport.pojo.entity.FormalSettlementDetail; import org.springblade.transport.pojo.entity.FormalSettlementPayment; import org.springblade.transport.pojo.entity.FormalSettlementSource; +import org.springblade.transport.pojo.entity.KingdeeBillLock; import org.springblade.transport.pojo.entity.PaymentApplication; import org.springblade.transport.pojo.entity.PaymentApplicationInvoice; import org.springblade.transport.pojo.entity.PaymentApplicationRecord; @@ -93,6 +95,7 @@ import org.springblade.transport.pojo.entity.TemporaryCreditLimit; import org.springblade.transport.pojo.vo.PaymentApplicationReferenceAmountVO; import org.springblade.transport.pojo.vo.PaymentApplicationVO; import org.springblade.transport.service.IFormalSettlementService; +import org.springblade.transport.service.IKingdeeBillLockService; import org.springblade.transport.service.IPaymentApplicationService; import org.springblade.transport.service.KingdeeSyncContext; import org.springblade.transport.support.KingdeeApBillSyncSupport; @@ -155,6 +158,7 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl rows) { + if (Func.isEmpty(rows)) { + return; + } + Map lockMap = kingdeeBillLockService.mapActiveLocks(KingdeeLockConstant.SOURCE_PAY_APPLY, + rows.stream().map(PaymentApplicationVO::getId).toList()); + for (PaymentApplicationVO vo : rows) { + KingdeeBillLock lockRecord = lockMap.get(vo.getId()); + if (lockRecord == null) { + continue; + } + vo.setKingdeeLockStatus(lockRecord.getLockStatus()); + vo.setKingdeeLockFailReason(lockRecord.getFailReason()); + vo.setKingdeeTryCount(lockRecord.getTryCount()); + } + } + @Override public PaymentApplicationVO detail(Long id) { PaymentApplication entity = existing(id); PaymentApplicationVO vo = PaymentApplicationWrapper.build().entityVO(entity); + fillKingdeeLockStatus(List.of(vo)); vo.setInvoices(invoiceMapper.selectList(Wrappers.lambdaQuery() .eq(PaymentApplicationInvoice::getPaymentApplicationId, id).orderByAsc(PaymentApplicationInvoice::getLineNo))); vo.setPaymentRecords(recordMapper.selectList(Wrappers.lambdaQuery() @@ -386,6 +416,8 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl