Skip to content

订单关系表

1. 概述

订单关系表是梵医云系统中用于管理交易订单、订单项、购物车、售后订单等相关数据的核心模块。该模块提供了完整的订单管理体系,包括订单创建、订单支付、订单发货、订单售后、订单分账等功能。

2. 表结构

2.1 交易订单表 (trade_order)

交易订单表是订单模块的核心表,存储订单的基本信息、价格信息、物流信息、售后信息等。

2.1.1 表结构

字段名类型长度允许空默认值说明
idbigint20-订单编号(主键)
novarchar64-订单流水号
pay_merchant_idbigint20NULL支付商户ID
typetinyint4-订单类型
terminaltinyint4-订单来源(1H5 2小程序 3APP)
user_idbigint20-用户编号
user_ipvarchar50NULL用户IP
user_remarkvarchar512NULL用户备注
statustinyint4-订单状态(0待支付 1待发货 2已发货 3已完成 4已取消)
product_countint11-购买的商品数量
finish_timedatetime-NULL订单完成时间
cancel_timedatetime-NULL订单取消时间
cancel_typetinyint4NULL取消类型
remarkvarchar512NULL商家备注
comment_statusbit1b'0'是否评价
brokerage_user_idbigint20NULL推广人编号
pay_order_idbigint20NULL支付订单编号
pay_statusbit1b'0'是否已支付
pay_timedatetime-NULL付款时间
pay_channel_codevarchar32NULL支付渠道
total_priceint11-商品原价(单位:分)
discount_priceint110优惠金额(单位:分)
delivery_priceint110运费金额(单位:分)
adjust_priceint110订单调价(单位:分)
pay_priceint11-应付金额(单位:分)
profit_sharingtinyint40分账状态
delivery_typetinyint4-配送方式(1快递 2自提)
delivery_sub_typetinyint4NULL配送子类型
delivery_batch_idbigint20NULL批量发货ID
delivery_statustinyint4-发货状态
logistics_idbigint200发货物流公司编号
logistics_novarchar64''发货物流单号
delivery_timedatetime-NULL发货时间
receive_timedatetime-NULL收货时间
receiver_namevarchar64-收件人名称
receiver_mobilevarchar32-收件人手机
receiver_area_idint11-收件人地区编号
receiver_detail_addressvarchar512-收件人详细地址
pick_up_store_idbigint20NULL自提门店编号
pick_up_verify_codevarchar64NULL自提核销码
refund_statustinyint4-售后状态
refund_priceint110退款金额(单位:分)
coupon_idbigint20NULL优惠劵编号
coupon_priceint110优惠劵减免金额(单位:分)
use_pointint110使用的积分
point_priceint110积分抵扣的金额(单位:分)
give_pointint110赠送的积分
refund_pointint110退还的使用的积分
vip_priceint110VIP减免金额(单位:分)
seckill_activity_idbigint20NULL秒杀活动编号
bargain_activity_idbigint20NULL砍价活动编号
bargain_record_idbigint20NULL砍价记录编号
combination_activity_idbigint20NULL拼团活动编号
combination_head_idbigint20NULL拼团团长编号
combination_record_idbigint20NULL拼团记录编号
is_prescriptiontinyint4NULL是否是处方药
store_idvarchar512NULL门店id
tihuo_statustinyint4NULL提货状态
prescription_idbigint20NULL处方单ID
prescription_resultvarchar512NULL处方签结果
old_user_idbigint20NULL转单时的旧用户ID
service_codevarchar64NULL服务号
promo_codevarchar64NULL营销代码
creatorvarchar64''创建者
create_timedatetime-CURRENT_TIMESTAMP创建时间
updatervarchar64''更新者
update_timedatetime-CURRENT_TIMESTAMP更新时间
deletedbit1b'0'是否删除

2.1.2 索引

索引名类型字段说明
PRIMARY主键id主键索引
uk_no唯一no订单流水号唯一索引
idx_user_id普通user_id用户索引
idx_status普通status订单状态索引
idx_pay_status普通pay_status支付状态索引
idx_delivery_status普通delivery_status发货状态索引

