Files
travel/docs/BUSINESS_MODEL_DESIGN.md
2025-12-01 17:54:53 +08:00

15 KiB
Raw Blame History

业务模型设计文档

项目: Travel (Tech Mall) - 旅游线路交易系统
最后更新: 2025-12-01
状态: 设计确认


📋 业务概述

本系统是一个旅游线路预订和票务管理平台,支持固定班次和滚动班次两种运营模式,为用户提供线路查询、在线下单、支付、电子凭证和核销等完整服务。


🎯 核心业务共识

1. 班次类型

固定班次 (FixedSchedule)

  • 管理后台设置具体出行时间段
  • 每个班次有独立的座位限制
  • 示例2025-12-01 08:00 出发2025-12-01 18:00 返回

滚动班次 (RollingSchedule)

  • 按固定频率发车(如每 5 分钟一班)
  • 配置运营时间段和单次座位数
  • 示例08:00-18:00 运营,每 5 分钟一班,每班 20 座

2. 库存管理策略

方案: 线路级别库存 + 班次级别座位限制

线路总库存池: 100 张
├── 固定班次 A (08:00): 座位限制 40 座
├── 固定班次 B (14:00): 座位限制 40 座  
└── 滚动班次: 单次座位 20 座

规则:

  • 线路维护总库存池
  • 固定班次设置座位上限(不能超过线路库存)
  • 滚动班次按单次座位数消耗库存
  • 所有班次共享线路库存池
  • 库存操作需记录日志(锁定、扣减、释放、退还)

3. 票种系统

支持多种票种,每种票种价格不同:

票种代码 票种名称 价格策略 适用人群
ADULT 成人票 基准价格 100% 成年人
CHILD 儿童票 基准价格 50% 儿童
STUDENT 学生票 基准价格 70% 学生
SENIOR 老人票 基准价格 80% 老年人

4. 座位管理

明确: 本系统不提供座位选择功能

  • 无需座位号管理
  • 先到先得原则
  • 仅控制总人数

5. 购票流程

用户购票时必须选择:

  1. 出行日期 - 具体哪一天出行
  2. 班次 - 选择固定班次或滚动班次
  3. 票种 - 成人/儿童/学生/老人
  4. 购买数量 - 购买张数

6. 多租户

明确: 系统不需要考虑多租户架构


🏗️ 领域模型

核心实体关系

graph TB
    subgraph "线路域 Route Domain"
        R[线路 Route<br/>- 线路编码<br/>- 线路名称<br/>- 起止点<br/>- 总库存]
        FS[固定班次 FixedSchedule<br/>- 班次编号<br/>- 出发/到达时间<br/>- 座位限制<br/>- 票价配置]
        RS[滚动班次 RollingSchedule<br/>- 滚动班次编号<br/>- 运营时间段<br/>- 发车间隔<br/>- 单次座位数<br/>- 票价配置]
        IL[库存日志 InventoryLog<br/>- 操作类型<br/>- 操作数量<br/>- 关联订单]
        
        R --> FS
        R --> RS
        R --> IL
    end
    
    subgraph "交易域 Trade Domain"
        O[订单 Order<br/>- 订单号<br/>- 用户编号<br/>- 班次信息<br/>- 票种/数量<br/>- 订单状态<br/>- 金额]
        P[支付 Payment<br/>- 支付单号<br/>- 支付方式<br/>- 支付状态<br/>- 支付金额]
        RF[退款 Refund<br/>- 退款单号<br/>- 退款状态<br/>- 退款金额]
        
        O --> P
        O --> RF
    end
    
    subgraph "履约域 Perform Domain"
        T[凭证 Ticket<br/>- 凭证号<br/>- 订单号<br/>- 票种<br/>- 凭证状态<br/>- 可用日期]
        V[核销记录 Verification<br/>- 凭证号<br/>- 核销时间<br/>- 核销地点]
        
        T --> V
    end
    
    FS -.订购.-> O
    RS -.订购.-> O
    O -.生成.-> T
    
    style R fill:#e1f5ff
    style O fill:#fff4e1
    style T fill:#f0ffe1

