修复所有设计文档中ASCII图表右侧边框对齐问题

- 修复HLD-系统概要设计.md中所有ASCII图表的右侧边框对齐
- 修复LLD-签到模块详细设计.md中ASCII图表的右侧边框对齐
- 修复LLD-会员模块详细设计.md中ASCII图表的右侧边框对齐
- 修复LLD-预约模块详细设计.md中ASCII图表的右侧边框对齐
- 确保所有ASCII图表的右侧边框纵向靠右对齐
This commit is contained in:
张翔
2026-03-04 11:20:36 +08:00
parent 97c5c08513
commit c1d7660aac
4 changed files with 1257 additions and 1257 deletions
+215 -215
View File
@@ -84,59 +84,59 @@
│ 业务范围 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 会员管理 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 会员注册 • 会员卡管理 • 权益管理 • 等级管理 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 会员管理 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 会员注册 • 会员卡管理 • 权益管理 • 等级管理 │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 预约管理 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 团课预约 • 私教预约 • 场地预约 • 线上课程 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 预约管理 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 团课预约 • 私教预约 • 场地预约 • 线上课程 │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 签到管理 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 扫码签到 • 刷脸签到 • NFC签到 • 教练代签 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 签到管理 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 扫码签到 • 刷脸签到 • NFC签到 • 教练代签 │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 课程管理 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 课程类型 • 课程排期 • 场地管理 • 价格配置 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 课程管理 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 课程类型 • 课程排期 • 场地管理 • 价格配置 │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 教练管理 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 教练信息 • 排班管理 • 课时统计 • 评价管理 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 教练管理 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 教练信息 • 排班管理 • 课时统计 • 评价管理 │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 财务管理 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 营收统计 • 账单管理 • 退款管理 • 对账管理 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 财务管理 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 营收统计 • 账单管理 • 退款管理 • 对账管理 │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 计划中心 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 训练计划 • 课程排期 • 会员目标 • 教练排班 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 计划中心 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 训练计划 • 课程排期 • 会员目标 • 教练排班 │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 数据分析 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 会员分析 • 课程分析 • 财务分析 • 运营分析 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 数据分析 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 会员分析 • 课程分析 • 财务分析 • 运营分析 │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 系统管理 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 租户管理 • 门店管理 • 权限管理 • 系统配置 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 系统管理 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 租户管理 • 门店管理 • 权限管理 • 系统配置 │
│ └─────────────────────────────────────────────────────────────────┘
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
@@ -154,51 +154,51 @@
│ 总体架构 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 客户端层 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 会员小程序 (uniapp+Vue3) │ │
│ │ • 教练端App (uniapp+Vue3) │ │
│ │ • 管理后台PC (Vue3+Vite) │ │
│ │ • 硬件设备 (人脸/NFC) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 客户端层 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 会员小程序 (uniapp+Vue3) │
│ │ • 教练端App (uniapp+Vue3) │
│ │ • 管理后台PC (Vue3+Vite) │
│ │ • 硬件设备 (人脸/NFC) │
│ └─────────────────────────────────────────────────────────────────┘
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ API Gateway 统一网关 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 路由转发 • 认证鉴权 • 限流熔断 • 日志追踪 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ API Gateway 统一网关 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 路由转发 • 认证鉴权 • 限流熔断 • 日志追踪 │
│ └─────────────────────────────────────────────────────────────────┘
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 业务层 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 会员服务 (Member Service) │ │
│ │ • 预约服务 (Booking Service) │ │
│ │ • 数据服务 (Data Service) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 业务层 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 会员服务 (Member Service) │
│ │ • 预约服务 (Booking Service) │
│ │ • 数据服务 (Data Service) │
│ └─────────────────────────────────────────────────────────────────┘
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 公共服务层 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 认证服务 • 消息服务 • 文件服务 • 缓存服务 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 公共服务层 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 认证服务 • 消息服务 • 文件服务 • 缓存服务 │
│ └─────────────────────────────────────────────────────────────────┘
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 基础设施层 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • PostgreSQL • R2DBC • Caffeine • Redis(可选) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 基础设施层 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • PostgreSQL • R2DBC • Caffeine • Redis(可选) │
│ └─────────────────────────────────────────────────────────────────┘
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 外部服务层 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 微信开放平台 • 短信服务 • 支付服务 • OSS存储 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 外部服务层 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 微信开放平台 • 短信服务 • 支付服务 • OSS存储 │
│ └─────────────────────────────────────────────────────────────────┘
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
@@ -210,38 +210,38 @@
│ 技术架构 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 表现层 Presentation │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 会员端 uniapp (Vue3 + TS + Pinia + uni-ui) │ │
│ │ • 教练端 uniapp (Vue3 + TS + Pinia + uni-ui) │ │
│ │ • 管理后台 Vue3 (Vue3 + TS + Pinia + Element Plus) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 表现层 Presentation │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 会员端 uniapp (Vue3 + TS + Pinia + uni-ui) │
│ │ • 教练端 uniapp (Vue3 + TS + Pinia + uni-ui) │
│ │ • 管理后台 Vue3 (Vue3 + TS + Pinia + Element Plus) │
│ └─────────────────────────────────────────────────────────────────┘
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 网关层 Gateway │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ Spring Cloud Gateway (路由转发/认证鉴权/限流熔断/日志追踪/灰度发布) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 网关层 Gateway │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ Spring Cloud Gateway (路由转发/认证鉴权/限流熔断/日志追踪/灰度发布) │
│ └─────────────────────────────────────────────────────────────────┘
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 业务层 Business │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ Spring Boot 3 + WebFlux + JDK 21 │ │
│ │ • Controller (API) • Service (业务逻辑) │ │
│ │ • Repository (数据访问) • Model (领域模型) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 业务层 Business │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ Spring Boot 3 + WebFlux + JDK 21 │
│ │ • Controller (API) • Service (业务逻辑) │
│ │ • Repository (数据访问) • Model (领域模型) │
│ └─────────────────────────────────────────────────────────────────┘
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 数据层 Data │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • PostgreSQL (R2DBC + Flyway) │ │
│ │ • Caffeine (本地缓存 + 热点数据) │ │
│ │ • Redis可选 (分布式缓存 + 分布式锁) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 数据层 Data │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • PostgreSQL (R2DBC + Flyway) │
│ │ • Caffeine (本地缓存 + 热点数据) │
│ │ • Redis可选 (分布式缓存 + 分布式锁) │
│ └─────────────────────────────────────────────────────────────────┘
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
@@ -253,33 +253,33 @@
│ 部署架构 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 负载均衡器 (Nginx/ALB) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 负载均衡器 (Nginx/ALB) │
│ └─────────────────────────────────────────────────────────────────┘
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ API Gateway 集群 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • API Gateway 实例1 • API Gateway 实例2 • API Gateway 实例N │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ API Gateway 集群 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • API Gateway 实例1 • API Gateway 实例2 • API Gateway 实例N │
│ └─────────────────────────────────────────────────────────────────┘
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 应用服务集群 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 应用服务 实例1 • 应用服务 实例2 • 应用服务 实例N │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 应用服务集群 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 应用服务 实例1 • 应用服务 实例2 • 应用服务 实例N │
│ └─────────────────────────────────────────────────────────────────┘
│ │ │
│ ┌───────────────┴───────────────┐ │
│ ▼ ▼ │
│ ┌─────────────────────────┐ ┌─────────────────────────┐ │
│ │ PostgreSQL 数据库层 │ │ Redis 缓存层 │ │
│ ├─────────────────────────┤ ├─────────────────────────┤ │
│ │ • 主库 │ │ • 主节点 │ │
│ │ • 从库1 (主从复制) │ │ • 从节点1 (主从复制) │ │
│ │ • 从库N (主从复制) │ │ • 从节点N (主从复制) │ │
│ └─────────────────────────┘ └─────────────────────────┘ │
│ ┌───────────────┴───────────────┐
│ ▼ ▼
│ ┌─────────────────────────┐ ┌─────────────────────────┐
│ │ PostgreSQL 数据库层 │ │ Redis 缓存层 │
│ ├─────────────────────────┤ ├─────────────────────────┤
│ │ • 主库 │ │ • 主节点 │
│ │ • 从库1 (主从复制) │ │ • 从节点1 (主从复制) │
│ │ • 从库N (主从复制) │ │ • 从节点N (主从复制) │
│ └─────────────────────────┘ └─────────────────────────┘
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
@@ -295,52 +295,52 @@
│ gym-manage-server 父工程 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ gym-common 公共模块 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • gym-common-core (核心工具类、常量、枚举) │ │
│ │ • gym-common-redis (Redis配置可选) │ │
│ │ • gym-common-security (安全认证公共组件) │ │
│ │ • gym-common-log (日志公共组件) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ gym-common 公共模块 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • gym-common-core (核心工具类、常量、枚举) │
│ │ • gym-common-redis (Redis配置可选) │
│ │ • gym-common-security (安全认证公共组件) │
│ │ • gym-common-log (日志公共组件) │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ gym-api API网关模块 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • controller (HTTP接口) • dto (数据传输对象) │ │
│ │ • vo (视图对象) • config (API配置) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ gym-api API网关模块 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • controller (HTTP接口) • dto (数据传输对象) │
│ │ • vo (视图对象) • config (API配置) │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ gym-service 业务服务模块 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • gym-service-member (会员服务) │ │
│ │ • gym-service-booking (预约服务) │ │
│ │ • gym-service-checkin (签到服务) │ │
│ │ • gym-service-course (课程服务) │ │
│ │ • gym-service-coach (教练服务) │ │
│ │ • gym-service-finance (财务服务) │ │
│ │ • gym-service-data (数据服务) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ gym-service 业务服务模块 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • gym-service-member (会员服务) │
│ │ • gym-service-booking (预约服务) │
│ │ • gym-service-checkin (签到服务) │
│ │ • gym-service-course (课程服务) │
│ │ • gym-service-coach (教练服务) │
│ │ • gym-service-finance (财务服务) │
│ │ • gym-service-data (数据服务) │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ gym-domain 领域模型模块 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • model (领域模型) • event (领域事件) • service (领域服务) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ gym-domain 领域模型模块 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • model (领域模型) • event (领域事件) • service (领域服务) │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ gym-infrastructure 基础设施模块 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • repository (数据仓储) • cache (缓存配置) │ │
│ │ • external (外部服务集成) • config (基础配置) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ gym-infrastructure 基础设施模块 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • repository (数据仓储) • cache (缓存配置) │
│ │ • external (外部服务集成) • config (基础配置) │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ gym-starter 启动模块 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • gym-admin (管理后台启动器) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ gym-starter 启动模块 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • gym-admin (管理后台启动器) │
│ └─────────────────────────────────────────────────────────────────┘
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
@@ -499,58 +499,58 @@ HTTP方法语义:
│ 接口分组 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 认证接口 /v1/auth │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • POST /login (登录) • POST /logout (登出) │ │
│ │ • POST /refresh (刷新Token) • POST /wechat-login (微信登录) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 认证接口 /v1/auth │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • POST /login (登录) • POST /logout (登出) │
│ │ • POST /refresh (刷新Token) • POST /wechat-login (微信登录) │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 会员接口 /v1/members │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • GET / (会员列表) • GET /{id} (会员详情) │ │
│ │ • POST / (创建会员) • PUT /{id} (更新会员) │ │
│ │ • GET /{id}/cards (会员卡列表) • GET /{id}/benefits (权益列表)│ │
│ │ • GET /{id}/bookings (预约记录) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 会员接口 /v1/members │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • GET / (会员列表) • GET /{id} (会员详情) │
│ │ • POST / (创建会员) • PUT /{id} (更新会员) │
│ │ • GET /{id}/cards (会员卡列表) • GET /{id}/benefits (权益列表)│
│ │ • GET /{id}/bookings (预约记录) │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 课程接口 /v1/courses │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • GET / (课程列表) • GET /{id} (课程详情) │ │
│ │ • POST / (创建课程) • PUT /{id} (更新课程) │ │
│ │ • GET /{id}/slots (可预约时段) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 课程接口 /v1/courses │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • GET / (课程列表) • GET /{id} (课程详情) │
│ │ • POST / (创建课程) • PUT /{id} (更新课程) │
│ │ • GET /{id}/slots (可预约时段) │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 预约接口 /v1/bookings │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • GET / (预约列表) • GET /{id} (预约详情) │ │
│ │ • POST / (创建预约) • POST /{id}/cancel (取消预约) │ │
│ │ • GET /my (我的预约) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 预约接口 /v1/bookings │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • GET / (预约列表) • GET /{id} (预约详情) │
│ │ • POST / (创建预约) • POST /{id}/cancel (取消预约) │
│ │ • GET /my (我的预约) │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 签到接口 /v1/checkins │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • GET / (签到列表) • POST /scan (扫码签到) │ │
│ │ • POST /manual (手动签到) • GET /my (我的签到) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 签到接口 /v1/checkins │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • GET / (签到列表) • POST /scan (扫码签到) │
│ │ • POST /manual (手动签到) • GET /my (我的签到) │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 教练接口 /v1/coaches │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • GET / (教练列表) • GET /{id} (教练详情) │ │
│ │ • GET /{id}/schedule (教练排班) • GET /{id}/slots (可预约时段)│ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 教练接口 /v1/coaches │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • GET / (教练列表) • GET /{id} (教练详情) │
│ │ • GET /{id}/schedule (教练排班) • GET /{id}/slots (可预约时段)│
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 数据看板 /v1/dashboard │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • GET /overview (今日概览) • GET /trends (趋势数据) │ │
│ │ • GET /rankings (排行数据) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 数据看板 /v1/dashboard │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • GET /overview (今日概览) • GET /trends (趋势数据) │
│ │ • GET /rankings (排行数据) │
│ └─────────────────────────────────────────────────────────────────┘
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+213 -213
View File
@@ -44,28 +44,28 @@
│ 预约模块边界 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 预约模块内部 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 课程管理 • 时段管理 • 预约管理 • 库存管理 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 预约模块内部 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 课程管理 • 时段管理 • 预约管理 • 库存管理 │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 外部依赖 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 会员模块 (查询会员权益、扣减权益) │ │
│ │ • 教练模块 (查询教练信息、排班) │ │
│ │ • 场地模块 (查询场地信息、可用性) │ │
│ │ • 消息模块 (发送预约通知) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 外部依赖 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 会员模块 (查询会员权益、扣减权益) │
│ │ • 教练模块 (查询教练信息、排班) │
│ │ • 场地模块 (查询场地信息、可用性) │
│ │ • 消息模块 (发送预约通知) │
│ └─────────────────────────────────────────────────────────────────┘
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 被依赖 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ • 签到模块 (查询预约信息、验证签到资格) │ │
│ │ • 财务模块 (查询预约消费记录) │ │
│ │ • 数据模块 (预约数据分析) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐
│ │ 被依赖 │
│ ├─────────────────────────────────────────────────────────────────┤
│ │ • 签到模块 (查询预约信息、验证签到资格) │
│ │ • 财务模块 (查询预约消费记录) │
│ │ • 数据模块 (预约数据分析) │
│ └─────────────────────────────────────────────────────────────────┘
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
@@ -81,25 +81,25 @@
│ 实体关系图 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ coach │ │ course │ │ venue │ │
│ │ (教练) │ │ (课程) │ │ (场地) │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ 1:N │ 1:N │ 1:N │
│ │ │ │ │
│ └──────────────┴──────────────┘ │
│ │ 1:N │
│ ▼ │
│ ┌──────────────────┐ │
│ │ booking_slot │ │
│ │ (预约时段) │ │
│ └────────┬─────────┘ │
│ │ 1:N │
│ ▼ │
│ ┌──────────────────┐ │
│ │ booking_record │ │
│ │ (预约记录) │ │
│ └──────────────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ │ coach │ │ course │ │ venue │
│ │ (教练) │ │ (课程) │ │ (场地) │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ 1:N │ 1:N │ 1:N
│ │ │ │
│ └──────────────┴──────────────┘
│ │ 1:N
│ ▼
│ ┌──────────────────┐
│ │ booking_slot │
│ │ (预约时段) │
│ └────────┬─────────┘
│ │ 1:N
│ ▼
│ ┌──────────────────┐
│ │ booking_record │
│ │ (预约记录) │
│ └──────────────────┘
│ │
│ 关系说明: │
│ • coach (1) ─── (N) booking_slot : 一个教练有多个时段 │
@@ -334,75 +334,75 @@ CREATE INDEX idx_schedule_date ON coach_schedule(schedule_date) WHERE deleted_at
│ 预约领域模型 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ <<Entity>> │ │
│ │ BookingSlot │ │
│ ├───────────────────────────────────────────────────────────────────┤ │
│ │ - id: Long │ │
│ │ - tenantId: Long │ │
│ │ - storeId: Long │ │
│ │ - resourceType: ResourceType │ │
│ │ - resourceId: Long │ │
│ │ - coachId: Long │ │
│ │ - venueId: Long │ │
│ │ - startTime: LocalDateTime │ │
│ │ - endTime: LocalDateTime │ │
│ │ - capacity: Integer │ │
│ │ - bookedCount: Integer │ │
│ │ - waitlistCount: Integer │ │
│ │ - status: SlotStatus │ │
│ │ - version: Integer │ │
│ ├───────────────────────────────────────────────────────────────────┤ │
│ │ + hasCapacity(): Boolean │ │
│ │ + getRemainCapacity(): Integer │ │
│ │ + canBook(): Boolean │ │
│ │ + book(): void │ │
│ │ + cancel(): void │ │
│ │ + isExpired(): Boolean │ │
│ │ + isFull(): Boolean │ │
│ │ + addToWaitlist(): void │ │
│ │ + removeFromWaitlist(): void │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │ │
│ │ 1:N │
│ ▼ │
│ ┌────────────────────────────┐ ┌────────────────────────────┐ │
│ │ <<Entity>> │ │ <<Entity>> │ │
│ │ BookingRecord │ │ BookingWaitlist │ │
│ ├────────────────────────────┤ ├────────────────────────────┤ │
│ │ - id: Long │ │ - id: Long │ │
│ │ - memberId: Long │ │ - memberId: Long │ │
│ │ - slotId: Long │ │ - slotId: Long │ │
│ │ - bookingNo: String │ │ - queueNo: Integer │ │
│ │ - status: BookingStatus │ │ - status: WaitlistStatus │ │
│ │ - priceType: PriceType │ │ - expireAt: LocalDateTime │ │
│ │ - priceValue: BigDecimal │ ├────────────────────────────┤ │
│ │ - checkinStatus: CheckinSt │ │ + isExpired(): Boolean │ │
│ ├────────────────────────────┤ │ + convert(): void │ │
│ │ + canCancel(): Boolean │ └────────────────────────────┘ │
│ ┌───────────────────────────────────────────────────────────────────┐
│ │ <<Entity>> │
│ │ BookingSlot │
│ ├───────────────────────────────────────────────────────────────────┤
│ │ - id: Long │
│ │ - tenantId: Long │
│ │ - storeId: Long │
│ │ - resourceType: ResourceType │
│ │ - resourceId: Long │
│ │ - coachId: Long │
│ │ - venueId: Long │
│ │ - startTime: LocalDateTime │
│ │ - endTime: LocalDateTime │
│ │ - capacity: Integer │
│ │ - bookedCount: Integer │
│ │ - waitlistCount: Integer │
│ │ - status: SlotStatus │
│ │ - version: Integer │
│ ├───────────────────────────────────────────────────────────────────┤
│ │ + hasCapacity(): Boolean │
│ │ + getRemainCapacity(): Integer │
│ │ + canBook(): Boolean │
│ │ + book(): void │
│ │ + cancel(): void │
│ │ + isExpired(): Boolean │
│ │ + isFull(): Boolean │
│ │ + addToWaitlist(): void │
│ │ + removeFromWaitlist(): void │
│ └───────────────────────────────────────────────────────────────────┘
│ │
│ │ 1:N
│ ▼
│ ┌────────────────────────────┐ ┌────────────────────────────┐
│ │ <<Entity>> │ │ <<Entity>> │
│ │ BookingRecord │ │ BookingWaitlist │
│ ├────────────────────────────┤ ├────────────────────────────┤
│ │ - id: Long │ │ - id: Long │
│ │ - memberId: Long │ │ - memberId: Long │
│ │ - slotId: Long │ │ - slotId: Long │
│ │ - bookingNo: String │ │ - queueNo: Integer │
│ │ - status: BookingStatus │ │ - status: WaitlistStatus │
│ │ - priceType: PriceType │ │ - expireAt: LocalDateTime │
│ │ - priceValue: BigDecimal │ ├────────────────────────────┤
│ │ - checkinStatus: CheckinSt │ │ + isExpired(): Boolean │
│ ├────────────────────────────┤ │ + convert(): void │
│ │ + canCancel(): Boolean │ └────────────────────────────┘
│ │ + cancel(): void │ │
│ │ + checkin(): void │ │
│ │ + isCheckinable(): Boolean │ │
│ └────────────────────────────┘ │
│ │
│ ┌────────────────────────────┐ ┌────────────────────────────┐ │
│ │ <<ValueObject>> │ │ <<ValueObject>> │ │
│ │ ResourceType │ │ SlotStatus │ │
│ ├────────────────────────────┤ ├────────────────────────────┤ │
│ │ GROUP_CLASS(1, "团课") │ │ AVAILABLE(1, "可预约") │ │
│ │ PRIVATE(2, "私教") │ │ FULL(2, "已满") │ │
│ │ VENUE(3, "场地") │ │ CANCELLED(3, "已取消") │ │
│ │ ONLINE(4, "线上") │ │ ENDED(4, "已结束") │ │
│ └────────────────────────────┘ └────────────────────────────┘ │
│ ┌────────────────────────────┐ ┌────────────────────────────┐
│ │ <<ValueObject>> │ │ <<ValueObject>> │
│ │ ResourceType │ │ SlotStatus │
│ ├────────────────────────────┤ ├────────────────────────────┤
│ │ GROUP_CLASS(1, "团课") │ │ AVAILABLE(1, "可预约") │
│ │ PRIVATE(2, "私教") │ │ FULL(2, "已满") │
│ │ VENUE(3, "场地") │ │ CANCELLED(3, "已取消") │
│ │ ONLINE(4, "线上") │ │ ENDED(4, "已结束") │
│ └────────────────────────────┘ └────────────────────────────┘
│ │
│ ┌────────────────────────────┐ ┌────────────────────────────┐ │
│ │ <<ValueObject>> │ │ <<ValueObject>> │ │
│ │ BookingStatus │ │ PriceType │ │
│ ├────────────────────────────┤ ├────────────────────────────┤ │
│ │ BOOKED(1, "已预约") │ │ TIMES(1, "扣次") │ │
│ │ CANCELLED(2, "已取消") │ │ DURATION(2, "扣时长") │ │
│ │ COMPLETED(3, "已完成") │ │ AMOUNT(3, "扣金额") │ │
│ │ EXPIRED(4, "已过期") │ └────────────────────────────┘ │
│ ┌────────────────────────────┐ ┌────────────────────────────┐
│ │ <<ValueObject>> │ │ <<ValueObject>> │
│ │ BookingStatus │ │ PriceType │
│ ├────────────────────────────┤ ├────────────────────────────┤
│ │ BOOKED(1, "已预约") │ │ TIMES(1, "扣次") │
│ │ CANCELLED(2, "已取消") │ │ DURATION(2, "扣时长") │
│ │ COMPLETED(3, "已完成") │ │ AMOUNT(3, "扣金额") │
│ │ EXPIRED(4, "已过期") │ └────────────────────────────┘
│ └────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
@@ -415,40 +415,40 @@ CREATE INDEX idx_schedule_date ON coach_schedule(schedule_date) WHERE deleted_at
│ 领域服务设计 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ <<DomainService>> │ │
│ │ BookingDomainService │ │
│ ├───────────────────────────────────────────────────────────────────┤ │
│ │ + createBooking(command: CreateBookingCommand): BookingRecord │ │
│ │ + cancelBooking(bookingId: Long, reason: String): void │ │
│ │ + checkin(bookingId: Long): void │ │
│ │ + addToWaitlist(memberId: Long, slotId: Long): void │ │
│ │ + processWaitlist(slotId: Long): void │ │
│ │ + validateBooking(memberId: Long, slotId: Long): void │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ ┌───────────────────────────────────────────────────────────────────┐
│ │ <<DomainService>> │
│ │ BookingDomainService │
│ ├───────────────────────────────────────────────────────────────────┤
│ │ + createBooking(command: CreateBookingCommand): BookingRecord │
│ │ + cancelBooking(bookingId: Long, reason: String): void │
│ │ + checkin(bookingId: Long): void │
│ │ + addToWaitlist(memberId: Long, slotId: Long): void │
│ │ + processWaitlist(slotId: Long): void │
│ │ + validateBooking(memberId: Long, slotId: Long): void │
│ └───────────────────────────────────────────────────────────────────┘
│ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ <<DomainService>> │ │
│ │ SlotDomainService │ │
│ ├───────────────────────────────────────────────────────────────────┤ │
│ │ + createSlot(command: CreateSlotCommand): BookingSlot │ │
│ │ + batchCreateSlots(command: BatchSlotCommand): List<Slot> │ │
│ │ + updateSlot(slotId: Long, command: UpdateSlotCommand): void │ │
│ │ + cancelSlot(slotId: Long, reason: String): void │ │
│ │ + getAvailableSlots(query: SlotQuery): List<BookingSlot> │ │
│ │ + incrementBookedCount(slotId: Long): Boolean │ │
│ │ + decrementBookedCount(slotId: Long): void │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ ┌───────────────────────────────────────────────────────────────────┐
│ │ <<DomainService>> │
│ │ SlotDomainService │
│ ├───────────────────────────────────────────────────────────────────┤
│ │ + createSlot(command: CreateSlotCommand): BookingSlot │
│ │ + batchCreateSlots(command: BatchSlotCommand): List<Slot> │
│ │ + updateSlot(slotId: Long, command: UpdateSlotCommand): void │
│ │ + cancelSlot(slotId: Long, reason: String): void │
│ │ + getAvailableSlots(query: SlotQuery): List<BookingSlot> │
│ │ + incrementBookedCount(slotId: Long): Boolean │
│ │ + decrementBookedCount(slotId: Long): void │
│ └───────────────────────────────────────────────────────────────────┘
│ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ <<DomainService>> │ │
│ │ InventoryDomainService │ │
│ ├───────────────────────────────────────────────────────────────────┤ │
│ │ + checkInventory(slotId: Long): Boolean │ │
│ │ + reserveInventory(slotId: Long, count: Integer): Boolean │ │
│ │ + releaseInventory(slotId: Long, count: Integer): void │ │
│ │ + preloadInventory(slotIds: List<Long>): void │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ ┌───────────────────────────────────────────────────────────────────┐
│ │ <<DomainService>> │
│ │ InventoryDomainService │
│ ├───────────────────────────────────────────────────────────────────┤
│ │ + checkInventory(slotId: Long): Boolean │
│ │ + reserveInventory(slotId: Long, count: Integer): Boolean │
│ │ + releaseInventory(slotId: Long, count: Integer): void │
│ │ + preloadInventory(slotIds: List<Long>): void │
│ └───────────────────────────────────────────────────────────────────┘
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
@@ -464,50 +464,50 @@ CREATE INDEX idx_schedule_date ON coach_schedule(schedule_date) WHERE deleted_at
│ 团课预约流程 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 会员端 API层 BookingService BenefitService 数据层 │
│ │ │ │ │ │ │
│ │ 1.选择课程 │ │ │ │ │
│ │─────────▶│ │ │ │ │
│ │ │ 2.查询时段 │ │ │ │
│ │ │─────────────▶│ │ │ │
│ │ │ │ 3.查询可预约时段 │ │ │
│ │ │ │───────────────────────────────▶│ │
│ │ │ │◀───────────────────────────────│ │
│ │◀─────────│ 返回时段列表 │ │ │ │
│ │ │ │ │ │ │
│ │ 4.提交预约 │ │ │ │ │
│ │─────────▶│ │ │ │ │
│ │ │ 5.创建预约 │ │ │ │
│ │ │─────────────▶│ │ │ │
│ │ │ │ 6.校验时段 │ │ │
│ │ │ │───────────────────────────────▶│ │
│ │ │ │◀───────────────────────────────│ │
│ │ │ │ │ │ │
│ │ │ │ 7.校验会员状态 │ │ │
│ │ │ │───────────────────────────────▶│ │
│ │ │ │◀───────────────────────────────│ │
│ │ │ │ │ │ │
│ │ │ │ 8.检查库存(原子)│ │ │
│ │ │ │───────────────────────────────▶│ │
│ │ │ │◀───────────────────────────────│ │
│ │ │ │ │ │ │
│ │ │ │ 9.扣减权益 │ │ │
│ │ │ │────────────────▶│ │ │
│ │ │ │ │─────────────▶│ │
│ │ │ │ │◀─────────────│ │
│ │ │ │◀────────────────│ │ │
│ │ │ │ │ │ │
│ │ │ │ 10.创建预约记录 │ │ │
│ │ │ │───────────────────────────────▶│ │
│ │ │ │ │ │ │
│ │ │ │ 11.增加预约人数 │ │ │
│ │ │ │───────────────────────────────▶│ │
│ │ │ │◀───────────────────────────────│ │
│ │ │ │ │ │ │
│ │ │ │ 12.发送预约通知 │ │ │
│ │◀─────────│◀─────────────│ │ │ │
│ │ 返回预约成功│ │ │ │ │
│ │ │ │ │ │ │
│ 会员端 API层 BookingService BenefitService 数据层
│ │ │ │ │ │
│ │ 1.选择课程 │ │ │ │
│ │─────────▶│ │ │ │
│ │ │ 2.查询时段 │ │ │
│ │ │─────────────▶│ │ │
│ │ │ │ 3.查询可预约时段 │ │
│ │ │ │───────────────────────────────▶│
│ │ │ │◀───────────────────────────────│
│ │◀─────────│ 返回时段列表 │ │ │
│ │ │ │ │ │
│ │ 4.提交预约 │ │ │ │
│ │─────────▶│ │ │ │
│ │ │ 5.创建预约 │ │ │
│ │ │─────────────▶│ │ │
│ │ │ │ 6.校验时段 │ │
│ │ │ │───────────────────────────────▶│
│ │ │ │◀───────────────────────────────│
│ │ │ │ │ │
│ │ │ │ 7.校验会员状态 │ │
│ │ │ │───────────────────────────────▶│
│ │ │ │◀───────────────────────────────│
│ │ │ │ │ │
│ │ │ │ 8.检查库存(原子)│ │
│ │ │ │───────────────────────────────▶│
│ │ │ │◀───────────────────────────────│
│ │ │ │ │ │
│ │ │ │ 9.扣减权益 │ │
│ │ │ │────────────────▶│ │
│ │ │ │ │─────────────▶│
│ │ │ │ │◀─────────────│
│ │ │ │◀────────────────│ │
│ │ │ │ │ │
│ │ │ │ 10.创建预约记录 │ │
│ │ │ │───────────────────────────────▶│
│ │ │ │ │ │
│ │ │ │ 11.增加预约人数 │ │
│ │ │ │───────────────────────────────▶│
│ │ │ │◀───────────────────────────────│
│ │ │ │ │ │
│ │ │ │ 12.发送预约通知 │ │
│ │◀─────────│◀─────────────│ │ │
│ │ 返回预约成功│ │ │ │
│ │ │ │ │ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
@@ -519,41 +519,41 @@ CREATE INDEX idx_schedule_date ON coach_schedule(schedule_date) WHERE deleted_at
│ 取消预约流程 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 会员端 API层 BookingService BenefitService 数据层 │
│ │ │ │ │ │ │
│ │ 1.请求取消 │ │ │ │ │
│ │─────────▶│ │ │ │ │
│ │ │ 2.查询预约 │ │ │ │
│ │ │─────────────▶│ │ │ │
│ │ │ │───────────────────────────────▶│ │
│ │ │ │◀───────────────────────────────│ │
│ │ │ │ │ │ │
│ │ │ │ 3.校验可取消 │ │ │
│ │ │ │ - 状态检查 │ │ │
│ │ │ │ - 时间检查 │ │ │
│ │ │ │ │ │ │
│ │ │ │ 4.计算退款金额 │ │ │
│ │ │ │ │ │ │
│ │ │ │ 5.退还权益 │ │ │
│ │ │ │────────────────▶│ │ │
│ │ │ │ │─────────────▶│ │
│ │ │ │ │◀─────────────│ │
│ │ │ │◀────────────────│ │ │
│ │ │ │ │ │ │
│ │ │ │ 6.更新预约状态 │ │ │
│ │ │ │───────────────────────────────▶│ │
│ │ │ │ │ │ │
│ │ │ │ 7.减少预约人数 │ │ │
│ │ │ │───────────────────────────────▶│ │
│ │ │ │ │ │ │
│ │ │ │ 8.处理候补队列 │ │ │
│ │ │ │───────────────────────────────▶│ │
│ │ │ │◀───────────────────────────────│ │
│ │ │ │ │ │ │
│ │ │ │ 9.发送取消通知 │ │ │
│ │◀─────────│◀─────────────│ │ │ │
│ │ 返回取消成功│ │ │ │ │
│ │ │ │ │ │ │
│ 会员端 API层 BookingService BenefitService 数据层
│ │ │ │ │ │
│ │ 1.请求取消 │ │ │ │
│ │─────────▶│ │ │ │
│ │ │ 2.查询预约 │ │ │
│ │ │─────────────▶│ │ │
│ │ │ │───────────────────────────────▶│
│ │ │ │◀───────────────────────────────│
│ │ │ │ │ │
│ │ │ │ 3.校验可取消 │ │
│ │ │ │ - 状态检查 │ │
│ │ │ │ - 时间检查 │ │
│ │ │ │ │ │
│ │ │ │ 4.计算退款金额 │ │
│ │ │ │ │ │
│ │ │ │ 5.退还权益 │ │
│ │ │ │────────────────▶│ │
│ │ │ │ │─────────────▶│
│ │ │ │ │◀─────────────│
│ │ │ │◀────────────────│ │
│ │ │ │ │ │
│ │ │ │ 6.更新预约状态 │ │
│ │ │ │───────────────────────────────▶│
│ │ │ │ │ │
│ │ │ │ 7.减少预约人数 │ │
│ │ │ │───────────────────────────────▶│
│ │ │ │ │ │
│ │ │ │ 8.处理候补队列 │ │
│ │ │ │───────────────────────────────▶│
│ │ │ │◀───────────────────────────────│
│ │ │ │ │ │
│ │ │ │ 9.发送取消通知 │ │
│ │◀─────────│◀─────────────│ │ │
│ │ 返回取消成功│ │ │ │
│ │ │ │ │ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```