Procházet zdrojové kódy

Merge remote-tracking branch 'origin/point_dev' into point_dev

jinshihui před 19 hodinami
rodič
revize
cc587bdd7d

+ 32 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/ProductSelectionController.java

@@ -0,0 +1,32 @@
+package com.ylx.web.controller.massage;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ylx.common.core.domain.R;
+import com.ylx.massage.domain.dto.OptionDTO;
+import com.ylx.massage.domain.vo.ProductOptionVO;
+import com.ylx.massage.service.ProductSelectionService;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@Slf4j
+@RestController
+@RequestMapping("/api/products") // 假设的基础路径
+public class ProductSelectionController {
+
+    @Resource
+    private ProductSelectionService productSelectionService;
+
+    @ApiOperation("获取广誉远商品")
+    @PostMapping(value = "/options")
+    public R<Page<ProductOptionVO>> optionsPage( @RequestBody OptionDTO dto) {
+        Page<ProductOptionVO> pageData = this.productSelectionService.optionsPage(dto);
+        return R.ok(pageData);
+    }
+
+}

+ 1 - 1
nightFragrance-framework/src/main/java/com/ylx/framework/config/SecurityConfig.java

@@ -112,7 +112,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
                         "/api/lbt/v1/getAll", "/api/js/v1/select", "/api/xiangmu/v1/wx/getAll", "/api/order/v1/getStatus",
                         "/api/xiangmu/v1/getByid", "/api/xiangmu/v1/highlights", "/api/js/v1/wx/getByid", "/api/js/v1/wx/select", "/api/js/v1/wx/add", "/api/recharge/v1/test",
                         "/wx/pay/payNotify", "/wx/pay/refundNotify", "/weChat/getAccessToken", "/weChat/getCode", "/weChat/verifyToken", "/sq/getAccessToken",
