# 酒店与景区模块联调说明

## 范围

本文档覆盖当前仓库内已经落地的两个业务模块：

- `business-hotel`
- `business-scenic`

适用场景：

- 数据库初始化
- 菜单权限导入
- 后台管理端联调
- 小程序接口联调
- 微信支付联调前置检查

当前结论：

- 两个模块都已经接入 `jeesharp-business` 聚合工程。
- 后台 controller、application、service、mapper、SQL 脚本都已落地。
- 小程序端接口已通过 `business-mobile-gateway` 挂出。
- 酒店与景区支付回调入口、统一回调适配层、业务确认支付适配器都已落地。
- “我的订单”聚合接口已纳入酒店与景区订单。

## 一、酒店模块

目录：

- `jeesharp-business/business-hotel`

推荐 SQL 顺序：

1. `01_schema.sql`
2. `02_seed.sql`
3. `03_menu_permission.sql`
4. `04_cleanup.sql` 可选回滚

### 1. 后台能力

当前后台已具备以下对象管理能力：

- 酒店管理
- 房型管理
- 预订单管理

菜单路径：

- `/business/hotel/stay`
- `/business/hotel/room-type`
- `/business/hotel/booking`

对应后台接口子路径：

- `GET /manager/business/hotel/stay/v1/info`
- `POST /manager/business/hotel/stay/v1/list`
- `POST /manager/business/hotel/stay/v1/save`
- `GET /manager/business/hotel/stay/v1/delete`
- `GET /manager/business/hotel/roomType/v1/info`
- `POST /manager/business/hotel/roomType/v1/list`
- `POST /manager/business/hotel/roomType/v1/save`
- `GET /manager/business/hotel/roomType/v1/delete`
- `GET /manager/business/hotel/booking/v1/info`
- `POST /manager/business/hotel/booking/v1/list`
- `POST /manager/business/hotel/booking/v1/save`
- `GET /manager/business/hotel/booking/v1/delete`

说明：

- 菜单路由仍然是 `/business/hotel/room-type`，但后台 controller 路径是 `roomType/v1`，这是当前代码中的实际实现。

### 2. 小程序能力

当前移动端接口挂载在：

- `${jeesharp.web.mobilePath}/hotel`

主要接口：

- `GET /mobile/hotel/stays`
- `GET /mobile/hotel/stay/{id}`
- `POST /mobile/hotel/booking/create`
- `POST /mobile/hotel/booking/pay/prepare`
- `GET /mobile/hotel/booking/pay/status/{orderId}`
- `POST /mobile/hotel/booking/pay/mock-success`
- `POST /mobile/hotel/booking/cancel`
- `GET /mobile/hotel/booking/result/{orderId}`

当前已经实现的业务行为：

- 酒店列表与详情查询
- 房型随酒店详情一起输出
- 创建酒店业务预约单
- 根据入住/离店日期、房型、间数计算支付金额
- 生成支付业务字段：`tradeOrderId / payOrderId / attach / amountFen`
- 查询支付状态
- 模拟支付成功
- 微信支付回调后确认支付
- 取消未完成预订
- 成功页按 `orderId` 回查结果

### 3. 当前支付接入状态

当前不是纯占位状态，已经具备以下能力：

- `HotelBookingOrderServiceImpl#preparePay(...)` 会生成完整业务支付参数
- `HotelMobileController#payPrepare(...)` 通过 `WechatJsapiPayOrderPrepayService` 创建财务支付单（`biz_finance_pay_order`）、调用 `WechatMiniPayService.createPrepay(...)` 并回填调起参数
- 如果会员已登录且存在 `memberId + appId + openid` 绑定，会把 `payer.openid` 一起带上
- 支付回调：`TravelWechatPayNotifyMobileController`（`/mobile/pay/notify/wechat`，attach 路由）
- 回调适配层已经接到 `WechatPayNotifyAdapterService`
- 酒店业务确认支付适配器已经落地在 `HotelWechatPayCallbackAdapter`

## 二、景区门票模块

目录：

- `jeesharp-business/business-scenic`

推荐 SQL 顺序：

1. `01_schema.sql`
2. `02_seed.sql`
3. `03_menu_permission.sql`
4. `04_cleanup.sql` 可选回滚

### 1. 后台能力

当前后台已具备以下对象管理能力：

- 景区场馆管理
- 景区预约单管理

菜单路径：

- `/business/scenic/venue`
- `/business/scenic/booking`

对应后台接口子路径：