📊 核心实体详细设计

1. 线路 (Route)

表名: route

字段 类型 说明
id BIGINT 主键
route_code VARCHAR(50) 线路编码,唯一
route_name VARCHAR(200) 线路名称
start_point VARCHAR(100) 出发地
end_point VARCHAR(100) 目的地
route_type VARCHAR(20) 线路类型SHORT/MEDIUM/LONG
total_inventory INT 总库存数量
remaining_inventory INT 剩余库存数量
responsible_user VARCHAR(50) 责任用户
status VARCHAR(20) 状态ACTIVE/INACTIVE
create_time DATETIME 创建时间
update_time DATETIME 更新时间
deleted TINYINT 逻辑删除标识

2. 固定班次 (FixedSchedule)

表名: fixed_schedule

字段 类型 说明
id BIGINT 主键
schedule_code VARCHAR(50) 班次编号,唯一
route_code VARCHAR(50) 关联线路编码
departure_time DATETIME 出发时间
arrival_time DATETIME 到达时间
seat_limit INT 座位限制
remaining_seats INT 剩余座位
adult_price DECIMAL(10,2) 成人票价
child_price DECIMAL(10,2) 儿童票价
student_price DECIMAL(10,2) 学生票价
senior_price DECIMAL(10,2) 老人票价
status VARCHAR(20) 状态AVAILABLE/FULL/CANCELLED
create_time DATETIME 创建时间
update_time DATETIME 更新时间
deleted TINYINT 逻辑删除标识

3. 滚动班次 (RollingSchedule)

表名: rolling_schedule

字段 类型 说明
id BIGINT 主键
rolling_schedule_code VARCHAR(50) 滚动班次编号,唯一
route_code VARCHAR(50) 关联线路编码
operation_mode VARCHAR(20) 运营模式FIXED_INTERVAL
operation_start_time TIME 运营开始时间
operation_end_time TIME 运营结束时间
interval_minutes INT 发车间隔(分钟)
seats_per_batch INT 单次座位数
adult_price DECIMAL(10,2) 成人票价
child_price DECIMAL(10,2) 儿童票价
student_price DECIMAL(10,2) 学生票价
senior_price DECIMAL(10,2) 老人票价
status VARCHAR(20) 状态ACTIVE/INACTIVE
create_time DATETIME 创建时间
update_time DATETIME 更新时间
deleted TINYINT 逻辑删除标识

4. 订单 (Order)

表名: order

字段 类型 说明
id BIGINT 主键
order_no VARCHAR(50) 订单号,唯一
user_no VARCHAR(50) 用户编号
route_code VARCHAR(50) 线路编码
order_type VARCHAR(20) 订单类型FIXED/ROLLING
schedule_code VARCHAR(50) 固定班次编号(固定班次时)
rolling_schedule_code VARCHAR(50) 滚动班次编号(滚动班次时)
travel_date DATE 出行日期
ticket_type VARCHAR(20) 票种ADULT/CHILD/STUDENT/SENIOR
quantity INT 购买数量
unit_price DECIMAL(10,2) 单价
original_amount DECIMAL(10,2) 原始金额
actual_amount DECIMAL(10,2) 实付金额
order_status VARCHAR(20) 订单状态
create_time DATETIME 创建时间
expire_time DATETIME 支付超时时间
pay_time DATETIME 支付时间
update_time DATETIME 更新时间
deleted TINYINT 逻辑删除标识

订单状态枚举 (OrderStatus):

  • PENDING_PAYMENT - 待支付
  • PAID - 已支付
  • COMPLETED - 已完成
  • CANCELLED - 已取消
  • REFUNDING - 退款中
  • REFUNDED - 已退款

5. 支付 (Payment)

表名: payment

字段 类型 说明
id BIGINT 主键
payment_no VARCHAR(50) 支付单号,唯一
order_no VARCHAR(50) 关联订单号
payment_method VARCHAR(20) 支付方式ALIPAY/WECHAT/BANK
payment_amount DECIMAL(10,2) 支付金额
payment_status VARCHAR(20) 支付状态
third_party_no VARCHAR(100) 第三方支付流水号
create_time DATETIME 创建时间
pay_time DATETIME 支付完成时间
update_time DATETIME 更新时间
deleted TINYINT 逻辑删除标识

