MaProjectMapper.xml 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.ylx.massage.mapper.MaProjectMapper">
  6. <resultMap type="MaProject" id="MaProjectResult">
  7. <result property="id" column="id" />
  8. <result property="projectId" column="project_id" />
  9. <result property="projectName" column="project_name" />
  10. <result property="projectDescribe" column="project_describe" />
  11. <result property="projectDuration" column="project_duration" />
  12. <result property="projectUsersNum" column="project_users_num" />
  13. <result property="projectOriginalPrice" column="project_original_price" />
  14. <result property="projectCurrentPrice" column="project_current_price" />
  15. <result property="projectMasterImage" column="project_master_image" />
  16. <result property="projectDetailImage" column="project_detail_image" />
  17. <result property="projectIsEnable" column="project_is_enable" />
  18. <result property="merchantId" column="merchant_id" />
  19. <result property="auditStatus" column="audit_status" />
  20. <result property="applyReason" column="apply_reason" />
  21. <result property="reason" column="reason" />
  22. <result property="applyTime" column="apply_time" />
  23. <result property="approveTime" column="approve_time" />
  24. <result property="createBy" column="create_by" />
  25. <result property="updateBy" column="update_by" />
  26. <result property="createTime" column="create_time" />
  27. <result property="updateTime" column="update_time" />
  28. <result property="isDelete" column="is_delete" />
  29. </resultMap>
  30. <sql id="selectMaProjectVo">
  31. select id, project_name, project_describe, project_duration, project_users_num, project_original_price, project_current_price, project_master_image, project_detail_image, project_is_enable, create_user, update_user, create_time, update_time, is_delete from ma_project
  32. </sql>
  33. <select id="selectMaProjectList" parameterType="MaProject" resultMap="MaProjectResult">
  34. <include refid="selectMaProjectVo"/>
  35. <where>
  36. is_delete !=1
  37. <if test="projectName != null and projectName != ''"> and project_name like concat('%', #{projectName}, '%')</if>
  38. <if test="projectDescribe != null and projectDescribe != ''"> and project_describe = #{projectDescribe}</if>
  39. <if test="projectDuration != null "> and project_duration = #{projectDuration}</if>
  40. <if test="projectUsersNum != null "> and project_users_num = #{projectUsersNum}</if>
  41. <if test="projectOriginalPrice != null "> and project_original_price = #{projectOriginalPrice}</if>
  42. <if test="projectCurrentPrice != null "> and project_current_price = #{projectCurrentPrice}</if>
  43. <if test="projectMasterImage != null and projectMasterImage != ''"> and project_master_image = #{projectMasterImage}</if>
  44. <if test="projectDetailImage != null and projectDetailImage != ''"> and project_detail_image = #{projectDetailImage}</if>
  45. <if test="projectIsEnable != null "> and project_is_enable = #{projectIsEnable}</if>
  46. <if test="createUser != null and createUser != ''"> and create_user = #{createUser}</if>
  47. <if test="updateUser != null and updateUser != ''"> and update_user = #{updateUser}</if>
  48. </where>
  49. </select>
  50. <resultMap type="com.ylx.massage.domain.vo.MaProjectAuditListVO" id="MaProjectAuditListResult">
  51. <result property="projectAuditId" column="project_audit_id"/>
  52. <result property="projectId" column="project_id"/>
  53. <result property="projectName" column="project_name"/>
  54. <result property="merchantId" column="merchant_id"/>
  55. <result property="merchantName" column="merchant_name"/>
  56. <result property="merchantNickName" column="merchant_nick_name"/>
  57. <result property="merchantSex" column="merchant_sex"/>
  58. <result property="merchantSexName" column="merchant_sex_name"/>
  59. <result property="merchantAvatar" column="merchant_avatar"/>
  60. <result property="merchantPhone" column="merchant_phone"/>
  61. <result property="techType" column="tech_type"/>
  62. <result property="techTypeName" column="tech_type_name"/>
  63. <result property="applyTime" column="apply_time"/>
  64. <result property="approveTime" column="approve_time"/>
  65. <result property="registerTime" column="register_time"/>
  66. <result property="auditStatus" column="audit_status"/>
  67. <result property="auditStatusName" column="audit_status_name"/>
  68. </resultMap>
  69. <!-- 查询技能审核列表 -->
  70. <select id="selectProjectAuditList" resultMap="MaProjectAuditListResult">
  71. SELECT
  72. p.id AS project_audit_id,
  73. p.project_id,
  74. p.project_name,
  75. p.merchant_id,
  76. t.te_name AS merchant_name,
  77. t.te_nick_name AS merchant_nick_name,
  78. t.te_sex AS merchant_sex,
  79. CASE t.te_sex
  80. WHEN 0 THEN '女'
  81. WHEN 1 THEN '男'
  82. ELSE ''
  83. END AS merchant_sex_name,
  84. t.avatar AS merchant_avatar,
  85. t.te_phone AS merchant_phone,
  86. t.tech_type,
  87. CASE t.tech_type
  88. WHEN 0 THEN '真实用户'
  89. WHEN 1 THEN '虚拟用户'
  90. ELSE ''
  91. END AS tech_type_name,
  92. COALESCE(p.apply_time, p.create_time) AS apply_time,
  93. p.approve_time,
  94. t.create_time AS register_time,
  95. p.audit_status,
  96. CASE p.audit_status
  97. WHEN 0 THEN '待审核'
  98. WHEN 1 THEN '审核通过'
  99. WHEN 2 THEN '审核驳回'
  100. ELSE ''
  101. END AS audit_status_name
  102. FROM ma_project p
  103. INNER JOIN ma_technician t ON t.id = p.merchant_id
  104. <where>
  105. IFNULL(p.is_delete, 0) = 0
  106. AND IFNULL(t.is_delete, 0) = 0
  107. <if test="dto != null">
  108. <choose>
  109. <when test="dto.auditStatus != null">
  110. AND p.audit_status = #{dto.auditStatus}
  111. </when>
  112. <when test="dto.auditStatusGroup != null and dto.auditStatusGroup == 0">
  113. AND p.audit_status = 0
  114. </when>
  115. <when test="dto.auditStatusGroup != null and dto.auditStatusGroup == 1">
  116. AND p.audit_status IN (1, 2)
  117. </when>
  118. </choose>
  119. <!-- 商户名称 -->
  120. <if test="dto.merchantName != null and dto.merchantName != ''">
  121. AND t.te_name LIKE CONCAT('%', #{dto.merchantName}, '%')
  122. </if>
  123. <!-- 商户昵称 -->
  124. <if test="dto.merchantNickName != null and dto.merchantNickName != ''">
  125. AND t.te_nick_name LIKE CONCAT('%', #{dto.merchantNickName}, '%')
  126. </if>
  127. <!-- 商户类型 -->
  128. <if test="dto.techType != null">
  129. AND t.tech_type = #{dto.techType}
  130. </if>
  131. <!-- 商户电话 -->
  132. <if test="dto.merchantPhone != null and dto.merchantPhone != ''">
  133. AND t.te_phone LIKE CONCAT('%', #{dto.merchantPhone}, '%')
  134. </if>
  135. <!-- 申请开始时间 -->
  136. <if test="dto.beginApplyTime != null and dto.beginApplyTime != ''">
  137. AND COALESCE(p.apply_time, p.create_time) &gt;= #{dto.beginApplyTime}
  138. </if>
  139. <!-- 申请结束时间 -->
  140. <if test="dto.endApplyTime != null and dto.endApplyTime != ''">
  141. AND COALESCE(p.apply_time, p.create_time) &lt;= #{dto.endApplyTime}
  142. </if>
  143. <!-- 商户性别 -->
  144. <if test="dto.merchantSex != null">
  145. AND t.te_sex = #{dto.merchantSex}
  146. </if>
  147. </if>
  148. </where>
  149. ORDER BY COALESCE(p.apply_time, p.create_time) DESC, p.id DESC
  150. </select>
  151. <resultMap type="com.ylx.massage.domain.vo.MaProjectOpenServiceVO" id="MaProjectOpenServiceResult">
  152. <result property="projectAuditId" column="project_audit_id"/>
  153. <result property="projectId" column="project_id"/>
  154. <result property="projectName" column="project_name"/>
  155. <result property="applyReason" column="apply_reason"/>
  156. <result property="applyTime" column="apply_time"/>
  157. <result property="auditStatus" column="audit_status"/>
  158. <result property="auditStatusName" column="audit_status_name"/>
  159. <result property="remark" column="remark"/>
  160. </resultMap>
  161. <!-- 查询商户申请开通的项目列表 -->
  162. <select id="selectMerchantOpenProjectList" resultMap="MaProjectOpenServiceResult">
  163. SELECT
  164. p.id AS project_audit_id,
  165. p.project_id,
  166. COALESCE(NULLIF(p.project_name, ''), base_project.title, '') AS project_name,
  167. p.apply_reason,
  168. COALESCE(p.apply_time, p.create_time) AS apply_time,
  169. p.audit_status,
  170. CASE p.audit_status
  171. WHEN 0 THEN '待审核'
  172. WHEN 1 THEN '审核通过'
  173. WHEN 2 THEN '审核驳回'
  174. ELSE ''
  175. END AS audit_status_name,
  176. p.reason AS remark
  177. FROM ma_project p
  178. LEFT JOIN project base_project ON base_project.id = p.project_id
  179. WHERE p.merchant_id = #{merchantId}
  180. AND IFNULL(p.is_delete, 0) = 0
  181. ORDER BY COALESCE(p.apply_time, p.create_time) DESC, p.id DESC
  182. </select>
  183. <!-- 查询技能审核记录 -->
  184. <select id="selectProjectAuditById" resultMap="MaProjectResult">
  185. SELECT
  186. id,
  187. project_id,
  188. project_name,
  189. merchant_id,
  190. audit_status,
  191. project_is_enable,
  192. reason,
  193. approve_time,
  194. is_delete,
  195. create_time,
  196. update_time
  197. FROM ma_project
  198. WHERE id = #{projectAuditId}
  199. AND is_delete = 0
  200. </select>
  201. <!-- 提交技能开通审核 -->
  202. <update id="submitProjectAudit">
  203. UPDATE ma_project
  204. SET
  205. audit_status = #{maProject.auditStatus},
  206. reason = #{maProject.reason},
  207. approve_time = #{maProject.approveTime},
  208. project_is_enable = #{maProject.projectIsEnable},
  209. update_by = #{maProject.updateBy},
  210. update_time = #{maProject.updateTime}
  211. WHERE id = #{maProject.id}
  212. AND IFNULL(is_delete, 0) = 0
  213. AND audit_status = 0
  214. </update>
  215. <select id="selectMaProjectById" parameterType="Long" resultMap="MaProjectResult">
  216. <include refid="selectMaProjectVo"/>
  217. where is_delete !=1 and id = #{id}
  218. </select>
  219. <insert id="insertMaProject" parameterType="MaProject" useGeneratedKeys="true" keyProperty="id">
  220. insert into ma_project
  221. <trim prefix="(" suffix=")" suffixOverrides=",">
  222. <if test="id != null">id,</if>
  223. <if test="projectName != null and projectName != ''">project_name,</if>
  224. <if test="projectDescribe != null and projectDescribe != ''">project_describe,</if>
  225. <if test="projectDuration != null">project_duration,</if>
  226. <if test="projectUsersNum != null">project_users_num,</if>
  227. <if test="projectOriginalPrice != null">project_original_price,</if>
  228. <if test="projectCurrentPrice != null">project_current_price,</if>
  229. <if test="projectMasterImage != null and projectMasterImage != ''">project_master_image,</if>
  230. <if test="projectDetailImage != null and projectDetailImage != ''">project_detail_image,</if>
  231. <if test="projectIsEnable != null">project_is_enable,</if>
  232. <if test="createUser != null and createUser != ''">create_user,</if>
  233. <if test="updateUser != null and updateUser != ''">update_user,</if>
  234. <if test="createTime != null">create_time,</if>
  235. <if test="updateTime != null">update_time,</if>
  236. <if test="isDelete != null">is_delete,</if>
  237. </trim>
  238. <trim prefix="values (" suffix=")" suffixOverrides=",">
  239. <if test="id != null">#{id},</if>
  240. <if test="projectName != null and projectName != ''">#{projectName},</if>
  241. <if test="projectDescribe != null and projectDescribe != ''">#{projectDescribe},</if>
  242. <if test="projectDuration != null">#{projectDuration},</if>
  243. <if test="projectUsersNum != null">#{projectUsersNum},</if>
  244. <if test="projectOriginalPrice != null">#{projectOriginalPrice},</if>
  245. <if test="projectCurrentPrice != null">#{projectCurrentPrice},</if>
  246. <if test="projectMasterImage != null and projectMasterImage != ''">#{projectMasterImage},</if>
  247. <if test="projectDetailImage != null and projectDetailImage != ''">#{projectDetailImage},</if>
  248. <if test="projectIsEnable != null">#{projectIsEnable},</if>
  249. <if test="createUser != null and createUser != ''">#{createUser},</if>
  250. <if test="updateUser != null and updateUser != ''">#{updateUser},</if>
  251. <if test="createTime != null">#{createTime},</if>
  252. <if test="updateTime != null">#{updateTime},</if>
  253. <if test="isDelete != null">#{isDelete},</if>
  254. </trim>
  255. </insert>
  256. <update id="updateMaProject" parameterType="MaProject">
  257. update ma_project
  258. <trim prefix="SET" suffixOverrides=",">
  259. <if test="projectName != null and projectName != ''">project_name = #{projectName},</if>
  260. <if test="projectDescribe != null and projectDescribe != ''">project_describe = #{projectDescribe},</if>
  261. <if test="projectDuration != null">project_duration = #{projectDuration},</if>
  262. <if test="projectUsersNum != null">project_users_num = #{projectUsersNum},</if>
  263. <if test="projectOriginalPrice != null">project_original_price = #{projectOriginalPrice},</if>
  264. <if test="projectCurrentPrice != null">project_current_price = #{projectCurrentPrice},</if>
  265. <if test="projectMasterImage != null and projectMasterImage != ''">project_master_image = #{projectMasterImage},</if>
  266. <if test="projectDetailImage != null and projectDetailImage != ''">project_detail_image = #{projectDetailImage},</if>
  267. <if test="projectIsEnable != null">project_is_enable = #{projectIsEnable},</if>
  268. <if test="createUser != null and createUser != ''">create_user = #{createUser},</if>
  269. <if test="updateUser != null and updateUser != ''">update_user = #{updateUser},</if>
  270. <if test="createTime != null">create_time = #{createTime},</if>
  271. <if test="updateTime != null">update_time = #{updateTime},</if>
  272. <if test="isDelete != null">is_delete = #{isDelete},</if>
  273. </trim>
  274. where id = #{id}
  275. </update>
  276. <update id="deleteMaProjectById" parameterType="Long">
  277. update ma_project set is_delete = 1 where id = #{id}
  278. </update>
  279. <delete id="deleteMaProjectByIds" parameterType="String">
  280. delete from ma_project where id in
  281. <foreach item="id" collection="array" open="(" separator="," close=")">
  282. #{id}
  283. </foreach>
  284. </delete>
  285. <!-- 首页按摩推荐项目-->
  286. <select id="getProjectRecommend" resultType="com.ylx.home.category.domain.vo.ProjectRecommendVo">
  287. SELECT
  288. pro.id AS projectId,
  289. pro.title AS projectName,
  290. pro.standard_duration AS projectDuration,
  291. COALESCE(ord.sales, 0) AS sales, -- 无订单时为 0
  292. mp_avg.avgCurrentPrice,
  293. pro.highlight AS highlight
  294. FROM project pro
  295. INNER JOIN (
  296. -- 1. 符合条件的商家项目:按项目聚合,计算平均价格
  297. SELECT
  298. CAST(mp.project_id AS UNSIGNED) AS project_id,
  299. AVG(mp.project_current_price) AS avgCurrentPrice
  300. FROM ma_project mp
  301. INNER JOIN ma_technician tech
  302. ON tech.id = CAST(mp.merchant_id AS UNSIGNED)
  303. AND tech.te_area_code = #{dto.cityCode}
  304. AND tech.is_delete = 0
  305. AND tech.audit_status = 2
  306. AND tech.service_state = 1
  307. WHERE mp.service_tag = #{dto.projectType}
  308. AND mp.is_delete = 0
  309. AND mp.project_is_enable = 1
  310. GROUP BY CAST(mp.project_id AS UNSIGNED)
  311. ) mp_avg ON mp_avg.project_id = pro.id
  312. LEFT JOIN (
  313. -- 2. 订单统计:每个项目的真实订单数
  314. SELECT
  315. project_id,
  316. COUNT(id) AS sales
  317. FROM t_order
  318. WHERE project_type = #{dto.projectType}
  319. AND status = 6
  320. AND is_delete = 0
  321. GROUP BY project_id
  322. ) ord ON ord.project_id = pro.id
  323. WHERE pro.is_delete = 0
  324. ORDER BY sales DESC, pro.id ASC
  325. </select>
  326. <!-- 首页推荐商户点击全部查询所有商户-->
  327. <select id="getMerchants" resultType="com.ylx.home.category.domain.vo.MerchantsVo">
  328. SELECT
  329. project_id AS projectId,
  330. project_name AS projectName,
  331. te_name AS merchantName,
  332. id AS merchantId,
  333. order_count AS nNum,
  334. CASE
  335. WHEN #{dto.longitude} IS NOT NULL AND #{dto.latitude} IS NOT NULL THEN
  336. CONCAT(
  337. CASE WHEN distance_meters >= 1000 THEN ROUND(distance_meters / 1000.0, 1) ELSE distance_meters END,
  338. CASE WHEN distance_meters >= 1000 THEN 'km' ELSE 'm' END
  339. )
  340. ELSE NULL
  341. END AS distanceShow,
  342. te_avatar AS teAvatar
  343. FROM (
  344. SELECT
  345. p.project_id,
  346. p.project_name,
  347. t.te_name,
  348. t.id,
  349. t.te_avatar,
  350. COALESCE(stat.order_count, 0) AS order_count,
  351. ROUND(ST_Distance_Sphere(POINT(addr.longitude, addr.latitude), POINT(#{dto.longitude}, #{dto.latitude})), 0) AS distance_meters
  352. FROM ma_technician t
  353. INNER JOIN ma_project p
  354. ON p.merchant_id = CAST(t.id AS CHAR)
  355. AND p.audit_status = 1
  356. AND p.is_delete = 0
  357. AND p.service_tag = #{dto.projectType}
  358. AND p.project_is_enable = 0
  359. <if test="dto.projectId != null and dto.projectId != ''">
  360. AND p.project_id = #{dto.projectId}
  361. </if>
  362. LEFT JOIN (
  363. SELECT merchant_id, longitude, latitude
  364. FROM t_address
  365. WHERE user_type = 2 AND type = 1 AND is_delete = 0
  366. ) addr ON t.id = addr.merchant_id
  367. LEFT JOIN (
  368. SELECT
  369. merchant_id,
  370. project_id,
  371. COUNT(*) AS order_count
  372. FROM t_order
  373. WHERE status = 6
  374. AND project_type = #{dto.projectType}
  375. AND is_delete = 0
  376. GROUP BY merchant_id, project_id
  377. ) stat ON stat.merchant_id = t.id AND stat.project_id = p.project_id
  378. WHERE t.audit_status = 2
  379. AND t.is_delete = 0
  380. AND t.service_state = 1
  381. AND t.te_area_code = #{dto.cityCode}
  382. ) AS sub
  383. ORDER BY nNum DESC
  384. </select>
  385. <select id="selectMerchantList" resultType="com.ylx.project.domain.bookMerchant.vo.BookMerchantVO">
  386. SELECT
  387. p.id,
  388. t.id AS merchantId,
  389. t.te_nick_name AS merchantNickName,
  390. t.te_avatar AS merchantAvatar,
  391. t.n_star AS merchantStar,
  392. t.n_num AS servedCount,
  393. p.project_id AS projectId,
  394. p.project_current_price AS currentPrice,
  395. CASE
  396. WHEN calc.distanceMeter = 999999999 THEN '未知'
  397. WHEN calc.distanceMeter &lt; 1000 THEN CONCAT( ROUND( calc.distanceMeter, 0 ), 'm' )
  398. ELSE CONCAT( ROUND( calc.distanceMeter / 1000, 2 ), 'km' )
  399. END AS distanceText
  400. FROM
  401. ma_technician t
  402. INNER JOIN ma_project p ON t.id = p.merchant_id
  403. LEFT JOIN t_address addr ON t.id = addr.merchant_id AND addr.type = 1 AND addr.is_delete = 0
  404. LEFT JOIN (
  405. SELECT
  406. addr_sub.id AS addrId,
  407. <if test="dto.latitude != null and dto.longitude != null and dto.latitude != 0 and dto.longitude != 0">
  408. IF(
  409. addr_sub.latitude IS NULL OR addr_sub.longitude IS NULL OR addr_sub.latitude=0 OR addr_sub.longitude=0,
  410. 999999999,
  411. ROUND(
  412. 6371 * ACOS(
  413. COS(RADIANS(#{dto.latitude})) * COS(RADIANS(addr_sub.latitude))
  414. * COS(RADIANS(addr_sub.longitude) - RADIANS(#{dto.longitude}))
  415. + SIN(RADIANS(#{dto.latitude})) * SIN(RADIANS(addr_sub.latitude))
  416. ) * 1000
  417. )
  418. ) AS distanceMeter
  419. </if>
  420. <if test="dto.latitude == null or dto.longitude == null or dto.latitude == 0 or dto.longitude == 0">
  421. 999999999 AS distanceMeter
  422. </if>
  423. FROM t_address addr_sub
  424. ) calc ON addr.id = calc.addrId
  425. WHERE
  426. p.project_id = #{dto.projectId}
  427. AND p.audit_status = 1
  428. AND p.is_delete = 0
  429. <trim prefix="ORDER BY">
  430. <choose>
  431. <when test="dto.latitude != null and dto.longitude != null and dto.latitude != 0 and dto.longitude != 0">
  432. calc.distanceMeter ASC, t.n_num DESC
  433. </when>
  434. <otherwise>
  435. t.n_num DESC
  436. </otherwise>
  437. </choose>
  438. </trim>
  439. </select>
  440. <!-- 首页陪玩推荐项目-->
  441. <select id="getHotCompainonProjectList" resultType="com.ylx.companion.domain.vo.HotCompanionProjectVO">
  442. SELECT
  443. pro.id AS projectId,
  444. pro.title AS projectName,
  445. pro.standard_duration AS projectDuration,
  446. COALESCE(ord.sales, 0) AS sales, -- 无订单时为 0
  447. mp_avg.avgCurrentPrice,
  448. pro.highlight AS highlight
  449. FROM project pro
  450. INNER JOIN (
  451. -- 1. 符合条件的商家项目:按项目聚合,计算平均价格
  452. SELECT
  453. CAST(mp.project_id AS UNSIGNED) AS project_id,
  454. AVG(mp.project_current_price) AS avgCurrentPrice
  455. FROM ma_project mp
  456. INNER JOIN ma_technician tech
  457. ON tech.id = CAST(mp.merchant_id AS UNSIGNED)
  458. AND tech.te_area_code = #{cityCode}
  459. AND tech.is_delete = 0
  460. AND tech.audit_status = 2
  461. AND tech.service_state = 1
  462. WHERE mp.service_tag = 2
  463. AND mp.is_delete = 0
  464. AND mp.project_is_enable = 1
  465. GROUP BY CAST(mp.project_id AS UNSIGNED)
  466. ) mp_avg ON mp_avg.project_id = pro.id
  467. LEFT JOIN (
  468. -- 2. 订单统计:每个项目的真实订单数
  469. SELECT
  470. project_id,
  471. COUNT(id) AS sales
  472. FROM t_order
  473. WHERE project_type = 2
  474. AND status = 6
  475. AND is_delete = 0
  476. GROUP BY project_id
  477. ) ord ON ord.project_id = pro.id
  478. WHERE pro.is_delete = 0
  479. <if test="categoryId != null">
  480. AND pro.category_id = #{categoryId}
  481. </if>
  482. ORDER BY sales DESC, pro.id ASC
  483. </select>
  484. <!-- 首页陪玩推荐商户点击全部查询陪玩所有商户-->
  485. <select id="getCompanionAllMerchants" resultType="com.ylx.companion.domain.vo.CompanionAllMerchantsVo">
  486. SELECT
  487. project_id AS projectId,
  488. project_name AS projectName,
  489. te_name AS merchantName,
  490. id AS merchantId,
  491. order_count AS nNum, -- 子查询中已经 COALESCE 过了
  492. CASE
  493. WHEN #{dto.longitude} IS NOT NULL AND #{dto.latitude} IS NOT NULL THEN
  494. CONCAT(
  495. CASE WHEN distance_meters >= 1000 THEN ROUND(distance_meters / 1000.0, 1) ELSE distance_meters END,
  496. CASE WHEN distance_meters >= 1000 THEN 'km' ELSE 'm' END
  497. )
  498. ELSE NULL
  499. END AS distanceShow,
  500. te_avatar AS teAvatar
  501. FROM (
  502. SELECT
  503. p.project_id,
  504. p.project_name,
  505. t.te_name,
  506. t.id,
  507. t.te_avatar,
  508. COALESCE(stat.order_count, 0) AS order_count,
  509. ROUND(ST_Distance_Sphere(POINT(addr.longitude, addr.latitude), POINT(#{dto.longitude}, #{dto.latitude})), 0) AS distance_meters
  510. FROM ma_technician t
  511. INNER JOIN ma_project p
  512. ON p.merchant_id = CAST(t.id AS CHAR)
  513. AND p.audit_status = 1
  514. AND p.is_delete = 0
  515. AND p.service_tag = 2
  516. AND p.project_is_enable = 0
  517. <if test="dto.projectId != null and dto.projectId != ''">
  518. AND p.project_id = #{dto.projectId}
  519. </if>
  520. LEFT JOIN (
  521. SELECT merchant_id, longitude, latitude
  522. FROM t_address
  523. WHERE user_type = 2 AND type = 1 AND is_delete = 0
  524. ) addr ON t.id = addr.merchant_id
  525. LEFT JOIN (
  526. SELECT
  527. merchant_id,
  528. project_id,
  529. COUNT(*) AS order_count
  530. FROM t_order
  531. WHERE status = 6
  532. AND project_type = 2
  533. AND is_delete = 0
  534. GROUP BY merchant_id, project_id
  535. ) stat ON stat.merchant_id = t.id AND stat.project_id = p.project_id
  536. WHERE t.audit_status = 2
  537. AND t.is_delete = 0
  538. AND t.service_state = 1
  539. AND t.te_area_code = #{dto.cityCode}
  540. ) AS sub
  541. ORDER BY nNum DESC -- 或者 nNum DESC
  542. </select>
  543. </mapper>