文件
hyb-oa/.trellis/tasks/archive/2026-10/08-28-reimbursement-detail-material-preview-fixes/implement.md
T
wangsli和Claude Opus 5.5 b85ff6a9bf 归档 11 个已上线 Trellis 任务并补收口记录(09-17-company-loan-principal-repayment 任务整理)
- 报销一页式审批工作台父任务及 B-2a/B-2b/只读一致性子任务(AC11 依用户 2026-09-27 确认)
- 报销详情材料预览修复及其部署子任务(由候选 59dc5f6 发布覆盖,原步骤未执行,记录保留)
- 资产事前批准纠偏、Trellis 流程对齐、ERP 遗留精简、预算池并发、采购提交超时
- 各任务 prd 顶部新增收口记录,实现均包含于生产 4a5cd8f2;原未勾清单保留不补勾
- B 组与有真实待办的任务保持进行中

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 10:19:21 +08:00

5.2 KiB
原始文件 Blame 文件历史

实施清单:报销详情权限与材料预览缺陷修复

1. 实施前只读诊断

  • 确认当前任务已获最终方案实施批准,并加载 trellis-before-dev。
  • 使用受控只读路径冻结 BX-20260828-0017 的材料顺序与最小元数据,不打印敏感字段;按“两张单页 PDF 发票在前、两张 JPG 附件在后”的既有事实,将第一张图片锁定为合并 PDF 第 3 页。
  • 在运行中 server 容器内以只读事务和内存缓冲复现当前合并结果,从第 3 页核对目标图片的 EXIF、规范化输出尺寸、PDF 页序和页尺寸;未写生产、未落临时原件。
  • 诊断确认两张 JPG 均无 EXIF 方向标记,第 3/4 页比例正确且存在图像内容;两张源 PDF 也均有普通内容流,不存在 AcroForm/可选内容层依赖。当前数据无法复现“第 3 页无内容”,因此 EXIF 修复不宣称解决 0017 现象,本轮不扩展 PDF 引擎。

2. PC 撤回动作资格

  • 将 ReimbursementActions.showWithdrawAction 改为无默认值的必填 prop,并在 PC 报销详情调用点显式传入 showWithdrawAction={isReimbursementParticipant}。
  • 保留 owner/submitter reviewing 状态的撤回能力、mutation 和反馈,不改组件外的权限或状态判断。
  • 在 r102-reimbursement-main-flow.spec.ts 复用现有 admin 非参与人全范围夹具,断言撤回按钮和意见框均不存在;保留现有 owner 可见回归和 PWA Service Worker 隔离合同。

3. EXIF 合并修复

  • 调整图片规范化函数,从实际 JPEG 输出 info 读取宽高并校验合法性。
  • 更新材料合并器版本,确保缓存身份与算法版本一致。
  • 增加 orientation 6/8 合成图片回归,断言合并页方向/比例;保留普通图片、页数、确定性、限额和失败路径测试。

脱敏只读诊断结论

  • 材料顺序为 2 张单页 PDF 发票、2 张 JPEG 附件,共 4 页;用户所称“第一张图”为第 3 页。
  • 两张 JPEG 的输入与规范化尺寸比例一致,均无 EXIF orientation;当前合并 PDF 第 3、4 页均存在内容,页面比例与图片一致。
  • 两张源 PDF 均存在普通页面内容流,未发现 AcroForm 或可选内容层;当前合并结果也保留对应页面内容。
  • 因而:代码中的 EXIF 尺寸读取缺陷成立并应修复,但不是 BX-20260828-0017 当前材料的直接原因;该单的“第一张图未显示”在本次只读内存复现中未重现,可能与当时的短时 bundle/阅读器状态有关,不能无证据归因。
  • 下一步:服务端材料链路已排除。若现象复现,需向用户确认具体页码、浏览器或企业微信 WebView 版本,以及是否稳定复现,再决定是否创建新的客户端诊断任务;本轮不在服务端继续扩面。

4. 验证与只读复核

  • 运行聚焦后端 Vitest、修改文件 node --check 和 Prisma validate。
  • 运行前端 typecheck/build 与聚焦 Playwright。
  • 运行流程、文档、Trellis 治理及 git diff --check。
  • 只读检查 diff,确认未改变服务端撤回授权、权限矩阵、审批状态机、材料顺序、授权 grant、审计或原件降级合同。
  • 按 trellis-update-spec 将“旋转后以输出尺寸建页”和“可见算法变化升级 merger version”沉淀到报销材料规约。

5. 交付与回滚点

  • 汇总代码变化、合成测试结果和 BX-20260828-0017 脱敏诊断结论,不附真实原件或敏感标识。
  • 将 BX-20260828-0017 的真实处置作为单独业务决定提醒:按现行 PDF-only 规则由业务选择退回重传或财务留痕例外接受,本任务不代为处理。
  • 提交信息使用中文并引用 08-28-reimbursement-detail-material-preview-fixes。
  • 未经单独批准不部署;如后续批准部署,必须完成公网构建号和关键路径只读检查后才能通知用户测试。

关键文件

  • client/src/pages/ReimbursementDetailPage.tsx:PC 撤回动作资格投影。
  • 覆盖 PC 报销详情的现有或聚焦 Playwright spec:owner/财务双视角回归。
  • server/src/services/reimbursementMaterialPdf.js:Sharp 输出尺寸读取。
  • server/src/services/reimbursementMaterialPreview.js:合并器版本。
  • server/tests/unit/services/reimbursementMaterialPreview.test.js:EXIF、页面尺寸和确定性回归。

验证记录

  • 聚焦后端:3 个测试文件、23 项测试全部通过;含材料合并、附件路由和非参与人撤回 403 回归。
  • 前端:typecheck 与 production build 通过;admin 非参与人撤回不可见、owner 撤回可用两条聚焦 Playwright 均通过。
  • 完整 r102-reimbursement-main-flow.spec.ts 为 5/6:本次新增用例通过;唯一失败为既有用例仍查找旧按钮名“编辑”,当前页面实际为“编辑报销日期”,与本次修改无关,未在本任务扩面修复。
  • 全量后端为 179 个测试文件通过、2 个失败,1295/1298 项通过;3 项失败均来自既有付款单 BIFF8 生成器在当前环境不可用,本任务未修改付款单代码。
  • process contract 与 Trellis governance 通过;docs registry 为 0 error、既有 22 个未登记文档 warning;敏感内容检查与 git diff --check 通过。