## Why 当前代理在后台创建订单时存在严重的逻辑漏洞:缺少参数验证、权限检查不完整、后台和 H5 端共用同一个 Service 方法,导致代理可以在钱包余额不足时创建"待支付"状态的订单,但后台没有支付界面,订单永远无法完成。这是一个关键的业务逻辑缺陷,影响代理订单的正常流转和用户体验。 ## What Changes ### Handler 层修复(短期) - 在 `internal/handler/admin/order.go` 的 `Create()` 方法中添加参数验证(调用 `middleware.ValidateStruct(&req)`) - 在 Handler 层严格检查支付方式:后台只允许 `wallet` 和 `offline`,拒绝其他支付方式 - 修复权限检查逻辑:完整覆盖所有支付方式的权限校验 ### Service 层重构(长期) - **BREAKING**: 拆分 `OrderService.Create()` 方法为两个独立方法: - `CreateAdminOrder()` - 后台订单创建(仅支持 wallet/offline,立即扣款或激活) - `CreateH5Order()` - H5 端订单创建(支持 wallet/wechat/alipay,支持待支付状态) - `CreateAdminOrder()` 逻辑: - wallet 支付:检查余额 → 扣款 → 创建已支付订单 → 激活套餐(一步到位) - offline 支付:直接创建已支付订单 → 激活套餐 - 余额不足直接拒绝,提示"余额不足" - `CreateH5Order()` 逻辑: - wallet 支付:冻结余额 → 创建待支付订单 - wechat/alipay 支付:创建待支付订单 - 混合支付:冻结钱包部分 → 创建待支付订单 ### DTO 层修复 - 创建新的 DTO:`CreateAdminOrderRequest`(仅允许 wallet/offline) - 保留现有 DTO:`CreateOrderRequest`(用于 H5 端,允许 wallet/wechat/alipay) ### 前端修复 - 后台订单创建界面必须传递 `payment_method` 参数 - 下拉框只显示"钱包支付"和"线下支付"选项 ## Capabilities ### New Capabilities - `admin-order-creation`: 后台订单创建流程。包含:参数验证、支付方式限制、钱包余额检查、一步到位扣款逻辑、错误处理。 ### Modified Capabilities - `order-payment`: 修改订单支付流程需求,明确区分后台和 H5 端的支付行为差异(后台立即扣款 vs H5 端支持待支付状态)。 ## Impact **数据模型**: - 无数据库变更 **代码影响**: - `internal/model/dto/order_dto.go`: - 新增 `CreateAdminOrderRequest` 结构体 - 保留 `CreateOrderRequest` 用于 H5 端 - `internal/handler/admin/order.go`: - `Create()` 方法添加参数验证和支付方式检查 - 调用新的 `CreateAdminOrder()` 方法 - `internal/handler/h5/order.go`: - `Create()` 方法调用新的 `CreateH5Order()` 方法 - `internal/service/order/service.go`: - **BREAKING**: 拆分 `Create()` 为 `CreateAdminOrder()` 和 `CreateH5Order()` - `CreateAdminOrder()` 只支持 wallet/offline,立即扣款 - `CreateH5Order()` 保留现有逻辑(支持待支付状态) - `pkg/errors/errors.go`: - 可能新增错误码(如 `CodeInvalidPaymentMethodForAdmin`) **API 影响**: - `POST /api/admin/orders` - 请求参数 DTO 变更(新增 `CreateAdminOrderRequest`) - `POST /api/h5/orders` - 无变更(继续使用 `CreateOrderRequest`) **依赖**: - 无新增依赖 **性能考虑**: - 无性能影响(逻辑重构,不增加额外查询) **测试要求**: - 单元测试: - `CreateAdminOrder()` 方法的各种场景(余额充足、余额不足、支付方式非法) - `CreateH5Order()` 方法的各种场景(保持现有行为) - 集成测试: - 后台创建订单 API(wallet 支付、offline 支付、非法支付方式) - H5 端创建订单 API(保持现有测试) - 回归测试: - 验证 H5 端订单创建流程不受影响 **迁移风险**: - **BREAKING CHANGE**: 后台和 H5 端调用不同的 Service 方法 - 前端需要同步修改(确保传递 `payment_method` 参数) - 部署顺序:先部署后端(向后兼容),再部署前端 **回滚方案**: - 保留原 `Create()` 方法作为 `CreateLegacy()`,出现问题时快速回滚 - 灰度发布:先在测试环境验证,再逐步上线生产环境