:feat: 合同特批结果定时查询兜底并同步更新设计文档

- HcsPushTask 合同任务每轮附带 syncProcessingSpecResults:扫描特批中(processing)合同调 C103-4 详情,fdApprovalStatus=approved/approvalinvalid 联动恢复/驳回,作为合规回调未达时的补偿
- 更新 2026-10-12 特批流程梳理文档:状态机、阶段 B/C/D、§五机制汇总、§六配置、§七常量对齐当前实现
- 2026-10-09 前端接入设计文档标注 spec-apply 失效说明
This commit is contained in:
刘泉佳
2026-10-13 18:36:38 +08:00
parent 68885ab31e
commit 08e07841b5
3 changed files with 69 additions and 59 deletions
@@ -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();
}
/**
@@ -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 模块)
@@ -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`。