Files
wyndham-ARR/DATABASE_PERSISTENCE_PLAN.md
2026-07-29 16:38:05 +08:00

4.2 KiB
Raw Blame History

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

更新时间2026-07-28
状态:已执行;当前事实以 database/008_arr_mvp_v1_rebuild.sqldatabase/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_rowsmonthly_reports repository。
  • 渠道明细:finance.v_channel_details
  • 渠道 BIchannel_analytics 对 current facts 和 daily channel metrics 聚合。
  • 公司 10 日表:finance.v_company_report_sourcecompany_reports repository。
  • Booking Roombooking.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. 明确生产地址、备份恢复和数据保留策略后上线。