订单关系表
1. 概述
订单关系表是梵医云系统中用于管理交易订单、订单项、购物车、售后订单等相关数据的核心模块。该模块提供了完整的订单管理体系,包括订单创建、订单支付、订单发货、订单售后、订单分账等功能。
2. 表结构
2.1 交易订单表 (trade_order)
交易订单表是订单模块的核心表,存储订单的基本信息、价格信息、物流信息、售后信息等。
2.1.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 订单编号(主键) |
| no | varchar | 64 | 否 | - | 订单流水号 |
| pay_merchant_id | bigint | 20 | 是 | NULL | 支付商户ID |
| type | tinyint | 4 | 否 | - | 订单类型 |
| terminal | tinyint | 4 | 否 | - | 订单来源(1H5 2小程序 3APP) |
| user_id | bigint | 20 | 否 | - | 用户编号 |
| user_ip | varchar | 50 | 是 | NULL | 用户IP |
| user_remark | varchar | 512 | 是 | NULL | 用户备注 |
| status | tinyint | 4 | 否 | - | 订单状态(0待支付 1待发货 2已发货 3已完成 4已取消) |
| product_count | int | 11 | 否 | - | 购买的商品数量 |
| finish_time | datetime | - | 是 | NULL | 订单完成时间 |
| cancel_time | datetime | - | 是 | NULL | 订单取消时间 |
| cancel_type | tinyint | 4 | 是 | NULL | 取消类型 |
| remark | varchar | 512 | 是 | NULL | 商家备注 |
| comment_status | bit | 1 | 否 | b'0' | 是否评价 |
| brokerage_user_id | bigint | 20 | 是 | NULL | 推广人编号 |
| pay_order_id | bigint | 20 | 是 | NULL | 支付订单编号 |
| pay_status | bit | 1 | 否 | b'0' | 是否已支付 |
| pay_time | datetime | - | 是 | NULL | 付款时间 |
| pay_channel_code | varchar | 32 | 是 | NULL | 支付渠道 |
| total_price | int | 11 | 否 | - | 商品原价(单位:分) |
| discount_price | int | 11 | 否 | 0 | 优惠金额(单位:分) |
| delivery_price | int | 11 | 否 | 0 | 运费金额(单位:分) |
| adjust_price | int | 11 | 否 | 0 | 订单调价(单位:分) |
| pay_price | int | 11 | 否 | - | 应付金额(单位:分) |
| profit_sharing | tinyint | 4 | 否 | 0 | 分账状态 |
| delivery_type | tinyint | 4 | 否 | - | 配送方式(1快递 2自提) |
| delivery_sub_type | tinyint | 4 | 是 | NULL | 配送子类型 |
| delivery_batch_id | bigint | 20 | 是 | NULL | 批量发货ID |
| delivery_status | tinyint | 4 | 否 | - | 发货状态 |
| logistics_id | bigint | 20 | 否 | 0 | 发货物流公司编号 |
| logistics_no | varchar | 64 | 否 | '' | 发货物流单号 |
| delivery_time | datetime | - | 是 | NULL | 发货时间 |
| receive_time | datetime | - | 是 | NULL | 收货时间 |
| receiver_name | varchar | 64 | 否 | - | 收件人名称 |
| receiver_mobile | varchar | 32 | 否 | - | 收件人手机 |
| receiver_area_id | int | 11 | 否 | - | 收件人地区编号 |
| receiver_detail_address | varchar | 512 | 否 | - | 收件人详细地址 |
| pick_up_store_id | bigint | 20 | 是 | NULL | 自提门店编号 |
| pick_up_verify_code | varchar | 64 | 是 | NULL | 自提核销码 |
| refund_status | tinyint | 4 | 否 | - | 售后状态 |
| refund_price | int | 11 | 否 | 0 | 退款金额(单位:分) |
| coupon_id | bigint | 20 | 是 | NULL | 优惠劵编号 |
| coupon_price | int | 11 | 否 | 0 | 优惠劵减免金额(单位:分) |
| use_point | int | 11 | 否 | 0 | 使用的积分 |
| point_price | int | 11 | 否 | 0 | 积分抵扣的金额(单位:分) |
| give_point | int | 11 | 否 | 0 | 赠送的积分 |
| refund_point | int | 11 | 否 | 0 | 退还的使用的积分 |
| vip_price | int | 11 | 否 | 0 | VIP减免金额(单位:分) |
| seckill_activity_id | bigint | 20 | 是 | NULL | 秒杀活动编号 |
| bargain_activity_id | bigint | 20 | 是 | NULL | 砍价活动编号 |
| bargain_record_id | bigint | 20 | 是 | NULL | 砍价记录编号 |
| combination_activity_id | bigint | 20 | 是 | NULL | 拼团活动编号 |
| combination_head_id | bigint | 20 | 是 | NULL | 拼团团长编号 |
| combination_record_id | bigint | 20 | 是 | NULL | 拼团记录编号 |
| is_prescription | tinyint | 4 | 是 | NULL | 是否是处方药 |
| store_id | varchar | 512 | 是 | NULL | 门店id |
| tihuo_status | tinyint | 4 | 是 | NULL | 提货状态 |
| prescription_id | bigint | 20 | 是 | NULL | 处方单ID |
| prescription_result | varchar | 512 | 是 | NULL | 处方签结果 |
| old_user_id | bigint | 20 | 是 | NULL | 转单时的旧用户ID |
| service_code | varchar | 64 | 是 | NULL | 服务号 |
| promo_code | varchar | 64 | 是 | NULL | 营销代码 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'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 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| user_id | bigint | 20 | 否 | - | 用户编号 |
| order_id | bigint | 20 | 否 | - | 订单编号 |
| cart_id | bigint | 20 | 是 | NULL | 购物车项编号 |
| spu_id | bigint | 20 | 否 | - | 商品SPU编号 |
| spu_name | varchar | 128 | 否 | - | 商品SPU名称 |
| sku_id | bigint | 20 | 否 | - | 商品SKU编号 |
| properties | json | - | 是 | NULL | 属性数组 |
| pic_url | varchar | 512 | 否 | - | 商品图片 |
| count | int | 11 | 否 | - | 购买数量 |
| comment_status | bit | 1 | 否 | b'0' | 是否评价 |
| goodscode | varchar | 64 | 是 | NULL | 旧ERP系统CODE |
| price | int | 11 | 否 | - | 商品原价(单位:分) |
| discount_price | int | 11 | 否 | 0 | 优惠金额(单位:分) |
| delivery_price | int | 11 | 否 | 0 | 运费金额(单位:分) |
| adjust_price | int | 11 | 否 | 0 | 订单调价(单位:分) |
| pay_price | int | 11 | 否 | - | 应付金额(单位:分) |
| coupon_price | int | 11 | 否 | 0 | 优惠劵减免金额(单位:分) |
| point_price | int | 11 | 否 | 0 | 积分抵扣的金额(单位:分) |
| use_point | int | 11 | 否 | 0 | 使用的积分 |
| give_point | int | 11 | 否 | 0 | 赠送的积分 |
| vip_price | int | 11 | 否 | 0 | VIP减免金额(单位:分) |
| after_sale_id | bigint | 20 | 是 | NULL | 售后单编号 |
| after_sale_status | tinyint | 4 | 否 | - | 售后状态 |
| store_id | bigint | 20 | 是 | NULL | 门店id |
| makeno | varchar | 64 | 是 | NULL | 生产批号 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'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 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| order_id | bigint | 20 | 否 | - | 订单编号 |
| provider_code | varchar | 32 | 是 | NULL | 配送服务商编码 |
| order_no | varchar | 64 | 是 | NULL | 订单号 |
| delivery_order_no | varchar | 64 | 是 | NULL | 配送订单号 |
| estimated_fee | int | 11 | 是 | NULL | 预估费用 |
| actual_fee | int | 11 | 是 | NULL | 实际费用 |
| place_info | json | - | 是 | NULL | 下单信息 |
| status_info | json | - | 是 | NULL | 状态信息 |
| cancel_info | json | - | 是 | NULL | 取消信息 |
| old_order_id | bigint | 20 | 是 | NULL | 旧订单ID |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'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 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| user_id | bigint | 20 | 否 | - | 用户编号 |
| user_type | tinyint | 4 | 否 | - | 用户类型 |
| order_id | bigint | 20 | 否 | - | 订单编号 |
| before_status | tinyint | 4 | 是 | NULL | 操作前状态 |
| after_status | tinyint | 4 | 是 | NULL | 操作后状态 |
| operate_type | tinyint | 4 | 否 | - | 操作类型 |
| content | varchar | 512 | 是 | NULL | 订单日志信息 |
| data_id | varchar | 64 | 是 | NULL | 相关的数据ID |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'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 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| order_id | bigint | 20 | 否 | - | 订单编号 |
| amount | int | 11 | 否 | - | 提货金额(单位:分) |
| remark | varchar | 512 | 是 | NULL | 提货备注 |
| total | int | 11 | 否 | - | 累计提货金额 |
| balance | int | 11 | 否 | - | 余额 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'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 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| request_no | varchar | 64 | 是 | NULL | 请求流水号 |
| trade_order_id | bigint | 20 | 否 | - | 交易订单ID |
| pay_order_id | bigint | 20 | 否 | - | 支付订单ID |
| channel_code | varchar | 32 | 是 | NULL | 支付渠道编码 |
| payment_amount | int | 11 | 否 | - | 支付金额(单位:分) |
| available_amount | int | 11 | 否 | - | 可用的分账金额(单位:分) |
| profit_sharing_percentage | decimal | 10,4 | 是 | NULL | 分账百分比 |
| profit_sharing_amount | int | 11 | 是 | NULL | 实际分账金额 |
| receiver_account | varchar | 128 | 是 | NULL | 分账接收方账号 |
| receiver_account_name | varchar | 128 | 是 | NULL | 分账接收方账号名称 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'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 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| channel_code | varchar | 32 | 否 | - | 支付渠道编码 |
| receiver_account | varchar | 128 | 否 | - | 分账接收方账号 |
| receiver_account_name | varchar | 128 | 否 | - | 分账接收方账号名称 |
| receiver_description | varchar | 512 | 是 | NULL | 分账描述 |
| profit_sharing_percentage | decimal | 10,4 | 否 | - | 分账百分比 |
| activated | bit | 1 | 否 | b'0' | 是否已激活 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'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 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| order_id | bigint | 20 | 否 | - | 订单编号 |
| receiver_type_code | int | 11 | 否 | - | 接收方类型编码 |
| receiver_type_name | varchar | 64 | 是 | NULL | 接收方类型名称 |
| receiver_id | bigint | 20 | 否 | - | 接收方ID |
| receiver_name | varchar | 128 | 是 | NULL | 接收方名称 |
| profit | int | 11 | 否 | - | 利润 |
| available | bit | 1 | 否 | b'0' | 是否可用 |
| finish_time | datetime | - | 是 | NULL | 完成时间 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'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 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| city_delivery_estimate | json | - | 是 | 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 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| user_id | bigint | 20 | 否 | - | 用户编号 |
| spu_id | bigint | 20 | 否 | - | 商品SPU编号 |
| sku_id | bigint | 20 | 否 | - | 商品SKU编号 |
| count | int | 11 | 否 | - | 商品购买数量 |
| selected | bit | 1 | 否 | b'0' | 是否选中 |
| store_id | bigint | 20 | 是 | NULL | 门户id |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'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 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 售后编号(主键) |
| no | varchar | 64 | 否 | - | 售后单号 |
| status | tinyint | 4 | 否 | - | 退款状态 |
| way | tinyint | 4 | 否 | - | 售后方式 |
| type | tinyint | 4 | 否 | - | 售后类型 |
| user_id | bigint | 20 | 否 | - | 用户编号 |
| apply_reason | varchar | 512 | 是 | NULL | 申请原因 |
| apply_description | varchar | 512 | 是 | NULL | 补充描述 |
| apply_pic_urls | json | - | 是 | NULL | 补充凭证图片 |
| order_id | bigint | 20 | 否 | - | 交易订单编号 |
| order_no | varchar | 64 | 否 | - | 订单流水号 |
| order_item_id | bigint | 20 | 否 | - | 交易订单项编号 |
| spu_id | bigint | 20 | 否 | - | 商品SPU编号 |
| spu_name | varchar | 128 | 否 | - | 商品SPU名称 |
| sku_id | bigint | 20 | 否 | - | 商品SKU编号 |
| properties | json | - | 是 | NULL | 属性数组 |
| pic_url | varchar | 512 | 否 | - | 商品图片 |
| count | int | 11 | 否 | - | 退货商品数量 |
| audit_time | datetime | - | 是 | NULL | 审批时间 |
| audit_user_id | bigint | 20 | 是 | NULL | 审批人 |
| audit_reason | varchar | 512 | 是 | NULL | 审批备注 |
| refund_price | int | 11 | 否 | - | 退款金额(单位:分) |
| pay_refund_id | bigint | 20 | 是 | NULL | 支付退款编号 |
| refund_time | datetime | - | 是 | NULL | 退款时间 |
| logistics_id | bigint | 20 | 是 | NULL | 退货物流公司编号 |
| logistics_no | varchar | 64 | 是 | NULL | 退货物流单号 |
| delivery_time | datetime | - | 是 | NULL | 退货时间 |
| receive_time | datetime | - | 是 | NULL | 收货时间 |
| receive_reason | varchar | 512 | 是 | NULL | 收货备注 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'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 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| user_id | bigint | 20 | 否 | - | 用户编号 |
| user_type | tinyint | 4 | 否 | - | 用户类型 |
| after_sale_id | bigint | 20 | 否 | - | 售后编号 |
| before_status | tinyint | 4 | 是 | NULL | 操作前状态 |
| after_status | tinyint | 4 | 是 | NULL | 操作后状态 |
| operate_type | tinyint | 4 | 否 | - | 操作类型 |
| content | varchar | 512 | 是 | NULL | 操作明细 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'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 订单状态流转
- 待支付 → 待发货(支付成功)
- 待发货 → 已发货(商家发货)
- 已发货 → 已完成(用户确认收货或超时自动完成)
- 待支付 → 已取消(用户取消或超时自动取消)
- 任意状态 → 售后中(申请售后)
5.2 订单价格计算
应付金额 = 商品原价 - 优惠金额 - 优惠劵减免 - 积分抵扣 + 运费 + 订单调价 - VIP减免5.3 售后规则
- 售后类型:仅退款、退货退款
- 售后状态:申请中、审核通过、审核拒绝、退款中、退款成功、退款失败
- 售后金额不能超过订单实际支付金额
5.4 分账规则
- 分账在支付成功后进行
- 分账金额 = 支付金额 - 运费等不可分账金额
- 分账接收方需要提前配置并激活
6. 注意事项
- 订单流水号必须唯一,使用 uk_no 唯一索引保证
- 订单状态变更时,必须记录订单日志
- 订单项的商品信息冗余存储,减少关联查询
- 所有表都支持逻辑删除,通过 deleted 字段标记
- 售后单号必须唯一,使用 uk_no 唯一索引保证
- 售后状态变更时,必须记录售后日志
- 分账接收方需要提前配置并激活
- 订单属性使用 JSON 类型存储扩展信息
注意:本文档持续更新中,如有问题请及时反馈。
