电商业务简单下单逻辑

时间:2024-04-17 10:00:59

电商业务简单下单逻辑

买了东西,提交订单,订单确认的过程,减库存,减优惠券,减余额,在操作失败时,需要回退等

用户->订单系统

    |--商品服务

    |--优惠券服务

    |--用户服务

确认订单逻辑

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. 如果发生异常,需要修改状态为处理失败,或者设置最大处理次数

待续。。。