Преглед изворни кода

广誉远商品api接口优化

wangzhijun пре 13 часа
родитељ
комит
4e5745a41e

+ 7 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/mapper/TXiangmuMapper.java

@@ -1,8 +1,12 @@
 package com.ylx.massage.mapper;
 package com.ylx.massage.mapper;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ylx.massage.domain.dto.OptionDTO;
+import com.ylx.massage.domain.vo.ProductOptionVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
 import com.ylx.massage.domain.TXiangmu;
 import com.ylx.massage.domain.TXiangmu;
+import org.apache.ibatis.annotations.Param;
 
 
 /**
 /**
  * 项目mapper接口
  * 项目mapper接口
@@ -10,4 +14,7 @@ import com.ylx.massage.domain.TXiangmu;
 @Mapper
 @Mapper
 public interface TXiangmuMapper extends BaseMapper<TXiangmu> {
 public interface TXiangmuMapper extends BaseMapper<TXiangmu> {
 
 
+    Page<ProductOptionVO> selectOptionUnionPage(Page<ProductOptionVO> page, @Param("dto") OptionDTO dto);
+
+
 }
 }

+ 7 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/TXiangmuService.java

@@ -1,8 +1,13 @@
 package com.ylx.massage.service;
 package com.ylx.massage.service;
 
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ylx.massage.domain.TXiangmu;
 import com.ylx.massage.domain.TXiangmu;
+import com.ylx.massage.domain.dto.OptionDTO;
+import com.ylx.massage.domain.vo.ProductOptionVO;
 import com.ylx.massage.domain.vo.TXiangmuDetailVo;
 import com.ylx.massage.domain.vo.TXiangmuDetailVo;
+import org.apache.ibatis.annotations.Param;
 
 
 
 
 /**
 /**
@@ -16,4 +21,6 @@ public interface TXiangmuService extends IService<TXiangmu> {
     Boolean addOrUpdate(TXiangmu xiangmu);
     Boolean addOrUpdate(TXiangmu xiangmu);
 
 
     TXiangmuDetailVo details(TXiangmu xiangmu);
     TXiangmuDetailVo details(TXiangmu xiangmu);
+
+    IPage<ProductOptionVO> selectOptionUnionPage(Page page, OptionDTO dto);
 }
 }

+ 12 - 76
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/ProductSelectionServiceImpl.java

@@ -2,6 +2,7 @@ package com.ylx.massage.service.impl;
 
 
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.massage.domain.Product;
 import com.ylx.massage.domain.Product;
 import com.ylx.massage.domain.TXiangmu;
 import com.ylx.massage.domain.TXiangmu;
@@ -42,9 +43,7 @@ public class ProductSelectionServiceImpl implements ProductSelectionService {
         }
         }
 
 
         // 3. 查询全部 (Type = null)
         // 3. 查询全部 (Type = null)
-        // 注意:跨表分页比较复杂,这里采用“分别查询当前页数据然后合并”的策略
-        // 如果数据量极大且必须严格排序,建议使用自定义 SQL 或 搜索引擎
-        return queryAllProducts(page, dto);
+        return queryAllProductsUnion(page, dto);
     }
     }
 
 
     /**
     /**
@@ -103,79 +102,16 @@ public class ProductSelectionServiceImpl implements ProductSelectionService {
      * 3. 获取总列表的大小作为 total。
      * 3. 获取总列表的大小作为 total。
      * 4. 根据分页参数截取当前页的数据。
      * 4. 根据分页参数截取当前页的数据。
      */
      */
