1、商家平台-订单操作(添加\移除菜品) 问题同购物车操作

用户在下单后,对菜品数量进行调整,可告知服务员,服务员可以再后台进行订单操作,做订单操作需要满足下列条件:

  • 当前桌台的账单状态:待付款【DFK】
  • 追加菜品,菜品库存足够
  • 退菜时,当菜品数量变0,但不会删除订单项,且退菜不可以把库存退成负数

image.png
实现流程:
1、接收参数:菜品id dishId,订单编号 orderNo,操作类型 opertionType;
2、判定订单是否为待支付状态(DFK)、菜品是否为有效并且起售状态;
3、给订单加锁,防止同一时刻,其他线程操作该订单;
4、判断操作类型:添加/删除 菜品
4.1、添加菜品
a、redis做菜品库存预扣;
b、修改可核算订单项中菜品数量;
c、mysql中扣减库存,若失败,redis中库存回滚;
4.2、删除菜品
a、修改可核算订单项中菜品数量;
b、mysql中扣减库存,若失败则抛出异常;
c、增加redis中库存;
5、计算订单总金额;
6、修改订单总金额;
7、返回订单信息;

2、转台需要满足什么条件?

需要满足下列条件:
1、桌台状态:当前桌台【使用中】、目标桌台【空闲中】
2、目标桌台,不能是当前桌台
3、当前桌台的账单状态:待付款【DFK】

3、转台为什么需要加分布式锁? 怎么添加?

防止转台时,有其他用户正在对目标桌台开桌;
使用redissonClient,key为业务前缀+目标桌台的id;

  1. String keyTargetTableId = AppletCacheConstant.OPEN_TABLE_LOCK + targetTableId;
  2. RLock lock = redissonClient.getLock(keyTargetTableId);

4、转台业务流程?

image.png
实现流程:
1、锁定目标桌台;
2、查询目标桌台状态;
2.1、桌台空闲;
2.2、桌台非空闲,报异常;
3、订单关联新的桌台;
4、修改桌台状态:原桌台为空闲、目标桌台为使用中;

5、订单结算的状态有哪些?

image.png

状态 解释
待支付 用户下单创建订单时
支付中 收银员发起结算,生产二维码,用户未扫码或扫码后,三方未给出最终结果钱
支付失败 三方告知当前订单结算失败时
已结算 三方告知当前订单结算成功时
免单 当前订单无需支付,直接结单
退款【单独字段】 已结算后发起的线下退款操作

6、结算时,为什么需要根据订单生成交易单?

根据订单生成交易单的优点:
● 项目解耦,设计成通用的支付服务
● 支付失败时,基于原始订单可以重新生成新的交易单发起新的支付
● 使用交易单,可以设计合并支付的功能
day07商家平台-订单、转台、结算、退款操作 - 图4

7、退款满足条件是什么?

1、订单处于【已结算】,才可退款
2、退款金额不能超过实付款
3、收款人与退款人必须是同一个人,如果不同不可退款
image.png