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

135 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ARR 看板与 API 数据库交接
更新时间2026-07-28
目标项目:仓库根目录
## 1. 当前结论
`arr_web`、渠道 BI、渠道明细、月报生成源和公司报表源已适配 ARR MVP v1 数据库。看板不再依赖旧 `report_versions` 或本地 `dashboard.json` 作为业务事实源。
测试数据库:
- `<ARR_DB_HOST>:5432/booking_test`(远程测试库)
- 本机受控配置:`/path/to/private/booking-test-db.env`
`<LEGACY_DB_HOST>:5433/booking_test``/path/to/private/booking-test-lan-db.env` 只作为临时回退,不再作为默认应用数据源。
## 2. 安全架构
```text
浏览器/手机 H5
→ ARR 后端 API
→ 只读 PostgreSQL 连接
→ current + retained 视图
```
数据库地址、用户名和密码只能保存在后端 Secret/受控配置中。浏览器 JavaScript 不连接 PostgreSQL不读取 env 文件,也不接收 DSN。
生产应给 API 创建独立只读账号;当前 `<TEST_DB_OWNER>` 是测试库 owner并非生产只读账号。
## 3. 页面数据源
| 页面/功能 | 后端数据源 |
|---|---|
| 日报处理记录 | `ingestion.processing_runs` + `finance.daily_versions` + 工件身份 |
| 可用月份 | `finance.current_daily_versions` |
| 渠道 BI | `finance.v_active_daily_facts` + `finance.daily_channel_metrics` |
| 渠道明细 | `finance.v_active_daily_facts` |
| 月报生成 | `monthly_reports` 查询 current facts |
| 公司 10 日报表 | `company_reports` 查询 Finance facts + booking room items |
`arr_web/repository.py` 已改用 `ingestion.processing_runs``ingestion.artifacts``finance.daily_versions` 和 current facts`finance.processing_jobs``booking.file_objects``finance.report_versions` 引用已移除。
## 4. BI 固定口径
- 售出房数:`sum(NO_OF_ROOMS)`
- 总价:`sum(TOTAL PRICE)`,不能再次乘房数或晚数
- 间夜:`sum(NIGHTS × NO_OF_ROOMS)`
- 房型:`ROOM_CATEGORY_LABEL`,空值显示为未标注房型
- 渠道:`channel_key`,顺序来自 current daily channel metrics
- 业务范围:只包含 current daily version 中 outcome 为 retained 的记录
渠道明细公开字段限制为日期、晚数、房数、公司、rate code、房型、real price 和 total price不要向 BI 返回姓名、确认号、房号、备注、trace、source coordinates 或 OSS object key。
## 5. 月报版本含义
最新业务决策是不在 PostgreSQL 重复保存月报行或 `report_versions`
- `GET /api/monthly-runs` 当前返回该月份“数据库数据源已就绪”的投影,包含截止日、渠道数和行数;
- 它不伪造数据库月报工件,因此 `artifact_sha256` 为空;
- `POST /api/monthly-runs` 由普通程序生成 XLSX并在发布前再次核对 current daily pins
- 生成文件可保存在私有 OSS/受控输出目录,但不是数据库业务事实;
-`GET /api/download/monthly?report_id=...` 没有 report-version 记录可解析,会返回未找到。
如果产品后续需要“历史月报下载列表”,应单独增加轻量 OSS 生成工件目录/接口,不要恢复重复的月报行表。
## 6. API
当前主要路由:
- `GET /api/session`
- `GET /api/health`
- `GET /api/jobs?month=YYYY-MM`
- `POST /api/jobs`
- `GET /api/monthly-runs?month=YYYY-MM`
- `POST /api/monthly-runs`
- `GET /api/months`
- `GET /api/analytics?month=YYYY-MM`
- `GET /api/h5/months`(旧 H5 月份索引兼容raw response
- `GET /api/monthly/{month_key}/analytics`(旧 H5 analytics 1.2 兼容raw response
- `GET /api/channel-detail?month=YYYY-MM&worksheet=...`
- `GET /api/company-reports/jobs`
- `POST /api/company-reports/jobs`
- `POST /api/integrations/super-agent/results`
所有公开响应必须 `no-store`;写请求使用同源 session/CSRFAgent 回写使用机器验签而不是浏览器 CSRF。
## 7. 本机启动
```bash
PYTHONPYCACHEPREFIX=/private/tmp/arr-web-pyc \
.venv/bin/python -m arr_web.run \
--host 127.0.0.1 \
--port 8765 \
--db-config /path/to/private/booking-test-db.env \
--enable-processing \
--enable-agent-writeback \
--enable-monthly-generation \
--enable-company-reports \
--node-binary /absolute/path/to/node \
--artifact-tool-module /absolute/path/to/artifact_tool.mjs
```
地址:桌面 `http://127.0.0.1:8765/`,手机 `http://127.0.0.1:8765/h5`,健康检查 `http://127.0.0.1:8765/api/health`
启动时后端会检查目标数据库为 `booking_test`。当前代码的 read transactions 使用 REPEATABLE READ READ ONLY 和超时门禁。`processing_ready=true` 表示“XML 上传 OSS 并提交 Agent”已装配`agent_writeback_ready=true` 表示“签名结果回调、OSS 重取与数据库落库”已装配。任一缺失时对应入口 fail-closed。
## 8. 已验收状态
对远程测试库的真实只读验收:
- 看板2026-071 个渠道、1 条 retained
- 渠道明细1 行;
- Web 日报列表1 条 accepted/succeeded
- 月度数据源投影1 条、1 行、无数据库月报工件;
- 月报生成源1 行;
- QBD 公司报表源1 行Booking Room 为 `【DBL】1`
这是一组合成流程 fixture不是真实业务规模。
## 9. 给看板对话的提示词
```text
请先完整读取 FRONTEND_HANDOFF.md 和
DATABASE_CONVERSATION_HANDOFF.md。
看板只能通过 ARR 后端只读查询 <ARR_DB_HOST>:5432/booking_test本机配置是
/path/to/private/booking-test-db.env绝不能把账号或 DSN 放进前端。
BI 使用 channel_analytics/current + retained facts不再查询 report_versions 或 dashboard.json。
不要改数据库写模型;若需要新的聚合接口,先复用现有只读 repository 和隐私字段白名单。
```
## 10. 生产缺口
生产前仍需创建最小权限 reader/writer、将 Agent Profile 开启 Open API 并发布、注入正式 OSS 与独立 HMAC、让 Super Agent runtime 调用已实现的签名回写 adapter并做一笔无隐私竖切和权限/隐私测试。输入已按现有 `fetch_oss_file` 使用的 `oss_attachments` 契约生成,但未发布的 Profile 仍不能由 ARR key 调用。当前远程地址用于测试,不代表已经确定为生产地址。