Files
th-hotel-simple/docs/import/20260712/前端字段控件修改说明_给信息系统小伙伴Codex_2026-07-12.md
2026-07-13 10:15:19 +08:00

358 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 前端字段控件修改说明
## 给信息系统 / Adapter / Frontend Codex 的实施任务
日期2026-07-12
适用范围:任务卡展示、人工复核编辑、字段校验和同卡解阻
不适用范围Prompt、Skill、业务 references、MCP Server、Gateway、公开 JSON 业务规则重设计
---
## 0. 先读这些文件
请先从当前工作区根目录读取以下文件,再开始修改:
1. `prompt_skill_architecture_optimization_2026-07-12/README.md`
2. `prompt_skill_architecture_optimization_2026-07-12/01_PLAN/compatibility_invariants.md`
3. `prompt_skill_architecture_optimization_2026-07-12/03_VALIDATION/draft_validation_2026-07-12.md`
4. `outputs/黄哥codex读 2/README_先读_交给Codex.md`
5. `outputs/黄哥codex读 2/04_Adapter_Frontend_保持P0.1_40路由/任务卡前端字段变更与路由说明_3.0_to_current.md`
6. `outputs/黄哥codex读 2/04_Adapter_Frontend_保持P0.1_40路由/任务卡前端字段变更说明_3.0_to_当前版_2026-07-11.xlsx`
7. `prompt_skill_architecture_optimization_2026-07-12/02_DRAFT/working/skills/booking-desk-event/references/00-output-contract.md`
8. `prompt_skill_architecture_optimization_2026-07-12/02_DRAFT/working/skills/booking-desk-event/references/90-manual-review.md`
9. `prompt_skill_architecture_optimization_2026-07-12/02_DRAFT/working/skills/booking-desk-event/references/16-trace-notes.md`
10. `prompt_skill_architecture_optimization_2026-07-12/02_DRAFT/working/skills/booking-desk-event/references/31-allotment-control-block.md`
11. `prompt_skill_architecture_optimization_2026-07-12/02_DRAFT/working/skills/booking-desk-event/references/50-room-type-mapping.md`
12. `prompt_skill_architecture_optimization_2026-07-12/02_DRAFT/working/skills/booking-desk-event/references/51-rate-code.md`
13. `prompt_skill_architecture_optimization_2026-07-12/02_DRAFT/working/skills/booking-desk-event/references/52-fix-charge.md`
旧文件 `任务卡前端展示字段表 3.0(1).xlsx` 只作为历史基线,不得作为当前字段、路由和枚举的唯一来源。
如果上述交接文件或实际 Adapter/Frontend 源码不在当前工作区,请停止代码修改并报告缺失路径;不要根据旧 Excel 猜测当前字段。
---
## 1. 任务目标
把任务卡前端从旧版“是否输入 / 是否下拉”字段说明,升级为当前项目可执行的控件注册和人工复核编辑机制:
```text
Agent final result
→ adapter 按 event 派生任务卡
→ manual_review.missing_fields[] 指定可编辑字段
→ 前端展示对应控件
→ 用户修改
→ review_resolution.field_overrides[]
→ 重新校验依赖字段
→ Preflight
```
核心要求:
- 原 Agent payload 不可变。
- 用户覆盖值不得直接写回 Agent 原始 JSON。
- 不因为前端编辑而改变 `event_type`、业务 task type、task subtype 或关系语义。
- 不创建第二张 linked normal task。
- 只有同一业务卡的 `review_status``pending` 进入 `resolved` 后,才允许继续 Preflight。
- 邮件原文、附件、raw evidence、source ID、source event index 和关系索引只读。
当前项目的最新 Prompt/Skill 架构增量仍处于草案、未进入 `04_RELEASE` 状态;本任务只修改信息系统展示/编辑层,不把草案直接宣称为生产发布。
---
## 2. 修改范围
### 允许修改
- Adapter 的字段注册表 / 字段映射层。
- 任务卡展示组件和人工复核组件。
- 控件类型、编辑权限和字段校验逻辑。
- `review_status` / `review_resolution` 的前端交互。
- Adapter/Frontend 单元测试、契约测试和验收用例。
- 当前字段交接 MD/Excel 的控件列和实现说明。
### 不得修改
- `prompts/``skills/``booking-desk-event` Skill 业务裁决逻辑。
- 公开业务 JSON 根结构和既有五字段业务根。
- S10、S99、`infrastructure_input_error` 结构。
- 40 条 Adapter 路由数量和既有 task type/subtype 语义。
- MCP 工具名、MCP payload mapping、一次提交生命周期。
- `source_event_index` 的含义。
- Parent Group / Allotment 业务本体。
- 不得在前端新增 `Note``Allotment Maintenance` 或旧 Parent Cancel Booking 当前路由。
如果实现过程中发现必须改变上述内容,请先报告为“契约变更”,不要在前端代码中自行绕过。
---
## 3. 前端控件类型
字段注册表至少应支持以下 `control_type`。名称可按现有代码风格调整,但语义必须保持一致:
| `control_type` | 用途 |
|---|---|
| `readonly` | Agent 结果、raw evidence、路由、关系和审计字段 |
| `text` | Group Code、Confirmation No.、备注、旧/新 Group Code |
| `textarea` | 允许覆盖的业务备注;必须保留原始证据 |
| `number` | 房量、人数、PAX、结算价、附加费金额 |
| `date` | 入住日、离店日、服务日期、取消生效日期 |
| `lookup` | 可输入并检索当前系统目标对象的组合框 |
| `select` | 固定枚举或目录选择 |
| `multiselect` | 多部门、多标签、多项业务分类 |
| `structured_table` | `before_after[]``room_items[]``fix_charge_items[]``trace_items[]` |
| `workflow_state` | `review_status`、Resolve/重新校验等动作 |
字段注册表还应增加:
| 配置项 | 说明 |
|---|---|
| `edit_scope` | `never``manual_review_only``workflow_only``system_only` |
| `options_source` | 固定契约枚举、当前 PMS 目录、Rate 配置中心、无、待冻结 |
| `write_target` | `review_resolution.field_overrides`、系统状态、无 |
| `validation_rule` | 格式、必填、目录、依赖字段和 Preflight 前置校验 |
| `raw_readonly` | 是否必须保留原始值且禁止覆盖 |
示例:
```json
{
"field_pointer": "/extracted_fields/pms_room_type_code",
"control_type": "select",
"edit_scope": "manual_review_only",
"options_source": "active_pms_room_type_catalog",
"write_target": "review_resolution.field_overrides",
"raw_readonly": true,
"validation_rule": "catalog_value_exists_and_is_active"
}
```
---
## 4. 字段控件实施矩阵
### 4.1 目标、身份和 Group Code
| 字段 | 控件 | 编辑范围 | 实施要求 |
|---|---|---|---|
| `case_keys.group_code` | `lookup` | `manual_review_only` | 可输入并检索候选;校验目标存在、唯一和当前业务卡匹配 |
| `case_keys.confirmation_number` | `lookup``text` | `manual_review_only` | 不使用固定下拉;允许粘贴后执行格式/目标校验 |
| `case_keys.reservation_number` | `lookup``text` | `manual_review_only` | 与当前事件对象类型匹配后才能提交 |
| Parent `case_keys.block_code` | `readonly` | `never` | 必须与 Parent `group_code` 相等;禁止独立编辑 |
| `extracted_fields.old_group_code` | `text` | `manual_review_only` | 与新 Group Code 成对必填 |
| `extracted_fields.new_group_code` | `text` | `manual_review_only` | 必须表达 old → new 方向关系 |
| `extracted_fields.target_key` | 不再作为主控件 | — | 当前应优先使用通用 `case_keys`;旧字段只做兼容迁移 |
### 4.2 日期、房量和房型
| 字段 | 控件 | 编辑范围 | 实施要求 |
|---|---|---|---|
| `extracted_fields.arrival_date` | `date` | `manual_review_only` | 使用 `YYYY-MM-DD`;修改后重新校验离店日和晚数 |
| `extracted_fields.departure_date` | `date` | `manual_review_only` | 必须晚于入住日;保留原始日期证据 |
| `extracted_fields.nights` | `readonly` | `never` | 由入住日和离店日计算,不直接输入 |
| `extracted_fields.date_evidence.*` | `readonly` | `never` | `hotel_date_raw``tour_date_raw``action_date_raw``sheet_month_year` 只读 |
| `extracted_fields.room_quantity` | `number` | `manual_review_only` | 整数、非负/正数规则按现有业务字段执行 |
| `extracted_fields.child_room_items[]` | `structured_table` | `manual_review_only` | 每个 Child 的房型、房量和 PMS code 分列;禁止单行自由文本 |
| `extracted_fields.room_type_raw` | `readonly` | `never` | 原始房型文本不可被用户覆盖 |
| `extracted_fields.pms_room_type_code` | `select` | `manual_review_only` | 只能从当前有效 PMS 房型目录选择;禁止自由输入 code |
Parent 原始房量汇总与 Child 房型/房量汇总可以因分配或房型重分配而不同。前端不得仅因数量不相等显示冲突、强制修改或自动创建人工复核。
### 4.3 业务路由和分类字段
以下字段是业务识别或 Adapter 路由判别字段,默认只读:
| 字段 | 控件 | 说明 |
|---|---|---|
| `event_type` | `readonly` | 前端不允许 New / Update / Cancel 之间切换 |
| `booking_object_type` | `readonly` | FIT、Group Block、Allotment / Control Block 由业务结果确定 |
| `cancel_object_type` | `readonly` 或同路由受控 `select` | Cancel Booking 只接受 FIT/普通 GroupAllotment 整块取消属于 Cancel Allotment |
| `cancel_scope` | `readonly` 或同路由受控 `select` | 不使用自由文本;不得用前端选择跨到另一张任务卡 |
| `update_actions[]` / 旧 `update_subtypes[]` | `readonly` 标签 | 当前 Update 统一走 `update_booking_amendment`;动作由结果派生,不能用下拉改路由 |
| `voucher_subtype` | `readonly` | `lian_tai_credit_voucher``Payment Evidence` 分开,不跨卡选择 |
| `list_evidence_type` | `readonly` 或复核时受控 `select` | 不允许通过它自行创建新任务类型 |
| `trace_subtype` | `readonly` | 由 `trace_items[]` 重新判断 `extra_bed` / `general_request` |
如果 `manual_review.missing_fields[]` 明确指向同一业务卡的分类字段,才可以显示受控选择;选择结果不得自动改变 `event_type` 或 Adapter 路由,除非项目另行冻结了跨路由 resolution 契约。
### 4.4 Update 和 Before/After
`extracted_fields.before_after[]` 使用 `structured_table`
| 子字段 | 控件 |
|---|---|
| `field` | 当前支持字段的受控选择;不得任意输入路径 |
| `before` | 只读原值/证据值 |
| `after` | 按字段类型使用日期、数字、文字或目录选择 |
| `evidence` | 只读 |
如果 Update 类型和 subtype 已确定,但 before/after 不可靠,保留原 Update 卡并进入同卡人工复核;不能把它改成 Fallback也不能创建第二张卡。
### 4.5 Rate Code 和结算价
| 字段 | 控件 | 实施要求 |
|---|---|---|
| `extracted_fields.rate_code_result.rate_code` | 配置驱动 `select/lookup` | 不得硬编码旧 3.0 的 20+ code 全集;从当前 Rate 配置中心加载 |
| `rate_code_raw` | `readonly` | 原始价格/Rate marker 只读;路径未冻结时不要自行发明公开路径 |
| `settlement_price` | `number` | 单独编辑;校验币种、精度、非负和业务依赖 |
| `manual_settlement_price_required` | `readonly` | AI/规则派生,不让用户直接改成 true/false |
| `manual_price_reason_code` / `price_evidence` | `readonly` | 用于解释和审计,不是输入项 |
如果 Rate Code 无法唯一确定,用户应选择当前有效目录值或填写允许的手工结算价;不能让用户输入一个未经配置的任意 Rate Code。
### 4.6 Fix Charge
`fix_charge_items[]` 必须做成 `structured_table`,不能压成一行输入。
| 子字段 | 控件 | 当前边界 |
|---|---|---|
| `charge_type` | `select` | 使用当前契约枚举,如 `fixed_charge`;不要继续使用旧表 `additional_charge` |
| `pricing_mode` | `select` | 使用当前契约 `unit` 等已冻结值;旧 `unit_price` 需迁移 |
| `amount` / `quantity` / `total_amount` | `number` | 不把多个金额拼成文本;不得前端自行推导未经契约支持的总价 |
| `currency` | `select` 或配置值 | 以当前系统货币目录为准 |
| `unit_basis` | `select``text` | 若枚举未冻结,先只读或容错,不猜选项 |
| `raw_text` / `evidence_source` | `readonly` | 保留原文和证据 |
| `requires_followup_tool` / `followup_tool_name` | `readonly` | 前端不得自行调用工具 |
| `additional_operations[]` | `readonly` / pending badge | 只展示待处理意图,不执行实际写入 |
### 4.7 Cancel
| 字段 | 控件 | 实施要求 |
|---|---|---|
| `cancel_object_type` | 默认 `readonly` | Cancel Booking 只显示 FIT/GroupAllotment 使用独立 Cancel Allotment 卡 |
| `cancel_scope` | 默认 `readonly` | 不允许自由文本;部分配额维护当前不支持 |
| `requested_cancel_effective_date` | `date` | 只有 `missing_fields[]` 指定时启用 |
| `cancellation_note` | `textarea` | 允许覆盖时必须保留原始邮件证据并记录 field override |
### 4.8 Voucher、Payment 和 Invoice
| 字段 | 控件 | 实施要求 |
|---|---|---|
| `voucher_attachment` / `file_reference` | `readonly` 文件展示 | 不允许改写输入文件引用 |
| `voucher_subtype` | `readonly` | Credit Voucher 与 Payment Evidence 分开路由 |
| `department_routing[]` | `multiselect` 或只读 | 当前路径仍需以实际 schema 为准;默认 Finance/pending 只展示,不执行确认 |
| `post_confirmation_intent` | `readonly` | 只表示待确认后的意图,不表示已确认或已执行 |
| Invoice 专属字段 | 默认 `readonly` | 当前详细 item schema 尚未完全冻结,不要自造输入字段 |
### 4.9 Trace、Parent 和关系字段
| 字段 | 控件 | 实施要求 |
|---|---|---|
| `extracted_fields.trace_text` | `readonly` | 保留完整原文,不允许直接编辑 |
| `trace_items[].category` | 固定枚举 `select` | 仅在明确 pointer/权限允许时修正 |
| `trace_items[].text_raw` | `readonly` | 原始补充信息不可改 |
| `trace_items[].service_date` | `date` | 只有需要且 pointer 明确时编辑 |
| `trace_items[].pax` | `number` | 缺失时可为空;不因缺失自动人工复核 |
| `trace_items[].notify_departments[]` | `multiselect` | 已知时可选 FO/HSK不清楚时允许空数组 |
| `related_source_event_index` | `readonly` | 单一关系索引,只用于本次结果内部关联 |
| `related_source_event_indices[]` | `readonly` | Parent 或跨 Child Trace 的完整关系;禁止用户编辑索引 |
| `relationship_type` / `related_event_type` | `readonly` | 关系类型不选择任务卡 subtype |
| `requires_downstream_hard_validation` | `readonly` badge | 只展示系统硬校验要求 |
完整 Parent split 的全部 Child 补充请求仍使用现有 Trace 卡,通过 `related_source_event_indices[]` 展示全部 Child不能只绑定 E1也不能新增一个 Trace 路由。
### 4.10 Rooming List 和 TA Recorder
| 字段 | 控件 | 实施要求 |
|---|---|---|
| Rooming List target | `lookup` | 以通用 `case_keys` 为主;多个目标分开处理 |
| `list_evidence_type` | 默认只读 | 由证据识别,不允许任意切换卡型 |
| TA Recorder `group_code` | `lookup` / `text` | 只有缺失且 pointer 明确时编辑 |
| `ta_recorder_status` | `readonly` / `workflow_state` | 由信息系统后续状态更新,不是 AI 字段输入 |
| `source_rooming_list_task_id` | `readonly` 或隐藏 | 仅作 linked task 上下文 |
### 4.11 Manual Review 和系统字段
| 字段 | 控件 | 实施要求 |
|---|---|---|
| `manual_review.reason_code` | `readonly` badge | 不能由用户随意改原因 |
| `manual_review.visible_reason` | `readonly` | 只读说明 |
| `manual_review.blocking_points` | `readonly` list | 只读说明 |
| `manual_review.conflicting_points` | `readonly` list | 只读说明 |
| `manual_review.suggested_human_actions` | `readonly` list | 可转成页面操作提示,但不能直接当字段输入 |
| `manual_review.evidence_to_check` | `readonly` list | 引导查看证据 |
| `manual_review.known_fields` | `readonly` | 不直接编辑对象文本 |
| `manual_review.missing_fields[]` | 内部 pointer | 驱动控件,不作为普通输入框展示 |
| `review_status` | `workflow_state` | `pending → resolved`;只能通过完成字段校验后 Resolve |
| `review_resolution` | 系统生成、只读审计 | 保存 field overrides、用户和时间不允许页面直接覆盖历史记录 |
### 4.12 只读字段
以下字段不得提供普通编辑控件:
- `source_message``source_message_id`、邮件主题、发件人、接收时间。
- `message_events[].event_type``event_role``current_or_history``source_event_index`
- `attachments[]``file_references[]``context_used`、QBD sheet/row/highlight/raw evidence。
- `relevant_message_excerpt``text_raw``room_type_raw`、价格 raw marker。
- `unhandled_current_intents[]` 的原文和可见说明。
- S10、S99 和 `infrastructure_input_error` 的 route/status/error 字段。
---
## 5. 必须修正的旧 3.0 字段/枚举
请不要直接复制旧 Excel 的以下定义:
1. `Cancel Booking.cancel_object_type` 不再包含 `allotment_control_block`;整块 Parent/Allotment 取消使用 `Cancel Allotment`
2. `Voucher Received.voucher_subtype` 不再包含 `bank_transfer_slip`;银行/现金/交易回执使用 `Payment Evidence`
3. `Update Booking.extracted_fields.update_subtypes[]` 的旧长下拉不再作为路由选择;当前 Update 统一为 `update_booking_amendment`,动作只展示为结果标签。
4. `room_type` 不可作为自由修改后的唯一值;必须保留 raw并用 PMS 目录选择 `pms_room_type_code`
5. Rate Code 不得硬编码旧表中的完整 code 列表。
6. `Trace Text` 不得直接编辑原文。
7. Fix Charge 的旧 `additional_charge / unit_price` 与当前 `fixed_charge / unit` 语义不一致,必须以当前契约和实际 schema 为准。
8. `target_key``parent_source_event_index``post_confirm_action` 是旧字段/旧命名,需迁移到当前 `case_keys``related_source_event_index(es)``post_confirmation_intent`
9. 不得继续生成或路由 `Note``Allotment Maintenance``Cancel Booking + linked_parent_release_after_child_split`
---
## 6. 必须通过的验收用例
至少增加或复用以下测试:
| 编号 | 场景 | 必须验证 |
|---|---|---|
| UI-01 | generic `SUITE` 房型 | raw 只读PMS code 使用当前目录下拉;未选时保留 manual review |
| UI-02 | 入住/离店日期修改 | 日期控件有效;`nights` 自动重算;非法日期阻止 Resolve |
| UI-03 | Rate Code | 不读取旧硬编码全集;使用配置目录;手工价独立数字输入 |
| UI-04 | Fix Charge | `fixed_charge/unit` 枚举正确;金额/数量为数字raw/evidence 只读 |
| UI-05 | Cancel 路由 | `Cancel Booking` 不出现 AllotmentAllotment 使用 Cancel Allotment |
| UI-06 | Voucher/Payment | bank slip 不可从 Voucher 卡下拉选择Payment Evidence 单独显示 |
| UI-07 | Update | 不允许用 `update_subtypes` 下拉切换业务卡型before/after 结构化展示 |
| UI-08 | Parent key | Parent `group_code=block_code`;用户不能单独改 block_code |
| UI-09 | Parent split 房量差异 | Parent/Child 数量不等不自动显示冲突或人工复核 |
| UI-10 | 全 Child Trace | 使用现有 Trace 卡;展示完整 `related_source_event_indices[]`;不压缩到 E1 |
| UI-11 | raw evidence | 用户编辑后 raw 原文、附件引用和原 Agent payload 不变 |
| UI-12 | 同卡解阻 | 只创建一张卡;`pending → resolved → Preflight`;不创建第二张 normal task |
| UI-13 | 未知字段路径 | pointer 无法映射时 fail closed不能临时创建任意输入控件 |
| UI-14 | S10/S99/基础设施错误 | 全部只读,不显示业务编辑控件 |
---
## 7. 交付要求
完成后请报告:
1. 实际修改的 Adapter/Frontend 文件。
2. 新增或更新的字段注册表及控件类型。
3. `missing_fields[] → control → field_overrides[]` 的实现位置。
4. 日期、房型、Rate Code、Fix Charge、Parent/Trace 关系校验位置。
5. 测试命令和测试结果。
6. 是否保持公开 JSON、40 路由和 MCP mapping 不变。
7. 未实现字段、路径不确定项和需要产品/业务确认的事项。
如果发现当前字段路径、item schema 或 Rate/Fix Charge 枚举仍未冻结,请保留只读/容错策略并报告,不要在前端自行发明新的公开字段。
---
## 最终边界
本任务的正确结果是:
```text
信息系统可以正确展示当前业务结果
信息系统只允许修改被 manual_review pointer 指定的业务字段
用户修改可审计、可校验、可回退到同一业务卡
原始 Agent 结果和证据不被覆盖
不新增业务路由、不改变 Prompt/Skill/MCP 契约
```