372 lines
8.4 KiB
Markdown
372 lines
8.4 KiB
Markdown
|
|
# ✅ 方案A准备就绪
|
|||
|
|
|
|||
|
|
**完成日期**: 2026-01-23
|
|||
|
|
**前置条件**: ✅ 方案B(钱包支付)已完成
|
|||
|
|
**当前状态**: 📋 设计完成,准备实施
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 方案A概述
|
|||
|
|
|
|||
|
|
**目标**: 实现次卡、套餐、优惠券、地址关联功能
|
|||
|
|
|
|||
|
|
**范围**:
|
|||
|
|
1. ✅ 次卡支付功能
|
|||
|
|
2. ✅ 套餐支付功能
|
|||
|
|
3. ✅ 优惠券使用功能
|
|||
|
|
4. ✅ 地址关联功能
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📋 已完成工作
|
|||
|
|
|
|||
|
|
### 1. 设计文档 ✅
|
|||
|
|
|
|||
|
|
**总体方案**:
|
|||
|
|
- `peidu/docs/fixes/2026-01-23-方案A其他支付方式实施/README.md`
|
|||
|
|
- 实施范围
|
|||
|
|
- 现状分析
|
|||
|
|
- 实施策略
|
|||
|
|
- 支付方式优先级
|
|||
|
|
- 关键技术点
|
|||
|
|
|
|||
|
|
**数据库设计**:
|
|||
|
|
- `peidu/docs/fixes/2026-01-23-方案A其他支付方式实施/📋数据库设计.md`
|
|||
|
|
- 订单表扩展(9个新字段)
|
|||
|
|
- 优惠券表(coupon)
|
|||
|
|
- 用户优惠券表(user_coupon)
|
|||
|
|
- 用户地址表(user_address)
|
|||
|
|
- 用户套餐表(user_package)
|
|||
|
|
- 数据完整性约束
|
|||
|
|
|
|||
|
|
### 2. SQL脚本 ✅
|
|||
|
|
|
|||
|
|
**数据库脚本**:
|
|||
|
|
- `peidu/sql/plan_a_payment_system_database_2026-01-23.sql`
|
|||
|
|
- 扩展订单表(添加支付方式相关字段)
|
|||
|
|
- 创建优惠券表
|
|||
|
|
- 创建用户优惠券表
|
|||
|
|
- 创建用户地址表
|
|||
|
|
- 创建用户套餐表
|
|||
|
|
- 插入测试数据
|
|||
|
|
|
|||
|
|
**执行批处理**:
|
|||
|
|
- `peidu/sql/执行方案A数据库脚本.bat`
|
|||
|
|
- 一键执行SQL脚本
|
|||
|
|
- 自动验证执行结果
|
|||
|
|
|
|||
|
|
### 3. 实施指南 ✅
|
|||
|
|
|
|||
|
|
**快速开始指南**:
|
|||
|
|
- `peidu/🚀立即开始-方案A实施-2026-01-23.md`
|
|||
|
|
- 第一步:执行数据库脚本
|
|||
|
|
- 第二步:后端代码实现
|
|||
|
|
- 第三步:前端页面实现
|
|||
|
|
- 支付流程示例
|
|||
|
|
- 实施进度跟踪
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔍 现状分析
|
|||
|
|
|
|||
|
|
### 已有功能 ✅
|
|||
|
|
|
|||
|
|
1. **TimeCard实体** - 完整实现
|
|||
|
|
- 包含总时长、已使用、剩余时长字段
|
|||
|
|
- 有状态管理(未激活、进行中、已完成、已过期)
|
|||
|
|
- 有可用性检查方法
|
|||
|
|
|
|||
|
|
2. **Package实体** - 基本实现
|
|||
|
|
- 包含套餐基本信息
|
|||
|
|
- 需要扩展用户套餐表(UserPackage)
|
|||
|
|
|
|||
|
|
3. **订单完成扣减** - 已实现
|
|||
|
|
- `completeService`方法中已有时卡扣减逻辑
|
|||
|
|
- `completeService`方法中已有套餐扣减逻辑
|
|||
|
|
|
|||
|
|
### 缺失功能 ❌
|
|||
|
|
|
|||
|
|
1. **支付时使用次卡/套餐** - 未实现
|
|||
|
|
- `payOrder`方法只支持钱包支付
|
|||
|
|
- 需要扩展支持次卡/套餐作为支付方式
|
|||
|
|
|
|||
|
|
2. **优惠券系统** - 未实现
|
|||
|
|
- 缺少Coupon、UserCoupon实体
|
|||
|
|
- 缺少优惠券服务和控制器
|
|||
|
|
|
|||
|
|
3. **地址管理** - 未实现
|
|||
|
|
- 缺少UserAddress实体
|
|||
|
|
- 缺少地址服务和控制器
|
|||
|
|
- 订单未关联地址
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 数据库设计亮点
|
|||
|
|
|
|||
|
|
### 1. 订单表扩展(9个新字段)
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
-- 支付方式相关
|
|||
|
|
payment_method VARCHAR(50) -- 支付方式
|
|||
|
|
wallet_amount DECIMAL(10,2) -- 钱包支付金额
|
|||
|
|
timecard_id BIGINT -- 使用的次卡ID
|
|||
|
|
package_id BIGINT -- 使用的套餐ID
|
|||
|
|
coupon_id BIGINT -- 使用的优惠券ID
|
|||
|
|
coupon_discount DECIMAL(10,2) -- 优惠券折扣金额
|
|||
|
|
service_address_id BIGINT -- 服务地址ID
|
|||
|
|
|
|||
|
|
-- 金额相关
|
|||
|
|
original_amount DECIMAL(10,2) -- 原价
|
|||
|
|
discount_amount DECIMAL(10,2) -- 总折扣金额
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 优惠券系统(2张表)
|
|||
|
|
|
|||
|
|
- **coupon** - 优惠券模板表
|
|||
|
|
- 支持满减券、折扣券、代金券
|
|||
|
|
- 支持金额折扣和比例折扣
|
|||
|
|
- 支持最低消费限制
|
|||
|
|
- 支持最大折扣限制
|
|||
|
|
|
|||
|
|
- **user_coupon** - 用户优惠券表
|
|||
|
|
- 记录领取时间
|
|||
|
|
- 记录使用时间
|
|||
|
|
- 记录过期时间
|
|||
|
|
- 支持状态管理(未使用、已使用、已过期)
|
|||
|
|
|
|||
|
|
### 3. 地址管理(1张表)
|
|||
|
|
|
|||
|
|
- **user_address** - 用户地址表
|
|||
|
|
- 支持多地址管理
|
|||
|
|
- 支持默认地址设置
|
|||
|
|
- 支持地址标签(家、公司、学校)
|
|||
|
|
- 支持经纬度坐标
|
|||
|
|
|
|||
|
|
### 4. 用户套餐(1张表)
|
|||
|
|
|
|||
|
|
- **user_package** - 用户套餐表
|
|||
|
|
- 记录购买的套餐
|
|||
|
|
- 记录总课时和剩余课时
|
|||
|
|
- 记录服务次数和剩余次数
|
|||
|
|
- 支持过期管理
|
|||
|
|
- 使用乐观锁防并发
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔄 支付方式优先级
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1. 优惠券折扣(先计算折扣)
|
|||
|
|
2. 次卡/套餐(优先使用,免费)
|
|||
|
|
3. 钱包余额(次选)
|
|||
|
|
4. 第三方支付(最后)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 支付逻辑示例
|
|||
|
|
|
|||
|
|
**场景1:使用次卡支付**
|
|||
|
|
```
|
|||
|
|
订单金额: 100元
|
|||
|
|
用户选择: 次卡支付
|
|||
|
|
结果:
|
|||
|
|
- 不扣款
|
|||
|
|
- 订单完成后扣减次卡次数
|
|||
|
|
- 支付状态: 已支付
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**场景2:使用套餐支付**
|
|||
|
|
```
|
|||
|
|
订单金额: 100元
|
|||
|
|
用户选择: 套餐支付
|
|||
|
|
结果:
|
|||
|
|
- 不扣款
|
|||
|
|
- 订单完成后扣减套餐课时
|
|||
|
|
- 支付状态: 已支付
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**场景3:使用优惠券+钱包**
|
|||
|
|
```
|
|||
|
|
订单原价: 100元
|
|||
|
|
优惠券: 满100减20
|
|||
|
|
实付金额: 80元
|
|||
|
|
支付方式: 钱包
|
|||
|
|
结果:
|
|||
|
|
- 扣减钱包80元
|
|||
|
|
- 优惠券标记为已使用
|
|||
|
|
- 支付状态: 已支付
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📅 实施计划
|
|||
|
|
|
|||
|
|
### Day 1: 数据库设计与扩展 ⏳
|
|||
|
|
- [x] 设计表结构
|
|||
|
|
- [x] 编写SQL脚本
|
|||
|
|
- [ ] 执行数据库变更
|
|||
|
|
- [ ] 验证数据完整性
|
|||
|
|
|
|||
|
|
### Day 2-3: 优惠券和地址系统 ⏳
|
|||
|
|
- [ ] 实现Coupon、UserCoupon实体
|
|||
|
|
- [ ] 实现CouponService、CouponController
|
|||
|
|
- [ ] 实现UserAddress实体
|
|||
|
|
- [ ] 实现UserAddressService、UserAddressController
|
|||
|
|
- [ ] 单元测试
|
|||
|
|
|
|||
|
|
### Day 4-5: 订单支付扩展 ⏳
|
|||
|
|
- [ ] 扩展payOrder方法
|
|||
|
|
- [ ] 实现次卡/套餐支付逻辑
|
|||
|
|
- [ ] 实现优惠券使用逻辑
|
|||
|
|
- [ ] 实现地址关联逻辑
|
|||
|
|
- [ ] 集成测试
|
|||
|
|
|
|||
|
|
### Day 6-7: 前端实现 ⏳
|
|||
|
|
- [ ] 支付方式选择页面
|
|||
|
|
- [ ] 优惠券选择页面
|
|||
|
|
- [ ] 地址选择页面
|
|||
|
|
- [ ] 前后端联调
|
|||
|
|
|
|||
|
|
### Day 8: 测试与验证 ⏳
|
|||
|
|
- [ ] 完整流程测试
|
|||
|
|
- [ ] 性能测试
|
|||
|
|
- [ ] 用户验收测试
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 成功标准
|
|||
|
|
|
|||
|
|
### 功能完整性
|
|||
|
|
- ✅ 支持次卡支付
|
|||
|
|
- ✅ 支持套餐支付
|
|||
|
|
- ✅ 支持优惠券使用
|
|||
|
|
- ✅ 支持地址关联
|
|||
|
|
- ✅ 支持组合支付
|
|||
|
|
|
|||
|
|
### 数据准确性
|
|||
|
|
- ✅ 金额计算正确
|
|||
|
|
- ✅ 次卡扣减正确
|
|||
|
|
- ✅ 套餐扣减正确
|
|||
|
|
- ✅ 优惠券使用正确
|
|||
|
|
|
|||
|
|
### 用户体验
|
|||
|
|
- ✅ 支付流程顺畅
|
|||
|
|
- ✅ 错误提示清晰
|
|||
|
|
- ✅ 响应速度快
|
|||
|
|
- ✅ 界面友好
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📞 下一步行动
|
|||
|
|
|
|||
|
|
### 立即执行 ⏳
|
|||
|
|
|
|||
|
|
1. **执行数据库脚本**
|
|||
|
|
```bash
|
|||
|
|
cd peidu/sql
|
|||
|
|
执行方案A数据库脚本.bat
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **验证数据库表**
|
|||
|
|
```sql
|
|||
|
|
USE peixue;
|
|||
|
|
SHOW TABLES LIKE 'coupon';
|
|||
|
|
SHOW TABLES LIKE 'user_coupon';
|
|||
|
|
SHOW TABLES LIKE 'user_address';
|
|||
|
|
SHOW TABLES LIKE 'user_package';
|
|||
|
|
DESC `order`;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **开始后端实现**
|
|||
|
|
- 参考 `peidu/🚀立即开始-方案A实施-2026-01-23.md`
|
|||
|
|
- 优先实现优惠券系统
|
|||
|
|
- 然后实现地址管理
|
|||
|
|
- 最后扩展订单支付
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📁 相关文档
|
|||
|
|
|
|||
|
|
### 设计文档
|
|||
|
|
- `peidu/docs/fixes/2026-01-23-方案A其他支付方式实施/README.md` - 总体方案
|
|||
|
|
- `peidu/docs/fixes/2026-01-23-方案A其他支付方式实施/📋数据库设计.md` - 数据库设计
|
|||
|
|
|
|||
|
|
### SQL脚本
|
|||
|
|
- `peidu/sql/plan_a_payment_system_database_2026-01-23.sql` - 数据库脚本
|
|||
|
|
- `peidu/sql/执行方案A数据库脚本.bat` - 执行批处理
|
|||
|
|
|
|||
|
|
### 实施指南
|
|||
|
|
- `peidu/🚀立即开始-方案A实施-2026-01-23.md` - 快速开始指南
|
|||
|
|
- `peidu/✅方案A准备就绪-2026-01-23.md` - 本文件
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 💡 关键发现
|
|||
|
|
|
|||
|
|
### 1. 次卡/套餐支付特点
|
|||
|
|
|
|||
|
|
- **支付时不扣款**:只标记订单已支付
|
|||
|
|
- **完成时扣减**:在`completeService`中扣减次数/课时
|
|||
|
|
- **余额检查**:支付前检查次卡/套餐是否可用
|
|||
|
|
|
|||
|
|
### 2. 优惠券使用
|
|||
|
|
|
|||
|
|
- **金额计算**:原价 - 优惠券折扣 = 实付金额
|
|||
|
|
- **状态更新**:优惠券标记为已使用
|
|||
|
|
- **过期检查**:使用前检查是否过期
|
|||
|
|
|
|||
|
|
### 3. 地址关联
|
|||
|
|
|
|||
|
|
- **订单创建时选择地址**
|
|||
|
|
- **陪伴员查看服务地址**
|
|||
|
|
- **支持地址导航**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ⚠️ 注意事项
|
|||
|
|
|
|||
|
|
### 1. 数据一致性
|
|||
|
|
- 所有支付操作必须使用事务
|
|||
|
|
- 失败时必须回滚
|
|||
|
|
- 记录详细的操作日志
|
|||
|
|
|
|||
|
|
### 2. 并发控制
|
|||
|
|
- 次卡/套餐扣减使用乐观锁
|
|||
|
|
- 优惠券使用防止重复
|
|||
|
|
- 防止重复支付
|
|||
|
|
|
|||
|
|
### 3. 安全性
|
|||
|
|
- 支付金额必须在后端计算
|
|||
|
|
- 前端传递的金额仅供显示
|
|||
|
|
- 验证用户权限
|
|||
|
|
|
|||
|
|
### 4. 用户体验
|
|||
|
|
- 支付失败时给出明确提示
|
|||
|
|
- 余额不足时提示购买
|
|||
|
|
- 优惠券过期时提示
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 总结
|
|||
|
|
|
|||
|
|
✅ **设计完成**:
|
|||
|
|
- 数据库设计完整
|
|||
|
|
- SQL脚本已准备
|
|||
|
|
- 实施指南已完成
|
|||
|
|
|
|||
|
|
⏳ **待完成工作**:
|
|||
|
|
- 执行数据库脚本
|
|||
|
|
- 后端代码实现
|
|||
|
|
- 前端页面实现
|
|||
|
|
- 完整测试验证
|
|||
|
|
|
|||
|
|
🚀 **准备就绪**:
|
|||
|
|
- 所有设计文档已完成
|
|||
|
|
- SQL脚本可以立即执行
|
|||
|
|
- 实施计划清晰明确
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**完成时间**: 2026-01-23
|
|||
|
|
**当前状态**: 设计完成,准备实施
|
|||
|
|
**下一步**: 执行数据库脚本 → 后端实现 → 前端实现 → 测试验证
|