فهرست منبع

首页按摩商户全部推荐距离展示优化

郭子栋 5 روز پیش
والد
کامیت
15230ee43d

+ 69 - 64
nightFragrance-massage/src/main/resources/mapper/massage/MaProjectMapper.xml

@@ -121,97 +121,102 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <!-- 推荐项目-->
     <select id="getMassageProjectRecommend" resultType="com.ylx.massage.domain.vo.MassageProjectRecommendVo">
         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
-        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
-        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
-        projectId,
-        projectName,
-        merchantName,
-        merchantId,
-        nNum,
+        project_id AS projectId,
+        project_name AS projectName,
+        te_name AS merchantName,
+        id AS merchantId,
+        order_count AS nNum,   -- 子查询中已经 COALESCE 过了
         CASE
-        WHEN distance_meters IS NOT NULL AND distance_meters >= 1000 THEN
-        CONCAT(ROUND(distance_meters / 1000.0, 1), 'km')
-        WHEN distance_meters IS NOT NULL THEN
-        CONCAT(distance_meters, 'm')
+        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,
-        teAvatar
+        te_avatar AS teAvatar
         FROM (
         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_meters,
-        t.te_avatar       AS teAvatar
-        FROM ma_project p
-        INNER JOIN ma_technician t ON p.merchant_id = CAST(t.id AS CHAR)
+        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 (
-        SELECT
-        merchant_id,
-        longitude,
-        latitude
+        SELECT merchant_id, longitude, latitude
         FROM t_address
-        WHERE user_type = 2
-        AND type = 1
-        AND is_delete = 0
+        WHERE user_type = 2 AND type = 1 AND is_delete = 0
         ) addr ON t.id = addr.merchant_id
         LEFT JOIN (
         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
-        ) 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
+        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}
-        AND addr.merchant_id IS NOT NULL
-        <if test="dto.projectId != null and dto.projectId != ''">
-            AND p.project_id = #{dto.projectId}
-        </if>
         ) AS sub
-        ORDER BY nNum DESC;
+        ORDER BY nNum DESC  -- 或者 nNum DESC
     </select>
     <select id="selectMerchantList" resultType="com.ylx.project.domain.bookMerchant.vo.BookMerchantVO">
         SELECT

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

@@ -475,7 +475,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 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
+            END AS distanceShow
         FROM (
                  SELECT
                      t.id,
@@ -501,7 +501,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             WHERE is_delete = 0 AND status = 6 AND project_type = 1
             GROUP BY merchant_id
         ) o ON t.id = o.merchant_id
-                 LEFT JOIN (
+                 INNER 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 = 1 AND project_is_enable = 1