From f26537e926d7ad2d725e059700142ba14c0c2b1f Mon Sep 17 00:00:00 2001
From: jiangqs <jiangqs>
Date: 星期三, 12 七月 2023 21:04:27 +0800
Subject: [PATCH] 定时任务延时任务

---
 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java |  205 ++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 179 insertions(+), 26 deletions(-)

diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java
index 61a5e66..6f8c7c8 100644
--- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java
+++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java
@@ -8,6 +8,7 @@
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.utils.bean.BeanUtils;
 import com.ruoyi.common.core.utils.uuid.IdUtils;
+import com.ruoyi.common.redis.service.RedisService;
 import com.ruoyi.member.domain.dto.*;
 import com.ruoyi.member.domain.pojo.coupon.*;
 import com.ruoyi.member.domain.vo.*;
@@ -16,12 +17,17 @@
 import com.ruoyi.member.service.member.MemberCouponService;
 import com.ruoyi.member.service.member.MemberService;
 import com.ruoyi.system.api.constant.AppErrorConstant;
+import com.ruoyi.system.api.constant.DelayTaskEnum;
 import com.ruoyi.system.api.domain.dto.*;
+import com.ruoyi.system.api.domain.poji.config.DelayTask;
 import com.ruoyi.system.api.domain.poji.goods.Goods;
 import com.ruoyi.system.api.domain.poji.member.MemberCoupon;
+import com.ruoyi.system.api.domain.poji.shop.Shop;
 import com.ruoyi.system.api.domain.vo.MerGoodsPriceListVo;
 import com.ruoyi.system.api.service.RemoteActivityService;
+import com.ruoyi.system.api.service.RemoteConfigService;
 import com.ruoyi.system.api.service.RemoteGoodsService;
+import com.ruoyi.system.api.service.RemoteShopService;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
@@ -30,6 +36,7 @@
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -69,6 +76,15 @@
 
     @Resource
     private MemberCouponRecordService memberCouponRecordService;
