diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/listener/KingdeeApprovalSyncListener.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/listener/KingdeeApprovalSyncListener.java index 185a0c56..50a9ebd0 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/listener/KingdeeApprovalSyncListener.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/listener/KingdeeApprovalSyncListener.java @@ -22,7 +22,9 @@ package org.springblade.transport.listener; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.transport.config.BfiProperties; +import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.event.KingdeeBillApprovedEvent; +import org.springblade.transport.pojo.entity.PaymentApplication; import org.springblade.transport.service.IFormalSettlementService; import org.springblade.transport.service.IInvoiceApplicationService; import org.springblade.transport.service.IInvoiceReceiptService; @@ -115,6 +117,15 @@ public class KingdeeApprovalSyncListener { if (!bfiProperties.getAutoSync().isPayment()) { return; } + // 付款特批未完成(高风险/黑名单/额度超额)时金蝶必然拒推:跳过而非置失败, + // 特批通过后由 HcsPaymentSyncSupport 重新发布本事件自动补推 + PaymentApplication payment = paymentApplicationService.getById(id); + if (payment != null && payment.getHcsSpecStatus() != null + && List.of(HcsSyncConstant.SPEC_STATUS_NEED, HcsSyncConstant.SPEC_STATUS_PUSHING, + HcsSyncConstant.SPEC_STATUS_PROCESSING).contains(payment.getHcsSpecStatus())) { + log.info("付款申请[{}]审批通过自动同步金蝶跳过(付款特批未完成):hcsSpecStatus={}", id, payment.getHcsSpecStatus()); + return; + } log.info("付款申请[{}]审批通过自动同步金蝶开始", id); String kingdeeBillId = paymentApplicationService.syncKingdee(id); log.info("付款申请[{}]审批通过自动同步金蝶完成:kingdeeBillId={}", id, kingdeeBillId); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java index ccab31e5..bc1008f0 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java @@ -34,8 +34,10 @@ import org.springblade.hcs.config.HcsProperties; import org.springblade.hcs.dto.HcsLegalResultDTO; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.constant.TransportBusiConstant; +import org.springblade.transport.event.KingdeeBillApprovedEvent; import org.springblade.transport.mapper.PaymentApplicationMapper; import org.springblade.transport.pojo.entity.PaymentApplication; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @@ -66,6 +68,7 @@ public class HcsPaymentSyncSupport { private final HcsProperties hcsProperties; private final HcsSpecPaySyncSupport hcsSpecPaySyncSupport; private final HcsPerfRecordSyncSupport hcsPerfRecordSyncSupport; + private final ApplicationEventPublisher eventPublisher; /** * 推送付款申请到 HCS:特批(如需)→ 履约记录(新建/更新)→ 回填整体同步状态 @@ -140,6 +143,7 @@ public class HcsPaymentSyncSupport { syncPaymentOnSpecResult(payment, HcsSyncConstant.SPEC_STATUS_APPROVED.equals(result)); payment.setHcsSpecStatus(result); paymentApplicationMapper.updateById(payment); + publishKingdeeAutoSyncOnSpecApproved(payment, result); log.info("HCS特批结果人工确认:paymentNo={},specFdId={},结果={}", payment.getPaymentNo(), payment.getHcsSpecFdId(), result); return "特批结果已确认:" + result; } @@ -179,10 +183,22 @@ public class HcsPaymentSyncSupport { syncPaymentOnSpecResult(payment, HcsSyncConstant.SPEC_STATUS_APPROVED.equals(status)); payment.setHcsSpecStatus(status); paymentApplicationMapper.updateById(payment); + publishKingdeeAutoSyncOnSpecApproved(payment, status); log.info("付款特批结果推送处理完成:paymentNo={},结果={},reason={}", payment.getPaymentNo(), status, param.getReason()); return "特批结果已处理:" + status; } + /** + * 特批通过后自动补推金蝶:审批通过时因特批挂起已跳过同步(见 KingdeeApprovalSyncListener), + * 此处重新发布审批通过事件复用同一条自动推送链(开关、失败落库与重推兜底口径不变) + */ + private void publishKingdeeAutoSyncOnSpecApproved(PaymentApplication payment, String specStatus) { + if (!HcsSyncConstant.SPEC_STATUS_APPROVED.equals(specStatus)) { + return; + } + eventPublisher.publishEvent(new KingdeeBillApprovedEvent(KingdeeBillApprovedEvent.BIZ_PAYMENT_APPLICATION, payment.getId())); + } + /** * 特批结果联动付款审批状态(handleLegalResult 与 confirmSpecResult 共用,仅改字段,随 updateById 落库): * approved 恢复"审批通过"展示并放行(审批状态保持 approved,金蝶推送门禁解除);