feat:项目细节

This commit is contained in:
amos
2025-12-01 17:54:53 +08:00
parent 7ac32a2e3e
commit c5a6d1e458
2 changed files with 529 additions and 1 deletions

4
.gitignore vendored
View File

@@ -40,4 +40,6 @@ logs/
### SQL Files ###
*.sql
*.md
*.md
# 允许 docs 目录下的文档
!docs/**/*.md

View 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
> **审核状态**: ✅ 业务方案已确认