Merge pull request !147 from OceansDeep/feature/pg
This commit is contained in:
OceansDeep
2022-04-21 08:28:26 +00:00
committed by Gitee
25 changed files with 237 additions and 105 deletions

View File

@@ -10,10 +10,15 @@ import org.springframework.context.ApplicationEvent;
@Data
public class GeneratorEsGoodsIndexEvent extends ApplicationEvent {
private String goodsId;
private static final long serialVersionUID = -6206752641309458207L;
public GeneratorEsGoodsIndexEvent(Object source, String goodsId) {
private String id;
private String tag;
public GeneratorEsGoodsIndexEvent(Object source, String tag, String id) {
super(source);
this.goodsId = goodsId;
this.tag = tag;
this.id = id;
}
}

View File

@@ -3,7 +3,6 @@ package cn.lili.modules.goods.listener;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.modules.goods.event.GeneratorEsGoodsIndexEvent;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.GoodsTagsEnum;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -30,9 +29,9 @@ public class GeneratorEsGoodsIndexListener {
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void generatorEsGoodsIndex(GeneratorEsGoodsIndexEvent esGoodsIndexEvent) {
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.GENERATOR_GOODS_INDEX.name();
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + esGoodsIndexEvent.getTag();
//发送mq消息
rocketMQTemplate.asyncSend(destination, esGoodsIndexEvent.getGoodsId(), RocketmqSendCallbackBuilder.commonCallback());
rocketMQTemplate.asyncSend(destination, esGoodsIndexEvent.getId(), RocketmqSendCallbackBuilder.commonCallback());
}
}

View File

@@ -112,6 +112,17 @@ public interface GoodsService extends IService<Goods> {
*/
Boolean updateGoodsMarketAble(List<String> goodsIds, GoodsStatusEnum goodsStatusEnum, String underReason);
/**
* 更新商品上架状态状态
*
* @param storeId 店铺ID
* @param goodsStatusEnum 更新的商品状态
* @param underReason 下架原因
* @return 更新结果
*/
Boolean updateGoodsMarketAbleByStoreId(String storeId, GoodsStatusEnum goodsStatusEnum, String underReason);
/**
* 更新商品上架状态状态
*

View File

@@ -151,6 +151,15 @@ public interface GoodsSkuService extends IService<GoodsSku> {
*/
void updateGoodsSkuStatus(Goods goods);
/**
* 更新商品sku状态根据店铺id
*
* @param storeId 店铺id
* @param marketEnable 市场启用状态
* @param authFlag 审核状态
*/
void updateGoodsSkuStatusByStoreId(String storeId, String marketEnable, String authFlag);
/**
* 发送生成ES商品索引
*

View File

@@ -70,7 +70,7 @@ public interface StudioService extends IService<Studio> {
* @param status 直播间状态
* @return 直播间分页
*/
IPage<Studio> studioList(PageVO pageVO, Integer recommend, String status);
IPage<StudioVO> studioList(PageVO pageVO, Integer recommend, String status);
/**
* 修改直播间状态

View File

@@ -316,6 +316,29 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
return result;
}
/**
* 更新商品上架状态状态
*
* @param storeId 店铺ID
* @param goodsStatusEnum 更新的商品状态
* @param underReason 下架原因
* @return 更新结果
*/
@Override
public Boolean updateGoodsMarketAbleByStoreId(String storeId, GoodsStatusEnum goodsStatusEnum, String underReason) {
boolean result;
LambdaUpdateWrapper<Goods> updateWrapper = this.getUpdateWrapperByStoreAuthority();
updateWrapper.set(Goods::getMarketEnable, goodsStatusEnum.name());
updateWrapper.set(Goods::getUnderMessage, underReason);
updateWrapper.eq(Goods::getStoreId, storeId);
result = this.update(updateWrapper);
//修改规格商品
this.goodsSkuService.updateGoodsSkuStatusByStoreId(storeId, goodsStatusEnum.name(), null);
return result;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean managerUpdateGoodsMarketAble(List<String> goodsIds, GoodsStatusEnum goodsStatusEnum, String underReason) {

View File

@@ -325,7 +325,8 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
@Transactional(rollbackFor = Exception.class)
public void updateGoodsSkuStatus(Goods goods) {
LambdaUpdateWrapper<GoodsSku> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(GoodsSku::getGoodsId, goods.getId());
updateWrapper.eq(CharSequenceUtil.isNotEmpty(goods.getId()), GoodsSku::getGoodsId, goods.getId());
updateWrapper.eq(CharSequenceUtil.isNotEmpty(goods.getStoreId()), GoodsSku::getStoreId, goods.getStoreId());
updateWrapper.set(GoodsSku::getMarketEnable, goods.getMarketEnable());
updateWrapper.set(GoodsSku::getAuthFlag, goods.getAuthFlag());
updateWrapper.set(GoodsSku::getDeleteFlag, goods.getDeleteFlag());
@@ -342,6 +343,31 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
}
}
/**
* 更新商品sku状态根据店铺id
*
* @param storeId 店铺id
* @param marketEnable 市场启用状态
* @param authFlag 审核状态
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void updateGoodsSkuStatusByStoreId(String storeId, String marketEnable, String authFlag) {
LambdaUpdateWrapper<GoodsSku> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(GoodsSku::getStoreId, storeId);
updateWrapper.set(CharSequenceUtil.isNotEmpty(marketEnable), GoodsSku::getMarketEnable, marketEnable);
updateWrapper.set(CharSequenceUtil.isNotEmpty(authFlag), GoodsSku::getAuthFlag, authFlag);
boolean update = this.update(updateWrapper);
if (Boolean.TRUE.equals(update)) {
if (GoodsStatusEnum.UPPER.name().equals(marketEnable)) {
applicationEventPublisher.publishEvent(new GeneratorEsGoodsIndexEvent("生成店铺商品", GoodsTagsEnum.GENERATOR_STORE_GOODS_INDEX.name(), storeId));
} else if (GoodsStatusEnum.DOWN.name().equals(marketEnable)) {
cache.vagueDel(CachePrefix.GOODS_SKU.getPrefix());
applicationEventPublisher.publishEvent(new GeneratorEsGoodsIndexEvent("删除店铺商品", GoodsTagsEnum.STORE_GOODS_DELETE.name(), storeId));
}
}
}
@Override
public List<GoodsSku> getGoodsSkuByIdFromCache(List<String> ids) {
List<String> keys = new ArrayList<>();
@@ -563,7 +589,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
if (!GoodsStatusEnum.UPPER.name().equals(goods.getMarketEnable()) || !GoodsAuthEnum.PASS.name().equals(goods.getAuthFlag())) {
return;
}
applicationEventPublisher.publishEvent(new GeneratorEsGoodsIndexEvent("生成商品索引事件", goods.getId()));
applicationEventPublisher.publishEvent(new GeneratorEsGoodsIndexEvent("生成商品", GoodsTagsEnum.GENERATOR_GOODS_INDEX.name(), goods.getId()));
}
/**

View File

@@ -1,6 +1,7 @@
package cn.lili.modules.goods.serviceimpl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
@@ -32,12 +33,15 @@ 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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -209,15 +213,27 @@ public class StudioServiceImpl extends ServiceImpl<StudioMapper, Studio> impleme
}
@Override
public IPage<Studio> studioList(PageVO pageVO, Integer recommend, String status) {
public IPage<StudioVO> studioList(PageVO pageVO, Integer recommend, String status) {
QueryWrapper queryWrapper = new QueryWrapper<Studio>()
.eq(recommend != null, "recommend", true)
.eq(status != null, "status", status)
.eq(CharSequenceUtil.isNotEmpty(status), "status", status)
.orderByDesc("create_time");
if (UserContext.getCurrentUser() != null && UserContext.getCurrentUser().getRole().equals(UserEnums.STORE)) {
queryWrapper.eq("store_id", UserContext.getCurrentUser().getStoreId());
}
return this.page(PageUtil.initPage(pageVO), queryWrapper);
Page page = this.page(PageUtil.initPage(pageVO), queryWrapper);
List<Studio> records = page.getRecords();
List<StudioVO> studioVOS = new ArrayList<>();
for (Studio record : records) {
StudioVO studioVO = new StudioVO();
//获取直播间信息
BeanUtil.copyProperties(record, studioVO);
//获取直播间商品信息
studioVO.setCommodityList(commodityMapper.getCommodityByRoomId(studioVO.getRoomId()));
studioVOS.add(studioVO);
}
page.setRecords(studioVOS);
return page;
}

View File

@@ -125,6 +125,13 @@ public interface MemberCouponService extends IService<MemberCoupon> {
*/
void cancellation(String memberId, String id);
/**
* 作废无效的会员优惠券
*
* @return 是否操作成功
*/
boolean expireInvalidMemberCoupon(String memberId);
/**
* 关闭会员优惠券
*

View File

@@ -1,5 +1,8 @@
package cn.lili.modules.promotion.service;
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import java.util.List;
import java.util.Map;
/**
@@ -15,7 +18,7 @@ public interface PromotionService {
*
* @return 当前促销活动集合
*/
Map<String, Object> getCurrentPromotion();
Map<String, List<PromotionGoods>> getCurrentPromotion();
/**
* 根据商品索引获取当前商品索引的所有促销活动信息

View File

@@ -1,5 +1,6 @@
package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.cache.Cache;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
@@ -23,6 +24,7 @@ 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.core.toolkit.Wrappers;
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.cache.annotation.CacheConfig;
@@ -108,7 +110,12 @@ public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, Mem
@Override
public IPage<MemberCoupon> getMemberCoupons(MemberCouponSearchParams param, PageVO pageVo) {
QueryWrapper<MemberCoupon> queryWrapper = param.queryWrapper();
return this.page(PageUtil.initPage(pageVo), queryWrapper);
Page<MemberCoupon> page = this.page(PageUtil.initPage(pageVo), queryWrapper);
if (page.getRecords().stream().anyMatch(i -> i.getEndTime().before(new Date()))) {
this.expireInvalidMemberCoupon(param.getMemberId());
return this.page(PageUtil.initPage(pageVo), queryWrapper);
}
return page;
}
/**
@@ -119,7 +126,12 @@ public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, Mem
*/
@Override
public List<MemberCoupon> getMemberCoupons(MemberCouponSearchParams param) {
return this.list(param.queryWrapper());
List<MemberCoupon> list = this.list(param.queryWrapper());
if (list.stream().anyMatch(i -> i.getEndTime().before(new Date()))) {
this.expireInvalidMemberCoupon(param.getMemberId());
return this.list(param.queryWrapper());
}
return list;
}
/**
@@ -273,6 +285,23 @@ public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, Mem
this.update(memberCouponLambdaUpdateWrapper);
}
/**
* 清除无效的会员优惠券
*
* @return 是否操作成功
*/
@Override
@CacheEvict(key = "#memberId")
public boolean expireInvalidMemberCoupon(String memberId) {
//将过期优惠券变更为过期状体
LambdaUpdateWrapper<MemberCoupon> updateWrapper = new LambdaUpdateWrapper<MemberCoupon>()
.eq(CharSequenceUtil.isNotEmpty(memberId), MemberCoupon::getMemberId, memberId)
.eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name())
.le(MemberCoupon::getEndTime, new Date())
.set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name());
return this.update(updateWrapper);
}
private void receiverCoupon(String couponId, String memberId, String memberName, Coupon coupon) {
this.checkCouponLimit(couponId, memberId);
MemberCoupon memberCoupon = new MemberCoupon(coupon);

View File

@@ -2,8 +2,7 @@ package cn.lili.modules.promotion.serviceimpl;
import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.modules.promotion.entity.dos.*;
import cn.lili.modules.promotion.entity.dto.search.FullDiscountSearchParams;
import cn.lili.modules.promotion.entity.dto.search.PintuanSearchParams;
import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams;
import cn.lili.modules.promotion.entity.dto.search.SeckillSearchParams;
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.service.*;
@@ -16,6 +15,7 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 促销业务层实现
@@ -69,37 +69,11 @@ public class PromotionServiceImpl implements PromotionService {
* @return 当前促销活动集合
*/
@Override
public Map<String, Object> getCurrentPromotion() {
Map<String, Object> resultMap = new HashMap<>(16);
SeckillSearchParams seckillSearchParams = new SeckillSearchParams();
seckillSearchParams.setPromotionStatus(PromotionsStatusEnum.START.name());
//获取当前进行的秒杀活动活动
List<Seckill> seckillList = seckillService.listFindAll(seckillSearchParams);
if (seckillList != null && !seckillList.isEmpty()) {
for (Seckill seckill : seckillList) {
resultMap.put(PromotionTypeEnum.SECKILL.name(), seckill);
}
}
FullDiscountSearchParams fullDiscountSearchParams = new FullDiscountSearchParams();
fullDiscountSearchParams.setPromotionStatus(PromotionsStatusEnum.START.name());
//获取当前进行的满优惠活动
List<FullDiscount> fullDiscountList = fullDiscountService.listFindAll(fullDiscountSearchParams);
if (fullDiscountList != null && !fullDiscountList.isEmpty()) {
for (FullDiscount fullDiscount : fullDiscountList) {
resultMap.put(PromotionTypeEnum.FULL_DISCOUNT.name(), fullDiscount);
}
}
PintuanSearchParams pintuanSearchParams = new PintuanSearchParams();
pintuanSearchParams.setPromotionStatus(PromotionsStatusEnum.START.name());
//获取当前进行的拼团活动
List<Pintuan> pintuanList = pintuanService.listFindAll(pintuanSearchParams);
if (pintuanList != null && !pintuanList.isEmpty()) {
for (Pintuan pintuan : pintuanList) {
resultMap.put(PromotionTypeEnum.PINTUAN.name(), pintuan);
}
}
return resultMap;
public Map<String, List<PromotionGoods>> getCurrentPromotion() {
PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
searchParams.setPromotionStatus(PromotionsStatusEnum.START.name());
List<PromotionGoods> promotionGoods = promotionGoodsService.listFindAll(searchParams);
return promotionGoods.stream().collect(Collectors.groupingBy(PromotionGoods::getPromotionType));
}
/**

View File

@@ -71,9 +71,9 @@ public interface EsGoodsIndexService {
/**
* 删除索引
*
* @param goods 商品索引信息
* @param queryFields 查询条件 (key 为字段value为字段值)
*/
void deleteIndex(EsGoodsIndex goods);
void deleteIndex(Map<String, Object> queryFields);
/**
* 删除索引

View File

@@ -59,7 +59,6 @@ import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchPage;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.io.IOException;
import java.lang.reflect.Field;
@@ -287,13 +286,20 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
}
}
/**
* 删除索引
*
* @param queryFields 查询条件
*/
@Override
public void deleteIndex(EsGoodsIndex goods) {
if (ObjectUtils.isEmpty(goods)) {
//如果对象为空,则删除全量
goodsIndexRepository.deleteAll();
public void deleteIndex(Map<String, Object> queryFields) {
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
for (Map.Entry<String, Object> entry : queryFields.entrySet()) {
boolQueryBuilder.filter(QueryBuilders.termsQuery(entry.getKey(), entry.getValue()));
}
goodsIndexRepository.delete(goods);
queryBuilder.withQuery(boolQueryBuilder);
this.restTemplate.delete(queryBuilder.build(), EsGoodsIndex.class);
}
/**
@@ -316,7 +322,6 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
queryBuilder.withQuery(QueryBuilders.termsQuery("id", ids.toArray()));
this.restTemplate.delete(queryBuilder.build(), EsGoodsIndex.class);
}
@Override

View File

@@ -130,7 +130,11 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService {
*/
@Override
public void deleteHotWords(String keywords) {
cache.zRemove(CachePrefix.HOT_WORD.getPrefix(), keywords);
if (CharSequenceUtil.isEmpty(keywords)) {
cache.vagueDel(CachePrefix.HOT_WORD.getPrefix());
} else {
cache.zRemove(CachePrefix.HOT_WORD.getPrefix(), keywords);
}
}
@Override

View File

@@ -10,6 +10,10 @@ public enum GoodsTagsEnum {
* "生成商品索引"
*/
GENERATOR_GOODS_INDEX("生成商品索引"),
/**
* "生成店铺商品索引"
*/
GENERATOR_STORE_GOODS_INDEX("生成店铺商品索引"),
/**
* "更新商品索引"
*/
@@ -31,6 +35,10 @@ public enum GoodsTagsEnum {
* "重置商品索引"
*/
RESET_GOODS_INDEX("重置商品索引"),
/**
* "删除店铺商品索引"
*/
STORE_GOODS_DELETE("删除店铺商品索引"),
/**
* "删除商品"
*/