-    private Page<ProductOptionVO> queryAllProducts(Page<ProductOptionVO> page, OptionDTO dto) {
-        long current = page.getCurrent();
-        long size = page.getSize();
-
-        // --- 1. 查出积分商品列表 (全量) ---
-        LambdaQueryWrapper<Product> productWrapper = new LambdaQueryWrapper<>();
-        productWrapper.eq(Product::getStatus, 1)
-                .eq(Product::getDeleted, 0);
-        if (StrUtil.isNotEmpty(dto.getTitle())) {
-            productWrapper.like(Product::getName, dto.getTitle());
-        }
-        List<Product> integralList = productService.list(productWrapper);
-
-        // --- 2. 查出项目商品列表 (全量) ---
-        LambdaQueryWrapper<TXiangmu> xiangmuWrapper = new LambdaQueryWrapper<>();
-        xiangmuWrapper.eq(TXiangmu::getIsDelete, 0);
-        if (StrUtil.isNotEmpty(dto.getTitle())) {
-            xiangmuWrapper.like(TXiangmu::getcTitle, dto.getTitle());
-        }
-        List<TXiangmu> projectList = xiangmuService.list(xiangmuWrapper);
-
-        // --- 3. 转换为 VO 并合并 (关键步骤) ---
-        List<ProductOptionVO> totalList = new ArrayList<>();
-
-        // 添加积分商品
-        totalList.addAll(integralList.stream().map(p -> {
-            ProductOptionVO vo = new ProductOptionVO();
-            vo.setId(String.valueOf(p.getId()));
-            vo.setProductType(1);
-            vo.setTitle(p.getName());
-            return vo;
-        }).collect(Collectors.toList()));
-
-        // 添加项目商品
-        totalList.addAll(projectList.stream().map(x -> {
-            ProductOptionVO vo = new ProductOptionVO();
-            vo.setId(x.getcId());
-            vo.setProductType(0);
-            vo.setTitle(x.getcTitle());
-            return vo;
-        }).collect(Collectors.toList()));
-
-        // --- 4. 计算总记录数 (这就是你要的修正点) ---
-        // total 是两张表数据的总和
-        long total = totalList.size();
-
-        // --- 5. 内存分页截取 ---
-        // 计算起始索引
-        long offset = (current - 1) * size;
-
-        // 边界检查:如果起始位置超过总数,说明这一页没数据
-        if (offset >= total) {
-            // 返回空列表,但保留 total 以便前端计算页数
-            Page<ProductOptionVO> resultPage = new Page<>(current, size);
-            resultPage.setRecords(new ArrayList<>());
-            resultPage.setTotal(total);
-            resultPage.setPages(total == 0 ? 0 : (total + size - 1) / size);
-            return resultPage;
-        }
-
-        // 计算结束索引
-        long limit = Math.min(offset + size, total);
-
-        // 截取当前页数据
-        List<ProductOptionVO> records = totalList.subList((int) offset, (int) limit);
-
-        // --- 6. 构建返回结果 ---
-        Page<ProductOptionVO> resultPage = new Page<>(current, size);
-        resultPage.setRecords(records);
-        resultPage.setTotal(total); // 设置总和
-        resultPage.setPages(total == 0 ? 0 : (total + size - 1) / size); // 计算总页数
-
-        return resultPage;
+    private Page<ProductOptionVO> queryAllProductsUnion(Page page, OptionDTO dto) {
+        // 调用自定义 SQL
+        IPage<ProductOptionVO> resultPage = xiangmuService.selectOptionUnionPage(page, dto);
+
+        // 将 IPage 转为具体的 Page 实现类返回(如果需要)
+        Page<ProductOptionVO> returnPage = new Page<>(page.getCurrent(), page.getSize());
+        returnPage.setRecords(resultPage.getRecords());
+        returnPage.setTotal(resultPage.getTotal());
+        returnPage.setPages(resultPage.getPages());
+        return returnPage;
     }
     }
 
 
     /**
     /**

+ 9 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TXiangmuServiceImpl.java

@@ -3,6 +3,8 @@ package com.ylx.massage.service.impl;
 
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ylx.common.constant.MassageConstants;
 import com.ylx.common.constant.MassageConstants;
 import com.ylx.common.exception.ServiceException;
 import com.ylx.common.exception.ServiceException;
@@ -10,6 +12,8 @@ import com.ylx.common.utils.bean.BeanUtils;
 import com.ylx.massage.domain.TJs;
 import com.ylx.massage.domain.TJs;
 import com.ylx.massage.domain.TJsDay;
 import com.ylx.massage.domain.TJsDay;
 import com.ylx.massage.domain.TXiangmu;
 import com.ylx.massage.domain.TXiangmu;
+import com.ylx.massage.domain.dto.OptionDTO;
+import com.ylx.massage.domain.vo.ProductOptionVO;
 import com.ylx.massage.domain.vo.TXiangmuDetailVo;
 import com.ylx.massage.domain.vo.TXiangmuDetailVo;
 import com.ylx.massage.mapper.TJsDayMapper;
 import com.ylx.massage.mapper.TJsDayMapper;
 import com.ylx.massage.mapper.TXiangmuMapper;
 import com.ylx.massage.mapper.TXiangmuMapper;
@@ -89,4 +93,9 @@ public class TXiangmuServiceImpl extends ServiceImpl<TXiangmuMapper, TXiangmu> i
         }
         }
         return null;
         return null;
     }
     }
+
+    @Override
+    public IPage<ProductOptionVO> selectOptionUnionPage(Page page, OptionDTO dto) {
+        return baseMapper.selectOptionUnionPage(page, dto);
+    }
 }
 }

+ 34 - 0
nightFragrance-massage/src/main/resources/mapper/massage/TXiangmuMapper.xml

@@ -23,4 +23,38 @@
         c_id, c_title, c_cover, d_yuan_price, d_price, n_minute, c_ld_list, n_sex_limit, c_syrq, c_detail, n_sale_number, dt_create_time
         c_id, c_title, c_cover, d_yuan_price, d_price, n_minute, c_ld_list, n_sex_limit, c_syrq, c_detail, n_sale_number, dt_create_time
     </sql>
     </sql>
 
 
+    <!-- 结果集映射 -->
+    <resultMap id="OptionVOMap" type="com.ylx.massage.domain.vo.ProductOptionVO">
+        <result column="id" property="id"/>
+        <result column="title" property="title"/>
+        <result column="productType" property="productType"/>
+    </resultMap>
+
+    <!-- 核心 SQL:UNION ALL 分页查询 -->
+    <select id="selectOptionUnionPage" resultMap="OptionVOMap">
+        SELECT * FROM (
+        <!-- 第一部分:积分商品 -->
+        SELECT
+        CAST(id AS CHAR) as id,
+        name as title,
+        1 as productType
+        FROM product
+        WHERE status = 1 AND deleted = 0
+        <if test="dto.title != null and dto.title != ''">
+            AND name LIKE CONCAT('%', #{dto.title}, '%')
+        </if>
+        UNION ALL
+        <!-- 第二部分:项目商品 -->
+        SELECT
+        c_id as id,
+        c_title as title,
+        0 as productType
+        FROM t_xiangmu
+        WHERE is_delete = 0
+        <if test="dto.title != null and dto.title != ''">
+            AND c_title LIKE CONCAT('%', #{dto.title}, '%')
+        </if>
+        ) as temp_table
+    </select>
+
 </mapper>
 </mapper>