diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java index e426d80f..8f239069 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java @@ -42,6 +42,7 @@ import org.springblade.transport.pojo.entity.InvoiceApplication; import org.springblade.transport.pojo.entity.InvoiceReceipt; import org.springblade.transport.pojo.entity.PaymentApplication; import org.springblade.transport.pojo.entity.ProjectApply; +import org.springblade.transport.support.hcs.HcsContractSpecSyncSupport; import org.springblade.transport.support.hcs.HcsContractSyncSupport; import org.springblade.transport.support.hcs.HcsInvoiceRegSyncSupport; import org.springblade.transport.support.hcs.HcsPaymentSyncSupport; @@ -104,6 +105,7 @@ public class HcsPushTask { private final InvoiceReceiptMapper invoiceReceiptMapper; private final HcsProjectSyncSupport hcsProjectSyncSupport; private final HcsContractSyncSupport hcsContractSyncSupport; + private final HcsContractSpecSyncSupport hcsContractSpecSyncSupport; private final HcsPaymentSyncSupport hcsPaymentSyncSupport; private final HcsInvoiceRegSyncSupport hcsInvoiceRegSyncSupport; private final HcsReceiptBillSyncSupport hcsReceiptBillSyncSupport; @@ -149,11 +151,19 @@ public class HcsPushTask { /** * 合同(C103)定时推送:扫描审批通过且待同步/待补偿的合同(含风险校验→附件转传→C103-1→履约规则 C103-9 行级同步), - * 独立开关与 cron 调度 + * 并对特批中(processing)的合同做 C103-4 结果查询兜底,独立开关与 cron 调度 */ @Scheduled(cron = "${thirdParty.hcs.push.contract.cron:0 1/5 * * * ?}") public void pushHcsContract() { - this.runOnce("合同", HcsSyncConstant.BIZ_TYPE_CONTRACT, contractSyncEnabled, this::pushUnsyncedContracts); + this.runOnce("合同", HcsSyncConstant.BIZ_TYPE_CONTRACT, contractSyncEnabled, this::syncHcsContracts); + } + + /** + * 合同链路组合动作:待同步合同推送 + 特批结果查询兜底(合规推送 contractLegal/result 未达时 C103-4 轮询联动) + */ + private String syncHcsContracts() { + String pushSummary = this.pushUnsyncedContracts(); + return pushSummary + ";" + hcsContractSpecSyncSupport.syncProcessingSpecResults(); } /** diff --git a/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md b/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md index 22796a11..3747ff96 100644 --- a/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md +++ b/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md @@ -1,5 +1,7 @@ # 项目立项与合同 HCS 前端接入设计(tms-erp-web) +> **⚠️ 2026-10-13 失效说明**:C103-8 独立特批发起接口合规未提供,本文涉及的 `POST /hcs/contract/spec-apply`(发起特批)后端端点已删除;特批改随合同推送报文 `fdSepcailContract=true` 自动发起,前端只需展示特批状态(`hcs_spec_status`/`currentNode=特批审核`)与接收结果联动,无需"发起特批"按钮/弹窗。结果推送 `/hcs/contractLegal/result` 不受影响。 + > **日期**:2026-10-09 > **依据**:《桂物合同集成相关接口说明-v4.docx》、[TMS业财融合方案.docx](../TMS业财融合方案.docx)、[2026-09-27-桂物合同合规系统HCS接入技术设计.md](./2026-09-27-桂物合同合规系统HCS接入技术设计.md)、[2026-09-28-HCS接入实施状态与确认清单.md](./2026-09-28-HCS接入实施状态与确认清单.md) > **涉及工程**:`tms-api`(后端补前端代理端点)、`tms-erp-web`(前端页面与 API 模块) diff --git a/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md b/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md index 236e18f2..28c40d81 100644 --- a/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md +++ b/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md @@ -6,6 +6,7 @@ > 关联提交:`8e6e263`(外部客商高风险黑名单管控与合同自动特批) > > **2026-10-12 变更**:原计划的 B103 推送合规方未建设,特批结果改为合规审批完成后经 iPaaS 主动推送 TMS:合同 `POST /hcs/contractLegal/result`、付款 `POST /hcs/paymentLegal/result`(报文 `{sourceSystem, requestId, status=APPROVED/REJECTED, reason}`);原推测性回调端点 `/hcs/callback/spec-result` 及 `HcsFieldConstant.SPEC_CB_*` 候选键解析已删除。见 §2.5/§4.4/§五。 +> **2026-10-13 变更**:C103-8 独立特批发起接口合规未提供(联调 404),合同特批改为随 C103-1/C103-11 报文携带 `fdSepcailContract=true` 发起(高风险/黑名单判定后置入报文);TMS 挂起"特批审核"(processing)后新增**定时 C103-4 结果查询兜底**(随合同推送任务执行,`fdApprovalStatus=approved/approvalinvalid` 联动恢复/驳回);特批附件改随 C103-1 附件面板 `eopCdraftSpecial` 挂载;附件类型判定值与业务字典对齐为「特批附件」。**C103-8 全链路代码已删除**(`IHcsClient#addSpecContract`/`HcsSpecContractSaveDTO`/`applySpec`/`POST /hcs/contract/spec-apply`)。**contractLegal/result 报文已按合规方最新字段表修正**:`{contractType, contractCode, requestId, success, reason, kingdeeId, sourceSystem=WCCK}`(金蝶同步结果结构,非原假设的 status=APPROVED/REJECTED),按 `contractCode`=合同编号定位,`success=true` 联动放行(kingdeeId 留痕)/`false` 联动驳回走重新提交闭环;付款 `paymentLegal/result` 仍为旧结构,待合规方字段表后同步修正。 --- @@ -17,7 +18,7 @@ | 触发线 | HCS 接口 | 判定条件 | 触发的特批 | 作用对象 | | --- | --- | --- | --- | --- | -| 外部客商高风险/黑名单 | C101-1 风险查询 | `fdRiskLevel=2`(高风险)或 `fdBlackStatus=yes`(黑名单) | 合同特批(C103-8 发起 / contractLegal/result 结果推送) | `ContractManage`(合同) | +| 外部客商高风险/黑名单 | C101-1 风险查询 | `fdRiskLevel=2`(高风险)或 `fdBlackStatus=yes`(黑名单) | 合同特批(C103-1/C103-11 报文 `fdSepcailContract=true` 发起 / contractLegal/result 结果回调 + C103-4 定时查询兜底) | `ContractManage`(合同) | | 合同额度超额 | C106-1 额度校验 | `fdIsCredit=false`(超额) | 结算付款特批(C106-3 发起 / C106-4 更新) | `PaymentApplication`(付款申请) | 补充规则: @@ -28,13 +29,13 @@ ### 1.2 与普通审批的关系 -特批挂在 TMS 审批**之后**(合同须先审批通过并成功推送 HCS 起草,拿到 `hcs_fd_id` 后才能发起特批)。特批期间 TMS 用 `hcs_spec_status ∈ {need, processing}` + `currentNode="特批审核"` 挂起展示,推送门禁跳过;特批通过即放行,驳回则联动本地审批驳回(仅合同链路)。 +特批与合同起草**同报文发起**(高风险/黑名单客商推送时 C103-1/C103-11 报文带 `fdSepcailContract=true`,合规侧随起草自动走特批流程;C103-8 独立发起接口合规未提供,相关代码已删除)。特批期间 TMS 用 `hcs_spec_status=processing` + `currentNode="特批审核"` 挂起展示,推送门禁与手动重推均拦截;特批通过即放行,驳回则联动本地审批驳回(仅合同链路)。 ### 1.3 特批状态机(两条链路共用 `HcsSyncConstant.SPEC_STATUS_*`) ``` -none(默认) ──触发──▶ need(挂起"特批审核")──发起成功──▶ processing(HCS 流程进行中)──结果──▶ approved / rejected - └─发起失败──▶ 回落 need(仅留痕,可人工重发) +none(默认) ──高风险/黑名单随 C103-1/C103-11 带 fdSepcailContract=true──▶ processing(挂起"特批审核")──结果回调/查询──▶ approved / rejected +need(存量遗留,2026-10-13 起不再产生;重推时自愈:报文带特批标记 → 挂起转 processing) ``` - 合同特批 `approved` **单次有效**:再次推送时若已 approved 不重复发起。 @@ -42,81 +43,78 @@ none(默认) ──触发──▶ need(挂起"特批审核")──发 --- -## 二、合同特批(C103-8 发起 / contractLegal/result 结果推送) +## 二、合同特批(fdSepcailContract 随起草发起 / contractLegal/result 结果回调 + C103-4 查询兜底) ### 2.1 触发条件 外部客商高风险(风险等级=2)或黑名单,甲方或乙方任一方命中。风险判定:`HcsContractSyncSupport#checkRelativeRisk`(`HcsContractSyncSupport.java:167-183`,`risky` 判定在 :178)。 -### 2.2 阶段 A:提交校验(特批说明附件必传) +### 2.2 阶段 A:提交校验(特批附件必传) 入口 `ContractManageController`(`@RequestMapping("/contract-manage")`): -| 接口 | Service 方法 | 校验调用 | -| --- | --- | --- | -| `POST /contract-manage/submit` | `ContractManageServiceImpl#submit`(:146) | :161 | -| `POST /contract-manage/to-temporary` | `#toTemporary`(:178) | :185 | -| `POST /contract-manage/submit-formal` | `#submitFormal`(:198) | :205 | +| 接口 | Service 方法 | +| --- | --- | +| `POST /contract-manage/submit` | `ContractManageServiceImpl#submit` | +| `POST /contract-manage/to-temporary` | `#toTemporary` | +| `POST /contract-manage/submit-formal` | `#submitFormal` | +| `POST /contract-manage/submit-change`(变更提交/变更驳回重提交) | `#submitChange` | -三处均调用 `validateSpecExplanationOnSubmit`(:1048-1061): +四处均调用 `validateSpecExplanationOnSubmit`: -1. `isRiskyCustomer`(:1066-1071)→ `HcsCreditCheckSupport#queryCustomerRiskByName`(:240)→ `queryCustomerRisk`(:182-231)**实时调 C101-1**(`hcsClient.getRelativeRisk`);内部组织客商直接返回不命中;名称反查不到客商编号不阻断(:242-248)。 -2. 命中且 `attachmentsJson` 中无 `fileType=特批说明`(`attachmentType=spec_explanation`)附件 → 抛出:"合同相对方存在高风险/黑名单客商,必须上传「特批说明」类型附件后再提交审批"。 +1. `isRiskyCustomer` → `HcsCreditCheckSupport#queryCustomerRiskByName` → `queryCustomerRisk` **实时调 C101-1**(`hcsClient.getRelativeRisk`);内部组织客商直接返回不命中;名称反查不到客商编号不阻断。 +2. 命中且 `attachmentsJson` 中无 `fileType=特批附件`(业务字典 `contract_attachment_type`,2026-10-13 与字典对齐,原设计值「特批说明」字典中不存在)附件 → 抛出:"合同相对方存在高风险/黑名单客商,必须上传「特批附件」类型附件后再提交审批"。 -> 已知缺口:`submitChange`(:303)未调用该校验;`submit()` 中"变更驳回重提交"分支(:150-155)转入 `submitChange`,会绕过附件强校验——推送后自动特批链路仍会兜底挂起,但附件缺失会导致特批发起失败。 +### 2.3 阶段 B:审批通过 → 推送(报文带特批标记)→ 挂起 -### 2.3 阶段 B:审批通过 → 推送 → 自动特批 +审批通过:`POST /contract-manage/approve` → `ContractManageServiceImpl#approve`:置 `hcsSyncStatus=unsynced`(推送零埋点 ADR-0001)→ `hcsImmediatePushSupport.pushContractAfterCommit(id)`。 -审批通过:`POST /contract-manage/approve` → `ContractManageServiceImpl#approve`(:217-245):置 `hcsSyncStatus=unsynced`(:237,推送零埋点 ADR-0001)→ `hcsImmediatePushSupport.pushContractAfterCommit(id)`(:243)。 - -合同推送共 3 个入口,收敛到 `HcsContractSyncSupport#pushContract`(:113-158): +合同推送共 3 个入口,收敛到 `HcsContractSyncSupport#pushContract`: | 入口 | 位置 | 说明 | | --- | --- | --- | -| 即时推送 | `HcsImmediatePushSupport#pushContractAfterCommit`(:114) | afterCommit 异步(2 线程 daemon 池),开关 `push.immediate-enabled` 默认 false;`pushContractNow`(:178)对特批挂起中(need/processing)短路跳过(:185-188) | -| 定时扫描 | `HcsPushTask#pushHcsContract`(:155,cron 默认 `0 1/5 * * * ?`) | `pushUnsyncedContracts`(:254-278):`approvalStatus ∈ {approved, change_approved}` 且 `hcs_sync_status ∈ {unsynced, failed}` 且重试未超限 | -| 手动重推 | `HcsSyncController POST /hcs/sync/contract/{id}`(:110)→ `repushContract`(:509-530) | 特批挂起中不可推(:517-519) | +| 即时推送 | `HcsImmediatePushSupport#pushContractAfterCommit` | afterCommit 异步(2 线程 daemon 池),开关 `push.immediate-enabled` 默认 false;`pushContractNow` 对特批挂起中(processing)短路跳过 | +| 定时扫描 | `HcsPushTask#pushHcsContract`(cron 默认 `0 1/5 * * * ?`) | `pushUnsyncedContracts`:`approvalStatus ∈ {approved, change_approved}` 且 `hcs_sync_status ∈ {unsynced, failed}` 且重试未超限;同轮附带特批结果查询兜底(见 §2.5) | +| 手动重推 | `HcsSyncController POST /hcs/sync/contract/{id}` → `repushContract` | 特批审核中(processing)不可推 | -`pushContract` 内部步骤(与本文相关的 ⑤): +`pushContract` 内部步骤: ``` -⓪ 特批挂起门禁(need/processing 直接返回,:118-121) -① 风险校验仅留痕(:124-126,回写 hcs_risk_level / hcs_black_status / hcs_risk_time) -②③④ 附件转传 C103-2 / 判重 / C103-1 起草或 C103-11 更新,markSynced 回填 hcs_fd_id(:535) -⑤ risky 时 autoApplySpecIfNeeded(:190-212)——自动特批链路 +⓪ 特批挂起门禁(仅 processing 拦截;need 存量单放行自愈) +① 风险校验仅留痕(回写 hcs_risk_level / hcs_black_status / hcs_risk_time,返回 risky 标志) +②③④ 附件转传 C103-2 / 判重 / C103-1 起草或 C103-11 更新——risky=true 时报文带 fdSepcailContract=true, + 合规侧随起草/更新自动走特批流程;markSynced 回填 hcs_fd_id +⑤ risky 时 hangSpecReview:置 hcs_spec_status=processing + currentNode="特批审核"(先起草后挂起,同推送事务内完成) +⑥ 履约规则 C103-9 行级同步(一期默认关) ``` -`autoApplySpecIfNeeded`(:190-212): +`hangSpecReview` 要点: -1. 特批已通过(`hcs_spec_status=approved`,单次有效)→ 跳过(:191-195); -2. 置 `hcsSpecStatus=need` + `currentNode="特批审核"`(`SPEC_REVIEW_NODE`,:196-201)——**先挂起后特批**; -3. `transferSpecExplanationAttachments`(:218-242)筛选「特批说明」附件转传 C103-2(合规附件 ID 存入 `hcs_spec_files_json`); -4. 调 `hcsContractSpecSyncSupport.applySpec(...)`(:207)发起 C103-8;失败保持 `need` 仅留痕(:208-211),可人工经 `POST /hcs/contract/spec-apply` 重发。 +1. 终态守卫:`hcs_spec_status` 已是 approved/rejected(合规秒批/秒驳回调先于挂起执行)不再覆盖; +2. 置 `processing` + `currentNode="特批审核"` + `hcs_spec_msg` 说明,等待结果联动(§2.5)。 -> 设计要点(`HcsContractSyncSupport.java:56-58` 注释):C103-8 必须携带已起草合同的 `hcs_fd_id`,因此顺序是 **先 C103-1 起草、后 C103-8 特批**(8e6e263 调整)。 +> 设计要点:C103-8 独立发起接口合规未提供(联调 404),特批**随 C103-1/C103-11 报文** `fdSepcailContract=true` 发起(字段名原文如此,Special 拼写笔误必须沿用);原 `autoApplySpecIfNeeded`/`applySpec` 及人工端点 `POST /hcs/contract/spec-apply` 已随 C103-8 删除。 -### 2.4 阶段 C:发起特批 C103-8 +### 2.4 特批附件挂载(随 C103-1 附件面板) -`HcsContractSpecSyncSupport#applySpec`(`HcsContractSpecSyncSupport.java:92-130`): +`HcsAttachmentSupport#transferContractAttachments`:主文件(approved=true)→ `eopCdraftSign`(用印)、 +**`fileType=特批附件` → `eopCdraftSpecial`(特批面板,2026-10-13 起)**、其它附件 → `eopCdraftOther`。 +特批附件随起草报文一并挂载,合规特批流程直接引用,无独立转传步骤。 -- 前置:`requireAppliableContract`(:196-208,须审批通过 + 特批状态 need/rejected)、附件非空(:94-96)、`requireContractFdId`(:213-218,须已有 `hcs_fd_id`); -- 组装 `HcsSpecContractSaveDTO`:`fdDocSubject="合同特批-{合同编号}"`、`fdReason=合同名称`、附件 `fdEntityKey=fd_spc_approval_attach`(:97-111); -- `hcsClient.addSpecContract`(`IHcsClient.java:281`,`SPEC_CONTRACT_ADD_URL`)响应双层嵌套 `data.data.fdId` → 回填 `hcs_spec_fd_id`(:117),`markSpec` 置 `processing`(:118); -- 留痕 `blade_hcs_check_log`(biz_type=`contract`,check_type=`spec`,:335-350);失败回 `need`(:125)。 +### 2.5 阶段 D:结果联动(两条等效路径 + 定时查询兜底) -### 2.5 阶段 D:结果联动(两条等效路径) - -| 路径 | 接口 | 实现 | +| 路径 | 接口/机制 | 实现 | | --- | --- | --- | -| 合规推送 | `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 可确认) | +| 合规回调(主) | `POST /hcs/contractLegal/result`(`HcsSyncController`,blade.secure 放行,网关注册 `/gwzh/HTHG/contractLegal/result`) | `handleLegalResult(HcsContractLegalResultDTO)`:`sourceSystem` 须为 **WCCK**(不符抛"来源系统标识错误")→ `contractCode`=TMS 合同编号定位(`requestId` 仅 X-ERP-Request-Id 回显,不可定位)→ `success=true` 联动恢复"审批通过"(kingdeeId 随留痕保存)/ `success=false` 联动审批驳回走重新提交闭环 → 原文留痕 | +| 定时查询兜底 | `HcsPushTask#pushHcsContract` 每轮附带 → `HcsContractSpecSyncSupport#syncProcessingSpecResults` | 扫描 `hcs_spec_status=processing` 的合同,C103-4 合同详情 `fdApprovalStatus`:`approved` 联动恢复 / `approvalinvalid` 联动驳回(特批驳回的合规侧取值待联调确认);回调先到则状态已非 processing,天然跳过 | +| 人工确认 | `POST /hcs/contract/spec/confirm` | `confirmSpecResult`(仅 processing 可确认) | -联动 `syncContractOnSpecResult`(:312-320): +联动 `syncContractOnSpecResult`: -- `approved` → `currentNode="审批通过"`(C103-1 已起草,无需再推送,流程放行); -- `rejected` → `approvalStatus=rejected` + `currentNode="已驳回"`,走"重新编辑 → 提交 → 审批 → 重新特批"闭环。 +- 通过(回调 success=true / 查询 approved)→ `currentNode="审批通过"`(C103-1 已起草,无需再推送,流程放行); +- 驳回(回调 success=false / 查询 approvalinvalid)→ `approvalStatus=rejected` + `currentNode="已驳回"`,走"重新编辑 → 提交 → 审批 → 重新特批"闭环。 -`markSpec`(:325-330)回写 `hcs_spec_status`/`hcs_spec_time`/`hcs_spec_msg`,回调原文留痕。 +`markSpec` 回写 `hcs_spec_status`/`hcs_spec_time`/`hcs_spec_msg`,回调原文留痕。 ### 2.6 TMS 侧留痕字段(`blade_contract_manage`,`ContractManage.java:45`) @@ -124,7 +122,7 @@ none(默认) ──触发──▶ need(挂起"特批审核")──发 | --- | --- | --- | | `hcs_fd_id` | :213 | HCS 合同 ID(C103-1 起草回填) | | `hcs_risk_level` / `hcs_black_status` / `hcs_risk_time` | :233/:236/:239 | C101-1 风险留痕 | -| `hcs_spec_fd_id` | :242 | HCS 特批流程 ID(C103-8 回填) | +| `hcs_spec_fd_id` | :242 | HCS 特批流程 ID(原 C103-8 回填;接口删除后新流程不再产生,仅存量数据可能有值) | | `hcs_spec_status` | :246 | `none/need/processing/approved/rejected` | | `hcs_spec_time` / `hcs_spec_msg` | :249/:253 | 特批时间/信息 | | `hcs_spec_files_json` | :256 | 特批材料(含 C103-2 合规附件 ID) | @@ -237,13 +235,13 @@ none(默认) ──触发──▶ need(挂起"特批审核")──发 ## 五、推送时机与结果接收机制汇总 -| 机制 | 合同特批(C103-8/contractLegal/result) | 付款/结算付款特批(C106-3/4/paymentLegal/result) | +| 机制 | 合同特批(fdSepcailContract/contractLegal/result/C103-4 兜底) | 付款/结算付款特批(C106-3/4/paymentLegal/result) | | --- | --- | --- | -| 定时扫描 | `HcsPushTask#pushHcsContract`(默认 `0 1/5 * * * ?`) | `HcsPushTask#pushHcsPayment`(默认 `0 2/5 * * * ?`);Redis 任务锁 TTL 240s(:92)、分钟位错峰(:75-77) | +| 定时扫描 | `HcsPushTask#pushHcsContract`(默认 `0 1/5 * * * ?`,同轮附带特批结果查询兜底 `syncProcessingSpecResults`) | `HcsPushTask#pushHcsPayment`(默认 `0 2/5 * * * ?`);Redis 任务锁 TTL 240s、分钟位错峰 | | 即时推送 | `HcsImmediatePushSupport#pushContractAfterCommit`(afterCommit 异步,开关默认 false,单条锁 TTL 120s) | 无 | -| 结果推送接收 | `POST /hcs/contractLegal/result`(blade.secure 放行,requestId=合同ID,原文留痕+联动审批状态) | `POST /hcs/paymentLegal/result`(blade.secure 放行,requestId=付款申请ID,回写特批状态) | +| 结果推送接收 | `POST /hcs/contractLegal/result`(blade.secure 放行,sourceSystem=WCCK,contractCode=合同编号定位,success 联动审批状态,原文留痕) | `POST /hcs/paymentLegal/result`(blade.secure 放行,requestId=付款申请ID,回写特批状态;报文仍为旧结构待合规方字段表确认) | | 人工确认 | `POST /hcs/contract/spec/confirm` | `POST /hcs/spec-pay/confirm` | -| 手动发起/重推 | `POST /hcs/contract/spec-apply`(:226)、`POST /hcs/sync/contract/{id}`(:110) | `POST /hcs/sync/payment/{id}`(:111)、`POST /hcs/sync/payment`(:129) | +| 手动发起/重推 | `POST /hcs/sync/contract/{id}`(spec-apply 已随 C103-8 删除,2026-10-13) | `POST /hcs/sync/payment/{id}`、`POST /hcs/sync/payment` | --- @@ -251,12 +249,12 @@ none(默认) ──触发──▶ need(挂起"特批审核")──发 | 配置 | 默认 | 说明 | | --- | --- | --- | -| `contract.require-risk-check` | true | 提交时特批说明附件强校验 | +| `contract.require-risk-check` | true | 提交时特批附件强校验 | | `risk.check-on-contract` | — | 合同链路 C101-1 查询开关 | | `risk.check-on-payment` | true | 付款提交 C101-1 校验开关 | | `risk.block-blacklist` | true | 付款链路黑名单阻断(合同链路已不用于阻断) | | `credit.check-enabled` | **false** | C106-1 额度校验,一期未对接(付款特批自动触发源关闭) | -| `contract.special-contract-enabled` | false | C103-1 报文特批流程字段 `fdSepcailContract`(固定 false,D15) | +| `contract.special-contract-enabled` | false | C103-1/C103-11 报文 `fdSepcailContract` 强制 true(默认关;高风险/黑名单判定自动带 true,本开关可强制全量走特批,联调验证用) | | `push.immediate-enabled` | false | 审批通过后即时推送 | | `push.contract.sync-enabled` / `push.contract.cron` | — / `0 1/5 * * * ?` | 合同定时扫描 | | `push.payment.sync-enabled` / `push.payment.cron` | — / `0 2/5 * * * ?` | 付款定时扫描 | @@ -267,6 +265,6 @@ none(默认) ──触发──▶ need(挂起"特批审核")──发 ## 七、留痕与常量速查 - **留痕表**:`blade_hcs_check_log`(`HcsContractCheckLog.java:44`):`biz_type=contract/payment`、`check_type=risk/credit/spec`、`result`、`msg`(≤500)、`trace_id`。 -- **关键常量**(`HcsSyncConstant`):`SPEC_STATUS_NONE/NEED/PROCESSING/APPROVED/REJECTED`(:119-149)、`RISK_LEVEL_HIGH="2"`(:156)、`ATTACHMENT_TYPE_SPEC_EXPLANATION="特批说明"`(:171)、`SPEC_REVIEW_NODE="特批审核"`(:176)。 +- **关键常量**(`HcsSyncConstant`):`SPEC_STATUS_NONE/NEED/PROCESSING/APPROVED/REJECTED`(:119-149)、`RISK_LEVEL_HIGH="2"`(:156)、`ATTACHMENT_TYPE_SPEC_EXPLANATION="特批附件"`(:181,2026-10-13 与业务字典对齐)、`SPEC_REVIEW_NODE="特批审核"`(:208)。 - **合规推送结果状态**(`HcsSyncConstant`):`LEGAL_RESULT_APPROVED="APPROVED"` / `LEGAL_RESULT_REJECTED="REJECTED"`(原 B103 回调候选键常量 `HcsFieldConstant.SPEC_CB_*` 已随旧回调端点删除)。 -- **特批附件挂载键**:`fd_spc_approval_attach`(合同 C103-8 与付款 C106-3/4 共用)。 +- **特批附件挂载键**:合同特批附件随 C103-1 附件面板 `eopCdraftSpecial`(2026-10-13 起);付款 C106-3/4 特批材料仍用 `fd_spc_approval_attach`。