- `GET /manager/business/scenic/venue/v1/info`
- `POST /manager/business/scenic/venue/v1/list`
- `POST /manager/business/scenic/venue/v1/save`
- `GET /manager/business/scenic/venue/v1/delete`
- `GET /manager/business/scenic/booking/v1/info`
- `POST /manager/business/scenic/booking/v1/list`
- `POST /manager/business/scenic/booking/v1/save`
- `GET /manager/business/scenic/booking/v1/delete`

### 2. 小程序能力

当前移动端接口挂载在：

- `${jeesharp.web.mobilePath}/ticket/booking`

主要接口：

- `GET /mobile/ticket/booking/venues`
- `GET /mobile/ticket/booking/venue/{id}`
- `POST /mobile/ticket/booking/create`
- `POST /mobile/ticket/booking/pay/prepare`
- `GET /mobile/ticket/booking/pay/status/{orderId}`
- `POST /mobile/ticket/booking/pay/mock-success`
- `POST /mobile/ticket/booking/cancel`
- `GET /mobile/ticket/booking/result/{orderId}`

当前已经实现的业务行为：

- 场馆列表与详情查询
- 免费预约：创建后进入 `pending_use`
- 付费预约：创建后进入 `pending_pay`
- 保存票档人数、出行人、金额明细
- 生成支付业务字段：`tradeOrderId / payOrderId / attach / amountFen`
- 查询支付状态
- 模拟支付成功
- 微信支付回调后确认支付
- 取消未完成预约
- 成功页按 `orderId` 回查结果

### 3. 当前支付接入状态

当前景区支付链路也已经超出“仅占位”阶段：

- `ScenicBookingOrderServiceImpl#preparePay(...)` 已生成支付业务参数
- `ScenicMobileController#preparePay(...)` 通过 `WechatJsapiPayOrderPrepayService` 创建财务支付单、调用 `WechatMiniPayService.createPrepay(...)` 并回填调起参数
- 支付回调：`TravelWechatPayNotifyMobileController`（`/mobile/pay/notify/wechat`，attach 路由）
- 统一回调适配层已经接入 `WechatPayNotifyAdapterService`
- 景区业务确认支付适配器已经落地在 `ScenicWechatPayCallbackAdapter`

## 三、后端挂载点

两个模块当前已经挂入以下工程：

- `jeesharp-business/pom.xml`
- `jeesharp-business/business-mobile-gateway/pom.xml`
- `web-starter/pom.xml`

因此正常启动 `web-starter` 后，会同时暴露：

- 后台管理接口
- 小程序业务接口
- 微信支付回调接口

支付相关公共组件当前在 `business-mobile-gateway` 内统一维护：

- `WechatJsapiPayOrderPrepayService`（支付单 + 统一下单 + 回填 VO）
- `WechatPayNotifyAdapterService`
- `HotelWechatPayCallbackAdapter`
- `ScenicWechatPayCallbackAdapter`
- `MallWechatPayCallbackAdapter`
- `WECHAT_PAY_NOTIFY_SAMPLE.yml`

财务侧支付单与支付流水在 `business-finance`：`PayOrderApplicationService`、`PayRecordApplicationService`（回调先更新支付单再落支付记录）。

## 四、订单聚合现状

当前“我的订单”聚合已经不是待办，已接入移动端订单接口：

- `GET /mobile/order/list`
- `GET /mobile/order/{id}`

当前会聚合三类订单：

- 商城订单
- 酒店预订单
- 景区预约单

说明：

- 这里是接口聚合，未接统一订单中心。
- 酒店、景区、**商城订单**预支付均走 `WechatJsapiPayOrderPrepayService`（财务支付单 + 微信统一下单）；酒店与景区仍各自维护业务单状态；商城订单支付状态见 `mall_order.status`。

## 五、联调前检查

### 1. 菜单父级

两个模块的菜单 SQL 默认依赖：

- `sys_menu.parent_id = biz_root`

如果现网父菜单不是 `biz_root`，执行前需要先修改：

- `03_menu_permission.sql`
- 对应总菜单脚本

### 2. 角色授权

当前菜单 SQL 只负责：

- 菜单
- 按钮权限

不会自动给真实角色写入授权。

仍需：

- 手动执行 `sys_role_menu` 授权
- 或在后台角色管理中勾选

### 3. 静态资源

演示数据默认引用部分静态图片，如：

- `/static/images/home-hero-default.png`（原 `home-hero-banner.png` / `home-hero-ref.png` 已合并）