2.1.3 Java 实体类

java
@TableName("trade_order")
@KeySequence("trade_order_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TradeOrderDO extends BaseDO {

    public static final Long LOGISTICS_ID_NULL = 0L;

    @TableId
    private Long id;
    private String no;
    private Long payMerchantId;
    private Integer type;
    private Integer terminal;
    private Long userId;
    private String userIp;
    private String userRemark;
    private Integer status;
    private Integer productCount;
    private LocalDateTime finishTime;
    private LocalDateTime cancelTime;
    private Integer cancelType;
    private String remark;
    private Boolean commentStatus;
    private Long brokerageUserId;
    private Long payOrderId;
    private Boolean payStatus;
    private LocalDateTime payTime;
    private String payChannelCode;
    private Integer totalPrice;
    private Integer discountPrice;
    private Integer deliveryPrice;
    private Integer adjustPrice;
    private Integer payPrice;
    private Integer profitSharing;
    private Integer deliveryType;
    private DeliverySubTypeEnum deliverySubType;
    private Long deliveryBatchId;
    private TradeOrderDeliveryStatus deliveryStatus;
    private Long logisticsId;
    private String logisticsNo;
    private LocalDateTime deliveryTime;
    private LocalDateTime receiveTime;
    private String receiverName;
    private String receiverMobile;
    private Integer receiverAreaId;
    private String receiverDetailAddress;
    private Long pickUpStoreId;
    private String pickUpVerifyCode;
    private Integer refundStatus;
    private Integer refundPrice;
    private Long couponId;
    private Integer couponPrice;
    private Integer usePoint;
    private Integer pointPrice;
    private Integer givePoint;
    private Integer refundPoint;
    private Integer vipPrice;
    private Long seckillActivityId;
    private Long bargainActivityId;
    private Long bargainRecordId;
    private Long combinationActivityId;
    private Long combinationHeadId;
    private Long combinationRecordId;
    private Integer isPrescription;
    private String storeId;
    private Integer tihuoStatus;
    private Long prescriptionId;
    private String prescriptionResult;
    private Long oldUserId;
    private String serviceCode;
    private String promoCode;
}

2.2 交易订单项表 (trade_order_item)

交易订单项表用于存储订单中的商品明细信息。

2.2.1 表结构

字段名类型长度允许空默认值说明
idbigint20-编号(主键)
user_idbigint20-用户编号
order_idbigint20-订单编号
cart_idbigint20NULL购物车项编号
spu_idbigint20-商品SPU编号
spu_namevarchar128-商品SPU名称
sku_idbigint20-商品SKU编号
propertiesjson-NULL属性数组
pic_urlvarchar512-商品图片
countint11-购买数量
comment_statusbit1b'0'是否评价
goodscodevarchar64NULL旧ERP系统CODE
priceint11-商品原价(单位:分)
discount_priceint110优惠金额(单位:分)
delivery_priceint110运费金额(单位:分)
adjust_priceint110订单调价(单位:分)
pay_priceint11-应付金额(单位:分)
coupon_priceint110优惠劵减免金额(单位:分)
point_priceint110积分抵扣的金额(单位:分)
use_pointint110使用的积分
give_pointint110赠送的积分
vip_priceint110VIP减免金额(单位:分)
after_sale_idbigint20NULL售后单编号
after_sale_statustinyint4-售后状态
store_idbigint20NULL门店id
makenovarchar64NULL生产批号
creatorvarchar64''创建者
create_timedatetime-CURRENT_TIMESTAMP创建时间
updatervarchar64''更新者
update_timedatetime-CURRENT_TIMESTAMP更新时间
deletedbit1b'0'是否删除

2.2.2 索引

索引名类型字段说明
PRIMARY主键id主键索引
idx_order_id普通order_id订单索引
idx_user_id普通user_id用户索引

2.2.3 Java 实体类

java
@TableName(value = "trade_order_item", autoResultMap = true)
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
public class TradeOrderItemDO extends BaseDO {

