YangtzePassengerSummaryMapper.xml 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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. v.remark AS remark,
  20. 528 AS capacity,
  21. COALESCE(room_stats.totalRooms, 0) AS totalRooms,
  22. COALESCE(room_stats.paidRooms, 0) AS paidRooms,
  23. COALESCE(room_stats.reservedRooms, 0) AS reservedRooms,
  24. COALESCE(visitor_stats.totalPassengers, 0) AS totalPassengers,
  25. COALESCE(free_stats.ticketedPassengers, 0) AS ticketedPassengers,
  26. COALESCE(free_stats.freePassengers, 0) AS freePassengers,
  27. COALESCE(room_stats.reservedRooms, 0) * 2 + COALESCE(visitor_stats.totalPassengers, 0) AS estimatedPassengers,
  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. COALESCE(product_stats.upgradeFloorCount, 0) AS upgradeFloorCount,
  43. COALESCE(product_stats.suiteDiscountCount, 0) AS suiteDiscountCount
  44. FROM product_voyage v
  45. INNER JOIN resource_ship s ON v.ship_id = s.id AND s.deleted = 0
  46. INNER JOIN resource_route r ON v.route_id = r.id AND r.deleted = 0
  47. LEFT JOIN (
  48. SELECT
  49. o.voyage_id,
  50. SUM(COALESCE(tot.use_room_num, 0)) AS totalRooms,
  51. SUM( CASE WHEN o.order_status != 14 THEN COALESCE(tot.use_room_num, 0) END) AS paidRooms,
  52. SUM( CASE WHEN o.order_status = 14 THEN COALESCE(tot.use_room_num, 0) END) AS reservedRooms
  53. FROM trade_order_room_model tot
  54. INNER JOIN trade_order o ON o.id = tot.order_id
  55. WHERE o.deleted = 0
  56. AND tot.deleted = 0
  57. AND o.order_status IN (15, 14, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
  58. GROUP BY o.voyage_id
  59. ) room_stats ON v.id = room_stats.voyage_id
  60. LEFT JOIN (
  61. SELECT
  62. o.voyage_id,
  63. COUNT(tv.id) AS totalPassengers,
  64. SUM(CASE WHEN o.order_status IN (6) THEN 1 ELSE 0 END) AS ticketedPassengers1,
  65. SUM(CASE WHEN tv.type IN ('adultTake', 'adultPlus') THEN 1 ELSE 0 END) AS adultCount,
  66. SUM(CASE WHEN tv.type IN ('childTake', 'childPlus', 'childNonTake') THEN 1 ELSE 0 END) AS childCount,
  67. SUM(CASE WHEN tv.type IN ('babyTake', 'babyPlus', 'babyNonTake') THEN 1 ELSE 0 END) AS infantCount,
  68. SUM(CASE WHEN tv.type IN ('with', 'leader') THEN 1 ELSE 0 END) AS companionLeaderCount
  69. FROM trade_order o
  70. INNER JOIN trade_visitor tv ON o.id = tv.order_id AND tv.deleted = 0
  71. WHERE o.deleted = 0 AND o.order_status IN (15, 14, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
  72. GROUP BY o.voyage_id
  73. ) visitor_stats ON v.id = visitor_stats.voyage_id
  74. LEFT JOIN (
  75. SELECT
  76. o.voyage_id,
  77. 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)
  78. + COALESCE(tot.baby_total_num, 0) + COALESCE(tot.with_total_num, 0)
  79. + COALESCE(tot.leader_total_num, 0)) ELSE 0 END AS estimatedPassengers1
  80. FROM trade_order o
  81. LEFT JOIN trade_order_total tot ON o.id = tot.old_order_id AND tot.deleted = 0
  82. WHERE o.deleted = 0 AND o.order_status IN (15, 14, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
  83. GROUP BY o.voyage_id
  84. ) estimated_stats ON v.id = estimated_stats.voyage_id
  85. LEFT JOIN (
  86. SELECT
  87. o.voyage_id,
  88. SUM(CASE WHEN od.name LIKE '免票%' THEN 1 ELSE 0 END) AS freePassengers,
  89. SUM(CASE WHEN od.name LIKE '免票%' THEN 0 ELSE 1 END) AS ticketedPassengers,
  90. 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
  91. FROM trade_order o
  92. INNER JOIN trade_visitor tv ON o.id = tv.order_id AND tv.deleted = 0
  93. LEFT JOIN ota_distributor od ON o.source_id = od.id AND od.deleted = 0
  94. WHERE o.deleted = 0 AND o.order_status IN (15, 14, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
  95. GROUP BY o.voyage_id
  96. ) free_stats ON v.id = free_stats.voyage_id
  97. LEFT JOIN (
  98. SELECT
  99. o.voyage_id,
  100. SUM(o.pay_amount) AS receivableAmount,
  101. SUM(CASE WHEN o.pay_status = 1 THEN COALESCE(p.pay_amount, o.real_pay_amount)
  102. ELSE COALESCE(o.real_pay_amount, 0) END) AS receivedAmount
  103. FROM trade_order o
  104. LEFT JOIN (
  105. SELECT order_id, SUM(pay_amount) AS pay_amount
  106. FROM trade_order_pay
  107. WHERE deleted = 0 AND pay_status = 1
  108. GROUP BY order_id
  109. ) p ON o.pay_status = 1 AND p.order_id = o.id
  110. WHERE o.deleted = 0 AND o.order_status IN (15, 14, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
  111. GROUP BY o.voyage_id
  112. ) finance_stats ON v.id = finance_stats.voyage_id
  113. LEFT JOIN (
  114. SELECT
  115. o.voyage_id,
  116. SUM(CASE WHEN visitor_cnt.cnt >= 10 THEN visitor_cnt.cnt ELSE 0 END) AS groupCount,
  117. SUM(CASE WHEN visitor_cnt.cnt &lt; 10 THEN visitor_cnt.cnt ELSE 0 END) AS individualCount
  118. FROM trade_order o
  119. INNER JOIN (
  120. SELECT order_id, COUNT(id) AS cnt
  121. FROM trade_visitor
  122. WHERE deleted = 0
  123. GROUP BY order_id
  124. ) visitor_cnt ON o.id = visitor_cnt.order_id
  125. WHERE o.deleted = 0 AND o.order_status IN (15, 14, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
  126. GROUP BY o.voyage_id
  127. ) team_stats ON v.id = team_stats.voyage_id
  128. LEFT JOIN (
  129. SELECT
  130. o.voyage_id,
  131. SUM(CASE WHEN tv.nationality = '1' OR tv.nationality IS NULL OR tv.nationality = '' THEN 1 ELSE 0 END) AS domesticCount,
  132. SUM(CASE WHEN tv.nationality != '1' AND tv.nationality IS NOT NULL AND tv.nationality != '' THEN 1 ELSE 0 END) AS overseasCount
  133. FROM trade_order o
  134. INNER JOIN trade_visitor tv ON o.id = tv.order_id AND tv.deleted = 0
  135. WHERE o.deleted = 0 AND o.order_status IN (15, 14, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
  136. GROUP BY o.voyage_id
  137. ) nationality_stats ON v.id = nationality_stats.voyage_id
  138. LEFT JOIN (
  139. SELECT
  140. o.voyage_id,
  141. COUNT(DISTINCT CASE WHEN td.product_id IN (2007974975358070785, 2012077983546568706, 2012078139826335745) THEN td.id END) AS upgradeFloorCount,
  142. COUNT(DISTINCT CASE WHEN td.product_id = 2013782764375310338 THEN td.id END) AS suiteDiscountCount
  143. FROM trade_detail td
  144. INNER JOIN trade_order o ON o.id = td.order_id AND o.deleted = 0
  145. WHERE td.deleted = 0
  146. AND o.order_status IN (14, 13, 6, 1)
  147. AND td.product_id IN (2007974975358070785, 2012077983546568706, 2012078139826335745, 2013782764375310338)
  148. GROUP BY o.voyage_id
  149. ) product_stats ON v.id = product_stats.voyage_id
  150. WHERE v.deleted = 0
  151. <if test="vo.voyageIds != null and vo.voyageIds.size() > 0">
  152. AND v.id IN
  153. <foreach collection="vo.voyageIds" item="id" open="(" separator="," close=")">
  154. #{id}
  155. </foreach>
  156. </if>
  157. <if test="vo.shipIds != null and vo.shipIds.size() > 0">
  158. AND v.ship_id IN
  159. <foreach collection="vo.shipIds" item="shipId" open="(" separator="," close=")">
  160. #{shipId}
  161. </foreach>
  162. </if>
  163. <if test="vo.startDate != null and vo.startDate != ''">
  164. AND v.start_time &gt;= #{vo.startDate}
  165. </if>
  166. <if test="vo.endDate != null and vo.endDate != ''">
  167. AND v.start_time &lt; DATE_ADD(#{vo.endDate}, INTERVAL 1 DAY)
  168. </if>
  169. ORDER BY v.start_time ASC, s.name ASC
  170. </sql>
  171. <!-- 分页查询 -->
  172. <select id="selectYangtzePassengerSummaryPage"
  173. resultType="com.yc.ship.module.trade.controller.admin.report.vo.YangtzePassengerSummaryRespVO">
  174. <include refid="selectYangtzePassengerSummary"/>
  175. </select>
  176. <!-- 不分页查询(用于导出) -->
  177. <select id="selectYangtzePassengerSummaryExportList"
  178. resultType="com.yc.ship.module.trade.controller.admin.report.vo.YangtzePassengerSummaryRespVO">
  179. <include refid="selectYangtzePassengerSummary"/>
  180. </select>
  181. </mapper>