From 5fcdbe8df9ab40230a1d936fabd0b921641d70ad Mon Sep 17 00:00:00 2001 From: paulGao Date: Tue, 7 Sep 2021 02:04:31 +0800 Subject: [PATCH] fix settlement seckill promotion is not punctuality --- .../PromotionTimeTriggerExecutor.java | 24 ++++++++++--------- .../cart/render/impl/SkuPromotionRender.java | 12 ++++------ .../order/cart/service/CartServiceImpl.java | 2 +- .../order/order/entity/vo/OrderSimpleVO.java | 4 ++-- .../PromotionGoodsServiceImpl.java | 20 ++++++++-------- .../serviceimpl/PromotionServiceImpl.java | 9 ++++--- .../serviceimpl/SeckillServiceImpl.java | 22 ++++++++++------- .../promotion/tools/PromotionTools.java | 6 +++-- 8 files changed, 52 insertions(+), 47 deletions(-) diff --git a/consumer/src/main/java/cn/lili/trigger/executor/PromotionTimeTriggerExecutor.java b/consumer/src/main/java/cn/lili/trigger/executor/PromotionTimeTriggerExecutor.java index bc331eb9..9d6cf1fe 100644 --- a/consumer/src/main/java/cn/lili/trigger/executor/PromotionTimeTriggerExecutor.java +++ b/consumer/src/main/java/cn/lili/trigger/executor/PromotionTimeTriggerExecutor.java @@ -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); diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java index 9e74a528..21034c1c 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java @@ -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())); + }) ); } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java index e40169a7..14cc677b 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java @@ -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 { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderSimpleVO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderSimpleVO.java index 77e9458f..f44efa3d 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderSimpleVO.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderSimpleVO.java @@ -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]))); } diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionGoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionGoodsServiceImpl.java index 4710c956..9154f28e 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionGoodsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionGoodsServiceImpl.java @@ -91,12 +91,12 @@ public class PromotionGoodsServiceImpl extends ServiceImpl(); } - List promotionGoods = new ArrayList<>(); - promotionGoods.addAll(this.list(new LambdaQueryWrapper() + List promotionGoods = new ArrayList<>(this.list(new LambdaQueryWrapper() .eq(PromotionGoods::getSkuId, skuId) + .le(PromotionGoods::getStartTime, System.currentTimeMillis()) .eq(PromotionGoods::getPromotionStatus, PromotionStatusEnum.START.name()))); @@ -170,8 +170,8 @@ public class PromotionGoodsServiceImpl extends ServiceImpl 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 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()); diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java index 1aed871e..b729196b 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java @@ -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) { diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java index 15ebf835..5ccbb7c5 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java @@ -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 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, diff --git a/framework/src/main/java/cn/lili/modules/promotion/tools/PromotionTools.java b/framework/src/main/java/cn/lili/modules/promotion/tools/PromotionTools.java index 1571edbd..d597b775 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/tools/PromotionTools.java +++ b/framework/src/main/java/cn/lili/modules/promotion/tools/PromotionTools.java @@ -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()); }