Parcourir la source

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

jinshihui il y a 5 jours
Parent
commit
6f571a8ef7

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

@@ -45,7 +45,7 @@ public class MassageAllMerchantsVo {
      * 技师距离(公里)
      * 技师距离(公里)
      */
      */
     @ApiModelProperty("技师距离(公里)")
     @ApiModelProperty("技师距离(公里)")
-    private BigDecimal distance ;
+    private BigDecimal distanceShow;
     /**
     /**
      * 头像
      * 头像
      */
      */

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

@@ -42,7 +42,7 @@ public class MerchantVo implements Serializable {
     private Integer nNum;
     private Integer nNum;
 
 
     @ApiModelProperty("技师距离(公里)")
     @ApiModelProperty("技师距离(公里)")
-    private BigDecimal distance ;
+    private BigDecimal distanceShow;
 
 
     /**
     /**
      * 商户开通技能时设置的最低价格
      * 商户开通技能时设置的最低价格

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

@@ -8,6 +8,7 @@ import com.ylx.massage.domain.MaProject;
 import com.ylx.massage.domain.dto.MassageAllMerchantsDto;
 import com.ylx.massage.domain.dto.MassageAllMerchantsDto;
 import com.ylx.massage.domain.vo.MassageAllMerchantsVo;
 import com.ylx.massage.domain.vo.MassageAllMerchantsVo;
 import com.ylx.massage.domain.vo.MassageProjectRecommendVo;
 import com.ylx.massage.domain.vo.MassageProjectRecommendVo;
+import com.ylx.project.domain.bookMerchant.dto.BookMerchantDTO;
 import com.ylx.project.domain.bookMerchant.vo.BookMerchantVO;
 import com.ylx.project.domain.bookMerchant.vo.BookMerchantVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
@@ -78,5 +79,5 @@ public interface MaProjectMapper extends BaseMapper<MaProject> {
 
 
     Page<MassageAllMerchantsVo> getMassageAllMerchants(@Param("page") Page<MassageAllMerchantsVo> page, @Param("dto") MassageAllMerchantsDto dto);
     Page<MassageAllMerchantsVo> getMassageAllMerchants(@Param("page") Page<MassageAllMerchantsVo> page, @Param("dto") MassageAllMerchantsDto dto);
 
 
-    Page<BookMerchantVO> selectMerchantList(@Param("page") Page<BookMerchantVO> page, @Param("projectId") Long projectId);
+    Page<BookMerchantVO> selectMerchantList(@Param("page") Page<BookMerchantVO> page, @Param("dto") BookMerchantDTO dto);
 }
 }

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

@@ -11,6 +11,7 @@ import com.ylx.massage.domain.vo.MaProjectListVo;
 import com.ylx.massage.domain.vo.MaProjectSaveVo;
 import com.ylx.massage.domain.vo.MaProjectSaveVo;
 import com.ylx.massage.domain.vo.MassageAllMerchantsVo;
 import com.ylx.massage.domain.vo.MassageAllMerchantsVo;
 import com.ylx.massage.domain.vo.MassageProjectRecommendVo;
 import com.ylx.massage.domain.vo.MassageProjectRecommendVo;
+import com.ylx.project.domain.bookMerchant.dto.BookMerchantDTO;
 import com.ylx.project.domain.bookMerchant.vo.BookMerchantVO;
 import com.ylx.project.domain.bookMerchant.vo.BookMerchantVO;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
 
 
@@ -74,5 +75,5 @@ public interface IMaProjectService extends IService<MaProject>
 
 
     Page<MassageAllMerchantsVo> getMassageAllMerchants(Page<MassageAllMerchantsVo> page, MassageAllMerchantsDto dto);
     Page<MassageAllMerchantsVo> getMassageAllMerchants(Page<MassageAllMerchantsVo> page, MassageAllMerchantsDto dto);
 
 
-    Page<BookMerchantVO> selectMerchantList(Page<BookMerchantVO> page, Long projectId);
+    Page<BookMerchantVO> selectMerchantList(Page<BookMerchantVO> page, BookMerchantDTO dto);
 }
 }

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

@@ -14,6 +14,7 @@ import com.ylx.massage.domain.vo.MaProjectSaveVo;
 import com.ylx.massage.domain.vo.MassageAllMerchantsVo;
 import com.ylx.massage.domain.vo.MassageAllMerchantsVo;
 import com.ylx.massage.domain.vo.MassageProjectRecommendVo;
 import com.ylx.massage.domain.vo.MassageProjectRecommendVo;
 import com.ylx.massage.mapper.MaProjectMapper;
 import com.ylx.massage.mapper.MaProjectMapper;
+import com.ylx.project.domain.bookMerchant.dto.BookMerchantDTO;
 import com.ylx.project.domain.bookMerchant.vo.BookMerchantVO;
 import com.ylx.project.domain.bookMerchant.vo.BookMerchantVO;
 import org.apache.commons.compress.utils.Lists;
 import org.apache.commons.compress.utils.Lists;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
@@ -145,8 +146,8 @@ public class MaProjectServiceImpl extends ServiceImpl<MaProjectMapper, MaProject
     }
     }
 
 
     @Override
     @Override
-    public Page<BookMerchantVO> selectMerchantList(Page<BookMerchantVO> page, Long projectId) {
-        return maProjectMapper.selectMerchantList(page, projectId);
+    public Page<BookMerchantVO> selectMerchantList(Page<BookMerchantVO> page, BookMerchantDTO dto) {
+        return maProjectMapper.selectMerchantList(page, dto);
     }
     }
 
 
 }
 }

+ 2 - 1
nightFragrance-massage/src/main/java/com/ylx/project/controller/ProjectController.java

@@ -7,6 +7,7 @@ import com.ylx.common.enums.BusinessType;
 import com.ylx.common.exception.ServiceException;
 import com.ylx.common.exception.ServiceException;
 import com.ylx.project.domain.Project;
 import com.ylx.project.domain.Project;
 import com.ylx.project.domain.bookMerchant.dto.BookMerchantDTO;
 import com.ylx.project.domain.bookMerchant.dto.BookMerchantDTO;
+import com.ylx.project.domain.bookMerchant.vo.BookMerchantVO;
 import com.ylx.project.domain.bookMerchant.vo.BookProjectDetailVO;
 import com.ylx.project.domain.bookMerchant.vo.BookProjectDetailVO;
 import com.ylx.project.domain.dto.ProjectAddDTO;
 import com.ylx.project.domain.dto.ProjectAddDTO;
 import com.ylx.project.domain.dto.ProjectSearchDTO;
 import com.ylx.project.domain.dto.ProjectSearchDTO;
@@ -143,7 +144,7 @@ public class ProjectController {
     @PreAuthorize("@customerAuth.isCustomer()")
     @PreAuthorize("@customerAuth.isCustomer()")
     @ApiOperation("客户端获取去预约项目详情")
     @ApiOperation("客户端获取去预约项目详情")
     @PostMapping("/bookDetail")
     @PostMapping("/bookDetail")
-    public R<BookProjectDetailVO> getBookingProjectDetail(BookMerchantDTO dto) {
+    public R<BookProjectDetailVO> getBookingProjectDetail(@Validated @RequestBody BookMerchantDTO dto) {
         BookProjectDetailVO vo = projectService.getBookingProjectDetail(dto);
         BookProjectDetailVO vo = projectService.getBookingProjectDetail(dto);
         return R.ok(vo);
         return R.ok(vo);
     }
     }

+ 2 - 2
nightFragrance-massage/src/main/java/com/ylx/project/domain/bookMerchant/dto/BookMerchantDTO.java

@@ -18,9 +18,9 @@ public class BookMerchantDTO extends Page implements Serializable {
     private Long projectId;
     private Long projectId;
 
 
     @ApiModelProperty("经度")
     @ApiModelProperty("经度")
-    private double longitude;
+    private String longitude;
 
 
     @ApiModelProperty("纬度")
     @ApiModelProperty("纬度")
-    private double latitude;
+    private String latitude;
 
 
 }
 }

+ 2 - 0
nightFragrance-massage/src/main/java/com/ylx/project/domain/bookMerchant/vo/ProjectInfoVO.java

@@ -1,5 +1,6 @@
 package com.ylx.project.domain.bookMerchant.vo;
 package com.ylx.project.domain.bookMerchant.vo;
 
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
@@ -30,6 +31,7 @@ public class ProjectInfoVO implements Serializable {
     @ApiModelProperty("项目亮点")
     @ApiModelProperty("项目亮点")
     private String highlight;
     private String highlight;
 
 
+    @JsonIgnore
     @ApiModelProperty("标价")
     @ApiModelProperty("标价")
     private BigDecimal price;
     private BigDecimal price;
 
 

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

@@ -9,6 +9,7 @@ import com.ylx.massage.domain.vo.ProductOptionVO;
 import com.ylx.massage.domain.vo.ProductServiceOptionVO;
 import com.ylx.massage.domain.vo.ProductServiceOptionVO;
 import com.ylx.project.domain.Project;
 import com.ylx.project.domain.Project;
 import com.ylx.project.domain.bookMerchant.dto.BookMerchantDTO;
 import com.ylx.project.domain.bookMerchant.dto.BookMerchantDTO;
+import com.ylx.project.domain.bookMerchant.vo.BookMerchantVO;
 import com.ylx.project.domain.bookMerchant.vo.BookProjectDetailVO;
 import com.ylx.project.domain.bookMerchant.vo.BookProjectDetailVO;
 import com.ylx.project.domain.dto.ProjectAddDTO;
 import com.ylx.project.domain.dto.ProjectAddDTO;
 import com.ylx.project.domain.dto.ProjectSearchDTO;
 import com.ylx.project.domain.dto.ProjectSearchDTO;

+ 15 - 5
nightFragrance-massage/src/main/java/com/ylx/project/service/impl/ProjectServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ylx.project.service.impl;
 package com.ylx.project.service.impl;
 
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
@@ -41,6 +42,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.List;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
@@ -212,11 +214,19 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         vo.setProjectInfo(projectInfo);
         vo.setProjectInfo(projectInfo);
 
 
         // 2. 查询商户列表
         // 2. 查询商户列表
-        Page<BookMerchantVO> page = new Page<>(dto.getCurrent(), dto.getSize());
-        Page<BookMerchantVO> merchantList = maProjectService.selectMerchantList(page, projectId);
-
-
-        vo.setMerchantList(merchantList);
+        Page<BookMerchantVO> page = maProjectService.selectMerchantList(new Page<>(dto.getCurrent(), dto.getSize()), dto);
+
+        // 3.判断数据中的currentPrice为null就设置为projectInfo的price
+        if (ObjectUtil.isNotNull(page) && CollUtil.isNotEmpty(page.getRecords())) {
+            for (BookMerchantVO merchantVO : page.getRecords()) {
+                BigDecimal price = merchantVO.getCurrentPrice();
+                // 为空 或者 等于0,统一赋值项目原价
+                if (ObjectUtil.isNull(price) || price.compareTo(BigDecimal.ZERO) == 0) {
+                    merchantVO.setCurrentPrice(projectInfo.getPrice());
+                }
+            }
+        }
+        vo.setMerchantList(page);
         return vo;
         return vo;
     }
     }
 
 

+ 141 - 79
nightFragrance-massage/src/main/resources/mapper/massage/MaProjectMapper.xml

@@ -121,97 +121,159 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <!-- 推荐项目-->
     <!-- 推荐项目-->
     <select id="getMassageProjectRecommend" resultType="com.ylx.massage.domain.vo.MassageProjectRecommendVo">
     <select id="getMassageProjectRecommend" resultType="com.ylx.massage.domain.vo.MassageProjectRecommendVo">
         SELECT
         SELECT
-            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
+            pro.id                     AS projectId,
+            pro.title                  AS projectName,
+            pro.standard_duration      AS projectDuration,
+            COALESCE(ord.sales, 0)     AS sales,           -- 无订单时为 0
+            mp_avg.avgCurrentPrice,
+            pro.highlight              AS highlight
         FROM project pro
         FROM project pro
-        INNER JOIN ma_project mp ON CAST(mp.project_id AS UNSIGNED) = pro.id AND mp.merchant_type = 1 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
+                 INNER JOIN (
+            -- 1. 符合条件的商家项目:按项目聚合,计算平均价格
+            SELECT
+                CAST(mp.project_id AS UNSIGNED) AS project_id,
+                AVG(mp.project_current_price)   AS avgCurrentPrice
+            FROM ma_project mp
+                     INNER JOIN ma_technician tech
+                                ON 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
+            WHERE mp.merchant_type = 1
+              AND mp.is_delete = 0
+              AND mp.project_is_enable = 1
+            GROUP BY CAST(mp.project_id AS UNSIGNED)
+        ) mp_avg ON mp_avg.project_id = pro.id
+                 LEFT JOIN (
+            -- 2. 订单统计:每个项目的真实订单数
+            SELECT
+                project_id,
+                COUNT(id) AS sales
+            FROM t_order
+            WHERE project_type = 1
+              AND status = 6
+              AND is_delete = 0
+            GROUP BY project_id
+        ) ord ON ord.project_id = pro.id
         WHERE pro.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
         ORDER BY sales DESC, pro.id ASC
     </select>
     </select>
     <!-- 首页按摩推荐商户点击全部查询按摩所有商户-->
     <!-- 首页按摩推荐商户点击全部查询按摩所有商户-->
     <select id="getMassageAllMerchants" resultType="com.ylx.massage.domain.vo.MassageAllMerchantsVo">
     <select id="getMassageAllMerchants" resultType="com.ylx.massage.domain.vo.MassageAllMerchantsVo">
         SELECT
         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)
+        project_id AS projectId,
+        project_name AS projectName,
+        te_name AS merchantName,
+        id AS merchantId,
+        order_count AS nNum,   -- 子查询中已经 COALESCE 过了
+        CASE
+        WHEN #{dto.longitude} IS NOT NULL AND #{dto.latitude} IS NOT NULL THEN
+        CONCAT(
+        CASE WHEN distance_meters >= 1000 THEN ROUND(distance_meters / 1000.0, 1) ELSE distance_meters END,
+        CASE WHEN distance_meters >= 1000 THEN 'km' ELSE 'm' END
+        )
+        ELSE NULL
+        END AS distanceShow,
+        te_avatar AS teAvatar
+        FROM (
+        SELECT
+        p.project_id,
+        p.project_name,
+        t.te_name,
+        t.id,
+        t.te_avatar,
+        COALESCE(stat.order_count, 0) AS order_count,
+        ROUND(ST_Distance_Sphere(POINT(addr.longitude, addr.latitude), POINT(#{dto.longitude}, #{dto.latitude})), 0) AS distance_meters
+        FROM ma_technician t
+        INNER JOIN ma_project p
+        ON p.merchant_id = CAST(t.id AS CHAR)
+        AND p.audit_status = 1
+        AND p.is_delete = 0
+        AND p.merchant_type = 1
+        AND p.project_is_enable = 0
+        <if test="dto.projectId != null and dto.projectId != ''">
+            AND p.project_id = #{dto.projectId}
+        </if>
         LEFT JOIN (
         LEFT JOIN (
-            SELECT
-                merchant_id,
-                longitude,
-                latitude
-            FROM t_address
-            WHERE user_type = 2
-              AND type = 1
-              AND is_delete = 0
+        SELECT 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
         ) addr ON t.id = addr.merchant_id
         LEFT JOIN (
         LEFT JOIN (
-            SELECT
-                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 = 1
-          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 -- 必须有默认地址(用于距离计算)
-         <if test="dto.projectId != null and dto.projectId != ''">
-            AND p.project_id = #{dto.projectId}
-         </if>
-        ORDER BY stat.order_count DESC
+        SELECT
+        merchant_id,
+        project_id,
+        COUNT(*) AS order_count
+        FROM t_order
+        WHERE status = 6
+        AND project_type = 1
+        AND is_delete = 0
+        GROUP BY merchant_id, project_id
+        ) stat ON stat.merchant_id = t.id AND stat.project_id = p.project_id
+        WHERE t.audit_status = 2
+        AND t.is_delete = 0
+        AND t.service_state = 1
+        AND t.te_area_code = #{dto.cityCode}
+        ) AS sub
+        ORDER BY nNum DESC  -- 或者 nNum DESC
     </select>
     </select>
+
     <select id="selectMerchantList" resultType="com.ylx.project.domain.bookMerchant.vo.BookMerchantVO">
     <select id="selectMerchantList" resultType="com.ylx.project.domain.bookMerchant.vo.BookMerchantVO">
         SELECT
         SELECT
-            mp.id,
-            mp.merchant_id AS merchantId,
-            m.te_nick_name AS merchantNickName,
-            m.te_avatar AS merchantAvatar,
-            m.n_star AS merchantStar,
-            mp.project_current_price AS currentPrice,
-            mp.project_users_num AS servedCount
-        FROM ma_project mp
-        LEFT JOIN ma_technician m ON mp.merchant_id = m.id
-        WHERE mp.project_id = #{projectId}
-          AND mp.audit_status = 1      -- 仅展示审核通过的
-          AND mp.project_is_enable = 0 -- 未申请下架
-          AND mp.is_delete = 0
-        ORDER BY mp.project_users_num DESC -- 按真实销量降序排列
+        p.id,
+        t.id AS merchantId,
+        t.te_nick_name AS merchantNickName,
+        t.te_avatar AS merchantAvatar,
+        t.n_star AS merchantStar,
+        t.n_num AS servedCount,
+        p.project_id AS projectId,
+        p.project_current_price AS currentPrice,
+        CASE
+        WHEN calc.distanceMeter = 999999999 THEN '未知'
+        WHEN calc.distanceMeter &lt; 1000 THEN CONCAT( ROUND( calc.distanceMeter, 0 ), 'm' )
+        ELSE CONCAT( ROUND( calc.distanceMeter / 1000, 2 ), 'km' )
+        END AS distanceText
+        FROM
+        ma_technician t
+        INNER JOIN ma_project p ON t.id = p.merchant_id
+        LEFT JOIN t_address addr ON t.id = addr.merchant_id AND addr.type = 1 AND addr.is_delete = 0
+        LEFT JOIN (
+        SELECT
+        addr_sub.id AS addrId,
+        <if test="dto.latitude != null and dto.longitude != null and dto.latitude != 0 and dto.longitude != 0">
+            IF(
+            addr_sub.latitude IS NULL OR addr_sub.longitude IS NULL OR addr_sub.latitude=0 OR addr_sub.longitude=0,
+            999999999,
+            ROUND(
+            6371 * ACOS(
+            COS(RADIANS(#{dto.latitude})) * COS(RADIANS(addr_sub.latitude))
+            * COS(RADIANS(addr_sub.longitude) - RADIANS(#{dto.longitude}))
+            + SIN(RADIANS(#{dto.latitude})) * SIN(RADIANS(addr_sub.latitude))
+            ) * 1000
+            )
+            ) AS distanceMeter
+        </if>
+        <if test="dto.latitude == null or dto.longitude == null or dto.latitude == 0 or dto.longitude == 0">
+            999999999 AS distanceMeter
+        </if>
+        FROM t_address addr_sub
+        ) calc ON addr.id = calc.addrId
+
+        WHERE
+        p.project_id = #{dto.projectId}
+        AND p.audit_status = 1
+        AND p.is_delete = 0
+
+        <trim prefix="ORDER BY">
+            <choose>
+                <when test="dto.latitude != null and dto.longitude != null and dto.latitude != 0 and dto.longitude != 0">
+                    calc.distanceMeter ASC, t.n_num DESC
+                </when>
+                <otherwise>
+                    t.n_num DESC
+                </otherwise>
+            </choose>
+        </trim>
     </select>
     </select>
 </mapper>
 </mapper>

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

@@ -475,33 +475,44 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             COALESCE(o.sales, 0) AS nNum,
             COALESCE(o.sales, 0) AS nNum,
             COALESCE(p.min_price, 0) AS price,
             COALESCE(p.min_price, 0) AS price,
             t.avatar AS avatar,
             t.avatar AS avatar,
-            -- 返回米(四舍五入保留0位小数,也可不ROUND)
-            ROUND(ST_Distance_Sphere(POINT(a.longitude, a.latitude), POINT(#{dto.longitude}, #{dto.latitude})), 0) AS distance
-        FROM ma_technician t
-        LEFT JOIN (
+            CASE
+                WHEN t.dist_meters IS NULL THEN NULL
+                WHEN t.dist_meters &lt; 1000 THEN CONCAT(ROUND(t.dist_meters, 0), 'm')
+                ELSE CONCAT(ROUND(t.dist_meters / 1000, 1), 'km')
+            END AS distanceShow
+        FROM (
+                 SELECT
+                     t.id,
+                     t.te_name,
+                     t.n_star,
+                     t.avatar,
+                     ROUND(ST_Distance_Sphere(POINT(a.longitude, a.latitude), POINT(#{dto.longitude}, #{dto.latitude})), 0) AS dist_meters
+                 FROM ma_technician t
+                          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
+                   AND t.te_area_code = #{dto.cityCode}
+             ) t
+                 LEFT JOIN (
             SELECT merchant_id, COUNT(*) AS sales
             SELECT merchant_id, COUNT(*) AS sales
             FROM t_order
             FROM t_order
             WHERE is_delete = 0 AND status = 6 AND project_type = 1
             WHERE is_delete = 0 AND status = 6 AND project_type = 1
             GROUP BY merchant_id
             GROUP BY merchant_id
         ) o ON t.id = o.merchant_id
         ) o ON t.id = o.merchant_id
-        LEFT JOIN (
+                 INNER JOIN (
             SELECT merchant_id, MIN(project_current_price) AS min_price
             SELECT merchant_id, MIN(project_current_price) AS min_price
             FROM ma_project
             FROM ma_project
             WHERE is_delete = 0 AND audit_status = 1 AND merchant_type = 1 AND project_is_enable = 1
             WHERE is_delete = 0 AND audit_status = 1 AND merchant_type = 1 AND project_is_enable = 1
             GROUP BY merchant_id
             GROUP BY merchant_id
         ) p ON t.id = p.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 = #{dto.cityCode}   -- 新增城市过滤
         ORDER BY COALESCE(o.sales, 0) DESC
         ORDER BY COALESCE(o.sales, 0) DESC
-        LIMIT 5
+            LIMIT 5
     </select>
     </select>