Ver código fonte

首页推荐商户点击全部商户列表

郭子栋 6 dias atrás
pai
commit
673580145f
16 arquivos alterados com 292 adições e 76 exclusões
  1. 14 2
      nightFragrance-massage/src/main/java/com/ylx/massage/controller/MassageRecommendController.java
  2. 1 1
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/MaProject.java
  3. 49 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/MassageAllMerchantsDto.java
  4. 8 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/MassageMerchantRecommendDto.java
  5. 55 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MassageAllMerchantsVo.java
  6. 3 2
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MassageProjectRecommendVo.java
  7. 5 1
      nightFragrance-massage/src/main/java/com/ylx/massage/mapper/MaProjectMapper.java
  8. 22 0
      nightFragrance-massage/src/main/java/com/ylx/massage/mapper/MaTechnicianMapper.java
  9. 6 1
      nightFragrance-massage/src/main/java/com/ylx/massage/service/IMaProjectService.java
  10. 5 1
      nightFragrance-massage/src/main/java/com/ylx/massage/service/IMassageRecommendService.java
  11. 9 2
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaProjectServiceImpl.java
  12. 1 3
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaTechnicianServiceImpl.java
  13. 9 2
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MassageRecommendServiceImpl.java
  14. 6 0
      nightFragrance-massage/src/main/java/com/ylx/project/domain/Project.java
  15. 70 34
      nightFragrance-massage/src/main/resources/mapper/massage/MaProjectMapper.xml
  16. 29 27
      nightFragrance-massage/src/main/resources/mapper/massage/MaTechnicianMapper.xml

+ 14 - 2
nightFragrance-massage/src/main/java/com/ylx/massage/controller/MassageRecommendController.java

@@ -2,7 +2,9 @@ package com.ylx.massage.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.common.core.domain.R;
+import com.ylx.massage.domain.dto.MassageAllMerchantsDto;
 import com.ylx.massage.domain.dto.MassageMerchantRecommendDto;
+import com.ylx.massage.domain.vo.MassageAllMerchantsVo;
 import com.ylx.massage.domain.vo.MassageProjectRecommendVo;
 import com.ylx.massage.domain.vo.MerchantVo;
 import com.ylx.massage.service.IMassageRecommendService;
