lubo před 3 měsíci
rodič
revize
90454d5425

+ 19 - 1
ruoyi-admin/src/main/java/com/ruoyi/schedule/SubsidyModeAutoSchedule.java

@@ -1,6 +1,12 @@
 package com.ruoyi.schedule;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.rabbitmq.client.RabbitMqClient;
+import com.ruoyi.rabbitmq.constant.DelayedConstant;
 import com.ruoyi.shop.constants.ShopConstants;
 import com.ruoyi.shop.order.domain.ShopOrderDetail;
 import com.ruoyi.shop.order.service.IShopOrderDetailService;
@@ -8,6 +14,7 @@ import com.ruoyi.shop.order.service.IShopOrderService;
 import com.ruoyi.shop.product.domain.bo.ProductViewUpdate;
 import com.ruoyi.shop.product.service.IProductService;
 import com.ruoyi.subsidy.domain.SubsidyModeAuto;
+import com.ruoyi.subsidy.domain.SubsidySharedPool;
 import com.ruoyi.subsidy.service.ISubsidyModeAutoService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -19,6 +26,7 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -30,6 +38,7 @@ import java.util.Map;
 @RequiredArgsConstructor
 public class SubsidyModeAutoSchedule {
     private final ISubsidyModeAutoService subsidyModeAutoService;
+    private final RabbitMqClient rabbitMqClient;
 
     /**
      * 每晚0点过1分开始执行一次模式自动切换
@@ -44,7 +53,16 @@ public class SubsidyModeAutoSchedule {
         for (SubsidyModeAuto subsidyModeAuto : list) {
             try {
                 log.info("开始执行模式切换:商户ID:{}", subsidyModeAuto.getBusinessId());
-                subsidyModeAutoService.switchMode(subsidyModeAuto);
+                SubsidySharedPool subsidySharedPool = subsidyModeAutoService.switchMode(subsidyModeAuto);
+                if(ObjectUtil.isNull(subsidySharedPool) || ObjectUtil.isNull(subsidySharedPool.getExpireTime()) || subsidySharedPool.getSettlemented())
+                {
+                   continue;
+                }
+                int lazyTime = Long.valueOf(DateUtil.between(new Date(), subsidySharedPool.getExpireTime(), DateUnit.MS)).intValue();
+                rabbitMqClient.send(DelayedConstant.SubsidySharedPoolExpireDelayedConstant.SUBSIDY_SHARED_POOL_EXPIRE_DELAYED_EXCHANGE,
+                    DelayedConstant.SubsidySharedPoolExpireDelayedConstant.SUBSIDY_SHARED_POOL_EXPIRE_DELAYED_ROUTING,
+                    String.valueOf(subsidySharedPool.getSharedId()),
+                    lazyTime);
             } catch (Exception e) {
                 log.error("模式切换异常:{}", e.getMessage());
             }

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/subsidy/SubsidyModeController.java

@@ -110,8 +110,8 @@ public class SubsidyModeController extends BaseController {
             return R.ok();
         }
         int lazyTime = Long.valueOf(DateUtil.between(new Date(), subsidySharedPool.getExpireTime(), DateUnit.MS)).intValue();
-        rabbitMqClient.send(DelayedConstant.OrderEndDelayedConstant.ORDER_END_DELAYED_EXCHANGE,
-            DelayedConstant.OrderEndDelayedConstant.ORDER_END_DELAYED_ROUTING,
+        rabbitMqClient.send(DelayedConstant.SubsidySharedPoolExpireDelayedConstant.SUBSIDY_SHARED_POOL_EXPIRE_DELAYED_EXCHANGE,
+            DelayedConstant.SubsidySharedPoolExpireDelayedConstant.SUBSIDY_SHARED_POOL_EXPIRE_DELAYED_ROUTING,
             String.valueOf(subsidySharedPool.getSharedId()),
             lazyTime);
         return R.ok();

+ 3 - 2
ruoyi-line/src/main/java/com/ruoyi/subsidy/service/ISubsidyModeAutoService.java

@@ -1,6 +1,7 @@
 package com.ruoyi.subsidy.service;
 
 import com.ruoyi.subsidy.domain.SubsidyModeAuto;
+import com.ruoyi.subsidy.domain.SubsidySharedPool;
 import com.ruoyi.subsidy.domain.vo.SubsidyModeAutoVo;
 import com.ruoyi.subsidy.domain.bo.SubsidyModeAutoBo;
 import com.ruoyi.common.core.page.TableDataInfo;
@@ -111,12 +112,12 @@ public interface ISubsidyModeAutoService {
      * 定时切换补贴模式
      * @param subsidyModeAuto 补贴模式自动转换
      */
-    void switchMode(SubsidyModeAuto subsidyModeAuto);
+    SubsidySharedPool switchMode(SubsidyModeAuto subsidyModeAuto);
 
     /**
      * 人数已满后的切换
      * @param businessId 商家ID
      * @param newValidQueueCount 新的待处理队列数量
      */
-    void switchMode(Long businessId,Long newValidQueueCount);
+    SubsidySharedPool switchMode(Long businessId,Long newValidQueueCount);
 }

