rentaiming
2024-05-24 a312e70d3bcb91c2cb5a77d2c239a9431cbb0dc7
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);
                    }
                }
            }
        }
    }
    /**