From 79e1fa7c5b198d16f43832bb5896b5072f3e5f11 Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期四, 23 五月 2024 20:13:49 +0800 Subject: [PATCH] Merge branch 'dev-mitao' --- ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java | 123 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 122 insertions(+), 1 deletions(-) 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); + } + } + } + } } /** -- Gitblit v1.7.1