JinPengYong
2020-04-26 cda3fcb63a6cebb154a3770c4c6c288cd660d762
src/main/resources/mapper/HistoryMinutelyMapper.xml
@@ -1,96 +1,233 @@
<?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.moral.mapper.HistoryMinutelyMapper">
   <resultMap id="PairDataResultMap" type="com.moral.entity.charts.PairData" >
      <result column="format_time" property="category" jdbcType="VARCHAR" />
      <result column="value" property="value" jdbcType="DOUBLE" />
   </resultMap>
   <select id="getSersionAvgByDevice" resultType="java.util.Map">
      SELECT
         ${sensorKeyColumn}
      FROM
         history_minutely
      WHERE
         mac = #{mac}
      AND time >= #{start}
      AND time &lt; #{end}
   </select>
   <select id="getMonitorPointOrDeviceAvgData" resultType="java.util.Map">
      SELECT
         DATE_FORMAT(time, #{typeFormat}) time,
         ${sensorKeyColumn}
      FROM
         history_minutely h
      WHERE
         h.time >= #{start}
      AND h.time <![CDATA[<]]> #{end}
      <if test="mac != null">
      AND   h.mac = #{mac}
      </if>
      <if test="mac == null">
      AND   h.mac IN
         <foreach  collection="macs" open="(" separator="," close=")" item="listItem">
            #{listItem}
         </foreach>
      </if>
      GROUP BY
         DATE_FORMAT(time, #{typeFormat})
      ORDER BY
         time
   </select>
   <select id="selectLineChartDateByCrieria" resultType="java.util.Map">
         SELECT
            <choose>
               <when test="'MINUTE'==dataCondition.timeUnits.toString() and 'DEVICE'==dataCondition.areaRange.toString()">
                  <foreach collection="sensorKeys"
                         item="sensorKey" separator="," close=",">
                          json->'$.${sensorKey}[0]' as '${sensorKey}'
                  </foreach>
               </when>
               <otherwise>
                  <foreach collection="sensorKeys"
                         item="sensorKey" separator="," close=",">
                     AVG(json->'$.${sensorKey}[0]') as '${sensorKey}'
                  </foreach>
               </otherwise>
            </choose>
           DATE_FORMAT(time,'${@com.moral.common.util.ReportTimeFormat@toMySqlTimeFormat(timePeriod.timeUnits)}') as format_time
           FROM
         `history_minutely` hmi
         <where>
            and hmi.time >= #{timePeriod.startTime}
            and hmi.time <![CDATA[<=]]> #{timePeriod.endTime}
            <if test="dataCondition.actualTime != null">
               and DATE_FORMAT(time,   '${@com.moral.common.util.ReportTimeFormat@toMySqlActualTimeFormat(dataCondition.timeUnits)}') = #{dataCondition.actualTime}
            </if>
            and hmi.mac in (
            select mac from device dev
            join monitor_point mpt  on dev.monitor_point_id = mpt.id
            <where>
                <if test='"DEVICE"==dataCondition.areaRange.toString()'>
                  and dev.id = #{dataCondition.areaRangeId}
                </if>
               <if test='"MONITORPOINT"==dataCondition.areaRange.toString()'>
                  and mpt.id = #{dataCondition.areaRangeId}
               </if>
               <if test='"PROVINCE"==dataCondition.areaRange.toString()'>
                  and mpt.province_code = #{dataCondition.areaRangeId}
               </if>
               <if test='"CITY"==dataCondition.areaRange.toString()'>
                  and mpt.city_code = #{dataCondition.areaRangeId}
               </if>
               <if test='"AREA"==dataCondition.areaRange.toString()'>
                  and mpt.area_code = #{dataCondition.areaRangeId}
               </if>
            </where>
            )
         </where>
         <if test="'MINUTE'!=dataCondition.timeUnits.toString() or 'DEVICE'!=dataCondition.areaRange.toString()">
            GROUP BY format_time
         </if>
          ORDER BY format_time asc
   </select>
</mapper>
<?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.moral.mapper.HistoryMinutelyMapper">
  <resultMap id="PairDataResultMap" type="com.moral.entity.charts.PairData">
    <result column="format_time" property="category" jdbcType="VARCHAR"/>
    <result column="value" property="value" jdbcType="DOUBLE"/>
  </resultMap>
  <select id="getSersionAvgByDevice" resultType="java.util.Map">
    SELECT
    <foreach collection="sensorKeys" separator="," item="sensorKey">
      AVG(json->'$.${sensorKey}[0]') AS '${sensorKey}'
    </foreach>
    FROM
    history_minutely_${yearAndMonth}
    WHERE
    mac IN
    (SELECT
    d.mac
    FROM
    device d
    WHERE
    d.is_delete = 0
    <if test="monitorPointId != null">
      AND d.monitor_point_id = #{monitorPointId}
    </if>
    <if test="mac != null">
      AND d.mac = #{mac}
    </if>
    )
    AND time >= #{start}
    AND time &lt; #{end}
  </select>
  <select id="getMonitorPointOrDeviceAvgData" resultType="java.util.Map">
    SELECT
    DATE_FORMAT(time, #{typeFormat}) time
    <foreach collection="sensorKeys" open="," separator="," item="sensorKey">
      AVG(json->'$.${sensorKey}[0]') AS '${sensorKey}'
    </foreach>
    FROM
    history_${timeUnits} h
    WHERE
    h.time >= #{start}
    AND h.time <![CDATA[<]]> #{end}
    <if test="mac != null">
      AND h.mac = #{mac}
    </if>
    <if test="mac == null">
      AND h.mac IN
      (SELECT
      d.mac
      FROM
      device d,
      monitor_point mp
      WHERE
      d.monitor_point_id = mp.id
      <if test="provinceCode != null">
        AND mp.province_code = #{provinceCode}
      </if>
      <if test="cityCode != null">
        AND mp.city_code = #{cityCode}
      </if>
      <if test="areaCode != null">
        AND mp.area_code = #{areaCode}
      </if>
      <if test="monitorPointId != null">
        AND mp.id = #{monitorPointId}
      </if>
      <if test="professionId != null">
        AND d.profession_id = #{professionId}
      </if>
      )
    </if>
    GROUP BY
    DATE_FORMAT(time, #{typeFormat})
    ORDER BY
    time
  </select>
  <select id="getAreaAvgDataByAreaCode" resultType="java.util.Map">
    SELECT
    DATE_FORMAT(time, #{typeFormat}) time,
    AVG(aqi_json->'$.${sensors1}') AS '${sensors2}'
    FROM
    hangzhou_aqi ha
    WHERE
    ha.time >= #{start}
    AND ha.time <![CDATA[<]]> #{end}
    AND ha.city_code = #{areaCode}
    GROUP BY
    DATE_FORMAT(time, #{typeFormat})
    ORDER BY
    time
  </select>
  <select id="selectLineChartDateByCrieria" resultType="java.util.Map">
    SELECT
    <choose>
      <when test="'MINUTE'==dataCondition.timeUnits.toString() and 'DEVICE'==dataCondition.areaRange.toString()">
        <foreach collection="sensorKeys"
                 item="sensorKey" separator="," close=",">
          json->'$.${sensorKey}[0]' as '${sensorKey}'
        </foreach>
      </when>
      <otherwise>
        <foreach collection="sensorKeys"
                 item="sensorKey" separator="," close=",">
          AVG(json->'$.${sensorKey}[0]') as '${sensorKey}'
        </foreach>
      </otherwise>
    </choose>
    DATE_FORMAT(time,'${@com.moral.common.util.ReportTimeFormat@toMySqlTimeFormat(timePeriod.timeUnits)}') as
    format_time
    FROM
    `history_minutely` hmi
    <where>
      and hmi.time >= #{timePeriod.startTime}
      and hmi.time <![CDATA[<=]]> #{timePeriod.endTime}
      <if test="dataCondition.actualTime != null">
        and DATE_FORMAT(time,
        '${@com.moral.common.util.ReportTimeFormat@toMySqlActualTimeFormat(dataCondition.timeUnits)}') =
        #{dataCondition.actualTime}
      </if>
      and hmi.mac in (
      select mac from device dev
      join monitor_point mpt on dev.monitor_point_id = mpt.id
      <where>
        <if test='"DEVICE"==dataCondition.areaRange.toString()'>
          and dev.id = #{dataCondition.areaRangeId}
        </if>
        <if test='"PROFESSION"==dataCondition.deviceDimension.toString()'>
          and dev.profession_id = #{dataCondition.dimensionValue}
        </if>
        <if test='"MONITORPOINT"==dataCondition.areaRange.toString()'>
          and mpt.id = #{dataCondition.areaRangeId}
        </if>
        <if test='"PROVINCE"==dataCondition.areaRange.toString()'>
          and mpt.province_code = #{dataCondition.areaRangeId}
        </if>
        <if test='"CITY"==dataCondition.areaRange.toString()'>
          and mpt.city_code = #{dataCondition.areaRangeId}
        </if>
        <if test='"AREA"==dataCondition.areaRange.toString()'>
          and mpt.area_code = #{dataCondition.areaRangeId}
        </if>
      </where>
      )
    </where>
    <if test="'MINUTE'!=dataCondition.timeUnits.toString() or 'DEVICE'!=dataCondition.areaRange.toString()">
      GROUP BY format_time
    </if>
    ORDER BY format_time asc
  </select>
  <!-- 无人机sensor查询 -->
  <select id="getSensorData" resultType="java.util.LinkedHashMap">
    SELECT
    DATE_FORMAT(hm.time,'%Y-%m-%d %H:%i:%s') time,
    <foreach collection="sensorKeys" item="sensorKey" separator=",">
      hm.json->'$.${sensorKey}[0]' as '${sensorKey}',
      hm.json->'$.${sensorKey}[1]' as 'min${sensorKey}',
      hm.json->'$.${sensorKey}[2]' as 'max${sensorKey}'
    </foreach>
    FROM
    history_minutely as hm
    <where>
      <if test="mac!=null">
        and hm.mac=#{mac}
      </if>
      and hm.time >= #{startTime}
      and hm.time <![CDATA[<]]> #{endTime}
    </where>
    ORDER BY
    hm.time
  </select>
  <select id="getSensorData2020" resultType="java.util.LinkedHashMap">
    SELECT
    DATE_FORMAT(hm.time,'%Y-%m-%d %H:%i:%s') time,
    <foreach collection="sensorKeys" item="sensorKey" separator=",">
      hm.json->'$.${sensorKey}[0]' as '${sensorKey}',
      hm.json->'$.${sensorKey}[1]' as 'min${sensorKey}',
      hm.json->'$.${sensorKey}[2]' as 'max${sensorKey}'
    </foreach>
    FROM
    history_minutely_${yearAndMonth} as hm
    <where>
      <if test="mac!=null">
        and hm.mac=#{mac}
      </if>
      and hm.time >= #{startTime}
      and hm.time <![CDATA[<]]> #{endTime}
    </where>
    ORDER BY
    hm.time
  </select>
  <select id="getDevicesAvgDataToExcel" resultType="java.util.LinkedHashMap">
    select
    rs.monitorPointName,rs.name,
    <foreach collection="timeList" separator="," item="time">
      max(case time when #{time} then rs.${sensorKey} else "" end) as #{time}
    </foreach>
    from
    (SELECT
    m.name as monitorPointName,d.name,DATE_FORMAT(time, #{typeFormat}) time,
    <foreach collection="sensorKeys" separator="," item="sensorKey">
      AVG(json->'$.${sensorKey}[0]') AS '${sensorKey}'
    </foreach>
    FROM
    history_${timeUnits} h,
    device d,
    monitor_point m
    WHERE
    h.mac=d.mac
    AND d.monitor_point_id=m.id
    AND h.time >= #{start}
    AND h.time <![CDATA[<=]]> #{end}
    AND h.mac in
    <foreach collection="macs" open="(" separator="," close=")"
             item="mac">
      #{mac}
    </foreach>
    GROUP BY
    h.mac,m.name,d.name,DATE_FORMAT(time, #{typeFormat})
    ORDER BY
    h.mac) rs
    GROUP BY rs.monitorPointName,rs.name
    order by rs.monitorPointName
  </select>
</mapper>