收口V4 OWNER RATE目录数据

This commit is contained in:
andy
2026-07-21 19:11:57 +07:00
parent f3b6adda17
commit 6e97778633
19 changed files with 520 additions and 188 deletions

View File

@@ -4,9 +4,9 @@
| 项目 | 内容 |
| --- | --- |
| 文档版本 | 0.4 |
| 日期 | 2026-07-20 |
| 状态 | CP11 已落地第一版数据库目录与 lookup API目录管理后台 CP1 已落地后端接口;Account + booking type 过滤 Rate Code 和 Room Information 早餐派生已确认为下一阶段待实现契约;真实 PMS 同步继续后置 |
| 文档版本 | 0.5 |
| 日期 | 2026-07-21 |
| 状态 | CP11 已落地第一版数据库目录与 lookup API目录管理后台 CP1 已落地后端接口;OWNER RATE `RATECODE (2)` 只读整理已确认 Room Type 第一版只维护 6 个稳定 codeRate Code 第一阶段暂不建立 Account 适用关系;Room Information 早餐派生真实 PMS 同步继续后置 |
| 适用范围 | M002 V4 Account、Market、Source、Room Type、Rate Code 目录来源、Room Information 早餐派生、数据模型、前端 lookup、缓存、酒店隔离、权限和失败兜底 |
| 不适用范围 | 真实 OPERA / OHIP 写操作、真实价格计算、房型 / 日期 / 价格级 Rate Code 适用规则、前端页面实现、SuperAgent Prompt 修改、目录同步任务、SuperAgent 机器目录接口 |
@@ -16,8 +16,8 @@ M002 V4 CP8 已实现第一版固定种子目录校验M002 V4 CP11 已把该
- Basic Information 的 `account_code` 必须存在于当前酒店数据库 Account 目录。
- Market / Source 由 Account 派生,不由 SuperAgent 输出。
- Room Type 第一版使用当前酒店数据库目录校验和字段选项提示。
- Rate Code 当前 CP11 实现仍是酒店级目录校验和字段选项提示;下一阶段已确认需要按订单级 Account + `booking_type``GROUP` / `FIT`)过滤候选和校验适用性
- Room Type 第一版使用当前酒店数据库目录校验和字段选项提示2026-07-21 经需求方确认,正式业务目录先收敛为 `RM2``RM3``RM4``SU1``SU2``SU3` 六个稳定 code不按 Account 限定房型可用范围
- Rate Code 当前 CP11 实现仍是酒店级目录校验和字段选项提示;2026-07-21 经需求方确认,第一阶段暂不建立 Account 与 Rate Code 的适用关系,先把 OWNER RATE `RATECODE (2)` 中已确认 Account 的 Rate Code 作为酒店级 `RATE_CODE` 目录候选维护
- Room Information 卡中 Breakfast 第一版由后端派生Group 固定含早Fit 按 Rate Code 中 `RB` / `RO` 判断,无法派生时要求用户在卡片中必填确认。
- 目录错误会让对应 V4 卡片进入 `REVIEW_REQUIRED`,用户通过复核解阻选择合法 code。
@@ -34,11 +34,53 @@ CP11 之前固定种子实现位于后端 `ReservationV4DirectoryService` 和 `F
| Account | Basic Information 可选目录SuperAgent 和用户提交都使用稳定 code | `QBD_TRAVEL``LIAN_TAI``HANATOUR_TD` | 已进入数据库初始化目录,仍不是 PMS 全量 Account后台 CP1 可新增、启用 / 停用 |
| Market | 由 Account 派生的订单级 Market | 当前 Account 均派生 `LEISURE` | 已进入通用代码目录,前端仍不直接编辑 |
| Source | 由 Account 派生的订单级 Source | 当前 Account 均派生 `TRAVEL_AGENT` | 已进入通用代码目录,前端仍不直接编辑 |
| Room Type | 房型 code 校验和字段选项提示 | `TWN``KING``DBL``SGL``TRP``RM1``RM2``RM3` | 已进入数据库初始化目录,仍不是 PMS 全量房型;后台 CP1 可新增、启用 / 停用 |
| Rate Code | Rate Code 校验和字段选项提示 | `BAR``RACK``PACKAGE``GROUP``FIT` | 已进入数据库初始化目录;当前实现仍是酒店级目录,下一阶段改为 Account + booking type 适用范围过滤;不按房型、日期或价格过滤;后台 CP1 可新增、启用 / 停用 |
| Room Type | 房型 code 校验和字段选项提示 | `RM2``RM3``RM4``SU1``SU2``SU3` | 已通过 `V25__align_owner_rate_catalog_data.sql` 和启动补种子收敛为 OWNER RATE 第一阶段目录,仍不是 PMS 全量房型;后台 CP1 可新增、启用 / 停用 |
| Rate Code | Rate Code 校验和字段选项提示 | OWNER RATE `RATECODE (2)` 的 40 个规范化 Rate Code | 已通过 `V25__align_owner_rate_catalog_data.sql` 和启动补种子收敛为当前酒店级目录;第一阶段暂不建立 Account 适用关系,不按房型、日期或价格过滤;后台 CP1 可新增、启用 / 停用 |
当前固定种子只能支撑开发和演示闭环,不能作为生产长期事实源。
## 2.1 OWNER RATE `RATECODE (2)` 目录整理结论
本节来自 2026-07-21 对 `/Users/andy/Downloads/OWNER RATE.xlsx``RATECODE (2)` sheet 的只读整理。M002-V4-owner-rate-catalog-data-alignment 已把本节 6 个 Room Type 和 40 个 Rate Code 写入固定初始化种子与 `V25__align_owner_rate_catalog_data.sql`;不处理 `RATECODE` sheet不新增 Account 适用关系,不改变 lookup 接口参数契约。
### 2.1.1 Room Type 第一阶段稳定集合
需求方已确认当前系统第一阶段只维护以下 6 个 Room Type code
| code | 中文说明 |
| --- | --- |
| `RM2` | 高级花园景观大床房 |
| `RM3` | 高级花园景观双床房 |
| `RM4` | 高级花园景观家庭房 |
| `SU1` | 花园景观小套房(大床) |
| `SU2` | 泳池景观小套房(大床) |
| `SU3` | 家庭套房 |
结论:
- 第一阶段不建立 `Account -> Room Type` 关系表。
- 所有 Account 默认都可使用上述 6 个 Room Type。
- `RM2/RM3``SU1/SU2` 这类 Excel 组合值在后续导入或人工维护时应拆成多个候选 code前端和 SuperAgent 最终提交仍只能提交单个稳定 `room_type_code`
- 其它 Excel 文本,例如 `Deluxe TWN``GLSPCB-1800`,暂不进入第一阶段 Room Type 目录,除非后续人工确认映射到上述 6 个 code 或新增正式房型。
### 2.1.2 Q.B.D 与 LIAN TAI Rate Code 参考清单
Rate Code 取 `RATECODE (2)` sheet 的 E 列原值,仅做连字符两边空格清理,例如 `GRPA2 - 850UP` 规范化为 `GRPA2-850UP`;不拆分价格、餐食、早餐地点或其它说明,不强行派生 `booking_type`
第一阶段暂不建立 `Account -> Rate Code` 适用关系。下表只记录来源 Account 下出现过的 Rate Code便于后续导入酒店级 `RATE_CODE` 目录、人工核对或未来再建适用关系。
| source_account_name | 当前系统 Account code 参考 | Rate Code 清单 |
| --- | --- | --- |
| `Q.B.D` | 当前固定种子为 `QBD_TRAVEL`;是否改为更短 `QBD` 待确认 | `GRPA2-850UP``GRPA2-1275``GRPA2-1400``GRPA2-1800``GRPA2-2400``GRPA1-900``GRPA1-1400``GRPA1-1300``GRPA1-1150``GRPA1-1725``GRPA1-2300``GRPA3-1200*B'FAST BUALUANG``GRPA3-2000*B'FAST BUALUANG``GRPA3-1400*B'FAST BUALUANG``GRPA3-1800*B'FAST BUALUANG``GRPA3-2400*B'FAST BUALUANG``GRPA4-1200*B'FAST LEELA``GRPA4-2000*B'FAST LEELA``GRPA4-1400*B'FAST LEELA``GRPA4-1800*B'FAST LEELA``GRPA4-2400*B'FAST LEELA` |
| `LIAN TAI` | `LIAN_TAI` | `WHO1-850UP``WHO1-1275``WHO1-1400``WHO1-1800``WHO1-2400``GRP1-900``GRP1-1400``GRP1-1300``GRP1-1800``GRP1-2400``WHO2-1100``WHO2-1600``WHO2-1400``WHO2-1800``WHO2-2400``WHO3-1200``WHO3-1800``WHO3-1400``WHO3-2400` |
目录落地口径:
- 当前固定初始化和 V25 已把上表 40 个去重值作为当前酒店 `workflow_reservation_catalog_code.catalog_type=RATE_CODE` 的候选目录维护,`code``display_name` 暂相同。
- 这些值是 OWNER RATE 人工整理口径,不等同 PMS / OPERA / OHIP 的最终 Rate Plan code。
- `B'FAST BUALUANG``B'FAST LEELA``850UP`、数字价格等内容第一阶段只作为 Rate Code 字符串的一部分保留,不单独进入价格、早餐或餐厅规则。
- 后续如果需求方要求按 Account 限制 Rate Code再新建适用关系表并从本节清单回填不影响第一阶段酒店级目录校验。
## 3. 设计目标
真实目录能力要解决以下问题:
@@ -49,7 +91,7 @@ CP11 之前固定种子实现位于后端 `ReservationV4DirectoryService` 和 `F
4. 目录有来源、版本、更新时间和启停状态,便于排查 SuperAgent 输出 code 与系统目录不一致的问题。
5. PMS / OPERA / OHIP 不稳定或暂未接入时,系统仍可使用最后一次成功目录快照或系统管理目录兜底。
6. 固定种子目录可以作为 dev/test 或导入初始化兜底,但生产不应默认靠代码固定值。
7. Rate Code 不再作为全酒店通用下拉;业务卡 Rate Code 候选必须先受当前订单 Basic Information 的 Account 和 event `booking_type` 限定
7. Rate Code 第一阶段仍作为当前酒店级目录下拉;暂不按 Account、Room Type、入住日期或价格过滤。后续若需求方明确 Account 适用范围,再新增关系表和联动过滤
## 4. 目录来源分层
@@ -58,7 +100,7 @@ CP11 之前固定种子实现位于后端 `ReservationV4DirectoryService` 和 `F
| 阶段 | 来源 | 中文说明 | 适用目录 |
| --- | --- | --- | --- |
| Phase 0 | `FIXED_SEED_IMPORT` | CP11 已将固定种子通过 Flyway 和启动补种子流程导入数据库,不再作为运行时代码全局 Map | 当前 Account、Market、Source、Room Type、Rate Code |
| Phase 1 | `SYSTEM_MANAGED` / `IMPORT_FILE` | 本系统数据库目录,由初始化脚本、管理后台或受控导入文件维护;`IMPORT_FILE` 用于 OWNER RATE 等人工确认过的目录 / 适用关系导入 | Account、Market、Source也可临时维护 Room Type、Rate Code 和 Account + booking type 的 Rate Code 适用关系 |
| Phase 1 | `SYSTEM_MANAGED` / `IMPORT_FILE` | 本系统数据库目录,由初始化脚本、管理后台或受控导入文件维护;`IMPORT_FILE` 用于 OWNER RATE 等人工确认过的目录导入。当前结论是不先导入 Account 与 Rate Code 的适用关系 | Account、Market、Source也可临时维护 Room Type、Rate Code |
| Phase 2 | `PMS_SYNC` | 后端从 PMS / OPERA / OHIP 同步目录到本系统本地表,业务查询只读本地快照 | Room Type、Rate Code 优先Account、Market、Source 视 PMS 能力再接 |
原则:
@@ -75,7 +117,7 @@ CP11 之前固定种子实现位于后端 `ReservationV4DirectoryService` 和 `F
| Market | 本系统管理目录 | 可选同步 PMS market code 配置 | 否,随 Account 派生展示 | 前端不直接改 Market修改 Account 后后端派生 Market |
| Source | 本系统管理目录 | 可选同步 PMS source code 配置 | 否,随 Account 派生展示 | 前端不直接改 Source修改 Account 后后端派生 Source |
| Room Type | PMS / OPERA / OHIP 同步目录优先 | 同步酒店有效房型、展示名、人数、启停状态 | 是,业务卡选择房型 | 若 PMS 未接入,可临时由系统管理维护或固定种子初始化 |
| Rate Code | PMS / OPERA / OHIP 同步目录优先;在 PMS 未接前可由系统管理或导入文件维护 Account 适用关系 | 同步有效 Rate Plan / Rate CodeAccount、booking type、房型、日期和价格适用规则逐步扩展 | 是New Booking 选择 Rate Code | 一阶段按 Account + GROUP/FIT 过滤候选,只选 code不做价格计算 |
| Rate Code | PMS / OPERA / OHIP 同步目录优先;在 PMS 未接前可由系统管理或导入文件维护酒店级 Rate Code 目录 | 同步有效 Rate Plan / Rate CodeAccount、booking type、房型、日期和价格适用规则后续按真实需求扩展 | 是New Booking 选择 Rate Code | 一阶段暂不按 Account 过滤,只选 code不做价格计算 |
Department 目录在 V4 字段契约中也会被 Trace 使用。当前任务详情页第一版先固定 `FO``HSK``FO+HSK` 三个 Department code用于 Trace 卡下拉和 SuperAgent 输出约束;这不是正式数据库目录。后续可沿用本文模型扩展 `DEPARTMENT`、lookup API、系统管理维护和目录校验不放入本 checkpoint。
@@ -138,11 +180,11 @@ Market、Source、Room Type、Rate Code 可先使用统一 code 表。
uk_reservation_catalog_code(hotel_id, catalog_type, code)
```
### 6.3 推荐表:`workflow_reservation_rate_code_applicability`
### 6.3 后置备选表:`workflow_reservation_rate_code_applicability`
Rate Code 本身仍保存在 `workflow_reservation_catalog_code` 中,`catalog_type=RATE_CODE` 表示该 code 是当前酒店已知的 Rate Code;是否对某个 Account、GROUP/FIT 可用,由适用关系表表达。这样可以避免在 `metadata_json` 中写不可查询的业务规则,也避免前端硬编码 OWNER RATE Excel
Rate Code 本身仍保存在 `workflow_reservation_catalog_code` 中,`catalog_type=RATE_CODE` 表示该 code 是当前酒店已知的 Rate Code。2026-07-21 最新结论是第一阶段暂不建立 Account 与 Rate Code 的适用关系;普通 lookup 继续返回当前酒店 `ACTIVE` Rate Code 目录
本 checkpoint 只确认 Account + booking type 粒度,不纳入房型、日期和价格规则。后续如果需要按 Room Type 或入住日期进一步过滤,应在此表或独立价格规则表上扩展,不改变前端只提交稳定 `rate_code` 的基本原则。
如果后续需求方明确“某些 Account 只能使用部分 Rate Code”再引入本备选表表达 Account + booking type 粒度的适用关系。后续如果需要按 Room Type 或入住日期进一步过滤,应在此表或独立价格规则表上扩展,不改变前端只提交稳定 `rate_code` 的基本原则。
| 字段 | 中文说明 |
| --- | --- |
@@ -228,7 +270,6 @@ workflows.reservation.service
- listAccounts(...)
- listRoomTypes(...)
- listRateCodes(...)
- listRateCodesByAccountAndBookingType(...)
integrations.ohip / integrations.pms
CatalogSyncAdapter
@@ -238,7 +279,7 @@ integrations.ohip / integrations.pms
规则:
- V4 入站、确认、复核只调用 `ReservationV4DirectoryService`
- Basic Information 的 `account_code` 先确认或在同次复核中修正后,业务卡 Rate Code 才能按该 Account + `booking_type` 适用性校验。
- Rate Code 第一阶段只校验是否属于当前酒店 `ACTIVE``RATE_CODE` 目录;如未来引入 Account 适用关系,再基于 Basic Information 的 `account_code` 和业务 event `booking_type` 扩展适用性校验。
- 前端 lookup Controller 调用 `ReservationV4CatalogLookupService`,该服务同样只读本地目录表。
- PMS / OHIP 同步 Adapter 只能写本地目录表或同步 run不直接参与用户确认事务。
- 如果目录服务不可用,确认接口 fail closed不接受自由文本。
@@ -370,12 +411,10 @@ GET /api/reservation/lookups/rate-codes
| 参数 | 必需 | 中文说明 |
| --- | --- | --- |
| `hotel_id` | 否 | 当前酒店 ID |
| `account_code` | 是 | 已选择或已确认的 Reservation Account code必须属于当前酒店 ACTIVE Account 目录 |
| `booking_type` | 是 | `GROUP` / `FIT`;取自当前业务 event 的 `target_order.booking_type` |
| `keyword` | 否 | 匹配 Rate Code 或显示名 |
| `page_num` / `page_size` | 否 | 分页 |
下一阶段 Rate Code lookup 必须按 `account_code + booking_type` 返回 `ACTIVE` 且适用的 Rate Code。`account_code` 未传、无效或不属于当前酒店时返回 400`booking_type``GROUP` / `FIT` 时返回 400Account 合法但当前无适用 Rate Code 时返回空 `items[]`。前端在 Account 未选时不应拉全酒店 Rate Code`arrival_date` / `departure_date`、房型和价格过滤后置
当前 Rate Code lookup 保持酒店级目录查询,只返回当前酒店 `ACTIVE` Rate Code。2026-07-21 结论是第一阶段暂不接收 `account_code``booking_type` 作为必填过滤条件,也不按房型、入住日期、价格或 Account 限制候选;如未来引入 `workflow_reservation_rate_code_applicability`,再扩展查询参数和校验规则
响应草案:
@@ -383,17 +422,15 @@ GET /api/reservation/lookups/rate-codes
{
"hotel_id": "HOTEL-TEST",
"catalog_type": "RATE_CODE",
"account_code": "QBD_TRAVEL",
"booking_type": "GROUP",
"catalog_source": "IMPORT_FILE",
"catalog_version": "owner-rate-20260720-v1",
"catalog_source": "FIXED_SEED_IMPORT",
"catalog_version": "owner-rate-20260721-v1",
"stale": false,
"items": [
{
"code": "GRPA1",
"display_name": "GRPA1",
"code": "GRPA2-850UP",
"display_name": "GRPA2-850UP",
"status": "ACTIVE",
"catalog_source": "IMPORT_FILE",
"catalog_source": "FIXED_SEED_IMPORT",
"pricing_available": false
}
],
@@ -409,8 +446,8 @@ GET /api/reservation/lookups/rate-codes
前端用途:
- `fields[].options_source=reservation_v4_rate_code_catalog` 时调用。
- 只能在当前订单 Basic Information 已有有效 Account且当前业务 event 有 `booking_type` 时调用Account 切换后必须清空或重新校验已选 Rate Code
- 一阶段只选 `rate_code`,不展示或计算真实价格。
- 当前第一阶段可以按当前酒店目录查询 Rate Code不要求已有 Account 或 `booking_type`
- 一阶段只选 `rate_code`,不展示或计算真实价格。
- V4 契约仍禁止 `UPDATE_BOOKING` 携带 Rate Codelookup API 不改变该规则。
### 8.4 Market / Source Lookup
@@ -427,7 +464,7 @@ Market / Source 第一版不作为用户可编辑字段,不建议给普通业
| --- | --- | --- |
| `reservation_v4_account_catalog` | `GET /api/reservation/lookups/accounts` | 渲染 Account 下拉 / 搜索选择,展示派生 Market / Source |
| `reservation_v4_room_type_catalog` | `GET /api/reservation/lookups/room-types` | 渲染房型搜索选择 |
| `reservation_v4_rate_code_catalog` | `GET /api/reservation/lookups/rate-codes?account_code=...&booking_type=...` | 渲染当前 Account + GROUP/FIT 适用的 Rate Code 搜索选择 |
| `reservation_v4_rate_code_catalog` | `GET /api/reservation/lookups/rate-codes` | 渲染当前酒店级 Rate Code 搜索选择 |
| `static_enum` | 使用 `fields[].enum_options` | 不调用 lookup |
| `system_case_lookup` | 后续订单 / 任务对象 lookup | 不属于本目录 checkpoint |
@@ -537,7 +574,7 @@ SuperAgent 当前不调用本 lookup API。SuperAgent 目录供给后续有两
2. 遍历每张卡 `fields[]`
3. 只有字段 `editable=true``control_type=select/lookup` 时才加载 lookup。
4. 根据 `options_source` 选择 lookup 接口。
5. Rate Code 字段必须先取得当前订单 Basic Information 的 Account 和当前业务 event 的 `booking_type`;缺任一条件时禁用或显示空态,不调用全酒店 Rate Code 全量查询
5. Rate Code 字段第一阶段按当前酒店级目录查询;如未来引入 Account 适用关系,再要求先取得当前订单 Basic Information 的 Account 和当前业务 event 的 `booking_type`
6. 搜索输入做 debounce不一次性拉全量。
7. 显示 `stale=true``warnings[]` 时给用户非阻塞提醒。
8. 用户提交确认或复核时只提交 code不提交显示名、Market / Source 派生值或目录完整对象。
@@ -546,7 +583,7 @@ SuperAgent 当前不调用本 lookup API。SuperAgent 目录供给后续有两
前端禁止:
- 硬编码 PMS 房型或 Rate Code 全集。
- 硬编码 OWNER RATE Excel 中 Account 到 Rate Code 的映射;该映射必须由后端目录 / 适用关系接口提供。
- 硬编码 OWNER RATE Excel 中 Account 到 Rate Code 的映射;当前仅允许后端目录维护酒店级 Rate Code未来若引入适用关系也必须由后端接口提供。
- 把目录显示名当业务 code 提交。
- 绕过 `fields[]` 自行补业务字段。
- 使用 lookup API 给 SuperAgent、AgentBus 或 Debug 链路拼接输入。
@@ -560,11 +597,11 @@ SuperAgent 当前不调用本 lookup API。SuperAgent 目录供给后续有两
| M002-V4-CP12 | 前端 Lookup 接入 | V4 卡片字段渲染按 `options_source` 调用 lookup替换固定种子硬编码选项处理 stale / warning / 空目录 |
| M002-V4-CP13 | 目录管理后台 V1 | CP1 已完成 Account / Room Type / Rate Code 前后端列表、新增、启用 / 停用闭环、`RESERVATION_CATALOG_MANAGE` 权限和管理审计Market / Source 独立管理后置 |
| M002-V4-CP14 | 订单列表 V4 继续处理入口 | 已完成:订单列表返回 V4 下一步订单任务、卡片、动作类型、动作状态和 open 数,前端可优先跳 V4 订单任务详情 |
| M002-V4-CP14.5 | Account 范围 Rate Code Lookup | 待实现:新增 Account + booking type 适用关系模型 / 导入种子Rate Code lookup 接收 `account_code``booking_type`,确认和复核校验 Rate Code 适用性,前端联动 Account 后展示候选 |
| M002-V4-CP14.5 | OWNER RATE 目录导入口径 | 已完成:固定初始化种子和 V25 已把 Room Type 收敛为 `RM2``RM3``RM4``SU1``SU2``SU3`,并将 Q.B.D / LIAN TAI 的 40 个 Rate Code 候选作为酒店级 `RATE_CODE` 目录维护;暂不新增 Account + Rate Code 适用关系 |
| M002-V4-CP15 | PMS / OPERA / OHIP 目录同步 | 同步 Adapter、同步 run 表、失败重试、最后成功快照、同步状态管理入口 |
| M002-V4-CP16 | SuperAgent 目录供给 | 明确目录版本如何给 SuperAgent必要时新增机器目录接口或导出包 |
CP11 已作为后端第一步落地,因为它不依赖真实 PMS也能让前端后续不再硬编码当前固定种子。CP13 CP1 继续沿用本地目录表,不接真实 PMS也不改变 SuperAgent 输入契约。
CP11 已作为后端第一步落地,因为它不依赖真实 PMS也能让前端后续不再硬编码当前固定种子。CP13 CP1 继续沿用本地目录表,不接真实 PMS也不改变 SuperAgent 输入契约。CP14.5 已完成 OWNER RATE 目录数据收口,但只替换系统固定种子;测试 / 开发库如果存在人工新增的旧 Room Type / Rate Code需要按本文第 16 节的限定 SQL 清理或重建。
## 15. 仍需确认的问题
@@ -572,8 +609,48 @@ CP11 已作为后端第一步落地,因为它不依赖真实 PMS也能让
2. Account code 是否继续使用本系统定义的稳定 code例如 `QBD_TRAVEL`,还是必须对齐 PMS profile code。
3. Market / Source 是否只允许随 Account 派生,还是未来允许用户在 Basic Information 中单独改选。
4. Room Type 第一版后端已支持系统管理维护;后续是否仍要接 PMS / OHIP 同步替换为主来源待确认。
5. Rate Code 已确认下一阶段`account_code + booking_type` 过滤;入住日期、房型价格是否也要进入过滤仍待后续确认
5. Rate Code 第一阶段已确认暂不`account_code + booking_type` 过滤;如未来出现 Account 专属候选、入住日期、房型价格过滤诉求,再单独确认是否引入适用关系或价格规则表
6. 生产是否允许 `FIXED_SEED` 作为兜底,还是只允许 dev/test 使用。
7. SuperAgent 是否需要读取目录;如果需要,是离线给目录包,还是新增 HMAC 机器接口。
在这些问题未确认前,当前实现仍按 DB 管理目录 + 前端 lookup 查询 + 后台 CP1 手工维护闭环推进,不接真实 PMS也不替换 SuperAgent 输入契约。
## 16. 测试 / 开发库 OWNER RATE 目录清理步骤
`V25__align_owner_rate_catalog_data.sql` 只替换 `source_system=FIXED_SEED_IMPORT` 的 Room Type / Rate Code 固定种子,不清理人工通过管理后台新增的目录项。测试机或开发库如果在 V25 前已经手工新增了旧目录值,且希望 lookup 严格只返回本阶段 6 个 Room Type 和 40 个 Rate Code可以先备份后执行下面的限定更新。该步骤只停用当前酒店旧 Room Type / Rate Code不清理 Account、Market、Source、用户、权限、SourceMessage、V4 order task 或 task card。
```sql
-- 执行前先确认目标酒店。
SET @target_hotel_id = 'HOTEL-TEST';
UPDATE workflow_reservation_catalog_code
SET status = 'DISABLED',
updated_at = UTC_TIMESTAMP(6),
version = version + 1
WHERE hotel_id = @target_hotel_id
AND catalog_type = 'ROOM_TYPE'
AND status = 'ACTIVE'
AND code NOT IN ('RM2', 'RM3', 'RM4', 'SU1', 'SU2', 'SU3');
UPDATE workflow_reservation_catalog_code
SET status = 'DISABLED',
updated_at = UTC_TIMESTAMP(6),
version = version + 1
WHERE hotel_id = @target_hotel_id
AND catalog_type = 'RATE_CODE'
AND status = 'ACTIVE'
AND code NOT IN (
'GRPA2-850UP', 'GRPA2-1275', 'GRPA2-1400', 'GRPA2-1800', 'GRPA2-2400',
'GRPA1-900', 'GRPA1-1400', 'GRPA1-1300', 'GRPA1-1150', 'GRPA1-1725', 'GRPA1-2300',
'GRPA3-1200*B''FAST BUALUANG', 'GRPA3-2000*B''FAST BUALUANG',
'GRPA3-1400*B''FAST BUALUANG', 'GRPA3-1800*B''FAST BUALUANG',
'GRPA3-2400*B''FAST BUALUANG',
'GRPA4-1200*B''FAST LEELA', 'GRPA4-2000*B''FAST LEELA',
'GRPA4-1400*B''FAST LEELA', 'GRPA4-1800*B''FAST LEELA',
'GRPA4-2400*B''FAST LEELA',
'WHO1-850UP', 'WHO1-1275', 'WHO1-1400', 'WHO1-1800', 'WHO1-2400',
'GRP1-900', 'GRP1-1400', 'GRP1-1300', 'GRP1-1800', 'GRP1-2400',
'WHO2-1100', 'WHO2-1600', 'WHO2-1400', 'WHO2-1800', 'WHO2-2400',
'WHO3-1200', 'WHO3-1800', 'WHO3-1400', 'WHO3-2400'
);
```