Просмотр исходного кода

完成模式切换的所有逻辑

lubo месяцев назад: 8
Родитель
Сommit
8a69fa32c4

+ 11 - 0
ruoyi-base/src/main/java/com/ruoyi/base/revenue/domain/vo/RevenueSharingConfigVo.java

@@ -92,5 +92,16 @@ public class RevenueSharingConfigVo {
     @ApiModelProperty("扫码订单用户年累计消费额度限制")
     private BigDecimal onlineOrderUserYearConsumptionLimit;
 
+    public Boolean gtOnlineOrderUserYearConsumptionLimit(BigDecimal total) {
+        if(this.onlineOrderUserYearConsumptionLimit == null)
+        {
+            return true;
+        }
+        return total.compareTo(this.onlineOrderUserYearConsumptionLimit) > 0;
+    }
+
+
+
+
 
 }

+ 8 - 0
ruoyi-business/src/main/java/com/ruoyi/business/domain/Business.java

@@ -269,4 +269,12 @@ public class Business extends BaseEntity {
     public Boolean balanceEnough(BigDecimal amount) {
         return this.balance.compareTo(amount) >= 0;
     }
+
+    public Boolean gtOnlineOrderConsumptionLimit(BigDecimal amount) {
+        if(this.onlineOrderConsumptionLimit == null)
+        {
+            return true;
+        }
+        return amount.compareTo(this.onlineOrderConsumptionLimit) > 0;
+    }
 }

+ 2 - 1
ruoyi-line/src/main/java/com/ruoyi/onlineorder/exception/OnlineOrderExceptionEnum.java

