fix settlement seckill promotion is not punctuality

This commit is contained in:
paulGao 2021-09-07 02:04:31 +08:00
parent 4063c8b063
commit 5fcdbe8df9
8 changed files with 52 additions and 47 deletions

View File

@ -1,16 +1,16 @@
package cn.lili.trigger.executor; package cn.lili.trigger.executor;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.lili.trigger.interfaces.TimeTrigger;
import cn.lili.trigger.TimeTriggerExecutor;
import cn.lili.trigger.message.PintuanOrderMessage;
import cn.lili.trigger.message.PromotionMessage;
import cn.lili.trigger.model.TimeExecuteConstant;
import cn.lili.trigger.model.TimeTriggerMsg;
import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import cn.lili.modules.promotion.service.PromotionService; import cn.lili.modules.promotion.service.PromotionService;
import cn.lili.trigger.TimeTriggerExecutor;
import cn.lili.trigger.interfaces.TimeTrigger;
import cn.lili.trigger.message.PintuanOrderMessage;
import cn.lili.trigger.message.PromotionMessage;
import cn.lili.trigger.model.TimeExecuteConstant;
import cn.lili.trigger.model.TimeTriggerMsg;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -62,11 +62,13 @@ public class PromotionTimeTriggerExecutor implements TimeTriggerExecutor {
//促销活动开始后设置促销活动结束的定时任务 //促销活动开始后设置促销活动结束的定时任务
promotionMessage.setPromotionStatus(PromotionStatusEnum.END.name()); promotionMessage.setPromotionStatus(PromotionStatusEnum.END.name());
String uniqueKey = "{TIME_TRIGGER_" + promotionMessage.getPromotionType() + "}_" + promotionMessage.getPromotionId(); String uniqueKey = "{TIME_TRIGGER_" + promotionMessage.getPromotionType() + "}_" + promotionMessage.getPromotionId();
//结束时间延时一分钟 if (promotionMessage.getEndTime() != null) {
long closeTime = promotionMessage.getEndTime().getTime() + 60000; //结束时间延时一分钟
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, closeTime, promotionMessage, uniqueKey, rocketmqCustomProperties.getPromotionTopic()); long closeTime = promotionMessage.getEndTime().getTime() + 60000;
//添加延时任务 TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, closeTime, promotionMessage, uniqueKey, rocketmqCustomProperties.getPromotionTopic());
timeTrigger.addDelay(timeTriggerMsg); //添加延时任务
timeTrigger.addDelay(timeTriggerMsg);
}
} else { } else {
//不是开始则修改活动状态 //不是开始则修改活动状态
promotionService.updatePromotionStatus(promotionMessage); promotionService.updatePromotionStatus(promotionMessage);

View File

@ -59,13 +59,11 @@ public class SkuPromotionRender implements CartRenderStep {
*/ */
private void renderBasePrice(TradeDTO tradeDTO) { private void renderBasePrice(TradeDTO tradeDTO) {
tradeDTO.getCartList().forEach( tradeDTO.getCartList().forEach(
cartVO -> { cartVO -> cartVO.getSkuList().forEach(cartSkuVO -> {
cartVO.getSkuList().forEach(cartSkuVO -> { PriceDetailDTO priceDetailDTO = cartSkuVO.getPriceDetailDTO();
PriceDetailDTO priceDetailDTO = cartSkuVO.getPriceDetailDTO(); priceDetailDTO.setGoodsPrice(cartSkuVO.getSubTotal());
priceDetailDTO.setGoodsPrice(cartSkuVO.getSubTotal()); priceDetailDTO.setDiscountPrice(CurrencyUtil.sub(priceDetailDTO.getOriginalPrice(), cartSkuVO.getSubTotal()));
priceDetailDTO.setDiscountPrice(CurrencyUtil.sub(priceDetailDTO.getOriginalPrice(), cartSkuVO.getSubTotal())); })
});
}
); );
} }

View File

@ -129,7 +129,7 @@ public class CartServiceImpl implements CartService {
if (cartSkuVO != null && dataSku.getUpdateTime().equals(cartSkuVO.getGoodsSku().getUpdateTime())) { if (cartSkuVO != null && dataSku.getUpdateTime().equals(cartSkuVO.getGoodsSku().getUpdateTime())) {
//如果覆盖购物车中商品数量 //如果覆盖购物车中商品数量
if (cover) { if (Boolean.TRUE.equals(cover)) {
cartSkuVO.setNum(num); cartSkuVO.setNum(num);
this.checkSetGoodsQuantity(cartSkuVO, skuId, num); this.checkSetGoodsQuantity(cartSkuVO, skuId, num);
} else { } else {

View File

@ -1,7 +1,7 @@
package cn.lili.modules.order.order.entity.vo; package cn.lili.modules.order.order.entity.vo;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.enums.ClientTypeEnum; import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.utils.StringUtils;
import cn.lili.modules.order.order.entity.enums.*; import cn.lili.modules.order.order.entity.enums.*;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ -149,7 +149,7 @@ public class OrderSimpleVO {
String[] complainStatus = groupComplainStatus.split(","); String[] complainStatus = groupComplainStatus.split(",");
String[] commentStatus = groupCommentStatus.split(","); String[] commentStatus = groupCommentStatus.split(",");
String[] goodsPrice = groupGoodsPrice.split(","); String[] goodsPrice = groupGoodsPrice.split(",");
// String goodsId, String skuId, Integer num, String image, String name, String afterSaleStatus
for (int i = 0; i < goodsId.length; i++) { for (int i = 0; i < goodsId.length; i++) {
orderItemVOS.add(new OrderItemVO(orderItemsSn[i], goodsId[i], skuId[i], num[i], image[i], name[i], afterSaleStatus[i], complainStatus[i], commentStatus[i], Double.parseDouble(goodsPrice[i]))); orderItemVOS.add(new OrderItemVO(orderItemsSn[i], goodsId[i], skuId[i], num[i], image[i], name[i], afterSaleStatus[i], complainStatus[i], commentStatus[i], Double.parseDouble(goodsPrice[i])));
} }

View File

@ -91,12 +91,12 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
GoodsSku sku = goodsSkuService.getGoodsSkuByIdFromCache(skuId); GoodsSku sku = goodsSkuService.getGoodsSkuByIdFromCache(skuId);
if (sku == null) { if (sku == null) {
return null; return new ArrayList<>();
} }
List<PromotionGoods> promotionGoods = new ArrayList<>(); List<PromotionGoods> promotionGoods = new ArrayList<>(this.list(new LambdaQueryWrapper<PromotionGoods>()
promotionGoods.addAll(this.list(new LambdaQueryWrapper<PromotionGoods>()
.eq(PromotionGoods::getSkuId, skuId) .eq(PromotionGoods::getSkuId, skuId)
.le(PromotionGoods::getStartTime, System.currentTimeMillis())
.eq(PromotionGoods::getPromotionStatus, PromotionStatusEnum.START.name()))); .eq(PromotionGoods::getPromotionStatus, PromotionStatusEnum.START.name())));
@ -170,8 +170,8 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
promotionGoodsPage.setSize(page.getSize()); promotionGoodsPage.setSize(page.getSize());
promotionGoodsPage.setTotal(page.getTotal()); promotionGoodsPage.setTotal(page.getTotal());
promotionGoodsPage.setPages(page.getPages()); promotionGoodsPage.setPages(page.getPages());
for (PromotionGoods record : page.getRecords()) { for (PromotionGoods promotionGoods : page.getRecords()) {
PromotionGoodsDTO promotionGoodsDTO = this.wrapperPromotionGoodsDTO(record); PromotionGoodsDTO promotionGoodsDTO = this.wrapperPromotionGoodsDTO(promotionGoods);
promotionGoodsList.add(promotionGoodsDTO); promotionGoodsList.add(promotionGoodsDTO);
} }
promotionGoodsPage.setRecords(promotionGoodsList); promotionGoodsPage.setRecords(promotionGoodsList);
@ -380,8 +380,8 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
promotionGoodsPage.setTotal(page.getTotal()); promotionGoodsPage.setTotal(page.getTotal());
promotionGoodsPage.setPages(page.getPages()); promotionGoodsPage.setPages(page.getPages());
List<PromotionGoods> records = page.getRecords(); List<PromotionGoods> records = page.getRecords();
for (PromotionGoods record : records) { for (PromotionGoods promotionGoods : records) {
PromotionGoodsDTO promotionGoodsDTO = this.wrapperPromotionGoodsDTO(record); PromotionGoodsDTO promotionGoodsDTO = this.wrapperPromotionGoodsDTO(promotionGoods);
promotionGoodsList.add(promotionGoodsDTO); promotionGoodsList.add(promotionGoodsDTO);
} }
promotionGoodsPage.setRecords(promotionGoodsList); promotionGoodsPage.setRecords(promotionGoodsList);
@ -414,9 +414,9 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
searchParams.setOrder(pageVo.getOrder()); searchParams.setOrder(pageVo.getOrder());
IPage<GoodsSku> goodsSkuByPage = goodsSkuService.getGoodsSkuByPage(searchParams); IPage<GoodsSku> goodsSkuByPage = goodsSkuService.getGoodsSkuByPage(searchParams);
//将查询到的商品sku转换为促销商品 //将查询到的商品sku转换为促销商品
for (GoodsSku record : goodsSkuByPage.getRecords()) { for (GoodsSku goodsSku : goodsSkuByPage.getRecords()) {
PromotionGoodsDTO promotionGoods = new PromotionGoodsDTO(record); PromotionGoodsDTO promotionGoods = new PromotionGoodsDTO(goodsSku);
promotionGoods.setGoodsImage(record.getThumbnail()); promotionGoods.setGoodsImage(goodsSku.getThumbnail());
promotionGoods.setStartTime(promotion.getStartTime()); promotionGoods.setStartTime(promotion.getStartTime());
promotionGoods.setEndTime(promotion.getEndTime()); promotionGoods.setEndTime(promotion.getEndTime());
promotionGoods.setTitle(promotion.getPromotionName()); promotionGoods.setTitle(promotion.getPromotionName());

View File

@ -4,10 +4,9 @@ import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.trigger.message.PromotionMessage;
import cn.lili.modules.order.cart.entity.vo.FullDiscountVO; import cn.lili.modules.order.cart.entity.vo.FullDiscountVO;
import cn.lili.modules.promotion.entity.dos.*; import cn.lili.modules.promotion.entity.dos.*;
import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO; import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO;
@ -19,6 +18,7 @@ import cn.lili.modules.promotion.entity.vos.SeckillVO;
import cn.lili.modules.promotion.service.*; import cn.lili.modules.promotion.service.*;
import cn.lili.modules.search.entity.dos.EsGoodsIndex; import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import cn.lili.modules.search.service.EsGoodsIndexService; import cn.lili.modules.search.service.EsGoodsIndexService;
import cn.lili.trigger.message.PromotionMessage;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -115,7 +115,7 @@ public class PromotionServiceImpl implements PromotionService {
break; break;
//秒杀 //秒杀
case SECKILL: case SECKILL:
result = this.updateSeckill(promotionMessage, esPromotionKey, promotionTypeEnum); result = this.updateSeckill(promotionMessage, promotionTypeEnum);
break; break;
//拼团 //拼团
case PINTUAN: case PINTUAN:
@ -381,11 +381,10 @@ public class PromotionServiceImpl implements PromotionService {
* 修改秒杀状态 * 修改秒杀状态
* *
* @param promotionMessage 信息队列传输促销信息实体 * @param promotionMessage 信息队列传输促销信息实体
* @param esPromotionKey es Key
* @param promotionTypeEnum 促销分类枚举 * @param promotionTypeEnum 促销分类枚举
* @return 修改结果 * @return 修改结果
*/ */
private boolean updateSeckill(PromotionMessage promotionMessage, String esPromotionKey, PromotionTypeEnum promotionTypeEnum) { private boolean updateSeckill(PromotionMessage promotionMessage, PromotionTypeEnum promotionTypeEnum) {
boolean result; boolean result;
SeckillVO seckill = this.mongoTemplate.findById(promotionMessage.getPromotionId(), SeckillVO.class); SeckillVO seckill = this.mongoTemplate.findById(promotionMessage.getPromotionId(), SeckillVO.class);
if (seckill == null) { if (seckill == null) {

View File

@ -1,24 +1,17 @@
package cn.lili.modules.promotion.serviceimpl; package cn.lili.modules.promotion.serviceimpl;
import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.trigger.util.DelayQueueTools;
import cn.lili.trigger.enums.DelayTypeEnums;
import cn.lili.trigger.message.PromotionMessage;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.trigger.interfaces.TimeTrigger; import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.trigger.model.TimeExecuteConstant;
import cn.lili.trigger.model.TimeTriggerMsg;
import cn.lili.common.utils.BeanUtil; import cn.lili.common.utils.BeanUtil;
import cn.lili.common.utils.DateUtil; import cn.lili.common.utils.DateUtil;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.common.utils.StringUtils; import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.dos.Seckill; import cn.lili.modules.promotion.entity.dos.Seckill;
import cn.lili.modules.promotion.entity.dos.SeckillApply; import cn.lili.modules.promotion.entity.dos.SeckillApply;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.modules.promotion.entity.enums.SeckillApplyStatusEnum; import cn.lili.modules.promotion.entity.enums.SeckillApplyStatusEnum;
import cn.lili.modules.promotion.entity.vos.SeckillSearchParams; import cn.lili.modules.promotion.entity.vos.SeckillSearchParams;
import cn.lili.modules.promotion.entity.vos.SeckillVO; import cn.lili.modules.promotion.entity.vos.SeckillVO;
@ -32,6 +25,13 @@ import cn.lili.modules.system.entity.dos.Setting;
import cn.lili.modules.system.entity.dto.SeckillSetting; import cn.lili.modules.system.entity.dto.SeckillSetting;
import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.entity.enums.SettingEnum;
import cn.lili.modules.system.service.SettingService; import cn.lili.modules.system.service.SettingService;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.trigger.enums.DelayTypeEnums;
import cn.lili.trigger.interfaces.TimeTrigger;
import cn.lili.trigger.message.PromotionMessage;
import cn.lili.trigger.model.TimeExecuteConstant;
import cn.lili.trigger.model.TimeTriggerMsg;
import cn.lili.trigger.util.DelayQueueTools;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -47,6 +47,7 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -193,6 +194,9 @@ public class SeckillServiceImpl extends ServiceImpl<SeckillMapper, Seckill> impl
this.mongoTemplate.save(seckillVO); this.mongoTemplate.save(seckillVO);
//如果编辑后活动时间不一致则编辑延时任务 //如果编辑后活动时间不一致则编辑延时任务
if (seckill.getStartTime().getTime() != seckillVO.getStartTime().getTime()) { if (seckill.getStartTime().getTime() != seckillVO.getStartTime().getTime()) {
if (seckillVO.getEndTime() == null) {
seckillVO.setEndTime(cn.hutool.core.date.DateUtil.endOfDay(new Date()));
}
PromotionMessage promotionMessage = new PromotionMessage(seckillVO.getId(), PromotionTypeEnum.SECKILL.name(), PromotionStatusEnum.START.name(), seckillVO.getStartTime(), seckillVO.getEndTime()); PromotionMessage promotionMessage = new PromotionMessage(seckillVO.getId(), PromotionTypeEnum.SECKILL.name(), PromotionStatusEnum.START.name(), seckillVO.getStartTime(), seckillVO.getEndTime());
//更新延时任务 //更新延时任务
this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR, this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR,

View File

@ -1,6 +1,7 @@
package cn.lili.modules.promotion.tools; package cn.lili.modules.promotion.tools;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.utils.DateUtil; import cn.lili.common.utils.DateUtil;
@ -8,7 +9,6 @@ import cn.lili.common.vo.PageVO;
import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.dto.BasePromotion; import cn.lili.modules.promotion.entity.dto.BasePromotion;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import cn.lili.common.enums.PromotionTypeEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
@ -120,7 +120,9 @@ public class PromotionTools {
promotionGoods.setPromotionId(promotion.getId()); promotionGoods.setPromotionId(promotion.getId());
promotionGoods.setStoreName(promotion.getStoreName()); promotionGoods.setStoreName(promotion.getStoreName());
promotionGoods.setTitle(promotion.getPromotionName()); promotionGoods.setTitle(promotion.getPromotionName());
promotionGoods.setStartTime(promotion.getStartTime()); if (promotionGoods.getStartTime() == null) {
promotionGoods.setStartTime(promotion.getStartTime());
}
if (promotion.getEndTime() == null) { if (promotion.getEndTime() == null) {
promotionGoods.setEndTime(promotion.getEndTime()); promotionGoods.setEndTime(promotion.getEndTime());
} }