diff --git a/doc/docs/业务流程/2026-10-29-收款流水菜单改造(数据源A301-2改A301-1-认领只登记本地并推送合规C107-1与C107-3作废同步).md b/doc/docs/业务流程/2026-10-29-收款流水菜单改造(数据源A301-2改A301-1-认领只登记本地并推送合规C107-1与C107-3作废同步).md new file mode 100644 index 00000000..bff1fd6e --- /dev/null +++ b/doc/docs/业务流程/2026-10-29-收款流水菜单改造(数据源A301-2改A301-1-认领只登记本地并推送合规C107-1与C107-3作废同步).md @@ -0,0 +1,194 @@ +# 收款流水菜单改造:数据源 A301-2 改 A301-1,认领只登记本地并推送合同合规(C107-1 / C107-3) + +> 日期:2026-10-29 +> 范围:tms-api(blade-transport、blade-hcs-api、blade-transport-api)+ tms-erp-web(收款流水 / 认领记录页面) +> 关联文档: +> - [2026-09-24-收款认领金蝶全链路业务流程(A301-2公告同步-A301-3认领推送-A301-1收款单回写)](./2026-09-24-收款认领金蝶全链路业务流程(A301-2公告同步-A301-3认领推送-A301-1收款单回写).md)(本改造后 A301-3 链路整体下线) +> - [2026-10-22-收款认领推送金蝶完成后同步合同合规系统(C103-9履约计划-C107-1认领记录-C108-1履约流水)业务流程梳理](../hcs合同/2026-10-22-收款认领推送金蝶完成后同步合同合规系统(C103-9履约计划-C107-1认领记录-C108-1履约流水)业务流程梳理.md)(触发点由 A301-3 成功后改为认领事务提交后) + +--- + +## 1. 需求与决策结论 + +收款流水菜单做两点改造: + +1. **数据源改为 A301-1 收款单查询**(原 A301-2 收款认领公告查询下线); +2. **认领动作只做本地认领记录 + 推送合同合规系统**(原 A301-3 推送金蝶链路整体下线,合规推送链保持 C103-9 + C107-1 + C108-1 全链)。 + +已确认的业务决策: + +| # | 决策点 | 结论 | +| --- | --- | --- | +| 1 | 认领上限口径 | 按 A301-1 的 **unmatchamountrec(未匹配收款金额)**,与收款金额取 min | +| 2 | 合规推送范围 | **C103-9(履约计划金额累加)、C107-1(认领记录)、C108-1(履约流水)全保留** | +| 3 | C107-1 推送失败补偿 | **不做定时重试,只落推送标记**(blade_receipt_claim_hcs_record.push_status = failed + 失败原因) | +| 4 | 认领作废 | **需要 C107-3 作废同步**(fdStatus=1),C107-1 返回的合规 fdId 必须落库 | +| 5 | 同步可见范围 | A301-1 无认领人维度,**全公司流水均进入页面,可接受** | + +--- + +## 2. 现状与目标链路对比 + +``` +【现状】 +A301-2 认领公告同步(按认领人姓名拉取) + → blade_kingdee_receipt_flow 落库(幂等键 detail_serial_no) + → 页面认领(只登记本地) + → A301-3 推送金蝶(手动按钮 + 10分钟定时任务,推送前重查 A301-2 对账) + → A301-3 成功后推合规链(C103-9 → C107-1 → C108-1) + → A301-1 按 awrp_src_code 回写金蝶单据状态(refreshKingdeeResult) + +【目标】 +A301-1 收款单查询(业务日期窗口 ≤1 个月,全量) + → blade_kingdee_receipt_flow 落库(幂等键 detail_serial_no,金蝶单号/状态随同步刷新) + → 页面认领(只登记本地) + → 认领事务提交后按认领主单推合规链(C103-9 → C107-1 → C108-1,C107-1 结果落库标记) + → 认领作废事务提交后推 C107-3(fdStatus=1 已作废) + → (A301-3 推送、awrp_src_code、A301-1 回写、定时任务、推送按钮全部下线) +``` + +关键变化: + +- 金蝶收款单在认领前就已存在(A301-1 即金蝶收款处理单),因此**金蝶收款单号 / 单据状态随同步直接落库**,不再依赖推送回填与回写推进; +- 合规推送触发点从「A301-3 推送成功后(流水级)」改为「认领事务提交后(认领主单级)」,继续认领时每次认领各自推送一次,累计金额口径不变。 + +--- + +## 3. 后端改造明细(tms-api) + +### 3.1 HCS Feign(blade-third-party-api/blade-hcs-api) + +| 文件 | 改动 | +| --- | --- | +| `IHcsClient` | 新增 `CLAIM_RECORD_UPDATE_URL`(`/openapi/eop-data/eopDataCollectionFlowClaimRecordOpen/update`)与 `claimRecordUpdate` 方法(C107-3 修改认领记录) | +| `HcsClaimRecordAddDTO` | 新增 `fdId` 字段:C107-1 新增不传,C107-3 修改必填(作废传 fdStatus=1),一个 DTO 复用两个接口 | + +### 3.2 收款流水同步:A301-2 → A301-1 + +`ReceiptFlowServiceImpl#sync()` 重写,`BfiUtil.queryAllPages` + `bfiService.queryRecBill` 全量翻页(pageSize 200),请求参数 `begin_bizdate` / `end_bizdate`(窗口天数取 Nacos `thirdParty.bfi.recBillSync.days`,默认 30)。 + +**字段映射(A301-1 → blade_kingdee_receipt_flow)**: + +| 流水表字段 | A301-1 来源 | 说明 | +| --- | --- | --- | +| receipt_notice_no / kingdee_bill_no | `billno` | 金蝶收款单号(两处同值) | +| kingdee_bill_status | `billstatus` 映射 | A/B已提交→pushed、C已审核→approved、D已收款→received、其余(含G退单)→failed | +| detail_serial_no | `infoentry[].bei_detailid`,兜底 `bei_bankdetailno` | **幂等键**;每条流水分录展开为一行流水 | +| receipt_amount | `infoentry[].bei_creditamount`,兜底主单 `actrecamt` | 流水分录收款金额 | +| unclaimed_amount | `unmatchamountrec` | 未匹配收款金额,**认领上限口径** | +| payer_name / counterparty_name | `payername` | 付款人名称 | +| payee_name | `org_name` | 收款公司名称 | +| counterparty_account | `payeracctbanknum` | 付款账户 | +| counterparty_bank | `payerbankname` | 付款银行 | +| summary | `txt_description` | 摘要 | +| transaction_time | `bizdate` | 业务日期 | +| fee | `fee` | 手续费 | +| source_updated_time | 同步时间 | — | +| bill_id / payer_id / kingdee_claim_status / claim_me | — | **废弃不再写入**(历史 A301-2 专属字段,列保留兼容存量) | +| push_status / push_fail_reason / pushed_time / awrp_src_code | — | **不再写入**(A301-3 下线;存量已推送数据保留展示) | + +同步保持原有框架:明细流水号重复抛异常、金额 ≤0 跳过、FOR UPDATE 批量防并发、按幂等键 upsert、批量操作日志;本地认领字段(claimed_amount / claim_status)不被同步覆盖,认领后状态按「累计认领 vs 未匹配金额」重算。 + +### 3.3 认领与合规推送链 + +`ReceiptFlowServiceImpl#claim()`: + +- 删除「认领公告id缺失」「公告未认领金额缺失」拦截(A301-1 无公告概念); +- 认领上限:`claimCeiling = min(unclaimed_amount(unmatchamountrec), receipt_amount)`; +- 认领主单冗余展示字段直取流水:`kingdeeBillNo` / `kingdeeBillStatus`(金蝶单据认领前已存在); +- 事务提交后(`TransactionSynchronizationManager.afterCommit`)按**认领主单**触发 `HcsClaimSyncSupport#pushClaimToHcs(claimId)`,失败仅落标记不影响认领。 + +`HcsClaimSyncSupport` 重写(编排顺序不变、触发维度改变): + +1. 归集**本认领主单**有效分摊行 → 按合同分组金额; +2. C104-2 按明细流水号定位合规侧收款流水 ID(一次定位全部合同共用); +3. 逐合同:C103-9 履约计划金额累加重推 → C107-1 认领记录(返回 fdId)→ C108-1 履约流水; +4. **C107-1 结果落库** `blade_receipt_claim_hcs_record`(认领主单×合同一条):成功持久化合规 fdId(供 C107-3 引用),失败落 failed + 原因(只记标记,无定时重试); +5. C108-1 的申请编号兜底、金蝶单据号(fd_jd_doc_no)取流水 `kingdee_bill_no`(A301-1 同步落库),金额改为本次认领分摊金额。 + +开关复用既有配置:`exe-stage.sync-enabled` 门禁 C103-9/C107-1,`perf-record.sync-enabled` 门禁 C108-1。 + +### 3.4 认领作废:C107-3 同步 + +`ReceiptClaimRecordServiceImpl#voidClaim()`: + +- 删除「已推送金蝶不允许作废」拦截(不再有 TMS→金蝶推送,作废只回退本地 + 同步合规); +- 事务提交后按认领主单推 C107-3:查 `blade_receipt_claim_hcs_record` 中 push_status=success 的记录,逐条 `claimRecordUpdate(fdId, fdStatus=1)`,成功后本地记录置 voided;单条失败独立记日志不回滚作废,合规侧需人工处置。 + +### 3.5 A301-3 链路整体下线 + +| 项 | 处置 | +| --- | --- | +| `pushClaimToKingdee` / `pushClaimByTask` / `executeReceiptClaimPush` / `pushClaimLocked` / `doPushClaimToKingdee` / `buildClaimPushDTO` / `extractClaimPushBillNo` / `applyClaimPushSuccess` / `applyClaimPushFailure` | 删除(ReceiptFlowServiceImpl) | +| `ReceiptClaimPushTask`(10 分钟定时推送) | 文件删除 | +| `ReceiptFlowController` `/push-kingdee` 端点 | 删除 | +| `refreshKingdeeResult`(A301-1 按 awrp_src_code 回写)+ `/receipt-claim-record/query-kingdee-result` 端点 | 删除(A301-1 已是数据源,状态随同步刷新) | +| `awrpSrcCode` 生成逻辑 | 删除 | +| `BfiProperties` | `claimAnnounce` / `receiptClaimPush` 配置类删除,新增 `RecBillSync`(`days` 默认 30) | +| `KingdeeReceiptFlow` 实体 | 字段注释更新为 A301-1 口径(bill_id 等标注废弃) | + +### 3.6 新增表 + +`blade_receipt_claim_hcs_record`(收款认领合规推送记录,DDL 见 `doc/sql/transport/lqj/20261028/01_blade_receipt_claim_hcs_record_20261028.sql`): + +| 字段 | 说明 | +| --- | --- | +| receipt_claim_id / receipt_flow_id | 认领主单 / 收款流水 | +| contract_id / contract_no | 合同 | +| claim_amount | 本认领主单分摊到本合同的金额 | +| hcs_claim_record_fd_id | 合规侧认领记录 fdId(C107-1 返回,C107-3 必填引用) | +| push_status | success 推送成功 / failed 推送失败 / voided 已作废 | +| fail_reason / pushed_time | 失败原因 / 成功时间 | + +--- + +## 4. 前端改造明细(tms-erp-web) + +| 页面 / 文件 | 改动 | +| --- | --- | +| `views/payment/receipt-flow.vue` | 删「推送金蝶」操作按钮及 `canPush`/`handlePush`;删搜索「推送状态」;详情删「推送状态」「推送失败原因」,「金蝶未认领金额」→「未匹配金额」;同步提示改为"收款流水" | +| `views/payment/receipt-claim-record.vue` | 删「查询金蝶认领结果」按钮;删搜索「推送状态」;作废按钮去掉 `pushStatus !== 'pushed'` 限制;作废确认提示增加"同步作废合同合规系统认领记录" | +| `views/payment/receipt-flow-form.vue` / `receipt-flow-batch-form.vue` | 「认领通知单」→「收款单号」;「金蝶未认领金额」→「未匹配金额」;校验提示"公告未认领金额"→"未匹配金额" | +| `views/payment/receipt-claim-record-form.vue` | 「认领通知单」→「收款单号」 | +| `views/settlement/components/formal-settlement-editor.vue` | 认领列表列「认领通知单」→「收款单号」 | +| `api/payment/receiptFlow.js` | 删 `pushKingdee`、`pushStatusOptions` | +| `api/payment/receiptClaimRecord.js` | 删 `queryKingdeeResult`、`pushStatusOptions` | +| `option/payment/receiptFlow.js` | 删「公告状态」「推送状态」「推送失败原因」「金蝶收款单号」(与单号列重复)列;「认领通知单」→「收款单号」、「付款金额」→「收款金额」、「金蝶未认领金额」→「未匹配金额」 | +| `option/payment/receiptClaimRecord.js` | 「认领通知单」→「收款单号」、「付款金额」→「收款金额」 | + +菜单按钮权限提示:`receipt_flow_push` 权限码随按钮下线,可在菜单配置中清理。 + +--- + +## 5. 配置与存量数据 + +**Nacos(thirdParty.bfi.*)**: + +- 新增(可选):`recBillSync.days`,默认 30,A301-1 契约约束业务日期窗口 ≤1 个月; +- 可清理:`claimAnnounce.*`、`receiptClaimPush.*`(代码已不再读取)。 + +**存量数据**: + +- A301-2 时代同步的流水(bill_id、kingdee_claim_status、claim_me 有值)与新口径并存,页面不再展示这些列;历史 push_status=pushed / awrp_src_code 仅保留展示,不再参与任何闸门; +- 明细流水号为全链唯一衔接键:A301-1 `bei_detailid` ≈ A301-2 `detailid` ≈ 合规 C104-2 `fdDetailSerialNumber`,同源同值时新旧数据 upsert 自然衔接。 + +--- + +## 6. 风险与待验证项 + +| # | 项 | 说明 | 等级 | +| --- | --- | --- | --- | +| 1 | **明细流水号同源性** | A301-1 `bei_detailid` 必须与原 A301-2 `detailid`、合规侧 `fdDetailSerialNumber` 同值,否则 C104-2 定位失败 → C107-1 全部跳过(仅记日志/落失败标记)。需联调拿真实报文核对 | 高 | +| 2 | 单据级未匹配金额 | `unmatchamountrec` 为收款单级口径;一张收款单多条流水分录时各行共享同一上限,理论上限放大(单分录场景无影响) | 中 | +| 3 | 合规履约计划金额不回退 | C103-9 认领时累加,作废仅同步 C107-3,不回退履约计划行金额(与改造前口径一致,未新增回退逻辑) | 中 | +| 4 | 全公司可见范围 | A301-1 按组织/日期拉全量,不再按认领人过滤,页面数据范围扩大(业务已确认可接受) | 低 | +| 5 | C107-1 失败无自动重试 | 仅落 failed 标记与原因,需人工在合规侧核对补录(业务已确认) | 低 | + +## 7. 验证清单(交由测试/联调执行) + +1. 手动同步:A301-1 拉取、流水按 infoentry 展开、重复明细流水号拦截、金额/单号/状态落库正确; +2. 认领:上限按未匹配金额控制、认领完成状态判定、合规链推送成功后 `blade_receipt_claim_hcs_record` 有 success 记录且 fdId 非空; +3. 继续认领:第二次认领各自推送一次 C107-1/C108-1,C103-9 累计金额正确; +4. 作废:本地回退 + C107-3 同步、记录置 voided;无合规记录(推送失败)时作废静默跳过; +5. 合规开关关闭(exe-stage/perf-record sync-enabled=false)时认领/作废主流程不受影响; +6. 回归:认领记录页、结算单收款汇总刷新、认领人筛选。