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;
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.modules.order.order.service.OrderService;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@ -62,11 +62,13 @@ public class PromotionTimeTriggerExecutor implements TimeTriggerExecutor {
//促销活动开始后设置促销活动结束的定时任务
promotionMessage.setPromotionStatus(PromotionStatusEnum.END.name());
String uniqueKey = "{TIME_TRIGGER_" + promotionMessage.getPromotionType() + "}_" + promotionMessage.getPromotionId();
//结束时间延时一分钟
long closeTime = promotionMessage.getEndTime().getTime() + 60000;
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, closeTime, promotionMessage, uniqueKey, rocketmqCustomProperties.getPromotionTopic());
//添加延时任务
timeTrigger.addDelay(timeTriggerMsg);
if (promotionMessage.getEndTime() != null) {
//结束时间延时一分钟
long closeTime = promotionMessage.getEndTime().getTime() + 60000;
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, closeTime, promotionMessage, uniqueKey, rocketmqCustomProperties.getPromotionTopic());
//添加延时任务
timeTrigger.addDelay(timeTriggerMsg);
}
} else {
//不是开始则修改活动状态
promotionService.updatePromotionStatus(promotionMessage);

View File

@ -59,13 +59,11 @@ public class SkuPromotionRender implements CartRenderStep {
*/
private void renderBasePrice(TradeDTO tradeDTO) {
tradeDTO.getCartList().forEach(
cartVO -> {
cartVO.getSkuList().forEach(cartSkuVO -> {
PriceDetailDTO priceDetailDTO = cartSkuVO.getPriceDetailDTO();
priceDetailDTO.setGoodsPrice(cartSkuVO.getSubTotal());
priceDetailDTO.setDiscountPrice(CurrencyUtil.sub(priceDetailDTO.getOriginalPrice(), cartSkuVO.getSubTotal()));
});
}
cartVO -> cartVO.getSkuList().forEach(cartSkuVO -> {
PriceDetailDTO priceDetailDTO = cartSkuVO.getPriceDetailDTO();
priceDetailDTO.setGoodsPrice(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 (cover) {
if (Boolean.TRUE.equals(cover)) {
cartSkuVO.setNum(num);
this.checkSetGoodsQuantity(cartSkuVO, skuId, num);
} else {

View File

@ -1,7 +1,7 @@
package cn.lili.modules.order.order.entity.vo;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.utils.StringUtils;
import cn.lili.modules.order.order.entity.enums.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
@ -149,7 +149,7 @@ public class OrderSimpleVO {
String[] complainStatus = groupComplainStatus.split(",");
String[] commentStatus = groupCommentStatus.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++) {
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);
if (sku == null) {
return null;
return new ArrayList<>();
}
List<PromotionGoods> promotionGoods = new ArrayList<>();
promotionGoods.addAll(this.list(new LambdaQueryWrapper<PromotionGoods>()
List<PromotionGoods> promotionGoods = new ArrayList<>(this.list(new LambdaQueryWrapper<PromotionGoods>()
.eq(PromotionGoods::getSkuId, skuId)
.le(PromotionGoods::getStartTime, System.currentTimeMillis())
.eq(PromotionGoods::getPromotionStatus, PromotionStatusEnum.START.name())));
@ -170,8 +170,8 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
promotionGoodsPage.setSize(page.getSize());
promotionGoodsPage.setTotal(page.getTotal());
promotionGoodsPage.setPages(page.getPages());
for (PromotionGoods record : page.getRecords()) {
PromotionGoodsDTO promotionGoodsDTO = this.wrapperPromotionGoodsDTO(record);
for (PromotionGoods promotionGoods : page.getRecords()) {
PromotionGoodsDTO promotionGoodsDTO = this.wrapperPromotionGoodsDTO(promotionGoods);
promotionGoodsList.add(promotionGoodsDTO);
}
promotionGoodsPage.setRecords(promotionGoodsList);
@ -380,8 +380,8 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
promotionGoodsPage.setTotal(page.getTotal());
promotionGoodsPage.setPages(page.getPages());
List<PromotionGoods> records = page.getRecords();
for (PromotionGoods record : records) {
PromotionGoodsDTO promotionGoodsDTO = this.wrapperPromotionGoodsDTO(record);
for (PromotionGoods promotionGoods : records) {
PromotionGoodsDTO promotionGoodsDTO = this.wrapperPromotionGoodsDTO(promotionGoods);
promotionGoodsList.add(promotionGoodsDTO);
}
promotionGoodsPage.setRecords(promotionGoodsList);
@ -414,9 +414,9 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
searchParams.setOrder(pageVo.getOrder());
IPage<GoodsSku> goodsSkuByPage = goodsSkuService.getGoodsSkuByPage(searchParams);
//将查询到的商品sku转换为促销商品
for (GoodsSku record : goodsSkuByPage.getRecords()) {
PromotionGoodsDTO promotionGoods = new PromotionGoodsDTO(record);
promotionGoods.setGoodsImage(record.getThumbnail());
for (GoodsSku goodsSku : goodsSkuByPage.getRecords()) {
PromotionGoodsDTO promotionGoods = new PromotionGoodsDTO(goodsSku);
promotionGoods.setGoodsImage(goodsSku.getThumbnail());
promotionGoods.setStartTime(promotion.getStartTime());
promotionGoods.setEndTime(promotion.getEndTime());
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.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.common.enums.ResultCode;
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.promotion.entity.dos.*;
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.search.entity.dos.EsGoodsIndex;
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.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -115,7 +115,7 @@ public class PromotionServiceImpl implements PromotionService {
break;
//秒杀
case SECKILL:
result = this.updateSeckill(promotionMessage, esPromotionKey, promotionTypeEnum);
result = this.updateSeckill(promotionMessage, promotionTypeEnum);
break;
//拼团
case PINTUAN:
@ -381,11 +381,10 @@ public class PromotionServiceImpl implements PromotionService {
* 修改秒杀状态
*
* @param promotionMessage 信息队列传输促销信息实体
* @param esPromotionKey es Key
* @param promotionTypeEnum 促销分类枚举
* @return 修改结果
*/
private boolean updateSeckill(PromotionMessage promotionMessage, String esPromotionKey, PromotionTypeEnum promotionTypeEnum) {
private boolean updateSeckill(PromotionMessage promotionMessage, PromotionTypeEnum promotionTypeEnum) {
boolean result;
SeckillVO seckill = this.mongoTemplate.findById(promotionMessage.getPromotionId(), SeckillVO.class);
if (seckill == null) {

View File

@ -1,24 +1,17 @@
package cn.lili.modules.promotion.serviceimpl;
import cn.lili.common.enums.PromotionTypeEnum;
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.trigger.interfaces.TimeTrigger;
import cn.lili.trigger.model.TimeExecuteConstant;
import cn.lili.trigger.model.TimeTriggerMsg;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.utils.BeanUtil;
import cn.lili.common.utils.DateUtil;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.common.utils.StringUtils;
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.Seckill;
import cn.lili.modules.promotion.entity.dos.SeckillApply;
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.vos.SeckillSearchParams;
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.enums.SettingEnum;
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.QueryWrapper;
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.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@ -193,6 +194,9 @@ public class SeckillServiceImpl extends ServiceImpl<SeckillMapper, Seckill> impl
this.mongoTemplate.save(seckillVO);
//如果编辑后活动时间不一致则编辑延时任务
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());
//更新延时任务
this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR,

View File

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