|
|
@@ -4,16 +4,9 @@ import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
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;
|
|
|
-import org.apache.dubbo.common.logger.FluentLogger;
|
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
import org.dromara.common.core.exception.ServiceException;
|
|
|
import org.dromara.common.core.utils.MapstructUtils;
|
|
|
@@ -28,16 +21,14 @@ import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.dromara.common.satoken.utils.LoginHelper;
|
|
|
import org.dromara.easyes.core.biz.EsPageInfo;
|
|
|
-import org.dromara.easyes.core.biz.SAPageInfo;
|
|
|
import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
|
|
|
+import org.dromara.external.api.domain.ExternalProductDto;
|
|
|
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.*;
|
|
|
import org.dromara.product.domain.vo.*;
|
|
|
import org.dromara.product.esmapper.ProductEsMapper;
|
|
|
import org.dromara.product.mapper.*;
|
|
|
-import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.boot.ApplicationArguments;
|
|
|
import org.springframework.boot.ApplicationRunner;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
@@ -61,33 +52,6 @@ import java.util.stream.Collectors;
|
|
|
/**
|
|
|
* 产品基础信息Service业务层处理
|
|
|
*
|
|
|
- * 性能优化说明(针对200万级别数据量):
|
|
|
- * 1. 启动时ES同步使用分页流式处理,每次只加载1000条数据
|
|
|
- * 2. 提供流式查询API(selectAllListStream)避免OOM
|
|
|
- * 3. 单条查询优化,建议添加缓存
|
|
|
- * 4. 批量删除优化,减少数据库交互
|
|
|
- *
|
|
|
- * 数据库索引建议(必须添加):
|
|
|
- * product_base表:
|
|
|
- * - idx_product_no: product_no (产品编号,唯一索引)
|
|
|
- * - idx_brand_id: brand_id (品牌ID)
|
|
|
- * - idx_category: top_category_id, medium_category_id, bottom_category_id (组合索引)
|
|
|
- * - idx_status: product_status, product_review_status (状态组合索引)
|
|
|
- * - idx_create_time: create_time (创建时间)
|
|
|
- *
|
|
|
- * product_extend表:
|
|
|
- * - idx_product_id: product_id (外键索引)
|
|
|
- *
|
|
|
- * product_price_inventory表:
|
|
|
- * - PRIMARY KEY: product_id (主键)
|
|
|
- *
|
|
|
- * product_classification表:
|
|
|
- * - idx_product_id: product_id (外键索引)
|
|
|
- * - idx_category_id: category_id (分类索引)
|
|
|
- *
|
|
|
- * product_customization表:
|
|
|
- * - idx_product_id: product_id (外键索引)
|
|
|
- *
|
|
|
* @author LionLi
|
|
|
* @date 2025-12-11
|
|
|
*/
|
|
|
@@ -133,7 +97,8 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
private final ProductSpecialLinkMapper productSpecialLinkMapper;
|
|
|
private final ClientSiteProductMapper clientSiteProductMapper;
|
|
|
private final ClientSiteFloorLinkMapper clientSiteFloorLinkMapper;
|
|
|
-
|
|
|
+ private final ProductSelfMapper productSelfMapper;
|
|
|
+ private final ProductExquisiteMapper productExquisiteMapper;
|
|
|
private final ProductEsMapper esMapper;
|
|
|
|
|
|
@DubboReference
|
|
|
@@ -279,6 +244,9 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
vo.setSpecificationsCode(extend.getSpecificationsCode());
|
|
|
vo.setIsCustomize(Long.valueOf(ObjectUtil.isNotEmpty(extend.getIsCustomize())?extend.getIsCustomize():"0"));
|
|
|
vo.setDeliveryTime(extend.getDeliveryTime());
|
|
|
+ vo.setShelfComments(extend.getShelfComments());
|
|
|
+ vo.setProductNature(extend.getPurchaseManagerNo());
|
|
|
+ vo.setPurchasingPersonnel(extend.getPurchaseNo());
|
|
|
}
|
|
|
|
|
|
// 3. 查询并填充价格库存信息(product_price_inventory表)
|
|
|
@@ -359,52 +327,6 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
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;
|
|
|
-// }
|
|
|
-
|
|
|
/**
|
|
|
* 分页查询产品基础信息列表
|
|
|
*
|
|
|
@@ -480,6 +402,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
.eq(ObjectUtil.isNotEmpty(bo.getProductReviewStatus()), ProductBaseVo::getProductReviewStatus, bo.getProductReviewStatus())
|
|
|
.eq(ObjectUtil.isNotEmpty(bo.getDataSource()), ProductBaseVo::getDataSource, bo.getDataSource())
|
|
|
.eq(ObjectUtil.isNotEmpty(bo.getProductCategory()), ProductBaseVo::getProductCategory, bo.getProductCategory())
|
|
|
+ .in(ObjectUtil.isNotEmpty(bo.getIsShelfAudit()), ProductBaseVo::getProductStatus, 1,2,3)
|
|
|
.orderByDesc(ProductBaseVo::getCreateTime)
|
|
|
;
|
|
|
if (ObjectUtil.isNotEmpty(bo.getIds())){
|
|
|
@@ -501,7 +424,6 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
LambdaEsQueryWrapper<ProductBaseVo> wrapper = new LambdaEsQueryWrapper<ProductBaseVo>()
|
|
|
.eq(ProductBaseVo::getProductStatus, 1)
|
|
|
;
|
|
|
-
|
|
|
if(ObjectUtil.isNotEmpty(bo.getProductNo())){
|
|
|
wrapper.eq(ProductBaseVo::getProductNo, bo.getProductNo());
|
|
|
}
|
|
|
@@ -707,6 +629,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
private void saveProductDetail(ProductBaseBo bo, Long productId) {
|
|
|
ProductPhotos productPhotos= new ProductPhotos();
|
|
|
productPhotos.setProductId(productId);
|
|
|
+ productPhotos.setImageUrl(bo.getProductImage());
|
|
|
productPhotos.setProductDetailsPc(bo.getPcDetail());
|
|
|
productPhotos.setProductDetailsApp(bo.getMobileDetail());
|
|
|
photosMapper.insert(productPhotos);
|
|
|
@@ -766,11 +689,22 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
}
|
|
|
|
|
|
private void updateProductDetail(ProductBaseBo bo, Long productId) {
|
|
|
- ProductPhotos productPhotos= new ProductPhotos();
|
|
|
- productPhotos.setProductId(productId);
|
|
|
- productPhotos.setProductDetailsPc(bo.getPcDetail());
|
|
|
- productPhotos.setProductDetailsApp(bo.getMobileDetail());
|
|
|
- photosMapper.update(productPhotos, new LambdaUpdateWrapper<ProductPhotos>().eq(ProductPhotos::getProductId, productId));
|
|
|
+ ProductPhotos productPhotos = photosMapper.selectById(productId);
|
|
|
+ if (productPhotos == null) {
|
|
|
+ productPhotos = new ProductPhotos();
|
|
|
+ productPhotos.setProductId(productId);
|
|
|
+ productPhotos.setProductDetailsPc(bo.getPcDetail());
|
|
|
+ productPhotos.setProductDetailsApp(bo.getMobileDetail());
|
|
|
+ productPhotos.setImageUrl(bo.getImageUrl());
|
|
|
+ photosMapper.insert(productPhotos);
|
|
|
+ }else{
|
|
|
+ productPhotos.setProductId(productId);
|
|
|
+ productPhotos.setProductDetailsPc(bo.getPcDetail());
|
|
|
+ productPhotos.setProductDetailsApp(bo.getMobileDetail());
|
|
|
+ productPhotos.setImageUrl(bo.getImageUrl());
|
|
|
+ photosMapper.update(productPhotos, new LambdaUpdateWrapper<ProductPhotos>().eq(ProductPhotos::getProductId, productId));
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -829,6 +763,9 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
extend.setServiceGuarantee(bo.getServiceGuarantee());
|
|
|
extend.setIsInstallService(bo.getFreeInstallation());
|
|
|
extend.setSalesVolume(bo.getSalesVolume());
|
|
|
+ extend.setShelfComments(bo.getShelfComments());
|
|
|
+ extend.setPurchaseManagerNo(bo.getProductNature());
|
|
|
+ extend.setPurchaseNo(bo.getPurchasingPersonnel());
|
|
|
extendMapper.insert(extend);
|
|
|
}
|
|
|
|
|
|
@@ -894,6 +831,9 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
if (bo.getServiceGuarantee() != null) existing.setServiceGuarantee(bo.getServiceGuarantee());
|
|
|
if (bo.getFreeInstallation() != null) existing.setIsInstallService(bo.getFreeInstallation());
|
|
|
if (bo.getSalesVolume() != null) existing.setSalesVolume(bo.getSalesVolume());
|
|
|
+ if (bo.getProductNature() != null) existing.setShelfComments(bo.getShelfComments());
|
|
|
+ if (bo.getProductNature() != null) existing.setPurchaseManagerNo(bo.getProductNature());
|
|
|
+ if (bo.getPurchasingPersonnel() != null) existing.setPurchaseNo(bo.getPurchasingPersonnel());
|
|
|
extendMapper.updateById(existing);
|
|
|
} else {
|
|
|
// 不存在则新增
|
|
|
@@ -920,10 +860,12 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
if (bo.getStandardPrice() != null) existing.setMemberPrice(bo.getStandardPrice());
|
|
|
if (bo.getCertificatePrice() != null) existing.setMinSellingPrice(bo.getCertificatePrice());
|
|
|
if (bo.getPurchasePrice() != null) existing.setPurchasingPrice(bo.getPurchasePrice());
|
|
|
+ if (bo.getTaxRate() != null) existing.setTaxRate(bo.getTaxRate());
|
|
|
if (bo.getEstimatedPurchasePrice() != null) existing.setMaxPurchasePrice(bo.getEstimatedPurchasePrice());
|
|
|
- if(bo.getTotalInventory() != null) existing.setTotalInventory(bo.getTotalInventory());
|
|
|
+ if(bo.getTotalInventory() != null) existing.setTotalInventory(bo.getVirtualInventory()+existing.getNowInventory());
|
|
|
if(bo.getNowInventory() != null) existing.setNowInventory(bo.getNowInventory());
|
|
|
if(bo.getVirtualInventory() != null) existing.setVirtualInventory(bo.getVirtualInventory());
|
|
|
+
|
|
|
priceInventoryMapper.updateById(existing);
|
|
|
} else {
|
|
|
// 创建新记录
|
|
|
@@ -996,6 +938,27 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 更新库存
|
|
|
+ *
|
|
|
+ * @param bo
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean updateStock(ProductBaseBo bo) {
|
|
|
+ ProductPriceInventory productPriceInventory = priceInventoryMapper.selectById(bo.getId());
|
|
|
+ // 更新库存
|
|
|
+ productPriceInventory.setTotalInventory(productPriceInventory.getNowInventory() + bo.getVirtualInventory());
|
|
|
+ productPriceInventory.setVirtualInventory(bo.getVirtualInventory());
|
|
|
+ boolean b = priceInventoryMapper.updateById(productPriceInventory) > 0;
|
|
|
+
|
|
|
+ esMapper.update(new LambdaEsQueryWrapper<ProductBaseVo>()
|
|
|
+ .eq(ProductBaseVo::getId, bo.getId())
|
|
|
+ .set(ProductBaseVo::getTotalInventory, productPriceInventory.getTotalInventory())
|
|
|
+ .set(ProductBaseVo::getVirtualInventory, productPriceInventory.getVirtualInventory())
|
|
|
+ );
|
|
|
+ return b;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 校验并批量删除产品基础信息信息
|
|
|
* 性能优化:使用批量删除替代循环删除,减少数据库交互次数
|
|
|
@@ -1325,17 +1288,19 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
* 商品类型改变
|
|
|
*
|
|
|
* @param bo
|
|
|
+ * @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public void changeProductType(ProductBaseBo bo) {
|
|
|
+ public int changeProductType(ProductBaseBo bo) {
|
|
|
if( ObjectUtil.isEmpty(bo.getProductCategory())){
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
}
|
|
|
baseMapper.update(Wrappers.lambdaUpdate(ProductBase.class)
|
|
|
.set(ProductBase::getProductCategory, bo.getProductCategory())
|
|
|
.eq(ProductBase::getId, bo.getId())
|
|
|
);
|
|
|
syncToES(bo.getId());
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -1438,7 +1403,6 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
.in(ProductBaseVo::getProductNo, productNos)
|
|
|
// .eq(ProductBaseVo::getProductStatus, 1)
|
|
|
;
|
|
|
-
|
|
|
// 检查ES索引是否存在
|
|
|
if (!esMapper.existsIndex("productbasevo")) {
|
|
|
log.warn("ES索引 [productbasevo] 不存在,降级到数据库查询");
|
|
|
@@ -1474,7 +1438,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
public TableDataInfo<PcProductVo> getPcProductPage(PcProductBo bo, PageQuery pageQuery) {
|
|
|
QueryWrapper<ProductBase> lqw = Wrappers.query(ProductBase.class);
|
|
|
if(ObjectUtil.isNotEmpty( bo.getIds())){
|
|
|
- lqw.in("b.id", bo.getIds());
|
|
|
+ lqw.in("b.id", bo.getIds().split(","));
|
|
|
}
|
|
|
if (ObjectUtil.isNotEmpty(bo.getBrandIds())){
|
|
|
lqw.in("b.brand_id", bo.getBrandIds().split(","));
|
|
|
@@ -2111,5 +2075,131 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
}
|
|
|
return List.of();
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取自营商品列表
|
|
|
+ *
|
|
|
+ * @param bo
|
|
|
+ * @param pageQuery
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<ProductBaseVo> getSelfProductList(ProductBaseBo bo, PageQuery pageQuery) {
|
|
|
+ List<ProductSelfVo> productSelfVos = productSelfMapper.selectVoList(Wrappers.lambdaQuery(ProductSelf.class)
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getAuditStatus()),ProductSelf::getAuditStatus, bo.getAuditStatus())
|
|
|
+ );
|
|
|
+ if (CollUtil.isEmpty(productSelfVos)) {
|
|
|
+ return TableDataInfo.build();
|
|
|
+ }
|
|
|
+ LambdaEsQueryWrapper<ProductBaseVo> esQueryWrapper = new LambdaEsQueryWrapper<>();
|
|
|
+
|
|
|
+ esQueryWrapper.in(ProductBaseVo::getId, productSelfVos.stream().map(ProductSelfVo::getProductId).toList())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getProductNo()), ProductBaseVo::getProductNo, bo.getProductNo())
|
|
|
+ .like(ObjectUtil.isNotEmpty(bo.getItemName()), ProductBaseVo::getItemName, bo.getItemName())
|
|
|
+ .like(ObjectUtil.isNotEmpty(bo.getBrandName()), ProductBaseVo::getBrandName, bo.getBrandName())
|
|
|
+ .eq(bo.getBrandId() != null, ProductBaseVo::getBrandId, bo.getBrandId())
|
|
|
+ .eq(bo.getTopCategoryId() != null, ProductBaseVo::getTopCategoryId, bo.getTopCategoryId())
|
|
|
+ .eq(bo.getMediumCategoryId() != null, ProductBaseVo::getMediumCategoryId, bo.getMediumCategoryId())
|
|
|
+ .eq(bo.getBottomCategoryId() != null, ProductBaseVo::getBottomCategoryId, bo.getBottomCategoryId())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getUnitId()), ProductBaseVo::getUnitId, bo.getUnitId())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getProductStatus()), ProductBaseVo::getProductStatus, bo.getProductStatus())
|
|
|
+ .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())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getProductCategory()), ProductBaseVo::getProductCategory, bo.getProductCategory())
|
|
|
+ .orderByDesc(ProductBaseVo::getCreateTime)
|
|
|
+ ;
|
|
|
+ EsPageInfo<ProductBaseVo> esPageInfo = esMapper.pageQuery(esQueryWrapper, pageQuery.getPageNum(), pageQuery.getPageSize());
|
|
|
+ TableDataInfo<ProductBaseVo> tableDataInfo = TableDataInfo.build(esPageInfo.getList());
|
|
|
+ tableDataInfo.setTotal(esPageInfo.getTotal());
|
|
|
+ tableDataInfo.getRows().forEach(item -> {
|
|
|
+ item.setAuditStatus(productSelfVos.stream().filter(o -> o.getProductId().equals(item.getId())).findFirst().get().getAuditStatus());
|
|
|
+ item.setAuditReason(productSelfVos.stream().filter(o -> o.getProductId().equals(item.getId())).findFirst().get().getAuditReason());
|
|
|
+ });
|
|
|
+ return tableDataInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取精品商品列表
|
|
|
+ *
|
|
|
+ * @param bo
|
|
|
+ * @param pageQuery
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<ProductBaseVo> getGoodProductList(ProductBaseBo bo, PageQuery pageQuery) {
|
|
|
+ List<ProductExquisiteVo> productSelfVos = productExquisiteMapper.selectVoList(Wrappers.lambdaQuery(ProductExquisite.class)
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getAuditStatus()),ProductExquisite::getAuditStatus, bo.getAuditStatus())
|
|
|
+ );
|
|
|
+ if (CollUtil.isEmpty(productSelfVos)) {
|
|
|
+ return TableDataInfo.build();
|
|
|
+ }
|
|
|
+ LambdaEsQueryWrapper<ProductBaseVo> esQueryWrapper = new LambdaEsQueryWrapper<>();
|
|
|
+
|
|
|
+ esQueryWrapper.in(ProductBaseVo::getId, productSelfVos.stream().map(ProductExquisiteVo::getProductId).toList())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getProductNo()), ProductBaseVo::getProductNo, bo.getProductNo())
|
|
|
+ .like(ObjectUtil.isNotEmpty(bo.getItemName()), ProductBaseVo::getItemName, bo.getItemName())
|
|
|
+ .like(ObjectUtil.isNotEmpty(bo.getBrandName()), ProductBaseVo::getBrandName, bo.getBrandName())
|
|
|
+ .eq(bo.getBrandId() != null, ProductBaseVo::getBrandId, bo.getBrandId())
|
|
|
+ .eq(bo.getTopCategoryId() != null, ProductBaseVo::getTopCategoryId, bo.getTopCategoryId())
|
|
|
+ .eq(bo.getMediumCategoryId() != null, ProductBaseVo::getMediumCategoryId, bo.getMediumCategoryId())
|
|
|
+ .eq(bo.getBottomCategoryId() != null, ProductBaseVo::getBottomCategoryId, bo.getBottomCategoryId())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getUnitId()), ProductBaseVo::getUnitId, bo.getUnitId())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getProductStatus()), ProductBaseVo::getProductStatus, bo.getProductStatus())
|
|
|
+ .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())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getProductCategory()), ProductBaseVo::getProductCategory, bo.getProductCategory())
|
|
|
+ .orderByDesc(ProductBaseVo::getCreateTime)
|
|
|
+ ;
|
|
|
+ EsPageInfo<ProductBaseVo> esPageInfo = esMapper.pageQuery(esQueryWrapper, pageQuery.getPageNum(), pageQuery.getPageSize());
|
|
|
+ TableDataInfo<ProductBaseVo> tableDataInfo = TableDataInfo.build(esPageInfo.getList());
|
|
|
+ tableDataInfo.setTotal(esPageInfo.getTotal());
|
|
|
+ tableDataInfo.getRows().forEach(item -> {
|
|
|
+ item.setAuditStatus(productSelfVos.stream().filter(o -> o.getProductId().equals(item.getId())).findFirst().get().getAuditStatus());
|
|
|
+ item.setAuditReason(productSelfVos.stream().filter(o -> o.getProductId().equals(item.getId())).findFirst().get().getAuditReason());
|
|
|
+ });
|
|
|
+ return tableDataInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取项目商品列表
|
|
|
+ *
|
|
|
+ * @param bo
|
|
|
+ * @param pageQuery
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<ProductBaseVo> getItemProductList(ProductBaseBo bo, PageQuery pageQuery) {
|
|
|
+ List<ExternalProductDto> externalProductList = externalProductService.getExternalProductList(bo.getItemId());
|
|
|
+ if (CollUtil.isEmpty(externalProductList)) {
|
|
|
+ return TableDataInfo.build();
|
|
|
+ }
|
|
|
+ LambdaEsQueryWrapper<ProductBaseVo> esQueryWrapper = new LambdaEsQueryWrapper<>();
|
|
|
+ esQueryWrapper.in(ProductBaseVo::getId, externalProductList.stream().map(ExternalProductDto::getProductId).toList())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getProductNo()), ProductBaseVo::getProductNo, bo.getProductNo())
|
|
|
+ .like(ObjectUtil.isNotEmpty(bo.getItemName()), ProductBaseVo::getItemName, bo.getItemName())
|
|
|
+ .like(ObjectUtil.isNotEmpty(bo.getBrandName()), ProductBaseVo::getBrandName, bo.getBrandName())
|
|
|
+ .eq(bo.getBrandId() != null, ProductBaseVo::getBrandId, bo.getBrandId())
|
|
|
+ .eq(bo.getTopCategoryId() != null, ProductBaseVo::getTopCategoryId, bo.getTopCategoryId())
|
|
|
+ .eq(bo.getMediumCategoryId() != null, ProductBaseVo::getMediumCategoryId, bo.getMediumCategoryId())
|
|
|
+ .eq(bo.getBottomCategoryId() != null, ProductBaseVo::getBottomCategoryId, bo.getBottomCategoryId())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getUnitId()), ProductBaseVo::getUnitId, bo.getUnitId())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getProductStatus()), ProductBaseVo::getProductStatus, bo.getProductStatus())
|
|
|
+ .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())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getProductCategory()), ProductBaseVo::getProductCategory, bo.getProductCategory())
|
|
|
+ .orderByDesc(ProductBaseVo::getCreateTime)
|
|
|
+ ;
|
|
|
+ EsPageInfo<ProductBaseVo> esPageInfo = esMapper.pageQuery(esQueryWrapper, pageQuery.getPageNum(), pageQuery.getPageSize());
|
|
|
+ TableDataInfo<ProductBaseVo> tableDataInfo = TableDataInfo.build(esPageInfo.getList());
|
|
|
+ tableDataInfo.setTotal(esPageInfo.getTotal());
|
|
|
+ tableDataInfo.getRows().forEach(item -> {
|
|
|
+ item.setAuditStatus(externalProductList.stream().filter(o -> o.getProductId().equals(item.getId())).findFirst().get().getAuditStatus());
|
|
|
+ item.setAuditReason(externalProductList.stream().filter(o -> o.getProductId().equals(item.getId())).findFirst().get().getAuditReason());
|
|
|
+ item.setExternalPrice(externalProductList.stream().filter(o -> o.getProductId().equals(item.getId())).findFirst().get().getExternalPrice());
|
|
|
+ item.setConnectStatus(externalProductList.stream().filter(o -> o.getProductId().equals(item.getId())).findFirst().get().getConnectStatus());
|
|
|
+ });
|
|
|
+
|
|
|
+ return tableDataInfo;
|
|
|
+ }
|
|
|
}
|
|
|
|