ParkResourceMapMapper.xml 8.03 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.resourcemap.ParkResourceMapMapper">

    <!--
      停车资源一张图聚合 SQL(只读)

      口径:
        1. 在用停车场 = parking_lot.data_status = 1 AND state = 1,且只看赤峰市;
        2. region 传区县名称(pl_country_name),空 = 全市;
        3. 实时泊位来自 parking_lot_berth_temp_info,没有实时行时 free_berth 为 NULL;
        4. 今日进出 = order_park(data_state = 1),park_in_time / park_out_time 落在今天;
        5. 资源台账计数:tp_p_berths(is_occupy 1 占用 / 2 空闲)、
           tp_p_eqp(eqp_type 1 地磁,eqp_is_online 0 离线 / 1 在线 / 2 故障)、
           tp_p_charging_pile(data_status = 1);三者都通过 pl_no 关联 parking_lot,
           跟随 region 收窄到区县,和车场、设备点位用同一套范围口径。
    -->

    <sql id="lotCondition">
        l.data_status = 1
        AND l.state = 1
        AND l.pl_city_name = '赤峰市'
        <if test="region != null and region != ''">
            AND l.pl_country_name = #{region}
        </if>
    </sql>

    <select id="selectLots"
            resultType="com.zteits.parking.module.park.dal.mysql.resourcemap.row.ResourceMapLotRow">
        SELECT l.pl_no,
               TRIM(REPLACE(REPLACE(l.pl_name, CHAR(10), ''), CHAR(13), '')) AS pl_name,
               l.pl_type,
               l.pl_type_prop,
               l.pl_country_name AS district,
               l.pl_address      AS address,
               l.pl_berth_num,
               t.berthNum        AS temp_berth_num,
               t.pl_berth_num    AS temp_pl_berth_num,
               t.free_berth,
               g.lon_id          AS lng,
               g.lat_id          AS lat,
               g.lon_lat_type    AS coord_type
        FROM parking_lot l
        LEFT JOIN parking_lot_berth_temp_info t ON t.pl_no = l.pl_no
        LEFT JOIN parking_lot_geo g ON g.geo_id = (
            SELECT g2.geo_id
            FROM parking_lot_geo g2
            WHERE g2.pl_no = l.pl_no
              AND g2.data_status = 1
            ORDER BY CASE g2.lon_lat_type WHEN 3 THEN 0 WHEN 1 THEN 1 WHEN 2 THEN 2 ELSE 3 END,
                     g2.geo_id
            LIMIT 1
        )
        WHERE <include refid="lotCondition"/>
        ORDER BY l.pl_country_name, l.pl_no
    </select>

    <!--
      今日进出场按车场汇总。只扫落在今天的行:park_in_time / park_out_time 各有索引,
      表里有 66 万历史订单,不带时间条件会全表扫。
    -->
    <select id="selectTodayInOut"
            resultType="com.zteits.parking.module.park.dal.mysql.resourcemap.row.ResourceMapLotRow">
        SELECT o.pl_no,
               SUM(CASE WHEN o.park_in_time &gt;= #{dayStart} THEN 1 ELSE 0 END)  AS today_in,
               SUM(CASE WHEN o.park_out_time &gt;= #{dayStart} THEN 1 ELSE 0 END) AS today_out
        FROM order_park o
        WHERE o.data_state = 1
          AND (o.park_in_time &gt;= #{dayStart} OR o.park_out_time &gt;= #{dayStart})
        GROUP BY o.pl_no
    </select>

    <select id="selectResourceCount"
            resultType="com.zteits.parking.module.park.dal.mysql.resourcemap.row.ResourceMapResourceRow">
        SELECT
            (SELECT COUNT(*) FROM tp_p_berths b
               INNER JOIN parking_lot l ON l.pl_no = b.pl_no
                   AND l.data_status = 1 AND l.state = 1 AND l.pl_city_name = '赤峰市'
                   <if test="region != null and region != ''">AND l.pl_country_name = #{region}</if>
              WHERE b.data_state = 1)                                      AS roadside_berth,
            (SELECT COUNT(*) FROM tp_p_berths b
               INNER JOIN parking_lot l ON l.pl_no = b.pl_no
                   AND l.data_status = 1 AND l.state = 1 AND l.pl_city_name = '赤峰市'
                   <if test="region != null and region != ''">AND l.pl_country_name = #{region}</if>
              WHERE b.data_state = 1 AND b.is_occupy = '1')                AS roadside_occupied,
            (SELECT COUNT(*) FROM tp_p_eqp e
               INNER JOIN parking_lot l ON l.pl_no = e.pl_no
                   AND l.data_status = 1 AND l.state = 1 AND l.pl_city_name = '赤峰市'
                   <if test="region != null and region != ''">AND l.pl_country_name = #{region}</if>
              WHERE e.data_state = 1 AND e.eqp_type = 1)                   AS geomagnetic,
            (SELECT COUNT(*) FROM tp_p_eqp e
               INNER JOIN parking_lot l ON l.pl_no = e.pl_no
                   AND l.data_status = 1 AND l.state = 1 AND l.pl_city_name = '赤峰市'
                   <if test="region != null and region != ''">AND l.pl_country_name = #{region}</if>
              WHERE e.data_state = 1 AND e.eqp_type = 1 AND e.eqp_is_online = '1') AS geomagnetic_online,
            (SELECT COUNT(*) FROM tp_p_eqp e
               INNER JOIN parking_lot l ON l.pl_no = e.pl_no
                   AND l.data_status = 1 AND l.state = 1 AND l.pl_city_name = '赤峰市'
                   <if test="region != null and region != ''">AND l.pl_country_name = #{region}</if>
              WHERE e.data_state = 1 AND e.eqp_type = 1 AND e.eqp_is_online = '2') AS geomagnetic_fault,
            (SELECT COUNT(*) FROM tp_p_charging_pile p
               INNER JOIN parking_lot l ON l.pl_no = p.pl_no
                   AND l.data_status = 1 AND l.state = 1 AND l.pl_city_name = '赤峰市'
                   <if test="region != null and region != ''">AND l.pl_country_name = #{region}</if>
              WHERE p.data_status = 1)                                     AS charging_pile
    </select>

    <!--
      设备点位:只取有坐标的地磁 / 道闸。库里有 2771 台设备,其中约一半
      lon/lat 是 0(早年批量导入没落坐标),落在地图原点会糊成一团,直接排除。
    -->
    <select id="selectDevices"
            resultType="com.zteits.parking.module.park.dal.mysql.resourcemap.row.ResourceMapDeviceRow">
        SELECT e.eqp_no,
               e.eqp_name,
               e.pl_no,
               l.pl_name   AS pl_name,
               l.pl_country_name AS district,
               e.eqp_type,
               e.eqp_is_online AS online_status,
               e.berth_no,
               e.lon_id    AS lng,
               e.lat_id    AS lat,
               e.lon_lat_type AS coord_type
        FROM tp_p_eqp e
        INNER JOIN parking_lot l ON l.pl_no = e.pl_no
            AND l.data_status = 1
            AND l.state = 1
            AND l.pl_city_name = '赤峰市'
            <if test="region != null and region != ''">
                AND l.pl_country_name = #{region}
            </if>
        WHERE e.data_state = 1
          AND e.eqp_type IN (1, 10)
          AND e.lon_id &lt;&gt; 0
          AND e.lat_id &lt;&gt; 0
        ORDER BY e.eqp_type, e.eqp_no
    </select>

    <!--
      最近进出场:只扫今天的订单,按「最后一次动作」倒序取 N 条。
      一条订单可能同时贡献进场 / 出场两条事件,拆分在 Service 里做。
    -->
    <select id="selectRecentAccess"
            resultType="com.zteits.parking.module.park.dal.mysql.resourcemap.row.ResourceMapAccessRow">
        SELECT o.pl_no,
               o.pl_name,
               l.pl_country_name AS district,
               o.car_number,
               o.car_number_color,
               o.order_act_fee,
               o.park_in_time,
               o.park_out_time,
               o.park_in_source_name,
               o.park_out_source_name
        FROM order_park o
        LEFT JOIN parking_lot l ON l.pl_no = o.pl_no AND l.data_status = 1
        WHERE o.data_state = 1
          AND (o.park_in_time &gt;= #{dayStart} OR o.park_out_time &gt;= #{dayStart})
          <if test="region != null and region != ''">
              AND l.pl_country_name = #{region}
          </if>
        ORDER BY GREATEST(o.park_in_time, IFNULL(o.park_out_time, o.park_in_time)) DESC
        LIMIT #{limit}
    </select>

</mapper>