@@ -10,6 +12,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
@@ -39,8 +42,17 @@ public class MassageRecommendController {
 
     @ApiOperation(value="首页按摩项目推荐", notes="首页按摩项目推荐")
     @GetMapping(value = "/getMassageProjectRecommend")
-    public R<Page<MassageProjectRecommendVo>> getMassageProjectRecommend(@RequestParam("pageNo") Integer pageNo, @RequestParam("pageSize") Integer pageSize) {
+    public R<Page<MassageProjectRecommendVo>> getMassageProjectRecommend(@RequestParam("pageNo") Integer pageNo, @RequestParam("pageSize") Integer pageSize,@RequestParam("cityCode") String cityCode) {
         Page<MassageProjectRecommendVo> page = new Page<>(pageNo, pageSize);
-        return R.ok( massageRecommendService.getMassageProjectRecommend(page));
+        return R.ok( massageRecommendService.getMassageProjectRecommend(page,cityCode));
     }
+
+    @ApiOperation(value="首页按摩推荐商户点击全部查询按摩所有商户", notes="首页按摩推荐商户点击全部查询按摩所有商户")
+    @PostMapping(value = "/getMassageAllMerchants")
+    public R<Page<MassageAllMerchantsVo>> getMassageAllMerchants(@Validated @RequestBody MassageAllMerchantsDto dto) {
+        Page<MassageAllMerchantsVo> page = new Page<>(dto.getPageNo(), dto.getPageSize());
+        return R.ok( massageRecommendService.getMassageAllMerchants(page,dto));
+    }
+
+
 }

+ 1 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/domain/MaProject.java

@@ -124,7 +124,7 @@ public class MaProject extends BaseEntity {
      */
     @Excel(name = "商户ID")
     @ApiModelProperty("商户ID")
-    private String userId;
+    private String merchantId;
     /**
      * 审核状态:0-待审核,1-审核通过,2-审核驳回
      */

+ 49 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/MassageAllMerchantsDto.java

@@ -0,0 +1,49 @@
+package com.ylx.massage.domain.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * 类描述:首页按摩商户推荐点击全部返回所有按摩商户Dto
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/6/4 9:31
+ */
+@Data
+public class MassageAllMerchantsDto {
+
+    @NotNull(message = "页码不能为空")
+    @ApiModelProperty("页码")
+    private Integer pageNo;
+
+    @NotNull(message = "每页大小不能为空")
+    @ApiModelProperty("每页大小")
+    private Integer pageSize;
+    /**
+     * 经度
+     * 用户当前位置的经度坐标
+     */
+    @ApiModelProperty("用户经度")
+    private BigDecimal longitude;
+
+    /**
+     * 纬度
+     * 用户当前位置的纬度坐标
+     */
+    @ApiModelProperty("用户纬度")
+    private BigDecimal latitude;
+
+    /**
+     * 城市编码
+     */
+    @NotBlank(message = "城市编码不能为空")
+    @ApiModelProperty("城市编码")
+    private String cityCode;
+
+
+}

+ 8 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/MassageMerchantRecommendDto.java

@@ -3,6 +3,7 @@ package com.ylx.massage.domain.dto;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import javax.validation.constraints.NotBlank;
 import java.math.BigDecimal;
 
 /**
@@ -27,4 +28,11 @@ public class MassageMerchantRecommendDto {
      */
     @ApiModelProperty("用户纬度")
     private BigDecimal latitude;
+
+    /**
+     * 城市编码
+     */
+    @NotBlank(message = "城市编码不能为空")
+    @ApiModelProperty("城市编码")
+    private String cityCode;
 }

+ 55 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MassageAllMerchantsVo.java

@@ -0,0 +1,55 @@
+package com.ylx.massage.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 类描述:首页按摩商户推荐点击全部返回所有按摩商户vo
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/6/4 9:14
+ */
+@Data
+public class MassageAllMerchantsVo {
+    /**
+     * 项目ID
+     */
+    @ApiModelProperty("项目ID")
+    private String projectId;
+    /**
+     * 项目名称
+     */
+    @ApiModelProperty("项目名称")
+    private String projectName;
+    /**
+     * 商户名称
+     */
+    @ApiModelProperty("商户名称")
+    private String merchantName;
+
+    /**
+     * 商户id
+     */
+    @ApiModelProperty("商户id")
+    private Long merchantId;
+
+    /**
+     * 已服务数量
+     */
+    @ApiModelProperty("已服务订单数量")
+    private Integer nNum;
+    /**
+     * 技师距离(公里)
+     */
+    @ApiModelProperty("技师距离(公里)")
+    private BigDecimal distance ;
+    /**
+     * 头像
+     */
+    @ApiModelProperty("商户头像")
+    private String teAvatar;
+
+}

+ 3 - 2
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MassageProjectRecommendVo.java

@@ -15,8 +15,9 @@ import java.math.BigDecimal;
  */
 @Data
 public class MassageProjectRecommendVo {
-    @ApiModelProperty("商户技能表id")
-    private Long id;
+    @ApiModelProperty("项目id")
+    private Long projectId;
+
 
     /** 项目名称 */
     @ApiModelProperty("项目名称")

+ 5 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/mapper/MaProjectMapper.java

@@ -5,6 +5,8 @@ import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.massage.domain.MaProject;
+import com.ylx.massage.domain.dto.MassageAllMerchantsDto;
+import com.ylx.massage.domain.vo.MassageAllMerchantsVo;
 import com.ylx.massage.domain.vo.MassageProjectRecommendVo;
 import org.apache.ibatis.annotations.Param;
 
@@ -68,5 +70,7 @@ public interface MaProjectMapper extends BaseMapper<MaProject> {
      * @param page
      * @return
      */
-    Page<MassageProjectRecommendVo> getMassageProjectRecommend(@Param("page") Page<MassageProjectRecommendVo> page);
+    Page<MassageProjectRecommendVo> getMassageProjectRecommend(@Param("page") Page<MassageProjectRecommendVo> page,@Param("cityCode") String cityCode);
+
+    Page<MassageAllMerchantsVo> getMassageAllMerchants(@Param("page") Page<MassageAllMerchantsVo> page,@Param("dto") MassageAllMerchantsDto dto);
 }

+ 22 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/mapper/MaTechnicianMapper.java

@@ -10,6 +10,7 @@ import com.ylx.massage.domain.dto.MassageMerchantRecommendDto;
 import com.ylx.massage.domain.vo.MaTechnicianMerchantListVO;
 import com.ylx.massage.domain.vo.MerchantVo;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
 /**
  * 技师Mapper接口
@@ -77,4 +78,25 @@ public interface MaTechnicianMapper extends BaseMapper<MaTechnician> {
                                                         @Param("dto") MaTechnicianMerchantQueryDTO dto);
 
     List<MerchantVo> getMerchantRecommend(@Param("dto") MassageMerchantRecommendDto dto);
+
+    /**
+     * 查询该城市是否有商户提供服务
+     * @param areaCode
+     * @return
+     */
+    @Select("SELECT EXISTS (" +
+            "    SELECT 1" +
+            "    FROM ma_technician t" +
+            "    INNER JOIN ma_project p ON t.id = p.merchant_id" +
+            "    WHERE t.te_area_code = #{areaCode}" +
+            "      AND t.is_delete = 0" +
+            "      AND t.audit_status = 2" +
+            "      AND t.n_status2 = 0" +
+            "      AND t.merchant_status = 0" +
+            "      AND p.is_delete = 0" +
+            "      AND p.audit_status = 1" +
+            "      AND p.merchant_type = 0" +
+            "      AND p.project_is_enable = 1   -- 根据实际业务调整:1启用,0禁用" +
+            ") AS has_merchant_with_service")
+    Boolean isHasMerchantCity(@Param("areaCode")  String areaCode);
 }

+ 6 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/service/IMaProjectService.java

@@ -5,9 +5,12 @@ import java.util.List;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.common.core.domain.model.LoginUser;
 import com.ylx.massage.domain.MaProject;
+import com.ylx.massage.domain.dto.MassageAllMerchantsDto;
 import com.ylx.massage.domain.vo.MaProjectListVo;
 import com.ylx.massage.domain.vo.MaProjectSaveVo;
+import com.ylx.massage.domain.vo.MassageAllMerchantsVo;
 import com.ylx.massage.domain.vo.MassageProjectRecommendVo;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 服务项目Service接口
@@ -65,5 +68,7 @@ public interface IMaProjectService
      */
     public int deleteMaProjectById(Long id);
 
-    Page<MassageProjectRecommendVo> getMassageProjectRecommend(Page<MassageProjectRecommendVo> page);
+    Page<MassageProjectRecommendVo> getMassageProjectRecommend(Page<MassageProjectRecommendVo> page,String cityCode);
+
+    Page<MassageAllMerchantsVo> getMassageAllMerchants(Page<MassageAllMerchantsVo> page, MassageAllMerchantsDto dto);
 }