    @TableId
    private Long id;
    private Long userId;
    private Long orderId;
    private Long cartId;
    private Long spuId;
    private String spuName;
    private Long skuId;
    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<Property> properties;
    private String picUrl;
    private Integer count;
    private Boolean commentStatus;
    private String goodscode;
    private Integer price;
    private Integer discountPrice;
    private Integer deliveryPrice;
    private Integer adjustPrice;
    private Integer payPrice;
    private Integer couponPrice;
    private Integer pointPrice;
    private Integer usePoint;
    private Integer givePoint;
    private Integer vipPrice;
    private Long afterSaleId;
    private Integer afterSaleStatus;
    private Long storeId;
    private String makeno;
}

2.3 订单发货记录表 (trade_order_delivery_record)

订单发货记录表用于记录订单的发货信息,特别是同城配送的发货记录。

2.3.1 表结构

字段名类型长度允许空默认值说明
idbigint20-编号(主键)
order_idbigint20-订单编号
provider_codevarchar32NULL配送服务商编码
order_novarchar64NULL订单号
delivery_order_novarchar64NULL配送订单号
estimated_feeint11NULL预估费用
actual_feeint11NULL实际费用
place_infojson-NULL下单信息
status_infojson-NULL状态信息
cancel_infojson-NULL取消信息
old_order_idbigint20NULL旧订单ID
creatorvarchar64''创建者
create_timedatetime-CURRENT_TIMESTAMP创建时间
updatervarchar64''更新者
update_timedatetime-CURRENT_TIMESTAMP更新时间
deletedbit1b'0'是否删除

2.3.2 索引

索引名类型字段说明
PRIMARY主键id主键索引
idx_order_id普通order_id订单索引

2.3.3 Java 实体类

java
@TableName(value = "trade_order_delivery_record", autoResultMap = true)
@Data
public class TradeOrderDeliveryRecordDO extends BaseDO {

    private Long id;
    private Long orderId;
    private String providerCode;
    private String orderNo;
    private String deliveryOrderNo;
    private Integer estimatedFee;
    private Integer actualFee;
    @TableField(typeHandler = JacksonTypeHandler.class)
    private CityDeliveryPlaceInfo placeInfo;
    @TableField(typeHandler = JacksonTypeHandler.class)
    private CityDeliveryStatusInfo statusInfo;
    @TableField(typeHandler = JacksonTypeHandler.class)
    private CityDeliveryCancelInfo cancelInfo;
    private Long oldOrderId;
}

2.4 订单日志表 (trade_order_log)

订单日志表用于记录订单的操作日志,包括订单状态变更、支付、发货等操作。

2.4.1 表结构

字段名类型长度允许空默认值说明
idbigint20-编号(主键)
user_idbigint20-用户编号
user_typetinyint4-用户类型
order_idbigint20-订单编号
before_statustinyint4NULL操作前状态
after_statustinyint4NULL操作后状态
operate_typetinyint4-操作类型
contentvarchar512NULL订单日志信息
data_idvarchar64NULL相关的数据ID
creatorvarchar64''创建者
create_timedatetime-CURRENT_TIMESTAMP创建时间
updatervarchar64''更新者
update_timedatetime-CURRENT_TIMESTAMP更新时间
deletedbit1b'0'是否删除

2.4.2 索引

索引名类型字段说明
PRIMARY主键id主键索引
idx_order_id普通order_id订单索引

2.4.3 Java 实体类

java
@TableName("trade_order_log")
@KeySequence("trade_order_log_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TradeOrderLogDO extends BaseDO {

    public static final Integer USER_TYPE_SYSTEM = 0;
    public static final Long USER_ID_SYSTEM = 0L;

    @TableId
    private Long id;
    private Long userId;
    private Integer userType;
    private Long orderId;
    private Integer beforeStatus;
    private Integer afterStatus;
    private Integer operateType;
    private String content;
    private String dataId;
}

2.5 订单提货表 (trade_order_tihuo)

订单提货表用于记录订单的提货信息。

2.5.1 表结构

