# 数据库状态字段审查 ## 审查范围 - 容器:`x-financial-main` - 数据库:当前运行时 PostgreSQL - 字段范围:所有 `status`、`stage`、`approval`、`state` 相关列 - 审查方式:只读查询 `information_schema` 与各表状态值分布 ## 总体结论 - 当前数据库没有 `status_code`、`state_code`、`stage_code` 这类数字状态码字段。 - 所有匹配到的状态字段类型都是 `character varying`。 - 非业务运行态表,例如 agent 运行、工具调用、预算池、风险观察,主要使用英文机器码。 - 报销主表 `expense_claims` 是当前最需要修复的表:`status` 使用英文码,`approval_stage` 同时混入英文码和中文节点名。 ## 报销主表现状 `expense_claims` 当前共 498 条。 按单据类型拆分: - 申请类单据:2 条,阶段为 `审批完成`、`直属领导审批`。 - 普通报销单:1 条,阶段为 `待提交`。 - 半年模拟报销单:495 条,主要问题都集中在这里。 `expense_claims.status` 当前值: - `paid`:212 - `approved`:98 - `pending_payment`:67 - `finance_review`:43 - `submitted`:41 - `returned`:17 - `rejected`:13 - `draft`:7 `expense_claims.approval_stage` 当前值: - `payment`:279 - `completed`:97 - `finance_review`:43 - `manager_review`:40 - `supplement`:17 - `rejected`:13 - `draft`:6 - `审批完成`:1 - `待提交`:1 - `直属领导审批`:1 ## 问题判断 现在不是单纯中文显示问题,而是字段职责混乱: - `status` 被当作流程机器状态使用。 - `approval_stage` 既被当作流程节点,也被历史模拟数据写成英文状态码。 - 单据中心和审批权限逻辑依赖 `submitted + 中文审批阶段`。 - 旧模拟数据中的 `finance_review/manager_review/payment/completed` 会导致审核、归档、报销单分类偏差。 ## 建议契约 短期先采用当前代码最接近的契约: - `status`:稳定机器码,继续使用英文枚举。 - `approval_stage`:当前流程节点,统一使用中文节点名。 - 前端和接口展示层:只展示中文标签,不直接暴露机器码。 中期如要数字状态码,需要单独迁移: - 增加 `status_code`、`approval_stage_code` 或独立状态字典表。 - 保留现有字符串字段作为兼容层,避免一次性改动所有查询、权限、看板和智能体逻辑。 - 完成迁移后再逐步让业务代码改读数字码。 ## 报销主表修复映射 建议先只修 `expense_claims` 的模拟数据和历史异常阶段: - `status=finance_review` → `status=submitted`,`approval_stage=财务审批` - `approval_stage=manager_review` → `直属领导审批` - `approval_stage=budget_review` → `预算管理者审批` - `approval_stage=finance_review` → `财务审批` - `status=pending_payment` → `approval_stage=待付款` - `status=paid` → `approval_stage=已付款` - `status=approved` 且为报销单 → `approval_stage=归档入账` - `status=approved` 且为申请单 → `approval_stage=审批完成` - `status=returned` → `approval_stage=待补充` - `status=rejected` → `approval_stage=已驳回` - `status=draft` → `approval_stage=待提交` ## 后续动作 - 已完成:只读审查数据库状态字段。 - 已完成:模拟数据修复脚本支持 dry-run 和中文阶段归一化。 - 已完成:新增报销状态注册表,统一状态码、标签、阶段别名与历史值归一化。 - 已完成:新增只读审计脚本 `audit_expense_claim_statuses.py`,用于修复前后核对状态一致性。 - 已验证:当前 498 张单据中 495 张模拟报销单需要归一化,集中在 `payment`、`completed`、`finance_review`、`manager_review` 等历史阶段值。 - 待确认:执行模拟数据修复脚本 `--apply --refresh-profiles`。 - 待确认:执行 mock 附件脚本 `--apply`。 - 待开发:如确认要数字状态码,新增状态字典/状态码迁移方案。