回填V4单卡可操作态smoke结果

This commit is contained in:
andy
2026-07-24 10:23:04 +07:00
parent 8e6c944c7f
commit 14eda89b0b
6 changed files with 33 additions and 12 deletions

File diff suppressed because one or more lines are too long

View File

@@ -183,10 +183,10 @@ POST /api/auth/logout
- `messages[]` 按邮件来源接收时间正序返回,前端不要重新按创建时间或任务时间排序。 - `messages[]` 按邮件来源接收时间正序返回,前端不要重新按创建时间或任务时间排序。
- 返回内容包含完整 `text_body``html_body``inline_images[]``attachments[]``related_orders[]``related_tasks[]` - 返回内容包含完整 `text_body``html_body``inline_images[]``attachments[]``related_orders[]``related_tasks[]`
- `html_body` 是原始 HTML 兼容字段;`html_body_sanitized` 是后端第一版清洗结果,已移除脚本标签、事件属性和危险协议链接。前端生产展示必须优先使用 `html_body_sanitized`,并可用 `html_render_mode=SANITIZED_HTML` 判断渲染模式。 - `html_body` 是原始 HTML 兼容字段;`html_body_sanitized` 是后端第一版清洗结果,已移除脚本标签、事件属性和危险协议链接。前端生产展示必须优先使用 `html_body_sanitized`,并可用 `html_render_mode=SANITIZED_HTML` 判断渲染模式。
- 第一版仅处理 HTML 内容安全;`inline_images[]``attachments[]``externalUrl` 来自本系统 OSS 服务,暂不做额外拦截,但前端仍不得写入普通日志、错误上报、localStorageURL query。 - 第一版仅处理 HTML 内容安全;`inline_images[]``attachments[]``externalUrl` 来自本系统 OSS 服务,暂不做额外拦截。用户触发 Payment 图片预览或非图片下载时,前端 DOM 的 `img[src]` / `a[href]` 可以临时使用本接口返回的受权限附件 URL但前端仍不得把该 URL 写入普通日志、错误上报、localStorageURL query、确认 payload 或页面可见文本
- 会话详情接口由后端内部写原文读取审计actor 使用当前登录用户稳定 ID前端不传 `X-TH-Hotel-Source-Original-Read-Key``X-TH-Hotel-Actor``X-TH-Hotel-Access-Scene` - 会话详情接口由后端内部写原文读取审计actor 使用当前登录用户稳定 ID前端不传 `X-TH-Hotel-Source-Original-Read-Key``X-TH-Hotel-Actor``X-TH-Hotel-Access-Scene`
- 会话详情外层字段主要是 snake_case但媒体对象沿用原文读取接口字段当前是 `mediaType``fileName``contentType``sizeBytes``externalUrl``externalMediaId` 这种 camelCase前端类型定义需要单独处理。 - 会话详情外层字段主要是 snake_case但媒体对象沿用原文读取接口字段当前是 `mediaType``fileName``contentType``sizeBytes``externalUrl``externalMediaId` 这种 camelCase前端类型定义需要单独处理。
- Payment 卡附件预览规则:业务卡里的 `attachment_ids[]` 是付款凭证引用,第一版只读展示并确认卡片,不允许前端增删或替换附件集合;后端已在任务详情 `display_payload.payment_attachments[]` 返回安全摘要辅助展示。图片附件按 `content_type` 或会话媒体 `contentType``image/` 开头判断,在卡片中展示缩略图,点击后打开大图预览;非图片附件统一展示文件名、类型、大小和下载按钮,不在 Payment 卡中内嵌 PDF / Word / Excel 预览。预览和下载必须先通过会话接口定位当前 SourceMessage再按 `externalMediaId` / `payment_attachments[].external_media_id` 或附件 ID 匹配,不能按文件名、本系统内部媒体 row ID 或跨酒店 SourceMessage 媒体猜测。 - Payment 卡附件预览规则:业务卡里的 `attachment_ids[]` 是付款凭证引用,第一版只读展示并确认卡片,不允许前端增删或替换附件集合;后端已在任务详情 `display_payload.payment_attachments[]` 返回安全摘要辅助展示。图片附件按 `content_type` 或会话媒体 `contentType``image/` 开头判断,在卡片中展示缩略图,点击后打开大图预览;非图片附件统一展示文件名、类型、大小和下载按钮,不在 Payment 卡中内嵌 PDF / Word / Excel 预览。预览和下载必须先通过会话接口定位当前 SourceMessage再按 `externalMediaId` / `payment_attachments[].external_media_id` 或附件 ID 匹配,不能按文件名、本系统内部媒体 row ID 或跨酒店 SourceMessage 媒体猜测测试安全扫描时V4 task detail API 和页面可见文本不得出现附件 URL但用户触发预览 / 下载后 DOM `src/href` 临时出现受权限 URL 是允许行为
### 5.5 订单列表接入注意 ### 5.5 订单列表接入注意

