Files
ARR-2.0-0918/arr_web/DIRECT_DATA_ENTRY.md
T

152 lines
11 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
2026-10-08:直接数据入口增加处理前的人工字段完善,完成后继续共用日报、缺价复核与原有月报流程。人工XML上传保留。
已在本机离线重放2026-10-07到店日的真实生产捕获:176次读取、58条预订,字段识别和来源顺序与捕获一致。
这次核对未发起新OHIP请求。10月7日正式日报仍待业务字段值确认,尚未通过生产报表验收。
接口数据沿用共用筛选、去重、定价、独立校验和Finance提交规则,不生成中间XML。
本文描述当前代码;部署与服务状态以[交付说明](../deploy/OHIP_RELEASE_HANDOVER.md)和对应部署记录为准。
## 使用流程
选择报表日期 → 点击“下载并处理” → 完整获取该日数据 → 如有阻塞字段则人工完善并确认 → 原规则处理与独立核对 → 如缺价则沿用价格复核 → Finance日报进入历史,月报自动更新。
点击日期文字或右侧日历图标,再点击日历中的某一天即可选择。任务进行中仍可预选下一日期;
当前任务结束后需再次点击下载,预选不会自动提交或修改原任务。页面进度始终显示原任务的日期。
任务结果待确认时,先检查或继续按钮上标明日期的原任务,避免重复提交。
某一天等待人工完善不阻塞其他日期:另选日期后可点击“下载并处理”,此前任务仍保存在“待完善日期”中。
点击待完善日期可返回该日继续,刷新后列表仍保留;同一天的未完成任务沿用原编号。
页面内切换日期会分别保留尚未保存的输入草稿,刷新前仍应逐项保存;已保存的决定由系统长期保留。
完整采集中的缺字段、多个候选或不满足原规则的字段先进入“待完善数据”(`needs_data_review`)。
全部阻塞字段通过并确认后,原任务自动继续处理;随后只有缺少pureprice时进入原有价格复核(`needs_review`)。
字段完善和价格复核是前后两步,不会用补零或未经确认的空值跳过前一步。
任务中断后“继续原任务”复用原始数据和结果,同一请求不会重复入库。历史来源显示“接口获取”。
备注使用清理表情后的第一条非空预订备注;套餐按原顺序显示套餐代码(逗号分隔,保留重复)。
完整备注、套餐明细和查询出处保留在原始数据中。Trace 不获取,旧报表对应列留空。
这是一套明确的新入口显示规则,不声明与 Oracle 原生报表的文字格式完全一致。
## 字段完善的保存与继续处理
`DataFieldReviews`只接受`collection_complete=true`的完整采集,以当前冻结处理器的费率白名单和字段验证识别阻塞项。
预订列表仍保留全部取得的记录及原顺序;非白名单记录按原规则处理,不因Cancelled/NoShow等状态在取数阶段被丢弃。
费率本身未确定时先完善费率,再重新识别该记录的其余问题。查询失败或采集不完整仍走原重试流程。
人工仅能完善任务列出的异常字段。团队代码、预订备注、套餐和房型允许明确“确认无此项”;
公司、房号及其他必填字段必须填写有效值。`reservationBlock`、`reservationPackages`或关联档案省略不自动成为空值,
套餐金额为零不能证明无套餐,`roomCalendar={}`也不能证明目标日期没有房号。
每次保存核对当前`revision`,记录操作者、原值、新值和事件版本;旧版本提交会返回冲突,须重新查看。
所有阻塞项通过后,确认操作冻结`reviewed-source.json`及审计绑定,并将同一请求重新排队。
后续从已保存来源继续,不重新获取订单、不改写原始捕获。冻结后不能再修改字段,重复确认或恢复不会重复提交日报。
正常完整输入无需人工步骤,直接进入原处理链路。
字段完善后端接口归属于ARR自身,沿用网页登录权限与POST的CSRF保护;它们不向Oracle写入业务资料:
| 操作 | ARR接口 | 正文 |
|---|---|---|
| 读取待完善清单 | `GET /api/arr-downloads/{request_id}/data-review` | 无 |
| 保存一项字段 | `POST /api/arr-downloads/{request_id}/data-review/items/{item_id}` | `{"revision":0,"value":"<有效值>"}`;套餐值为有序代码数组 |
| 确认并继续生成 | `POST /api/arr-downloads/{request_id}/data-review/finalize` | `{"revision":1}`;使用最近返回版本 |
字段完善期间尚未生成处理job或写入Finance。确认后才执行原筛选、去重、定价、独立校验与处理交付;
如果进入后续价格复核,Finance日报仍等待价格确认。最终提交继续触发原月报更新。
缺少Opera有效房价属于前面的来源字段问题;缺少pureprice属于后面的定价复核,不能相互替代。
## 生产请求兼容与当前验收边界
结构化到店查询只发送`arrivalStartDate`、`arrivalEndDate`、`limit`、`offset`,省略生产拒绝的可选排序。
生产默认排序规则尚未证实,因此保留接口返回顺序,并在完整分页及补查后逐项比较首尾两次完整列表。
每轮验证重复预订ID、总数、页数和末页完整性;首尾一致仍不是原子快照的证明。
姓名摘要使用`GET /api/v1/profiles?profileIds=P&summaryInfo=true&limit=1&offset=0`,只查已关联唯一主客的精确档案ID。
严格核对`operation_id=getProfiles`、酒店、Oracle请求编号、唯一档案结果和姓名组成;不再使用生产不可用的`searchProfiles` POST。
历史候选捕获及POST探针保留原请求,详细参数见[传参确认单](../ARR_OHIP_REQUEST_PARAMETERS.md)。
58条原始采集中保留团队代码36项、套餐16项、公司2项、房号1项缺口。字段完善清单只列出原规则判定会阻塞候选记录的问题,
与全部原始缺口数量可以不同。离线重放及本机流程验证不替代真实业务值确认,亦不表示10月7日正式日报已生成或验收。
## 历史本机 OHIP 沙箱入口(2026-09-18)
以下保留2026-09-18的沙箱配置与运行方式,不代表当前生产服务状态。
历史[本机地址](http://127.0.0.1:8875/)沿用当时账号密码。酒店OHIPSB02、平台地址、应用凭据路径已配置;
本机数据库和报表单独保存,人工XML上传保留。平台同事已补齐团队资料读取权限`blocks.read`,
2026-09-18 06:00Z核对所需权限齐全,下载按钮已启用;见[补权记录](../integrations/ohip/PLATFORM_ACCESS_REQUEST.md)。
当轮只检查权限和页面就绪状态,没有提交真实下载任务;用户选日期并点击后才会查询。
实例使用`arr_web.local_ohip`,启动只核对本机配置和凭据,不调用酒店接口。
`check-access`只读取平台开发身份、应用列表和密钥状态,不改权限、不签发密钥、不查询订单;
成功后更新本机`access.json`。已运行页面下次加载配置即可识别新权限,无需重启或重新部署。
刷新核对失败会暂停新下载,缺权时服务仍可登录,但创建/重试任务均拒绝,防止半途缺字段。
凭据、原数据、队列及报表都在仓库外的私有目录,具体位置见[本轮记录](../.project-docs/50-evidence/topics/2026-09-18-arr-ohip-activation.md)。
```sh
# 新建本机实例;沿用原登录时可额外传 --login-file /private/old-instance/login.json
.venv/bin/python -m arr_web.local_ohip init \
--parent '/private/arr-instances' --credential-file '/private/ohip-credentials/application.json'
# 仅核对平台权限;不查询订单。需要已授权的开发身份文件。
.venv/bin/python -m arr_web.local_ohip check-access \
--root '/private/arr-instances/ohip-sandbox-INSTANCE' --automation-file '/private/ohip-credentials/automation.json'
LC_ALL=C LANG=C .venv/bin/python -m arr_web.local_ohip serve \
--root '/private/arr-instances/ohip-sandbox-INSTANCE' --port 8875
```
后台运行使用该实例`service.plist`,由用户会话launchd保持,不依赖对话进程;未安装开机启动项。
8873/8874未操作,原8875模拟实例已停止但完整保留,可恢复。
## 已完成的本机模拟验收(历史)
原8875模拟入口已由上述沙箱配置入口替换。历史验收使用6笔虚构订单,日期2026-09-15;
当时页面顶端明确标注“未连接 Oracle”,模拟记录未迁入新的沙箱实例。
登录信息保存在当前实例的 `login.json`,不写入仓库或日志。
本轮实例位置见[验证记录](../.project-docs/50-evidence/topics/2026-09-18-arr-direct-processing.md)。
它与8873/8874实例、原有业务数据库和对象存储完全独立。
可创建新的模拟实例(无需 OHIP 凭据):
```sh
.venv/bin/python -m tests.direct_data_portal init
# 将上一行返回的私有目录填入下面的路径
.venv/bin/python -m tests.direct_data_portal serve --root /absolute/private/instance --port 8875
```
模拟测试使用仓库内明确标记的虚构接口响应,不代表实际沙箱取数验证。
## 正常运行配置
数据库须已应用019迁移;2026-09-18首次验证只在独立本机测试库应用,未修改当时既有数据库。
该迁移允许真实的 `ohip_json` 源制品和5.0结果进入已有复核流程。
启动会先检查迁移,未具备条件时不开放下载服务。原来的月报后台程序仍须正常运行。
```sh
.venv/bin/python -m arr_web.run --enable-processing \
--ohip-hotel-id OHIPSB02 \
--ohip-credential-file /absolute/private/ohip-credentials.json \
--ohip-state-root /absolute/private/arr-data-state
```
以上三个 OHIP 参数必须一起提供;数据库、对象存储、网页登录沿用现有私有配置。
凭据文件仅在实际点击获取数据时读取,不在启动时查询酒店。
私有任务目录须在仓库之外,并绑定酒店、来源类型、查询上限和处理规则;规则更换后使用新目录,
不将旧任务悄悄改绑。旧版本未完成的价格复核遵循原有“规则已变更”保护。
也支持 `DirectARRSource` 注入共享运行依赖。原有 `CapturedARRSource` 为历史 XML 模式保留,
它不再是新数据入口的前置条件。不得把模拟传输当成实际平台传输。
取数字段和八项只读操作见[数据入口说明](../integrations/ohip/DATA_SOURCE.md)。
每个运行实例仍须核对其实际环境权限。当前生产捕获已用于字段识别,正式日报验收仍须完成业务字段值确认。
`getBlock` 等补查如无权限会明确失败,不补造空值。
## 检查
```sh
ARR_TEST_LOCAL_POSTGRES=1 .venv/bin/python -m unittest tests.test_arr_direct_data tests.test_arr_data_review -v
```
检查覆盖6笔正常订单总额18200、字段完善后继续处理、既有缺价复核、必填及可空字段验证、去重、原始数据保留、独立报表核对、
字段修订冲突与冻结恢复、页面请求、月报公式、提交后断线恢复、来源版本隔离,以及019迁移检查和回退保护。
浏览器检查:`tests/browser/arr_direct_data.cjs`,只接受明确指定的本机模拟实例。
历史8875沙箱曾交给用户会话后台服务运行,避免对话结束后登录页无法连接。仅在用户会话运行;
该历史OHIP沙箱的停止命令为 `launchctl bootout gui/$(id -u)/com.arr.local-ohip.8875`。服务配置位于私有实例的
`service.plist`;重新加载使用 `launchctl bootstrap gui/$(id -u) /absolute/private/instance/service.plist`。
后台环境已设 `LC_ALL=C`、`LANG=C`。先停后台服务再使用前台serve命令,不同时启动两份。