后端(bobo)已完成独立「酒店住宿域」,与通用套餐模型解耦。C端 hotel-booking.ts
当前仍走 /api/miniapp/orders 套餐模型,需小齐改为调用下列独立端点。
所有端点前缀/api/miniapp/hotel,均需登录(Bearer token,沿用现有apiPost/ 登录态)。
GET /api/miniapp/hotel/room-types?merchantId={商户ID}
返回:
{ "ok": true, "data": { "room_types": [
{ "id": 1, "merchant_id": 10, "name": "神山观景大床房", "bed_type": "大床",
"max_guests": 2, "total_rooms": 5,
"base_price": 688.0, "weekend_price": 888.0, "holiday_price": 988.0 }
] } }
status='active' 房型;按 sort_order, id 排序。GET /api/miniapp/hotel/availability
?roomTypeId={房型ID}
&checkIn=YYYY-MM-DD
&checkOut=YYYY-MM-DD // 离店日,须 > 入住日
&roomsCount=1 // 间数,默认 1
返回:
{ "ok": true, "data": { "room_type_id": 1, "name": "神山观景大床房",
"nights": [
{ "date": "2026-10-01", "price": 988.0, "total": 5, "left": 5, "available": true }
],
"total_price": 3952.0 } }
available=false 表示该晚满房或维护,前端应禁用该日期组合提交。total_price 已含 roomsCount 与逐晚价(元)。POST /api/miniapp/hotel/bookings
body:
{ "roomTypeId": 1, "checkIn": "2026-10-01", "checkOut": "2026-10-03",
"roomsCount": 2, "guests": 2,
"guestName": "张三", "guestPhone": "13800000000",
"contactName": "张三", "contactPhone": "13800000000",
"paymentType": "offline" } // offline | online
返回:
{ "ok": true, "data": {
"orderId": "18", "orderNo": "HT00000018", "bookingId": "17",
"total_price": 3952.0, "nights": 2, "status": "booked" } }
orders(order_type='room', order_no='HT...') + order_items(item_type='hotel') + room_bookings(status='booked'),并逐晚减 room_calendar.sold(超售/维护日返回 409)。
order_type='room' 区分)。POST /api/miniapp/hotel/bookings/{bookingId}/cancel
返回:{ "ok": true, "data": { "id": 17, "status": "cancelled" } }
cancelled,并回补房量(sold 减 rooms_count × 晚数)。booked / confirmed / checked_in 可取消;checked_out / cancelled 返回 409。hotel-booking.ts 的 submitAction 把 apiPost('/api/miniapp/orders', {...}) 改为先取 room-types 列表 → 用户选房型/日期 → availability 校验余量 → POST bookings。
productId/travelers/startDate 改为上表字段 (roomTypeId / checkIn / checkOut / roomsCount / guests / guestName / guestPhone)。
POST /api/miniapp/hotel/bookings/{id}/cancel(原订单取消入口若复用 orders 域亦可,但房量回补仅在本域 cancel 触发)。