|
|
@@ -14,27 +14,35 @@ 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;
|
|
|
+import com.ruoyi.shop.enums.ActiveState;
|
|
|
import com.ruoyi.shop.enums.PriceType;
|
|
|
import com.ruoyi.shop.marketing.seckill.domain.SeckillActivityProduct;
|
|
|
+import com.ruoyi.shop.marketing.seckill.domain.SeckillActivityTimeItem;
|
|
|
import com.ruoyi.shop.marketing.seckill.domain.bo.SeckillActivityProductBo;
|
|
|
+import com.ruoyi.shop.marketing.seckill.domain.vo.SeckillActivityAppVO;
|
|
|
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;
|
|
|
import com.ruoyi.shop.marketing.seckill.service.ISeckillActivityService;
|
|
|
+import com.ruoyi.shop.marketing.seckill.service.ISeckillActivityTimeItemService;
|
|
|
import com.ruoyi.shop.product.domain.Product;
|
|
|
import com.ruoyi.shop.product.domain.bo.ProductSkuSetBo;
|
|
|
import com.ruoyi.shop.product.service.IProductService;
|
|
|
import com.ruoyi.shop.product.service.IProductSkuSetService;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.context.annotation.Lazy;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.math.BigDecimal;
|
|
|
-import java.util.*;
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
|
|
|
/**
|
|
|
* 秒杀活动商品Service业务层处理
|
|
|
@@ -49,6 +57,7 @@ public class SeckillActivityProductServiceImpl implements ISeckillActivityProduc
|
|
|
private final SeckillActivityProductMapper baseMapper;
|
|
|
private final IProductService productService;
|
|
|
private final SemaphoreTool semaphoreTool;
|
|
|
+ private final ISeckillActivityTimeItemService seckillActivityTimeItemService;
|
|
|
@Lazy
|
|
|
@Resource
|
|
|
private ISeckillActivityService seckillActivityService;
|
|
|
@@ -319,4 +328,100 @@ public class SeckillActivityProductServiceImpl implements ISeckillActivityProduc
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public List<SeckillActivityProductVo> seckillingApiList(SeckillActivityProductBo bo) {
|
|
|
+ //正在秒杀的活动商品
|
|
|
+ List<SeckillActivityProductVo> seckillActivityProductVos = baseMapper.seckillingList(bo.getBusinessId());
|
|
|
+ seckillActivityProductVos.forEach(SeckillActivityProductVo::loadDiscount);
|
|
|
+ return seckillActivityProductVos;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<SeckillActivityProductVo> willSeckill(SeckillActivityProductBo bo) {
|
|
|
+ //查询当前正在秒杀的活动
|
|
|
+ SeckillActivityTimeItem timeItem = seckillActivityTimeItemService.seckillingTime(bo.getBusinessId());
|
|
|
+ //取出开始时间,用于查询下一场活动
|
|
|
+ Date startTime = new Date();
|
|
|
+ if (timeItem != null) {
|
|
|
+ startTime = timeItem.getStartTime();
|
|
|
+ }
|
|
|
+ List<SeckillActivityProductVo> list = baseMapper.willSeckillList(bo.getBusinessId(), startTime);
|
|
|
+ list.forEach(SeckillActivityProductVo::loadDiscount);
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<SeckillActivityProductVo> getBySeckillId(Long seckillId) {
|
|
|
+ List<SeckillActivityProductVo> seckillActivityProductVos = baseMapper.selectVoList(new LambdaQueryWrapper<SeckillActivityProduct>()
|
|
|
+ .eq(SeckillActivityProduct::getSeckillId, seckillId)
|
|
|
+ .orderByAsc(SeckillActivityProduct::getCreateTime)
|
|
|
+ );
|
|
|
+ seckillActivityProductVos.forEach(v -> {
|
|
|
+ //设置秒杀活动商品sku
|
|
|
+ v.loadProductSkuSetList();
|
|
|
+ });
|
|
|
+ return seckillActivityProductVos;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public SeckillActivityAppVO flashSale(SeckillActivityProductBo bo) {
|
|
|
+ SeckillActivityAppVO vo = new SeckillActivityAppVO();
|
|
|
+ //秒杀活动结束时间戳
|
|
|
+ SeckillActivityTimeItem timeItem = seckillActivityTimeItemService.seckillingTime(bo.getBusinessId());
|
|
|
+ if (timeItem != null) {
|
|
|
+ //开始时间场次
|
|
|
+ String startHour = timeItem.getStartHour();
|
|
|
+ vo.setStartHour(startHour.split(":")[0]);
|
|
|
+ //结束时间
|
|
|
+ vo.setFinishTime(timeItem.getEndTime().getTime());
|
|
|
+ //当前时间段所有秒杀活动商品
|
|
|
+ vo.setList(baseMapper.getNowAllSeckillProduct(bo));
|
|
|
+ }
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public SeckillActivityAppVO startFlashSale(SeckillActivityProductBo bo) {
|
|
|
+ SeckillActivityAppVO vo = new SeckillActivityAppVO();
|
|
|
+ String startHour = bo.getStartHour();
|
|
|
+ String endHour = bo.getEndHour();
|
|
|
+ Long businessId = bo.getBusinessId();
|
|
|
+ if (StringUtils.isBlank(startHour) || StringUtils.isBlank(endHour)) {
|
|
|
+ throw new ServiceException(SeckillActivityProductExceptionEnum.INCORRECT_PARAMETER_PASSED_IN);
|
|
|
+ }
|
|
|
+ //活动开始时间
|
|
|
+ String startTime = DateCustomUtils.dateToString(new Date()) + " " + startHour;
|
|
|
+ //活动结束时间
|
|
|
+ String endTime = DateCustomUtils.dateToString(new Date()) + " " + endHour;
|
|
|
+ long nowTime = System.currentTimeMillis();
|
|
|
+ long startTimestamp = DateUtils.stringToDate(startTime).getTime();
|
|
|
+ long endTimestamp = DateUtils.stringToDate(endTime).getTime();
|
|
|
+ vo.setStartHour(startHour);
|
|
|
+ //当前时间
|
|
|
+ vo.setNowTime(nowTime);
|
|
|
+ //结束时间
|
|
|
+ vo.setFinishTime(endTimestamp);
|
|
|
+ //设置活动状态 -- 计算当前时间的活动状态
|
|
|
+ if (nowTime < startTimestamp) {
|
|
|
+ //即将开始
|
|
|
+ vo.setActiveState(ActiveState.NOT_START);
|
|
|
+ } else if (nowTime > endTimestamp) {
|
|
|
+ //已过期
|
|
|
+ vo.setActiveState(ActiveState.FINISHED);
|
|
|
+ } else {
|
|
|
+ //正在抢购
|
|
|
+ vo.setActiveState(ActiveState.UNDERWAY);
|
|
|
+ }
|
|
|
+ //查询当前开始时间段的活动
|
|
|
+ SeckillActivityTimeItem timeItem = seckillActivityTimeItemService.currentTimeOneSeckill(startTime, businessId);
|
|
|
+ if (timeItem != null) {
|
|
|
+ //查询秒杀活动
|
|
|
+ seckillActivityService.loadById(timeItem.getSeckillId(), true);
|
|
|
+ //当前场次所有的活动商品
|
|
|
+// IPage<SeckillActivityGoodsVO> page = this.baseMapper.startFlashSalePage(new Query<SeckillActivityGoodsVO>().getPage(params), startTime, shopId);
|
|
|
+// vo.setPage(new PageUtils(page));
|
|
|
+ }
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
}
|