如果现网不提供这些资源，需要改成真实 URL。

### 4. 微信小程序支付前置

要跑通真实 `createPrepay(...)`，至少要满足：

- `wx.pay.jsapi.enabled=true`
- `notify-base-url` 配置正确
- 商户私钥、平台公钥、`api-v3-key` 配置完整
- 当前会员存在微信小程序登录态
- `app_member_oauth` 中可查到 `memberId + appId + openid`

配置样例：

- `jeesharp-business/business-mobile-gateway/WECHAT_PAY_NOTIFY_SAMPLE.yml`

### 5. 本地联调说明

本地联调时，如果没有完整微信支付配置，可使用：

- `pay/mock-success`
- `wx.pay.jsapi.mock-fallback=true`
- `wx.pay.notify.skip-signature-verify=true`

但测试/生产环境不能依赖这些开发态设置。

## 六、联调顺序建议

### 酒店

1. 执行酒店 SQL
2. 在后台维护酒店与房型
3. 调 `GET /mobile/hotel/stays` 与 `GET /mobile/hotel/stay/{id}` 校验数据
4. 调 `POST /mobile/hotel/booking/create` 创建业务单
5. 调 `POST /mobile/hotel/booking/pay/prepare` 验证预支付参数
6. 本地先用 `POST /mobile/hotel/booking/pay/mock-success` 验证支付成功流转
7. 核对 `biz_finance_pay_order.notify_url` 为 `.../mobile/pay/notify/wechat` 并完成真实支付回调联调
8. 最后用 `GET /mobile/hotel/booking/result/{orderId}` 与 `GET /mobile/order/{id}` 校验结果

### 景区门票

1. 执行景区 SQL
2. 在后台维护场馆与票档 JSON
3. 调 `GET /mobile/ticket/booking/venues` 与 `GET /mobile/ticket/booking/venue/{id}` 校验数据
4. 免费票验证创建后直接进入 `pending_use`
5. 付费票验证创建后进入 `pending_pay`
6. 调 `POST /mobile/ticket/booking/pay/prepare` 验证预支付参数
7. 本地先用 `POST /mobile/ticket/booking/pay/mock-success` 验证支付成功流转
8. 核对 `biz_finance_pay_order.notify_url` 为 `.../mobile/pay/notify/wechat` 并完成真实支付回调联调
9. 最后用 `GET /mobile/ticket/booking/result/{orderId}` 与 `GET /mobile/order/{id}` 校验结果

## 七、当前限制

### 酒店

已完成：

- 业务单创建
- 金额计算
- 预支付参数生成
- JSAPI 下单调用接入点
- 支付状态查询
- 模拟支付成功
- 微信支付回调入口
- 回调统一适配
- 成功页回查

未完成或仍需加强：

- 真实环境下的完整支付联调验证
- 支付回调幂等保护的严格校验
- 超时关单任务
- 退款/售后流程
- 与统一订单中心的正式打通

### 景区门票

已完成：

- 免费预约闭环
- 付费预约业务单创建
- 预支付参数生成
- JSAPI 下单调用接入点
- 支付状态查询
- 模拟支付成功
- 微信支付回调入口
- 回调统一适配
- 成功页回查

未完成或仍需加强：

- 真实环境下的完整支付联调验证
- 支付回调幂等保护的严格校验
- 超时关单任务
- 退款/撤销能力
- 与统一订单中心的正式打通

## 八、前端联调说明

当前仓库内已经明确了后端接口契约，但没有在本仓库直接检索到 `pages/hotel/*` 或 `pages/ticket/*` 页面源码。

因此这里把以下路径视为小程序端联调约定，而不是当前仓库内现成资源：

- `pages/hotel/index`
- `pages/hotel/detail`
- `pages/hotel/book`
- `pages/hotel/success`
- `pages/ticket/index`
- `pages/ticket/book`
- `pages/ticket/success`

如果联调使用的是外部小程序仓库，请以该仓库中的页面与 API 封装为准。

## 九、推荐下一步

按当前进度，优先建议：

1. 用测试商户参数把酒店、景区两条真实微信支付链路各跑通一次
2. 给酒店、景区回调补更严格的幂等与异常补偿
3. 增加未支付超时关闭任务
4. 明确是否要接统一订单中心，而不是继续双轨维护业务单
5. 若进入运营阶段，再补退款、撤销、售后相关流程

如果只是做业务演示或后台联调，当前版本已经可以支撑酒店与景区的主流程联调。