View File

@@ -46,7 +46,7 @@
| `GET /api/source-messages/{id}` | 已完成单条安全摘要 | 可以 | 不能替代邮件会话全文接口。 | | `GET /api/source-messages/{id}` | 已完成单条安全摘要 | 可以 | 不能替代邮件会话全文接口。 |
| `GET /api/source-messages/{id}/original` | 已完成单封原文权限读取 | 谨慎接入 | 必须带 Bearer token需要同时拥有 `SOURCE_MESSAGE_READ``SOURCE_MESSAGE_ORIGINAL_READ`;只能读单封邮件,不能返回同一 conversation 全量邮件。 | | `GET /api/source-messages/{id}/original` | 已完成单封原文权限读取 | 谨慎接入 | 必须带 Bearer token需要同时拥有 `SOURCE_MESSAGE_READ``SOURCE_MESSAGE_ORIGINAL_READ`;只能读单封邮件,不能返回同一 conversation 全量邮件。 |
| `GET /api/reservation/orders` | 已完成第一版 | 可以 | 默认查询全部订单状态;订单列表待处理展示使用 `open_work_item_count`V4 普通业务已停止双写旧任务,旧 `open_task_count` 仅作为历史诊断计数。 | | `GET /api/reservation/orders` | 已完成第一版 | 可以 | 默认查询全部订单状态;订单列表待处理展示使用 `open_work_item_count`V4 普通业务已停止双写旧任务,旧 `open_task_count` 仅作为历史诊断计数。 |
| `GET /api/source-messages/{sourceMessageId}/conversation` | 已完成第一版,已补 `html_body_sanitized``html_render_mode` | 可以 | 必须带 Bearer token需要同时拥有 `SOURCE_MESSAGE_READ``SOURCE_MESSAGE_ORIGINAL_READ`;返回完整 text/html、后端清洗后的 HTML、媒体外链和关联订单 / 任务摘要;前端不传原文读取 key页面展示优先使用 `html_body_sanitized`。V4 Payment 卡图片大图预览和非图片下载也复用该权限链路,只能使用当前触发 SourceMessage 且被 `attachment_ids[]` 引用的附件。 | | `GET /api/source-messages/{sourceMessageId}/conversation` | 已完成第一版,已补 `html_body_sanitized``html_render_mode` | 可以 | 必须带 Bearer token需要同时拥有 `SOURCE_MESSAGE_READ``SOURCE_MESSAGE_ORIGINAL_READ`;返回完整 text/html、后端清洗后的 HTML、媒体外链和关联订单 / 任务摘要;前端不传原文读取 key页面展示优先使用 `html_body_sanitized`。V4 Payment 卡图片大图预览和非图片下载也复用该权限链路,只能使用当前触发 SourceMessage 且被 `attachment_ids[]` 引用的附件;用户触发预览 / 下载时DOM `img[src]` / `a[href]` 可临时持有本接口返回的受权限附件 URL但不得写入确认 payload、日志、URL query、localStorage、错误上报或页面可见文本。 |
| `POST /api/system/reservation/demo-data` | 已完成 | 仅本地 / test 联调可用 | 默认关闭,必须后端配置访问口令;不能作为生产页面接口。 | | `POST /api/system/reservation/demo-data` | 已完成 | 仅本地 / test 联调可用 | 默认关闭,必须后端配置访问口令;不能作为生产页面接口。 |
| `POST /api/system/debug/eml-superagent-runs` | 已完成第一版 | 仅 dev/test Debug 页面可用 | 默认关闭,必须后端配置访问口令、阿里云 OSS 和 SuperAgent Open APIDebug 服务自身只展示 SuperAgent 结果,不直接创建订单和任务;如 SuperAgent 通过正式回调 / MCP 写入业务结果V4 smoke 必须创建 V4 order task / cards不再创建旧 `workflow_reservation_task`MCP submit 已收口为 M002 V4-only旧 V2/V3 payload 会返回 `MCP_SUBMIT_V4_REQUIRED`;已能识别旧 S000/S999 和新结构化 S10/S99。 | | `POST /api/system/debug/eml-superagent-runs` | 已完成第一版 | 仅 dev/test Debug 页面可用 | 默认关闭,必须后端配置访问口令、阿里云 OSS 和 SuperAgent Open APIDebug 服务自身只展示 SuperAgent 结果,不直接创建订单和任务;如 SuperAgent 通过正式回调 / MCP 写入业务结果V4 smoke 必须创建 V4 order task / cards不再创建旧 `workflow_reservation_task`MCP submit 已收口为 M002 V4-only旧 V2/V3 payload 会返回 `MCP_SUBMIT_V4_REQUIRED`;已能识别旧 S000/S999 和新结构化 S10/S99。 |
| `GET /api/source-message-conversations/{externalConversationId}` | 未发现后端实现 | 不可以 | 历史讨论过的候选路径,当前不提供;前端统一使用 `GET /api/source-messages/{sourceMessageId}/conversation`。 | | `GET /api/source-message-conversations/{externalConversationId}` | 未发现后端实现 | 不可以 | 历史讨论过的候选路径,当前不提供;前端统一使用 `GET /api/source-messages/{sourceMessageId}/conversation`。 |

