正向订单:五种核心类型的深度解析
做电商系统这么多年,我处理过最头疼的订单类型,就是正向订单。说白了,正向订单就是用户正常下单、付款、收货的流程。但你别看它叫「正向」,里面的门道可不少。
今天我就把这五种正向订单掰开揉碎了讲。嗯,都是我在项目中踩过的坑,总结出来的经验。
1. 普通实物订单
这是最基础的订单类型。用户买了个手机,下单、付款、发货、收货。流程简单?其实不然。
核心特征:
- 需要物流配送
- 有库存管理
- 支持退换货
- 涉及运费计算
我遇到过最坑的事,就是库存扣减的时机。用户下单时扣库存,还是付款时扣?
我的建议:付款时扣库存。下单时只锁定库存,付款成功才真正扣减。这样可以避免用户下单不付款导致的库存虚占。
来看看订单状态机的核心代码:
// 普通实物订单状态流转
public enum OrderStatus {
PENDING_PAYMENT, // 待付款
PAYMENT_SUCCESS, // 已付款
SHIPPING, // 发货中
SHIPPED, // 已发货
RECEIVED, // 已收货
COMPLETED, // 已完成
CANCELLED // 已取消
}
2. 虚拟商品订单
虚拟商品,比如会员卡、电子券、游戏点卡。这类订单没有实物,不需要物流。
核心特征:
- 即时交付
- 无需物流
- 通常不可退换
- 需要防刷机制
你想想看,用户买了个视频会员,付款后立刻就能用。如果系统延迟了,用户会直接骂娘。
避坑指南:我曾经因为虚拟商品订单的并发问题,导致同一个兑换码被发放了两次。后来我加了个分布式锁,才彻底解决。
虚拟商品订单的状态机相对简单:
// 虚拟商品订单状态
public enum VirtualOrderStatus {
PENDING_PAYMENT,
PAYMENT_SUCCESS, // 付款后立即发货
DELIVERED, // 已发货(虚拟商品)
COMPLETED,
CANCELLED
}
3. 服务类订单
服务类订单,比如家政保洁、维修、美容。这类订单的特点是:服务时间、服务人员、服务地点都需要协调。
核心特征:
- 需要预约时间
- 涉及服务人员调度
- 可能有上门服务
- 服务完成后才确认
我记得有一次做家政平台,用户下单后,系统需要同时做三件事:扣减服务人员的排期、通知用户确认时间、生成服务工单。这三件事必须在一个事务里完成,否则就会出现时间冲突。
注意:服务类订单的取消策略和实物订单完全不同。用户可能提前2小时取消,也可能服务人员到了门口才取消。每种情况都要有对应的处理逻辑。
服务类订单的状态机:
// 服务类订单状态
public enum ServiceOrderStatus {
PENDING_PAYMENT,
PAYMENT_SUCCESS,
WAITING_SERVICE, // 等待服务
IN_SERVICE, // 服务中
SERVICE_COMPLETED, // 服务完成
EVALUATED, // 已评价
CANCELLED
}
4. 预售订单
预售订单,说白了就是「先交钱,后发货」。常见于新品首发、双11大促。
核心特征:
- 分阶段付款(定金+尾款)
- 发货时间延迟
- 定金通常不退
- 需要库存预留
预售订单的坑,我踩过最大的一个就是:用户付了定金,但尾款支付时系统崩溃了。你想想看,几万人同时付尾款,那流量冲击有多大。
我的经验:预售订单的尾款支付,一定要做异步处理。用户点击支付后,先返回「支付中」,后台慢慢处理。别让用户在那干等。
预售订单的状态机:
// 预售订单状态
public enum PreSaleOrderStatus {
DEPOSIT_PENDING, // 待付定金
DEPOSIT_PAID, // 已付定金
FINAL_PAYMENT_PENDING, // 待付尾款
FINAL_PAYMENT_PAID, // 尾款已付
SHIPPING,
COMPLETED,
CANCELLED
}
5. 定制订单
定制订单,比如定制家具、定制服装。这类订单的特点是:非标品、生产周期长、价格浮动大。
核心特征:
- 需要用户提供定制参数
- 生产周期长
- 通常不支持退换
- 价格按需计算
定制订单最麻烦的地方在于:用户下单后,需要人工审核定制参数。我曾经见过一个系统,用户提交了定制参数后,系统直接自动下单了,结果参数有误,生产出来的东西完全不能用。
切记:定制订单一定要加人工审核环节。系统可以自动校验参数格式,但最终确认必须由人工完成。
定制订单的状态机:
// 定制订单状态
public enum CustomOrderStatus {
PENDING_PAYMENT,
PAYMENT_SUCCESS,
PARAM_REVIEW, // 参数审核中
PARAM_CONFIRMED, // 参数已确认
IN_PRODUCTION, // 生产中
PRODUCTION_COMPLETED, // 生产完成
SHIPPING,
COMPLETED,
CANCELLED
}
五种订单类型的对比
| 维度 | 普通实物 | 虚拟商品 | 服务类 | 预售 | 定制 |
|---|---|---|---|---|---|
| 物流需求 | 是 | 否 | 否(上门服务) | 是 | 是 |
| 库存管理 | 标准库存 | 虚拟库存 | 服务排期 | 预售库存 | 按需生产 |
| 退换策略 | 支持 | 通常不支持 | 按服务规则 | 定金不退 | 不支持 |
| 交付周期 | 1-7天 | 即时 | 预约时间 | 7-30天 | 15-60天 |
核心知识体系
下面这张图,是我梳理的五种正向订单的核心逻辑。你看一眼就能明白它们之间的关系。
这五种订单类型,虽然都是正向订单,但设计思路完全不同。普通实物订单关注库存和物流,虚拟商品关注即时性和防刷,服务类关注排期和调度,预售关注资金流和库存预留,定制关注参数审核和生产周期。
做系统设计时,我建议你先把订单类型分清楚,再针对每种类型设计对应的状态机和业务流程。别想着一个订单模型通吃所有场景,那只会让你后期改到崩溃。
最后说一句:订单系统的核心,就是状态机的设计。状态机设计好了,后面的所有逻辑都顺了。状态机设计不好,你后面每加一个功能都要改一遍状态流转。嗯,我吃过这个亏。