
2.5 订单模块
订单模块是一个非常复杂的模块。在成熟的电商系统中,一个订单通常要包含用户、销售渠道、商品、库存、供应商、用户服务(退款/退货)、商品物流等信息,要讲清楚这样一个系统可以花一整本书。我们这里的需求比较简单,只要一个订单凭据,让用户拿着这个凭据来申请客户服务即可。
2.5.1 购物篮模型
在我们的需求中,一次下单可以包含一个或多个商品,我们把这种购物行为想象成顾客提着一个篮子,将想购买的商品放进篮子里,最后将这一篮商品一起下单。现在为这个篮子建立模型,代码如下:

一个购物篮可以放一个或多个商品,这是一个一对多的关系。现在为这个关系建立模型,代码如下:

2.5.2 订单模型
购物篮建立后,即可开始设计订单模型,我们这里设计的是一对一的关系,即一个订单只对应设计一个购物篮。代码如下:

订单中的信息非常重要,订单的每次修改都应该被记录下来,用于后续的审计,我们把这样的记录称为注解。一个订单可能对应多个注解,因此这是一个一对多的关系。下面我们建立注解模型,代码如下:

另外,订单有着自己的生命周期,可能会有“下单”“运送”“完成”等状态,系统应该能够完整记录这些状态,以帮助我们掌握订单的流转过程,在出现问题的时候方便排查。为订单状态的流转建立模型,代码如下:

与客户的沟通是非常重要的,在系统状态发生改变的时候,最好通知客户,这样有助于沟通,建立网站和客户之间的信任。我们也需要把这些沟通的内容记录保存下来,在出现问题时有助于定位问题。代码如下:

当然,我们还需要记录订单里面的商品详情。这个模型和购物车Line模型很类似,区别在于订单商品详情可能会包含合作伙伴的相关信息。要确定一个订单包含的商品,可以以这个模型为准,代码如下:

由于订单模块的复杂度高,涉及的模型数量多,在实际开发的时候会有涉及多模型之间的聚合或多次查询。为了优化这样的查询,在设计模型时可以添加一些“冗余”字段,OrderLine中的title字段就是冗余的,目的是通过一次查询获取商品名称;若不设计冗余,要获取商品名称,还需要查询一次商品表。
2.5.3 获取订单数据
对于系统来说,用户查询自己的购物记录,其实等同于查询用户的订单历史记录。要想获取用户的订单历史记录,需要输入用户的ID,可能还有一些查询条件,如订单出现的时间范围等,然后返回一系列订单对象。示例代码如下:

要想让用户清楚地看到自己的购物历史,可以使用表格的方式展示数据,将订单的ID、状态、创建时间、总花费呈现出来。模板示例代码如下:

用户也会想要知道一个订单里有哪些商品,对于系统来说,实际上就是获取订单的商品详情。获取商品详情,需要输入订单的ID,然后返回商品的列表。示例代码如下:

在展示层,用户可能会比较购买的商品、商品数量和商品单价,同样地,也可以以表格的形式将这些信息展现出来。模板代码如下:
