借款对账 S1、S2:导出与银行提交分开登记、确认失败收紧及失败回单识别口径(09-17-company-loan-principal-repayment)

S1(迁移 20261007010000)
- 借款导出逐次记录;存量批次保留已知导出次数为历史汇总,不视为真实导出,存在即拦截
- 银行提交登记(只能撤回一次)与提交清单确认;独立复核,复核后任何登记、撤回、导出即失效
- 确认失败只计未作废附件;作废附件无法证明为明确失败或确属他笔付款即阻断
- S3 前临时拦截:多次导出、多次提交、清单未复核或历史汇总均不能确认失败
- 确认失败改按付款后规则;确认人不得兼任导出、提交登记、清单确认

S2(迁移 20261007020000)
- 存在同金额候选时须有已复核、覆盖提交清单的失败归属;结算与失败归属分槽

失败回单识别口径(用户同意并入)
- 新增原始状态措辞字段(多字段原文不一致即为空);失败事实严格判定:单页完整、
  仅“交易失败/转账失败/付款失败/支付失败”、唯一问题为交易失败、字段齐全;
  已撤销、已冲正、已退汇不接受;顶层识别状态与成功匹配不变
- 测试改走真实识别与归一化链,仅替换云端 OCR 响应

验证:借款 HTTP 41 组、浏览器 7 组、76 迁移;server 4463;共享回单测试 237;
三轮同模型只读复核的阻断项均已修复。

注意:界面未完成,不能单独部署;真实回单待验。未推送、未部署。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
2026-10-07 11:47:24 +08:00
共同撰写人 Claude Opus 5.5
父节点 3fb33fe93c
当前提交 db28706177
共修改 16 个文件,包含 986 行新增和 56 行删除
+1 -1
查看文件
@@ -24,7 +24,7 @@ export type LoanRepayment = {
allocations: Array<{ loanId: string; loanNo: string; amount: string; state: string; receivedDate: string; originReference: string; balanceAsOf: string; evidences: LoanEvidence[] }>;
receiptAttribution?: LoanReceiptAttributionState;
};
export type LoanAttributionBasisKind = "customer_serial" | "bank_memo" | "bank_written_confirmation" | "competitors_resolved";
export type LoanAttributionBasisKind = "customer_serial" | "bank_memo" | "bank_written_confirmation" | "competitors_resolved" | "bank_instruction_ref";
export type LoanReceiptAttributionState = {
required: boolean;
competitors: Array<{ id: string; batchNo: string; status: string }>;
+7
查看文件
@@ -22,6 +22,13 @@ export const ERROR_REASON_MESSAGES: Record<string, string> = {
"loan.receipt_attribution_not_required": "本还款没有同金额的其他候选批次,无需确认回单归属。",
"loan.receipt_attribution_unavailable": "尚无可用于确认归属的已核验银行回单,请先完成回单识别或人工核对。",
"loan.receipt_attribution_exists": "本还款已有待复核或已通过的回单归属确认,请勿重复提交。",
"loan.submission_required": "须先登记本批次实际向银行提交的指令,才能确认提交清单。",
"loan.submission_list_unverified": "银行提交清单尚未经独立复核,或复核后已有变化,须先完成提交清单复核。",
"loan.submission_history_unverified": "该批次为历史批次,导出明细及与银行提交的对应关系待核实,当前不能确认失败或释放额度。",
"loan.multiple_submissions_unresolved": "该批次有多次导出或多次银行提交,须逐次取得终态证据,当前不能确认失败。",
"loan.voided_receipt_unresolved": "已作废的回单曾显示付款成功或处理中,须先查明该笔付款结果,当前不能确认失败。",
"loan.submission_export_invalid": "所选导出记录不属于本批次,或网银导入的提交未关联导出记录。",
"loan.submission_attestation_exists": "本批次已有待复核或已通过的提交清单确认,请勿重复提交。",
"config.enabled_query_invalid": "启用状态筛选无效,请重新选择后查询。",
"config.document_type_invalid": "单据类型标识不符合要求,请重新选择单据类型。",
"document_sequence.type_unsupported": "当前单据类型不支持编号,请联系管理员核对。",
@@ -15,6 +15,7 @@ const attributionBasisLabels: Record<LoanAttributionBasisKind, string> = {
bank_memo: "回单附言或用途载明本批次号",
bank_written_confirmation: "银行书面查询结果指明该交易对应本批次指令",
competitors_resolved: "其他候选批次均已对应其他交易或经银行确认未付款",
bank_instruction_ref: "回单载明本批次的银行指令号",
};
const attributionStatusLabels = { proposed: "待独立复核", approved: "已通过独立复核", rejected: "已驳回", superseded: "已失效(已被新登记取代)" } as const;