取消报销资产事前批准强制(08-30-reimbursement-assets-prior-approval-correction)
这个提交包含在:
@@ -0,0 +1,58 @@
|
||||
# 设计:取消报销资产事前批准强制
|
||||
|
||||
## 设计边界
|
||||
|
||||
本轮是对 B1 产品口径的最小纠偏,不新增 schema、feature flag 或审批机制。生产继续运行 `0f9f403`,新候选只改变 assets 明细的保存/提交条件、前端呈现、seed description 与事实源。
|
||||
|
||||
## 服务端兼容合同
|
||||
|
||||
`asset_prior_approval_basis` 保持 nullable,API 的 `assetPriorApprovalBasis?: string | null` 保持兼容:
|
||||
|
||||
| 场景 | 目标行为 |
|
||||
| --- | --- |
|
||||
| 新建 assets,字段缺失/空白 | 保存 null,允许创建 |
|
||||
| 编辑 assets,字段 omitted、现值为 null | 保持 null,允许编辑,不发生 null `.trim()` |
|
||||
| 编辑 assets,字段 omitted、现值有值 | 保留现有值,避免隐藏 UI 后静默清空 |
|
||||
| 编辑 assets,字段显式 null/空白 | 清空为 null |
|
||||
| assets 切换为非 assets | 清空为 null |
|
||||
| 提交 assets 且字段为空 | 不阻断,继续执行金额、票据和 workflow 门禁 |
|
||||
|
||||
创建/编辑仍查询费用类型以验证 enabled/category;category 只用于切换到非 assets 时清理兼容字段,不再决定必填。
|
||||
|
||||
删除创建/编辑必填分支时,原本被校验守卫保护的 `.trim()` 必须同时改为安全归一化:
|
||||
|
||||
```js
|
||||
body.assetPriorApprovalBasis?.trim() || null
|
||||
targetApprovalBasis?.trim() || null
|
||||
```
|
||||
|
||||
不允许用非空断言或默认虚构文本代替 null 兼容。
|
||||
|
||||
## 前端数据流
|
||||
|
||||
- PC `ReimbursementItemEditor` 的表单模型移除 `assetPriorApprovalBasis`,不渲染输入、不参与 disabled、不进入 `onSave`。
|
||||
- PC 详情保存 payload 不再写该字段,编辑初始值也不再从详情 DTO 映射。
|
||||
- 移动端 `ItemFormState`、新增/编辑初始化和 mutation payload 同步移除该字段。
|
||||
- PC 表格与移动卡片移除批准依据展示。API DTO 类型保留,避免对旧服务端/客户端契约做无收益破坏。
|
||||
|
||||
## 主数据说明
|
||||
|
||||
seed 继续通过 upsert 更新启用类型 description,不触碰 `account_code_default`。推荐文案:
|
||||
|
||||
- 设备采购:`通用设备采购;请在明细说明中写明物品名称、实际使用人或责任人、存放位置,便于资产登记。`
|
||||
- 家具采购:`办公家具采购;请在明细说明中写明物品名称、实际使用人或责任人、存放位置,便于资产登记。`
|
||||
- 办公电子设备:`单条明细金额达到 2,000 元的办公电子设备通常选择本类型;请在明细说明中写明物品名称、实际使用人或责任人、存放位置,便于资产登记。该门槛不等同于会计固定资产确认标准。`
|
||||
|
||||
## 发布与回滚
|
||||
|
||||
- 无 migration;init 仍可运行既有 migration status + seed 流程,必须确认 pending=none、seed 退出码 0。
|
||||
- 部署后核对三个 description、B2 仍为 global on、`/ready` 和 bundle marker 为新候选。
|
||||
- 公网用合成 assets 草稿验证 PC/移动保存和提交,不使用 0017 做 smoke。
|
||||
- 异常时回滚应用到本轮发布前候选 `0f9f403`;数据库兼容列和已存在值不需要补偿。回滚后旧候选会恢复强制,因此 0017 在纠偏验收完成前始终不得退回。
|
||||
|
||||
## 风险控制
|
||||
|
||||
- 最大兼容风险是隐藏输入后编辑请求携带 null,误清历史值;通过前端 payload 断言和服务端 omitted-field 测试锁定。
|
||||
- 最大运行时风险是删除必填校验后暴露下游 `.trim()` 的 null/undefined 假设;创建 omitted、编辑 null omitted 和编辑有值 omitted 三条路由测试必须同时覆盖。
|
||||
- 最大文案风险是四处 2,000 元提示只改一半;E2E 同时覆盖 PC/移动编辑态和展示态。
|
||||
- seed 失败会造成代码已取消强制但费用类型仍宣称要批准;部署验收必须同时核应用行为和三条主数据文案。
|
||||
在新工单中引用
屏蔽一个用户