Sfoglia il codice sorgente

bugfix:核销时减去退款金额
核销时修改订单状态为完成的情况

lyx 3 mesi fa
parent
commit
18e6757616

+ 55 - 42
alien-store/src/main/java/shop/alien/store/service/impl/LifeCouponServiceImpl.java

@@ -20,6 +20,7 @@ import shop.alien.mapper.*;
 import shop.alien.store.service.LifeCouponService;
 import shop.alien.store.service.LifeDiscountCouponStoreFriendService;
 import shop.alien.util.common.UniqueRandomNumGenerator;
+import shop.alien.util.common.constant.OrderStatusEnum;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -235,48 +236,60 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
         OrderCouponMiddle orderCouponMiddle = orderCouponMiddleMapper.selectOne(new LambdaQueryWrapper<OrderCouponMiddle>().eq(OrderCouponMiddle::getCouponCode, quanCode));
         if (!StringUtils.isEmpty(orderCouponMiddle)) {
             LifeUserOrder lifeUserOrder = lifeUserOrderMapper.selectOne(new LambdaQueryWrapper<LifeUserOrder>().eq(LifeUserOrder::getId, orderCouponMiddle.getOrderId()));
-                orderCouponMiddle.setStatus(2);
-                orderCouponMiddle.setUsedTime(new Date());
-                orderCouponMiddleMapper.updateById(orderCouponMiddle);
-                //通过订单id查询中间表 如果该订单下所有劵都为已核销状态更改订单表状态为已核销
-                List<OrderCouponMiddle> couponMiddleList = orderCouponMiddleMapper.selectList(new LambdaQueryWrapper<OrderCouponMiddle>()
-                        .eq(OrderCouponMiddle::getOrderId,lifeUserOrder.getId()));
-                boolean isExist =  couponMiddleList.stream()
-                        .allMatch(str -> str.getStatus()==2);
-                if(isExist){
-                    lifeUserOrder.setStatus(2);
-                    lifeUserOrder.setFinishTime(new Date());
-                    lifeUserOrder.setCreatedTime(new Date());
-                    lifeUserOrderMapper.updateById(lifeUserOrder);
-                }
-
-                StoreInfo storeInfo = storeInfoMapper.selectOne(new LambdaQueryWrapper<StoreInfo>().eq(StoreInfo::getId,lifeUserOrder.getStoreId()));
-                // TODO 抽成比例应该从商户里取
-                BigDecimal amounts = new BigDecimal(lifeUserOrder.getFinalPrice()).multiply(new BigDecimal(100));
-                // 先将抽成比例转换为BigDecimal,再除以100
-                BigDecimal commissionRate = new BigDecimal(storeInfo.getCommissionRate())
+            orderCouponMiddle.setStatus(OrderStatusEnum.USED.getStatus());
+            orderCouponMiddle.setUsedTime(new Date());
+            orderCouponMiddleMapper.updateById(orderCouponMiddle);
+            //通过订单id查询中间表 如果该订单下所有劵都为已核销状态更改订单表状态为已核销
+            List<OrderCouponMiddle> couponMiddleList = orderCouponMiddleMapper.selectList(new LambdaQueryWrapper<OrderCouponMiddle>()
+                    .eq(OrderCouponMiddle::getOrderId, lifeUserOrder.getId()));
+            // 排除要核销的券的 所以券状态
+            boolean isExist = couponMiddleList.stream().filter(x -> x.getId() != orderCouponMiddle.getId())
+                    .allMatch(str -> str.getStatus() == OrderStatusEnum.USED.getStatus());
+            if (isExist) {
+                lifeUserOrder.setStatus(OrderStatusEnum.USED.getStatus());
+                lifeUserOrder.setFinishTime(new Date());
+                lifeUserOrder.setCreatedTime(new Date());
+                lifeUserOrderMapper.updateById(lifeUserOrder);
+            }
+            // TODO  订单状态 -> 变已完成 筛选出未完成的状态
+            List<OrderCouponMiddle> collect = couponMiddleList.stream().filter(x -> x.getId() != orderCouponMiddle.getId())
+                    .filter(x -> x.getStatus() != OrderStatusEnum.WAIT_USE.getStatus() && x.getStatus() != OrderStatusEnum.REFUND_FAILED.getStatus())
+                    .collect(Collectors.toList());
+            if (collect.size() == 0) {
+                lifeUserOrder.setStatus(OrderStatusEnum.COMPLETE.getStatus());
+                lifeUserOrder.setFinishTime(new Date());
+                lifeUserOrder.setCreatedTime(new Date());
+                lifeUserOrderMapper.updateById(lifeUserOrder);
+            }
+            // 计算总退款金额(orderCouponMiddle金额按实际的存)
+            BigDecimal refundAmount = couponMiddleList.stream().filter(x -> x.getStatus() == OrderStatusEnum.REFUND.getStatus()).map(x -> x.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+            StoreInfo storeInfo = storeInfoMapper.selectOne(new LambdaQueryWrapper<StoreInfo>().eq(StoreInfo::getId, lifeUserOrder.getStoreId()));
+            // TODO 抽成比例应该从商户里
+            BigDecimal amounts = new BigDecimal(lifeUserOrder.getFinalPrice()).multiply(new BigDecimal(100)).subtract(refundAmount);
+            // 先将抽成比例转换为BigDecimal,再除以100
+            BigDecimal commissionRate = new BigDecimal(storeInfo.getCommissionRate())
                     .divide(new BigDecimal(100));
-                BigDecimal commission = amounts.multiply(commissionRate).setScale(0, RoundingMode.HALF_UP);
-                BigDecimal money = amounts.subtract(commission);
-
-                // 插入收入明细表数据
-                StoreIncomeDetailsRecord record = new StoreIncomeDetailsRecord();
-                record.setStoreId(Integer.parseInt(storeId));
-                record.setUserOrderId(orderCouponMiddle.getId());
-                record.setIncomeType(lifeUserOrder.getCouponType());
-                record.setBusinessId(orderCouponMiddle.getCouponId());
-                record.setCommission(commission.intValue());
-                record.setMoney(money.intValue());
-                storeIncomeDetailsRecordMapper.insert(record);
-
-                // 店铺账户余额增加
-                UpdateWrapper<StoreUser> updateWrapper = new UpdateWrapper();
-                updateWrapper.eq("store_id", storeId);
-                updateWrapper.eq("delete_flag", 0);
-                updateWrapper.setSql("money = money + " + money);
-                storeUserMapper.update(null, updateWrapper);
-                resultMap.put("code", "true");
-                resultMap.put("message", "核销成功");
+            BigDecimal commission = amounts.multiply(commissionRate).setScale(0, RoundingMode.HALF_UP);
+            BigDecimal money = amounts.subtract(commission);
+
+            // 插入收入明细表数据
+            StoreIncomeDetailsRecord record = new StoreIncomeDetailsRecord();
+            record.setStoreId(Integer.parseInt(storeId));
+            record.setUserOrderId(orderCouponMiddle.getId());
+            record.setIncomeType(lifeUserOrder.getCouponType());
+            record.setBusinessId(orderCouponMiddle.getCouponId());
+            record.setCommission(commission.intValue());
+            record.setMoney(money.intValue());
+            storeIncomeDetailsRecordMapper.insert(record);
+
+            // 店铺账户余额增加
+            UpdateWrapper<StoreUser> updateWrapper = new UpdateWrapper();
+            updateWrapper.eq("store_id", storeId);
+            updateWrapper.eq("delete_flag", 0);
+            updateWrapper.setSql("money = money + " + money);
+            storeUserMapper.update(null, updateWrapper);
+            resultMap.put("code", "true");
+            resultMap.put("message", "核销成功");
         } else {
             resultMap.put("code", "false");
             resultMap.put("message", "核销失败");
@@ -505,7 +518,7 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
                 return R.fail("该劵不在有效期内");
             }
         } else if (lifeCoupon.getExpirationType().equals("2")) {//类型为:2 指定时间段
-            String[] strings = lifeCoupon.getValidityPeriod() .split(",");
+            String[] strings = lifeCoupon.getValidityPeriod().split(",");
             long start = Long.parseLong(strings[0]);
             long end = Long.parseLong(strings[1]);
             LocalDate startDate = Instant.ofEpochMilli(start)