|
|
@@ -4,6 +4,11 @@ import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import co.elastic.clients.elasticsearch._types.FieldValue;
|
|
|
+import co.elastic.clients.elasticsearch._types.aggregations.Aggregate;
|
|
|
+import co.elastic.clients.elasticsearch._types.aggregations.Buckets;
|
|
|
+import co.elastic.clients.elasticsearch._types.aggregations.LongTermsAggregate;
|
|
|
+import co.elastic.clients.elasticsearch._types.aggregations.LongTermsBucket;
|
|
|
+import co.elastic.clients.elasticsearch.core.SearchResponse;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
@@ -24,8 +29,7 @@ import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
|
|
|
import org.dromara.external.api.service.RemoteExternalProductService;
|
|
|
import org.dromara.product.api.domain.ProductVo;
|
|
|
import org.dromara.product.domain.*;
|
|
|
-import org.dromara.product.domain.bo.PcProductBo;
|
|
|
-import org.dromara.product.domain.bo.ProductCategoryBo;
|
|
|
+import org.dromara.product.domain.bo.*;
|
|
|
import org.dromara.product.domain.vo.*;
|
|
|
import org.dromara.product.esmapper.ProductEsMapper;
|
|
|
import org.dromara.product.mapper.*;
|
|
|
@@ -34,8 +38,6 @@ import org.springframework.boot.ApplicationArguments;
|
|
|
import org.springframework.boot.ApplicationRunner;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
-import org.dromara.product.domain.bo.ProductBaseBo;
|
|
|
-import org.dromara.product.domain.bo.SiteProductBo;
|
|
|
import org.dromara.product.domain.ProductBase;
|
|
|
import org.dromara.product.domain.ProductExtend;
|
|
|
import org.dromara.product.domain.ProductClassification;
|
|
|
@@ -111,6 +113,8 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
private final ProductRecommendLinkMapper productRecommendLinkMapper;
|
|
|
//平台装修楼层商品
|
|
|
private final ProductDecorationFloorLinkMapper decorationFloorLinkMapper;
|
|
|
+ //协议商品
|
|
|
+ private final ProtocolProductsMapper protocolProductsMapper;
|
|
|
|
|
|
private final ProductPhotosMapper photosMapper;
|
|
|
|
|
|
@@ -122,11 +126,25 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
|
|
|
private final ProductShoppingCartMapper productShoppingCartMapper;
|
|
|
|
|
|
+ private final ProductGiftCategoryLinkMapper productGiftCategoryLinkMapper;
|
|
|
+
|
|
|
+ private final ProductGiftFloorLinkMapper productGiftFloorLinkMapper;
|
|
|
+
|
|
|
+ private final ProcurementProgramProductMapper procurementProgramProductMapper;
|
|
|
+
|
|
|
+ private final ProductProgramLinkMapper productProgramLinkMapper;
|
|
|
+
|
|
|
+ private final ProductGiftCategoryMapper productGiftCategoryMapper;
|
|
|
+
|
|
|
+ private final ProductSpecialLinkMapper productSpecialLinkMapper;
|
|
|
+
|
|
|
+
|
|
|
private final ProductEsMapper esMapper;
|
|
|
|
|
|
@DubboReference
|
|
|
private RemoteExternalProductService externalProductService;
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
* Callback used to run the bean.
|
|
|
* 优化说明:针对200万级别数据,采用分批流式处理,避免OOM
|
|
|
@@ -150,9 +168,9 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
if (totalInEs < totalInDb) {
|
|
|
log.info("ES 数据不完整,开始同步...");
|
|
|
|
|
|
- // 优化:使用分页流式处理,每次只加载1000条到内存
|
|
|
+ // 使用LIMIT分页查询,避免一次性加载所有数据
|
|
|
int pageSize = 1000;
|
|
|
- int pageNum = 1;
|
|
|
+ long offset = 0;
|
|
|
long totalSynced = 0;
|
|
|
|
|
|
// 使用线程池处理批量插入
|
|
|
@@ -161,24 +179,23 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
|
|
|
try {
|
|
|
while (true) {
|
|
|
- // 分页查询,避免一次性加载所有数据
|
|
|
- Page<ProductBase> page = new Page<>(pageNum, pageSize);
|
|
|
- Page<ProductBaseVo> resultPage = baseMapper.selectVoPage(page, Wrappers.emptyWrapper());
|
|
|
-
|
|
|
- if (resultPage.getRecords().isEmpty()) {
|
|
|
+ // 使用LIMIT OFFSET进行分页查询
|
|
|
+ QueryWrapper<ProductBase> queryWrapper = Wrappers.query();
|
|
|
+ queryWrapper.last("LIMIT " + pageSize + " OFFSET " + offset);
|
|
|
+ List<ProductBaseVo> currentBatch = baseMapper.selectAllList(queryWrapper);
|
|
|
+ if (CollUtil.isEmpty(currentBatch)) {
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- List<ProductBaseVo> currentBatch = resultPage.getRecords();
|
|
|
-
|
|
|
// 异步插入ES
|
|
|
- int finalPageNum = pageNum;
|
|
|
+ long finalOffset = offset;
|
|
|
+ int batchNumber = (int) (offset / pageSize) + 1;
|
|
|
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
|
|
|
try {
|
|
|
esMapper.insertBatch(currentBatch);
|
|
|
- log.info("成功同步第 {} 页,共 {} 条记录", finalPageNum, currentBatch.size());
|
|
|
+ log.info("成功同步第 {} 批(OFFSET: {}),共 {} 条记录", batchNumber, finalOffset, currentBatch.size());
|
|
|
} catch (Exception e) {
|
|
|
- log.error("同步第 {} 页数据失败: {}", finalPageNum, e.getMessage(), e);
|
|
|
+ log.error("同步第 {} 批数据失败: {}", batchNumber, e.getMessage(), e);
|
|
|
throw new RuntimeException(e);
|
|
|
}
|
|
|
}, executorService);
|
|
|
@@ -189,12 +206,12 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
totalSynced += currentBatch.size();
|
|
|
log.info("已同步进度: {}/{}", totalSynced, totalInDb);
|
|
|
|
|
|
- // 如果是最后一页,退出循环
|
|
|
- if (resultPage.getRecords().size() < pageSize || !resultPage.hasNext()) {
|
|
|
+ // 如果当前批次数据少于pageSize,说明是最后一批
|
|
|
+ if (currentBatch.size() < pageSize) {
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- pageNum++;
|
|
|
+ offset += pageSize;
|
|
|
|
|
|
// 添加短暂延迟,避免对数据库和ES造成过大压力
|
|
|
Thread.sleep(100);
|
|
|
@@ -335,6 +352,60 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
return vo;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取es商品
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<ProductBaseVo> getEsProductList() {
|
|
|
+ return List.of();
|
|
|
+ }
|
|
|
+
|
|
|
+ // /**
|
|
|
+// * 分页查询产品基础信息列表
|
|
|
+// *
|
|
|
+// * @param bo 查询条件
|
|
|
+// * @param pageQuery 分页参数
|
|
|
+// * @return 产品基础信息分页列表
|
|
|
+// */
|
|
|
+// @Override
|
|
|
+// public TableDataInfo<ProductBaseVo> queryPageList(ProductBaseBo bo, PageQuery pageQuery) {
|
|
|
+// QueryWrapper<ProductBase> lqw = Wrappers.query();
|
|
|
+// if(ObjectUtil.isNotEmpty(bo.getIds())){
|
|
|
+// lqw.in( "b.id", bo.getIds().split(","));
|
|
|
+// }
|
|
|
+// lqw.ge(ObjectUtil.isNotEmpty(pageQuery.getFirstSeenId()) && pageQuery.getWay() == 0,"b.id", pageQuery.getFirstSeenId());
|
|
|
+// lqw.gt(ObjectUtil.isNotEmpty(pageQuery.getLastSeenId()) && pageQuery.getWay() == 1,"b.id", pageQuery.getLastSeenId());
|
|
|
+// lqw.eq(ObjectUtil.isNotEmpty(bo.getBottomCategoryId()),"b.bottom_category_id", bo.getBottomCategoryId());
|
|
|
+// lqw.eq(ObjectUtil.isNotEmpty(bo.getProductStatus()), "b.product_status", bo.getProductStatus());
|
|
|
+// lqw.eq(ObjectUtil.isNotEmpty(bo.getProductReviewStatus()),"b.product_review_status", bo.getProductReviewStatus());
|
|
|
+// lqw.eq(ObjectUtil.isNotEmpty(bo.getDataSource()),"b.data_source", bo.getDataSource());
|
|
|
+// lqw.eq(ObjectUtil.isNotEmpty(bo.getIsSelf()),"b.is_self", bo.getIsSelf());
|
|
|
+// lqw.eq(ObjectUtil.isNotEmpty(bo.getProductNo()),"b.product_no", bo.getProductNo());
|
|
|
+// lqw.like(ObjectUtil.isNotEmpty(bo.getBrandName()),"br.brand_name", bo.getBrandName());
|
|
|
+// // 支持分类名称模糊搜索(匹配三级分类中的任意一个)
|
|
|
+// if (ObjectUtil.isNotEmpty(bo.getCategoryName())) {
|
|
|
+// lqw.and(wrapper -> wrapper
|
|
|
+// .like("tc.category_name", bo.getCategoryName())
|
|
|
+// .or().like("mc.category_name", bo.getCategoryName())
|
|
|
+// .or().like("bc.category_name", bo.getCategoryName())
|
|
|
+// );
|
|
|
+// }
|
|
|
+// lqw.orderByAsc("b.id");
|
|
|
+// int limit = pageQuery.getPageSize() + 1;
|
|
|
+// lqw.last("limit "+ limit );
|
|
|
+// List<ProductBaseVo> result = baseMapper.selectAllList(lqw);
|
|
|
+//// result.forEach(vo -> {
|
|
|
+////
|
|
|
+//// });
|
|
|
+// int size = result.size();
|
|
|
+// if (size > pageQuery.getPageSize()) {
|
|
|
+// result.remove(result.size() - 1);
|
|
|
+// }
|
|
|
+// TableDataInfo<ProductBaseVo> tableDataInfo = TableDataInfo.build(result);
|
|
|
+// tableDataInfo.setTotal( size);
|
|
|
+// return tableDataInfo;
|
|
|
+// }
|
|
|
+
|
|
|
/**
|
|
|
* 分页查询产品基础信息列表
|
|
|
*
|
|
|
@@ -344,41 +415,44 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
*/
|
|
|
@Override
|
|
|
public TableDataInfo<ProductBaseVo> queryPageList(ProductBaseBo bo, PageQuery pageQuery) {
|
|
|
- QueryWrapper<ProductBase> lqw = Wrappers.query();
|
|
|
- if(ObjectUtil.isNotEmpty(bo.getIds())){
|
|
|
- lqw.in( "b.id", bo.getIds().split(","));
|
|
|
- }
|
|
|
- lqw.ge(ObjectUtil.isNotEmpty(pageQuery.getFirstSeenId()) && pageQuery.getWay() == 0,"b.id", pageQuery.getFirstSeenId());
|
|
|
- lqw.gt(ObjectUtil.isNotEmpty(pageQuery.getLastSeenId()) && pageQuery.getWay() == 1,"b.id", pageQuery.getLastSeenId());
|
|
|
- lqw.eq(ObjectUtil.isNotEmpty(bo.getBottomCategoryId()),"b.bottom_category_id", bo.getBottomCategoryId());
|
|
|
- lqw.eq(ObjectUtil.isNotEmpty(bo.getProductStatus()), "b.product_status", bo.getProductStatus());
|
|
|
- lqw.eq(ObjectUtil.isNotEmpty(bo.getProductReviewStatus()),"b.product_review_status", bo.getProductReviewStatus());
|
|
|
- lqw.eq(ObjectUtil.isNotEmpty(bo.getDataSource()),"b.data_source", bo.getDataSource());
|
|
|
- lqw.eq(ObjectUtil.isNotEmpty(bo.getIsSelf()),"b.is_self", bo.getIsSelf());
|
|
|
- lqw.eq(ObjectUtil.isNotEmpty(bo.getProductNo()),"b.product_no", bo.getProductNo());
|
|
|
- lqw.like(ObjectUtil.isNotEmpty(bo.getBrandName()),"br.brand_name", bo.getBrandName());
|
|
|
- // 支持分类名称模糊搜索(匹配三级分类中的任意一个)
|
|
|
- if (ObjectUtil.isNotEmpty(bo.getCategoryName())) {
|
|
|
- lqw.and(wrapper -> wrapper
|
|
|
- .like("tc.category_name", bo.getCategoryName())
|
|
|
- .or().like("mc.category_name", bo.getCategoryName())
|
|
|
- .or().like("bc.category_name", bo.getCategoryName())
|
|
|
- );
|
|
|
+ try {
|
|
|
+ LambdaEsQueryWrapper<ProductBaseVo> productBaseVoLambdaEsQueryWrapper = buildEsQueryWrapper(bo);
|
|
|
+
|
|
|
+ // 检查ES索引是否存在,不存在则降级到数据库查询
|
|
|
+ if (!esMapper.existsIndex("productbasevo")) {
|
|
|
+ log.warn("ES索引 [productbasevo] 不存在,降级到数据库查询");
|
|
|
+ return fallbackToDatabaseQuery(bo, pageQuery);
|
|
|
+ }
|
|
|
+
|
|
|
+ EsPageInfo<ProductBaseVo> esPageInfo = esMapper.pageQuery(productBaseVoLambdaEsQueryWrapper, pageQuery.getPageNum(), pageQuery.getPageSize());
|
|
|
+ log.info("ES查询成功,总页数: {}, 总记录数: {}", esPageInfo.getPages(), esPageInfo.getTotal());
|
|
|
+
|
|
|
+ TableDataInfo<ProductBaseVo> tableDataInfo = TableDataInfo.build();
|
|
|
+ tableDataInfo.setRows(esPageInfo.getList());
|
|
|
+ tableDataInfo.setTotal(esPageInfo.getTotal());
|
|
|
+ return tableDataInfo;
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("ES查询异常,降级到数据库查询: {}", e.getMessage(), e);
|
|
|
+ return fallbackToDatabaseQuery(bo, pageQuery);
|
|
|
}
|
|
|
- lqw.orderByAsc("b.id");
|
|
|
- int limit = pageQuery.getPageSize() + 1;
|
|
|
- lqw.last("limit "+ limit );
|
|
|
- List<ProductBaseVo> result = baseMapper.selectAllList(lqw);
|
|
|
-// result.forEach(vo -> {
|
|
|
-//
|
|
|
-// });
|
|
|
- int size = result.size();
|
|
|
- if (size > pageQuery.getPageSize()) {
|
|
|
- result.remove(result.size() - 1);
|
|
|
- }
|
|
|
- TableDataInfo<ProductBaseVo> tableDataInfo = TableDataInfo.build(result);
|
|
|
- tableDataInfo.setTotal( size);
|
|
|
- return tableDataInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 降级到数据库查询(当ES查询失败时使用)
|
|
|
+ *
|
|
|
+ * @param bo 查询条件
|
|
|
+ * @param pageQuery 分页参数
|
|
|
+ * @return 数据库查询结果
|
|
|
+ */
|
|
|
+ private TableDataInfo<ProductBaseVo> fallbackToDatabaseQuery(ProductBaseBo bo, PageQuery pageQuery) {
|
|
|
+ log.info("执行数据库降级查询...");
|
|
|
+
|
|
|
+ LambdaQueryWrapper<ProductBase> lqw = buildQueryWrapper(bo);
|
|
|
+// Page<ProductBaseVo> page = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
+
|
|
|
+// log.info("数据库查询完成,总记录数: {}", page.getTotal());
|
|
|
+ return TableDataInfo.build();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -405,9 +479,121 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
.eq(ObjectUtil.isNotEmpty(bo.getIsSelf()), ProductBaseVo::getIsSelf, bo.getIsSelf())
|
|
|
.eq(ObjectUtil.isNotEmpty(bo.getProductReviewStatus()), ProductBaseVo::getProductReviewStatus, bo.getProductReviewStatus())
|
|
|
.eq(ObjectUtil.isNotEmpty(bo.getDataSource()), ProductBaseVo::getDataSource, bo.getDataSource())
|
|
|
+ .orderByDesc(ProductBaseVo::getId)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 构建PC端ES查询条件
|
|
|
+ */
|
|
|
+ private LambdaEsQueryWrapper<ProductBaseVo> buildEsQueryWrapperForPc(PcProductBo bo) {
|
|
|
+ LambdaEsQueryWrapper<ProductBaseVo> wrapper = new LambdaEsQueryWrapper<ProductBaseVo>()
|
|
|
+ .eq(ProductBaseVo::getProductStatus, 1);
|
|
|
+
|
|
|
+ if (ObjectUtil.isNotEmpty(bo.getBrandId())) {
|
|
|
+ wrapper.eq(ProductBaseVo::getBrandId, bo.getBrandId());
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotEmpty(bo.getTopCategoryId())) {
|
|
|
+ wrapper.eq(ProductBaseVo::getTopCategoryId, bo.getTopCategoryId());
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotEmpty(bo.getMiddleCategoryId())) {
|
|
|
+ wrapper.eq(ProductBaseVo::getMediumCategoryId, bo.getMiddleCategoryId());
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotEmpty(bo.getBottomCategoryId())) {
|
|
|
+ wrapper.eq(ProductBaseVo::getBottomCategoryId, bo.getBottomCategoryId());
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotEmpty(bo.getIsCustomize())) {
|
|
|
+ wrapper.eq(ProductBaseVo::getIsCustomize, bo.getIsCustomize());
|
|
|
+ }
|
|
|
+
|
|
|
+ return wrapper;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * PC端商品列表降级查询
|
|
|
+ */
|
|
|
+ private TableDataInfo<PcProductVo> fallbackPcProductQuery(PcProductBo bo, PageQuery pageQuery, QueryWrapper<ProductBase> lqw) {
|
|
|
+ int limit = pageQuery.getPageSize() + 1;
|
|
|
+ lqw.last("limit "+ limit );
|
|
|
+ List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(lqw);
|
|
|
+ if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
+ List<PcProductVo> pcProductVos = BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
+ int size = productBaseVos.size();
|
|
|
+ if (size > pageQuery.getPageSize()) {
|
|
|
+ pcProductVos.remove(pcProductVos.size() - 1);
|
|
|
+ }
|
|
|
+ TableDataInfo<PcProductVo> tableDataInfo = TableDataInfo.build(pcProductVos);
|
|
|
+ tableDataInfo.setTotal(size);
|
|
|
+ return tableDataInfo;
|
|
|
+ }
|
|
|
+ return TableDataInfo.build();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 商品浏览记录降级查询
|
|
|
+ */
|
|
|
+ private TableDataInfo<PcProductVo> fallbackBrowsingHistoryQuery(List<Long> productIds, PageQuery pageQuery) {
|
|
|
+ QueryWrapper<ProductBase> lqw = Wrappers.query(ProductBase.class);
|
|
|
+ lqw.in("b.id", productIds);
|
|
|
+ lqw.eq("b.product_status", 1);
|
|
|
+ int limit = pageQuery.getPageSize() + 1;
|
|
|
+ lqw.last("limit "+ limit );
|
|
|
+ List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(lqw);
|
|
|
+ if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
+ List<PcProductVo> pcProductVos = BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
+ int size = pcProductVos.size();
|
|
|
+ if (size > pageQuery.getPageSize()) {
|
|
|
+ pcProductVos.remove(pcProductVos.size() - 1);
|
|
|
+ }
|
|
|
+ TableDataInfo<PcProductVo> tableDataInfo = TableDataInfo.build(pcProductVos);
|
|
|
+ tableDataInfo.setTotal(size);
|
|
|
+ return tableDataInfo;
|
|
|
+ }
|
|
|
+ return TableDataInfo.build();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 商品收藏夹降级查询
|
|
|
+ */
|
|
|
+ private TableDataInfo<PcProductVo> fallbackFavoritesQuery(List<Long> productIds, PageQuery pageQuery) {
|
|
|
+ QueryWrapper<ProductBase> lqw = Wrappers.query(ProductBase.class);
|
|
|
+ lqw.in("b.id", productIds);
|
|
|
+ lqw.eq("b.product_status", 1);
|
|
|
+ int limit = pageQuery.getPageSize() + 1;
|
|
|
+ lqw.last("limit "+ limit );
|
|
|
+ List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(lqw);
|
|
|
+ if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
+ List<PcProductVo> pcProductVos = BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
+ int size = pcProductVos.size();
|
|
|
+ if (size > pageQuery.getPageSize()) {
|
|
|
+ pcProductVos.remove(pcProductVos.size() - 1);
|
|
|
+ }
|
|
|
+ TableDataInfo<PcProductVo> tableDataInfo = TableDataInfo.build(pcProductVos);
|
|
|
+ tableDataInfo.setTotal(size);
|
|
|
+ return tableDataInfo;
|
|
|
+ }
|
|
|
+ return TableDataInfo.build();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分类推荐商品降级查询
|
|
|
+ */
|
|
|
+ private TableDataInfo<PcProductVo> fallbackCategoryRecommendQuery(List<Long> productIds, PageQuery pageQuery) {
|
|
|
+ QueryWrapper<ProductBase> lqw = Wrappers.query(ProductBase.class);
|
|
|
+ lqw.in("b.id", productIds);
|
|
|
+ lqw.eq("b.product_status", 1);
|
|
|
+ int limit = pageQuery.getPageSize() + 1;
|
|
|
+ lqw.last("limit "+ limit );
|
|
|
+ List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(lqw);
|
|
|
+ if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
+ List<PcProductVo> pcProductVos = BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
+ TableDataInfo<PcProductVo> tableDataInfo = TableDataInfo.build(pcProductVos);
|
|
|
+ tableDataInfo.setTotal(productBaseVos.size());
|
|
|
+ return tableDataInfo;
|
|
|
+ }
|
|
|
+ return TableDataInfo.build();
|
|
|
+ }
|
|
|
+
|
|
|
private LambdaQueryWrapper<ProductBase> buildQueryWrapper(ProductBaseBo bo) {
|
|
|
Map<String, Object> params = bo.getParams();
|
|
|
LambdaQueryWrapper<ProductBase> lqw = Wrappers.lambdaQuery();
|
|
|
@@ -1161,12 +1347,33 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
.eq(ProductRecommendLink::getRecommendId, recommendId));
|
|
|
if (CollUtil.isNotEmpty(productRecommendLinkVos)) {
|
|
|
List<Long> productIds = productRecommendLinkVos.stream().map(ProductRecommendLinkVo::getProductId).toList();
|
|
|
- //获取行家精选商品
|
|
|
- List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(Wrappers.query(ProductBase.class)
|
|
|
- .in("b.id", productIds));
|
|
|
- if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
- List<PcProductVo> pcProductVos = BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
- return pcProductVos;
|
|
|
+ //获取行家精选商品 - 使用ES查询
|
|
|
+ try {
|
|
|
+ LambdaEsQueryWrapper<ProductBaseVo> esQueryWrapper = new LambdaEsQueryWrapper<ProductBaseVo>()
|
|
|
+ .in(ProductBaseVo::getId, productIds)
|
|
|
+ .eq(ProductBaseVo::getProductStatus, 1);
|
|
|
+
|
|
|
+ // 检查ES索引是否存在
|
|
|
+ if (!esMapper.existsIndex("productbasevo")) {
|
|
|
+ log.warn("ES索引 [productbasevo] 不存在,降级到数据库查询");
|
|
|
+ List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(Wrappers.query(ProductBase.class)
|
|
|
+ .in("b.id", productIds));
|
|
|
+ if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
+ return BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ List<ProductBaseVo> productBaseVos = esMapper.selectList(esQueryWrapper);
|
|
|
+ if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
+ return BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("ES查询行家精选商品失败,降级到数据库查询: {}", e.getMessage(), e);
|
|
|
+ List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(Wrappers.query(ProductBase.class)
|
|
|
+ .in("b.id", productIds));
|
|
|
+ if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
+ return BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
return List.of();
|
|
|
@@ -1184,12 +1391,33 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
);
|
|
|
if (CollUtil.isNotEmpty(productDecorationFloorLinkVos)) {
|
|
|
List<String> productNos = productDecorationFloorLinkVos.stream().map(ProductDecorationFloorLinkVo::getProductNo).toList();
|
|
|
- //获取分类楼层商品
|
|
|
- List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(Wrappers.query(ProductBase.class)
|
|
|
- .in("b.product_no", productNos));
|
|
|
- if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
- List<PcProductVo> pcProductVos = BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
- return pcProductVos;
|
|
|
+ //获取分类楼层商品 - 使用ES查询
|
|
|
+ try {
|
|
|
+ LambdaEsQueryWrapper<ProductBaseVo> esQueryWrapper = new LambdaEsQueryWrapper<ProductBaseVo>()
|
|
|
+ .in(ProductBaseVo::getProductNo, productNos)
|
|
|
+ .eq(ProductBaseVo::getProductStatus, 1);
|
|
|
+
|
|
|
+ // 检查ES索引是否存在
|
|
|
+ if (!esMapper.existsIndex("productbasevo")) {
|
|
|
+ log.warn("ES索引 [productbasevo] 不存在,降级到数据库查询");
|
|
|
+ List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(Wrappers.query(ProductBase.class)
|
|
|
+ .in("b.product_no", productNos));
|
|
|
+ if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
+ return BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ List<ProductBaseVo> productBaseVos = esMapper.selectList(esQueryWrapper);
|
|
|
+ if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
+ return BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("ES查询分类楼层商品失败,降级到数据库查询: {}", e.getMessage(), e);
|
|
|
+ List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(Wrappers.query(ProductBase.class)
|
|
|
+ .in("b.product_no", productNos));
|
|
|
+ if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
+ return BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
return List.of();
|
|
|
@@ -1248,19 +1476,56 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
}
|
|
|
}
|
|
|
lqw.select("b.id","b.product_image","p.market_price","p.member_price","p.min_selling_price","p.min_order_quantity","b.item_name","u.unit_name");
|
|
|
- int limit = pageQuery.getPageSize() + 1;
|
|
|
- lqw.last("limit "+ limit );
|
|
|
- List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(lqw);
|
|
|
- if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
- List<PcProductVo> pcProductVos = BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
- int size = productBaseVos.size();
|
|
|
- if (size > pageQuery.getPageSize()) {
|
|
|
- pcProductVos.remove(pcProductVos.size() - 1);
|
|
|
+
|
|
|
+ // 使用ES分页查询
|
|
|
+ try {
|
|
|
+ LambdaEsQueryWrapper<ProductBaseVo> esQueryWrapper = buildEsQueryWrapperForPc(bo);
|
|
|
+
|
|
|
+ // 添加额外的查询条件
|
|
|
+ if (ObjectUtil.isNotEmpty(bo.getSearchKeyword())) {
|
|
|
+ esQueryWrapper.and(wrapper -> wrapper
|
|
|
+ .like(ProductBaseVo::getItemName, bo.getSearchKeyword())
|
|
|
+ .or().like(ProductBaseVo::getBrandName, bo.getSearchKeyword())
|
|
|
+ );
|
|
|
}
|
|
|
- TableDataInfo<ProductBaseVo> tableDataInfo = TableDataInfo.build(productBaseVos);
|
|
|
- tableDataInfo.setTotal(size);
|
|
|
- return TableDataInfo.build(pcProductVos);
|
|
|
+
|
|
|
+ if (bo.getPriceRange() != null) {
|
|
|
+ //价格区间 1:1-100 2:100-500 3:500-1000 4:1000以上
|
|
|
+ switch (bo.getPriceRange()) {
|
|
|
+ case "1":
|
|
|
+ esQueryWrapper.between(ProductBaseVo::getMarketPrice, 1, 100);
|
|
|
+ break;
|
|
|
+ case "2":
|
|
|
+ esQueryWrapper.between(ProductBaseVo::getMarketPrice, 100, 500);
|
|
|
+ break;
|
|
|
+ case "3":
|
|
|
+ esQueryWrapper.between(ProductBaseVo::getMarketPrice, 500, 1000);
|
|
|
+ break;
|
|
|
+ case "4":
|
|
|
+ esQueryWrapper.ge(ProductBaseVo::getMarketPrice, 1000);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查ES索引是否存在
|
|
|
+ if (!esMapper.existsIndex("productbasevo")) {
|
|
|
+ log.warn("ES索引 [productbasevo] 不存在,降级到数据库查询");
|
|
|
+ return fallbackPcProductQuery(bo, pageQuery, lqw);
|
|
|
+ }
|
|
|
+
|
|
|
+ EsPageInfo<ProductBaseVo> esPageInfo = esMapper.pageQuery(esQueryWrapper, pageQuery.getPageNum(), pageQuery.getPageSize());
|
|
|
+
|
|
|
+ if (CollUtil.isNotEmpty(esPageInfo.getList())) {
|
|
|
+ List<PcProductVo> pcProductVos = BeanUtil.copyToList(esPageInfo.getList(), PcProductVo.class);
|
|
|
+ TableDataInfo<PcProductVo> tableDataInfo = TableDataInfo.build(pcProductVos);
|
|
|
+ tableDataInfo.setTotal(esPageInfo.getTotal());
|
|
|
+ return tableDataInfo;
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("ES查询PC端商品列表失败,降级到数据库查询: {}", e.getMessage(), e);
|
|
|
+ return fallbackPcProductQuery(bo, pageQuery, lqw);
|
|
|
}
|
|
|
+
|
|
|
return TableDataInfo.build();
|
|
|
}
|
|
|
|
|
|
@@ -1295,7 +1560,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return null;
|
|
|
+ return TableDataInfo.build();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -1305,7 +1570,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
* @param userId
|
|
|
*/
|
|
|
@Override
|
|
|
- public TableDataInfo<PcProductVo> getProductFavoritesPage(Long favoritesId, Long userId, PageQuery pageQuery) {
|
|
|
+ public TableDataInfo<PcProductVo> getFavoritesProductPage(Long favoritesId, Long userId, PageQuery pageQuery) {
|
|
|
//获取收藏夹商品id
|
|
|
List<ProductCollectVo> productFavoritesLinkVos = productCollectMapper.selectVoList(Wrappers.lambdaQuery(ProductCollect.class)
|
|
|
.eq(ProductCollect::getFavoritesId, favoritesId)
|
|
|
@@ -1405,7 +1670,45 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
* PC端轮播图商品列表
|
|
|
*/
|
|
|
@Override
|
|
|
- public List<PcProductVo> getCarouselDisplayProductList() {
|
|
|
+ public List<PcProductVo> getCarouselDisplayProductList(Long recommendId) {
|
|
|
+ List<ProductRecommendLinkVo> productRecommendLinkVos = productRecommendLinkMapper.selectVoList(
|
|
|
+ Wrappers.lambdaQuery(ProductRecommendLink.class)
|
|
|
+ .eq(ProductRecommendLink::getRecommendId, recommendId)
|
|
|
+ );
|
|
|
+ if (CollUtil.isNotEmpty(productRecommendLinkVos)) {
|
|
|
+ List<Long> productIds = productRecommendLinkVos.stream().map(ProductRecommendLinkVo::getProductId).toList();
|
|
|
+ QueryWrapper<ProductBase> lqw = Wrappers.query(ProductBase.class);
|
|
|
+ lqw.in("b.id", productIds);
|
|
|
+ lqw.eq("b.product_status", 1);
|
|
|
+ List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(lqw);
|
|
|
+ if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
+ return BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return List.of();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * PC端推荐分类推荐商品列表
|
|
|
+ *
|
|
|
+ * @param categoryId
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<PcProductVo> getRecommendedCategoryProductList(Long categoryId) {
|
|
|
+ List<ProductCategoryRecommendedLinkVo> productCategoryRecommendedLinkVos = productCategoryRecommendedLinkMapper.selectVoList(
|
|
|
+ Wrappers.lambdaQuery(ProductCategoryRecommendedLink.class)
|
|
|
+ .eq(ProductCategoryRecommendedLink::getCategoryId, categoryId)
|
|
|
+ );
|
|
|
+ if (CollUtil.isNotEmpty(productCategoryRecommendedLinkVos)) {
|
|
|
+ List<Long> productIds = productCategoryRecommendedLinkVos.stream().map(ProductCategoryRecommendedLinkVo::getProductId).toList();
|
|
|
+ QueryWrapper<ProductBase> lqw = Wrappers.query(ProductBase.class);
|
|
|
+ lqw.in("b.id", productIds);
|
|
|
+ lqw.eq("b.product_status", 1);
|
|
|
+ List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(lqw);
|
|
|
+ if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
+ return BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
+ }
|
|
|
+ }
|
|
|
return List.of();
|
|
|
}
|
|
|
|
|
|
@@ -1415,8 +1718,205 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
* @param floorId
|
|
|
*/
|
|
|
@Override
|
|
|
- public List<PcProductVo> getIndustrialFloorProduct(Long floorId) {
|
|
|
+ public List<PcProductVo> getIndustrialFloorProductList(Long floorId) {
|
|
|
+ List<ProductDecorationFloorLinkVo> productDecorationFloorLinkVos = decorationFloorLinkMapper.selectVoList(
|
|
|
+ Wrappers.lambdaQuery(ProductDecorationFloorLink.class)
|
|
|
+ .eq(ProductDecorationFloorLink::getFloorNo, floorId)
|
|
|
+ );
|
|
|
+ if (CollUtil.isNotEmpty(productDecorationFloorLinkVos)) {
|
|
|
+ List<String> productNos = productDecorationFloorLinkVos.stream().map(ProductDecorationFloorLinkVo::getProductNo).toList();
|
|
|
+ QueryWrapper<ProductBase> lqw = Wrappers.query(ProductBase.class);
|
|
|
+ lqw.in("b.product_no", productNos);
|
|
|
+ lqw.eq("b.product_status", 1);
|
|
|
+ List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(lqw);
|
|
|
+ if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
+ return BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
return List.of();
|
|
|
}
|
|
|
+ /**
|
|
|
+ * PC端福利分类下的商品列表
|
|
|
+ * */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<PcProductVo> getGiftCategoryLinkPage(PcProductBo bo, PageQuery pageQuery) {
|
|
|
+ ProductGiftCategoryVo productGiftCategoryVo = productGiftCategoryMapper.selectVoById(bo.getBottomCategoryId());
|
|
|
+ if (productGiftCategoryVo == null) {
|
|
|
+ return TableDataInfo.build();
|
|
|
+ }
|
|
|
+ List<ProductGiftCategoryLinkVo> productGiftCategoryLinkVos = productGiftCategoryLinkMapper.selectVoList(
|
|
|
+ Wrappers.lambdaQuery(ProductGiftCategoryLink.class)
|
|
|
+ .eq(ProductGiftCategoryLink::getCategoryNo, productGiftCategoryVo.getCategoryNo())
|
|
|
+ .eq(ProductGiftCategoryLink::getIsShow, "1")
|
|
|
+ );
|
|
|
+ LambdaEsQueryWrapper<ProductBaseVo> wrapper = new LambdaEsQueryWrapper<ProductBaseVo>()
|
|
|
+ .eq(ProductBaseVo::getProductStatus, 1);
|
|
|
+ wrapper.in(ProductBaseVo::getId, productGiftCategoryLinkVos.stream().map(ProductGiftCategoryLinkVo::getProductId).toList());
|
|
|
+ EsPageInfo<ProductBaseVo> esPageInfo = esMapper.pageQuery(wrapper, pageQuery.getPageNum(), pageQuery.getPageSize());
|
|
|
+ List<PcProductVo> pcProductVos = BeanUtil.copyToList(esPageInfo.getList(), PcProductVo.class);
|
|
|
+ TableDataInfo<PcProductVo> build = TableDataInfo.build(pcProductVos);
|
|
|
+ build.setTotal(esPageInfo.getTotal());
|
|
|
+ return build;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * PC端福利楼层商品列表
|
|
|
+ *
|
|
|
+ * @param floorId
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<PcProductVo> getGiftFloorLinkProductList(Long floorId) {
|
|
|
+ List<ProductGiftFloorLinkVo> productGiftFloorLinkVos = productGiftFloorLinkMapper.selectVoList(
|
|
|
+ Wrappers.lambdaQuery(ProductGiftFloorLink.class)
|
|
|
+ .eq(ProductGiftFloorLink::getFloorId, floorId)
|
|
|
+ );
|
|
|
+ if (CollUtil.isNotEmpty(productGiftFloorLinkVos)) {
|
|
|
+ List<Long> productIds = productGiftFloorLinkVos.stream().map(ProductGiftFloorLinkVo::getProductId).toList();
|
|
|
+
|
|
|
+ // 使用ES查询
|
|
|
+ try {
|
|
|
+ LambdaEsQueryWrapper<ProductBaseVo> esQueryWrapper = new LambdaEsQueryWrapper<ProductBaseVo>()
|
|
|
+ .in(ProductBaseVo::getId, productIds)
|
|
|
+ .eq(ProductBaseVo::getProductStatus, 1);
|
|
|
+
|
|
|
+ // 检查ES索引是否存在
|
|
|
+ if (!esMapper.existsIndex("productbasevo")) {
|
|
|
+ log.warn("ES索引 [productbasevo] 不存在,降级到数据库查询");
|
|
|
+ List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(Wrappers.query(ProductBase.class)
|
|
|
+ .in("b.id", productIds));
|
|
|
+ if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
+ return BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ List<ProductBaseVo> productBaseVos = esMapper.selectList(esQueryWrapper);
|
|
|
+ if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
+ return BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("ES查询福利楼层商品失败,降级到数据库查询: {}", e.getMessage(), e);
|
|
|
+ List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(Wrappers.query(ProductBase.class)
|
|
|
+ .in("b.id", productIds));
|
|
|
+ if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
+ return BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return List.of();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * PC端采购方案组商品列表
|
|
|
+ *
|
|
|
+ * @param groupId
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<PcProductVo> getProcurementProgramGroupProductList(Long groupId,PageQuery pageQuery) {
|
|
|
+ List<ProcurementProgramProductVo> productRecommendLinkVos = procurementProgramProductMapper.selectVoList(
|
|
|
+ Wrappers.lambdaQuery(ProcurementProgramProduct.class)
|
|
|
+ .eq(ProcurementProgramProduct::getGroupId, groupId)
|
|
|
+ );
|
|
|
+ if (CollUtil.isNotEmpty(productRecommendLinkVos)) {
|
|
|
+ LambdaEsQueryWrapper<ProductBaseVo> wrapper = new LambdaEsQueryWrapper<ProductBaseVo>();
|
|
|
+// wrapper.eq(ProductBaseVo::getProductStatus, 1);
|
|
|
+ wrapper.in(ProductBaseVo::getId, productRecommendLinkVos.stream().map(ProcurementProgramProductVo::getProductId).toList());
|
|
|
+ EsPageInfo<ProductBaseVo> esPageInfo = esMapper.pageQuery(wrapper, pageQuery.getPageNum(), pageQuery.getPageSize());
|
|
|
+ List<PcProductVo> pcProductVos = BeanUtil.copyToList(esPageInfo.getList(), PcProductVo.class);
|
|
|
+ TableDataInfo<PcProductVo> build = TableDataInfo.build(pcProductVos);
|
|
|
+ build.setTotal(esPageInfo.getTotal());
|
|
|
+ return build;
|
|
|
+ }
|
|
|
+ return TableDataInfo.build();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * PC端场景采购下的商品
|
|
|
+ *
|
|
|
+ * @param programId
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<PcProductVo> getProductProgramProductList(Long programId) {
|
|
|
+ List<ProductProgramLinkVo> productProgramLinkVos = productProgramLinkMapper.selectVoList(
|
|
|
+ Wrappers.lambdaQuery(ProductProgramLink.class)
|
|
|
+ .eq(ProductProgramLink::getProgramId, programId)
|
|
|
+ );
|
|
|
+ if (CollUtil.isNotEmpty(productProgramLinkVos)) {
|
|
|
+ List<Long> productIds = productProgramLinkVos.stream().map(ProductProgramLinkVo::getProductId).toList();
|
|
|
+ QueryWrapper<ProductBase> lqw = Wrappers.query(ProductBase.class);
|
|
|
+ lqw.in("b.id", productIds);
|
|
|
+ lqw.eq("b.product_status", 1);
|
|
|
+ List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(lqw);
|
|
|
+ if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
+ return BeanUtil.copyToList(productBaseVos, PcProductVo.class);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return List.of();
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * PC端协议商品列表
|
|
|
+ * */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<PcProductVo> getProtocolProductsPage(PcProductBo bo, PageQuery pageQuery) {
|
|
|
+ List<ProtocolProductsVo> protocolProductsVos = protocolProductsMapper.selectVoList(Wrappers.lambdaQuery(ProtocolProducts.class)
|
|
|
+ .eq(ProtocolProducts::getCustomerId, bo.getCustomerId())
|
|
|
+ .ge(ObjectUtil.isNotEmpty(bo.getMinPrice()), ProtocolProducts::getAgreementPrice, bo.getMinPrice())
|
|
|
+ .le(ObjectUtil.isNotEmpty(bo.getMaxPrice()), ProtocolProducts::getAgreementPrice, bo.getMaxPrice())
|
|
|
+ );
|
|
|
+ if (CollUtil.isNotEmpty(protocolProductsVos)) {
|
|
|
+ LambdaEsQueryWrapper<ProductBaseVo> wrapper = new LambdaEsQueryWrapper<ProductBaseVo>();
|
|
|
+// wrapper.eq(ProductBaseVo::getProductStatus, 1);
|
|
|
+ wrapper.in(ProductBaseVo::getId, protocolProductsVos.stream().map(ProtocolProductsVo::getProductId).toList());
|
|
|
+ EsPageInfo<ProductBaseVo> esPageInfo = esMapper.pageQuery(wrapper, pageQuery.getPageNum(), pageQuery.getPageSize());
|
|
|
+ List<PcProductVo> pcProductVos = BeanUtil.copyToList(esPageInfo.getList(), PcProductVo.class);
|
|
|
+ TableDataInfo<PcProductVo> build = TableDataInfo.build(pcProductVos);
|
|
|
+ build.getRows().forEach(pcProductVo -> {
|
|
|
+ pcProductVo.setAgreementPrice(protocolProductsVos.stream().filter(o -> o.getProductId().equals(pcProductVo.getId())).findFirst().get().getAgreementPrice());
|
|
|
+ });
|
|
|
+ build.setTotal(esPageInfo.getTotal());
|
|
|
+ return build;
|
|
|
+ }
|
|
|
+ return TableDataInfo.build();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * PC端特价商品列表
|
|
|
+ *
|
|
|
+ * @param bo
|
|
|
+ * @param pageQuery
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<PcProductVo> getSpecialProductList(PcProductBo bo, PageQuery pageQuery) {
|
|
|
+ List<ProductSpecialLinkVo> specialProductsVos = productSpecialLinkMapper.selectVoList(Wrappers.lambdaQuery(ProductSpecialLink.class));
|
|
|
+ if (CollUtil.isNotEmpty(specialProductsVos)) {
|
|
|
+ LambdaEsQueryWrapper<ProductBaseVo> wrapper = new LambdaEsQueryWrapper<ProductBaseVo>();
|
|
|
+ // wrapper.eq(ProductBaseVo::getProductStatus, 1);
|
|
|
+ if (ObjectUtil.isNotEmpty(bo.getBrandId())) {
|
|
|
+ wrapper.eq(ProductBaseVo::getBrandId, bo.getBrandId());
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotEmpty(bo.getTopCategoryId())) {
|
|
|
+ wrapper.eq(ProductBaseVo::getTopCategoryId, bo.getTopCategoryId());
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotEmpty(bo.getMiddleCategoryId())) {
|
|
|
+ wrapper.eq(ProductBaseVo::getMediumCategoryId, bo.getMiddleCategoryId());
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotEmpty(bo.getBottomCategoryId())) {
|
|
|
+ wrapper.eq(ProductBaseVo::getBottomCategoryId, bo.getBottomCategoryId());
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotEmpty(bo.getIsCustomize())) {
|
|
|
+ wrapper.eq(ProductBaseVo::getIsCustomize, bo.getIsCustomize());
|
|
|
+ }
|
|
|
+
|
|
|
+ wrapper.in(ProductBaseVo::getId, specialProductsVos.stream().map(ProductSpecialLinkVo::getProductId).toList());
|
|
|
+ EsPageInfo<ProductBaseVo> esPageInfo = esMapper.pageQuery(wrapper, pageQuery.getPageNum(), pageQuery.getPageSize());
|
|
|
+ List<PcProductVo> pcProductVos = BeanUtil.copyToList(esPageInfo.getList(), PcProductVo.class);
|
|
|
+ TableDataInfo<PcProductVo> build = TableDataInfo.build(pcProductVos);
|
|
|
+ build.setTotal(esPageInfo.getTotal());
|
|
|
+ return build;
|
|
|
+ }
|
|
|
+ return TableDataInfo.build();
|
|
|
+ }
|
|
|
}
|
|
|
|