字段名类型长度允许空默认值说明
idbigint20-编号(主键)
order_idbigint20-订单编号
amountint11-提货金额(单位:分)
remarkvarchar512NULL提货备注
totalint11-累计提货金额
balanceint11-余额
creatorvarchar64''创建者
create_timedatetime-CURRENT_TIMESTAMP创建时间
updatervarchar64''更新者
update_timedatetime-CURRENT_TIMESTAMP更新时间
deletedbit1b'0'是否删除

2.5.2 索引

索引名类型字段说明
PRIMARY主键id主键索引
idx_order_id普通order_id订单索引

2.5.3 Java 实体类

java
@TableName("trade_order_tihuo")
@KeySequence("trade_order_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TradeOrderTihuoDO extends BaseDO {

    @TableId
    private Long id;
    private Long orderId;
    private int amount;
    private String remark;
    private int total;
    private int balance;
}

2.6 订单分账记录表 (trade_order_profit_sharing_record)

订单分账记录表用于记录订单的分账信息。

2.6.1 表结构

字段名类型长度允许空默认值说明
idbigint20-编号(主键)
request_novarchar64NULL请求流水号
trade_order_idbigint20-交易订单ID
pay_order_idbigint20-支付订单ID
channel_codevarchar32NULL支付渠道编码
payment_amountint11-支付金额(单位:分)
available_amountint11-可用的分账金额(单位:分)
profit_sharing_percentagedecimal10,4NULL分账百分比
profit_sharing_amountint11NULL实际分账金额
receiver_accountvarchar128NULL分账接收方账号
receiver_account_namevarchar128NULL分账接收方账号名称
creatorvarchar64''创建者
create_timedatetime-CURRENT_TIMESTAMP创建时间
updatervarchar64''更新者
update_timedatetime-CURRENT_TIMESTAMP更新时间
deletedbit1b'0'是否删除

2.6.2 索引

索引名类型字段说明
PRIMARY主键id主键索引
idx_trade_order_id普通trade_order_id交易订单索引

2.6.3 Java 实体类

java
@TableName("trade_order_profit_sharing_record")
@KeySequence("trade_order_profit_sharing_record_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TradeOrderProfitSharingRecordDO extends BaseDO {

    private Long id;
    private String requestNo;
    private Long tradeOrderId;
    private Long payOrderId;
    private String channelCode;
    private Integer paymentAmount;
    private Integer availableAmount;
    private BigDecimal profitSharingPercentage;
    private Integer profitSharingAmount;
    private String receiverAccount;
    private String receiverAccountName;
}

2.7 订单分账接收方表 (trade_order_profit_sharing_receiver)

订单分账接收方表用于配置分账接收方信息。

2.7.1 表结构

字段名类型长度允许空默认值说明
idbigint20-编号(主键)
channel_codevarchar32-支付渠道编码
receiver_accountvarchar128-分账接收方账号
receiver_account_namevarchar128-分账接收方账号名称
receiver_descriptionvarchar512NULL分账描述
profit_sharing_percentagedecimal10,4-分账百分比
activatedbit1b'0'是否已激活
creatorvarchar64''创建者
create_timedatetime-CURRENT_TIMESTAMP创建时间
updatervarchar64''更新者
update_timedatetime-CURRENT_TIMESTAMP更新时间
deletedbit1b'0'是否删除

2.7.2 索引

索引名类型字段说明
PRIMARY主键id主键索引
idx_channel_code普通channel_code支付渠道索引

2.7.3 Java 实体类

java
@TableName("trade_order_profit_sharing_receiver")
@KeySequence("trade_order_profit_sharing_receiver_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TradeOrderProfitSharingReceiverDO extends BaseDO {

    private Long id;
    private String channelCode;
    private String receiverAccount;
    private String receiverAccountName;
    private String receiverDescription;
    private BigDecimal profitSharingPercentage;
    private Boolean activated;
}

2.8 订单利润分配表 (trade_order_profit_distribution)

订单利润分配表用于记录订单的利润分配信息。

2.8.1 表结构

