YangtzePassengerSummaryMapper.xml 8.9 KB

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