@@ -12,7 +12,8 @@ public enum OnlineOrderExceptionEnum implements IIntegerEnum {
     // TODO 注意检查错误码,保证系统内唯一
     OnlineOrder_IS_NOT_EXISTS(200001, "在线订单不存在"),
 
-    ;
+    OnlineOrder_CONSUMPTION_LIMIT_ERROR( 200002, "在线订单消费金额超出限制"),
+    OnlineOrder_USER_YEAR_CONSUMPTION_LIMIT_ERROR( 200003, "在线订单用户年度消费金额超出限制");
 
     private Integer code;
 

+ 5 - 0
ruoyi-line/src/main/java/com/ruoyi/onlineorder/mapper/OnlineOrderMapper.java

@@ -1,8 +1,12 @@
 package com.ruoyi.onlineorder.mapper;
 
+import cn.hutool.core.date.DateTime;
 import com.ruoyi.onlineorder.domain.OnlineOrder;
 import com.ruoyi.onlineorder.domain.vo.OnlineOrderVo;
 import com.ruoyi.common.core.mapper.BaseMapperPlus;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
 
 /**
  * 在线订单Mapper接口
@@ -12,4 +16,5 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus;
  */
 public interface OnlineOrderMapper extends BaseMapperPlus<OnlineOrderMapper, OnlineOrder, OnlineOrderVo> {
 
+    BigDecimal payAmountTotal(@Param("userId") Long userId, @Param("startTime")DateTime startTime, @Param("endTime")DateTime endTime);
 }

+ 12 - 0
ruoyi-line/src/main/java/com/ruoyi/onlineorder/service/IOnlineOrderService.java

@@ -1,5 +1,6 @@
 package com.ruoyi.onlineorder.service;
 
+import cn.hutool.core.date.DateTime;
 import com.ruoyi.newwxpay.pay.PayNotifyResult;
 import com.ruoyi.onlineorder.domain.OnlineOrder;
 import com.ruoyi.onlineorder.domain.bo.CreateOnlineOrderBo;
@@ -10,6 +11,7 @@ import com.ruoyi.common.core.domain.PageQuery;
 import com.ruoyi.onlineorder.domain.vo.PayOnlineOrderVo;
 import com.ruoyi.shop.order.domain.ShopOrder;
 
+import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.List;
 
@@ -102,4 +104,14 @@ public interface IOnlineOrderService {
      * @return 订单信息
      */
     OnlineOrder loadByOrderNo(String outTradeNo, Boolean tw);
+
+    /**
+     * 获取用户支付总额
+     *
+     * @param userId 用户id
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     * @return 支付总额
+     */
+    BigDecimal payAmountTotal(Long userId, DateTime startTime, DateTime endTime);
 }

+ 26 - 0
ruoyi-line/src/main/java/com/ruoyi/onlineorder/service/impl/OnlineOrderServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ruoyi.onlineorder.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -84,6 +85,11 @@ public class OnlineOrderServiceImpl implements IOnlineOrderService {
     @Resource
     private IUserBusinessRoleService userBusinessRoleService;
 
+    @Lazy
+    @Resource
+    private IRevenueSharingConfigService iRevenueSharingConfigService;
+
+
     /**
      * 查询在线订单分页
      *
@@ -213,11 +219,26 @@ public class OnlineOrderServiceImpl implements IOnlineOrderService {
         return baseMapper.deleteBatchIds(ids) > 0;
     }
 
+
     @Override
     public PayOnlineOrderVo createOrder(CreateOnlineOrderBo bo) {
         User user = userService.getById(bo.getUserId(), true);
         Business business = businessService.loadById(bo.getBusinessId(), true);
+
+        if (business.gtOnlineOrderConsumptionLimit(business.getOnlineOrderConsumptionLimit()) ) {
+            throw new ServiceException("用户单笔在线订单消费金额超出限制,请勿下单!");
+        }
         business.isValid(true);
+
+
+        RevenueSharingConfigVo info = iRevenueSharingConfigService.getInfo();
+        BigDecimal payTotalAmount = this.payAmountTotal(user.getId(), DateUtil.beginOfYear(new Date()), DateUtil.endOfYear(new Date()));
+        BigDecimal total = payTotalAmount.add(bo.getOrderAmount());
+        if(info.gtOnlineOrderUserYearConsumptionLimit(total))
+        {
+            throw new ServiceException(String.format("用户年累计消费金额超出限制,请勿下单!当前累计金额:%s", total));
+        }
+
         OnlineOrder onlineOrder = new OnlineOrder();
         onlineOrder.setUserId(user.getId());
         onlineOrder.setUserMobile(user.getMobile());
@@ -249,6 +270,11 @@ public class OnlineOrderServiceImpl implements IOnlineOrderService {
         return payOnlineOrderVo;
     }
 
+    @Override
+    public BigDecimal payAmountTotal(Long userId, DateTime startTime, DateTime endTime) {
+        return this.baseMapper.payAmountTotal(userId, startTime, endTime);
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public OnlineOrder orderPayCallback(PayNotifyResult notifyResult) {

+ 7 - 0
ruoyi-line/src/main/java/com/ruoyi/subsidy/service/ISubsidyModeAutoService.java

@@ -112,4 +112,11 @@ public interface ISubsidyModeAutoService {
      * @param subsidyModeAuto 补贴模式自动转换
      */
     void switchMode(SubsidyModeAuto subsidyModeAuto);
+
+    /**
+     * 人数已满后的切换
+     * @param businessId 商家ID
+     * @param newValidQueueCount 新的待处理队列数量
+     */
+    void switchMode(Long businessId,Long newValidQueueCount);
 }

+ 20 - 5
ruoyi-line/src/main/java/com/ruoyi/subsidy/service/impl/SubsidyModeAutoServiceImpl.java

@@ -294,20 +294,20 @@ public class SubsidyModeAutoServiceImpl implements ISubsidyModeAutoService {
         if(currentMode==null)
         {
             log.info("当前模式不存在,商户ID:{}", businessId);
-            throw new ServiceException(SubsidyModeAutoExceptionEnum.CURRENT_MODE_IS_NOT_EXISTS);
+            return ;
         }
         //目标模式
         SubsidyMode targetMode = this.subsidyModeService.loadById(subsidyModeAuto.getTargetModeId(), false);
         if(targetMode==null)
         {
             log.info("目标模式不存在,商户ID:{}, 目标模式ID:{}", businessId, subsidyModeAuto.getTargetModeId());
-            throw new ServiceException(SubsidyModeAutoExceptionEnum.TARGET_MODE_IS_NOT_EXISTS);
+            return ;
         }
 
         if(currentMode.getModeId().equals(targetMode.getModeId()))
         {
             log.info( "当前模式与目标模式一致,商户ID:{}", businessId);
-            throw new ServiceException(SubsidyModeAutoExceptionEnum.CURRENT_MODE_IS_TARGET_MODE);
+            return ;
         }
 
         if(currentMode.getSharedMode() && !currentMode.getImmediateArrival())
@@ -316,12 +316,12 @@ public class SubsidyModeAutoServiceImpl implements ISubsidyModeAutoService {
             if(subsidySharedPool==null)
             {
                 log.info("均摊池不存在,商户ID:{}", businessId);
-                throw new ServiceException(SubsidySharedPoolExceptionEnum.SubsidySharedPool_IS_NOT_EXISTS);
+                return ;
             }
             if(!currentMode.getModeId().equals(subsidySharedPool.getSubsidyModeId()))
             {
                 log.info("当前模式与均摊池内的模式不一致,当前模式是:{},均摊池内的模式是:{}", currentMode.getModeId(), subsidySharedPool.getSubsidyModeId());
-                throw new ServiceException(SubsidyModeAutoExceptionEnum.CURRENT_MODE_IS_NOT_SHARED_MODE);
+                return ;
             }
 
             if(subsidySharedPool.getSettlemented())
@@ -351,4 +351,19 @@ public class SubsidyModeAutoServiceImpl implements ISubsidyModeAutoService {
             .build());
     }
 
+    @Override
+    public void switchMode(Long businessId, Long newValidQueueCount) {
+        SubsidyModeAuto subsidyModeAuto = this.loadByBusinessId(businessId);
+        if(subsidyModeAuto==null)
+        {
+            log.info("当前模式不存在,商户ID:{}", businessId);
+            return ;
+        }
+        if(ObjectUtil.isNotNull(subsidyModeAuto.getMaxQueueCount())&& newValidQueueCount >= subsidyModeAuto.getMaxQueueCount())
+        {
+            log.info("当前模式已满足条件,商户ID:{}", businessId);
+            this.switchMode(subsidyModeAuto);
+        }
+    }
+
 }

+ 13 - 5
ruoyi-line/src/main/java/com/ruoyi/subsidy/service/impl/SubsidyQueueServiceImpl.java

@@ -28,9 +28,7 @@ import com.ruoyi.subsidy.domain.SubsidyMode;
 import com.ruoyi.subsidy.domain.bo.SubsidyExchangePointBo;
 import com.ruoyi.subsidy.enums.SubsidyCancelType;
 import com.ruoyi.subsidy.enums.SubsidyStatus;
-import com.ruoyi.subsidy.service.ISubsidyCutInService;
-import com.ruoyi.subsidy.service.ISubsidyModeService;
-import com.ruoyi.subsidy.service.ISubsidySharedPoolService;
+import com.ruoyi.subsidy.service.*;
 import com.ruoyi.user.domain.bo.UserChangeBalanceBo;
 import com.ruoyi.user.enums.BalanceSourceType;
 import com.ruoyi.user.enums.IntegralSourceType;
@@ -43,7 +41,6 @@ import com.ruoyi.subsidy.domain.bo.SubsidyQueueBo;
 import com.ruoyi.subsidy.domain.vo.SubsidyQueueVo;
 import com.ruoyi.subsidy.domain.SubsidyQueue;
 import com.ruoyi.subsidy.mapper.SubsidyQueueMapper;
-import com.ruoyi.subsidy.service.ISubsidyQueueService;
 import com.ruoyi.subsidy.exception.SubsidyQueueExceptionEnum;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -96,8 +93,14 @@ public class SubsidyQueueServiceImpl implements ISubsidyQueueService {
     @Resource
     private IUserBusinessRoleService userBusinessRoleService;
 
+    @Lazy
+    @Resource
+    private IRevenueSharingConfigService iRevenueSharingConfigService;
+
+    @Lazy
+    @Resource
+    private ISubsidyModeAutoService subsidyModeAutoService;
 
-    private final IRevenueSharingConfigService iRevenueSharingConfigService;
     /**
      * 查询补贴排队分页
      *
@@ -339,6 +342,11 @@ public class SubsidyQueueServiceImpl implements ISubsidyQueueService {
             .remark(String.format("用户在线下单,订单金额%s,平台服务费:%s,商家让利:%s", order.getPayAmount(), onlineOrderServiceFee,shouldSubsidyAmount))
             .build());
 
+
+        Long newValidQueueCount = this.validQueueCountAndLock(order.getBusinessId());
+
+        subsidyModeAutoService.switchMode(order.getBusinessId(), newValidQueueCount)
+
     }
 
     @Override

+ 4 - 1
ruoyi-line/src/main/resources/mapper/onlineorder/OnlineOrderMapper.xml

@@ -31,5 +31,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="updateTime" column="update_time"/>
     </resultMap>
 
-
+    <select id="payAmountTotal" resultType="java.math.BigDecimal">
+        SELECT IFNULL(SUM(pay_amount),0) as total FROM tb_online_order
+        WHERE user_id = #{userId} AND create_time &gt;= #{startTime} AND create_time &lt;= #{endTime} AND  pay_status = 5
+    </select>
 </mapper>