ParkCommandCenterMapper.xml 6.26 KB
<?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.zteits.parking.module.park.dal.mysql.commandcenter.ParkCommandCenterMapper">

    <!--
      指挥中心聚合 SQL(只读)

      口径(与 ParkDashboardMapper 保持一致):
        1. 在用停车场 = parking_lot.data_status = 1 AND state = 1,演示车场(state=2)不计入;
        2. 订单 = order_park,data_state = 1;
        3. 支付单 = pay_order,data_state = 1 AND pay_order_state = 40(支付成功)
           AND order_big_type = 100(停车费);td_b_pay_order 是 2017 年的历史表,不要混用;
        4. 时间入参 [begin, end) 由 Service 按「今天 00:00 ~ 明天 00:00」传入,SQL 不做日期函数。
    -->

    <sql id="activeLotCondition">
        l.data_status = 1
        AND l.state = 1
    </sql>

    <!-- 今日分时进出场:进场按 park_in_time 计、出场按 park_out_time 计,各自分组后合并 -->
    <select id="selectHourlyFlow"
            resultType="com.zteits.parking.module.park.dal.mysql.commandcenter.row.HourFlowRow">
        SELECT h.hour,
               SUM(h.in_count) AS in_count,
               SUM(h.out_count) AS out_count
        FROM (
            SELECT HOUR(o.park_in_time) AS hour,
                   COUNT(*) AS in_count,
                   0 AS out_count
            FROM order_park o
            INNER JOIN parking_lot l ON l.pl_no = o.pl_no
            WHERE <include refid="activeLotCondition"/>
              AND o.data_state = 1
              AND o.park_in_time &gt;= #{begin}
              AND o.park_in_time &lt; #{end}
            GROUP BY HOUR(o.park_in_time)
            UNION ALL
            SELECT HOUR(o.park_out_time) AS hour,
                   0 AS in_count,
                   COUNT(*) AS out_count
            FROM order_park o
            INNER JOIN parking_lot l ON l.pl_no = o.pl_no
            WHERE <include refid="activeLotCondition"/>
              AND o.data_state = 1
              AND o.park_out_time &gt;= #{begin}
              AND o.park_out_time &lt; #{end}
            GROUP BY HOUR(o.park_out_time)
        ) h
        GROUP BY h.hour
        ORDER BY h.hour
    </select>

    <!-- 今日各区县进出场:同一条 UNION ALL 后再按区县汇总 -->
    <select id="selectDistrictFlow"
            resultType="com.zteits.parking.module.park.dal.mysql.commandcenter.row.DistrictFlowRow">
        SELECT f.district,
               SUM(f.in_count) AS in_count,
               SUM(f.out_count) AS out_count
        FROM (
            SELECT l.pl_country_name AS district,
                   COUNT(*) AS in_count,
                   0 AS out_count
            FROM order_park o
            INNER JOIN parking_lot l ON l.pl_no = o.pl_no
            WHERE <include refid="activeLotCondition"/>
              AND o.data_state = 1
              AND o.park_in_time &gt;= #{begin}
              AND o.park_in_time &lt; #{end}
            GROUP BY l.pl_country_name
            UNION ALL
            SELECT l.pl_country_name AS district,
                   0 AS in_count,
                   COUNT(*) AS out_count
            FROM order_park o
            INNER JOIN parking_lot l ON l.pl_no = o.pl_no
            WHERE <include refid="activeLotCondition"/>
              AND o.data_state = 1
              AND o.park_out_time &gt;= #{begin}
              AND o.park_out_time &lt; #{end}
            GROUP BY l.pl_country_name
        ) f
        GROUP BY f.district
    </select>

    <!-- 今日出场订单的停车时长分档:d1 ≤30 分钟 / d2 30-60 分钟 / d3 1-2 小时 / d4 >2 小时 -->
    <select id="selectDurationByDistrict"
            resultType="com.zteits.parking.module.park.dal.mysql.commandcenter.row.DurationRow">
        SELECT l.pl_country_name AS district,
               SUM(CASE WHEN o.secs &lt;= 1800 THEN 1 ELSE 0 END) AS d1,
               SUM(CASE WHEN o.secs &gt; 1800 AND o.secs &lt;= 3600 THEN 1 ELSE 0 END) AS d2,
               SUM(CASE WHEN o.secs &gt; 3600 AND o.secs &lt;= 7200 THEN 1 ELSE 0 END) AS d3,
               SUM(CASE WHEN o.secs &gt; 7200 THEN 1 ELSE 0 END) AS d4
        FROM (
            SELECT o.pl_no,
                   COALESCE(o.parking_duration,
                            TIMESTAMPDIFF(SECOND, o.park_in_time, o.park_out_time)) AS secs
            FROM order_park o
            WHERE o.data_state = 1
              AND o.park_out_time &gt;= #{begin}
              AND o.park_out_time &lt; #{end}
              AND o.park_in_time IS NOT NULL
        ) o
        INNER JOIN parking_lot l ON l.pl_no = o.pl_no
        WHERE <include refid="activeLotCondition"/>
        GROUP BY l.pl_country_name
        ORDER BY l.pl_country_name
    </select>

    <!-- 最近进出场事件:一条订单取最近一次动作(出场优先) -->
    <select id="selectRecentEvents"
            resultType="com.zteits.parking.module.park.dal.mysql.commandcenter.row.EventRow">
        SELECT o.car_number,
               o.pl_name,
               o.park_in_time,
               o.park_out_time
        FROM order_park o
        INNER JOIN parking_lot l ON l.pl_no = o.pl_no
        WHERE <include refid="activeLotCondition"/>
          AND o.data_state = 1
          AND COALESCE(o.park_out_time, o.park_in_time) &gt;= #{since}
        ORDER BY COALESCE(o.park_out_time, o.park_in_time) DESC
        LIMIT #{limit}
    </select>

    <!--
      今日支付成功的支付单,按支付方式聚合。
      注意:现网写入的是 pay_order(pay_order_state = 40 表示支付成功),
      td_b_pay_order 是 2017 年的历史表(pay_order_state = 1),不要混用。
    -->
    <select id="selectPaymentAgg"
            resultType="com.zteits.parking.module.park.dal.mysql.commandcenter.row.PaymentAggRow">
        SELECT p.pay_type,
               COUNT(*) AS cnt,
               COALESCE(SUM(p.order_act_fee), 0) AS amount
        FROM pay_order p
        INNER JOIN parking_lot l ON l.pl_no = p.pl_no
        WHERE <include refid="activeLotCondition"/>
          AND p.data_state = 1
          AND p.pay_order_state = 40
          AND p.order_big_type = 100
          AND p.create_date &gt;= #{begin}
          AND p.create_date &lt; #{end}
        GROUP BY p.pay_type
        ORDER BY cnt DESC
    </select>

</mapper>