Ver Fonte

首页搜索接口

wangzhijun há 13 horas atrás
pai
commit
a2167b06fa

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

@@ -120,7 +120,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
                         "/technician/technician/getTechnician", "/technician/technician/getTechnicianInfo", "/technician/technician/getTechnicianList",
                         "/technician/technician/apply", "/technician/technician/resetPassword",
                         "/customer/banner/page", "/customer/service/category/**", "/technician/technician/profile",
-                        "/customer/city/**","/home/hot/recommend").permitAll()
+                        "/customer/city/**","/home/hot/recommend","/home/search/**").permitAll()
                 // 静态资源,可匿名访问
                 .antMatchers(HttpMethod.GET, "/", "/*.txt", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                 .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()

+ 48 - 0
nightFragrance-massage/src/main/java/com/ylx/home/search/controller/HomeSearchController.java

@@ -0,0 +1,48 @@
+package com.ylx.home.search.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ylx.common.core.domain.R;
+import com.ylx.home.search.domain.dto.SearchMerchantDTO;
+import com.ylx.home.search.domain.dto.SearchProjectDTO;
+import com.ylx.massage.service.IMaTechnicianService;
+import com.ylx.merchant.domain.dto.MerchantListDTO;
+import com.ylx.merchant.domain.vo.MerchantListVO;
+import com.ylx.project.domain.bookMerchant.vo.ProjectInfoVO;
+import com.ylx.project.service.ProjectService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+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;
+
+@RestController
+@RequestMapping("/home/search")
+@Api(tags = {"用户端首页搜索"})
+@Slf4j
+public class HomeSearchController {
+
+    @Resource
+    private ProjectService projectService;
+    @Resource
+    private IMaTechnicianService maTechnicianService;
+
+    @PostMapping("/merchants")
+    @ApiOperation("用户端首页搜索商户接口")
+    public R<Page<MerchantListVO>> merchants(@Validated @RequestBody MerchantListDTO dto) {
+        Page<MerchantListVO> voPage = this.maTechnicianService.homeSearchPage(dto);
+        return R.ok(voPage);
+    }
+
+    @PostMapping("/projects")
+    @ApiOperation("用户端首页搜索服务接口")
+    public R<Page<ProjectInfoVO>> projects(@Validated @RequestBody SearchProjectDTO dto) {
+        Page<ProjectInfoVO> voPage = this.projectService.homeSearchPage(dto);
+        return R.ok(voPage);
+    }
+    
+}

+ 22 - 0
nightFragrance-massage/src/main/java/com/ylx/home/search/domain/dto/SearchMerchantDTO.java

@@ -0,0 +1,22 @@
+package com.ylx.home.search.domain.dto;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotNull;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel("用户端首页搜索商户DTO")
+public class SearchMerchantDTO extends Page<SearchMerchantDTO> {
+
+    private String keyword;
+
+    @ApiModelProperty("服务类目ID")
+    @NotNull(message = "服务类目ID不能为空")
+    private Long categoryId;
+
+}

+ 15 - 0
nightFragrance-massage/src/main/java/com/ylx/home/search/domain/dto/SearchProjectDTO.java

@@ -0,0 +1,15 @@
+package com.ylx.home.search.domain.dto;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel("用户端首页搜索服务DTO")
+public class SearchProjectDTO extends Page<SearchProjectDTO> {
+
+    private String keyword;
+
+}

+ 3 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/IMaTechnicianService.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ylx.common.core.domain.AjaxResult;
 import com.ylx.common.core.domain.model.LoginUser;
+import com.ylx.home.search.domain.dto.SearchMerchantDTO;
 import com.ylx.massage.domain.MaProject;
 import com.ylx.massage.domain.MaTechnician;
 import com.ylx.massage.domain.dto.*;
@@ -343,4 +344,6 @@ public interface IMaTechnicianService extends IService<MaTechnician> {
     List<MerchantWithAddressVO> listValidTechWithAddress(long offset, long fetchCount);
 
     List<MaTechnician> selectAllValidTech();
+
+    Page<MerchantListVO> homeSearchPage(MerchantListDTO dto);
 }

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

@@ -18,6 +18,7 @@ import com.ylx.common.core.domain.model.LoginUser;
 import com.ylx.common.exception.ServiceException;
 import com.ylx.common.utils.*;
 import com.ylx.fareSetting.service.IMaProjectFareSettingService;
+import com.ylx.home.search.domain.dto.SearchMerchantDTO;
 import com.ylx.massage.domain.*;
 import com.ylx.massage.domain.dto.*;
 import com.ylx.massage.domain.vo.*;
@@ -1992,6 +1993,12 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
         return this.baseMapper.selectAllValidTech();
     }
 