+
+    @Resource
+    private RemoteShopService remoteShopService;
+
+    @Resource
+    private RedisService redisService;
+
+    @Resource
+    private RemoteConfigService remoteConfigService;
 
     /**
      * @description  平台获取优惠券列表
@@ -245,6 +261,8 @@
             coupon.setCreateUserId(mgtCouponEditDto.getUserId());
             coupon.setCouponFrom(1);
             coupon.setAuditStatus(2);
+            coupon.setLimitNumber(0);
+            coupon.setSendFlag(0);
             //创建优惠券统计
             couponTotal = new CouponTotal();
             couponTotal.setCouponId(couponId);
@@ -302,10 +320,13 @@
                     .collect(Collectors.toList());
             couponRelUserService.saveBatch(couponRelUserList);
         }
-        this.saveOrUpdate(coupon);
         //处理优惠券发放
         if(coupon.getSendTimeType()==1){
             sendCoupon(coupon,relUserIdList);
+            coupon.setSendFlag(1);
+            this.saveOrUpdate(coupon);
+        }else{
+            this.saveOrUpdate(coupon);
         }
     }
 
@@ -401,6 +422,90 @@
         }
     }
 
+
+    private void sendCouponNow(Coupon coupon, List<Long> relUserIdList){
+        //1.手动领取2.全部用户3.会员用户4非会员用户5自定义
+        Date nowTime = new Date();
+        Integer sendType = coupon.getSendType();
+        List<Long> userIdList = new ArrayList<>();
+        Long shopId = null;
+        if(coupon.getCouponFrom()==2 && sendType==3){
+            shopId = coupon.getShopId();
+        }
+        if(sendType >= 2 && sendType <= 4){
+            userIdList = memberService.listIdBySendType(sendType,shopId);
+        }else if(sendType == 5){
+            //关联类型1.用户管理筛选2.活动管理筛选
+            if(coupon.getRelationType()==2){
+                Integer relationActivityType = coupon.getRelationActivityType();
+                //关联活动类型1秒杀活动
+                switch(relationActivityType){
+                    case 1:
+                        userIdList = remoteActivityService.listUserIdByActivityId(coupon.getRelationActivityId()).getData();
+                        break;
+                    default:
+                        break;
+                }
+            }else if(coupon.getRelationType()==1){
+                userIdList = relUserIdList;
+            }
+        }
+        if(relUserIdList!=null&&!relUserIdList.isEmpty()){
+            List<MemberCoupon> memberCouponList = new ArrayList<>();
+            MemberCoupon memberCoupon;
+            Integer sendTotal = 0;
+            Integer sendPerson = 0;
+            String memberCouponId;
+            Integer sendUserTotal;
+            for(Long userId : userIdList){
+                memberCouponId = IdUtils.simpleUUID();
+                memberCoupon = new MemberCoupon();
+                memberCoupon.setId(memberCouponId);
+                memberCoupon.setDelFlag(0);
+                memberCoupon.setCouponId(coupon.getCouponId());
+                memberCoupon.setUserId(userId);
+                memberCoupon.setShopId(coupon.getShopId());
+                memberCoupon.setCouponType(coupon.getCouponType());
+                memberCoupon.setCouponStatus(coupon.getCouponStatus());
+                memberCoupon.setCouponName(coupon.getCouponName());
+                memberCoupon.setSendType(coupon.getSendType());
+                memberCoupon.setSendTimeType(coupon.getSendTimeType());
+                memberCoupon.setSendTime(coupon.getSendTime());
+                memberCoupon.setMoneyThreshold(coupon.getMoneyThreshold());
+                memberCoupon.setDiscountMoney(coupon.getDiscountMoney());
+                memberCoupon.setDiscountPercent(coupon.getDiscountPercent());
+                memberCoupon.setUseScope(coupon.getUseScope());
+                memberCoupon.setValidTimeType(coupon.getValidTimeType());
+                memberCoupon.setValidStartTime(coupon.getValidStartTime());
+                memberCoupon.setValidEndTime(coupon.getValidEndTime());
+                memberCoupon.setValidDay(coupon.getValidDay());
+                memberCoupon.setReceiveTime(nowTime);
+                memberCoupon.setRelGoodsIds(coupon.getRelGoodsIds());
+                //有效期处理1.时间段2.领取之日起
+                if(coupon.getValidTimeType()==1){
+                    memberCoupon.setDeadlineTime(coupon.getValidEndTime());
+                }else if(coupon.getValidTimeType()==2){
+                    memberCoupon.setDeadlineTime(DateUtils.addDays(nowTime,coupon.getValidDay()));
+                }
+                memberCouponList.add(memberCoupon);
+                sendTotal = sendTotal + 1;
+                if(coupon.getSendType()==1){
+                    sendUserTotal = memberCouponService.totalMemberCouponByUserAndCoupon(userId,coupon.getCouponId());
+                    if(sendUserTotal!=null&&sendUserTotal>0){
+                    }else{
+                        sendPerson = sendPerson + 1;
+                    }
+                }
+                memberCouponRecordService.updateMemberCouponRecord(coupon,userId,1);
+            }
+            memberCouponService.saveBatch(memberCouponList);
+            //处理优惠券统计
+            if(sendTotal>0){
+                couponMapper.updateCouponTotal(coupon.getCouponId(),sendTotal,sendPerson);
+            }
+        }
+    }
+
     /**
      * @description  平台删除优惠券
      * @author  jqs
@@ -431,31 +536,61 @@
      */
     @Override
     public void timingSendCoupon(){
+        //获取1小时内需要发送的优惠券
         LambdaQueryWrapper<Coupon> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(Coupon::getDelFlag,0);
         queryWrapper.eq(Coupon::getCouponStatus,1);
         queryWrapper.eq(Coupon::getSendTimeType,2);
         queryWrapper.eq(Coupon::getAuditStatus,2);
-        queryWrapper.eq(Coupon::getSendTime,DateUtils.getNowDate());
+        queryWrapper.eq(Coupon::getSendFlag,0);
+        Date checkTime = DateUtils.addMinutes(new Date(),61);
+        queryWrapper.le(Coupon::getSendTime, checkTime);
         List<Coupon> couponList = couponMapper.selectList(queryWrapper);
         if(couponList!=null&&!couponList.isEmpty()){
-            List<CouponRelUser> couponRelUserList;
-            List<Long> userIdList = new ArrayList<>();
-            for(Coupon coupon : couponList){
-                if(coupon.getSendType()==5&&coupon.getRelationType()==1){
-                    couponRelUserList = couponRelUserService.list(new LambdaQueryWrapper<CouponRelUser>().eq(CouponRelUser::getDelFlag,0).eq(CouponRelUser::getCouponId,coupon.getCouponId()));
-                    if(couponRelUserList!=null&&!couponRelUserList.isEmpty()){
-                        userIdList = couponRelUserList.stream()
-                                .map(CouponRelUser::getUserId)
-                                .collect(Collectors.toList());
-                    }else{
-                        userIdList = new ArrayList<>();
-                    }
+            for(Coupon coupon : couponList) {
+                String couponId = coupon.getCouponId();
+                Date sendTime = coupon.getSendTime();
+                long currentTimeMillis = System.currentTimeMillis();
+                long timeDifference = currentTimeMillis - sendTime.getTime();
+                DelayTask delayTask = remoteConfigService.getDelayTask(DelayTaskEnum.COUPON_SEND_DELAY_TASK.getCode()+"-"+couponId).getData();
+                if(delayTask==null){
+                    //创建延时任务控制优惠券定时发放
+                    redisService.setCacheObject(DelayTaskEnum.COUPON_SEND_DELAY_TASK.getCode()+"-"+couponId,sendTime,timeDifference, TimeUnit.MILLISECONDS);
+                    delayTask = new DelayTask();
+                    delayTask.setDelFlag(0);
+                    delayTask.setCreateTime(new Date());
+                    delayTask.setEndTime(sendTime);
+                    delayTask.setRedisKey(DelayTaskEnum.COUPON_SEND_DELAY_TASK.getCode()+"-"+couponId);
+                    remoteConfigService.addDelayTask(delayTask);
                 }
-                //发送优惠券
-                sendCoupon(coupon, userIdList);
             }
         }
+    }
+
+    /**
+     * @description  定时发送优惠券
+     * @author  jqs
+     * @date    2023/7/12 12:01
+     * @param couponId
+     * @return  void
+     */
+    @Override
+    public void autoTimeSendCoupon(String couponId){
+        List<CouponRelUser> couponRelUserList;
+        List<Long> userIdList = new ArrayList<>();
+        Coupon coupon = this.getById(couponId);
+        if(coupon.getSendType()==5&&coupon.getRelationType()==1){
+            couponRelUserList = couponRelUserService.list(new LambdaQueryWrapper<CouponRelUser>().eq(CouponRelUser::getDelFlag,0).eq(CouponRelUser::getCouponId,coupon.getCouponId()));
+            if(couponRelUserList!=null&&!couponRelUserList.isEmpty()){
+                userIdList = couponRelUserList.stream()
+                        .map(CouponRelUser::getUserId)
+                        .collect(Collectors.toList());
+            }else{
+                userIdList = new ArrayList<>();
+            }
+        }
+        //发送优惠券
+        sendCouponNow(coupon, userIdList);
     }
 
     /**
@@ -587,7 +722,6 @@
         coupon.setAuditReason(mgtCouponAuditDto.getAuditReason());
         coupon.setUpdateTime(new Date());
         coupon.setUpdateUserId(mgtCouponAuditDto.getUserId());
-        this.saveOrUpdate(coupon);
         //审核通过后判断是否立即发放
         if(coupon.getCouponStatus()==2&&coupon.getSendTimeType()==1){
             List<CouponRelUser> couponRelUserList = couponRelUserService.list(new LambdaQueryWrapper<CouponRelUser>().eq(CouponRelUser::getDelFlag,0).eq(CouponRelUser::getCouponId,coupon.getCouponId()));
@@ -599,7 +733,9 @@
             }
             //发放优惠券
             sendCoupon(coupon, userIdList);
+            coupon.setSendFlag(1);
         }
+        this.saveOrUpdate(coupon);
     }
 
     /**
@@ -749,6 +885,8 @@
             coupon.setCreateTime(new Date());
             coupon.setCreateUserId(merCouponEditDto.getUserId());
             coupon.setCouponFrom(2);
+            coupon.setSendFlag(0);
+            coupon.setLimitNumber(merCouponEditDto.getLimitNumber());
             //创建优惠券统计
             couponTotal = new CouponTotal();
             couponTotal.setCouponId(couponId);
@@ -901,19 +1039,34 @@
         if(!getAbleCouponPageVoList.isEmpty()){
             String relGoodsIds;
             List<Goods> goodsList;
-            List<String> goodsLimitList;
+            List<String> goodsLimitList = null;
+            Shop shop = null;
             for(AppGetAbleCouponPageVo appGetAbleCouponPageVo : getAbleCouponPageVoList){
                 relGoodsIds = appGetAbleCouponPageVo.getRelGoodsIds();
-                goodsList = remoteGoodsService.listGoodsByGoodsId(relGoodsIds).getData();
-                if(!goodsList.isEmpty()){
-                    goodsLimitList = goodsList.stream().map(goods -> {
-                        String goodsName = goods.getGoodsName();
-                        goodsName = "限制" + goodsName + "适用";
-                        return goodsName;
-                    }).collect(Collectors.toList());
-                    appGetAbleCouponPageVo.setGoodsLimitList(goodsLimitList);
+                if(StringUtils.isNotBlank(relGoodsIds)){
+                    goodsList = remoteGoodsService.listGoodsByGoodsId(relGoodsIds).getData();
+                    if(!goodsList.isEmpty()){
+                        goodsLimitList = goodsList.stream().map(goods -> {
+                            String goodsName = goods.getGoodsName();
+                            goodsName = "限制" + goodsName + "适用";
+                            return goodsName;
+                        }).collect(Collectors.toList());
+                    }
+                }else{
+                    goodsLimitList = new ArrayList<>();
+                    if(appGetAbleCouponPageVo.getShopId()!=null){
+                        if(shop!=null&&shop.getShopId().equals(appGetAbleCouponPageVo.getShopId())){
+                        }else{
+                            shop = remoteShopService.getShop(appGetAbleCouponPageVo.getShopId()).getData();
+                        }
+                        goodsLimitList.add(shop.getShopName()+"通用");
+                    }else{
+                        goodsLimitList.add("全场通用");
+                    }
                 }
+                appGetAbleCouponPageVo.setGoodsLimitList(goodsLimitList);
             }
+
         }
         return getAbleCouponPageVoList;
     }

--
Gitblit v1.7.1