完善借款、编号、付款与预算并发及验收(09-06-release-gate-integrity)

汇总已落盘的借款本金与还款、兼容历史编号的周期化编号、付款责任与回单核验、报销进度和排序、PWA/采购事务、错误原因与日期校验及ERP退役。
统一共享预算池锁序和锁后判断,恢复差旅原预算选择,补原因码固定夹具及反向完整性检查。
纳入配套迁移、测试、受管QA、分层验收合同、规约及任务记录;原始证据留在ignored artifacts。

关联任务:09-17-company-loan-principal-repayment、09-17-erp-exclusive-retirement、09-18-reimbursement-periodic-numbering、09-08-reimbursement-payment-closeout、09-18-local-concurrency-product-fixes、09-19-budget-pool-concurrency、09-05-error-explainability-payment-readiness。
预算补审由Claude定向验证2文件928项通过,原4446/28及r6结果仍仅对应各自历史输入;本轮未重跑测试。
完整新候选门禁、R1真实入口接入与12项公网义务仍开放。生产编号未启用、差旅仍冻结;不推送、不部署,不宣称发布资格。
这个提交包含在:
2026-09-19 13:11:04 +08:00
父节点 729d90576f
当前提交 1f8d5b658a
共修改 367 个文件,包含 21079 行新增和 12287 行删除
@@ -370,7 +370,7 @@ test.describe("R101 mobile WIP closeout", () => {
test("移动首页和我的页收口", async ({ page }, testInfo) => {
await page.goto("/mobile");
await expect(page.getByRole("heading", { name: "今天" })).toBeVisible();
await expect(page.getByRole("heading", { level: 1, name: "今日待处理", exact: true })).toBeVisible();
await expect(page.getByTestId("mobile-today-focus")).toBeVisible();
await expect(page.locator("aside")).toHaveCount(0);
await assertNoMobileDesignRegression(page);
@@ -386,7 +386,7 @@ test.describe("R101 mobile WIP closeout", () => {
test("移动报销页使用卡片入口", async ({ page }, testInfo) => {
await page.goto("/mobile/reimbursements");
await expect(page.getByRole("heading", { name: "报销" })).toBeVisible();
await expect(page.getByRole("heading", { level: 1, name: "移动报销", exact: true })).toBeVisible();
await expect(page.getByTestId("mobile-reimbursements-create")).toBeVisible();
await expect(page.getByTestId("mobile-reimbursements-list")).toBeVisible();
const card = page.getByTestId("mobile-reimbursement-card").first();
@@ -400,7 +400,7 @@ test.describe("R101 mobile WIP closeout", () => {
test("移动请假页默认只看记录并提示企微主办", async ({ page }, testInfo) => {
await page.goto("/mobile/leave");
await expect(page.locator("h1", { hasText: "请假记录" })).toBeVisible();
await expect(page.getByText("企业微信主办")).toBeVisible();
await expect(page.getByText("企业微信主办", { exact: true })).toBeVisible();
await expect(page.getByTestId("mobile-leave-records")).toBeVisible();
await expect(page.getByTestId("mobile-leave-record-card")).toBeVisible();