+ 1 - 0
ruoyi-line/src/main/java/com/ruoyi/subsidy/service/ISubsidyQueueService.java

@@ -4,6 +4,7 @@ import com.ruoyi.common.core.validate.QueryGroup;
 import com.ruoyi.onlineorder.domain.OnlineOrder;
 import com.ruoyi.onlineorder.enums.OnlineOrderRefundStatus;
 import com.ruoyi.subsidy.domain.SubsidyQueue;
+import com.ruoyi.subsidy.domain.SubsidySharedPool;
 import com.ruoyi.subsidy.domain.bo.SubsidyExchangePointBo;
 import com.ruoyi.subsidy.domain.bo.SubsidyQueueImportBo;
 import com.ruoyi.subsidy.domain.bo.SubsidyQueueMoveBo;

+ 29 - 17
ruoyi-line/src/main/java/com/ruoyi/subsidy/service/impl/SubsidyModeAutoServiceImpl.java

@@ -1,10 +1,13 @@
 package com.ruoyi.subsidy.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.ruoyi.business.domain.Business;
 import com.ruoyi.business.exception.BusinessExceptionEnum;
 import com.ruoyi.business.service.IBusinessService;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.BeanCopyUtils;
 import com.ruoyi.common.utils.StringUtils;
@@ -13,6 +16,7 @@ import com.ruoyi.common.core.domain.PageQuery;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.rabbitmq.constant.DelayedConstant;
 import com.ruoyi.subsidy.domain.SubsidyMode;
 import com.ruoyi.subsidy.domain.SubsidySharedPool;
 import com.ruoyi.subsidy.domain.bo.SubsidyModeConversionLogBo;
