## 1. 界面 1. 运营后台-订单管理-所有订单![img](https://img.kancloud.cn/b5/7d/b57d446175432113674b6414f5ece11c_1603x621.png) 2. 运营后台-订单管理-订单详情![img](https://img.kancloud.cn/73/e0/73e018f87debdd980f54ac0d9b84534a_1486x946.png) # 2. 数据库实体 整体实体类关系如下图: ![img](https://img.kancloud.cn/3f/f6/3ff6a4a9e77106b1db9d82e700432153_1032x460.png) - OrderSettlement:一个订单会有一个结算信息,结算信息记录着用户的支付方式,支付金额等。 - Order:一个订单的订单信息,记录着订单的订单状态、运费、备注等信息。 - OrderItem:一个订单有多个订单项,每个订单项记录着每件商品的订单信息。 - UserAddrOrder:订单地址信息,每个订单会有收货地址。 ## 2.1 Order Order,订单。一次下单,生成一条订单记录,即使多种商品。 字段较多,我们进行简单的切块。 ### 2.1.1 基础字段 ```java /** * 订单ID */ @TableId private Long orderId; /** * 店铺id */ private Long shopId; /** * 订购流水号 */ private String orderNumber; /** * 订单状态 1:待付款 2:待发货 3:待收货 4:待评价 5:成功 6 交易失败 */ private Integer status; /** * 订购时间 */ private Date createTime; /** * 订单更新时间 */ private Date updateTime; /** * 付款时间 */ private Date payTime; /** * 发货时间 */ private Date dvyTime; /** * 完成时间 */ private Date finallyTime; /** * 取消时间 */ private Date cancelTime; ``` - `orderId` :订单id,自增,没啥用。 - `orderNumber`:订单编号例如:1060804015757070336 。通过[雪花算法](http://www.cnblogs.com/relucent/p/4955340.html)生成id。 - `shopId` :店铺编号。 - `status`:订单状态,交易主状态。交易会有较多分支状态,例如退款状态、物流状态等等状态。不同于分支状态,主状态控制整个订单的生命周期。 状态流转如下图:![img](https://img.kancloud.cn/9e/74/9e74a5ecd6f2e6e6f2fc397cdbb643c4_948x1464.png) ### 2.1.2 商品信息 ```java /** * 产品名称,多个产品将会以逗号隔开 */ private String prodName; /** * 总值 */ private Double total; /** * 实际总值 */ private Double actualTotal; /** * 订单商品总数 */ private Integer productNums; /** * 优惠总额 */ private Double reduceAmount; ``` - 我们可以看到,该快字段主要**冗余**了多个商品的名称到交易记录中。 ### 2.1.3 买家信息 ```java /** * 订购用户ID */ private String userId; /** * 订单备注 */ private String remarks; ``` - `userId` ,买家用户编号。 - `remarks` ,买家购买备注。 ![img](https://img.kancloud.cn/97/4f/974f375aa4b9daab857534094290225a_440x865.png) ### 2.1.4 价格信息 ``` /** * 总值 */ private Double total; /** * 实际总值 */ private Double actualTotal; /** * 订单运费 */ private Double freightAmount; /** * 优惠总额 */ private Double reduceAmount; ``` - `total` :商品总价。该字段通过 OrderItem的 `price` 求和计算。 - `freightAmount` :运费总价。该字段通过 OrderItem的商品的**运费价格**求和计算。 - `reduceAmount`:交易优惠金额。注意,TradeOrder 的 - 购买的商品参加 折扣活动,原价 100 元,折扣价 10 元。那么数据如下(我们会看到折扣活动跟着 商品走): - `total = 100` ,`reduceAmount = 10` ,`actualTotal = 90` 。 - 购买的商品使用优惠劵,在上面例子的基础上,优惠劵打 2 折。那么数据如下(我们会看到优惠劵跟着 Trade 走): - `total = 100` ,`reduceAmount = 72` ,`actualTotal = 18` 。 - `actualTotal`:`actualTotal = total + freightAmount - reduceAmount` ### 2.1.5 物流 ```java /** * 配送类型 */ private String dvyType; /** * 配送方式ID */ private Long dvyId; /** * 物流单号 */ private String dvyFlowId; ``` 通过物流的id获取物流方式,提供给前端显示 ## 2.2 收货人信息UserAddrOrder ```java public class UserAddrOrder implements Serializable { /** * ID */ @TableId private Long addrOrderId; /** * 地址ID */ private Long addrId; /** * 用户ID */ private String userId; /** * 收货人 */ private String receiver; /** * 省 */ private String province; /** * 城市 */ private String city; /** * 区 */ private String area; /** * 地址 */ private String addr; /** * 邮编 */ private String postCode; /** * 省ID */ private Long provinceId; /** * 城市ID */ private Long cityId; /** * 区域ID */ private Long areaId; /** * 手机 */ private String mobile; /** * 建立时间 */ private Date createTime; /** * 版本号 */ private Integer version; } ``` - `addrOrderId` ,收货人的地址编号。 - `receiver` **等等**,**冗余**交易的收货地址信息,避免买家修改收货人地址编号对应的地址信息。 ## 2.3 结算信息OrderSettlement ```java public class OrderSettlement implements Serializable { /** * 支付结算单据ID */ @TableId private Long settlementId; /** * 用户系统内部的订单号 */ private String payNo; /** * 外部订单流水号 */ private String bizPayNo; /** * 订单号 */ private String orderNumber; /** * 支付方式 0 手动代付 1 微信支付 2 支付宝 */ private Integer payType; /** * 支付金额 */ private Double payAmount; /** * 用户ID */ private String userId; /** * 是否清算 0:否 1:是 */ private Integer isClearing; /** * 创建时间 */ private Date createTime; /** * 清算时间 */ private Date clearingTime; /** * 支付状态 */ private Integer payStatus; /** * 版本号 */ private Integer version; /** * 支付方式名称 */ private String payTypeName; } ``` - `orderNumber` :关联订单的订单号 - `payNo`: 支付时的支付订单号,根据雪花算法生成 - `payAmount`:实付金额。 - `bizPayNo`:外部交易编号。比如,如果支付方式是微信支付,就是财付通的交易单号。 ## 2.4 订单项 OrderItem 每个订单都会有多个商品,每个商品就是一个订单项。 ```java /** * 订单项ID */ @TableId(type = IdType.AUTO) private Long orderItemId; private Long shopId; /** * 订单orderNumber */ private String orderNumber; /** * 产品ID */ private Long prodId; /** * 产品SkuID */ private Long skuId; /** * 购物车产品个数 */ private Integer prodCount; /** * 产品名称 */ private String prodName; /** * sku名称 */ private String skuName; /** * 产品主图片路径 */ private String pic; /** * 产品价格 */ private Double price; /** * 用户Id */ private String userId; /** * 商品总金额 */ private Double productTotalAmount; /** * 购物时间 */ private Date recTime; /** * 评论状态: 0 未评价 1 已评价 */ private Integer commSts; /** * 推广员使用的推销卡号 */ private String distributionCardNo; /** * 加入购物车的时间 */ private Date basketDate; ``` - `orderNumber` :订单编号,指向 `Order.orderNumber` 。 - `prodId`:商品id - 冗余商品字段: - `prodName` ,商品标题。 - `pic` ,商品主图片地址。 - `skuId` ,商品 SKU 编号,指向 `ItemSku.id` 。 - 冗余商品 SKU 字段: - `skuName` ,SKU的值,即:商品的规格。如:机身颜色:黑色;手机套餐:官方标配。 - `num` ,购买数量。