+ 5 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/service/IMassageRecommendService.java

@@ -1,7 +1,9 @@
 package com.ylx.massage.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ylx.massage.domain.dto.MassageAllMerchantsDto;
 import com.ylx.massage.domain.dto.MassageMerchantRecommendDto;
+import com.ylx.massage.domain.vo.MassageAllMerchantsVo;
 import com.ylx.massage.domain.vo.MassageProjectRecommendVo;
 import com.ylx.massage.domain.vo.MerchantVo;
 
@@ -10,5 +12,7 @@ import java.util.List;
 public interface IMassageRecommendService {
     List<MerchantVo> getMerchantRecommend(MassageMerchantRecommendDto dto);
 
-    Page<MassageProjectRecommendVo> getMassageProjectRecommend(Page<MassageProjectRecommendVo> page);
+    Page<MassageProjectRecommendVo> getMassageProjectRecommend(Page<MassageProjectRecommendVo> page,String cityCode);
+
+    Page<MassageAllMerchantsVo> getMassageAllMerchants(Page<MassageAllMerchantsVo> page, MassageAllMerchantsDto dto);
 }

+ 9 - 2
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaProjectServiceImpl.java

@@ -7,8 +7,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.common.core.domain.model.LoginUser;
 import com.ylx.common.utils.DateUtils;
 import com.ylx.common.utils.bean.BeanUtils;
