22 KiB
22 KiB
阶段5:订单系统
阶段概述
时间: 3.5周
目标: 实现完整的订单管理系统,包括多种商品类型下单、支付、订单状态管理、仓库管理、发货物流等功能
优先级: P1 (高优先级)
详细任务清单
5.1 订单数据模型设计 (3天)
任务描述
设计和实现订单相关的数据模型和基础服务
具体工作
- 设计订单主表数据模型
- 设计订单详情表数据模型
- 设计支付记录表数据模型
- 设计订单状态枚举
- 实现基础的订单服务接口
数据模型设计
// 订单主表
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天)
任务描述
实现订单金额计算功能,包括优惠券抵扣、余额抵扣、积分抵扣等
具体工作
- 实现订单金额计算服务
- 实现优惠券抵扣逻辑
- 实现余额抵扣逻辑
- 实现积分抵扣逻辑
- 实现抽奖限制验证
- 实现购买限制验证
核心接口实现
订单金额计算接口
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
}
}
}
技术实现要点
// 订单计算服务
public interface IOrderCalculationService
{
Task<OrderCalculationResult> CalculateOrderAsync(OrderCalculationRequest request);
Task<bool> ValidateOrderLimitsAsync(int userId, int goodsId, int prizeNum);
Task<List<UserCouponDto>> 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<UserCouponDto> AvailableCoupons { get; set; }
public RestrictionsDto Restrictions { get; set; }
}
5.3 订单创建和支付 (5天)
任务描述
实现订单创建和支付处理功能,支持多种商品类型
具体工作
- 实现一番赏订单创建接口
- 实现无限赏订单金额计算接口
- 实现无限赏订单创建接口
- 实现商城订单金额计算接口
- 实现库存扣减逻辑
- 实现支付处理逻辑
- 实现订单状态更新
- 实现事务处理机制
- 实现订单超时取消
无限赏订单接口
无限赏订单金额计算接口
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": {}
}
}
无限赏订单创建接口
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": {}
}
}
商城订单接口
商城订单金额计算接口
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": {}
}
}
核心接口实现
创建订单接口
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"
}
}
}
}
支付回调接口
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": "支付成功"
}
技术实现要点
// 订单服务
public interface IOrderService
{
Task<CreateOrderResult> CreateOrderAsync(CreateOrderRequest request);
Task<bool> ProcessPaymentAsync(PaymentCallbackRequest request);
Task<bool> 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<CreateOrderResult> 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天)
任务描述
实现订单查询和管理功能
具体工作
- 实现订单列表查询接口
- 实现订单详情查询接口
- 实现订单状态筛选
- 实现订单搜索功能
- 实现订单统计功能
核心接口实现
订单列表接口
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
}
}
}
订单详情接口
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天)
任务描述
实现用户仓库(盒柜)管理功能,包括奖品回收、发货等
具体工作
- 实现仓库首页接口
- 实现奖品回收接口
- 实现奖品发货接口
- 实现确认发货接口
- 实现发货记录查询
- 实现发货记录详情
- 实现回收记录查询
- 实现物流信息查询
核心接口实现
仓库首页接口
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
}
]
}
}
回收奖品接口
POST /api/v1/warehouse/recovery
Authorization: Bearer {token}
Request:
{
"order_list_ids": "20001,20002"
}
Response:
{
"status": 1,
"msg": "回收成功",
"data": {
"recovery_amount": "300.00"
}
}
发货奖品接口
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
}
}
确认发货接口
POST /api/v1/warehouse/send/confirm
Authorization: Bearer {token}
Request:
{
"id": 70001
}
Response:
{
"status": 1,
"msg": "确认成功"
}
发货记录接口
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
}
}
发货记录详情接口
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": {}
}
}
回收记录接口
POST /api/v1/warehouse/recovery/records
Authorization: Bearer {token}
Request:
{
"page": 1
}
Response:
{
"status": 1,
"msg": "请求成功",
"data": {
"data": [],
"last_page": 1
}
}
物流信息接口
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天)
任务描述
实现订单取消和退款功能
具体工作
- 实现订单取消接口
- 实现退款处理逻辑
- 实现库存回滚机制
- 实现资产退还逻辑
- 实现退款状态跟踪
核心接口实现
取消订单接口
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
}
}
}
申请退款接口
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天)
任务描述
实现订单统计和报表功能
具体工作
- 实现订单统计接口
- 实现销售报表功能
- 实现用户消费统计
- 实现商品销售排行
- 实现数据导出功能
核心接口实现
订单统计接口
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"
}
]
}
}
库存管理机制
库存扣减策略
public class InventoryService
{
// 预扣库存
public async Task<bool> 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();
}
}
}
分布式锁机制
public class DistributedLockService
{
public async Task<T> ExecuteWithLockAsync<T>(string lockKey, Func<Task<T>> 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);
}
}
}
支付集成方案
微信支付集成
public class WechatPayService
{
public async Task<WechatPayResult> 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%
风险点和注意事项
技术风险
- 并发控制: 高并发下单时的库存超卖问题
- 事务处理: 复杂业务逻辑的事务一致性
- 支付安全: 支付接口的安全性和可靠性
- 数据一致性: 订单和库存数据的一致性
解决方案
- 分布式锁: 使用Redis分布式锁控制并发
- 事务管理: 合理使用数据库事务
- 支付验证: 严格的支付回调验证机制
- 监控告警: 关键业务指标的实时监控
下一阶段准备
为阶段6准备的内容
- 微信支付SDK集成
- 支付安全机制
- 支付回调处理
- 退款处理机制
交接文档
- 订单系统架构说明
- 库存管理机制文档
- 支付流程说明
- 数据一致性保障方案
阶段5完成标志: 订单系统功能完整,包括订单创建、支付、查询、取消等功能正常运行,库存管理准确,数据一致性得到保障。