Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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, "该秒杀活动活动的状态不能关闭"),
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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工具类
|
||||
*
|
||||
|
||||
@@ -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()];
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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商品索引
|
||||
*
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package cn.lili.modules.member.entity.dto;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
/**
|
||||
* 登出
|
||||
*
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
* 登出
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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())) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 查询导出订单列表
|
||||
*
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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 = "优惠券活动-优惠券关联实体类")
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 = "砍价活动参与对象")
|
||||
|
||||
@@ -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 = "货品名称")
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
/**
|
||||
* 获取拼团分享信息
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
|
||||
/**
|
||||
* 获取当前进行的所有促销活动信息
|
||||
*
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user