+import com.ylx.massage.domain.dto.MassageAllMerchantsDto;
 import com.ylx.massage.domain.vo.MaProjectListVo;
 import com.ylx.massage.domain.vo.MaProjectSaveVo;
+import com.ylx.massage.domain.vo.MassageAllMerchantsVo;
 import com.ylx.massage.domain.vo.MassageProjectRecommendVo;
 import com.ylx.massage.mapper.MaProjectMapper;
 import org.apache.commons.compress.utils.Lists;
@@ -131,8 +133,13 @@ public class MaProjectServiceImpl implements IMaProjectService
     }
 
     @Override
-    public Page<MassageProjectRecommendVo> getMassageProjectRecommend(Page<MassageProjectRecommendVo> page) {
-        return maProjectMapper.getMassageProjectRecommend(page);
+    public Page<MassageProjectRecommendVo> getMassageProjectRecommend(Page<MassageProjectRecommendVo> page,String cityCode) {
+        return maProjectMapper.getMassageProjectRecommend(page,cityCode);
+    }
+
+    @Override
+    public Page<MassageAllMerchantsVo> getMassageAllMerchants(Page<MassageAllMerchantsVo> page, MassageAllMerchantsDto dto) {
+        return maProjectMapper.getMassageAllMerchants(page, dto);
     }
 
 }

+ 1 - 3
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaTechnicianServiceImpl.java

@@ -219,9 +219,7 @@ public class MaTechnicianServiceImpl implements IMaTechnicianService
      */
     @Override
     public Boolean isHasMerchantCity(String areaCode) {
-        LambdaQueryWrapper<MaTechnician> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(MaTechnician::getTeAreaCode, areaCode);
-        return maTechnicianMapper.selectCount(queryWrapper) > 0;
+        return maTechnicianMapper.isHasMerchantCity(areaCode);
     }
 
     /**

+ 9 - 2
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MassageRecommendServiceImpl.java

@@ -1,7 +1,9 @@
 package com.ylx.massage.service.impl;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ylx.massage.domain.dto.MassageAllMerchantsDto;
 import com.ylx.massage.domain.dto.MassageMerchantRecommendDto;
+import com.ylx.massage.domain.vo.MassageAllMerchantsVo;
 import com.ylx.massage.domain.vo.MassageProjectRecommendVo;
 import com.ylx.massage.domain.vo.MerchantVo;
 import com.ylx.massage.service.IMaProjectService;
@@ -34,7 +36,12 @@ public class MassageRecommendServiceImpl implements IMassageRecommendService {
     }
 
     @Override
-    public Page<MassageProjectRecommendVo> getMassageProjectRecommend(Page<MassageProjectRecommendVo> page) {
-        return iMaProjectService.getMassageProjectRecommend(page);
+    public Page<MassageProjectRecommendVo> getMassageProjectRecommend(Page<MassageProjectRecommendVo> page,String cityCode) {
+        return iMaProjectService.getMassageProjectRecommend(page,cityCode);
+    }
+
+    @Override
+    public Page<MassageAllMerchantsVo> getMassageAllMerchants(Page<MassageAllMerchantsVo> page, MassageAllMerchantsDto dto){
+        return iMaProjectService.getMassageAllMerchants(page,dto);
     }
 }

+ 6 - 0
nightFragrance-massage/src/main/java/com/ylx/project/domain/Project.java

@@ -103,6 +103,12 @@ public class Project extends BaseEntity {
     @ApiModelProperty("项目亮点:关联亮点字典表的ID集合")
     private String highlightIds;
 
+    /**
+     * 项目亮点
+     */
+    @ApiModelProperty("项目亮点前端展示")
+    private String highlight;
+
     /**
      * 适用人群。
      */

