Răsfoiți Sursa

bugfix:有效期问题

lyx 2 luni în urmă
părinte
comite
7e3b7272a7

+ 86 - 73
alien-store/src/main/java/shop/alien/store/service/impl/LifeCouponServiceImpl.java

@@ -17,6 +17,7 @@ import shop.alien.entity.store.*;
 import shop.alien.entity.store.dto.LifeDiscountCouponStoreFriendDto;
 import shop.alien.entity.store.vo.LifeCouponStatusVo;
 import shop.alien.mapper.*;
+import shop.alien.store.config.BaseRedisService;
 import shop.alien.store.service.LifeCouponService;
 import shop.alien.store.service.LifeDiscountCouponStoreFriendService;
 import shop.alien.util.common.UniqueRandomNumGenerator;
@@ -61,6 +62,7 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
 
     private final StoreInfoMapper storeInfoMapper;
 
+    private final BaseRedisService baseRedisService;
 
     @Override
     public LifeCoupon addOrUpdateCoupon(LifeCoupon lifeCoupon) {
@@ -233,75 +235,85 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
     @Transactional(rollbackFor = Exception.class)
     public Map<String, String> newCouponVerify(String storeId, String quanCode) {
         Map<String, String> resultMap = new HashMap<>();
-        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(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().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);
-
-                //发放好友优惠券
-                LifeDiscountCouponStoreFriendDto lifeDiscountCouponStoreFriendDto = new LifeDiscountCouponStoreFriendDto();
-                lifeDiscountCouponStoreFriendDto.setOrderId(Integer.parseInt(lifeUserOrder.getId()));
-                lifeDiscountCouponStoreFriendService.issueFriendCoupon(lifeDiscountCouponStoreFriendDto);
-            }
-            // 订单状态 -> 已完成 筛选出未完成的状态
-            List<OrderCouponMiddle> collect = couponMiddleList.stream().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);
-
-                //发放好友优惠券
-                LifeDiscountCouponStoreFriendDto lifeDiscountCouponStoreFriendDto = new LifeDiscountCouponStoreFriendDto();
-                lifeDiscountCouponStoreFriendDto.setOrderId(Integer.parseInt(lifeUserOrder.getId()));
-                lifeDiscountCouponStoreFriendService.issueFriendCoupon(lifeDiscountCouponStoreFriendDto);
-            }
-            // 计算总退款金额(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()));
-            // 先将抽成比例转换为BigDecimal,再除以100
-            BigDecimal commissionRate = new BigDecimal(storeInfo.getCommissionRate())
-                    .divide(new BigDecimal(100));
-            // 感觉有问题。HALF_UP有问题。
-            BigDecimal commission = orderCouponMiddle.getPrice().multiply(commissionRate).setScale(2, RoundingMode.HALF_UP);
-            BigDecimal money = orderCouponMiddle.getPrice().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 {
+        String lockKey = "coupon:use:" + quanCode;
+        if(baseRedisService.hasKey(lockKey)) {
             resultMap.put("code", "false");
-            resultMap.put("message", "核销失败");
+            resultMap.put("message", "请勿重复核销");
+            return resultMap;
+        };
+        baseRedisService.setListRight(lockKey, quanCode);
+        try {
+            OrderCouponMiddle orderCouponMiddle = orderCouponMiddleMapper.selectOne(new LambdaQueryWrapper<OrderCouponMiddle>().eq(OrderCouponMiddle::getCouponCode, quanCode).in(OrderCouponMiddle::getStatus,OrderStatusEnum.WAIT_USE.getStatus(),OrderStatusEnum.REFUND_FAILED.getStatus()));
+            if (!StringUtils.isEmpty(orderCouponMiddle)) {
+                // 查询总订单
+                LifeUserOrder lifeUserOrder = lifeUserOrderMapper.selectOne(new LambdaQueryWrapper<LifeUserOrder>().eq(LifeUserOrder::getId, orderCouponMiddle.getOrderId()));
+                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().allMatch(str -> str.getStatus() == OrderStatusEnum.USED.getStatus());
+                // 订单状态 -> 已完成 筛选出未完成的状态
+                List<OrderCouponMiddle> collect = couponMiddleList.stream().filter(x -> x.getStatus() == OrderStatusEnum.WAIT_USE.getStatus() || x.getStatus() == OrderStatusEnum.REFUND_FAILED.getStatus())
+                        .collect(Collectors.toList());
+                if (isExist) {
+                    lifeUserOrder.setStatus(OrderStatusEnum.USED.getStatus());
+                    lifeUserOrder.setFinishTime(new Date());
+                    lifeUserOrder.setCreatedTime(new Date());
+                    lifeUserOrderMapper.updateById(lifeUserOrder);
+
+                    //发放好友优惠券
+                    LifeDiscountCouponStoreFriendDto lifeDiscountCouponStoreFriendDto = new LifeDiscountCouponStoreFriendDto();
+                    lifeDiscountCouponStoreFriendDto.setOrderId(Integer.parseInt(lifeUserOrder.getId()));
+                    lifeDiscountCouponStoreFriendService.issueFriendCoupon(lifeDiscountCouponStoreFriendDto);
+                } else if (collect.size() == 0) {
+                    lifeUserOrder.setStatus(OrderStatusEnum.COMPLETE.getStatus());
+                    lifeUserOrder.setFinishTime(new Date());
+                    lifeUserOrder.setCreatedTime(new Date());
+                    lifeUserOrderMapper.updateById(lifeUserOrder);
+
+                    //发放好友优惠券
+                    LifeDiscountCouponStoreFriendDto lifeDiscountCouponStoreFriendDto = new LifeDiscountCouponStoreFriendDto();
+                    lifeDiscountCouponStoreFriendDto.setOrderId(Integer.parseInt(lifeUserOrder.getId()));
+                    lifeDiscountCouponStoreFriendService.issueFriendCoupon(lifeDiscountCouponStoreFriendDto);
+                }
+                // 计算总退款金额(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()));
+                // 先将抽成比例转换为BigDecimal,再除以100
+                BigDecimal commissionRate = new BigDecimal(storeInfo.getCommissionRate())
+                        .divide(new BigDecimal(100));
+                // 感觉有问题。HALF_UP有问题。 price 正常存储
+                BigDecimal commission = orderCouponMiddle.getPrice().multiply(new BigDecimal(100).multiply(commissionRate)).setScale(2, RoundingMode.HALF_UP);
+                BigDecimal money = orderCouponMiddle.getPrice().multiply(new BigDecimal(100)).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", "核销失败");
+            }
+        } finally {
+            baseRedisService.delete(lockKey);
         }
         return resultMap;
     }
@@ -590,12 +602,13 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
             throw new IllegalArgumentException("小时必须在0-23之间");
         }
         // 处理跨天的情况,例如22点到次日3点
-        if (buyUseStartTime > buyUseEndTime) {
-             if(currentHour < buyUseStartTime && currentHour > buyUseEndTime){
-                 return R.fail("该劵不在有效期内");
-             }
+        if (buyUseStartTime >= buyUseEndTime) {
+            if(currentHour<buyUseStartTime &&  currentHour>buyUseEndTime) {
+                return R.fail("该劵不在有效期内");
+            }
+
         } else {
-            if (currentHour < buyUseStartTime || currentHour > buyUseEndTime) {
+            if (!(currentHour >= buyUseStartTime && currentHour <= buyUseEndTime)) {
                 return R.fail("该劵不在有效期内");
             }
         }