字段名类型长度允许空默认值说明
idbigint20-编号(主键)
order_idbigint20-订单编号
receiver_type_codeint11-接收方类型编码
receiver_type_namevarchar64NULL接收方类型名称
receiver_idbigint20-接收方ID
receiver_namevarchar128NULL接收方名称
profitint11-利润
availablebit1b'0'是否可用
finish_timedatetime-NULL完成时间
creatorvarchar64''创建者
create_timedatetime-CURRENT_TIMESTAMP创建时间
updatervarchar64''更新者
update_timedatetime-CURRENT_TIMESTAMP更新时间
deletedbit1b'0'是否删除

2.8.2 索引

索引名类型字段说明
PRIMARY主键id主键索引
idx_order_id普通order_id订单索引

2.8.3 Java 实体类

java
@TableName("trade_order_profit_distribution")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TradeOrderProfitDistributionDO extends BaseDO {

    @TableId
    private Long id;
    private Long orderId;
    private Integer receiverTypeCode;
    private String receiverTypeName;
    private Long receiverId;
    private String receiverName;
    private Integer profit;
    private Boolean available;
    private LocalDateTime finishTime;
}

2.9 订单属性表 (trade_order_attributes)

订单属性表用于存储订单的扩展属性信息。

2.9.1 表结构

字段名类型长度允许空默认值说明
idbigint20-编号(主键)
city_delivery_estimatejson-NULL同城配送预估信息

2.9.2 索引

索引名类型字段说明
PRIMARY主键id主键索引

2.9.3 Java 实体类

java
@TableName(value = "trade_order_attributes", autoResultMap = true)
@Data
public class TradeOrderAttributesDO {

    private Long id;
    @TableField(typeHandler = JacksonTypeHandler.class)
    private CityDeliveryEstimate cityDeliveryEstimate;
}

2.10 购物车表 (trade_cart)

购物车表用于存储用户的购物车商品信息。

2.10.1 表结构

字段名类型长度允许空默认值说明
idbigint20-编号(主键)
user_idbigint20-用户编号
spu_idbigint20-商品SPU编号
sku_idbigint20-商品SKU编号
countint11-商品购买数量
selectedbit1b'0'是否选中
store_idbigint20NULL门户id
creatorvarchar64''创建者
create_timedatetime-CURRENT_TIMESTAMP创建时间
updatervarchar64''更新者
update_timedatetime-CURRENT_TIMESTAMP更新时间
deletedbit1b'0'是否删除

2.10.2 索引

索引名类型字段说明
PRIMARY主键id主键索引
idx_user_id普通user_id用户索引

2.10.3 Java 实体类

java
@TableName("trade_cart")
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class CartDO extends BaseDO {

    @TableId
    private Long id;
    private Long userId;
    private Long spuId;
    private Long skuId;
    private Integer count;
    private Boolean selected;
    private Long storeId;
}

2.11 售后订单表 (trade_after_sale)

售后订单表用于处理订单的退款退货流程。

2.11.1 表结构

字段名类型长度允许空默认值说明
idbigint20-售后编号(主键)
novarchar64-售后单号
statustinyint4-退款状态
waytinyint4-售后方式
typetinyint4-售后类型
user_idbigint20-用户编号
apply_reasonvarchar512NULL申请原因
apply_descriptionvarchar512NULL补充描述
apply_pic_urlsjson-NULL补充凭证图片
order_idbigint20-交易订单编号
order_novarchar64-订单流水号
order_item_idbigint20-交易订单项编号
spu_idbigint20-商品SPU编号
spu_namevarchar128-商品SPU名称
sku_idbigint20-商品SKU编号
propertiesjson-NULL属性数组
pic_urlvarchar512-商品图片
countint11-退货商品数量
audit_timedatetime-NULL审批时间
audit_user_idbigint20NULL审批人
audit_reasonvarchar512NULL审批备注
refund_priceint11-退款金额(单位:分)
pay_refund_idbigint20NULL支付退款编号
refund_timedatetime-NULL退款时间
logistics_idbigint20NULL退货物流公司编号
logistics_novarchar64NULL退货物流单号
delivery_timedatetime-NULL退货时间
receive_timedatetime-NULL收货时间
receive_reasonvarchar512NULL收货备注
creatorvarchar64''创建者
create_timedatetime-CURRENT_TIMESTAMP创建时间
updatervarchar64''更新者
update_timedatetime-CURRENT_TIMESTAMP更新时间
deletedbit1b'0'是否删除

