开发者学堂课程【RocketMQ 知识精讲与项目实战(第二阶段):生成预订单代码实现2】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/703/detail/12415
生成预订单代码实现2
内容介绍:
一、判断用户是否使用优惠券
二、核算订单支付金额
三、设置下单时间
四、小结
一、判断用户是否使用优惠券
判断用户是否使用优惠券要先从订单中拿到优惠券的ID。输入 Long couponID = order.getCouponID();
if(couponID!=null){
如果它不等于空,代表用户当前使用了优惠券。继续判断优惠券是否存在,如果存在要去判断,优惠券是否已经被使用。
所以要根据 ID,进行优惠券的微服务的查询。
在 api 的工程里去编写接口 ICouPon Service。先去提供借口,这个接口就是优惠券的接口,提供查询优惠券的方法。
输入 TradeCoupon findOne(Long coupouID),根据这个 ID 查询当前的优惠券。
那在 Orderservice 把它注入进来,输入 ICouponService。
注入进来后,去进行处理。
输入 CouponService.findone(couponID);按回车键,接收 conpon。
然后判断如果 compound 等于空,应该去抛异常。传递 ID 但是优惠券不存在,说明没有优惠券。
输入 CastException.cast(ShopCode.SHOP_COUPON_NO_EXIST)
如果优惠券存在,要进一步判断它的状态。
如果优惠券已经被使用,那么就不用再去往下走。取 intvalue 的值,因为 is used 是 integrity 类型,要转换成基本类型的数字,查看它是否等于提前准备的
coupon.getIsUsed().intVaue()==ShopCode.SHOP_COUPON_ISUSED.get)常量,优惠券已经使用的状态就是1,把它转成基本类型的值做判断。
如果优惠券已经使用,此时要抛异常。这是关于优惠券的处理。
如果优惠券没有传递过来,可以在 else 当中去设置 order.setCouponPaid(BigDecimal.ZERO)。
它在后期减去优惠券的时候,不会出现控制帧的问题。即如果没有去传递优惠券 ID,优惠券减去的金额就是零。
二、核算订单的支付金额
订单的支付金额,应该是订单总金额减去余额再减去优惠券金额。
输入
order.getOrderAmount().subtract (order.getMoneyPaid().subtract(order.getCouponPaid))
得到的应该是 payAmount。这是要支付的总金额,给它设置到 payAmount。 这就是最终的所核算的支付金额。
三、设置下单时间
接着进行订单下单时间的处理。发现有 setAdd time,new date 放入。去数据库当中进行保存。
依然把 TradeOrderMapper orderMapper 注入进来。注入进来之后,就可以使用 ordermapper 进行订单的存储。
存完之后,就可以把 orderID 返回来,这就是整个的生成预订单所有的代码实现.
代码比较多,按照之前所分析的步骤来完善它。先把注释敲出来,再用代码实现。后期如果有问题,可以做异常。
四、小结
现在来去检查看这里边哪些有问题。
顺便做小结。首先去把订单的状态设置为不可见。然后设置订单 ID,核算运费。查看运费。
如果金额大于100,运费是0。如果金额小于100,就是10元。
运费核算是看订单里传递过来的运费是否等于自己核算的。如果不等于直接抛异常。
订单的金额在核算的时候,应该是商品的金额加上运费。商品的金额是商品的单价乘以商品的数量。然后判断自己核算的与订单当中的总金额是否一样,不一样直接抛异常。
接着进行余额的判断。
如果订单当中使用余额,判断余额是否大于0。如果小于0,就不能使用余额。
如果大于零,判断它要用的余额与数据库当中所拥有的余额是否一致。如果它大于拥有的余额,那么余额是不可用的。如果它当前的余额是空,为了计算方便,把余额设置为零。
接着进行优惠券的判断。拿到订单当中优惠券的ID,先查询出对象。判断如果优惠券不存在,那直接抛异常。
如果它存在去比较状态,关注是不是已经使用。如果已经使用,也不能使用。如果没有问题,为下边优惠券金额不报错,可以把当前所查询出来的优惠券的金额设置进去。
如果没有传递优惠券的信息,优惠券使用的金额就是0。
然后计算订单的支付金额。支付金额等于订单的总金额减去余额减去优惠券金额。
最后把订单的金额设置到订单的对象当中,再添加当前时间。存储到数据库,存完后,返回订单 ID。