+    @Override
+    public Page<MerchantListVO> homeSearchPage(MerchantListDTO dto) {
+        Page<MerchantListVO> page = new Page<>(dto.getCurrent(), dto.getSize());
+        return this.baseMapper.getMerchantPage(page, dto);
+    }
+
     @Override
     public Long countValidTech() {
         return this.baseMapper.countValidTech();

+ 5 - 1
nightFragrance-massage/src/main/java/com/ylx/merchant/domain/dto/MerchantListDTO.java

@@ -5,17 +5,18 @@ import com.ylx.massage.domain.MaTechnician;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 import java.math.BigDecimal;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 @ApiModel("同城搭子分页查询DTO")
 public class MerchantListDTO extends Page<MaTechnician> implements Serializable {
     private static final long serialVersionUID = -7015224259717934375L;
 
-    @NotNull(message = "项目类目ID不能为空")
     @ApiModelProperty("项目类目ID")
     private Long categoryId;
 
@@ -39,4 +40,7 @@ public class MerchantListDTO extends Page<MaTechnician> implements Serializable
     @NotNull(message = "用户纬度不能为空")
     private Double latitude;
 
+    @ApiModelProperty("搜索关键字")
+    private String keyword;
+
 }

+ 4 - 0
nightFragrance-massage/src/main/java/com/ylx/project/mapper/ProjectMapper.java

@@ -3,11 +3,13 @@ package com.ylx.project.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.home.hot.domain.vo.ProjectSalesVO;
+import com.ylx.home.search.domain.dto.SearchProjectDTO;
 import com.ylx.massage.domain.dto.OptionDTO;
 import com.ylx.massage.domain.dto.ServiceOptionDTO;
 import com.ylx.massage.domain.vo.ProductOptionVO;
 import com.ylx.massage.domain.vo.ProductServiceOptionVO;
 import com.ylx.project.domain.Project;
+import com.ylx.project.domain.bookMerchant.vo.ProjectInfoVO;
 import com.ylx.project.domain.vo.ProjectDetailVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -38,4 +40,6 @@ public interface ProjectMapper extends BaseMapper<Project> {
     List<ProjectSalesVO> selectAllProjectSalesCount();
 
     void batchUpdateSales(@Param("list") List<ProjectSalesVO> list);
+
+    Page<ProjectInfoVO> getProjectPage(Page<ProjectInfoVO> page, @Param("dto") SearchProjectDTO dto);
 }

+ 4 - 0
nightFragrance-massage/src/main/java/com/ylx/project/service/ProjectService.java

@@ -4,6 +4,7 @@ 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.home.hot.domain.vo.ProjectSalesVO;
+import com.ylx.home.search.domain.dto.SearchProjectDTO;
 import com.ylx.massage.domain.dto.OptionDTO;
 import com.ylx.massage.domain.dto.ServiceOptionDTO;
 import com.ylx.massage.domain.vo.ProductOptionVO;
@@ -11,6 +12,7 @@ import com.ylx.massage.domain.vo.ProductServiceOptionVO;
 import com.ylx.project.domain.Project;
 import com.ylx.project.domain.bookMerchant.dto.BookMerchantDTO;
 import com.ylx.project.domain.bookMerchant.vo.BookProjectDetailVO;
+import com.ylx.project.domain.bookMerchant.vo.ProjectInfoVO;
 import com.ylx.project.domain.dto.ProjectAddDTO;
 import com.ylx.project.domain.dto.ProjectSearchDTO;
 import com.ylx.project.domain.dto.ProjectUpdateDTO;
@@ -49,4 +51,6 @@ public interface ProjectService extends IService<Project> {
     void batchUpdateSales(List<ProjectSalesVO> batch);
 
     List<ProjectSalesVO> selectAllProjectSalesCount();
+
+    Page<ProjectInfoVO> homeSearchPage(SearchProjectDTO dto);
 }

+ 33 - 3
nightFragrance-massage/src/main/java/com/ylx/project/service/impl/ProjectServiceImpl.java

@@ -13,13 +13,16 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ylx.common.core.domain.entity.SysDictData;
 import com.ylx.common.exception.ServiceException;
 import com.ylx.common.utils.DateUtils;
+import com.ylx.common.utils.DictUtils;
 import com.ylx.common.utils.SecurityUtils;
 import com.ylx.home.hot.domain.vo.ProjectSalesVO;
+import com.ylx.home.search.domain.dto.SearchProjectDTO;
 import com.ylx.massage.domain.dto.OptionDTO;
 import com.ylx.massage.domain.dto.ServiceOptionDTO;
 import com.ylx.massage.domain.vo.ProductOptionVO;
 import com.ylx.massage.domain.vo.ProductServiceOptionVO;
 import com.ylx.massage.service.IMaProjectService;
+import com.ylx.merchant.domain.vo.MerchantListVO;
 import com.ylx.project.domain.Project;
 import com.ylx.project.domain.bookMerchant.dto.BookMerchantDTO;
 import com.ylx.project.domain.bookMerchant.vo.BookMerchantVO;
@@ -45,11 +48,11 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
+import static com.ylx.order.constant.OrderConstant.DICT_UNIT_TYPE;
+
 @Slf4j
 @Service
 public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> implements ProjectService {
@@ -63,6 +66,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Resource
     private RedisTemplate<String, String> redisTemplate;
 
+    private static final Map<String, String> unitDictCache = new HashMap<>();
+
+    static {
+        List<SysDictData> dictList = DictUtils.getSortedDictCache(DICT_UNIT_TYPE);
+        if (CollUtil.isNotEmpty(dictList)) {
+            dictList.forEach(dict -> unitDictCache.put(dict.getDictValue(), dict.getDictLabel()));
+        } else {
+            log.warn("项目计量单位字典未加载,请检查字典配置:{}", DICT_UNIT_TYPE);
+        }
+    }
+
     @Override
     public Page<ProjectPageVo> list(Page<Project> page, ProjectSearchDTO dto) {
         LambdaQueryWrapper<Project> queryWrapper = new LambdaQueryWrapper<>();
@@ -272,6 +286,22 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return this.baseMapper.selectAllProjectSalesCount();
     }
 
+    @Override
+    public Page<ProjectInfoVO> homeSearchPage(SearchProjectDTO dto) {
+        Page<ProjectInfoVO> page = new Page<>(dto.getCurrent(), dto.getSize());
+        page = this.baseMapper.getProjectPage(page, dto);
+        List<ProjectInfoVO> records = page.getRecords();
+        if (CollUtil.isNotEmpty(records)) {
+            for (ProjectInfoVO record : records) {
+                Integer unitType = record.getUnitType();
+                String unitKey = ObjectUtil.isNotNull(unitType) ? unitType.toString() : "";
+                String unitTypeName = unitDictCache.getOrDefault(unitKey, "未知单位");
+                record.setUnitTypeName(unitTypeName);
+            }
+        }
+        return page;
+    }
+
     private ProjectPageVo convertToVo(Project entity) {
         ProjectPageVo vo = new ProjectPageVo();
         // 属性拷贝(推荐)

+ 7 - 0
nightFragrance-massage/src/main/resources/mapper/massage/MaTechnicianMapper.xml

@@ -613,6 +613,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             AND t.merchant_status = 0
             AND t.is_delete = 0
 
+            <!-- 新增:关键字查询商户昵称和商户名称 -->
+            <if test="dto.keyword != null and dto.keyword != ''">
+                AND (
+                t.te_name LIKE CONCAT('%', #{dto.keyword}, '%')
+                OR t.te_nick_name LIKE CONCAT('%', #{dto.keyword}, '%')
+                )
+            </if>
 
             <!-- Tab分类筛选 -->
             <if test="dto.categoryId != null">

+ 2 - 2
nightFragrance-massage/src/main/resources/mapper/order/TOrderMapper.xml

@@ -388,10 +388,10 @@
             -- 是否免交通费
             <if test="dto.isTrafficFree != null">
                 <choose>
-                    <when test="dto.isTrafficFree == 0">
+                    <when test="dto.isTrafficFree == true">
                         AND o.traffic_fee = 0
                     </when>
-                    <when test="dto.isTrafficFree == 1">
+                    <when test="dto.isTrafficFree == false">
                         AND o.traffic_fee &gt; 0
                     </when>
                 </choose>

+ 25 - 0
nightFragrance-massage/src/main/resources/mapper/project/ProjectMapper.xml

@@ -227,4 +227,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
     </update>
 
+    <select id="getProjectPage" resultType="com.ylx.project.domain.bookMerchant.vo.ProjectInfoVO">
+        SELECT
+            p.id,
+            p.title,
+            p.standard_duration,
+            p.unit_type,
+            p.cover,
+            p.highlight,
+            p.price
+        FROM
+            project p
+        <where>
+            <!-- 1. 基础状态过滤:确保只查有效且上架的项目 -->
+            AND p.is_delete = 0
+            AND p.status = 0
+
+            <!-- 2. 关键字查询逻辑 -->
+            <if test="dto.keyword != null and dto.keyword != ''">
+                AND p.title LIKE CONCAT('%', #{dto.keyword}, '%')
+            </if>
+        </where>
+
+        ORDER BY p.create_time DESC
+    </select>
+
 </mapper>