|
@@ -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 < 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>
|