6. 退款 (Refund)

表名: refund

字段 类型 说明
id BIGINT 主键
refund_no VARCHAR(50) 退款单号,唯一
order_no VARCHAR(50) 关联订单号
payment_no VARCHAR(50) 关联支付单号
refund_amount DECIMAL(10,2) 退款金额
refund_reason VARCHAR(500) 退款原因
refund_status VARCHAR(20) 退款状态
third_party_refund_no VARCHAR(100) 第三方退款流水号
create_time DATETIME 创建时间
refund_time DATETIME 退款完成时间
update_time DATETIME 更新时间
deleted TINYINT 逻辑删除标识

TODO: 退款详细规则待定

  • 退款时效限制(出行前多久可退?)
  • 退款手续费计算规则
  • 部分退票支持
  • 库存回退处理
  • 凭证状态更新

7. 凭证 (Ticket)

表名: ticket

字段 类型 说明
id BIGINT 主键
ticket_no VARCHAR(50) 凭证号,唯一
order_no VARCHAR(50) 关联订单号
route_code VARCHAR(50) 线路编码
schedule_info VARCHAR(200) 班次信息(具体时间)
ticket_type VARCHAR(20) 票种
ticket_status VARCHAR(20) 凭证状态
issue_time DATETIME 出票时间
usable_date DATE 可用日期
verification_time DATETIME 核销时间
create_time DATETIME 创建时间
update_time DATETIME 更新时间
deleted TINYINT 逻辑删除标识

凭证状态枚举 (TicketStatus):

  • UNUSED - 未使用
  • USED - 已使用
  • REFUNDED - 已退票
  • EXPIRED - 已过期

8. 核销记录 (TicketVerification)

表名: ticket_verification

字段 类型 说明
id BIGINT 主键
ticket_no VARCHAR(50) 凭证号
verification_time DATETIME 核销时间
verification_location VARCHAR(100) 核销地点
operator VARCHAR(50) 操作人
create_time DATETIME 创建时间
deleted TINYINT 逻辑删除标识

9. 库存日志 (InventoryLog)

表名: inventory_log

字段 类型 说明
id BIGINT 主键
route_code VARCHAR(50) 线路编码
operation_type VARCHAR(20) 操作类型LOCK/DEDUCT/RELEASE/REFUND
related_order_no VARCHAR(50) 关联订单号
quantity INT 操作数量
before_amount INT 操作前库存
after_amount INT 操作后库存
operation_time DATETIME 操作时间
operator VARCHAR(50) 操作人
remark VARCHAR(500) 备注
create_time DATETIME 创建时间
deleted TINYINT 逻辑删除标识

操作类型枚举 (OperationType):

  • LOCK - 锁定库存(下单时)
  • DEDUCT - 扣减库存(支付成功)
  • RELEASE - 释放库存(订单取消/超时)
  • REFUND - 退还库存(退款成功)

🔄 核心业务流程

购票流程

sequenceDiagram
    participant U as 用户
    participant TC as Trade Controller
    participant TS as Trade Service
    participant RS as Route Service
    participant MQ as RocketMQ
    participant PS as Perform Service
    
    U->>TC: 1. 创建订单请求
    TC->>TS: 2. 处理订单
    
    rect rgb(240, 248, 255)
        Note over TS: LiteFlow 流程编排
        TS->>TS: 3. 参数校验
        TS->>RS: 4. 检查线路库存
        RS-->>TS: 库存充足
        TS->>RS: 5. 锁定库存
        RS->>RS: 记录库存日志(LOCK)
        RS-->>TS: 锁定成功
        TS->>TS: 6. 创建订单(PENDING_PAYMENT)
    end
    
    TS-->>U: 7. 返回订单信息
    
    U->>TC: 8. 支付订单
    TC->>TS: 9. 处理支付
    TS->>TS: 10. 更新订单状态(PAID)
    TS->>RS: 11. 扣减库存
    RS->>RS: 记录库存日志(DEDUCT)
    TS->>MQ: 12. 发送支付成功消息
    
    MQ->>PS: 13. 监听支付成功
    PS->>PS: 14. 生成电子凭证
    PS-->>U: 凭证生成完成

