完成 M002 V3 同卡复核解阻

This commit is contained in:
andy
2026-07-11 20:11:03 +08:00
parent 6416c1b78a
commit 705f779b32
21 changed files with 1150 additions and 23 deletions

View File

@@ -17,6 +17,7 @@
| 联调 | 演示数据 seed 接口 `POST /api/system/reservation/demo-data` | 本地 / test 前端页面看效果 | 已完成;仅 dev/test 受控使用 |
| 联调 | Debug EML 上传接口 `POST /api/system/debug/eml-superagent-runs` | Debug 页面上传 `.eml` 看 SuperAgent 结果 | 已完成第一版;仅 dev/test 受控使用 |
| P1 | S10/S99 源邮件只读通知卡与旧 S000/S999 兼容 | 任务列表、任务详情来源邮件查看 | 已完成第一版:旧 S000/S999 兼容,新结构化 S10/S99 可入站并在任务列表 / 详情只读展示 |
| P1 | type-known manual review 同卡复核解阻 | 任务详情复核 | 已完成第一版原业务任务卡复核、字段修正、订单归属确认、READY 流转 |
| P1 | 任务卡前端字段白名单元数据接口 | 字段白名单调试、版本对齐 | 未完成;若任务详情已透出完整元数据,可后置 |
| 后置 | 普通任务切换订单接口 | 任务详情订单归属调整 | 未完成;已确认后置 |
@@ -35,6 +36,7 @@
| `POST /api/reservation/tasks/{taskId}/opera-operations/{operationId}/execute` | 已完成第一版模拟操作 | 可以 | 暂无;真实 OPERA 写入另行确认。 |
| `POST /api/reservation/tasks/{taskId}/opera-operations/{operationId}/retry` | 已完成第一版模拟重试 | 可以 | 暂无;真实 OPERA 重试另行确认。 |
| `POST /api/reservation/tasks/{taskId}/manual-review-conversions` | 已完成 | 可以 | 暂无。 |
| `POST /api/reservation/tasks/{taskId}/manual-review-resolutions` | 已完成第一版 | 可以 | 只用于 type-known manual review第一版 `confirmed_order_id` 必须等于当前任务订单,不开放普通任务任意切换订单。 |
| `GET /api/source-messages` | 已完成安全摘要列表 | 可以 | 不能替代邮件会话全文接口。 |
| `GET /api/source-messages/{id}` | 已完成单条安全摘要 | 可以 | 不能替代邮件会话全文接口。 |
| `GET /api/source-messages/{id}/original` | 已完成单封原文受控读取 | 谨慎接入 | 只能读单封邮件,不能返回同一 conversation 全量邮件。 |
@@ -326,8 +328,8 @@ POST /api/system/reservation/demo-data
| 42 路由元数据 | 任务列表筛选、订单任务时间线、任务详情标题、字段展示 | 已完成第一版 | 后端保存并返回 AI 原始 `result_type/ai_task_type/task_subtype``route_code` 和系统处理分类;前端不要只依赖系统主任务类型判断卡片。 |
| `unhandled_current_intents[]` 展示块 | 任务详情 | 已完成第一版 | 后端保存并在任务详情 `unhandled_intents[]` 返回未覆盖业务意图,只用于展示和源邮件查看,不自动建业务任务卡。 |
| `adapter_contract_error` | 任务详情、错误提示 | 已完成第一版 | 命中 P1/P2 未闭合或路由冲突时,任务详情 `adapter_contract_errors[]` 返回稳定错误 code 和原始片段,不转成 Fallback。 |
| type-known manual review 同卡解阻 | 任务详情复核 | 后置 | `manual_review` 不再全部等同 Fallback已知业务卡型返回原业务卡信息、`review_status``review_resolution` 和可编辑 pointer 字段。 |
| 复核场景订单归属确认 | 任务详情复核 | 后置 | 后端提供复核确认时的订单归属确认 / 选择能力;这不等于普通任务任意切换订单。 |
| type-known manual review 同卡解阻 | 任务详情复核 | 已完成第一版 | `manual_review` 不再全部等同 Fallback已知业务卡型返回原业务卡信息、`review_status``review_resolution` 和可编辑 pointer 字段,解阻后进入 `READY`。 |
| 复核场景订单归属确认 | 任务详情复核 | 已完成第一版 | 后端提供复核确认时的订单归属确认;当前第一版只能确认当前任务所属订单,后续如要选择其他订单需另行细化。 |
前端注意:不要把访问口令写入前端仓库、浏览器环境变量或构建产物;该接口只能由本地联调人员手动调用或由受控测试脚本调用。
@@ -445,6 +447,7 @@ GET /api/reservation/tasks/{taskId}
| `POST /api/reservation/tasks/{taskId}/opera-operations/{operationId}/execute` | 执行 OPERA 模拟操作。 | 已完成第一版模拟。 |
| `POST /api/reservation/tasks/{taskId}/opera-operations/{operationId}/retry` | 重试失败的 OPERA 模拟操作。 | 已完成第一版模拟。 |
| `POST /api/reservation/tasks/{taskId}/manual-review-conversions` | 将 Fallback / manual_review 转换为具体任务类型。 | 已完成。 |
| `POST /api/reservation/tasks/{taskId}/manual-review-resolutions` | type-known manual review 在原业务任务卡上提交字段修正和订单归属确认。 | 已完成第一版。 |
已完成的 `fields[]` 字段:
@@ -487,6 +490,82 @@ GET /api/reservation/tasks/{taskId}
| `fields[]` | `task_subtype` | 3.0 字段表中的任务 subtype / 业务动作。 |
| `fields[]` | `default_value_source` | 3.0 字段表中的默认值 / 回显来源。 |
### 8.1 Type-known manual review 同卡复核解阻
当前状态:后端已完成第一版。`result_type=manual_review``system_task_type` 不是 `MANUAL_REVIEW` 时,前端在原业务任务卡上展示复核模式,不进入 Fallback 转换页面。
任务详情增量字段:
| 字段 | 说明 |
| --- | --- |
| `review_status` | `PENDING` 表示等待复核,`RESOLVED` 表示已解阻。 |
| `review_resolution` | 已解阻后的复核结果;未解阻时为 `null`。 |
| `manual_review` | SuperAgent 原始复核说明、缺失字段、阻塞点、建议人工动作;只读展示。 |
解阻接口:
```text
POST /api/reservation/tasks/{taskId}/manual-review-resolutions
Content-Type: application/json
```
请求示例:
```json
{
"confirmed_order_id": "20001",
"reason": "确认 PMS 房型代码后解阻。",
"field_overrides": [
{
"field_pointer": "/extracted_fields/pms_room_type_code",
"value": "RM3"
}
]
}
```
返回示例:
```json
{
"task_id": "10001",
"order_id": "20001",
"task_status": "READY",
"review_status": "RESOLVED",
"review_resolution": {
"schema_version": "manual-review-resolution-v1",
"confirmed_order_id": "20001",
"resolved_at": "2026-07-11T00:00:00Z",
"field_overrides": [
{
"field_pointer": "/extracted_fields/pms_room_type_code",
"field_path": "extracted_fields.pms_room_type_code",
"value": "RM3"
}
]
},
"confirmed_payload": {
"schema_version": "field_path-v1",
"field_values": {
"extracted_fields.pms_room_type_code": "RM3"
}
},
"opera_operations": [
{"operation_code": "SIMULATE_PRECHECK"},
{"operation_code": "SIMULATE_WRITE"}
]
}
```
前端注意:
- `field_pointer` 必须是 RFC 6901 JSON Pointer并且只能指向任务详情 `fields[]` 中当前可编辑字段;只读字段或未知字段会返回 `TASK_REVIEW_POINTER_INVALID`
- `confirmed_order_id` 第一版必须等于当前任务 `order_id`;普通任务任意切换订单继续后置。
- type-known manual review 不能调用通用 `POST /api/reservation/tasks/{taskId}/confirm`;必须调用本节解阻接口,否则后端返回 `TASK_REVIEW_RESOLUTION_REQUIRED`
- `review_resolution.resolved_at` 是 UTC `Z` 时间点。
- 解阻成功后刷新任务详情,按钮状态以新的 `task_status=READY``availability` 为准。
- `confirmed_payload.field_values` 仍按矩阵 `field_path` 保存,不是 OPERA 最终参数。
建议返参增量示例:
```json