# 本体字段治理

## 背景

当前费用申请、报销助手、单据详情、风险规则和预算控制中存在字段口径不一致的问题。例如同一语义在不同环节被命名为 `transport_type`、`transport_mode`、`application_transport_mode`，或 `occurred_date`、`business_time`、`time_range`。这些字段如果不先进入本体层，会导致语义识别、规则判断、草稿保存和前端展示各自解释同一业务事实。

## 原则

所有业务字段必须先设计为本体字段，再下放到业务模块使用。

- 本体字段注册表是唯一字段源。
- 业务层只允许消费本体 canonical 字段。
- 非本体字段只能作为输入别名，必须在语义入口归一。
- 页面控件字段、兼容字段、后端历史字段不能直接进入业务判断。
- 新增业务字段时，必须先更新本体字段设计，再更新表单、助手上下文、持久化、风险规则和测试。

## 当前第一阶段范围

第一阶段先治理费用申请和报销链路：

- 个人工作台意图识别。
- 费用申请预览和提交。
- 报销助手快速发起报销。
- 关联申请单生成报销草稿。
- 报销详情智能录入和附件归集。
- AI 预审、风险规则、审批流和预算流。

## 字段分层

本体 canonical 字段：

- `expense_type`
- `time_range`
- `location`
- `reason`
- `amount`
- `transport_mode`
- `attachments`
- `customer_name`
- `merchant_name`
- `participants`
- `application_claim_id`
- `application_claim_no`
- `application_days`
- `application_date`
- `application_lodging_daily_cap`
- `application_subsidy_daily_cap`
- `application_transport_policy`
- `application_policy_estimate`

输入兼容别名：

- `transport_type`、`transportMode`、`application_transport_mode` -> `transport_mode`
- `occurred_date`、`business_time`、`application_business_time` -> `time_range`
- `business_location`、`application_location` -> `location`
- `reason_value`、`business_reason`、`application_reason` -> `reason`
- `attachment_names` -> `attachments`
- `reimbursement_type`、`scene_label` -> `expense_type`

## 非合规判断

以下情况视为字段不合规：

- 新业务流程直接新增 `context_json` 字段但没有进入本体注册表。
- 风险规则读取未注册字段。
- 前端 `review_form_values` 输出页面控件字段。
- 后端服务用别名字段做业务判断，而不是先归一成本体字段。
- 同一业务事实在申请、报销、审批、预算中使用不同字段名。

## 验收口径

完成后应满足：

- 语义层能从上下文中生成统一本体实体。
- 报销助手关联申请单后不再因为字段别名丢失追问出行方式。
- `review_form_values` 对外输出本体字段，不输出页面别名字段。
- 后端测试覆盖别名归一到本体字段。
- 前端测试覆盖快速报销和核对抽屉只输出本体字段。
