<?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.xxl.job.admin.dao.XxlJobLogDao">

    <resultMap id="XxlJobLog" type="com.xxl.job.admin.core.model.XxlJobLog">
        <result column="id" property="id"/>

        <result column="job_group" property="jobGroup"/>
        <result column="job_id" property="jobId"/>

        <result column="executor_address" property="executorAddress"/>
        <result column="executor_handler" property="executorHandler"/>
        <result column="executor_param" property="executorParam"/>
        <result column="executor_sharding_param" property="executorShardingParam"/>
        <result column="executor_fail_retry_count" property="executorFailRetryCount"/>

        <result column="trigger_time" property="triggerTime"/>
        <result column="trigger_code" property="triggerCode"/>
        <result column="trigger_msg" property="triggerMsg"/>

        <result column="handle_time" property="handleTime"/>
        <result column="handle_code" property="handleCode"/>
        <result column="handle_msg" property="handleMsg"/>

        <result column="alarm_status" property="alarmStatus"/>
    </resultMap>

    <sql id="Base_Column_List">
        t.id,
		t.job_group,
		t.job_id,
		t.executor_address,
		t.executor_handler,
		t.executor_param,
		t.executor_sharding_param,
		t.executor_fail_retry_count,
		t.trigger_time,
		t.trigger_code,
		t.trigger_msg,
		t.handle_time,
		t.handle_code,
		t.handle_msg,
		t.alarm_status
    </sql>

    <select id="pageList" resultMap="XxlJobLog">
        SELECT
        <include refid="Base_Column_List"/>
        FROM xxl_job_log AS t
        <trim prefix="WHERE" prefixOverrides="AND | OR">
            <if test="jobId==0 and jobGroup gt 0">
                AND t.job_group = #{jobGroup}
            </if>
            <if test="jobId gt 0">
                AND t.job_id = #{jobId}
            </if>
            <if test="triggerTimeStart != null">
                AND t.trigger_time <![CDATA[ >= ]]> #{triggerTimeStart}
            </if>
            <if test="triggerTimeEnd != null">
                AND t.trigger_time <![CDATA[ <= ]]> #{triggerTimeEnd}
            </if>
            <if test="logStatus == 1">
                AND t.handle_code = 200
            </if>
            <if test="logStatus == 2">
                AND (
                t.trigger_code NOT IN (0, 200) OR
                t.handle_code NOT IN (0, 200)
                )
            </if>
            <if test="logStatus == 3">
                AND t.trigger_code = 200
                AND t.handle_code = 0
            </if>
        </trim>
        ORDER BY t.trigger_time DESC
        LIMIT #{offset}, #{pagesize}
    </select>

    <select id="pageListCount" resultType="int">
        SELECT count(1)
        FROM xxl_job_log AS t
        <trim prefix="WHERE" prefixOverrides="AND | OR">
            <if test="jobId==0 and jobGroup gt 0">
                AND t.job_group = #{jobGroup}
            </if>
            <if test="jobId gt 0">
                AND t.job_id = #{jobId}
            </if>
            <if test="triggerTimeStart != null">
                AND t.trigger_time <![CDATA[ >= ]]> #{triggerTimeStart}
            </if>
            <if test="triggerTimeEnd != null">
                AND t.trigger_time <![CDATA[ <= ]]> #{triggerTimeEnd}
            </if>
            <if test="logStatus == 1">
                AND t.handle_code = 200
            </if>
            <if test="logStatus == 2">
                AND (
                t.trigger_code NOT IN (0, 200) OR
                t.handle_code NOT IN (0, 200)
                )
            </if>
            <if test="logStatus == 3">
                AND t.trigger_code = 200
                AND t.handle_code = 0
            </if>
        </trim>
    </select>

    <select id="load" parameterType="java.lang.Long" resultMap="XxlJobLog">
        SELECT
        <include refid="Base_Column_List"/>
        FROM xxl_job_log AS t
        WHERE t.id = #{id}
    </select>


    <insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobLog" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO xxl_job_log (
        `job_group`,
        `job_id`,
        `trigger_time`,
        `trigger_code`,
        `handle_code`
        ) VALUES (
        #{jobGroup},
        #{jobId},
        #{triggerTime},
        #{triggerCode},
        #{handleCode}
        );
        <!--<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
            SELECT LAST_INSERT_ID()
        </selectKey>-->
    </insert>

    <update id="updateTriggerInfo">
        UPDATE xxl_job_log
        SET
            `trigger_time`= #{triggerTime},
            `trigger_code`=
                              #{triggerCode},
            `trigger_msg`=
                              #{triggerMsg},
            `executor_address`=
                              #{executorAddress},
            `executor_handler`=
                              #{executorHandler},
            `executor_param`=
                              #{executorParam},
            `executor_sharding_param`=
                              #{executorShardingParam},
            `executor_fail_retry_count`=
                              #{executorFailRetryCount}
        WHERE `id`= #{id}
    </update>

    <update id="updateHandleInfo">
        UPDATE xxl_job_log
        SET
            `handle_time`= #{handleTime},
            `handle_code`=
                             #{handleCode},
            `handle_msg`=
                             #{handleMsg}
        WHERE `id`= #{id}
    </update>

    <delete id="delete">
        delete
        from xxl_job_log
        WHERE job_id = #{jobId}
    </delete>

    <!--<select id="triggerCountByDay" resultType="java.util.Map" >
		SELECT
			DATE_FORMAT(trigger_time,'%Y-%m-%d') triggerDay,
			COUNT(handle_code) triggerDayCount,
			SUM(CASE WHEN (trigger_code in (0, 200) and handle_code = 0) then 1 else 0 end) as triggerDayCountRunning,
			SUM(CASE WHEN handle_code = 200 then 1 else 0 end) as triggerDayCountSuc
		FROM xxl_job_log
		WHERE trigger_time BETWEEN #{from} and #{to}
		GROUP BY triggerDay
		ORDER BY triggerDay
    </select>-->

    <select id="findLogReport" resultType="java.util.Map">
        SELECT COUNT(handle_code) triggerDayCount,
               SUM(
                       CASE WHEN (trigger_code in (0, 200) and handle_code = 0) then 1 else 0 end) as triggerDayCountRunning,
               SUM(CASE WHEN handle_code = 200 then 1 else 0 end)                                  as triggerDayCountSuc
        FROM xxl_job_log
        WHERE trigger_time BETWEEN #{from} and #{to}
    </select>

    <select id="findClearLogIds" resultType="long">
        SELECT id FROM xxl_job_log
        <trim prefix="WHERE" prefixOverrides="AND | OR">
            <if test="jobGroup gt 0">
                AND job_group = #{jobGroup}
            </if>
            <if test="jobId gt 0">
                AND job_id = #{jobId}
            </if>
            <if test="clearBeforeTime != null">
                AND trigger_time <![CDATA[ <= ]]> #{clearBeforeTime}
            </if>
            <if test="clearBeforeNum gt 0">
                AND id NOT in(
                SELECT id FROM(
                SELECT id FROM xxl_job_log AS t
                <trim prefix="WHERE" prefixOverrides="AND | OR">
                    <if test="jobGroup gt 0">
                        AND t.job_group = #{jobGroup}
                    </if>
                    <if test="jobId gt 0">
                        AND t.job_id = #{jobId}
                    </if>
                </trim>
                ORDER BY t.trigger_time desc
                LIMIT 0, #{clearBeforeNum}
                ) t1
                )
            </if>
        </trim>
        order by id asc
        LIMIT #{pagesize}
    </select>

    <delete id="clearLog">
        delete from xxl_job_log
        WHERE id in
        <foreach collection="logIds" item="item" open="(" close=")" separator=",">
            #{item}
        </foreach>
    </delete>

    <select id="findFailJobLogIds" resultType="long">
        SELECT id
        FROM `xxl_job_log`
        WHERE !(
            (trigger_code in (0
            , 200) and handle_code = 0)
            OR
            (handle_code = 200)
            )
            AND `alarm_status`= 0
        ORDER BY id ASC
        LIMIT #{pagesize}
    </select>

    <update id="updateAlarmStatus">
        UPDATE xxl_job_log
        SET
            `alarm_status`= #{newAlarmStatus}
        WHERE `id`= #{logId} AND`alarm_status`= #{oldAlarmStatus}
    </update>

    <select id="findLostJobIds" resultType="long">
        SELECT t.id
        FROM xxl_job_log t
                 LEFT JOIN xxl_job_registry t2 ON t.executor_address = t2.registry_value
        WHERE t.trigger_code = 200
          AND t.handle_code = 0
          AND t.trigger_time <![CDATA[ <= ]]> #{losedTime}
          AND t2.id IS NULL;
    </select>
    <!--
    SELECT t.id
    FROM xxl_job_log AS t
    WHERE t.trigger_code = 200
        and t.handle_code = 0
        and t.trigger_time <![CDATA[ <= ]]> #{losedTime}
        and t.executor_address not in (
            SELECT t2.registry_value
            FROM xxl_job_registry AS t2
        )
    -->

</mapper>
