实现 M002 CP5 任务确认与 OPERA 模拟骨架
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
| --- | --- |
|
||||
| 文档版本 | 0.1 |
|
||||
| 日期 | 2026-07-07 |
|
||||
| 状态 | 后端数据模型草稿 |
|
||||
| 状态 | 后端数据模型与阶段实现记录 |
|
||||
| 适用范围 | AI 过渡层、订单、任务、任务卡、审计和 OPERA 模拟结果 |
|
||||
| 主要读者 | 后端、数据库、测试、后续协作 agent |
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
本文定义 M002 第一阶段后端数据模型草案,用于支撑 SuperAgent 任务结果入站、订单挂靠、任务卡确认、队列顺序、审计和 OPERA 模拟结果。
|
||||
|
||||
本文不是最终建表 SQL。后续写代码前,应按本项目后端规范补充 Flyway migration、Entity 中文注释、Mapper、Repository、Service 和测试。
|
||||
本文不是完整最终模型。当前后端已经按本模型落地第一阶段 Flyway migration、Entity、Mapper、Repository、Service 和测试;后续真实 OPERA、前端页面和 SuperAgent 查询上下文接口仍需继续补充。
|
||||
|
||||
## 2. 设计原则
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
| `PENDING_CONFIRM` | 待用户确认订单归属和任务字段 |
|
||||
| `READY` | 已确认,等待执行 OPERA 模拟 |
|
||||
| `EXECUTING` | 正在执行 OPERA 模拟 |
|
||||
| `FAILED` | OPERA 模拟失败,必须重试或修正后再执行,不能跳过 |
|
||||
| `FAILED` | 任务级失败结束态;第一版 OPERA 单条模拟操作失败时不直接把任务改为该状态,避免按队列规则误放行 |
|
||||
| `COMPLETED` | 任务已完成 |
|
||||
|
||||
说明:
|
||||
@@ -314,19 +314,21 @@
|
||||
| `hotel_id` | `VARCHAR(64)` | 酒店或业务上下文 |
|
||||
| `order_id` | `BIGINT` | 订单 ID |
|
||||
| `task_id` | `BIGINT` | 任务 ID |
|
||||
| `operation_type` | `VARCHAR(128)` | 操作类型,例如创建预订、更新字段、取消订单 |
|
||||
| `operation_status` | `VARCHAR(32)` | 操作状态:`PENDING`、`EXECUTING`、`SUCCESS`、`FAILED` |
|
||||
| `operation_order` | `INT` | 同任务下操作顺序 |
|
||||
| `confirmed_payload_json` | `LONGTEXT` | 生成该操作时使用的确认 payload 快照 |
|
||||
| `business_key_candidates_json` | `LONGTEXT` | 从模拟结果解析出的订单业务号候选 |
|
||||
| `last_failure_reason` | `VARCHAR(512)` | 最近失败原因 |
|
||||
| `retry_count` | `INT` | 已重试次数 |
|
||||
| `operation_sequence` | `INT` | 同任务下操作顺序,从 1 开始 |
|
||||
| `operation_code` | `VARCHAR(64)` | 模拟操作代码,第一版固定 `SIMULATE_PRECHECK` 和 `SIMULATE_WRITE` |
|
||||
| `operation_name` | `VARCHAR(128)` | 模拟操作展示名称 |
|
||||
| `operation_status` | `VARCHAR(32)` | 操作状态:`PENDING`、`SUCCEEDED`、`FAILED` |
|
||||
| `request_payload_json` | `LONGTEXT` | 生成该操作时使用的模拟请求摘要,不保存完整邮件原文 |
|
||||
| `attempt_count` | `INT` | 已执行 attempt 次数 |
|
||||
| `last_attempt_id` | `BIGINT` | 最近一次 attempt ID |
|
||||
| `last_error_message` | `VARCHAR(512)` | 最近一次失败原因摘要 |
|
||||
| `created_at` / `updated_at` | `DATETIME(6)` | 创建和更新时间 |
|
||||
|
||||
索引建议:
|
||||
|
||||
- 普通索引:`hotel_id + task_id + operation_order`
|
||||
- 普通索引:`hotel_id + operation_status + updated_at`
|
||||
- 唯一索引:`hotel_id + task_id + operation_sequence`
|
||||
- 普通索引:`hotel_id + task_id + operation_status`
|
||||
- 普通索引:`hotel_id + order_id + operation_sequence`
|
||||
|
||||
## 12. OPERA 模拟尝试记录表
|
||||
|
||||
@@ -338,35 +340,36 @@
|
||||
| --- | --- | --- |
|
||||
| `id` | `BIGINT` | 尝试记录 ID |
|
||||
| `hotel_id` | `VARCHAR(64)` | 酒店或业务上下文 |
|
||||
| `operation_id` | `BIGINT` | 所属逻辑操作 |
|
||||
| `order_id` | `BIGINT` | 订单 ID |
|
||||
| `task_id` | `BIGINT` | 所属任务 |
|
||||
| `attempt_no` | `INT` | 第几次尝试,从 1 开始 |
|
||||
| `attempt_status` | `VARCHAR(32)` | 尝试状态:`SUCCESS`、`FAILED` |
|
||||
| `operation_id` | `BIGINT` | 所属逻辑操作 |
|
||||
| `attempt_number` | `INT` | 第几次尝试,从 1 开始 |
|
||||
| `attempt_status` | `VARCHAR(32)` | 尝试状态:`SUCCEEDED`、`FAILED` |
|
||||
| `request_payload_json` | `LONGTEXT` | 本次模拟请求 payload |
|
||||
| `response_payload_json` | `LONGTEXT` | 本次模拟响应 payload |
|
||||
| `business_key_candidates_json` | `LONGTEXT` | 本次响应中的业务号候选 |
|
||||
| `failure_reason` | `VARCHAR(512)` | 失败原因 |
|
||||
| `error_message` | `VARCHAR(512)` | 失败原因摘要 |
|
||||
| `started_at` | `DATETIME(6)` | 开始时间 |
|
||||
| `finished_at` | `DATETIME(6)` | 结束时间 |
|
||||
| `created_at` | `DATETIME(6)` | 记录创建时间 |
|
||||
|
||||
索引建议:
|
||||
|
||||
- 唯一索引:`hotel_id + operation_id + attempt_no`
|
||||
- 唯一索引:`hotel_id + operation_id + attempt_number`
|
||||
- 普通索引:`hotel_id + task_id + created_at`
|
||||
- 普通索引:`hotel_id + operation_id + attempt_number`
|
||||
|
||||
规则:
|
||||
|
||||
- 用户不能跳过失败的 OPERA 模拟操作。
|
||||
- 失败后任务进入 `FAILED`,只能通过修正 payload 后重试或重新执行使其成功。
|
||||
- 失败后操作进入 `FAILED`,任务保持未完成;因为队列规则里任务 `FAILED` 视为已结束,第一版不能把 OPERA 操作失败直接落成任务 `FAILED`,避免后续任务被错误放行。
|
||||
- 不允许用户强制把失败任务改成 `COMPLETED`。
|
||||
- 后续真实 OPERA 接入时,应通过 adapter 把真实响应映射到 `response_payload_json` 和 `business_key_candidates_json`。
|
||||
- 后续真实 OPERA 接入时,应通过 adapter 把真实响应映射到 `response_payload_json`,业务号候选字段需在拿到真实结构后再补稳定字段或 JSON 结构。
|
||||
|
||||
## 13. 订单业务号回填
|
||||
|
||||
只有 `NEW_BOOKING` 且 `confirmed_payload_json` 没有可用业务号时,才从 OPERA 模拟成功结果回填订单业务号。
|
||||
只有 `NEW_BOOKING` 且 `confirmed_payload_json` 没有可用业务号时,才需要从 OPERA 成功结果回填订单业务号。
|
||||
|
||||
回填来源暂定为 `business_key_candidates_json`,示例:
|
||||
当前第一版后端不做业务号回填,也没有落地 `business_key_candidates_json` 字段。后续拿到真实 OPERA 返回结构后,再通过低耦合 adapter 解析候选业务号并补充稳定字段或 JSON 结构。候选结构可以参考:
|
||||
|
||||
```json
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user