From 752ec4139650c20ca82ae73ecff8643444ab4f91 Mon Sep 17 00:00:00 2001 From: shunli Date: Sat, 12 Sep 2026 15:18:29 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=88=B6=E5=8D=95=E5=A4=87=E6=B3=A8?= =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=8A=A5=E9=94=80=E7=94=A8=E9=80=94=EF=BC=88?= =?UTF-8?q?09-04-reimbursement-state-gap-finance-view=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../implement.md | 13 +++++++++++++ .../prd.md | 4 ++++ .../09-08-reimbursement-payment-closeout/design.md | 4 ++-- .../09-08-reimbursement-payment-closeout/prd.md | 4 ++-- server/src/services/paymentOrderXls.js | 2 +- server/tests/unit/services/paymentOrderXls.test.js | 12 ++++++------ 6 files changed, 28 insertions(+), 11 deletions(-) diff --git a/.trellis/tasks/09-04-reimbursement-state-gap-finance-view/implement.md b/.trellis/tasks/09-04-reimbursement-state-gap-finance-view/implement.md index d4a9667e..458e49cf 100644 --- a/.trellis/tasks/09-04-reimbursement-state-gap-finance-view/implement.md +++ b/.trellis/tasks/09-04-reimbursement-state-gap-finance-view/implement.md @@ -1,5 +1,18 @@ # 报销状态空隙与财务处理视角:实施计划 +## 2026-09-12 备注自解释增量 + +用户批准按“报销款+完整报销编号”修改、测试后部署,随后明确批准六文件提交推送、补齐当前版本本地配对备份和独立镜像;不删除旧制品、不异机传输、不操作真实付款。基于7bfc2546,只改生成器备注列并同步付款合同,不增加姓名、截断或未经银行核实的上限。 + +- [x] 新断言先在旧实现失败;修改后单测与真实BIFF8生成/读回及付款路由回归。 +- [x] 复核差异、语法及治理;已获提交推送授权,实际提交与发布结果另记本轮发布回执。 +- [ ] 刷新候选/生产版本/迁移/磁盘/备份/独立镜像预检;退路缺失先报告,不擅自补写或清理。 +- [ ] existing部署后核公网版本、资源、运行时代码摘要及生成逻辑;不操作真人单据或银行。 + +执行回执:旧代码15项中3项按预期失败;运行时修改一行后,使用既有BIFF8解释器,在server执行 `npm test -- tests/unit/services/paymentOrderXls.test.js tests/unit/documentSequence.service.test.js tests/unit/routes/paymentBatches.reimbursement.test.js tests/unit/services/paymentBatchReadiness.test.js`,121/121通过、退出0。生成实际BIFF8并读回,备注为“报销款 ”+完整编号,姓名只在收款人列,同人同账号两单仍独立。语法检查、Trellis治理、process-contract baseline及git diff --check通过;主会话复核确认仅一列映射变化,无权限/审批/迁移变化,不冒充独立review。 + +证据:artifacts/qa-layout/purpose-remark-red.log、purpose-remark-tests.log、purpose-remark-governance.log、purpose-remark-process.log。部署准备只读回读见purpose-remark-preconditions.json:当时生产7bfc2546,磁盘35.85GiB;最新自动备份完整性通过但对应1eeda7cd,既有回滚目录无当前7bfc2546镜像匹配项。用户随后明确授权补齐当前版本退路并提交推送,不重复索取同一授权;补齐后仍须绑定新候选、刷新正式门禁并保留银行导入/恢复覆盖限制。实际补齐、推送、部署与只读验收状态以artifacts/qa-layout/purpose-remark-release回执为准,不将准备完成写成部署完成。 + ## 2026-09-12 整体宽度修正 本地验证后用户明确同意复核并提交这六个文件、准备发布。本轮仅提交该增量,不推送、不部署;下文未提交状态为验证结束时的历史记录,实际提交标识以Git及本地发布准备回执为准。 diff --git a/.trellis/tasks/09-04-reimbursement-state-gap-finance-view/prd.md b/.trellis/tasks/09-04-reimbursement-state-gap-finance-view/prd.md index d258c95b..7341437a 100644 --- a/.trellis/tasks/09-04-reimbursement-state-gap-finance-view/prd.md +++ b/.trellis/tasks/09-04-reimbursement-state-gap-finance-view/prd.md @@ -2,6 +2,10 @@ ## Goal +### 2026-09-12 最新备注方案(已批准修改、测试后部署) + +用途保持“报销款”,备注改为“报销款 ”+完整报销编号,不加姓名。该方案是用户采纳的产品选择,不是国内系统调研结论,也不证明银行长度/导入接受性。一单一行、批次多单、快照及编号不变;不操作真实付款,不重写已下载文件。提交推送授权单独确认,部署按正式existing及新候选预检进行。 + ### 2026-09-12 整体宽度统一(已批准本地实施) 报销详情标题与正文、付款详情使用同一外层宽度和边距,移除报销正文独有的1280px居中限制。正文自适应、桌面侧栏320px及手机单列不变。复用当前任务;验收1280/1440/1920px两页整体左右边界及报销标题/正文边界,390px无横向溢出。只维护现有布局,不引入新视觉方案;不改权限或业务动作,提交、部署另批。 diff --git a/.trellis/tasks/09-08-reimbursement-payment-closeout/design.md b/.trellis/tasks/09-08-reimbursement-payment-closeout/design.md index 0824ed23..95b93e67 100644 --- a/.trellis/tasks/09-08-reimbursement-payment-closeout/design.md +++ b/.trellis/tasks/09-08-reimbursement-payment-closeout/design.md @@ -2,7 +2,7 @@ ## 2026-09-11 已批准备注增量 -最新确认仅修改buildPaymentOrderRows的备注列,使用已验证且已trim的entityCode,不再拼接姓名和用途。收款户名列的payeeName仍来自组批冻结的snapshot_json.payee.name;路由将归属人的收款信息冻结为payee,生成器不另查现职员工/提交人。每个batch item保持一行,即使姓名/收款账号相同也不合并;一个批次仍允许多张报销单。姓名或单号为空沿现有blockers整批拒绝。 +最新确认仅修改buildPaymentOrderRows的备注列,使用“报销款 ”与已验证且已trim的entityCode拼接,不再拼接姓名。收款户名列的payeeName仍来自组批冻结的snapshot_json.payee.name;路由将归属人的收款信息冻结为payee,生成器不另查现职员工/提交人。每个batch item保持一行,即使姓名/收款账号相同也不合并;一个批次仍允许多张报销单。姓名或单号为空沿现有blockers整批拒绝。 不改模板列宽/格式、不缩写或截断、不引入未经银行证明的长度阈值。测试使用合成姓名,逐列xlrd读回用途、备注及文字类型,并证明同名两单独立对应、旧序号不重排。BX/PB编号规则本轮不改;编号说明以PRD最新节为准,不将日期前缀误当每日重置的证据。 @@ -24,7 +24,7 @@ | 9 | 客户方流水号 | 批次号+行号,稳定、唯一并满足长度限制 | | 10 | 金额 | 已批准批次项金额,数值且两位小数 | | 11 | 用途 | 报销款,不复制工资/公积金用途 | -| 12 | 备注 | 仅完整报销单号,不重复姓名或用途(09-11最新确认) | +| 12 | 备注 | “报销款 ”+完整报销单号,不重复姓名(09-12最新确认) | | 13–15 | 短信标志/手机/附加信息 | 0、不通知,后两列空;不读样例手机号 | 用户三个 input 文档的表头完全一致,空白模板与内置模板相同,账号列为文本。检查原件只提取结构与摘要,原件不改、不重新保存、不复制真实行到测试夹具。工资及公积金样例仅用于确定文件格式,不暗中扩为新业务。 diff --git a/.trellis/tasks/09-08-reimbursement-payment-closeout/prd.md b/.trellis/tasks/09-08-reimbursement-payment-closeout/prd.md index d45de14a..1b266ffe 100644 --- a/.trellis/tasks/09-08-reimbursement-payment-closeout/prd.md +++ b/.trellis/tasks/09-08-reimbursement-payment-closeout/prd.md @@ -2,9 +2,9 @@ ## Goal -### 2026-09-11 制单备注与编号解释(最新精简方案已批准,增量未部署) +### 2026-09-12 制单备注与编号解释(自解释方案已批准,增量未部署) -- 最新确认覆盖此前姓名拼接方案:用途继续为“报销款”;每行备注仅该行完整报销编号,例如“BX-20260828-0014”。收款人姓名仍单独来自冻结快照,不在备注重复。增量实施与验证记录归当前09-04任务,不另建task。 +- 最新确认覆盖此前仅编号方案:用途继续为“报销款”;每行备注为“报销款 ”+完整报销编号,例如“报销款 BX-20260828-0014”。收款人姓名仍单独来自冻结快照,不在备注重复。这是产品选择,不冒充行业调研结论。增量实施与验证记录归当前09-04任务,不另建task。 - 现有一单一行保持,不按收款人合并转账;同一批次同一收款人的多张单仍逐行对应完整编号。缺少姓名或单号继续整批拒绝,不猜测、不截断。 - 保留BIFF8模板、15列、用途、金额、账号文本、客户流水号、排序、权限/复核/审计与下载行为;不修改历史文件、历史单号、计数器或生产配置,不新增迁移。 - 编号只标识创建顺序,不表示此前单据已经报销/付款。BX当前生成器优先既有序列配置,回退resetPeriod=none;PB按日三位流水,从001起。不能把讨论中的“若按日则0001起”直接改成重置生产BX或将PB扩位;周期变化另行确认。本轮仅解释并保留现状,生产具体BX序列配置未查询。 diff --git a/server/src/services/paymentOrderXls.js b/server/src/services/paymentOrderXls.js index 713acab0..9bb3f278 100644 --- a/server/src/services/paymentOrderXls.js +++ b/server/src/services/paymentOrderXls.js @@ -156,7 +156,7 @@ function buildPaymentOrderRows(config, batch) { serial, Number(amount.toFixed(2)), "报销款", - entityCode, + `报销款 ${entityCode}`, "0", "", "", diff --git a/server/tests/unit/services/paymentOrderXls.test.js b/server/tests/unit/services/paymentOrderXls.test.js index 1e3ff22f..e712462b 100644 --- a/server/tests/unit/services/paymentOrderXls.test.js +++ b/server/tests/unit/services/paymentOrderXls.test.js @@ -43,7 +43,7 @@ function buildBatch(overrides = {}) { } describe("payment order BIFF8 generator", () => { - it("keeps document-only remarks and separate transfers for the same frozen payee account", () => { + it("keeps reimbursement-purpose remarks and separate transfers for the same frozen payee account", () => { const batch = buildBatch(); for (const item of batch.items) { item.snapshot_json.payee.name = " 合成收款人 "; @@ -53,8 +53,8 @@ describe("payment order BIFF8 generator", () => { } const result = buildPaymentOrderRows(config, batch); expect(result.rows.map((row) => row.slice(10, 12))).toEqual([ - ["报销款", "BX-20260802-0001"], - ["报销款", "BX-20260802-0002"], + ["报销款", "报销款 BX-20260802-0001"], + ["报销款", "报销款 BX-20260802-0002"], ]); expect(result.rows.map((row) => row[5])).toEqual(["合成收款人", "合成收款人"]); expect(result.rows[0][4]).toBe(result.rows[1][4]); @@ -72,7 +72,7 @@ describe("payment order BIFF8 generator", () => { batch.items[0].entity_code = ` ${code} `; const row = buildPaymentOrderRows(config, batch).rows[0]; expect(row[5]).toBe(name); - expect(row[11]).toBe(code); + expect(row[11]).toBe(`报销款 ${code}`); }); it.each([ @@ -126,10 +126,10 @@ describe("payment order BIFF8 generator", () => { expect(parsed.rows).toHaveLength(2); expect(parsed.rows[0]).toEqual([ "1", payerAccount, "合成测试公司", "01", payeeAccount, "甲", "中国建设银行", "", - "PB-20260802-002-R001", 1.2, "报销款", "BX-20260802-0001", "0", "", "", + "PB-20260802-002-R001", 1.2, "报销款", "报销款 BX-20260802-0001", "0", "", "", ]); expect(parsed.rows[1][9]).toBe(2); - expect(parsed.rows[1].slice(10, 12)).toEqual(["报销款", "BX-20260802-0002"]); + expect(parsed.rows[1].slice(10, 12)).toEqual(["报销款", "报销款 BX-20260802-0002"]); }); it("fails the whole export and reports every blocking payee issue", () => {