<?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.DcPerceivedEventsWarningMapper">



    <select id="perceivedEventsWarningNum" resultType="java.lang.Integer">
    select count(1) from dc_warning
    </select>

    <select id="selectEventTypeList" resultType="com.zc.business.domain.DcEventType">
        select event_type, event_name from dc_event_type
    </select>
    <select id="selectWarningById" resultType="com.zc.business.domain.DcWarning">
        SELECT DISTINCT warning.`id`,warning.`stake_mark`, warning.`direction`,
                        warning.duration,
               mark.longitude,mark.latitude,warning.lane,warning.vehicle_type vehicleType,
               warning.`dept_id`,warning.`warning_state`,warning.`warning_time`,
               warning.`user_id`, warning.`warning_source`,warning.`warning_level`,
               warning.`remark`, warning.`create_time`,warning.`update_time`,
               warning.`warning_type`,warning.`warning_subclass`,warning.`warning_title`,
               warning.`other_config` FROM dc_warning AS warning
              LEFT JOIN dc_stake_mark AS mark ON mark.stake_mark=warning.stake_mark and mark.direction=warning.direction
        where warning.`id`=#{id}
    </select>
    <select id="selectPerceivedEventsList" resultType="com.zc.business.domain.DcWarning">
        SELECT   warning.`id`,warning.`stake_mark`, warning.`direction`,
        mark.longitude,mark.latitude,warning.lane,duration,
        warning.`dept_id`,warning.`warning_state`,warning.`warning_time`,
        warning.`user_id`, warning.`warning_source`,warning.`warning_level`,
        warning.`remark`, warning.`create_time`,warning.`update_time`,
        warning.`warning_type`,warning.`warning_subclass`,warning.`warning_title`,
        warning.`other_config` FROM dc_warning AS warning
        left JOIN dc_stake_mark AS mark ON mark.stake_mark=warning.stake_mark and mark.direction=warning.direction
        <where>
            <if test="warningType != null  and warningType != ''"> and warning.warning_type = #{warningType}</if>
            <if test="warningSubclass != null  and warningSubclass != ''"> and warning.warning_subclass = #{warningSubclass}</if>
            <if test="warningSource != null  and warningSource != ''"> and warning.warning_source = #{warningSource}</if>
            <if test="direction != null  and direction != ''"> and warning.direction = #{direction}</if>
            <if test="stakeMark != null  and direction != ''"> and warning.stake_mark = #{stakeMark}</if>
            <if test="startTime != null  and endTime != null ">
             and warning.warning_time between #{startTime} and #{endTime}</if>
        </where>
    </select>
    <select id="selectSectionPerceivedEventsList" resultType="hashmap">
        select s.section_name sectionName,
        (select COUNT(1) FROM `dc_warning` as w  where
        DATE_FORMAT(w.warning_time,'%Y-%m-%d')=DATE_FORMAT(#{warningTime},'%Y-%m-%d')
        and mark.stake_mark=w.stake_mark)number from dc_warning as w
        left JOIN  dc_stake_mark as mark  ON mark.stake_mark=w.stake_mark and mark.direction=w.direction
        LEFT JOIN dc_road_section as s ON mark.section_id=s.id
        where mark.stake_mark is not null
        group by w.stake_mark
        HAVING   number !=0
        order by number desc
    </select>
    <select id="selectSectionPerceivedNumber" resultType="java.util.HashMap">
        select s.section_name sectionName,
       (select COUNT(1) FROM `dc_warning` as w  where
       DATE_FORMAT(w.warning_time,'%Y-%m-%d')=DATE_FORMAT(#{warningTime},'%Y-%m-%d')
       and mark.stake_mark=w.stake_mark)number from dc_warning as w
        left JOIN  dc_stake_mark as mark  ON mark.stake_mark=w.stake_mark and mark.direction=w.direction
        LEFT JOIN dc_road_section as s ON mark.section_id=s.id
        where mark.stake_mark is not null
        group by w.stake_mark
        HAVING   number !=0
    </select>
    <select id="selectDailyCumulative" resultType="java.util.HashMap">
        SELECT DATE_FORMAT(warning_time, '%Y-%m-%d %H') AS time, COUNT(*) AS number
        FROM dc_warning
        WHERE warning_time >= CURDATE() AND warning_time <![CDATA[<]]> CURDATE() + INTERVAL 1 DAY
        GROUP BY time
        ORDER BY time
    </select>
    <select id="selectDailyCumulativeMonth" resultType="java.util.HashMap">
        SELECT HOUR(warning_time) AS time, COUNT(*) AS number
        FROM dc_warning
        WHERE MONTH(warning_time) = MONTH(CURDATE())
          AND YEAR(warning_time) = YEAR(CURDATE())
        GROUP BY HOUR(warning_time)
        ORDER BY HOUR(warning_time);
    </select>
    <select id="selectWarningSourceGroup" resultType="java.util.HashMap">
        SELECT warning_source warningSource,COUNT(*) AS number FROM dc_warning
        where DATE_FORMAT(warning_time,'%Y-%m-%d')=DATE_FORMAT(#{warningTime},'%Y-%m-%d')
        GROUP BY warning_source
    </select>
    <select id="selectWarningSourceGroupCount" resultType="java.lang.String">
        SELECT COUNT(*) AS number FROM dc_warning
        where DATE_FORMAT(warning_time,'%Y-%m-%d')=DATE_FORMAT(#{warningTime},'%Y-%m-%d')
    </select>
    <select id="selectWarningStateDay" resultType="java.util.HashMap">
        select t1.warningState,t1.warningStateName,IFNULL(t2.num,0)number  from
            (select '1' as warningState,'上报' as warningStateName
             UNION ALL select '2' as warningState,'已完成' as warningStateName
             UNION ALL select '3' as warningState,'已终止' as warningStateName
             UNION ALL select '4' as warningState,'自动结束' as warningStateName) t1
                LEFT JOIN
            (SELECT warning_state warningState,count(*) num
             from dc_warning
             where DATE_FORMAT(warning_time,'%Y-%m-%d')=DATE_FORMAT(now(),'%Y-%m-%d')
             GROUP BY warning_state)t2
            on t1.warningState=t2.warningState
    </select>
    <select id="selectWarningTypeDay" resultType="java.util.HashMap">
        SELECT warning_type warningType,COUNT(*) AS number FROM dc_warning
        GROUP BY warning_type
        ORDER BY number DESC
    </select>
    <select id="selectWarningTrendDay" resultType="java.util.HashMap">
        SELECT DATE_FORMAT(warning.warning_time, '%Y-%m-%d %H') AS time, COUNT(*) AS number
        FROM dc_warning AS warning
        LEFT JOIN dc_stake_mark AS mark ON warning.stake_mark=mark.stake_mark
        WHERE  DATE_FORMAT(warning.warning_time,'%Y-%m-%d')=DATE_FORMAT(#{warningTime},'%Y-%m-%d')
          AND warning.direction=#{direction} and mark.direction=#{direction}
          AND mark.`section_id`=#{sectionId}
        GROUP BY time
    </select>
    <select id="selectWarningTrendMonth" resultType="java.util.HashMap">
        SELECT DATE(warning.warning_time) AS day, COUNT(*) AS number
        FROM dc_warning as warning
        LEFT JOIN dc_stake_mark AS mark ON warning.stake_mark=mark.stake_mark
        WHERE DATE_FORMAT(warning.warning_time,'%Y-%m') =DATE_FORMAT(#{warningTime},'%Y-%m')
          AND warning.direction=#{direction} and mark.direction=#{direction}
          and mark.`section_id`=#{sectionId}
        GROUP BY day
        ORDER BY day
    </select>
    <select id="selectWarningTrendQuarter" resultType="java.util.HashMap">
        SELECT
            CASE
                WHEN MONTH(warning.warning_time) BETWEEN 1 AND 3 THEN '第一季度'
                WHEN MONTH(warning.warning_time) BETWEEN 4 AND 6 THEN '第二季度'
                WHEN MONTH(warning.warning_time) BETWEEN 7 AND 9 THEN '第三季度'
                ELSE '第四季度'
                END AS QUARTER,
            MONTH(warning.warning_time) AS month,
            COUNT(*) AS number
        FROM dc_warning as warning
        LEFT JOIN dc_stake_mark AS mark ON warning.stake_mark=mark.stake_mark
        WHERE YEAR(warning.warning_time) =DATE_FORMAT(#{warningTime},'%Y')
          AND warning.direction=#{direction} and mark.direction=#{direction}
          and mark.`section_id`=#{sectionId}
        GROUP BY QUARTER, MONTH
        ORDER BY QUARTER, MONTH;

    </select>
    <select id="selectWarningTrendYear" resultType="java.util.HashMap">
        SELECT month(warning.warning_time) AS month, COUNT(*) AS number
        FROM dc_warning as warning
        LEFT JOIN dc_stake_mark AS mark ON warning.stake_mark=mark.stake_mark
        where  mark.`section_id`=#{sectionId}   AND warning.direction=#{direction} and mark.direction=#{direction}
        and DATE_FORMAT(warning.warning_time,'%Y')=DATE_FORMAT(#{warningTime},'%Y')
        GROUP BY month
    </select>
    <select id="selectWarningSectionTypeDayCount" resultType="java.lang.String">
        SELECT  COUNT(*) AS number FROM dc_warning as warning
        LEFT JOIN dc_stake_mark as mark on warning.stake_mark=mark.stake_mark
        where DATE_FORMAT(warning.warning_time,'%Y-%m-%d')=DATE_FORMAT(#{warningTime},'%Y-%m-%d')
          AND warning.direction=#{direction} and mark.direction=#{direction}
          and   mark.`section_id`=#{sectionId}
    </select>
    <select id="selectWarningSectionTypeDay" resultType="java.util.HashMap">
        SELECT warning.warning_type warningType,
               COUNT(*) AS number
        FROM dc_warning as warning
        LEFT JOIN dc_stake_mark as mark on warning.stake_mark=mark.stake_mark
        where DATE_FORMAT(warning.warning_time,'%Y-%m-%d')=DATE_FORMAT(#{warningTime},'%Y-%m-%d')
          AND warning.direction=#{direction} and mark.direction=#{direction}
           and   mark.`section_id`=#{sectionId}
        GROUP BY warning_type
        ORDER BY number DESC
    </select>
    <select id="selectWarningSectionTypeMonthCount" resultType="java.lang.String">
        SELECT COUNT(*) AS number FROM dc_warning as warning
         LEFT JOIN dc_stake_mark as mark on warning.stake_mark=mark.stake_mark
        where DATE_FORMAT(warning.warning_time,'%Y-%m') =DATE_FORMAT(#{warningTime},'%Y-%m')
          AND warning.direction=#{direction} and mark.direction=#{direction}
          and   mark.`section_id`=#{sectionId}
    </select>
    <select id="selectWarningSectionTypeMonth" resultType="java.util.HashMap">
        SELECT warning.warning_type warningType,COUNT(*) AS number
        FROM dc_warning as warning
        LEFT JOIN dc_stake_mark as mark on warning.stake_mark=mark.stake_mark
        where DATE_FORMAT(warning.warning_time,'%Y-%m') =DATE_FORMAT(#{warningTime},'%Y-%m')
          AND warning.direction=#{direction} and mark.direction=#{direction}
          and   mark.`section_id`=#{sectionId}
        GROUP BY warning_type
        ORDER BY number DESC
    </select>
    <select id="selectWarningSectionTypeQuarterCount" resultType="string">
        SELECT
               COUNT(*) AS number
        FROM dc_warning as warning
                 LEFT JOIN dc_stake_mark AS mark ON warning.stake_mark=mark.stake_mark
        WHERE YEAR(warning.warning_time) =DATE_FORMAT(#{warningTime},'%Y')
          AND warning.direction=#{direction} and mark.direction=#{direction}
          and mark.`section_id`=#{sectionId}
    </select>
    <select id="selectWarningSectionTypeQuarter" resultType="java.util.HashMap">
        SELECT
            CASE
                WHEN MONTH(warning.warning_time) BETWEEN 1 AND 3 THEN '第一季度'
                WHEN MONTH(warning.warning_time) BETWEEN 4 AND 6 THEN '第二季度'
                WHEN MONTH(warning.warning_time) BETWEEN 7 AND 9 THEN '第三季度'
                ELSE '第四季度'
                END AS QUARTER,
            warning.warning_type warningType,
            COUNT(*) AS number
        FROM dc_warning as warning
                 LEFT JOIN dc_stake_mark AS mark ON warning.stake_mark=mark.stake_mark
        WHERE YEAR(warning.warning_time) =DATE_FORMAT(#{warningTime},'%Y')
          AND warning.direction=#{direction} and mark.direction=#{direction}
          and mark.`section_id`=#{sectionId}
        GROUP BY QUARTER, warningType
        ORDER BY QUARTER;
    </select>
    <select id="selectWarningSectionTypeYearCount" resultType="java.lang.String">
        SELECT COUNT(*) AS number FROM dc_warning as warning
        LEFT JOIN dc_stake_mark AS mark ON warning.stake_mark=mark.stake_mark
        where  mark.`section_id`=#{sectionId}   AND warning.direction=#{direction} and mark.direction=#{direction}
          and   DATE_FORMAT(warning.warning_time,'%Y')=DATE_FORMAT(#{warningTime},'%Y')

    </select>
    <select id="selectWarningSectionTypeYear" resultType="java.util.HashMap">
        SELECT warning.warning_type warningType, COUNT(*) AS number
        FROM dc_warning as warning
        LEFT JOIN dc_stake_mark AS mark ON warning.stake_mark=mark.stake_mark
        where  mark.`section_id`=#{sectionId}   AND warning.direction=#{direction} and mark.direction=#{direction}
         and   DATE_FORMAT(warning.warning_time,'%Y')=DATE_FORMAT(#{warningTime},'%Y')
        GROUP BY warningType
    </select>

    <select id="selectSectionMark" resultType="java.util.HashMap">
        SELECT stake_mark stakeMark FROM dc_stake_mark AS mark   WHERE mark.section_id=#{sectionId}
    </select>
    <select id="selectSectionNumber" resultType="java.lang.String">
        select count(1) from dc_warning where stake_mark=#{stakeMark}  AND warning.direction=#{direction}
    </select>
    <select id="selectWarningEscalation" resultType="java.util.HashMap">
        select org.organization_name,warning.warning_type,warning.warning_subclass,
        warning_title,warning.warning_state,DATE_FORMAT(warning.warning_time,'%Y-%m-%d %H:%m:%s') warningTime,
        warning. warning_source,DATE_FORMAT(warning.create_time,'%Y-%m-%d %H:%m:%s') createTime from dc_warning as warning
        LEFT JOIN dc_stake_mark as mark on warning.stake_mark=mark.stake_mark and mark.direction=warning.direction
        LEFT JOIN dc_organization as org on mark.stake_mark=org.stake_mark
        <where>
            <if test="warningState != null  and warningState != ''"> and warning.warning_state = #{warningState}</if>
        </where>
    </select>

    <update id="updateWarning">
        update dc_warning
        <trim prefix="SET" suffixOverrides=",">
            <if test="stakeMark != null and stakeMark != ''">stake_mark = #{stakeMark},</if>
            <if test="direction != null">direction = #{direction},</if>
            <if test="deptId != null">dept_id = #{deptId},</if>
            <if test="warningState != null">warning_state = #{warningState},</if>
            <if test="warningTime != null">warning_time = #{warningTime},</if>
            <if test="userId != null">user_id = #{userId},</if>
            <if test="warningSource != null">warning_source = #{warningSource},</if>
            <if test="warningLevel != null">warning_level = #{warningLevel},</if>
            <if test="remark != null">remark = #{remark},</if>
            <if test="updateTime != null">update_time = #{updateTime},</if>
            <if test="warningType != null">warning_type = #{warningType},</if>
            <if test="warningSubclass != null">warning_subclass = #{warningSubclass},</if>
            <if test="warningTitle != null">warning_title = #{warningTitle},</if>
            <if test="otherConfig != null">other_config = #{otherConfig},</if>
            <if test="lane != null">lane = #{lane},</if>
            <if test="vehicleType != null">vehicle_type = #{vehicleType},</if>
        </trim>
        where id = #{id}
    </update>
    <select id="selectWarningMarkDay" resultType="java.lang.String">
        select count(1) from dc_warning where stake_mark=#{stakeMark}
         AND direction=#{direction} and DATE(warning_time)=DATE_FORMAT(#{warningTime},'%Y-%m-%d')
    </select>
    <select id="selectWarningMarkMonth" resultType="java.lang.String">
        select count(1) from dc_warning where stake_mark=#{stakeMark}
          AND direction=#{direction} and  DATE_FORMAT(warning_time,'%Y-%m') =DATE_FORMAT(#{warningTime},'%Y-%m')
    </select>
    <select id="selectWarningMarkYear" resultType="java.lang.String">
        select count(1) from dc_warning where stake_mark=#{stakeMark}
        AND direction=#{direction} and  YEAR(warning_time) =DATE_FORMAT(#{warningTime},'%Y')
    </select>
    <select id="selectWarningMarkQuarter" resultType="hashmap">
        select count(1) number,stake_mark stakeMark,
               CASE
                   WHEN MONTH(warning_time) BETWEEN 1 AND 3 THEN '第一季度'
                   WHEN MONTH(warning_time) BETWEEN 4 AND 6 THEN '第二季度'
                   WHEN MONTH(warning_time) BETWEEN 7 AND 9 THEN '第三季度'
                   ELSE '第四季度'
                   END AS QUARTER
        from dc_warning where stake_mark=#{stakeMark} and
            YEAR(warning_time) =DATE_FORMAT(#{warningTime},'%Y')
            AND direction=#{direction} and stake_mark is not null
        GROUP BY QUARTER
        ORDER BY QUARTER;
    </select>
    <select id="selectNumber" resultType="int">
        select count(1) from dc_warning
    </select>

    <select id="selectWarningMarkQuarterOptimize" resultType="java.util.HashMap">
        SELECT count( 1 ) sectionNumber,
            CASE
                WHEN MONTH ( w.warning_time ) BETWEEN 1 AND 3 THEN '第一季度'
                WHEN MONTH ( w.warning_time ) BETWEEN 4 AND 6 THEN '第二季度'
                WHEN MONTH ( w.warning_time ) BETWEEN 7 AND 9 THEN '第三季度'
                ELSE '第四季度'
                END AS QUARTER
        FROM dc_warning w
        LEFT JOIN dc_stake_mark m ON w.stake_mark = m.stake_mark and m.direction=w.direction
        WHERE m.stake_mark IS NOT null and w.direction=#{direction}
          and  YEAR(w.warning_time) =DATE_FORMAT(#{warningTime},'%Y')
        GROUP BY QUARTER
        ORDER BY QUARTER;
    </select>
    <select id="selectWarningMarkDayOptimize" resultType="java.util.HashMap">
        SELECT DISTINCT m.stake_mark stakeMarkId,
        (SELECT count( 0 ) FROM dc_warning w WHERE w.stake_mark = m.stake_mark
        <if test = 'type == "day"' >and DATE(w.warning_time)= DATE_FORMAT(#{warningTime},'%Y-%m-%d')</if>
        <if test = 'type == "month"' >and  DATE_FORMAT(w.warning_time,'%Y-%m') =DATE_FORMAT(#{warningTime},'%Y-%m')</if>
        <if test = 'type == "year"' >and YEAR(w.warning_time) =DATE_FORMAT(#{warningTime},'%Y')</if>
        AND w.direction = #{direction}) sectionNumber FROM dc_stake_mark AS m
        WHERE m.section_id = #{sectionId}
        HAVING sectionNumber!=0
    </select>


</mapper>