开发者学堂课程【RocketMQ 知识精讲与项目实战(第二阶段):校验订单实现】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/703/detail/12412
校验订单实现
内容介绍:
一、校验订单功能
二、总结
一、校验订单功能
在check的地方抽取一个方法,比如叫 checkorder,再传递 order 对象到这个方法里面,在这里边添加注释叫做校验订单,根据流程分析。
第一步校验订单是否存在;
第二步是校验订单当中的商品是否存在;
第三步是校验下单用户是否存在
第四步是校验订单金额是否合法;
第五步是校验订单当中的商品数量是否合法
如果都通过的说明这个订单是没有问题的,就可以进行下一步操作。
现在去看一下第一步校验订单是否存在,直接判断它如果能等于空就不能往下走,直接拖一个异常,之前有一个 CastException.cast,在每举类当中找一个当前的订单,它不合法的一个常量去抛出,这里边有一个 shoporder 订单无效这么一个常量传递过去,然后这里会进行一个异常抛出,只要抛出异常,后面就不能执行。
第二步校验订单的商品首先取出 getGoodsId,通过 getGoodsId 从数据库当中去查,怎么从数据库查呢?
当然是去调用服务的提供方从数据库查,所以现在它要去调用 getGoods service 这个地方需要把接口接入进来,所以添加一个接口叫做 IGoodsService,有了接口之后回到private,给它注入进来之后在接口当中需要提供一个查询根据主键ID 去查询当前商品对象的方法,现在先把方法写出来叫做 findOne,从这里面取出 getGoodsID ,之后返回来一个 getGoods 对象,需要 getGoods 提供一个方法,先把接口完善一下,
这个接口的意思是根据 id 查询商品对象,要在 getGoods service 实现接口,对于当前 getGoods service 需要把它进行一个配置,把它配置成 double 服务,定义一下interfaceClass 接口全新的令名,也就是服务提供服务名,在这里边查询数据库要通过 mapper 接口进行数据库的查询,
所以把private TradeGoodsMapper goodsMapper 拿出来,然后通过@Autowired 自动装备的方式去注入,它要去注入当前 TradeGoodsMapper 接口是不能直接去用的,必须要产生接口的一个实现类对象去用,那么这一切可以通过思普如去进行处理。
要加上@ Mapper 注解,思普如扫描到这个注解会产生接口的类去调用。在这里边它要根据 ID 查询商品对象,首先为了保证代码的见证性,先判断一下传递过来的这个 ID 如果为空,就不需要查了,直接去抛异常,有一个常量叫做 ShopCode.Shop-request 参数非法异常,如果没问题调用 goodsMapper.selectByPrimaryKey,再把 goodsId 传递过去,这样根据 ID 去查询商品对象的服务就可提供。
如果这个地方查询出来为空,需要继续抛异常。
第三步校验下单用户是否存在,通过用户的 ID 判断,方式可以和 goodsService 一样,去定义一个当前的 IUserservice 的接口,现在在订单的实践类当中去注入它,
private IUesrService userService,继续进行判断, userService.提供一个根据主键去查询的方法,让继续返回 user 对象,现在把这个方法创建出来,返回 tradeuser ,实现刚才的接口,那么要在编写一个服务,让它去实现 userService 接口。
先去判断是否合法,如果不合法就直接抛异常,ShopCode.;如果合法,查询数据库,把 userMapper 拿过来,不要忘记加上@Mapper ,如果 ID 正常,查 select 把 userid 传递过去进行一个
查询,现在服务的提供方已经编辑,之后调用这个服务根据主键去查询用户对象,在下图判断如果查询回来等于空,那么直接抛异常 shop.shop-USER-NO-EXIST,就不用往下走,如果非空,说明用户对象是正确的。
接下来继续校验订单金额是否合法,订单的金额其实是在当前里边的 order.getPayAmount()现在判断金额等不等于商品的单价乘以商品的数量,商品对象已经查询出来,所以需要.getgoodsService 商品的单价去乘以 multiply 商品的数量,而商品的数量在 getGoodsNumber,看总价等不等于单价乘以商品的数量,
注意 multiply 的 getGoodsNumber 进行相乘的时候,需要依然 getGoodsNumber 对象,把它放到 good 方法当中,这两个比较完之后相等是等于零,如果现在判断如果不等于零,那么说明这两个不相等,不相等给它抛出一个异常,叫做 shopcode.shop-order
看里面订单金额总价不正确,有这个常量法,用它就可以。
订单的金额合法之后还要继续判断订单的数量是否合法,数量的合法指的是当前订单当中购买的商品数量要等于或者小于当前总库存的数量,判断 order.getGoodsNumber 不能大于,如果大于当前要抛异常,如果大于等于 goods.getGoodsNumber 说明买的商品数量大于库存数量,所以要抛出一个异常 shopcode.shop-….
这些东西都做完之后说明当前的订单校验通过,但凡有一个没有通过都会去抛异常导致程序往下走。
为了看得更加清楚,打印日志,在下图那里加上一个@s1f4j 去打印
所做的第一步 Log.info 校验订单完成。
二、总结
根据流程分析完成以下五步校验法,其中第一步校验订单是否存在,
第二步是数校验订单中的商品是否存在,第三步是校验下单用户是否存在,第四步是校验订单金额是否合法,第五不是校验订单商品数量是否合法,直接判断对象是否为空,如果为空,直接抛异常;
而校验订单商品是否存在,是通过 goodsService 去完成校验,根据逐渐去查询,查询之后做一个判断,然后校验下单用户是否存在,也是通过 userService 去发起一个远程 RPC 的调用去判断当前的用户对象是否存在,而订单的金额校验再去判断总的金额是否等于订单的单价乘以总的数量,如果不相等,说明这个订单金额是有问题的,然后再去判断一下商品的数量是否合法,主要是来判断商品的数量不能大于当前总库存的数量,如果大于,需要去说明当前库存不足而抛出异常,整个校验订单的功能开发完。