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