# 阶段5:订单系统 ## 阶段概述 **时间**: 3.5周 **目标**: 实现完整的订单管理系统,包括多种商品类型下单、支付、订单状态管理、仓库管理、发货物流等功能 **优先级**: P1 (高优先级) ## 详细任务清单 ### 5.1 订单数据模型设计 (3天) #### 任务描述 设计和实现订单相关的数据模型和基础服务 #### 具体工作 - [ ] 设计订单主表数据模型 - [ ] 设计订单详情表数据模型 - [ ] 设计支付记录表数据模型 - [ ] 设计订单状态枚举 - [ ] 实现基础的订单服务接口 #### 数据模型设计 ```csharp // 订单主表 public class Order { public int Id { get; set; } public string OrderNo { get; set; } public int UserId { get; set; } public int GoodsId { get; set; } public int Num { get; set; } public string GoodsTitle { get; set; } public string GoodsImgUrl { get; set; } public int OrderType { get; set; } public decimal Price { get; set; } public decimal OrderTotal { get; set; } public decimal OrderZheTotal { get; set; } public decimal UseMoney { get; set; } public decimal UseIntegral { get; set; } public decimal UseMoney2 { get; set; } public int CouponId { get; set; } public decimal CouponMoney { get; set; } public int PayType { get; set; } public int Status { get; set; } public int PrizeNum { get; set; } public string PayNo { get; set; } public DateTime? PayTime { get; set; } public DateTime AddTime { get; set; } public DateTime? UpdateTime { get; set; } } // 订单详情表 public class OrderList { public int Id { get; set; } public string OrderId { get; set; } public int UserId { get; set; } public int GoodsId { get; set; } public int Num { get; set; } public int GoodsListId { get; set; } public string GoodsListTitle { get; set; } public string GoodsListImgUrl { get; set; } public int ShangId { get; set; } public int OrderType { get; set; } public int Source { get; set; } public decimal Price { get; set; } public DateTime AddTime { get; set; } } // 支付记录表 public class ProfitPay { public int Id { get; set; } public int UserId { get; set; } public decimal ChangeMoney { get; set; } public string Content { get; set; } public string OrderNo { get; set; } public int PayType { get; set; } public DateTime AddTime { get; set; } } // 订单状态枚举 public enum OrderStatus { Pending = 0, // 待支付 Paid = 1, // 已支付 Cancelled = 2, // 已取消 Refunded = 3 // 已退款 } // 支付类型枚举 public enum PayType { Wechat = 1, // 微信支付 Balance = 2, // 余额支付 Integral = 3, // 积分支付 Mixed = 4 // 混合支付 } ``` ### 5.2 订单金额计算 (4天) #### 任务描述 实现订单金额计算功能,包括优惠券抵扣、余额抵扣、积分抵扣等 #### 具体工作 - [ ] 实现订单金额计算服务 - [ ] 实现优惠券抵扣逻辑 - [ ] 实现余额抵扣逻辑 - [ ] 实现积分抵扣逻辑 - [ ] 实现抽奖限制验证 - [ ] 实现购买限制验证 #### 核心接口实现 ##### 订单金额计算接口 ```http POST /api/v1/order/calculate Authorization: Bearer {token} Content-Type: application/json Request: { "goods_id": 123, "goods_num": 1, "prize_num": 3, "use_money_is": 1, "use_integral_is": 1, "use_money2_is": 0, "coupon_id": 456 } Response: { "status": 1, "msg": "请求成功", "data": { "goods_info": { "id": 123, "title": "商品标题", "price": "10.00", "type": 1 }, "calculation": { "original_amount": "30.00", "coupon_discount": "5.00", "balance_deduction": "10.00", "integral_deduction": "5.00", "final_amount": "10.00", "wechat_pay_amount": "10.00" }, "user_assets": { "balance": "100.00", "integral": "200.00", "money2": "50.00" }, "available_coupons": [ { "id": 456, "title": "优惠券标题", "discount": "5.00", "min_amount": "20.00" } ], "restrictions": { "can_purchase": true, "daily_limit": 10, "daily_used": 3, "global_limit": 100, "global_used": 50 } } } ``` #### 技术实现要点 ```csharp // 订单计算服务 public interface IOrderCalculationService { Task CalculateOrderAsync(OrderCalculationRequest request); Task ValidateOrderLimitsAsync(int userId, int goodsId, int prizeNum); Task> GetAvailableCouponsAsync(int userId, decimal amount); } // 订单计算请求 public class OrderCalculationRequest { public int UserId { get; set; } public int GoodsId { get; set; } public int GoodsNum { get; set; } public int PrizeNum { get; set; } public bool UseBalance { get; set; } public bool UseIntegral { get; set; } public bool UseMoney2 { get; set; } public int CouponId { get; set; } } // 订单计算结果 public class OrderCalculationResult { public GoodsInfoDto GoodsInfo { get; set; } public CalculationDto Calculation { get; set; } public UserAssetsDto UserAssets { get; set; } public List AvailableCoupons { get; set; } public RestrictionsDto Restrictions { get; set; } } ``` ### 5.3 订单创建和支付 (5天) #### 任务描述 实现订单创建和支付处理功能,支持多种商品类型 #### 具体工作 - [ ] 实现一番赏订单创建接口 - [ ] 实现无限赏订单金额计算接口 - [ ] 实现无限赏订单创建接口 - [ ] 实现商城订单金额计算接口 - [ ] 实现库存扣减逻辑 - [ ] 实现支付处理逻辑 - [ ] 实现订单状态更新 - [ ] 实现事务处理机制 - [ ] 实现订单超时取消 #### 无限赏订单接口 ##### 无限赏订单金额计算接口 ```http POST /api/v1/order/infinite/calculate Authorization: Bearer {token} Content-Type: application/json Request: { "goods_id": 1001, "prize_num": 1, "use_money_is": 2, "use_integral_is": 2, "use_money2_is": 2, "coupon_id": "" } Response: { "status": 1, "msg": "请求成功", "data": { "goods_info": {}, "calculation": {}, "user_assets": {} } } ``` ##### 无限赏订单创建接口 ```http POST /api/v1/order/infinite/create Authorization: Bearer {token} Content-Type: application/json Request: { "goods_id": 1001, "prize_num": 1, "use_money_is": 2, "use_integral_is": 2, "use_money2_is": 2, "coupon_id": "" } Response: { "status": 1, "msg": "订单创建成功", "data": { "order_no": "ORD202401010001", "pay_info": {} } } ``` #### 商城订单接口 ##### 商城订单金额计算接口 ```http POST /api/v1/order/mall/calculate Authorization: Bearer {token} Content-Type: application/json Request: { "goods_id": 1001, "prize_num": 1, "goods_num": 1, "use_money_is": 2, "use_integral_is": 2, "use_money2_is": 2 } Response: { "status": 1, "msg": "请求成功", "data": { "goods_info": {}, "calculation": {}, "user_assets": {} } } ``` #### 核心接口实现 ##### 创建订单接口 ```http POST /api/v1/order/create Authorization: Bearer {token} Content-Type: application/json Request: { "goods_id": 123, "goods_num": 1, "prize_num": 3, "use_money_is": 1, "use_integral_is": 1, "use_money2_is": 0, "coupon_id": 456, "pay_type": 1 } Response: { "status": 1, "msg": "订单创建成功", "data": { "order_no": "ORD202401010001", "order_id": 789, "pay_info": { "pay_type": 1, "amount": "10.00", "wechat_pay_params": { "appId": "wx1234567890", "timeStamp": "1704067200", "nonceStr": "abc123", "package": "prepay_id=wx123456789", "signType": "RSA", "paySign": "signature" } } } } ``` ##### 支付回调接口 ```http POST /api/v1/order/payment/callback Content-Type: application/json Request: { "order_no": "ORD202401010001", "pay_no": "wx_pay_123456", "pay_status": "SUCCESS", "pay_amount": "10.00", "pay_time": "2024-01-01T12:00:00Z" } Response: { "status": 1, "msg": "支付成功" } ``` #### 技术实现要点 ```csharp // 订单服务 public interface IOrderService { Task CreateOrderAsync(CreateOrderRequest request); Task ProcessPaymentAsync(PaymentCallbackRequest request); Task CancelExpiredOrdersAsync(); } // 订单创建请求 public class CreateOrderRequest { public int UserId { get; set; } public int GoodsId { get; set; } public int GoodsNum { get; set; } public int PrizeNum { get; set; } public bool UseBalance { get; set; } public bool UseIntegral { get; set; } public bool UseMoney2 { get; set; } public int CouponId { get; set; } public int PayType { get; set; } } // 订单创建结果 public class CreateOrderResult { public string OrderNo { get; set; } public int OrderId { get; set; } public PaymentInfoDto PayInfo { get; set; } } // 订单创建服务实现 public class OrderService : IOrderService { public async Task CreateOrderAsync(CreateOrderRequest request) { using var transaction = await _context.Database.BeginTransactionAsync(); try { // 1. 验证商品和库存 // 2. 计算订单金额 // 3. 扣减用户资产 // 4. 创建订单记录 // 5. 处理支付 await transaction.CommitAsync(); return result; } catch { await transaction.RollbackAsync(); throw; } } } ``` ### 5.4 订单查询管理 (3天) #### 任务描述 实现订单查询和管理功能 #### 具体工作 - [ ] 实现订单列表查询接口 - [ ] 实现订单详情查询接口 - [ ] 实现订单状态筛选 - [ ] 实现订单搜索功能 - [ ] 实现订单统计功能 #### 核心接口实现 ##### 订单列表接口 ```http GET /api/v1/user/orders Authorization: Bearer {token} Query Parameters: - status: 订单状态 (0=待支付, 1=已支付, 2=已取消) - page: 页码 - limit: 每页数量 Response: { "status": 1, "msg": "请求成功", "data": { "data": [ { "id": 789, "order_no": "ORD202401010001", "goods_title": "商品标题", "goods_imgurl": "https://example.com/goods.jpg", "order_total": "30.00", "final_amount": "10.00", "status": 1, "status_text": "已支付", "prize_num": 3, "pay_type": 1, "pay_type_text": "微信支付", "add_time": "2024-01-01 12:00:00", "pay_time": "2024-01-01 12:05:00" } ], "last_page": 5, "statistics": { "total_orders": 100, "total_amount": "1000.00", "pending_orders": 5, "paid_orders": 90, "cancelled_orders": 5 } } } ``` ##### 订单详情接口 ```http GET /api/v1/order/{orderNo} Authorization: Bearer {token} Response: { "status": 1, "msg": "请求成功", "data": { "order_info": { "id": 789, "order_no": "ORD202401010001", "goods_id": 123, "goods_title": "商品标题", "goods_imgurl": "https://example.com/goods.jpg", "goods_num": 1, "order_type": 1, "price": "10.00", "order_total": "30.00", "use_money": "10.00", "use_integral": "5.00", "coupon_money": "5.00", "final_amount": "10.00", "status": 1, "status_text": "已支付", "prize_num": 3, "pay_type": 1, "pay_type_text": "微信支付", "pay_no": "wx_pay_123456", "add_time": "2024-01-01 12:00:00", "pay_time": "2024-01-01 12:05:00" }, "prize_list": [ { "id": 456, "goodslist_title": "奖品标题", "goodslist_imgurl": "https://example.com/prize.jpg", "shang_id": 10, "shang_title": "A赏", "shang_color": "#FF0000", "price": "100.00" } ], "payment_records": [ { "pay_type": 1, "pay_type_text": "微信支付", "amount": "10.00", "pay_time": "2024-01-01 12:05:00" } ] } } ``` ### 5.5 仓库/盒柜管理 (4天) #### 任务描述 实现用户仓库(盒柜)管理功能,包括奖品回收、发货等 #### 具体工作 - [ ] 实现仓库首页接口 - [ ] 实现奖品回收接口 - [ ] 实现奖品发货接口 - [ ] 实现确认发货接口 - [ ] 实现发货记录查询 - [ ] 实现发货记录详情 - [ ] 实现回收记录查询 - [ ] 实现物流信息查询 #### 核心接口实现 ##### 仓库首页接口 ```http POST /api/v1/warehouse/index Authorization: Bearer {token} Request: { "page": 1, "status": 0 } Response: { "status": 1, "msg": "请求成功", "data": { "data": [ { "id": 20001, "goodslist_title": "限定手办A", "goodslist_imgurl": "https://example.com/prize.jpg", "goodslist_price": "299.00", "goodslist_money": "150.00", "status": 0, "addtime": 1640995300 } ] } } ``` ##### 回收奖品接口 ```http POST /api/v1/warehouse/recovery Authorization: Bearer {token} Request: { "order_list_ids": "20001,20002" } Response: { "status": 1, "msg": "回收成功", "data": { "recovery_amount": "300.00" } } ``` ##### 发货奖品接口 ```http POST /api/v1/warehouse/send Authorization: Bearer {token} Request: { "order_list_ids": "20001,20002", "name": "张三", "mobile": "13800138000", "address": "北京市朝阳区xxx街道xxx号", "message": "请小心轻放" } Response: { "status": 1, "msg": "发货申请成功", "data": { "delivery_id": 70001 } } ``` ##### 确认发货接口 ```http POST /api/v1/warehouse/send/confirm Authorization: Bearer {token} Request: { "id": 70001 } Response: { "status": 1, "msg": "确认成功" } ``` ##### 发货记录接口 ```http POST /api/v1/warehouse/send/records Authorization: Bearer {token} Request: { "page": 1 } Response: { "status": 1, "msg": "请求成功", "data": { "data": [ { "id": 70001, "name": "张三", "mobile": "138****8000", "address": "北京市朝阳区xxx", "status": 1, "addtime": "2024-01-01 12:00:00" } ], "last_page": 3 } } ``` ##### 发货记录详情接口 ```http POST /api/v1/warehouse/send/detail Authorization: Bearer {token} Request: { "id": 70001 } Response: { "status": 1, "msg": "请求成功", "data": { "id": 70001, "name": "张三", "mobile": "13800138000", "address": "北京市朝阳区xxx街道xxx号", "status": 1, "items": [], "logistics": {} } } ``` ##### 回收记录接口 ```http POST /api/v1/warehouse/recovery/records Authorization: Bearer {token} Request: { "page": 1 } Response: { "status": 1, "msg": "请求成功", "data": { "data": [], "last_page": 1 } } ``` ##### 物流信息接口 ```http POST /api/v1/warehouse/logistics Authorization: Bearer {token} Request: { "id": 70001 } Response: { "status": 1, "msg": "请求成功", "data": { "company": "顺丰速运", "tracking_no": "SF1234567890", "status": "已签收", "traces": [ { "time": "2024-01-03 10:00:00", "content": "已签收" } ] } } ``` ### 5.6 订单取消和退款 (3天) #### 任务描述 实现订单取消和退款功能 #### 具体工作 - [ ] 实现订单取消接口 - [ ] 实现退款处理逻辑 - [ ] 实现库存回滚机制 - [ ] 实现资产退还逻辑 - [ ] 实现退款状态跟踪 #### 核心接口实现 ##### 取消订单接口 ```http POST /api/v1/order/{orderNo}/cancel Authorization: Bearer {token} Content-Type: application/json Request: { "reason": "用户主动取消" } Response: { "status": 1, "msg": "订单取消成功", "data": { "refund_info": { "refund_amount": "10.00", "refund_balance": "10.00", "refund_integral": "5.00", "refund_coupon": true } } } ``` ##### 申请退款接口 ```http POST /api/v1/order/{orderNo}/refund Authorization: Bearer {token} Content-Type: application/json Request: { "reason": "商品质量问题", "description": "详细说明" } Response: { "status": 1, "msg": "退款申请提交成功", "data": { "refund_no": "REF202401010001", "estimated_time": "1-3个工作日" } } ``` ### 5.6 订单统计和报表 (3天) #### 任务描述 实现订单统计和报表功能 #### 具体工作 - [ ] 实现订单统计接口 - [ ] 实现销售报表功能 - [ ] 实现用户消费统计 - [ ] 实现商品销售排行 - [ ] 实现数据导出功能 #### 核心接口实现 ##### 订单统计接口 ```http GET /api/v1/order/statistics Authorization: Bearer {token} Query Parameters: - start_date: 开始日期 - end_date: 结束日期 - type: 统计类型 (daily, weekly, monthly) Response: { "status": 1, "msg": "请求成功", "data": { "summary": { "total_orders": 1000, "total_amount": "10000.00", "total_users": 500, "avg_order_amount": "10.00" }, "daily_data": [ { "date": "2024-01-01", "orders": 50, "amount": "500.00", "users": 30 } ], "top_goods": [ { "goods_id": 123, "goods_title": "热门商品", "orders": 100, "amount": "1000.00" } ] } } ``` ## 库存管理机制 ### 库存扣减策略 ```csharp public class InventoryService { // 预扣库存 public async Task ReserveInventoryAsync(int goodsId, int goodsNum, int quantity) { using var transaction = await _context.Database.BeginTransactionAsync(); try { // 1. 检查库存 var goods = await _context.Goods.FindAsync(goodsId); if (goods.Stock - goods.SaleStock < quantity) { return false; } // 2. 扣减库存 goods.SaleStock += quantity; await _context.SaveChangesAsync(); // 3. 记录库存变更 await RecordInventoryChangeAsync(goodsId, -quantity, "订单预扣"); await transaction.CommitAsync(); return true; } catch { await transaction.RollbackAsync(); throw; } } // 确认扣减库存 public async Task ConfirmInventoryAsync(string orderNo) { // 订单支付成功后确认扣减 // 无需额外操作,预扣已完成 } // 回滚库存 public async Task RollbackInventoryAsync(string orderNo) { // 订单取消时回滚库存 var order = await _context.Orders.FirstOrDefaultAsync(o => o.OrderNo == orderNo); if (order != null) { var goods = await _context.Goods.FindAsync(order.GoodsId); goods.SaleStock -= order.PrizeNum; await _context.SaveChangesAsync(); } } } ``` ### 分布式锁机制 ```csharp public class DistributedLockService { public async Task ExecuteWithLockAsync(string lockKey, Func> action, TimeSpan expiry) { var lockValue = Guid.NewGuid().ToString(); var acquired = await _redis.SetAsync(lockKey, lockValue, expiry, When.NotExists); if (!acquired) { throw new InvalidOperationException("无法获取锁,请稍后重试"); } try { return await action(); } finally { // 释放锁 await ReleaseLockAsync(lockKey, lockValue); } } } ``` ## 支付集成方案 ### 微信支付集成 ```csharp public class WechatPayService { public async Task CreatePaymentAsync(CreatePaymentRequest request) { var unifiedOrderRequest = new UnifiedOrderRequest { AppId = _config.AppId, MchId = _config.MchId, Body = request.Description, OutTradeNo = request.OrderNo, TotalFee = (int)(request.Amount * 100), // 转换为分 SpbillCreateIp = request.ClientIp, NotifyUrl = _config.NotifyUrl, TradeType = "JSAPI", OpenId = request.OpenId }; var response = await _wechatPayClient.UnifiedOrderAsync(unifiedOrderRequest); return new WechatPayResult { AppId = response.AppId, TimeStamp = DateTimeOffset.Now.ToUnixTimeSeconds().ToString(), NonceStr = GenerateNonceStr(), Package = $"prepay_id={response.PrepayId}", SignType = "RSA", PaySign = GeneratePaySign(/* parameters */) }; } } ``` ## 验收标准 ### 功能验收 - [ ] 一番赏订单创建流程完整可用 - [ ] 无限赏订单创建流程完整可用 - [ ] 商城订单创建流程完整可用 - [ ] 订单金额计算准确 - [ ] 支付流程正常 - [ ] 订单查询功能正常 - [ ] 订单取消和退款功能正常 - [ ] 库存管理机制正确 - [ ] 仓库/盒柜管理功能正常 - [ ] 奖品回收功能正常 - [ ] 奖品发货功能正常 - [ ] 物流信息查询正常 ### 性能验收 - [ ] 订单创建接口响应时间 < 1000ms - [ ] 订单查询接口响应时间 < 300ms - [ ] 支持并发下单 > 50 QPS - [ ] 库存扣减准确率 100% ### 数据一致性验收 - [ ] 订单金额计算准确性 100% - [ ] 库存扣减一致性 100% - [ ] 支付状态同步准确性 100% - [ ] 用户资产变更准确性 100% ## 风险点和注意事项 ### 技术风险 1. **并发控制**: 高并发下单时的库存超卖问题 2. **事务处理**: 复杂业务逻辑的事务一致性 3. **支付安全**: 支付接口的安全性和可靠性 4. **数据一致性**: 订单和库存数据的一致性 ### 解决方案 1. **分布式锁**: 使用Redis分布式锁控制并发 2. **事务管理**: 合理使用数据库事务 3. **支付验证**: 严格的支付回调验证机制 4. **监控告警**: 关键业务指标的实时监控 ## 下一阶段准备 ### 为阶段6准备的内容 - [ ] 微信支付SDK集成 - [ ] 支付安全机制 - [ ] 支付回调处理 - [ ] 退款处理机制 ### 交接文档 - [ ] 订单系统架构说明 - [ ] 库存管理机制文档 - [ ] 支付流程说明 - [ ] 数据一致性保障方案 --- **阶段5完成标志**: 订单系统功能完整,包括订单创建、支付、查询、取消等功能正常运行,库存管理准确,数据一致性得到保障。