From a312e70d3bcb91c2cb5a77d2c239a9431cbb0dc7 Mon Sep 17 00:00:00 2001
From: rentaiming <806181062@qq.com>
Date: 星期五, 24 五月 2024 11:47:30 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java            |   12 ++
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/DelayTaskController.java           |   45 +++++++++
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/DelayTask.java                     |    6 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/GoodsSeckillController.java          |    3 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/GoodsGroupPurchaseController.java    |   13 ++
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java         |   10 ++
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java       |   16 +++
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java |   22 +++
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java       |  123 ++++++++++++++++++++++++
 9 files changed, 243 insertions(+), 7 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/DelayTask.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/DelayTask.java
index 9078c6b..c113e83 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/DelayTask.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/DelayTask.java
@@ -5,7 +5,7 @@
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
-import java.util.Date;
+import java.time.LocalDateTime;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -45,9 +45,9 @@
      * 执行时间
      */
     @TableField("end_time")
-    private Date endTime;
+    private LocalDateTime endTime;
 
     @TableField("create_time")
-    private Date createTime;
+    private LocalDateTime createTime;
     
 }
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java
index c662034..003cddc 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java
@@ -1,6 +1,7 @@
 package com.ruoyi.system.api.factory;
 
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.api.domain.DelayTask;
 import com.ruoyi.system.api.domain.SysRole;
 import com.ruoyi.system.api.domain.SysUser;
 import com.ruoyi.system.api.feignClient.SysUserClient;
@@ -61,6 +62,21 @@
             public R<SysUser> queryUserByUserName(String userName) {
                 return R.fail("通过账号查询用户失败:" + cause.getMessage());
             }
+
+            @Override
+            public R<DelayTask> getDelayTask(String key) {
+                return R.fail("获取延时任务失败:" + cause.getMessage());
+            }
+
+            @Override
+            public R<?> addDelayTask(DelayTask delayTask) {
+                return R.fail("添加延时任务失败:" + cause.getMessage());
+            }
+
+            @Override
+            public R<?> deleteDelayTask(String key) {
+                return R.fail("删除延时任务失败:" + cause.getMessage());
+            }
         };
     }
 }
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java
index 7a4c2fe..d66763d 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java
@@ -2,6 +2,7 @@
 
 import com.ruoyi.common.core.constant.ServiceNameConstants;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.api.domain.DelayTask;
 import com.ruoyi.system.api.domain.SysRole;
 import com.ruoyi.system.api.domain.SysUser;
 import com.ruoyi.system.api.factory.SysUserFallbackFactory;
@@ -71,4 +72,15 @@
     @PostMapping("/user/queryUserByUserName")
     R<SysUser>  queryUserByUserName(@RequestBody String userName);
 
+    /**
+     * 延时任务控制
+     */
+    @PostMapping("/config/getDelayTask")
+    public R<DelayTask> getDelayTask(@RequestBody String key);
+
+    @PostMapping("/config/addDelayTask")
+    public R<?> addDelayTask(@RequestBody DelayTask delayTask);
+
+    @PostMapping("/config/deleteDelayTask")
+    public R<?> deleteDelayTask(@RequestBody String key);
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/GoodsGroupPurchaseController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/GoodsGroupPurchaseController.java
index fd93cb6..f619db5 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/GoodsGroupPurchaseController.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/GoodsGroupPurchaseController.java
@@ -2,6 +2,7 @@
 
 
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.security.annotation.InnerAuth;
 import com.ruoyi.goods.service.IGoodsGroupPurchaseService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -26,12 +27,24 @@
 
     private final IGoodsGroupPurchaseService goodsGroupPurchaseService;
 
+    /**
+     * 团购商品开始团购
+     *
+     * @param groupPurchaseId 团购商品id
+     */
+    @InnerAuth
     @GetMapping("/start/{groupPurchaseId}")
     R<?> startGroupPurchase(@PathVariable("groupPurchaseId") Long groupPurchaseId) {
         goodsGroupPurchaseService.startGroupPurchase(groupPurchaseId);
         return R.ok();
     }
 
