# ARR1 历史文档 — ARR 数据处理与数据库交接 > 当前行为请以 ARR2.0 根目录 README、ADR-004 和 current-state 项目记忆为准。 更新时间:2026-07-30 适用:另一个对话继续训练/调试日报 Skill、月报程序或公司 10 日报表程序。 ## 1. 最终处理链 ```text 用户上传 Opera XML → ARR 存入 OSS,仅将 committed 源 XML 设为 public-read → ARR 在 PROGRAM_INPUT v3 写入无签名公网 HTTPS URL → SuperAgent 用 fetch_oss_file 原样获取 XML → Agent 调用 arr-opera-daily-ingest → Skill 生成日报 XLSX、result.json、structured-result.json → ARR 获取正式工件并建立 DeliveryEnvelope → ARR 独立重验 Schema、哈希、计数、公式和语义 → arr_ingestion 单事务写 PostgreSQL → 普通程序查询 current + retained 事实 ├─ 生成月报 ├─ 生成/查询渠道明细与 BI └─ 结合预订 room items 生成每 10 日公司用房表 ``` Agent/Skill 不连接 PostgreSQL,不生成数据库 SQL,也不负责月报累计。 ## 2. 权威实现 日报 Skill 源目录:`arr-opera-daily-ingest/` SuperAgent 平台安装包:`arr-opera-daily-ingest.skill` 主要契约: - `references/business-rules.md` - `references/field-contracts.md` - `references/error-contract.md` - `references/structured-output.md` - `references/structured-result.schema.json` - `references/codex-result.schema.json` - `references/价格对照.xlsx` ARR 验收/落库: - `arr_ingestion/contracts.py` - `arr_ingestion/validation.py` - `arr_ingestion/service.py` - `arr_ingestion/postgres.py` - `database/008_arr_mvp_v1_rebuild.sql` 预订行解析合同: - `database/contracts/booking-row-parse-result.schema.json` - `booking_ingestion/` 不要在 Agent Prompt、数据库 repository、看板或报表程序复制第二套白名单、定价、去重或渠道识别规则。 ## 3. 日报 structured-result 入库字段 每个 source record 保存: - 血缘:`source_sequence`、`source_location`、可选 worksheet/row; - 处理:`outcome`、`decision_codes`、`duplicate_of_source_sequence`; - 日报业务字段:BLOCK_CODE、ADULTS、CHILDREN、COMPANY_NAME、CONFIRMATION_NO、DISP_ROOM_NO、EFFECTIVE_RATE_AMOUNT、FULL_NAME、RES_COMMENT、TRACE_TEXT、NO_OF_ROOMS、PRODUCTS、RATE_CODE、ROOM_CATEGORY_LABEL、ARRIVAL、DEPARTURE、NIGHTS、REAL PRICE、TOTAL PRICE; - 规范化/定价:`company_key`、`group_code_key`、`normalized_rate_code`、`kb_amount`、`channel_key`、`pricing_method`; - 预订查询结果:`booking_source_match_status` 和 `booking_source_match_count`。 outcome 只能是: - `retained` - `excluded_rate_code` - `duplicate` - `validation_failed` - `price_unmatched` 全部 outcome 都落 `finance.daily_records`。只有 current 日版本中的 retained 进入 `finance.v_active_daily_facts` 和业务报表。 固定公式: ```text TOTAL PRICE = REAL PRICE × NO_OF_ROOMS × NIGHTS ``` 例如 `1800 × 2 × 3 = 10800`。ARR 入库前重算,PostgreSQL check constraint 再验证。渠道明细的 Total Booking Price 直接使用这一个日报行的 `total_price`。 ## 4. 预订数据职责 预订原表/MD 最低字段: - `GROUP_CODE` - `TYPE OF ROOM` - `NO_OF_ROOMS` - 来源 worksheet/row Agent 可把一条组合文本拆成多个 room item,例如: ```text G1 | (【U-TWN12】1,【U-DBL12】2) | 3 ``` 数据库必须同时保留: - 原始一行 `type_of_room_raw` 和总房数 3; - 一个行级完整 `result_json`; - 两个 room items:U-TWN × 1、U-DBL × 2。 来源行不能按 Group Code 合并。同一 Group Code 多行在查询时聚合,原行仍可追溯。 Finance 与预订的唯一关联: ```text upper(trim(XML.RES_COMMENT)) = booking.group_code_key ``` 预订只提供 Booking Room;住宿日期、晚数、实际房数和价格使用 Finance 日报事实。 ## 5. 月报与渠道明细 月报 20 列来自 `finance.v_monthly_report_rows`/`monthly_reports`: ```text ARRIVAL, DEPARTURE, NIGHTS, ADULTS, CHILDREN, BLOCK_CODE, NO_OF_ROOMS, COMPANY_NAME, CONFIRMATION_NO, DISP_ROOM_NO, RATE_AMOUNT, FULL_NAME, RES_COMMENT, TRACE_TEXT, PRODUCTS, RATE_CODE, ROOM_CATEGORY, Real Price, Booking Room, TOTAL PRICE ``` 其中: - `RATE_AMOUNT = effective_rate_amount` - `ROOM_CATEGORY = room_category_label` - `Booking Room` 来自预订 Group Code 查询 - `TOTAL PRICE` 直接来自日报 渠道明细来自 `finance.v_channel_details`,字段包括 ARRIVAL、DEPARTURE、NIGHTS、BLOCK_CODE、RES_COMMENT、Booking Room、Total Booking Price。它不是同 Group Code 汇总表。 公司 10 日表由 `company_reports` 读取 Finance 日期/金额与 Booking Room,再按程序规则生成文件。数据库不保存这些派生行。 ## 6. 数据库位置与查询 - 目标:`:5432/booking_test`(远程测试库) - 本机受控配置:`/path/to/private/booking-test-db.env` - 旧 `:5433/booking_test` 和 `booking-test-lan-db.env` 只作临时回退,不再接收新写入 应用 DSN 环境变量: - `ARR_DATABASE_URL` - `MONTHLY_REPORT_DATABASE_URL`(可回退 ARR) - `COMPANY_REPORT_DATABASE_URL`(可回退 ARR) - `DASHBOARD_DATABASE_URL`(可回退 ARR) 常用只读入口: - `booking.v_group_booking_rooms` - `finance.v_active_daily_facts` - `finance.v_monthly_report_rows` - `finance.v_channel_details` - `finance.v_company_report_source` - `finance.v_daily_processing_audit` ## 7. 当前测试数据 预订 fixture:867 条来源行,348 个 Group Code;没有合并重复行。 Finance fixture:2026-07-27 三条合成 source record,retained/duplicate/excluded 各一条。正式业务视图只有一条 retained;`LT260720GAA` 查询得到 `DBL × 1`,日报总价 5400。 这些只用于验证流程,不能当真实业务底数。 ## 8. 给数据处理对话的提示词 ```text 请先完整读取 DATA_PROCESSING_HANDOFF.md、 DATABASE_CONVERSATION_HANDOFF.md 和日报 Skill 的 SKILL.md/契约文件。 日报 Skill 只生成日报、result.json、structured-result.json;月报、渠道明细和公司 10 日表由普通程序查询 PostgreSQL 生成。 测试库是 :5432/booking_test,受控配置为 /path/to/private/booking-test-db.env。 只读查询使用 booking/finance 视图。Agent 不得直接写库;structured-result 必须由 ARR 后端经 arr_ingestion 独立验收后事务落库。不要输出数据库密码、OSS 凭据或真实住客字段。 ``` ## 9. 生产缺口 数据库/程序读路径已验收;真实生产仍缺最小权限账号、public-read 源 XML 的保留期/访问日志控制、SuperAgent `.xml`/`application/xml` 获取验收与回调验签,以及生产级共享幂等/恢复演练。`fetch_oss_file` 使用 ARR 生成的公网 URL,不配置 OSS Provider;暂存与处理输出对象仍为 private。