| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.yc.ship.module.trade.dal.mysql.report.YangtzePassengerSummaryMapper">
- <!-- 公共查询SQL片段 -->
- <!-- 业务逻辑:
- 锁位订单:order_status != 14(非留位的有效订单,客人100%会出行)
- 留位订单:order_status = 14(占位订单)
- 实收房间数 = 锁位订单的房间数
- 占位房间数 = 留位订单的房间数
- 实收人数 = 仅锁位订单的游客(有名单的)
- 预计收客人数 = 锁位+留位的所有人数合计(从trade_order_total获取,不管是否有名单)
- -->
- <sql id="selectYangtzePassengerSummary">
- SELECT
- v.id AS voyageId,
- s.name AS shipName,
- CONCAT(DATE_FORMAT(v.boarding_time, '%Y-%m-%d'), ' ', CASE WHEN r.direction = 1 THEN '上水' ELSE '下水' END) AS voyageInfo,
- GREATEST(DATEDIFF(DATE(v.boarding_time), CURDATE()), 0) AS countdown,
- 528 AS capacity,
- COALESCE(room_stats.totalRooms, 0) AS totalRooms,
- COALESCE(room_stats.paidRooms, 0) AS paidRooms,
- COALESCE(room_stats.reservedRooms, 0) AS reservedRooms,
- COALESCE(visitor_stats.totalPassengers, 0) AS totalPassengers,
- COALESCE(visitor_stats.ticketedPassengers, 0) AS ticketedPassengers,
- COALESCE(free_stats.freePassengers, 0) AS freePassengers,
- COALESCE(estimated_stats.estimatedPassengers, 0) AS estimatedPassengers,
- COALESCE(finance_stats.receivableAmount, 0) AS receivableAmount,
- COALESCE(finance_stats.receivedAmount, 0) AS receivedAmount,
- COALESCE(finance_stats.receivableAmount, 0) - COALESCE(finance_stats.receivedAmount, 0) AS unreceivedAmount,
- CASE WHEN COALESCE(visitor_stats.ticketedPassengers, 0) > 0
- THEN ROUND(COALESCE(finance_stats.receivableAmount, 0) / visitor_stats.ticketedPassengers, 2)
- ELSE 0 END AS avgPrice,
- COALESCE(visitor_stats.adultCount, 0) AS adultCount,
- COALESCE(visitor_stats.childCount, 0) AS childCount,
- COALESCE(visitor_stats.infantCount, 0) AS infantCount,
- COALESCE(visitor_stats.companionLeaderCount, 0) AS companionLeaderCount,
- COALESCE(team_stats.groupCount, 0) AS groupCount,
- COALESCE(team_stats.individualCount, 0) AS individualCount,
- COALESCE(nationality_stats.domesticCount, 0) AS domesticCount,
- COALESCE(nationality_stats.overseasCount, 0) AS overseasCount
- FROM product_voyage v
- INNER JOIN resource_ship s ON v.ship_id = s.id AND s.deleted = 0
- INNER JOIN resource_route r ON v.route_id = r.id AND r.deleted = 0
- LEFT JOIN (
- SELECT
- o.voyage_id,
- SUM(COALESCE(tot.use_room_num, 0)) AS totalRooms,
- SUM(CASE WHEN o.order_status = 1 or o.order_status = 6 THEN COALESCE(tot.use_room_num, 0) ELSE 0 END) AS paidRooms,
- SUM(CASE WHEN o.order_status = 14 THEN COALESCE(tot.use_room_num, 0) ELSE 0 END) AS reservedRooms
- FROM trade_order_room_model tot
- LEFT JOIN trade_order o ON o.id = tot.order_id AND tot.deleted = 0
- WHERE o.deleted = 0 AND o.order_status IN (14,6,1)
- GROUP BY o.voyage_id
- ) room_stats ON v.id = room_stats.voyage_id
- LEFT JOIN (
- SELECT
- o.voyage_id,
- COUNT(tv.id) AS totalPassengers,
- SUM(CASE WHEN o.order_status IN (6) THEN 1 ELSE 0 END) AS ticketedPassengers,
- SUM(CASE WHEN tv.type IN ('adultTake', 'adultPlus') THEN 1 ELSE 0 END) AS adultCount,
- SUM(CASE WHEN tv.type IN ('childTake', 'childPlus', 'childNonTake') THEN 1 ELSE 0 END) AS childCount,
- SUM(CASE WHEN tv.type IN ('babyTake', 'babyPlus', 'babyNonTake') THEN 1 ELSE 0 END) AS infantCount,
- SUM(CASE WHEN tv.type IN ('with', 'leader') THEN 1 ELSE 0 END) AS companionLeaderCount
- FROM trade_order o
- INNER JOIN trade_visitor tv ON o.id = tv.order_id AND tv.deleted = 0
- WHERE o.deleted = 0 AND o.order_status IN (15, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
- GROUP BY o.voyage_id
- ) visitor_stats ON v.id = visitor_stats.voyage_id
- LEFT JOIN (
- SELECT
- o.voyage_id,
- 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)
- + COALESCE(tot.baby_total_num, 0) + COALESCE(tot.with_total_num, 0)
- + COALESCE(tot.leader_total_num, 0)) ELSE 0 END AS estimatedPassengers
- FROM trade_order o
- LEFT JOIN trade_order_total tot ON o.id = tot.old_order_id AND tot.deleted = 0
- WHERE o.deleted = 0 AND o.order_status IN (15, 14, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
- GROUP BY o.voyage_id
- ) estimated_stats ON v.id = estimated_stats.voyage_id
- LEFT JOIN (
- SELECT
- o.voyage_id,
- SUM(CASE WHEN od.name LIKE '免票%' THEN 1 ELSE 0 END) AS freePassengers
- FROM trade_order o
- INNER JOIN trade_visitor tv ON o.id = tv.order_id AND tv.deleted = 0
- LEFT JOIN ota_distributor od ON o.source_id = od.id AND od.deleted = 0
- WHERE o.deleted = 0 AND o.order_status IN (15, 14, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
- GROUP BY o.voyage_id
- ) free_stats ON v.id = free_stats.voyage_id
- LEFT JOIN (
- SELECT
- o.voyage_id,
- SUM(o.pay_amount) AS receivableAmount,
- SUM(CASE WHEN o.pay_status = 1 THEN COALESCE(p.pay_amount, o.real_pay_amount)
- ELSE COALESCE(o.real_pay_amount, 0) END) AS receivedAmount
- FROM trade_order o
- LEFT JOIN (
- SELECT order_id, SUM(pay_amount) AS pay_amount
- FROM trade_order_pay
- WHERE deleted = 0 AND pay_status = 1
- GROUP BY order_id
- ) p ON o.pay_status = 1 AND p.order_id = o.id
- WHERE o.deleted = 0 AND o.order_status IN (15, 14, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
- GROUP BY o.voyage_id
- ) finance_stats ON v.id = finance_stats.voyage_id
- LEFT JOIN (
- SELECT
- o.voyage_id,
- SUM(CASE WHEN visitor_cnt.cnt >= 10 THEN visitor_cnt.cnt ELSE 0 END) AS groupCount,
- SUM(CASE WHEN visitor_cnt.cnt < 10 THEN visitor_cnt.cnt ELSE 0 END) AS individualCount
- FROM trade_order o
- INNER JOIN (
- SELECT order_id, COUNT(id) AS cnt
- FROM trade_visitor
- WHERE deleted = 0
- GROUP BY order_id
- ) visitor_cnt ON o.id = visitor_cnt.order_id
- WHERE o.deleted = 0 AND o.order_status IN (15, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
- GROUP BY o.voyage_id
- ) team_stats ON v.id = team_stats.voyage_id
- LEFT JOIN (
- SELECT
- o.voyage_id,
- SUM(CASE WHEN tv.nationality = '1' OR tv.nationality IS NULL OR tv.nationality = '' THEN 1 ELSE 0 END) AS domesticCount,
- SUM(CASE WHEN tv.nationality != '1' AND tv.nationality IS NOT NULL AND tv.nationality != '' THEN 1 ELSE 0 END) AS overseasCount
- FROM trade_order o
- INNER JOIN trade_visitor tv ON o.id = tv.order_id AND tv.deleted = 0
- WHERE o.deleted = 0 AND o.order_status IN (15, 13, 10, 12, 9, 8, 7, 6, 5, 4, 3, 1, 0)
- GROUP BY o.voyage_id
- ) nationality_stats ON v.id = nationality_stats.voyage_id
- WHERE v.deleted = 0
- <if test="vo.voyageIds != null and vo.voyageIds.size() > 0">
- AND v.id IN
- <foreach collection="vo.voyageIds" item="id" open="(" separator="," close=")">
- #{id}
- </foreach>
- </if>
- <if test="vo.shipId != null">
- AND v.ship_id = #{vo.shipId}
- </if>
- <if test="vo.startDate != null and vo.startDate != ''">
- AND v.start_time >= #{vo.startDate}
- </if>
- <if test="vo.endDate != null and vo.endDate != ''">
- AND v.start_time < DATE_ADD(#{vo.endDate}, INTERVAL 1 DAY)
- </if>
- ORDER BY v.start_time ASC, s.name ASC
- </sql>
- <!-- 分页查询 -->
- <select id="selectYangtzePassengerSummaryPage"
- resultType="com.yc.ship.module.trade.controller.admin.report.vo.YangtzePassengerSummaryRespVO">
- <include refid="selectYangtzePassengerSummary"/>
- </select>
- <!-- 不分页查询(用于导出) -->
- <select id="selectYangtzePassengerSummaryExportList"
- resultType="com.yc.ship.module.trade.controller.admin.report.vo.YangtzePassengerSummaryRespVO">
- <include refid="selectYangtzePassengerSummary"/>
- </select>
- </mapper>
|