pref: 优化es生成全部商品索引,减少数据库操作
This commit is contained in:
parent
ca23b5ab33
commit
3b078cfd6b
@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
|||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 商品品牌业务层
|
* 商品品牌业务层
|
||||||
@ -40,6 +41,14 @@ public interface BrandService extends IService<Brand> {
|
|||||||
*/
|
*/
|
||||||
List<Brand> getBrandsByCategory(String categoryId);
|
List<Brand> getBrandsByCategory(String categoryId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据分类ID获取品牌列表
|
||||||
|
*
|
||||||
|
* @param categoryIds 分类ID
|
||||||
|
* @return 品牌列表
|
||||||
|
*/
|
||||||
|
List<Map<String, Object>> getBrandsMapsByCategory(List<String> categoryIds, String columns);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加品牌
|
* 添加品牌
|
||||||
*
|
*
|
||||||
|
@ -6,6 +6,7 @@ import cn.lili.modules.goods.entity.vos.CategoryVO;
|
|||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 商品分类业务层
|
* 商品分类业务层
|
||||||
@ -41,6 +42,14 @@ public interface CategoryService extends IService<Category> {
|
|||||||
*/
|
*/
|
||||||
List<Category> listByIdsOrderByLevel(List<String> ids);
|
List<Category> listByIdsOrderByLevel(List<String> ids);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据分类id集合获取所有分类根据层级排序
|
||||||
|
*
|
||||||
|
* @param ids 分类ID集合
|
||||||
|
* @return 商品分类列表
|
||||||
|
*/
|
||||||
|
List<Map<String, Object>> listMapsByIdsOrderByLevel(List<String> ids, String columns);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取分类树
|
* 获取分类树
|
||||||
*
|
*
|
||||||
|
@ -5,6 +5,7 @@ import cn.lili.modules.goods.entity.vos.StoreGoodsLabelVO;
|
|||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 店铺商品分类业务层
|
* 店铺商品分类业务层
|
||||||
@ -30,6 +31,14 @@ public interface StoreGoodsLabelService extends IService<StoreGoodsLabel> {
|
|||||||
*/
|
*/
|
||||||
List<StoreGoodsLabel> listByStoreIds(List<String> ids);
|
List<StoreGoodsLabel> listByStoreIds(List<String> ids);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据分类id集合获取所有店铺分类根据层级排序
|
||||||
|
*
|
||||||
|
* @param ids 商家ID
|
||||||
|
* @return 店铺分类列表
|
||||||
|
*/
|
||||||
|
List<Map<String, Object>> listMapsByStoreIds(List<String> ids, String columns);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加商品分类
|
* 添加商品分类
|
||||||
*
|
*
|
||||||
|
@ -23,6 +23,7 @@ import org.springframework.stereotype.Service;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
|
||||||
@ -68,6 +69,14 @@ public class BrandServiceImpl extends ServiceImpl<BrandMapper, Brand> implements
|
|||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Map<String, Object>> getBrandsMapsByCategory(List<String> categoryIds, String columns) {
|
||||||
|
QueryWrapper<Brand> queryWrapper = new QueryWrapper<>();
|
||||||
|
queryWrapper.select(columns);
|
||||||
|
queryWrapper.in("id", categoryIds);
|
||||||
|
return this.listMaps(queryWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean addBrand(BrandVO brandVO) {
|
public boolean addBrand(BrandVO brandVO) {
|
||||||
|
|
||||||
|
@ -25,10 +25,7 @@ import org.springframework.cache.annotation.Cacheable;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
|
||||||
@ -80,6 +77,14 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> i
|
|||||||
return this.list(new LambdaQueryWrapper<Category>().in(Category::getId, ids).orderByAsc(Category::getLevel));
|
return this.list(new LambdaQueryWrapper<Category>().in(Category::getId, ids).orderByAsc(Category::getLevel));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Map<String, Object>> listMapsByIdsOrderByLevel(List<String> ids, String columns) {
|
||||||
|
QueryWrapper<Category> queryWrapper = new QueryWrapper<>();
|
||||||
|
queryWrapper.select(columns);
|
||||||
|
queryWrapper.in("id", ids).orderByAsc("level");
|
||||||
|
return this.listMaps(queryWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<CategoryVO> categoryTree() {
|
public List<CategoryVO> categoryTree() {
|
||||||
List<CategoryVO> categoryVOList = (List<CategoryVO>) cache.get(CachePrefix.CATEGORY.getPrefix());
|
List<CategoryVO> categoryVOList = (List<CategoryVO>) cache.get(CachePrefix.CATEGORY.getPrefix());
|
||||||
|
@ -12,6 +12,7 @@ import cn.lili.modules.goods.entity.vos.StoreGoodsLabelVO;
|
|||||||
import cn.lili.modules.goods.mapper.StoreGoodsLabelMapper;
|
import cn.lili.modules.goods.mapper.StoreGoodsLabelMapper;
|
||||||
import cn.lili.modules.goods.service.StoreGoodsLabelService;
|
import cn.lili.modules.goods.service.StoreGoodsLabelService;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
@ -22,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 店铺商品分类业务层实现
|
* 店铺商品分类业务层实现
|
||||||
@ -83,6 +85,13 @@ public class StoreGoodsLabelServiceImpl extends ServiceImpl<StoreGoodsLabelMappe
|
|||||||
return this.list(new LambdaQueryWrapper<StoreGoodsLabel>().in(StoreGoodsLabel::getId, ids).orderByAsc(StoreGoodsLabel::getLevel));
|
return this.list(new LambdaQueryWrapper<StoreGoodsLabel>().in(StoreGoodsLabel::getId, ids).orderByAsc(StoreGoodsLabel::getLevel));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Map<String, Object>> listMapsByStoreIds(List<String> ids, String columns) {
|
||||||
|
QueryWrapper<StoreGoodsLabel> queryWrapper = new QueryWrapper<StoreGoodsLabel>().in("id", ids).orderByAsc("level");
|
||||||
|
queryWrapper.select(columns);
|
||||||
|
return this.listMaps(queryWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public StoreGoodsLabel addStoreGoodsLabel(StoreGoodsLabel storeGoodsLabel) {
|
public StoreGoodsLabel addStoreGoodsLabel(StoreGoodsLabel storeGoodsLabel) {
|
||||||
|
@ -4,6 +4,7 @@ import cn.lili.cache.CachePrefix;
|
|||||||
import cn.lili.common.enums.PromotionTypeEnum;
|
import cn.lili.common.enums.PromotionTypeEnum;
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import cn.lili.modules.goods.entity.dos.GoodsSku;
|
import cn.lili.modules.goods.entity.dos.GoodsSku;
|
||||||
|
import cn.lili.modules.goods.entity.dto.GoodsSkuDTO;
|
||||||
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
|
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
|
||||||
import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams;
|
import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
@ -43,6 +44,15 @@ public interface PromotionGoodsService extends IService<PromotionGoods> {
|
|||||||
*/
|
*/
|
||||||
List<PromotionGoods> findSkuValidPromotion(String skuId, String storeIds);
|
List<PromotionGoods> findSkuValidPromotion(String skuId, String storeIds);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取sku所有有效活动
|
||||||
|
*
|
||||||
|
* @param skus 商品skuId
|
||||||
|
* @return 促销商品集合
|
||||||
|
*/
|
||||||
|
List<PromotionGoods> findSkuValidPromotions(List<GoodsSkuDTO> skus);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页获取促销商品信息
|
* 分页获取促销商品信息
|
||||||
*
|
*
|
||||||
|
@ -35,4 +35,12 @@ public interface PromotionService {
|
|||||||
* @param goodsIdsJsonStr
|
* @param goodsIdsJsonStr
|
||||||
*/
|
*/
|
||||||
void removeByGoodsIds(String goodsIdsJsonStr);
|
void removeByGoodsIds(String goodsIdsJsonStr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据促销商品信息包装促销信息
|
||||||
|
*
|
||||||
|
* @param promotionGoodsList 促销商品信息
|
||||||
|
* @return 促销信息
|
||||||
|
*/
|
||||||
|
Map<String, Object> wrapperPromotionMapList(List<PromotionGoods> promotionGoodsList);
|
||||||
}
|
}
|
@ -7,6 +7,7 @@ import cn.hutool.json.JSONUtil;
|
|||||||
import cn.lili.common.enums.PromotionTypeEnum;
|
import cn.lili.common.enums.PromotionTypeEnum;
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import cn.lili.modules.goods.entity.dos.GoodsSku;
|
import cn.lili.modules.goods.entity.dos.GoodsSku;
|
||||||
|
import cn.lili.modules.goods.entity.dto.GoodsSkuDTO;
|
||||||
import cn.lili.modules.goods.entity.vos.GoodsVO;
|
import cn.lili.modules.goods.entity.vos.GoodsVO;
|
||||||
import cn.lili.modules.goods.service.GoodsService;
|
import cn.lili.modules.goods.service.GoodsService;
|
||||||
import cn.lili.modules.goods.service.GoodsSkuService;
|
import cn.lili.modules.goods.service.GoodsSkuService;
|
||||||
@ -35,6 +36,7 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 促销商品业务层实现
|
* 促销商品业务层实现
|
||||||
@ -87,6 +89,22 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
|
|||||||
return this.list(queryWrapper);
|
return this.list(queryWrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<PromotionGoods> findSkuValidPromotions(List<GoodsSkuDTO> skus) {
|
||||||
|
List<String> categories = skus.stream().map(GoodsSku::getCategoryPath).collect(Collectors.toList());
|
||||||
|
List<String> skuIds = skus.stream().map(GoodsSku::getId).collect(Collectors.toList());
|
||||||
|
List<String> categoriesPath = new ArrayList<>();
|
||||||
|
categories.forEach(i -> categoriesPath.addAll(Arrays.asList(i.split(","))));
|
||||||
|
QueryWrapper<PromotionGoods> queryWrapper = new QueryWrapper<>();
|
||||||
|
|
||||||
|
queryWrapper.and(i -> i.or(j -> j.in(SKU_ID_COLUMN, skuIds))
|
||||||
|
.or(n -> n.eq("scope_type", PromotionsScopeTypeEnum.ALL.name()))
|
||||||
|
.or(n -> n.and(k -> k.eq("scope_type", PromotionsScopeTypeEnum.PORTION_GOODS_CATEGORY.name())
|
||||||
|
.and(l -> l.in("scope_id", categoriesPath)))));
|
||||||
|
queryWrapper.and(i -> i.or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START)).or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.NEW)));
|
||||||
|
return this.list(queryWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IPage<PromotionGoods> pageFindAll(PromotionGoodsSearchParams searchParams, PageVO pageVo) {
|
public IPage<PromotionGoods> pageFindAll(PromotionGoodsSearchParams searchParams, PageVO pageVo) {
|
||||||
return this.page(PageUtil.initPage(pageVo), searchParams.queryWrapper());
|
return this.page(PageUtil.initPage(pageVo), searchParams.queryWrapper());
|
||||||
|
@ -89,8 +89,19 @@ public class PromotionServiceImpl implements PromotionService {
|
|||||||
*/
|
*/
|
||||||
public Map<String, Object> getGoodsSkuPromotionMap(String storeId, String goodsSkuId) {
|
public Map<String, Object> getGoodsSkuPromotionMap(String storeId, String goodsSkuId) {
|
||||||
String storeIds = storeId + "," + PromotionTools.PLATFORM_ID;
|
String storeIds = storeId + "," + PromotionTools.PLATFORM_ID;
|
||||||
Map<String, Object> promotionMap = new HashMap<>();
|
|
||||||
List<PromotionGoods> promotionGoodsList = promotionGoodsService.findSkuValidPromotion(goodsSkuId, storeIds);
|
List<PromotionGoods> promotionGoodsList = promotionGoodsService.findSkuValidPromotion(goodsSkuId, storeIds);
|
||||||
|
return wrapperPromotionMapList(promotionGoodsList);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeByGoodsIds(String goodsIdsJsonStr) {
|
||||||
|
List<String> goodsIds = JSONUtil.toList(goodsIdsJsonStr, String.class);
|
||||||
|
promotionGoodsService.deletePromotionGoodsByGoods(goodsIds);
|
||||||
|
kanjiaActivityGoodsService.deleteByGoodsIds(goodsIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Object> wrapperPromotionMapList(List<PromotionGoods> promotionGoodsList) {
|
||||||
|
Map<String, Object> promotionMap = new HashMap<>();
|
||||||
for (PromotionGoods promotionGoods : promotionGoodsList) {
|
for (PromotionGoods promotionGoods : promotionGoodsList) {
|
||||||
String esPromotionKey = promotionGoods.getPromotionType() + "-" + promotionGoods.getPromotionId();
|
String esPromotionKey = promotionGoods.getPromotionType() + "-" + promotionGoods.getPromotionId();
|
||||||
switch (PromotionTypeEnum.valueOf(promotionGoods.getPromotionType())) {
|
switch (PromotionTypeEnum.valueOf(promotionGoods.getPromotionType())) {
|
||||||
@ -120,13 +131,6 @@ public class PromotionServiceImpl implements PromotionService {
|
|||||||
return promotionMap;
|
return promotionMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void removeByGoodsIds(String goodsIdsJsonStr) {
|
|
||||||
List<String> goodsIds = JSONUtil.toList(goodsIdsJsonStr, String.class);
|
|
||||||
promotionGoodsService.deletePromotionGoodsByGoods(goodsIds);
|
|
||||||
kanjiaActivityGoodsService.deleteByGoodsIds(goodsIds);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void getGoodsCurrentSeckill(String esPromotionKey, PromotionGoods promotionGoods, Map<String, Object> promotionMap) {
|
private void getGoodsCurrentSeckill(String esPromotionKey, PromotionGoods promotionGoods, Map<String, Object> promotionMap) {
|
||||||
Seckill seckill = seckillService.getById(promotionGoods.getPromotionId());
|
Seckill seckill = seckillService.getById(promotionGoods.getPromotionId());
|
||||||
SeckillSearchParams searchParams = new SeckillSearchParams();
|
SeckillSearchParams searchParams = new SeckillSearchParams();
|
||||||
|
@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil;
|
|||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import cn.hutool.core.text.CharSequenceUtil;
|
import cn.hutool.core.text.CharSequenceUtil;
|
||||||
import cn.hutool.core.thread.ThreadUtil;
|
import cn.hutool.core.thread.ThreadUtil;
|
||||||
import cn.hutool.core.util.ArrayUtil;
|
|
||||||
import cn.hutool.core.util.ReflectUtil;
|
import cn.hutool.core.util.ReflectUtil;
|
||||||
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONObject;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
@ -19,10 +18,7 @@ import cn.lili.common.vo.PageVO;
|
|||||||
import cn.lili.elasticsearch.BaseElasticsearchService;
|
import cn.lili.elasticsearch.BaseElasticsearchService;
|
||||||
import cn.lili.elasticsearch.EsSuffix;
|
import cn.lili.elasticsearch.EsSuffix;
|
||||||
import cn.lili.elasticsearch.config.ElasticsearchProperties;
|
import cn.lili.elasticsearch.config.ElasticsearchProperties;
|
||||||
import cn.lili.modules.goods.entity.dos.Brand;
|
|
||||||
import cn.lili.modules.goods.entity.dos.Category;
|
|
||||||
import cn.lili.modules.goods.entity.dos.GoodsSku;
|
import cn.lili.modules.goods.entity.dos.GoodsSku;
|
||||||
import cn.lili.modules.goods.entity.dos.StoreGoodsLabel;
|
|
||||||
import cn.lili.modules.goods.entity.dto.GoodsParamsDTO;
|
import cn.lili.modules.goods.entity.dto.GoodsParamsDTO;
|
||||||
import cn.lili.modules.goods.entity.dto.GoodsSkuDTO;
|
import cn.lili.modules.goods.entity.dto.GoodsSkuDTO;
|
||||||
import cn.lili.modules.goods.entity.enums.GoodsAuthEnum;
|
import cn.lili.modules.goods.entity.enums.GoodsAuthEnum;
|
||||||
@ -33,7 +29,9 @@ import cn.lili.modules.goods.service.GoodsSkuService;
|
|||||||
import cn.lili.modules.goods.service.StoreGoodsLabelService;
|
import cn.lili.modules.goods.service.StoreGoodsLabelService;
|
||||||
import cn.lili.modules.promotion.entity.dos.BasePromotions;
|
import cn.lili.modules.promotion.entity.dos.BasePromotions;
|
||||||
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
|
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
|
||||||
|
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
|
||||||
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
|
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
|
||||||
|
import cn.lili.modules.promotion.service.PromotionGoodsService;
|
||||||
import cn.lili.modules.promotion.service.PromotionService;
|
import cn.lili.modules.promotion.service.PromotionService;
|
||||||
import cn.lili.modules.promotion.tools.PromotionTools;
|
import cn.lili.modules.promotion.tools.PromotionTools;
|
||||||
import cn.lili.modules.search.entity.dos.CustomWords;
|
import cn.lili.modules.search.entity.dos.CustomWords;
|
||||||
@ -101,6 +99,9 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
|
|||||||
@Autowired
|
@Autowired
|
||||||
private PromotionService promotionService;
|
private PromotionService promotionService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private PromotionGoodsService promotionGoodsService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private CustomWordsService customWordsService;
|
private CustomWordsService customWordsService;
|
||||||
|
|
||||||
@ -129,6 +130,18 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
|
|||||||
@Autowired
|
@Autowired
|
||||||
private ElasticsearchOperations restTemplate;
|
private ElasticsearchOperations restTemplate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 去除 重复元素
|
||||||
|
*
|
||||||
|
* @param list
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static void removeDuplicate(List<String> list) {
|
||||||
|
HashSet<String> h = new HashSet<>(list);
|
||||||
|
list.clear();
|
||||||
|
list.addAll(h);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init() {
|
public void init() {
|
||||||
//获取索引任务标识
|
//获取索引任务标识
|
||||||
@ -173,19 +186,66 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
|
|||||||
|
|
||||||
for (int i = 1; ; i++) {
|
for (int i = 1; ; i++) {
|
||||||
List<EsGoodsIndex> esGoodsIndices = new ArrayList<>();
|
List<EsGoodsIndex> esGoodsIndices = new ArrayList<>();
|
||||||
Page<GoodsSkuDTO> skuPage = new Page<>(i, 100);
|
Page<GoodsSkuDTO> skuPage = new Page<>(i, 2000);
|
||||||
IPage<GoodsSkuDTO> skuIPage = goodsSkuService.getGoodsSkuDTOByPage(skuPage, skuQueryWrapper);
|
IPage<GoodsSkuDTO> skuIPage = goodsSkuService.getGoodsSkuDTOByPage(skuPage, skuQueryWrapper);
|
||||||
|
|
||||||
if (skuIPage == null || CollUtil.isEmpty(skuIPage.getRecords())) {
|
if (skuIPage == null || CollUtil.isEmpty(skuIPage.getRecords())) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
List<PromotionGoods> skuValidPromotions = promotionGoodsService.findSkuValidPromotions(skuIPage.getRecords());
|
||||||
|
|
||||||
|
List<String> brandIds = new ArrayList<>();
|
||||||
|
|
||||||
|
List<String> categoryPaths = new ArrayList<>();
|
||||||
|
|
||||||
|
List<String> storeCategoryPaths = new ArrayList<>();
|
||||||
|
|
||||||
|
for (GoodsSkuDTO goodsSkuDTO : skuIPage.getRecords()) {
|
||||||
|
if (CharSequenceUtil.isNotEmpty(goodsSkuDTO.getBrandId())) {
|
||||||
|
brandIds.add(goodsSkuDTO.getBrandId());
|
||||||
|
}
|
||||||
|
if (CharSequenceUtil.isNotEmpty(goodsSkuDTO.getStoreCategoryPath())) {
|
||||||
|
storeCategoryPaths.addAll(Arrays.asList(goodsSkuDTO.getStoreCategoryPath().split(",")));
|
||||||
|
}
|
||||||
|
if (CharSequenceUtil.isNotEmpty((goodsSkuDTO.getCategoryPath()))) {
|
||||||
|
categoryPaths.addAll(Arrays.asList(goodsSkuDTO.getCategoryPath().split(",")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Map<String, Object>> brandList = new ArrayList<>();
|
||||||
|
if (CollUtil.isNotEmpty(brandIds)) {
|
||||||
|
brandList = this.brandService.getBrandsMapsByCategory(brandIds, "id,name,logo");
|
||||||
|
}
|
||||||
|
List<Map<String, Object>> categoryList = new ArrayList<>();
|
||||||
|
if (CollUtil.isNotEmpty(categoryList)) {
|
||||||
|
categoryList = this.categoryService.listMapsByIdsOrderByLevel(categoryPaths, "id,name");
|
||||||
|
}
|
||||||
|
List<Map<String, Object>> storeCategoryList = new ArrayList<>();
|
||||||
|
if (CollUtil.isNotEmpty(storeCategoryList)) {
|
||||||
|
storeCategoryList = this.storeGoodsLabelService.listMapsByStoreIds(storeCategoryPaths, "id,label_name");
|
||||||
|
}
|
||||||
|
|
||||||
for (GoodsSkuDTO goodsSku : skuIPage.getRecords()) {
|
for (GoodsSkuDTO goodsSku : skuIPage.getRecords()) {
|
||||||
int skuSource = 100;
|
int skuSource = 100;
|
||||||
EsGoodsIndex esGoodsIndex = wrapperEsGoodsIndex(goodsSku);
|
EsGoodsIndex esGoodsIndex = wrapperEsGoodsIndex(goodsSku, brandList, categoryList, storeCategoryList);
|
||||||
long count = esGoodsIndices.stream().filter(j -> j.getGoodsId().equals(esGoodsIndex.getGoodsId())).count();
|
long count = esGoodsIndices.stream().filter(j -> j.getGoodsId().equals(esGoodsIndex.getGoodsId())).count();
|
||||||
if (count >= 1) {
|
if (count >= 1) {
|
||||||
skuSource -= count;
|
skuSource -= count;
|
||||||
}
|
}
|
||||||
esGoodsIndex.setSkuSource(skuSource);
|
esGoodsIndex.setSkuSource(skuSource);
|
||||||
|
|
||||||
|
|
||||||
|
//设置促销信息
|
||||||
|
List<PromotionGoods> promotionGoods = skuValidPromotions.stream()
|
||||||
|
.filter(j ->
|
||||||
|
(CharSequenceUtil.isNotEmpty(j.getSkuId()) && j.getSkuId().equals(goodsSku.getId())) ||
|
||||||
|
j.getScopeType().equals(PromotionsScopeTypeEnum.ALL.name()) ||
|
||||||
|
(j.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS_CATEGORY.name()) && j.getScopeId().contains(goodsSku.getCategoryPath())))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
if (CollUtil.isNotEmpty(promotionGoods)) {
|
||||||
|
esGoodsIndex.setPromotionMapJson(JSONUtil.toJsonStr(promotionService.wrapperPromotionMapList(promotionGoods)));
|
||||||
|
}
|
||||||
|
|
||||||
esGoodsIndices.add(esGoodsIndex);
|
esGoodsIndices.add(esGoodsIndex);
|
||||||
//库存锁是在redis做的,所以生成索引,同时更新一下redis中的库存数量
|
//库存锁是在redis做的,所以生成索引,同时更新一下redis中的库存数量
|
||||||
cache.put(GoodsSkuService.getStockCacheKey(goodsSku.getId()), goodsSku.getQuantity());
|
cache.put(GoodsSkuService.getStockCacheKey(goodsSku.getId()), goodsSku.getQuantity());
|
||||||
@ -273,7 +333,6 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
|
|||||||
goodsIndexRepository.save(goods);
|
goodsIndexRepository.save(goods);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 商品分词
|
* 商品分词
|
||||||
*
|
*
|
||||||
@ -309,18 +368,6 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 去除 重复元素
|
|
||||||
*
|
|
||||||
* @param list
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public static void removeDuplicate(List<String> list) {
|
|
||||||
HashSet<String> h = new HashSet<>(list);
|
|
||||||
list.clear();
|
|
||||||
list.addAll(h);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新商品索引的的部分属性(只填写更新的字段,不需要更新的字段不要填写)
|
* 更新商品索引的的部分属性(只填写更新的字段,不需要更新的字段不要填写)
|
||||||
*
|
*
|
||||||
@ -853,7 +900,7 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
|
|||||||
return elasticsearchProperties.getIndexPrefix() + "_" + EsSuffix.GOODS_INDEX_NAME;
|
return elasticsearchProperties.getIndexPrefix() + "_" + EsSuffix.GOODS_INDEX_NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
private EsGoodsIndex wrapperEsGoodsIndex(GoodsSkuDTO goodsSku) {
|
private EsGoodsIndex wrapperEsGoodsIndex(GoodsSkuDTO goodsSku, List<Map<String, Object>> brandList, List<Map<String, Object>> categoryList, List<Map<String, Object>> storeCategoryList) {
|
||||||
EsGoodsIndex index = new EsGoodsIndex(goodsSku);
|
EsGoodsIndex index = new EsGoodsIndex(goodsSku);
|
||||||
|
|
||||||
//商品参数索引
|
//商品参数索引
|
||||||
@ -862,28 +909,27 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
|
|||||||
index = new EsGoodsIndex(goodsSku, goodsParamDTOS);
|
index = new EsGoodsIndex(goodsSku, goodsParamDTOS);
|
||||||
}
|
}
|
||||||
//商品分类索引
|
//商品分类索引
|
||||||
if (goodsSku.getCategoryPath() != null) {
|
if (CollUtil.isNotEmpty(categoryList) && CharSequenceUtil.isNotEmpty(goodsSku.getCategoryPath())) {
|
||||||
List<Category> categories = categoryService.listByIdsOrderByLevel(Arrays.asList(goodsSku.getCategoryPath().split(",")));
|
StringBuilder categoryNamePath = new StringBuilder();
|
||||||
if (!categories.isEmpty()) {
|
categoryList.stream().filter(o -> goodsSku.getCategoryPath().contains(o.get("id").toString())).forEach(p -> categoryNamePath.append(p.get("name")).append(","));
|
||||||
index.setCategoryNamePath(ArrayUtil.join(categories.stream().map(Category::getName).toArray(), ","));
|
categoryNamePath.deleteCharAt(categoryNamePath.length() - 1);
|
||||||
}
|
index.setCategoryNamePath(categoryNamePath.toString());
|
||||||
}
|
}
|
||||||
//商品品牌索引
|
//商品品牌索引
|
||||||
Brand brand = brandService.getById(goodsSku.getBrandId());
|
if (CollUtil.isNotEmpty(brandList) && CharSequenceUtil.isNotEmpty(goodsSku.getBrandId())) {
|
||||||
if (brand != null) {
|
Optional<Map<String, Object>> brandInfo = brandList.stream().filter(p -> p.get("id").equals(goodsSku.getBrandId())).findFirst();
|
||||||
index.setBrandName(brand.getName());
|
if (brandInfo.isPresent()) {
|
||||||
index.setBrandUrl(brand.getLogo());
|
index.setBrandName(brandInfo.get().get("name").toString());
|
||||||
}
|
index.setBrandUrl(brandInfo.get().get("logo").toString());
|
||||||
//店铺分类索引
|
|
||||||
if (goodsSku.getStoreCategoryPath() != null && CharSequenceUtil.isNotEmpty(goodsSku.getStoreCategoryPath())) {
|
|
||||||
List<StoreGoodsLabel> storeGoodsLabels = storeGoodsLabelService.listByStoreIds(Arrays.asList(goodsSku.getStoreCategoryPath().split(",")));
|
|
||||||
if (!storeGoodsLabels.isEmpty()) {
|
|
||||||
index.setStoreCategoryNamePath(ArrayUtil.join(storeGoodsLabels.stream().map(StoreGoodsLabel::getLabelName).toArray(), ","));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//促销索引
|
//店铺分类索引
|
||||||
Map<String, Object> goodsCurrentPromotionMap = promotionService.getGoodsSkuPromotionMap(index.getStoreId(), index.getId());
|
if (CollUtil.isNotEmpty(storeCategoryList) && CharSequenceUtil.isNotEmpty(goodsSku.getStoreCategoryPath())) {
|
||||||
index.setPromotionMapJson(JSONUtil.toJsonStr(goodsCurrentPromotionMap));
|
StringBuilder storeCategoryNamePath = new StringBuilder();
|
||||||
|
storeCategoryList.stream().filter(o -> goodsSku.getStoreCategoryPath().contains(o.get("id").toString())).forEach(p -> storeCategoryNamePath.append(p.get("label_name").toString()).append(","));
|
||||||
|
storeCategoryNamePath.deleteCharAt(storeCategoryNamePath.length() - 1);
|
||||||
|
index.setStoreCategoryNamePath(storeCategoryNamePath.toString());
|
||||||
|
}
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -87,14 +87,6 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService {
|
|||||||
NativeSearchQuery searchQuery = searchQueryBuilder.build();
|
NativeSearchQuery searchQuery = searchQueryBuilder.build();
|
||||||
log.debug("searchGoods DSL:{}", searchQuery.getQuery());
|
log.debug("searchGoods DSL:{}", searchQuery.getQuery());
|
||||||
SearchHits<EsGoodsIndex> search = restTemplate.search(searchQuery, EsGoodsIndex.class);
|
SearchHits<EsGoodsIndex> search = restTemplate.search(searchQuery, EsGoodsIndex.class);
|
||||||
// for (int i = 0; i < search.getSearchHits().size() ; i++){
|
|
||||||
// if (search.getSearchHits().get(i).getContent().getSmall().contains("fuluapiossproductnew.oss-cn-hangzhou.aliyuncs.com")){
|
|
||||||
// search.getSearchHits().get(i).getContent().setSmall(search.getSearchHits().get(i).getContent().getSmall().replace("?x-oss-process=style/200X200", ""));
|
|
||||||
// }
|
|
||||||
// if (search.getSearchHits().get(i).getContent().getThumbnail().contains("fuluapiossproductnew.oss-cn-hangzhou.aliyuncs.com")){
|
|
||||||
// search.getSearchHits().get(i).getContent().setThumbnail(search.getSearchHits().get(i).getContent().getThumbnail().replace("?x-oss-process=style/400X400", ""));
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
return SearchHitSupport.searchPageFor(search, searchQuery.getPageable());
|
return SearchHitSupport.searchPageFor(search, searchQuery.getPageable());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -575,9 +567,9 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService {
|
|||||||
filterFunctionBuilders.add(skuNoBuilder);
|
filterFunctionBuilders.add(skuNoBuilder);
|
||||||
|
|
||||||
// 修改分数算法为无,数字最大分数越高
|
// 修改分数算法为无,数字最大分数越高
|
||||||
FieldValueFactorFunctionBuilder buyCountScore = ScoreFunctionBuilders.fieldValueFactorFunction("buyCount").modifier(FieldValueFactorFunction.Modifier.NONE).setWeight(3);
|
// FieldValueFactorFunctionBuilder buyCountScore = ScoreFunctionBuilders.fieldValueFactorFunction("buyCount").modifier(FieldValueFactorFunction.Modifier.NONE).setWeight(10);
|
||||||
FunctionScoreQueryBuilder.FilterFunctionBuilder buyCountBuilder = new FunctionScoreQueryBuilder.FilterFunctionBuilder(buyCountScore);
|
// FunctionScoreQueryBuilder.FilterFunctionBuilder buyCountBuilder = new FunctionScoreQueryBuilder.FilterFunctionBuilder(buyCountScore);
|
||||||
filterFunctionBuilders.add(buyCountBuilder);
|
// filterFunctionBuilders.add(buyCountBuilder);
|
||||||
return filterFunctionBuilders;
|
return filterFunctionBuilders;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user