guomengjiao 1 месяц назад
Родитель
Сommit
a4cda926a7

+ 49 - 0
ruoyi-admin/src/main/java/com/ruoyi/schedule/ActivitySchedule.java

@@ -0,0 +1,49 @@
+package com.ruoyi.schedule;
+
+import com.ruoyi.shop.marketing.seckill.domain.vo.SeckillActivityProductVo;
+import com.ruoyi.shop.marketing.seckill.service.ISeckillActivityProductService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+@Configuration
+@EnableScheduling
+@Lazy(false)
+@Slf4j
+@RequiredArgsConstructor
+public class ActivitySchedule {
+
+    private final ISeckillActivityProductService seckillActivityProductService;
+
+    /**
+     * 轮询在信号量中设置秒杀活动中的库存
+     * 防止redis挂掉
+     */
+    @Scheduled(fixedDelay = 60 * 1000)
+    public void seckillTask() {
+        //查询所有正在进行中的秒杀活动商品
+        List<SeckillActivityProductVo> list = seckillActivityProductService.seckillingList(null);
+//
+//        //遍历设置库存(信号量)
+//        for (SeckillActivityGoodsVO vo : list) {
+//            //如果剩余库存为0,则不设置
+//            if (vo.getResidueStockTotal() <= 0) {
+//                continue;
+//            }
+//            String key = SeckillActivityGoodsService.getSemaphoreKey(vo.getSeckillId(), vo.getId(), vo.getGoodsId());
+//            Integer num = redisUtils.get(key, Integer.class);
+//            //如果获取不到数量,则重新设置
+//            if (num == null || num <= 0) {
+//                semaphoreTool.setRSemaphorePermits(key, vo.getResidueStockTotal());
+//            }
+//        }
+    }
+
+}

+ 2 - 1
ruoyi-shop/src/main/java/com/ruoyi/shop/marketing/seckill/exception/SeckillActivityProductExceptionEnum.java

@@ -18,7 +18,8 @@ public enum SeckillActivityProductExceptionEnum implements IIntegerEnum {
     REAL_STOCK_TOTAL_LT_INIT_SALE_NUM(540006, "可售数量应大于初始化销量"),
     ACTIVITY_PRICE_OUT_OF_RANGE(540007, "活动价格不在范围"),
     ACTIVITY_PRICE_LT_SALE_PRICE(540008, "活动价格需要小于原价"),
-    SALE_EXCEPTION(540009, "可售数量与初始化销量之和不能小于已售数量");
+    SALE_EXCEPTION(540009, "可售数量与初始化销量之和不能小于已售数量"),
+    SECKILL_ACTIVITY_START(540010, "秒杀活动已开始,不能操作");
 
     private Integer code;
 

+ 2 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/marketing/seckill/service/ISeckillActivityProductService.java

@@ -77,4 +77,6 @@ public interface ISeckillActivityProductService {
     void verifyActiveProduct(Long seckillId);
 
     SeckillActivityProductVo getSeckillProductById(Long id, Boolean isThrow);
+
+    List<SeckillActivityProductVo> seckillingList(Long businessId);
 }

+ 22 - 20
ruoyi-shop/src/main/java/com/ruoyi/shop/marketing/seckill/service/impl/SeckillActivityProductServiceImpl.java

@@ -9,6 +9,8 @@ import com.ruoyi.common.core.domain.PageQuery;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.BeanCopyUtils;
+import com.ruoyi.common.utils.DateCustomUtils;
+import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.MathUtils;
 import com.ruoyi.common.utils.redis.RedisUtils;
 import com.ruoyi.common.utils.redis.SemaphoreTool;
@@ -16,6 +18,7 @@ import com.ruoyi.shop.enums.PriceType;
 import com.ruoyi.shop.marketing.seckill.domain.SeckillActivityProduct;
 import com.ruoyi.shop.marketing.seckill.domain.bo.SeckillActivityProductBo;
 import com.ruoyi.shop.marketing.seckill.domain.vo.SeckillActivityProductVo;
+import com.ruoyi.shop.marketing.seckill.domain.vo.SeckillActivityVo;
 import com.ruoyi.shop.marketing.seckill.exception.SeckillActivityProductExceptionEnum;
 import com.ruoyi.shop.marketing.seckill.mapper.SeckillActivityProductMapper;
 import com.ruoyi.shop.marketing.seckill.service.ISeckillActivityProductService;
@@ -31,9 +34,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 秒杀活动商品Service业务层处理
@@ -269,23 +270,19 @@ public class SeckillActivityProductServiceImpl implements ISeckillActivityProduc
         }
         for (Long id : ids) {
             //秒杀活动只要开始了,就不能被删除
-//            SeckillActivityGoods goods = this.loadActivityGoodsById(id, true);
-//            SeckillActivity activity = seckillActivityService.getById(goods.getSeckillId());
-//            Date startDate = DateUtils.stringToDate(DateCustomUtils.dateToString(activity.getStartTime()) + " " + activity.getStartHour());
-//            Date endDate = DateUtils.stringToDate(DateCustomUtils.dateToString(activity.getEndTime()) + " " + activity.getEndHour());
-//            long timeMillis = System.currentTimeMillis();
-//            if (timeMillis > startDate.getTime() && timeMillis <= endDate.getTime()) {
-//                throw new RRException(MarketingException.SECKILL_ACTIVITY_START);
-//            }
-//
-//            //1、删除秒杀活动商品
-//            this.baseMapper.deleteById(id);
-//
-//            //2、删除秒杀活动商品sku
-//            seckillGoodsSkuService.deleteBySeckillGoodsId(id);
-//
-//            //删除秒杀的信号量
-//            redisUtils.delete(SeckillActivityGoodsService.getSemaphoreKey(goods.getSeckillId(), goods.getId(), goods.getGoodsId()));
+            SeckillActivityProduct seckillActivityProduct = loadById(id, true);
+            SeckillActivityVo activity = seckillActivityService.queryById(seckillActivityProduct.getSeckillId());
+            Date startDate = DateUtils.stringToDate(DateCustomUtils.dateToString(activity.getStartTime()) + " " + activity.getStartHour());
+            Date endDate = DateUtils.stringToDate(DateCustomUtils.dateToString(activity.getEndTime()) + " " + activity.getEndHour());
+            long timeMillis = System.currentTimeMillis();
+            if (timeMillis > startDate.getTime() && timeMillis <= endDate.getTime()) {
+                throw new ServiceException(SeckillActivityProductExceptionEnum.SECKILL_ACTIVITY_START);
+            }
+            //1、删除秒杀活动商品
+            baseMapper.deleteById(id);
+            //2、TODO 删除秒杀活动商品sku
+            //删除秒杀的信号量
+            RedisUtils.deleteObject(getSemaphoreKey(seckillActivityProduct.getSeckillId(), seckillActivityProduct.getId(), seckillActivityProduct.getProductId()));
         }
         return true;
     }
@@ -314,4 +311,9 @@ public class SeckillActivityProductServiceImpl implements ISeckillActivityProduc
         return vo;
     }
 
+    @Override
+    public List<SeckillActivityProductVo> seckillingList(Long businessId) {
+        return Collections.emptyList();
+    }
+
 }