From f44e4d609e7efaed9eac545137970b1e334f8106 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期六, 21 九月 2024 09:01:36 +0800
Subject: [PATCH] 修改bug

---
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java |   95 +++++++++++++++++++++++++----------------------
 1 files changed, 50 insertions(+), 45 deletions(-)

diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java
index f685434..f1b1ae1 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java
@@ -1,14 +1,16 @@
 package com.ruoyi.goods.service.async;
 
+import com.ruoyi.common.core.constant.SecurityConstants;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.redis.service.RedisService;
-import com.ruoyi.goods.domain.GoodsGroupPurchase;
 import com.ruoyi.system.api.constants.DelayTaskEnum;
 import com.ruoyi.system.api.domain.DelayTask;
+import com.ruoyi.system.api.domain.GoodsGroupPurchase;
 import com.ruoyi.system.api.domain.GoodsSeckill;
 import com.ruoyi.system.api.feignClient.SysUserClient;
 import java.time.Duration;
 import java.time.LocalDateTime;
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -30,64 +32,69 @@
 
     @Async
     @Transactional(rollbackFor = Exception.class)
-    public void seckillScheduleTask(GoodsSeckill goodsSeckill) {
-        LocalDateTime startTime = goodsSeckill.getStartTime();
-        LocalDateTime endTime = goodsSeckill.getEndTime();
-        //秒杀在一小时内开始
-        if (isWithinOneHour(startTime)) {
-            Long id = goodsSeckill.getId();
-            //秒杀已经开始
-            if (LocalDateTime.now().isAfter(startTime)) {
-                handleStartDelayTask(id, DelayTaskEnum.SECKILL_START_TASK, startTime, 3L);
-            } else {
-                Duration duration = Duration.between(LocalDateTime.now(), startTime);
-                handleStartDelayTask(id, DelayTaskEnum.SECKILL_START_TASK, startTime,
-                        duration.getSeconds());
+    public void seckillScheduleTask(List<GoodsSeckill> goodsSeckillList) {
+        for (GoodsSeckill goodsSeckill : goodsSeckillList) {
+            LocalDateTime startTime = goodsSeckill.getStartTime();
+            LocalDateTime endTime = goodsSeckill.getEndTime();
+            // 秒杀在一小时内开始
+            if (isWithinOneHour(startTime)) {
+                Long id = goodsSeckill.getId();
+                // 秒杀已经开始
+                if (LocalDateTime.now().isAfter(startTime)) {
+                    handleStartDelayTask(id, DelayTaskEnum.SECKILL_START_TASK, startTime, 3L);
+                    log.info(">>>>>>>>>>>>>>>>>>>>秒杀商品:{} 开始秒杀<<<<<<<<<<<<<<<<<<<<", id);
+                } else {
+                    Duration duration = Duration.between(LocalDateTime.now(), startTime);
+                    handleStartDelayTask(id, DelayTaskEnum.SECKILL_START_TASK, startTime,
+                            duration.getSeconds());
+                }
+                // 秒杀结束延时任务
+                handleEndDelayTask(id, DelayTaskEnum.SECKILL_END_TASK, endTime);
             }
-            log.info(">>>>>>>>>>>>>>>>>>>>秒杀商品:{} 开始秒杀<<<<<<<<<<<<<<<<<<<<", id);
-            //秒杀结束延时任务
-            handleEndDelayTask(id, DelayTaskEnum.SECKILL_END_TASK, endTime);
-
         }
     }
 
     @Async
     @Transactional(rollbackFor = Exception.class)
-    public void groupPurchaseScheduleTask(GoodsGroupPurchase groupPurchase) {
-        LocalDateTime startTime = groupPurchase.getStartTime();
-        LocalDateTime endTime = groupPurchase.getEndTime();
-        //秒杀在一小时内开始
-        if (isWithinOneHour(startTime)) {
-            Long id = groupPurchase.getId();
-            //秒杀已经开始,三秒后执行
-            if (LocalDateTime.now().isAfter(startTime)) {
-                handleStartDelayTask(id, DelayTaskEnum.GROUP_PURCHASES_START_TASK, startTime, 3L);
-            } else {
-                Duration duration = Duration.between(LocalDateTime.now(), startTime);
-                handleStartDelayTask(id, DelayTaskEnum.GROUP_PURCHASES_START_TASK, startTime,
-                        duration.getSeconds());
+    public void groupPurchaseScheduleTask(List<GoodsGroupPurchase> groupPurchaseList) {
+        for (GoodsGroupPurchase goodsGroupPurchase : groupPurchaseList) {
+            LocalDateTime startTime = goodsGroupPurchase.getStartTime();
+            LocalDateTime endTime = goodsGroupPurchase.getEndTime();
+            // 团购在一小时内开始
+            if (isWithinOneHour(startTime)) {
+                Long id = goodsGroupPurchase.getId();
+                // 团购已经开始,三秒后执行
+                if (LocalDateTime.now().isAfter(startTime)) {
+                    handleStartDelayTask(id, DelayTaskEnum.GROUP_PURCHASES_START_TASK, startTime,
+                            3L);
+                } else {
+                    Duration duration = Duration.between(LocalDateTime.now(), startTime);
+                    handleStartDelayTask(id, DelayTaskEnum.GROUP_PURCHASES_START_TASK, startTime,
+                            duration.getSeconds());
+                }
+                // 团购结束延时任务
+                handleEndDelayTask(id, DelayTaskEnum.GROUP_PURCHASES_END_TASK, endTime);
             }
-            //秒杀结束延时任务
-            handleEndDelayTask(id, DelayTaskEnum.GROUP_PURCHASES_END_TASK, endTime);
         }
     }
-
+    
     private boolean isWithinOneHour(LocalDateTime startTime) {
-        LocalDateTime checkTime = LocalDateTime.now().plusHours(1);
+        LocalDateTime checkTime = LocalDateTime.now().plusMinutes(61);
         return checkTime.isAfter(startTime);
     }
 
     private void handleEndDelayTask(Long id, DelayTaskEnum delayTaskEnum, LocalDateTime endTime) {
         String endTaskKey = delayTaskEnum.getCode() + "-" + id;
         DelayTask endDelayTask = sysUserClient.getDelayTask(
-                endTaskKey).getData();
+                endTaskKey, SecurityConstants.INNER).getData();
         // 如果延时任务为空,创建延时任务控制活动定时开始和结束
         Duration duration = Duration.between(LocalDateTime.now(), endTime);
         if (StringUtils.isNull(endDelayTask)) {
             createEndDelayTask(endTime, endTaskKey, duration);
         } else {
             if (!endDelayTask.getExecuteTime().isEqual(endTime)) {
-                sysUserClient.deleteDelayTask(endTaskKey);
+                sysUserClient.deleteDelayTask(endTaskKey,
+                        SecurityConstants.INNER);
                 redisService.deleteObject(endTaskKey);
                 createEndDelayTask(endTime, endTaskKey, duration);
             }
@@ -106,18 +113,15 @@
         endDelayTask.setCreateTime(LocalDateTime.now());
         endDelayTask.setExecuteTime(endTime);
         endDelayTask.setRedisKey(seckillEndTaskKey);
-        sysUserClient.addDelayTask(endDelayTask);
+        sysUserClient.addDelayTask(endDelayTask, SecurityConstants.INNER);
     }
 
     private void handleStartDelayTask(Long id, DelayTaskEnum delayTaskEnum, LocalDateTime startTime,
             Long timeout) {
         String startTaskKey = delayTaskEnum.getCode() + "-" + id;
-        redisService.setCacheObject(
-                startTaskKey,
-                startTime, timeout, TimeUnit.SECONDS);
         //查询延时任务
         DelayTask startDelayTask = sysUserClient.getDelayTask(
-                startTaskKey).getData();
+                startTaskKey, SecurityConstants.INNER).getData();
         if (StringUtils.isNull(startDelayTask)) {
             startDelayTask = new DelayTask();
             startDelayTask.setDelFlag(0);
@@ -125,11 +129,11 @@
             startDelayTask.setExecuteTime(LocalDateTime.now().plusSeconds(timeout));
             startDelayTask.setRedisKey(
                     startTaskKey);
-            sysUserClient.addDelayTask(startDelayTask);
+            sysUserClient.addDelayTask(startDelayTask, SecurityConstants.INNER);
         } else {
             if (!startDelayTask.getExecuteTime().isEqual(startTime)) {
                 sysUserClient.deleteDelayTask(
-                        startTaskKey);
+                        startTaskKey, SecurityConstants.INNER);
                 redisService.deleteObject(
                         startTaskKey);
                 startDelayTask.setDelFlag(0);
@@ -137,9 +141,10 @@
                 startDelayTask.setExecuteTime(LocalDateTime.now().plusSeconds(timeout));
                 startDelayTask.setRedisKey(
                         startTaskKey);
-                sysUserClient.addDelayTask(startDelayTask);
+
             }
         }
+        redisService.setCacheObject(startTaskKey, startTime, timeout, TimeUnit.SECONDS);
         log.info(">>>>>>>>>>>>>>>>>>>>延时任务{}执行了<<<<<<<<<<<<<<<<<<<<", startTaskKey);
     }
 }

--
Gitblit v1.7.1