+    /**
+     * 团购商品结束团购
+     *
+     * @param groupPurchaseId 团购商品id
+     */
+    @InnerAuth
     @GetMapping("/end/{groupPurchaseId}")
     R<?> endGroupPurchase(@PathVariable("groupPurchaseId") Long groupPurchaseId) {
         goodsGroupPurchaseService.endGroupPurchase(groupPurchaseId);
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/GoodsSeckillController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/GoodsSeckillController.java
index cc8b068..ed88fb9 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/GoodsSeckillController.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/GoodsSeckillController.java
@@ -2,6 +2,7 @@
 
 
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.security.annotation.InnerAuth;
 import com.ruoyi.goods.service.IGoodsSeckillService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -31,6 +32,7 @@
      *
      * @param seckillId 秒杀id
      */
+    @InnerAuth
     @GetMapping("/start/{seckillId}")
     R<?> startSeckill(@PathVariable("seckillId") Long seckillId) {
         goodsSeckillService.startSeckill(seckillId);
@@ -42,6 +44,7 @@
      *
      * @param seckillId 秒杀id
      */
+    @InnerAuth
     @GetMapping("/end/{seckillId}")
     R<?> endSeckill(@PathVariable("seckillId") Long seckillId) {
         goodsSeckillService.endSeckill(seckillId);
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java
index e70c423..8eb6d9c 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java
@@ -48,7 +48,17 @@
      */
     void updStatus(ListStatusDTO dto);
 
+    /**
+     * 团购商品开始团购
+     *
+     * @param groupPurchaseId 团购商品id
+     */
     void startGroupPurchase(Long groupPurchaseId);
 
+    /**
+     * 团购商品结束团购
+     *
+     * @param groupPurchaseId 团购商品id
+     */
     void endGroupPurchase(Long groupPurchaseId);
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
index cba8dcc..237b1b1 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
@@ -109,19 +109,35 @@
         this.updateById(groupPurchase);
     }
 
+    /**
+     * 团购商品开始团购
+     *
+     * @param groupPurchaseId 团购商品id
+     */
     @Override
     public void startGroupPurchase(Long groupPurchaseId) {
-        log.info(">>>>>>>>>>>>>>>>>>>>团购商品开始团购<<<<<<<<<<<<<<<<<<<<");
+        log.info(">>>>>>>>>>>>>>>>>>>>{}团购商品开始团购<<<<<<<<<<<<<<<<<<<<", groupPurchaseId);
         GoodsGroupPurchase groupPurchase = this.getById(groupPurchaseId);
         if (StringUtils.isNotNull(groupPurchase)) {
             this.lambdaUpdate().set(GoodsGroupPurchase::getStartStatus, StartStatusEnum.STARTED)
                     .eq(GoodsGroupPurchase::getId, groupPurchaseId).update();
-            //TODO 通知小程勋
+            //TODO 通知小程序
         }
     }
 
+    /**
+     * 团购商品结束团购
+     *
+     * @param groupPurchaseId 团购商品id
+     */
     @Override
     public void endGroupPurchase(Long groupPurchaseId) {
-
+        log.info(">>>>>>>>>>>>>>>>>>>>{}团购商品结束团购<<<<<<<<<<<<<<<<<<<<", groupPurchaseId);
+        GoodsGroupPurchase groupPurchase = this.getById(groupPurchaseId);
+        if (StringUtils.isNotNull(groupPurchase)) {
+            this.lambdaUpdate().set(GoodsGroupPurchase::getStartStatus, StartStatusEnum.ENDED)
+                    .eq(GoodsGroupPurchase::getId, groupPurchaseId).update();
+            //TODO 通知小程序
+        }
     }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
index 6511b81..6c21b7c 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
@@ -17,12 +17,19 @@
 import com.ruoyi.goods.mapper.GoodsSeckillMapper;
 import com.ruoyi.goods.service.IGoodsSeckillService;
 import com.ruoyi.goods.service.IGoodsSkuService;
+import com.ruoyi.system.api.constants.DelayTaskEnum;
+import com.ruoyi.system.api.domain.DelayTask;
 import com.ruoyi.system.api.domain.dto.ListStatusDTO;
 import com.ruoyi.system.api.feignClient.OrderClient;
+import com.ruoyi.system.api.feignClient.SysUserClient;
+import java.time.Duration;
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Optional;
+import java.util.concurrent.TimeUnit;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RedissonClient;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -42,6 +49,9 @@
     private final IGoodsSkuService goodsSkuService;
     private final OrderClient orderClient;
     private final RedisService redisService;
+    private final SysUserClient sysUserClient;
+    private final RedissonClient redissonClient;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void addGoodsSeckill(GoodsSeckillDTO dto) {
@@ -55,7 +65,118 @@
             goodsSeckill.setStartStatus(StartStatusEnum.NOT_STARTED);
         }
         this.saveBatch(goodsSeckills);
-        //TODO 添加调度任务控制开始结束
+
+        for (GoodsSeckill goodsSeckill : goodsSeckills) {
+            LocalDateTime startTime = goodsSeckill.getStartTime();
+            LocalDateTime endTime = goodsSeckill.getEndTime();
+            LocalDateTime checkTime = LocalDateTime.now().plusHours(1);
+            //秒杀在一小时内开始
+            if (checkTime.isAfter(startTime)) {
+                Long id = goodsSeckill.getId();
+                LocalDateTime now = LocalDateTime.now();
+                String seckillStartTaskKey = DelayTaskEnum.SECKILL_START_TASK.getCode() + "-" + id;
+                //秒杀已经开始
+                if (now.isAfter(startTime)) {
+                    //查询延时任务
+                    DelayTask startDelayTask = sysUserClient.getDelayTask(
+                            seckillStartTaskKey).getData();
+                    if (StringUtils.isNull(startDelayTask)) {
+                        redisService.setCacheObject(
+                                seckillStartTaskKey,
+                                startTime, 3L, TimeUnit.SECONDS);
+                        startDelayTask = new DelayTask();
+                        startDelayTask.setDelFlag(0);
+                        startDelayTask.setCreateTime(LocalDateTime.now());
+                        startDelayTask.setEndTime(LocalDateTime.now().plusSeconds(3));
+                        startDelayTask.setRedisKey(
+                                seckillStartTaskKey);
+                        sysUserClient.addDelayTask(startDelayTask);
+                    } else {
+                        if (!startDelayTask.getEndTime().isEqual(startTime)) {
+                            sysUserClient.deleteDelayTask(
+                                    seckillStartTaskKey);
+                            redisService.deleteObject(
+                                    seckillStartTaskKey);
+                            redisService.setCacheObject(
+                                    seckillStartTaskKey,
+                                    startTime, 3L, TimeUnit.SECONDS);
+                            startDelayTask = new DelayTask();
+                            startDelayTask.setDelFlag(0);
+                            startDelayTask.setCreateTime(LocalDateTime.now());
+                            startDelayTask.setEndTime(LocalDateTime.now().plusSeconds(3));
+                            startDelayTask.setRedisKey(
+                                    seckillStartTaskKey);
+                            sysUserClient.addDelayTask(startDelayTask);
+                        }
+                    }
+                } else {
+                    DelayTask startDelayTask = sysUserClient.getDelayTask(
+                            seckillStartTaskKey).getData();
+                    Duration duration = Duration.between(LocalDateTime.now(), startTime);
+
+                    if (StringUtils.isNull(startDelayTask)) {
+                        redisService.setCacheObject(
+                                seckillStartTaskKey,
+                                startTime, duration.toMillis(), TimeUnit.MILLISECONDS);
+                        startDelayTask = new DelayTask();
+                        startDelayTask.setDelFlag(0);
+                        startDelayTask.setCreateTime(LocalDateTime.now());
+                        startDelayTask.setEndTime(startTime);
+                        startDelayTask.setRedisKey(
+                                seckillStartTaskKey);
+                        sysUserClient.addDelayTask(startDelayTask);
+                    } else {
+                        if (!startDelayTask.getEndTime().isEqual(startTime)) {
+                            sysUserClient.deleteDelayTask(
+                                    seckillStartTaskKey);
+                            redisService.deleteObject(
+                                    seckillStartTaskKey);
+                            redisService.setCacheObject(
+                                    seckillStartTaskKey,
+                                    startTime, duration.toMillis(), TimeUnit.MILLISECONDS);
+                            startDelayTask = new DelayTask();
+                            startDelayTask.setDelFlag(0);
+                            startDelayTask.setCreateTime(LocalDateTime.now());
+                            startDelayTask.setEndTime(startTime);
+                            startDelayTask.setRedisKey(
+                                    seckillStartTaskKey);
+                            sysUserClient.addDelayTask(startDelayTask);
+                        }
+                    }
+                }
+                String seckillEndTaskKey = DelayTaskEnum.SECKILL_END_TASK.getCode() + "-" + id;
+                DelayTask endDelayTask = sysUserClient.getDelayTask(
+                        seckillEndTaskKey).getData();
+                // 如果延时任务为空,创建延时任务控制活动定时开始和结束
+                if (StringUtils.isNull(endDelayTask)) {
+                    Duration duration = Duration.between(LocalDateTime.now(), endTime);
+                    redisService.setCacheObject(
+                            seckillEndTaskKey,
+                            endTime, duration.toMillis(), TimeUnit.MILLISECONDS);
+                    endDelayTask = new DelayTask();
+                    endDelayTask.setDelFlag(0);
+                    endDelayTask.setCreateTime(LocalDateTime.now());
+                    endDelayTask.setEndTime(endTime);
+                    endDelayTask.setRedisKey(seckillEndTaskKey);
+                    sysUserClient.addDelayTask(endDelayTask);
+                } else {
+                    Duration duration = Duration.between(LocalDateTime.now(), endTime);
+                    if (!endDelayTask.getEndTime().isEqual(endTime)) {
+                        sysUserClient.deleteDelayTask(seckillEndTaskKey);
+                        redisService.deleteObject(seckillEndTaskKey);
+                        redisService.setCacheObject(
+                                seckillEndTaskKey,
+                                endTime, duration.toMillis(), TimeUnit.MILLISECONDS);
+                        endDelayTask = new DelayTask();
+                        endDelayTask.setDelFlag(0);
+                        endDelayTask.setCreateTime(LocalDateTime.now());
+                        endDelayTask.setEndTime(endTime);
+                        endDelayTask.setRedisKey(seckillEndTaskKey);
+                        sysUserClient.addDelayTask(endDelayTask);
+                    }
+                }
+            }
+        }
     }
 
     /**
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/DelayTaskController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/DelayTaskController.java
new file mode 100644
index 0000000..7aa4d69
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/DelayTaskController.java
@@ -0,0 +1,45 @@
+package com.ruoyi.system.controller;
+
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.api.domain.DelayTask;
+import com.ruoyi.system.service.DelayTaskService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-05-21
+ */
+@RestController
+@RequestMapping("/delay-task")
+@RequiredArgsConstructor
+public class DelayTaskController {
+
+    private final DelayTaskService delayTaskService;
+
+    @PostMapping("/getDelayTask")
+    public R<DelayTask> getDelayTask(@RequestBody String key) {
+        DelayTask delayTask = delayTaskService.getDelayTask(key);
+        return R.ok(delayTask);
+    }
+
+    @PostMapping("/addDelayTask")
+    public R<?> addDelayTask(@RequestBody DelayTask delayTask) {
+        delayTaskService.addDelayTask(delayTask);
+        return R.ok();
+    }
+
+    @PostMapping("/deleteDelayTask")
+    public R<?> deleteDelayTask(@RequestBody String key) {
+        delayTaskService.deleteDelayTask(key);
+        return R.ok();
+    }
+}

--
Gitblit v1.7.1