Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop

This commit is contained in:
Chopper
2021-12-13 09:32:14 +08:00
231 changed files with 3184 additions and 4157 deletions

View File

@@ -1,9 +1,9 @@
package cn.lili.common.aop.interceptor;
import cn.lili.common.aop.annotation.DemoSite;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.properties.SystemSettingProperties;
import cn.lili.common.aop.annotation.DemoSite;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;

View File

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

View File

@@ -2,7 +2,6 @@ package cn.lili.common.security;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.utils.BeanUtil;

View File

@@ -13,6 +13,7 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration
public class QuartzConfig {
@Bean
public JobDetail sensitiveQuartzDetail() {
return JobBuilder.newJob(SensitiveQuartz.class).withIdentity("sensitiveQuartz").storeDurably().build();

View File

@@ -5,7 +5,6 @@ import cn.lili.cache.CachePrefix;
import cn.lili.common.sensitive.SensitiveWordsFilter;
import lombok.extern.slf4j.Slf4j;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;

View File

@@ -3,11 +3,10 @@ package cn.lili.common.utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.Base64;
import java.util.Base64.Decoder;
import java.io.*;
/**
* base64转为multipartFile工具类
*

View File

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

View File

@@ -1,8 +1,10 @@
package cn.lili.modules.connect.request;
import cn.lili.cache.Cache;
import cn.lili.common.utils.HttpUtils;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.utils.UrlBuilder;
import cn.lili.common.utils.UuidUtils;
import cn.lili.modules.connect.config.AuthConfig;
import cn.lili.modules.connect.config.ConnectAuth;
import cn.lili.modules.connect.entity.dto.AuthCallback;
@@ -12,8 +14,6 @@ import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
import cn.lili.modules.connect.entity.enums.AuthResponseStatus;
import cn.lili.modules.connect.exception.AuthException;
import cn.lili.modules.connect.util.AuthChecker;
import cn.lili.common.utils.HttpUtils;
import cn.lili.common.utils.UuidUtils;
import com.xkcoding.http.util.UrlUtil;
import lombok.extern.slf4j.Slf4j;

View File

@@ -2,15 +2,10 @@ package cn.lili.modules.distribution.serviceimpl;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.modules.wallet.entity.dto.MemberWalletUpdateDTO;
import cn.lili.modules.wallet.entity.enums.WithdrawStatusEnum;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.MemberTagsEnum;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.utils.CurrencyUtil;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.common.utils.SnowFlake;
import cn.lili.common.vo.PageVO;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.modules.distribution.entity.dos.Distribution;
import cn.lili.modules.distribution.entity.dos.DistributionCash;
import cn.lili.modules.distribution.entity.enums.DistributionStatusEnum;
@@ -18,13 +13,17 @@ import cn.lili.modules.distribution.entity.vos.DistributionCashSearchParams;
import cn.lili.modules.distribution.mapper.DistributionCashMapper;
import cn.lili.modules.distribution.service.DistributionCashService;
import cn.lili.modules.distribution.service.DistributionService;
import cn.lili.modules.wallet.entity.dto.MemberWalletUpdateDTO;
import cn.lili.modules.wallet.entity.dto.MemberWithdrawalMessage;
import cn.lili.modules.wallet.entity.enums.MemberWithdrawalDestinationEnum;
import cn.lili.modules.wallet.service.MemberWalletService;
import cn.lili.modules.wallet.entity.enums.DepositServiceTypeEnum;
import cn.lili.modules.wallet.entity.enums.MemberWithdrawalDestinationEnum;
import cn.lili.modules.wallet.entity.enums.WithdrawStatusEnum;
import cn.lili.modules.wallet.service.MemberWalletService;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.MemberTagsEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -136,6 +136,14 @@ public interface GoodsSkuService extends IService<GoodsSku> {
*/
IPage<GoodsSku> getGoodsSkuByPage(GoodsSearchParams searchParams);
/**
* 列表查询商品sku信息
*
* @param searchParams 查询参数
* @return 商品sku信息
*/
List<GoodsSku> getGoodsSkuByList(GoodsSearchParams searchParams);
/**
* 更新商品sku状态
*
@@ -186,4 +194,12 @@ public interface GoodsSkuService extends IService<GoodsSku> {
* @param skuId 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())) {
goodsVO.setGoodsParamsDTOList(JSONUtil.toList(goods.getParams(), GoodsParamsDTO.class));
}
cache.put(CachePrefix.GOODS.getPrefix() + goodsId, goodsVO);
return goodsVO;
}

View File

@@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.lili.cache.Cache;
import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
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.enums.EvaluationGradeEnum;
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.EsGoodsIndex;
import cn.lili.modules.search.service.EsGoodsIndexService;
@@ -253,10 +255,25 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
//商品规格
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());
}
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);
//获取分类
@@ -265,10 +282,10 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
//获取规格信息
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());
}
@@ -385,6 +402,17 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
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
public void updateStocks(List<GoodsSkuStockDTO> goodsSkuStockDTOS) {
for (GoodsSkuStockDTO goodsSkuStockDTO : goodsSkuStockDTOS) {
@@ -486,6 +514,22 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
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商品索引
*

View File

@@ -1,6 +1,5 @@
package cn.lili.modules.member.entity.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

View File

@@ -2,7 +2,6 @@ package cn.lili.modules.member.mapper;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.entity.vo.MemberDistributionVO;
import cn.lili.modules.member.entity.vo.MemberVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

View File

@@ -9,13 +9,13 @@ import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.entity.dto.ManagerMemberEditDTO;
import cn.lili.modules.member.entity.dto.MemberAddDTO;
import cn.lili.modules.member.entity.dto.MemberEditDTO;
import cn.lili.modules.member.entity.vo.MemberDistributionVO;
import cn.lili.modules.member.entity.vo.MemberSearchVO;
import cn.lili.modules.member.entity.vo.MemberVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
/**
* 会员业务层
@@ -205,6 +205,15 @@ public interface MemberService extends IService<Member> {
*/
Integer getMemberNum(MemberSearchVO memberSearchVO);
/**
* 获取指定会员数据
*
* @param columns 指定获取的列
* @param memberIds 会员ids
* @return 指定会员数据
*/
List<Map<String, Object>> listFieldsByMemberIds(String columns, List<String> memberIds);
/**
* 登出
*

View File

@@ -1,25 +1,18 @@
package cn.lili.modules.member.serviceimpl;
import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.modules.member.entity.dto.CollectionDTO;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.GoodsTagsEnum;
import cn.lili.common.security.context.UserContext;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.modules.member.entity.dos.GoodsCollection;
import cn.lili.modules.member.entity.vo.GoodsCollectionVO;
import cn.lili.modules.member.mapper.GoodsCollectionMapper;
import cn.lili.modules.member.service.GoodsCollectionService;
import cn.lili.mybatis.util.PageUtil;
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.service.impl.ServiceImpl;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

View File

@@ -1,18 +1,13 @@
package cn.lili.modules.member.serviceimpl;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.SwitchEnum;
import cn.lili.common.exception.ServiceException;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.GoodsTagsEnum;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.sensitive.SensitiveWordsFilter;
import cn.lili.common.utils.StringUtils;
import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.member.entity.dos.Member;
@@ -31,8 +26,9 @@ import cn.lili.modules.order.order.entity.dos.OrderItem;
import cn.lili.modules.order.order.entity.enums.CommentStatusEnum;
import cn.lili.modules.order.order.service.OrderItemService;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.common.sensitive.SensitiveWordsFilter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;

View File

@@ -14,20 +14,20 @@ import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.security.token.Token;
import cn.lili.common.sensitive.SensitiveWordsFilter;
import cn.lili.common.utils.BeanUtil;
import cn.lili.common.utils.CookieUtil;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.utils.UuidUtils;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.connect.config.ConnectAuthEnum;
import cn.lili.modules.connect.entity.Connect;
import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
import cn.lili.modules.connect.service.ConnectService;
import cn.lili.common.utils.UuidUtils;
import cn.lili.modules.member.aop.annotation.PointLogPoint;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.entity.dto.*;
import cn.lili.modules.member.entity.enums.PointTypeEnum;
import cn.lili.modules.member.entity.vo.MemberDistributionVO;
import cn.lili.modules.member.entity.vo.MemberSearchVO;
import cn.lili.modules.member.entity.vo.MemberVO;
import cn.lili.modules.member.mapper.MemberMapper;
@@ -37,7 +37,6 @@ import cn.lili.modules.member.token.StoreTokenGenerate;
import cn.lili.modules.store.entity.dos.Store;
import cn.lili.modules.store.entity.enums.StoreStatusEnum;
import cn.lili.modules.store.service.StoreService;
import cn.lili.common.sensitive.SensitiveWordsFilter;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.MemberTagsEnum;
@@ -54,6 +53,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
@@ -560,6 +560,20 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
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

@@ -3,14 +3,14 @@ package cn.lili.modules.member.serviceimpl;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.context.UserContext;
import cn.lili.modules.member.entity.dto.CollectionDTO;
import cn.lili.modules.store.service.StoreService;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.member.entity.dos.StoreCollection;
import cn.lili.modules.member.entity.dto.CollectionDTO;
import cn.lili.modules.member.entity.vo.StoreCollectionVO;
import cn.lili.modules.member.mapper.StoreCollectionMapper;
import cn.lili.modules.member.service.StoreCollectionService;
import cn.lili.modules.store.service.StoreService;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;

View File

@@ -1,9 +1,9 @@
package cn.lili.modules.member.serviceimpl;
import cn.lili.modules.store.entity.dos.StoreLogistics;
import cn.lili.modules.system.entity.vo.StoreLogisticsVO;
import cn.lili.modules.member.mapper.StoreLogisticsMapper;
import cn.lili.modules.member.service.StoreLogisticsService;
import cn.lili.modules.store.entity.dos.StoreLogistics;
import cn.lili.modules.system.entity.vo.StoreLogisticsVO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

View File

@@ -1,7 +1,7 @@
package cn.lili.modules.message.service;
import com.baomidou.mybatisplus.extension.service.IService;
import cn.lili.modules.message.entity.dos.ShortLink;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;

View File

@@ -5,8 +5,8 @@ import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.utils.SpelUtil;
import cn.lili.common.utils.ThreadPoolUtil;
import cn.lili.modules.order.aftersale.service.AfterSaleLogService;
import cn.lili.modules.order.aftersale.entity.dos.AfterSaleLog;
import cn.lili.modules.order.aftersale.service.AfterSaleLogService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;

View File

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

View File

@@ -1,13 +1,11 @@
package cn.lili.modules.order.aftersale.service;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
import cn.lili.modules.order.aftersale.entity.dto.AfterSaleDTO;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleApplyVO;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleSearchParams;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleVO;
import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam;
import cn.lili.modules.store.entity.dto.StoreAfterSaleAddressDTO;
import cn.lili.modules.system.entity.vo.Traces;
import com.baomidou.mybatisplus.core.metadata.IPage;

View File

@@ -1,8 +1,8 @@
package cn.lili.modules.order.aftersale.serviceimpl;
import cn.lili.modules.order.aftersale.service.AfterSaleLogService;
import cn.lili.modules.order.aftersale.entity.dos.AfterSaleLog;
import cn.lili.modules.order.aftersale.mapper.AfterSaleLogMapper;
import cn.lili.modules.order.aftersale.service.AfterSaleLogService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

View File

@@ -5,6 +5,8 @@ import cn.lili.modules.promotion.entity.dos.FullDiscount;
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.springframework.beans.BeanUtils;
import java.util.List;
@@ -16,13 +18,16 @@ import java.util.List;
*/
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
public class FullDiscountVO extends FullDiscount {
private static final long serialVersionUID = -2330552735874105354L;
/**
* 促销关联的商品
*/
private List<PromotionGoods> promotionGoodsList;
/**
* 赠品信息
*/
@@ -33,6 +38,10 @@ public class FullDiscountVO extends FullDiscount {
*/
private Integer number;
public FullDiscountVO(FullDiscount fullDiscount) {
BeanUtils.copyProperties(fullDiscount, this);
}
public String notice() {
StringBuilder stringBuffer = new StringBuilder();
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) {
//循环购物车中的商品
for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) {
//如果失效确认sku为未选中状态
if (cartSkuVO.getInvalid()) {
if (Boolean.TRUE.equals(cartSkuVO.getInvalid())) {
//设置购物车未选中
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();
if (pintuanId.isPresent()) {
Pintuan pintuan = pintuanService.getPintuanById(pintuanId.get());
Pintuan pintuan = pintuanService.getById(pintuanId.get());
Integer limitNum = pintuan.getLimitNum();
for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) {
if (limitNum != 0 && cartSkuVO.getNum() > limitNum) {
@@ -184,7 +184,7 @@ public class CheckDataRender implements CartRenderStep {
} else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.POINTS)) {
String skuId = tradeDTO.getSkuList().get(0).getGoodsSku().getId();
//获取积分商品VO
PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsVOByMongo(skuId);
PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsDetailBySkuId(skuId);
if (pointsGoodsVO == null) {
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.render.CartRenderStep;
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.service.KanjiaActivityGoodsService;
import cn.lili.modules.promotion.service.PointsGoodsService;
@@ -79,13 +79,13 @@ public class CommissionRender implements CartRenderStep {
//如果积分订单 积分订单,单独操作订单结算金额和商家结算字段
if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.POINTS)) {
PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsVOByMongo(cartSkuVO.getGoodsSku().getId());
PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsDetailBySkuId(cartSkuVO.getGoodsSku().getId());
priceDetailDTO.setSettlementPrice(pointsGoodsVO.getSettlementPrice());
}
//如果砍价订单 计算金额,单独操作订单结算金额和商家结算字段
else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.KANJIA)) {
KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO = kanjiaActivityGoodsService.getKanJiaGoodsBySku(cartSkuVO.getGoodsSku().getId());
priceDetailDTO.setSettlementPrice(kanjiaActivityGoodsDTO.getSettlementPrice());
KanjiaActivityGoods kanjiaActivityGoods = kanjiaActivityGoodsService.getKanjiaGoodsBySkuId(cartSkuVO.getGoodsSku().getId());
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.order.entity.dto.PriceDetailDTO;
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.PromotionsScopeTypeEnum;
import cn.lili.modules.promotion.entity.vos.MemberCouponVO;
import cn.lili.modules.promotion.service.MemberCouponService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -147,7 +147,7 @@ public class CouponRender implements CartRenderStep {
return Collections.emptyList();
}
//优惠券类型判定
switch (CouponScopeTypeEnum.valueOf(memberCoupon.getScopeType())) {
switch (PromotionsScopeTypeEnum.valueOf(memberCoupon.getScopeType())) {
case ALL:
return filterSku;
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.order.entity.dto.PriceDetailDTO;
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import cn.lili.modules.promotion.service.FullDiscountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -55,30 +56,30 @@ public class FullDiscountRender implements CartRenderStep {
List<String> storeIds = tradeDTO.getCartList().stream().map(CartVO::getStoreId).collect(Collectors.toList());
//获取当前店铺进行到满减活动
List<FullDiscountVO> fullDiscounts = fullDiscountService.currentPromotion(storeIds);
if (fullDiscounts == null || fullDiscounts.size() == 0) {
if (fullDiscounts == null || fullDiscounts.isEmpty()) {
return;
}
//循环满减信息
for (FullDiscountVO fullDiscount : fullDiscounts) {
//判定参与活动的商品 全品类参与或者部分商品参与,则进行云散
if (fullDiscount.getNumber() == -1 || fullDiscount.getPromotionGoodsList() != null) {
//循环店铺购物车
for (CartVO cart : cartList) {
//如果购物车中的店铺id与活动店铺id相等则进行促销计算
if (fullDiscount.getStoreId().equals(cart.getStoreId())) {
//循环店铺购物车
for (CartVO cart : cartList) {
//如果购物车中的店铺id与活动店铺id相等则进行促销计算
if (fullDiscount.getStoreId().equals(cart.getStoreId())) {
//如果有赠品,则将赠品信息写入
if (fullDiscount.getIsGift()) {
GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(fullDiscount.getGiftId());
fullDiscount.setGiftSku(goodsSku);
}
//如果有赠品,则将赠品信息写入
if (Boolean.TRUE.equals(fullDiscount.getIsGift())) {
GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(fullDiscount.getGiftId());
fullDiscount.setGiftSku(goodsSku);
}
//写入满减活动
cart.setFullDiscount(fullDiscount);
Map<String, Double> skuPriceDetail;
//参与活动的sku判定
skuPriceDetail = initFullDiscountGoods(fullDiscount, cart.getCheckedSkuList());
//写入满减活动
cart.setFullDiscount(fullDiscount);
Map<String, Double> skuPriceDetail;
//参与活动的sku判定
skuPriceDetail = initFullDiscountGoods(fullDiscount, cart.getCheckedSkuList());
if (!skuPriceDetail.isEmpty()) {
//记录参与满减活动的sku
cart.setFullDiscountSkuIds(new ArrayList<>(skuPriceDetail.keySet()));
@@ -87,11 +88,11 @@ public class FullDiscountRender implements CartRenderStep {
if (isFull(countPrice, cart)) {
//如果减现金
if (fullDiscount.getIsFullMinus()) {
if (Boolean.TRUE.equals(fullDiscount.getIsFullMinus())) {
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));
}
//渲染满优惠
@@ -100,6 +101,7 @@ public class FullDiscountRender implements CartRenderStep {
}
}
}
}
@@ -145,19 +147,17 @@ public class FullDiscountRender implements CartRenderStep {
Map<String, Double> skuPriceDetail = new HashMap<>(16);
//全品类参与
if (fullDiscount.getNumber() == -1) {
if (PromotionsScopeTypeEnum.ALL.name().equals(fullDiscount.getScopeType())) {
for (CartSkuVO cartSkuVO : cartSkuVOS) {
skuPriceDetail.put(cartSkuVO.getGoodsSku().getId(), cartSkuVO.getPriceDetailDTO().getGoodsPrice());
}
} else {
//判定参与活动的商品
for (PromotionGoods promotionGoods : fullDiscount.getPromotionGoodsList()) {
//sku 集合判定
for (CartSkuVO cartSkuVO : cartSkuVOS) {
// 如果参加满减,并且购物车选中状态 则记录商品sku
if (cartSkuVO.getChecked() && cartSkuVO.getGoodsSku().getId().equals(promotionGoods.getSkuId())) {
skuPriceDetail.put(cartSkuVO.getGoodsSku().getId(), cartSkuVO.getPriceDetailDTO().getGoodsPrice());
}
List<String> collect = fullDiscount.getPromotionGoodsList().stream().map(PromotionGoods::getSkuId).collect(Collectors.toList());
//sku 集合判定
for (CartSkuVO cartSkuVO : cartSkuVOS) {
// 如果参加满减,并且购物车选中状态 则记录商品sku
if (Boolean.TRUE.equals(cartSkuVO.getChecked()) && collect.contains(cartSkuVO.getGoodsSku().getId())) {
skuPriceDetail.put(cartSkuVO.getGoodsSku().getId(), cartSkuVO.getPriceDetailDTO().getGoodsPrice());
}
}
}
@@ -173,17 +173,17 @@ public class FullDiscountRender implements CartRenderStep {
//获取参与活动的商品总价
FullDiscountVO fullDiscount = cartVO.getFullDiscount();
if (fullDiscount.getIsCoupon()) {
if (Boolean.TRUE.equals(fullDiscount.getIsCoupon())) {
cartVO.getGiftCouponList().add(fullDiscount.getCouponId());
}
if (fullDiscount.getIsGift()) {
if (Boolean.TRUE.equals(fullDiscount.getIsGift())) {
cartVO.setGiftList(Arrays.asList(fullDiscount.getGiftId().split(",")));
}
if (fullDiscount.getIsPoint()) {
if (Boolean.TRUE.equals(fullDiscount.getIsPoint())) {
cartVO.setGiftPoint(fullDiscount.getPoint());
}
//如果满足判定是否免邮免邮的话需要渲染一边sku
if (fullDiscount.getIsFreeFreight()) {
if (Boolean.TRUE.equals(fullDiscount.getIsFreeFreight())) {
for (CartSkuVO skuVO : cartVO.getCheckedSkuList()) {
skuVO.setIsFreeFreight(true);
}
@@ -214,7 +214,7 @@ public class FullDiscountRender implements CartRenderStep {
* @return 总价
*/
private Double countPrice(Map<String, Double> skuPriceMap) {
Double count = 0d;
double count = 0d;
for (Double price : skuPriceMap.values()) {
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.order.entity.dos.Trade;
import cn.lili.modules.order.order.entity.vo.ReceiptVO;
import cn.lili.modules.promotion.entity.dos.KanjiaActivity;
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.dos.*;
import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum;
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.kanjia.KanjiaActivitySearchParams;
import cn.lili.modules.promotion.service.*;
@@ -123,6 +119,11 @@ public class CartServiceImpl implements CartService {
}
CartTypeEnum cartTypeEnum = getCartType(cartType);
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 {
//购物车方式购买需要保存之前的选择,其他方式购买,则直接抹除掉之前的记录
TradeDTO tradeDTO;
@@ -633,15 +634,15 @@ public class CartServiceImpl implements CartService {
}
//当初购物车商品中是否存在符合优惠券条件的商品sku
if (memberCoupon.getScopeType().equals(CouponScopeTypeEnum.ALL.name())) {
if (memberCoupon.getScopeType().equals(PromotionsScopeTypeEnum.ALL.name())) {
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());
} else if (memberCoupon.getScopeType().equals(CouponScopeTypeEnum.PORTION_GOODS.name())) {
} else if (memberCoupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS.name())) {
//范围关联ID是否包含
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());
}
@@ -697,7 +698,7 @@ public class CartServiceImpl implements CartService {
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();
if (limitNum != 0 && cartSkuVO.getNum() > limitNum) {
throw new ServiceException(ResultCode.CART_PINTUAN_LIMIT_ERROR);
@@ -712,7 +713,7 @@ public class CartServiceImpl implements CartService {
private void checkKanjia(CartSkuVO cartSkuVO) {
//根据skuId获取砍价商品
KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO = kanjiaActivityGoodsService.getKanjiaGoodsBySkuId(cartSkuVO.getGoodsSku().getId());
KanjiaActivityGoods kanjiaActivityGoodsDTO = kanjiaActivityGoodsService.getKanjiaGoodsBySkuId(cartSkuVO.getGoodsSku().getId());
//查找当前会员的砍价商品活动
KanjiaActivitySearchParams kanjiaActivitySearchParams = new KanjiaActivitySearchParams();
@@ -743,7 +744,7 @@ public class CartServiceImpl implements CartService {
*/
private void checkPoint(CartSkuVO cartSkuVO) {
PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsVOByMongo(cartSkuVO.getGoodsSku().getId());
PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsDetailBySkuId(cartSkuVO.getGoodsSku().getId());
if (pointsGoodsVO != null) {

View File

@@ -6,10 +6,7 @@ import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.utils.DateUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.order.order.entity.enums.CommentStatusEnum;
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 cn.lili.modules.order.order.entity.enums.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
@@ -104,6 +101,18 @@ public class OrderSearchParams extends PageVO {
@ApiModelProperty(value = "评论状态:未评论(UNFINISHED),待追评(WAIT_CHASE),评论完成(FINISHED)")
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() {
AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
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);
return wrapper;

View File

@@ -1,8 +1,8 @@
package cn.lili.modules.order.order.entity.vo;
import cn.hutool.core.util.StrUtil;
import cn.lili.modules.order.order.entity.dos.OrderComplaint;
import cn.lili.modules.order.aftersale.entity.enums.ComplaintStatusEnum;
import cn.lili.modules.order.order.entity.dos.OrderComplaint;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

View File

@@ -74,4 +74,15 @@ 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} ")
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);
}

View File

@@ -51,6 +51,46 @@ public interface OrderService extends IService<Order> {
*/
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

@@ -4,6 +4,7 @@ import cn.hutool.core.util.StrUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.OperationalJudgment;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.utils.BeanUtil;
@@ -11,11 +12,11 @@ import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.order.aftersale.entity.enums.ComplaintStatusEnum;
import cn.lili.modules.order.order.entity.dos.OrderComplaint;
import cn.lili.modules.order.order.entity.dos.OrderComplaintCommunication;
import cn.lili.modules.order.order.entity.dos.OrderItem;
import cn.lili.modules.order.order.entity.dto.OrderComplaintDTO;
import cn.lili.modules.order.aftersale.entity.enums.ComplaintStatusEnum;
import cn.lili.modules.order.order.entity.enums.OrderComplaintStatusEnum;
import cn.lili.modules.order.order.entity.vo.*;
import cn.lili.modules.order.order.mapper.OrderComplaintMapper;
@@ -23,7 +24,6 @@ import cn.lili.modules.order.order.service.OrderComplaintCommunicationService;
import cn.lili.modules.order.order.service.OrderComplaintService;
import cn.lili.modules.order.order.service.OrderItemService;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.common.security.OperationalJudgment;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

View File

@@ -3,6 +3,7 @@ package cn.lili.modules.order.order.serviceimpl;
import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.OperationalJudgment;
import cn.lili.common.utils.CurrencyUtil;
import cn.lili.modules.order.order.aop.OrderLogPoint;
import cn.lili.modules.order.order.entity.dos.Order;
@@ -15,7 +16,6 @@ import cn.lili.modules.order.order.service.OrderPriceService;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.payment.kit.plugin.bank.BankTransferPlugin;
import cn.lili.modules.system.aspect.annotation.SystemLogPoint;
import cn.lili.common.security.OperationalJudgment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

View File

@@ -8,13 +8,14 @@ import cn.hutool.json.JSONUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
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.security.OperationalJudgment;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.goods.entity.dto.GoodsCompleteMessage;
import cn.lili.modules.member.entity.dto.MemberAddressDTO;
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
@@ -40,13 +41,10 @@ import cn.lili.modules.order.trade.service.OrderLogService;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import cn.lili.modules.promotion.entity.dos.Pintuan;
import cn.lili.modules.promotion.service.PintuanService;
import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam;
import cn.lili.modules.statistics.util.StatisticsDateUtil;
import cn.lili.modules.system.aspect.annotation.SystemLogPoint;
import cn.lili.modules.system.entity.dos.Logistics;
import cn.lili.modules.system.entity.vo.Traces;
import cn.lili.modules.system.service.LogisticsService;
import cn.lili.common.security.OperationalJudgment;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.GoodsTagsEnum;
@@ -195,6 +193,70 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
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
public List<OrderExportDTO> queryExportOrder(OrderSearchParams orderSearchParams) {
return this.baseMapper.queryExportOrder(orderSearchParams.queryWrapper());
@@ -502,7 +564,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
@Override
public void agglomeratePintuanOrder(String pintuanId, String parentOrderSn) {
//获取拼团配置
Pintuan pintuan = pintuanService.getPintuanById(pintuanId);
Pintuan pintuan = pintuanService.getById(pintuanId);
List<Order> list = this.getPintuanOrder(pintuanId, parentOrderSn);
if (Boolean.TRUE.equals(pintuan.getFictitious()) && pintuan.getRequiredNum() > list.size()) {
//如果开启虚拟成团且当前订单数量不足成团数量,则认为拼团成功
@@ -659,7 +721,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
return;
}
//获取拼团配置
Pintuan pintuan = pintuanService.getPintuanById(pintuanId);
Pintuan pintuan = pintuanService.getById(pintuanId);
List<Order> list = this.getPintuanOrder(pintuanId, parentOrderSn);
int count = list.size();
if (count == 1) {
@@ -726,7 +788,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
private void pintuanOrderFailed(List<Order> list) {
for (Order order : list) {
try {
this.cancel(order.getSn(), "拼团人数不足,拼团失败!");
this.systemCancel(order.getSn(), "拼团人数不足,拼团失败!");
} catch (Exception e) {
log.error("拼团订单取消失败", e);
}
@@ -758,7 +820,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
private void checkOrder(Order order) {
//订单类型为拼团订单,检测购买数量是否超过了限购数量
if (OrderPromotionTypeEnum.PINTUAN.name().equals(order.getOrderType())) {
Pintuan pintuan = pintuanService.getPintuanById(order.getPromotionId());
Pintuan pintuan = pintuanService.getById(order.getPromotionId());
Integer limitNum = pintuan.getLimitNum();
if (limitNum != 0 && order.getGoodsNum() > limitNum) {
throw new ServiceException(ResultCode.PINTUAN_LIMIT_NUM_ERROR);

View File

@@ -1,16 +1,15 @@
package cn.lili.modules.payment.kit;
import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.utils.SpringContextUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.modules.wallet.service.MemberWalletService;
import cn.lili.modules.payment.kit.dto.PayParam;
import cn.lili.modules.payment.entity.enums.PaymentClientEnum;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import cn.lili.modules.payment.kit.dto.PayParam;
import cn.lili.modules.payment.kit.params.CashierExecute;
import cn.lili.modules.payment.kit.params.dto.CashierParam;
import cn.lili.modules.system.entity.dos.Setting;
@@ -19,6 +18,7 @@ import cn.lili.modules.system.entity.dto.payment.PaymentSupportSetting;
import cn.lili.modules.system.entity.dto.payment.dto.PaymentSupportItem;
import cn.lili.modules.system.entity.enums.SettingEnum;
import cn.lili.modules.system.service.SettingService;
import cn.lili.modules.wallet.service.MemberWalletService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

View File

@@ -4,16 +4,16 @@ import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
import cn.lili.modules.wallet.entity.dos.Recharge;
import cn.lili.modules.wallet.service.RechargeService;
import cn.lili.modules.payment.entity.enums.CashierEnum;
import cn.lili.modules.payment.kit.dto.PayParam;
import cn.lili.modules.payment.kit.dto.PaymentSuccessParams;
import cn.lili.modules.payment.entity.enums.CashierEnum;
import cn.lili.modules.payment.kit.params.CashierExecute;
import cn.lili.modules.payment.kit.params.dto.CashierParam;
import cn.lili.modules.system.entity.dto.BaseSetting;
import cn.lili.modules.system.entity.enums.SettingEnum;
import cn.lili.modules.system.service.SettingService;
import cn.lili.modules.wallet.entity.dos.Recharge;
import cn.lili.modules.wallet.service.RechargeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

View File

@@ -5,19 +5,19 @@ import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.wallet.entity.dto.MemberWalletUpdateDTO;
import cn.lili.modules.wallet.service.MemberWalletService;
import cn.lili.modules.wallet.entity.enums.DepositServiceTypeEnum;
import cn.lili.modules.payment.entity.RefundLog;
import cn.lili.modules.payment.entity.enums.CashierEnum;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import cn.lili.modules.payment.kit.CashierSupport;
import cn.lili.modules.payment.kit.Payment;
import cn.lili.modules.payment.kit.dto.PayParam;
import cn.lili.modules.payment.kit.dto.PaymentSuccessParams;
import cn.lili.modules.payment.entity.enums.CashierEnum;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import cn.lili.modules.payment.kit.params.dto.CashierParam;
import cn.lili.modules.payment.service.PaymentService;
import cn.lili.modules.payment.service.RefundLogService;
import cn.lili.modules.wallet.entity.dto.MemberWalletUpdateDTO;
import cn.lili.modules.wallet.entity.enums.DepositServiceTypeEnum;
import cn.lili.modules.wallet.service.MemberWalletService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

View File

@@ -7,22 +7,23 @@ import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.lili.cache.Cache;
import cn.lili.cache.CachePrefix;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.properties.ApiProperties;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.utils.CurrencyUtil;
import cn.lili.common.utils.SnowFlake;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.ResultMessage;
import cn.lili.common.properties.ApiProperties;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.modules.connect.entity.Connect;
import cn.lili.modules.connect.entity.enums.ConnectEnum;
import cn.lili.modules.connect.service.ConnectService;
import cn.lili.modules.member.entity.dto.ConnectQueryDTO;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.payment.entity.RefundLog;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import cn.lili.modules.payment.kit.CashierSupport;
import cn.lili.modules.payment.kit.Payment;
import cn.lili.modules.payment.kit.core.PaymentHttpResponse;
@@ -32,7 +33,6 @@ import cn.lili.modules.payment.kit.core.kit.*;
import cn.lili.modules.payment.kit.core.utils.DateTimeZoneUtil;
import cn.lili.modules.payment.kit.dto.PayParam;
import cn.lili.modules.payment.kit.dto.PaymentSuccessParams;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import cn.lili.modules.payment.kit.params.dto.CashierParam;
import cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApiEnum;
import cn.lili.modules.payment.kit.plugin.wechat.enums.WechatDomain;

View File

@@ -1,10 +1,17 @@
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 io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
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
* @since 2020-03-19 10:44 上午
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("li_coupon")
@ApiModel(value = "优惠券实体类")
public class Coupon extends BasePromotion {
@ToString(callSuper = true)
@NoArgsConstructor
public class Coupon extends BasePromotions {
private static final long serialVersionUID = 8372820376262437018L;
@ApiModelProperty(value = "优惠券名称")
private String couponName;
@@ -33,21 +41,12 @@ public class Coupon extends BasePromotion {
@ApiModelProperty(value = "优惠券类型")
private String couponType;
/**
* @see cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum
*/
@ApiModelProperty(value = "关联范围类型")
private String scopeType;
@ApiModelProperty(value = "面额")
private Double price;
@ApiModelProperty(value = "折扣")
private Double couponDiscount;
@ApiModelProperty(value = "范围关联的id")
private String scopeId;
/**
* @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
*
*/
@ApiModelProperty(value = "时间范围类型")
private String rangeDayType;
@@ -85,4 +83,21 @@ public class Coupon extends BasePromotion {
@ApiModelProperty(value = "有效期")
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;
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.CouponActivityTypeEnum;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotNull;
@@ -16,10 +17,11 @@ import javax.validation.constraints.NotNull;
* @author Bulbasaur
* @since 2020-03-19 10:44 上午
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("li_coupon_activity")
@ApiModel(value = "优惠券活动实体类")
public class CouponActivity extends BasePromotion {
public class CouponActivity extends BasePromotions {
/**
* @see CouponActivityTypeEnum

View File

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

View File

@@ -1,6 +1,6 @@
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 io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -21,7 +21,7 @@ import javax.validation.constraints.NotNull;
@Data
@TableName("li_full_discount")
@ApiModel(value = "满优惠活动")
public class FullDiscount extends BasePromotion {
public class FullDiscount extends BasePromotions {
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.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 砍价活动参与实体类
*
* @author qiuqiu
* @date 2020-7-1 10:44 上午
* @since 2020-7-1 10:44 上午
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("li_kanjia_activity")
@ApiModel(value = "砍价活动参与对象")

View File

@@ -1,10 +1,11 @@
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 io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotEmpty;
@@ -14,10 +15,11 @@ import javax.validation.constraints.NotEmpty;
* @author qiuqiu
* @date 2020-7-1 10:44 上午
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("li_kanjia_activity_goods")
@ApiModel(value = "砍价活动商品对象")
public class KanjiaActivityGoods extends BasePromotion {
public class KanjiaActivityGoods extends BasePromotions {
private static final long serialVersionUID = 6694714877345423488L;
@@ -34,6 +36,10 @@ public class KanjiaActivityGoods extends BasePromotion {
@ApiModelProperty(value = "货品id")
@NotEmpty(message = "货品id不能为空")
private String goodsId;
@ApiModelProperty(value = "货品SkuId")
@NotEmpty(message = "货品SkuId不能为空")
private String skuId;
@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.DateTime;
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.MemberCouponStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import cn.lili.mybatis.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
@@ -20,6 +22,7 @@ import java.util.Date;
* @author Chopper
* @since 2020-03-19 10:44 上午
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("li_member_coupon")
@ApiModel(value = "会员优惠券")
@@ -52,7 +55,7 @@ public class MemberCoupon extends BaseEntity {
private String memberId;
/**
* @see cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum
* @see PromotionsScopeTypeEnum
*/
@ApiModelProperty(value = "关联范围类型")
private String scopeType;

View File

@@ -1,6 +1,6 @@
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 io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -19,7 +19,7 @@ import javax.validation.constraints.NotNull;
@Data
@TableName("li_pintuan")
@ApiModel(value = "拼团")
public class Pintuan extends BasePromotion {
public class Pintuan extends BasePromotions {
private static final long serialVersionUID = -8465716592648602604L;

View File

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

View File

@@ -2,14 +2,16 @@ package cn.lili.modules.promotion.entity.dos;
import cn.hutool.core.bean.BeanUtil;
import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.mybatis.BaseEntity;
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.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.util.Date;
@@ -20,6 +22,7 @@ import java.util.Date;
* @author Chopper
* @since 2020-03-19 10:44 上午
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("li_promotion_goods")
@ApiModel(value = "促销商品")
@@ -34,10 +37,13 @@ public class PromotionGoods extends BaseEntity {
@ApiModelProperty(value = "商家名称")
private String storeName;
@ApiModelProperty(value = "品id")
@ApiModelProperty(value = "品id")
private String goodsId;
@ApiModelProperty(value = "商品SkuId")
private String skuId;
@ApiModelProperty(value = "品名称")
@ApiModelProperty(value = "品名称")
private String goodsName;
@ApiModelProperty(value = "缩略图")
@@ -72,31 +78,56 @@ public class PromotionGoods extends BaseEntity {
@ApiModelProperty(value = "卖出的商品数量")
private Integer num;
@ApiModelProperty(value = "原价")
private Double originalPrice;
@ApiModelProperty(value = "促销价格")
private Double price;
@ApiModelProperty(value = "兑换积分")
private Long points;
@ApiModelProperty(value = "限购数量")
private Integer limitNum;
@ApiModelProperty(value = "促销库存")
private Integer quantity;
/**
* @see PromotionStatusEnum
*/
@ApiModelProperty(value = "状态")
private String promotionStatus;
@ApiModelProperty(value = "分类path")
private String categoryPath;
/**
* @see PromotionsScopeTypeEnum
*/
@ApiModelProperty(value = "关联范围类型")
private String scopeType = PromotionsScopeTypeEnum.PORTION_GOODS.name();
@ApiModelProperty(value = "范围关联的id")
private String scopeId;
public PromotionGoods(GoodsSku sku) {
if (sku != null) {
String oldId = this.getId();
BeanUtil.copyProperties(sku, this);
this.setSkuId(sku.getId());
this.setId(oldId);
BeanUtil.copyProperties(sku, this, "id", "price");
this.skuId = sku.getId();
this.originalPrice = sku.getPrice();
}
}
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.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.lili.modules.promotion.entity.dto.BasePromotion;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import cn.lili.modules.promotion.entity.dto.BasePromotions;
import cn.lili.modules.promotion.entity.vos.SeckillVO;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
@@ -12,6 +12,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.springframework.beans.BeanUtils;
import javax.validation.constraints.NotNull;
import java.util.Date;
@@ -27,7 +28,7 @@ import java.util.Date;
@TableName("li_seckill")
@ApiModel(value = "秒杀活动活动")
@NoArgsConstructor
public class Seckill extends BasePromotion {
public class Seckill extends BasePromotions {
private static final long serialVersionUID = -9116425737163730836L;
@@ -52,21 +53,22 @@ public class Seckill extends BasePromotion {
@ApiModelProperty(value = "商品数量")
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));
this.applyEndTime=dateTime;
this.hours=hours;
this.seckillRule=seckillRule;
this.goodsNum=0;
DateTime dateTime = DateUtil.beginOfDay(DateUtil.offset(new DateTime(), DateField.DAY_OF_YEAR, day));
this.applyEndTime = dateTime;
this.hours = hours;
this.seckillRule = seckillRule;
this.goodsNum = 0;
//BasePromotion
setStoreName("platform");
setStoreId("platform");
setPromotionName(DateUtil.formatDate(dateTime)+" 秒杀活动");
setStartTime(dateTime);
setEndTime(DateUtil.endOfDay(dateTime));
setPromotionStatus(PromotionStatusEnum.NEW.name());
this.setStoreName("platform");
this.setStoreId("platform");
this.setPromotionName(DateUtil.formatDate(dateTime) + " 秒杀活动");
this.setStartTime(dateTime);
this.setEndTime(DateUtil.endOfDay(dateTime));
}
public Seckill(SeckillVO seckillVO) {
BeanUtils.copyProperties(seckillVO, this);
}
}

View File

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

View File

@@ -1,6 +1,7 @@
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 com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
@@ -18,7 +19,7 @@ import java.util.Date;
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class BasePromotion extends BaseEntity {
public class BasePromotions extends BaseEntity {
private static final long serialVersionUID = 7814832369110695758L;
@@ -41,8 +42,32 @@ public class BasePromotion extends BaseEntity {
private Date endTime;
/**
* @see PromotionStatusEnum
* @see PromotionsScopeTypeEnum
*/
@ApiModelProperty(value = "活动状态")
private String promotionStatus;
@ApiModelProperty(value = "关联范围类型")
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 io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@@ -13,6 +14,7 @@ import java.util.List;
* @author Bulbasaur
* @since 2021/5/21 7:16 下午
*/
@EqualsAndHashCode(callSuper = true)
@Data
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 io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
@@ -12,8 +13,9 @@ import java.io.Serializable;
* 砍价活动商品DTO
*
* @author qiuqiu
* @date 2020/8/21
* @since 2020/8/21
**/
@EqualsAndHashCode(callSuper = true)
@Data
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 io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@@ -13,15 +14,13 @@ import lombok.NoArgsConstructor;
* @author paulG
* @since 2020/10/9
**/
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
public class PromotionGoodsDTO extends PromotionGoods {
private static final long serialVersionUID = 9206970681612883421L;
@ApiModelProperty(value = "原价")
private Double originPrice;
@ApiModelProperty(value = "商品id")
private String goodsId;

View File

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

View File

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

View File

@@ -6,7 +6,7 @@ package cn.lili.modules.promotion.entity.enums;
* @author Chopper
* @since 2020-03-19 3:53 下午
*/
public enum PromotionStatusEnum {
public enum PromotionsStatusEnum {
/**
* 新建
@@ -27,7 +27,7 @@ public enum PromotionStatusEnum {
private final String description;
PromotionStatusEnum(String str) {
PromotionsStatusEnum(String 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 io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 优惠券活动的优惠券VO
@@ -10,6 +11,7 @@ import lombok.Data;
* @author Bulbasaur
* @since 2021/6/18 11:00 上午
*/
@EqualsAndHashCode(callSuper = true)
@Data
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 io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.util.List;
@@ -14,6 +15,7 @@ import java.util.List;
* @author Bulbasaur
* @since 2021/5/21 7:01 下午
*/
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
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.lili.modules.promotion.entity.enums.*;
import cn.lili.modules.promotion.tools.PromotionTools;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.regex.Pattern;
/**
* 优惠券查询通用类
@@ -19,11 +18,14 @@ import java.util.regex.Pattern;
* @author paulG
* @since 2020/8/14
**/
@EqualsAndHashCode(callSuper = true)
@Data
public class CouponSearchParams implements Serializable {
public class CouponSearchParams extends BasePromotionsSearchParams implements Serializable {
private static final long serialVersionUID = 4566880169478260409L;
private static final String PRICE_COLUMN = "price";
private static final String RANGE_DAY_TYPE_COLUMN = "range_day_type";
@ApiModelProperty(value = "店铺编号")
private String storeId;
@@ -41,7 +43,7 @@ public class CouponSearchParams implements Serializable {
@ApiModelProperty(value = "活动类型")
private String couponType;
/**
* @see cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum
* @see PromotionsScopeTypeEnum
*/
@ApiModelProperty(value = "关联范围类型")
private String scopeType;
@@ -58,27 +60,17 @@ public class CouponSearchParams implements Serializable {
*/
@ApiModelProperty(value = "优惠券类型,分为免费领取和活动赠送")
private String getType;
@ApiModelProperty(value = "活动开始时间")
private Long startTime;
@ApiModelProperty(value = "活动结束时间")
private Long endTime;
/**
* @see MemberCouponStatusEnum
*/
@ApiModelProperty(value = "会员优惠券状态")
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<>();
if (storeId != null) {
queryWrapper.in("store_id", Arrays.asList(storeId));
queryWrapper.in("store_id", Collections.singletonList(storeId));
}
if (CharSequenceUtil.isNotEmpty(couponName)) {
queryWrapper.like("coupon_name", couponName);
@@ -90,7 +82,7 @@ public class CouponSearchParams implements Serializable {
queryWrapper.eq("coupon_type", CouponTypeEnum.valueOf(couponType).name());
}
if (CharSequenceUtil.isNotEmpty(scopeType)) {
queryWrapper.eq("scope_type", CouponScopeTypeEnum.valueOf(scopeType).name());
queryWrapper.eq("scope_type", PromotionsScopeTypeEnum.valueOf(scopeType).name());
}
if (CharSequenceUtil.isNotEmpty(scopeId)) {
queryWrapper.eq("scope_id", scopeId);
@@ -98,20 +90,38 @@ public class CouponSearchParams implements Serializable {
if (CharSequenceUtil.isNotEmpty(getType)) {
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)) {
queryWrapper.eq("member_coupon_status", MemberCouponStatusEnum.valueOf(memberCouponStatus).name());
}
if (CharSequenceUtil.isNotEmpty(promotionStatus)) {
queryWrapper.eq("promotion_status", PromotionStatusEnum.valueOf(promotionStatus).name());
if (CharSequenceUtil.isNotEmpty(this.getPromotionStatus())) {
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);
this.betweenWrapper(queryWrapper);
queryWrapper.orderByDesc("create_time");
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.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.beans.BeanUtils;
import java.util.List;
@@ -14,8 +18,11 @@ import java.util.List;
* @author Chopper
* @since 2020/8/14
*/
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(value = "优惠券")
@ToString(callSuper = true)
@NoArgsConstructor
public class CouponVO extends Coupon {
private static final long serialVersionUID = 8372420376262437018L;
@@ -26,5 +33,10 @@ public class CouponVO extends Coupon {
@ApiModelProperty(value = "优惠券关联商品集合")
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;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
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.util.Arrays;
import java.util.Date;
import java.util.regex.Pattern;
/**
* 满优惠查询通用类
@@ -20,8 +15,9 @@ import java.util.regex.Pattern;
* @author paulG
* @since 2020/8/21
**/
@EqualsAndHashCode(callSuper = true)
@Data
public class FullDiscountSearchParams implements Serializable {
public class FullDiscountSearchParams extends BasePromotionsSearchParams implements Serializable {
private static final long serialVersionUID = -4052716630253333681L;
@@ -32,59 +28,28 @@ public class FullDiscountSearchParams implements Serializable {
@ApiModelProperty(value = "店铺编号 如有多个','分割")
private String storeId;
@ApiModelProperty(value = "活动开始时间", required = true)
private Long startTime;
@ApiModelProperty(value = "是否赠优惠券")
private Boolean isCoupon;
@ApiModelProperty(value = "活动结束时间", required = true)
private Long endTime;
@ApiModelProperty(value = "优惠券id")
private String couponId;
/**
* @see PromotionStatusEnum
*/
@ApiModelProperty(value = "活动状态")
private String promotionStatus;
public <T> QueryWrapper<T> wrapper() {
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
@Override
public <T> QueryWrapper<T> queryWrapper() {
QueryWrapper<T> queryWrapper = super.queryWrapper();
if (CharSequenceUtil.isNotEmpty(promotionName)) {
queryWrapper.like("title", promotionName);
}
if (storeId != null) {
queryWrapper.in("store_id", Arrays.asList(storeId.split(",")));
}
if (startTime != null) {
queryWrapper.ge("start_time", new Date(startTime));
if (isCoupon != null) {
queryWrapper.eq("is_coupon", isCoupon);
}
if (endTime != null) {
queryWrapper.le("end_time", new Date(endTime));
}
if (CharSequenceUtil.isNotEmpty(promotionStatus)) {
queryWrapper.eq("promotion_status", PromotionStatusEnum.valueOf(promotionStatus).name());
if (CharSequenceUtil.isNotEmpty(couponId)) {
queryWrapper.eq("coupon_id", couponId);
}
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;
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 io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import lombok.EqualsAndHashCode;
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
* @since 2020/10/9
**/
@EqualsAndHashCode(callSuper = true)
@Data
public class PintuanSearchParams {
public class PintuanSearchParams extends BasePromotionsSearchParams {
@ApiModelProperty(value = "商家id")
private String storeId;
@@ -33,67 +28,20 @@ public class PintuanSearchParams {
@ApiModelProperty(value = "活动名称", required = true)
private String promotionName;
/**
* @see PromotionStatusEnum
*/
@ApiModelProperty(value = "活动状态")
@NotNull(message = "活动状态不能为空")
private String promotionStatus;
@ApiModelProperty(value = "活动开始时间")
private Long startTime;
@ApiModelProperty(value = "活动结束时间")
private Long endTime;
public <T> QueryWrapper<T> wrapper() {
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
@Override
public <T> QueryWrapper<T> queryWrapper() {
QueryWrapper<T> queryWrapper = super.queryWrapper();
if (CharSequenceUtil.isNotEmpty(promotionName)) {
queryWrapper.like("promotion_name", promotionName);
}
if (!StringUtils.isEmpty(storeName)) {
if (CharSequenceUtil.isNotEmpty(storeName)) {
queryWrapper.like("store_name", storeName);
}
if (!StringUtils.isEmpty(storeId)) {
if (CharSequenceUtil.isNotEmpty(storeId)) {
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;
}
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 lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.springframework.beans.BeanUtils;
import java.util.List;
@@ -13,11 +15,16 @@ import java.util.List;
* @author paulG
* @since 2020/10/28
**/
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
public class PintuanVO extends Pintuan {
private static final long serialVersionUID = 218582640653676201L;
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;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import java.util.regex.Pattern;
import lombok.EqualsAndHashCode;
/**
* 积分商品查询通用类
@@ -17,8 +12,9 @@ import java.util.regex.Pattern;
* @author paulG
* @since 2021/1/13
**/
@EqualsAndHashCode(callSuper = true)
@Data
public class PointsGoodsSearchParams {
public class PointsGoodsSearchParams extends BasePromotionsSearchParams {
@ApiModelProperty(value = "商品名称")
private String goodsName;
@@ -35,15 +31,10 @@ public class PointsGoodsSearchParams {
@ApiModelProperty(value = "积分,可以为范围如10_1000")
private String points;
/**
* @see PromotionStatusEnum
*/
@ApiModelProperty(value = "活动状态")
private String promotionStatus;
@Override
public <T> QueryWrapper<T> queryWrapper() {
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
QueryWrapper<T> queryWrapper = super.queryWrapper();
if (CharSequenceUtil.isNotEmpty(goodsName)) {
queryWrapper.eq("gs.goods_name", goodsName);
}
@@ -64,41 +55,7 @@ public class PointsGoodsSearchParams {
if (recommend != null) {
queryWrapper.eq("gs.recommend", recommend);
}
if (CharSequenceUtil.isNotEmpty(promotionStatus)) {
queryWrapper.eq("pg.promotion_status", promotionStatus);
}
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;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModelProperty;
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
* @since 2021/2/21
**/
@EqualsAndHashCode(callSuper = true)
@Data
public class PromotionGoodsSearchParams {
public class PromotionGoodsSearchParams extends BasePromotionsSearchParams {
@ApiModelProperty(value = "促销活动id")
private String promotionId;
@@ -23,10 +26,7 @@ public class PromotionGoodsSearchParams {
@ApiModelProperty(value = "促销类型")
private String promotionType;
@ApiModelProperty(value = "促销状态")
private String promotionStatus;
@ApiModelProperty(value = "促销活动id")
@ApiModelProperty(value = "商品活动id")
private String storeId;
@ApiModelProperty(value = "商品名称")
@@ -35,40 +35,46 @@ public class PromotionGoodsSearchParams {
@ApiModelProperty(value = "商品分类路径")
private String categoryPath;
@ApiModelProperty(value = "开始时间")
private Long startTime;
@ApiModelProperty(value = "商品SkuId")
private String skuId;
@ApiModelProperty(value = "结束时间")
private Long endTime;
@ApiModelProperty(value = "商品SkuIds")
private List<String> skuIds;
@ApiModelProperty(value = "促销活动id")
private List<String> promotionIds;
public LambdaQueryWrapper<PromotionGoods> queryWrapper() {
LambdaQueryWrapper<PromotionGoods> queryWrapper = new LambdaQueryWrapper<>();
@Override
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)) {
queryWrapper.eq(PromotionGoods::getPromotionId, promotionId);
queryWrapper.eq("promotion_id", promotionId);
}
if (CharSequenceUtil.isNotEmpty(goodsName)) {
queryWrapper.like(PromotionGoods::getGoodsName, goodsName);
queryWrapper.like("goods_name", goodsName);
}
if (CharSequenceUtil.isNotEmpty(promotionType)) {
queryWrapper.eq(PromotionGoods::getPromotionType, promotionType);
}
if (CharSequenceUtil.isNotEmpty(promotionStatus)) {
queryWrapper.eq(PromotionGoods::getPromotionStatus, promotionStatus);
queryWrapper.eq("promotion_type", promotionType);
}
if (CharSequenceUtil.isNotEmpty(categoryPath)) {
queryWrapper.like(PromotionGoods::getCategoryPath, categoryPath);
}
if (startTime != null) {
queryWrapper.ge(PromotionGoods::getStartTime, new Date(startTime));
}
if (endTime != null) {
queryWrapper.ge(PromotionGoods::getEndTime, new Date(endTime));
queryWrapper.like("category_path", categoryPath);
}
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;
}

View File

@@ -1,19 +1,14 @@
package cn.lili.modules.promotion.entity.vos;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.lili.modules.promotion.entity.enums.PromotionApplyStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionsApplyStatusEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Date;
import java.util.regex.Pattern;
/**
* 秒杀活动查询通用类
@@ -21,8 +16,9 @@ import java.util.regex.Pattern;
* @author paulG
* @since 2020/8/21
**/
@EqualsAndHashCode(callSuper = true)
@Data
public class SeckillSearchParams implements Serializable {
public class SeckillSearchParams extends BasePromotionsSearchParams implements Serializable {
private static final long serialVersionUID = -4052716630253333681L;
@@ -44,26 +40,18 @@ public class SeckillSearchParams implements Serializable {
@ApiModelProperty(value = "商品名称")
private String goodsName;
@ApiModelProperty(value = "活动开始时间", required = true)
private Long startTime;
@ApiModelProperty(value = "活动结束时间", required = true)
private Long endTime;
@ApiModelProperty(value = "商家编号")
private String skuId;
/**
* @see PromotionStatusEnum
*/
@ApiModelProperty(value = "活动状态")
private String promotionStatus;
/**
* @see cn.lili.modules.promotion.entity.enums.PromotionApplyStatusEnum
* @see PromotionsApplyStatusEnum
*/
@ApiModelProperty(value = "APPLY(\"申请\"), PASS(\"通过\"), REFUSE(\"拒绝\")")
private String promotionApplyStatus;
public <T> QueryWrapper<T> wrapper() {
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
@Override
public <T> QueryWrapper<T> queryWrapper() {
QueryWrapper<T> queryWrapper = super.queryWrapper();
if (CharSequenceUtil.isNotEmpty(goodsName)) {
queryWrapper.like("goods_name", goodsName);
}
@@ -79,56 +67,13 @@ public class SeckillSearchParams implements Serializable {
if (timeLine != null) {
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)) {
queryWrapper.eq("promotion_apply_status", PromotionApplyStatusEnum.valueOf(promotionApplyStatus).name());
queryWrapper.eq("promotion_apply_status", PromotionsApplyStatusEnum.valueOf(promotionApplyStatus).name());
}
if (CharSequenceUtil.isNotEmpty(promotionStatus)) {
queryWrapper.eq("promotion_status", PromotionStatusEnum.valueOf(promotionStatus).name());
if (CharSequenceUtil.isNotEmpty(skuId)) {
queryWrapper.eq("sku_id", skuId);
}
queryWrapper.eq("delete_flag", false);
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.lili.common.security.context.UserContext;
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 io.swagger.annotations.ApiModelProperty;
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.util.Date;
import java.util.regex.Pattern;
/**
* 砍价活动商品查询通用类
@@ -40,7 +36,7 @@ public class KanjiaActivityGoodsParams implements Serializable {
private String skuId;
/**
* @see PromotionStatusEnum
* @see PromotionsStatusEnum
*/
@ApiModelProperty(value = "活动状态")
private String promotionStatus;
@@ -68,32 +64,4 @@ public class KanjiaActivityGoodsParams implements Serializable {
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;
import cn.hutool.core.util.StrUtil;
import cn.lili.modules.promotion.entity.vos.BasePromotionsSearchParams;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 砍价活动搜索参数
@@ -11,8 +13,9 @@ import lombok.Data;
* @author Bulbasaur
* @date: 2021/7/13 2:41 下午
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class KanjiaActivitySearchParams {
public class KanjiaActivitySearchParams extends BasePromotionsSearchParams {
@ApiModelProperty(value = "砍价活动ID")
private String id;

View File

@@ -1,7 +1,9 @@
package cn.lili.modules.promotion.mapper;
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.toolkit.Constants;
import org.apache.ibatis.annotations.Param;
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 (" +
"( start_time < #{startTime} && end_time > #{startTime} ) || ( start_time < #{endTime} && end_time > #{endTime} ) || " +
"( start_time < #{startTime} && end_time > #{endTime} ) || ( start_time > #{startTime} && end_time < #{endTime} )" +
" || promotion_status = 'START' )")
")")
Integer selectInnerOverlapPromotionGoods(@Param("promotionType") String promotionType,
@Param("skuId") String skuId,
@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 (" +
"( start_time < #{startTime} && end_time > #{startTime} ) || ( start_time < #{endTime} && 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,
@Param("skuId") String skuId,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime,
@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 优惠券关联优惠券列表
*/
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.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 com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
@@ -15,23 +12,8 @@ import java.util.List;
* @author Bulbasaur
* @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
@@ -57,13 +39,4 @@ public interface CouponActivityService extends IService<CouponActivity> {
*/
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.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.CouponVO;
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
* @since 2020/8/21
*/
public interface CouponService extends IService<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);
public interface CouponService extends AbstractPromotionsService<Coupon> {
/**
* 领取优惠券
@@ -103,7 +30,21 @@ public interface CouponService extends IService<Coupon> {
*/
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;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.order.cart.entity.vo.FullDiscountVO;
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;
@@ -16,7 +11,7 @@ import java.util.List;
* @author Chopper
* @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);
/**
* 添加满优惠活动
*
* @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);
/**
* 删除满优惠获取
*
* @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 分页信息
* @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
* @return 砍价商品
*/
KanjiaActivityGoodsDTO getKanjiaGoodsBySkuId(String skuId);
KanjiaActivityGoods getKanjiaGoodsBySkuId(String skuId);
/**
* 查询砍价活动商品VO
@@ -87,12 +87,4 @@ public interface KanjiaActivityGoodsService extends IService<KanjiaActivityGoods
*/
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);
/**
* 领取优惠券
*
* @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);
/**
* 关闭会员优惠券
*
* @param couponIds 优惠券id集合
*/
void closeMemberCoupon(List<String> couponIds);
}

View File

@@ -1,15 +1,10 @@
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.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.PintuanVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Date;
import java.util.List;
/**
@@ -18,16 +13,8 @@ import java.util.List;
* @author Chopper
* @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);
/**
* 从mongo中根据条件分页查询拼团活动列表
*
* @param param 拼团活动查询参数
* @param page 分页参数
* @return 拼团活动列表
*/
IPage<PintuanVO> getPintuanByPageFromMongo(PintuanSearchParams param, PageVO page);
/**
* 从mongo中查询拼团活动详情
*
* @param id 拼团ID
* @return 拼团活动详情
*/
PintuanVO getPintuanByIdFromMongo(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);
PintuanVO getPintuanVO(String id);
/**
* 获取拼团分享信息

View File

@@ -1,11 +1,7 @@
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.vos.PointsGoodsSearchParams;
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;
@@ -15,40 +11,15 @@ import java.util.List;
* @author paulG
* @since 2020/11/18 9:45 上午
**/
public interface PointsGoodsService extends IService<PointsGoods> {
public interface PointsGoodsService extends AbstractPromotionsService<PointsGoods> {
/**
* 批量添加积分商品
* 批量保存库存商品
*
* @param pointsGoodsList 积分商品列表
* @return 是否添加成功
* @param promotionsList 积分商品列表
* @return 是否保存成功
*/
boolean addPointsGoods(List<PointsGoodsVO> pointsGoodsList);
/**
* 更新一个积分商品
*
* @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);
boolean savePointsGoodsBatch(List<PointsGoods> promotionsList);
/**
* 根据ID获取积分详情
@@ -64,15 +35,6 @@ public interface PointsGoodsService extends IService<PointsGoods> {
* @param skuId 商品SkuId
* @return 积分详情
*/
PointsGoodsVO getPointsGoodsVOByMongo(String skuId);
/**
* 根据条件查询积分商品
*
* @param searchParams 积分商品查询参数
* @param page 分页参数
* @return 积分商品查询结果
*/
IPage<PointsGoodsVO> getPointsGoodsByPage(PointsGoodsSearchParams searchParams, PageVO page);
PointsGoodsVO getPointsGoodsDetailBySkuId(String skuId);
}

View File

@@ -1,12 +1,11 @@
package cn.lili.modules.promotion.service;
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.modules.promotion.entity.vos.PromotionGoodsSearchParams;
import cn.lili.common.vo.PageVO;
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.extension.service.IService;
@@ -34,14 +33,6 @@ public interface PromotionGoodsService extends IService<PromotionGoods> {
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);
/**
* 分页获取促销商品信息
*
* @param skuId 商品skuId
* @return 某商品的促销信息
*/
List<PromotionGoods> getPromotionGoods(String skuId);
/**
* 分页获取促销商品信息
*
@@ -72,16 +55,42 @@ public interface PromotionGoodsService extends IService<PromotionGoods> {
* @param pageVo 分页参数
* @return 促销商品列表
*/
IPage<PromotionGoodsDTO> getPromotionGoods(PromotionGoodsSearchParams searchParams, PageVO pageVo);
IPage<PromotionGoods> pageFindAll(PromotionGoodsSearchParams searchParams, PageVO pageVo);
/**
* 分页获取当前进行中的促销活动的促销商品信息
* 获取促销商品信息
*
* @param promotionType 促销活动类型
* @param pageVo 分页参数
* @param searchParams 查询参数
* @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);
/**
* 根据条件获取促销活动商品详情
*
* @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);
/**
* 更新促销活动商品索引
*
* @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;
import cn.lili.trigger.message.PromotionMessage;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import java.util.Map;
@@ -13,16 +12,6 @@ import java.util.Map;
*/
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);
/**
* 从mongo中分页查询限时请购申请列表
* 分页查询限时请购申请列表
*
* @param queryParam 秒杀活动申请查询参数
* @param pageVo 分页参数
* @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 秒杀活动编号
@@ -60,7 +68,8 @@ public interface SeckillApplyService extends IService<SeckillApply> {
* 批量删除秒杀活动商品
*
* @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;
import cn.lili.common.vo.PageVO;
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 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
* @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;
/**
* 从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);
Integer PRE_CREATION = 7;
/**
* 从mongo中获取秒杀活动信息
@@ -44,56 +25,12 @@ public interface SeckillService extends IService<Seckill> {
* @param id 秒杀活动id
* @return 秒杀活动信息
*/
SeckillVO getSeckillByIdFromMongo(String id);
SeckillVO getSeckillDetail(String id);
/**
* 初始化秒杀活动,默认开启三十天的秒杀活动
*/
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
*/
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);
}
/**
* 根据优惠券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.ResultCode;
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.service.MemberService;
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.MemberCoupon;
import cn.lili.modules.promotion.entity.dto.CouponActivityDTO;
import cn.lili.modules.promotion.entity.enums.CouponActivitySendTypeEnum;
import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import cn.lili.modules.promotion.entity.enums.*;
import cn.lili.modules.promotion.entity.vos.CouponActivityVO;
import cn.lili.modules.promotion.mapper.CouponActivityMapper;
import cn.lili.modules.promotion.service.CouponActivityItemService;
import cn.lili.modules.promotion.service.CouponActivityService;
import cn.lili.modules.promotion.service.CouponService;
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -48,7 +34,7 @@ import java.util.stream.Collectors;
*/
@Slf4j
@Service
public class CouponActivityServiceImpl extends ServiceImpl<CouponActivityMapper, CouponActivity> implements CouponActivityService {
public class CouponActivityServiceImpl extends AbstractPromotionsServiceImpl<CouponActivityMapper, CouponActivity> implements CouponActivityService {
@Autowired
private CouponService couponService;
@@ -58,50 +44,6 @@ public class CouponActivityServiceImpl extends ServiceImpl<CouponActivityMapper,
private CouponActivityItemService couponActivityItemService;
@Autowired
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
public CouponActivityVO getCouponActivityVO(String couponActivityId) {
@@ -152,11 +94,86 @@ public class CouponActivityServiceImpl extends ServiceImpl<CouponActivityMapper,
}
}
/**
* 初始化促销字段
*
* @param promotions 促销实体
*/
@Override
public boolean updateCouponActivityStatus(String id, PromotionStatusEnum promotionStatus) {
CouponActivity couponActivity = this.getById(id);
couponActivity.setPromotionStatus(promotionStatus.name());
return this.updateById(couponActivity);
public void initPromotion(CouponActivity promotions) {
super.initPromotion(promotions);
if (promotions instanceof CouponActivityDTO) {
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) {
//获取优惠券
Coupon coupon = couponService.getCouponDetailFromMongo(couponActivityItem.getCouponId());
Coupon coupon = couponService.getById(couponActivityItem.getCouponId());
//判断优惠券是否存在
if (coupon != null) {
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) {
//判断优惠券的发送范围,获取会员列表
if ("ALL".equals(couponActivity.getActivityScope())) {
return memberService.listMaps(new QueryWrapper<Member>()
.select("id,nick_name"));
return this.memberService.listFieldsByMemberIds("id,nick_name", null);
} else {
List<Object> ids = new ArrayList<>();
List<String> ids = new ArrayList<>();
if (JSONUtil.isJsonArray(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>()
.select("id,nick_name")
.in("id", ids));
return memberService.listFieldsByMemberIds("id,nick_name", ids);
}
}
/**
* 添加优惠券活动关联优惠券
* 检查优惠券
*
* @param couponActivityDTO 优惠券活动DTO
* @param couponActivityItems 优惠券列表
*/
private void addCouponActivityItems(CouponActivityDTO couponActivityDTO) {
//创建优惠券活动子列表
for (CouponActivityItem couponActivityItem : couponActivityDTO.getCouponActivityItems()) {
couponActivityItem.setActivityId(couponActivityDTO.getId());
private void checkCouponActivityItem(List<CouponActivityItem> couponActivityItems) {
//优惠券数量判定
if (couponActivityItems.isEmpty()) {
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;
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.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.mybatis.util.PageUtil;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.promotion.entity.dos.*;
import cn.lili.modules.promotion.entity.enums.*;
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.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.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.service.*;
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.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.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.transaction.annotation.Transactional;
import java.util.Date;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@@ -49,28 +43,13 @@ import java.util.stream.Collectors;
*/
@Service
@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
private GoodsSkuService goodsSkuService;
/**
* Rocketmq
*/
@Autowired
private RocketmqCustomProperties rocketmqCustomProperties;
/**
* 促销商品
*/
@@ -92,170 +71,6 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
@Autowired
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
public void receiveCoupon(String couponId, Integer receiveNum) {
CouponVO couponVO = this.mongoTemplate.findById(couponId, CouponVO.class);
couponVO.setReceivedNum(couponVO.getReceivedNum() + receiveNum);
LambdaUpdateWrapper<Coupon> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(Coupon::getId, couponId);
updateWrapper.set(Coupon::getReceivedNum, couponVO.getReceivedNum());
this.update(updateWrapper);
this.mongoTemplate.save(couponVO);
Coupon coupon = this.getById(couponId);
if (coupon == null) {
throw new ServiceException(ResultCode.COUPON_NOT_EXIST);
}
this.update(new LambdaUpdateWrapper<Coupon>().eq(Coupon::getId, coupon.getId()).set(Coupon::getReceivedNum,
coupon.getReceivedNum() + receiveNum));
}
@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
public void usedCoupon(String couponId, Integer usedNum) {
CouponVO couponVO = this.mongoTemplate.findById(couponId, CouponVO.class);
couponVO.setUsedNum(couponVO.getUsedNum() + usedNum);
LambdaUpdateWrapper<Coupon> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(Coupon::getId, couponId);
updateWrapper.set(Coupon::getUsedNum, couponVO.getUsedNum());
this.update(updateWrapper);
this.mongoTemplate.save(couponVO);
Coupon coupon = this.getById(couponId);
if (coupon == null) {
throw new ServiceException(ResultCode.COUPON_NOT_EXIST);
}
this.update(new LambdaUpdateWrapper<Coupon>().eq(Coupon::getId, coupon.getId()).set(Coupon::getUsedNum,
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);
}
//如果发行数量是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);
}
//打折优惠券大于10折
boolean discountCoupon = (coupon.getCouponType().equals(CouponTypeEnum.DISCOUNT.name())
&& (coupon.getCouponDiscount() < 0 && coupon.getCouponDiscount() > 10));
boolean discountCoupon = (promotions.getCouponType().equals(CouponTypeEnum.DISCOUNT.name())
&& (promotions.getCouponDiscount() < 0 && promotions.getCouponDiscount() > 10));
if (discountCoupon) {
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;
//固定时间的优惠券不能小于当前时间
if (coupon.getEndTime().getTime() < nowTime) {
if (promotions.getEndTime().getTime() < nowTime) {
throw new ServiceException(ResultCode.PROMOTION_END_TIME_ERROR);
}
//促销通用时间校验
PromotionTools.checkPromotionTime(coupon.getStartTime().getTime(), coupon.getEndTime().getTime());
}
this.checkCouponScope(coupon);
//对状态的处理.如果未传递状态则需要 根据当前时间来确认优惠券状态
this.promotionStatusEmpty(coupon);
this.checkCouponScope((CouponVO) promotions);
}
@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,82 +255,38 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
* @param 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()));
if (portionGoodsScope) {
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);
} 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);
} 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);
}
if (coupon.getScopeType().equals(CouponScopeTypeEnum.PORTION_GOODS.name())) {
String[] split = coupon.getScopeId().split(",");
if (split.length <= 0) {
throw new ServiceException(ResultCode.COUPON_SCOPE_ERROR);
}
for (String id : split) {
GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(id);
if (goodsSku == null) {
throw new ServiceException(ResultCode.GOODS_NOT_EXIST);
}
}
if (coupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS.name())) {
this.checkCouponPortionGoods(coupon);
}
}
/**
* 对状态的处理.如果未传递状态则需要 根据当前时间来确认优惠券状态
* 检查指定商品
*
* @param coupon 优惠券参数
* @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());
}
private void checkCouponPortionGoods(CouponVO coupon) {
String[] split = coupon.getScopeId().split(",");
if (split.length <= 0) {
throw new ServiceException(ResultCode.COUPON_SCOPE_ERROR);
}
}
/**
* 检查优惠券状态是否可进行编辑删除
*
* @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);
for (String id : split) {
GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(id);
if (goodsSku == null) {
throw new ServiceException(ResultCode.GOODS_NOT_EXIST);
}
}
}

View File

@@ -1,40 +1,28 @@
package cn.lili.modules.promotion.serviceimpl;
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.utils.DateUtil;
import cn.lili.common.vo.PageVO;
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.enums.PromotionStatusEnum;
import cn.lili.modules.promotion.entity.vos.FullDiscountSearchParams;
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
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.service.CouponService;
import cn.lili.modules.promotion.service.FullDiscountService;
import cn.lili.modules.promotion.service.PromotionGoodsService;
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.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.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.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
@@ -46,26 +34,8 @@ import java.util.List;
*/
@Service
@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
public List<FullDiscountVO> currentPromotion(List<String> storeId) {
Query query = this.getMongoQuery();
query.addCriteria(Criteria.where(SELLER_ID_COLUMN).in(storeId));
return mongoTemplate.find(query, FullDiscountVO.class);
}
@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);
List<FullDiscountVO> result = new ArrayList<>();
QueryWrapper<FullDiscount> queryWrapper = new QueryWrapper<>();
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);
}
}
//保存到MONGO中
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;
return result;
}
/**
@@ -178,64 +74,74 @@ public class FullDiscountServiceImpl extends ServiceImpl<FullDiscountMapper, Ful
*/
@Override
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
public boolean deleteFullDiscount(String id) {
FullDiscountVO fullDiscount = this.checkFullDiscountExist(id);
//检查活动是否已经开始
boolean result = this.removeById(id);
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)) {
public void checkPromotions(FullDiscount promotions) {
super.checkPromotions(promotions);
if (promotions instanceof FullDiscountVO) {
FullDiscountVO fullDiscountVO = (FullDiscountVO) promotions;
//验证是否是有效参数
PromotionTools.paramValid(fullDiscountVO.getStartTime().getTime(), fullDiscountVO.getEndTime().getTime(), fullDiscountVO.getNumber(), fullDiscountVO.getPromotionGoodsList());
//当前时间段是否存在同类活动
this.checkSameActiveExist(fullDiscountVO.getStartTime(), fullDiscountVO.getEndTime(), fullDiscountVO.getStoreId(), null);
//检查满减参数
this.checkFullDiscount(fullDiscountVO);
PromotionTools.paramValid(fullDiscountVO.getStartTime(), fullDiscountVO.getEndTime(), fullDiscountVO.getNumber(), fullDiscountVO.getPromotionGoodsList());
}
//填写活动状态
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());
//添加延时任务
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 true;
/**
* 更新促销商品信息
*
* @param promotions 促销实体
*/
@Override
public void updatePromotionsGoods(FullDiscount promotions) {
super.updatePromotionsGoods(promotions);
if (!PromotionsStatusEnum.CLOSE.name().equals(promotions.getPromotionStatus())
&& PromotionsScopeTypeEnum.PORTION_GOODS.name().equals(promotions.getScopeType())
&& promotions instanceof FullDiscountVO) {
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
* @return 满优惠活动
*/
private FullDiscountVO checkFullDiscountExist(String id) {
FullDiscountVO fullDiscountVO = mongoTemplate.findById(id, FullDiscountVO.class);
if (fullDiscountVO == null) {
private FullDiscount checkFullDiscountExist(String id) {
FullDiscount fullDiscount = this.getById(id);
if (fullDiscount == null) {
throw new ServiceException(ResultCode.FULL_DISCOUNT_NOT_EXIST_ERROR);
}
return fullDiscountVO;
return fullDiscount;
}
/**
* 检查满减参数
*
* @param fullDiscountVO 满减参数信息
* @param fullDiscount 满减参数信息
*/
private void checkFullDiscount(FullDiscountVO fullDiscountVO) {
if (fullDiscountVO.getIsFullMinus() == null && fullDiscountVO.getIsCoupon() == null && fullDiscountVO.getIsGift() == null && fullDiscountVO.getIsPoint() == null && fullDiscountVO.getIsFullRate() == null) {
private void checkFullDiscount(FullDiscount fullDiscount) {
if (fullDiscount.getIsFullMinus() == null && fullDiscount.getIsCoupon() == null && fullDiscount.getIsGift() == null
&& fullDiscount.getIsPoint() == null && fullDiscount.getIsFullRate() == null) {
throw new ServiceException(ResultCode.FULL_DISCOUNT_WAY_ERROR);
}
//如果优惠方式是满减
if (Boolean.TRUE.equals(fullDiscountVO.getIsFullMinus())) {
this.checkFullMinus(fullDiscountVO.getFullMinus(), fullDiscountVO.getFullMoney());
fullDiscountVO.setTitle("" + fullDiscountVO.getFullMoney() + "" + fullDiscountVO.getFullMinus());
if (Boolean.TRUE.equals(fullDiscount.getIsFullMinus())) {
this.checkFullMinus(fullDiscount.getFullMinus(), fullDiscount.getFullMoney());
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) {
throw new ServiceException(ResultCode.FULL_DISCOUNT_GIFT_ERROR);
}
} else {
fullDiscountVO.setGiftId(null);
fullDiscount.setGiftId(null);
}
//如果优惠方式是赠优惠券
if (Boolean.TRUE.equals(fullDiscountVO.getIsCoupon())) {
this.checkCoupon(fullDiscountVO.getCouponId());
if (Boolean.TRUE.equals(fullDiscount.getIsCoupon())) {
this.checkCoupon(fullDiscount.getCouponId());
} else {
fullDiscountVO.setCouponId(null);
fullDiscount.setCouponId(null);
}
//如果优惠方式是折扣
if (Boolean.TRUE.equals(fullDiscountVO.getIsFullRate())) {
this.checkFullRate(fullDiscountVO.getFullRate());
fullDiscountVO.setTitle("" + fullDiscountVO.getFullMoney() + "" + fullDiscountVO.getFullRate() + "");
if (Boolean.TRUE.equals(fullDiscount.getIsFullRate())) {
this.checkFullRate(fullDiscount.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) {
//同一时间段内相同的活动
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) {
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);
}
}
/**
* 通用有效的满优惠活动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;
import cn.hutool.core.util.StrUtil;
import cn.lili.common.enums.PromotionTypeEnum;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.enums.ResultCode;
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.entity.dos.GoodsSku;
import cn.lili.modules.goods.entity.enums.GoodsStatusEnum;
import cn.lili.modules.goods.service.GoodsSkuService;
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.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.KanjiaActivityGoodsParams;
import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsVO;
import cn.lili.modules.promotion.mapper.KanJiaActivityGoodsMapper;
import cn.lili.modules.promotion.service.KanjiaActivityGoodsService;
import cn.lili.modules.promotion.service.PromotionGoodsService;
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.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
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.transaction.annotation.Transactional;
@@ -46,7 +37,7 @@ import java.util.List;
* 砍价业务层实现
*
* @author qiuqiu
* @date 2021/7/1
* @since 2021/7/1
*/
@Service
@Transactional(rollbackFor = Exception.class)
@@ -58,98 +49,47 @@ public class KanjiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
@Autowired
private GoodsSkuService goodsSkuService;
/**
* Rocketmq
*/
@Autowired
private RocketmqCustomProperties rocketmqCustomProperties;
/**
* 延时任务
*/
@Autowired
private TimeTrigger timeTrigger;
/**
* Mongo
*/
@Autowired
private MongoTemplate mongoTemplate;
private PromotionGoodsService promotionGoodsService;
@Override
public Boolean add(KanjiaActivityGoodsOperationDTO kanJiaActivityGoodsOperationDTO) {
List<KanjiaActivityGoods> kanjiaActivityGoodsList = new ArrayList<>();
List<PromotionGoods> promotionGoodsList = new ArrayList<>();
for (KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO : kanJiaActivityGoodsOperationDTO.getPromotionGoodsList()) {
//根据skuId查询商品信息
GoodsSku goodsSku = this.checkSkuExist(kanJiaActivityGoodsDTO.getSkuId());
//参数检测
this.checkParam(kanJiaActivityGoodsDTO, goodsSku);
//检测同一时间段是否存在相同的商品
PromotionTools.checkPromotionTime(kanJiaActivityGoodsOperationDTO.getStartTime().getTime(), kanJiaActivityGoodsOperationDTO.getEndTime().getTime());
PromotionTools.checkPromotionTime(kanJiaActivityGoodsOperationDTO.getStartTime(), kanJiaActivityGoodsOperationDTO.getEndTime());
kanJiaActivityGoodsDTO.setStartTime(kanJiaActivityGoodsOperationDTO.getStartTime());
kanJiaActivityGoodsDTO.setEndTime(kanJiaActivityGoodsOperationDTO.getEndTime());
//检测同一时间段不能允许添加相同的商品
if (this.checkSkuDuplicate(goodsSku.getId(), kanJiaActivityGoodsDTO) != null) {
throw new ServiceException("商品id为" + goodsSku.getId() + "的商品已参加砍价商品活动!");
}
kanJiaActivityGoodsDTO.setGoodsSku(goodsSku);
kanJiaActivityGoodsDTO.setSkuId(kanJiaActivityGoodsDTO.getSkuId());
kanJiaActivityGoodsDTO.setThumbnail(goodsSku.getThumbnail());
kanJiaActivityGoodsDTO.setGoodsName(goodsSku.getGoodsName());
kanJiaActivityGoodsDTO.setPromotionStatus(PromotionStatusEnum.NEW.name());
kanJiaActivityGoodsDTO.setOriginalPrice(kanJiaActivityGoodsDTO.getGoodsSku().getPrice());
kanJiaActivityGoodsDTO.setOriginalPrice(goodsSku.getPrice());
kanjiaActivityGoodsList.add(kanJiaActivityGoodsDTO);
promotionGoodsList.add(new PromotionGoods(kanJiaActivityGoodsDTO));
}
Boolean result = this.saveBatch(kanjiaActivityGoodsList);
if (result) {
//发送砍价延迟任务消息
for (KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO : kanJiaActivityGoodsOperationDTO.getPromotionGoodsList()) {
this.mongoTemplate.save(kanJiaActivityGoodsDTO);
this.addKanJiaGoodsPromotionTask(kanJiaActivityGoodsDTO);
}
}
return result;
this.promotionGoodsService.saveBatch(promotionGoodsList);
return this.saveBatch(kanjiaActivityGoodsList);
}
/**
* 添加砍价商品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
public IPage<KanjiaActivityGoodsDTO> getForPage(KanjiaActivityGoodsParams kanJiaActivityGoodsParams, PageVO pageVO) {
IPage<KanjiaActivityGoodsDTO> kanJiaActivityGoodsDTOIPage = new Page<>();
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;
public IPage<KanjiaActivityGoods> getForPage(KanjiaActivityGoodsParams kanJiaActivityGoodsParams, PageVO pageVO) {
return this.page(PageUtil.initPage(pageVO), kanJiaActivityGoodsParams.wrapper());
}
@Override
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 积分商品信息
*/
private KanjiaActivityGoods checkSkuDuplicate(String skuId, KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO) {
LambdaQueryWrapper<KanjiaActivityGoods> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(KanjiaActivityGoods::getSkuId, skuId);
if (kanJiaActivityGoodsDTO != null && StrUtil.isNotEmpty(kanJiaActivityGoodsDTO.getId())) {
queryWrapper.ne(KanjiaActivityGoods::getId, kanJiaActivityGoodsDTO.getId());
QueryWrapper<KanjiaActivityGoods> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("sku_id", skuId);
if (kanJiaActivityGoodsDTO != null && CharSequenceUtil.isNotEmpty(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);
@@ -234,22 +180,27 @@ public class KanjiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
@Override
public KanjiaActivityGoodsDTO getKanjiaGoodsDetail(String goodsId) {
KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO = this.mongoTemplate.findById(goodsId, KanjiaActivityGoodsDTO.class);
if (kanJiaActivityGoodsDTO == null) {
KanjiaActivityGoods kanjiaActivityGoods = this.getById(goodsId);
if (kanjiaActivityGoods == null) {
log.error("id为" + goodsId + "的砍价商品不存在!");
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
public KanjiaActivityGoodsDTO getKanjiaGoodsBySkuId(String skuId) {
Query query = new Query();
query.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.START.name()));
query.addCriteria(Criteria.where("skuId").is(skuId));
List<KanjiaActivityGoodsDTO> kanjiaActivityGoodsDTOS = this.mongoTemplate.find(query, KanjiaActivityGoodsDTO.class);
return kanjiaActivityGoodsDTOS.get(0);
public KanjiaActivityGoods getKanjiaGoodsBySkuId(String skuId) {
KanjiaActivityGoods kanjiaActivityGoods = this.getOne(new QueryWrapper<KanjiaActivityGoods>().eq("sku_id", skuId), false);
if (kanjiaActivityGoods != null && PromotionsStatusEnum.START.name().equals(kanjiaActivityGoods.getPromotionStatus())) {
return kanjiaActivityGoods;
}
return null;
}
@Override
@@ -257,7 +208,7 @@ public class KanjiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
KanjiaActivityGoodsVO kanJiaActivityGoodsVO = new KanjiaActivityGoodsVO();
//获取砍价商品
KanjiaActivityGoods kanJiaActivityGoods=this.getById(id);
KanjiaActivityGoods kanJiaActivityGoods = this.getById(id);
//获取商品SKU
GoodsSku goodsSku = this.goodsSkuService.getGoodsSkuByIdFromCache(kanJiaActivityGoods.getSkuId());
//填写活动商品价格、剩余数量
@@ -272,9 +223,9 @@ public class KanjiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
@Override
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);
}
//获取当前sku信息
@@ -286,59 +237,20 @@ public class KanjiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
//常规校验砍价商品参数
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) {
throw new ServiceException("商品id为" + goodsSku.getId() + "的商品已参加砍价商品活动!");
}
//修改数据库
boolean result = 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;
return this.updateById(kanJiaActivityGoodsDTO);
}
@Override
public boolean deleteKanJiaGoods(List<String> ids) {
List<String> skuIds = new ArrayList<>();
for (String id : ids) {
KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO = this.getKanjiaGoodsDetail(id);
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR,
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);
PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
searchParams.setPromotionIds(ids);
this.promotionGoodsService.deletePromotionGoods(searchParams);
return this.removeByIds(ids);
}
}

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.dto.KanJiaActivityLogQuery;
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.service.KanjiaActivityGoodsService;
import cn.lili.modules.promotion.service.KanjiaActivityLogService;
@@ -62,7 +62,7 @@ public class KanjiaActivityLogServiceImpl extends ServiceImpl<KanJiaActivityLogM
//校验当前砍价商品是否有效
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());
if (kanjiaActivity != null) {

View File

@@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.RandomUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.utils.BeanUtil;
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.KanjiaActivityQuery;
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.KanjiaActivityVO;
import cn.lili.modules.promotion.mapper.KanJiaActivityMapper;
@@ -36,13 +37,15 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Objects;
/**
* 砍价活动参与记录业务层实现
*
* @author qiuqiu
* @date 2021/7/1
* @since 2021/7/1
*/
@Service
@Transactional(rollbackFor = Exception.class)
@@ -64,6 +67,7 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
@Override
public KanjiaActivityVO getKanjiaActivityVO(KanjiaActivitySearchParams kanJiaActivitySearchParams) {
AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser());
KanjiaActivity kanjiaActivity = this.getKanjiaActivity(kanJiaActivitySearchParams);
KanjiaActivityVO kanjiaActivityVO = new KanjiaActivityVO();
//判断是否参与活动
@@ -77,7 +81,7 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
//如果已发起砍价判断用户是否可以砍价
KanjiaActivityLog kanjiaActivityLog = kanjiaActivityLogService.getOne(new LambdaQueryWrapper<KanjiaActivityLog>()
.eq(KanjiaActivityLog::getKanjiaActivityId, kanjiaActivity.getId())
.eq(KanjiaActivityLog::getKanjiaMemberId, UserContext.getCurrentUser().getId()));
.eq(KanjiaActivityLog::getKanjiaMemberId, authUser.getId()));
if (kanjiaActivityLog == null) {
kanjiaActivityVO.setHelp(true);
}
@@ -91,15 +95,16 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
@Override
public KanjiaActivityLog add(String id) {
AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser());
//根据skuId查询当前sku是否参与活动并且是在活动进行中
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);
}
KanjiaActivityLog kanjiaActivityLog = new KanjiaActivityLog();
//获取会员信息
Member member = memberService.getById(UserContext.getCurrentUser().getId());
Member member = memberService.getById(authUser.getId());
//校验此活动是否已经发起过
QueryWrapper<KanjiaActivity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("kanjia_activity_goods_id", kanJiaActivityGoods.getId());
@@ -110,7 +115,7 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
KanjiaActivity kanJiaActivity = new KanjiaActivity();
//获取商品信息
GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(kanJiaActivityGoods.getSkuId());
if (goodsSku != null && member != null) {
if (goodsSku != null) {
kanJiaActivity.setSkuId(kanJiaActivityGoods.getSkuId());
kanJiaActivity.setGoodsName(goodsSku.getGoodsName());
kanJiaActivity.setKanjiaActivityGoodsId(kanJiaActivityGoods.getId());
@@ -118,7 +123,7 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
kanJiaActivity.setMemberId(UserContext.getCurrentUser().getId());
kanJiaActivity.setMemberName(member.getUsername());
kanJiaActivity.setStatus(KanJiaStatusEnum.START.name());
//剩余砍价金额 开始 是商品金额;
//剩余砍价金额 开始 是商品金额
kanJiaActivity.setSurplusPrice(goodsSku.getPrice());
//砍价最低购买金额
kanJiaActivity.setPurchasePrice(kanJiaActivityGoods.getPurchasePrice());
@@ -136,12 +141,13 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
@Override
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查询砍价活动信息
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);
} else if (member == null) {
throw new ServiceException(ResultCode.USER_NOT_EXIST);
@@ -152,7 +158,7 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
throw new ServiceException(ResultCode.PROMOTION_STATUS_END);
}
//判断是否已参与
LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<KanjiaActivityLog>()
LambdaQueryWrapper<KanjiaActivityLog> lambdaQueryWrapper = new LambdaQueryWrapper<KanjiaActivityLog>()
.eq(KanjiaActivityLog::getKanjiaActivityId, kanjiaActivityId)
.eq(KanjiaActivityLog::getKanjiaMemberId, member.getId());
if (kanjiaActivityLogService.count(lambdaQueryWrapper) > 0) {
@@ -188,7 +194,7 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
*
* @param kanjiaActivityGoods 砍价商品信息
* @param surplusPrice 剩余可砍金额
* @return
* @return 砍一刀价格
*/
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()),
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.exception.ServiceException;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.promotion.entity.dos.Coupon;
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.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.mapper.MemberCouponMapper;
import cn.lili.modules.promotion.service.CouponService;
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.QueryWrapper;
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.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.*;
/**
* 会员优惠券业务层实现
@@ -52,7 +51,7 @@ public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, Mem
.eq(MemberCoupon::getCouponId, couponId)
.eq(MemberCoupon::getMemberId, memberId);
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);
}
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
public void receiveCoupon(String couponId, String memberId, String memberName) {
Coupon coupon = couponService.getCouponDetailFromMongo(couponId);
Coupon coupon = couponService.getById(couponId);
if (coupon != null) {
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);
this.receiverCoupon(couponId, memberId, memberName, coupon);
} else {
throw new ServiceException(ResultCode.COUPON_NOT_EXIST);
}
@@ -82,18 +92,19 @@ public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, Mem
@Override
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);
}
@Override
public List<MemberCoupon> getMemberCoupons() {
LambdaQueryWrapper<MemberCoupon> LambdaQueryWrapper = new LambdaQueryWrapper<>();
LambdaQueryWrapper.eq(MemberCoupon::getMemberId,UserContext.getCurrentUser().getId());
LambdaQueryWrapper.eq(MemberCoupon::getMemberCouponStatus,MemberCouponStatusEnum.NEW.name());
LambdaQueryWrapper.le(MemberCoupon::getStartTime,new Date());
LambdaQueryWrapper.ge(MemberCoupon::getEndTime,new Date());
return this.list(LambdaQueryWrapper);
AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser());
LambdaQueryWrapper<MemberCoupon> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(MemberCoupon::getMemberId, authUser.getId());
queryWrapper.eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name());
queryWrapper.le(MemberCoupon::getStartTime, new Date());
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.and(
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.le(MemberCoupon::getConsumeThreshold, totalPrice);
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::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name());
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.ge(MemberCoupon::getEndTime, new Date());
return this.list(queryWrapper);
@@ -150,15 +161,16 @@ public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, Mem
LambdaQueryWrapper<MemberCoupon> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(MemberCoupon::getMemberId, memberId);
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)));
return this.list(queryWrapper);
}
@Override
public Integer getMemberCouponsNum() {
AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser());
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("delete_flag", false);
return this.count(queryWrapper);
@@ -222,4 +234,27 @@ public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, Mem
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;
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.ResultCode;
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.member.entity.dos.Member;
import cn.lili.modules.member.service.MemberService;
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.PayStatusEnum;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.promotion.entity.dos.Pintuan;
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.PintuanSearchParams;
import cn.lili.modules.promotion.entity.vos.PintuanShareVO;
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.service.PintuanService;
import cn.lili.modules.promotion.service.PromotionGoodsService;
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.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.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -59,18 +45,8 @@ import java.util.stream.Collectors;
*/
@Service
@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
private MemberService memberService;
/**
* RocketMQ
*/
@Autowired
private RocketmqCustomProperties rocketmqCustomProperties;
/**
* 订单
*/
@Autowired
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
public List<PintuanMemberVO> getPintuanMember(String pintuanId) {
List<PintuanMemberVO> members = new ArrayList<>();
PintuanVO pintuan = this.getPintuanByIdFromMongo(pintuanId);
Pintuan pintuan = this.getById(pintuanId);
if (pintuan == null) {
log.error("拼团活动为" + pintuanId + "的拼团活动不存在!");
return new ArrayList<>();
}
LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Order::getPromotionId, pintuanId)
.eq(Order::getOrderPromotionType, PromotionTypeEnum.PINTUAN.name())
.eq(Order::getOrderStatus, OrderStatusEnum.PAID.name())
.eq(Order::getParentOrderSn, "");
List<Order> orders = orderService.list(queryWrapper);
OrderSearchParams searchParams = new OrderSearchParams();
searchParams.setOrderStatus(OrderStatusEnum.PAID.name());
searchParams.setPromotionId(pintuanId);
searchParams.setOrderPromotionType(PromotionTypeEnum.PINTUAN.name());
searchParams.setParentOrderSn("");
List<Order> orders = orderService.queryListByParams(searchParams);
//遍历订单状态为已支付,为团长的拼团订单
for (Order order : orders) {
Member member = memberService.getById(order.getMemberId());
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);
//获取待参团人数
int toBoGrouped = pintuan.getRequiredNum() - count;
memberVO.setGroupNum(pintuan.getRequiredNum());
memberVO.setGroupedNum(count);
memberVO.setToBeGroupedNum(toBoGrouped);
this.setMemberVONum(memberVO, pintuan.getRequiredNum(), order.getSn());
memberVO.setOrderSn(order.getSn());
members.add(memberVO);
}
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中查询拼团活动详情
*
@@ -166,161 +107,17 @@ public class PintuanServiceImpl extends ServiceImpl<PintuanMapper, Pintuan> impl
* @return 拼团活动详情
*/
@Override
public PintuanVO getPintuanByIdFromMongo(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) {
public PintuanVO getPintuanVO(String id) {
Pintuan pintuan = this.getById(id);
if (pintuan == null) {
log.error("拼团活动id[" + id + "]的拼团活动不存在!");
throw new ServiceException(ResultCode.ERROR);
throw new ServiceException(ResultCode.PINTUAN_NOT_EXIST_ERROR);
}
return pintuan;
}
/**
* 从mongo中根据条件查询拼团活动总数
*
* @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;
PintuanVO pintuanVO = new PintuanVO(pintuan);
PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
searchParams.setPromotionId(pintuan.getId());
pintuanVO.setPromotionGoodsList(promotionGoodsService.listFindAll(searchParams));
return pintuanVO;
}
/**
@@ -334,28 +131,103 @@ public class PintuanServiceImpl extends ServiceImpl<PintuanMapper, Pintuan> impl
public PintuanShareVO getPintuanShareInfo(String parentOrderSn, String skuId) {
PintuanShareVO pintuanShareVO = new PintuanShareVO();
pintuanShareVO.setPintuanMemberVOS(new ArrayList<>());
LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>();
//查找团长订单和已和当前拼团订单拼团的订单
queryWrapper.eq(Order::getOrderPromotionType, PromotionTypeEnum.PINTUAN.name())
.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);
List<Order> orders = orderService.queryListByPromotion(PromotionTypeEnum.PINTUAN.name(), PayStatusEnum.PAID.name(), parentOrderSn, parentOrderSn);
this.setPintuanOrderInfo(orders, pintuanShareVO, skuId);
//如果为根据团员订单sn查询拼团订单信息时找到团长订单sn然后找到所有参与到同一拼团的订单信息
if (!orders.isEmpty() && pintuanShareVO.getPromotionGoods() == null) {
LambdaQueryWrapper<Order> orderLambdaQueryWrapper = new LambdaQueryWrapper<>();
//查找团长订单和已和当前拼团订单拼团的订单
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);
List<Order> parentOrders = orderService.queryListByPromotion(PromotionTypeEnum.PINTUAN.name(), PayStatusEnum.PAID.name(), orders.get(0).getParentOrderSn(), orders.get(0).getParentOrderSn());
this.setPintuanOrderInfo(parentOrders, pintuanShareVO, skuId);
}
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) {
Member member = memberService.getById(order.getMemberId());
PintuanMemberVO memberVO = new PintuanMemberVO(member);
if (StrUtil.isEmpty(order.getParentOrderSn())) {
if (CharSequenceUtil.isEmpty(order.getParentOrderSn())) {
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) {
throw new ServiceException(ResultCode.PINTUAN_NOT_EXIST_ERROR);
throw new ServiceException(ResultCode.PINTUAN_GOODS_NOT_EXIST_ERROR);
}
pintuanShareVO.setPromotionGoods(promotionGoods);
Pintuan pintuanById = this.getPintuanById(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())));
Pintuan pintuanById = this.getById(order.getPromotionId());
//获取已参团人数
int count = orderService.count(countQueryWrapper);
//获取待参团人数
int toBoGrouped = pintuanById.getRequiredNum() - count;
memberVO.setGroupNum(pintuanById.getRequiredNum());
memberVO.setGroupedNum(count);
memberVO.setToBeGroupedNum(toBoGrouped);
this.setMemberVONum(memberVO, pintuanById.getRequiredNum(), order.getSn());
}
pintuanShareVO.getPintuanMemberVOS().add(memberVO);
}
}
/**
* 增加拼团定时任务
* @param pintuan
*/
private void addPintuanStartTask(PintuanVO pintuan) {
PromotionMessage promotionMessage = new PromotionMessage(pintuan.getId(), PromotionTypeEnum.PINTUAN.name(), PromotionStatusEnum.START.name(), pintuan.getStartTime(), pintuan.getEndTime());
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR,
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());
private void setMemberVONum(PintuanMemberVO memberVO, Integer requiredNum, String orderSn) {
int count = this.orderService.queryCountByPromotion(PromotionTypeEnum.PINTUAN.name(), PayStatusEnum.PAID.name(), orderSn, orderSn);
//获取待参团人数
int toBoGrouped = requiredNum - count;
memberVO.setGroupNum(requiredNum);
memberVO.setGroupedNum(count);
memberVO.setToBeGroupedNum(toBoGrouped);
}
/**
@@ -424,7 +273,7 @@ public class PintuanServiceImpl extends ServiceImpl<PintuanMapper, Pintuan> impl
* @param pintuan 拼团活动信息
* @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();
@@ -432,13 +281,14 @@ public class PintuanServiceImpl extends ServiceImpl<PintuanMapper, Pintuan> impl
//是否开启虚拟成团
if (Boolean.FALSE.equals(pintuan.getFictitious()) && entry.getValue().size() < requiredNum) {
//如果未开启虚拟成团且已参团人数小于成团人数,则自动取消订单
LambdaUpdateWrapper<Order> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(Order::getOrderPromotionType, PromotionTypeEnum.PINTUAN.name());
updateWrapper.eq(Order::getPromotionId, pintuan.getId());
updateWrapper.eq(Order::getParentOrderSn, entry.getKey());
updateWrapper.set(Order::getOrderStatus, OrderStatusEnum.CANCELLED.name());
updateWrapper.set(Order::getCancelReason, "拼团活动结束订单未付款,系统自动取消订单");
orderService.update(updateWrapper);
String reason = "拼团活动结束订单未付款,系统自动取消订单";
if (CharSequenceUtil.isNotEmpty(entry.getKey())) {
this.orderService.systemCancel(entry.getKey(), reason);
} else {
for (Order order : entry.getValue()) {
this.orderService.systemCancel(order.getSn(), reason);
}
}
} else if (Boolean.TRUE.equals(pintuan.getFictitious())) {
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() + "]已经在重叠的时间段参加了秒杀活动或拼团活动,不能参加拼团活动");
}
}
LambdaQueryWrapper<PromotionGoods> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PromotionGoods::getPromotionId, pintuan.getId()).eq(PromotionGoods::getPromotionType, PromotionTypeEnum.PINTUAN.name());
promotionGoodsService.remove(queryWrapper);
PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
searchParams.setPromotionId(pintuan.getId());
searchParams.setPromotionType(PromotionTypeEnum.PINTUAN.name());
promotionGoodsService.deletePromotionGoods(searchParams);
promotionGoodsService.saveOrUpdateBatch(promotionGoods);
}
}

View File

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

View File

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

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