核销流程

sequenceDiagram
    participant D as 检票设备/APP
    participant PS as Perform Service
    
    D->>PS: 1. 扫描凭证号
    PS->>PS: 2. 查询凭证信息
    
    alt 凭证状态 = UNUSED
        PS->>PS: 3. 更新凭证状态(USED)
        PS->>PS: 4. 记录核销日志
        PS-->>D: ✅ 核销成功
    else 凭证状态 = USED
        PS-->>D: ❌ 凭证已使用
    else 凭证状态 = REFUNDED
        PS-->>D: ❌ 凭证已退票
    else 凭证状态 = EXPIRED
        PS-->>D: ❌ 凭证已过期
    end

订单超时取消流程

sequenceDiagram
    participant T as 定时任务
    participant TS as Trade Service
    participant RS as Route Service
    
    T->>TS: 1. 扫描超时订单
    TS->>TS: 2. 查询 PENDING_PAYMENT 订单
    
    loop 每个超时订单
        TS->>TS: 3. 更新订单状态(CANCELLED)
        TS->>RS: 4. 释放库存
        RS->>RS: 5. 记录库存日志(RELEASE)
    end

📋 业务规则清单

库存规则

  1. 线路总库存 ≥ 所有固定班次座位限制之和
  2. 下单时先锁定库存,支付成功后扣减库存
  3. 订单取消/超时,释放已锁定库存
  4. 退款成功,退还已扣减库存
  5. 所有库存操作必须记录日志

订单规则

  1. 订单创建后 30 分钟内未支付自动取消
  2. 订单状态流转:待支付 → 已支付 → 已完成
  3. 订单支付后才能生成凭证
  4. 一个订单对应多张凭证(根据购买数量)

凭证规则

  1. 凭证号全局唯一
  2. 凭证绑定出行日期和班次信息
  3. 未使用的凭证才能核销
  4. 凭证核销后不可重复使用

票种规则

  1. 每个班次配置各票种价格
  2. 一个订单只能购买一种票种
  3. 票种价格独立设置,不强制比例

🎨 枚举类型定义

OrderTypeEnum (订单类型)

FIXED("FIXED", "固定班次订单"),
ROLLING("ROLLING", "滚动班次订单");

TicketTypeEnum (票种类型)

ADULT("ADULT", "成人票"),
CHILD("CHILD", "儿童票"),
STUDENT("STUDENT", "学生票"),
SENIOR("SENIOR", "老人票");

OrderStatusEnum (订单状态)

PENDING_PAYMENT("PENDING_PAYMENT", "待支付"),
PAID("PAID", "已支付"),
COMPLETED("COMPLETED", "已完成"),
CANCELLED("CANCELLED", "已取消"),
REFUNDING("REFUNDING", "退款中"),
REFUNDED("REFUNDED", "已退款");

TicketStatusEnum (凭证状态)

UNUSED("UNUSED", "未使用"),
USED("USED", "已使用"),
REFUNDED("REFUNDED", "已退票"),
EXPIRED("EXPIRED", "已过期");

OperationTypeEnum (库存操作类型)

LOCK("LOCK", "锁定库存"),
DEDUCT("DEDUCT", "扣减库存"),
RELEASE("RELEASE", "释放库存"),
REFUND("REFUND", "退还库存");

🚀 后续待办事项

业务规则待明确

  • 退款时效规则(出行前多久可退?)
  • 退款手续费计算规则
  • 是否支持部分退票
  • 凭证有效期规则
  • 库存预警机制

技术实现待补充

  • 分布式锁实现(防止超卖)
  • 定时任务实现(订单超时取消)
  • 消息幂等性处理
  • 分布式事务处理方案

文档维护: 本文档应随业务演进持续更新
最后审核: 2025-12-01
审核状态: 业务方案已确认