电商业务简单下单逻辑
买了东西,提交订单,订单确认的过程,减库存,减优惠券,减余额,在操作失败时,需要回退等
用户->订单系统
|--商品服务
|--优惠券服务
|--用户服务
确认订单逻辑
1. 校验合法性
2. 保存订单,用户不可见
3. 减库存,件优惠券,减于额
4. 确认订单
|-- 确认成功
|-- 确认失败
|--发送失败消息到MQ
|--库存服务监听,回退
|--优惠券服务监听,回退
|-- 用户服务监听,回退
数据库表
用户表: id,姓名,密码,手机号,积分,注册时间,余额
余额日志表:id,订单id,类型(付款还是退款),发生金额,创建时间,校验的时候需要使用,避免重复,或重试
优惠券 ,ID,price,userId,orderId,isUsed,createTime
商品:ID,name,goodsNumber,price,goodsDesc,createTime
订单:orderId,userId,status(未确认,已确认,已取消,无效,退款等),payStatus(未支付,支付中,已支付),shippingStatus(发货状态),address,收货人,商品Id,数量,价格,总价格,运费,订单价格,优惠券Id, 优惠券支付金额,已付金额,支付金额,创建时间
订单商品操作日志(一定要记录,备查,校验使用):商品Id,订单Id,购买数量,创建时间
订单支付表:支付编号,订单号,支付金额,是否支付
消息队列生成记录(接收到的mq消息):id,groupName,topic,tag,key,body,status(是否处理),创建时间
消息队列消费:ID,groupName,topic,tag,key,body,status(处理中,成功,失败),处理次数(总失败放弃),时间
订单校验
1. 检查定时是否存在,校验不过抛异常
2. 检查商品是否存在:通过订单中的商品id,调用商品服务查找商品
3.检查用户是否存在:通过订单中的用户id,查询用户服务
4. 简单订单金额是是否合法:是否和商品服务中查询的价格一样
5 数量是否合法,是否大于库存等
保存订单
1. 设置订单id,随机不重复的id,需要返回
2. 核算运费,按自己规则
3. 总金额是否合法 ,通过订单的单价和数量再计算一下价格,检查是否和订单传过来的总价格一致
4. 是否使用余额,如果使用,查看是否合法,和db中保存的余额比较,如果没有使用设置为0,方便计算
5.是否使用优惠券
6.计算应该支付的金额
7.创建时间
8.保存到db
扣减库存
1. 商品表减库存 ,这里的参数可以是日志记录表的pojo对象,实现类校验参数(订单id,商品id,数量合法等),校验是否库存不足等
2. 记录日志,可以类似记账的方式,减库存记录负数,加库存记录正数
扣减余额
1. 用户余额,可能是支付,可能是退款。这里需要通过日志表防止多次付款或者多次退款,需要通过余额扣减日志判断,如果订单有日志,不需要再支持,如果订单有日志,才可以退款等
2. 记录日志
回退库存
1. 通过MQ groupName,tags,keys(订单id)到MQ消费记录表查找记录,如果消费过判断消费状态(成功,处理中,失败)
1. 通过存在MQ日志记录的情况,处理成功:返回,正在处理:返回:
处理失败的情况,把状态修改为正在处理,保存(加锁更新)
2. 不存在日志记录的情况,直接insert消息到日志表,tag,key,状态,body,msgId等 ,状态为正在处理
3. 回退库存
4. 记录库存操作日志
5. 更改MQ消费记录的状态为处理成功
6. 如果发生异常,需要修改状态为处理失败,或者设置最大处理次数
待续。。。