From d3fdeef0c3677f71b33f61cefcde666c8485a511 Mon Sep 17 00:00:00 2001 From: paulGao Date: Wed, 19 May 2021 22:16:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=95=86=E5=93=81=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E5=A4=9A=E9=80=89=E9=97=AE=E9=A2=98=E5=92=8C=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1=E5=8F=96=E6=B6=88=E8=BF=87=E6=9C=9F?= =?UTF-8?q?=E4=BF=83=E9=94=80=E6=B4=BB=E5=8A=A8=E6=97=B6=EF=BC=8C=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E5=88=A0=E9=99=A4es=E7=B4=A2=E5=BC=95=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E8=BF=87=E6=9C=9F=E4=BF=A1=E6=81=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../promotion/PromotionEverydayExecute.java | 7 ++++ .../serviceimpl/GoodsSkuServiceImpl.java | 2 - .../search/service/EsGoodsIndexService.java | 6 +++ .../serviceimpl/EsGoodsIndexServiceImpl.java | 37 ++++++++++++++++++- .../serviceimpl/EsGoodsSearchServiceImpl.java | 29 ++++++++++++--- 5 files changed, 72 insertions(+), 9 deletions(-) diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java index f0e67719..946931a3 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java @@ -8,6 +8,7 @@ import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.vos.CouponVO; import cn.lili.modules.promotion.entity.vos.PintuanVO; import cn.lili.modules.promotion.service.*; +import cn.lili.modules.search.service.EsGoodsIndexService; import cn.lili.timetask.handler.EveryDayExecute; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; @@ -34,6 +35,9 @@ public class PromotionEverydayExecute implements EveryDayExecute { //Mongo @Autowired private MongoTemplate mongoTemplate; + //es + @Autowired + private EsGoodsIndexService esGoodsIndexService; //满额活动 @Autowired private FullDiscountService fullDiscountService; @@ -74,6 +78,7 @@ public class PromotionEverydayExecute implements EveryDayExecute { if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) { for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) { promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name()); + esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId()); } } mongoTemplate.save(vo); @@ -92,6 +97,7 @@ public class PromotionEverydayExecute implements EveryDayExecute { if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) { for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) { promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name()); + esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId()); } } mongoTemplate.save(vo); @@ -110,6 +116,7 @@ public class PromotionEverydayExecute implements EveryDayExecute { if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) { for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) { promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name()); + esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId()); } } mongoTemplate.save(vo); diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java index 6d63599b..311c14ea 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java @@ -438,8 +438,6 @@ public class GoodsSkuServiceImpl extends ServiceImpl i goodsIndexService.addIndex(goodsIndex); } else if (goodsSku.getQuantity() > 0 && esGoodsOld != null) { goodsIndexService.updateIndex(goodsIndex); - } else if (goodsSku.getQuantity() <= 0 && esGoodsOld != null) { - goodsIndexService.deleteIndexById(goodsSku.getId()); } //删除sku缓存 cache.remove(GoodsSkuService.getCacheKeys(goodsSku.getId())); diff --git a/framework/src/main/java/cn/lili/modules/search/service/EsGoodsIndexService.java b/framework/src/main/java/cn/lili/modules/search/service/EsGoodsIndexService.java index 9ac0ab64..6f737c1d 100644 --- a/framework/src/main/java/cn/lili/modules/search/service/EsGoodsIndexService.java +++ b/framework/src/main/java/cn/lili/modules/search/service/EsGoodsIndexService.java @@ -105,6 +105,12 @@ public interface EsGoodsIndexService { */ void deleteEsGoodsPromotionIndexByList(List skuIds, PromotionTypeEnum promotionType); + /** + * 删除索引中指定的促销活动id的促销活动 + * @param skuId 商品skuId + * @param promotionId 促销活动Id + */ + void deleteEsGoodsPromotionByPromotionId(String skuId, String promotionId); /** * 清除所以商品索引的无效促销活动 */ diff --git a/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsIndexServiceImpl.java b/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsIndexServiceImpl.java index 719e5a75..26c3b1ba 100644 --- a/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsIndexServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsIndexServiceImpl.java @@ -203,7 +203,7 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements @Override public void updateEsGoodsIndexAllByList(BasePromotion promotion, String key) { List goodsIndices; - //如果storeid不为空,则表示是店铺活动 + //如果storeId不为空,则表示是店铺活动 if (promotion.getStoreId() != null) { EsGoodsSearchDTO searchDTO = new EsGoodsSearchDTO(); searchDTO.setStoreId(promotion.getStoreId()); @@ -243,6 +243,41 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements } } + @Override + public void deleteEsGoodsPromotionByPromotionId(String skuId, String promotionId) { + if (skuId != null) { + EsGoodsIndex goodsIndex = findById(skuId); + //商品索引不为空 + if (goodsIndex != null) { + this.removePromotionByPromotionId(goodsIndex, promotionId); + } else { + log.error("更新索引商品促销信息失败!skuId 为 【{}】的索引不存在!", skuId); + } + } else { + for (EsGoodsIndex goodsIndex : this.goodsIndexRepository.findAll()) { + this.removePromotionByPromotionId(goodsIndex, promotionId); + } + } + + } + + /** + * 从索引中删除指定促销活动id的促销活动 + * + * @param goodsIndex 索引 + * @param promotionId 促销活动id + */ + private void removePromotionByPromotionId(EsGoodsIndex goodsIndex, String promotionId) { + Map promotionMap = goodsIndex.getPromotionMap(); + if (promotionMap != null && !promotionMap.isEmpty()) { + // 如果存在同类型促销活动删除 + List collect = promotionMap.keySet().stream().filter(i -> i.split("-")[1].equals(promotionId)).collect(Collectors.toList()); + collect.forEach(promotionMap::remove); + goodsIndex.setPromotionMap(promotionMap); + updateIndex(goodsIndex); + } + } + /** * 清除所有商品索引的无效促销活动 */ diff --git a/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java b/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java index 1542152a..593073e2 100644 --- a/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java @@ -22,6 +22,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.lucene.search.join.ScoreMode; import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery; import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.NestedQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder; import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders; @@ -336,6 +337,7 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService { String[] props = searchDTO.getProp().split("@"); List nameList = new ArrayList<>(); List valueList = new ArrayList<>(); + Map> valueMap = new HashMap<>(); for (String prop : props) { String[] propValues = prop.split("_"); String name = propValues[0]; @@ -346,14 +348,29 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService { if (!valueList.contains(value)) { valueList.add(value); } - if (isAggregation) { - filterBuilder.must(QueryBuilders.nestedQuery(ATTR_PATH, QueryBuilders.termQuery(ATTR_NAME, name), ScoreMode.None)); - filterBuilder.should(QueryBuilders.nestedQuery(ATTR_PATH, QueryBuilders.termsQuery(ATTR_VALUE, value), ScoreMode.None)); + // 将同一规格名下的规格值分组 + if (!valueMap.containsKey(name)) { + List values = new ArrayList<>(); + values.add(value); + valueMap.put(name, values); } else { - queryBuilder.must(QueryBuilders.nestedQuery(ATTR_PATH, QueryBuilders.termQuery(ATTR_NAME, name), ScoreMode.None)); - queryBuilder.must(QueryBuilders.nestedQuery(ATTR_PATH, QueryBuilders.wildcardQuery(ATTR_VALUE, "*" + value + "*"), ScoreMode.None)); + valueMap.get(name).add(value); } - + } + BoolQueryBuilder usedQueryBuilder; + if (isAggregation) { + usedQueryBuilder = filterBuilder; + } else { + usedQueryBuilder = queryBuilder; + } + // 遍历所有的规格 + for (Map.Entry> entry : valueMap.entrySet()) { + usedQueryBuilder.must(QueryBuilders.nestedQuery(ATTR_PATH, QueryBuilders.wildcardQuery(ATTR_NAME, "*" + entry.getKey() + "*"), ScoreMode.None)); + BoolQueryBuilder shouldBuilder = QueryBuilders.boolQuery(); + for (String s : entry.getValue()) { + shouldBuilder.should(QueryBuilders.nestedQuery(ATTR_PATH, QueryBuilders.wildcardQuery(ATTR_VALUE, "*" + s + "*"), ScoreMode.None)); + } + usedQueryBuilder.must(shouldBuilder); } searchDTO.getNotShowCol().put(ATTR_NAME_KEY, nameList); searchDTO.getNotShowCol().put(ATTR_VALUE_KEY, valueList);