View File

@@ -674,6 +674,7 @@ Payment 卡附件展示规则:
- 后端已在 Payment 卡 `display_payload.payment_attachments[]` 中返回安全摘要,由 `attachment_ids[]` 匹配当前触发 SourceMessage 的包级附件或同酒店 SourceMessage 媒体摘要生成。匹配只认包级附件 ID / `external_media_id`,不认本系统媒体表内部 row ID也不按文件名猜测。字段为 `attachment_id``file_name``content_type``size_bytes``is_image``preview_available``download_available`,可选 `external_media_id` / `unavailable_reason_code`;不得包含 `externalUrl`、OSS URL、签名参数或附件原始二进制。 - 后端已在 Payment 卡 `display_payload.payment_attachments[]` 中返回安全摘要,由 `attachment_ids[]` 匹配当前触发 SourceMessage 的包级附件或同酒店 SourceMessage 媒体摘要生成。匹配只认包级附件 ID / `external_media_id`,不认本系统媒体表内部 row ID也不按文件名猜测。字段为 `attachment_id``file_name``content_type``size_bytes``is_image``preview_available``download_available`,可选 `external_media_id` / `unavailable_reason_code`;不得包含 `externalUrl`、OSS URL、签名参数或附件原始二进制。
- 图片判断以 `content_type``image/` 开头为主;图片在 Payment 卡内展示缩略图,点击后打开大图预览。缩略图和大图实际 URL 不从 `GET /api/reservation/order-tasks/{orderTaskId}` 返回,前端必须在具备 `SOURCE_MESSAGE_READ + SOURCE_MESSAGE_ORIGINAL_READ` 时调用 `GET /api/source-messages/{sourceMessageId}/conversation`,定位当前 SourceMessage 后按 `external_media_id` / `attachment_id` 匹配对应附件。 - 图片判断以 `content_type``image/` 开头为主;图片在 Payment 卡内展示缩略图,点击后打开大图预览。缩略图和大图实际 URL 不从 `GET /api/reservation/order-tasks/{orderTaskId}` 返回,前端必须在具备 `SOURCE_MESSAGE_READ + SOURCE_MESSAGE_ORIGINAL_READ` 时调用 `GET /api/source-messages/{sourceMessageId}/conversation`,定位当前 SourceMessage 后按 `external_media_id` / `attachment_id` 匹配对应附件。
- 非图片附件统一显示文件列表,至少展示文件名、类型和大小,并提供下载动作;第一版不在 Payment 卡内嵌 PDF、Word、Excel 或压缩包预览。 - 非图片附件统一显示文件列表,至少展示文件名、类型和大小,并提供下载动作;第一版不在 Payment 卡内嵌 PDF、Word、Excel 或压缩包预览。
- 2026-07-24 已确认:用户触发图片预览或文件下载时,前端 DOM 的 `img[src]``a[href]` 可以临时持有 conversation 接口返回的受权限附件 URL。该允许范围只覆盖当前用户、当前 SourceMessage、被 Payment `attachment_ids[]` 引用的附件和当前页面渲染 / 下载动作V4 task detail API、页面可见文本、确认 payload、日志、错误上报、URL query 和 localStorage 仍不得暴露附件 URL。
- 入站 `PAYMENT.attachment_ids[]` 无法匹配同包 `source_message.attachments[].id` 时,不创建用户可处理 Payment 卡,只写 `adapter_contract_error` transition 或按 S10 / 技术异常规则处理。只有 `attachment_ids[]` 已合法匹配、但用户缺少原文读取权限、会话接口失败、附件 URL 缺失或媒体预览链路暂不可用时Payment 卡才展示安全摘要和“无法预览 / 无法下载”的状态,不应把附件 URL 或错误详情暴露给普通用户。 - 入站 `PAYMENT.attachment_ids[]` 无法匹配同包 `source_message.attachments[].id` 时,不创建用户可处理 Payment 卡,只写 `adapter_contract_error` transition 或按 S10 / 技术异常规则处理。只有 `attachment_ids[]` 已合法匹配、但用户缺少原文读取权限、会话接口失败、附件 URL 缺失或媒体预览链路暂不可用时Payment 卡才展示安全摘要和“无法预览 / 无法下载”的状态,不应把附件 URL 或错误详情暴露给普通用户。
- 前端不得把附件外链写入日志、错误上报、URL query、localStorage 或确认 payloadPayment 第一版确认卡片时只提交 `version` 和必要审计说明,不提交 `attachment_ids[]`、附件 URL 或完整附件对象。后续如需支持人工选择 / 增删付款凭证附件,必须另行定义数组编辑契约和后端审计口径。 - 前端不得把附件外链写入日志、错误上报、URL query、localStorage 或确认 payloadPayment 第一版确认卡片时只提交 `version` 和必要审计说明,不提交 `attachment_ids[]`、附件 URL 或完整附件对象。后续如需支持人工选择 / 增删付款凭证附件,必须另行定义数组编辑契约和后端审计口径。

