Files
ARR-2.0-0918/arr_web/LOCAL_API_SIMULATION.md

101 lines
7.5 KiB
Markdown
Raw Permalink 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 按钮联调
2026-09-17。本机采集全链路已通过:按钮 → 日期查询/分页 → 预订详情/当日价 → ARR处理XML →
独立核验 → 日报 → 隔离Finance入库 → 自动月报/文件下载。它与8873原文件重放是两个独立实例。
Oracle实际来源的完整ARR验收仍未完成,默认`arr_web.run`不因此启用。
## 当前实例与结果
2026-09-17录制准备:用户认可交互后要求清空测试数据,现8874日报/月报/队列均为0,统计为空且按钮可用。
6次历史试跑及关联数据已冷备份至实例内`recording-backup-20260917-155725`,原9/15模拟源、账号密码保留。
页面已登录留在日报页;请勿主动再提交测试,以免破坏录像起点。
[清理证据与恢复边界](../.project-docs/50-evidence/topics/2026-09-17-arr-recording-cleanup.md)。
以下为清理之前的联调验收记录,数量不代表当前页面。
按钮任务已补充实际联调:无数据日期现在提示后可改选;9/15双击仅新增一批,刷新和同编号重发不重复。
按钮联调当时保留两次主动运行的日报/事件/月报(144条分类记录),当时最新月报为report_id=2,旧版本保留。
下面“一次完整采集”和“一个有效版本”描述单次运行及当前有效结果,不表示只有一条历史。
5项新增提交逻辑测试、34项回归及本轮浏览器/SQL/文件检查通过;完整证据见
[按钮联调记录](../.project-docs/50-evidence/topics/2026-09-17-arr-button-api-integration.md)。
- 页面:`http://127.0.0.1:8874/`,侧边浏览器已打开并登录。
- 私有目录:`/Users/chillishark/Downloads/arr-api-simulation-fvlfmt4y`。
- 唯一源日期:`2026-09-15`;From、To、有效价查询日均取系统传入的这个日期。
- 原文件:准确的`res_detail_71054429.XML`,72条;独立冻结副本的摘要
`5c87ab6f2483b2244e98e47bb792080ef4aca9036568638842116b246ac97438`。
- 一次完整采集152个本机HTTP请求:8次搜索(20条/页,4页加完整复查)、72次详情、72次日价。
- 当前处理结果61保留、11费率排除,0重复/校验失败/价格未匹配;一个有效日报版本和一个已发布月报版本。
- 日报除按用户要求清空的Trace列外,其余单元格与原文件重放结果完全一致;月报61个金额公式通过检查。
- 服务完整停止/重启、重新登录、任务回显及两个文件下载通过;仍只有一个版本/事件/月报和72条分类记录。
## 按钮对接
沿用[单日下载HTTP契约](ARR_DOWNLOAD_HANDOFF.md),开发服务指向8874。与8873有独立会话Cookie
`arr_api_simulation_session`;凭据只保存在该实例`login.json`。现有登录、CSRF和同源规则继续生效,
不将密码放入前端代码,也不开放跨域直连。服务重启会使内存登录会话失效,重新登录即可,业务任务保留。
1. `GET /api/arr-downloads`确认`ready=true`,同时检查`environment=local-api-simulation`、
`source_kind=local_api_simulation`、`oracle_connected=false`和`default_date=2026-09-15`。
2. `POST /api/arr-downloads`提交`{"report_date":"2026-09-15","request_id":"32位小写十六进制"}`,带`X-ARR-CSRF`。
202表示排队;其他源日期409且不创建任务。From/To/日价日期不会根据运行当天重算。
3. `GET /api/arr-downloads/{request_id}`查看任务;成功后按返回`job_id`下载日报。
4. `POST /api/arr-downloads/{request_id}/retry`沿用原任务恢复。未知提交结果也保留原交付身份。
5. `GET /api/download/daily?job_id=...`;月报异步生成,通过`GET /api/monthly-runs?month=2026-09`
获取实际`report_id`后请求`GET /api/download/monthly?report_id=...`。
同一request_id重复提交不创建第二份Finance版本;新request_id表示用户主动重跑,允许新日报版本。
浏览器文件名带`LOCAL-API-SIMULATION-`,响应头有`X-ARR-Environment: local-api-simulation`。
## 模拟范围与实际来源的区别
本机酒店服务仅接受三种已接采集器的接口形状:
| 操作 | 本机接口 |
|---|---|
| searchHotelReservations | POST /api/v1/reservations/searches |
| getReservation | GET /api/v1/reservations/{local-id} |
| searchRateInfo | POST /api/v1/reservations/rate-info/searches |
该内层服务绑定127.0.0.1动态端口与临时随机密钥,只有本实例采集器使用;按钮使用稳定的8874外层接口。
不读取平台密钥,不允许外部baseURL,不使用代理或跳转,不提供酒店写入或模拟故障配置HTTP入口。
正常日志不输出原始请求/响应。故障注入只供本地测试进程调用。
`simulation-data.json`是独立派生数据,`fixture/source.xml`始终是未修改的基准。酒店ID、预订ID、状态及
最后修改时间明确为合成值。原币种THB保留;金额通过十进制JSON数传递。姓名、公司、显示房号、团号、
产品、房型标签与报表顺序存放在`__localARRReport`,**不伪装成已确认的Oracle映射**。
备注保留原XML的所有预订备注文本/顺序;模拟为GEN/RESERVATION,但不能据此证明Oracle备注顺序。
Trace按用户要求空列表,原文件中的Trace原样保留在基准内。
采集器使用既有v2归档/回放协议;归档中的旧service_url/application_id描述平台契约命名空间,
不能作为实际联网来源证据。此实例每个成功响应都包含`__localSimulation`来源摘要,适配契约以
`local-api-simulation/v1-`开头;实例清单、HTTP计数和下载标签共同明确全部请求仅发生在本机。
归档的report_equivalence_verified/finance_ready仍为false,不能拿本轮模拟验收替代Oracle真实报表验收。
独立核验器重新读取原始XML,逐字段/备注/顺序比较生成的处理XML;只接受明确的日期/数字规范化、合成ID
和无Trace选择。后续处理器另行负责白名单、去重、价格及入库验证,模拟服务不提前过滤记录。
## 创建与重启
```sh
.venv/bin/python -m arr_web.local_api_simulation init \
--parent /Users/chillishark/Downloads \
--xml /Users/chillishark/Downloads/res_detail_71054429.XML \
--expected-sha256 5c87ab6f2483b2244e98e47bb792080ef4aca9036568638842116b246ac97438 \
--report-date 2026-09-15
.venv/bin/python -m arr_web.local_api_simulation serve \
--root /Users/chillishark/Downloads/arr-api-simulation-fvlfmt4y --port 8874
```
现有实例已在运行,不要重复启动同目录服务。停止前核对`server-process.json`对应PID的完整命令,确认是
这个实例后SIGTERM;等待进程和自有数据库完全退出再重启。保留原目录,不重新init,不重置数据库。
与原文件重放复用受控基础设施:新0700私有目录、0600业务文件、独立Unix socket PostgreSQL、每次核对
data_directory、排除环境DSN、不接现有同名库。原文件重放入口拒绝打开带simulation.json的实例。
每批上限2000条、100页,每页20条。修改源、模拟清单、派生数据或处理规则时拒绝原实例复用。
验证:9项新增测试(其中1项真实SQL及重启)与82项相关测试,共91项通过;实际72条数据、浏览器桌面/
390px视口、刷新与整机服务重启验收通过。`acceptance-summary.json`、`browser-verification.json`、
`http-counts-before-restart.json`和截图在私有实例目录。浏览器检查使用
`tests/browser/arr_local_xml_replay.cjs`并显式设`ARR_LOCAL_TEST_MODE=local-api-simulation`。
本轮没有修改预订项目模拟酒店、生产服务、平台凭据或授权,没有调用酒店平台业务接口。