feat:项目细节
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -40,4 +40,6 @@ logs/
|
|||||||
|
|
||||||
### SQL Files ###
|
### SQL Files ###
|
||||||
*.sql
|
*.sql
|
||||||
*.md
|
*.md
|
||||||
|
# 允许 docs 目录下的文档
|
||||||
|
!docs/**/*.md
|
||||||
526
docs/BUSINESS_MODEL_DESIGN.md
Normal file
526
docs/BUSINESS_MODEL_DESIGN.md
Normal file
@@ -0,0 +1,526 @@
|
|||||||
|
# 业务模型设计文档
|
||||||
|
|
||||||
|
> **项目**: 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. 多租户
|
||||||
|
|
||||||
|
**明确**: 系统**不需要考虑多租户**架构
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏗️ 领域模型
|
||||||
|
|
||||||
|
### 核心实体关系
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
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` - 退还库存(退款成功)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 核心业务流程
|
||||||
|
|
||||||
|
### 购票流程
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
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: 凭证生成完成
|
||||||
|
```
|
||||||
|
|
||||||
|
### 核销流程
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|
### 订单超时取消流程
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
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 (订单类型)
|
||||||
|
```java
|
||||||
|
FIXED("FIXED", "固定班次订单"),
|
||||||
|
ROLLING("ROLLING", "滚动班次订单");
|
||||||
|
```
|
||||||
|
|
||||||
|
### TicketTypeEnum (票种类型)
|
||||||
|
```java
|
||||||
|
ADULT("ADULT", "成人票"),
|
||||||
|
CHILD("CHILD", "儿童票"),
|
||||||
|
STUDENT("STUDENT", "学生票"),
|
||||||
|
SENIOR("SENIOR", "老人票");
|
||||||
|
```
|
||||||
|
|
||||||
|
### OrderStatusEnum (订单状态)
|
||||||
|
```java
|
||||||
|
PENDING_PAYMENT("PENDING_PAYMENT", "待支付"),
|
||||||
|
PAID("PAID", "已支付"),
|
||||||
|
COMPLETED("COMPLETED", "已完成"),
|
||||||
|
CANCELLED("CANCELLED", "已取消"),
|
||||||
|
REFUNDING("REFUNDING", "退款中"),
|
||||||
|
REFUNDED("REFUNDED", "已退款");
|
||||||
|
```
|
||||||
|
|
||||||
|
### TicketStatusEnum (凭证状态)
|
||||||
|
```java
|
||||||
|
UNUSED("UNUSED", "未使用"),
|
||||||
|
USED("USED", "已使用"),
|
||||||
|
REFUNDED("REFUNDED", "已退票"),
|
||||||
|
EXPIRED("EXPIRED", "已过期");
|
||||||
|
```
|
||||||
|
|
||||||
|
### OperationTypeEnum (库存操作类型)
|
||||||
|
```java
|
||||||
|
LOCK("LOCK", "锁定库存"),
|
||||||
|
DEDUCT("DEDUCT", "扣减库存"),
|
||||||
|
RELEASE("RELEASE", "释放库存"),
|
||||||
|
REFUND("REFUND", "退还库存");
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 后续待办事项
|
||||||
|
|
||||||
|
### 业务规则待明确
|
||||||
|
- [ ] 退款时效规则(出行前多久可退?)
|
||||||
|
- [ ] 退款手续费计算规则
|
||||||
|
- [ ] 是否支持部分退票
|
||||||
|
- [ ] 凭证有效期规则
|
||||||
|
- [ ] 库存预警机制
|
||||||
|
|
||||||
|
### 技术实现待补充
|
||||||
|
- [ ] 分布式锁实现(防止超卖)
|
||||||
|
- [ ] 定时任务实现(订单超时取消)
|
||||||
|
- [ ] 消息幂等性处理
|
||||||
|
- [ ] 分布式事务处理方案
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> **文档维护**: 本文档应随业务演进持续更新
|
||||||
|
> **最后审核**: 2025-12-01
|
||||||
|
> **审核状态**: ✅ 业务方案已确认
|
||||||
Reference in New Issue
Block a user