开发者学堂课程【RocketMQ 知识精讲与项目实战(第二阶段):生成预订单代码实现1】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/703/detail/12414
生成预订单流程实现1
内容介绍:
一、设置订单状态
二、设置订单 ID
三、核算运费
四、核算订单总金额
五、判断是否使用余额
一、设置订单状态
接下来使用代码,将上节所分析的注释翻译出来。
首先第一步设置订单的状态不可见,订单对象已经传递过来了,直接设置就可以。
使用已经提前准备的常量,输入
o
rder.setO
rder
Status(ShopCode.SHOP_ORDER_
No
_CONFIRM.
get
C
ode
()
);
,
其实 SHOP_ORDER_No_CONFIRM 常量是枚举类型。然后零代表当前预订单的状态没有被确认。
二、设置订单 ID
第二步要去设置订单 id。后期可能会存在数据库的分库分表,所以订单id在进行订单表的分库分表后,要保证id的全局唯一性,使用之前在 common 中所介绍的 IdWorker,使用它去生成全局唯一性的 id。
先把 IdWorker 注入进来。在项目当中,要把 bin 实例化,才能去进行注入,此处先注入,后期再完善其它代码。
使用id生成器,输入 idWorker.nextId(); 按回车键,接受 orderId,输入 order.setOrderID(orderID);
三、核算运费
下一步去核算运费。核算运费的逻辑是如果订单金额大于100,免运费;如果它小于100,收十块钱的运费。此处有处理逻辑,依然采用封装的方法。
输入
B
igDecimalshippingFee=
c
alculateShippingFee(order.getorderAmount())
去实现出来。
写注释:
*核算运费
*@param orderAmount
*@return
*/
private
B
igDecimal
c
alculateShippingFee(
B
igDecimal orderAmount){
判断的逻辑是如果 orderAmount 比100大,就不用付运费。else 如果是小于
100,付十块钱的运费。
四、核算订单总金额
下一步判断订单所传递过来的运费与所核算出来的运费是否一致。
输入
i
f(order. getshippingFee().compareTo(shippingFee)!==
0)
如果不等于0,就给它抛个异常,当前运费不合法。
输入
C
astException.cast(ShopCode.SHOP_ORDER_SHIPPINGFEE_INVALID);
如果运费合法,下一步核算订单的总金额是否合法。订单总金额应该要去包含运费。
先计算订单的总金额,输入:
BigDecimalorderAmount=
o
rder.getGoodsPrice().multiply(new
BigDecimal(order.getGoodsNumber())
计算的订单总价要加上所核算的运费,然后,要去判断订单的金额是否等于所计算的总金额。如果它不等于就抛异常,当前订单是非法的,订单的总价格不正确。
自己核算订单的总价加上运费,然后看核算的价格是否等于订单对象中做封装的订单总金额。如果不一样,说明订单的状态是非法的,直接抛出异常数据。因为订单的处理与金额有关,所以判断和校验要比较全面。
五、判断用户是否使用余额
接着判断用户是否使用余额。
输入BigDecimal moneyPaid
=
order.getMoneyPaid()
;
i
f(moneyPaid!=null
){
//订单中余额是否合法
余额肯定不能为负数。
继续输入:
moneyPaid. compareTo(BigDecimal.ZERO
)
如果r等于-1,代表订单当中所传递过来的这个余额是负数,此时报异常。
如果r等于1,说明余额大于零。
余额大于零不能直接去使用余额,因为要去判断订单中要使用的余额与数据库当中用户所拥有的余额是否一样,即订单当中使用的余额不能大于数据库当中所拥有的余额。
先把用户的余额查询出来。输入
userService.findOne(order.getUserID),按回车键。
如果它等于1,代表用户要用的余额大于在数据库中所拥有的余额。此处抛异常,余额是非法的,余额不能超支。没问题才能使用。
所以这一块主要判断如果使用余额,余额一定要合法。首先大于零,也必须要小于等于它自己的余额。
如果用户没有使用余额,设置余额为零就行,方便后面的处理,输入 order.setMoneyPaid(BigDecimal.ZERO);.