文件
hyb-oa/.trellis/tasks/07-28-ceo-finance-fallback/design.md
T
wangsli 35948729cf
ci-e2e / e2e (push) Canceled after 0s
ci-minimal / check-minimal (push) Canceled after 0s
修正CEO报销财务兜底与部署护栏(07-28-ceo-finance-fallback)
2026-07-28 13:42:48 +08:00

3.2 KiB
原始文件 Blame 文件历史

CEO 本人报销财务兜底设计

1. Boundary

本任务复用现有审批规则和工作流快照机制,不新增角色、数据表、迁移或公开端点。finance_mgr 保持兼容;本公司的新默认和生产规则改为 finance。

2. Cross-layer Contract

审批规则配置
  ownerSelfFallbackRole: finance | finance_mgr | null
  -> API 白名单校验
  -> ApprovalRule 持久化
  -> 报销提交加载规则
  -> CEO 本人且 manager 无法解析时使用 fallback
  -> 移除本人 ceo 节点 + 角色去重
  -> 校验 active 非本人角色持有人
  -> 冻结 workflow_steps_snapshot

创建 API、省略字段时的默认值和前端新建表单默认值统一为 finance。旧规则返回 finance_mgr 时前端仍可展示、编辑和保存,避免破坏兼容数据。

3. Target Rule Matrix

金额档 普通员工规则 CEO 本人快照
小额 manager -> finance finance
中额 manager -> finance finance
大额 manager -> ceo -> finance finance

CEO 本人快照只由现有标准步骤完成:manager 缺失时插入 finance fallback;随后相同 finance 节点去重,申请人自身 ceo 节点移除。无需添加按金额或人员姓名硬编码的特殊分支。

4. Validation And Failure Behavior

  • fallback 不在 finance|finance_mgr:400 VALID_001。
  • CEO 同时持有 fallback:409 VALID_001 / owner_self_fallback_self_role。
  • 无 active 非本人 fallback 持有人:409 VALID_001 / owner_self_fallback_role_unavailable。
  • 非 CEO:不触发 owner-self fallback,保留正常规则快照。
  • 生产规则数量、金额区间或当前角色结构漂移:回填事务停止,零写入。

5. Production Rollout

  1. 部署代码与前端,使 runtime 能读写 finance fallback;seed:config 对既有审批规则只保留不覆盖,避免部署提前改写生产规则。
  2. 核对公网构建号和 runtime smoke。
  3. 生产只读冻结 3 条规则、active finance 持有人、CEO 身份、角色/binding/历史快照计数。
  4. 单事务更新 3 条启用规则:中/大额 finance_mgr 节点改为 finance,全部 fallback 改为 finance;逐条写脱敏审计。
  5. 只读解析三档 CEO 快照和普通员工快照,不创建真实报销。

6. Rollback

  • 代码兼容 finance_mgr,生产规则可在精确冻结原值后原子恢复。
  • 回滚规则只影响回滚后新提交单据;既有 workflow_steps_snapshot 保持不变。
  • 任一生产检查失败时先回滚规则,不改员工角色或历史单据。

6.1 Seed Safety

  • 空库首次初始化时创建三条新默认规则。
  • 只要审批规则表已有任意记录,seed:config 保留全部既有规则,不删除、不覆盖、不补写;生产规则只允许走获批的独立原子事务。
  • 部署日志只记录创建/保留计数,不输出规则 ID、人员或业务内容。

7. Trade-off

不采用“给现有财务追加 finance_mgr”方案,因为该角色同时包含主数据、预算、集成、AI、资产和薪酬等更宽权限,超出“审批 CEO 本人报销”的最小职责。允许 finance 作为兜底能复用已有 expense.approve,权限面更小。