修复在途还款被出借人维护卡死并按审批时资格登记付款后事实(09-17-company-loan-principal-repayment)

- A:出借人存在 reserved 额度占用时,身份关联与收款资料维护在出借人锁内
  返回 409 loan.lender_in_flight;页面禁用并提示,修正账户弹窗误导文案
- B:回单 OCR 认领、人工回单参与人、核销按审批时资格认定,不再因原审批人
  或出借员工事后离职/撤权、主数据停用而卡死;保留身份核实、版本与付款快照
  一致、审批独立性及回单匹配校验;付款前环节仍校验当前资格
- 测试:隔离 PostgreSQL 合成全流程,含确定性并发交错、付款后独立性反例、
  离职后经 OCR/人工复核核销、PC/手机按钮禁用;变异测试均变红
- 恢复手册:资金类数据恢复后先暂停付款,对照银行流水补齐并核对占用再开放
- design 按环节修订资格规则

注意:C(同金额回单传错批次错误核销)已复现但尚未修复,借款功能不具备
真实还款验收条件;未推送、未部署。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
2026-10-06 13:13:30 +08:00
共同撰写人 Claude Opus 5.5
父节点 1989f666ac
当前提交 b639422211
共修改 15 个文件,包含 311 行新增和 38 行删除
+9
查看文件
@@ -84,6 +84,15 @@ module.exports = async function runBrowser({ app, finance, ordinary, password, c
assert.equal(overflow, false, `${mode} horizontal overflow`);
await page.screenshot({ path: path.join(output, `${mode}-repayment.png`), fullPage: true });
checks.push(`${mode}_real_login_register_materials_confirm_submit_and_named_progress`);
await page.goBack();
await expect(page.getByRole('heading', { name: '公司借款', exact: true })).toBeVisible();
await page.screenshot({ path: path.join(output, `${mode}-lenders-after-submit.png`), fullPage: true });
await page.getByRole('tab', { name: '出借人', exact: true }).click();
const frozenCard = page.locator('section').filter({ has: page.getByRole('heading', { name: `${lenderName} · ${company.name}`, exact: true }) });
await expect(frozenCard).toContainText('有还款正在办理');
await expect(frozenCard.getByRole('button', { name: '核实身份关联' })).toBeDisabled();
await expect(frozenCard.getByRole('button', { name: '更新收款资料' })).toBeDisabled();
checks.push(`${mode}_in_flight_repayment_disables_lender_maintenance`);
await context.close();
}
const context = await browser.newContext({ serviceWorkers: 'block' });