diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java index 9c223755..63933d32 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java @@ -25,11 +25,13 @@ */ package org.springblade.transport.support.hcs; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.config.HcsProperties; import org.springblade.hcs.dto.HcsAttachmentRefDTO; import org.springblade.hcs.dto.HcsLegalResultDTO; import org.springblade.hcs.dto.HcsMechanismsDTO; @@ -77,6 +79,7 @@ public class HcsContractSpecSyncSupport { private static final int CALLBACK_MSG_MAX_LENGTH = 500; private final IHcsClient hcsClient; + private final HcsProperties hcsProperties; private final ContractManageMapper contractManageMapper; private final HcsContractCheckLogMapper hcsContractCheckLogMapper; @@ -157,6 +160,7 @@ public class HcsContractSpecSyncSupport { /** * 合同特批结果接收处理(合规 contractLegal/result 推送,替代未建设的 B103,D15 回传机制): + * sourceSystem 须与 third-party.hcs.src-system 配置一致(不符抛出"来源系统标识错误"异常), * requestId=TMS 合同ID、status=APPROVED/REJECTED, * approved 恢复合同"审批通过"展示;rejected 联动合同审批驳回;原文全量留痕 * @@ -164,6 +168,11 @@ public class HcsContractSpecSyncSupport { * @return 处理结果描述 */ public String handleLegalResult(HcsLegalResultDTO param) { + // 来源系统校验:仅接受 third-party.hcs.src-system 配置的来源,防伪造回传 + if (!StrUtil.equalsIgnoreCase(param == null ? null : param.getSourceSystem(), hcsProperties.getSrcSystem())) { + log.warn("合同特批结果推送来源系统标识错误:sourceSystem={}", param == null ? null : param.getSourceSystem()); + throw new ServiceException("来源系统标识错误"); + } String raw = param == null ? "" : JSONUtil.toJsonStr(param); String requestId = param == null ? null : param.getRequestId(); ContractManage contractManage = locateContract(requestId); 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 239b56da..1b5aeaf6 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 @@ -25,6 +25,7 @@ */ package org.springblade.transport.support.hcs; +import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; @@ -139,6 +140,7 @@ public class HcsPaymentSyncSupport { /** * 付款特批结果接收处理(合规 paymentLegal/result 推送,替代未建设的 B103,D15 回传机制): + * sourceSystem 须与 third-party.hcs.src-system 配置一致(不符抛出"来源系统标识错误"异常), * requestId=TMS 付款申请ID、status=APPROVED/REJECTED; * 付款特批结果不联动付款审批状态(§4.4),仅回写 hcs_spec_status * @@ -146,6 +148,11 @@ public class HcsPaymentSyncSupport { * @return 处理结果描述 */ public String handleLegalResult(HcsLegalResultDTO param) { + // 来源系统校验:仅接受 third-party.hcs.src-system 配置的来源,防伪造回传 + if (!StrUtil.equalsIgnoreCase(param == null ? null : param.getSourceSystem(), hcsProperties.getSrcSystem())) { + log.warn("付款特批结果推送来源系统标识错误:sourceSystem={}", param == null ? null : param.getSourceSystem()); + throw new ServiceException("来源系统标识错误"); + } String requestId = param == null ? null : param.getRequestId(); PaymentApplication payment = locatePayment(requestId); if (payment == null) { diff --git a/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md b/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md index 59c361d1..6bdeb710 100644 --- a/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md +++ b/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md @@ -210,7 +210,7 @@ TMS 审批通过(approved / change_approved) | `POST /hcs/contractLegal/result`(公开端点,网关注册映射 `/gwzh/HTHG/contractLegal/result`) | `requestId` = TMS 合同ID | 合同特批结果联动 | | `POST /hcs/paymentLegal/result`(公开端点,网关注册映射 `/gwzh/HTHG/paymentLegal/result`) | `requestId` = TMS 付款申请ID | 付款特批回写 `hcs_spec_status`(不联动付款审批状态) | -报文两接口共用(`HcsLegalResultDTO`):`{sourceSystem, requestId, status, reason}`;`status=APPROVED`(通过)/ `REJECTED`(驳回,reason 为驳回原因如"特批说明材料不完整,请补充"),大小写不敏感识别,其他值仅留痕不落状态。报文原文(含 reason)全量留痕 `blade_hcs_check_log`;未定位到单据或状态未识别时仅留痕返回,不报错。 +报文两接口共用(`HcsLegalResultDTO`):`{sourceSystem, requestId, status, reason}`;先校验 `sourceSystem` 与 `third-party.hcs.src-system` 配置一致(不符抛出"来源系统标识错误"异常,不落库不留痕);`status=APPROVED`(通过)/ `REJECTED`(驳回,reason 为驳回原因如"特批说明材料不完整,请补充"),大小写不敏感识别,其他值仅留痕不落状态。报文原文(含 reason)全量留痕 `blade_hcs_check_log`;未定位到单据或状态未识别时仅留痕返回,不报错。 | 特批结果 | 合同联动 | | --- | --- | diff --git a/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md b/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md index 828d22b4..236e18f2 100644 --- a/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md +++ b/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md @@ -108,7 +108,7 @@ none(默认) ──触发──▶ need(挂起"特批审核")──发 | 路径 | 接口 | 实现 | | --- | --- | --- | -| 合规推送 | `POST /hcs/contractLegal/result`(`HcsSyncController`,blade.secure 放行,网关注册 `/gwzh/HTHG/contractLegal/result`) | `handleLegalResult`:`requestId`=合同ID(selectById)定位 → `status=APPROVED/REJECTED` 大小写不敏感识别(其他值仅留痕)→ 原文(含 reason)留痕,报文模型 `HcsLegalResultDTO` | +| 合规推送 | `POST /hcs/contractLegal/result`(`HcsSyncController`,blade.secure 放行,网关注册 `/gwzh/HTHG/contractLegal/result`) | `handleLegalResult`:先校验 `sourceSystem`(不符抛"来源系统标识错误"异常)→ `requestId`=合同ID(selectById)定位 → `status=APPROVED/REJECTED` 大小写不敏感识别(其他值仅留痕)→ 原文(含 reason)留痕,报文模型 `HcsLegalResultDTO` | | 人工确认 | `POST /hcs/contract/spec/confirm`(:251-257) | `confirmSpecResult`(:139-157,仅 processing 可确认) | 联动 `syncContractOnSpecResult`(:312-320): @@ -229,7 +229,7 @@ none(默认) ──触发──▶ need(挂起"特批审核")──发 特批结果由合规系统审批完成后主动推送(2026-10-12 起,替代原计划的 B103,§9-U1 已闭环): -- `POST /hcs/paymentLegal/result`(`HcsSyncController`,blade.secure 放行,网关注册 `/gwzh/HTHG/paymentLegal/result`)→ `HcsPaymentSyncSupport#handleLegalResult`:`requestId`=付款申请ID 定位,`status=APPROVED/REJECTED` 回写 `hcs_spec_status`,不联动付款审批状态; +- `POST /hcs/paymentLegal/result`(`HcsSyncController`,blade.secure 放行,网关注册 `/gwzh/HTHG/paymentLegal/result`)→ `HcsPaymentSyncSupport#handleLegalResult`:先校验 `sourceSystem`(不符抛"来源系统标识错误"异常),`requestId`=付款申请ID 定位,`status=APPROVED/REJECTED` 回写 `hcs_spec_status`,不联动付款审批状态; - 等效兜底:页面人工确认 `POST /hcs/spec-pay/confirm`(仅 `processing` 可确认,置 `approved/rejected`); - **付款特批结果不联动付款审批状态**(与合同特批的 `syncContractOnSpecResult` 不同,无驳回联动)。