Explorar el Código

bugfix:订单退款后更新团购券/代金券库存

lyx hace 2 meses
padre
commit
66c5e04dea

+ 49 - 47
alien-store/src/main/java/shop/alien/store/service/LifeUserOrderService.java

@@ -421,9 +421,10 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
                 .eq("order_id", refundOrder.getOrderId()).eq("delete_flag",0));
         // 1.查询订单信息  订单表 + 中间表
         LifeUserOrder order = lifeUserOrderMapper.selectById(refundOrder.getOrderId());
+        Integer refundCouponAmount = refundOrder.getRefundCouponAmount();
         // 待使用的券(可退款的券 || 退款失败的券 目前没做失败的券状态更新 暂时不加)
         List<OrderCouponMiddle> orderCouponMiddles1 = orderCouponMiddles.stream().filter(orderCouponMiddle -> orderCouponMiddle.getStatus() == OrderStatusEnum.WAIT_USE.getStatus()).collect(Collectors.toList());
-        if (orderCouponMiddles1.size() < refundOrder.getRefundCouponAmount()) {
+        if (orderCouponMiddles1.size() < refundCouponAmount) {
             returnMap.put("fail", "退款券数不足");
             return returnMap;
         }
@@ -445,7 +446,7 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
         boolean ifPartialRefund = false;
         String PartialRefundCode = "";
         // 只要本次退款不是全退都是部分退
-        if (refundOrder.getRefundCouponAmount() != orderCouponMiddles.size()){
+        if (refundCouponAmount != orderCouponMiddles.size()){
             ifPartialRefund = true;
             PartialRefundCode = UniqueRandomNumGenerator.generateUniqueCode(12);
         }
@@ -453,7 +454,7 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
         String refundMessage = "";
 
         // 更新的中间表id
-        List<Integer> updateIds = orderCouponMiddles1.stream().limit(refundOrder.getRefundCouponAmount()).map(x -> x.getId()).collect(Collectors.toList());
+        List<Integer> updateIds = orderCouponMiddles1.stream().limit(refundCouponAmount).map(x -> x.getId()).collect(Collectors.toList());
         if (result.equals("调用失败")) {
             refundMessage = "编号为"+order.getOrderNo()+"的订单退款失败,请重新发起申请。";
             // TODO 退款失败目前不做处理
@@ -479,8 +480,8 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
                 refundOrder.setPartialRefundCode(PartialRefundCode);
             }
         }
-        // 更新数据(中间表数据+订单表数据:当已退款个数+当前退款个数=已使用的券数时,订单状态改为已退款)
-        if (refundCouponCount + refundOrder.getRefundCouponAmount() == orderCouponMiddles.size()) {
+        // 更新总订单数据(中间表数据+订单表数据:当已退款个数+当前退款个数=已使用的券数时,订单状态改为已退款)
+        if (refundCouponCount + refundCouponAmount == orderCouponMiddles.size()) {
             lifeUserOrderMapper.update(null,new UpdateWrapper<LifeUserOrder>().eq("id",order.getId())
                     .set("status",OrderStatusEnum.REFUND.getStatus())
                     .set("refund_time",now)
@@ -492,7 +493,7 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
                 // 处理 quanId 为 null 的情况,例如日志记录
                 log.error("更新优惠券状态失败");
             }
-        } else if (refundCouponCount + refundOrder.getRefundCouponAmount() != orderCouponMiddles.size() && refundOrder.getRefundCouponAmount() == orderCouponMiddles1.size()) {
+        } else if (refundCouponCount + refundCouponAmount != orderCouponMiddles.size() && refundCouponAmount == orderCouponMiddles1.size()) {
             // 累计退券个数+当前退券个数!=总个数 且 当前退券数量 = 可退券数
             lifeUserOrderMapper.update(null,new UpdateWrapper<LifeUserOrder>().eq("id",order.getId())
                     .set("status",OrderStatusEnum.COMPLETE.getStatus())
@@ -526,26 +527,42 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
                 log.error("LifeUserOrderService requestRefund Stack={}", e);
             }
         }
-        // 券核销完成后,退款的情况下,需要向 store_income_details_record 表插入一条记录
-//        if (null != refundOrder.getStoreId()) {
-//            BigDecimal amounts = new BigDecimal(refundOrder.getRefundMoney()).multiply(new BigDecimal(100));
-//            BigDecimal commission = amounts.multiply(new BigDecimal(0.04)).setScale(0, RoundingMode.HALF_UP);
-//            BigDecimal money = amounts.subtract(commission);
-//
-//            StoreIncomeDetailsRecord record = new StoreIncomeDetailsRecord();
-//            record.setStoreId(refundOrder.getStoreId());
-//            record.setUserOrderId(Integer.parseInt(refundOrder.getOrderId()));
-//            record.setIncomeType(Integer.parseInt(refundOrder.getQuanType()));
-//            record.setBusinessId(Integer.parseInt(refundOrder.getQuanId()));
-//            record.setCommission(-commission.intValue());
-//            record.setMoney(-money.intValue());
-//            storeIncomeDetailsRecordMapper.insert(record);
-//        }
+        // 退款后更新库存
+        Integer couponType = order.getCouponType();
+        OrderCouponMiddle orderCouponMiddle = orderCouponMiddleMapper.selectOne(new QueryWrapper<OrderCouponMiddle>().eq("order_id", refundOrder.getOrderId()).last("limit 1"));
+        Integer couponId = orderCouponMiddle.getCouponId();
+
+        restoreInventory(couponType, refundCouponAmount, couponId);
         returnMap.put("success", refundMessage);
         return returnMap;
     }
 
     /**
+     * 退款,取消订单时候,恢复库存
+     * @param couponType 类型 1-代金券,2-团购
+     * @param refundCouponAmount 团购券/代金券张数
+     * @param couponId 团购券/代金券id
+     */
+    private void restoreInventory(Integer couponType, Integer refundCouponAmount, Integer couponId) {
+        try{
+            if( CouponTypeEnum.COUPON.getCode() == couponType){
+                // 代金券信息
+                lifeCouponMapper.update(null, new LambdaUpdateWrapper<LifeCoupon>()
+                        .setSql("single_qty=single_qty+" + refundCouponAmount)
+                        .eq(LifeCoupon::getId, couponId));
+            } else {
+                // 团购信息
+                lifeGroupBuyMainMapper.update(null, new LambdaUpdateWrapper<LifeGroupBuyMain>()
+                        .setSql("inventory_num=inventory_num+" + refundCouponAmount)
+                        .eq(LifeGroupBuyMain::getId, couponId));
+            }
+        } catch (Exception e) {
+            log.error("LifeUserOrderService,恢复团购券/代金券数量报错={}", e);
+        }
+
+    }
+
+    /**
      * 退款检查
      * @param refundOrder
      * @return
@@ -714,8 +731,12 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             lifeDiscountCouponUserMapper.updateById(lifeDiscountCouponUser);
         }
         //3.根据购买数量增加中间关系 订单id+券编号 确定一条数据
-        BigDecimal sumPrice = new BigDecimal(0);
-        for (int i = 0; i < lifeUserOrderDto.getCount(); i++) {
+        int buyCount = lifeUserOrderDto.getCount();
+        BigDecimal totalPrice = new BigDecimal(lifeUserOrderDto.getFinalPrice());
+        BigDecimal countDecimal = new BigDecimal(buyCount);
+        BigDecimal perPrice = totalPrice.divide(countDecimal, 2, RoundingMode.DOWN);
+        BigDecimal lastPrice = totalPrice.subtract(perPrice.multiply(countDecimal.subtract(BigDecimal.ONE)));
+        for (int i = 0; i < buyCount; i++) {
             String code = UniqueRandomNumGenerator.generateUniqueCode(12);
             OrderCouponMiddle orderCouponMiddle = new OrderCouponMiddle();
             // 订单id
@@ -725,29 +746,20 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             // 团购/代金券 code
             orderCouponMiddle.setCouponCode(code);
             // 团购/代金券价格
-            if(i == lifeUserOrderDto.getCount() - 1){
-                orderCouponMiddle.setPrice(new BigDecimal(lifeUserOrderDto.getFinalPrice()).subtract(sumPrice).setScale(2,RoundingMode.DOWN));
-            } else {
-                BigDecimal divide = new BigDecimal(lifeUserOrderDto.getFinalPrice()).divide(new BigDecimal(lifeUserOrderDto.getCount()), 2, RoundingMode.DOWN);
-                orderCouponMiddle.setPrice(divide);
-                sumPrice = sumPrice.add(divide);
-            }
+            orderCouponMiddle.setPrice(i == buyCount - 1 ? lastPrice : perPrice);
             // 订单状态
             orderCouponMiddle.setStatus(0);
             orderCouponMiddleService.save(orderCouponMiddle);
-            // 使用时间
-            // 退款时间
-            // 删除标记
         }
         //4. 代金券/团购库存扣除 coupon_type 1 代金券 2团购
         int successful = 0;
         if(lifeUserOrderDto.getCouponType() == 2){
             // 团购库存扣除
             successful = lifeGroupBuyMainMapper.update(null, new UpdateWrapper<LifeGroupBuyMain>()
-                    .eq("id", lifeUserOrderDto.getCouponId()).setSql("inventory_num = inventory_num - " + lifeUserOrderDto.getCount()));
+                    .eq("id", lifeUserOrderDto.getCouponId()).ge("inventory_num",lifeUserOrderDto.getCount()).setSql("inventory_num = inventory_num - " + lifeUserOrderDto.getCount()));
         } else {
             successful = lifeCouponMapper.update(null, new UpdateWrapper<LifeCoupon>()
-                    .eq("id", lifeUserOrderDto.getCouponId()).setSql("single_qty = single_qty - " + lifeUserOrderDto.getCount()));
+                    .eq("id", lifeUserOrderDto.getCouponId()).ge("single_qty",lifeUserOrderDto.getCount()).setSql("single_qty = single_qty - " + lifeUserOrderDto.getCount()));
         }
         if(successful == 0){
             log.error("库存不足");
@@ -799,18 +811,8 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             if (0 != updateNum && orderCouponMiddles.size() > 0) {
                 Integer couponId = orderCouponMiddles.get(0).getCouponId();
                 // 2.过期后更新库存
-                if (1 == lifeUserOrder.getCouponType()) {
-                    // 代金券
-                    // 恢复库存
-                    lifeCouponMapper.update(null, new LambdaUpdateWrapper<LifeCoupon>()
-                            .setSql("single_qty=single_qty+" + updateNum)
-                            .eq(LifeCoupon::getId, couponId));
-                } else {
-                    // 团购
-                    lifeGroupBuyMainMapper.update(null, new LambdaUpdateWrapper<LifeGroupBuyMain>()
-                            .setSql("inventory_num=inventory_num+" + updateNum)
-                            .eq(LifeGroupBuyMain::getId, couponId));
-                }
+                Integer couponType = lifeUserOrder.getCouponType();
+                restoreInventory(couponType, updateNum, couponId);
             } else {
                 log.error("取消失败,未查询到订单");
                 throw new RuntimeException("取消失败,未查询到订单");