FlowMonitorMapper.xml 6.38 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.flowmonitor.FlowMonitorMapper">

    <!--
      实时停车流量聚合 SQL(只读)

      口径:
        1. 在用停车场 = parking_lot.data_status = 1 AND state = 1(演示车场 state=2 不计入);
        2. 排除已取消订单 order_state = -50;
        3. region 传区县名称(pl_country_name),空 = 全市;plNo 可选,空 = 全部车场;
        4. 分钟粒度直接落在 order_park 的 park_in_time / park_out_time 上——
           parking_running_statistic 只有小时(time_cycle=40)与天(time_cycle=50),给不了分钟曲线。
    -->

    <sql id="scopeCondition">
        l.data_status = 1
        AND l.state = 1
        AND o.order_state &lt;&gt; -50
        <if test="region != null and region != ''">
            AND l.pl_country_name = #{region}
        </if>
        <if test="plNo != null and plNo != ''">
            AND o.pl_no = #{plNo}
        </if>
    </sql>

    <select id="selectMinuteIn"
            resultType="com.zteits.parking.module.park.dal.mysql.flowmonitor.row.MinuteFlowRow">
        SELECT DATE_FORMAT(o.park_in_time, '%Y-%m-%d %H:%i') AS minute_key,
               COUNT(*) AS cnt
        FROM order_park o
        INNER JOIN parking_lot l ON l.pl_no = o.pl_no
        WHERE <include refid="scopeCondition"/>
          AND o.park_in_time &gt;= #{begin}
          AND o.park_in_time &lt; #{end}
        GROUP BY minute_key
        ORDER BY minute_key
    </select>

    <select id="selectMinuteOut"
            resultType="com.zteits.parking.module.park.dal.mysql.flowmonitor.row.MinuteFlowRow">
        SELECT DATE_FORMAT(o.park_out_time, '%Y-%m-%d %H:%i') AS minute_key,
               COUNT(*) AS cnt
        FROM order_park o
        INNER JOIN parking_lot l ON l.pl_no = o.pl_no
        WHERE <include refid="scopeCondition"/>
          AND o.park_out_time &gt;= #{begin}
          AND o.park_out_time &lt; #{end}
        GROUP BY minute_key
        ORDER BY minute_key
    </select>

    <select id="selectLotRanking"
            resultType="com.zteits.parking.module.park.dal.mysql.flowmonitor.row.LotFlowRow">
        SELECT t.pl_no,
               t.pl_name,
               SUM(t.in_cnt) AS in_count,
               SUM(t.out_cnt) AS out_count
        FROM (
            SELECT o.pl_no,
                   TRIM(REPLACE(REPLACE(l.pl_name, CHAR(10), ''), CHAR(13), '')) AS pl_name,
                   1 AS in_cnt,
                   0 AS out_cnt
            FROM order_park o
            INNER JOIN parking_lot l ON l.pl_no = o.pl_no
            WHERE <include refid="scopeCondition"/>
              AND o.park_in_time &gt;= #{begin}
              AND o.park_in_time &lt; #{end}
            UNION ALL
            SELECT o.pl_no,
                   TRIM(REPLACE(REPLACE(l.pl_name, CHAR(10), ''), CHAR(13), '')) AS pl_name,
                   0 AS in_cnt,
                   1 AS out_cnt
            FROM order_park o
            INNER JOIN parking_lot l ON l.pl_no = o.pl_no
            WHERE <include refid="scopeCondition"/>
              AND o.park_out_time &gt;= #{begin}
              AND o.park_out_time &lt; #{end}
        ) t
        GROUP BY t.pl_no, t.pl_name
        ORDER BY (SUM(t.in_cnt) + SUM(t.out_cnt)) DESC, t.pl_no
        LIMIT #{limit}
    </select>

    <select id="selectRecentEvents"
            resultType="com.zteits.parking.module.park.dal.mysql.flowmonitor.row.RecentEventRow">
        SELECT t.id, t.car_number, t.pl_no, t.pl_name, t.direction,
               DATE_FORMAT(t.occur_time, '%Y-%m-%d %H:%i:%s') AS occur_time
        FROM (
            SELECT o.id,
                   o.car_number,
                   o.pl_no,
                   TRIM(REPLACE(REPLACE(l.pl_name, CHAR(10), ''), CHAR(13), '')) AS pl_name,
                   'IN' AS direction,
                   o.park_in_time AS occur_time
            FROM order_park o
            INNER JOIN parking_lot l ON l.pl_no = o.pl_no
            WHERE <include refid="scopeCondition"/>
              AND o.park_in_time IS NOT NULL
            UNION ALL
            SELECT o.id,
                   o.car_number,
                   o.pl_no,
                   TRIM(REPLACE(REPLACE(l.pl_name, CHAR(10), ''), CHAR(13), '')) AS pl_name,
                   'OUT' AS direction,
                   o.park_out_time AS occur_time
            FROM order_park o
            INNER JOIN parking_lot l ON l.pl_no = o.pl_no
            WHERE <include refid="scopeCondition"/>
              AND o.park_out_time IS NOT NULL
        ) t
        ORDER BY t.occur_time DESC, t.id DESC
        LIMIT #{limit}
    </select>

    <select id="selectParkedNow" resultType="java.lang.Long">
        SELECT COUNT(*)
        FROM order_park o
        INNER JOIN parking_lot l ON l.pl_no = o.pl_no
        WHERE <include refid="scopeCondition"/>
          AND o.park_out_time IS NULL
          AND o.park_in_time IS NOT NULL
          AND o.park_in_time &lt; #{end}
    </select>

    <select id="selectAvgDuration" resultType="java.lang.Double">
        SELECT AVG(TIMESTAMPDIFF(MINUTE, 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="scopeCondition"/>
          AND o.park_out_time &gt;= #{begin}
          AND o.park_out_time &lt; #{end}
          AND o.park_in_time IS NOT NULL
    </select>

    <select id="selectBerthTotal" resultType="java.lang.Long">
        SELECT COALESCE(SUM(l.pl_berth_num), 0)
        FROM parking_lot l
        WHERE l.data_status = 1
          AND l.state = 1
        <if test="region != null and region != ''">
            AND l.pl_country_name = #{region}
        </if>
        <if test="plNo != null and plNo != ''">
            AND l.pl_no = #{plNo}
        </if>
    </select>

    <select id="selectDataThrough" resultType="java.time.LocalDateTime">
        SELECT MAX(t.occur_time)
        FROM (
            SELECT MAX(o.park_in_time) AS occur_time
            FROM order_park o
            INNER JOIN parking_lot l ON l.pl_no = o.pl_no
            WHERE <include refid="scopeCondition"/>
            UNION ALL
            SELECT MAX(o.park_out_time) AS occur_time
            FROM order_park o
            INNER JOIN parking_lot l ON l.pl_no = o.pl_no
            WHERE <include refid="scopeCondition"/>
        ) t
    </select>

</mapper>