|
|
@@ -1,5 +1,7 @@
|
|
|
package org.dromara.product.service.impl;
|
|
|
|
|
|
+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 com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
@@ -22,30 +24,26 @@ 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.vo.ProductBrandVo;
|
|
|
-import org.dromara.product.domain.vo.StatusCountVo;
|
|
|
+import org.dromara.product.domain.bo.PcProductBo;
|
|
|
+import org.dromara.product.domain.bo.ProductCategoryBo;
|
|
|
+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;
|
|
|
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.vo.ProductBaseVo;
|
|
|
-import org.dromara.product.domain.vo.ProductBaseSimpleVo;
|
|
|
-import org.dromara.product.domain.vo.ProductOperationVo;
|
|
|
-import org.dromara.product.domain.vo.RecommendProductVo;
|
|
|
-import org.dromara.product.domain.vo.SiteProductVo;
|
|
|
import org.dromara.product.domain.ProductBase;
|
|
|
import org.dromara.product.domain.ProductExtend;
|
|
|
import org.dromara.product.domain.ProductClassification;
|
|
|
import org.dromara.product.domain.ProductCustomization;
|
|
|
import org.dromara.product.service.IProductBaseService;
|
|
|
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.Collection;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import com.fasterxml.jackson.core.type.TypeReference;
|
|
|
import java.math.BigDecimal;
|
|
|
@@ -109,9 +107,21 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
private final ProductBrandMapper brandMapper;
|
|
|
//单位信息
|
|
|
private final ProductUnitMapper unitMapper;
|
|
|
+ //推荐位
|
|
|
+ private final ProductRecommendLinkMapper productRecommendLinkMapper;
|
|
|
+ //平台装修楼层商品
|
|
|
+ private final ProductDecorationFloorLinkMapper decorationFloorLinkMapper;
|
|
|
|
|
|
private final ProductPhotosMapper photosMapper;
|
|
|
|
|
|
+ private final ProductCategoryRecommendedLinkMapper productCategoryRecommendedLinkMapper;
|
|
|
+
|
|
|
+ private final ProductCollectMapper productCollectMapper;
|
|
|
+
|
|
|
+ private final ProductBrowsingHistoryMapper productBrowsingHistoryMapper;
|
|
|
+
|
|
|
+ private final ProductShoppingCartMapper productShoppingCartMapper;
|
|
|
+
|
|
|
private final ProductEsMapper esMapper;
|
|
|
|
|
|
@DubboReference
|
|
|
@@ -356,9 +366,9 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
int limit = pageQuery.getPageSize() + 1;
|
|
|
lqw.last("limit "+ limit );
|
|
|
List<ProductBaseVo> result = baseMapper.selectAllList(lqw);
|
|
|
- result.forEach(vo -> {
|
|
|
-
|
|
|
- });
|
|
|
+// result.forEach(vo -> {
|
|
|
+//
|
|
|
+// });
|
|
|
int size = result.size();
|
|
|
if (size > pageQuery.getPageSize()) {
|
|
|
result.remove(result.size() - 1);
|
|
|
@@ -1137,5 +1147,251 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
|
|
|
Page<ProductBaseSimpleVo> page = baseMapper.selectSimplePage(pageQuery.build(), bo);
|
|
|
return TableDataInfo.build(page);
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 行家精选商品列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<PcProductVo> getExpertSelectionList(Long recommendId) {
|
|
|
+ //获取行家精选商品Id
|
|
|
+ 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();
|
|
|
+ //获取行家精选商品
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return List.of();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分类楼层详情
|
|
|
+ *
|
|
|
+ * @param floorNo
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<PcProductVo> getClassificationFloorDetail(Long floorNo) {
|
|
|
+ List<ProductDecorationFloorLinkVo> productDecorationFloorLinkVos = decorationFloorLinkMapper.selectVoList(Wrappers.lambdaQuery(ProductDecorationFloorLink.class)
|
|
|
+ .eq(ProductDecorationFloorLink::getFloorNo, floorNo)
|
|
|
+ );
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return List.of();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * PC端商品列表
|
|
|
+ *
|
|
|
+ * @param bo
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<PcProductVo> getPcProductPage(PcProductBo bo, PageQuery pageQuery) {
|
|
|
+ QueryWrapper<ProductBase> lqw = Wrappers.query(ProductBase.class);
|
|
|
+ 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("b.product_status", 1);
|
|
|
+ lqw.and(ObjectUtil.isNotEmpty(bo.getSearchKeyword())
|
|
|
+ , (queryWrapper) -> queryWrapper.and(qw ->
|
|
|
+ qw.like("b.item_name", bo.getSearchKeyword())
|
|
|
+ .or().like("tc.category_name", bo.getSearchKeyword())
|
|
|
+ .or().like("mc.category_name", bo.getSearchKeyword())
|
|
|
+ .or().like("bc.category_name", bo.getSearchKeyword())
|
|
|
+ .or().like("br.brand_name", bo.getSearchKeyword())
|
|
|
+ )
|
|
|
+ );
|
|
|
+ lqw.eq(ObjectUtil.isNotEmpty(bo.getBrandId()), "b.brand_id", bo.getBrandId());
|
|
|
+ lqw.eq(ObjectUtil.isNotEmpty(bo.getTopCategoryId()), "b.top_category_id", bo.getTopCategoryId());
|
|
|
+ lqw.eq(ObjectUtil.isNotEmpty(bo.getMiddleCategoryId()), "b.middle_category_id", bo.getMiddleCategoryId());
|
|
|
+ lqw.eq(ObjectUtil.isNotEmpty(bo.getBottomCategoryId()), "b.bottom_category_id", bo.getBottomCategoryId());
|
|
|
+ lqw.eq(ObjectUtil.isNotEmpty(bo.getIsCustomize()), "e.is_customize", bo.getIsCustomize());
|
|
|
+ if(bo.getPriceRange() != null){
|
|
|
+ //价格区间 1:1-100 2:100-500 3:500-1000 4:1000以上
|
|
|
+ switch (bo.getPriceRange()) {
|
|
|
+ case "1":
|
|
|
+ lqw.between("b.market_price", 1, 100);
|
|
|
+ case "2":
|
|
|
+ lqw.between("b.market_price", 100, 500);
|
|
|
+ case "3":
|
|
|
+ lqw.between("b.market_price", 500, 1000);
|
|
|
+ case "4":
|
|
|
+ lqw.ge("b.market_price", 1000);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(bo.getSortField() != null && bo.getSortOrder() != null){
|
|
|
+ String[] sortFields = bo.getSortField().split(",");
|
|
|
+ String[] sortOrders = bo.getSortOrder().split(",");
|
|
|
+ for (int i = 0; i < sortFields.length; i++) {
|
|
|
+ switch (bo.getPriceRange()) {
|
|
|
+ case "1":
|
|
|
+ lqw.orderBy( true, sortOrders[i].equals("asc"),"b.id");
|
|
|
+ case "2":
|
|
|
+ lqw.orderBy( true, sortOrders[i].equals("asc"),"p.total_inventory");
|
|
|
+ case "3":
|
|
|
+ lqw.orderBy( true, sortOrders[i].equals("asc"),"p.market_price");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 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()) {
|
|
|
+ productBaseVos.remove(productBaseVos.size() - 1);
|
|
|
+ }
|
|
|
+ TableDataInfo<ProductBaseVo> tableDataInfo = TableDataInfo.build(productBaseVos);
|
|
|
+ tableDataInfo.setTotal(size);
|
|
|
+ return TableDataInfo.build(pcProductVos);
|
|
|
+ }
|
|
|
+ return TableDataInfo.build();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * PC端商品浏览记录
|
|
|
+ *
|
|
|
+ * @param userId
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<PcProductVo> getProductBrowsingHistoryPage(Long userId, PageQuery pageQuery) {
|
|
|
+ List<ProductBrowsingHistoryVo> productBrowsingHistoryVos = productBrowsingHistoryMapper.selectVoList(Wrappers.lambdaQuery(ProductBrowsingHistory.class)
|
|
|
+ .eq(ProductBrowsingHistory::getUserId, userId)
|
|
|
+ );
|
|
|
+ if (CollUtil.isNotEmpty(productBrowsingHistoryVos)) {
|
|
|
+ List<Long> productIds = productBrowsingHistoryVos.stream().map(ProductBrowsingHistoryVo::getProductId).toList();
|
|
|
+ //获取商品浏览记录
|
|
|
+ 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 = productBaseVos.size();
|
|
|
+ if (size > pageQuery.getPageSize()) {
|
|
|
+ productBaseVos.remove(productBaseVos.size() - 1);
|
|
|
+ }
|
|
|
+ TableDataInfo<ProductBaseVo> tableDataInfo = TableDataInfo.build(productBaseVos);
|
|
|
+ tableDataInfo.setTotal(size);
|
|
|
+ return TableDataInfo.build(pcProductVos);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * PC端商品收藏夹
|
|
|
+ *
|
|
|
+ * @param favoritesId
|
|
|
+ * @param userId
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<PcProductVo> getProductFavoritesPage(Long favoritesId, Long userId, PageQuery pageQuery) {
|
|
|
+ //获取收藏夹商品id
|
|
|
+ List<ProductCollectVo> productFavoritesLinkVos = productCollectMapper.selectVoList(Wrappers.lambdaQuery(ProductCollect.class)
|
|
|
+ .eq(ProductCollect::getFavoritesId, favoritesId)
|
|
|
+ .eq(ProductCollect::getUserId, userId)
|
|
|
+ );
|
|
|
+ if (CollUtil.isNotEmpty(productFavoritesLinkVos)) {
|
|
|
+ List<Long> productIds = productFavoritesLinkVos.stream().map(ProductCollectVo::getProductId).toList();
|
|
|
+ //获取收藏夹商品
|
|
|
+ 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);
|
|
|
+
|
|
|
+// productBaseVos.forEach(vo -> {
|
|
|
+// });
|
|
|
+ int size = productBaseVos.size();
|
|
|
+ if (size > pageQuery.getPageSize()) {
|
|
|
+ productBaseVos.remove(productBaseVos.size() - 1);
|
|
|
+ }
|
|
|
+ TableDataInfo<ProductBaseVo> tableDataInfo = TableDataInfo.build(productBaseVos);
|
|
|
+ tableDataInfo.setTotal( size);
|
|
|
+ return TableDataInfo.build(pcProductVos);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return TableDataInfo.build();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * PC端分类推荐商品
|
|
|
+ *
|
|
|
+ * @param categoryId
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<PcProductVo> getCategoryRecommendProductPage(Long categoryId, PageQuery pageQuery) {
|
|
|
+ //获取推荐的商品id
|
|
|
+ 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);
|
|
|
+ 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);
|
|
|
+ return TableDataInfo.build(pcProductVos);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return TableDataInfo.build();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * PC端商品购物车
|
|
|
+ *
|
|
|
+ * @param userId
|
|
|
+ * @param pageQuery
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<PcProductVo> getProductShoppingCartPage(Long userId, PageQuery pageQuery) {
|
|
|
+ Page<ProductShoppingCart> productShoppingCartPage = productShoppingCartMapper.selectPage(pageQuery.build(), Wrappers.lambdaQuery(ProductShoppingCart.class)
|
|
|
+ .eq(ProductShoppingCart::getUserId, userId)
|
|
|
+ );
|
|
|
+ if (CollUtil.isNotEmpty(productShoppingCartPage.getRecords())) {
|
|
|
+ List<PcProductVo> productVos = new ArrayList<>();
|
|
|
+ for (ProductShoppingCart productShoppingCart : productShoppingCartPage.getRecords()) {
|
|
|
+ PcProductVo productVo = new PcProductVo();
|
|
|
+ List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(Wrappers.query(ProductBase.class)
|
|
|
+ .eq("b.id", productShoppingCart.getProductId())
|
|
|
+ );
|
|
|
+ if (CollUtil.isNotEmpty(productBaseVos)) {
|
|
|
+ BeanUtil.copyProperties(productBaseVos.get(0), productVo);
|
|
|
+ productVo.setProductNum(productShoppingCart.getProductNum());
|
|
|
+ productVos.add(productVo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ TableDataInfo<PcProductVo> build = TableDataInfo.build(productVos);
|
|
|
+ build.setTotal(productShoppingCartPage.getTotal());
|
|
|
+ return build;
|
|
|
+ }
|
|
|
+
|
|
|
+ return TableDataInfo.build();
|
|
|
+ }
|
|
|
}
|
|
|
|