+ 70 - 34
nightFragrance-massage/src/main/resources/mapper/massage/MaProjectMapper.xml

@@ -120,42 +120,78 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
     <!-- 推荐项目-->
     <select id="getMassageProjectRecommend" resultType="com.ylx.massage.domain.vo.MassageProjectRecommendVo">
-        WITH distinct_project AS (
-            SELECT
-                project_id,
-                MIN(project_name)   AS project_name,      -- 去重,取任意一个名称
-                MIN(project_duration) AS project_duration -- 去重,取任意一个工期
-            FROM ma_project
-            WHERE is_delete = 0
-              AND audit_status = 1
-            GROUP BY project_id
-        )
         SELECT
-            d.project_id                AS projectId,
-            d.project_name              AS projectName,
-            d.project_duration          AS projectDuration,
-            o.sales                     AS sales,
-            t.avg_current_price         AS avgCurrentPrice,
-            j.highlight                 AS highlight
-        FROM distinct_project d
-                 LEFT JOIN project j ON d.project_id = j.id
-                 LEFT JOIN (
+            pro.id                      AS projectId,
+            pro.title                   AS projectName,
+            pro.standard_duration       AS projectDuration,
+            COUNT(o.id)                 AS sales,
+            AVG(mp.project_current_price) AS avgCurrentPrice,
+            pro.highlight               AS highlight
+        FROM project pro
+        INNER JOIN ma_project mp ON CAST(mp.project_id AS UNSIGNED) = pro.id AND mp.merchant_type = '0' AND mp.is_delete = 0 AND mp.project_is_enable = 1
+        LEFT JOIN t_order o ON o.project_id = pro.id AND o.project_type = 1 AND o.status = 6 AND o.is_delete = 0
+        WHERE pro.is_delete = 0
+        AND EXISTS (
+                SELECT 1 FROM ma_technician tech
+                WHERE tech.id = CAST(mp.merchant_id AS UNSIGNED)
+                  AND tech.te_area_code = #{cityCode}
+                  AND tech.is_delete = 0
+                  AND tech.audit_status = 2      -- 审核通过
+                  AND tech.service_state = 1     -- 可服务
+            )
+        GROUP BY pro.id, pro.title, pro.standard_duration, pro.highlight
+        ORDER BY sales DESC, pro.id ASC
+    </select>
+    <!-- 首页按摩推荐商户点击全部查询按摩所有商户-->
+    <select id="getMassageAllMerchants" resultType="com.ylx.massage.domain.vo.MassageAllMerchantsVo">
+        SELECT
+            p.project_id      AS projectId,
+            p.project_name    AS projectName,
+            t.te_name         AS merchantName,
+            t.id              AS merchantId,
+            COALESCE(stat.order_count, 0) AS nNum,
+            CASE
+                WHEN #{dto.longitude} IS NOT NULL AND #{dto.latitude} IS NOT NULL
+                    THEN ROUND(
+                        ST_Distance_Sphere(
+                                POINT(addr.longitude, addr.latitude),
+                                POINT(#{dto.longitude}, #{dto.latitude})
+                            ), 0   -- 直接返回米,保留整数
+                    )
+                ELSE NULL
+                END AS distance,
+            t.te_avatar       AS teAvatar
+        FROM ma_project p
+        INNER JOIN ma_technician t ON p.merchant_id = CAST(t.id AS CHAR)
+        LEFT JOIN (
             SELECT
-                t.project_id,
-                AVG(t.project_current_price) AS avg_current_price
-            FROM ma_project t
-            WHERE t.is_delete = 0
-            GROUP BY t.project_id
-        ) t ON d.project_id = t.project_id
-                 LEFT JOIN (
+                merchant_id,
+                longitude,
+                latitude
+            FROM t_address
+            WHERE user_type = 2
+              AND type = 1
+              AND is_delete = 0
+        ) addr ON t.id = addr.merchant_id
+        LEFT JOIN (
             SELECT
-                o.project_id,
-                COUNT(*) AS sales
-            FROM t_order o
-            WHERE o.is_delete = 0
-              AND o.status = 6
-              AND o.project_type = 1
-            GROUP BY o.project_id
-        ) o ON d.project_id = o.project_id;
+                merchant_id,
+                COUNT(*) AS order_count
+            FROM t_order
+            WHERE status = 6
+              AND project_type = 1
+              AND is_delete = 0
+            GROUP BY merchant_id
+        ) stat ON stat.merchant_id = t.id
+        WHERE p.audit_status = 1
+          AND p.is_delete = 0
+          AND p.merchant_type = 0
+          AND p.project_is_enable = 0
+          AND t.audit_status = 2
+          AND t.is_delete = 0
+          AND t.service_state = 1
+          AND t.te_area_code = #{dto.cityCode}   -- 使用技师的区域编码过滤
+          AND addr.merchant_id IS NOT NULL -- 必须有默认地址(用于距离计算)
+        ORDER BY stat.order_count DESC
     </select>
 </mapper>

+ 29 - 27
nightFragrance-massage/src/main/resources/mapper/massage/MaTechnicianMapper.xml

@@ -306,34 +306,36 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      <!-- 首页按摩商户推荐列表-->
     <select id="getMerchantRecommend" resultType="com.ylx.massage.domain.vo.MerchantVo">
         SELECT
-        t.id AS merchantId,
-        t.te_name AS teName,
-        t.n_star AS nStar,
-        t.n_num AS nNum,
-        p.price AS price,
-        ST_Distance_Sphere(
-        POINT(a.longitude, a.latitude),
-        POINT(#{dto.longitude}, #{dto.latitude})
-        ) / 1000 AS distance
+            t.id AS merchantId,
+            t.te_name AS teName,
+            t.n_star AS nStar,
+            COALESCE(o.sales, 0) AS nNum,
+            COALESCE(p.min_price, 0) AS price,
+            ST_Distance_Sphere(POINT(a.longitude, a.latitude), POINT(#{dto.longitude}, #{dto.latitude})) / 1000 AS distance
         FROM ma_technician t
-        LEFT JOIN t_address a ON t.id = a.merchant_id
-        LEFT JOIN(
-            SELECT p.user_id AS user_id ,
-                   p.project_current_price AS  price
-            FROM ma_project p
-            WHERE p.is_delete = 0
-            ORDER BY p.project_current_price ASC
-            LIMIT 1
-        ) p ON t.id = p.user_d
-
-        WHERE
-        t.is_delete = 0
-        and t.openService = 1
-        and t.audit_status = 2
-        and a.user_type = 2
-        and a.type = 1
-        and a.is_delete = 0
-        ORDER BY t.n_num DESC
+                 LEFT JOIN (
+            SELECT merchant_id, COUNT(*) AS sales
+            FROM t_order
+            WHERE is_delete = 0 AND status = 6 AND project_type = 1
+            GROUP BY merchant_id
+        ) o ON t.id = o.merchant_id
+                 LEFT JOIN (
+            SELECT merchant_id, MIN(project_current_price) AS min_price
+            FROM ma_project
+            WHERE is_delete = 0 AND audit_status = 1 AND merchant_type = '0' AND project_is_enable = 1
+            GROUP BY merchant_id
+        ) p ON t.id = p.merchant_id
+                 LEFT JOIN (
+            SELECT merchant_id, longitude, latitude
+            FROM t_address
+            WHERE user_type = 2 AND type = 1 AND is_delete = 0
+        ) a ON t.id = a.merchant_id
+        WHERE t.is_delete = 0
+          AND t.audit_status = 2
+          AND t.n_status2 = 0
+          AND t.merchant_status = 0   -- 注意 merchant_status 是字符串类型
+          AND t.te_area_code = #{cityCode}   -- 新增城市过滤
+        ORDER BY COALESCE(o.sales, 0) DESC
         LIMIT 5
     </select>
 </mapper>