-                        "/area/select", "/system/dept/list", "/api/xiangmu/v1/wx/recommend", "/product/category/create","/area/code","/product/category/list").permitAll()
+                        "/area/select", "/system/dept/list", "/api/xiangmu/v1/wx/recommend", "/product/category/create","/area/code","/product/category/list","/api/products/options").permitAll()
                 // 静态资源,可匿名访问
                 .antMatchers(HttpMethod.GET, "/", "/*.txt", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                 .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()

+ 16 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/OptionDTO.java

@@ -0,0 +1,16 @@
+package com.ylx.massage.domain.dto;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class OptionDTO extends Page {
+
+    @ApiModelProperty("商品名称")
+    private String title;
+
+    @ApiModelProperty("商品类型:0-服务商品 1-积分商品")
+    private Integer productType;
+
+}

+ 18 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/ProductOptionVO.java

@@ -0,0 +1,18 @@
+package com.ylx.massage.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ProductOptionVO {
+
+    @ApiModelProperty("商品id")
+    private String id;
+
+    @ApiModelProperty("商品名称")
+    private String title;
+
+    @ApiModelProperty("商品类型:0-服务商品为 1-积分商品为")
+    private Integer productType;
+
+}

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

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

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

@@ -0,0 +1,9 @@
+package com.ylx.massage.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ylx.massage.domain.dto.OptionDTO;
+import com.ylx.massage.domain.vo.ProductOptionVO;
+
+public interface ProductSelectionService {
+    Page<ProductOptionVO> optionsPage(OptionDTO dto);
+}

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

@@ -1,8 +1,13 @@
 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.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 org.apache.ibatis.annotations.Param;
 
 
 /**
@@ -16,4 +21,6 @@ public interface TXiangmuService extends IService<TXiangmu> {
     Boolean addOrUpdate(TXiangmu xiangmu);
 
     TXiangmuDetailVo details(TXiangmu xiangmu);
+
+    IPage<ProductOptionVO> selectOptionUnionPage(Page page, OptionDTO dto);
 }

+ 132 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/ProductSelectionServiceImpl.java

@@ -0,0 +1,132 @@
+package com.ylx.massage.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+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.ylx.massage.domain.Product;
+import com.ylx.massage.domain.TXiangmu;
+import com.ylx.massage.domain.dto.OptionDTO;
+import com.ylx.massage.domain.vo.ProductOptionVO;
+import com.ylx.massage.service.ProductSelectionService;
+import com.ylx.massage.service.ProductService;
+import com.ylx.massage.service.TXiangmuService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class ProductSelectionServiceImpl implements ProductSelectionService {
+
+    @Resource
+    private TXiangmuService xiangmuService; // 项目服务
+
+    @Resource
+    private ProductService productService; // 积分商品服务
+
+    @Override
+    public Page<ProductOptionVO> optionsPage(OptionDTO dto) {
+        Page page = new Page(dto.getCurrent(), dto.getSize());
+        Integer productType = dto.getProductType();
+
+        // 1. 只查积分商品 (Type = 1)
+        if (productType != null && productType == 1) {
+            return queryIntegralProducts(page, dto);
+        }
+
+        // 2. 只查项目/服务商品 (Type = 0)
+        if (productType != null && productType == 0) {
+            return queryProjectProducts(page, dto);
+        }
+
+        // 3. 查询全部 (Type = null)
+        return queryAllProductsUnion(page, dto);
+    }
+
+    /**
+     * 查询积分商品
+     */
+    private Page<ProductOptionVO> queryIntegralProducts(Page page, OptionDTO dto) {
+        // 构建查询条件
+        LambdaQueryWrapper<Product> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Product::getStatus, 1) // 假设 1 是上架
+                .eq(Product::getDeleted, 0); // 假设 0 是未删除
+        if (StrUtil.isNotEmpty(dto.getTitle())) {
+            wrapper.like(Product::getName, dto.getTitle());
+        }
+
+        // 执行分页查询
+        Page<Product> productPage = productService.page(page, wrapper);
+
+        // 转换 VO
+        return convertToVOPage(productPage, p -> {
+            ProductOptionVO vo = new ProductOptionVO();
+            vo.setId(String.valueOf(p.getId())); // Long 转 String
+            vo.setTitle(p.getName());
+            vo.setProductType(1); // 设置商品类型
+            return vo;
+        });
+    }
+
+    /**
+     * 查询项目商品
+     */
+    private Page<ProductOptionVO> queryProjectProducts(Page page, OptionDTO dto) {
+        // 构建查询条件
+        LambdaQueryWrapper<TXiangmu> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(TXiangmu::getIsDelete, 0);
+        if (StrUtil.isNotEmpty(dto.getTitle())) {
+            wrapper.like(TXiangmu::getcTitle, dto.getTitle());
+        }
+        // 执行分页查询
+        Page<TXiangmu> xiangmuPage = xiangmuService.page(page, wrapper);
+
+        // 转换 VO
+        return convertToVOPage(xiangmuPage, x -> {
+            ProductOptionVO vo = new ProductOptionVO();
+            vo.setId(x.getcId()); // String 直接赋值
+            vo.setTitle(x.getcTitle());
+            vo.setProductType(0); // 设置商品类型
+            return vo;
+        });
+    }
+
+    /**
+     * 查询全部 (合并分页逻辑)
+     * 核心逻辑:
+     * 1. 分别查询两张表的所有符合条件的数据(全量)。
+     * 2. 在内存中合并为一个总列表。
+     * 3. 获取总列表的大小作为 total。
+     * 4. 根据分页参数截取当前页的数据。
+     */
+    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;
+    }
+
+    /**
+     * 通用的 MyBatis-Plus Page 转 VO Page 方法
+     */
+    private <T, R> Page<R> convertToVOPage(Page<T> sourcePage, java.util.function.Function<T, R> converter) {
+        Page<R> voPage = new Page<>(sourcePage.getCurrent(), sourcePage.getSize());
+        voPage.setTotal(sourcePage.getTotal());
+        voPage.setPages(sourcePage.getPages());
+
+        List<R> records = sourcePage.getRecords().stream()
+                .map(converter)
+                .collect(Collectors.toList());
+        voPage.setRecords(records);
+
+        return voPage;
+    }
+}

+ 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 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.ylx.common.constant.MassageConstants;
 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.TJsDay;
 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.mapper.TJsDayMapper;
 import com.ylx.massage.mapper.TXiangmuMapper;
@@ -89,4 +93,9 @@ public class TXiangmuServiceImpl extends ServiceImpl<TXiangmuMapper, TXiangmu> i
         }
         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
     </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>