@@ -293,28 +297,29 @@ public class SubsidyModeAutoServiceImpl implements ISubsidyModeAutoService {
         );
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
-    public void switchMode(SubsidyModeAuto subsidyModeAuto) {
+    public SubsidySharedPool switchMode(SubsidyModeAuto subsidyModeAuto) {
         Long businessId = subsidyModeAuto.getBusinessId();
         //当前模式
         SubsidyMode currentMode = this.subsidyModeService.loadCurrentMode(businessId);
         if(currentMode==null)
         {
             log.info("当前模式不存在,商户ID:{}", businessId);
-            return ;
+            return null;
         }
         //目标模式
         SubsidyMode targetMode = this.subsidyModeService.loadById(subsidyModeAuto.getTargetModeId(), false);
         if(targetMode==null)
         {
             log.info("目标模式不存在,商户ID:{}, 目标模式ID:{}", businessId, subsidyModeAuto.getTargetModeId());
-            return ;
+            return null;
         }
 
         if(currentMode.getModeId().equals(targetMode.getModeId()))
         {
             log.info( "当前模式与目标模式一致,商户ID:{}", businessId);
-            return ;
+            return null;
         }
 
         if(currentMode.getSharedMode() && !currentMode.getImmediateArrival())
@@ -323,19 +328,19 @@ public class SubsidyModeAutoServiceImpl implements ISubsidyModeAutoService {
             if(subsidySharedPool==null)
             {
                 log.info("均摊池不存在,商户ID:{}", businessId);
-                return ;
+                return null;
             }
             if(!currentMode.getModeId().equals(subsidySharedPool.getSubsidyModeId()))
             {
                 log.info("当前模式与均摊池内的模式不一致,当前模式是:{},均摊池内的模式是:{}", currentMode.getModeId(), subsidySharedPool.getSubsidyModeId());
-                return ;
+                return null;
             }
 
-            if(subsidySharedPool.getSettlemented())
+            if(!subsidySharedPool.getSettlemented())
             {
-                return;
+                subsidySharedPoolService.settlement(subsidySharedPool.getSharedId(), SharedSettlementMode.EARLY_SETTLEMENT);
             }
-            subsidySharedPoolService.settlement(subsidySharedPool.getSharedId(), SharedSettlementMode.EARLY_SETTLEMENT);
+
         }
         currentMode.setDefaulted(false);
         subsidyModeMapper.updateById(currentMode);
@@ -343,11 +348,6 @@ public class SubsidyModeAutoServiceImpl implements ISubsidyModeAutoService {
         targetMode.setDefaulted( true);
         subsidyModeMapper.updateById(targetMode);
 
-        if(targetMode.getSharedMode() && !targetMode.getImmediateArrival())
-        {
-            subsidySharedPoolService.initSharedPool(targetMode, BigDecimal.ZERO);
-        }
-
         subsidyModeConversionLogService.insertByBo(SubsidyModeConversionLogBo.builder()
             .businessId(businessId)
             .fromModeId(currentMode.getModeId())
@@ -356,21 +356,33 @@ public class SubsidyModeAutoServiceImpl implements ISubsidyModeAutoService {
             .toModeName(targetMode.getName())
             .conversionTime(new Date())
             .build());
+
+        if(targetMode.getSharedMode() && !targetMode.getImmediateArrival())
+        {
+            SubsidySharedPool subsidySharedPool = subsidySharedPoolService.initSharedPool(targetMode, BigDecimal.ZERO);
+            return subsidySharedPool;
+        }
+
+        return null;
+
+
     }
 
     @Override
-    public void switchMode(Long businessId, Long newValidQueueCount) {
+    public SubsidySharedPool switchMode(Long businessId, Long newValidQueueCount) {
         SubsidyModeAuto subsidyModeAuto = this.loadByBusinessId(businessId);
         if(subsidyModeAuto==null)
         {
             log.info("当前模式不存在,商户ID:{}", businessId);
-            return ;
+            return null;
         }
         if(ObjectUtil.isNotNull(subsidyModeAuto.getMaxQueueCount())&& newValidQueueCount >= subsidyModeAuto.getMaxQueueCount())
         {
             log.info("当前模式已满足条件,商户ID:{}", businessId);
-            this.switchMode(subsidyModeAuto);
+            SubsidySharedPool subsidySharedPool = this.switchMode(subsidyModeAuto);
+            return subsidySharedPool;
         }
+        return null;
     }
 
 }

+ 17 - 1
ruoyi-line/src/main/java/com/ruoyi/subsidy/service/impl/SubsidyQueueServiceImpl.java

@@ -4,6 +4,7 @@ import cn.dev33.satoken.secure.BCrypt;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -20,6 +21,7 @@ import com.ruoyi.businessDayBill.domain.bo.BusinessDayBillChangeBo;
 import com.ruoyi.businessDayBill.enums.BusinessDayBillChangeType;
 import com.ruoyi.businessDayBill.service.IBusinessDayBillService;
 import com.ruoyi.common.core.domain.PageQuery;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.BeanCopyUtils;
@@ -29,12 +31,15 @@ import com.ruoyi.onlineorder.domain.OnlineOrder;
 import com.ruoyi.onlineorder.enums.OnlineOrderRefundStatus;
 import com.ruoyi.onlineorder.mapper.OnlineOrderMapper;
 import com.ruoyi.onlineorder.service.IOnlineOrderService;
+import com.ruoyi.rabbitmq.client.RabbitMqClient;
+import com.ruoyi.rabbitmq.constant.DelayedConstant;
 import com.ruoyi.shop.business.domain.UserBusinessRole;
 import com.ruoyi.shop.business.domain.bo.UserBusinessChangeIntegralBo;
 import com.ruoyi.shop.business.service.IUserBusinessRoleService;
 import com.ruoyi.subsidy.domain.SubsidyCutIn;
 import com.ruoyi.subsidy.domain.SubsidyMode;
 import com.ruoyi.subsidy.domain.SubsidyQueue;
+import com.ruoyi.subsidy.domain.SubsidySharedPool;
 import com.ruoyi.subsidy.domain.bo.*;
 import com.ruoyi.subsidy.domain.vo.SubsidyQueueVo;
 import com.ruoyi.subsidy.enums.PurchaseSource;
@@ -122,6 +127,8 @@ public class SubsidyQueueServiceImpl implements ISubsidyQueueService {
     @Resource
     private IUserBalanceRecordService userBalanceRecordService;
 
+    private final RabbitMqClient rabbitMqClient;
+
     private static final Set<String> ALLOWED_ORDER_COLUMNS =
         Collections.unmodifiableSet(
             new HashSet<>(Collections.singletonList("queue_time"))
@@ -409,7 +416,16 @@ public class SubsidyQueueServiceImpl implements ISubsidyQueueService {
             .build());
 
         Long newValidQueueCount = this.validQueueCountAndLock(order.getBusinessId());
-        subsidyModeAutoService.switchMode(order.getBusinessId(), newValidQueueCount);
+        SubsidySharedPool subsidySharedPool = subsidyModeAutoService.switchMode(order.getBusinessId(), newValidQueueCount);
+        if(ObjectUtil.isNull(subsidySharedPool) || ObjectUtil.isNull(subsidySharedPool.getExpireTime()) || subsidySharedPool.getSettlemented())
+        {
+            return ;
+        }
+        int lazyTime = Long.valueOf(DateUtil.between(new Date(), subsidySharedPool.getExpireTime(), DateUnit.MS)).intValue();
+        rabbitMqClient.send(DelayedConstant.SubsidySharedPoolExpireDelayedConstant.SUBSIDY_SHARED_POOL_EXPIRE_DELAYED_EXCHANGE,
+            DelayedConstant.SubsidySharedPoolExpireDelayedConstant.SUBSIDY_SHARED_POOL_EXPIRE_DELAYED_ROUTING,
+            String.valueOf(subsidySharedPool.getSharedId()),
+            lazyTime);
     }
 
     @Override

+ 2 - 0
ruoyi-line/src/main/java/com/ruoyi/subsidy/service/impl/SubsidySharedPoolServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ruoyi.subsidy.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.ruoyi.business.domain.Business;
 import com.ruoyi.business.domain.bo.BusinessBalanceRecordBo;
@@ -235,6 +236,7 @@ public class SubsidySharedPoolServiceImpl implements ISubsidySharedPoolService {
         return expireTime;
     }
 
+
     /**
      * 补贴均摊到期结算
      */