View File

@@ -93,6 +93,7 @@ Reservation V4 还必须满足 `docs/project/ai-nses-project-overlay.md` 的项
- 图片附件在卡片内展示缩略图,点击打开大图预览。 - 图片附件在卡片内展示缩略图,点击打开大图预览。
- 非图片附件统一显示文件列表和下载动作,不在卡片内嵌 PDF、Word、Excel 或压缩包预览。 - 非图片附件统一显示文件列表和下载动作,不在卡片内嵌 PDF、Word、Excel 或压缩包预览。
- 图片预览和非图片下载的真实 URL 只能通过 `GET /api/source-messages/{sourceMessageId}/conversation` 原文权限链路取得。 - 图片预览和非图片下载的真实 URL 只能通过 `GET /api/source-messages/{sourceMessageId}/conversation` 原文权限链路取得。
- 已确认允许用户触发图片预览或文件下载时,前端 DOM 的 `img[src]``a[href]` 临时持有 conversation 接口返回的受权限附件 URL该 URL 仍不得出现在 V4 task detail API、页面可见文本、确认 payload、日志、URL query、localStorage 或错误上报中。
- Payment 确认只提交 `version`,不提交 `attachment_ids[]`、附件 URL 或完整附件对象。 - Payment 确认只提交 `version`,不提交 `attachment_ids[]`、附件 URL 或完整附件对象。
### 7.3 Rooming List ### 7.3 Rooming List
@@ -138,6 +139,7 @@ Reservation V4 还必须满足 `docs/project/ai-nses-project-overlay.md` 的项
- 造数应使用唯一 runId不复用旧 SourceMessage 时间线导致阻塞误判。 - 造数应使用唯一 runId不复用旧 SourceMessage 时间线导致阻塞误判。
- 为了让目标业务卡可操作,可以先确认同 order task 内 Basic Information目标卡本身不得提前确认。 - 为了让目标业务卡可操作,可以先确认同 order task 内 Basic Information目标卡本身不得提前确认。
- 每条样例应记录 orderId、orderTaskId、sourceMessageId、目标 cardId、version、卡片状态、允许动作和安全扫描结果。 - 每条样例应记录 orderId、orderTaskId、sourceMessageId、目标 cardId、version、卡片状态、允许动作和安全扫描结果。
- 2026-07-24 测试机已完成 6 条 fresh V4 order task 数据集,覆盖 Basic、Room Information、Trace General、Trace Extra Bed Review、Rooming List 和 Payment只执行造数和必要 Basic 前置确认,未确认目标业务卡、未执行 review-resolution、未 ack。
## 8. 接口或交互契约 ## 8. 接口或交互契约
@@ -176,15 +178,33 @@ Reservation V4 还必须满足 `docs/project/ai-nses-project-overlay.md` 的项
| REVIEW_REQUIRED 原卡复核、按钮显示“确认卡片” | Done | Done | Passed | V4 领域模型、前后端协作文档 | Implemented | | REVIEW_REQUIRED 原卡复核、按钮显示“确认卡片” | Done | Done | Passed | V4 领域模型、前后端协作文档 | Implemented |
| SourceMessage Display 底部展示、正文默认折叠 | Done | Done | Passed | V4 领域模型、安全边界、前后端协作文档 | Implemented | | SourceMessage Display 底部展示、正文默认折叠 | Done | Done | Passed | V4 领域模型、安全边界、前后端协作文档 | Implemented |
| V4 工作台 / 订单详情 / 任务详情普通员工用户化展示 | N/A | Done | Passed | V4 领域模型、前后端协作文档 | Implemented | | V4 工作台 / 订单详情 / 任务详情普通员工用户化展示 | N/A | Done | Passed | V4 领域模型、前后端协作文档 | Implemented |
| 单卡可操作态测试数据 | N/A | N/A | Pending | 本文 | Approved | | 单卡可操作态测试数据 | N/A | N/A | Passed | 本文第 9.1 节 | Implemented |
| 模板化 Spec 对齐 | N/A | N/A | N/A | 本文、AI-NSES Overlay、项目索引 | Implemented | | 模板化 Spec 对齐 | N/A | N/A | N/A | 本文、AI-NSES Overlay、项目索引 | Implemented |
### 9.1 单卡可操作态 Smoke 回填
2026-07-24 测试机数据集 `M002-CARD-DEMO-1784726894698` 已完成。该数据集用于演示和验证每类目标业务卡处于单卡可操作态,目标卡均未提前确认。
| 样例 | orderId | orderTaskId | sourceMessageId | targetCardId | 目标状态 |
| --- | --- | --- | --- | --- | --- |
| BASIC | `2079921478960455682` | `2079921478968844290` | `2079921475227525122` | `2079921478994010113` | `PENDING_CONFIRM``confirmable=true` |
| ROOM | `2079921487558778881` | `2079921487571361794` | `2079921484266250241` | `2079921487625887745` | `PENDING_CONFIRM``confirmable=true` |
| TRACE_GENERAL | `2079921506877743106` | `2079921506886131713` | `2079921501228015618` | `2079921506915491842` | `PENDING_CONFIRM``confirmable=true` |
| TRACE_EXTRA_BED_REVIEW | `2079921521973043201` | `2079921521985626113` | `2079921516902129666` | `2079921522035957761` | `REVIEW_REQUIRED``reviewable=true` |
| ROOMING_LIST | `2079921534555955202` | `2079921534576926722` | `2079921531255037954` | `2079921534610481153` | `PENDING_CONFIRM``confirmable=true` |
| PAYMENT | `2079921555439394817` | `2079921555447783426` | `2079921543749869569` | `2079921555477143553` | `PENDING_CONFIRM``confirmable=true` |
写操作范围:只执行 ROOM、TRACE_GENERAL、TRACE_EXTRA_BED_REVIEW、ROOMING_LIST、PAYMENT 五条样例的 Basic Information 前置确认,请求体均为 `{ "version": 0 }`;未确认目标业务卡、未执行复核提交、未确认来源通知。
安全结论6 条 V4 task detail API 均未返回 `ai_payload_json``raw_evidence``html_body``text_body``target_order`、附件 URL、`externalUrl``download_url``signedUrl`;页面可见文本也未展示上述敏感字段或 URL。Payment 页面在图片预览 / PDF 下载能力中DOM 属性出现 conversation 接口返回的受权限附件 URL按第 7.2 节口径允许,不视为 V4 task detail API 或页面可见文本泄漏。
## 10. 验收标准 ## 10. 验收标准
- Given 一个新的 V4 需求改变业务卡、接口、页面交互或安全边界When 分派给后端 / 前端 / 测试 agentThen 必须先引用本文或后续 Change Request并列出需求追踪表。 - Given 一个新的 V4 需求改变业务卡、接口、页面交互或安全边界When 分派给后端 / 前端 / 测试 agentThen 必须先引用本文或后续 Change Request并列出需求追踪表。
- Given 一个普通酒店员工打开任务列表、订单总览或订单事项办理页When 页面默认加载Then 不应在主信息层级展示 V4 模型、JSON Pointer、payload、内部 ID、route 或 adapter 诊断。 - Given 一个普通酒店员工打开任务列表、订单总览或订单事项办理页When 页面默认加载Then 不应在主信息层级展示 V4 模型、JSON Pointer、payload、内部 ID、route 或 adapter 诊断。
- Given Room Information 存在多个 `room_items[]`When 打开 V4 任务详情Then API 和页面都应展示多行房型,不把组合 code 当成单个合法房型。 - Given Room Information 存在多个 `room_items[]`When 打开 V4 任务详情Then API 和页面都应展示多行房型,不把组合 code 当成单个合法房型。
- Given Payment 卡引用图片和非图片附件When 打开 V4 任务详情Then 任务详情 API 只返回附件安全摘要,前端通过 SourceMessage 原文权限链路展示图片预览和非图片下载。 - Given Payment 卡引用图片和非图片附件When 打开 V4 任务详情Then 任务详情 API 只返回附件安全摘要,前端通过 SourceMessage 原文权限链路展示图片预览和非图片下载。
- Given 用户触发 Payment 图片预览或非图片下载When 浏览器渲染预览或下载入口Then DOM `src/href` 可以临时使用 conversation 接口返回的受权限附件 URL但页面可见文本、V4 task detail API、确认 payload、日志和本地存储仍不得暴露该 URL。
- Given Rooming List 卡被确认且同订单 Group 有可更新 Room Information 快照When 刷新详情Then Group Booking Status 显示 `DEF-Definite` 并可查到自动 DEF 审计。 - Given Rooming List 卡被确认且同订单 Group 有可更新 Room Information 快照When 刷新详情Then Group Booking Status 显示 `DEF-Definite` 并可查到自动 DEF 审计。
- Given Trace 卡确认或复核成功When 刷新详情Then `fields[].value` 显示已确认值,旧 validation errors 清空。 - Given Trace 卡确认或复核成功When 刷新详情Then `fields[].value` 显示已确认值,旧 validation errors 清空。
@@ -193,7 +213,7 @@ Reservation V4 还必须满足 `docs/project/ai-nses-project-overlay.md` 的项
- 单元测试:本文不新增代码测试;后续代码变更仍按对应前后端模块测试要求执行。 - 单元测试:本文不新增代码测试;后续代码变更仍按对应前后端模块测试要求执行。
- 集成测试:本文不改变接口;已有 smoke 已覆盖主要 V4 卡片链路。 - 集成测试:本文不改变接口;已有 smoke 已覆盖主要 V4 卡片链路。
- 手工验证:本次文档 checkpoint 使用 `git diff --check` 验证 Markdown 格式。 - 手工验证:本次文档 checkpoint 使用 `git diff --check` 验证 Markdown 格式。
- 后续 smoke需要测试 agent 继续补“单卡可操作态数据集回填结果 - 后续 smoke单卡可操作态数据集回填;后续如需要可继续用 fresh runId 造演示数据,避免复用旧 SourceMessage 时间线造成阻塞误判
## 12. 未确认问题 ## 12. 未确认问题

