|
|
@@ -213,21 +213,63 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|
|
) AS sub
|
|
|
ORDER BY nNum DESC;
|
|
|
</select>
|
|
|
+
|
|
|
<select id="selectMerchantList" resultType="com.ylx.project.domain.bookMerchant.vo.BookMerchantVO">
|
|
|
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 calc.distanceMeter
|
|
|
+ WHEN 999999999 THEN '未知'
|
|
|
+ WHEN calc.distanceMeter < 1000 THEN CONCAT(ROUND(calc.distanceMeter, 0), 'm')
|
|
|
+ ELSE CONCAT(ROUND(calc.distanceMeter / 1000, 2), 'km')
|
|
|
+ END AS distanceStr,
|
|
|
+ calc.distanceMeter 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)
|
|
|
+ </if>
|
|
|
+ <if test="dto.latitude == null or dto.longitude == null or dto.latitude == 0 or dto.longitude == 0">
|
|
|
+ 999999999
|
|
|
+ </if> AS distanceMeter
|
|
|
+ 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
|
|
|
+ AND addr.latitude != 0 AND addr.longitude != 0
|
|
|
+
|
|
|
+ <!-- 动态排序 -->
|
|
|
+ <trim prefix="ORDER BY">
|
|
|
+ <choose>
|
|
|
+ <when test="dto.latitude != null and dto.longitude != null and dto.latitude != 0 and dto.longitude != 0">
|
|
|
+ distanceMeter ASC, t.n_num DESC
|
|
|
+ </when>
|
|
|
+ <otherwise>
|
|
|
+ t.n_num DESC
|
|
|
+ </otherwise>
|
|
|
+ </choose>
|
|
|
+ </trim>
|
|
|
</select>
|
|
|
</mapper>
|