# ARR 数据持久化实施方案（MVP v1）

更新时间：2026-07-28  
状态：已执行；当前事实以 `database/008_arr_mvp_v1_rebuild.sql` 和 `database/APPLIED_MIGRATIONS.md` 为准。

## 1. 目标

让以下数据可以安全、幂等、可追溯地落入 PostgreSQL，并支撑普通程序生成后续报表：

- 预订附件/MD 的 Group Code、Type of Room、No. of Rooms、来源 worksheet/row；
- 预订 Agent 的完整行级结构化输出和可查询 room items；
- Opera 日报 structured-result 中全部 source records/outcome；
- 日报不可变版本、同日 current 指针和渠道指标；
- 月报、渠道明细、渠道 BI 和每 10 日公司报表所需的只读投影。

## 2. 权威边界

- Skill 决定过滤、去重、公司识别、定价和结构化结果。
- ARR 后端重新校验工件哈希、JSON Schema、计数、duplicate lineage、日期/晚数和总价公式。
- PostgreSQL 只接受 ARR 验收结果，并用 FK、唯一键、check 和触发器防止坏状态。
- 普通报表程序只读 PostgreSQL，不回读 XML 推导另一套事实。

## 3. 写入事务

### Opera 日报成功

1. 注册/锁定 processing run 与 attempt；
2. 验证同一 delivery key 和 envelope hash 的幂等性；
3. 登记源 XML、日报、result JSON、structured-result JSON 工件；
4. 写入不可变 daily version；
5. 写入全部 outcome records 和 duplicate lineage；
6. 精确查询 booking Group Code 命中数；
7. 写入渠道顺序和行数；
8. 将旧版本标记 superseded，并把新版本标记 active；
9. 最后切换 `current_daily_versions`；
10. 写 delivery/outbox 并提交。

任一步失败都回滚整个事务。可判定业务失败保存 rejected 审计，但不切 current。

### 预订来源导入

1. 登记源工件和 source batch；
2. 逐行写 source row，不按 Group Code 合并；
3. 保存 Agent 行级 JSON 与解析版本；
4. 写一个或多个 room items；
5. 验证 room item 数量合计等于来源行 No. of Rooms；
6. 切换该来源行 current parse；
7. 复核行数、worksheet 数和 Group Code 基线后提交。

## 4. 幂等和并发

- 工件以 kind + SHA-256 和对象存储身份去重。
- run key、attempt idempotency key、delivery key 和 envelope hash 都有唯一约束。
- 同 source/date/processor/rule 复用既有版本；同日新源创建下一不可变版本。
- 写事务使用 SERIALIZABLE、业务范围 advisory lock、lock/statement timeout 和有限瞬态重试。
- 只有完整新版本成功后才切 current，因此业务查询不会看到半成品。

## 5. 查询模型

- 月报：`finance.v_monthly_report_rows` 或 `monthly_reports` repository。
- 渠道明细：`finance.v_channel_details`。
- 渠道 BI：`channel_analytics` 对 current facts 和 daily channel metrics 聚合。
- 公司 10 日表：`finance.v_company_report_source` 或 `company_reports` repository。
- Booking Room：`booking.v_group_booking_rooms`。
- 处理追溯：`finance.v_daily_processing_audit`。

业务查询不得直接把全部 `daily_records` 当正式数据；必须使用 current + retained 视图。

## 6. 数据与报表生命周期

- PostgreSQL 长期保存已验收的事实和审计版本。
- OSS 保存原始/输出工件；数据库只保存 identity 和 lineage。
- 月报/渠道/公司报表文件由程序生成，可在 OSS/受控目录保留，但不重复保存其行数据。
- 本轮没有自动清理策略。生产保留期、归档和删除策略须另行确认。

## 7. 已完成验收

- 008 真实数据库整事务回滚探针；
- 重建前完整逻辑备份和 manifest 校验；
- MD 867 行、348 Group Code、122 个重复 Group Code 的不合并导入；
- structured-result 的 retained/duplicate/excluded 落库；
- 固定总价公式和 non-retained 隔离；
- 幂等复跑、SERIALIZABLE retry、current 切换和失败不泄漏；
- 月报、渠道、公司、BI 与 Web read paths 的真实只读验收；
- 自动化测试通过。

## 8. 后续实施顺序

1. 创建最小权限 writer/reader 角色；
2. 接正式私有 OSS 和 Secret；
3. 接真实 SuperAgent 文件与回调协议；
4. 用非隐私/脱敏数据做端到端预生产验收；
5. 明确生产地址、备份恢复和数据保留策略后上线。