View File

@@ -87,7 +87,7 @@
| --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- |
| `GET /api/source-messages` | `FRONTEND_USER` | 已强制 Bearer 登录 + `SOURCE_MESSAGE_READ`;列表条件中的酒店按当前用户可访问酒店校验 | 保持登录 + `SOURCE_MESSAGE_READ` + 酒店访问权 | 只读摘要不写审计 | | `GET /api/source-messages` | `FRONTEND_USER` | 已强制 Bearer 登录 + `SOURCE_MESSAGE_READ`;列表条件中的酒店按当前用户可访问酒店校验 | 保持登录 + `SOURCE_MESSAGE_READ` + 酒店访问权 | 只读摘要不写审计 |
| `GET /api/source-messages/{id}` | `FRONTEND_USER` | 已强制 Bearer 登录 + `SOURCE_MESSAGE_READ`;按消息实际所属酒店校验访问权 | 保持登录 + `SOURCE_MESSAGE_READ` + 消息所属酒店访问权 | 只读摘要不写审计 | | `GET /api/source-messages/{id}` | `FRONTEND_USER` | 已强制 Bearer 登录 + `SOURCE_MESSAGE_READ`;按消息实际所属酒店校验访问权 | 保持登录 + `SOURCE_MESSAGE_READ` + 消息所属酒店访问权 | 只读摘要不写审计 |
| `GET /api/source-messages/{id}/conversation` | `FRONTEND_USER` | 已强制 Bearer 登录 + `SOURCE_MESSAGE_READ` + `SOURCE_MESSAGE_ORIGINAL_READ`;按消息实际所属酒店校验访问权;返回会话完整 text/html 和媒体 URL | 保持登录 + `SOURCE_MESSAGE_READ` + `SOURCE_MESSAGE_ORIGINAL_READ` + 消息所属酒店访问权V4 任务详情页来源邮件卡读取正文、Payment 图片大图预览和非图片下载都必须走本接口,并且只使用当前触发该 order task 的 SourceMessage 内容和被 Payment `attachment_ids[]` 引用的附件Payment 摘要匹配不得使用跨酒店 SourceMessage 或本系统内部媒体 row ID | 必须写原文读取审计actor 使用当前登录用户稳定 ID前端展示 HTML 优先使用 `html_body_sanitized`;前端不得把附件 `externalUrl` 写入确认 payload、日志、错误上报、URL query 或 localStorage | | `GET /api/source-messages/{id}/conversation` | `FRONTEND_USER` | 已强制 Bearer 登录 + `SOURCE_MESSAGE_READ` + `SOURCE_MESSAGE_ORIGINAL_READ`;按消息实际所属酒店校验访问权;返回会话完整 text/html 和媒体 URL | 保持登录 + `SOURCE_MESSAGE_READ` + `SOURCE_MESSAGE_ORIGINAL_READ` + 消息所属酒店访问权V4 任务详情页来源邮件卡读取正文、Payment 图片大图预览和非图片下载都必须走本接口,并且只使用当前触发该 order task 的 SourceMessage 内容和被 Payment `attachment_ids[]` 引用的附件Payment 摘要匹配不得使用跨酒店 SourceMessage 或本系统内部媒体 row ID | 必须写原文读取审计actor 使用当前登录用户稳定 ID前端展示 HTML 优先使用 `html_body_sanitized`用户触发 Payment 图片预览或非图片下载时DOM `img[src]` / `a[href]` 可以临时持有本接口返回的受权限附件 URL前端不得把附件 `externalUrl` 写入确认 payload、日志、错误上报、URL query 或 localStorage,也不得作为页面可见文本展示 |
| `GET /api/source-messages/{id}/original` | `FRONTEND_USER` | 已强制 Bearer 登录 + `SOURCE_MESSAGE_READ` + `SOURCE_MESSAGE_ORIGINAL_READ`;按消息实际所属酒店校验访问权;不再使用原文读取 access key | 保持登录 + `SOURCE_MESSAGE_READ` + `SOURCE_MESSAGE_ORIGINAL_READ` + 消息所属酒店访问权 | 必须写原文读取审计actor 使用当前登录用户稳定 ID | | `GET /api/source-messages/{id}/original` | `FRONTEND_USER` | 已强制 Bearer 登录 + `SOURCE_MESSAGE_READ` + `SOURCE_MESSAGE_ORIGINAL_READ`;按消息实际所属酒店校验访问权;不再使用原文读取 access key | 保持登录 + `SOURCE_MESSAGE_READ` + `SOURCE_MESSAGE_ORIGINAL_READ` + 消息所属酒店访问权 | 必须写原文读取审计actor 使用当前登录用户稳定 ID |
### 3.4 系统管理后台接口 ### 3.4 系统管理后台接口