<?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.zc.business.mapper.OnlineSumMapper">

    <resultMap type="com.zc.business.domain.OnlineSum" id="OnlineSum">
        <result property="id" column="id"/>
        <result property="deviceId" column="device_id"/>
        <result property="totalCount" column="total_count"/>
        <result property="onlineRate" column="online_rate"/>
        <result property="offlineRate" column="offline_rate"/>
        <result property="lossRate" column="loss_rate"/>
        <result property="rttAvg" column="rtt_avg"/>
        <result property="networkQuality" column="network_quality"/>
        <result property="statisticalDate" column="statistical_date"/>
        <result property="deviceType" column="device_type"/>
        <result property="roadId" column="section_id"/>
        <result property="deviceIp" column="device_ip"/>
        <result property="deviceName" column="device_name"/>
        <result property="stakeMark" column="stake_mark"/>
        <result property="direction" column="direction"/>
        <result property="useState" column="use_state"/>
        <result property="deviceStatus" column="device_state"/>
    </resultMap>

    <insert id="duplicateKeyUpdate">
        insert into dc_online_sum
        (device_id,total_count,online_rate,offline_rate,loss_rate,rtt_avg,network_quality,statistical_date)
        values
        (#{deviceId},#{totalCount},#{onlineRate},#{offlineRate},#{lossRate},#{rttAvg},#{networkQuality},#{statisticalDate})
        on duplicate key update
        total_count= values(total_count),
        online_rate = values(online_rate),
        offline_rate = values(offline_rate),
        loss_rate = values(loss_rate),
        rtt_avg = values(rtt_avg),
        network_quality = values(network_quality)
    </insert>
    <select id="queryByDateRangeOfDevice" resultMap="OnlineSum">
        select id,device_id,total_count,online_rate,offline_rate,loss_rate,rtt_avg,network_quality,statistical_date
        from dc_online_sum
        where
        device_id = #{deviceId} and (statistical_date between #{startDate} and #{endDate})
    </select>
    <select id="queryByDeviceTypeAndDate" resultMap="OnlineSum">
        select s.id,s.device_id,total_count,online_rate,offline_rate,loss_rate,rtt_avg,network_quality,statistical_date,COALESCE(d.child_type,d.device_type) as device_type
        from dc_online_sum s  join dc_device d on s.device_id = d.id
        where d.use_state = 1
          and (s.statistical_date BETWEEN #{startDate} AND #{endDate})
        <if test="types.length != 0">
            and (d.device_type in
            <foreach item="typeItem" collection="types" open="(" separator="," close=")">
                #{typeItem}
            </foreach>
            or d.child_type in
            <foreach item="typeItem" collection="types" open="(" separator="," close=")">
                #{typeItem}
            </foreach>
            )
        </if>
        <if test="direction != null and direction != ''">
            and d.direction = #{direction}
        </if>
    </select>
    <select id="queryByDateOfDeviceType" resultMap="OnlineSum">
        select s.id,s.device_id,total_count,
               online_rate,offline_rate,loss_rate,
               rtt_avg,network_quality,statistical_date,COALESCE (d.child_type, d.device_type) as device_type
        from dc_online_sum s join dc_device d on s.device_id = d.id
        where d.use_state = 1 and s.statistical_date = #{queryDate}
    </select>
    <select id="queryByDateOfRoad" resultMap="OnlineSum">
        select s.id,s.device_id,total_count,online_rate,
               offline_rate,loss_rate,rtt_avg,network_quality,statistical_date,
               m.section_id
        from dc_online_sum s join dc_device d on s.device_id = d.id
        LEFT JOIN dc_stake_mark m on m.stake_mark=d.stake_mark and m.direction = d.direction
        where d.use_state = 1 and s.statistical_date = #{queryDate}
    </select>

    <select id="queryByDeviceTypesOfToday" parameterType="com.zc.business.controller.queryParams.OnlineQueryParams" resultMap="OnlineSum">
        select d.device_ip,d.device_name,d.stake_mark,COALESCE (d.child_type, d.device_type) as device_type,
               d.direction,
        IF(d.use_state = 1, d.use_state, 0) AS use_state,
        IF(d.device_state = 1, d.device_state, 0) AS device_state,
        s.id,s.device_id,total_count,online_rate,
        offline_rate,loss_rate,rtt_avg,network_quality,statistical_date
        from dc_device d
        join dc_online_sum s on s.device_id = d.id
        JOIN
        (SELECT device_id, MAX(statistical_date) AS max_date
        FROM dc_online_sum
        WHERE DATE(statistical_date) = CURDATE()
        GROUP BY device_id) s_max
        ON
        s.device_id = s_max.device_id AND s.statistical_date = s_max.max_date
        where
        <if test="type.length != 0">
             (d.device_type in
            <foreach item="typeItem" collection="type" open="(" separator="," close=")">
                #{typeItem}
            </foreach>
            or d.child_type in
            <foreach item="typeItem" collection="type" open="(" separator="," close=")">
                #{typeItem}
            </foreach>
            )
        </if>
        <if test="deviceIp != null and deviceIp != ''">
            and d.device_ip like concat('%',#{deviceIp},'%')
        </if>
        <if test="stakeMark != null and stakeMark != ''">
            and d.stake_mark like concat('%',#{stakeMark},'%')
        </if>
        <if test="deviceState != null and deviceState != ''">
            and d.device_state = #{deviceState}
        </if>
        <if test="useState != null and useState != ''">
            and d.use_state = #{useState}
        </if>
        <if test="orderByField != null and orderDirection != null">
            order by ${orderByField} ${orderDirection}
        </if>
    </select>

</mapper>