From 3ddf0448105c6b96e9d9cc5a4b2d62c109c506c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Fri, 23 Oct 2026 17:22:18 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BB=98=E6=AC=BE=E7=89=B9=E6=89=B9?= =?UTF-8?q?=E6=9C=AA=E9=80=9A=E8=BF=87=E5=89=8D=E4=B8=8D=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E5=B1=A5=E7=BA=A6=E6=95=B0=E6=8D=AE=EF=BC=8C=E7=89=B9=E6=89=B9?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E5=90=8E=E8=87=AA=E5=8A=A8=E8=A1=A5=E6=8E=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 发起 C106-3 后挂起等待特批结果,审核期间仅回填整体同步状态,不再推送履约计划 C103-9 与履约记录 C108; 合规回调或人工确认特批通过后补推履约数据并联动金蝶,驳回不产生履约数据。 --- .../support/hcs/HcsPaymentSyncSupport.java | 50 +++++++++++++++++-- 1 file changed, 45 insertions(+), 5 deletions(-) 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 aa52eb8c..46059777 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 @@ -49,10 +49,11 @@ import java.util.List; /** * HCS 付款链推送编排支撑组件(结算付款特批 C106-3/4 + 履约计划重推 C103-9 + 履约记录 C108-1/2 + 特批结果推送接收,设计文档 §5.0/§5.3/§5.5/§5.6) *

- * 编排顺序:特批(提交时高风险/黑名单须特批附件或额度超额标记 need 时发起)→ 履约计划重推(付款审批款项金额累加行)→ 履约记录(审批通过新建 / 实际付款推进更新)。 + * 编排顺序:特批(提交时高风险/黑名单须特批附件或额度超额标记 need 时发起)→ 特批通过后再推履约计划(付款审批款项金额累加行)→ 履约记录(审批通过新建 / 实际付款推进更新)。 + * 特批审核期间(need/pushing/processing)仅发起/等待 C106,不推送履约计划与履约记录;驳回不产生履约数据。 * 特批流程ID 与履约记录ID 在各自 Support 内即时持久化;整体同步状态(hcs_sync_status)由本组件统一回写。 * 特批发起后 TMS 挂起 currentNode="特批审核",合规 paymentLegal/result 回调联动付款审批状态 - * (通过恢复"审批通过"放行 / 驳回联动审批驳回走重新提交闭环),人工确认等效兜底。 + * (通过恢复"审批通过"并补推履约数据 / 驳回联动审批驳回走重新提交闭环),人工确认等效兜底。 * * @author Chill */ @@ -75,16 +76,31 @@ public class HcsPaymentSyncSupport { private final ApplicationEventPublisher eventPublisher; /** - * 推送付款申请到 HCS:特批(如需)→ 履约计划重推(C103-9 款项金额累加行)→ 履约记录(新建/更新)→ 回填整体同步状态 + * 推送付款申请到 HCS:特批(need 时发起 C106-3 后挂起)→ 特批通过后履约计划重推(C103-9 款项金额累加行)→ 履约记录(新建/更新)→ 回填整体同步状态 * * @param payment 付款申请单(approvalStatus=approved) * @return 推送结果描述 */ public String pushPayment(PaymentApplication payment) { StringBuilder result = new StringBuilder(); - // ① 结算付款特批:提交时高风险/黑名单(须特批附件)或额度超额(hcs_spec_status=need)且未发起时发起 C106-3 + // ① 结算付款特批:提交时高风险/黑名单(须特批附件)或额度超额(hcs_spec_status=need)且未发起时发起 C106-3; + // 发起后挂起等待特批结果,履约计划与履约记录由特批通过后的 pushAfterSpecApproved 补推(驳回不产生履约数据) if (HcsSyncConstant.SPEC_STATUS_NEED.equals(payment.getHcsSpecStatus())) { - result.append(hcsSpecPaySyncSupport.pushSpecPay(payment)); + String specResult = hcsSpecPaySyncSupport.pushSpecPay(payment); + // C106-4 更新路径不改状态,统一归一为特批审核中,避免下轮扫描重复发起 + if (HcsSyncConstant.SPEC_STATUS_NEED.equals(payment.getHcsSpecStatus())) { + payment.setHcsSpecStatus(HcsSyncConstant.SPEC_STATUS_PROCESSING); + payment.setCurrentNode(HcsSyncConstant.SPEC_REVIEW_NODE); + } + markSynced(payment, specResult); + return specResult; + } + // 特批审核中:仅等待合规回调/人工确认,不推送履约计划与履约记录 + if (HcsSyncConstant.SPEC_STATUS_PUSHING.equals(payment.getHcsSpecStatus()) + || HcsSyncConstant.SPEC_STATUS_PROCESSING.equals(payment.getHcsSpecStatus())) { + String message = "付款特批审核中,待特批通过后推送履约数据"; + markSynced(payment, message); + return message; } // ② 履约计划重推(C103-9 行级更新):付款审批通过累加款项金额置 row_op=update 的计划行, // 凭已存合规阶段ID 重推;独立于履约记录开关,推送失败抛出由付款链置 failed 重试兜底 @@ -127,6 +143,22 @@ public class HcsPaymentSyncSupport { return "履约规则无待同步行".equals(stageResult) ? "" : stageResult; } + /** + * 特批通过后补推履约数据(C103-9 计划重推 + C108 履约记录):补推失败置 failed 留待人工重推兜底, + * 不阻断特批结果落库与金蝶补推 + * + * @param payment 付款申请单(hcs_spec_status=approved) + */ + private void pushAfterSpecApproved(PaymentApplication payment) { + try { + this.pushPayment(payment); + } catch (Exception exception) { + String message = StringUtil.isBlank(exception.getMessage()) ? "履约数据推送异常" : exception.getMessage(); + markFailed(payment, message); + log.error("付款特批通过后履约数据推送失败:paymentNo={},{}", payment.getPaymentNo(), message, exception); + } + } + /** * 单条手动重推:重置为待同步并清零重试计数后立即推送(页面"推送合规/重推"按钮入口) * @@ -175,6 +207,10 @@ public class HcsPaymentSyncSupport { syncPaymentOnSpecResult(payment, HcsSyncConstant.SPEC_STATUS_APPROVED.equals(result)); payment.setHcsSpecStatus(result); paymentApplicationMapper.updateById(payment); + // 特批通过后补推履约计划与履约记录(驳回不产生履约数据),失败不阻断后续金蝶补推 + if (HcsSyncConstant.SPEC_STATUS_APPROVED.equals(result)) { + this.pushAfterSpecApproved(payment); + } publishKingdeeAutoSyncOnSpecApproved(payment, result); log.info("HCS特批结果人工确认:paymentNo={},specFdId={},结果={}", payment.getPaymentNo(), payment.getHcsSpecFdId(), result); return "特批结果已确认:" + result; @@ -215,6 +251,10 @@ public class HcsPaymentSyncSupport { syncPaymentOnSpecResult(payment, HcsSyncConstant.SPEC_STATUS_APPROVED.equals(status)); payment.setHcsSpecStatus(status); paymentApplicationMapper.updateById(payment); + // 特批通过后补推履约计划与履约记录(驳回不产生履约数据),失败不阻断后续金蝶补推 + if (HcsSyncConstant.SPEC_STATUS_APPROVED.equals(status)) { + this.pushAfterSpecApproved(payment); + } publishKingdeeAutoSyncOnSpecApproved(payment, status); log.info("付款特批结果推送处理完成:paymentNo={},结果={},reason={}", payment.getPaymentNo(), status, param.getReason()); return "特批结果已处理:" + status;