2.11.2 索引

索引名类型字段说明
PRIMARY主键id主键索引
uk_no唯一no售后单号唯一索引
idx_user_id普通user_id用户索引
idx_order_id普通order_id订单索引
idx_status普通status状态索引

2.11.3 Java 实体类

java
@TableName(value = "trade_after_sale", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class AfterSaleDO extends BaseDO {

    @TableId
    private Long id;
    private String no;
    private Integer status;
    private Integer way;
    private Integer type;
    private Long userId;
    private String applyReason;
    private String applyDescription;
    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<String> applyPicUrls;
    private Long orderId;
    private String orderNo;
    private Long orderItemId;
    private Long spuId;
    private String spuName;
    private Long skuId;
    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<TradeOrderItemDO.Property> properties;
    private String picUrl;
    private Integer count;
    private LocalDateTime auditTime;
    private Long auditUserId;
    private String auditReason;
    private Integer refundPrice;
    private Long payRefundId;
    private LocalDateTime refundTime;
    private Long logisticsId;
    private String logisticsNo;
    private LocalDateTime deliveryTime;
    private LocalDateTime receiveTime;
    private String receiveReason;
}

2.12 售后日志表 (trade_after_sale_log)

售后日志表用于记录售后订单的操作日志。

2.12.1 表结构

字段名类型长度允许空默认值说明
idbigint20-编号(主键)
user_idbigint20-用户编号
user_typetinyint4-用户类型
after_sale_idbigint20-售后编号
before_statustinyint4NULL操作前状态
after_statustinyint4NULL操作后状态
operate_typetinyint4-操作类型
contentvarchar512NULL操作明细
creatorvarchar64''创建者
create_timedatetime-CURRENT_TIMESTAMP创建时间
updatervarchar64''更新者
update_timedatetime-CURRENT_TIMESTAMP更新时间
deletedbit1b'0'是否删除

2.12.2 索引

索引名类型字段说明
PRIMARY主键id主键索引
idx_after_sale_id普通after_sale_id售后索引

2.12.3 Java 实体类

java
@TableName("trade_after_sale_log")
@KeySequence("trade_after_sale_log_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AfterSaleLogDO extends BaseDO {

    @TableId
    private Long id;
    private Long userId;
    private Integer userType;
    private Long afterSaleId;
    private Integer beforeStatus;
    private Integer afterStatus;
    private Integer operateType;
    private String content;
}

3. 表关系图

trade_order (交易订单表)
    ├── trade_order_item (交易订单项表) - 通过 order_id 关联
    ├── trade_order_delivery_record (订单发货记录表) - 通过 order_id 关联
    ├── trade_order_log (订单日志表) - 通过 order_id 关联
    ├── trade_order_tihuo (订单提货表) - 通过 order_id 关联
    ├── trade_order_profit_sharing_record (订单分账记录表) - 通过 trade_order_id 关联
    ├── trade_order_profit_distribution (订单利润分配表) - 通过 order_id 关联
    ├── trade_order_attributes (订单属性表) - 通过 id 关联
    ├── trade_after_sale (售后订单表) - 通过 order_id 关联
    └── trade_cart (购物车表) - 通过 user_id 关联

trade_after_sale (售后订单表)
    └── trade_after_sale_log (售后日志表) - 通过 after_sale_id 关联

4. 使用示例

4.1 创建订单

java
@Service
public class TradeOrderServiceImpl implements TradeOrderService {

    @Resource
    private TradeOrderMapper tradeOrderMapper;

    @Resource
    private TradeOrderItemMapper tradeOrderItemMapper;

    @Transactional(rollbackFor = Exception.class)
    public Long createOrder(TradeOrderCreateReqVO createReqVO) {
        TradeOrderDO order = TradeOrderDO.builder()
            .no(generateOrderNo())
            .userId(createReqVO.getUserId())
            .userIp(createReqVO.getUserIp())
            .status(TradeOrderStatusEnum.UNPAID.getStatus())
            .productCount(createReqVO.getItems().size())
            .totalPrice(calculateTotalPrice(createReqVO.getItems()))
            .payPrice(calculatePayPrice(createReqVO.getItems()))
            .deliveryType(createReqVO.getDeliveryType())
            .receiverName(createReqVO.getReceiverName())
            .receiverMobile(createReqVO.getReceiverMobile())
            .receiverAreaId(createReqVO.getReceiverAreaId())
            .receiverDetailAddress(createReqVO.getReceiverDetailAddress())
            .build();
        
        tradeOrderMapper.insert(order);

        for (TradeOrderItemCreateReqVO itemReqVO : createReqVO.getItems()) {
            TradeOrderItemDO item = TradeOrderItemDO.builder()
                .userId(createReqVO.getUserId())
                .orderId(order.getId())
                .spuId(itemReqVO.getSpuId())
                .skuId(itemReqVO.getSkuId())
                .count(itemReqVO.getCount())
                .price(itemReqVO.getPrice())
                .payPrice(itemReqVO.getPayPrice())
                .build();
            tradeOrderItemMapper.insert(item);
        }

        return order.getId();
    }
}

4.2 订单支付

java
@Service
public class TradeOrderServiceImpl implements TradeOrderService {

    @Resource
    private TradeOrderMapper tradeOrderMapper;

    @Resource
    private TradeOrderLogMapper tradeOrderLogMapper;

    @Transactional(rollbackFor = Exception.class)
    public void payOrder(Long orderId, Long payOrderId, String payChannelCode) {
        TradeOrderDO order = tradeOrderMapper.selectById(orderId);
        if (order == null) {
            throw exception(ORDER_NOT_EXISTS);
        }

        tradeOrderMapper.updateById(TradeOrderDO.builder()
            .id(orderId)
            .payOrderId(payOrderId)
            .payStatus(true)
            .payTime(LocalDateTime.now())
            .payChannelCode(payChannelCode)
            .status(TradeOrderStatusEnum.UNDELIVERED.getStatus())
            .build());

        tradeOrderLogMapper.insert(TradeOrderLogDO.builder()
            .userId(SecurityFrameworkUtils.getLoginUserId())
            .userType(UserTypeEnum.ADMIN.getValue())
            .orderId(orderId)
            .beforeStatus(order.getStatus())
            .afterStatus(TradeOrderStatusEnum.UNDELIVERED.getStatus())
            .operateType(TradeOrderOperateTypeEnum.PAY.getType())
            .content("订单支付成功")
            .build());
    }
}

4.3 订单发货

java
@Service
public class TradeOrderServiceImpl implements TradeOrderService {

    @Resource
    private TradeOrderMapper tradeOrderMapper;

    @Resource
    private TradeOrderLogMapper tradeOrderLogMapper;

    @Transactional(rollbackFor = Exception.class)
    public void deliveryOrder(Long orderId, Long logisticsId, String logisticsNo) {
        TradeOrderDO order = tradeOrderMapper.selectById(orderId);
        if (order == null) {
            throw exception(ORDER_NOT_EXISTS);
        }

        tradeOrderMapper.updateById(TradeOrderDO.builder()
            .id(orderId)
            .logisticsId(logisticsId)
            .logisticsNo(logisticsNo)
            .deliveryTime(LocalDateTime.now())
            .deliveryStatus(TradeOrderDeliveryStatus.DELIVERED.getStatus())
            .status(TradeOrderStatusEnum.DELIVERED.getStatus())
            .build());

        tradeOrderLogMapper.insert(TradeOrderLogDO.builder()
            .userId(SecurityFrameworkUtils.getLoginUserId())
            .userType(UserTypeEnum.ADMIN.getValue())
            .orderId(orderId)
            .beforeStatus(order.getStatus())
            .afterStatus(TradeOrderStatusEnum.DELIVERED.getStatus())
            .operateType(TradeOrderOperateTypeEnum.DELIVERY.getType())
            .content("订单发货成功")
            .build());
    }
}

4.4 订单完成

java
@Service
public class TradeOrderServiceImpl implements TradeOrderService {

    @Resource
    private TradeOrderMapper tradeOrderMapper;

    @Resource
    private TradeOrderLogMapper tradeOrderLogMapper;

    @Transactional(rollbackFor = Exception.class)
    public void finishOrder(Long orderId) {
        TradeOrderDO order = tradeOrderMapper.selectById(orderId);
        if (order == null) {
            throw exception(ORDER_NOT_EXISTS);
        }

        tradeOrderMapper.updateById(TradeOrderDO.builder()
            .id(orderId)
            .finishTime(LocalDateTime.now())
            .status(TradeOrderStatusEnum.COMPLETED.getStatus())
            .build());

        tradeOrderLogMapper.insert(TradeOrderLogDO.builder()
            .userId(SecurityFrameworkUtils.getLoginUserId())
            .userType(UserTypeEnum.ADMIN.getValue())
            .orderId(orderId)
            .beforeStatus(order.getStatus())
            .afterStatus(TradeOrderStatusEnum.COMPLETED.getStatus())
            .operateType(TradeOrderOperateTypeEnum.FINISH.getType())
            .content("订单完成")
            .build());
    }
}

4.5 申请售后

java
@Service
public class AfterSaleServiceImpl implements AfterSaleService {

    @Resource
    private AfterSaleMapper afterSaleMapper;

    @Resource
    private TradeOrderMapper tradeOrderMapper;

    @Transactional(rollbackFor = Exception.class)
    public Long createAfterSale(AfterSaleCreateReqVO createReqVO) {
        TradeOrderDO order = tradeOrderMapper.selectById(createReqVO.getOrderId());
        if (order == null) {
            throw exception(ORDER_NOT_EXISTS);
        }

        AfterSaleDO afterSale = AfterSaleDO.builder()
            .no(generateAfterSaleNo())
            .userId(createReqVO.getUserId())
            .type(createReqVO.getType())
            .way(createReqVO.getWay())
            .applyReason(createReqVO.getApplyReason())
            .applyDescription(createReqVO.getApplyDescription())
            .applyPicUrls(createReqVO.getApplyPicUrls())
            .orderId(createReqVO.getOrderId())
            .orderNo(order.getNo())
            .orderItemId(createReqVO.getOrderItemId())
            .spuId(createReqVO.getSpuId())
            .spuName(createReqVO.getSpuName())
            .skuId(createReqVO.getSkuId())
            .picUrl(createReqVO.getPicUrl())
            .count(createReqVO.getCount())
            .refundPrice(createReqVO.getRefundPrice())
            .status(AfterSaleStatusEnum.APPLY.getStatus())
            .build();
        
        afterSaleMapper.insert(afterSale);
        return afterSale.getId();
    }
}

5. 业务规则

5.1 订单状态流转

  1. 待支付 → 待发货(支付成功)
  2. 待发货 → 已发货(商家发货)
  3. 已发货 → 已完成(用户确认收货或超时自动完成)
  4. 待支付 → 已取消(用户取消或超时自动取消)
  5. 任意状态 → 售后中(申请售后)

5.2 订单价格计算

应付金额 = 商品原价 - 优惠金额 - 优惠劵减免 - 积分抵扣 + 运费 + 订单调价 - VIP减免

5.3 售后规则

  1. 售后类型:仅退款、退货退款
  2. 售后状态:申请中、审核通过、审核拒绝、退款中、退款成功、退款失败
  3. 售后金额不能超过订单实际支付金额

5.4 分账规则

  1. 分账在支付成功后进行
  2. 分账金额 = 支付金额 - 运费等不可分账金额
  3. 分账接收方需要提前配置并激活

6. 注意事项

  1. 订单流水号必须唯一,使用 uk_no 唯一索引保证
  2. 订单状态变更时,必须记录订单日志
  3. 订单项的商品信息冗余存储,减少关联查询
  4. 所有表都支持逻辑删除,通过 deleted 字段标记
  5. 售后单号必须唯一,使用 uk_no 唯一索引保证
  6. 售后状态变更时,必须记录售后日志
  7. 分账接收方需要提前配置并激活
  8. 订单属性使用 JSON 类型存储扩展信息

注意:本文档持续更新中,如有问题请及时反馈。