<?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"/>

    </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
	</sql>

    <select id="pageList" resultMap="XxlJobLog">
        SELECT
        <include refid="Base_Column_List"/>
        FROM xxl_job_qrtz_trigger_log AS t
        <trim prefix="WHERE" prefixOverrides="AND | OR">
            <if test="jobGroup != null and jobGroup != 0">
                AND t.job_group = #{jobGroup}
            </if>
            <if test="jobId != null and jobId != 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 id DESC
        LIMIT #{offset}, #{pagesize}
    </select>

    <select id="pageListCount" resultType="int">
        SELECT count(t.id)
        FROM xxl_job_qrtz_trigger_log AS t
        <trim prefix="WHERE" prefixOverrides="AND | OR">
            <if test="jobGroup != null and jobGroup != 0">
                AND t.job_group = #{jobGroup}
            </if>
            <if test="jobId != null and jobId != 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.Integer" resultMap="XxlJobLog">
        SELECT
        <include refid="Base_Column_List"/>
        FROM xxl_job_qrtz_trigger_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_qrtz_trigger_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_qrtz_trigger_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_qrtz_trigger_log
		SET 
			`handle_time`= #{handleTime}, 
			`handle_code`= #{handleCode},
			`handle_msg`= #{handleMsg} 
		WHERE `id`= #{id}
	</update>

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

    <select id="triggerCountByHandleCode" resultType="int">
        SELECT count(1)
        FROM xxl_job_qrtz_trigger_log AS t
        <trim prefix="WHERE" prefixOverrides="AND | OR">
            <if test="handleCode  != null">
                AND t.handle_code = #{handleCode}
            </if>
        </trim>
    </select>

    <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 = 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_qrtz_trigger_log
		WHERE trigger_time BETWEEN #{from} and #{to}
		GROUP BY triggerDay;
    </select>

    <delete id="clearLog">
        delete from xxl_job_qrtz_trigger_log
        <trim prefix="WHERE" prefixOverrides="AND | OR">
            <if test="jobGroup != null">
                AND job_group = #{jobGroup}
            </if>
            <if test="jobId != null">
                AND job_id = #{jobId}
            </if>
            <if test="clearBeforeTime != null">
                AND trigger_time <![CDATA[ <= ]]> #{clearBeforeTime}
            </if>
            <if test="clearBeforeNum  != null">
                AND id NOT in(
                SELECT id FROM(
                SELECT id FROM xxl_job_qrtz_trigger_log AS t
                <trim prefix="WHERE" prefixOverrides="AND | OR">
                    <if test="jobGroup  != null">
                        AND t.job_group = #{jobGroup}
                    </if>
                    <if test="jobId  != null">
                        AND t.job_id = #{jobId}
                    </if>
                </trim>
                ORDER BY t.trigger_time desc
                LIMIT 0, #{clearBeforeNum}
                ) t1
                )
            </if>
        </trim>
    </delete>

</mapper>