# 本机 XML 重放与按钮联调 2026-09-17。独立入口已实现并用准确原生XML实测。它重放已导入的完整文件,运行当前真实处理器、 独立验证、隔离PostgreSQL入库及月报worker;不调用OHIP,不构造Oracle成功响应。 `arr_web.run`的真实接口执行器仍未启用,API来源完整ARR里程碑仍待验收。 另有[本机接口模拟](LOCAL_API_SIMULATION.md)8874已完成前半段HTTP采集和生成XML;其数据、数据库及会话与本实例独立。 ## 当前可用实例 - 页面:`http://127.0.0.1:8873/`,已在侧边浏览器登录打开。 - 私有实例:`/Users/chillishark/Downloads/arr-xml-replay-w79uhmzr`。 - 凭据仅在该目录`login.json`;原始XML、数据库、对象、队列、截图和验证材料均在该私有目录。 - 当前唯一可选源日期:`2026-09-15`。源酒店57106、72条;原件摘要为 `5c87ab6f2483b2244e98e47bb792080ef4aca9036568638842116b246ac97438`。 - 已验证:61保留、11费率排除、0重复、0待复核;一个Finance版本、一个已发布月报事件、一个月报版本。 - 日报/月报下载完整性校验通过,月报61个TOTAL PRICE公式符合原规则。原始文件逐字节不变。 - 页面及响应头标明`local-xml-replay`;浏览器下载文件名加`LOCAL-REPLAY-`,工作簿内容/内部文件身份不改。 ## 按钮接口 沿用[下载卡片契约](ARR_DOWNLOAD_HANDOFF.md),只替换独立实例的地址,不需要换页面流程。 现有服务端登录与`X-ARR-CSRF`仍必须有效,实例使用独立`arr_xml_replay_session` Cookie。 没有放开跨域;另一个界面的开发服务应通过受控同源后端对接,不把本机凭据写进前端代码。 1. `GET /api/arr-downloads`:`ready=true`只表示**本机重放**就绪;同时返回 `environment=local-xml-replay`、`source_kind=native_xml_replay`、`oracle_connected=false`、 `default_date=2026-09-15`和`source_records=72`。 2. `POST /api/arr-downloads`:`{"report_date":"2026-09-15","request_id":"32位小写十六进制"}`。 202表示排队;其他源日期409,既不改XML日期也不产生队列任务。 3. `GET /api/arr-downloads/{request_id}`:查询queued/downloading/processing/succeeded等既有状态。 4. `POST /api/arr-downloads/{request_id}/retry`:空对象;未知提交恢复沿用同一文件组和事务身份。 5. `GET /api/download/daily?job_id=...`与`GET /api/monthly-runs?month=2026-09`, 再按实际`report_id`下载月报。日报成功与异步月报发布分别确认。 同编号重复提交不产生第二个版本;用户显式发起新的编号可重放同日并生成新版本,与现有卡片语义一致。 人工价格复核沿用真实处理规则;该基准文件不需要复核。普通XML上传、Booking写入、公司报表生成、 公共H5入口均不在此测试装配内。公司报表所需的独立Booking来源不会从本XML伪造。 ## 创建与运行 必须使用项目虚拟环境入口,不能把Python符号链接解析成基础解释器后运行。 ```sh .venv/bin/python -m arr_web.local_replay init \ --parent /Users/chillishark/Downloads \ --xml /Users/chillishark/Downloads/res_detail_71054429.XML \ --expected-sha256 5c87ab6f2483b2244e98e47bb792080ef4aca9036568638842116b246ac97438 \ --report-date 2026-09-15 # 把 --root 指向 init 返回的目录;现有实例重启复用同一目录。 .venv/bin/python -m arr_web.local_replay serve \ --root /Users/chillishark/Downloads/arr-xml-replay-w79uhmzr --port 8873 ``` 当前实例已后台运行;不要再启动第二个同目录进程。需要停止时核对`server-process.json`中的PID及完整命令 确实指向该目录,再发送SIGTERM;服务会先停止任务/worker,再关闭自有数据库,保留数据供后续重启。 它不是开机自启服务;不能直接删除一个仍运行中的实例目录。发生非正常中断留下postmaster.pid时, 启动会拒绝自动接管,需核对所属进程;不自动清库或强制重建。 ## 隔离与证据 - init总是创建新0700目录;原件和凭据0600。拒绝仓库内保存原始业务数据。 - 每个实例新建自有PostgreSQL集群,仅0700私有Unix socket,没有TCP监听。 为遵守现有008迁移保护,库名使用`booking_test`,**不连接现有同名库**;每次连接核对data_directory。 - 不读取ARR数据库/OSS/平台凭据;去除本进程的libpq环境默认值,退出时恢复。 - 目录、源清单摘要、XML摘要/日期/酒店、处理器规则、任务编号与文件组绑定;来源/规则变化拒绝旧任务。 - 重用通用冻结交付机制;其集成命名空间不代表发生平台采集,适配契约明确为`local-native-xml-replay/v1`。 `source_mapping_verified`/`report_equivalence_verified`保持false。 - 预订项目模拟酒店及现有业务服务未修改。后续接口模拟需另建来源,不覆盖本基准或反推“Oracle真实映射正确”。 验证:9项新测试(含真实SQL/完整停止重启)、75项相关回归通过;实际浏览器提交、刷新恢复、两种下载、 桌面及390px视口检查通过。私有`acceptance-summary.json`与`browser-verification.json`仅输出汇总证据。 脚本为`tests/browser/arr_local_xml_replay.cjs`,须明确设置私有实例路径及Playwright/浏览器位置后运行; 已有成功任务时只验证,不自动创建第二笔。