重构优化促销模块。移除促销相关的mongo

This commit is contained in:
paulGao 2021-12-10 20:15:03 +08:00
parent 8a29ce048d
commit d9d19f8cbd
118 changed files with 2998 additions and 3885 deletions

38
DB/li_promotions.sql Normal file
View File

@ -0,0 +1,38 @@
ALTER TABLE li_coupon DROP COLUMN promotion_status;
ALTER TABLE li_coupon_activity DROP COLUMN promotion_status;
ALTER TABLE li_coupon_activity ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID';
ALTER TABLE li_coupon_activity ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '关联范围类型';
ALTER TABLE li_full_discount DROP COLUMN promotion_status;
ALTER TABLE li_full_discount ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID';
ALTER TABLE li_full_discount ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '关联范围类型';
ALTER TABLE li_kanjia_activity_goods DROP COLUMN promotion_status;
ALTER TABLE li_kanjia_activity_goods ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID';
ALTER TABLE li_kanjia_activity_goods ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '关联范围类型';
ALTER TABLE li_kanjia_activity_goods ADD `goods_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL;
ALTER TABLE li_pintuan DROP COLUMN promotion_status;
ALTER TABLE li_pintuan ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID';
ALTER TABLE li_pintuan ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '关联范围类型';
ALTER TABLE li_points_goods DROP COLUMN promotion_status;
ALTER TABLE li_points_goods ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID';
ALTER TABLE li_points_goods ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '关联范围类型';
ALTER TABLE li_points_goods ADD `original_price` double(10,2) DEFAULT NULL COMMENT '原价';
ALTER TABLE li_points_goods ADD `thumbnail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '缩略图';
ALTER TABLE li_points_goods ADD `goods_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '商品编号';
ALTER TABLE li_points_goods ADD `goods_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '货品名称';
ALTER TABLE li_promotion_goods DROP COLUMN promotion_status;
ALTER TABLE li_promotion_goods ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID';
ALTER TABLE li_promotion_goods ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '关联范围类型';
ALTER TABLE li_promotion_goods ADD `original_price` double(10,2) DEFAULT NULL COMMENT '原价';
ALTER TABLE li_promotion_goods ADD `points` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '兑换积分';
ALTER TABLE li_promotion_goods ADD `goods_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '商品编号';
ALTER TABLE li_seckill DROP COLUMN promotion_status;
ALTER TABLE li_seckill ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID';
ALTER TABLE li_seckill ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '关联范围类型';

View File

@ -1,4 +1,4 @@
package cn.lili.controller.member; package cn.lili.controller.promotion;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.AuthUser; import cn.lili.common.security.AuthUser;
@ -6,6 +6,8 @@ import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.promotion.entity.dos.MemberCoupon; import cn.lili.modules.promotion.entity.dos.MemberCoupon;
import cn.lili.modules.promotion.entity.enums.CouponGetEnum;
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.entity.vos.CouponSearchParams; import cn.lili.modules.promotion.entity.vos.CouponSearchParams;
import cn.lili.modules.promotion.entity.vos.CouponVO; import cn.lili.modules.promotion.entity.vos.CouponVO;
import cn.lili.modules.promotion.service.CouponService; import cn.lili.modules.promotion.service.CouponService;
@ -51,7 +53,9 @@ public class CouponBuyerController {
@GetMapping @GetMapping
@ApiOperation(value = "获取可领取优惠券列表") @ApiOperation(value = "获取可领取优惠券列表")
public ResultMessage<IPage<CouponVO>> getCouponList(CouponSearchParams queryParam, PageVO page) { public ResultMessage<IPage<CouponVO>> getCouponList(CouponSearchParams queryParam, PageVO page) {
IPage<CouponVO> canUseCoupons = couponService.getCanReceiveCoupons(queryParam, page); queryParam.setPromotionStatus(PromotionsStatusEnum.START.name());
queryParam.setGetType(CouponGetEnum.FREE.name());
IPage<CouponVO> canUseCoupons = couponService.pageVOFindAll(queryParam, page);
return ResultUtil.data(canUseCoupons); return ResultUtil.data(canUseCoupons);
} }
@ -84,8 +88,7 @@ public class CouponBuyerController {
@GetMapping("/receive/{couponId}") @GetMapping("/receive/{couponId}")
public ResultMessage<Object> receiveCoupon(@NotNull(message = "优惠券ID不能为空") @PathVariable("couponId") String couponId) { public ResultMessage<Object> receiveCoupon(@NotNull(message = "优惠券ID不能为空") @PathVariable("couponId") String couponId) {
AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
memberCouponService.checkCouponLimit(couponId, currentUser.getId()); memberCouponService.receiveBuyerCoupon(couponId, currentUser.getId(), currentUser.getNickName());
memberCouponService.receiveCoupon(couponId, currentUser.getId(), currentUser.getNickName());
return ResultUtil.success(); return ResultUtil.success();
} }

View File

@ -9,7 +9,7 @@ import cn.lili.modules.promotion.entity.dos.KanjiaActivity;
import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog; import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityLogQuery; import cn.lili.modules.promotion.entity.dto.KanJiaActivityLogQuery;
import cn.lili.modules.promotion.entity.dto.KanjiaActivityQuery; import cn.lili.modules.promotion.entity.dto.KanjiaActivityQuery;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.entity.vos.kanjia.*; import cn.lili.modules.promotion.entity.vos.kanjia.*;
import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; import cn.lili.modules.promotion.service.KanjiaActivityGoodsService;
import cn.lili.modules.promotion.service.KanjiaActivityLogService; import cn.lili.modules.promotion.service.KanjiaActivityLogService;
@ -52,7 +52,7 @@ public class KanjiaGoodsActivityBuyerController {
@ApiOperation(value = "分页获取砍价商品") @ApiOperation(value = "分页获取砍价商品")
public ResultMessage<IPage<KanjiaActivityGoodsListVO>> kanjiaActivityGoodsPage(KanjiaActivityGoodsParams kanjiaActivityGoodsParams, PageVO page) { public ResultMessage<IPage<KanjiaActivityGoodsListVO>> kanjiaActivityGoodsPage(KanjiaActivityGoodsParams kanjiaActivityGoodsParams, PageVO page) {
// 会员端查询到的肯定是已经开始的活动商品 // 会员端查询到的肯定是已经开始的活动商品
kanjiaActivityGoodsParams.setPromotionStatus(PromotionStatusEnum.START.name()); kanjiaActivityGoodsParams.setPromotionStatus(PromotionsStatusEnum.START.name());
kanjiaActivityGoodsParams.setStartTime(System.currentTimeMillis()); kanjiaActivityGoodsParams.setStartTime(System.currentTimeMillis());
kanjiaActivityGoodsParams.setEndTime(System.currentTimeMillis()); kanjiaActivityGoodsParams.setEndTime(System.currentTimeMillis());
return ResultUtil.data(kanJiaActivityGoodsService.kanjiaGoodsVOPage(kanjiaActivityGoodsParams, page)); return ResultUtil.data(kanJiaActivityGoodsService.kanjiaGoodsVOPage(kanjiaActivityGoodsParams, page));

View File

@ -1,12 +1,11 @@
package cn.lili.controller.promotion; package cn.lili.controller.promotion;
import cn.hutool.core.date.DateUtil; import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.promotion.entity.dto.PromotionGoodsDTO; import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.modules.promotion.entity.vos.PintuanMemberVO; import cn.lili.modules.promotion.entity.vos.PintuanMemberVO;
import cn.lili.modules.promotion.entity.vos.PintuanShareVO; import cn.lili.modules.promotion.entity.vos.PintuanShareVO;
import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams; import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams;
@ -40,14 +39,13 @@ public class PintuanBuyerController {
@ApiOperation(value = "获取拼团商品") @ApiOperation(value = "获取拼团商品")
@GetMapping @GetMapping
public ResultMessage<IPage<PromotionGoodsDTO>> getPintuanCategory(String goodsName, String categoryPath, PageVO pageVo) { public ResultMessage<IPage<PromotionGoods>> getPintuanCategory(String goodsName, String categoryPath, PageVO pageVo) {
PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
searchParams.setGoodsName(goodsName); searchParams.setGoodsName(goodsName);
searchParams.setPromotionType(PromotionTypeEnum.PINTUAN.name()); searchParams.setPromotionType(PromotionTypeEnum.PINTUAN.name());
searchParams.setPromotionStatus(PromotionStatusEnum.START.name()); searchParams.setPromotionStatus(PromotionsStatusEnum.START.name());
searchParams.setCategoryPath(categoryPath); searchParams.setCategoryPath(categoryPath);
searchParams.setEndTime(DateUtil.date().getTime()); return ResultUtil.data(promotionGoodsService.pageFindAll(searchParams, pageVo));
return ResultUtil.data(promotionGoodsService.getPromotionGoods(searchParams, pageVo));
} }

View File

@ -3,6 +3,7 @@ package cn.lili.controller.promotion;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.promotion.entity.dos.PointsGoods;
import cn.lili.modules.promotion.entity.dos.PointsGoodsCategory; import cn.lili.modules.promotion.entity.dos.PointsGoodsCategory;
import cn.lili.modules.promotion.entity.vos.PointsGoodsSearchParams; import cn.lili.modules.promotion.entity.vos.PointsGoodsSearchParams;
import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; import cn.lili.modules.promotion.entity.vos.PointsGoodsVO;
@ -35,8 +36,8 @@ public class PointsGoodsBuyerController {
@GetMapping @GetMapping
@ApiOperation(value = "分页获取积分商品") @ApiOperation(value = "分页获取积分商品")
public ResultMessage<IPage<PointsGoodsVO>> getPointsGoodsPage(PointsGoodsSearchParams searchParams, PageVO page) { public ResultMessage<IPage<PointsGoods>> getPointsGoodsPage(PointsGoodsSearchParams searchParams, PageVO page) {
IPage<PointsGoodsVO> pointsGoodsByPage = pointsGoodsService.getPointsGoodsByPage(searchParams, page); IPage<PointsGoods> pointsGoodsByPage = pointsGoodsService.pageFindAll(searchParams, page);
return ResultUtil.data(pointsGoodsByPage); return ResultUtil.data(pointsGoodsByPage);
} }

View File

@ -4,7 +4,7 @@ import cn.lili.event.MemberRegisterEvent;
import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.promotion.entity.dos.CouponActivity; import cn.lili.modules.promotion.entity.dos.CouponActivity;
import cn.lili.modules.promotion.entity.enums.CouponActivityTypeEnum; import cn.lili.modules.promotion.entity.enums.CouponActivityTypeEnum;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.service.CouponActivityService; import cn.lili.modules.promotion.service.CouponActivityService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -34,7 +34,7 @@ public class RegisteredCouponActivityExecute implements MemberRegisterEvent {
public void memberRegister(Member member) { public void memberRegister(Member member) {
List<CouponActivity> couponActivities = couponActivityService.list(new LambdaQueryWrapper<CouponActivity>() List<CouponActivity> couponActivities = couponActivityService.list(new LambdaQueryWrapper<CouponActivity>()
.eq(CouponActivity::getCouponActivityType, CouponActivityTypeEnum.REGISTERED.name()) .eq(CouponActivity::getCouponActivityType, CouponActivityTypeEnum.REGISTERED.name())
.eq(CouponActivity::getPromotionStatus, PromotionStatusEnum.START.name())); .eq(CouponActivity::getPromotionStatus, PromotionsStatusEnum.START.name()));
couponActivityService.registered(couponActivities, member); couponActivityService.registered(couponActivities, member);
} }

View File

@ -15,6 +15,7 @@ import cn.lili.modules.promotion.entity.dos.KanjiaActivity;
import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO; import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO;
import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; import cn.lili.modules.promotion.entity.vos.PointsGoodsVO;
import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams;
import cn.lili.modules.promotion.service.*; import cn.lili.modules.promotion.service.*;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -202,10 +203,10 @@ public class StockUpdateExecute implements OrderStatusChangeEvent {
switch (promotionTypeEnum) { switch (promotionTypeEnum) {
case KANJIA: case KANJIA:
cache.put(cacheKey, kanjiaActivityGoodsService.getKanJiaGoodsBySku(orderItem.getSkuId()).getStock().intValue()); cache.put(cacheKey, kanjiaActivityGoodsService.getKanjiaGoodsBySkuId(orderItem.getSkuId()).getStock());
return; return;
case POINTS_GOODS: case POINTS_GOODS:
cache.put(cacheKey, pointsGoodsService.getPointsGoodsVOByMongo(orderItem.getSkuId()).getActiveStock().intValue()); cache.put(cacheKey, pointsGoodsService.getPointsGoodsDetailBySkuId(orderItem.getSkuId()).getActiveStock());
return; return;
case SECKILL: case SECKILL:
case PINTUAN: case PINTUAN:
@ -303,16 +304,22 @@ public class StockUpdateExecute implements OrderStatusChangeEvent {
pointsGoodsService.updateById(pointsGoodsVO); pointsGoodsService.updateById(pointsGoodsVO);
this.mongoTemplate.save(pointsGoodsVO); this.mongoTemplate.save(pointsGoodsVO);
} else { } else {
PromotionGoods pGoods = promotionGoodsService.getPromotionGoods(promotionTypeEnum, orderItem.getPromotionId(), orderItem.getSkuId()); PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
searchParams.setPromotionStatus(promotionTypeEnum.name());
searchParams.setPromotionId(orderItem.getPromotionId());
searchParams.setSkuId(orderItem.getSkuId());
PromotionGoods pGoods = promotionGoodsService.getPromotionsGoods(searchParams);
//记录需要更新的促销库存信息 //记录需要更新的促销库存信息
promotionKey.add( promotionKey.add(
PromotionGoodsService.getPromotionGoodsStockCacheKey( PromotionGoodsService.getPromotionGoodsStockCacheKey(
promotionTypeEnum, promotionTypeEnum,
orderItem.getPromotionId(), orderItem.getSkuId()) orderItem.getPromotionId(), orderItem.getSkuId())
); );
if (pGoods != null) {
promotionGoods.add(pGoods); promotionGoods.add(pGoods);
} }
} }
}
goodsSkus.add(goodsSku); goodsSkus.add(goodsSku);
} }

View File

@ -3,9 +3,9 @@ package cn.lili.listener;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ClassLoaderUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.event.GoodsCommentCompleteEvent; import cn.lili.event.GoodsCommentCompleteEvent;
import cn.lili.modules.distribution.entity.dos.DistributionGoods; import cn.lili.modules.distribution.entity.dos.DistributionGoods;
import cn.lili.modules.distribution.entity.dos.DistributionSelectedGoods; import cn.lili.modules.distribution.entity.dos.DistributionSelectedGoods;
@ -17,6 +17,7 @@ import cn.lili.modules.goods.entity.dos.Goods;
import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.entity.dto.GoodsCompleteMessage; import cn.lili.modules.goods.entity.dto.GoodsCompleteMessage;
import cn.lili.modules.goods.entity.dto.GoodsParamsDTO; import cn.lili.modules.goods.entity.dto.GoodsParamsDTO;
import cn.lili.modules.goods.entity.dto.GoodsSearchParams;
import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; import cn.lili.modules.goods.entity.enums.GoodsAuthEnum;
import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum;
import cn.lili.modules.goods.service.BrandService; import cn.lili.modules.goods.service.BrandService;
@ -27,13 +28,16 @@ import cn.lili.modules.member.entity.dos.FootPrint;
import cn.lili.modules.member.entity.dos.MemberEvaluation; import cn.lili.modules.member.entity.dos.MemberEvaluation;
import cn.lili.modules.member.service.FootprintService; import cn.lili.modules.member.service.FootprintService;
import cn.lili.modules.member.service.GoodsCollectionService; import cn.lili.modules.member.service.GoodsCollectionService;
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.dto.BasePromotions;
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams;
import cn.lili.modules.promotion.service.PromotionGoodsService;
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.modules.search.utils.EsIndexUtil;
import cn.lili.modules.store.entity.dos.StoreGoodsLabel; import cn.lili.modules.store.entity.dos.StoreGoodsLabel;
import cn.lili.modules.store.service.StoreGoodsLabelService; import cn.lili.modules.store.service.StoreGoodsLabelService;
import cn.lili.modules.store.service.StoreService; import cn.lili.modules.store.service.StoreService;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.GoodsTagsEnum; import cn.lili.rocketmq.tags.GoodsTagsEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -41,14 +45,11 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener; import org.apache.rocketmq.spring.core.RocketMQListener;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList; import java.util.*;
import java.util.Arrays; import java.util.stream.Collectors;
import java.util.List;
import java.util.Map;
/** /**
* 商品消息 * 商品消息
@ -122,16 +123,8 @@ public class GoodsMessageListener implements RocketMQListener<MessageExt> {
@Autowired @Autowired
private StoreGoodsLabelService storeGoodsLabelService; private StoreGoodsLabelService storeGoodsLabelService;
/**
* rocketMq
*/
@Autowired @Autowired
private RocketMQTemplate rocketMQTemplate; private PromotionGoodsService promotionGoodsService;
/**
* rocketMq配置
*/
@Autowired
private RocketmqCustomProperties rocketmqCustomProperties;
@Override @Override
public void onMessage(MessageExt messageExt) { public void onMessage(MessageExt messageExt) {
@ -152,6 +145,12 @@ public class GoodsMessageListener implements RocketMQListener<MessageExt> {
log.error("生成商品索引事件执行异常,商品信息 {}", new String(messageExt.getBody())); log.error("生成商品索引事件执行异常,商品信息 {}", new String(messageExt.getBody()));
} }
break; break;
case UPDATE_GOODS_INDEX_PROMOTIONS:
this.updateGoodsIndexPromotions(new String(messageExt.getBody()));
break;
case DELETE_GOODS_INDEX_PROMOTIONS:
this.goodsIndexService.deleteEsGoodsPromotionByPromotionId(null, new String(messageExt.getBody()));
break;
case UPDATE_GOODS_INDEX: case UPDATE_GOODS_INDEX:
try { try {
String goodsIdsJsonStr = new String(messageExt.getBody()); String goodsIdsJsonStr = new String(messageExt.getBody());
@ -226,6 +225,32 @@ public class GoodsMessageListener implements RocketMQListener<MessageExt> {
} }
} }
private void updateGoodsIndexPromotions(String promotionsJsonStr) {
try {
log.info("更新商品索引促销信息: {}", promotionsJsonStr);
JSONObject jsonObject = JSONUtil.parseObj(promotionsJsonStr);
BasePromotions promotions = (BasePromotions) jsonObject.get("promotions",
ClassLoaderUtil.loadClass(jsonObject.get("promotionsType").toString()));
String esPromotionKey = jsonObject.get("esPromotionKey").toString();
if (PromotionsScopeTypeEnum.PORTION_GOODS.name().equals(promotions.getScopeType())) {
PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
searchParams.setPromotionId(promotions.getId());
List<PromotionGoods> promotionGoodsList = this.promotionGoodsService.listFindAll(searchParams);
this.goodsIndexService.updateEsGoodsIndexByList(promotionGoodsList, promotions, esPromotionKey);
} else if (PromotionsScopeTypeEnum.PORTION_GOODS_CATEGORY.name().equals(promotions.getScopeType())) {
GoodsSearchParams searchParams = new GoodsSearchParams();
searchParams.setCategoryPath(promotions.getScopeId());
List<GoodsSku> goodsSkuByList = this.goodsSkuService.getGoodsSkuByList(searchParams);
List<String> skuIds = goodsSkuByList.stream().map(GoodsSku::getId).collect(Collectors.toList());
this.goodsIndexService.updateEsGoodsIndexPromotions(skuIds, promotions, esPromotionKey);
} else if (PromotionsScopeTypeEnum.ALL.name().equals(promotions.getScopeType())) {
this.goodsIndexService.updateEsGoodsIndexAllByList(promotions, esPromotionKey);
}
} catch (Exception e) {
log.error("生成商品索引促销信息执行异常,参数信息 {}", promotionsJsonStr);
}
}
/** /**
* 更新商品索引 * 更新商品索引
* *
@ -415,13 +440,10 @@ public class GoodsMessageListener implements RocketMQListener<MessageExt> {
goodsSku.setBuyCount(buyCount); goodsSku.setBuyCount(buyCount);
goodsSkuService.update(goodsSku); goodsSkuService.update(goodsSku);
//修改规格索引,发送mq消息 this.goodsIndexService.updateIndex(
Map<String, Object> updateIndexFieldsMap = EsIndexUtil.getUpdateIndexFieldsMap( MapUtil.builder(new HashMap<String, Object>()).put("id", goodsCompleteMessage.getSkuId()).build(),
MapUtil.builder().put("id", goodsCompleteMessage.getSkuId()).build(), MapUtil.builder(new HashMap<String, Object>()).put("buyCount", buyCount).build());
MapUtil.builder().put("buyCount", buyCount).build());
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.UPDATE_GOODS_INDEX_FIELD.name();
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(updateIndexFieldsMap), RocketmqSendCallbackBuilder.commonCallback());
goodsIndexService.updateIndex(goodsCompleteMessage.getSkuId(), new EsGoodsIndex().setBuyCount(buyCount));
} else { } else {
log.error("商品SkuId为[" + goodsCompleteMessage.getGoodsId() + "的商品不存在,更新商品失败!"); log.error("商品SkuId为[" + goodsCompleteMessage.getGoodsId() + "的商品不存在,更新商品失败!");
} }

View File

@ -1,34 +1,18 @@
package cn.lili.timetask.handler.impl.promotion; package cn.lili.timetask.handler.impl.promotion;
import cn.lili.modules.order.cart.entity.vo.FullDiscountVO;
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
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.enums.MemberCouponStatusEnum; import cn.lili.modules.promotion.service.SeckillService;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import cn.lili.modules.promotion.entity.vos.CouponVO;
import cn.lili.modules.promotion.entity.vos.PintuanVO;
import cn.lili.modules.promotion.service.*;
import cn.lili.modules.search.service.EsGoodsIndexService; import cn.lili.modules.search.service.EsGoodsIndexService;
import cn.lili.modules.system.entity.dos.Setting; 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.timetask.handler.EveryDayExecute; import cn.lili.timetask.handler.EveryDayExecute;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.google.gson.Gson; import com.google.gson.Gson;
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.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/** /**
* 促销活动每日定时器 * 促销活动每日定时器
* *
@ -39,41 +23,11 @@ import java.util.List;
@Component @Component
public class PromotionEverydayExecute implements EveryDayExecute { public class PromotionEverydayExecute implements EveryDayExecute {
/**
* Mongo
*/
@Autowired
private MongoTemplate mongoTemplate;
/** /**
* ES商品索引 * ES商品索引
*/ */
@Autowired @Autowired
private EsGoodsIndexService esGoodsIndexService; private EsGoodsIndexService esGoodsIndexService;
/**
* 满额活动
*/
@Autowired
private FullDiscountService fullDiscountService;
/**
* 拼团
*/
@Autowired
private PintuanService pintuanService;
/**
* 优惠券
*/
@Autowired
private CouponService couponService;
/**
* 会员优惠券
*/
@Autowired
private MemberCouponService memberCouponService;
/**
* 促销商品
*/
@Autowired
private PromotionGoodsService promotionGoodsService;
/** /**
* 系统设置 * 系统设置
*/ */
@ -90,125 +44,13 @@ public class PromotionEverydayExecute implements EveryDayExecute {
*/ */
@Override @Override
public void execute() { public void execute() {
//mongo查询条件 //查询条件
Query query = new Query(); this.esGoodsIndexService.cleanInvalidPromotion();
//结束条件 活动未关闭/活动未结束
query.addCriteria(Criteria.where("promotionStatus").ne(PromotionStatusEnum.END.name())
.orOperator(Criteria.where("promotionStatus").ne(PromotionStatusEnum.CLOSE.name())));
//结束条件 活动结束时间大于当前时间
query.addCriteria(Criteria.where("endTime").lte(new Date()));
//结束满减活动
endFullDiscount(query);
//关闭拼团活动
endPintuan(query);
//结束优惠券
endCoupon(query);
//定时创建活动 //定时创建活动
addSeckill(); addSeckill();
} }
/**
* 结束优惠券活动
*
* @param query
*/
private void endCoupon(Query query) {
try {
//关闭优惠券活动
List<CouponVO> couponVOS = mongoTemplate.find(query, CouponVO.class);
if (!couponVOS.isEmpty()) {
List<String> ids = new ArrayList<>();
// //关闭的优惠券活动
for (CouponVO vo : couponVOS) {
vo.setPromotionStatus(PromotionStatusEnum.END.name());
if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) {
for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) {
promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name());
esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId());
}
}
mongoTemplate.save(vo);
ids.add(vo.getId());
}
couponService.update(this.getUpdatePromotionWrapper(ids));
LambdaUpdateWrapper<MemberCoupon> memberCouponLambdaUpdateWrapper = new LambdaUpdateWrapper<MemberCoupon>().in(MemberCoupon::getCouponId, ids).set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name());
memberCouponService.update(memberCouponLambdaUpdateWrapper);
//将活动商品对照表进行结束处理
promotionGoodsService.update(this.getUpdatePromotionGoodsWrapper(ids));
}
} catch (Exception e) {
log.error("优惠券活动关闭错误", e);
}
}
/**
* 结束拼团活动
*
* @param query
*/
private void endPintuan(Query query) {
try {
//关闭拼团活动
List<PintuanVO> pintuanVOS = mongoTemplate.find(query, PintuanVO.class);
if (!pintuanVOS.isEmpty()) {
//准备修改活动的id
List<String> ids = new ArrayList<>();
for (PintuanVO vo : pintuanVOS) {
vo.setPromotionStatus(PromotionStatusEnum.END.name());
if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) {
for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) {
promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name());
esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId());
}
}
mongoTemplate.save(vo);
ids.add(vo.getId());
}
pintuanService.update(this.getUpdatePromotionWrapper(ids));
//将活动商品对照表进行结束处理
promotionGoodsService.update(this.getUpdatePromotionGoodsWrapper(ids));
}
} catch (Exception e) {
log.error("拼团活动关闭错误", e);
}
}
/**
* 结束满减活动
*
* @param query
*/
private void endFullDiscount(Query query) {
try {
//关闭满减活动
List<FullDiscountVO> fullDiscountVOS = mongoTemplate.find(query, FullDiscountVO.class);
if (!fullDiscountVOS.isEmpty()) {
List<String> ids = new ArrayList<>();
//循环活动 关闭活动
for (FullDiscountVO vo : fullDiscountVOS) {
vo.setPromotionStatus(PromotionStatusEnum.END.name());
if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) {
for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) {
promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name());
esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId());
}
}
mongoTemplate.save(vo);
ids.add(vo.getId());
}
fullDiscountService.update(this.getUpdatePromotionWrapper(ids));
}
} catch (Exception e) {
log.error("满减活动关闭错误", e);
}
}
/** /**
* 添加秒杀活动 * 添加秒杀活动
* 从系统设置中获取秒杀活动的配置 * 从系统设置中获取秒杀活动的配置
@ -218,32 +60,6 @@ public class PromotionEverydayExecute implements EveryDayExecute {
Setting setting = settingService.get(SettingEnum.SECKILL_SETTING.name()); Setting setting = settingService.get(SettingEnum.SECKILL_SETTING.name());
SeckillSetting seckillSetting = new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class); SeckillSetting seckillSetting = new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class);
Seckill seckill = new Seckill(SeckillService.PRE_CREATION, seckillSetting.getHours(), seckillSetting.getSeckillRule()); Seckill seckill = new Seckill(SeckillService.PRE_CREATION, seckillSetting.getHours(), seckillSetting.getSeckillRule());
seckillService.saveSeckill(seckill); seckillService.savePromotions(seckill);
}
/**
* 获取促销修改查询条件 修改活动状态
*
* @param ids 促销活动ID
* @return 促销活动商品查询Wrapper
*/
private UpdateWrapper getUpdatePromotionWrapper(List<String> ids) {
UpdateWrapper updateWrapper = new UpdateWrapper<>();
updateWrapper.in("id", ids);
updateWrapper.set("promotion_status", PromotionStatusEnum.END.name());
return updateWrapper;
}
/**
* 获取商品的促销修改查询条件 修改商品状态
*
* @param ids 促销活动ID
* @return 促销活动商品修改Wrapper
*/
private UpdateWrapper getUpdatePromotionGoodsWrapper(List<String> ids) {
UpdateWrapper updateWrapper = new UpdateWrapper<>();
updateWrapper.in("promotion_id", ids);
updateWrapper.set("promotion_status", PromotionStatusEnum.END.name());
return updateWrapper;
} }
} }

View File

@ -1,16 +1,10 @@
package cn.lili.trigger.executor; package cn.lili.trigger.executor;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
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.service.PromotionService;
import cn.lili.trigger.TimeTriggerExecutor; import cn.lili.trigger.TimeTriggerExecutor;
import cn.lili.trigger.interfaces.TimeTrigger;
import cn.lili.trigger.message.PintuanOrderMessage; import cn.lili.trigger.message.PintuanOrderMessage;
import cn.lili.trigger.message.PromotionMessage;
import cn.lili.trigger.model.TimeExecuteConstant; 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;
@ -25,21 +19,6 @@ import org.springframework.stereotype.Component;
@Slf4j @Slf4j
@Component(TimeExecuteConstant.PROMOTION_EXECUTOR) @Component(TimeExecuteConstant.PROMOTION_EXECUTOR)
public class PromotionTimeTriggerExecutor implements TimeTriggerExecutor { public class PromotionTimeTriggerExecutor implements TimeTriggerExecutor {
/**
* 促销
*/
@Autowired
private PromotionService promotionService;
/**
* RocketMQ
*/
@Autowired
private RocketmqCustomProperties rocketmqCustomProperties;
/**
* 延时任务
*/
@Autowired
private TimeTrigger timeTrigger;
/** /**
* 订单 * 订单
*/ */
@ -49,32 +28,6 @@ public class PromotionTimeTriggerExecutor implements TimeTriggerExecutor {
@Override @Override
public void execute(Object object) { public void execute(Object object) {
PromotionMessage promotionMessage = JSONUtil.toBean(JSONUtil.parseObj(object), PromotionMessage.class);
//促销延时信息
if (promotionMessage != null && promotionMessage.getPromotionId() != null) {
log.info("促销活动信息消费:{}", promotionMessage);
//如果为促销活动开始则需要发布促销活动结束的定时任务
if (PromotionStatusEnum.START.name().equals(promotionMessage.getPromotionStatus())) {
if (!promotionService.updatePromotionStatus(promotionMessage)) {
log.error("开始促销活动失败: {}", promotionMessage);
return;
}
//促销活动开始后设置促销活动结束的定时任务
promotionMessage.setPromotionStatus(PromotionStatusEnum.END.name());
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());
//添加延时任务
timeTrigger.addDelay(timeTriggerMsg);
}
} else {
//不是开始则修改活动状态
promotionService.updatePromotionStatus(promotionMessage);
}
return;
}
//拼团订单消息 //拼团订单消息
PintuanOrderMessage pintuanOrderMessage = JSONUtil.toBean(JSONUtil.parseObj(object), PintuanOrderMessage.class); PintuanOrderMessage pintuanOrderMessage = JSONUtil.toBean(JSONUtil.parseObj(object), PintuanOrderMessage.class);
if (pintuanOrderMessage != null && pintuanOrderMessage.getPintuanId() != null) { if (pintuanOrderMessage != null && pintuanOrderMessage.getPintuanId() != null) {

View File

@ -29,6 +29,12 @@
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>log4j-to-slf4j</artifactId>
<groupId>org.apache.logging.log4j</groupId>
</exclusion>
</exclusions>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

View File

@ -66,6 +66,7 @@ public enum ResultCode {
GOODS_UPPER_ERROR(11004, "商品上架失败"), GOODS_UPPER_ERROR(11004, "商品上架失败"),
GOODS_AUTH_ERROR(11005, "商品审核失败"), GOODS_AUTH_ERROR(11005, "商品审核失败"),
POINT_GOODS_ERROR(11006, "积分商品业务异常,请稍后重试"), POINT_GOODS_ERROR(11006, "积分商品业务异常,请稍后重试"),
POINT_GOODS_NOT_EXIST(11020, "积分商品不存在"),
GOODS_SKU_SN_ERROR(11007, "商品SKU货号不能为空"), GOODS_SKU_SN_ERROR(11007, "商品SKU货号不能为空"),
GOODS_SKU_PRICE_ERROR(11008, "商品SKU价格不能小于等于0"), GOODS_SKU_PRICE_ERROR(11008, "商品SKU价格不能小于等于0"),
GOODS_SKU_COST_ERROR(11009, "商品SKU成本价不能小于等于0"), GOODS_SKU_COST_ERROR(11009, "商品SKU成本价不能小于等于0"),
@ -247,6 +248,7 @@ public enum ResultCode {
PROMOTION_START_TIME_ERROR(40002, "活动起始时间不能小于当前时间"), PROMOTION_START_TIME_ERROR(40002, "活动起始时间不能小于当前时间"),
PROMOTION_END_TIME_ERROR(40003, "活动结束时间不能小于当前时间"), PROMOTION_END_TIME_ERROR(40003, "活动结束时间不能小于当前时间"),
PROMOTION_TIME_ERROR(40004, "活动起始时间必须大于结束时间"), PROMOTION_TIME_ERROR(40004, "活动起始时间必须大于结束时间"),
PROMOTION_TIME_NOT_EXIST(40011, "活动起始时间和活动结束时间不能为空"),
PROMOTION_SAME_ERROR(40005, "当前时间段已存在相同活动!"), PROMOTION_SAME_ERROR(40005, "当前时间段已存在相同活动!"),
PROMOTION_GOODS_ERROR(40006, "请选择要参与活动的商品"), PROMOTION_GOODS_ERROR(40006, "请选择要参与活动的商品"),
PROMOTION_STATUS_END(40007, "当前活动已停止"), PROMOTION_STATUS_END(40007, "当前活动已停止"),
@ -266,6 +268,11 @@ public enum ResultCode {
COUPON_RECEIVE_ERROR(41005, "当前优惠券已经被领取完了,下次要早点来哦"), COUPON_RECEIVE_ERROR(41005, "当前优惠券已经被领取完了,下次要早点来哦"),
COUPON_NUM_INSUFFICIENT_ERROR(41006, "优惠券剩余领取数量不足"), COUPON_NUM_INSUFFICIENT_ERROR(41006, "优惠券剩余领取数量不足"),
COUPON_NOT_EXIST(41007, "当前优惠券不存在"), COUPON_NOT_EXIST(41007, "当前优惠券不存在"),
COUPON_DO_NOT_RECEIVER(41030, "当前优惠券不允许主动领取"),
COUPON_ACTIVITY_NOT_EXIST(410022, "当前优惠券活动不存在"),
COUPON_SAVE_ERROR(41020, "保存优惠券失败"),
COUPON_ACTIVITY_SAVE_ERROR(41023, "保存优惠券活动失败"),
COUPON_DELETE_ERROR(41021, "删除优惠券失败"),
COUPON_LIMIT_NUM_LESS_THAN_0(41008, "领取限制数量不能为负数"), COUPON_LIMIT_NUM_LESS_THAN_0(41008, "领取限制数量不能为负数"),
COUPON_LIMIT_GREATER_THAN_PUBLISH(41009, "领取限制数量超出发行数量"), COUPON_LIMIT_GREATER_THAN_PUBLISH(41009, "领取限制数量超出发行数量"),
COUPON_DISCOUNT_ERROR(41010, "优惠券折扣必须小于10且大于0"), COUPON_DISCOUNT_ERROR(41010, "优惠券折扣必须小于10且大于0"),
@ -293,7 +300,8 @@ public enum ResultCode {
PINTUAN_DELETE_ERROR(42010, "删除拼团活动失败"), PINTUAN_DELETE_ERROR(42010, "删除拼团活动失败"),
PINTUAN_JOIN_ERROR(42011, "不能参与自己发起的拼团活动!"), PINTUAN_JOIN_ERROR(42011, "不能参与自己发起的拼团活动!"),
PINTUAN_LIMIT_NUM_ERROR(42012, "购买数量超过拼团活动限制数量!"), PINTUAN_LIMIT_NUM_ERROR(42012, "购买数量超过拼团活动限制数量!"),
PINTUAN_NOT_EXIST_ERROR(42013, "当前拼团商品不存在!"), PINTUAN_NOT_EXIST_ERROR(42013, "当前拼团活动不存在!"),
PINTUAN_GOODS_NOT_EXIST_ERROR(42014, "当前拼团商品不存在!"),
/** /**
* 满额活动 * 满额活动
@ -320,10 +328,12 @@ public enum ResultCode {
*/ */
SECKILL_NOT_START_ERROR(45000, "今日没有限时抢购活动,请明天再来看看吧。"), SECKILL_NOT_START_ERROR(45000, "今日没有限时抢购活动,请明天再来看看吧。"),
SECKILL_NOT_EXIST_ERROR(45001, "当前参与的秒杀活动不存在!"), SECKILL_NOT_EXIST_ERROR(45001, "当前参与的秒杀活动不存在!"),
SECKILL_APPLY_NOT_EXIST_ERROR(45010, "当前参与的秒杀活动不存在!"),
SECKILL_UPDATE_ERROR(45002, "当前秒杀活动活动已经开始,无法修改!"), SECKILL_UPDATE_ERROR(45002, "当前秒杀活动活动已经开始,无法修改!"),
SECKILL_PRICE_ERROR(45003, "活动价格不能大于商品原价"), SECKILL_PRICE_ERROR(45003, "活动价格不能大于商品原价"),
SECKILL_TIME_ERROR(45004, "时刻参数异常"), SECKILL_TIME_ERROR(45004, "时刻参数异常"),
SECKILL_DELETE_ERROR(45005, "该秒杀活动活动的状态不能删除"), SECKILL_DELETE_ERROR(45005, "该秒杀活动活动的状态不能删除"),
SECKILL_OPEN_ERROR(45010, "该秒杀活动活动的状态不能删除"),
SECKILL_CLOSE_ERROR(45006, "该秒杀活动活动的状态不能关闭"), SECKILL_CLOSE_ERROR(45006, "该秒杀活动活动的状态不能关闭"),

View File

@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration; import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
import java.io.IOException; import java.io.IOException;
@ -68,6 +69,11 @@ public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
return client; return client;
} }
@Bean("elasticsearchRestTemplate")
public ElasticsearchRestTemplate elasticsearchRestTemplate() {
return new ElasticsearchRestTemplate(elasticsearchClient());
}
private HttpHost[] getHttpHosts() { private HttpHost[] getHttpHosts() {
List<String> clusterNodes = elasticsearchProperties.getClusterNodes(); List<String> clusterNodes = elasticsearchProperties.getClusterNodes();
HttpHost[] httpHosts = new HttpHost[clusterNodes.size()]; HttpHost[] httpHosts = new HttpHost[clusterNodes.size()];

View File

@ -136,6 +136,14 @@ public interface GoodsSkuService extends IService<GoodsSku> {
*/ */
IPage<GoodsSku> getGoodsSkuByPage(GoodsSearchParams searchParams); IPage<GoodsSku> getGoodsSkuByPage(GoodsSearchParams searchParams);
/**
* 列表查询商品sku信息
*
* @param searchParams 查询参数
* @return 商品sku信息
*/
List<GoodsSku> getGoodsSkuByList(GoodsSearchParams searchParams);
/** /**
* 更新商品sku状态 * 更新商品sku状态
* *
@ -186,4 +194,12 @@ public interface GoodsSkuService extends IService<GoodsSku> {
* @param skuId SKUId * @param skuId SKUId
*/ */
void updateGoodsSkuCommentNum(String skuId); void updateGoodsSkuCommentNum(String skuId);
/**
* 更新商品sku促销价格
*
* @param skuId skuId
* @param promotionPrice 促销价格
*/
void updateGoodsSkuPromotion(String skuId, Double promotionPrice);
} }

View File

@ -246,7 +246,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
if (CharSequenceUtil.isNotEmpty(goods.getParams())) { if (CharSequenceUtil.isNotEmpty(goods.getParams())) {
goodsVO.setGoodsParamsDTOList(JSONUtil.toList(goods.getParams(), GoodsParamsDTO.class)); goodsVO.setGoodsParamsDTOList(JSONUtil.toList(goods.getParams(), GoodsParamsDTO.class));
} }
cache.put(CachePrefix.GOODS.getPrefix() + goodsId, goodsVO);
return goodsVO; return goodsVO;
} }

View File

@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.lili.cache.Cache; import cn.lili.cache.Cache;
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.properties.RocketmqCustomProperties; import cn.lili.common.properties.RocketmqCustomProperties;
@ -30,6 +31,7 @@ import cn.lili.modules.member.entity.dos.FootPrint;
import cn.lili.modules.member.entity.dos.MemberEvaluation; import cn.lili.modules.member.entity.dos.MemberEvaluation;
import cn.lili.modules.member.entity.enums.EvaluationGradeEnum; import cn.lili.modules.member.entity.enums.EvaluationGradeEnum;
import cn.lili.modules.member.service.MemberEvaluationService; import cn.lili.modules.member.service.MemberEvaluationService;
import cn.lili.modules.promotion.entity.enums.CouponGetEnum;
import cn.lili.modules.search.entity.dos.EsGoodsAttribute; import cn.lili.modules.search.entity.dos.EsGoodsAttribute;
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;
@ -253,10 +255,25 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
//商品规格 //商品规格
GoodsSkuVO goodsSkuDetail = this.getGoodsSkuVO(goodsSku); GoodsSkuVO goodsSkuDetail = this.getGoodsSkuVO(goodsSku);
Map<String, Object> promotionMap = goodsIndex.getPromotionMap();
//设置当前商品的促销价格 //设置当前商品的促销价格
if (goodsIndex.getPromotionMap() != null && !goodsIndex.getPromotionMap().isEmpty() && goodsIndex.getPromotionPrice() != null) { if (promotionMap != null && !promotionMap.isEmpty() && goodsIndex.getPromotionPrice() != null) {
goodsSkuDetail.setPromotionPrice(goodsIndex.getPromotionPrice()); goodsSkuDetail.setPromotionPrice(goodsIndex.getPromotionPrice());
} }
if (promotionMap != null && !promotionMap.isEmpty()) {
promotionMap = promotionMap.entrySet().stream().parallel().filter(i -> {
JSONObject jsonObject = JSONUtil.parseObj(i.getValue());
return (jsonObject.get("getType") == null || jsonObject.get("getType").toString().equals(CouponGetEnum.FREE.name())) &&
(jsonObject.get("startTime") != null && jsonObject.get("startTime", Date.class).before(new Date()));
}).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
for (String s : promotionMap.keySet()) {
if (!s.contains(PromotionTypeEnum.SECKILL.name()) || !s.contains(PromotionTypeEnum.PINTUAN.name())) {
goodsSkuDetail.setPromotionPrice(null);
break;
}
}
}
map.put("data", goodsSkuDetail); map.put("data", goodsSkuDetail);
//获取分类 //获取分类
@ -265,10 +282,10 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
//获取规格信息 //获取规格信息
map.put("specs", this.groupBySkuAndSpec(goodsVO.getSkuList())); map.put("specs", this.groupBySkuAndSpec(goodsVO.getSkuList()));
map.put("promotionMap", goodsIndex.getPromotionMap()); map.put("promotionMap", promotionMap);
//获取参数信息 //获取参数信息
if (goodsVO.getGoodsParamsDTOList() != null && goodsVO.getGoodsParamsDTOList().size() > 0) { if (goodsVO.getGoodsParamsDTOList() != null && !goodsVO.getGoodsParamsDTOList().isEmpty()) {
map.put("goodsParamsDTOList", goodsVO.getGoodsParamsDTOList()); map.put("goodsParamsDTOList", goodsVO.getGoodsParamsDTOList());
} }
@ -385,6 +402,17 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
return this.page(PageUtil.initPage(searchParams), searchParams.queryWrapper()); return this.page(PageUtil.initPage(searchParams), searchParams.queryWrapper());
} }
/**
* 列表查询商品sku信息
*
* @param searchParams 查询参数
* @return 商品sku信息
*/
@Override
public List<GoodsSku> getGoodsSkuByList(GoodsSearchParams searchParams) {
return this.list(searchParams.queryWrapper());
}
@Override @Override
public void updateStocks(List<GoodsSkuStockDTO> goodsSkuStockDTOS) { public void updateStocks(List<GoodsSkuStockDTO> goodsSkuStockDTOS) {
for (GoodsSkuStockDTO goodsSkuStockDTO : goodsSkuStockDTOS) { for (GoodsSkuStockDTO goodsSkuStockDTO : goodsSkuStockDTOS) {
@ -486,6 +514,22 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
goodsService.updateGoodsCommentNum(goodsSku.getGoodsId()); goodsService.updateGoodsCommentNum(goodsSku.getGoodsId());
} }
/**
* 更新商品sku促销价格
*
* @param skuId skuId
* @param promotionPrice 促销价格
*/
@Override
public void updateGoodsSkuPromotion(String skuId, Double promotionPrice) {
LambdaUpdateWrapper<GoodsSku> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(GoodsSku::getId, skuId);
updateWrapper.set(GoodsSku::getPromotionPrice, promotionPrice);
updateWrapper.set(GoodsSku::getIsPromotion, true);
this.update(updateWrapper);
cache.remove(GoodsSkuService.getCacheKeys(skuId));
}
/** /**
* 发送生成ES商品索引 * 发送生成ES商品索引
* *

View File

@ -16,6 +16,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 会员业务层 * 会员业务层
@ -212,6 +213,15 @@ public interface MemberService extends IService<Member> {
*/ */
Integer getMemberNum(MemberSearchVO memberSearchVO); Integer getMemberNum(MemberSearchVO memberSearchVO);
/**
* 获取指定会员数据
*
* @param columns 指定获取的列
* @param memberIds 会员ids
* @return 指定会员数据
*/
List<Map<String, Object>> listFieldsByMemberIds(String columns, List<String> memberIds);
/** /**
* 登出 * 登出
* *

View File

@ -59,6 +59,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
/** /**
@ -576,6 +577,20 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
return this.count(queryWrapper); return this.count(queryWrapper);
} }
/**
* 获取指定会员数据
*
* @param columns 指定获取的列
* @param memberIds 会员ids
* @return 指定会员数据
*/
@Override
public List<Map<String, Object>> listFieldsByMemberIds(String columns, List<String> memberIds) {
return this.listMaps(new QueryWrapper<Member>()
.select(columns)
.in(memberIds != null && !memberIds.isEmpty(), "id", memberIds));
}
/** /**
* 登出 * 登出
*/ */

View File

@ -5,6 +5,8 @@ import cn.lili.modules.promotion.entity.dos.FullDiscount;
import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.springframework.beans.BeanUtils;
import java.util.List; import java.util.List;
@ -16,13 +18,16 @@ import java.util.List;
*/ */
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
@NoArgsConstructor
public class FullDiscountVO extends FullDiscount { public class FullDiscountVO extends FullDiscount {
private static final long serialVersionUID = -2330552735874105354L; private static final long serialVersionUID = -2330552735874105354L;
/** /**
* 促销关联的商品 * 促销关联的商品
*/ */
private List<PromotionGoods> promotionGoodsList; private List<PromotionGoods> promotionGoodsList;
/** /**
* 赠品信息 * 赠品信息
*/ */
@ -33,6 +38,10 @@ public class FullDiscountVO extends FullDiscount {
*/ */
private Integer number; private Integer number;
public FullDiscountVO(FullDiscount fullDiscount) {
BeanUtils.copyProperties(fullDiscount, this);
}
public String notice() { public String notice() {
StringBuilder stringBuffer = new StringBuilder(); StringBuilder stringBuffer = new StringBuilder();
if (Boolean.TRUE.equals(this.getIsFullMinus())) { if (Boolean.TRUE.equals(this.getIsFullMinus())) {

View File

@ -80,14 +80,14 @@ public class CheckDataRender implements CartRenderStep {
/** /**
* 校验商品属性 * 校验商品属性
* *
* @param tradeDTO * @param tradeDTO 购物车视图
*/ */
private void checkData(TradeDTO tradeDTO) { private void checkData(TradeDTO tradeDTO) {
//循环购物车中的商品 //循环购物车中的商品
for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) { for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) {
//如果失效确认sku为未选中状态 //如果失效确认sku为未选中状态
if (cartSkuVO.getInvalid()) { if (Boolean.TRUE.equals(cartSkuVO.getInvalid())) {
//设置购物车未选中 //设置购物车未选中
cartSkuVO.setChecked(false); cartSkuVO.setChecked(false);
} }
@ -172,7 +172,7 @@ public class CheckDataRender implements CartRenderStep {
//判断拼团商品的限购数量 //判断拼团商品的限购数量
Optional<String> pintuanId = tradeDTO.getSkuList().get(0).getPromotions().stream().filter(i -> i.getPromotionType().equals(PromotionTypeEnum.PINTUAN.name())).map(PromotionGoods::getPromotionId).findFirst(); Optional<String> pintuanId = tradeDTO.getSkuList().get(0).getPromotions().stream().filter(i -> i.getPromotionType().equals(PromotionTypeEnum.PINTUAN.name())).map(PromotionGoods::getPromotionId).findFirst();
if (pintuanId.isPresent()) { if (pintuanId.isPresent()) {
Pintuan pintuan = pintuanService.getPintuanById(pintuanId.get()); Pintuan pintuan = pintuanService.getById(pintuanId.get());
Integer limitNum = pintuan.getLimitNum(); Integer limitNum = pintuan.getLimitNum();
for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) { for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) {
if (limitNum != 0 && cartSkuVO.getNum() > limitNum) { if (limitNum != 0 && cartSkuVO.getNum() > limitNum) {
@ -184,7 +184,7 @@ public class CheckDataRender implements CartRenderStep {
} else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.POINTS)) { } else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.POINTS)) {
String skuId = tradeDTO.getSkuList().get(0).getGoodsSku().getId(); String skuId = tradeDTO.getSkuList().get(0).getGoodsSku().getId();
//获取积分商品VO //获取积分商品VO
PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsVOByMongo(skuId); PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsDetailBySkuId(skuId);
if (pointsGoodsVO == null) { if (pointsGoodsVO == null) {
throw new ServiceException(ResultCode.POINT_GOODS_ERROR); throw new ServiceException(ResultCode.POINT_GOODS_ERROR);
} }

View File

@ -9,7 +9,7 @@ import cn.lili.modules.order.cart.entity.vo.CartSkuVO;
import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.cart.entity.vo.CartVO;
import cn.lili.modules.order.cart.render.CartRenderStep; import cn.lili.modules.order.cart.render.CartRenderStep;
import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; import cn.lili.modules.order.order.entity.dto.PriceDetailDTO;
import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO; import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods;
import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; import cn.lili.modules.promotion.entity.vos.PointsGoodsVO;
import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; import cn.lili.modules.promotion.service.KanjiaActivityGoodsService;
import cn.lili.modules.promotion.service.PointsGoodsService; import cn.lili.modules.promotion.service.PointsGoodsService;
@ -79,13 +79,13 @@ public class CommissionRender implements CartRenderStep {
//如果积分订单 积分订单单独操作订单结算金额和商家结算字段 //如果积分订单 积分订单单独操作订单结算金额和商家结算字段
if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.POINTS)) { if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.POINTS)) {
PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsVOByMongo(cartSkuVO.getGoodsSku().getId()); PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsDetailBySkuId(cartSkuVO.getGoodsSku().getId());
priceDetailDTO.setSettlementPrice(pointsGoodsVO.getSettlementPrice()); priceDetailDTO.setSettlementPrice(pointsGoodsVO.getSettlementPrice());
} }
//如果砍价订单 计算金额单独操作订单结算金额和商家结算字段 //如果砍价订单 计算金额单独操作订单结算金额和商家结算字段
else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.KANJIA)) { else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.KANJIA)) {
KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO = kanjiaActivityGoodsService.getKanJiaGoodsBySku(cartSkuVO.getGoodsSku().getId()); KanjiaActivityGoods kanjiaActivityGoods = kanjiaActivityGoodsService.getKanjiaGoodsBySkuId(cartSkuVO.getGoodsSku().getId());
priceDetailDTO.setSettlementPrice(kanjiaActivityGoodsDTO.getSettlementPrice()); priceDetailDTO.setSettlementPrice(kanjiaActivityGoods.getSettlementPrice());
} }
} }
} }

View File

@ -12,8 +12,8 @@ import cn.lili.modules.order.cart.render.CartRenderStep;
import cn.lili.modules.order.cart.render.util.PromotionPriceUtil; import cn.lili.modules.order.cart.render.util.PromotionPriceUtil;
import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; import cn.lili.modules.order.order.entity.dto.PriceDetailDTO;
import cn.lili.modules.promotion.entity.dos.MemberCoupon; import cn.lili.modules.promotion.entity.dos.MemberCoupon;
import cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum;
import cn.lili.modules.promotion.entity.enums.CouponTypeEnum; import cn.lili.modules.promotion.entity.enums.CouponTypeEnum;
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import cn.lili.modules.promotion.entity.vos.MemberCouponVO; import cn.lili.modules.promotion.entity.vos.MemberCouponVO;
import cn.lili.modules.promotion.service.MemberCouponService; import cn.lili.modules.promotion.service.MemberCouponService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -147,7 +147,7 @@ public class CouponRender implements CartRenderStep {
return Collections.emptyList(); return Collections.emptyList();
} }
//优惠券类型判定 //优惠券类型判定
switch (CouponScopeTypeEnum.valueOf(memberCoupon.getScopeType())) { switch (PromotionsScopeTypeEnum.valueOf(memberCoupon.getScopeType())) {
case ALL: case ALL:
return filterSku; return filterSku;
case PORTION_GOODS: case PORTION_GOODS:

View File

@ -13,6 +13,7 @@ import cn.lili.modules.order.cart.render.CartRenderStep;
import cn.lili.modules.order.cart.render.util.PromotionPriceUtil; import cn.lili.modules.order.cart.render.util.PromotionPriceUtil;
import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; import cn.lili.modules.order.order.entity.dto.PriceDetailDTO;
import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import cn.lili.modules.promotion.service.FullDiscountService; import cn.lili.modules.promotion.service.FullDiscountService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -55,21 +56,20 @@ public class FullDiscountRender implements CartRenderStep {
List<String> storeIds = tradeDTO.getCartList().stream().map(CartVO::getStoreId).collect(Collectors.toList()); List<String> storeIds = tradeDTO.getCartList().stream().map(CartVO::getStoreId).collect(Collectors.toList());
//获取当前店铺进行到满减活动 //获取当前店铺进行到满减活动
List<FullDiscountVO> fullDiscounts = fullDiscountService.currentPromotion(storeIds); List<FullDiscountVO> fullDiscounts = fullDiscountService.currentPromotion(storeIds);
if (fullDiscounts == null || fullDiscounts.size() == 0) { if (fullDiscounts == null || fullDiscounts.isEmpty()) {
return; return;
} }
//循环满减信息 //循环满减信息
for (FullDiscountVO fullDiscount : fullDiscounts) { for (FullDiscountVO fullDiscount : fullDiscounts) {
//判定参与活动的商品 全品类参与或者部分商品参与则进行云散 //判定参与活动的商品 全品类参与或者部分商品参与则进行云散
if (fullDiscount.getNumber() == -1 || fullDiscount.getPromotionGoodsList() != null) {
//循环店铺购物车 //循环店铺购物车
for (CartVO cart : cartList) { for (CartVO cart : cartList) {
//如果购物车中的店铺id与活动店铺id相等则进行促销计算 //如果购物车中的店铺id与活动店铺id相等则进行促销计算
if (fullDiscount.getStoreId().equals(cart.getStoreId())) { if (fullDiscount.getStoreId().equals(cart.getStoreId())) {
//如果有赠品则将赠品信息写入 //如果有赠品则将赠品信息写入
if (fullDiscount.getIsGift()) { if (Boolean.TRUE.equals(fullDiscount.getIsGift())) {
GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(fullDiscount.getGiftId()); GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(fullDiscount.getGiftId());
fullDiscount.setGiftSku(goodsSku); fullDiscount.setGiftSku(goodsSku);
} }
@ -79,6 +79,7 @@ public class FullDiscountRender implements CartRenderStep {
Map<String, Double> skuPriceDetail; Map<String, Double> skuPriceDetail;
//参与活动的sku判定 //参与活动的sku判定
skuPriceDetail = initFullDiscountGoods(fullDiscount, cart.getCheckedSkuList()); skuPriceDetail = initFullDiscountGoods(fullDiscount, cart.getCheckedSkuList());
if (!skuPriceDetail.isEmpty()) {
//记录参与满减活动的sku //记录参与满减活动的sku
cart.setFullDiscountSkuIds(new ArrayList<>(skuPriceDetail.keySet())); cart.setFullDiscountSkuIds(new ArrayList<>(skuPriceDetail.keySet()));
@ -87,11 +88,11 @@ public class FullDiscountRender implements CartRenderStep {
if (isFull(countPrice, cart)) { if (isFull(countPrice, cart)) {
//如果减现金 //如果减现金
if (fullDiscount.getIsFullMinus()) { if (Boolean.TRUE.equals(fullDiscount.getIsFullMinus())) {
promotionPriceUtil.recountPrice(tradeDTO, skuPriceDetail, fullDiscount.getFullMinus(), PromotionTypeEnum.FULL_DISCOUNT); promotionPriceUtil.recountPrice(tradeDTO, skuPriceDetail, fullDiscount.getFullMinus(), PromotionTypeEnum.FULL_DISCOUNT);
} }
//打折 //打折
else if (fullDiscount.getIsFullRate()) { else if (Boolean.TRUE.equals(fullDiscount.getIsFullRate())) {
this.renderFullRate(cart, skuPriceDetail, CurrencyUtil.div(fullDiscount.getFullRate(), 10)); this.renderFullRate(cart, skuPriceDetail, CurrencyUtil.div(fullDiscount.getFullRate(), 10));
} }
//渲染满优惠 //渲染满优惠
@ -100,6 +101,7 @@ public class FullDiscountRender implements CartRenderStep {
} }
} }
} }
} }
@ -145,22 +147,20 @@ public class FullDiscountRender implements CartRenderStep {
Map<String, Double> skuPriceDetail = new HashMap<>(16); Map<String, Double> skuPriceDetail = new HashMap<>(16);
//全品类参与 //全品类参与
if (fullDiscount.getNumber() == -1) { if (PromotionsScopeTypeEnum.ALL.name().equals(fullDiscount.getScopeType())) {
for (CartSkuVO cartSkuVO : cartSkuVOS) { for (CartSkuVO cartSkuVO : cartSkuVOS) {
skuPriceDetail.put(cartSkuVO.getGoodsSku().getId(), cartSkuVO.getPriceDetailDTO().getGoodsPrice()); skuPriceDetail.put(cartSkuVO.getGoodsSku().getId(), cartSkuVO.getPriceDetailDTO().getGoodsPrice());
} }
} else { } else {
//判定参与活动的商品 List<String> collect = fullDiscount.getPromotionGoodsList().stream().map(PromotionGoods::getSkuId).collect(Collectors.toList());
for (PromotionGoods promotionGoods : fullDiscount.getPromotionGoodsList()) {
//sku 集合判定 //sku 集合判定
for (CartSkuVO cartSkuVO : cartSkuVOS) { for (CartSkuVO cartSkuVO : cartSkuVOS) {
// 如果参加满减并且购物车选中状态 则记录商品sku // 如果参加满减并且购物车选中状态 则记录商品sku
if (cartSkuVO.getChecked() && cartSkuVO.getGoodsSku().getId().equals(promotionGoods.getSkuId())) { if (Boolean.TRUE.equals(cartSkuVO.getChecked()) && collect.contains(cartSkuVO.getGoodsSku().getId())) {
skuPriceDetail.put(cartSkuVO.getGoodsSku().getId(), cartSkuVO.getPriceDetailDTO().getGoodsPrice()); skuPriceDetail.put(cartSkuVO.getGoodsSku().getId(), cartSkuVO.getPriceDetailDTO().getGoodsPrice());
} }
} }
} }
}
return skuPriceDetail; return skuPriceDetail;
} }
@ -173,17 +173,17 @@ public class FullDiscountRender implements CartRenderStep {
//获取参与活动的商品总价 //获取参与活动的商品总价
FullDiscountVO fullDiscount = cartVO.getFullDiscount(); FullDiscountVO fullDiscount = cartVO.getFullDiscount();
if (fullDiscount.getIsCoupon()) { if (Boolean.TRUE.equals(fullDiscount.getIsCoupon())) {
cartVO.getGiftCouponList().add(fullDiscount.getCouponId()); cartVO.getGiftCouponList().add(fullDiscount.getCouponId());
} }
if (fullDiscount.getIsGift()) { if (Boolean.TRUE.equals(fullDiscount.getIsGift())) {
cartVO.setGiftList(Arrays.asList(fullDiscount.getGiftId().split(","))); cartVO.setGiftList(Arrays.asList(fullDiscount.getGiftId().split(",")));
} }
if (fullDiscount.getIsPoint()) { if (Boolean.TRUE.equals(fullDiscount.getIsPoint())) {
cartVO.setGiftPoint(fullDiscount.getPoint()); cartVO.setGiftPoint(fullDiscount.getPoint());
} }
//如果满足判定是否免邮免邮的话需要渲染一边sku //如果满足判定是否免邮免邮的话需要渲染一边sku
if (fullDiscount.getIsFreeFreight()) { if (Boolean.TRUE.equals(fullDiscount.getIsFreeFreight())) {
for (CartSkuVO skuVO : cartVO.getCheckedSkuList()) { for (CartSkuVO skuVO : cartVO.getCheckedSkuList()) {
skuVO.setIsFreeFreight(true); skuVO.setIsFreeFreight(true);
} }
@ -214,7 +214,7 @@ public class FullDiscountRender implements CartRenderStep {
* @return 总价 * @return 总价
*/ */
private Double countPrice(Map<String, Double> skuPriceMap) { private Double countPrice(Map<String, Double> skuPriceMap) {
Double count = 0d; double count = 0d;
for (Double price : skuPriceMap.values()) { for (Double price : skuPriceMap.values()) {
count = CurrencyUtil.add(count, price); count = CurrencyUtil.add(count, price);

View File

@ -25,14 +25,10 @@ import cn.lili.modules.order.cart.entity.vo.TradeParams;
import cn.lili.modules.order.cart.render.TradeBuilder; import cn.lili.modules.order.cart.render.TradeBuilder;
import cn.lili.modules.order.order.entity.dos.Trade; import cn.lili.modules.order.order.entity.dos.Trade;
import cn.lili.modules.order.order.entity.vo.ReceiptVO; import cn.lili.modules.order.order.entity.vo.ReceiptVO;
import cn.lili.modules.promotion.entity.dos.KanjiaActivity; import cn.lili.modules.promotion.entity.dos.*;
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
import cn.lili.modules.promotion.entity.dos.Pintuan;
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO;
import cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum;
import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum; import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum;
import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; import cn.lili.modules.promotion.entity.vos.PointsGoodsVO;
import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivitySearchParams; import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivitySearchParams;
import cn.lili.modules.promotion.service.*; import cn.lili.modules.promotion.service.*;
@ -123,6 +119,11 @@ public class CartServiceImpl implements CartService {
} }
CartTypeEnum cartTypeEnum = getCartType(cartType); CartTypeEnum cartTypeEnum = getCartType(cartType);
GoodsSku dataSku = checkGoods(skuId); GoodsSku dataSku = checkGoods(skuId);
Double validPromotionsGoodsPrice = promotionGoodsService.getValidPromotionsGoodsPrice(skuId, Arrays.asList(PromotionTypeEnum.SECKILL.name(), PromotionTypeEnum.PINTUAN.name()));
if (validPromotionsGoodsPrice != null) {
dataSku.setIsPromotion(true);
dataSku.setPromotionPrice(validPromotionsGoodsPrice);
}
try { try {
//购物车方式购买需要保存之前的选择其他方式购买则直接抹除掉之前的记录 //购物车方式购买需要保存之前的选择其他方式购买则直接抹除掉之前的记录
TradeDTO tradeDTO; TradeDTO tradeDTO;
@ -636,15 +637,15 @@ public class CartServiceImpl implements CartService {
} }
//当初购物车商品中是否存在符合优惠券条件的商品sku //当初购物车商品中是否存在符合优惠券条件的商品sku
if (memberCoupon.getScopeType().equals(CouponScopeTypeEnum.ALL.name())) { if (memberCoupon.getScopeType().equals(PromotionsScopeTypeEnum.ALL.name())) {
return cartSkuVOS; return cartSkuVOS;
} else if (memberCoupon.getScopeType().equals(CouponScopeTypeEnum.PORTION_GOODS_CATEGORY.name())) { } else if (memberCoupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS_CATEGORY.name())) {
//分类路径是否包含 //分类路径是否包含
return cartSkuVOS.stream().filter(i -> i.getGoodsSku().getCategoryPath().indexOf("," + memberCoupon.getScopeId() + ",") <= 0).collect(Collectors.toList()); return cartSkuVOS.stream().filter(i -> i.getGoodsSku().getCategoryPath().indexOf("," + memberCoupon.getScopeId() + ",") <= 0).collect(Collectors.toList());
} else if (memberCoupon.getScopeType().equals(CouponScopeTypeEnum.PORTION_GOODS.name())) { } else if (memberCoupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS.name())) {
//范围关联ID是否包含 //范围关联ID是否包含
return cartSkuVOS.stream().filter(i -> memberCoupon.getScopeId().indexOf("," + i.getGoodsSku().getId() + ",") <= 0).collect(Collectors.toList()); return cartSkuVOS.stream().filter(i -> memberCoupon.getScopeId().indexOf("," + i.getGoodsSku().getId() + ",") <= 0).collect(Collectors.toList());
} else if (memberCoupon.getScopeType().equals(CouponScopeTypeEnum.PORTION_SHOP_CATEGORY.name())) { } else if (memberCoupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_SHOP_CATEGORY.name())) {
//店铺分类路径是否包含 //店铺分类路径是否包含
return cartSkuVOS.stream().filter(i -> i.getGoodsSku().getStoreCategoryPath().indexOf("," + memberCoupon.getScopeId() + ",") <= 0).collect(Collectors.toList()); return cartSkuVOS.stream().filter(i -> i.getGoodsSku().getStoreCategoryPath().indexOf("," + memberCoupon.getScopeId() + ",") <= 0).collect(Collectors.toList());
} }
@ -700,7 +701,7 @@ public class CartServiceImpl implements CartService {
throw new ServiceException(ResultCode.CART_PINTUAN_NOT_EXIST_ERROR); throw new ServiceException(ResultCode.CART_PINTUAN_NOT_EXIST_ERROR);
} }
//检测拼团限购数量 //检测拼团限购数量
Pintuan pintuan = pintuanService.getPintuanById(cartSkuVO.getPintuanId()); Pintuan pintuan = pintuanService.getById(cartSkuVO.getPintuanId());
Integer limitNum = pintuan.getLimitNum(); Integer limitNum = pintuan.getLimitNum();
if (limitNum != 0 && cartSkuVO.getNum() > limitNum) { if (limitNum != 0 && cartSkuVO.getNum() > limitNum) {
throw new ServiceException(ResultCode.CART_PINTUAN_LIMIT_ERROR); throw new ServiceException(ResultCode.CART_PINTUAN_LIMIT_ERROR);
@ -715,7 +716,7 @@ public class CartServiceImpl implements CartService {
private void checkKanjia(CartSkuVO cartSkuVO) { private void checkKanjia(CartSkuVO cartSkuVO) {
//根据skuId获取砍价商品 //根据skuId获取砍价商品
KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO = kanjiaActivityGoodsService.getKanjiaGoodsBySkuId(cartSkuVO.getGoodsSku().getId()); KanjiaActivityGoods kanjiaActivityGoodsDTO = kanjiaActivityGoodsService.getKanjiaGoodsBySkuId(cartSkuVO.getGoodsSku().getId());
//查找当前会员的砍价商品活动 //查找当前会员的砍价商品活动
KanjiaActivitySearchParams kanjiaActivitySearchParams = new KanjiaActivitySearchParams(); KanjiaActivitySearchParams kanjiaActivitySearchParams = new KanjiaActivitySearchParams();
@ -746,7 +747,7 @@ public class CartServiceImpl implements CartService {
*/ */
private void checkPoint(CartSkuVO cartSkuVO) { private void checkPoint(CartSkuVO cartSkuVO) {
PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsVOByMongo(cartSkuVO.getGoodsSku().getId()); PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsDetailBySkuId(cartSkuVO.getGoodsSku().getId());
if (pointsGoodsVO != null) { if (pointsGoodsVO != null) {

View File

@ -1,7 +1,7 @@
package cn.lili.modules.order.order.entity.dto; package cn.lili.modules.order.order.entity.dto;
import cn.lili.modules.promotion.entity.dto.BasePromotion; import cn.lili.modules.promotion.entity.dto.BasePromotions;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
@ -74,7 +74,7 @@ public class AfterSalePriceDetailDTO implements Serializable {
* 参与的促销活动 * 参与的促销活动
*/ */
@ApiModelProperty(value = "参与的促销活动") @ApiModelProperty(value = "参与的促销活动")
private List<BasePromotion> joinPromotion; private List<BasePromotions> joinPromotion;
public AfterSalePriceDetailDTO() { public AfterSalePriceDetailDTO() {

View File

@ -6,10 +6,7 @@ import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums; import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.utils.DateUtil; import cn.lili.common.utils.DateUtil;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.modules.order.order.entity.enums.CommentStatusEnum; import cn.lili.modules.order.order.entity.enums.*;
import cn.lili.modules.order.order.entity.enums.OrderStatusEnum;
import cn.lili.modules.order.order.entity.enums.OrderTagEnum;
import cn.lili.modules.order.order.entity.enums.OrderTypeEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ -104,6 +101,18 @@ public class OrderSearchParams extends PageVO {
@ApiModelProperty(value = "评论状态:未评论(UNFINISHED),待追评(WAIT_CHASE),评论完成(FINISHED)") @ApiModelProperty(value = "评论状态:未评论(UNFINISHED),待追评(WAIT_CHASE),评论完成(FINISHED)")
private String commentStatus; private String commentStatus;
@ApiModelProperty(value = "是否为其他订单下的订单如果是则为依赖订单的sn否则为空")
private String parentOrderSn;
@ApiModelProperty(value = "是否为某订单类型的订单如果是则为订单类型的id否则为空")
private String promotionId;
/**
* @see OrderPromotionTypeEnum
*/
@ApiModelProperty(value = "订单促销类型")
private String orderPromotionType;
public <T> QueryWrapper<T> queryWrapper() { public <T> QueryWrapper<T> queryWrapper() {
AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
QueryWrapper<T> wrapper = new QueryWrapper<>(); QueryWrapper<T> wrapper = new QueryWrapper<>();
@ -192,6 +201,12 @@ public class OrderSearchParams extends PageVO {
} }
} }
// 依赖订单
wrapper.eq(CharSequenceUtil.isNotEmpty(parentOrderSn), "o.parent_order_sn", parentOrderSn);
// 促销活动id
wrapper.eq(CharSequenceUtil.isNotEmpty(promotionId), "o.promotion_id", promotionId);
wrapper.eq(CharSequenceUtil.isNotEmpty(orderPromotionType), "o.order_promotion_type", orderPromotionType);
wrapper.eq("o.delete_flag", false); wrapper.eq("o.delete_flag", false);
return wrapper; return wrapper;

View File

@ -52,6 +52,17 @@ public interface OrderMapper extends BaseMapper<Order> {
" FROM li_order o INNER JOIN li_order_item AS oi on o.sn = oi.order_sn ${ew.customSqlSegment} ") " FROM li_order o INNER JOIN li_order_item AS oi on o.sn = oi.order_sn ${ew.customSqlSegment} ")
IPage<OrderSimpleVO> queryByParams(IPage<OrderSimpleVO> page, @Param(Constants.WRAPPER) Wrapper<OrderSimpleVO> queryWrapper); IPage<OrderSimpleVO> queryByParams(IPage<OrderSimpleVO> page, @Param(Constants.WRAPPER) Wrapper<OrderSimpleVO> queryWrapper);
/**
* 查询订单信息
*
* @param queryWrapper 查询条件
* @return 简短订单分页
*/
@Select("select o.* " +
" FROM li_order o INNER JOIN li_order_item AS oi on o.sn = oi.order_sn ${ew.customSqlSegment} ")
List<Order> queryListByParams(@Param(Constants.WRAPPER) Wrapper<Order> queryWrapper);
/** /**
* 查询导出订单DTO列表 * 查询导出订单DTO列表
* *

View File

@ -51,6 +51,46 @@ public interface OrderService extends IService<Order> {
*/ */
IPage<OrderSimpleVO> queryByParams(OrderSearchParams orderSearchParams); IPage<OrderSimpleVO> queryByParams(OrderSearchParams orderSearchParams);
/**
* 订单信息
*
* @param orderSearchParams 查询参数
* @return 订单信息
*/
List<Order> queryListByParams(OrderSearchParams orderSearchParams);
/**
* 根据促销查询订单
*
* @param orderPromotionType 订单类型
* @param payStatus 支付状态
* @param parentOrderSn 依赖订单编号
* @param orderSn 订单编号
* @return 订单信息
*/
List<Order> queryListByPromotion(String orderPromotionType, String payStatus, String parentOrderSn, String orderSn);
/**
* 根据促销查询订单
*
* @param orderPromotionType 订单类型
* @param payStatus 支付状态
* @param parentOrderSn 依赖订单编号
* @param orderSn 订单编号
* @return 订单信息
*/
Integer queryCountByPromotion(String orderPromotionType, String payStatus, String parentOrderSn, String orderSn);
/**
* 父级拼团订单分组
*
* @param pintuanId 拼团id
* @return 拼团订单信息
*/
List<Order> queryListByPromotion(String pintuanId);
/** /**
* 查询导出订单列表 * 查询导出订单列表
* *

View File

@ -8,6 +8,7 @@ import cn.hutool.json.JSONUtil;
import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter; import cn.hutool.poi.excel.ExcelWriter;
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.properties.RocketmqCustomProperties; import cn.lili.common.properties.RocketmqCustomProperties;
@ -193,6 +194,70 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
return this.baseMapper.queryByParams(PageUtil.initPage(orderSearchParams), queryWrapper); return this.baseMapper.queryByParams(PageUtil.initPage(orderSearchParams), queryWrapper);
} }
/**
* 订单信息
*
* @param orderSearchParams 查询参数
* @return 订单信息
*/
@Override
public List<Order> queryListByParams(OrderSearchParams orderSearchParams) {
return this.baseMapper.queryListByParams(orderSearchParams.queryWrapper());
}
/**
* 根据促销查询订单
*
* @param orderPromotionType 订单类型
* @param payStatus 支付状态
* @param parentOrderSn 依赖订单编号
* @param orderSn 订单编号
* @return 订单信息
*/
@Override
public List<Order> queryListByPromotion(String orderPromotionType, String payStatus, String parentOrderSn, String orderSn) {
LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>();
//查找团长订单和已和当前拼团订单拼团的订单
queryWrapper.eq(Order::getOrderPromotionType, orderPromotionType)
.eq(Order::getPayStatus, payStatus)
.and(i -> i.eq(Order::getParentOrderSn, parentOrderSn).or(j -> j.eq(Order::getSn, orderSn)));
return this.list(queryWrapper);
}
/**
* 根据促销查询订单
*
* @param orderPromotionType 订单类型
* @param payStatus 支付状态
* @param parentOrderSn 依赖订单编号
* @param orderSn 订单编号
* @return 订单信息
*/
@Override
public Integer queryCountByPromotion(String orderPromotionType, String payStatus, String parentOrderSn, String orderSn) {
LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>();
//查找团长订单和已和当前拼团订单拼团的订单
queryWrapper.eq(Order::getOrderPromotionType, orderPromotionType)
.eq(Order::getPayStatus, payStatus)
.and(i -> i.eq(Order::getParentOrderSn, parentOrderSn).or(j -> j.eq(Order::getSn, orderSn)));
return this.count(queryWrapper);
}
/**
* 父级拼团订单
*
* @param pintuanId 拼团id
* @return 拼团订单信息
*/
@Override
public List<Order> queryListByPromotion(String pintuanId) {
LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Order::getOrderPromotionType, PromotionTypeEnum.PINTUAN.name());
queryWrapper.eq(Order::getPromotionId, pintuanId);
queryWrapper.nested(i -> i.eq(Order::getPayStatus, PayStatusEnum.PAID.name()).or().eq(Order::getOrderStatus, OrderStatusEnum.PAID.name()));
return this.list(queryWrapper);
}
@Override @Override
public List<OrderExportDTO> queryExportOrder(OrderSearchParams orderSearchParams) { public List<OrderExportDTO> queryExportOrder(OrderSearchParams orderSearchParams) {
return this.baseMapper.queryExportOrder(orderSearchParams.queryWrapper()); return this.baseMapper.queryExportOrder(orderSearchParams.queryWrapper());
@ -515,7 +580,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
@Override @Override
public void agglomeratePintuanOrder(String pintuanId, String parentOrderSn) { public void agglomeratePintuanOrder(String pintuanId, String parentOrderSn) {
//获取拼团配置 //获取拼团配置
Pintuan pintuan = pintuanService.getPintuanById(pintuanId); Pintuan pintuan = pintuanService.getById(pintuanId);
List<Order> list = this.getPintuanOrder(pintuanId, parentOrderSn); List<Order> list = this.getPintuanOrder(pintuanId, parentOrderSn);
if (Boolean.TRUE.equals(pintuan.getFictitious()) && pintuan.getRequiredNum() > list.size()) { if (Boolean.TRUE.equals(pintuan.getFictitious()) && pintuan.getRequiredNum() > list.size()) {
//如果开启虚拟成团且当前订单数量不足成团数量则认为拼团成功 //如果开启虚拟成团且当前订单数量不足成团数量则认为拼团成功
@ -667,7 +732,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
return; return;
} }
//获取拼团配置 //获取拼团配置
Pintuan pintuan = pintuanService.getPintuanById(pintuanId); Pintuan pintuan = pintuanService.getById(pintuanId);
List<Order> list = this.getPintuanOrder(pintuanId, parentOrderSn); List<Order> list = this.getPintuanOrder(pintuanId, parentOrderSn);
int count = list.size(); int count = list.size();
if (count == 1) { if (count == 1) {
@ -734,7 +799,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
private void pintuanOrderFailed(List<Order> list) { private void pintuanOrderFailed(List<Order> list) {
for (Order order : list) { for (Order order : list) {
try { try {
this.cancel(order.getSn(), "拼团人数不足,拼团失败!"); this.systemCancel(order.getSn(), "拼团人数不足,拼团失败!");
} catch (Exception e) { } catch (Exception e) {
log.error("拼团订单取消失败", e); log.error("拼团订单取消失败", e);
} }
@ -766,7 +831,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
private void checkOrder(Order order) { private void checkOrder(Order order) {
//订单类型为拼团订单检测购买数量是否超过了限购数量 //订单类型为拼团订单检测购买数量是否超过了限购数量
if (OrderPromotionTypeEnum.PINTUAN.name().equals(order.getOrderType())) { if (OrderPromotionTypeEnum.PINTUAN.name().equals(order.getOrderType())) {
Pintuan pintuan = pintuanService.getPintuanById(order.getPromotionId()); Pintuan pintuan = pintuanService.getById(order.getPromotionId());
Integer limitNum = pintuan.getLimitNum(); Integer limitNum = pintuan.getLimitNum();
if (limitNum != 0 && order.getGoodsNum() > limitNum) { if (limitNum != 0 && order.getGoodsNum() > limitNum) {
throw new ServiceException(ResultCode.PINTUAN_LIMIT_NUM_ERROR); throw new ServiceException(ResultCode.PINTUAN_LIMIT_NUM_ERROR);

View File

@ -1,10 +1,17 @@
package cn.lili.modules.promotion.entity.dos; package cn.lili.modules.promotion.entity.dos;
import cn.lili.modules.promotion.entity.dto.BasePromotion; import cn.lili.modules.promotion.entity.dto.BasePromotions;
import cn.lili.modules.promotion.entity.enums.CouponRangeDayEnum;
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.entity.vos.CouponVO;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.beans.BeanUtils;
/** /**
@ -13,15 +20,16 @@ import lombok.Data;
* @author Chopper * @author Chopper
* @since 2020-03-19 10:44 上午 * @since 2020-03-19 10:44 上午
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@TableName("li_coupon") @TableName("li_coupon")
@ApiModel(value = "优惠券实体类") @ApiModel(value = "优惠券实体类")
public class Coupon extends BasePromotion { @ToString(callSuper = true)
@NoArgsConstructor
public class Coupon extends BasePromotions {
private static final long serialVersionUID = 8372820376262437018L; private static final long serialVersionUID = 8372820376262437018L;
@ApiModelProperty(value = "优惠券名称") @ApiModelProperty(value = "优惠券名称")
private String couponName; private String couponName;
@ -33,21 +41,12 @@ public class Coupon extends BasePromotion {
@ApiModelProperty(value = "优惠券类型") @ApiModelProperty(value = "优惠券类型")
private String couponType; private String couponType;
/**
* @see cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum
*/
@ApiModelProperty(value = "关联范围类型")
private String scopeType;
@ApiModelProperty(value = "面额") @ApiModelProperty(value = "面额")
private Double price; private Double price;
@ApiModelProperty(value = "折扣") @ApiModelProperty(value = "折扣")
private Double couponDiscount; private Double couponDiscount;
@ApiModelProperty(value = "范围关联的id")
private String scopeId;
/** /**
* @see cn.lili.modules.promotion.entity.enums.CouponGetEnum * @see cn.lili.modules.promotion.entity.enums.CouponGetEnum
*/ */
@ -77,7 +76,6 @@ public class Coupon extends BasePromotion {
/** /**
* @see cn.lili.modules.promotion.entity.enums.CouponRangeDayEnum * @see cn.lili.modules.promotion.entity.enums.CouponRangeDayEnum
*
*/ */
@ApiModelProperty(value = "时间范围类型") @ApiModelProperty(value = "时间范围类型")
private String rangeDayType; private String rangeDayType;
@ -85,4 +83,21 @@ public class Coupon extends BasePromotion {
@ApiModelProperty(value = "有效期") @ApiModelProperty(value = "有效期")
private Integer effectiveDays; private Integer effectiveDays;
public Coupon(CouponVO couponVO) {
BeanUtils.copyProperties(couponVO, this);
}
/**
* @return 促销状态
* @see cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum
*/
@Override
public String getPromotionStatus() {
if (this.rangeDayType != null && this.rangeDayType.equals(CouponRangeDayEnum.DYNAMICTIME.name())
&& (this.effectiveDays != null && this.effectiveDays > 0 && this.effectiveDays <= 365)) {
return PromotionsStatusEnum.START.name();
}
return super.getPromotionStatus();
}
} }

View File

@ -1,12 +1,13 @@
package cn.lili.modules.promotion.entity.dos; package cn.lili.modules.promotion.entity.dos;
import cn.lili.modules.promotion.entity.dto.BasePromotion; import cn.lili.modules.promotion.entity.dto.BasePromotions;
import cn.lili.modules.promotion.entity.enums.CouponActivitySendTypeEnum; import cn.lili.modules.promotion.entity.enums.CouponActivitySendTypeEnum;
import cn.lili.modules.promotion.entity.enums.CouponActivityTypeEnum; import cn.lili.modules.promotion.entity.enums.CouponActivityTypeEnum;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
@ -16,10 +17,11 @@ import javax.validation.constraints.NotNull;
* @author Bulbasaur * @author Bulbasaur
* @since 2020-03-19 10:44 上午 * @since 2020-03-19 10:44 上午
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@TableName("li_coupon_activity") @TableName("li_coupon_activity")
@ApiModel(value = "优惠券活动实体类") @ApiModel(value = "优惠券活动实体类")
public class CouponActivity extends BasePromotion { public class CouponActivity extends BasePromotions {
/** /**
* @see CouponActivityTypeEnum * @see CouponActivityTypeEnum

View File

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
/** /**
* 优惠券活动实体类 * 优惠券活动实体类
@ -12,6 +13,7 @@ import lombok.Data;
* @author Bulbasaur * @author Bulbasaur
* @since 2020-03-19 10:44 上午 * @since 2020-03-19 10:44 上午
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@TableName("li_coupon_activity_item") @TableName("li_coupon_activity_item")
@ApiModel(value = "优惠券活动-优惠券关联实体类") @ApiModel(value = "优惠券活动-优惠券关联实体类")

View File

@ -1,6 +1,6 @@
package cn.lili.modules.promotion.entity.dos; package cn.lili.modules.promotion.entity.dos;
import cn.lili.modules.promotion.entity.dto.BasePromotion; import cn.lili.modules.promotion.entity.dto.BasePromotions;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ -21,7 +21,7 @@ import javax.validation.constraints.NotNull;
@Data @Data
@TableName("li_full_discount") @TableName("li_full_discount")
@ApiModel(value = "满优惠活动") @ApiModel(value = "满优惠活动")
public class FullDiscount extends BasePromotion { public class FullDiscount extends BasePromotions {
private static final long serialVersionUID = 430433787214894166L; private static final long serialVersionUID = 430433787214894166L;

View File

@ -6,14 +6,16 @@ import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
/** /**
* 砍价活动参与实体类 * 砍价活动参与实体类
* *
* @author qiuqiu * @author qiuqiu
* @date 2020-7-1 10:44 上午 * @since 2020-7-1 10:44 上午
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@TableName("li_kanjia_activity") @TableName("li_kanjia_activity")
@ApiModel(value = "砍价活动参与对象") @ApiModel(value = "砍价活动参与对象")

View File

@ -1,10 +1,11 @@
package cn.lili.modules.promotion.entity.dos; package cn.lili.modules.promotion.entity.dos;
import cn.lili.modules.promotion.entity.dto.BasePromotion; import cn.lili.modules.promotion.entity.dto.BasePromotions;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
@ -14,10 +15,11 @@ import javax.validation.constraints.NotEmpty;
* @author qiuqiu * @author qiuqiu
* @date 2020-7-1 10:44 上午 * @date 2020-7-1 10:44 上午
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@TableName("li_kanjia_activity_goods") @TableName("li_kanjia_activity_goods")
@ApiModel(value = "砍价活动商品对象") @ApiModel(value = "砍价活动商品对象")
public class KanjiaActivityGoods extends BasePromotion { public class KanjiaActivityGoods extends BasePromotions {
private static final long serialVersionUID = 6694714877345423488L; private static final long serialVersionUID = 6694714877345423488L;
@ -34,6 +36,10 @@ public class KanjiaActivityGoods extends BasePromotion {
@ApiModelProperty(value = "货品id") @ApiModelProperty(value = "货品id")
@NotEmpty(message = "货品id不能为空") @NotEmpty(message = "货品id不能为空")
private String goodsId;
@ApiModelProperty(value = "货品SkuId")
@NotEmpty(message = "货品SkuId不能为空")
private String skuId; private String skuId;
@ApiModelProperty(value = "货品名称") @ApiModelProperty(value = "货品名称")

View File

@ -3,14 +3,16 @@ package cn.lili.modules.promotion.entity.dos;
import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.lili.mybatis.BaseEntity;
import cn.lili.modules.promotion.entity.enums.CouponRangeDayEnum; import cn.lili.modules.promotion.entity.enums.CouponRangeDayEnum;
import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import cn.lili.mybatis.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date; import java.util.Date;
@ -20,6 +22,7 @@ import java.util.Date;
* @author Chopper * @author Chopper
* @since 2020-03-19 10:44 上午 * @since 2020-03-19 10:44 上午
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@TableName("li_member_coupon") @TableName("li_member_coupon")
@ApiModel(value = "会员优惠券") @ApiModel(value = "会员优惠券")
@ -52,7 +55,7 @@ public class MemberCoupon extends BaseEntity {
private String memberId; private String memberId;
/** /**
* @see cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum * @see PromotionsScopeTypeEnum
*/ */
@ApiModelProperty(value = "关联范围类型") @ApiModelProperty(value = "关联范围类型")
private String scopeType; private String scopeType;

View File

@ -1,6 +1,6 @@
package cn.lili.modules.promotion.entity.dos; package cn.lili.modules.promotion.entity.dos;
import cn.lili.modules.promotion.entity.dto.BasePromotion; import cn.lili.modules.promotion.entity.dto.BasePromotions;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ -19,7 +19,7 @@ import javax.validation.constraints.NotNull;
@Data @Data
@TableName("li_pintuan") @TableName("li_pintuan")
@ApiModel(value = "拼团") @ApiModel(value = "拼团")
public class Pintuan extends BasePromotion { public class Pintuan extends BasePromotions {
private static final long serialVersionUID = -8465716592648602604L; private static final long serialVersionUID = -8465716592648602604L;

View File

@ -1,11 +1,12 @@
package cn.lili.modules.promotion.entity.dos; package cn.lili.modules.promotion.entity.dos;
import cn.lili.modules.promotion.entity.dto.BasePromotion; import cn.lili.modules.promotion.entity.dto.BasePromotions;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -15,18 +16,28 @@ import lombok.NoArgsConstructor;
* @author paulG * @author paulG
* @since 2020-03-19 10:44 上午 * @since 2020-03-19 10:44 上午
**/ **/
@EqualsAndHashCode(callSuper = true)
@Data @Data
@TableName("li_points_goods") @TableName("li_points_goods")
@ApiModel(value = "积分商品") @ApiModel(value = "积分商品")
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class PointsGoods extends BasePromotion { public class PointsGoods extends BasePromotions {
private static final long serialVersionUID = 1313207311581661571L; private static final long serialVersionUID = 1313207311581661571L;
@ApiModelProperty(value = "商品编号") @ApiModelProperty(value = "商品编号")
private String goodsId;
@ApiModelProperty(value = "商品sku编号")
private String skuId; private String skuId;
@ApiModelProperty(value = "商品名称")
private String goodsName;
@ApiModelProperty(value = "商品原价")
private Double originalPrice;
@ApiModelProperty(value = "结算价格") @ApiModelProperty(value = "结算价格")
private Double settlementPrice; private Double settlementPrice;
@ -36,6 +47,9 @@ public class PointsGoods extends BasePromotion {
@ApiModelProperty(value = "分类名称") @ApiModelProperty(value = "分类名称")
private String pointsGoodsCategoryName; private String pointsGoodsCategoryName;
@ApiModelProperty(value = "缩略图")
private String thumbnail;
@ApiModelProperty(value = "活动库存数量") @ApiModelProperty(value = "活动库存数量")
private Integer activeStock; private Integer activeStock;

View File

@ -2,14 +2,16 @@ package cn.lili.modules.promotion.entity.dos;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.mybatis.BaseEntity;
import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO;
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import cn.lili.mybatis.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.util.Date; import java.util.Date;
@ -20,6 +22,7 @@ import java.util.Date;
* @author Chopper * @author Chopper
* @since 2020-03-19 10:44 上午 * @since 2020-03-19 10:44 上午
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@TableName("li_promotion_goods") @TableName("li_promotion_goods")
@ApiModel(value = "促销商品") @ApiModel(value = "促销商品")
@ -34,10 +37,13 @@ public class PromotionGoods extends BaseEntity {
@ApiModelProperty(value = "商家名称") @ApiModelProperty(value = "商家名称")
private String storeName; private String storeName;
@ApiModelProperty(value = "货品id") @ApiModelProperty(value = "商品id")
private String goodsId;
@ApiModelProperty(value = "商品SkuId")
private String skuId; private String skuId;
@ApiModelProperty(value = "货品名称") @ApiModelProperty(value = "品名称")
private String goodsName; private String goodsName;
@ApiModelProperty(value = "缩略图") @ApiModelProperty(value = "缩略图")
@ -72,31 +78,56 @@ public class PromotionGoods extends BaseEntity {
@ApiModelProperty(value = "卖出的商品数量") @ApiModelProperty(value = "卖出的商品数量")
private Integer num; private Integer num;
@ApiModelProperty(value = "原价")
private Double originalPrice;
@ApiModelProperty(value = "促销价格") @ApiModelProperty(value = "促销价格")
private Double price; private Double price;
@ApiModelProperty(value = "兑换积分")
private Long points;
@ApiModelProperty(value = "限购数量") @ApiModelProperty(value = "限购数量")
private Integer limitNum; private Integer limitNum;
@ApiModelProperty(value = "促销库存") @ApiModelProperty(value = "促销库存")
private Integer quantity; private Integer quantity;
/**
* @see PromotionStatusEnum
*/
@ApiModelProperty(value = "状态")
private String promotionStatus;
@ApiModelProperty(value = "分类path") @ApiModelProperty(value = "分类path")
private String categoryPath; private String categoryPath;
/**
* @see PromotionsScopeTypeEnum
*/
@ApiModelProperty(value = "关联范围类型")
private String scopeType = PromotionsScopeTypeEnum.PORTION_GOODS.name();
@ApiModelProperty(value = "范围关联的id")
private String scopeId;
public PromotionGoods(GoodsSku sku) { public PromotionGoods(GoodsSku sku) {
if (sku != null) { if (sku != null) {
String oldId = this.getId(); BeanUtil.copyProperties(sku, this, "id", "price");
BeanUtil.copyProperties(sku, this); this.skuId = sku.getId();
this.setSkuId(sku.getId()); this.originalPrice = sku.getPrice();
this.setId(oldId);
} }
} }
public PromotionGoods(PointsGoods pointsGoods, GoodsSku sku) {
if (pointsGoods != null) {
BeanUtil.copyProperties(sku, this, "id");
BeanUtil.copyProperties(pointsGoods, this, "id");
this.promotionId = pointsGoods.getId();
this.quantity = pointsGoods.getActiveStock();
this.originalPrice = sku.getPrice();
}
}
public PromotionGoods(KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO) {
if (kanjiaActivityGoodsDTO != null) {
BeanUtil.copyProperties(kanjiaActivityGoodsDTO, this, "id");
BeanUtil.copyProperties(kanjiaActivityGoodsDTO.getGoodsSku(), this, "id");
}
}
} }

View File

@ -3,8 +3,8 @@ package cn.lili.modules.promotion.entity.dos;
import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.lili.modules.promotion.entity.dto.BasePromotion; import cn.lili.modules.promotion.entity.dto.BasePromotions;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.vos.SeckillVO;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
@ -12,6 +12,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.springframework.beans.BeanUtils;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.Date; import java.util.Date;
@ -27,7 +28,7 @@ import java.util.Date;
@TableName("li_seckill") @TableName("li_seckill")
@ApiModel(value = "秒杀活动活动") @ApiModel(value = "秒杀活动活动")
@NoArgsConstructor @NoArgsConstructor
public class Seckill extends BasePromotion { public class Seckill extends BasePromotions {
private static final long serialVersionUID = -9116425737163730836L; private static final long serialVersionUID = -9116425737163730836L;
@ -52,21 +53,22 @@ public class Seckill extends BasePromotion {
@ApiModelProperty(value = "商品数量") @ApiModelProperty(value = "商品数量")
private Integer goodsNum; private Integer goodsNum;
public Seckill(int day,String hours,String seckillRule){ public Seckill(int day, String hours, String seckillRule) {
//默认创建*天后的秒杀活动 //默认创建*天后的秒杀活动
DateTime dateTime= DateUtil.beginOfDay(DateUtil.offset(new DateTime(), DateField.DAY_OF_YEAR, day)); DateTime dateTime = DateUtil.beginOfDay(DateUtil.offset(new DateTime(), DateField.DAY_OF_YEAR, day));
this.applyEndTime=dateTime; this.applyEndTime = dateTime;
this.hours=hours; this.hours = hours;
this.seckillRule=seckillRule; this.seckillRule = seckillRule;
this.goodsNum=0; this.goodsNum = 0;
//BasePromotion //BasePromotion
setStoreName("platform"); this.setStoreName("platform");
setStoreId("platform"); this.setStoreId("platform");
setPromotionName(DateUtil.formatDate(dateTime)+" 秒杀活动"); this.setPromotionName(DateUtil.formatDate(dateTime) + " 秒杀活动");
setStartTime(dateTime); this.setStartTime(dateTime);
setEndTime(DateUtil.endOfDay(dateTime)); this.setEndTime(DateUtil.endOfDay(dateTime));
setPromotionStatus(PromotionStatusEnum.NEW.name()); }
public Seckill(SeckillVO seckillVO) {
BeanUtils.copyProperties(seckillVO, this);
} }
} }

View File

@ -1,5 +1,6 @@
package cn.lili.modules.promotion.entity.dos; package cn.lili.modules.promotion.entity.dos;
import cn.lili.modules.promotion.entity.enums.PromotionsApplyStatusEnum;
import cn.lili.mybatis.BaseEntity; import cn.lili.mybatis.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
@ -58,7 +59,7 @@ public class SeckillApply extends BaseEntity {
private Integer quantity; private Integer quantity;
/** /**
* @see cn.lili.modules.promotion.entity.enums.PromotionApplyStatusEnum * @see PromotionsApplyStatusEnum
*/ */
@ApiModelProperty(value = "APPLY(\"申请\"), PASS(\"通过\"), REFUSE(\"拒绝\")") @ApiModelProperty(value = "APPLY(\"申请\"), PASS(\"通过\"), REFUSE(\"拒绝\")")
private String promotionApplyStatus; private String promotionApplyStatus;

View File

@ -1,6 +1,7 @@
package cn.lili.modules.promotion.entity.dto; package cn.lili.modules.promotion.entity.dto;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.mybatis.BaseEntity; import cn.lili.mybatis.BaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ -18,7 +19,7 @@ import java.util.Date;
*/ */
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
public class BasePromotion extends BaseEntity { public class BasePromotions extends BaseEntity {
private static final long serialVersionUID = 7814832369110695758L; private static final long serialVersionUID = 7814832369110695758L;
@ -41,8 +42,32 @@ public class BasePromotion extends BaseEntity {
private Date endTime; private Date endTime;
/** /**
* @see PromotionStatusEnum * @see PromotionsScopeTypeEnum
*/ */
@ApiModelProperty(value = "活动状态") @ApiModelProperty(value = "关联范围类型")
private String promotionStatus; private String scopeType = PromotionsScopeTypeEnum.PORTION_GOODS.name();
@ApiModelProperty(value = "范围关联的id")
private String scopeId;
/**
* @return 促销状态
* @see PromotionsStatusEnum
*/
public String getPromotionStatus() {
if (endTime == null) {
return startTime != null ? PromotionsStatusEnum.START.name() : PromotionsStatusEnum.CLOSE.name();
}
Date now = new Date();
if (now.before(startTime)) {
return PromotionsStatusEnum.NEW.name();
} else if (endTime.before(now)) {
return PromotionsStatusEnum.END.name();
} else if (now.before(endTime)) {
return PromotionsStatusEnum.START.name();
}
return PromotionsStatusEnum.CLOSE.name();
}
} }

View File

@ -4,6 +4,7 @@ import cn.lili.modules.promotion.entity.dos.CouponActivity;
import cn.lili.modules.promotion.entity.dos.CouponActivityItem; import cn.lili.modules.promotion.entity.dos.CouponActivityItem;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List; import java.util.List;
@ -13,6 +14,7 @@ import java.util.List;
* @author Bulbasaur * @author Bulbasaur
* @since 2021/5/21 7:16 下午 * @since 2021/5/21 7:16 下午
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
public class CouponActivityDTO extends CouponActivity { public class CouponActivityDTO extends CouponActivity {

View File

@ -5,6 +5,7 @@ import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods; import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable; import java.io.Serializable;
@ -12,8 +13,9 @@ import java.io.Serializable;
* 砍价活动商品DTO * 砍价活动商品DTO
* *
* @author qiuqiu * @author qiuqiu
* @date 2020/8/21 * @since 2020/8/21
**/ **/
@EqualsAndHashCode(callSuper = true)
@Data @Data
public class KanjiaActivityGoodsDTO extends KanjiaActivityGoods implements Serializable { public class KanjiaActivityGoodsDTO extends KanjiaActivityGoods implements Serializable {

View File

@ -4,6 +4,7 @@ import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -13,15 +14,13 @@ import lombok.NoArgsConstructor;
* @author paulG * @author paulG
* @since 2020/10/9 * @since 2020/10/9
**/ **/
@EqualsAndHashCode(callSuper = true)
@Data @Data
@NoArgsConstructor @NoArgsConstructor
public class PromotionGoodsDTO extends PromotionGoods { public class PromotionGoodsDTO extends PromotionGoods {
private static final long serialVersionUID = 9206970681612883421L; private static final long serialVersionUID = 9206970681612883421L;
@ApiModelProperty(value = "原价")
private Double originPrice;
@ApiModelProperty(value = "商品id") @ApiModelProperty(value = "商品id")
private String goodsId; private String goodsId;

View File

@ -6,7 +6,7 @@ package cn.lili.modules.promotion.entity.enums;
* @author Chopper * @author Chopper
* @since 2020-03-19 9:36 上午 * @since 2020-03-19 9:36 上午
*/ */
public enum PromotionApplyStatusEnum { public enum PromotionsApplyStatusEnum {
/** /**
* 枚举 * 枚举
@ -15,7 +15,7 @@ public enum PromotionApplyStatusEnum {
private final String description; private final String description;
PromotionApplyStatusEnum(String str) { PromotionsApplyStatusEnum(String str) {
this.description = str; this.description = str;
} }

View File

@ -1,12 +1,12 @@
package cn.lili.modules.promotion.entity.enums; package cn.lili.modules.promotion.entity.enums;
/** /**
* 优惠券适用范围类型枚举 * 促销适用范围类型枚举
* *
* @author Chopper * @author Chopper
* @since 2020-03-19 9:36 上午 * @since 2020-03-19 9:36 上午
*/ */
public enum CouponScopeTypeEnum { public enum PromotionsScopeTypeEnum {
/** /**
* 枚举 * 枚举
@ -18,7 +18,7 @@ public enum CouponScopeTypeEnum {
private final String description; private final String description;
CouponScopeTypeEnum(String str) { PromotionsScopeTypeEnum(String str) {
this.description = str; this.description = str;
} }

View File

@ -6,7 +6,7 @@ package cn.lili.modules.promotion.entity.enums;
* @author Chopper * @author Chopper
* @since 2020-03-19 3:53 下午 * @since 2020-03-19 3:53 下午
*/ */
public enum PromotionStatusEnum { public enum PromotionsStatusEnum {
/** /**
* 新建 * 新建
@ -27,7 +27,7 @@ public enum PromotionStatusEnum {
private final String description; private final String description;
PromotionStatusEnum(String str) { PromotionsStatusEnum(String str) {
this.description = str; this.description = str;
} }

View File

@ -0,0 +1,64 @@
package cn.lili.modules.promotion.entity.vos;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.tools.PromotionTools;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @author paulG
* @since 2021/11/18
**/
@Data
public class BasePromotionsSearchParams {
@ApiModelProperty(value = "活动id")
private String id;
@ApiModelProperty(value = "活动开始时间")
private Long startTime;
@ApiModelProperty(value = "活动结束时间")
private Long endTime;
/**
* @see PromotionsStatusEnum
*/
@ApiModelProperty(value = "活动状态")
private String promotionStatus;
/**
* @see PromotionsScopeTypeEnum
*/
@ApiModelProperty(value = "关联范围类型")
private String scopeType;
public <T> QueryWrapper<T> queryWrapper() {
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
if (CharSequenceUtil.isNotEmpty(id)) {
queryWrapper.eq("id", id);
}
if (startTime != null) {
queryWrapper.ge("start_time", new Date(startTime));
}
if (endTime != null) {
queryWrapper.le("end_time", new Date(endTime));
}
if (CharSequenceUtil.isNotEmpty(promotionStatus)) {
queryWrapper.and(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.valueOf(promotionStatus)));
}
if (CharSequenceUtil.isNotEmpty(scopeType)) {
queryWrapper.eq("scope_type", scopeType);
}
queryWrapper.eq("delete_flag", false);
return queryWrapper;
}
}

View File

@ -3,6 +3,7 @@ package cn.lili.modules.promotion.entity.vos;
import cn.lili.modules.promotion.entity.dos.CouponActivityItem; import cn.lili.modules.promotion.entity.dos.CouponActivityItem;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
/** /**
* 优惠券活动的优惠券VO * 优惠券活动的优惠券VO
@ -10,6 +11,7 @@ import lombok.Data;
* @author Bulbasaur * @author Bulbasaur
* @since 2021/6/18 11:00 上午 * @since 2021/6/18 11:00 上午
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
public class CouponActivityItemVO extends CouponActivityItem { public class CouponActivityItemVO extends CouponActivityItem {

View File

@ -4,6 +4,7 @@ import cn.lili.common.utils.BeanUtil;
import cn.lili.modules.promotion.entity.dos.CouponActivity; import cn.lili.modules.promotion.entity.dos.CouponActivity;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.util.List; import java.util.List;
@ -14,6 +15,7 @@ import java.util.List;
* @author Bulbasaur * @author Bulbasaur
* @since 2021/5/21 7:01 下午 * @since 2021/5/21 7:01 下午
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@NoArgsConstructor @NoArgsConstructor
public class CouponActivityVO extends CouponActivity { public class CouponActivityVO extends CouponActivity {

View File

@ -2,16 +2,15 @@ package cn.lili.modules.promotion.entity.vos;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.modules.promotion.entity.enums.*; import cn.lili.modules.promotion.entity.enums.*;
import cn.lili.modules.promotion.tools.PromotionTools;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import org.springframework.data.mongodb.core.query.Criteria; import lombok.EqualsAndHashCode;
import org.springframework.data.mongodb.core.query.Query;
import java.io.Serializable; import java.io.Serializable;
import java.util.Arrays; import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.regex.Pattern;
/** /**
* 优惠券查询通用类 * 优惠券查询通用类
@ -19,11 +18,14 @@ import java.util.regex.Pattern;
* @author paulG * @author paulG
* @since 2020/8/14 * @since 2020/8/14
**/ **/
@EqualsAndHashCode(callSuper = true)
@Data @Data
public class CouponSearchParams implements Serializable { public class CouponSearchParams extends BasePromotionsSearchParams implements Serializable {
private static final long serialVersionUID = 4566880169478260409L; private static final long serialVersionUID = 4566880169478260409L;
private static final String PRICE_COLUMN = "price"; private static final String PRICE_COLUMN = "price";
private static final String RANGE_DAY_TYPE_COLUMN = "range_day_type";
@ApiModelProperty(value = "店铺编号") @ApiModelProperty(value = "店铺编号")
private String storeId; private String storeId;
@ -41,7 +43,7 @@ public class CouponSearchParams implements Serializable {
@ApiModelProperty(value = "活动类型") @ApiModelProperty(value = "活动类型")
private String couponType; private String couponType;
/** /**
* @see cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum * @see PromotionsScopeTypeEnum
*/ */
@ApiModelProperty(value = "关联范围类型") @ApiModelProperty(value = "关联范围类型")
private String scopeType; private String scopeType;
@ -58,27 +60,17 @@ public class CouponSearchParams implements Serializable {
*/ */
@ApiModelProperty(value = "优惠券类型,分为免费领取和活动赠送") @ApiModelProperty(value = "优惠券类型,分为免费领取和活动赠送")
private String getType; private String getType;
@ApiModelProperty(value = "活动开始时间")
private Long startTime;
@ApiModelProperty(value = "活动结束时间")
private Long endTime;
/** /**
* @see MemberCouponStatusEnum * @see MemberCouponStatusEnum
*/ */
@ApiModelProperty(value = "会员优惠券状态") @ApiModelProperty(value = "会员优惠券状态")
private String memberCouponStatus; private String memberCouponStatus;
/**
* @see PromotionStatusEnum
*/
@ApiModelProperty(value = "活动状态")
private String promotionStatus;
public <T> QueryWrapper<T> wrapper() { @Override
public <T> QueryWrapper<T> queryWrapper() {
QueryWrapper<T> queryWrapper = new QueryWrapper<>(); QueryWrapper<T> queryWrapper = new QueryWrapper<>();
if (storeId != null) { if (storeId != null) {
queryWrapper.in("store_id", Arrays.asList(storeId)); queryWrapper.in("store_id", Collections.singletonList(storeId));
} }
if (CharSequenceUtil.isNotEmpty(couponName)) { if (CharSequenceUtil.isNotEmpty(couponName)) {
queryWrapper.like("coupon_name", couponName); queryWrapper.like("coupon_name", couponName);
@ -90,7 +82,7 @@ public class CouponSearchParams implements Serializable {
queryWrapper.eq("coupon_type", CouponTypeEnum.valueOf(couponType).name()); queryWrapper.eq("coupon_type", CouponTypeEnum.valueOf(couponType).name());
} }
if (CharSequenceUtil.isNotEmpty(scopeType)) { if (CharSequenceUtil.isNotEmpty(scopeType)) {
queryWrapper.eq("scope_type", CouponScopeTypeEnum.valueOf(scopeType).name()); queryWrapper.eq("scope_type", PromotionsScopeTypeEnum.valueOf(scopeType).name());
} }
if (CharSequenceUtil.isNotEmpty(scopeId)) { if (CharSequenceUtil.isNotEmpty(scopeId)) {
queryWrapper.eq("scope_id", scopeId); queryWrapper.eq("scope_id", scopeId);
@ -98,20 +90,38 @@ public class CouponSearchParams implements Serializable {
if (CharSequenceUtil.isNotEmpty(getType)) { if (CharSequenceUtil.isNotEmpty(getType)) {
queryWrapper.eq("get_type", CouponGetEnum.valueOf(getType).name()); queryWrapper.eq("get_type", CouponGetEnum.valueOf(getType).name());
} }
if (startTime != null) {
queryWrapper.ge("start_time", new Date(startTime));
}
if (endTime != null) {
queryWrapper.le("end_time", new Date(endTime));
}
if (CharSequenceUtil.isNotEmpty(memberCouponStatus)) { if (CharSequenceUtil.isNotEmpty(memberCouponStatus)) {
queryWrapper.eq("member_coupon_status", MemberCouponStatusEnum.valueOf(memberCouponStatus).name()); queryWrapper.eq("member_coupon_status", MemberCouponStatusEnum.valueOf(memberCouponStatus).name());
} }
if (CharSequenceUtil.isNotEmpty(promotionStatus)) { if (CharSequenceUtil.isNotEmpty(this.getPromotionStatus())) {
queryWrapper.eq("promotion_status", PromotionStatusEnum.valueOf(promotionStatus).name()); switch (PromotionsStatusEnum.valueOf(this.getPromotionStatus())) {
case NEW:
queryWrapper.nested(i -> i.gt(PromotionTools.START_TIME_COLUMN, new Date()).gt(PromotionTools.END_TIME_COLUMN, new Date()))
;
break;
case START:
queryWrapper.nested(i -> i.le(PromotionTools.START_TIME_COLUMN, new Date()).ge(PromotionTools.END_TIME_COLUMN, new Date()))
.or(i -> i.gt("effective_days", 0).eq(RANGE_DAY_TYPE_COLUMN, CouponRangeDayEnum.DYNAMICTIME.name()));
break;
case END:
queryWrapper.nested(i -> i.lt(PromotionTools.START_TIME_COLUMN, new Date()).lt(PromotionTools.END_TIME_COLUMN, new Date()));
break;
case CLOSE:
queryWrapper.nested(n -> n.nested(i -> i.isNull(PromotionTools.START_TIME_COLUMN).isNull(PromotionTools.END_TIME_COLUMN)
.eq(RANGE_DAY_TYPE_COLUMN, CouponRangeDayEnum.FIXEDTIME.name())).
or(i -> i.le("effective_days", 0).eq(RANGE_DAY_TYPE_COLUMN, CouponRangeDayEnum.DYNAMICTIME.name())));
break;
default:
}
}
if (this.getStartTime() != null) {
queryWrapper.ge("start_time", new Date(this.getEndTime()));
}
if (this.getEndTime() != null) {
queryWrapper.le("end_time", new Date(this.getEndTime()));
} }
this.betweenWrapper(queryWrapper);
queryWrapper.eq("delete_flag", false); queryWrapper.eq("delete_flag", false);
this.betweenWrapper(queryWrapper);
queryWrapper.orderByDesc("create_time"); queryWrapper.orderByDesc("create_time");
return queryWrapper; return queryWrapper;
} }
@ -143,72 +153,4 @@ public class CouponSearchParams implements Serializable {
} }
} }
public Query mongoQuery() {
Query query = new Query();
if (storeId != null) {
query.addCriteria(Criteria.where("storeId").in(Arrays.asList(storeId)));
}
if (CharSequenceUtil.isNotEmpty(couponName)) {
Pattern pattern = Pattern.compile("^.*" + couponName + ".*$", Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("couponName").regex(pattern));
}
if (memberId != null) {
query.addCriteria(Criteria.where("memberId").is(memberId));
}
if (CharSequenceUtil.isNotEmpty(couponType)) {
query.addCriteria(Criteria.where("couponType").is(CouponTypeEnum.valueOf(couponType).name()));
}
if (CharSequenceUtil.isNotEmpty(scopeType)) {
query.addCriteria(Criteria.where("scopeType").is(CouponScopeTypeEnum.valueOf(scopeType).name()));
}
if (CharSequenceUtil.isNotEmpty(scopeId)) {
query.addCriteria(Criteria.where("scopeId").is(scopeId));
}
if (CharSequenceUtil.isNotEmpty(getType)) {
query.addCriteria(Criteria.where("getType").is(CouponGetEnum.valueOf(getType).name()));
}
if (startTime != null) {
query.addCriteria(Criteria.where("startTime").gte(new Date(startTime)));
}
if (endTime != null) {
query.addCriteria(Criteria.where("endTime").lte(new Date(endTime)));
}
if (CharSequenceUtil.isNotEmpty(memberCouponStatus)) {
query.addCriteria(Criteria.where("memberCouponStatus").is(MemberCouponStatusEnum.valueOf(memberCouponStatus).name()));
}
if (CharSequenceUtil.isNotEmpty(promotionStatus)) {
query.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.valueOf(promotionStatus).name()));
}
query.addCriteria(Criteria.where("deleteFlag").is(false));
betweenQuery(query);
return query;
}
private void betweenQuery(Query query) {
if (CharSequenceUtil.isNotEmpty(price)) {
String[] s = price.split("_");
if (s.length > 1) {
query.addCriteria(Criteria.where(PRICE_COLUMN).gte(s[1]));
} else {
query.addCriteria(Criteria.where(PRICE_COLUMN).lte(s[0]));
}
}
if (CharSequenceUtil.isNotEmpty(publishNum)) {
String[] s = publishNum.split("_");
if (s.length > 1) {
query.addCriteria(Criteria.where("publishNum").gte(s[1]));
} else {
query.addCriteria(Criteria.where("publishNum").lte(s[0]));
}
}
if (CharSequenceUtil.isNotEmpty(receivedNum)) {
String[] s = receivedNum.split("_");
if (s.length > 1) {
query.addCriteria(Criteria.where("receivedNum").gte(s[1]));
} else {
query.addCriteria(Criteria.where("receivedNum").lte(s[0]));
}
}
}
} }

View File

@ -5,6 +5,10 @@ import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.beans.BeanUtils;
import java.util.List; import java.util.List;
@ -14,8 +18,11 @@ import java.util.List;
* @author Chopper * @author Chopper
* @since 2020/8/14 * @since 2020/8/14
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@ApiModel(value = "优惠券") @ApiModel(value = "优惠券")
@ToString(callSuper = true)
@NoArgsConstructor
public class CouponVO extends Coupon { public class CouponVO extends Coupon {
private static final long serialVersionUID = 8372420376262437018L; private static final long serialVersionUID = 8372420376262437018L;
@ -26,5 +33,10 @@ public class CouponVO extends Coupon {
@ApiModelProperty(value = "优惠券关联商品集合") @ApiModelProperty(value = "优惠券关联商品集合")
private List<PromotionGoods> promotionGoodsList; private List<PromotionGoods> promotionGoodsList;
public CouponVO(Coupon coupon) {
if (coupon == null) {
return;
}
BeanUtils.copyProperties(coupon, this);
}
} }

View File

@ -1,18 +1,13 @@
package cn.lili.modules.promotion.entity.vos; package cn.lili.modules.promotion.entity.vos;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import java.io.Serializable; import java.io.Serializable;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date;
import java.util.regex.Pattern;
/** /**
* 满优惠查询通用类 * 满优惠查询通用类
@ -20,8 +15,9 @@ import java.util.regex.Pattern;
* @author paulG * @author paulG
* @since 2020/8/21 * @since 2020/8/21
**/ **/
@EqualsAndHashCode(callSuper = true)
@Data @Data
public class FullDiscountSearchParams implements Serializable { public class FullDiscountSearchParams extends BasePromotionsSearchParams implements Serializable {
private static final long serialVersionUID = -4052716630253333681L; private static final long serialVersionUID = -4052716630253333681L;
@ -32,59 +28,28 @@ public class FullDiscountSearchParams implements Serializable {
@ApiModelProperty(value = "店铺编号 如有多个','分割") @ApiModelProperty(value = "店铺编号 如有多个','分割")
private String storeId; private String storeId;
@ApiModelProperty(value = "活动开始时间", required = true) @ApiModelProperty(value = "是否赠优惠券")
private Long startTime; private Boolean isCoupon;
@ApiModelProperty(value = "活动结束时间", required = true) @ApiModelProperty(value = "优惠券id")
private Long endTime; private String couponId;
/** @Override
* @see PromotionStatusEnum public <T> QueryWrapper<T> queryWrapper() {
*/ QueryWrapper<T> queryWrapper = super.queryWrapper();
@ApiModelProperty(value = "活动状态")
private String promotionStatus;
public <T> QueryWrapper<T> wrapper() {
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
if (CharSequenceUtil.isNotEmpty(promotionName)) { if (CharSequenceUtil.isNotEmpty(promotionName)) {
queryWrapper.like("title", promotionName); queryWrapper.like("title", promotionName);
} }
if (storeId != null) { if (storeId != null) {
queryWrapper.in("store_id", Arrays.asList(storeId.split(","))); queryWrapper.in("store_id", Arrays.asList(storeId.split(",")));
} }
if (startTime != null) { if (isCoupon != null) {
queryWrapper.ge("start_time", new Date(startTime)); queryWrapper.eq("is_coupon", isCoupon);
} }
if (endTime != null) { if (CharSequenceUtil.isNotEmpty(couponId)) {
queryWrapper.le("end_time", new Date(endTime)); queryWrapper.eq("coupon_id", couponId);
}
if (CharSequenceUtil.isNotEmpty(promotionStatus)) {
queryWrapper.eq("promotion_status", PromotionStatusEnum.valueOf(promotionStatus).name());
} }
return queryWrapper; return queryWrapper;
} }
public Query mongoQuery() {
Query query = new Query();
if (CharSequenceUtil.isNotEmpty(promotionName)) {
Pattern pattern = Pattern.compile("^.*" + promotionName + ".*$", Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("promotionName").regex(pattern));
}
if (storeId != null) {
query.addCriteria(Criteria.where("storeId").in(Arrays.asList(storeId.split(","))));
}
if (startTime != null) {
query.addCriteria(Criteria.where("startTime").gte(new Date(startTime)));
}
if (endTime != null) {
query.addCriteria(Criteria.where("endTime").lte(new Date(endTime)));
}
if (CharSequenceUtil.isNotEmpty(promotionStatus)) {
query.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.valueOf(promotionStatus).name()));
}
query.addCriteria(Criteria.where("deleteFlag").is(false));
return query;
}
} }

View File

@ -1,18 +1,12 @@
package cn.lili.modules.promotion.entity.vos; package cn.lili.modules.promotion.entity.vos;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.utils.StringUtils;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import org.springframework.data.mongodb.core.query.Criteria; import lombok.EqualsAndHashCode;
import org.springframework.data.mongodb.core.query.Query;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.regex.Pattern;
/** /**
* 拼团查询通用类 * 拼团查询通用类
@ -20,8 +14,9 @@ import java.util.regex.Pattern;
* @author paulG * @author paulG
* @since 2020/10/9 * @since 2020/10/9
**/ **/
@EqualsAndHashCode(callSuper = true)
@Data @Data
public class PintuanSearchParams { public class PintuanSearchParams extends BasePromotionsSearchParams {
@ApiModelProperty(value = "商家id") @ApiModelProperty(value = "商家id")
private String storeId; private String storeId;
@ -33,67 +28,20 @@ public class PintuanSearchParams {
@ApiModelProperty(value = "活动名称", required = true) @ApiModelProperty(value = "活动名称", required = true)
private String promotionName; private String promotionName;
/**
* @see PromotionStatusEnum
*/
@ApiModelProperty(value = "活动状态")
@NotNull(message = "活动状态不能为空")
private String promotionStatus;
@ApiModelProperty(value = "活动开始时间") @Override
private Long startTime; public <T> QueryWrapper<T> queryWrapper() {
QueryWrapper<T> queryWrapper = super.queryWrapper();
@ApiModelProperty(value = "活动结束时间")
private Long endTime;
public <T> QueryWrapper<T> wrapper() {
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
if (CharSequenceUtil.isNotEmpty(promotionName)) { if (CharSequenceUtil.isNotEmpty(promotionName)) {
queryWrapper.like("promotion_name", promotionName); queryWrapper.like("promotion_name", promotionName);
} }
if (!StringUtils.isEmpty(storeName)) { if (CharSequenceUtil.isNotEmpty(storeName)) {
queryWrapper.like("store_name", storeName); queryWrapper.like("store_name", storeName);
} }
if (!StringUtils.isEmpty(storeId)) { if (CharSequenceUtil.isNotEmpty(storeId)) {
queryWrapper.eq("store_id", storeName); queryWrapper.eq("store_id", storeId);
} }
if (startTime != null) {
queryWrapper.ge("start_time", new Date(startTime));
}
if (endTime != null) {
queryWrapper.le("end_time", new Date(endTime));
}
if (CharSequenceUtil.isNotEmpty(promotionStatus)) {
queryWrapper.eq("promotion_status", PromotionStatusEnum.valueOf(promotionStatus).name());
}
queryWrapper.eq("delete_flag", false);
return queryWrapper; return queryWrapper;
} }
public Query mongoQuery() {
Query query = new Query();
if (CharSequenceUtil.isNotEmpty(promotionName)) {
Pattern pattern = Pattern.compile("^.*" + promotionName + ".*$", Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("promotionName").regex(pattern));
}
if (!StringUtils.isEmpty(storeName)) {
Pattern pattern = Pattern.compile("^.*" + storeName + ".*$", Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("storeName").regex(pattern));
}
if (!StringUtils.isEmpty(storeId)) {
query.addCriteria(Criteria.where("storeId").is(storeId));
}
if (startTime != null) {
query.addCriteria(Criteria.where("startTime").gte(new Date(startTime)));
}
if (endTime != null) {
query.addCriteria(Criteria.where("endTime").lte(new Date(endTime)));
}
if (CharSequenceUtil.isNotEmpty(promotionStatus)) {
query.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.valueOf(promotionStatus).name()));
}
query.addCriteria(Criteria.where("deleteFlag").is(false));
return query;
}
} }

View File

@ -4,6 +4,8 @@ import cn.lili.modules.promotion.entity.dos.Pintuan;
import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.springframework.beans.BeanUtils;
import java.util.List; import java.util.List;
@ -13,11 +15,16 @@ import java.util.List;
* @author paulG * @author paulG
* @since 2020/10/28 * @since 2020/10/28
**/ **/
@EqualsAndHashCode(callSuper = true)
@Data @Data
@NoArgsConstructor
public class PintuanVO extends Pintuan { public class PintuanVO extends Pintuan {
private static final long serialVersionUID = 218582640653676201L; private static final long serialVersionUID = 218582640653676201L;
private List<PromotionGoods> promotionGoodsList; private List<PromotionGoods> promotionGoodsList;
public PintuanVO(Pintuan pintuan) {
BeanUtils.copyProperties(pintuan, this);
}
} }

View File

@ -1,15 +1,10 @@
package cn.lili.modules.promotion.entity.vos; package cn.lili.modules.promotion.entity.vos;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import org.springframework.data.mongodb.core.query.Criteria; import lombok.EqualsAndHashCode;
import org.springframework.data.mongodb.core.query.Query;
import java.util.regex.Pattern;
/** /**
* 积分商品查询通用类 * 积分商品查询通用类
@ -17,8 +12,9 @@ import java.util.regex.Pattern;
* @author paulG * @author paulG
* @since 2021/1/13 * @since 2021/1/13
**/ **/
@EqualsAndHashCode(callSuper = true)
@Data @Data
public class PointsGoodsSearchParams { public class PointsGoodsSearchParams extends BasePromotionsSearchParams {
@ApiModelProperty(value = "商品名称") @ApiModelProperty(value = "商品名称")
private String goodsName; private String goodsName;
@ -35,15 +31,10 @@ public class PointsGoodsSearchParams {
@ApiModelProperty(value = "积分,可以为范围如10_1000") @ApiModelProperty(value = "积分,可以为范围如10_1000")
private String points; private String points;
/**
* @see PromotionStatusEnum
*/
@ApiModelProperty(value = "活动状态")
private String promotionStatus;
@Override
public <T> QueryWrapper<T> queryWrapper() { public <T> QueryWrapper<T> queryWrapper() {
QueryWrapper<T> queryWrapper = new QueryWrapper<>(); QueryWrapper<T> queryWrapper = super.queryWrapper();
if (CharSequenceUtil.isNotEmpty(goodsName)) { if (CharSequenceUtil.isNotEmpty(goodsName)) {
queryWrapper.eq("gs.goods_name", goodsName); queryWrapper.eq("gs.goods_name", goodsName);
} }
@ -64,41 +55,7 @@ public class PointsGoodsSearchParams {
if (recommend != null) { if (recommend != null) {
queryWrapper.eq("gs.recommend", recommend); queryWrapper.eq("gs.recommend", recommend);
} }
if (CharSequenceUtil.isNotEmpty(promotionStatus)) {
queryWrapper.eq("pg.promotion_status", promotionStatus);
}
return queryWrapper; return queryWrapper;
} }
public Query mongoQuery() {
Query query = new Query();
if (CharSequenceUtil.isNotEmpty(goodsName)) {
Pattern pattern = Pattern.compile("^.*" + goodsName + ".*$", Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("goodsSku.goodsName").regex(pattern));
}
if (CharSequenceUtil.isNotEmpty(skuId)) {
query.addCriteria(Criteria.where("skuId").is(skuId));
}
if (CharSequenceUtil.isNotEmpty(pointsGoodsCategoryId)) {
query.addCriteria(Criteria.where("pointsGoodsCategoryId").is(pointsGoodsCategoryId));
}
if (CharSequenceUtil.isNotEmpty(points)) {
String[] s = points.split("_");
if (s.length > 1) {
query.addCriteria(Criteria.where("points").gte(Convert.toInt(s[0])).lte(Convert.toInt(s[1])));
} else {
query.addCriteria(Criteria.where("points").gte(Convert.toInt(s[0])));
}
}
if (recommend != null) {
query.addCriteria(Criteria.where("goodsSku.recommend").is(recommend));
}
if (CharSequenceUtil.isNotEmpty(promotionStatus)) {
query.addCriteria(Criteria.where("promotionStatus").is(promotionStatus));
}
query.addCriteria(Criteria.where("deleteFlag").is(false));
return query;
}
} }

View File

@ -1,12 +1,14 @@
package cn.lili.modules.promotion.entity.vos; package cn.lili.modules.promotion.entity.vos;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date; import java.util.Arrays;
import java.util.List;
/** /**
* 促销商品查询通用类 * 促销商品查询通用类
@ -14,8 +16,9 @@ import java.util.Date;
* @author paulG * @author paulG
* @since 2021/2/21 * @since 2021/2/21
**/ **/
@EqualsAndHashCode(callSuper = true)
@Data @Data
public class PromotionGoodsSearchParams { public class PromotionGoodsSearchParams extends BasePromotionsSearchParams {
@ApiModelProperty(value = "促销活动id") @ApiModelProperty(value = "促销活动id")
private String promotionId; private String promotionId;
@ -23,10 +26,7 @@ public class PromotionGoodsSearchParams {
@ApiModelProperty(value = "促销类型") @ApiModelProperty(value = "促销类型")
private String promotionType; private String promotionType;
@ApiModelProperty(value = "促销状态") @ApiModelProperty(value = "商品活动id")
private String promotionStatus;
@ApiModelProperty(value = "促销活动id")
private String storeId; private String storeId;
@ApiModelProperty(value = "商品名称") @ApiModelProperty(value = "商品名称")
@ -35,40 +35,46 @@ public class PromotionGoodsSearchParams {
@ApiModelProperty(value = "商品分类路径") @ApiModelProperty(value = "商品分类路径")
private String categoryPath; private String categoryPath;
@ApiModelProperty(value = "开始时间") @ApiModelProperty(value = "商品SkuId")
private Long startTime; private String skuId;
@ApiModelProperty(value = "结束时间") @ApiModelProperty(value = "商品SkuIds")
private Long endTime; private List<String> skuIds;
@ApiModelProperty(value = "促销活动id")
private List<String> promotionIds;
public LambdaQueryWrapper<PromotionGoods> queryWrapper() { @Override
LambdaQueryWrapper<PromotionGoods> queryWrapper = new LambdaQueryWrapper<>(); public <T> QueryWrapper<T> queryWrapper() {
if (CharSequenceUtil.isEmpty(this.getScopeType())){
this.setScopeType(PromotionsScopeTypeEnum.PORTION_GOODS.name());
}
QueryWrapper<T> queryWrapper = super.queryWrapper();
if (CharSequenceUtil.isNotEmpty(promotionId)) { if (CharSequenceUtil.isNotEmpty(promotionId)) {
queryWrapper.eq(PromotionGoods::getPromotionId, promotionId); queryWrapper.eq("promotion_id", promotionId);
} }
if (CharSequenceUtil.isNotEmpty(goodsName)) { if (CharSequenceUtil.isNotEmpty(goodsName)) {
queryWrapper.like(PromotionGoods::getGoodsName, goodsName); queryWrapper.like("goods_name", goodsName);
} }
if (CharSequenceUtil.isNotEmpty(promotionType)) { if (CharSequenceUtil.isNotEmpty(promotionType)) {
queryWrapper.eq(PromotionGoods::getPromotionType, promotionType); queryWrapper.eq("promotion_type", promotionType);
}
if (CharSequenceUtil.isNotEmpty(promotionStatus)) {
queryWrapper.eq(PromotionGoods::getPromotionStatus, promotionStatus);
} }
if (CharSequenceUtil.isNotEmpty(categoryPath)) { if (CharSequenceUtil.isNotEmpty(categoryPath)) {
queryWrapper.like(PromotionGoods::getCategoryPath, categoryPath); queryWrapper.like("category_path", categoryPath);
}
if (startTime != null) {
queryWrapper.ge(PromotionGoods::getStartTime, new Date(startTime));
}
if (endTime != null) {
queryWrapper.ge(PromotionGoods::getEndTime, new Date(endTime));
} }
if (CharSequenceUtil.isNotEmpty(storeId)) { if (CharSequenceUtil.isNotEmpty(storeId)) {
queryWrapper.eq(PromotionGoods::getStoreId, storeId); queryWrapper.in("store_id", Arrays.asList(storeId.split(",")));
}
if (CharSequenceUtil.isNotEmpty(skuId)) {
queryWrapper.in("sku_id", Arrays.asList(skuId.split(",")));
}
if (skuIds != null && !skuIds.isEmpty()) {
queryWrapper.in("sku_id", skuIds);
}
if (promotionIds != null && promotionIds.isEmpty()) {
queryWrapper.in("promotion_id", promotionIds);
} }
queryWrapper.eq(PromotionGoods::getDeleteFlag, false);
return queryWrapper; return queryWrapper;
} }

View File

@ -1,19 +1,14 @@
package cn.lili.modules.promotion.entity.vos; package cn.lili.modules.promotion.entity.vos;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ArrayUtil; import cn.lili.modules.promotion.entity.enums.PromotionsApplyStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionApplyStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import org.springframework.data.mongodb.core.query.Criteria; import lombok.EqualsAndHashCode;
import org.springframework.data.mongodb.core.query.Query;
import java.io.Serializable; import java.io.Serializable;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date;
import java.util.regex.Pattern;
/** /**
* 秒杀活动查询通用类 * 秒杀活动查询通用类
@ -21,8 +16,9 @@ import java.util.regex.Pattern;
* @author paulG * @author paulG
* @since 2020/8/21 * @since 2020/8/21
**/ **/
@EqualsAndHashCode(callSuper = true)
@Data @Data
public class SeckillSearchParams implements Serializable { public class SeckillSearchParams extends BasePromotionsSearchParams implements Serializable {
private static final long serialVersionUID = -4052716630253333681L; private static final long serialVersionUID = -4052716630253333681L;
@ -44,26 +40,18 @@ public class SeckillSearchParams implements Serializable {
@ApiModelProperty(value = "商品名称") @ApiModelProperty(value = "商品名称")
private String goodsName; private String goodsName;
@ApiModelProperty(value = "活动开始时间", required = true) @ApiModelProperty(value = "商家编号")
private Long startTime; private String skuId;
@ApiModelProperty(value = "活动结束时间", required = true)
private Long endTime;
/** /**
* @see PromotionStatusEnum * @see PromotionsApplyStatusEnum
*/
@ApiModelProperty(value = "活动状态")
private String promotionStatus;
/**
* @see cn.lili.modules.promotion.entity.enums.PromotionApplyStatusEnum
*/ */
@ApiModelProperty(value = "APPLY(\"申请\"), PASS(\"通过\"), REFUSE(\"拒绝\")") @ApiModelProperty(value = "APPLY(\"申请\"), PASS(\"通过\"), REFUSE(\"拒绝\")")
private String promotionApplyStatus; private String promotionApplyStatus;
public <T> QueryWrapper<T> wrapper() { @Override
QueryWrapper<T> queryWrapper = new QueryWrapper<>(); public <T> QueryWrapper<T> queryWrapper() {
QueryWrapper<T> queryWrapper = super.queryWrapper();
if (CharSequenceUtil.isNotEmpty(goodsName)) { if (CharSequenceUtil.isNotEmpty(goodsName)) {
queryWrapper.like("goods_name", goodsName); queryWrapper.like("goods_name", goodsName);
} }
@ -79,56 +67,13 @@ public class SeckillSearchParams implements Serializable {
if (timeLine != null) { if (timeLine != null) {
queryWrapper.eq("time_line", timeLine); queryWrapper.eq("time_line", timeLine);
} }
if (startTime != null) {
queryWrapper.ge("start_time", new Date(startTime));
}
if (endTime != null) {
queryWrapper.le("end_time", new Date(endTime));
}
if (CharSequenceUtil.isNotEmpty(promotionApplyStatus)) { if (CharSequenceUtil.isNotEmpty(promotionApplyStatus)) {
queryWrapper.eq("promotion_apply_status", PromotionApplyStatusEnum.valueOf(promotionApplyStatus).name()); queryWrapper.eq("promotion_apply_status", PromotionsApplyStatusEnum.valueOf(promotionApplyStatus).name());
} }
if (CharSequenceUtil.isNotEmpty(promotionStatus)) { if (CharSequenceUtil.isNotEmpty(skuId)) {
queryWrapper.eq("promotion_status", PromotionStatusEnum.valueOf(promotionStatus).name()); queryWrapper.eq("sku_id", skuId);
} }
queryWrapper.eq("delete_flag", false);
return queryWrapper; return queryWrapper;
} }
public Query mongoQuery() {
Query query = new Query();
if (CharSequenceUtil.isNotEmpty(goodsName)) {
Pattern pattern = Pattern.compile("^.*" + goodsName + ".*$", Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("goodsName").regex(pattern));
}
if (CharSequenceUtil.isNotEmpty(promotionName)) {
Pattern pattern = Pattern.compile("^.*" + promotionName + ".*$", Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("promotionName").regex(pattern));
}
if (CharSequenceUtil.isNotEmpty(seckillId)) {
query.addCriteria(Criteria.where("_id").is(seckillId));
}
if (storeIds != null) {
Pattern pattern = Pattern.compile("^.*" + ArrayUtil.join(storeIds, ",") + ".*$", Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("storeIds").regex(pattern));
}
if (timeLine != null) {
query.addCriteria(Criteria.where("timeLine").is(timeLine));
}
if (startTime != null) {
query.addCriteria(Criteria.where("startTime").gte(new Date(startTime)));
}
if (endTime != null) {
query.addCriteria(Criteria.where("endTime").lte(new Date(endTime)));
}
if (CharSequenceUtil.isNotEmpty(promotionApplyStatus)) {
query.addCriteria(Criteria.where("promotionApplyStatus").is(PromotionApplyStatusEnum.valueOf(promotionApplyStatus).name()));
}
if (CharSequenceUtil.isNotEmpty(promotionStatus)) {
query.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.valueOf(promotionStatus).name()));
}
query.addCriteria(Criteria.where("deleteFlag").is(false));
return query;
}
} }

View File

@ -4,17 +4,13 @@ package cn.lili.modules.promotion.entity.vos.kanjia;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.security.context.UserContext; import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums; import cn.lili.common.security.enums.UserEnums;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
import java.util.regex.Pattern;
/** /**
* 砍价活动商品查询通用类 * 砍价活动商品查询通用类
@ -40,7 +36,7 @@ public class KanjiaActivityGoodsParams implements Serializable {
private String skuId; private String skuId;
/** /**
* @see PromotionStatusEnum * @see PromotionsStatusEnum
*/ */
@ApiModelProperty(value = "活动状态") @ApiModelProperty(value = "活动状态")
private String promotionStatus; private String promotionStatus;
@ -68,32 +64,4 @@ public class KanjiaActivityGoodsParams implements Serializable {
return queryWrapper; return queryWrapper;
} }
public Query mongoQuery() {
Query query = new Query();
if (CharSequenceUtil.isNotEmpty(goodsName)) {
Pattern pattern = Pattern.compile("^.*" + goodsName + ".*$", Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("goodsSku.goodsName").regex(pattern));
}
if (CharSequenceUtil.isNotEmpty(promotionStatus)) {
query.addCriteria(Criteria.where("promotionStatus").is(promotionStatus));
}
if (CharSequenceUtil.isNotEmpty(skuId)) {
query.addCriteria(Criteria.where("skuId").is(skuId));
}
if (startTime != null && endTime != null) {
Criteria fromTime = Criteria.where("startTime").gte(new Date(startTime));
Criteria toTime = Criteria.where("endTime").lte(new Date(endTime));
query.addCriteria(fromTime);
query.addCriteria(toTime);
}
query.addCriteria(Criteria.where("deleteFlag").is(false));
Sort.Order order = new Sort.Order(Sort.Direction.DESC, "createTime");
query.with(Sort.by(order));
return query;
}
} }

View File

@ -1,9 +1,11 @@
package cn.lili.modules.promotion.entity.vos.kanjia; package cn.lili.modules.promotion.entity.vos.kanjia;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.lili.modules.promotion.entity.vos.BasePromotionsSearchParams;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
/** /**
* 砍价活动搜索参数 * 砍价活动搜索参数
@ -11,8 +13,9 @@ import lombok.Data;
* @author Bulbasaur * @author Bulbasaur
* @date: 2021/7/13 2:41 下午 * @date: 2021/7/13 2:41 下午
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
public class KanjiaActivitySearchParams { public class KanjiaActivitySearchParams extends BasePromotionsSearchParams {
@ApiModelProperty(value = "砍价活动ID") @ApiModelProperty(value = "砍价活动ID")
private String id; private String id;

View File

@ -1,7 +1,9 @@
package cn.lili.modules.promotion.mapper; package cn.lili.modules.promotion.mapper;
import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Select;
@ -28,7 +30,7 @@ public interface PromotionGoodsMapper extends BaseMapper<PromotionGoods> {
@Select("select count(0) from li_promotion_goods where promotion_type = #{promotionType} and sku_id = #{skuId} and (" + @Select("select count(0) from li_promotion_goods where promotion_type = #{promotionType} and sku_id = #{skuId} and (" +
"( start_time < #{startTime} && end_time > #{startTime} ) || ( start_time < #{endTime} && end_time > #{endTime} ) || " + "( start_time < #{startTime} && end_time > #{startTime} ) || ( start_time < #{endTime} && end_time > #{endTime} ) || " +
"( start_time < #{startTime} && end_time > #{endTime} ) || ( start_time > #{startTime} && end_time < #{endTime} )" + "( start_time < #{startTime} && end_time > #{endTime} ) || ( start_time > #{startTime} && end_time < #{endTime} )" +
" || promotion_status = 'START' )") ")")
Integer selectInnerOverlapPromotionGoods(@Param("promotionType") String promotionType, Integer selectInnerOverlapPromotionGoods(@Param("promotionType") String promotionType,
@Param("skuId") String skuId, @Param("skuId") String skuId,
@Param("startTime") Date startTime, @Param("startTime") Date startTime,
@ -47,10 +49,19 @@ public interface PromotionGoodsMapper extends BaseMapper<PromotionGoods> {
@Select("select count(0) from li_promotion_goods where promotion_type = #{promotionType} and sku_id = #{skuId} and (" + @Select("select count(0) from li_promotion_goods where promotion_type = #{promotionType} and sku_id = #{skuId} and (" +
"( start_time < #{startTime} && end_time > #{startTime} ) || ( start_time < #{endTime} && end_time > #{endTime} ) || " + "( start_time < #{startTime} && end_time > #{startTime} ) || ( start_time < #{endTime} && end_time > #{endTime} ) || " +
"( start_time < #{startTime} && end_time > #{endTime} ) || ( start_time > #{startTime} && end_time < #{endTime} )" + "( start_time < #{startTime} && end_time > #{endTime} ) || ( start_time > #{startTime} && end_time < #{endTime} )" +
" || promotion_status = 'START' ) and promotion_id != #{promotionId}") ") and promotion_id != #{promotionId}")
Integer selectInnerOverlapPromotionGoodsWithout(@Param("promotionType") String promotionType, Integer selectInnerOverlapPromotionGoodsWithout(@Param("promotionType") String promotionType,
@Param("skuId") String skuId, @Param("skuId") String skuId,
@Param("startTime") Date startTime, @Param("startTime") Date startTime,
@Param("endTime") Date endTime, @Param("endTime") Date endTime,
@Param("promotionId") String promotionId); @Param("promotionId") String promotionId);
/**
* 查询参加活动促销商品价格
*
* @param queryWrapper 查询条件
* @return 共参加了几种活动
*/
@Select("select price from li_promotion_goods ${ew.customSqlSegment} ")
Double selectPromotionsGoodsPrice(@Param(Constants.WRAPPER) Wrapper<PromotionGoods> queryWrapper);
} }

View File

@ -0,0 +1,130 @@
package cn.lili.modules.promotion.service;
import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.promotion.entity.dto.BasePromotions;
import cn.lili.modules.promotion.entity.vos.BasePromotionsSearchParams;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* 抽象通用促销服务
* 如需拓展原促销实体字段新拓展类继承自促销实体即可
*
* @param <T> 促销类型继承自促销基础类
* @author paulG
* @since 2021/11/18
**/
public interface AbstractPromotionsService<T extends BasePromotions> extends IService<T> {
/**
* 通用促销保存
* 调用顺序:
* 1. initPromotion 初始化促销信息
* 2. checkPromotions 检查促销参数
* 3. save 保存促销信息
* 4. updatePromotionGoods 更新促销商品信息
* 5 updateEsGoodsIndex 更新商品索引促销信息
*
* @param promotions 促销信息
* @return 是否保存成功
*/
boolean savePromotions(T promotions);
/**
* 通用促销更新
* 调用顺序:
* 1. checkStatus 检查促销状态
* 2. checkPromotions 检查促销参数
* 3. saveOrUpdate 保存促销信息
* 4. updatePromotionGoods 更新促销商品信息
* 5. updateEsGoodsIndex 更新商品索引促销信息
*
* @param promotions 促销信息
* @return 是否更新成功
*/
boolean updatePromotions(T promotions);
/**
* 更新促销状态
* 如果要更新促销状态为关闭startTime和endTime置为空即可
*
* @param ids 促销id集合
* @param startTime 开始时间
* @param endTime 结束时间
* @return 是否更新成功
*/
boolean updateStatus(List<String> ids, Long startTime, Long endTime);
/**
* 移除促销活动
*
* @param ids 促销活动id集合
* @return 是否移除成功
*/
boolean removePromotions(List<String> ids);
/**
* 分页查询促销信息
*
* @param searchParams 查询参数继承自继承促销查询参数
* @param page 分页参数
* @param <S> 继承自基础促销查询参数的促销查询参数
* @return 分页促销信息
*/
<S extends BasePromotionsSearchParams> IPage<T> pageFindAll(S searchParams, PageVO page);
/**
* 列表查询促销信息
*
* @param searchParams 查询参数继承自继承促销查询参数
* @param <S> 继承自基础促销查询参数的促销查询参数
* @return 列表促销信息
*/
<S extends BasePromotionsSearchParams> List<T> listFindAll(S searchParams);
/**
* 初始化促销字段
*
* @param promotions 促销实体
*/
void initPromotion(T promotions);
/**
* 检查促销参数
*
* @param promotions 促销实体
*/
void checkPromotions(T promotions);
/**
* 检查促销状态
*
* @param promotions 促销实体
*/
void checkStatus(T promotions);
/**
* 更新促销商品信息
*
* @param promotions 促销实体
*/
void updatePromotionsGoods(T promotions);
/**
* 更新促销信息到商品索引
*
* @param promotions 促销实体
*/
void updateEsGoodsIndex(T promotions);
/**
* 当前促销类型
*
* @return 当前促销类型
*/
PromotionTypeEnum getPromotionType();
}

View File

@ -28,4 +28,11 @@ public interface CouponActivityItemService extends IService<CouponActivityItem>
* @return 优惠券关联优惠券列表 * @return 优惠券关联优惠券列表
*/ */
List<CouponActivityItemVO> getCouponActivityItemListVO(String activityId); List<CouponActivityItemVO> getCouponActivityItemListVO(String activityId);
/**
* 根据优惠券id删除优惠活动关联信息项
*
* @param couponIds 优惠券id集合
*/
void removeByCouponId(List<String> couponIds);
} }

View File

@ -2,10 +2,7 @@ package cn.lili.modules.promotion.service;
import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.promotion.entity.dos.CouponActivity; import cn.lili.modules.promotion.entity.dos.CouponActivity;
import cn.lili.modules.promotion.entity.dto.CouponActivityDTO;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import cn.lili.modules.promotion.entity.vos.CouponActivityVO; import cn.lili.modules.promotion.entity.vos.CouponActivityVO;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List; import java.util.List;
@ -15,23 +12,8 @@ import java.util.List;
* @author Bulbasaur * @author Bulbasaur
* @since 2021/5/20 6:10 下午 * @since 2021/5/20 6:10 下午
*/ */
public interface CouponActivityService extends IService<CouponActivity> { public interface CouponActivityService extends AbstractPromotionsService<CouponActivity> {
/**
* 创建优惠券活动--精准发券新人赠券
*
* @param couponActivityDTO 优惠券活动DTO
* @return 优惠券活动DTO
*/
CouponActivityDTO addCouponActivity(CouponActivityDTO couponActivityDTO);
/**
* 修改优惠券活动--精准发券新人赠券
*
* @param couponActivityDTO 优惠券活动DTO
* @return 优惠券活动DTO
*/
CouponActivityDTO updateCouponActivity(CouponActivityDTO couponActivityDTO);
/** /**
* 获取优惠券活动VO * 获取优惠券活动VO
@ -57,13 +39,4 @@ public interface CouponActivityService extends IService<CouponActivity> {
*/ */
void registered(List<CouponActivity> couponActivityList, Member member); void registered(List<CouponActivity> couponActivityList, Member member);
/**
* 修改优惠券活动状态
*
* @param id 活动ID
* @param promotionStatus 活动状态
* @return 操作状态
*/
boolean updateCouponActivityStatus(String id, PromotionStatusEnum promotionStatus);
} }

View File

@ -2,13 +2,9 @@ package cn.lili.modules.promotion.service;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.modules.promotion.entity.dos.Coupon; import cn.lili.modules.promotion.entity.dos.Coupon;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import cn.lili.modules.promotion.entity.vos.CouponSearchParams; import cn.lili.modules.promotion.entity.vos.CouponSearchParams;
import cn.lili.modules.promotion.entity.vos.CouponVO; import cn.lili.modules.promotion.entity.vos.CouponVO;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/** /**
* 优惠券业务层 * 优惠券业务层
@ -16,76 +12,7 @@ import java.util.List;
* @author Chopper * @author Chopper
* @since 2020/8/21 * @since 2020/8/21
*/ */
public interface CouponService extends IService<Coupon> { public interface CouponService extends AbstractPromotionsService<Coupon> {
/**
* 添加优惠券
*
* @param coupon 优惠券
* @return 是否添加成功
*/
CouponVO add(CouponVO coupon);
/**
* 更新优惠卷
*
* @param coupon 优惠卷信息
* @return 是否更新成功
*/
CouponVO updateCoupon(CouponVO coupon);
/**
* 更新优惠卷状态
*
* @param couponId 优惠券编号
* @param promotionStatus 促销状态
* @return 更新结果
*/
boolean updateCouponStatus(List<String> couponId, PromotionStatusEnum promotionStatus);
/**
* 删除优惠券
*
* @param id 优惠券id
* @return 是否删除成功
*/
boolean deleteCoupon(String id);
/**
* 根据查询条件从mongo中获取优惠券信息列表
*
* @param param 查询参数
* @param page 分页参数
* @return 优惠券信息列表
*/
IPage<CouponVO> getCouponsByPageFromMongo(CouponSearchParams param, PageVO page);
/**
* 根据查询条件从mongo中获取优惠券信息列表
*
* @param param 查询参数
* @param page 分页参数
* @return 优惠券信息列表
*/
IPage<CouponVO> getCanReceiveCoupons(CouponSearchParams param, PageVO page);
/**
* 获取优惠券详情
*
* @param id 优惠券id
* @return 优惠券详情
*/
CouponVO getCouponDetailFromMongo(String id);
/**
* 根据条件获取优惠券列表
*
* @param param 条件参数
* @param page 分页条件
* @return 可领取优惠券集合
*/
IPage<Coupon> getCouponsByPage(CouponSearchParams param, PageVO page);
/** /**
* 领取优惠券 * 领取优惠券
@ -103,7 +30,21 @@ public interface CouponService extends IService<Coupon> {
*/ */
void usedCoupon(String couponId, Integer usedNum); void usedCoupon(String couponId, Integer usedNum);
/**
* 获取优惠券展示实体
*
* @param searchParams 查询参数
* @param page 分页参数
* @return 优惠券展示实体列表
*/
IPage<CouponVO> pageVOFindAll(CouponSearchParams searchParams, PageVO page);
/**
* 获取优惠券展示详情
*
* @param couponId 优惠券id
* @return 返回优惠券展示详情
*/
CouponVO getDetail(String couponId);
} }

View File

@ -1,12 +1,7 @@
package cn.lili.modules.promotion.service; package cn.lili.modules.promotion.service;
import cn.lili.common.vo.PageVO;
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.FullDiscount; import cn.lili.modules.promotion.entity.dos.FullDiscount;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import cn.lili.modules.promotion.entity.vos.FullDiscountSearchParams;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List; import java.util.List;
@ -16,7 +11,7 @@ import java.util.List;
* @author Chopper * @author Chopper
* @since 2020/8/21 * @since 2020/8/21
*/ */
public interface FullDiscountService extends IService<FullDiscount> { public interface FullDiscountService extends AbstractPromotionsService<FullDiscount> {
/** /**
* 当前满优惠活动 * 当前满优惠活动
@ -26,41 +21,6 @@ public interface FullDiscountService extends IService<FullDiscount> {
*/ */
List<FullDiscountVO> currentPromotion(List<String> storeId); List<FullDiscountVO> currentPromotion(List<String> storeId);
/**
* 添加满优惠活动
*
* @param fullDiscountVO 满优惠活动信息
* @return 满优惠活动
*/
FullDiscount addFullDiscount(FullDiscountVO fullDiscountVO);
/**
* 从mysql中分页获取满优惠列表
*
* @param searchParams 参数
* @param page 分页参数
* @return 满优惠列表
*/
IPage<FullDiscount> getFullDiscountByPageFromMysql(FullDiscountSearchParams searchParams, PageVO page);
/**
* 从mongo中分页获取满优惠列表
*
* @param searchParams 搜索参数
* @param page 分页参数
* @return 满优惠列表
*/
IPage<FullDiscountVO> getFullDiscountByPageFromMongo(FullDiscountSearchParams searchParams, PageVO page);
/**
* 修改满优惠活动
*
* @param fullDiscountVO 满优惠活动信息
* @return 满优惠活动
*/
FullDiscountVO modifyFullDiscount(FullDiscountVO fullDiscountVO);
/** /**
* 获取满优惠活动详情 * 获取满优惠活动详情
* *
@ -69,21 +29,6 @@ public interface FullDiscountService extends IService<FullDiscount> {
*/ */
FullDiscountVO getFullDiscount(String id); FullDiscountVO getFullDiscount(String id);
/**
* 删除满优惠获取
*
* @param id 满优惠活动编号
* @return 删除结果
*/
boolean deleteFullDiscount(String id);
/**
* 更新满额活动状态
*
* @param id 优惠券编号
* @param promotionStatus 促销状态
* @return 更新结果
*/
boolean updateFullDiscountStatus(String id, PromotionStatusEnum promotionStatus);
} }

View File

@ -38,7 +38,7 @@ public interface KanjiaActivityGoodsService extends IService<KanjiaActivityGoods
* @param pageVO 分页信息 * @param pageVO 分页信息
* @return 砍价商品 * @return 砍价商品
*/ */
IPage<KanjiaActivityGoodsDTO> getForPage(KanjiaActivityGoodsParams kanJiaActivityGoodsParams, PageVO pageVO); IPage<KanjiaActivityGoods> getForPage(KanjiaActivityGoodsParams kanJiaActivityGoodsParams, PageVO pageVO);
/** /**
* 查询砍价活动商品分页信息 * 查询砍价活动商品分页信息
@ -62,7 +62,7 @@ public interface KanjiaActivityGoodsService extends IService<KanjiaActivityGoods
* @param skuId 商品规格Id * @param skuId 商品规格Id
* @return 砍价商品 * @return 砍价商品
*/ */
KanjiaActivityGoodsDTO getKanjiaGoodsBySkuId(String skuId); KanjiaActivityGoods getKanjiaGoodsBySkuId(String skuId);
/** /**
* 查询砍价活动商品VO * 查询砍价活动商品VO
@ -87,12 +87,4 @@ public interface KanjiaActivityGoodsService extends IService<KanjiaActivityGoods
*/ */
boolean deleteKanJiaGoods(List<String> ids); boolean deleteKanJiaGoods(List<String> ids);
/**
* 根据skuID查询当前进行的砍价商品信息
*
* @param skuId 商品skuId
* @return
*/
KanjiaActivityGoodsDTO getKanJiaGoodsBySku(String skuId);
} }

View File

@ -25,6 +25,14 @@ public interface MemberCouponService extends IService<MemberCoupon> {
*/ */
void checkCouponLimit(String couponId, String memberId); void checkCouponLimit(String couponId, String memberId);
/**
* 领取优惠券
*
* @param couponId 优惠券编号
* @param memberId 会员
* @param memberName 会员名称
*/
void receiveBuyerCoupon(String couponId, String memberId, String memberName);
/** /**
* 领取优惠券 * 领取优惠券
@ -109,4 +117,11 @@ public interface MemberCouponService extends IService<MemberCoupon> {
*/ */
void cancellation(String id); void cancellation(String id);
/**
* 关闭会员优惠券
*
* @param couponIds 优惠券id集合
*/
void closeMemberCoupon(List<String> couponIds);
} }

View File

@ -1,15 +1,10 @@
package cn.lili.modules.promotion.service; package cn.lili.modules.promotion.service;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.promotion.entity.dos.Pintuan; import cn.lili.modules.promotion.entity.dos.Pintuan;
import cn.lili.modules.promotion.entity.vos.PintuanMemberVO; import cn.lili.modules.promotion.entity.vos.PintuanMemberVO;
import cn.lili.modules.promotion.entity.vos.PintuanSearchParams;
import cn.lili.modules.promotion.entity.vos.PintuanShareVO; import cn.lili.modules.promotion.entity.vos.PintuanShareVO;
import cn.lili.modules.promotion.entity.vos.PintuanVO; import cn.lili.modules.promotion.entity.vos.PintuanVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
@ -18,16 +13,8 @@ import java.util.List;
* @author Chopper * @author Chopper
* @since 2020/11/18 9:45 上午 * @since 2020/11/18 9:45 上午
*/ */
public interface PintuanService extends IService<Pintuan> { public interface PintuanService extends AbstractPromotionsService<Pintuan> {
/**
* 根据条件分页查询拼团活动列表
*
* @param param 拼团活动查询参数
* @param page 分页参数
* @return 拼团活动列表
*/
IPage<Pintuan> getPintuanByPage(PintuanSearchParams param, PageVO page);
/** /**
* 获取当前拼团的会员 * 获取当前拼团的会员
@ -37,80 +24,13 @@ public interface PintuanService extends IService<Pintuan> {
*/ */
List<PintuanMemberVO> getPintuanMember(String pintuanId); List<PintuanMemberVO> getPintuanMember(String pintuanId);
/**
* 从mongo中根据条件分页查询拼团活动列表
*
* @param param 拼团活动查询参数
* @param page 分页参数
* @return 拼团活动列表
*/
IPage<PintuanVO> getPintuanByPageFromMongo(PintuanSearchParams param, PageVO page);
/** /**
* 从mongo中查询拼团活动详情 * 从mongo中查询拼团活动详情
* *
* @param id 拼团ID * @param id 拼团ID
* @return 拼团活动详情 * @return 拼团活动详情
*/ */
PintuanVO getPintuanByIdFromMongo(String id); PintuanVO getPintuanVO(String id);
/**
* 从mysql中查询拼团活动详情
*
* @param id 拼团活动id
* @return 拼团活动详情
*/
Pintuan getPintuanById(String id);
/**
* 从mongo中根据条件查询拼团活动总数
*
* @param param 拼团活动查询参数
* @return 总数
*/
Long getPintuanByPageFromMongoCount(PintuanSearchParams param);
/**
* 拼团新增业务处理
*
* @param pintuan 拼团实体
* @return 是否成功
*/
boolean addPintuan(PintuanVO pintuan);
/**
* 拼团修改
*
* @param pintuan 拼团实体
* @return 是否成功
*/
boolean modifyPintuan(PintuanVO pintuan);
/**
* 开启拼团
*
* @param pintuanId 拼团活动编号
* @param startTime 开始时间
* @param endTime 结束时间
* @return 是否成功
*/
boolean openPintuan(String pintuanId, Date startTime, Date endTime);
/**
* 关闭拼团
*
* @param pintuanId 拼团活动编号
* @return 是否成功
*/
boolean closePintuan(String pintuanId);
/**
* 删除拼团
*
* @param pintuanId 拼团活动编号
* @return 是否成功
*/
boolean deletePintuan(String pintuanId);
/** /**
* 获取拼团分享信息 * 获取拼团分享信息

View File

@ -1,11 +1,7 @@
package cn.lili.modules.promotion.service; package cn.lili.modules.promotion.service;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.promotion.entity.dos.PointsGoods; import cn.lili.modules.promotion.entity.dos.PointsGoods;
import cn.lili.modules.promotion.entity.vos.PointsGoodsSearchParams;
import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; import cn.lili.modules.promotion.entity.vos.PointsGoodsVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List; import java.util.List;
@ -15,40 +11,15 @@ import java.util.List;
* @author paulG * @author paulG
* @since 2020/11/18 9:45 上午 * @since 2020/11/18 9:45 上午
**/ **/
public interface PointsGoodsService extends IService<PointsGoods> { public interface PointsGoodsService extends AbstractPromotionsService<PointsGoods> {
/** /**
* 批量添加积分商品 * 批量保存库存商品
* *
* @param pointsGoodsList 积分商品列表 * @param promotionsList 积分商品列表
* @return 是否添加成功 * @return 是否保存成功
*/ */
boolean addPointsGoods(List<PointsGoodsVO> pointsGoodsList); boolean savePointsGoodsBatch(List<PointsGoods> promotionsList);
/**
* 更新一个积分商品
*
* @param pointsGoodsDTO 编辑的积分商品信息
* @return 是否更新成功
*/
boolean updatePointsGoods(PointsGoodsVO pointsGoodsDTO);
/**
* 批量更新积分商品状态
*
* @param ids 积分商品id集合
* @param promotionStatus 更新的状态
* @return 是否更新成功
*/
boolean updatePointsGoodsPromotionStatus(List<String> ids, String promotionStatus);
/**
* 批量删除积分商品
*
* @param ids 积分商品id集合
* @return 是否删除成功
*/
boolean deletePointsGoods(List<String> ids);
/** /**
* 根据ID获取积分详情 * 根据ID获取积分详情
@ -64,15 +35,6 @@ public interface PointsGoodsService extends IService<PointsGoods> {
* @param skuId 商品SkuId * @param skuId 商品SkuId
* @return 积分详情 * @return 积分详情
*/ */
PointsGoodsVO getPointsGoodsVOByMongo(String skuId); PointsGoodsVO getPointsGoodsDetailBySkuId(String skuId);
/**
* 根据条件查询积分商品
*
* @param searchParams 积分商品查询参数
* @param page 分页参数
* @return 积分商品查询结果
*/
IPage<PointsGoodsVO> getPointsGoodsByPage(PointsGoodsSearchParams searchParams, PageVO page);
} }

View File

@ -1,12 +1,11 @@
package cn.lili.modules.promotion.service; package cn.lili.modules.promotion.service;
import cn.lili.cache.CachePrefix; import cn.lili.cache.CachePrefix;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.dto.PromotionGoodsDTO;
import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams; import cn.lili.common.vo.PageVO;
import cn.lili.modules.order.cart.entity.vo.CartSkuVO; import cn.lili.modules.order.cart.entity.vo.CartSkuVO;
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
@ -34,14 +33,6 @@ public interface PromotionGoodsService extends IService<PromotionGoods> {
return "{" + CachePrefix.PROMOTION_GOODS_STOCK.name() + "_" + typeEnum.name() + "}_" + promotionId + "_" + skuId; return "{" + CachePrefix.PROMOTION_GOODS_STOCK.name() + "_" + typeEnum.name() + "}_" + promotionId + "_" + skuId;
} }
/**
* 删除指定促销类型的促销商品
*
* @param promotionGoodsList 促销商品列表
* @param promotionType 促销类型
*/
void removePromotionGoods(List<PromotionGoods> promotionGoodsList, PromotionTypeEnum promotionType);
/** /**
* 更新促销活动 * 更新促销活动
* *
@ -57,14 +48,6 @@ public interface PromotionGoodsService extends IService<PromotionGoods> {
*/ */
List<PromotionGoods> findNowSkuPromotion(String skuId); List<PromotionGoods> findNowSkuPromotion(String skuId);
/**
* 分页获取促销商品信息
*
* @param skuId 商品skuId
* @return 某商品的促销信息
*/
List<PromotionGoods> getPromotionGoods(String skuId);
/** /**
* 分页获取促销商品信息 * 分页获取促销商品信息
* *
@ -72,16 +55,42 @@ public interface PromotionGoodsService extends IService<PromotionGoods> {
* @param pageVo 分页参数 * @param pageVo 分页参数
* @return 促销商品列表 * @return 促销商品列表
*/ */
IPage<PromotionGoodsDTO> getPromotionGoods(PromotionGoodsSearchParams searchParams, PageVO pageVo); IPage<PromotionGoods> pageFindAll(PromotionGoodsSearchParams searchParams, PageVO pageVo);
/** /**
* 分页获取当前进行中的促销活动的促销商品信息 * 获取促销商品信息
* *
* @param promotionType 促销活动类型 * @param searchParams 查询参数
* @param pageVo 分页参数
* @return 促销商品列表 * @return 促销商品列表
*/ */
IPage<PromotionGoodsDTO> getCurrentPromotionGoods(String promotionType, PageVO pageVo); List<PromotionGoods> listFindAll(PromotionGoodsSearchParams searchParams);
/**
* 获取促销商品信息
*
* @param searchParams 查询参数
* @return 促销商品信息
*/
PromotionGoods getPromotionsGoods(PromotionGoodsSearchParams searchParams);
/**
* 获取当前有效时间特定促销类型的促销商品信息
*
* @param skuId skuId
* @param promotionTypes 特定促销类型
* @return 促销商品信息
*/
PromotionGoods getValidPromotionsGoods(String skuId, List<String> promotionTypes);
/**
* 获取当前有效时间特定促销类型的促销商品价格
*
* @param skuId skuId
* @param promotionTypes 特定促销类型
* @return 促销商品价格
*/
Double getValidPromotionsGoodsPrice(String skuId, List<String> promotionTypes);
/** /**
* 查询参加活动促销商品是否同时参加指定类型的活动 * 查询参加活动促销商品是否同时参加指定类型的活动
@ -116,26 +125,6 @@ public interface PromotionGoodsService extends IService<PromotionGoods> {
*/ */
List<Integer> getPromotionGoodsStock(PromotionTypeEnum typeEnum, String promotionId, List<String> skuId); List<Integer> getPromotionGoodsStock(PromotionTypeEnum typeEnum, String promotionId, List<String> skuId);
/**
* 根据条件获取促销活动商品详情
*
* @param typeEnum 促销类型
* @param promotionId 促销活动id
* @param skuId 商品skuId
* @return 促销活动商品详情
*/
PromotionGoods getPromotionGoods(PromotionTypeEnum typeEnum, String promotionId, String skuId);
/**
* 批量获取促销商品信息
*
* @param typeEnum 促销类型
* @param promotionId 促销活动id
* @param skuId 商品skuId
* @return 促销活动商品详情
*/
List<PromotionGoods> getPromotionGoods(PromotionTypeEnum typeEnum, String promotionId, List<String> skuId);
/** /**
* 更新促销活动商品库存 * 更新促销活动商品库存
* *
@ -146,4 +135,33 @@ public interface PromotionGoodsService extends IService<PromotionGoods> {
*/ */
void updatePromotionGoodsStock(PromotionTypeEnum typeEnum, String promotionId, String skuId, Integer quantity); void updatePromotionGoodsStock(PromotionTypeEnum typeEnum, String promotionId, String skuId, Integer quantity);
/**
* 更新促销活动商品索引
*
* @param promotionGoods 促销商品信息
*/
void updatePromotionGoodsByPromotions(PromotionGoods promotionGoods);
/**
* 删除促销商品
*
* @param promotionId 促销活动id
* @param skuIds skuId
*/
void deletePromotionGoods(String promotionId, List<String> skuIds);
/**
* 删除促销促销商品
*
* @param promotionIds 促销活动id
*/
void deletePromotionGoods(List<String> promotionIds);
/**
* 根据参数删除促销商品
*
* @param searchParams 查询参数
*/
void deletePromotionGoods(PromotionGoodsSearchParams searchParams);
} }

View File

@ -1,6 +1,5 @@
package cn.lili.modules.promotion.service; package cn.lili.modules.promotion.service;
import cn.lili.trigger.message.PromotionMessage;
import cn.lili.modules.search.entity.dos.EsGoodsIndex; import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import java.util.Map; import java.util.Map;
@ -13,16 +12,6 @@ import java.util.Map;
*/ */
public interface PromotionService { public interface PromotionService {
/**
* 更新促销活动状态
*
* @param promotionMessage 促销变更信息
* @return 是否更新成功
*/
boolean updatePromotionStatus(PromotionMessage promotionMessage);
/** /**
* 获取当前进行的所有促销活动信息 * 获取当前进行的所有促销活动信息
* *

View File

@ -36,18 +36,26 @@ public interface SeckillApplyService extends IService<SeckillApply> {
List<SeckillGoodsVO> getSeckillGoods(Integer timeline); List<SeckillGoodsVO> getSeckillGoods(Integer timeline);
/** /**
* 从mongo中分页查询限时请购申请列表 * 分页查询限时请购申请列表
* *
* @param queryParam 秒杀活动申请查询参数 * @param queryParam 秒杀活动申请查询参数
* @param pageVo 分页参数 * @param pageVo 分页参数
* @return 限时请购申请列表 * @return 限时请购申请列表
*/ */
IPage<SeckillApply> getSeckillApplyFromMongo(SeckillSearchParams queryParam, PageVO pageVo); IPage<SeckillApply> getSeckillApply(SeckillSearchParams queryParam, PageVO pageVo);
/**
* 分页查询限时请购申请列表
*
* @param queryParam 秒杀活动申请查询参数
* @return 限时请购申请列表
*/
List<SeckillApply> getSeckillApply(SeckillSearchParams queryParam);
/** /**
* 添加秒杀活动申请 * 添加秒杀活动申请
* 检测是否商品是否同时参加多个活动 * 检测是否商品是否同时参加多个活动
* 将秒杀商品信息存入秒杀活动中更新mogo信息 * 将秒杀商品信息存入秒杀活动中
* 保存秒杀活动商品促销商品信息 * 保存秒杀活动商品促销商品信息
* *
* @param seckillId 秒杀活动编号 * @param seckillId 秒杀活动编号
@ -62,5 +70,6 @@ public interface SeckillApplyService extends IService<SeckillApply> {
* @param seckillId 秒杀活动活动id * @param seckillId 秒杀活动活动id
* @param id 秒杀活动商品 * @param id 秒杀活动商品
*/ */
void removeSeckillApply(String seckillId, String id ); void removeSeckillApply(String seckillId, String id);
} }

View File

@ -1,11 +1,10 @@
package cn.lili.modules.promotion.service; package cn.lili.modules.promotion.service;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.promotion.entity.dos.Seckill; import cn.lili.modules.promotion.entity.dos.Seckill;
import cn.lili.modules.promotion.entity.vos.SeckillSearchParams; import cn.lili.modules.promotion.entity.dos.SeckillApply;
import cn.lili.modules.promotion.entity.vos.SeckillVO; import cn.lili.modules.promotion.entity.vos.SeckillVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import java.util.List;
/** /**
* 秒杀业务层 * 秒杀业务层
@ -13,30 +12,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
* @author Chopper * @author Chopper
* @since 2020/11/18 9:45 上午 * @since 2020/11/18 9:45 上午
*/ */
public interface SeckillService extends IService<Seckill> { public interface SeckillService extends AbstractPromotionsService<Seckill> {
/** /**
* 预创建活动数量 * 预创建活动数量
*/ */
public static final Integer PRE_CREATION = 7; Integer PRE_CREATION = 7;
/**
* 从mysql中根据条件获取秒杀活动分页列表
*
* @param queryParam 查询参数
* @param pageVo 分页参数
* @return 秒杀活动分页列表
*/
IPage<Seckill> getSeckillByPageFromMysql(SeckillSearchParams queryParam, PageVO pageVo);
/**
* 从mongo中根据条件获取秒杀活动分页列表
*
* @param queryParam 查询参数
* @param pageVo 分页参数
* @return 秒杀活动分页列表
*/
IPage<SeckillVO> getSeckillByPageFromMongo(SeckillSearchParams queryParam, PageVO pageVo);
/** /**
* 从mongo中获取秒杀活动信息 * 从mongo中获取秒杀活动信息
@ -44,56 +25,12 @@ public interface SeckillService extends IService<Seckill> {
* @param id 秒杀活动id * @param id 秒杀活动id
* @return 秒杀活动信息 * @return 秒杀活动信息
*/ */
SeckillVO getSeckillByIdFromMongo(String id); SeckillVO getSeckillDetail(String id);
/** /**
* 初始化秒杀活动默认开启三十天的秒杀活动 * 初始化秒杀活动默认开启三十天的秒杀活动
*/ */
void init(); void init();
/**
* 保存秒杀活动
*
* @param seckill 秒杀活动
* @return 是否保存成功
*/
boolean saveSeckill(Seckill seckill);
/**
* 商家报名秒杀活动活动
*
* @param storeId 商家编号
* @param seckillId 秒杀活动编号
*/
void storeApply(String storeId, String seckillId);
/**
* 修改秒杀活动
*
* @param seckillVO 秒杀活动信息
* @return 是否修改成功
*/
boolean modifySeckill(SeckillVO seckillVO);
/**
* 删除秒杀活动
*
* @param id 秒杀活动编号
*/
void deleteSeckill(String id);
/**
* 开启一个秒杀活动
*
* @param id 秒杀活动编号
*/
void openSeckill(String id);
/**
* 关闭一个秒杀活动
*
* @param id 秒杀活动编号
*/
void closeSeckill(String id);
/** /**
* 获取当前可参与的活动数量 * 获取当前可参与的活动数量
@ -104,7 +41,24 @@ public interface SeckillService extends IService<Seckill> {
/** /**
* 更新秒杀活动的商品数量 * 更新秒杀活动的商品数量
*
* @param seckillId 秒杀活动ID * @param seckillId 秒杀活动ID
*/ */
void updateSeckillGoodsNum(String seckillId); void updateSeckillGoodsNum(String seckillId);
/**
* 更新商品索引限时抢购信息
*
* @param seckill 限时抢购信息
* @param seckillApplies 限时抢购商品列表
*/
void updateEsGoodsSeckill(Seckill seckill, List<SeckillApply> seckillApplies);
/**
* 设置秒杀活动的每个参与活动商品的详细时间
*
* @param seckill 秒杀活动信息
* @param seckillApply 申请参与秒杀活动的商品信息
*/
void setSeckillApplyTime(Seckill seckill, SeckillApply seckillApply);
} }

View File

@ -0,0 +1,276 @@
package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.core.text.CharSequenceUtil;
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.properties.RocketmqCustomProperties;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.dto.BasePromotions;
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import cn.lili.modules.promotion.entity.vos.BasePromotionsSearchParams;
import cn.lili.modules.promotion.service.AbstractPromotionsService;
import cn.lili.modules.promotion.service.PromotionGoodsService;
import cn.lili.modules.promotion.tools.PromotionTools;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.GoodsTagsEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
/**
* @author paulG
* @since 2021/11/30
**/
public class AbstractPromotionsServiceImpl<M extends BaseMapper<T>, T extends BasePromotions> extends ServiceImpl<M, T> implements AbstractPromotionsService<T> {
/**
* 促销商品
*/
@Autowired
private PromotionGoodsService promotionGoodsService;
/**
* rocketMq配置
*/
@Autowired
private RocketmqCustomProperties rocketmqCustomProperties;
/**
* rocketMq
*/
@Autowired
private RocketMQTemplate rocketMQTemplate;
/**
* 通用促销保存
* 调用顺序:
* 1. initPromotion 初始化促销信息
* 2. checkPromotions 检查促销参数
* 3. save 保存促销信息
* 4. updatePromotionGoods 更新促销商品信息
* 5 updateEsGoodsIndex 更新商品索引促销信息
*
* @param promotions 促销信息
* @return 是否保存成功
*/
@Override
@Transactional(rollbackFor = {Exception.class})
public boolean savePromotions(T promotions) {
this.initPromotion(promotions);
this.checkPromotions(promotions);
boolean save = this.save(promotions);
this.updatePromotionsGoods(promotions);
this.updateEsGoodsIndex(promotions);
return save;
}
/**
* 通用促销更新
* 调用顺序:
* 1. checkStatus 检查促销状态
* 2. checkPromotions 检查促销参数
* 3. saveOrUpdate 保存促销信息
* 4. updatePromotionGoods 更新促销商品信息
* 5. updateEsGoodsIndex 更新商品索引促销信息
*
* @param promotions 促销信息
* @return 是否更新成功
*/
@Override
@Transactional(rollbackFor = {Exception.class})
public boolean updatePromotions(T promotions) {
this.checkStatus(promotions);
this.checkPromotions(promotions);
boolean save = this.saveOrUpdate(promotions);
this.updatePromotionsGoods(promotions);
this.updateEsGoodsIndex(promotions);
return save;
}
/**
* 更新促销状态
* 如果要更新促销状态为关闭startTime和endTime置为空即可
*
* @param ids 促销id集合
* @param startTime 开始时间
* @param endTime 结束时间
* @return 是否更新成功
*/
@Override
@Transactional(rollbackFor = {Exception.class})
public boolean updateStatus(List<String> ids, Long startTime, Long endTime) {
List<T> promotionsList = this.list(new QueryWrapper<T>().in("id", ids));
for (T t : promotionsList) {
if (startTime != null && endTime != null) {
t.setStartTime(new Date(startTime));
t.setEndTime(new Date(endTime));
} else {
t.setStartTime(null);
t.setEndTime(null);
}
this.checkStatus(t);
this.updatePromotionsGoods(t);
this.updateEsGoodsIndex(t);
}
if (startTime != null && endTime != null) {
return this.update(new UpdateWrapper<T>().in("id", ids).set("start_time", new Date(startTime)).set("end_time", new Date(endTime)));
} else {
return this.update(new UpdateWrapper<T>().in("id", ids).set("start_time", null).set("end_time", null));
}
}
/**
* 移除促销活动
*
* @param ids 促销活动id集合
* @return 是否移除成功
*/
@Override
@Transactional(rollbackFor = {Exception.class})
public boolean removePromotions(List<String> ids) {
for (String id : ids) {
T promotions = this.getById(id);
this.checkStatus(promotions);
promotions.setDeleteFlag(true);
this.updatePromotionsGoods(promotions);
this.updateEsGoodsIndex(promotions);
}
return this.removeByIds(ids);
}
/**
* 分页查询促销信息
*
* @param searchParams 查询参数继承自继承促销查询参数
* @param page 分页参数
* @return 分页促销信息
*/
@Override
public <S extends BasePromotionsSearchParams> IPage<T> pageFindAll(S searchParams, PageVO page) {
page.setNotConvert(false);
return this.page(PageUtil.initPage(page), searchParams.queryWrapper());
}
/**
* 列表查询促销信息
*
* @param searchParams 查询参数继承自继承促销查询参数
* @return 列表促销信息
*/
@Override
public <S extends BasePromotionsSearchParams> List<T> listFindAll(S searchParams) {
return this.list(searchParams.queryWrapper());
}
/**
* 初始化促销字段
*
* @param promotions 促销实体
*/
@Override
public void initPromotion(T promotions) {
if (CharSequenceUtil.isEmpty(promotions.getScopeType())) {
promotions.setScopeType(PromotionsScopeTypeEnum.PORTION_GOODS.name());
}
}
/**
* 检查促销参数
*
* @param promotions 促销实体
*/
@Override
public void checkPromotions(T promotions) {
PromotionTools.checkPromotionTime(promotions.getStartTime(), promotions.getEndTime());
}
/**
* 检查促销状态
*
* @param promotions 促销实体
*/
@Override
public void checkStatus(T promotions) {
T byId = this.getById(promotions.getId());
if (byId == null) {
throw new ServiceException(ResultCode.PROMOTION_ACTIVITY_ERROR);
}
}
/**
* 更新促销商品信息
*
* @param promotions 促销实体
*/
@Override
@Transactional(rollbackFor = {Exception.class})
public void updatePromotionsGoods(T promotions) {
if (promotions.getStartTime() == null && promotions.getEndTime() == null) {
this.promotionGoodsService.deletePromotionGoods(Collections.singletonList(promotions.getId()));
return;
}
if (PromotionsScopeTypeEnum.ALL.name().equals(promotions.getScopeType())) {
PromotionGoods promotionGoods = new PromotionGoods();
promotionGoods.setScopeType(promotions.getScopeType());
promotionGoods.setPromotionId(promotions.getId());
promotionGoods.setStoreId(promotions.getStoreId());
promotionGoods.setStoreName(promotions.getStoreName());
promotionGoods.setStartTime(promotions.getStartTime());
promotionGoods.setEndTime(promotions.getEndTime());
promotionGoods.setPromotionType(this.getPromotionType().name());
promotionGoods.setTitle(promotions.getPromotionName());
this.promotionGoodsService.deletePromotionGoods(Collections.singletonList(promotions.getId()));
this.promotionGoodsService.save(promotionGoods);
}
}
/**
* 更新促销信息到商品索引
*
* @param promotions 促销实体
*/
@Override
public void updateEsGoodsIndex(T promotions) {
if (promotions.getStartTime() == null && promotions.getEndTime() == null) {
//删除商品促销消息
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.DELETE_GOODS_INDEX_PROMOTIONS.name();
//发送mq消息
rocketMQTemplate.asyncSend(destination, promotions.getId(), RocketmqSendCallbackBuilder.commonCallback());
} else {
String esPromotionKey = this.getPromotionType().name() + "-" + promotions.getId();
Map<String, Object> map = new HashMap<>();
// es促销key
map.put("esPromotionKey", esPromotionKey);
// 促销类型全路径名
map.put("promotionsType", promotions.getClass().getName());
// 促销实体
map.put("promotions", promotions);
//更新商品促销消息
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.UPDATE_GOODS_INDEX_PROMOTIONS.name();
//发送mq消息
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(map), RocketmqSendCallbackBuilder.commonCallback());
}
}
/**
* 当前促销类型
*
* @return 当前促销类型
*/
@Override
public PromotionTypeEnum getPromotionType() {
return null;
}
}

View File

@ -31,4 +31,14 @@ public class CouponActivityItemServiceImpl extends ServiceImpl<CouponActivityIte
return this.baseMapper.getCouponActivityItemListVO(activityId); return this.baseMapper.getCouponActivityItemListVO(activityId);
} }
/**
* 根据优惠券id删除优惠活动关联信息项
*
* @param couponIds 优惠券id集合
*/
@Override
public void removeByCouponId(List<String> couponIds) {
this.remove(new LambdaQueryWrapper<CouponActivityItem>()
.in(CouponActivityItem::getCouponId, couponIds));
}
} }

View File

@ -5,8 +5,6 @@ import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.PromotionTypeEnum; 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.properties.RocketmqCustomProperties;
import cn.lili.common.utils.DateUtil;
import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.service.MemberService; import cn.lili.modules.member.service.MemberService;
import cn.lili.modules.promotion.entity.dos.Coupon; import cn.lili.modules.promotion.entity.dos.Coupon;
@ -14,25 +12,13 @@ import cn.lili.modules.promotion.entity.dos.CouponActivity;
import cn.lili.modules.promotion.entity.dos.CouponActivityItem; import cn.lili.modules.promotion.entity.dos.CouponActivityItem;
import cn.lili.modules.promotion.entity.dos.MemberCoupon; import cn.lili.modules.promotion.entity.dos.MemberCoupon;
import cn.lili.modules.promotion.entity.dto.CouponActivityDTO; import cn.lili.modules.promotion.entity.dto.CouponActivityDTO;
import cn.lili.modules.promotion.entity.enums.CouponActivitySendTypeEnum; import cn.lili.modules.promotion.entity.enums.*;
import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import cn.lili.modules.promotion.entity.vos.CouponActivityVO; import cn.lili.modules.promotion.entity.vos.CouponActivityVO;
import cn.lili.modules.promotion.mapper.CouponActivityMapper; import cn.lili.modules.promotion.mapper.CouponActivityMapper;
import cn.lili.modules.promotion.service.CouponActivityItemService; import cn.lili.modules.promotion.service.CouponActivityItemService;
import cn.lili.modules.promotion.service.CouponActivityService; import cn.lili.modules.promotion.service.CouponActivityService;
import cn.lili.modules.promotion.service.CouponService; import cn.lili.modules.promotion.service.CouponService;
import cn.lili.modules.promotion.service.MemberCouponService; import cn.lili.modules.promotion.service.MemberCouponService;
import cn.lili.modules.promotion.tools.PromotionTools;
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.extension.service.impl.ServiceImpl;
import groovy.util.logging.Slf4j; import groovy.util.logging.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -48,7 +34,7 @@ import java.util.stream.Collectors;
*/ */
@Slf4j @Slf4j
@Service @Service
public class CouponActivityServiceImpl extends ServiceImpl<CouponActivityMapper, CouponActivity> implements CouponActivityService { public class CouponActivityServiceImpl extends AbstractPromotionsServiceImpl<CouponActivityMapper, CouponActivity> implements CouponActivityService {
@Autowired @Autowired
private CouponService couponService; private CouponService couponService;
@ -58,50 +44,6 @@ public class CouponActivityServiceImpl extends ServiceImpl<CouponActivityMapper,
private CouponActivityItemService couponActivityItemService; private CouponActivityItemService couponActivityItemService;
@Autowired @Autowired
private MemberService memberService; private MemberService memberService;
@Autowired
private RocketmqCustomProperties rocketmqCustomProperties;
@Autowired
private TimeTrigger timeTrigger;
@Override
public CouponActivityDTO addCouponActivity(CouponActivityDTO couponActivityDTO) {
//检测优惠券活动是否可以添加
this.checkParam(couponActivityDTO);
//如果有会员则写入会员信息
if (couponActivityDTO.getMemberDTOS() != null && !couponActivityDTO.getMemberDTOS().isEmpty()) {
couponActivityDTO.setActivityScopeInfo(JSONUtil.toJsonStr(couponActivityDTO.getMemberDTOS()));
}
//添加优惠券活动
this.save(couponActivityDTO);
//添加优惠券活动优惠券
this.addCouponActivityItems(couponActivityDTO);
//创建优惠券活动延时任务
PromotionMessage promotionMessage = new PromotionMessage(couponActivityDTO.getId(), PromotionTypeEnum.COUPON_ACTIVITY.name(), PromotionStatusEnum.START.name(), couponActivityDTO.getStartTime(), couponActivityDTO.getEndTime());
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR,
couponActivityDTO.getStartTime().getTime(),
promotionMessage,
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
rocketmqCustomProperties.getPromotionTopic());
//发送促销活动开始的延时任务
this.timeTrigger.addDelay(timeTriggerMsg);
return couponActivityDTO;
}
@Override
public CouponActivityDTO updateCouponActivity(CouponActivityDTO couponActivityDTO) {
//检测优惠券活动是否可以修改
this.checkParam(couponActivityDTO);
//修改优惠券活动
this.updateById(couponActivityDTO);
//删除优惠券活动关联的优惠券
couponActivityItemService.remove(new LambdaQueryWrapper<CouponActivityItem>()
.eq(CouponActivityItem::getActivityId, couponActivityDTO.getId()));
//重新添加优惠券活动关联优惠券
this.addCouponActivityItems(couponActivityDTO);
return couponActivityDTO;
}
@Override @Override
public CouponActivityVO getCouponActivityVO(String couponActivityId) { public CouponActivityVO getCouponActivityVO(String couponActivityId) {
@ -152,11 +94,86 @@ public class CouponActivityServiceImpl extends ServiceImpl<CouponActivityMapper,
} }
} }
/**
* 初始化促销字段
*
* @param promotions 促销实体
*/
@Override @Override
public boolean updateCouponActivityStatus(String id, PromotionStatusEnum promotionStatus) { public void initPromotion(CouponActivity promotions) {
CouponActivity couponActivity = this.getById(id); super.initPromotion(promotions);
couponActivity.setPromotionStatus(promotionStatus.name()); if (promotions instanceof CouponActivityDTO) {
return this.updateById(couponActivity); CouponActivityDTO couponActivityDTO = (CouponActivityDTO) promotions;
//如果有会员则写入会员信息
if (couponActivityDTO.getMemberDTOS() != null && !couponActivityDTO.getMemberDTOS().isEmpty()) {
couponActivityDTO.setActivityScopeInfo(JSONUtil.toJsonStr(couponActivityDTO.getMemberDTOS()));
}
}
}
/**
* 检查优惠券活动参数
*
* @param couponActivity 优惠券活动实体
*/
@Override
public void checkPromotions(CouponActivity couponActivity) {
super.checkPromotions(couponActivity);
if (couponActivity instanceof CouponActivityDTO) {
CouponActivityDTO couponActivityDTO = (CouponActivityDTO) couponActivity;
//指定会员判定
if (couponActivity.getActivityScope().equals(CouponActivitySendTypeEnum.DESIGNATED.name()) && couponActivityDTO.getMemberDTOS().isEmpty()) {
throw new ServiceException(ResultCode.COUPON_ACTIVITY_MEMBER_ERROR);
}
// 检查优惠券
this.checkCouponActivityItem(couponActivityDTO.getCouponActivityItems());
}
}
/**
* 更新优惠券活动商品信息
*
* @param couponActivity 优惠券活动实体
*/
@Override
public void updatePromotionsGoods(CouponActivity couponActivity) {
super.updatePromotionsGoods(couponActivity);
if (couponActivity instanceof CouponActivityDTO
&& !PromotionsStatusEnum.CLOSE.name().equals(couponActivity.getPromotionStatus())
&& PromotionsScopeTypeEnum.PORTION_GOODS.name().equals(couponActivity.getScopeType())) {
CouponActivityDTO couponActivityDTO = (CouponActivityDTO) couponActivity;
//创建优惠券活动子列表
for (CouponActivityItem couponActivityItem : couponActivityDTO.getCouponActivityItems()) {
couponActivityItem.setActivityId(couponActivityDTO.getId());
}
// 更新优惠券活动项信息
couponActivityItemService.saveBatch(couponActivityDTO.getCouponActivityItems());
}
}
/**
* 更新优惠券活动信息到商品索引
*
* @param couponActivity 促销实体
*/
@Override
public void updateEsGoodsIndex(CouponActivity couponActivity) {
//如果是精准发券进行发送优惠券
if (!PromotionsStatusEnum.CLOSE.name().equals(couponActivity.getPromotionStatus()) && couponActivity.getCouponActivityType().equals(CouponActivityTypeEnum.SPECIFY.name())) {
this.specify(couponActivity.getId());
}
}
/**
* 当前促销类型
*
* @return 当前促销类型
*/
@Override
public PromotionTypeEnum getPromotionType() {
return PromotionTypeEnum.COUPON_ACTIVITY;
} }
/** /**
@ -173,7 +190,7 @@ public class CouponActivityServiceImpl extends ServiceImpl<CouponActivityMapper,
for (CouponActivityItem couponActivityItem : couponActivityItems) { for (CouponActivityItem couponActivityItem : couponActivityItems) {
//获取优惠券 //获取优惠券
Coupon coupon = couponService.getCouponDetailFromMongo(couponActivityItem.getCouponId()); Coupon coupon = couponService.getById(couponActivityItem.getCouponId());
//判断优惠券是否存在 //判断优惠券是否存在
if (coupon != null) { if (coupon != null) {
List<MemberCoupon> memberCouponList = new LinkedList<>(); List<MemberCoupon> memberCouponList = new LinkedList<>();
@ -201,38 +218,6 @@ public class CouponActivityServiceImpl extends ServiceImpl<CouponActivityMapper,
} }
/**
* 检测优惠券活动参数
*
* @param couponActivity 优惠券活动
*/
private void checkParam(CouponActivityDTO couponActivity) {
//检测活动时间超过当前时间不能进行操作
long nowTime = DateUtil.getDateline() * 1000;
if (couponActivity.getStartTime().getTime() < nowTime && couponActivity.getEndTime().getTime() > nowTime) {
throw new ServiceException(ResultCode.COUPON_ACTIVITY_START_TIME_ERROR);
}
//活动时间需超过当前时间
PromotionTools.checkPromotionTime(couponActivity.getStartTime().getTime(), couponActivity.getEndTime().getTime());
//指定会员判定
if (couponActivity.getActivityScope().equals(CouponActivitySendTypeEnum.DESIGNATED.name()) && couponActivity.getMemberDTOS().isEmpty()) {
throw new ServiceException(ResultCode.COUPON_ACTIVITY_MEMBER_ERROR);
}
//优惠券数量判定
if (couponActivity.getCouponActivityItems().isEmpty()) {
throw new ServiceException(ResultCode.COUPON_ACTIVITY_ITEM_ERROR);
} else if (couponActivity.getCouponActivityItems().size() > 10) {
throw new ServiceException(ResultCode.COUPON_ACTIVITY_ITEM_MUST_NUM_ERROR);
} else {
for (CouponActivityItem item : couponActivity.getCouponActivityItems()) {
if (item.getNum() == null || item.getNum() <= 0) {
throw new ServiceException(ResultCode.COUPON_ACTIVITY_ITEM_NUM_ERROR);
}
}
}
}
/** /**
* 获取优惠券的范围范围 * 获取优惠券的范围范围
* 此方法用于精准发券 * 此方法用于精准发券
@ -243,30 +228,34 @@ public class CouponActivityServiceImpl extends ServiceImpl<CouponActivityMapper,
private List<Map<String, Object>> getMemberList(CouponActivity couponActivity) { private List<Map<String, Object>> getMemberList(CouponActivity couponActivity) {
//判断优惠券的发送范围获取会员列表 //判断优惠券的发送范围获取会员列表
if ("ALL".equals(couponActivity.getActivityScope())) { if ("ALL".equals(couponActivity.getActivityScope())) {
return memberService.listMaps(new QueryWrapper<Member>() return this.memberService.listFieldsByMemberIds("id,nick_name", null);
.select("id,nick_name"));
} else { } else {
List<Object> ids = new ArrayList<>(); List<String> ids = new ArrayList<>();
if (JSONUtil.isJsonArray(couponActivity.getActivityScopeInfo())) { if (JSONUtil.isJsonArray(couponActivity.getActivityScopeInfo())) {
JSONArray array = JSONUtil.parseArray(couponActivity.getActivityScopeInfo()); JSONArray array = JSONUtil.parseArray(couponActivity.getActivityScopeInfo());
ids = array.toList(Map.class).stream().map(i -> i.get("id")).collect(Collectors.toList()); ids = array.toList(Map.class).stream().map(i -> i.get("id").toString()).collect(Collectors.toList());
} }
return memberService.listMaps(new QueryWrapper<Member>() return memberService.listFieldsByMemberIds("id,nick_name", ids);
.select("id,nick_name")
.in("id", ids));
} }
} }
/** /**
* 添加优惠券活动关联优惠券 * 检查优惠券
* *
* @param couponActivityDTO 优惠券活动DTO * @param couponActivityItems 优惠券列表
*/ */
private void addCouponActivityItems(CouponActivityDTO couponActivityDTO) { private void checkCouponActivityItem(List<CouponActivityItem> couponActivityItems) {
//创建优惠券活动子列表 //优惠券数量判定
for (CouponActivityItem couponActivityItem : couponActivityDTO.getCouponActivityItems()) { if (couponActivityItems.isEmpty()) {
couponActivityItem.setActivityId(couponActivityDTO.getId()); throw new ServiceException(ResultCode.COUPON_ACTIVITY_ITEM_ERROR);
} else if (couponActivityItems.size() > 10) {
throw new ServiceException(ResultCode.COUPON_ACTIVITY_ITEM_MUST_NUM_ERROR);
} else {
for (CouponActivityItem item : couponActivityItems) {
if (item.getNum() == null || item.getNum() <= 0) {
throw new ServiceException(ResultCode.COUPON_ACTIVITY_ITEM_NUM_ERROR);
}
}
} }
couponActivityItemService.saveBatch(couponActivityDTO.getCouponActivityItems());
} }
} }

View File

@ -1,43 +1,37 @@
package cn.lili.modules.promotion.serviceimpl; package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
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.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 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.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.promotion.entity.dos.*; import cn.lili.modules.promotion.entity.dos.Coupon;
import cn.lili.modules.promotion.entity.enums.*; import cn.lili.modules.promotion.entity.dos.FullDiscount;
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.enums.CouponRangeDayEnum;
import cn.lili.modules.promotion.entity.enums.CouponTypeEnum;
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.entity.vos.CouponSearchParams; import cn.lili.modules.promotion.entity.vos.CouponSearchParams;
import cn.lili.modules.promotion.entity.vos.CouponVO; import cn.lili.modules.promotion.entity.vos.CouponVO;
import cn.lili.modules.promotion.entity.vos.FullDiscountSearchParams;
import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams;
import cn.lili.modules.promotion.mapper.CouponMapper; import cn.lili.modules.promotion.mapper.CouponMapper;
import cn.lili.modules.promotion.service.*; import cn.lili.modules.promotion.service.*;
import cn.lili.modules.promotion.tools.PromotionTools; import cn.lili.modules.promotion.tools.PromotionTools;
import cn.lili.mybatis.util.PageUtil;
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.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
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.Collections;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -49,28 +43,13 @@ import java.util.stream.Collectors;
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> implements CouponService { public class CouponServiceImpl extends AbstractPromotionsServiceImpl<CouponMapper, Coupon> implements CouponService {
/**
* 延时任务
*/
@Autowired
private TimeTrigger timeTrigger;
/**
* Mongo
*/
@Autowired
private MongoTemplate mongoTemplate;
/** /**
* 规格商品 * 规格商品
*/ */
@Autowired @Autowired
private GoodsSkuService goodsSkuService; private GoodsSkuService goodsSkuService;
/**
* Rocketmq
*/
@Autowired
private RocketmqCustomProperties rocketmqCustomProperties;
/** /**
* 促销商品 * 促销商品
*/ */
@ -92,170 +71,6 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
@Autowired @Autowired
private CouponActivityItemService couponActivityItemService; private CouponActivityItemService couponActivityItemService;
@Override
public CouponVO add(CouponVO coupon) {
//检查参数
this.checkParam(coupon);
coupon.setUsedNum(0);
coupon.setReceivedNum(0);
//保存到MYSQL中
this.save(coupon);
//如果优惠券类型为部分商品则将促销活动商品更新
this.updateScopePromotionGoods(coupon);
//保存到MONGO中
this.mongoTemplate.save(coupon);
//如果优惠券是固定时间则添加延时任务
if (coupon.getRangeDayType().equals(CouponRangeDayEnum.FIXEDTIME.name())) {
PromotionMessage promotionMessage = new PromotionMessage(coupon.getId(), PromotionTypeEnum.COUPON.name(), PromotionStatusEnum.START.name(), coupon.getStartTime(), coupon.getEndTime());
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR,
coupon.getStartTime().getTime(),
promotionMessage,
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
rocketmqCustomProperties.getPromotionTopic());
//发送促销活动开始的延时任务
this.timeTrigger.addDelay(timeTriggerMsg);
}
return coupon;
}
@Override
public CouponVO updateCoupon(CouponVO couponVO) {
CouponVO coupon = checkStatus(couponVO.getId());
//检查参数
this.checkParam(couponVO);
//更新到MYSQL中
this.updateById(couponVO);
//如果优惠券类型为部分商品则将促销活动商品更新
this.updateScopePromotionGoods(couponVO);
//保存到MONGO中
this.mongoTemplate.save(couponVO);
PromotionMessage promotionMessage = new PromotionMessage(couponVO.getId(), PromotionTypeEnum.COUPON.name(), PromotionStatusEnum.START.name(), coupon.getStartTime(), coupon.getEndTime());
//更新延时任务
this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR,
promotionMessage,
coupon.getStartTime().getTime(), couponVO.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
DateUtil.getDelayTime(couponVO.getStartTime().getTime()),
rocketmqCustomProperties.getPromotionTopic());
return couponVO;
}
@Override
public boolean updateCouponStatus(List<String> couponId, PromotionStatusEnum promotionStatus) {
Query query = new Query();
query.addCriteria(Criteria.where("id").in(couponId));
List<CouponVO> couponVOS = this.mongoTemplate.find(query, CouponVO.class);
couponVOS = couponVOS.parallelStream().filter(i -> Boolean.FALSE.equals(i.getDeleteFlag())).collect(Collectors.toList());
if (couponVOS.isEmpty()) {
throw new ServiceException(ResultCode.COUPON_NOT_EXIST);
}
for (CouponVO couponVO : couponVOS) {
if (promotionStatus.name().equals(PromotionStatusEnum.START.name())) {
this.checkParam(couponVO);
}
couponVO.setPromotionStatus(promotionStatus.name());
this.updateById(couponVO);
this.mongoTemplate.save(couponVO);
PromotionMessage promotionMessage = new PromotionMessage(couponVO.getId(), PromotionTypeEnum.COUPON.name(), promotionStatus.name(), couponVO.getStartTime(), couponVO.getEndTime());
//更新延时任务
this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR,
promotionMessage,
couponVO.getStartTime().getTime(), couponVO.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
DateUtil.getDelayTime(couponVO.getStartTime().getTime()),
rocketmqCustomProperties.getPromotionTopic());
}
return true;
}
@Override
public boolean deleteCoupon(String id) {
CouponVO couponVO = checkStatus(id);
//更新优惠券状态为关闭标示删除标志
LambdaUpdateWrapper<Coupon> couponUpdateWrapper = new LambdaUpdateWrapper<Coupon>().eq(Coupon::getId, id)
.set(Coupon::getPromotionStatus, PromotionStatusEnum.CLOSE.name()).set(Coupon::getDeleteFlag, true);
boolean result = this.update(couponUpdateWrapper);
//更新促销商品记录信息为删除
LambdaUpdateWrapper<PromotionGoods> updateWrapper = new LambdaUpdateWrapper<PromotionGoods>()
.eq(PromotionGoods::getPromotionId, id)
.set(PromotionGoods::getPromotionStatus, PromotionStatusEnum.CLOSE.name())
.set(PromotionGoods::getDeleteFlag, true);
this.promotionGoodsService.update(updateWrapper);
//删除mongo优惠券信息
LambdaUpdateWrapper<MemberCoupon> memberCouponLambdaUpdateWrapper = new LambdaUpdateWrapper<MemberCoupon>()
.eq(MemberCoupon::getCouponId, id)
.set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.CLOSED.name());
memberCouponService.update(memberCouponLambdaUpdateWrapper);
this.mongoTemplate.remove(new Query().addCriteria(Criteria.where("id").is(id)), CouponVO.class);
//删除优惠券活动关联优惠券
couponActivityItemService.remove(new LambdaQueryWrapper<CouponActivityItem>()
.eq(CouponActivityItem::getCouponId, id));
//删除延时任务
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR,
couponVO.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (PromotionTypeEnum.COUPON.name() + couponVO.getId())),
rocketmqCustomProperties.getPromotionTopic());
return result;
}
@Override
public IPage<CouponVO> getCouponsByPageFromMongo(CouponSearchParams param, PageVO page) {
Query query = param.mongoQuery();
IPage<CouponVO> coupons = new Page<>();
if (page != null) {
page.setNotConvert(true);
PromotionTools.mongoQueryPageParam(query, page);
coupons.setSize(page.getPageSize());
coupons.setCurrent(page.getPageNumber());
}
List<CouponVO> couponVOList = mongoTemplate.find(query, CouponVO.class);
coupons.setRecords(couponVOList);
coupons.setTotal(mongoTemplate.count(query, CouponVO.class));
return coupons;
}
/**
* 根据查询条件从mongo中获取优惠券信息列表
*
* @param param 查询参数
* @param page 分页参数
* @return 优惠券信息列表
*/
@Override
public IPage<CouponVO> getCanReceiveCoupons(CouponSearchParams param, PageVO page) {
Query query = param.mongoQuery();
query.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.START.name()));
query.addCriteria(Criteria.where("endTime").gte(new Date()));
IPage<CouponVO> coupons = new Page<>();
if (page != null) {
page.setNotConvert(true);
PromotionTools.mongoQueryPageParam(query, page);
coupons.setSize(page.getPageSize());
coupons.setCurrent(page.getPageNumber());
}
List<CouponVO> couponVOList = mongoTemplate.find(query, CouponVO.class);
coupons.setRecords(couponVOList);
coupons.setTotal(mongoTemplate.count(query, CouponVO.class));
return coupons;
}
@Override
public CouponVO getCouponDetailFromMongo(String id) {
return mongoTemplate.findById(id, CouponVO.class);
}
@Override
public IPage<Coupon> getCouponsByPage(CouponSearchParams param, PageVO page) {
QueryWrapper<Coupon> queryWrapper = param.wrapper();
return page(PageUtil.initPage(page), queryWrapper);
}
/** /**
* 领取优惠券 * 领取优惠券
* *
@ -264,13 +79,22 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
*/ */
@Override @Override
public void receiveCoupon(String couponId, Integer receiveNum) { public void receiveCoupon(String couponId, Integer receiveNum) {
CouponVO couponVO = this.mongoTemplate.findById(couponId, CouponVO.class); Coupon coupon = this.getById(couponId);
couponVO.setReceivedNum(couponVO.getReceivedNum() + receiveNum); if (coupon == null) {
LambdaUpdateWrapper<Coupon> updateWrapper = new LambdaUpdateWrapper<>(); throw new ServiceException(ResultCode.COUPON_NOT_EXIST);
updateWrapper.eq(Coupon::getId, couponId); }
updateWrapper.set(Coupon::getReceivedNum, couponVO.getReceivedNum()); this.update(new LambdaUpdateWrapper<Coupon>().eq(Coupon::getId, coupon.getId()).set(Coupon::getReceivedNum,
this.update(updateWrapper); coupon.getReceivedNum() + receiveNum));
this.mongoTemplate.save(couponVO); }
@Override
public boolean removePromotions(List<String> ids) {
//删除mongo优惠券信息
this.memberCouponService.closeMemberCoupon(ids);
//删除优惠券活动关联优惠券
this.couponActivityItemService.removeByCouponId(ids);
return super.removePromotions(ids);
} }
/** /**
@ -281,51 +105,148 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
*/ */
@Override @Override
public void usedCoupon(String couponId, Integer usedNum) { public void usedCoupon(String couponId, Integer usedNum) {
CouponVO couponVO = this.mongoTemplate.findById(couponId, CouponVO.class); Coupon coupon = this.getById(couponId);
couponVO.setUsedNum(couponVO.getUsedNum() + usedNum); if (coupon == null) {
LambdaUpdateWrapper<Coupon> updateWrapper = new LambdaUpdateWrapper<>(); throw new ServiceException(ResultCode.COUPON_NOT_EXIST);
updateWrapper.eq(Coupon::getId, couponId); }
updateWrapper.set(Coupon::getUsedNum, couponVO.getUsedNum());
this.update(updateWrapper); this.update(new LambdaUpdateWrapper<Coupon>().eq(Coupon::getId, coupon.getId()).set(Coupon::getUsedNum,
this.mongoTemplate.save(couponVO); coupon.getUsedNum() + usedNum));
} }
/** /**
* 检查优惠券信息是否合法 * 获取优惠券展示实体
* *
* @param coupon 优惠券信息 * @param searchParams 查询参数
* @param page 分页参数
* @return 优惠券展示实体列表
*/ */
private void checkParam(CouponVO coupon) { @Override
public IPage<CouponVO> pageVOFindAll(CouponSearchParams searchParams, PageVO page) {
IPage<Coupon> couponIPage = super.pageFindAll(searchParams, page);
List<CouponVO> couponVOList = couponIPage.getRecords().stream().map(CouponVO::new).collect(Collectors.toList());
return PageUtil.convertPage(couponIPage, couponVOList);
}
/**
* 获取优惠券展示详情
*
* @param couponId 优惠券id
* @return 返回优惠券展示详情
*/
@Override
public CouponVO getDetail(String couponId) {
CouponVO couponVO = new CouponVO(this.getById(couponId));
PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
searchParams.setPromotionId(couponId);
List<PromotionGoods> promotionsByPromotionId = this.promotionGoodsService.listFindAll(searchParams);
if (promotionsByPromotionId != null && !promotionsByPromotionId.isEmpty()) {
couponVO.setPromotionGoodsList(promotionsByPromotionId);
}
return couponVO;
}
/**
* 更新促销状态
* 如果要更新促销状态为关闭startTime和endTime置为空即可
*
* @param ids 促销id集合
* @param startTime 开始时间
* @param endTime 结束时间
* @return 是否更新成功
*/
@Override
public boolean updateStatus(List<String> ids, Long startTime, Long endTime) {
List<Coupon> list = this.list(new LambdaQueryWrapper<Coupon>().in(Coupon::getId, ids).eq(Coupon::getRangeDayType, CouponRangeDayEnum.DYNAMICTIME.name()));
if (!list.isEmpty()) {
LambdaUpdateWrapper<Coupon> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.in(Coupon::getId, list.stream().map(Coupon::getId).collect(Collectors.toList()));
updateWrapper.set(Coupon::getEffectiveDays, 0);
this.update(updateWrapper);
}
return super.updateStatus(ids, startTime, endTime);
}
@Override
public void initPromotion(Coupon promotions) {
promotions.setUsedNum(0);
promotions.setReceivedNum(0);
}
@Override
public void checkPromotions(Coupon promotions) {
if (promotions.getRangeDayType() == null) {
super.checkPromotions(promotions);
}
//优惠券限制领取数量 //优惠券限制领取数量
if (coupon.getCouponLimitNum() < 0) { if (promotions.getCouponLimitNum() < 0) {
throw new ServiceException(ResultCode.COUPON_LIMIT_NUM_LESS_THAN_0); throw new ServiceException(ResultCode.COUPON_LIMIT_NUM_LESS_THAN_0);
} }
//如果发行数量是0则判断领取限制数量 //如果发行数量是0则判断领取限制数量
if (coupon.getPublishNum() != 0 && coupon.getCouponLimitNum() > coupon.getPublishNum()) { if (promotions.getPublishNum() != 0 && promotions.getCouponLimitNum() > promotions.getPublishNum()) {
throw new ServiceException(ResultCode.COUPON_LIMIT_GREATER_THAN_PUBLISH); throw new ServiceException(ResultCode.COUPON_LIMIT_GREATER_THAN_PUBLISH);
} }
//打折优惠券大于10折 //打折优惠券大于10折
boolean discountCoupon = (coupon.getCouponType().equals(CouponTypeEnum.DISCOUNT.name()) boolean discountCoupon = (promotions.getCouponType().equals(CouponTypeEnum.DISCOUNT.name())
&& (coupon.getCouponDiscount() < 0 && coupon.getCouponDiscount() > 10)); && (promotions.getCouponDiscount() < 0 && promotions.getCouponDiscount() > 10));
if (discountCoupon) { if (discountCoupon) {
throw new ServiceException(ResultCode.COUPON_DISCOUNT_ERROR); throw new ServiceException(ResultCode.COUPON_DISCOUNT_ERROR);
} }
//优惠券为固定时间类型 //优惠券为固定时间类型
if (coupon.getRangeDayType() != null && coupon.getRangeDayType().equals(CouponRangeDayEnum.FIXEDTIME.name())) { if (promotions.getRangeDayType() != null && promotions.getRangeDayType().equals(CouponRangeDayEnum.FIXEDTIME.name())) {
long nowTime = DateUtil.getDateline() * 1000; long nowTime = DateUtil.getDateline() * 1000;
//固定时间的优惠券不能小于当前时间 //固定时间的优惠券不能小于当前时间
if (coupon.getEndTime().getTime() < nowTime) { if (promotions.getEndTime().getTime() < nowTime) {
throw new ServiceException(ResultCode.PROMOTION_END_TIME_ERROR); throw new ServiceException(ResultCode.PROMOTION_END_TIME_ERROR);
} }
//促销通用时间校验
PromotionTools.checkPromotionTime(coupon.getStartTime().getTime(), coupon.getEndTime().getTime());
} }
this.checkCouponScope(coupon);
//对状态的处理.如果未传递状态则需要 根据当前时间来确认优惠券状态 this.checkCouponScope((CouponVO) promotions);
this.promotionStatusEmpty(coupon); }
@Override
public void checkStatus(Coupon promotions) {
super.checkStatus(promotions);
FullDiscountSearchParams searchParams = new FullDiscountSearchParams();
searchParams.setIsCoupon(true);
searchParams.setCouponId(promotions.getId());
List<FullDiscount> fullDiscounts = fullDiscountService.listFindAll(searchParams);
if (fullDiscounts != null && !fullDiscounts.isEmpty()) {
throw new ServiceException("当前优惠券参与了促销活动【" + fullDiscounts.get(0).getPromotionName() + "】不能进行编辑删除操作");
}
}
@Override
public void updatePromotionsGoods(Coupon promotions) {
super.updatePromotionsGoods(promotions);
if (!PromotionsStatusEnum.CLOSE.name().equals(promotions.getPromotionStatus()) &&
PromotionsScopeTypeEnum.PORTION_GOODS.name().equals(promotions.getScopeType()) &&
promotions instanceof CouponVO) {
CouponVO couponVO = (CouponVO) promotions;
this.promotionGoodsService.deletePromotionGoods(Collections.singletonList(promotions.getId()));
List<PromotionGoods> promotionGoodsList = PromotionTools.promotionGoodsInit(couponVO.getPromotionGoodsList(), couponVO, this.getPromotionType());
//促销活动商品更新
this.promotionGoodsService.saveBatch(promotionGoodsList);
}
}
/**
* 更新商品索引优惠券信息
*
* @param promotions 优惠券信息
*/
@Override
public void updateEsGoodsIndex(Coupon promotions) {
Coupon coupon = JSONUtil.parse(promotions).toBean(Coupon.class);
super.updateEsGoodsIndex(coupon);
}
@Override
public PromotionTypeEnum getPromotionType() {
return PromotionTypeEnum.COUPON;
} }
/** /**
@ -334,19 +255,29 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
* @param coupon 检查的优惠券对象 * @param coupon 检查的优惠券对象
*/ */
private void checkCouponScope(CouponVO coupon) { private void checkCouponScope(CouponVO coupon) {
boolean portionGoodsScope = (coupon.getScopeType().equals(CouponScopeTypeEnum.PORTION_GOODS.name()) boolean portionGoodsScope = (coupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS.name())
&& (coupon.getPromotionGoodsList() == null || coupon.getPromotionGoodsList().isEmpty())); && (coupon.getPromotionGoodsList() == null || coupon.getPromotionGoodsList().isEmpty()));
if (portionGoodsScope) { if (portionGoodsScope) {
throw new ServiceException(ResultCode.COUPON_SCOPE_TYPE_GOODS_ERROR); throw new ServiceException(ResultCode.COUPON_SCOPE_TYPE_GOODS_ERROR);
} else if (coupon.getScopeType().equals(CouponScopeTypeEnum.PORTION_GOODS.name()) && CharSequenceUtil.isEmpty(coupon.getScopeId())) { } else if (coupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS.name()) && CharSequenceUtil.isEmpty(coupon.getScopeId())) {
throw new ServiceException(ResultCode.COUPON_SCOPE_TYPE_GOODS_ERROR); throw new ServiceException(ResultCode.COUPON_SCOPE_TYPE_GOODS_ERROR);
} else if (coupon.getScopeType().equals(CouponScopeTypeEnum.PORTION_GOODS_CATEGORY.name()) && CharSequenceUtil.isEmpty(coupon.getScopeId())) { } else if (coupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS_CATEGORY.name()) && CharSequenceUtil.isEmpty(coupon.getScopeId())) {
throw new ServiceException(ResultCode.COUPON_SCOPE_TYPE_CATEGORY_ERROR); throw new ServiceException(ResultCode.COUPON_SCOPE_TYPE_CATEGORY_ERROR);
} else if (coupon.getScopeType().equals(CouponScopeTypeEnum.PORTION_SHOP_CATEGORY.name()) && CharSequenceUtil.isEmpty(coupon.getScopeId())) { } else if (coupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_SHOP_CATEGORY.name()) && CharSequenceUtil.isEmpty(coupon.getScopeId())) {
throw new ServiceException(ResultCode.COUPON_SCOPE_TYPE_STORE_ERROR); throw new ServiceException(ResultCode.COUPON_SCOPE_TYPE_STORE_ERROR);
} }
if (coupon.getScopeType().equals(CouponScopeTypeEnum.PORTION_GOODS.name())) { if (coupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS.name())) {
this.checkCouponPortionGoods(coupon);
}
}
/**
* 检查指定商品
*
* @param coupon 优惠券信息
*/
private void checkCouponPortionGoods(CouponVO coupon) {
String[] split = coupon.getScopeId().split(","); String[] split = coupon.getScopeId().split(",");
if (split.length <= 0) { if (split.length <= 0) {
throw new ServiceException(ResultCode.COUPON_SCOPE_ERROR); throw new ServiceException(ResultCode.COUPON_SCOPE_ERROR);
@ -358,59 +289,5 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
} }
} }
} }
}
/**
* 对状态的处理.如果未传递状态则需要 根据当前时间来确认优惠券状态
*
* @param coupon 优惠券参数
*/
private void promotionStatusEmpty(CouponVO coupon) {
if (StringUtils.isEmpty(coupon.getPromotionStatus()) && coupon.getRangeDayType().equals(CouponRangeDayEnum.FIXEDTIME.name())) {
//格式时间
long startTme = coupon.getStartTime().getTime() / 1000;
long endTime = coupon.getEndTime().getTime() / 1000;
//校验时间确定当前优惠券有效期
long currentTime = DateUtil.getDateline();
//如果未到时间点则为新建
if (startTme > currentTime) {
coupon.setPromotionStatus(PromotionStatusEnum.NEW.name());
}
//如果超过结束时间则为结束
if (endTime < currentTime) {
coupon.setPromotionStatus(PromotionStatusEnum.END.name());
}
//如果在使用时间内 则是开始状态
if (startTme <= currentTime && endTime > currentTime) {
coupon.setPromotionStatus(PromotionStatusEnum.START.name());
}
}
}
/**
* 检查优惠券状态是否可进行编辑删除
*
* @param id 优惠券id
* @return 优惠券信息
*/
private CouponVO checkStatus(String id) {
CouponVO coupon = this.mongoTemplate.findById(id, CouponVO.class);
if (coupon == null) {
throw new ServiceException(ResultCode.COUPON_NOT_EXIST);
}
LambdaQueryWrapper<FullDiscount> queryWrapper = new LambdaQueryWrapper<FullDiscount>().eq(FullDiscount::getIsCoupon, true).eq(FullDiscount::getCouponId, id);
FullDiscount fullDiscount = fullDiscountService.getOne(queryWrapper);
if (fullDiscount != null) {
throw new ServiceException("当前优惠券参与了促销活动【" + fullDiscount.getPromotionName() + "】不能进行编辑删除操作");
}
return coupon;
}
private void updateScopePromotionGoods(CouponVO couponVO) {
//如果优惠券类型为部分商品则将促销活动更新至ES中
if (CouponScopeTypeEnum.PORTION_GOODS.name().equals(couponVO.getScopeType()) && !couponVO.getPromotionGoodsList().isEmpty()) {
PromotionTools.promotionGoodsInit(couponVO.getPromotionGoodsList(), couponVO, PromotionTypeEnum.COUPON);
}
}
} }

View File

@ -1,40 +1,28 @@
package cn.lili.modules.promotion.serviceimpl; package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.PromotionTypeEnum; 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.properties.RocketmqCustomProperties;
import cn.lili.common.utils.DateUtil;
import cn.lili.common.vo.PageVO;
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.Coupon; import cn.lili.modules.promotion.entity.dos.Coupon;
import cn.lili.modules.promotion.entity.dos.FullDiscount; import cn.lili.modules.promotion.entity.dos.FullDiscount;
import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import cn.lili.modules.promotion.entity.vos.FullDiscountSearchParams; import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams;
import cn.lili.modules.promotion.mapper.FullDiscountMapper; import cn.lili.modules.promotion.mapper.FullDiscountMapper;
import cn.lili.modules.promotion.service.CouponService; import cn.lili.modules.promotion.service.CouponService;
import cn.lili.modules.promotion.service.FullDiscountService; import cn.lili.modules.promotion.service.FullDiscountService;
import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.promotion.service.PromotionGoodsService;
import cn.lili.modules.promotion.tools.PromotionTools; import cn.lili.modules.promotion.tools.PromotionTools;
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.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
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.ArrayList;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -46,26 +34,8 @@ import java.util.List;
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public class FullDiscountServiceImpl extends ServiceImpl<FullDiscountMapper, FullDiscount> implements FullDiscountService { public class FullDiscountServiceImpl extends AbstractPromotionsServiceImpl<FullDiscountMapper, FullDiscount> implements FullDiscountService {
private static final String SELLER_ID_COLUMN = "storeId";
private static final String PROMOTION_STATUS_COLUMN = "promotionStatus";
/**
* 延时任务
*/
@Autowired
private TimeTrigger timeTrigger;
/**
* Mongo
*/
@Autowired
private MongoTemplate mongoTemplate;
/**
* Rocketmq
*/
@Autowired
private RocketmqCustomProperties rocketmqCustomProperties;
/** /**
* 优惠券 * 优惠券
*/ */
@ -79,95 +49,21 @@ public class FullDiscountServiceImpl extends ServiceImpl<FullDiscountMapper, Ful
@Override @Override
public List<FullDiscountVO> currentPromotion(List<String> storeId) { public List<FullDiscountVO> currentPromotion(List<String> storeId) {
Query query = this.getMongoQuery(); List<FullDiscountVO> result = new ArrayList<>();
query.addCriteria(Criteria.where(SELLER_ID_COLUMN).in(storeId)); QueryWrapper<FullDiscount> queryWrapper = new QueryWrapper<>();
return mongoTemplate.find(query, FullDiscountVO.class); queryWrapper.in(storeId != null && !storeId.isEmpty(), "store_id", storeId);
queryWrapper.and(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START));
List<FullDiscount> list = this.list(queryWrapper);
if (list != null) {
for (FullDiscount fullDiscount : list) {
PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
searchParams.setPromotionId(fullDiscount.getId());
FullDiscountVO fullDiscountVO = new FullDiscountVO(fullDiscount);
fullDiscountVO.setPromotionGoodsList(promotionGoodsService.listFindAll(searchParams));
result.add(fullDiscountVO);
} }
@Override
public FullDiscount addFullDiscount(FullDiscountVO fullDiscountVO) {
//验证是否是有效参数
PromotionTools.paramValid(fullDiscountVO.getStartTime().getTime(), fullDiscountVO.getEndTime().getTime(), fullDiscountVO.getNumber(), fullDiscountVO.getPromotionGoodsList());
//当前时间段是否存在同类活动
this.checkSameActiveExist(fullDiscountVO.getStartTime(), fullDiscountVO.getEndTime(), fullDiscountVO.getStoreId(), null);
//检查满减参数
this.checkFullDiscount(fullDiscountVO);
//保存到MYSQL中
this.save(fullDiscountVO);
if (fullDiscountVO.getPromotionGoodsList() != null) {
List<PromotionGoods> promotionGoodsList = PromotionTools.promotionGoodsInit(fullDiscountVO.getPromotionGoodsList(), fullDiscountVO, PromotionTypeEnum.FULL_DISCOUNT);
//促销活动商品更新
this.promotionGoodsService.saveOrUpdateBatch(promotionGoodsList);
} }
//保存到MONGO中 return result;
this.mongoTemplate.save(fullDiscountVO);
PromotionMessage promotionMessage = new PromotionMessage(fullDiscountVO.getId(), PromotionTypeEnum.FULL_DISCOUNT.name(),
PromotionStatusEnum.START.name(),
fullDiscountVO.getStartTime(), fullDiscountVO.getEndTime());
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR,
fullDiscountVO.getStartTime().getTime(), promotionMessage,
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
rocketmqCustomProperties.getPromotionTopic());
//发送促销活动开始的延时任务
this.timeTrigger.addDelay(timeTriggerMsg);
return fullDiscountVO;
}
@Override
public IPage<FullDiscount> getFullDiscountByPageFromMysql(FullDiscountSearchParams searchParams, PageVO page) {
QueryWrapper<FullDiscount> queryWrapper = searchParams.wrapper();
return this.page(PageUtil.initPage(page), queryWrapper);
}
@Override
public IPage<FullDiscountVO> getFullDiscountByPageFromMongo(FullDiscountSearchParams searchParams, PageVO page) {
IPage<FullDiscountVO> fullDiscountPage = new Page<>();
Query query = searchParams.mongoQuery();
if (page != null) {
PromotionTools.mongoQueryPageParam(query, page);
fullDiscountPage.setCurrent(page.getPageNumber());
fullDiscountPage.setSize(page.getPageSize());
}
List<FullDiscountVO> fullDiscountVOS = this.mongoTemplate.find(query, FullDiscountVO.class);
fullDiscountPage.setRecords(fullDiscountVOS);
fullDiscountPage.setTotal(this.mongoTemplate.count(query, FullDiscountVO.class));
return fullDiscountPage;
}
@Override
public FullDiscountVO modifyFullDiscount(FullDiscountVO fullDiscountVO) {
//检查满优惠活动是否存在
FullDiscountVO fullDiscount = this.checkFullDiscountExist(fullDiscountVO.getId());
if (!fullDiscount.getPromotionStatus().equals(PromotionStatusEnum.NEW.name())) {
throw new ServiceException(ResultCode.FULL_DISCOUNT_MODIFY_ERROR);
}
//检查活动是否已经开始
PromotionTools.checkPromotionTime(fullDiscountVO.getStartTime().getTime(), fullDiscountVO.getEndTime().getTime());
//检查满减参数
this.checkFullDiscount(fullDiscountVO);
//时间发生变化
if (!fullDiscount.getStartTime().equals(fullDiscountVO.getStartTime()) && fullDiscount.getEndTime().equals(fullDiscountVO.getEndTime())) {
//检查当前时间段是否存在同类活动
this.checkSameActiveExist(fullDiscountVO.getStartTime(), fullDiscountVO.getEndTime(), fullDiscountVO.getStoreId(), fullDiscount.getId());
}
//更新到MYSQL中
this.updateById(fullDiscountVO);
if (fullDiscountVO.getPromotionGoodsList() != null) {
//促销活动商品更新
this.promotionGoodsService.updateBatchById(PromotionTools.promotionGoodsInit(fullDiscountVO.getPromotionGoodsList(), fullDiscountVO, PromotionTypeEnum.FULL_DISCOUNT));
}
//保存到MONGO中
this.mongoTemplate.save(fullDiscountVO);
PromotionMessage promotionMessage = new PromotionMessage(fullDiscountVO.getId(), PromotionTypeEnum.FULL_DISCOUNT.name(), PromotionStatusEnum.START.name(), fullDiscountVO.getStartTime(), fullDiscountVO.getEndTime());
//发送更新延时任务
this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR, promotionMessage,
fullDiscount.getStartTime().getTime(), fullDiscountVO.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
DateUtil.getDelayTime(fullDiscountVO.getStartTime().getTime()),
rocketmqCustomProperties.getPromotionTopic());
return fullDiscountVO;
} }
/** /**
@ -178,64 +74,74 @@ public class FullDiscountServiceImpl extends ServiceImpl<FullDiscountMapper, Ful
*/ */
@Override @Override
public FullDiscountVO getFullDiscount(String id) { public FullDiscountVO getFullDiscount(String id) {
return this.checkFullDiscountExist(id); FullDiscount fullDiscount = this.checkFullDiscountExist(id);
FullDiscountVO fullDiscountVO = new FullDiscountVO(fullDiscount);
PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
searchParams.setPromotionId(fullDiscount.getId());
fullDiscountVO.setPromotionGoodsList(promotionGoodsService.listFindAll(searchParams));
return fullDiscountVO;
} }
/**
* 检查促销参数
*
* @param promotions 促销实体
*/
@Override @Override
public boolean deleteFullDiscount(String id) { public void checkPromotions(FullDiscount promotions) {
FullDiscountVO fullDiscount = this.checkFullDiscountExist(id); super.checkPromotions(promotions);
//检查活动是否已经开始 if (promotions instanceof FullDiscountVO) {
boolean result = this.removeById(id); FullDiscountVO fullDiscountVO = (FullDiscountVO) promotions;
this.mongoTemplate.remove(new Query().addCriteria(Criteria.where("id").is(id)), FullDiscountVO.class);
if (fullDiscount.getPromotionGoodsList() != null && !fullDiscount.getPromotionGoodsList().isEmpty()) {
this.promotionGoodsService.removePromotionGoods(fullDiscount.getPromotionGoodsList(), PromotionTypeEnum.FULL_DISCOUNT);
}
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, fullDiscount.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (PromotionTypeEnum.FULL_DISCOUNT.name() + fullDiscount.getId())),
rocketmqCustomProperties.getPromotionTopic());
return result;
}
@Override
public boolean updateFullDiscountStatus(String id, PromotionStatusEnum promotionStatus) {
Query query = new Query();
query.addCriteria(Criteria.where("id").is(id));
List<FullDiscountVO> fullDiscountVOList = this.mongoTemplate.find(query, FullDiscountVO.class);
//判断满额活动是否为空
if (fullDiscountVOList.isEmpty() || fullDiscountVOList == null) {
throw new ServiceException(ResultCode.FULL_DISCOUNT_NOT_EXIST_ERROR);
}
FullDiscountVO fullDiscountVO = fullDiscountVOList.get(0);
//如果是开启活动则需要校验参数
if (promotionStatus.equals(PromotionStatusEnum.START)) {
//验证是否是有效参数 //验证是否是有效参数
PromotionTools.paramValid(fullDiscountVO.getStartTime().getTime(), fullDiscountVO.getEndTime().getTime(), fullDiscountVO.getNumber(), fullDiscountVO.getPromotionGoodsList()); PromotionTools.paramValid(fullDiscountVO.getStartTime(), fullDiscountVO.getEndTime(), fullDiscountVO.getNumber(), fullDiscountVO.getPromotionGoodsList());
//当前时间段是否存在同类活动
this.checkSameActiveExist(fullDiscountVO.getStartTime(), fullDiscountVO.getEndTime(), fullDiscountVO.getStoreId(), null);
//检查满减参数
this.checkFullDiscount(fullDiscountVO);
} }
//填写活动状态 //当前时间段是否存在同类活动
fullDiscountVO.setPromotionStatus(promotionStatus.name()); this.checkSameActiveExist(promotions.getStartTime(), promotions.getEndTime(), promotions.getStoreId(), promotions.getId());
//检查满减参数
this.checkFullDiscount(promotions);
//保存到MYSQL中 }
this.updateById(fullDiscountVO);
//添加促销消息 /**
PromotionMessage promotionMessage = new PromotionMessage(fullDiscountVO.getId(), PromotionTypeEnum.FULL_DISCOUNT.name(), * 更新促销商品信息
promotionStatus.name(), *
fullDiscountVO.getStartTime(), fullDiscountVO.getEndTime()); * @param promotions 促销实体
//添加延时任务 */
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, @Override
fullDiscountVO.getStartTime().getTime(), promotionMessage, public void updatePromotionsGoods(FullDiscount promotions) {
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), super.updatePromotionsGoods(promotions);
rocketmqCustomProperties.getPromotionTopic()); if (!PromotionsStatusEnum.CLOSE.name().equals(promotions.getPromotionStatus())
//发送促销活动开始的延时任务 && PromotionsScopeTypeEnum.PORTION_GOODS.name().equals(promotions.getScopeType())
this.timeTrigger.addDelay(timeTriggerMsg); && promotions instanceof FullDiscountVO) {
return true; FullDiscountVO fullDiscountVO = (FullDiscountVO) promotions;
List<PromotionGoods> promotionGoodsList = PromotionTools.promotionGoodsInit(fullDiscountVO.getPromotionGoodsList(), fullDiscountVO, PromotionTypeEnum.FULL_DISCOUNT);
this.promotionGoodsService.deletePromotionGoods(Collections.singletonList(promotions.getId()));
//促销活动商品更新
this.promotionGoodsService.saveBatch(promotionGoodsList);
}
}
/**
* 更新促销信息到商品索引
*
* @param promotions 促销实体
*/
@Override
public void updateEsGoodsIndex(FullDiscount promotions) {
FullDiscount fullDiscount = JSONUtil.parse(promotions).toBean(FullDiscount.class);
super.updateEsGoodsIndex(fullDiscount);
}
/**
* 当前促销类型
*
* @return 当前促销类型
*/
@Override
public PromotionTypeEnum getPromotionType() {
return PromotionTypeEnum.FULL_DISCOUNT;
} }
/** /**
@ -244,48 +150,49 @@ public class FullDiscountServiceImpl extends ServiceImpl<FullDiscountMapper, Ful
* @param id 满优惠活动id * @param id 满优惠活动id
* @return 满优惠活动 * @return 满优惠活动
*/ */
private FullDiscountVO checkFullDiscountExist(String id) { private FullDiscount checkFullDiscountExist(String id) {
FullDiscountVO fullDiscountVO = mongoTemplate.findById(id, FullDiscountVO.class); FullDiscount fullDiscount = this.getById(id);
if (fullDiscountVO == null) { if (fullDiscount == null) {
throw new ServiceException(ResultCode.FULL_DISCOUNT_NOT_EXIST_ERROR); throw new ServiceException(ResultCode.FULL_DISCOUNT_NOT_EXIST_ERROR);
} }
return fullDiscountVO; return fullDiscount;
} }
/** /**
* 检查满减参数 * 检查满减参数
* *
* @param fullDiscountVO 满减参数信息 * @param fullDiscount 满减参数信息
*/ */
private void checkFullDiscount(FullDiscountVO fullDiscountVO) { private void checkFullDiscount(FullDiscount fullDiscount) {
if (fullDiscountVO.getIsFullMinus() == null && fullDiscountVO.getIsCoupon() == null && fullDiscountVO.getIsGift() == null && fullDiscountVO.getIsPoint() == null && fullDiscountVO.getIsFullRate() == null) { if (fullDiscount.getIsFullMinus() == null && fullDiscount.getIsCoupon() == null && fullDiscount.getIsGift() == null
&& fullDiscount.getIsPoint() == null && fullDiscount.getIsFullRate() == null) {
throw new ServiceException(ResultCode.FULL_DISCOUNT_WAY_ERROR); throw new ServiceException(ResultCode.FULL_DISCOUNT_WAY_ERROR);
} }
//如果优惠方式是满减 //如果优惠方式是满减
if (Boolean.TRUE.equals(fullDiscountVO.getIsFullMinus())) { if (Boolean.TRUE.equals(fullDiscount.getIsFullMinus())) {
this.checkFullMinus(fullDiscountVO.getFullMinus(), fullDiscountVO.getFullMoney()); this.checkFullMinus(fullDiscount.getFullMinus(), fullDiscount.getFullMoney());
fullDiscountVO.setTitle("" + fullDiscountVO.getFullMoney() + "" + fullDiscountVO.getFullMinus()); fullDiscount.setTitle("" + fullDiscount.getFullMoney() + "" + fullDiscount.getFullMinus());
} }
//如果优惠方式是赠品 //如果优惠方式是赠品
if (Boolean.TRUE.equals(fullDiscountVO.getIsGift())) { if (Boolean.TRUE.equals(fullDiscount.getIsGift())) {
//是否没有选择赠品 //是否没有选择赠品
boolean noGiftSelected = fullDiscountVO.getGiftId() == null; boolean noGiftSelected = fullDiscount.getGiftId() == null;
if (noGiftSelected) { if (noGiftSelected) {
throw new ServiceException(ResultCode.FULL_DISCOUNT_GIFT_ERROR); throw new ServiceException(ResultCode.FULL_DISCOUNT_GIFT_ERROR);
} }
} else { } else {
fullDiscountVO.setGiftId(null); fullDiscount.setGiftId(null);
} }
//如果优惠方式是赠优惠券 //如果优惠方式是赠优惠券
if (Boolean.TRUE.equals(fullDiscountVO.getIsCoupon())) { if (Boolean.TRUE.equals(fullDiscount.getIsCoupon())) {
this.checkCoupon(fullDiscountVO.getCouponId()); this.checkCoupon(fullDiscount.getCouponId());
} else { } else {
fullDiscountVO.setCouponId(null); fullDiscount.setCouponId(null);
} }
//如果优惠方式是折扣 //如果优惠方式是折扣
if (Boolean.TRUE.equals(fullDiscountVO.getIsFullRate())) { if (Boolean.TRUE.equals(fullDiscount.getIsFullRate())) {
this.checkFullRate(fullDiscountVO.getFullRate()); this.checkFullRate(fullDiscount.getFullRate());
fullDiscountVO.setTitle("" + fullDiscountVO.getFullMoney() + "" + fullDiscountVO.getFullRate() + ""); fullDiscount.setTitle("" + fullDiscount.getFullMoney() + "" + fullDiscount.getFullRate() + "");
} }
} }
@ -301,7 +208,7 @@ public class FullDiscountServiceImpl extends ServiceImpl<FullDiscountMapper, Ful
private void checkSameActiveExist(Date statTime, Date endTime, String storeId, String id) { private void checkSameActiveExist(Date statTime, Date endTime, String storeId, String id) {
//同一时间段内相同的活动 //同一时间段内相同的活动
QueryWrapper<FullDiscount> queryWrapper = PromotionTools.checkActiveTime(statTime, endTime, PromotionTypeEnum.FULL_DISCOUNT, storeId, id); QueryWrapper<FullDiscount> queryWrapper = PromotionTools.checkActiveTime(statTime, endTime, PromotionTypeEnum.FULL_DISCOUNT, storeId, id);
Integer sameNum = this.count(queryWrapper); long sameNum = this.count(queryWrapper);
if (sameNum > 0) { if (sameNum > 0) {
throw new ServiceException(ResultCode.PROMOTION_SAME_ACTIVE_EXIST); throw new ServiceException(ResultCode.PROMOTION_SAME_ACTIVE_EXIST);
} }
@ -357,18 +264,4 @@ public class FullDiscountServiceImpl extends ServiceImpl<FullDiscountMapper, Ful
throw new ServiceException(ResultCode.FULL_RATE_NUM_ERROR); throw new ServiceException(ResultCode.FULL_RATE_NUM_ERROR);
} }
} }
/**
* 通用有效的满优惠活动mongo查询
*
* @return mongo查询对象
*/
private Query getMongoQuery() {
Query query = new Query();
Date now = new Date();
query.addCriteria(Criteria.where(PROMOTION_STATUS_COLUMN).is(PromotionStatusEnum.START.name()));
query.addCriteria(Criteria.where("startTime").lte(now));
query.addCriteria(Criteria.where("endTime").gte(now));
return query;
}
} }

View File

@ -1,41 +1,32 @@
package cn.lili.modules.promotion.serviceimpl; package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.core.util.StrUtil; 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.properties.RocketmqCustomProperties;
import cn.lili.common.utils.DateUtil;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum;
import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods; import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods;
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO; import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO;
import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsOperationDTO; import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsOperationDTO;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams;
import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsListVO; import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsListVO;
import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsParams; import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsParams;
import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsVO; import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsVO;
import cn.lili.modules.promotion.mapper.KanJiaActivityGoodsMapper; import cn.lili.modules.promotion.mapper.KanJiaActivityGoodsMapper;
import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; import cn.lili.modules.promotion.service.KanjiaActivityGoodsService;
import cn.lili.modules.promotion.service.PromotionGoodsService;
import cn.lili.modules.promotion.tools.PromotionTools; import cn.lili.modules.promotion.tools.PromotionTools;
import cn.lili.mybatis.util.PageUtil; import cn.lili.mybatis.util.PageUtil;
import cn.lili.trigger.enums.DelayTypeEnums; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
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;
@ -46,7 +37,7 @@ import java.util.List;
* 砍价业务层实现 * 砍价业务层实现
* *
* @author qiuqiu * @author qiuqiu
* @date 2021/7/1 * @since 2021/7/1
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ -58,98 +49,47 @@ public class KanjiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
@Autowired @Autowired
private GoodsSkuService goodsSkuService; private GoodsSkuService goodsSkuService;
/**
* Rocketmq
*/
@Autowired @Autowired
private RocketmqCustomProperties rocketmqCustomProperties; private PromotionGoodsService promotionGoodsService;
/**
* 延时任务
*/
@Autowired
private TimeTrigger timeTrigger;
/**
* Mongo
*/
@Autowired
private MongoTemplate mongoTemplate;
@Override @Override
public Boolean add(KanjiaActivityGoodsOperationDTO kanJiaActivityGoodsOperationDTO) { public Boolean add(KanjiaActivityGoodsOperationDTO kanJiaActivityGoodsOperationDTO) {
List<KanjiaActivityGoods> kanjiaActivityGoodsList = new ArrayList<>(); List<KanjiaActivityGoods> kanjiaActivityGoodsList = new ArrayList<>();
List<PromotionGoods> promotionGoodsList = new ArrayList<>();
for (KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO : kanJiaActivityGoodsOperationDTO.getPromotionGoodsList()) { for (KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO : kanJiaActivityGoodsOperationDTO.getPromotionGoodsList()) {
//根据skuId查询商品信息 //根据skuId查询商品信息
GoodsSku goodsSku = this.checkSkuExist(kanJiaActivityGoodsDTO.getSkuId()); GoodsSku goodsSku = this.checkSkuExist(kanJiaActivityGoodsDTO.getSkuId());
//参数检测 //参数检测
this.checkParam(kanJiaActivityGoodsDTO, goodsSku); this.checkParam(kanJiaActivityGoodsDTO, goodsSku);
//检测同一时间段是否存在相同的商品 //检测同一时间段是否存在相同的商品
PromotionTools.checkPromotionTime(kanJiaActivityGoodsOperationDTO.getStartTime().getTime(), kanJiaActivityGoodsOperationDTO.getEndTime().getTime()); PromotionTools.checkPromotionTime(kanJiaActivityGoodsOperationDTO.getStartTime(), kanJiaActivityGoodsOperationDTO.getEndTime());
kanJiaActivityGoodsDTO.setStartTime(kanJiaActivityGoodsOperationDTO.getStartTime()); kanJiaActivityGoodsDTO.setStartTime(kanJiaActivityGoodsOperationDTO.getStartTime());
kanJiaActivityGoodsDTO.setEndTime(kanJiaActivityGoodsOperationDTO.getEndTime()); kanJiaActivityGoodsDTO.setEndTime(kanJiaActivityGoodsOperationDTO.getEndTime());
//检测同一时间段不能允许添加相同的商品 //检测同一时间段不能允许添加相同的商品
if (this.checkSkuDuplicate(goodsSku.getId(), kanJiaActivityGoodsDTO) != null) { if (this.checkSkuDuplicate(goodsSku.getId(), kanJiaActivityGoodsDTO) != null) {
throw new ServiceException("商品id为" + goodsSku.getId() + "的商品已参加砍价商品活动!"); throw new ServiceException("商品id为" + goodsSku.getId() + "的商品已参加砍价商品活动!");
} }
kanJiaActivityGoodsDTO.setGoodsSku(goodsSku);
kanJiaActivityGoodsDTO.setSkuId(kanJiaActivityGoodsDTO.getSkuId()); kanJiaActivityGoodsDTO.setSkuId(kanJiaActivityGoodsDTO.getSkuId());
kanJiaActivityGoodsDTO.setThumbnail(goodsSku.getThumbnail()); kanJiaActivityGoodsDTO.setThumbnail(goodsSku.getThumbnail());
kanJiaActivityGoodsDTO.setGoodsName(goodsSku.getGoodsName()); kanJiaActivityGoodsDTO.setGoodsName(goodsSku.getGoodsName());
kanJiaActivityGoodsDTO.setPromotionStatus(PromotionStatusEnum.NEW.name()); kanJiaActivityGoodsDTO.setOriginalPrice(goodsSku.getPrice());
kanJiaActivityGoodsDTO.setOriginalPrice(kanJiaActivityGoodsDTO.getGoodsSku().getPrice());
kanjiaActivityGoodsList.add(kanJiaActivityGoodsDTO); kanjiaActivityGoodsList.add(kanJiaActivityGoodsDTO);
promotionGoodsList.add(new PromotionGoods(kanJiaActivityGoodsDTO));
} }
Boolean result = this.saveBatch(kanjiaActivityGoodsList); this.promotionGoodsService.saveBatch(promotionGoodsList);
if (result) { return this.saveBatch(kanjiaActivityGoodsList);
//发送砍价延迟任务消息
for (KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO : kanJiaActivityGoodsOperationDTO.getPromotionGoodsList()) {
this.mongoTemplate.save(kanJiaActivityGoodsDTO);
this.addKanJiaGoodsPromotionTask(kanJiaActivityGoodsDTO);
}
}
return result;
} }
/**
* 添加砍价商品mq任务
*
* @param kanJiaActivityGoods 砍价商品信息
*/
private void addKanJiaGoodsPromotionTask(KanjiaActivityGoodsDTO kanJiaActivityGoods) {
PromotionMessage promotionMessage = new PromotionMessage(kanJiaActivityGoods.getId(), PromotionTypeEnum.KANJIA.name(),
PromotionStatusEnum.START.name(),
kanJiaActivityGoods.getStartTime(), kanJiaActivityGoods.getEndTime());
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR,
promotionMessage.getStartTime().getTime(),
promotionMessage,
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
rocketmqCustomProperties.getPromotionTopic());
//发送促销活动开始的延时任务
this.timeTrigger.addDelay(timeTriggerMsg);
}
@Override @Override
public IPage<KanjiaActivityGoodsDTO> getForPage(KanjiaActivityGoodsParams kanJiaActivityGoodsParams, PageVO pageVO) { public IPage<KanjiaActivityGoods> getForPage(KanjiaActivityGoodsParams kanJiaActivityGoodsParams, PageVO pageVO) {
IPage<KanjiaActivityGoodsDTO> kanJiaActivityGoodsDTOIPage = new Page<>(); return this.page(PageUtil.initPage(pageVO), kanJiaActivityGoodsParams.wrapper());
Query query = kanJiaActivityGoodsParams.mongoQuery();
if (pageVO != null) {
PromotionTools.mongoQueryPageParam(query, pageVO);
kanJiaActivityGoodsDTOIPage.setSize(pageVO.getPageSize());
kanJiaActivityGoodsDTOIPage.setCurrent(pageVO.getPageNumber());
}
List<KanjiaActivityGoodsDTO> kanJiaActivityGoodsDTOS = this.mongoTemplate.find(query, KanjiaActivityGoodsDTO.class);
kanJiaActivityGoodsDTOIPage.setRecords(kanJiaActivityGoodsDTOS);
kanJiaActivityGoodsDTOIPage.setTotal(this.mongoTemplate.count(kanJiaActivityGoodsParams.mongoQuery(), KanjiaActivityGoodsDTO.class));
return kanJiaActivityGoodsDTOIPage;
} }
@Override @Override
public IPage<KanjiaActivityGoodsListVO> kanjiaGoodsVOPage(KanjiaActivityGoodsParams kanjiaActivityGoodsParams, PageVO pageVO) { public IPage<KanjiaActivityGoodsListVO> kanjiaGoodsVOPage(KanjiaActivityGoodsParams kanjiaActivityGoodsParams, PageVO pageVO) {
return this.baseMapper.kanjiaActivityGoodsVOPage(PageUtil.initPage(pageVO),kanjiaActivityGoodsParams.wrapper()); return this.baseMapper.kanjiaActivityGoodsVOPage(PageUtil.initPage(pageVO), kanjiaActivityGoodsParams.wrapper());
} }
@ -217,16 +157,22 @@ public class KanjiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
* @return 积分商品信息 * @return 积分商品信息
*/ */
private KanjiaActivityGoods checkSkuDuplicate(String skuId, KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO) { private KanjiaActivityGoods checkSkuDuplicate(String skuId, KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO) {
LambdaQueryWrapper<KanjiaActivityGoods> queryWrapper = new LambdaQueryWrapper<>(); QueryWrapper<KanjiaActivityGoods> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(KanjiaActivityGoods::getSkuId, skuId); queryWrapper.eq("sku_id", skuId);
if (kanJiaActivityGoodsDTO != null && StrUtil.isNotEmpty(kanJiaActivityGoodsDTO.getId())) { if (kanJiaActivityGoodsDTO != null && CharSequenceUtil.isNotEmpty(kanJiaActivityGoodsDTO.getId())) {
queryWrapper.ne(KanjiaActivityGoods::getId, kanJiaActivityGoodsDTO.getId()); queryWrapper.ne("id", kanJiaActivityGoodsDTO.getId());
} }
queryWrapper.ne(KanjiaActivityGoods::getPromotionStatus, PromotionStatusEnum.END.name()); queryWrapper.and(i -> i
.or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START))
.or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.NEW)));
queryWrapper.ge(KanjiaActivityGoods::getStartTime, kanJiaActivityGoodsDTO.getStartTime()); if (kanJiaActivityGoodsDTO != null && kanJiaActivityGoodsDTO.getStartTime() != null) {
queryWrapper.ge("start_time", kanJiaActivityGoodsDTO.getStartTime());
}
queryWrapper.le(KanjiaActivityGoods::getEndTime, kanJiaActivityGoodsDTO.getEndTime()); if (kanJiaActivityGoodsDTO != null && kanJiaActivityGoodsDTO.getEndTime() != null) {
queryWrapper.le("end_time", kanJiaActivityGoodsDTO.getEndTime());
}
return this.getOne(queryWrapper); return this.getOne(queryWrapper);
@ -234,22 +180,27 @@ public class KanjiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
@Override @Override
public KanjiaActivityGoodsDTO getKanjiaGoodsDetail(String goodsId) { public KanjiaActivityGoodsDTO getKanjiaGoodsDetail(String goodsId) {
KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO = this.mongoTemplate.findById(goodsId, KanjiaActivityGoodsDTO.class); KanjiaActivityGoods kanjiaActivityGoods = this.getById(goodsId);
if (kanJiaActivityGoodsDTO == null) { if (kanjiaActivityGoods == null) {
log.error("id为" + goodsId + "的砍价商品不存在!"); log.error("id为" + goodsId + "的砍价商品不存在!");
throw new ServiceException(); throw new ServiceException();
} }
return kanJiaActivityGoodsDTO; KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO = new KanjiaActivityGoodsDTO();
BeanUtils.copyProperties(kanjiaActivityGoods, kanjiaActivityGoodsDTO);
GoodsSku goodsSku = this.goodsSkuService.getGoodsSkuByIdFromCache(kanjiaActivityGoods.getSkuId());
if (goodsSku != null) {
kanjiaActivityGoodsDTO.setGoodsSku(goodsSku);
}
return kanjiaActivityGoodsDTO;
} }
@Override @Override
public KanjiaActivityGoodsDTO getKanjiaGoodsBySkuId(String skuId) { public KanjiaActivityGoods getKanjiaGoodsBySkuId(String skuId) {
KanjiaActivityGoods kanjiaActivityGoods = this.getOne(new QueryWrapper<KanjiaActivityGoods>().eq("sku_id", skuId), false);
Query query = new Query(); if (kanjiaActivityGoods != null && PromotionsStatusEnum.START.name().equals(kanjiaActivityGoods.getPromotionStatus())) {
query.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.START.name())); return kanjiaActivityGoods;
query.addCriteria(Criteria.where("skuId").is(skuId)); }
List<KanjiaActivityGoodsDTO> kanjiaActivityGoodsDTOS = this.mongoTemplate.find(query, KanjiaActivityGoodsDTO.class); return null;
return kanjiaActivityGoodsDTOS.get(0);
} }
@Override @Override
@ -257,7 +208,7 @@ public class KanjiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
KanjiaActivityGoodsVO kanJiaActivityGoodsVO = new KanjiaActivityGoodsVO(); KanjiaActivityGoodsVO kanJiaActivityGoodsVO = new KanjiaActivityGoodsVO();
//获取砍价商品 //获取砍价商品
KanjiaActivityGoods kanJiaActivityGoods=this.getById(id); KanjiaActivityGoods kanJiaActivityGoods = this.getById(id);
//获取商品SKU //获取商品SKU
GoodsSku goodsSku = this.goodsSkuService.getGoodsSkuByIdFromCache(kanJiaActivityGoods.getSkuId()); GoodsSku goodsSku = this.goodsSkuService.getGoodsSkuByIdFromCache(kanJiaActivityGoods.getSkuId());
//填写活动商品价格剩余数量 //填写活动商品价格剩余数量
@ -272,9 +223,9 @@ public class KanjiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
@Override @Override
public boolean updateKanjiaActivityGoods(KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO) { public boolean updateKanjiaActivityGoods(KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO) {
//校验砍价商品是否存在 //校验砍价商品是否存在
KanjiaActivityGoodsDTO dbKanJiaActivityGoods = this.getKanjiaGoodsDetail(kanJiaActivityGoodsDTO.getId()); KanjiaActivityGoods dbKanJiaActivityGoods = this.getKanjiaGoodsDetail(kanJiaActivityGoodsDTO.getId());
//校验当前活动是否已经开始,只有新建的未开始的活动可以编辑 //校验当前活动是否已经开始,只有新建的未开始的活动可以编辑
if (!dbKanJiaActivityGoods.getPromotionStatus().equals(PromotionStatusEnum.NEW.name())) { if (!dbKanJiaActivityGoods.getPromotionStatus().equals(PromotionsStatusEnum.NEW.name())) {
throw new ServiceException(ResultCode.PROMOTION_UPDATE_ERROR); throw new ServiceException(ResultCode.PROMOTION_UPDATE_ERROR);
} }
//获取当前sku信息 //获取当前sku信息
@ -286,59 +237,20 @@ public class KanjiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
//常规校验砍价商品参数 //常规校验砍价商品参数
this.checkParam(kanJiaActivityGoodsDTO, goodsSku); this.checkParam(kanJiaActivityGoodsDTO, goodsSku);
//检测开始结束时间是否正确 //检测开始结束时间是否正确
PromotionTools.checkPromotionTime(kanJiaActivityGoodsDTO.getStartTime().getTime(), kanJiaActivityGoodsDTO.getEndTime().getTime()); PromotionTools.checkPromotionTime(kanJiaActivityGoodsDTO.getStartTime(), kanJiaActivityGoodsDTO.getEndTime());
//检测同一时间段不能允许添加相同的商品 //检测同一时间段不能允许添加相同的商品
if (this.checkSkuDuplicate(goodsSku.getId(), kanJiaActivityGoodsDTO) != null) { if (this.checkSkuDuplicate(goodsSku.getId(), kanJiaActivityGoodsDTO) != null) {
throw new ServiceException("商品id为" + goodsSku.getId() + "的商品已参加砍价商品活动!"); throw new ServiceException("商品id为" + goodsSku.getId() + "的商品已参加砍价商品活动!");
} }
//修改数据库 //修改数据库
boolean result = this.updateById(kanJiaActivityGoodsDTO); return this.updateById(kanJiaActivityGoodsDTO);
//如果校验成功则发送修改延迟任务消息
if (result) {
this.mongoTemplate.save(kanJiaActivityGoodsDTO);
if (dbKanJiaActivityGoods.getStartTime().getTime() != kanJiaActivityGoodsDTO.getStartTime().getTime()) {
PromotionMessage promotionMessage = new PromotionMessage(kanJiaActivityGoodsDTO.getId(), PromotionTypeEnum.KANJIA.name(), PromotionStatusEnum.START.name(), kanJiaActivityGoodsDTO.getStartTime(), kanJiaActivityGoodsDTO.getEndTime());
//更新延时任务
this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR,
promotionMessage,
kanJiaActivityGoodsDTO.getStartTime().getTime(),
kanJiaActivityGoodsDTO.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
DateUtil.getDelayTime(kanJiaActivityGoodsDTO.getStartTime().getTime()),
rocketmqCustomProperties.getPromotionTopic());
}
}
return result;
} }
@Override @Override
public boolean deleteKanJiaGoods(List<String> ids) { public boolean deleteKanJiaGoods(List<String> ids) {
List<String> skuIds = new ArrayList<>(); PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
for (String id : ids) { searchParams.setPromotionIds(ids);
KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO = this.getKanjiaGoodsDetail(id); this.promotionGoodsService.deletePromotionGoods(searchParams);
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, return this.removeByIds(ids);
kanJiaActivityGoodsDTO.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (PromotionTypeEnum.KANJIA.name() + kanJiaActivityGoodsDTO.getId())),
rocketmqCustomProperties.getPromotionTopic());
skuIds.add(kanJiaActivityGoodsDTO.getSkuId());
}
boolean result = this.removeByIds(ids);
if (result) {
Query query = new Query();
query.addCriteria(new Criteria("id").in(ids));
this.mongoTemplate.remove(query, KanjiaActivityGoodsDTO.class);
}
return result;
}
@Override
public KanjiaActivityGoodsDTO getKanJiaGoodsBySku(String skuId) {
//mongo查询条件
Query query = new Query();
query.addCriteria(Criteria.where("skuId").is(skuId))
.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.START.name()));
List<KanjiaActivityGoodsDTO> kanjiaActivityGoodsDTOList=this.mongoTemplate.find(query, KanjiaActivityGoodsDTO.class);
return kanjiaActivityGoodsDTOList.get(0);
} }
} }

View File

@ -11,7 +11,7 @@ import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods;
import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog; import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityLogQuery; import cn.lili.modules.promotion.entity.dto.KanJiaActivityLogQuery;
import cn.lili.modules.promotion.entity.dto.KanjiaActivityDTO; import cn.lili.modules.promotion.entity.dto.KanjiaActivityDTO;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.mapper.KanJiaActivityLogMapper; import cn.lili.modules.promotion.mapper.KanJiaActivityLogMapper;
import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; import cn.lili.modules.promotion.service.KanjiaActivityGoodsService;
import cn.lili.modules.promotion.service.KanjiaActivityLogService; import cn.lili.modules.promotion.service.KanjiaActivityLogService;
@ -62,7 +62,7 @@ public class KanjiaActivityLogServiceImpl extends ServiceImpl<KanJiaActivityLogM
//校验当前砍价商品是否有效 //校验当前砍价商品是否有效
KanjiaActivityGoods kanjiaActivityGoods = kanJiaActivityGoodsService.getById(kanjiaActivityDTO.getKanjiaActivityGoodsId()); KanjiaActivityGoods kanjiaActivityGoods = kanJiaActivityGoodsService.getById(kanjiaActivityDTO.getKanjiaActivityGoodsId());
//如果当前活动不为空且还在活动时间内 才可以参与砍价活动 //如果当前活动不为空且还在活动时间内 才可以参与砍价活动
if (kanjiaActivityGoods != null && kanjiaActivityGoods.getPromotionStatus().equals(PromotionStatusEnum.START.name())) { if (kanjiaActivityGoods != null && kanjiaActivityGoods.getPromotionStatus().equals(PromotionsStatusEnum.START.name())) {
//获取砍价参与者记录 //获取砍价参与者记录
KanjiaActivity kanjiaActivity = kanJiaActivityService.getById(kanjiaActivityDTO.getKanjiaActivityId()); KanjiaActivity kanjiaActivity = kanJiaActivityService.getById(kanjiaActivityDTO.getKanjiaActivityId());
if (kanjiaActivity != null) { if (kanjiaActivity != null) {

View File

@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil;
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.security.AuthUser;
import cn.lili.common.security.context.UserContext; import cn.lili.common.security.context.UserContext;
import cn.lili.common.utils.BeanUtil; import cn.lili.common.utils.BeanUtil;
import cn.lili.common.utils.CurrencyUtil; import cn.lili.common.utils.CurrencyUtil;
@ -19,7 +20,7 @@ import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog;
import cn.lili.modules.promotion.entity.dto.KanjiaActivityDTO; import cn.lili.modules.promotion.entity.dto.KanjiaActivityDTO;
import cn.lili.modules.promotion.entity.dto.KanjiaActivityQuery; import cn.lili.modules.promotion.entity.dto.KanjiaActivityQuery;
import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum; import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivitySearchParams; import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivitySearchParams;
import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityVO; import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityVO;
import cn.lili.modules.promotion.mapper.KanJiaActivityMapper; import cn.lili.modules.promotion.mapper.KanJiaActivityMapper;
@ -36,13 +37,15 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Objects;
/** /**
* 砍价活动参与记录业务层实现 * 砍价活动参与记录业务层实现
* *
* @author qiuqiu * @author qiuqiu
* @date 2021/7/1 * @since 2021/7/1
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ -64,6 +67,7 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
@Override @Override
public KanjiaActivityVO getKanjiaActivityVO(KanjiaActivitySearchParams kanJiaActivitySearchParams) { public KanjiaActivityVO getKanjiaActivityVO(KanjiaActivitySearchParams kanJiaActivitySearchParams) {
AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser());
KanjiaActivity kanjiaActivity = this.getKanjiaActivity(kanJiaActivitySearchParams); KanjiaActivity kanjiaActivity = this.getKanjiaActivity(kanJiaActivitySearchParams);
KanjiaActivityVO kanjiaActivityVO = new KanjiaActivityVO(); KanjiaActivityVO kanjiaActivityVO = new KanjiaActivityVO();
//判断是否参与活动 //判断是否参与活动
@ -77,7 +81,7 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
//如果已发起砍价判断用户是否可以砍价 //如果已发起砍价判断用户是否可以砍价
KanjiaActivityLog kanjiaActivityLog = kanjiaActivityLogService.getOne(new LambdaQueryWrapper<KanjiaActivityLog>() KanjiaActivityLog kanjiaActivityLog = kanjiaActivityLogService.getOne(new LambdaQueryWrapper<KanjiaActivityLog>()
.eq(KanjiaActivityLog::getKanjiaActivityId, kanjiaActivity.getId()) .eq(KanjiaActivityLog::getKanjiaActivityId, kanjiaActivity.getId())
.eq(KanjiaActivityLog::getKanjiaMemberId, UserContext.getCurrentUser().getId())); .eq(KanjiaActivityLog::getKanjiaMemberId, authUser.getId()));
if (kanjiaActivityLog == null) { if (kanjiaActivityLog == null) {
kanjiaActivityVO.setHelp(true); kanjiaActivityVO.setHelp(true);
} }
@ -91,15 +95,16 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
@Override @Override
public KanjiaActivityLog add(String id) { public KanjiaActivityLog add(String id) {
AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser());
//根据skuId查询当前sku是否参与活动并且是在活动进行中 //根据skuId查询当前sku是否参与活动并且是在活动进行中
KanjiaActivityGoods kanJiaActivityGoods = kanjiaActivityGoodsService.getById(id); KanjiaActivityGoods kanJiaActivityGoods = kanjiaActivityGoodsService.getById(id);
//只有砍价商品存在且已经开始的活动才可以发起砍价 //只有砍价商品存在且已经开始的活动才可以发起砍价
if (kanJiaActivityGoods == null || !kanJiaActivityGoods.getPromotionStatus().equals(PromotionStatusEnum.START.name())) { if (kanJiaActivityGoods == null || !kanJiaActivityGoods.getPromotionStatus().equals(PromotionsStatusEnum.START.name())) {
throw new ServiceException(ResultCode.PROMOTION_STATUS_END); throw new ServiceException(ResultCode.PROMOTION_STATUS_END);
} }
KanjiaActivityLog kanjiaActivityLog = new KanjiaActivityLog(); KanjiaActivityLog kanjiaActivityLog = new KanjiaActivityLog();
//获取会员信息 //获取会员信息
Member member = memberService.getById(UserContext.getCurrentUser().getId()); Member member = memberService.getById(authUser.getId());
//校验此活动是否已经发起过 //校验此活动是否已经发起过
QueryWrapper<KanjiaActivity> queryWrapper = new QueryWrapper<>(); QueryWrapper<KanjiaActivity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("kanjia_activity_goods_id", kanJiaActivityGoods.getId()); queryWrapper.eq("kanjia_activity_goods_id", kanJiaActivityGoods.getId());
@ -110,7 +115,7 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
KanjiaActivity kanJiaActivity = new KanjiaActivity(); KanjiaActivity kanJiaActivity = new KanjiaActivity();
//获取商品信息 //获取商品信息
GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(kanJiaActivityGoods.getSkuId()); GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(kanJiaActivityGoods.getSkuId());
if (goodsSku != null && member != null) { if (goodsSku != null) {
kanJiaActivity.setSkuId(kanJiaActivityGoods.getSkuId()); kanJiaActivity.setSkuId(kanJiaActivityGoods.getSkuId());
kanJiaActivity.setGoodsName(goodsSku.getGoodsName()); kanJiaActivity.setGoodsName(goodsSku.getGoodsName());
kanJiaActivity.setKanjiaActivityGoodsId(kanJiaActivityGoods.getId()); kanJiaActivity.setKanjiaActivityGoodsId(kanJiaActivityGoods.getId());
@ -118,7 +123,7 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
kanJiaActivity.setMemberId(UserContext.getCurrentUser().getId()); kanJiaActivity.setMemberId(UserContext.getCurrentUser().getId());
kanJiaActivity.setMemberName(member.getUsername()); kanJiaActivity.setMemberName(member.getUsername());
kanJiaActivity.setStatus(KanJiaStatusEnum.START.name()); kanJiaActivity.setStatus(KanJiaStatusEnum.START.name());
//剩余砍价金额 开始 是商品金额; //剩余砍价金额 开始 是商品金额
kanJiaActivity.setSurplusPrice(goodsSku.getPrice()); kanJiaActivity.setSurplusPrice(goodsSku.getPrice());
//砍价最低购买金额 //砍价最低购买金额
kanJiaActivity.setPurchasePrice(kanJiaActivityGoods.getPurchasePrice()); kanJiaActivity.setPurchasePrice(kanJiaActivityGoods.getPurchasePrice());
@ -136,12 +141,13 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
@Override @Override
public KanjiaActivityLog helpKanJia(String kanjiaActivityId) { public KanjiaActivityLog helpKanJia(String kanjiaActivityId) {
AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser());
//获取会员信息 //获取会员信息
Member member = memberService.getById(UserContext.getCurrentUser().getId()); Member member = memberService.getById(authUser.getId());
//根据砍价发起活动id查询砍价活动信息 //根据砍价发起活动id查询砍价活动信息
KanjiaActivity kanjiaActivity = this.getById(kanjiaActivityId); KanjiaActivity kanjiaActivity = this.getById(kanjiaActivityId);
//判断活动非空或非正在进行中的活动 //判断活动非空或非正在进行中的活动
if (kanjiaActivity == null || !kanjiaActivity.getStatus().equals(PromotionStatusEnum.START.name())) { if (kanjiaActivity == null || !kanjiaActivity.getStatus().equals(PromotionsStatusEnum.START.name())) {
throw new ServiceException(ResultCode.PROMOTION_STATUS_END); throw new ServiceException(ResultCode.PROMOTION_STATUS_END);
} else if (member == null) { } else if (member == null) {
throw new ServiceException(ResultCode.USER_NOT_EXIST); throw new ServiceException(ResultCode.USER_NOT_EXIST);
@ -152,7 +158,7 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
throw new ServiceException(ResultCode.PROMOTION_STATUS_END); throw new ServiceException(ResultCode.PROMOTION_STATUS_END);
} }
//判断是否已参与 //判断是否已参与
LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<KanjiaActivityLog>() LambdaQueryWrapper<KanjiaActivityLog> lambdaQueryWrapper = new LambdaQueryWrapper<KanjiaActivityLog>()
.eq(KanjiaActivityLog::getKanjiaActivityId, kanjiaActivityId) .eq(KanjiaActivityLog::getKanjiaActivityId, kanjiaActivityId)
.eq(KanjiaActivityLog::getKanjiaMemberId, member.getId()); .eq(KanjiaActivityLog::getKanjiaMemberId, member.getId());
if (kanjiaActivityLogService.count(lambdaQueryWrapper) > 0) { if (kanjiaActivityLogService.count(lambdaQueryWrapper) > 0) {
@ -188,7 +194,7 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
* *
* @param kanjiaActivityGoods 砍价商品信息 * @param kanjiaActivityGoods 砍价商品信息
* @param surplusPrice 剩余可砍金额 * @param surplusPrice 剩余可砍金额
* @return * @return 砍一刀价格
*/ */
private Double getKanjiaPrice(KanjiaActivityGoods kanjiaActivityGoods, Double surplusPrice) { private Double getKanjiaPrice(KanjiaActivityGoods kanjiaActivityGoods, Double surplusPrice) {
@ -204,7 +210,7 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
//获取随机砍价金额 //获取随机砍价金额
BigDecimal bigDecimal = RandomUtil.randomBigDecimal(Convert.toBigDecimal(kanjiaActivityGoods.getLowestPrice()), BigDecimal bigDecimal = RandomUtil.randomBigDecimal(Convert.toBigDecimal(kanjiaActivityGoods.getLowestPrice()),
Convert.toBigDecimal(kanjiaActivityGoods.getHighestPrice())); Convert.toBigDecimal(kanjiaActivityGoods.getHighestPrice()));
return bigDecimal.setScale(2, BigDecimal.ROUND_UP).doubleValue(); return bigDecimal.setScale(2, RoundingMode.UP).doubleValue();
} }

View File

@ -2,18 +2,20 @@ package cn.lili.modules.promotion.serviceimpl;
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.security.AuthUser;
import cn.lili.common.security.context.UserContext; import cn.lili.common.security.context.UserContext;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.modules.promotion.entity.dos.Coupon; import cn.lili.modules.promotion.entity.dos.Coupon;
import cn.lili.modules.promotion.entity.dos.MemberCoupon; import cn.lili.modules.promotion.entity.dos.MemberCoupon;
import cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum; import cn.lili.modules.promotion.entity.enums.CouponGetEnum;
import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.entity.vos.CouponSearchParams; import cn.lili.modules.promotion.entity.vos.CouponSearchParams;
import cn.lili.modules.promotion.mapper.MemberCouponMapper; import cn.lili.modules.promotion.mapper.MemberCouponMapper;
import cn.lili.modules.promotion.service.CouponService; import cn.lili.modules.promotion.service.CouponService;
import cn.lili.modules.promotion.service.MemberCouponService; import cn.lili.modules.promotion.service.MemberCouponService;
import cn.lili.mybatis.util.PageUtil;
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;
@ -24,10 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired;
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.ArrayList; import java.util.*;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/** /**
* 会员优惠券业务层实现 * 会员优惠券业务层实现
@ -52,7 +51,7 @@ public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, Mem
.eq(MemberCoupon::getCouponId, couponId) .eq(MemberCoupon::getCouponId, couponId)
.eq(MemberCoupon::getMemberId, memberId); .eq(MemberCoupon::getMemberId, memberId);
int haveCoupons = this.count(queryWrapper); int haveCoupons = this.count(queryWrapper);
if (!PromotionStatusEnum.START.name().equals(coupon.getPromotionStatus())) { if (!PromotionsStatusEnum.START.name().equals(coupon.getPromotionStatus())) {
throw new ServiceException(ResultCode.COUPON_RECEIVE_ERROR); throw new ServiceException(ResultCode.COUPON_RECEIVE_ERROR);
} }
if (coupon.getPublishNum() != 0 && coupon.getReceivedNum() >= coupon.getPublishNum()) { if (coupon.getPublishNum() != 0 && coupon.getReceivedNum() >= coupon.getPublishNum()) {
@ -63,18 +62,29 @@ public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, Mem
} }
} }
/**
* 领取优惠券
*
* @param couponId 优惠券编号
* @param memberId 会员
* @param memberName 会员名称
*/
@Override
public void receiveBuyerCoupon(String couponId, String memberId, String memberName) {
Coupon coupon = couponService.getById(couponId);
if (coupon != null && !CouponGetEnum.FREE.name().equals(coupon.getGetType())) {
throw new ServiceException(ResultCode.COUPON_DO_NOT_RECEIVER);
} else if (coupon != null) {
this.receiverCoupon(couponId, memberId, memberName, coupon);
}
}
@Override @Override
public void receiveCoupon(String couponId, String memberId, String memberName) { public void receiveCoupon(String couponId, String memberId, String memberName) {
Coupon coupon = couponService.getCouponDetailFromMongo(couponId); Coupon coupon = couponService.getById(couponId);
if (coupon != null) { if (coupon != null) {
this.checkCouponLimit(couponId, memberId); this.receiverCoupon(couponId, memberId, memberName, coupon);
MemberCoupon memberCoupon = new MemberCoupon(coupon);
memberCoupon.setMemberId(memberId);
memberCoupon.setMemberName(memberName);
memberCoupon.setMemberCouponStatus(MemberCouponStatusEnum.NEW.name());
memberCoupon.setIsPlatform(("platform").equals(coupon.getStoreId()));
this.save(memberCoupon);
couponService.receiveCoupon(couponId, 1);
} else { } else {
throw new ServiceException(ResultCode.COUPON_NOT_EXIST); throw new ServiceException(ResultCode.COUPON_NOT_EXIST);
} }
@ -82,18 +92,19 @@ public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, Mem
@Override @Override
public IPage<MemberCoupon> getMemberCoupons(CouponSearchParams param, PageVO pageVo) { public IPage<MemberCoupon> getMemberCoupons(CouponSearchParams param, PageVO pageVo) {
QueryWrapper<MemberCoupon> queryWrapper = param.wrapper(); QueryWrapper<MemberCoupon> queryWrapper = param.queryWrapper();
return this.page(PageUtil.initPage(pageVo), queryWrapper); return this.page(PageUtil.initPage(pageVo), queryWrapper);
} }
@Override @Override
public List<MemberCoupon> getMemberCoupons() { public List<MemberCoupon> getMemberCoupons() {
LambdaQueryWrapper<MemberCoupon> LambdaQueryWrapper = new LambdaQueryWrapper<>(); AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser());
LambdaQueryWrapper.eq(MemberCoupon::getMemberId,UserContext.getCurrentUser().getId()); LambdaQueryWrapper<MemberCoupon> queryWrapper = new LambdaQueryWrapper<>();
LambdaQueryWrapper.eq(MemberCoupon::getMemberCouponStatus,MemberCouponStatusEnum.NEW.name()); queryWrapper.eq(MemberCoupon::getMemberId, authUser.getId());
LambdaQueryWrapper.le(MemberCoupon::getStartTime,new Date()); queryWrapper.eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name());
LambdaQueryWrapper.ge(MemberCoupon::getEndTime,new Date()); queryWrapper.le(MemberCoupon::getStartTime, new Date());
return this.list(LambdaQueryWrapper); queryWrapper.ge(MemberCoupon::getEndTime, new Date());
return this.list(queryWrapper);
} }
/** /**
@ -112,7 +123,7 @@ public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, Mem
queryWrapper.eq(MemberCoupon::getMemberId, param.getMemberId()); queryWrapper.eq(MemberCoupon::getMemberId, param.getMemberId());
queryWrapper.and( queryWrapper.and(
i -> i.like(MemberCoupon::getScopeId, param.getScopeId()) i -> i.like(MemberCoupon::getScopeId, param.getScopeId())
.or(j -> j.eq(MemberCoupon::getScopeType, CouponScopeTypeEnum.ALL.name()))); .or(j -> j.eq(MemberCoupon::getScopeType, PromotionsScopeTypeEnum.ALL.name())));
queryWrapper.eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name()); queryWrapper.eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name());
queryWrapper.le(MemberCoupon::getConsumeThreshold, totalPrice); queryWrapper.le(MemberCoupon::getConsumeThreshold, totalPrice);
queryWrapper.ge(MemberCoupon::getEndTime, new Date()); queryWrapper.ge(MemberCoupon::getEndTime, new Date());
@ -132,7 +143,7 @@ public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, Mem
queryWrapper.eq(MemberCoupon::getMemberId, memberId); queryWrapper.eq(MemberCoupon::getMemberId, memberId);
queryWrapper.eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name()); queryWrapper.eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name());
queryWrapper.in(MemberCoupon::getCouponId, couponIds); queryWrapper.in(MemberCoupon::getCouponId, couponIds);
queryWrapper.ne(MemberCoupon::getScopeType, CouponScopeTypeEnum.ALL.name()); queryWrapper.ne(MemberCoupon::getScopeType, PromotionsScopeTypeEnum.ALL.name());
queryWrapper.le(MemberCoupon::getConsumeThreshold, totalPrice); queryWrapper.le(MemberCoupon::getConsumeThreshold, totalPrice);
queryWrapper.ge(MemberCoupon::getEndTime, new Date()); queryWrapper.ge(MemberCoupon::getEndTime, new Date());
return this.list(queryWrapper); return this.list(queryWrapper);
@ -150,15 +161,16 @@ public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, Mem
LambdaQueryWrapper<MemberCoupon> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<MemberCoupon> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(MemberCoupon::getMemberId, memberId); queryWrapper.eq(MemberCoupon::getMemberId, memberId);
queryWrapper.eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name()); queryWrapper.eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name());
queryWrapper.eq(MemberCoupon::getScopeType, CouponScopeTypeEnum.ALL.name()); queryWrapper.eq(MemberCoupon::getScopeType, PromotionsScopeTypeEnum.ALL.name());
queryWrapper.ge(MemberCoupon::getEndTime, new Date()).and(i -> i.in(MemberCoupon::getStoreId, storeId).or(j -> j.eq(MemberCoupon::getIsPlatform, true))); queryWrapper.ge(MemberCoupon::getEndTime, new Date()).and(i -> i.in(MemberCoupon::getStoreId, storeId).or(j -> j.eq(MemberCoupon::getIsPlatform, true)));
return this.list(queryWrapper); return this.list(queryWrapper);
} }
@Override @Override
public Integer getMemberCouponsNum() { public Integer getMemberCouponsNum() {
AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser());
QueryWrapper<MemberCoupon> queryWrapper = Wrappers.query(); QueryWrapper<MemberCoupon> queryWrapper = Wrappers.query();
queryWrapper.eq("member_id", UserContext.getCurrentUser().getId()); queryWrapper.eq("member_id", authUser.getId());
queryWrapper.eq("member_coupon_status", MemberCouponStatusEnum.NEW.name()); queryWrapper.eq("member_coupon_status", MemberCouponStatusEnum.NEW.name());
queryWrapper.eq("delete_flag", false); queryWrapper.eq("delete_flag", false);
return this.count(queryWrapper); return this.count(queryWrapper);
@ -222,4 +234,27 @@ public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, Mem
this.update(updateWrapper); this.update(updateWrapper);
} }
/**
* 关闭会员优惠券
*
* @param couponIds 优惠券id集合
*/
@Override
public void closeMemberCoupon(List<String> couponIds) {
LambdaUpdateWrapper<MemberCoupon> memberCouponLambdaUpdateWrapper = new LambdaUpdateWrapper<MemberCoupon>()
.in(MemberCoupon::getCouponId, couponIds)
.set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.CLOSED.name());
this.update(memberCouponLambdaUpdateWrapper);
}
private void receiverCoupon(String couponId, String memberId, String memberName, Coupon coupon) {
this.checkCouponLimit(couponId, memberId);
MemberCoupon memberCoupon = new MemberCoupon(coupon);
memberCoupon.setMemberId(memberId);
memberCoupon.setMemberName(memberName);
memberCoupon.setMemberCouponStatus(MemberCouponStatusEnum.NEW.name());
memberCoupon.setIsPlatform(("platform").equals(coupon.getStoreId()));
this.save(memberCoupon);
couponService.receiveCoupon(couponId, 1);
}
} }

View File

@ -1,47 +1,33 @@
package cn.lili.modules.promotion.serviceimpl; package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.PromotionTypeEnum; 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.properties.RocketmqCustomProperties;
import cn.lili.common.utils.DateUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.service.MemberService; import cn.lili.modules.member.service.MemberService;
import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dos.Order;
import cn.lili.modules.order.order.entity.dto.OrderSearchParams;
import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; import cn.lili.modules.order.order.entity.enums.OrderStatusEnum;
import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.promotion.entity.dos.Pintuan; import cn.lili.modules.promotion.entity.dos.Pintuan;
import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.entity.vos.PintuanMemberVO; import cn.lili.modules.promotion.entity.vos.PintuanMemberVO;
import cn.lili.modules.promotion.entity.vos.PintuanSearchParams;
import cn.lili.modules.promotion.entity.vos.PintuanShareVO; import cn.lili.modules.promotion.entity.vos.PintuanShareVO;
import cn.lili.modules.promotion.entity.vos.PintuanVO; import cn.lili.modules.promotion.entity.vos.PintuanVO;
import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams;
import cn.lili.modules.promotion.mapper.PintuanMapper; import cn.lili.modules.promotion.mapper.PintuanMapper;
import cn.lili.modules.promotion.service.PintuanService; import cn.lili.modules.promotion.service.PintuanService;
import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.promotion.service.PromotionGoodsService;
import cn.lili.modules.promotion.tools.PromotionTools; import cn.lili.modules.promotion.tools.PromotionTools;
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.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
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;
@ -59,18 +45,8 @@ import java.util.stream.Collectors;
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public class PintuanServiceImpl extends ServiceImpl<PintuanMapper, Pintuan> implements PintuanService { public class PintuanServiceImpl extends AbstractPromotionsServiceImpl<PintuanMapper, Pintuan> implements PintuanService {
/**
* 延时任务
*/
@Autowired
private TimeTrigger timeTrigger;
/**
* Mongo
*/
@Autowired
private MongoTemplate mongoTemplate;
/** /**
* 促销商品 * 促销商品
*/ */
@ -86,23 +62,12 @@ public class PintuanServiceImpl extends ServiceImpl<PintuanMapper, Pintuan> impl
*/ */
@Autowired @Autowired
private MemberService memberService; private MemberService memberService;
/**
* RocketMQ
*/
@Autowired
private RocketmqCustomProperties rocketmqCustomProperties;
/** /**
* 订单 * 订单
*/ */
@Autowired @Autowired
private OrderService orderService; private OrderService orderService;
@Override
public IPage<Pintuan> getPintuanByPage(PintuanSearchParams param, PageVO page) {
QueryWrapper<Pintuan> queryWrapper = param.wrapper();
return page(PageUtil.initPage(page), queryWrapper);
}
/** /**
* 获取当前拼团的会员 * 获取当前拼团的会员
* *
@ -112,53 +77,29 @@ public class PintuanServiceImpl extends ServiceImpl<PintuanMapper, Pintuan> impl
@Override @Override
public List<PintuanMemberVO> getPintuanMember(String pintuanId) { public List<PintuanMemberVO> getPintuanMember(String pintuanId) {
List<PintuanMemberVO> members = new ArrayList<>(); List<PintuanMemberVO> members = new ArrayList<>();
PintuanVO pintuan = this.getPintuanByIdFromMongo(pintuanId); Pintuan pintuan = this.getById(pintuanId);
if (pintuan == null) { if (pintuan == null) {
log.error("拼团活动为" + pintuanId + "的拼团活动不存在!"); log.error("拼团活动为" + pintuanId + "的拼团活动不存在!");
return new ArrayList<>(); return new ArrayList<>();
} }
LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>(); OrderSearchParams searchParams = new OrderSearchParams();
queryWrapper.eq(Order::getPromotionId, pintuanId) searchParams.setOrderStatus(OrderStatusEnum.PAID.name());
.eq(Order::getOrderPromotionType, PromotionTypeEnum.PINTUAN.name()) searchParams.setPromotionId(pintuanId);
.eq(Order::getOrderStatus, OrderStatusEnum.PAID.name()) searchParams.setOrderPromotionType(PromotionTypeEnum.PINTUAN.name());
.eq(Order::getParentOrderSn, ""); searchParams.setParentOrderSn("");
List<Order> orders = orderService.list(queryWrapper); List<Order> orders = orderService.queryListByParams(searchParams);
//遍历订单状态为已支付为团长的拼团订单 //遍历订单状态为已支付为团长的拼团订单
for (Order order : orders) { for (Order order : orders) {
Member member = memberService.getById(order.getMemberId()); Member member = memberService.getById(order.getMemberId());
PintuanMemberVO memberVO = new PintuanMemberVO(member); PintuanMemberVO memberVO = new PintuanMemberVO(member);
LambdaQueryWrapper<Order> countQueryWrapper = new LambdaQueryWrapper<>();
countQueryWrapper.eq(Order::getOrderStatus, OrderStatusEnum.PAID.name());
countQueryWrapper.and(i -> i.eq(Order::getSn, order.getSn()).or(j -> j.eq(Order::getParentOrderSn, order.getSn())));
//获取已参团人数 //获取已参团人数
int count = orderService.count(countQueryWrapper); this.setMemberVONum(memberVO, pintuan.getRequiredNum(), order.getSn());
//获取待参团人数
int toBoGrouped = pintuan.getRequiredNum() - count;
memberVO.setGroupNum(pintuan.getRequiredNum());
memberVO.setGroupedNum(count);
memberVO.setToBeGroupedNum(toBoGrouped);
memberVO.setOrderSn(order.getSn()); memberVO.setOrderSn(order.getSn());
members.add(memberVO); members.add(memberVO);
} }
return members; return members;
} }
@Override
public IPage<PintuanVO> getPintuanByPageFromMongo(PintuanSearchParams param, PageVO page) {
IPage<PintuanVO> pintuanPage = new Page<>();
Query query = param.mongoQuery();
if (page != null) {
page.setNotConvert(true);
PromotionTools.mongoQueryPageParam(query, page);
pintuanPage.setCurrent(page.getPageNumber());
pintuanPage.setSize(page.getPageSize());
}
List<PintuanVO> pintuanVOS = mongoTemplate.find(query, PintuanVO.class);
pintuanPage.setRecords(pintuanVOS);
pintuanPage.setTotal(this.getPintuanByPageFromMongoCount(param));
return pintuanPage;
}
/** /**
* 从mongo中查询拼团活动详情 * 从mongo中查询拼团活动详情
* *
@ -166,161 +107,17 @@ public class PintuanServiceImpl extends ServiceImpl<PintuanMapper, Pintuan> impl
* @return 拼团活动详情 * @return 拼团活动详情
*/ */
@Override @Override
public PintuanVO getPintuanByIdFromMongo(String id) { public PintuanVO getPintuanVO(String id) {
PintuanVO pintuanVO = mongoTemplate.findById(id, PintuanVO.class);
if (pintuanVO == null) {
log.error("拼团活动id[" + id + "]的拼团活动不存在!");
throw new ServiceException(ResultCode.ERROR);
}
return pintuanVO;
}
/**
* 从mysql中查询拼团活动详情
*
* @param id 拼团活动id
* @return 拼团活动详情
*/
@Override
public Pintuan getPintuanById(String id) {
Pintuan pintuan = this.getById(id); Pintuan pintuan = this.getById(id);
if (pintuan == null) { if (pintuan == null) {
log.error("拼团活动id[" + id + "]的拼团活动不存在!"); log.error("拼团活动id[" + id + "]的拼团活动不存在!");
throw new ServiceException(ResultCode.ERROR); throw new ServiceException(ResultCode.PINTUAN_NOT_EXIST_ERROR);
} }
return pintuan; PintuanVO pintuanVO = new PintuanVO(pintuan);
} PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
searchParams.setPromotionId(pintuan.getId());
/** pintuanVO.setPromotionGoodsList(promotionGoodsService.listFindAll(searchParams));
* 从mongo中根据条件查询拼团活动总数 return pintuanVO;
*
* @param param 拼团活动查询参数
* @return 总数
*/
@Override
public Long getPintuanByPageFromMongoCount(PintuanSearchParams param) {
Query query = param.mongoQuery();
return mongoTemplate.count(query, PintuanVO.class);
}
@Override
public boolean addPintuan(PintuanVO pintuan) {
PromotionTools.checkPromotionTime(pintuan.getStartTime().getTime(), pintuan.getEndTime().getTime());
pintuan.setPromotionStatus(PromotionStatusEnum.NEW.name());
//保存到MYSQL中
boolean result = this.save(pintuan);
this.updatePintuanPromotionGoods(pintuan);
this.mongoTemplate.save(pintuan);
this.addPintuanStartTask(pintuan);
return result;
}
@Override
public boolean modifyPintuan(PintuanVO pintuan) {
PintuanVO pintuanVO = this.checkExist(pintuan.getId());
if (!pintuan.getPromotionStatus().equals(PromotionStatusEnum.NEW.name())) {
throw new ServiceException(ResultCode.PINTUAN_EDIT_ERROR_ITS_OPEN);
}
//检查促销时间
PromotionTools.checkPromotionTime(pintuan.getStartTime().getTime(), pintuan.getEndTime().getTime());
boolean result = this.updateById(pintuan);
if (pintuan.getPromotionGoodsList() != null) {
this.updatePintuanPromotionGoods(pintuan);
}
this.mongoTemplate.save(pintuan);
//时间发生变化
if (pintuan.getStartTime().getTime() != pintuanVO.getStartTime().getTime()) {
PromotionMessage promotionMessage = new PromotionMessage(pintuan.getId(), PromotionTypeEnum.PINTUAN.name(), PromotionStatusEnum.START.name(), pintuan.getStartTime(), pintuan.getEndTime());
//更新延时任务
this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR,
promotionMessage,
pintuanVO.getStartTime().getTime(),
pintuan.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
DateUtil.getDelayTime(pintuanVO.getStartTime().getTime()),
rocketmqCustomProperties.getPromotionTopic());
}
return result;
}
@Override
public boolean openPintuan(String pintuanId, Date startTime, Date endTime) {
PintuanVO pintuan = checkExist(pintuanId);
pintuan.setStartTime(startTime);
pintuan.setEndTime(endTime);
boolean result;
long endTimeLong = endTime.getTime() / 1000;
//如果还在活动时间内
if (endTimeLong > DateUtil.getDateline()) {
pintuan.setPromotionStatus(PromotionStatusEnum.NEW.name());
updatePintuanPromotionGoods(pintuan);
this.addPintuanStartTask(pintuan);
} else {
//活动时间范围外修改状态为已结束
pintuan.setPromotionStatus(PromotionStatusEnum.END.name());
}
pintuan.setPromotionGoodsList(new ArrayList<>());
result = this.updateById(pintuan);
this.mongoTemplate.save(pintuan);
return result;
}
@Override
public boolean closePintuan(String pintuanId) {
PintuanVO pintuan = checkExist(pintuanId);
long endTime = pintuan.getEndTime().getTime() / 1000;
//如果还在活动时间内
if (endTime > DateUtil.getDateline()) {
//表示可以再次开启则不处理未成团订单因为可以开启
pintuan.setPromotionStatus(PromotionStatusEnum.CLOSE.name());
} else {
pintuan.setPromotionStatus(PromotionStatusEnum.END.name());
LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Order::getOrderPromotionType, PromotionTypeEnum.PINTUAN.name());
queryWrapper.eq(Order::getPromotionId, pintuanId);
queryWrapper.nested(i -> i.eq(Order::getPayStatus, PayStatusEnum.PAID.name()).or().eq(Order::getOrderStatus, OrderStatusEnum.PAID.name()));
//过滤父级拼团订单根据父级拼团订单分组
Map<String, List<Order>> collect = orderService.list(queryWrapper).stream().filter(i -> StrUtil.isNotEmpty(i.getParentOrderSn())).collect(Collectors.groupingBy(Order::getParentOrderSn));
this.isOpenFictitiousPintuan(pintuan, collect);
}
LambdaUpdateWrapper<Pintuan> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(Pintuan::getId, pintuanId).set(Pintuan::getPromotionStatus, PromotionStatusEnum.CLOSE.name());
boolean result = this.update(updateWrapper);
if (pintuan.getPromotionGoodsList() != null && !pintuan.getPromotionGoodsList().isEmpty()) {
LambdaQueryWrapper<PromotionGoods> deleteWrapper = new LambdaQueryWrapper<>();
deleteWrapper.eq(PromotionGoods::getPromotionId, pintuanId);
promotionGoodsService.remove(deleteWrapper);
pintuan.setPromotionGoodsList(new ArrayList<>());
}
this.removePintuanGoodsFromEs(pintuanId, pintuan.getStartTime().getTime());
this.mongoTemplate.save(pintuan);
return result;
}
/**
* 删除拼团
*
* @param pintuanId 拼团活动编号
* @return 是否成功
*/
@Override
public boolean deletePintuan(String pintuanId) {
PintuanVO pintuanVO = this.checkExist(pintuanId);
pintuanVO.setDeleteFlag(true);
if (pintuanVO.getPromotionGoodsList() != null && !pintuanVO.getPromotionGoodsList().isEmpty()) {
LambdaQueryWrapper<PromotionGoods> deleteWrapper = new LambdaQueryWrapper<>();
deleteWrapper.eq(PromotionGoods::getPromotionId, pintuanId);
promotionGoodsService.remove(deleteWrapper);
pintuanVO.setPromotionGoodsList(new ArrayList<>());
}
boolean result = this.updateById(pintuanVO);
this.mongoTemplate.save(pintuanVO);
this.removePintuanGoodsFromEs(pintuanId, pintuanVO.getStartTime().getTime());
return result;
} }
/** /**
@ -334,28 +131,103 @@ public class PintuanServiceImpl extends ServiceImpl<PintuanMapper, Pintuan> impl
public PintuanShareVO getPintuanShareInfo(String parentOrderSn, String skuId) { public PintuanShareVO getPintuanShareInfo(String parentOrderSn, String skuId) {
PintuanShareVO pintuanShareVO = new PintuanShareVO(); PintuanShareVO pintuanShareVO = new PintuanShareVO();
pintuanShareVO.setPintuanMemberVOS(new ArrayList<>()); pintuanShareVO.setPintuanMemberVOS(new ArrayList<>());
LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>();
//查找团长订单和已和当前拼团订单拼团的订单 //查找团长订单和已和当前拼团订单拼团的订单
queryWrapper.eq(Order::getOrderPromotionType, PromotionTypeEnum.PINTUAN.name()) List<Order> orders = orderService.queryListByPromotion(PromotionTypeEnum.PINTUAN.name(), PayStatusEnum.PAID.name(), parentOrderSn, parentOrderSn);
.eq(Order::getPayStatus, OrderStatusEnum.PAID.name())
.and(i -> i.eq(Order::getParentOrderSn, parentOrderSn).or(j -> j.eq(Order::getSn, parentOrderSn)));
List<Order> orders = orderService.list(queryWrapper);
this.setPintuanOrderInfo(orders, pintuanShareVO, skuId); this.setPintuanOrderInfo(orders, pintuanShareVO, skuId);
//如果为根据团员订单sn查询拼团订单信息时找到团长订单sn然后找到所有参与到同一拼团的订单信息 //如果为根据团员订单sn查询拼团订单信息时找到团长订单sn然后找到所有参与到同一拼团的订单信息
if (!orders.isEmpty() && pintuanShareVO.getPromotionGoods() == null) { if (!orders.isEmpty() && pintuanShareVO.getPromotionGoods() == null) {
LambdaQueryWrapper<Order> orderLambdaQueryWrapper = new LambdaQueryWrapper<>(); List<Order> parentOrders = orderService.queryListByPromotion(PromotionTypeEnum.PINTUAN.name(), PayStatusEnum.PAID.name(), orders.get(0).getParentOrderSn(), orders.get(0).getParentOrderSn());
//查找团长订单和已和当前拼团订单拼团的订单
orderLambdaQueryWrapper.eq(Order::getOrderPromotionType, PromotionTypeEnum.PINTUAN.name())
.eq(Order::getPayStatus, OrderStatusEnum.PAID.name())
.ne(Order::getSn, parentOrderSn)
.and(i -> i.eq(Order::getParentOrderSn, orders.get(0).getParentOrderSn()).or(j -> j.eq(Order::getSn, orders.get(0).getParentOrderSn())));
List<Order> parentOrders = orderService.list(orderLambdaQueryWrapper);
this.setPintuanOrderInfo(parentOrders, pintuanShareVO, skuId); this.setPintuanOrderInfo(parentOrders, pintuanShareVO, skuId);
} }
return pintuanShareVO; return pintuanShareVO;
} }
/**
* 更新促销状态
* 如果要更新促销状态为关闭startTime和endTime置为空即可
*
* @param ids 促销id集合
* @param startTime 开始时间
* @param endTime 结束时间
* @return 是否更新成功
*/
@Override
public boolean updateStatus(List<String> ids, Long startTime, Long endTime) {
if (startTime != null && endTime != null) {
for (String id : ids) {
Pintuan pintuan = this.getById(id);
QueryWrapper<Pintuan> queryWrapper = PromotionTools.checkActiveTime(new Date(startTime), new Date(endTime), PromotionTypeEnum.PINTUAN, pintuan.getStoreId(), id);
int sameNum = this.count(queryWrapper);
//当前时间段是否存在同类活动
if (sameNum > 0) {
throw new ServiceException(ResultCode.PROMOTION_SAME_ACTIVE_EXIST);
}
}
}
return super.updateStatus(ids, startTime, endTime);
}
/**
* 检查促销参数
*
* @param promotions 促销实体
*/
@Override
public void checkPromotions(Pintuan promotions) {
QueryWrapper<Pintuan> queryWrapper = PromotionTools.checkActiveTime(promotions.getStartTime(), promotions.getEndTime(), PromotionTypeEnum.PINTUAN, promotions.getStoreId(), promotions.getId());
int sameNum = this.count(queryWrapper);
//当前时间段是否存在同类活动
if (sameNum > 0) {
throw new ServiceException(ResultCode.PROMOTION_SAME_ACTIVE_EXIST);
}
super.checkPromotions(promotions);
}
/**
* 更新促销商品信息
*
* @param promotions 促销实体
*/
@Override
public void updatePromotionsGoods(Pintuan promotions) {
super.updatePromotionsGoods(promotions);
if (!PromotionsStatusEnum.CLOSE.name().equals(promotions.getPromotionStatus())
&& PromotionsScopeTypeEnum.PORTION_GOODS.name().equals(promotions.getScopeType())
&& promotions instanceof PintuanVO) {
PintuanVO pintuanVO = (PintuanVO) promotions;
this.updatePintuanPromotionGoods(pintuanVO);
}
if (promotions.getEndTime() == null && promotions.getStartTime() == null) {
//过滤父级拼团订单根据父级拼团订单分组
Map<String, List<Order>> collect = orderService.queryListByPromotion(promotions.getId())
.stream().filter(i -> CharSequenceUtil.isNotEmpty(i.getParentOrderSn()))
.collect(Collectors.groupingBy(Order::getParentOrderSn));
this.isOpenFictitiousPintuan(promotions, collect);
}
}
/**
* 更新促销信息到商品索引
*
* @param promotions 促销实体
*/
@Override
public void updateEsGoodsIndex(Pintuan promotions) {
Pintuan pintuan = JSONUtil.parse(promotions).toBean(Pintuan.class);
super.updateEsGoodsIndex(pintuan);
}
/**
* 当前促销类型
*
* @return 当前促销类型
*/
@Override
public PromotionTypeEnum getPromotionType() {
return PromotionTypeEnum.PINTUAN;
}
/** /**
* 根据订单信息从中提取出拼团信息设置拼团信息 * 根据订单信息从中提取出拼团信息设置拼团信息
* *
@ -367,55 +239,32 @@ public class PintuanServiceImpl extends ServiceImpl<PintuanMapper, Pintuan> impl
for (Order order : orders) { for (Order order : orders) {
Member member = memberService.getById(order.getMemberId()); Member member = memberService.getById(order.getMemberId());
PintuanMemberVO memberVO = new PintuanMemberVO(member); PintuanMemberVO memberVO = new PintuanMemberVO(member);
if (StrUtil.isEmpty(order.getParentOrderSn())) { if (CharSequenceUtil.isEmpty(order.getParentOrderSn())) {
memberVO.setOrderSn(""); memberVO.setOrderSn("");
PromotionGoods promotionGoods = promotionGoodsService.getPromotionGoods(PromotionTypeEnum.PINTUAN, order.getPromotionId(), skuId); PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
searchParams.setPromotionStatus(PromotionTypeEnum.PINTUAN.name());
searchParams.setPromotionId(order.getPromotionId());
searchParams.setSkuId(skuId);
PromotionGoods promotionGoods = promotionGoodsService.getPromotionsGoods(searchParams);
if (promotionGoods == null) { if (promotionGoods == null) {
throw new ServiceException(ResultCode.PINTUAN_NOT_EXIST_ERROR); throw new ServiceException(ResultCode.PINTUAN_GOODS_NOT_EXIST_ERROR);
} }
pintuanShareVO.setPromotionGoods(promotionGoods); pintuanShareVO.setPromotionGoods(promotionGoods);
Pintuan pintuanById = this.getPintuanById(order.getPromotionId()); Pintuan pintuanById = this.getById(order.getPromotionId());
LambdaQueryWrapper<Order> countQueryWrapper = new LambdaQueryWrapper<>();
countQueryWrapper.eq(Order::getPayStatus, PayStatusEnum.PAID.name());
countQueryWrapper.and(i -> i.eq(Order::getSn, order.getSn()).or(j -> j.eq(Order::getParentOrderSn, order.getSn())));
//获取已参团人数 //获取已参团人数
int count = orderService.count(countQueryWrapper); this.setMemberVONum(memberVO, pintuanById.getRequiredNum(), order.getSn());
//获取待参团人数
int toBoGrouped = pintuanById.getRequiredNum() - count;
memberVO.setGroupNum(pintuanById.getRequiredNum());
memberVO.setGroupedNum(count);
memberVO.setToBeGroupedNum(toBoGrouped);
} }
pintuanShareVO.getPintuanMemberVOS().add(memberVO); pintuanShareVO.getPintuanMemberVOS().add(memberVO);
} }
} }
/** private void setMemberVONum(PintuanMemberVO memberVO, Integer requiredNum, String orderSn) {
* 增加拼团定时任务 int count = this.orderService.queryCountByPromotion(PromotionTypeEnum.PINTUAN.name(), PayStatusEnum.PAID.name(), orderSn, orderSn);
* @param pintuan //获取待参团人数
*/ int toBoGrouped = requiredNum - count;
private void addPintuanStartTask(PintuanVO pintuan) { memberVO.setGroupNum(requiredNum);
PromotionMessage promotionMessage = new PromotionMessage(pintuan.getId(), PromotionTypeEnum.PINTUAN.name(), PromotionStatusEnum.START.name(), pintuan.getStartTime(), pintuan.getEndTime()); memberVO.setGroupedNum(count);
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, memberVO.setToBeGroupedNum(toBoGrouped);
pintuan.getStartTime().getTime(),
promotionMessage,
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
rocketmqCustomProperties.getPromotionTopic());
//发送促销活动开始的延时任务
this.timeTrigger.addDelay(timeTriggerMsg);
}
/**
* 从es商品索引中中移除拼团活动
*
* @param id 拼团活动ID
* @param originStartTime 活动开始时间
*/
private void removePintuanGoodsFromEs(String id, Long originStartTime) {
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR,
originStartTime,
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (PromotionTypeEnum.PINTUAN.name() + id)),
rocketmqCustomProperties.getPromotionTopic());
} }
/** /**
@ -424,7 +273,7 @@ public class PintuanServiceImpl extends ServiceImpl<PintuanMapper, Pintuan> impl
* @param pintuan 拼团活动信息 * @param pintuan 拼团活动信息
* @param collect 检查的订单列表 * @param collect 检查的订单列表
*/ */
private void isOpenFictitiousPintuan(PintuanVO pintuan, Map<String, List<Order>> collect) { private void isOpenFictitiousPintuan(Pintuan pintuan, Map<String, List<Order>> collect) {
//成团人数 //成团人数
Integer requiredNum = pintuan.getRequiredNum(); Integer requiredNum = pintuan.getRequiredNum();
@ -432,13 +281,14 @@ public class PintuanServiceImpl extends ServiceImpl<PintuanMapper, Pintuan> impl
//是否开启虚拟成团 //是否开启虚拟成团
if (Boolean.FALSE.equals(pintuan.getFictitious()) && entry.getValue().size() < requiredNum) { if (Boolean.FALSE.equals(pintuan.getFictitious()) && entry.getValue().size() < requiredNum) {
//如果未开启虚拟成团且已参团人数小于成团人数则自动取消订单 //如果未开启虚拟成团且已参团人数小于成团人数则自动取消订单
LambdaUpdateWrapper<Order> updateWrapper = new LambdaUpdateWrapper<>(); String reason = "拼团活动结束订单未付款,系统自动取消订单";
updateWrapper.eq(Order::getOrderPromotionType, PromotionTypeEnum.PINTUAN.name()); if (CharSequenceUtil.isNotEmpty(entry.getKey())) {
updateWrapper.eq(Order::getPromotionId, pintuan.getId()); this.orderService.systemCancel(entry.getKey(), reason);
updateWrapper.eq(Order::getParentOrderSn, entry.getKey()); } else {
updateWrapper.set(Order::getOrderStatus, OrderStatusEnum.CANCELLED.name()); for (Order order : entry.getValue()) {
updateWrapper.set(Order::getCancelReason, "拼团活动结束订单未付款,系统自动取消订单"); this.orderService.systemCancel(order.getSn(), reason);
orderService.update(updateWrapper); }
}
} else if (Boolean.TRUE.equals(pintuan.getFictitious())) { } else if (Boolean.TRUE.equals(pintuan.getFictitious())) {
this.fictitiousPintuan(entry, requiredNum); this.fictitiousPintuan(entry, requiredNum);
} }
@ -484,20 +334,6 @@ public class PintuanServiceImpl extends ServiceImpl<PintuanMapper, Pintuan> impl
} }
} }
/**
* 检查当前拼团活动是否存在
*
* @param pintuanId 拼团id
* @return 拼团活动
*/
private PintuanVO checkExist(String pintuanId) {
PintuanVO pintuan = mongoTemplate.findById(pintuanId, PintuanVO.class);
if (pintuan == null) {
throw new ServiceException(ResultCode.PINTUAN_NOT_EXIST_ERROR);
}
return pintuan;
}
/** /**
* 更新记录的促销商品信息 * 更新记录的促销商品信息
* *
@ -521,9 +357,10 @@ public class PintuanServiceImpl extends ServiceImpl<PintuanMapper, Pintuan> impl
throw new ServiceException("商品[" + promotionGood.getGoodsName() + "]已经在重叠的时间段参加了秒杀活动或拼团活动,不能参加拼团活动"); throw new ServiceException("商品[" + promotionGood.getGoodsName() + "]已经在重叠的时间段参加了秒杀活动或拼团活动,不能参加拼团活动");
} }
} }
LambdaQueryWrapper<PromotionGoods> queryWrapper = new LambdaQueryWrapper<>(); PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
queryWrapper.eq(PromotionGoods::getPromotionId, pintuan.getId()).eq(PromotionGoods::getPromotionType, PromotionTypeEnum.PINTUAN.name()); searchParams.setPromotionId(pintuan.getId());
promotionGoodsService.remove(queryWrapper); searchParams.setPromotionType(PromotionTypeEnum.PINTUAN.name());
promotionGoodsService.deletePromotionGoods(searchParams);
promotionGoodsService.saveOrUpdateBatch(promotionGoods); promotionGoodsService.saveOrUpdateBatch(promotionGoods);
} }
} }

View File

@ -1,12 +1,12 @@
package cn.lili.modules.promotion.serviceimpl; package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.modules.promotion.entity.dos.PointsGoodsCategory; import cn.lili.modules.promotion.entity.dos.PointsGoodsCategory;
import cn.lili.modules.promotion.mapper.PointsGoodsCategoryMapper; import cn.lili.modules.promotion.mapper.PointsGoodsCategoryMapper;
import cn.lili.modules.promotion.service.PointsGoodsCategoryService; import cn.lili.modules.promotion.service.PointsGoodsCategoryService;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -69,7 +69,7 @@ public class PointsGoodsCategoryServiceImpl extends ServiceImpl<PointsGoodsCateg
@Override @Override
public IPage<PointsGoodsCategory> getCategoryByPage(String name, PageVO page) { public IPage<PointsGoodsCategory> getCategoryByPage(String name, PageVO page) {
LambdaQueryWrapper<PointsGoodsCategory> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<PointsGoodsCategory> queryWrapper = new LambdaQueryWrapper<>();
if (StrUtil.isNotEmpty(name)) { if (CharSequenceUtil.isNotEmpty(name)) {
queryWrapper.like(PointsGoodsCategory::getName, name); queryWrapper.like(PointsGoodsCategory::getName, name);
} }
page.setOrder("ASC"); page.setOrder("ASC");

View File

@ -1,44 +1,33 @@
package cn.lili.modules.promotion.serviceimpl; package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.map.MapUtil;
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.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
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.trigger.model.TimeExecuteConstant;
import cn.lili.trigger.model.TimeTriggerMsg;
import cn.lili.common.utils.DateUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.promotion.entity.dos.PointsGoods; import cn.lili.modules.promotion.entity.dos.PointsGoods;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.entity.vos.PointsGoodsSearchParams;
import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; import cn.lili.modules.promotion.entity.vos.PointsGoodsVO;
import cn.lili.modules.promotion.mapper.PointsGoodsMapper; import cn.lili.modules.promotion.mapper.PointsGoodsMapper;
import cn.lili.modules.promotion.service.PointsGoodsService; import cn.lili.modules.promotion.service.PointsGoodsService;
import cn.lili.modules.promotion.service.PromotionGoodsService;
import cn.lili.modules.promotion.tools.PromotionTools; import cn.lili.modules.promotion.tools.PromotionTools;
import cn.lili.modules.search.service.EsGoodsIndexService; import cn.lili.modules.search.service.EsGoodsIndexService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
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.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 积分商品业务层实现 * 积分商品业务层实现
@ -48,150 +37,94 @@ import java.util.List;
**/ **/
@Service @Service
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public class PointsGoodsServiceImpl extends ServiceImpl<PointsGoodsMapper, PointsGoods> implements PointsGoodsService { @Slf4j
public class PointsGoodsServiceImpl extends AbstractPromotionsServiceImpl<PointsGoodsMapper, PointsGoods> implements PointsGoodsService {
/** /**
* 延时任务 * 促销商品
*/ */
@Autowired @Autowired
private TimeTrigger timeTrigger; private PromotionGoodsService promotionGoodsService;
/**
* Mongo
*/
@Autowired
private MongoTemplate mongoTemplate;
/**
* RocketMQ
*/
@Autowired
private RocketmqCustomProperties rocketmqCustomProperties;
/** /**
* 规格商品 * 规格商品
*/ */
@Autowired @Autowired
private GoodsSkuService goodsSkuService; private GoodsSkuService goodsSkuService;
/**
* Es商品
*/
@Autowired @Autowired
private EsGoodsIndexService goodsIndexService; private EsGoodsIndexService goodsIndexService;
/**
* 批量添加积分商品
*
* @param pointsGoodsList 积分商品列表
* @return 是否添加成功
*/
@Override @Override
public boolean addPointsGoods(List<PointsGoodsVO> pointsGoodsList) { public boolean savePointsGoodsBatch(List<PointsGoods> promotionsList) {
List<PointsGoods> pointsGoodsList1 = new ArrayList<>(); List<PromotionGoods> promotionGoodsList = new ArrayList<>();
for (PointsGoodsVO pointsGoods : pointsGoodsList) { Map<String, Long> skuPoints = new HashMap<>();
GoodsSku goodsSku = this.checkSkuExist(pointsGoods.getSkuId()); for (PointsGoods pointsGoods : promotionsList) {
this.checkParam(pointsGoods, goodsSku); this.initPromotion(pointsGoods);
pointsGoods.setGoodsSku(goodsSku); this.checkPromotions(pointsGoods);
PromotionTools.checkPromotionTime(pointsGoods.getStartTime().getTime(), pointsGoods.getEndTime().getTime());
if (this.checkSkuDuplicate(pointsGoods.getSkuId(), null) == null) { if (this.checkSkuDuplicate(pointsGoods.getSkuId(), null) == null) {
pointsGoods.setPromotionStatus(PromotionStatusEnum.NEW.name());
pointsGoods.setPromotionName("积分商品活动"); pointsGoods.setPromotionName("积分商品活动");
pointsGoodsList1.add(pointsGoods);
} else { } else {
throw new ServiceException("商品id为" + pointsGoods.getSkuId() + "的商品已参加积分商品活动!"); throw new ServiceException("商品id为" + pointsGoods.getSkuId() + "的商品已参加积分商品活动!");
} }
}
this.saveBatch(pointsGoodsList1);
for (PointsGoodsVO pointsGoods : pointsGoodsList) {
this.mongoTemplate.save(pointsGoods);
this.addPointsGoodsPromotionTask(pointsGoods);
}
return true;
}
/**
* 更新一个积分商品
*
* @param pointsGoods 编辑的积分商品信息
* @return 是否更新成功
*/
@Override
public boolean updatePointsGoods(PointsGoodsVO pointsGoods) {
boolean result = false;
PointsGoodsVO pointsGoodsVO = this.checkExist(pointsGoods.getId());
GoodsSku goodsSku = this.checkSkuExist(pointsGoods.getSkuId()); GoodsSku goodsSku = this.checkSkuExist(pointsGoods.getSkuId());
this.checkParam(pointsGoods, goodsSku); pointsGoods.setStoreId(goodsSku.getStoreId());
pointsGoods.setGoodsSku(goodsSku); pointsGoods.setStoreName(goodsSku.getStoreName());
if (this.checkSkuDuplicate(pointsGoods.getSkuId(), pointsGoods.getId()) == null) { PromotionGoods promotionGoods = new PromotionGoods(pointsGoods, goodsSku);
if (PromotionStatusEnum.START.name().equals(pointsGoods.getPromotionStatus()) || PromotionStatusEnum.END.name().equals(pointsGoods.getPromotionStatus())) { promotionGoods.setPromotionType(PromotionTypeEnum.POINTS_GOODS.name());
throw new ServiceException(ResultCode.PROMOTION_UPDATE_ERROR); promotionGoodsList.add(promotionGoods);
skuPoints.put(pointsGoods.getSkuId(), pointsGoods.getPoints());
} }
PromotionTools.checkPromotionTime(pointsGoods.getStartTime().getTime(), pointsGoods.getEndTime().getTime()); boolean saveBatch = this.saveBatch(promotionsList);
result = this.updateById(pointsGoods); if (saveBatch) {
this.mongoTemplate.save(pointsGoods); this.promotionGoodsService.saveOrUpdateBatch(promotionGoodsList);
if (pointsGoods.getStartTime().getTime() != pointsGoodsVO.getStartTime().getTime()) { for (Map.Entry<String, Long> entry : skuPoints.entrySet()) {
PromotionMessage promotionMessage = new PromotionMessage(pointsGoods.getId(), PromotionTypeEnum.POINTS_GOODS.name(), PromotionStatusEnum.START.name(), pointsGoods.getStartTime(), pointsGoods.getEndTime()); Map<String, Object> query = MapUtil.builder(new HashMap<String, Object>()).put("id", entry.getKey()).build();
//更新延时任务 Map<String, Object> update = MapUtil.builder(new HashMap<String, Object>()).put("points", entry.getValue()).build();
this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR, this.goodsIndexService.updateIndex(query, update);
promotionMessage,
pointsGoodsVO.getStartTime().getTime(),
pointsGoods.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
DateUtil.getDelayTime(pointsGoods.getStartTime().getTime()),
rocketmqCustomProperties.getPromotionTopic());
} }
} }
return result; return saveBatch;
} }
/** /**
* 批量更新积分商品状态 * 积分商品更新
* *
* @param ids 积分商品id集合 * @param promotions 促销信息
* @param promotionStatus 更新的状态
* @return 是否更新成功 * @return 是否更新成功
*/ */
@Override @Override
public boolean updatePointsGoodsPromotionStatus(List<String> ids, String promotionStatus) { public boolean updatePromotions(PointsGoods promotions) {
for (String id : ids) { boolean result = false;
PointsGoodsVO pointsGoodsVO = this.checkExist(id); this.checkStatus(promotions);
pointsGoodsVO.setPromotionStatus(PromotionStatusEnum.valueOf(promotionStatus).name()); this.checkPromotions(promotions);
this.updateById(pointsGoodsVO); if (this.checkSkuDuplicate(promotions.getSkuId(), promotions.getId()) == null) {
this.mongoTemplate.save(pointsGoodsVO); result = this.updateById(promotions);
if (promotionStatus.equals(PromotionStatusEnum.START.name())) { this.updatePromotionsGoods(promotions);
this.addPointsGoodsPromotionTask(pointsGoodsVO); this.updateEsGoodsIndex(promotions);
} else {
this.goodsIndexService.deleteEsGoodsPromotionIndexByList(Collections.singletonList(pointsGoodsVO.getSkuId()), PromotionTypeEnum.POINTS_GOODS);
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR,
pointsGoodsVO.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (PromotionTypeEnum.POINTS_GOODS.name() + pointsGoodsVO.getId())),
rocketmqCustomProperties.getPromotionTopic());
} }
} return result;
return true;
} }
/** /**
* 批量删除积分商品 * 移除促销活动
* *
* @param ids 积分商品id集合 * @param ids 促销活动id集合
* @return 是否除成功 * @return 是否除成功
*/ */
@Override @Override
public boolean deletePointsGoods(List<String> ids) { public boolean removePromotions(List<String> ids) {
List<String> skuIds = new ArrayList<>();
for (String id : ids) { for (String id : ids) {
PointsGoodsVO pointsGoodsVO = this.checkExist(id); PointsGoods pointsGoods = this.getById(id);
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, if (pointsGoods == null) {
pointsGoodsVO.getStartTime().getTime(), log.error(ResultCode.POINT_GOODS_NOT_EXIST.message());
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (PromotionTypeEnum.POINTS_GOODS.name() + pointsGoodsVO.getId())), ids.remove(id);
rocketmqCustomProperties.getPromotionTopic());
skuIds.add(pointsGoodsVO.getSkuId());
} }
boolean result = this.removeByIds(ids); }
this.goodsIndexService.deleteEsGoodsPromotionIndexByList(skuIds, PromotionTypeEnum.POINTS_GOODS); this.promotionGoodsService.deletePromotionGoods(ids);
Query query = new Query(); return this.removeByIds(ids);
query.addCriteria(new Criteria("id").in(ids));
this.mongoTemplate.remove(query, PointsGoodsVO.class);
return result;
} }
/** /**
@ -202,79 +135,103 @@ public class PointsGoodsServiceImpl extends ServiceImpl<PointsGoodsMapper, Point
*/ */
@Override @Override
public PointsGoodsVO getPointsGoodsDetail(String id) { public PointsGoodsVO getPointsGoodsDetail(String id) {
return this.checkExist(id); PointsGoods pointsGoods = this.checkExist(id);
} PointsGoodsVO pointsGoodsVO = new PointsGoodsVO();
BeanUtils.copyProperties(pointsGoods, pointsGoodsVO);
@Override pointsGoodsVO.setGoodsSku(this.checkSkuExist(pointsGoods.getSkuId()));
public PointsGoodsVO getPointsGoodsVOByMongo(String skuId) { return pointsGoodsVO;
//mongo查询条件
Query query = new Query();
query.addCriteria(Criteria.where("skuId").is(skuId))
.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.START.name()));
List<PointsGoodsVO> pointsGoodsVO = this.mongoTemplate.find(query, PointsGoodsVO.class);
if (pointsGoodsVO != null && pointsGoodsVO.size() > 0) {
return pointsGoodsVO.get(0);
}
return null;
} }
/** /**
* 根据条件查询积分商品 * 根据ID获取积分详情
* *
* @param searchParams 积分商品查询参数 * @param skuId 商品SkuId
* @param page 分页参数 * @return 积分详情
* @return 积分商品查询结果
*/ */
@Override @Override
public IPage<PointsGoodsVO> getPointsGoodsByPage(PointsGoodsSearchParams searchParams, PageVO page) { public PointsGoodsVO getPointsGoodsDetailBySkuId(String skuId) {
IPage<PointsGoodsVO> pointsGoodsPage = new Page<>(); PointsGoods pointsGoods = this.getOne(new LambdaQueryWrapper<PointsGoods>().eq(PointsGoods::getSkuId, skuId), false);
if (UserContext.getCurrentUser().getRole().equals(UserEnums.MEMBER)) { if (pointsGoods == null) {
searchParams.setPromotionStatus(PromotionStatusEnum.START.name()); log.error("skuId为" + skuId + "的积分商品不存在!");
throw new ServiceException();
} }
Query query = searchParams.mongoQuery(); PointsGoodsVO pointsGoodsVO = new PointsGoodsVO();
if (page != null) { BeanUtils.copyProperties(pointsGoods, pointsGoodsVO);
PromotionTools.mongoQueryPageParam(query, page); pointsGoodsVO.setGoodsSku(this.checkSkuExist(pointsGoods.getSkuId()));
pointsGoodsPage.setSize(page.getPageSize()); return pointsGoodsVO;
pointsGoodsPage.setCurrent(page.getPageNumber());
}
List<PointsGoodsVO> pointsGoodsVOS = this.mongoTemplate.find(query, PointsGoodsVO.class);
pointsGoodsPage.setRecords(pointsGoodsVOS);
pointsGoodsPage.setTotal(this.mongoTemplate.count(searchParams.mongoQuery(), PointsGoodsVO.class));
return pointsGoodsPage;
} }
/** /**
* 添加积分商品mq任务 * 检查促销参数
* *
* @param pointsGoods 积分商品信息 * @param promotions 促销实体
*/ */
private void addPointsGoodsPromotionTask(PointsGoodsVO pointsGoods) { @Override
PromotionMessage promotionMessage = new PromotionMessage(pointsGoods.getId(), PromotionTypeEnum.POINTS_GOODS.name(), public void checkPromotions(PointsGoods promotions) {
PromotionStatusEnum.START.name(), super.checkPromotions(promotions);
pointsGoods.getStartTime(), pointsGoods.getEndTime()); GoodsSku goodsSku = this.checkSkuExist(promotions.getSkuId());
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, if (promotions.getActiveStock() > goodsSku.getQuantity()) {
promotionMessage.getStartTime().getTime(), throw new ServiceException(ResultCode.POINT_GOODS_ACTIVE_STOCK_ERROR);
promotionMessage, }
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
rocketmqCustomProperties.getPromotionTopic());
//发送促销活动开始的延时任务
this.timeTrigger.addDelay(timeTriggerMsg);
} }
/** /**
* 检查mongo中积分商品存在 * 检查促销状态
*
* @param promotions 促销实体
*/
@Override
public void checkStatus(PointsGoods promotions) {
super.checkStatus(promotions);
}
/**
* 更新促销商品信息
*
* @param promotions 促销实体
*/
@Override
public void updatePromotionsGoods(PointsGoods promotions) {
this.promotionGoodsService.remove(new LambdaQueryWrapper<PromotionGoods>().eq(PromotionGoods::getPromotionId, promotions.getId()));
this.promotionGoodsService.save(new PromotionGoods(promotions, this.checkSkuExist(promotions.getSkuId())));
}
/**
* 更新促销信息到商品索引
*
* @param promotions 促销实体
*/
@Override
public void updateEsGoodsIndex(PointsGoods promotions) {
Map<String, Object> query = MapUtil.builder(new HashMap<String, Object>()).put("id", promotions.getSkuId()).build();
Map<String, Object> update = MapUtil.builder(new HashMap<String, Object>()).put("points", promotions.getPoints()).build();
this.goodsIndexService.updateIndex(query, update);
}
/**
* 当前促销类型
*
* @return 当前促销类型
*/
@Override
public PromotionTypeEnum getPromotionType() {
return PromotionTypeEnum.POINTS_GOODS;
}
/**
* 检查积分商品存在
* *
* @param id 积分商品id * @param id 积分商品id
* @return 积分商品信息 * @return 积分商品信息
*/ */
private PointsGoodsVO checkExist(String id) { private PointsGoods checkExist(String id) {
PointsGoodsVO pointsGoodsVO = this.mongoTemplate.findById(id, PointsGoodsVO.class); PointsGoods pointsGoods = this.getById(id);
if (pointsGoodsVO == null) { if (pointsGoods == null) {
log.error("id为" + id + "的积分商品不存在!"); log.error("id为" + id + "的积分商品不存在!");
throw new ServiceException(); throw new ServiceException();
} }
return pointsGoodsVO; return pointsGoods;
} }
/** /**
@ -285,13 +242,15 @@ public class PointsGoodsServiceImpl extends ServiceImpl<PointsGoodsMapper, Point
* @return 积分商品信息 * @return 积分商品信息
*/ */
private PointsGoods checkSkuDuplicate(String skuId, String id) { private PointsGoods checkSkuDuplicate(String skuId, String id) {
LambdaQueryWrapper<PointsGoods> queryWrapper = new LambdaQueryWrapper<>(); QueryWrapper<PointsGoods> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(PointsGoods::getSkuId, skuId); queryWrapper.eq("sku_id", skuId);
if (StrUtil.isNotEmpty(id)) { if (CharSequenceUtil.isNotEmpty(id)) {
queryWrapper.ne(PointsGoods::getId, id); queryWrapper.ne("id", id);
} }
queryWrapper.ne(PointsGoods::getPromotionStatus, PromotionStatusEnum.END.name()); queryWrapper.and(i -> i
return this.getOne(queryWrapper); .or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START))
.or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.NEW)));
return this.getOne(queryWrapper, false);
} }
/** /**
@ -309,15 +268,4 @@ public class PointsGoodsServiceImpl extends ServiceImpl<PointsGoodsMapper, Point
return goodsSku; return goodsSku;
} }
/**
* 检查参与积分商品参数
*
* @param pointsGoods 积分商品信息
* @param goodsSku 商品sku信息
*/
private void checkParam(PointsGoods pointsGoods, GoodsSku goodsSku) {
if (pointsGoods.getActiveStock() > goodsSku.getQuantity()) {
throw new ServiceException(ResultCode.POINT_GOODS_ACTIVE_STOCK_ERROR);
}
}
} }

View File

@ -5,38 +5,32 @@ import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.enums.PromotionTypeEnum; 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.BeanUtil;
import cn.lili.common.utils.DateUtil; import cn.lili.common.utils.DateUtil;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.entity.dto.GoodsSearchParams;
import cn.lili.modules.goods.entity.enums.GoodsAuthEnum;
import cn.lili.modules.goods.entity.enums.GoodsStatusEnum;
import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.order.cart.entity.vo.CartSkuVO; import cn.lili.modules.order.cart.entity.vo.CartSkuVO;
import cn.lili.modules.order.cart.entity.vo.FullDiscountVO; import cn.lili.modules.promotion.entity.dos.Coupon;
import cn.lili.modules.promotion.entity.dos.FullDiscount;
import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.dos.SeckillApply; import cn.lili.modules.promotion.entity.dos.SeckillApply;
import cn.lili.modules.promotion.entity.dto.BasePromotion; import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import cn.lili.modules.promotion.entity.dto.PromotionGoodsDTO; import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum; import cn.lili.modules.promotion.entity.vos.BasePromotionsSearchParams;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import cn.lili.modules.promotion.entity.vos.CouponVO;
import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams; import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams;
import cn.lili.modules.promotion.entity.vos.SeckillVO;
import cn.lili.modules.promotion.mapper.PromotionGoodsMapper; import cn.lili.modules.promotion.mapper.PromotionGoodsMapper;
import cn.lili.modules.promotion.service.CouponService;
import cn.lili.modules.promotion.service.FullDiscountService;
import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.promotion.service.PromotionGoodsService;
import cn.lili.modules.promotion.service.SeckillApplyService; import cn.lili.modules.promotion.service.SeckillApplyService;
import cn.lili.modules.promotion.tools.PromotionTools;
import cn.lili.mybatis.util.PageUtil; import cn.lili.mybatis.util.PageUtil;
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.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -53,14 +47,8 @@ import java.util.List;
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper, PromotionGoods> implements PromotionGoodsService { public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper, PromotionGoods> implements PromotionGoodsService {
/**
* Mongo
*/
@Autowired
private MongoTemplate mongoTemplate;
/** /**
* Redis * Redis
*/ */
@ -77,14 +65,11 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
@Autowired @Autowired
private GoodsSkuService goodsSkuService; private GoodsSkuService goodsSkuService;
@Autowired
private FullDiscountService fullDiscountService;
@Override @Autowired
public void removePromotionGoods(List<PromotionGoods> promotionGoodsList, PromotionTypeEnum promotionType) { private CouponService couponService;
for (PromotionGoods promotionGoods : promotionGoodsList) {
promotionGoods.setDeleteFlag(true);
}
updateBatchById(promotionGoodsList);
}
@Override @Override
public List<PromotionGoods> findNowSkuPromotion(String skuId) { public List<PromotionGoods> findNowSkuPromotion(String skuId) {
@ -93,46 +78,37 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
if (sku == null) { if (sku == null) {
return new ArrayList<>(); return new ArrayList<>();
} }
QueryWrapper<PromotionGoods> queryWrapper = new QueryWrapper<>();
List<PromotionGoods> promotionGoods = new ArrayList<>(this.list(new LambdaQueryWrapper<PromotionGoods>() queryWrapper.eq("sku_id", skuId);
.eq(PromotionGoods::getSkuId, skuId) queryWrapper.and(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START));
// .ge(PromotionGoods::getStartTime, new Date())
.eq(PromotionGoods::getPromotionStatus, PromotionStatusEnum.START.name()))); List<PromotionGoods> promotionGoods = this.list(queryWrapper);
BasePromotionsSearchParams searchParams = new BasePromotionsSearchParams();
searchParams.setPromotionStatus(PromotionsStatusEnum.START.name());
searchParams.setScopeType(PromotionsScopeTypeEnum.ALL.name());
//单独检查添加适用于全品类的满优惠活动 //单独检查添加适用于全品类的满优惠活动
Query query = new Query(); List<FullDiscount> fullDiscountVOS = this.fullDiscountService.listFindAll(searchParams);
query.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.START.name())); for (FullDiscount fullDiscountVO : fullDiscountVOS) {
query.addCriteria(Criteria.where("startTime").lte(System.currentTimeMillis()));
List<FullDiscountVO> fullDiscountVOS = mongoTemplate.find(query, FullDiscountVO.class);
for (FullDiscountVO fullDiscountVO : fullDiscountVOS) {
if (fullDiscountVO.getPromotionGoodsList() == null &&
sku.getStoreId().equals(fullDiscountVO.getStoreId())) {
PromotionGoods p = new PromotionGoods(sku); PromotionGoods p = new PromotionGoods(sku);
p.setPromotionId(fullDiscountVO.getId()); p.setPromotionId(fullDiscountVO.getId());
p.setPromotionStatus(fullDiscountVO.getPromotionStatus());
p.setPromotionType(PromotionTypeEnum.FULL_DISCOUNT.name()); p.setPromotionType(PromotionTypeEnum.FULL_DISCOUNT.name());
p.setStartTime(fullDiscountVO.getStartTime()); p.setStartTime(fullDiscountVO.getStartTime());
p.setEndTime(fullDiscountVO.getEndTime()); p.setEndTime(fullDiscountVO.getEndTime());
promotionGoods.add(p); promotionGoods.add(p);
} }
}
//单独检查添加适用于全品类的全平台或属于当前店铺的优惠券活动 //单独检查添加适用于全品类的全平台或属于当前店铺的优惠券活动
List<CouponVO> couponVOS = mongoTemplate.find(query, CouponVO.class); List<Coupon> couponVOS = this.couponService.listFindAll(searchParams);
for (CouponVO couponVO : couponVOS) { for (Coupon couponVO : couponVOS) {
boolean aLLScopeType = (couponVO.getPromotionGoodsList() == null
&& couponVO.getScopeType().equals(CouponScopeTypeEnum.ALL.name())
&& (("0").equals(couponVO.getStoreId()) || sku.getStoreId().equals(couponVO.getStoreId())));
if (aLLScopeType) {
PromotionGoods p = new PromotionGoods(sku); PromotionGoods p = new PromotionGoods(sku);
p.setPromotionId(couponVO.getId()); p.setPromotionId(couponVO.getId());
p.setPromotionStatus(couponVO.getPromotionStatus());
p.setPromotionType(PromotionTypeEnum.COUPON.name()); p.setPromotionType(PromotionTypeEnum.COUPON.name());
p.setStartTime(couponVO.getStartTime()); p.setStartTime(couponVO.getStartTime());
p.setEndTime(couponVO.getEndTime()); p.setEndTime(couponVO.getEndTime());
promotionGoods.add(p); promotionGoods.add(p);
} }
}
return promotionGoods; return promotionGoods;
} }
@ -149,76 +125,63 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
} }
@Override @Override
public List<PromotionGoods> getPromotionGoods(String skuId) { public IPage<PromotionGoods> pageFindAll(PromotionGoodsSearchParams searchParams, PageVO pageVo) {
long currTime = DateUtil.getDateline(); return this.page(PageUtil.initPage(pageVo), searchParams.queryWrapper());
String currDate = DateUtil.toString(currTime, DateUtil.STANDARD_DATE_NO_UNDERLINE_FORMAT);
LambdaQueryWrapper<PromotionGoods> queryWrapper = new LambdaQueryWrapper<PromotionGoods>()
.eq(PromotionGoods::getSkuId, skuId)
.le(PromotionGoods::getStartTime, currTime)
.ge(PromotionGoods::getEndTime, currDate)
.ne(PromotionGoods::getPromotionType, PromotionTypeEnum.PINTUAN.name())
.ne(PromotionGoods::getPromotionType, PromotionTypeEnum.SECKILL.name());
return this.baseMapper.selectList(queryWrapper);
} }
/**
* 获取促销商品信息
*
* @param searchParams 查询参数
* @return 促销商品列表
*/
@Override @Override
public IPage<PromotionGoodsDTO> getPromotionGoods(PromotionGoodsSearchParams searchParams, PageVO pageVo) { public List<PromotionGoods> listFindAll(PromotionGoodsSearchParams searchParams) {
IPage<PromotionGoodsDTO> promotionGoodsPage = new Page<>(); return this.list(searchParams.queryWrapper());
LambdaQueryWrapper<PromotionGoods> queryChainWrapper = searchParams.queryWrapper();
List<PromotionGoodsDTO> promotionGoodsList = new ArrayList<>();
Page<PromotionGoods> page = this.page(PageUtil.initPage(pageVo), queryChainWrapper);
promotionGoodsPage.setSize(page.getSize());
promotionGoodsPage.setTotal(page.getTotal());
promotionGoodsPage.setPages(page.getPages());
for (PromotionGoods promotionGoods : page.getRecords()) {
PromotionGoodsDTO promotionGoodsDTO = this.wrapperPromotionGoodsDTO(promotionGoods);
promotionGoodsList.add(promotionGoodsDTO);
}
promotionGoodsPage.setRecords(promotionGoodsList);
return promotionGoodsPage;
} }
/**
* 获取促销商品信息
*
* @param searchParams 查询参数
* @return 促销商品信息
*/
@Override @Override
public IPage<PromotionGoodsDTO> getCurrentPromotionGoods(String promotionType, PageVO pageVo) { public PromotionGoods getPromotionsGoods(PromotionGoodsSearchParams searchParams) {
IPage<PromotionGoodsDTO> promotionGoodsPage = new Page<>(); return this.getOne(searchParams.queryWrapper(), false);
promotionGoodsPage.setSize(pageVo.getPageSize());
promotionGoodsPage.setCurrent(pageVo.getPageNumber());
Date now = new Date();
Query query = new Query();
query.addCriteria(Criteria.where("startTime").lte(now));
query.addCriteria(Criteria.where("endTime").gte(now));
List<PromotionGoodsDTO> promotionGoodsDTOList = new ArrayList<>();
int total = 0;
//根据促销活动类型的不同将满足当前促销活动类型且正在进行的促销商品返回出去
switch (PromotionTypeEnum.valueOf(promotionType)) {
case FULL_DISCOUNT:
List<FullDiscountVO> fullDiscountVOS = this.mongoTemplate.find(query, FullDiscountVO.class);
this.setFullDiscountPromotionGoods(promotionGoodsPage, fullDiscountVOS, pageVo);
break;
case COUPON:
List<CouponVO> couponVOS = this.mongoTemplate.find(query, CouponVO.class);
for (CouponVO couponVO : couponVOS) {
if (couponVO != null && couponVO.getPromotionGoodsList() == null) {
IPage<PromotionGoodsDTO> page = this.getAllGoodsSkuToPromotionGoodsByPage(couponVO.getStoreId(), couponVO, pageVo);
promotionGoodsDTOList.addAll(page.getRecords());
total += page.getTotal();
}
}
promotionGoodsPage.setRecords(promotionGoodsDTOList.subList(0, pageVo.getPageSize()));
promotionGoodsPage.setTotal(total);
break;
case SECKILL:
case POINTS_GOODS:
return promotionGoodsPage;
default:
break;
}
if (promotionGoodsPage.getRecords() == null || promotionGoodsPage.getRecords().isEmpty()) {
promotionGoodsPage = this.getGoodsSkuToPromotionGoodsByPage(promotionType, pageVo);
}
return promotionGoodsPage;
} }
/**
* 获取当前有效时间特定促销类型的促销商品信息
*
* @param skuId 查询参数
* @param promotionTypes 特定促销类型
* @return 促销商品信息
*/
@Override
public PromotionGoods getValidPromotionsGoods(String skuId, List<String> promotionTypes) {
QueryWrapper<PromotionGoods> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("sku_id", skuId);
queryWrapper.in("promotion_type", promotionTypes);
queryWrapper.and(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START));
return this.getOne(queryWrapper, false);
}
/**
* 获取当前有效时间特定促销类型的促销商品价格
*
* @param skuId skuId
* @param promotionTypes 特定促销类型
* @return 促销商品价格
*/
@Override
public Double getValidPromotionsGoodsPrice(String skuId, List<String> promotionTypes) {
QueryWrapper<PromotionGoods> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("sku_id", skuId);
queryWrapper.in("promotion_type", promotionTypes);
queryWrapper.and(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START));
return this.baseMapper.selectPromotionsGoodsPrice(queryWrapper);
}
@Override @Override
public Integer findInnerOverlapPromotionGoods(String promotionType, String skuId, Date startTime, Date endTime, String promotionId) { public Integer findInnerOverlapPromotionGoods(String promotionType, String skuId, Date startTime, Date endTime, String promotionId) {
@ -249,7 +212,11 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
//如果为空 //如果为空
else { else {
//获取促销商品如果不存在促销商品则返回0 //获取促销商品如果不存在促销商品则返回0
PromotionGoods promotionGoods = this.getPromotionGoods(typeEnum, promotionId, skuId); PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
searchParams.setPromotionType(typeEnum.name());
searchParams.setPromotionId(promotionId);
searchParams.setSkuId(skuId);
PromotionGoods promotionGoods = this.getPromotionsGoods(searchParams);
if (promotionGoods == null) { if (promotionGoods == null) {
return 0; return 0;
} }
@ -261,8 +228,12 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
@Override @Override
public List<Integer> getPromotionGoodsStock(PromotionTypeEnum typeEnum, String promotionId, List<String> skuId) { public List<Integer> getPromotionGoodsStock(PromotionTypeEnum typeEnum, String promotionId, List<String> skuId) {
PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
searchParams.setPromotionType(typeEnum.name());
searchParams.setPromotionId(promotionId);
searchParams.setSkuIds(skuId);
//获取促销商品如果不存在促销商品则返回0 //获取促销商品如果不存在促销商品则返回0
List<PromotionGoods> promotionGoods = this.getPromotionGoods(typeEnum, promotionId, skuId); List<PromotionGoods> promotionGoods = this.listFindAll(searchParams);
//接收数据 //接收数据
List<Integer> result = new ArrayList<>(skuId.size()); List<Integer> result = new ArrayList<>(skuId.size());
for (String sid : skuId) { for (String sid : skuId) {
@ -281,37 +252,6 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
return result; return result;
} }
/**
* 根据条件获取促销活动商品详情
*
* @param typeEnum 促销类型
* @param promotionId 促销活动id
* @param skuId 商品skuId
* @return 促销活动商品详情
*/
@Override
public PromotionGoods getPromotionGoods(PromotionTypeEnum typeEnum, String promotionId, String skuId) {
LambdaQueryWrapper<PromotionGoods> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PromotionGoods::getPromotionType, typeEnum.name()).eq(PromotionGoods::getPromotionId, promotionId).eq(PromotionGoods::getSkuId, skuId);
return this.getOne(queryWrapper);
}
/**
* 根据条件获取促销活动商品详情
*
* @param typeEnum 促销类型
* @param promotionId 促销活动id
* @param skuId 商品skuId
* @return 促销活动商品详情
*/
@Override
public List<PromotionGoods> getPromotionGoods(PromotionTypeEnum typeEnum, String promotionId, List<String> skuId) {
LambdaQueryWrapper<PromotionGoods> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PromotionGoods::getPromotionType, typeEnum.name()).eq(PromotionGoods::getPromotionId, promotionId)
.in(PromotionGoods::getSkuId, skuId);
return this.list(queryWrapper);
}
/** /**
* 更新促销活动商品库存 * 更新促销活动商品库存
* *
@ -326,7 +266,7 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
if (typeEnum.equals(PromotionTypeEnum.SECKILL)) { if (typeEnum.equals(PromotionTypeEnum.SECKILL)) {
LambdaQueryWrapper<SeckillApply> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SeckillApply> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SeckillApply::getSeckillId, promotionId).eq(SeckillApply::getSkuId, skuId); queryWrapper.eq(SeckillApply::getSeckillId, promotionId).eq(SeckillApply::getSkuId, skuId);
SeckillApply seckillApply = seckillApplyService.getOne(queryWrapper); SeckillApply seckillApply = this.seckillApplyService.getOne(queryWrapper, false);
if (seckillApply == null) { if (seckillApply == null) {
throw new ServiceException(ResultCode.SECKILL_NOT_EXIST_ERROR); throw new ServiceException(ResultCode.SECKILL_NOT_EXIST_ERROR);
} }
@ -334,15 +274,6 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
updateWrapper.eq(SeckillApply::getSeckillId, promotionId).eq(SeckillApply::getSkuId, skuId); updateWrapper.eq(SeckillApply::getSeckillId, promotionId).eq(SeckillApply::getSkuId, skuId);
updateWrapper.set(SeckillApply::getQuantity, quantity); updateWrapper.set(SeckillApply::getQuantity, quantity);
seckillApplyService.update(updateWrapper); seckillApplyService.update(updateWrapper);
SeckillVO seckillVO = mongoTemplate.findById(promotionId, SeckillVO.class);
if (seckillVO != null && seckillApply.getPromotionApplyStatus() != null) {
for (SeckillApply apply : seckillVO.getSeckillApplyList()) {
if (apply.getSkuId().equals(skuId)) {
apply.setQuantity(quantity);
}
}
this.mongoTemplate.save(seckillVO);
}
} else { } else {
LambdaUpdateWrapper<PromotionGoods> updateWrapper = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<PromotionGoods> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(PromotionGoods::getPromotionType, typeEnum.name()).eq(PromotionGoods::getPromotionId, promotionId).eq(PromotionGoods::getSkuId, skuId); updateWrapper.eq(PromotionGoods::getPromotionType, typeEnum.name()).eq(PromotionGoods::getPromotionId, promotionId).eq(PromotionGoods::getSkuId, skuId);
@ -353,80 +284,52 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
stringRedisTemplate.opsForValue().set(promotionStockKey, quantity.toString()); stringRedisTemplate.opsForValue().set(promotionStockKey, quantity.toString());
} }
private void setFullDiscountPromotionGoods(IPage<PromotionGoodsDTO> promotionGoodsPage, List<FullDiscountVO> fullDiscountVOS, PageVO pageVo) { /**
List<PromotionGoodsDTO> promotionGoodsDTOList = new ArrayList<>(); * 更新促销活动商品库存
int total = 0; *
for (FullDiscountVO fullDiscountVO : fullDiscountVOS) { * @param promotionGoods 促销信息
if (fullDiscountVO != null && fullDiscountVO.getPromotionGoodsList() == null) { */
IPage<PromotionGoodsDTO> page = this.getAllGoodsSkuToPromotionGoodsByPage(fullDiscountVO.getStoreId(), fullDiscountVO, pageVo); @Override
promotionGoodsDTOList.addAll(page.getRecords()); public void updatePromotionGoodsByPromotions(PromotionGoods promotionGoods) {
total += page.getTotal(); LambdaQueryWrapper<PromotionGoods> queryWrapper = new LambdaQueryWrapper<>();
} queryWrapper.eq(PromotionGoods::getPromotionId, promotionGoods.getPromotionId());
} this.remove(queryWrapper);
if (!fullDiscountVOS.isEmpty() && !promotionGoodsDTOList.isEmpty()) { this.save(promotionGoods);
promotionGoodsPage.setRecords(promotionGoodsDTOList.subList(0, pageVo.getPageSize()));
promotionGoodsPage.setTotal(total);
}
} }
private IPage<PromotionGoodsDTO> getGoodsSkuToPromotionGoodsByPage(String promotionType, PageVO pageVo) { /**
Date date = new Date(); * 删除促销商品
IPage<PromotionGoodsDTO> promotionGoodsPage = new Page<>(); *
LambdaQueryWrapper<PromotionGoods> queryChainWrapper = new LambdaQueryWrapper<PromotionGoods>() * @param promotionId 促销活动id
.eq(PromotionGoods::getPromotionType, PromotionTypeEnum.valueOf(promotionType).name()) * @param skuIds skuId
.le(PromotionGoods::getStartTime, date).ge(PromotionGoods::getEndTime, date); */
List<PromotionGoodsDTO> promotionGoodsList = new ArrayList<>(); @Override
Page<PromotionGoods> page = this.page(PageUtil.initPage(pageVo), queryChainWrapper); public void deletePromotionGoods(String promotionId, List<String> skuIds) {
promotionGoodsPage.setTotal(page.getTotal()); LambdaQueryWrapper<PromotionGoods> queryWrapper = new LambdaQueryWrapper<PromotionGoods>()
promotionGoodsPage.setPages(page.getPages()); .eq(PromotionGoods::getPromotionId, promotionId).in(PromotionGoods::getSkuId, skuIds);
List<PromotionGoods> records = page.getRecords(); this.remove(queryWrapper);
for (PromotionGoods promotionGoods : records) {
PromotionGoodsDTO promotionGoodsDTO = this.wrapperPromotionGoodsDTO(promotionGoods);
promotionGoodsList.add(promotionGoodsDTO);
}
promotionGoodsPage.setRecords(promotionGoodsList);
return promotionGoodsPage;
} }
private PromotionGoodsDTO wrapperPromotionGoodsDTO(PromotionGoods promotionGoods) { /**
PromotionGoodsDTO promotionGoodsDTO = new PromotionGoodsDTO(); * 删除促销促销商品
GoodsSku goodsSku = goodsSkuService.getById(promotionGoods.getSkuId()); *
BeanUtil.copyProperties(promotionGoods, promotionGoodsDTO); * @param promotionIds 促销活动id
if (goodsSku != null) { */
promotionGoodsDTO.setGoodsId(goodsSku.getGoodsId()); @Override
promotionGoodsDTO.setGoodsImage(goodsSku.getThumbnail()); public void deletePromotionGoods(List<String> promotionIds) {
promotionGoodsDTO.setGoodsName(goodsSku.getGoodsName()); LambdaQueryWrapper<PromotionGoods> queryWrapper = new LambdaQueryWrapper<PromotionGoods>()
promotionGoodsDTO.setOriginPrice(goodsSku.getPrice()); .in(PromotionGoods::getPromotionId, promotionIds);
} this.remove(queryWrapper);
return promotionGoodsDTO;
} }
private IPage<PromotionGoodsDTO> getAllGoodsSkuToPromotionGoodsByPage(String storeId, BasePromotion promotion, PageVO pageVo) { /**
IPage<PromotionGoodsDTO> promotionGoodsPage = new Page<>(); * 根据参数删除促销商品
List<PromotionGoodsDTO> promotionGoodsList = new ArrayList<>(); *
GoodsSearchParams searchParams = new GoodsSearchParams(); * @param searchParams 查询参数
searchParams.setStoreId(storeId); */
searchParams.setMarketEnable(GoodsStatusEnum.UPPER.name()); @Override
searchParams.setIsAuth(GoodsAuthEnum.PASS.name()); public void deletePromotionGoods(PromotionGoodsSearchParams searchParams) {
searchParams.setPageNumber(pageVo.getPageNumber()); this.remove(searchParams.queryWrapper());
searchParams.setPageSize(pageVo.getPageSize());
searchParams.setSort(pageVo.getSort());
searchParams.setOrder(pageVo.getOrder());
IPage<GoodsSku> goodsSkuByPage = goodsSkuService.getGoodsSkuByPage(searchParams);
//将查询到的商品sku转换为促销商品
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());
promotionGoodsList.add(promotionGoods);
}
promotionGoodsPage.setSize(goodsSkuByPage.getSize());
promotionGoodsPage.setTotal(goodsSkuByPage.getTotal());
promotionGoodsPage.setPages(goodsSkuByPage.getPages());
promotionGoodsPage.setRecords(promotionGoodsList);
return promotionGoodsPage;
} }
} }

View File

@ -1,37 +1,22 @@
package cn.lili.modules.promotion.serviceimpl; package cn.lili.modules.promotion.serviceimpl;
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.PromotionTypeEnum;
import cn.lili.common.enums.ResultCode; import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.common.exception.ServiceException;
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.enums.PromotionsScopeTypeEnum;
import cn.lili.modules.promotion.entity.enums.*; import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.entity.vos.CouponVO; import cn.lili.modules.promotion.entity.vos.*;
import cn.lili.modules.promotion.entity.vos.PintuanVO;
import cn.lili.modules.promotion.entity.vos.PointsGoodsVO;
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.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;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
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.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
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.*; import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* 促销业务层实现 * 促销业务层实现
@ -43,11 +28,6 @@ import java.util.*;
@Service @Service
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public class PromotionServiceImpl implements PromotionService { public class PromotionServiceImpl implements PromotionService {
/**
* 会员优惠券
*/
@Autowired
private MemberCouponService memberCouponService;
/** /**
* 秒杀 * 秒杀
*/ */
@ -83,66 +63,10 @@ public class PromotionServiceImpl implements PromotionService {
*/ */
@Autowired @Autowired
private PointsGoodsService pointsGoodsService; private PointsGoodsService pointsGoodsService;
/**
* 优惠券活动
*/
@Autowired
private CouponActivityService couponActivityService;
/**
* ES商品
*/
@Autowired
private EsGoodsIndexService goodsIndexService;
/**
* Mongo
*/
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private KanjiaActivityGoodsService kanJiaActivityGoodsService;
@Autowired
private GoodsSkuService goodsSkuService;
@Override
public boolean updatePromotionStatus(PromotionMessage promotionMessage) {
PromotionTypeEnum promotionTypeEnum = PromotionTypeEnum.valueOf(promotionMessage.getPromotionType());
String esPromotionKey = promotionTypeEnum + "-" + promotionMessage.getPromotionId();
log.info("更新促销活动状态:{}", promotionMessage);
boolean result = false;
switch (promotionTypeEnum) {
//满减
case FULL_DISCOUNT:
result = this.updateFullDiscount(promotionMessage, esPromotionKey, promotionTypeEnum);
break;
//秒杀
case SECKILL:
result = this.updateSeckill(promotionMessage, promotionTypeEnum);
break;
//拼团
case PINTUAN:
result = this.updatePintuan(promotionMessage, esPromotionKey, promotionTypeEnum);
break;
//优惠券
case COUPON:
result = this.updateCoupon(promotionMessage, esPromotionKey, promotionTypeEnum);
break;
//积分商品
case POINTS_GOODS:
result = this.updatePointsGoods(promotionMessage, promotionTypeEnum);
break;
//砍价商品商品
case KANJIA:
result = this.updateKanjiaGoods(promotionMessage, promotionTypeEnum);
break;
//优惠券活动
case COUPON_ACTIVITY:
result = this.updateCouponActivity(promotionMessage, promotionTypeEnum);
break;
default:
break;
}
this.updatePromotionGoods(promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus());
return result;
}
/** /**
* 获取当前进行的所有促销活动信息 * 获取当前进行的所有促销活动信息
@ -152,26 +76,29 @@ public class PromotionServiceImpl implements PromotionService {
@Override @Override
public Map<String, Object> getCurrentPromotion() { public Map<String, Object> getCurrentPromotion() {
Map<String, Object> resultMap = new HashMap<>(16); Map<String, Object> resultMap = new HashMap<>(16);
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("promotion_status", PromotionStatusEnum.START.name()); SeckillSearchParams seckillSearchParams = new SeckillSearchParams();
queryWrapper.ge("start_time", new Date()); seckillSearchParams.setPromotionStatus(PromotionsStatusEnum.START.name());
queryWrapper.le("end_time", new Date());
//获取当前进行的秒杀活动活动 //获取当前进行的秒杀活动活动
List<Seckill> seckillList = seckillService.list(queryWrapper); List<Seckill> seckillList = seckillService.listFindAll(seckillSearchParams);
if (seckillList != null && !seckillList.isEmpty()) { if (seckillList != null && !seckillList.isEmpty()) {
for (Seckill seckill : seckillList) { for (Seckill seckill : seckillList) {
resultMap.put(PromotionTypeEnum.SECKILL.name(), seckill); resultMap.put(PromotionTypeEnum.SECKILL.name(), seckill);
} }
} }
FullDiscountSearchParams fullDiscountSearchParams = new FullDiscountSearchParams();
fullDiscountSearchParams.setPromotionStatus(PromotionsStatusEnum.START.name());
//获取当前进行的满优惠活动 //获取当前进行的满优惠活动
List<FullDiscount> fullDiscountList = fullDiscountService.list(queryWrapper); List<FullDiscount> fullDiscountList = fullDiscountService.listFindAll(fullDiscountSearchParams);
if (fullDiscountList != null && !fullDiscountList.isEmpty()) { if (fullDiscountList != null && !fullDiscountList.isEmpty()) {
for (FullDiscount fullDiscount : fullDiscountList) { for (FullDiscount fullDiscount : fullDiscountList) {
resultMap.put(PromotionTypeEnum.FULL_DISCOUNT.name(), fullDiscount); resultMap.put(PromotionTypeEnum.FULL_DISCOUNT.name(), fullDiscount);
} }
} }
PintuanSearchParams pintuanSearchParams = new PintuanSearchParams();
pintuanSearchParams.setPromotionStatus(PromotionsStatusEnum.START.name());
//获取当前进行的拼团活动 //获取当前进行的拼团活动
List<Pintuan> pintuanList = pintuanService.list(queryWrapper); List<Pintuan> pintuanList = pintuanService.listFindAll(pintuanSearchParams);
if (pintuanList != null && !pintuanList.isEmpty()) { if (pintuanList != null && !pintuanList.isEmpty()) {
for (Pintuan pintuan : pintuanList) { for (Pintuan pintuan : pintuanList) {
resultMap.put(PromotionTypeEnum.PINTUAN.name(), pintuan); resultMap.put(PromotionTypeEnum.PINTUAN.name(), pintuan);
@ -188,35 +115,31 @@ public class PromotionServiceImpl implements PromotionService {
*/ */
@Override @Override
public Map<String, Object> getGoodsCurrentPromotionMap(EsGoodsIndex index) { public Map<String, Object> getGoodsCurrentPromotionMap(EsGoodsIndex index) {
Map<String, Object> promotionMap = new HashMap<>(16); Map<String, Object> promotionMap = new HashMap<>();
Query query = new Query(); FullDiscountSearchParams fullDiscountSearchParams = new FullDiscountSearchParams();
query.addCriteria(Criteria.where("deleteFlag").is(false)); fullDiscountSearchParams.setScopeType(PromotionsScopeTypeEnum.ALL.name());
query.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.START.name())); fullDiscountSearchParams.setPromotionStatus(PromotionsStatusEnum.START.name());
query.addCriteria(Criteria.where("endTime").gte(new Date())); List<FullDiscount> fullDiscountVOS = this.fullDiscountService.listFindAll(fullDiscountSearchParams);
List<FullDiscountVO> fullDiscountVOS = mongoTemplate.find(query, FullDiscountVO.class); for (FullDiscount fullDiscount : fullDiscountVOS) {
for (FullDiscountVO fullDiscountVO : fullDiscountVOS) { if (index.getStoreId().equals(fullDiscount.getStoreId())) {
if (fullDiscountVO.getPromotionGoodsList() == null) { String fullDiscountKey = PromotionTypeEnum.FULL_DISCOUNT.name() + "-" + fullDiscount.getId();
if (index.getStoreId().equals(fullDiscountVO.getStoreId())) { promotionMap.put(fullDiscountKey, fullDiscount);
String fullDiscountKey = PromotionTypeEnum.FULL_DISCOUNT.name() + "-" + fullDiscountVO.getId();
promotionMap.put(fullDiscountKey, fullDiscountVO);
} }
} }
} CouponSearchParams couponSearchParams = new CouponSearchParams();
List<CouponVO> couponVOS = mongoTemplate.find(query, CouponVO.class); couponSearchParams.setScopeType(PromotionsScopeTypeEnum.ALL.name());
for (CouponVO couponVO : couponVOS) { couponSearchParams.setPromotionStatus(PromotionsStatusEnum.START.name());
if (couponVO.getPromotionGoodsList() == null && couponVO.getScopeType().equals(CouponScopeTypeEnum.ALL.name())) { List<Coupon> couponVOS = this.couponService.listFindAll(couponSearchParams);
if (("platform").equals(couponVO.getStoreId()) || index.getStoreId().equals(couponVO.getStoreId())) { for (Coupon coupon : couponVOS) {
String couponKey = PromotionTypeEnum.COUPON.name() + "-" + couponVO.getId(); if (("platform").equals(coupon.getStoreId()) || index.getStoreId().equals(coupon.getStoreId())) {
promotionMap.put(couponKey, couponVO); String couponKey = PromotionTypeEnum.COUPON.name() + "-" + coupon.getId();
promotionMap.put(couponKey, coupon);
} }
} }
} PromotionGoodsSearchParams promotionGoodsSearchParams = new PromotionGoodsSearchParams();
LambdaQueryWrapper<PromotionGoods> promotionGoodsQuery = new LambdaQueryWrapper<>(); promotionGoodsSearchParams.setSkuId(index.getId());
promotionGoodsQuery.eq(PromotionGoods::getDeleteFlag, false); promotionGoodsSearchParams.setPromotionStatus(PromotionsStatusEnum.START.name());
promotionGoodsQuery.eq(PromotionGoods::getPromotionStatus, PromotionStatusEnum.START.name()); List<PromotionGoods> promotionGoodsList = promotionGoodsService.listFindAll(promotionGoodsSearchParams);
promotionGoodsQuery.ge(PromotionGoods::getEndTime, new Date());
promotionGoodsQuery.eq(PromotionGoods::getSkuId, index.getId());
List<PromotionGoods> promotionGoodsList = promotionGoodsService.list(promotionGoodsQuery);
for (PromotionGoods promotionGoods : promotionGoodsList) { for (PromotionGoods promotionGoods : promotionGoodsList) {
String esPromotionKey = promotionGoods.getPromotionType() + "-" + promotionGoods.getPromotionId(); String esPromotionKey = promotionGoods.getPromotionType() + "-" + promotionGoods.getPromotionId();
switch (PromotionTypeEnum.valueOf(promotionGoods.getPromotionType())) { switch (PromotionTypeEnum.valueOf(promotionGoods.getPromotionType())) {
@ -234,11 +157,28 @@ public class PromotionServiceImpl implements PromotionService {
promotionMap.put(esPromotionKey, fullDiscount); promotionMap.put(esPromotionKey, fullDiscount);
break; break;
case SECKILL: case SECKILL:
this.getGoodsCurrentSeckill(promotionGoods, promotionMap, index);
break;
case POINTS_GOODS:
PointsGoods pointsGoods = pointsGoodsService.getById(promotionGoods.getPromotionId());
promotionMap.put(esPromotionKey, pointsGoods);
break;
default:
break;
}
}
return promotionMap;
}
private void getGoodsCurrentSeckill(PromotionGoods promotionGoods, Map<String, Object> promotionMap, EsGoodsIndex index) {
Seckill seckill = seckillService.getById(promotionGoods.getPromotionId()); Seckill seckill = seckillService.getById(promotionGoods.getPromotionId());
LambdaQueryWrapper<SeckillApply> seckillApplyLambdaQueryWrapper = new LambdaQueryWrapper<>(); SeckillSearchParams searchParams = new SeckillSearchParams();
seckillApplyLambdaQueryWrapper.eq(SeckillApply::getSeckillId, promotionGoods.getPromotionId()); searchParams.setSeckillId(promotionGoods.getPromotionId());
seckillApplyLambdaQueryWrapper.eq(SeckillApply::getSkuId, promotionGoods.getSkuId()); searchParams.setSkuId(promotionGoods.getSkuId());
SeckillApply seckillApply = seckillApplyService.getOne(seckillApplyLambdaQueryWrapper); List<SeckillApply> seckillApplyList = seckillApplyService.getSeckillApply(searchParams);
if (seckillApplyList != null && !seckillApplyList.isEmpty()) {
SeckillApply seckillApply = seckillApplyList.get(0);
int nextHour = 23; int nextHour = 23;
String[] split = seckill.getHours().split(","); String[] split = seckill.getHours().split(",");
int[] hoursSored = Arrays.stream(split).mapToInt(Integer::parseInt).toArray(); int[] hoursSored = Arrays.stream(split).mapToInt(Integer::parseInt).toArray();
@ -253,289 +193,8 @@ public class PromotionServiceImpl implements PromotionService {
seckill.setEndTime(promotionGoods.getEndTime()); seckill.setEndTime(promotionGoods.getEndTime());
promotionMap.put(seckillKey, seckill); promotionMap.put(seckillKey, seckill);
index.setPromotionPrice(promotionGoods.getPrice()); index.setPromotionPrice(promotionGoods.getPrice());
break;
case POINTS_GOODS:
PointsGoods pointsGoods = pointsGoodsService.getById(promotionGoods.getPromotionId());
promotionMap.put(esPromotionKey, pointsGoods);
break;
default:
break;
} }
}
return promotionMap;
}
/**
* 修改满额活动状态
*
* @param promotionMessage 信息队列传输促销信息实体
* @param esPromotionKey es Key
* @param promotionTypeEnum 促销分类枚举
* @return 修改结果
*/
private boolean updateFullDiscount(PromotionMessage promotionMessage, String esPromotionKey, PromotionTypeEnum promotionTypeEnum) {
boolean result;
//从mongo中获取促销备份
FullDiscountVO fullDiscountVO = mongoTemplate.findById(promotionMessage.getPromotionId(), FullDiscountVO.class);
if (fullDiscountVO == null) {
this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus());
return false;
}
//写入促销状态
fullDiscountVO.setPromotionStatus(promotionMessage.getPromotionStatus());
//修改促销数据
result = this.fullDiscountService.update(updateWrapper(promotionMessage));
//clone一个活动信息用于存放与索引中
FullDiscountVO clone = ObjectUtil.clone(fullDiscountVO);
clone.setPromotionGoodsList(null);
if (fullDiscountVO.getPromotionGoodsList() == null) {
//如果为全品类则更新全部索引
this.goodsIndexService.updateEsGoodsIndexAllByList(clone, esPromotionKey);
} else {
//如不为全品类更新指定索引
for (PromotionGoods promotionGoods : fullDiscountVO.getPromotionGoodsList()) {
promotionGoods.setPromotionStatus(promotionMessage.getPromotionStatus());
}
this.promotionGoodsService.updateBatchById(fullDiscountVO.getPromotionGoodsList());
this.goodsIndexService.updateEsGoodsIndexByList(fullDiscountVO.getPromotionGoodsList(), clone, esPromotionKey);
}
this.mongoTemplate.save(fullDiscountVO);
return result;
}
/**
* 修改优惠券状态
*
* @param promotionMessage 信息队列传输促销信息实体
* @param esPromotionKey es Key
* @param promotionTypeEnum 促销分类枚举
* @return 修改结果
*/
private boolean updateCoupon(PromotionMessage promotionMessage, String esPromotionKey, PromotionTypeEnum promotionTypeEnum) {
boolean result;
//从mongo中获取优惠券信息
CouponVO couponVO = this.mongoTemplate.findById(promotionMessage.getPromotionId(), CouponVO.class);
if (couponVO == null) {
this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus());
return false;
}
//修改优惠券
couponVO.setPromotionStatus(promotionMessage.getPromotionStatus());
result = this.couponService.update(updateWrapper(promotionMessage));
//优惠券活动结束会员已领取未使用的优惠券状态修改为已过期
if (couponVO.getPromotionStatus().equals(PromotionStatusEnum.END)) {
LambdaUpdateWrapper<MemberCoupon> updateWrapper = new LambdaUpdateWrapper<MemberCoupon>()
.eq(MemberCoupon::getCouponId, couponVO.getId())
.eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name())
.set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name());
this.memberCouponService.update(updateWrapper);
}
//clone一个活动信息用于存放与索引中
CouponVO clone = ObjectUtil.clone(couponVO);
clone.setPromotionGoodsList(null);
if (CouponScopeTypeEnum.PORTION_GOODS.name().equals(couponVO.getScopeType())) {
//如为部分商品则更新部分商品索引
this.promotionGoodsService.updateBatchById(couponVO.getPromotionGoodsList());
this.goodsIndexService.updateEsGoodsIndexByList(couponVO.getPromotionGoodsList(), clone, esPromotionKey);
} else if (CouponScopeTypeEnum.ALL.name().equals(couponVO.getScopeType())) {
//如为全部则更新全部商品索引
this.goodsIndexService.updateEsGoodsIndexAllByList(clone, esPromotionKey);
}
this.mongoTemplate.save(couponVO);
return result;
}
/**
* 修改拼团状态
*
* @param promotionMessage 信息队列传输促销信息实体
* @param esPromotionKey es Key
* @param promotionTypeEnum 促销分类枚举
* @return 修改结果
*/
private boolean updatePintuan(PromotionMessage promotionMessage, String esPromotionKey, PromotionTypeEnum promotionTypeEnum) {
boolean result;
PintuanVO pintuanVO = this.mongoTemplate.findById(promotionMessage.getPromotionId(), PintuanVO.class);
if (pintuanVO == null) {
this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus());
return false;
}
pintuanVO.setPromotionStatus(promotionMessage.getPromotionStatus());
result = this.pintuanService.update(updateWrapper(promotionMessage));
this.promotionGoodsService.updateBatchById(pintuanVO.getPromotionGoodsList());
if (pintuanVO.getPromotionGoodsList() != null) {
List<PromotionGoods> promotionGoodsList = pintuanVO.getPromotionGoodsList();
//更新促销商品索引
for (PromotionGoods promotionGoods : promotionGoodsList) {
Pintuan pintuan1 = JSONUtil.toBean(JSONUtil.toJsonStr(pintuanVO), Pintuan.class);
this.goodsIndexService.updateEsGoodsIndex(promotionGoods.getSkuId(), pintuan1, esPromotionKey, promotionGoods.getPrice());
}
}
this.mongoTemplate.save(pintuanVO);
return result;
} }
/**
* 修改秒杀状态
*
* @param promotionMessage 信息队列传输促销信息实体
* @param promotionTypeEnum 促销分类枚举
* @return 修改结果
*/
private boolean updateSeckill(PromotionMessage promotionMessage, PromotionTypeEnum promotionTypeEnum) {
boolean result;
SeckillVO seckill = this.mongoTemplate.findById(promotionMessage.getPromotionId(), SeckillVO.class);
if (seckill == null) {
this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus());
return false;
}
if (seckill.getEndTime() == null) {
seckill.setEndTime(DateUtil.endOfDay(seckill.getStartTime()));
}
//修改活动状态
seckill.setPromotionStatus(promotionMessage.getPromotionStatus());
result = this.seckillService.update(updateWrapper(promotionMessage));
log.info("更新限时抢购活动状态:{}", seckill);
//判断参与活动的商品是否为空
if (seckill.getSeckillApplyList() != null && !seckill.getSeckillApplyList().isEmpty()) {
//循环秒杀商品数据将数据按照时间段进行存储
for (SeckillApply seckillApply : seckill.getSeckillApplyList()) {
if (seckillApply.getPromotionApplyStatus().equals(PromotionApplyStatusEnum.PASS.name())) {
//下一个时间默认为当天结束时间
int nextHour = 23;
String[] split = seckill.getHours().split(",");
int[] hoursSored = Arrays.stream(split).mapToInt(Integer::parseInt).toArray();
//排序时间段
Arrays.sort(hoursSored);
for (int i : hoursSored) {
//如果当前时间段大于排序后的时间段的某个当前时间段的下个时间段即为排序后的时间段的某个
if (seckillApply.getTimeLine() < i) {
nextHour = i;
break;
}
}
Seckill seckill1 = JSONUtil.toBean(JSONUtil.toJsonStr(seckill), Seckill.class);
String format = DateUtil.format(seckill.getStartTime(), cn.lili.common.utils.DateUtil.STANDARD_DATE_FORMAT);
DateTime parseStartTime = DateUtil.parse((format + " " + seckillApply.getTimeLine()), "yyyy-MM-dd HH");
DateTime parseEndTime = DateUtil.parse((format + " " + nextHour), "yyyy-MM-dd HH");
//如果是当天最后的时间段则设置到当天结束时间的59分59秒
if (nextHour == seckillApply.getTimeLine()) {
parseEndTime = DateUtil.parse((format + " " + nextHour + ":59:59"), cn.lili.common.utils.DateUtil.STANDARD_FORMAT);
}
seckill1.setStartTime(parseStartTime);
//当时商品的秒杀活动活动结束时间为下个时间段的开始
seckill1.setEndTime(parseEndTime);
log.info("更新限时抢购商品状态:{}", seckill1);
this.goodsIndexService.updateEsGoodsIndex(seckillApply.getSkuId(), seckill1, promotionTypeEnum.name() + "-" + seckillApply.getTimeLine(), seckillApply.getPrice());
}
}
}
this.mongoTemplate.save(seckill);
return result;
}
/**
* 修改积分商品状态
*
* @param promotionMessage 信息队列传输促销信息实体
* @param promotionTypeEnum 促销分类枚举
* @return 修改结果
*/
private boolean updatePointsGoods(PromotionMessage promotionMessage, PromotionTypeEnum promotionTypeEnum) {
boolean result;
PointsGoodsVO pointsGoodsVO = this.mongoTemplate.findById(promotionMessage.getPromotionId(), PointsGoodsVO.class);
if (pointsGoodsVO == null) {
this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus());
return false;
}
pointsGoodsVO.setPromotionStatus(promotionMessage.getPromotionStatus());
result = this.pointsGoodsService.update(updateWrapper(promotionMessage));
this.mongoTemplate.save(pointsGoodsVO);
return result;
}
/**
* 修改砍价商品状态
*
* @param promotionMessage 信息队列传输促销信息实体
* @param promotionTypeEnum 促销分类枚举
* @return 修改结果
*/
private boolean updateKanjiaGoods(PromotionMessage promotionMessage, PromotionTypeEnum promotionTypeEnum) {
KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO = this.mongoTemplate.findById(promotionMessage.getPromotionId(), KanjiaActivityGoodsDTO.class);
if (kanJiaActivityGoodsDTO == null) {
this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus());
return false;
}
kanJiaActivityGoodsDTO.setPromotionStatus(promotionMessage.getPromotionStatus());
boolean result = this.kanJiaActivityGoodsService.updateById(kanJiaActivityGoodsDTO);
if (result) {
this.mongoTemplate.save(kanJiaActivityGoodsDTO);
}
return result;
}
/**
* 修改优惠券活动状态
*
* @param promotionMessage 信息队列传输促销信息实体
* @param promotionTypeEnum 促销分类枚举
* @return 修改结果
*/
private boolean updateCouponActivity(PromotionMessage promotionMessage, PromotionTypeEnum promotionTypeEnum) {
//如果是精准发券进行发送优惠券
CouponActivity couponActivity = couponActivityService.getById(promotionMessage.getPromotionId());
if (couponActivity.getCouponActivityType().equals(CouponActivityTypeEnum.SPECIFY.name())) {
couponActivityService.specify(couponActivity.getId());
}
//修改活动状态
return couponActivityService.update(new LambdaUpdateWrapper<CouponActivity>()
.eq(CouponActivity::getId, promotionMessage.getPromotionId())
.set(CouponActivity::getPromotionStatus, promotionMessage.getPromotionStatus()));
}
/**
* 更新促销商品信息
*
* @param promotionId 促销活动ID
* @param promotionStatus 活动状态
*/
private void updatePromotionGoods(String promotionId, String promotionStatus) {
LambdaUpdateWrapper<PromotionGoods> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(PromotionGoods::getPromotionId, promotionId).set(PromotionGoods::getPromotionStatus, promotionStatus);
this.promotionGoodsService.update(updateWrapper);
}
/**
* 抛出促销异常
*
* @param type 促销类型
* @param id 促销编号
* @param status 促销状态
*/
private void throwPromotionException(PromotionTypeEnum type, String id, String status) {
log.error("当前" + type.name() + "活动ID为[" + id + "] 不存在,更改活动状态至[ " + status + " ]失败!");
throw new ServiceException(ResultCode.PROMOTION_STATUS_END);
}
/**
* 根据消息获取update wrapper
*
* @param <T>
* @return
*/
private <T> UpdateWrapper<T> updateWrapper(PromotionMessage promotionMessage) {
UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", promotionMessage.getPromotionId());
updateWrapper.set("promotion_status", PromotionStatusEnum.valueOf(promotionMessage.getPromotionStatus()));
return updateWrapper;
}
} }

View File

@ -1,12 +1,12 @@
package cn.lili.modules.promotion.serviceimpl; package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DatePattern;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.cache.Cache; import cn.lili.cache.Cache;
import cn.lili.cache.CachePrefix;
import cn.lili.common.enums.PromotionTypeEnum; 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;
@ -16,8 +16,8 @@ import cn.lili.modules.goods.service.GoodsSkuService;
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.PromotionApplyStatusEnum; import cn.lili.modules.promotion.entity.dto.BasePromotions;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionsApplyStatusEnum;
import cn.lili.modules.promotion.entity.vos.*; import cn.lili.modules.promotion.entity.vos.*;
import cn.lili.modules.promotion.mapper.SeckillApplyMapper; import cn.lili.modules.promotion.mapper.SeckillApplyMapper;
import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.promotion.service.PromotionGoodsService;
@ -25,14 +25,12 @@ import cn.lili.modules.promotion.service.SeckillApplyService;
import cn.lili.modules.promotion.service.SeckillService; import cn.lili.modules.promotion.service.SeckillService;
import cn.lili.modules.promotion.tools.PromotionCacheKeys; import cn.lili.modules.promotion.tools.PromotionCacheKeys;
import cn.lili.modules.promotion.tools.PromotionTools; import cn.lili.modules.promotion.tools.PromotionTools;
import cn.lili.modules.search.service.EsGoodsIndexService; import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
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;
@ -48,18 +46,14 @@ import java.util.stream.Collectors;
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Slf4j
public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, SeckillApply> implements SeckillApplyService { public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, SeckillApply> implements SeckillApplyService {
/** /**
* 缓存 * 缓存
*/ */
@Autowired @Autowired
private Cache<Object> cache; private Cache<List<SeckillTimelineVO>> cache;
/**
* Mongo
*/
@Autowired
private MongoTemplate mongoTemplate;
/** /**
* 规格商品 * 规格商品
*/ */
@ -75,33 +69,11 @@ public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, Sec
*/ */
@Autowired @Autowired
private SeckillService seckillService; private SeckillService seckillService;
/**
* 商品索引
*/
@Autowired
private EsGoodsIndexService goodsIndexService;
@Override @Override
public List<SeckillTimelineVO> getSeckillTimeline() { public List<SeckillTimelineVO> getSeckillTimeline() {
List<SeckillTimelineVO> timelineVoS = new ArrayList<>();
//秒杀活动缓存key //秒杀活动缓存key
String seckillCacheKey = PromotionCacheKeys.getSeckillTimelineKey(DateUtil.format(DateUtil.beginOfDay(new DateTime()), "yyyyMMdd")); return getSeckillTimelineToCache(null);
Map<Object, Object> cacheSeckill = cache.getHash(seckillCacheKey);
if (cacheSeckill == null || cacheSeckill.isEmpty()) {
//如缓存中不存在则单独获取
try {
timelineVoS = getSeckillTimelineToCache(seckillCacheKey);
} catch (Exception e) {
log.error("获取秒杀活动信息发生错误!", e);
}
} else {
//如缓存中存在则取缓存中转为展示的信息
for (Object value : cacheSeckill.values()) {
SeckillTimelineVO seckillTimelineVO = (SeckillTimelineVO) value;
timelineVoS.add(seckillTimelineVO);
}
}
return timelineVoS;
} }
@Override @Override
@ -109,104 +81,105 @@ public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, Sec
List<SeckillGoodsVO> seckillGoodsVoS = new ArrayList<>(); List<SeckillGoodsVO> seckillGoodsVoS = new ArrayList<>();
//秒杀活动缓存key //秒杀活动缓存key
String seckillCacheKey = PromotionCacheKeys.getSeckillTimelineKey(DateUtil.format(DateUtil.beginOfDay(new DateTime()), "yyyyMMdd")); String seckillCacheKey = PromotionCacheKeys.getSeckillTimelineKey(DateUtil.format(DateUtil.beginOfDay(new DateTime()), "yyyyMMdd"));
Map<Object, Object> cacheSeckill = cache.getHash(seckillCacheKey); List<SeckillTimelineVO> cacheSeckill = cache.get(seckillCacheKey);
if (cacheSeckill == null || cacheSeckill.isEmpty()) { if (cacheSeckill == null || cacheSeckill.isEmpty()) {
//如缓存中不存在则单独获取 //如缓存中不存在则单独获取
seckillGoodsVoS = wrapperSeckillGoods(timeline); List<SeckillTimelineVO> seckillTimelineToCache = getSeckillTimelineToCache(seckillCacheKey);
Optional<SeckillTimelineVO> first = seckillTimelineToCache.stream().filter(i -> i.getTimeLine().equals(timeline)).findFirst();
if (first.isPresent()) {
seckillGoodsVoS = first.get().getSeckillGoodsList();
}
} else { } else {
//如缓存中存在则取缓存中转为展示的信息 //如缓存中存在则取缓存中转为展示的信息
for (Map.Entry<Object, Object> entry : cacheSeckill.entrySet()) { Optional<SeckillTimelineVO> first = cacheSeckill.stream().filter(i -> i.getTimeLine().equals(timeline)).findFirst();
Integer timelineKey = Convert.toInt(entry.getKey().toString()); if (first.isPresent()) {
if (timelineKey.equals(timeline)) { seckillGoodsVoS = first.get().getSeckillGoodsList();
seckillGoodsVoS = (List<SeckillGoodsVO>) entry.getValue();
}
} }
} }
return seckillGoodsVoS; return seckillGoodsVoS;
} }
@Override @Override
public IPage<SeckillApply> getSeckillApplyFromMongo(SeckillSearchParams queryParam, PageVO pageVo) { public IPage<SeckillApply> getSeckillApply(SeckillSearchParams queryParam, PageVO pageVo) {
IPage<SeckillApply> seckillApplyPage = new Page<>(); IPage<SeckillApply> seckillApplyPage = this.page(PageUtil.initPage(pageVo), queryParam.queryWrapper());
Query query = queryParam.mongoQuery(); if (seckillApplyPage != null && !seckillApplyPage.getRecords().isEmpty()) {
SeckillVO seckillVO = this.mongoTemplate.findOne(query, SeckillVO.class); //获取skuId
if (seckillVO != null && pageVo != null) { List<String> skuIds = seckillApplyPage.getRecords().stream()
seckillApplyPage.setCurrent(pageVo.getMongoPageNumber());
seckillApplyPage.setSize(pageVo.getPageSize());
List<SeckillApply> seckillApplyList = seckillVO.getSeckillApplyList() != null ? seckillVO.getSeckillApplyList() : new ArrayList<>();
// 如果查询参数店铺id不为空则表示是店铺在查询信息那么这里要对店铺的请求做过滤处理把其他店铺的信息进行移除
seckillApplyList.removeIf(seckillApply -> CharSequenceUtil.isNotEmpty(queryParam.getStoreId()) && !seckillApply.getStoreId().equals(queryParam.getStoreId()));
//获取skuid
List<String> skuIds = seckillApplyList.stream()
.map(SeckillApply::getSkuId).collect(Collectors.toList()); .map(SeckillApply::getSkuId).collect(Collectors.toList());
//循环获取 店铺/全平台 参与的促销商品库存进行填充 //循环获取 店铺/全平台 参与的促销商品库存进行填充
if (skuIds.size() > 0) { if (!skuIds.isEmpty()) {
List<Integer> skuStock = promotionGoodsService.getPromotionGoodsStock(PromotionTypeEnum.SECKILL, seckillVO.getId(), skuIds); List<Integer> skuStock = promotionGoodsService.getPromotionGoodsStock(PromotionTypeEnum.SECKILL, queryParam.getSeckillId(), skuIds);
for (int i = 0; i < skuIds.size(); i++) { for (int i = 0; i < skuIds.size(); i++) {
seckillApplyList.get(i).setQuantity(skuStock.get(i)); seckillApplyPage.getRecords().get(i).setQuantity(skuStock.get(i));
} }
} }
}
return seckillApplyPage;
}
seckillApplyPage.setTotal(seckillApplyList.size()); /**
List<SeckillApply> page = CollUtil.page(pageVo.getMongoPageNumber(), pageVo.getPageSize(), seckillApplyList); * 分页查询限时请购申请列表
seckillApplyPage.setRecords(page); *
return seckillApplyPage; * @param queryParam 秒杀活动申请查询参数
} else { * @return 限时请购申请列表
return null; */
} @Override
public List<SeckillApply> getSeckillApply(SeckillSearchParams queryParam) {
return this.list(queryParam.queryWrapper());
} }
@Override @Override
public void addSeckillApply(String seckillId, String storeId, List<SeckillApplyVO> seckillApplyList) { public void addSeckillApply(String seckillId, String storeId, List<SeckillApplyVO> seckillApplyList) {
SeckillVO seckill = mongoTemplate.findById(seckillId, SeckillVO.class); Seckill seckill = this.seckillService.getById(seckillId);
if (seckill == null) { if (seckill == null) {
throw new ServiceException(ResultCode.SECKILL_NOT_EXIST_ERROR); throw new ServiceException(ResultCode.SECKILL_NOT_EXIST_ERROR);
} }
if (seckillApplyList == null || seckillApplyList.isEmpty()) {
return;
}
//检查秒杀活动申请是否合法 //检查秒杀活动申请是否合法
checkSeckillApplyList(seckill.getHours(), seckillApplyList, storeId); checkSeckillApplyList(seckill.getHours(), seckillApplyList);
//获取已参与活动的秒杀活动活动申请列表 //获取已参与活动的秒杀活动活动申请列表
List<SeckillApply> originList = seckill.getSeckillApplyList() != null ? seckill.getSeckillApplyList() : new ArrayList<>(); List<String> skuIds = seckillApplyList.stream().map(SeckillApply::getSkuId).collect(Collectors.toList());
List<SeckillApply> originList = new ArrayList<>();
List<PromotionGoods> promotionGoodsList = new ArrayList<>(); List<PromotionGoods> promotionGoodsList = new ArrayList<>();
for (SeckillApplyVO seckillApply : seckillApplyList) { for (SeckillApplyVO seckillApply : seckillApplyList) {
//获取参与活动的商品信息 //获取参与活动的商品信息
GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(seckillApply.getSkuId()); GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(seckillApply.getSkuId());
if (!goodsSku.getStoreId().equals(storeId)) {
continue;
}
//获取秒杀活动时间段 //获取秒杀活动时间段
DateTime startTime = DateUtil.offsetHour(seckill.getStartTime(), seckillApply.getTimeLine()); DateTime startTime = DateUtil.offsetHour(seckill.getStartTime(), seckillApply.getTimeLine());
//检测是否可以发布促销商品 //检测是否可以发布促销商品
checkSeckillGoodsSku(seckill, seckillApply, goodsSku, startTime); checkSeckillGoodsSku(seckill, seckillApply, goodsSku, startTime);
//设置秒杀申请默认内容 //设置秒杀申请默认内容
seckillApply.setOriginalPrice(goodsSku.getPrice()); seckillApply.setOriginalPrice(goodsSku.getPrice());
seckillApply.setPromotionApplyStatus(PromotionApplyStatusEnum.PASS.name()); seckillApply.setPromotionApplyStatus(PromotionsApplyStatusEnum.PASS.name());
seckillApply.setSalesNum(0); seckillApply.setSalesNum(0);
//过滤掉已经新增过的秒杀商品
if (seckillApply.getId() == null) {
originList.add(seckillApply); originList.add(seckillApply);
}
//获取促销商品 //获取促销商品
PromotionGoods promotionGoods = this.setSeckillGoods(goodsSku, seckillApply, seckill); PromotionGoods promotionGoods = this.setSeckillGoods(goodsSku, seckillApply, seckill);
promotionGoodsList.add(promotionGoods); promotionGoodsList.add(promotionGoods);
} }
//保存秒杀活动申请 this.remove(new LambdaQueryWrapper<SeckillApply>().eq(SeckillApply::getSeckillId, seckillId).in(SeckillApply::getSkuId, skuIds));
this.saveOrUpdateBatch(originList); this.saveBatch(originList);
//设置秒杀活动下的申请列表 this.seckillService.updateEsGoodsSeckill(seckill, originList);
seckill.setSeckillApplyList(originList);
//mongo保存秒杀活动信息
this.mongoTemplate.save(seckill);
//保存促销活动商品信息 //保存促销活动商品信息
if (!promotionGoodsList.isEmpty()) { if (!promotionGoodsList.isEmpty()) {
LambdaQueryWrapper<PromotionGoods> queryWrapper = new LambdaQueryWrapper<>(); PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
queryWrapper.in(PromotionGoods::getSkuId, promotionGoodsList.stream().map(PromotionGoods::getSkuId).collect(Collectors.toList())) searchParams.setStoreId(storeId);
.eq(PromotionGoods::getStoreId, storeId); searchParams.setSkuIds(promotionGoodsList.stream().map(PromotionGoods::getSkuId).collect(Collectors.toList()));
promotionGoodsService.remove(queryWrapper); promotionGoodsService.deletePromotionGoods(searchParams);
//初始化促销商品 //初始化促销商品
PromotionTools.promotionGoodsInit(promotionGoodsList, seckill, PromotionTypeEnum.SECKILL); PromotionTools.promotionGoodsInit(promotionGoodsList, seckill, PromotionTypeEnum.SECKILL);
promotionGoodsService.saveBatch(promotionGoodsList); promotionGoodsService.saveBatch(promotionGoodsList);
} }
//设置秒杀活动的商品数量店铺数量 //设置秒杀活动的商品数量店铺数量
seckillService.updateSeckillGoodsNum(seckillId); seckillService.updateSeckillGoodsNum(seckillId);
cache.vagueDel(CachePrefix.STORE_ID_SECKILL);
} }
@ -214,31 +187,27 @@ public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, Sec
* 批量删除秒杀活动申请 * 批量删除秒杀活动申请
* *
* @param seckillId 秒杀活动活动id * @param seckillId 秒杀活动活动id
* @param id 秒杀活动申请id * @param id id
*/ */
@Override @Override
public void removeSeckillApply(String seckillId, String id) { public void removeSeckillApply(String seckillId, String id) {
SeckillVO seckillVO = this.mongoTemplate.findById(seckillId, SeckillVO.class); Seckill seckill = this.seckillService.getById(seckillId);
if (seckillVO == null) { if (seckill == null) {
throw new ServiceException(ResultCode.SECKILL_NOT_EXIST_ERROR); throw new ServiceException(ResultCode.SECKILL_NOT_EXIST_ERROR);
} }
SeckillApply seckillApply = this.getById(id); SeckillApply seckillApply = this.getById(id);
//获取商品SKUID if (seckillApply == null) {
String skuId = seckillApply.getSkuId(); throw new ServiceException(ResultCode.SECKILL_APPLY_NOT_EXIST_ERROR);
}
//清除秒杀活动中的商品 //清除秒杀活动中的商品
seckillVO.getSeckillApplyList().removeIf(seckillApply1 -> id.contains(seckillApply1.getId())); this.remove(new LambdaQueryWrapper<SeckillApply>()
this.mongoTemplate.save(seckillVO); .eq(SeckillApply::getSeckillId, seckillId)
.in(SeckillApply::getId, id));
//删除促销商品 //删除促销商品
this.removeById(id); this.promotionGoodsService.deletePromotionGoods(seckillId, Collections.singletonList(seckillApply.getSkuId()));
//清除索引
this.goodsIndexService.deleteEsGoodsPromotionByPromotionId(skuId, seckillId);
//删除促销商品
promotionGoodsService.remove(new LambdaQueryWrapper<PromotionGoods>()
.eq(PromotionGoods::getSkuId, skuId)
.eq(PromotionGoods::getPromotionType, PromotionTypeEnum.SECKILL.name()));
} }
/** /**
@ -246,12 +215,10 @@ public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, Sec
* *
* @param hours 秒杀活动时间段 * @param hours 秒杀活动时间段
* @param seckillApplyList 秒杀活动申请列表 * @param seckillApplyList 秒杀活动申请列表
* @param storeId 当前申请商家编号
*/ */
private void checkSeckillApplyList(String hours, List<SeckillApplyVO> seckillApplyList, String storeId) { private void checkSeckillApplyList(String hours, List<SeckillApplyVO> seckillApplyList) {
List<String> existSku = new ArrayList<>(); List<String> existSku = new ArrayList<>();
for (SeckillApplyVO seckillApply : seckillApplyList) { for (SeckillApplyVO seckillApply : seckillApplyList) {
seckillApply.setStoreId(storeId);
if (seckillApply.getPrice() > seckillApply.getOriginalPrice()) { if (seckillApply.getPrice() > seckillApply.getOriginalPrice()) {
throw new ServiceException(ResultCode.SECKILL_PRICE_ERROR); throw new ServiceException(ResultCode.SECKILL_PRICE_ERROR);
} }
@ -280,12 +247,11 @@ public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, Sec
private List<SeckillTimelineVO> getSeckillTimelineToCache(String seckillCacheKey) { private List<SeckillTimelineVO> getSeckillTimelineToCache(String seckillCacheKey) {
List<SeckillTimelineVO> timelineList = new ArrayList<>(); List<SeckillTimelineVO> timelineList = new ArrayList<>();
LambdaQueryWrapper<Seckill> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<Seckill> queryWrapper = new LambdaQueryWrapper<>();
//查询当天时间段内的且状态不为结束或关闭的秒杀活动活动 //查询当天时间段内的秒杀活动活动
queryWrapper.ge(Seckill::getStartTime, new Date(cn.lili.common.utils.DateUtil.startOfTodDay() * 1000)).le(Seckill::getEndTime, cn.lili.common.utils.DateUtil.endOfDate()) Date now = new Date();
.and(i -> i.eq(Seckill::getPromotionStatus, PromotionStatusEnum.NEW.name()) queryWrapper.between(BasePromotions::getStartTime, DateUtil.beginOfDay(now), DateUtil.endOfDay(now));
.or(j -> j.eq(Seckill::getPromotionStatus, PromotionStatusEnum.START.name()))); queryWrapper.ge(BasePromotions::getEndTime, DateUtil.endOfDay(now));
List<Seckill> seckillList = seckillService.list(queryWrapper); List<Seckill> seckillList = this.seckillService.list(queryWrapper);
if (!seckillList.isEmpty()) {
for (Seckill seckill : seckillList) { for (Seckill seckill : seckillList) {
//读取系统时间的时刻 //读取系统时间的时刻
Calendar c = Calendar.getInstance(); Calendar c = Calendar.getInstance();
@ -297,25 +263,25 @@ public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, Sec
SeckillTimelineVO tempTimeline = new SeckillTimelineVO(); SeckillTimelineVO tempTimeline = new SeckillTimelineVO();
boolean hoursSoredHour = (hoursSored[i] >= hour || ((i + 1) < hoursSored.length && hoursSored[i + 1] > hour)); boolean hoursSoredHour = (hoursSored[i] >= hour || ((i + 1) < hoursSored.length && hoursSored[i + 1] > hour));
if (hoursSoredHour) { if (hoursSoredHour) {
SimpleDateFormat format = new SimpleDateFormat(cn.lili.common.utils.DateUtil.STANDARD_DATE_FORMAT); SimpleDateFormat format = new SimpleDateFormat(DatePattern.NORM_DATE_PATTERN);
String date = format.format(new Date()); String date = format.format(new Date());
//当前时间的秒数 //当前时间的秒数
long currentTime = cn.lili.common.utils.DateUtil.getDateline(); long currentTime = DateUtil.currentSeconds();
//秒杀活动的时刻 //秒杀活动的时刻
long timeLine = cn.lili.common.utils.DateUtil.getDateline(date + " " + hoursSored[i], "yyyy-MM-dd HH"); long timeLine = cn.lili.common.utils.DateUtil.getDateline(date + " " + hoursSored[i], "yyyy-MM-dd HH");
Long distanceTime = timeLine - currentTime < 0 ? 0 : timeLine - currentTime; Long distanceTime = timeLine - currentTime < 0 ? 0 : timeLine - currentTime;
tempTimeline.setDistanceStartTime(distanceTime); tempTimeline.setDistanceStartTime(distanceTime);
tempTimeline.setStartTime(timeLine); tempTimeline.setStartTime(timeLine);
tempTimeline.setTimeLine(hoursSored[i]); tempTimeline.setTimeLine(hoursSored[i]);
tempTimeline.setSeckillGoodsList(wrapperSeckillGoods(hoursSored[i])); tempTimeline.setSeckillGoodsList(wrapperSeckillGoods(hoursSored[i], seckill.getId()));
timelineList.add(tempTimeline); timelineList.add(tempTimeline);
} }
} }
} }
if (CharSequenceUtil.isNotEmpty(seckillCacheKey)) {
cache.put(seckillCacheKey, timelineList);
} }
return timelineList; return timelineList;
} }
@ -326,18 +292,12 @@ public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, Sec
* @param startTimeline 秒杀活动开始时刻 * @param startTimeline 秒杀活动开始时刻
* @return 当时间秒杀活动的商品数据 * @return 当时间秒杀活动的商品数据
*/ */
private List<SeckillGoodsVO> wrapperSeckillGoods(Integer startTimeline) { private List<SeckillGoodsVO> wrapperSeckillGoods(Integer startTimeline, String seckillId) {
List<SeckillGoodsVO> seckillGoodsVoS = new ArrayList<>(); List<SeckillGoodsVO> seckillGoodsVoS = new ArrayList<>();
LambdaQueryWrapper<Seckill> seckillLambdaQueryWrapper = new LambdaQueryWrapper<>(); List<SeckillApply> seckillApplyList = this.list(new LambdaQueryWrapper<SeckillApply>().eq(SeckillApply::getSeckillId, seckillId));
seckillLambdaQueryWrapper.ge(Seckill::getStartTime, new Date(cn.lili.common.utils.DateUtil.startOfTodDay() * 1000)).le(Seckill::getEndTime, cn.lili.common.utils.DateUtil.endOfDate()) if (!seckillApplyList.isEmpty()) {
.and(i -> i.eq(Seckill::getPromotionStatus, PromotionStatusEnum.NEW.name()) List<SeckillApply> collect = seckillApplyList.stream().filter(i -> i.getTimeLine().equals(startTimeline) && i.getPromotionApplyStatus().equals(PromotionsApplyStatusEnum.PASS.name())).collect(Collectors.toList());
.or(j -> j.eq(Seckill::getPromotionStatus, PromotionStatusEnum.START.name()))); for (SeckillApply seckillApply : collect) {
List<Seckill> seckillList = this.seckillService.list(seckillLambdaQueryWrapper);
if (!seckillList.isEmpty()) {
for (Seckill seckill : seckillList) {
LambdaQueryWrapper<SeckillApply> seckillApplyLambdaQueryWrapper = new LambdaQueryWrapper<SeckillApply>().eq(SeckillApply::getTimeLine, startTimeline).eq(SeckillApply::getSeckillId, seckill.getId()).eq(SeckillApply::getPromotionApplyStatus, PromotionApplyStatusEnum.PASS.name());
List<SeckillApply> list = this.list(seckillApplyLambdaQueryWrapper);
for (SeckillApply seckillApply : list) {
GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(seckillApply.getSkuId()); GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(seckillApply.getSkuId());
if (goodsSku != null) { if (goodsSku != null) {
SeckillGoodsVO goodsVO = new SeckillGoodsVO(); SeckillGoodsVO goodsVO = new SeckillGoodsVO();
@ -349,7 +309,6 @@ public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, Sec
} }
} }
} }
}
return seckillGoodsVoS; return seckillGoodsVoS;
} }
@ -361,7 +320,7 @@ public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, Sec
* @param goodsSku 商品SKU * @param goodsSku 商品SKU
* @param startTime 秒杀时段开启时间 * @param startTime 秒杀时段开启时间
*/ */
private void checkSeckillGoodsSku(SeckillVO seckill, SeckillApplyVO seckillApply, GoodsSku goodsSku, DateTime startTime) { private void checkSeckillGoodsSku(Seckill seckill, SeckillApplyVO seckillApply, GoodsSku goodsSku, DateTime startTime) {
//活动库存不能大于商品库存 //活动库存不能大于商品库存
if (goodsSku.getQuantity() < seckillApply.getQuantity()) { if (goodsSku.getQuantity() < seckillApply.getQuantity()) {
throw new ServiceException(seckillApply.getGoodsName() + ",此商品库存不足"); throw new ServiceException(seckillApply.getGoodsName() + ",此商品库存不足");
@ -390,20 +349,10 @@ public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, Sec
promotionGoods.setPrice(seckillApply.getPrice()); promotionGoods.setPrice(seckillApply.getPrice());
promotionGoods.setQuantity(seckillApply.getQuantity()); promotionGoods.setQuantity(seckillApply.getQuantity());
//设置单独每个促销商品的结束时间 //设置单独每个促销商品的结束时间
int nextHour = 23; DateTime startTime = DateUtil.offsetHour(DateUtil.beginOfDay(seckill.getStartTime()), seckillApply.getTimeLine());
String[] split = seckill.getHours().split(",");
int[] hoursSored = Arrays.stream(split).mapToInt(Integer::parseInt).toArray();
Arrays.sort(hoursSored);
for (int i : hoursSored) {
if (seckillApply.getTimeLine() < i) {
nextHour = i;
break;
}
}
DateTime startTime = DateUtil.offsetHour(seckill.getStartTime(), seckillApply.getTimeLine());
DateTime parseEndTime = DateUtil.offsetSecond(DateUtil.offsetHour(seckill.getStartTime(), nextHour), 1);
promotionGoods.setStartTime(startTime); promotionGoods.setStartTime(startTime);
promotionGoods.setEndTime(parseEndTime); promotionGoods.setEndTime(seckill.getEndTime());
return promotionGoods; return promotionGoods;
} }
} }

View File

@ -1,22 +1,17 @@
package cn.lili.modules.promotion.serviceimpl; package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.enums.PromotionTypeEnum; 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.properties.RocketmqCustomProperties;
import cn.lili.common.utils.BeanUtil;
import cn.lili.common.utils.DateUtil;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO;
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.PromotionsApplyStatusEnum;
import cn.lili.modules.promotion.entity.enums.SeckillApplyStatusEnum;
import cn.lili.modules.promotion.entity.vos.SeckillSearchParams;
import cn.lili.modules.promotion.entity.vos.SeckillVO; import cn.lili.modules.promotion.entity.vos.SeckillVO;
import cn.lili.modules.promotion.mapper.SeckillMapper; import cn.lili.modules.promotion.mapper.SeckillMapper;
import cn.lili.modules.promotion.service.PromotionGoodsService;
import cn.lili.modules.promotion.service.SeckillApplyService; import cn.lili.modules.promotion.service.SeckillApplyService;
import cn.lili.modules.promotion.service.SeckillService; import cn.lili.modules.promotion.service.SeckillService;
import cn.lili.modules.promotion.tools.PromotionTools; import cn.lili.modules.promotion.tools.PromotionTools;
@ -25,31 +20,18 @@ 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;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.gson.Gson; import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
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.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* 秒杀活动业务层实现 * 秒杀活动业务层实现
@ -59,259 +41,112 @@ import java.util.stream.Collectors;
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public class SeckillServiceImpl extends ServiceImpl<SeckillMapper, Seckill> implements SeckillService { @Slf4j
public class SeckillServiceImpl extends AbstractPromotionsServiceImpl<SeckillMapper, Seckill> implements SeckillService {
/**
* 延时任务
*/
@Autowired
private TimeTrigger timeTrigger;
/**
* Mongo
*/
@Autowired
private MongoTemplate mongoTemplate;
/**
* RocketMQ
*/
@Autowired
private RocketmqCustomProperties rocketmqCustomProperties;
/** /**
* 商品索引 * 商品索引
*/ */
@Autowired @Autowired
private EsGoodsIndexService goodsIndexService; private EsGoodsIndexService goodsIndexService;
/**
* 促销商品
*/
@Autowired
private PromotionGoodsService promotionGoodsService;
/**
* 秒杀申请
*/
@Autowired
private SeckillApplyService seckillApplyService;
/** /**
* 设置 * 设置
*/ */
@Autowired @Autowired
private SettingService settingService; private SettingService settingService;
@Override @Autowired
public IPage<Seckill> getSeckillByPageFromMysql(SeckillSearchParams queryParam, PageVO pageVo) { private SeckillApplyService seckillApplyService;
QueryWrapper<Seckill> queryWrapper = queryParam.wrapper();
return page(PageUtil.initPage(pageVo), queryWrapper);
}
@Override @Override
public IPage<SeckillVO> getSeckillByPageFromMongo(SeckillSearchParams queryParam, PageVO pageVo) { public SeckillVO getSeckillDetail(String id) {
IPage<SeckillVO> seckill = new Page<>(pageVo.getPageNumber(), pageVo.getPageSize()); Seckill seckill = this.checkSeckillExist(id);
if (queryParam == null) { SeckillVO seckillVO = new SeckillVO();
queryParam = new SeckillSearchParams(); BeanUtils.copyProperties(seckill, seckillVO);
} seckillVO.setSeckillApplyList(this.seckillApplyService.list(new LambdaQueryWrapper<SeckillApply>().eq(SeckillApply::getSeckillId, id)));
Query query = queryParam.mongoQuery(); return seckillVO;
pageVo.setNotConvert(true);
PromotionTools.mongoQueryPageParam(query, pageVo);
seckill.setCurrent(pageVo.getPageNumber());
seckill.setSize(pageVo.getPageSize());
List<SeckillVO> seckillVOS = this.mongoTemplate.find(query, SeckillVO.class);
seckill.setRecords(seckillVOS);
seckill.setTotal(this.mongoTemplate.count(queryParam.mongoQuery(), SeckillVO.class));
return seckill;
}
@Override
public SeckillVO getSeckillByIdFromMongo(String id) {
return this.checkSeckillExist(id);
} }
@Override @Override
public void init() { public void init() {
//清除演示数据 //清除演示数据
List<Seckill> seckillList = list(); List<Seckill> seckillList = this.list();
for (Seckill seckill : seckillList) { for (Seckill seckill : seckillList) {
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, seckill.setStartTime(null);
seckill.getStartTime().getTime(), seckill.setEndTime(null);
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (PromotionTypeEnum.SECKILL.name() + seckill.getId())), this.goodsIndexService.updateEsGoodsIndexAllByList(seckill, PromotionTypeEnum.SECKILL.name() + "-" + seckill.getId());
rocketmqCustomProperties.getPromotionTopic());
this.removeById(seckill.getId());
} }
this.remove(new QueryWrapper<>());
Setting setting = settingService.get(SettingEnum.SECKILL_SETTING.name()); Setting setting = settingService.get(SettingEnum.SECKILL_SETTING.name());
SeckillSetting seckillSetting = new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class); SeckillSetting seckillSetting = new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class);
for (int i = 1; i <= PRE_CREATION; i++) { for (int i = 1; i <= PRE_CREATION; i++) {
Seckill seckill = new Seckill(i, seckillSetting.getHours(), seckillSetting.getSeckillRule()); Seckill seckill = new Seckill(i, seckillSetting.getHours(), seckillSetting.getSeckillRule());
this.saveSeckill(seckill); this.savePromotions(seckill);
}
}
@Override
public boolean saveSeckill(Seckill seckill) {
SeckillVO seckillVO = new SeckillVO();
BeanUtil.copyProperties(seckill, seckillVO);
seckillVO.setSeckillApplyStatus(SeckillApplyStatusEnum.NOT_APPLY.name());
seckillVO.setSeckillApplyList(null);
//检查秒杀活动参数
checkSeckillParam(seckillVO);
//保存到MYSQL中
boolean result = this.save(seckillVO);
//保存到MONGO中
this.mongoTemplate.save(seckillVO);
//添加秒杀延时任务
this.addSeckillStartTask(seckillVO);
return result;
}
@Override
public void storeApply(String storeId, String seckillId) {
Seckill seckill = this.getById(seckillId);
String storeIds;
if (!StringUtils.isEmpty(seckill.getStoreIds())) {
storeIds = seckill.getStoreIds() + storeId + ",";
} else {
storeIds = storeId + ",";
}
seckill.setStoreIds(storeIds);
this.updateById(seckill);
}
@Override
public boolean modifySeckill(SeckillVO seckillVO) {
//检查该秒杀活动是否存在
SeckillVO seckill = checkSeckillExist(seckillVO.getId());
if (PromotionStatusEnum.START.name().equals(seckillVO.getPromotionStatus())) {
throw new ServiceException(ResultCode.PROMOTION_UPDATE_ERROR);
}
if (seckillVO.getEndTime() == null) {
seckillVO.setEndTime(cn.hutool.core.date.DateUtil.endOfDay(seckillVO.getStartTime()));
}
PromotionTools.checkPromotionTime(seckillVO.getStartTime().getTime(), seckillVO.getEndTime().getTime());
//检查秒杀活动参数
this.checkSeckillParam(seckillVO);
//更新到MYSQL中
boolean result = this.updateById(seckillVO);
//保存到MONGO中
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,
promotionMessage,
seckill.getStartTime().getTime(),
seckillVO.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
DateUtil.getDelayTime(seckillVO.getStartTime().getTime()),
rocketmqCustomProperties.getPromotionTopic());
}
return result;
}
@Override
public void deleteSeckill(String id) {
Seckill seckill = checkSeckillExist(id);
if (PromotionStatusEnum.CLOSE.name().equals(seckill.getPromotionStatus()) || PromotionStatusEnum.END.name().equals(seckill.getPromotionStatus())) {
//更新秒杀活动状态为关闭标示删除标志
LambdaUpdateWrapper<Seckill> updateWrapper = new LambdaUpdateWrapper<Seckill>().eq(Seckill::getId, id).set(Seckill::getDeleteFlag, true).set(Seckill::getPromotionStatus, PromotionStatusEnum.CLOSE.name());
this.update(updateWrapper);
LambdaUpdateWrapper<SeckillApply> seckillApplyLambdaUpdateWrapper = new LambdaUpdateWrapper<SeckillApply>().eq(SeckillApply::getSeckillId, id).set(SeckillApply::getDeleteFlag, true);
this.seckillApplyService.update(seckillApplyLambdaUpdateWrapper);
this.mongoTemplate.remove(new Query().addCriteria(Criteria.where("id").is(id)), SeckillVO.class);
LambdaUpdateWrapper<PromotionGoods> promotionGoodsQueryWrapper = new LambdaUpdateWrapper<PromotionGoods>().eq(PromotionGoods::getPromotionId, id).set(PromotionGoods::getDeleteFlag, true);
this.promotionGoodsService.update(promotionGoodsQueryWrapper);
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR,
seckill.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (PromotionTypeEnum.SECKILL.name() + seckill.getId())),
rocketmqCustomProperties.getPromotionTopic());
} else {
throw new ServiceException(ResultCode.SECKILL_DELETE_ERROR);
}
}
/**
* 开启一个秒杀活动
*
* @param id 秒杀活动编号
*/
@Override
public void openSeckill(String id) {
SeckillVO seckillVO = checkSeckillExist(id);
if (seckillVO.getEndTime() == null) {
seckillVO.setEndTime(cn.hutool.core.date.DateUtil.endOfDay(seckillVO.getStartTime()));
}
PromotionTools.checkPromotionTime(seckillVO.getStartTime().getTime(), seckillVO.getEndTime().getTime());
if (PromotionStatusEnum.NEW.name().equals(seckillVO.getPromotionStatus()) || PromotionStatusEnum.CLOSE.name().equals(seckillVO.getPromotionStatus())) {
LambdaUpdateWrapper<Seckill> updateWrapper = new LambdaUpdateWrapper<Seckill>().eq(Seckill::getId, id).set(Seckill::getPromotionStatus, PromotionStatusEnum.START.name());
this.update(updateWrapper);
seckillVO.setPromotionStatus(PromotionStatusEnum.START.name());
this.mongoTemplate.save(seckillVO);
this.addSeckillStartTask(seckillVO);
}
}
@Override
public void closeSeckill(String id) {
SeckillVO seckillVO = checkSeckillExist(id);
if (PromotionStatusEnum.NEW.name().equals(seckillVO.getPromotionStatus()) || PromotionStatusEnum.START.name().equals(seckillVO.getPromotionStatus())) {
LambdaUpdateWrapper<Seckill> updateWrapper = new LambdaUpdateWrapper<Seckill>().eq(Seckill::getId, id).set(Seckill::getPromotionStatus, PromotionStatusEnum.CLOSE.name());
this.update(updateWrapper);
seckillVO.setPromotionStatus(PromotionStatusEnum.CLOSE.name());
this.mongoTemplate.save(seckillVO);
if (PromotionStatusEnum.CLOSE.name().equals(seckillVO.getPromotionStatus())) {
LambdaQueryWrapper<PromotionGoods> deleteWrapper = new LambdaQueryWrapper<>();
deleteWrapper.eq(PromotionGoods::getPromotionId, seckillVO.getId());
promotionGoodsService.remove(deleteWrapper);
if (seckillVO.getSeckillApplyList() != null) {
List<String> skuIds = seckillVO.getSeckillApplyList().stream().map(SeckillApply::getSkuId).collect(Collectors.toList());
this.goodsIndexService.deleteEsGoodsPromotionIndexByList(skuIds, PromotionTypeEnum.SECKILL);
}
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR,
seckillVO.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (PromotionTypeEnum.SECKILL.name() + seckillVO.getId())),
rocketmqCustomProperties.getPromotionTopic());
}
} else {
throw new ServiceException(ResultCode.SECKILL_CLOSE_ERROR);
} }
} }
@Override @Override
public Integer getApplyNum() { public Integer getApplyNum() {
LambdaQueryWrapper<Seckill> queryWrapper = Wrappers.lambdaQuery(); DateTime now = DateUtil.date();
//秒杀申请时间未超过当前时间 LambdaQueryWrapper<Seckill> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.ge(Seckill::getApplyEndTime, cn.hutool.core.date.DateUtil.date()); queryWrapper.ge(Seckill::getApplyEndTime, now);
queryWrapper.eq(Seckill::getPromotionStatus, PromotionStatusEnum.NEW.name()); queryWrapper.le(Seckill::getStartTime, now);
queryWrapper.ge(Seckill::getEndTime, now);
return this.count(queryWrapper); return this.count(queryWrapper);
} }
@Override @Override
public void updateSeckillGoodsNum(String seckillId) { public void updateSeckillGoodsNum(String seckillId) {
this.baseMapper.updateSeckillGoodsNum(seckillId); Seckill seckill = this.getById(seckillId);
if (seckill != null) {
LambdaUpdateWrapper<Seckill> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(Seckill::getId, seckillId);
updateWrapper.set(Seckill::getGoodsNum,
this.seckillApplyService.count(new LambdaQueryWrapper<SeckillApply>().eq(SeckillApply::getSeckillId, seckillId)));
this.update(updateWrapper);
}
} }
/** /**
* 添加秒杀活动延时任务 * 更新商品索引限时抢购信息
* *
* @param seckill 秒杀活动 * @param seckill 限时抢购信息
*/ */
public void addSeckillStartTask(SeckillVO seckill) { @Override
PromotionMessage promotionMessage = new PromotionMessage(seckill.getId(), PromotionTypeEnum.SECKILL.name(), PromotionStatusEnum.START.name(), seckill.getStartTime(), seckill.getEndTime()); public void updateEsGoodsSeckill(Seckill seckill, List<SeckillApply> seckillApplies) {
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, if (seckillApplies != null && !seckillApplies.isEmpty()) {
seckill.getStartTime().getTime(), //循环秒杀商品数据将数据按照时间段进行存储
promotionMessage, for (SeckillApply seckillApply : seckillApplies) {
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), if (seckillApply.getPromotionApplyStatus().equals(PromotionsApplyStatusEnum.PASS.name())) {
rocketmqCustomProperties.getPromotionTopic()); this.setSeckillApplyTime(seckill, seckillApply);
//发送促销活动开始的延时任务 log.info("更新限时抢购商品状态:{}", seckill);
this.timeTrigger.addDelay(timeTriggerMsg); String promotionKey = PromotionTypeEnum.SECKILL.name() + "-" + seckillApply.getTimeLine();
this.goodsIndexService.updateEsGoodsIndexPromotions(seckillApply.getSkuId(), seckill, promotionKey, seckillApply.getPrice());
}
}
}
}
@Override
public void setSeckillApplyTime(Seckill seckill, SeckillApply seckillApply) {
//下一个时间默认为当天结束时间
int nextHour = PromotionTools.nextHour(seckill.getHours().split(","), seckillApply.getTimeLine());
String format = DateUtil.format(seckill.getStartTime(), DatePattern.NORM_DATE_PATTERN);
DateTime parseStartTime = DateUtil.parse((format + " " + seckillApply.getTimeLine()), "yyyy-MM-dd HH");
DateTime parseEndTime = DateUtil.parse((format + " " + nextHour), "yyyy-MM-dd HH");
//如果是当天最后的时间段则设置到当天结束时间的59分59秒
if (nextHour == seckillApply.getTimeLine()) {
parseEndTime = DateUtil.parse((format + " " + nextHour + ":59:59"), DatePattern.NORM_DATETIME_PATTERN);
}
seckill.setStartTime(parseStartTime);
//当时商品的秒杀活动活动结束时间为下个时间段的开始
seckill.setEndTime(parseEndTime);
} }
/** /**
@ -320,8 +155,8 @@ public class SeckillServiceImpl extends ServiceImpl<SeckillMapper, Seckill> impl
* @param id 秒杀活动编号 * @param id 秒杀活动编号
* @return 秒杀活动信息 * @return 秒杀活动信息
*/ */
private SeckillVO checkSeckillExist(String id) { private Seckill checkSeckillExist(String id) {
SeckillVO seckill = this.mongoTemplate.findById(id, SeckillVO.class); Seckill seckill = this.getById(id);
if (seckill == null) { if (seckill == null) {
throw new ServiceException(ResultCode.SECKILL_NOT_EXIST_ERROR); throw new ServiceException(ResultCode.SECKILL_NOT_EXIST_ERROR);
} }
@ -329,17 +164,53 @@ public class SeckillServiceImpl extends ServiceImpl<SeckillMapper, Seckill> impl
} }
/** /**
* 检查秒杀活动参数 * 初始化促销字段
* *
* @param seckill 秒杀活动信息 * @param promotions 促销实体
*/ */
private void checkSeckillParam(SeckillVO seckill) { @Override
public void initPromotion(Seckill promotions) {
super.initPromotion(promotions);
if (promotions.getStartTime() != null && promotions.getEndTime() == null) {
promotions.setEndTime(DateUtil.endOfDay(promotions.getStartTime()));
}
}
/**
* 检查促销状态
*
* @param promotions 促销实体
*/
@Override
public void checkStatus(Seckill promotions) {
super.checkStatus(promotions);
if (promotions.getStartTime() != null && CharSequenceUtil.isNotEmpty(promotions.getHours())) {
String[] split = promotions.getHours().split(",");
Arrays.sort(split);
String startTimeStr = DateUtil.format(promotions.getStartTime(), DatePattern.NORM_DATE_PATTERN) + " " + split[0] + ":00";
promotions.setStartTime(DateUtil.parse(startTimeStr, DatePattern.NORM_DATETIME_MINUTE_PATTERN));
promotions.setEndTime(DateUtil.endOfDay(promotions.getStartTime()));
}
if (promotions.getStartTime() != null && promotions.getEndTime() != null) {
//同一时间段内相同的活动 //同一时间段内相同的活动
QueryWrapper<Seckill> queryWrapper = PromotionTools.checkActiveTime(seckill.getStartTime(), seckill.getEndTime(), PromotionTypeEnum.SECKILL, null, seckill.getId()); QueryWrapper<Seckill> queryWrapper = PromotionTools.checkActiveTime(promotions.getStartTime(), promotions.getEndTime(), PromotionTypeEnum.SECKILL, null, promotions.getId());
int sameNum = this.count(queryWrapper); int sameNum = this.count(queryWrapper);
//当前时间段是否存在同类活动 //当前时间段是否存在同类活动
if (sameNum > 0) { if (sameNum > 0) {
throw new ServiceException(ResultCode.PROMOTION_SAME_ACTIVE_EXIST); throw new ServiceException(ResultCode.PROMOTION_SAME_ACTIVE_EXIST);
} }
} }
}
/**
* 当前促销类型
*
* @return 当前促销类型
*/
@Override
public PromotionTypeEnum getPromotionType() {
return PromotionTypeEnum.SECKILL;
}
} }

View File

@ -1,5 +1,6 @@
package cn.lili.modules.promotion.tools; package cn.lili.modules.promotion.tools;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.enums.PromotionTypeEnum;
@ -7,15 +8,17 @@ import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.vo.PageVO; 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.BasePromotions;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
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;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.function.Consumer;
/** /**
@ -26,6 +29,10 @@ import java.util.List;
**/ **/
public class PromotionTools { public class PromotionTools {
public static final String START_TIME_COLUMN = "start_time";
public static final String END_TIME_COLUMN = "end_time";
/** /**
* 参数验证 * 参数验证
* 1活动起始时间必须大于当前时间 * 1活动起始时间必须大于当前时间
@ -36,7 +43,7 @@ public class PromotionTools {
* @param num 参与活动商品数量 * @param num 参与活动商品数量
* @param goodsList 选择的商品 * @param goodsList 选择的商品
*/ */
public static void paramValid(Long startTime, Long endTime, int num, List<PromotionGoods> goodsList) { public static void paramValid(Date startTime, Date endTime, int num, List<PromotionGoods> goodsList) {
checkPromotionTime(startTime, endTime); checkPromotionTime(startTime, endTime);
@ -54,17 +61,25 @@ public class PromotionTools {
* @param startTime 活动开始时间 * @param startTime 活动开始时间
* @param endTime 活动结束时间 * @param endTime 活动结束时间
*/ */
public static void checkPromotionTime(Long startTime, Long endTime) { public static void checkPromotionTime(Date startTime, Date endTime) {
long nowTime = DateUtil.current(); if (startTime == null) {
throw new ServiceException(ResultCode.PROMOTION_TIME_NOT_EXIST);
}
DateTime now = DateUtil.date();
//如果活动起始时间小于现在时间 //如果活动起始时间小于现在时间
if (startTime < nowTime || endTime < nowTime) { if (now.after(startTime)) {
throw new ServiceException(ResultCode.PROMOTION_START_TIME_ERROR); throw new ServiceException(ResultCode.PROMOTION_START_TIME_ERROR);
} }
//如果活动结束时间小于现在时间
if (endTime != null && now.after(endTime)) {
throw new ServiceException(ResultCode.PROMOTION_END_TIME_ERROR);
}
//开始时间不能大于结束时间 //开始时间不能大于结束时间
if (startTime > endTime) { if (endTime != null && startTime.after(endTime)) {
throw new ServiceException(ResultCode.PROMOTION_TIME_ERROR); throw new ServiceException(ResultCode.PROMOTION_TIME_ERROR);
} }
} }
@ -76,23 +91,20 @@ public class PromotionTools {
* @param endTime 结束时间 * @param endTime 结束时间
* @param typeEnum 促销类型 * @param typeEnum 促销类型
* @param storeId 店铺id * @param storeId 店铺id
* @param activityId 促销活动id * @param activityId 排除的促销活动id
* @param <T> 促销类型
* @return mybatis plus query wrapper对象 * @return mybatis plus query wrapper对象
*/ */
public static <T extends BasePromotion> QueryWrapper<T> checkActiveTime(Date startTime, Date endTime, PromotionTypeEnum typeEnum, String storeId, String activityId) { public static <T extends BasePromotions> QueryWrapper<T> checkActiveTime(Date startTime, Date endTime, PromotionTypeEnum typeEnum, String storeId, String activityId) {
QueryWrapper<T> queryWrapper = new QueryWrapper<>(); QueryWrapper<T> queryWrapper = new QueryWrapper<>();
String startTimeColumn = "start_time";
String endTimeColumn = "end_time";
if (PromotionTypeEnum.SECKILL != typeEnum) { if (PromotionTypeEnum.SECKILL != typeEnum) {
queryWrapper.nested(i -> { queryWrapper.nested(i -> {
//新活动起始时间 大于 之前活动的起始时间 小于 之前活动的截止时间 //新活动起始时间 大于 之前活动的起始时间 小于 之前活动的截止时间
i.nested(i2 -> i2.le(startTimeColumn, startTime).ge(endTimeColumn, startTime)); i.nested(i2 -> i2.le(START_TIME_COLUMN, startTime).ge(END_TIME_COLUMN, startTime));
//新活动结束时间 大于 之前活动的起始时间 小于 之前活动的截止时间 //新活动结束时间 大于 之前活动的起始时间 小于 之前活动的截止时间
i.or(i1 -> i1.le(startTimeColumn, endTime).ge(endTimeColumn, endTime)); i.or(i1 -> i1.le(START_TIME_COLUMN, endTime).ge(END_TIME_COLUMN, endTime));
}); });
} else { } else {
queryWrapper.ge(startTimeColumn, DateUtil.beginOfDay(startTime)).le(endTimeColumn, DateUtil.endOfDay(endTime)); queryWrapper.ge(START_TIME_COLUMN, DateUtil.beginOfDay(startTime)).le(END_TIME_COLUMN, DateUtil.endOfDay(endTime));
} }
if (storeId != null) { if (storeId != null) {
queryWrapper.eq("store_id", storeId); queryWrapper.eq("store_id", storeId);
@ -100,13 +112,27 @@ public class PromotionTools {
if (activityId != null) { if (activityId != null) {
queryWrapper.ne("id", activityId); queryWrapper.ne("id", activityId);
} }
//忽略已作废和已关闭的活动 queryWrapper.and(i -> i.or(queryPromotionStatus(PromotionsStatusEnum.NEW)).or(queryPromotionStatus(PromotionsStatusEnum.START)));
queryWrapper.ne("promotion_status", PromotionStatusEnum.END.name());
queryWrapper.ne("promotion_status", PromotionStatusEnum.CLOSE.name());
queryWrapper.eq("delete_flag", false); queryWrapper.eq("delete_flag", false);
return queryWrapper; return queryWrapper;
} }
public static <T> Consumer<QueryWrapper<T>> queryPromotionStatus(PromotionsStatusEnum promotionsStatusEnum) {
switch (promotionsStatusEnum) {
case NEW:
return (QueryWrapper<T> t) -> t.nested(i -> i.gt(START_TIME_COLUMN, new Date()).gt(END_TIME_COLUMN, new Date()));
case START:
return (QueryWrapper<T> t) -> t.nested(i -> i.le(START_TIME_COLUMN, new Date()).ge(END_TIME_COLUMN, new Date()));
case END:
return (QueryWrapper<T> t) -> t.nested(i -> i.lt(START_TIME_COLUMN, new Date()).lt(END_TIME_COLUMN, new Date()));
case CLOSE:
return (QueryWrapper<T> t) -> t.nested(i -> i.isNull(START_TIME_COLUMN).isNull(END_TIME_COLUMN));
default:
return null;
}
}
/** /**
* 促销商品入库前填充 * 促销商品入库前填充
* *
@ -114,7 +140,8 @@ public class PromotionTools {
* @param promotion 促销信息 * @param promotion 促销信息
* @return 促销商品列表 * @return 促销商品列表
*/ */
public static List<PromotionGoods> promotionGoodsInit(List<PromotionGoods> originList, BasePromotion promotion, PromotionTypeEnum promotionTypeEnum) { public static List<PromotionGoods> promotionGoodsInit(List<PromotionGoods> originList, BasePromotions promotion, PromotionTypeEnum promotionTypeEnum) {
if (originList != null) {
//本次促销商品入库 //本次促销商品入库
for (PromotionGoods promotionGoods : originList) { for (PromotionGoods promotionGoods : originList) {
promotionGoods.setPromotionId(promotion.getId()); promotionGoods.setPromotionId(promotion.getId());
@ -123,12 +150,13 @@ public class PromotionTools {
if (promotionGoods.getStartTime() == null) { if (promotionGoods.getStartTime() == null) {
promotionGoods.setStartTime(promotion.getStartTime()); promotionGoods.setStartTime(promotion.getStartTime());
} }
if (promotion.getEndTime() == null) { if (promotionGoods.getEndTime() == null) {
promotionGoods.setEndTime(promotion.getEndTime()); promotionGoods.setEndTime(promotion.getEndTime());
} }
promotionGoods.setPromotionType(promotionTypeEnum.name()); promotionGoods.setPromotionType(promotionTypeEnum.name());
promotionGoods.setPromotionStatus(promotion.getPromotionStatus());
promotionGoods.setNum(0); promotionGoods.setNum(0);
promotionGoods.setDeleteFlag(promotion.getDeleteFlag());
}
} }
return originList; return originList;
} }
@ -147,4 +175,17 @@ public class PromotionTools {
} }
} }
public static int nextHour(String[] totalHours, Integer timeline) {
int nextHour = 23;
int[] hoursSored = Arrays.stream(totalHours).mapToInt(Integer::parseInt).toArray();
Arrays.sort(hoursSored);
for (int i : hoursSored) {
if (timeline < i) {
nextHour = i;
break;
}
}
return nextHour;
}
} }

View File

@ -4,7 +4,7 @@ import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.entity.dto.GoodsParamsDTO; import cn.lili.modules.goods.entity.dto.GoodsParamsDTO;
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.BasePromotions;
import cn.lili.modules.search.entity.dos.EsGoodsIndex; import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import java.util.List; import java.util.List;
@ -94,7 +94,16 @@ public interface EsGoodsIndexService {
* @param key 促销信息的key * @param key 促销信息的key
* @param price 促销价格 * @param price 促销价格
*/ */
void updateEsGoodsIndex(String id, BasePromotion promotion, String key, Double price); void updateEsGoodsIndexPromotions(String id, BasePromotions promotion, String key, Double price);
/**
* 更新商品索引的促销信息
*
* @param ids id(skuId)
* @param promotion 促销信息
* @param key 促销信息的key
*/
void updateEsGoodsIndexPromotions(List<String> ids, BasePromotions promotion, String key);
/** /**
* 根据列表更新商品索引的促销信息 * 根据列表更新商品索引的促销信息
@ -103,7 +112,7 @@ public interface EsGoodsIndexService {
* @param promotion 促销信息 * @param promotion 促销信息
* @param key 促销信息的key * @param key 促销信息的key
*/ */
void updateEsGoodsIndexByList(List<PromotionGoods> promotionGoodsList, BasePromotion promotion, String key); void updateEsGoodsIndexByList(List<PromotionGoods> promotionGoodsList, BasePromotions promotion, String key);
/** /**
* 更新全部商品索引的促销信息 * 更新全部商品索引的促销信息
@ -111,7 +120,7 @@ public interface EsGoodsIndexService {
* @param promotion 促销信息 * @param promotion 促销信息
* @param key 促销信息的key * @param key 促销信息的key
*/ */
void updateEsGoodsIndexAllByList(BasePromotion promotion, String key); void updateEsGoodsIndexAllByList(BasePromotions promotion, String key);
/** /**
* 删除指定商品的促销信息 * 删除指定商品的促销信息

View File

@ -57,4 +57,12 @@ public interface EsGoodsSearchService {
* @return ES商品列表 * @return ES商品列表
*/ */
List<EsGoodsIndex> getEsGoodsBySkuIds(List<String> skuIds); List<EsGoodsIndex> getEsGoodsBySkuIds(List<String> skuIds);
/**
* 根据id获取商品索引
*
* @param id 商品skuId
* @return 商品索引
*/
EsGoodsIndex getEsGoodsById(String id);
} }

View File

@ -1,20 +1,21 @@
package cn.lili.modules.search.serviceimpl; package cn.lili.modules.search.serviceimpl;
import cn.lili.common.context.ThreadContextHolder;
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.mybatis.util.PageUtil;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.common.context.ThreadContextHolder;
import cn.lili.modules.search.entity.dos.CustomWords; import cn.lili.modules.search.entity.dos.CustomWords;
import cn.lili.modules.search.entity.vo.CustomWordsVO; import cn.lili.modules.search.entity.vo.CustomWordsVO;
import cn.lili.modules.search.mapper.CustomWordsMapper; import cn.lili.modules.search.mapper.CustomWordsMapper;
import cn.lili.modules.search.service.CustomWordsService; import cn.lili.modules.search.service.CustomWordsService;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.List;
/** /**
@ -32,14 +33,13 @@ public class CustomWordsServiceImpl extends ServiceImpl<CustomWordsMapper, Custo
HttpServletResponse response = ThreadContextHolder.getHttpResponse(); HttpServletResponse response = ThreadContextHolder.getHttpResponse();
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
if (list != null && !list.isEmpty()) { if (list != null && !list.isEmpty()) {
boolean flag = true; boolean flag = true;
for (CustomWords customWords : list) { for (CustomWords customWords : list) {
if (flag) { if (flag) {
try { try {
response.setHeader("Last-Modified", customWords.getCreateTime().toString()); response.setHeader("Last-Modified", customWords.getCreateTime().toString());
response.setHeader("ETag", customWords.getUpdateTime().toString()); response.setHeader("ETag", Integer.toString(list.size()));
} catch (Exception e) { } catch (Exception e) {
log.error("自定义分词错误",e); log.error("自定义分词错误",e);
} }
@ -52,7 +52,7 @@ public class CustomWordsServiceImpl extends ServiceImpl<CustomWordsMapper, Custo
} }
} }
return builder.toString(); return new String(builder.toString().getBytes(StandardCharsets.UTF_8));
} }
/** /**
@ -63,9 +63,14 @@ public class CustomWordsServiceImpl extends ServiceImpl<CustomWordsMapper, Custo
*/ */
@Override @Override
public boolean addCustomWords(CustomWordsVO customWordsVO) { public boolean addCustomWords(CustomWordsVO customWordsVO) {
if (this.existWords(customWordsVO.getName())) { LambdaQueryWrapper<CustomWords> queryWrapper = new LambdaQueryWrapper<CustomWords>().eq(CustomWords::getName, customWordsVO.getName());
CustomWords one = this.getOne(queryWrapper, false);
if (one != null && one.getDisabled().equals(1)) {
throw new ServiceException(ResultCode.CUSTOM_WORDS_EXIST_ERROR); throw new ServiceException(ResultCode.CUSTOM_WORDS_EXIST_ERROR);
} else if (one != null && !one.getDisabled().equals(1)) {
this.remove(queryWrapper);
} }
customWordsVO.setDisabled(1);
return this.save(customWordsVO); return this.save(customWordsVO);
} }

View File

@ -22,11 +22,12 @@ import cn.lili.modules.goods.entity.enums.GoodsAuthEnum;
import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum;
import cn.lili.modules.goods.entity.enums.GoodsWordsTypeEnum; import cn.lili.modules.goods.entity.enums.GoodsWordsTypeEnum;
import cn.lili.modules.goods.service.*; import cn.lili.modules.goods.service.*;
import cn.lili.modules.promotion.entity.dos.Pintuan;
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.dos.Seckill;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.dto.BasePromotions;
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.service.PromotionService; import cn.lili.modules.promotion.service.PromotionService;
import cn.lili.modules.search.entity.dos.EsGoodsAttribute;
import cn.lili.modules.search.entity.dos.EsGoodsIndex; import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO; import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO;
import cn.lili.modules.search.repository.EsGoodsIndexRepository; import cn.lili.modules.search.repository.EsGoodsIndexRepository;
@ -41,8 +42,6 @@ import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder; import org.elasticsearch.index.query.TermQueryBuilder;
@ -165,7 +164,7 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
public Map<String, Integer> getProgress() { public Map<String, Integer> getProgress() {
Map<String, Integer> map = (Map<String, Integer>) cache.get(CachePrefix.INIT_INDEX_PROCESS.getPrefix()); Map<String, Integer> map = (Map<String, Integer>) cache.get(CachePrefix.INIT_INDEX_PROCESS.getPrefix());
if (map == null) { if (map == null) {
return null; return Collections.emptyMap();
} }
Boolean flag = (Boolean) cache.get(CachePrefix.INIT_INDEX_FLAG.getPrefix()); Boolean flag = (Boolean) cache.get(CachePrefix.INIT_INDEX_FLAG.getPrefix());
map.put("flag", Boolean.TRUE.equals(flag) ? 1 : 0); map.put("flag", Boolean.TRUE.equals(flag) ? 1 : 0);
@ -176,24 +175,24 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
public void addIndex(EsGoodsIndex goods) { public void addIndex(EsGoodsIndex goods) {
try { try {
//分词器分词 //分词器分词
AnalyzeRequest analyzeRequest = AnalyzeRequest.withIndexAnalyzer(getIndexName(), "ik_max_word", goods.getGoodsName()); // AnalyzeRequest analyzeRequest = AnalyzeRequest.withIndexAnalyzer(getIndexName(), "ik_max_word", goods.getGoodsName());
AnalyzeResponse analyze = client.indices().analyze(analyzeRequest, RequestOptions.DEFAULT); // AnalyzeResponse analyze = client.indices().analyze(analyzeRequest, RequestOptions.DEFAULT);
List<AnalyzeResponse.AnalyzeToken> tokens = analyze.getTokens(); // List<AnalyzeResponse.AnalyzeToken> tokens = analyze.getTokens();
if (goods.getAttrList() != null && !goods.getAttrList().isEmpty()) { // if (goods.getAttrList() != null && !goods.getAttrList().isEmpty()) {
//保存分词 // //保存分词
for (EsGoodsAttribute esGoodsAttribute : goods.getAttrList()) { // for (EsGoodsAttribute esGoodsAttribute : goods.getAttrList()) {
wordsToDb(esGoodsAttribute.getValue()); // wordsToDb(esGoodsAttribute.getValue());
} // }
} // }
//分析词条 // //分析词条
for (AnalyzeResponse.AnalyzeToken token : tokens) { // for (AnalyzeResponse.AnalyzeToken token : tokens) {
//保存词条进入数据库 // //保存词条进入数据库
wordsToDb(token.getTerm()); // wordsToDb(token.getTerm());
} // }
//生成索引 //生成索引
goodsIndexRepository.save(goods); goodsIndexRepository.save(goods);
} catch (IOException e) { } catch (Exception e) {
log.error("为商品[" + goods.getGoodsName() + "]生成索引异常", e); log.error("为商品[" + goods.getGoodsName() + "]生成索引异常", e);
} }
} }
@ -337,11 +336,11 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
} }
@Override @Override
public void updateEsGoodsIndex(String id, BasePromotion promotion, String key, Double price) { public void updateEsGoodsIndexPromotions(String id, BasePromotions promotion, String key, Double price) {
EsGoodsIndex goodsIndex = findById(id); EsGoodsIndex goodsIndex = findById(id);
if (goodsIndex != null) { if (goodsIndex != null) {
//如果有促销活动开始则将促销金额写入 //如果有促销活动开始则将促销金额写入
if (promotion.getPromotionStatus().equals(PromotionStatusEnum.START.name()) && price != null) { if (price != null) {
goodsIndex.setPromotionPrice(price); goodsIndex.setPromotionPrice(price);
} else { } else {
//否则促销金额为商品原价 //否则促销金额为商品原价
@ -354,12 +353,30 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
} }
} }
/**
* 更新商品索引的促销信息
*
* @param ids skuId集合
* @param promotion 促销信息
* @param key 促销信息的key
*/
@Override @Override
public void updateEsGoodsIndexByList(List<PromotionGoods> promotionGoodsList, BasePromotion promotion, String key) { public void updateEsGoodsIndexPromotions(List<String> ids, BasePromotions promotion, String key) {
for (String id : ids) {
this.updateEsGoodsIndexPromotions(id, promotion, key, null);
}
}
@Override
public void updateEsGoodsIndexByList(List<PromotionGoods> promotionGoodsList, BasePromotions promotion, String key) {
if (promotionGoodsList != null) { if (promotionGoodsList != null) {
//循环更新 促销商品索引 //循环更新 促销商品索引
for (PromotionGoods promotionGoods : promotionGoodsList) { for (PromotionGoods promotionGoods : promotionGoodsList) {
updateEsGoodsIndex(promotionGoods.getSkuId(), promotion, key, promotionGoods.getPrice()); Double price = null;
if (promotion instanceof Seckill || promotion instanceof Pintuan) {
price = promotionGoods.getPrice();
}
this.updateEsGoodsIndexPromotions(promotionGoods.getSkuId(), promotion, key, price);
} }
} }
@ -372,7 +389,7 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
* @param key 促销信息的key * @param key 促销信息的key
*/ */
@Override @Override
public void updateEsGoodsIndexAllByList(BasePromotion promotion, String key) { public void updateEsGoodsIndexAllByList(BasePromotions promotion, String key) {
List<EsGoodsIndex> goodsIndices = new ArrayList<>(); List<EsGoodsIndex> goodsIndices = new ArrayList<>();
//如果storeId不为空则表示是店铺活动 //如果storeId不为空则表示是店铺活动
if (promotion.getStoreId() != null) { if (promotion.getStoreId() != null) {
@ -463,11 +480,15 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
if (promotionMap != null && !promotionMap.isEmpty()) { if (promotionMap != null && !promotionMap.isEmpty()) {
//促销不为空则进行清洗 //促销不为空则进行清洗
for (Map.Entry<String, Object> entry : promotionMap.entrySet()) { for (Map.Entry<String, Object> entry : promotionMap.entrySet()) {
BasePromotion promotion = (BasePromotion) entry.getValue(); BasePromotions promotion = (BasePromotions) entry.getValue();
//判定条件为活动已结束 //判定条件为活动已结束
if (promotion.getEndTime().getTime() > DateUtil.date().getTime()) { if (promotion.getEndTime().getTime() < DateUtil.date().getTime()) {
if (entry.getKey().contains(PromotionTypeEnum.SECKILL.name()) || entry.getKey().contains(PromotionTypeEnum.PINTUAN.name())) {
goodsIndex.setPromotionPrice(goodsIndex.getPrice());
}
promotionMap.remove(entry.getKey()); promotionMap.remove(entry.getKey());
} }
} }
} }
} }
@ -524,7 +545,7 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
List<String> promotionIds = new ArrayList<>(); List<String> promotionIds = new ArrayList<>();
//写入促销id //写入促销id
for (String key : keyCollect) { for (String key : keyCollect) {
BasePromotion promotion = (BasePromotion) promotionMap.get(key); BasePromotions promotion = (BasePromotions) promotionMap.get(key);
promotionIds.add(promotion.getId()); promotionIds.add(promotion.getId());
} }
return promotionIds; return promotionIds;
@ -554,7 +575,7 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
* @param key 关键字 * @param key 关键字
* @param promotion 活动 * @param promotion 活动
*/ */
private void updateGoodsIndexPromotion(EsGoodsIndex goodsIndex, String key, BasePromotion promotion) { private void updateGoodsIndexPromotion(EsGoodsIndex goodsIndex, String key, BasePromotions promotion) {
log.info("修改商品活动索引"); log.info("修改商品活动索引");
log.info("商品索引: {}", goodsIndex); log.info("商品索引: {}", goodsIndex);
log.info("关键字: {}", key); log.info("关键字: {}", key);
@ -567,7 +588,7 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
promotionMap = goodsIndex.getPromotionMap(); promotionMap = goodsIndex.getPromotionMap();
} }
//如果活动已结束 //如果活动已结束
if (promotion.getPromotionStatus().equals(PromotionStatusEnum.END.name()) || promotion.getPromotionStatus().equals(PromotionStatusEnum.CLOSE.name())) { if (promotion.getPromotionStatus().equals(PromotionsStatusEnum.END.name()) || promotion.getPromotionStatus().equals(PromotionsStatusEnum.CLOSE.name())) {
//如果存在活动 //如果存在活动
if (promotionMap.containsKey(key)) { if (promotionMap.containsKey(key)) {
//删除活动 //删除活动

View File

@ -34,6 +34,7 @@ import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder; import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
@ -70,6 +71,7 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService {
* ES * ES
*/ */
@Autowired @Autowired
@Qualifier("elasticsearchRestTemplate")
private ElasticsearchRestTemplate restTemplate; private ElasticsearchRestTemplate restTemplate;
/** /**
* 缓存 * 缓存
@ -145,6 +147,17 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService {
return restTemplate.multiGet(build, EsGoodsIndex.class, restTemplate.getIndexCoordinatesFor(EsGoodsIndex.class)); return restTemplate.multiGet(build, EsGoodsIndex.class, restTemplate.getIndexCoordinatesFor(EsGoodsIndex.class));
} }
/**
* 根据id获取商品索引
*
* @param id 商品skuId
* @return 商品索引
*/
@Override
public EsGoodsIndex getEsGoodsById(String id) {
return this.restTemplate.get(id, EsGoodsIndex.class);
}
/** /**
* 转换搜索结果为聚合商品展示信息 * 转换搜索结果为聚合商品展示信息
* *

View File

@ -7,6 +7,7 @@ import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.SearchVO; import cn.lili.common.vo.SearchVO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -150,4 +151,25 @@ public class PageUtil {
return list.subList(fromIndex, toIndex); return list.subList(fromIndex, toIndex);
} }
} }
/**
* 转换分页类型
*
* @param originPage 原分页
* @param records 新分页数据
* @param <T> 新类型
* @return 新类型分页
*/
public static <T> IPage<T> convertPage(IPage originPage, List<T> records) {
IPage<T> resultPage = new Page<>();
if (originPage != null) {
resultPage.setCurrent(originPage.getCurrent());
resultPage.setPages(originPage.getPages());
resultPage.setTotal(originPage.getTotal());
resultPage.setSize(originPage.getSize());
resultPage.setRecords(records);
}
return resultPage;
}
} }

View File

@ -14,6 +14,14 @@ public enum GoodsTagsEnum {
* "更新商品索引" * "更新商品索引"
*/ */
UPDATE_GOODS_INDEX("更新商品索引"), UPDATE_GOODS_INDEX("更新商品索引"),
/**
* "更新商品索引促销信息"
*/
UPDATE_GOODS_INDEX_PROMOTIONS("更新商品索引促销信息"),
/**
* "更新商品索引促销信息"
*/
DELETE_GOODS_INDEX_PROMOTIONS("更新商品索引促销信息"),
/** /**
* "更新商品索引部分字段" * "更新商品索引部分字段"

View File

@ -1,6 +1,8 @@
package cn.lili.controller.other; package cn.lili.controller.other;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
@ -57,7 +59,8 @@ public class CustomWordsController {
return ""; return "";
} }
if (!setting.getSettingValue().equals(secretKey)) { JSONObject jsonObject = JSONUtil.parseObj(setting.getSettingValue());
if (!secretKey.equals(jsonObject.get("secretKey"))) {
throw new ServiceException(ResultCode.CUSTOM_WORDS_SECRET_KEY_ERROR); throw new ServiceException(ResultCode.CUSTOM_WORDS_SECRET_KEY_ERROR);
} }

Some files were not shown because too many files have changed in this diff Show More