YangtzePassengerSummaryMapper.xml 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.yc.ship.module.trade.dal.mysql.report.YangtzePassengerSummaryMapper">
  4. <!-- 公共查询SQL片段 -->
  5. <!-- 业务逻辑:
  6. 锁位订单:order_status != 14(非留位的有效订单,客人100%会出行)
  7. 留位订单:order_status = 14(占位订单)
  8. 实收房间数 = 锁位订单的房间数
  9. 占位房间数 = 留位订单的房间数
  10. 实收人数 = 仅锁位订单的游客(有名单的)
  11. 预计收客人数 = 锁位+留位的所有人数合计(从trade_order_total获取,不管是否有名单)
  12. -->
  13. <sql id="selectYangtzePassengerSummary">
  14. SELECT
  15. v.id AS voyageId,
  16. s.name AS shipName,
  17. CONCAT(DATE_FORMAT(v.boarding_time, '%Y-%m-%d'), ' ', CASE WHEN r.direction = 1 THEN '上水' ELSE '下水' END) AS voyageInfo,
  18. GREATEST(DATEDIFF(DATE(v.boarding_time), CURDATE()), 0) AS countdown,
  19. 528 AS capacity,
  20. COALESCE(room_stats.totalRooms, 0) AS totalRooms,
  21. COALESCE(room_stats.paidRooms, 0) AS paidRooms,
  22. COALESCE(room_stats.reservedRooms, 0) AS reservedRooms,
  23. COALESCE(visitor_stats.totalPassengers, 0) AS totalPassengers,
  24. COALESCE(free_stats.ticketedPassengers, 0) AS ticketedPassengers,
  25. COALESCE(free_stats.freePassengers, 0) AS freePassengers,
  26. COALESCE(free_stats.estimatedPassengers, 0) AS estimatedPassengers,
  27. '' AS remark,
  28. COALESCE(finance_stats.receivableAmount, 0) AS receivableAmount,
  29. COALESCE(finance_stats.receivedAmount, 0) AS receivedAmount,
  30. COALESCE(finance_stats.receivableAmount, 0) - COALESCE(finance_stats.receivedAmount, 0) AS unreceivedAmount,
  31. CASE WHEN COALESCE(free_stats.ticketedPassengers, 0) > 0
  32. THEN ROUND(COALESCE(finance_stats.receivableAmount, 0) / free_stats.ticketedPassengers, 2)
  33. ELSE 0 END AS avgPrice,
  34. COALESCE(visitor_stats.adultCount, 0) AS adultCount,
  35. COALESCE(visitor_stats.childCount, 0) AS childCount,
  36. COALESCE(visitor_stats.infantCount, 0) AS infantCount,
  37. COALESCE(visitor_stats.companionLeaderCount, 0) AS companionLeaderCount,
  38. COALESCE(team_stats.groupCount, 0) AS groupCount,
  39. COALESCE(team_stats.individualCount, 0) AS individualCount,
  40. COALESCE(nationality_stats.domesticCount, 0) AS domesticCount,
  41. COALESCE(nationality_stats.overseasCount, 0) AS overseasCount
  42. FROM product_voyage v
  43. INNER JOIN resource_ship s ON v.ship_id = s.id AND s.deleted = 0
  44. INNER JOIN resource_route r ON v.route_id = r.id AND r.deleted = 0
  45. LEFT JOIN (
  46. SELECT
  47. o.voyage_id,
  48. SUM(COALESCE(tot.use_room_num, 0)) AS totalRooms,
  49. SUM(CASE WHEN o.order_status = 1 or o.order_status = 6 THEN COALESCE(tot.use_room_num, 0) ELSE 0 END) AS paidRooms,
  50. SUM(CASE WHEN o.order_status = 14 THEN COALESCE(tot.use_room_num, 0) ELSE 0 END) AS reservedRooms
  51. FROM trade_order_room_model tot
  52. LEFT JOIN trade_order o ON o.id = tot.order_id AND tot.deleted = 0
  53. WHERE o.deleted = 0 AND o.order_status IN (14,6,1)
  54. GROUP BY o.voyage_id
  55. ) room_stats ON v.id = room_stats.voyage_id
  56. LEFT JOIN (
  57. SELECT
  58. o.voyage_id,
  59. COUNT(tv.id) AS totalPassengers,
  60. SUM(CASE WHEN o.order_status IN (6) THEN 1 ELSE 0 END) AS ticketedPassengers1,
  61. SUM(CASE WHEN tv.type IN ('adultTake', 'adultPlus') THEN 1 ELSE 0 END) AS adultCount,
  62. SUM(CASE WHEN tv.type IN ('childTake', 'childPlus', 'childNonTake') THEN 1 ELSE 0 END) AS childCount,
  63. SUM(CASE WHEN tv.type IN ('babyTake', 'babyPlus', 'babyNonTake') THEN 1 ELSE 0 END) AS infantCount,
  64. SUM(CASE WHEN tv.type IN ('with', 'leader') THEN 1 ELSE 0 END) AS companionLeaderCount
  65. FROM trade_order o
  66. INNER JOIN trade_visitor tv ON o.id = tv.order_id AND tv.deleted = 0
  67. WHERE o.deleted = 0 AND o.order_status IN (15, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
  68. GROUP BY o.voyage_id
  69. ) visitor_stats ON v.id = visitor_stats.voyage_id
  70. LEFT JOIN (
  71. SELECT
  72. o.voyage_id,
  73. CASE WHEN o.order_status = 1 or o.order_status = 14 THEN SUM(COALESCE(tot.adult_total_num, 0) + COALESCE(tot.child_total_num, 0)
  74. + COALESCE(tot.baby_total_num, 0) + COALESCE(tot.with_total_num, 0)
  75. + COALESCE(tot.leader_total_num, 0)) ELSE 0 END AS estimatedPassengers1
  76. FROM trade_order o
  77. LEFT JOIN trade_order_total tot ON o.id = tot.old_order_id AND tot.deleted = 0
  78. WHERE o.deleted = 0 AND o.order_status IN (15, 14, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
  79. GROUP BY o.voyage_id
  80. ) estimated_stats ON v.id = estimated_stats.voyage_id
  81. LEFT JOIN (
  82. SELECT
  83. o.voyage_id,
  84. SUM(CASE WHEN od.name LIKE '免票%' THEN 1 ELSE 0 END) AS freePassengers,
  85. SUM(CASE WHEN od.name LIKE '免票%' THEN 0 ELSE 1 END) AS ticketedPassengers,
  86. SUM(CASE WHEN (o.order_status = 1 or o.order_status = 14) and tv.type IN ('babyTake','babyPlus','babyNonTake','leader','with','childTake','childPlus','childNonTake','adultPlus', 'adultTake') THEN 1 ELSE 0 END) AS estimatedPassengers
  87. FROM trade_order o
  88. INNER JOIN trade_visitor tv ON o.id = tv.order_id AND tv.deleted = 0
  89. LEFT JOIN ota_distributor od ON o.source_id = od.id AND od.deleted = 0
  90. WHERE o.deleted = 0 AND o.order_status IN (15, 14, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
  91. GROUP BY o.voyage_id
  92. ) free_stats ON v.id = free_stats.voyage_id
  93. LEFT JOIN (
  94. SELECT
  95. o.voyage_id,
  96. SUM(o.pay_amount) AS receivableAmount,
  97. SUM(CASE WHEN o.pay_status = 1 THEN COALESCE(p.pay_amount, o.real_pay_amount)
  98. ELSE COALESCE(o.real_pay_amount, 0) END) AS receivedAmount
  99. FROM trade_order o
  100. LEFT JOIN (
  101. SELECT order_id, SUM(pay_amount) AS pay_amount
  102. FROM trade_order_pay
  103. WHERE deleted = 0 AND pay_status = 1
  104. GROUP BY order_id
  105. ) p ON o.pay_status = 1 AND p.order_id = o.id
  106. WHERE o.deleted = 0 AND o.order_status IN (15, 14, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
  107. GROUP BY o.voyage_id
  108. ) finance_stats ON v.id = finance_stats.voyage_id
  109. LEFT JOIN (
  110. SELECT
  111. o.voyage_id,
  112. SUM(CASE WHEN visitor_cnt.cnt >= 10 THEN visitor_cnt.cnt ELSE 0 END) AS groupCount,
  113. SUM(CASE WHEN visitor_cnt.cnt &lt; 10 THEN visitor_cnt.cnt ELSE 0 END) AS individualCount
  114. FROM trade_order o
  115. INNER JOIN (
  116. SELECT order_id, COUNT(id) AS cnt
  117. FROM trade_visitor
  118. WHERE deleted = 0
  119. GROUP BY order_id
  120. ) visitor_cnt ON o.id = visitor_cnt.order_id
  121. WHERE o.deleted = 0 AND o.order_status IN (15, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
  122. GROUP BY o.voyage_id
  123. ) team_stats ON v.id = team_stats.voyage_id
  124. LEFT JOIN (
  125. SELECT
  126. o.voyage_id,
  127. SUM(CASE WHEN tv.nationality = '1' OR tv.nationality IS NULL OR tv.nationality = '' THEN 1 ELSE 0 END) AS domesticCount,
  128. SUM(CASE WHEN tv.nationality != '1' AND tv.nationality IS NOT NULL AND tv.nationality != '' THEN 1 ELSE 0 END) AS overseasCount
  129. FROM trade_order o
  130. INNER JOIN trade_visitor tv ON o.id = tv.order_id AND tv.deleted = 0
  131. WHERE o.deleted = 0 AND o.order_status IN (15, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
  132. GROUP BY o.voyage_id
  133. ) nationality_stats ON v.id = nationality_stats.voyage_id
  134. WHERE v.deleted = 0
  135. <if test="vo.voyageIds != null and vo.voyageIds.size() > 0">
  136. AND v.id IN
  137. <foreach collection="vo.voyageIds" item="id" open="(" separator="," close=")">
  138. #{id}
  139. </foreach>
  140. </if>
  141. <if test="vo.shipId != null">
  142. AND v.ship_id = #{vo.shipId}
  143. </if>
  144. <if test="vo.startDate != null and vo.startDate != ''">
  145. AND v.start_time &gt;= #{vo.startDate}
  146. </if>
  147. <if test="vo.endDate != null and vo.endDate != ''">
  148. AND v.start_time &lt; DATE_ADD(#{vo.endDate}, INTERVAL 1 DAY)
  149. </if>
  150. ORDER BY v.start_time ASC, s.name ASC
  151. </sql>
  152. <!-- 分页查询 -->
  153. <select id="selectYangtzePassengerSummaryPage"
  154. resultType="com.yc.ship.module.trade.controller.admin.report.vo.YangtzePassengerSummaryRespVO">
  155. <include refid="selectYangtzePassengerSummary"/>
  156. </select>
  157. <!-- 不分页查询(用于导出) -->
  158. <select id="selectYangtzePassengerSummaryExportList"
  159. resultType="com.yc.ship.module.trade.controller.admin.report.vo.YangtzePassengerSummaryRespVO">
  160. <include refid="selectYangtzePassengerSummary"/>
  161. </select>
  162. </mapper>