<?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.testor.module.hazard.dao.THazardWorkPlanCheckDao">
    <!-- 开启二级缓存 -->
    <!-- <cache type="org.mybatis.caches.ehcache.LoggingEhcache"/> -->
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.testor.module.hazard.model.domain.THazardWorkPlanCheck">
        <id column="id" property="id"/>
        <id column="plan_id" property="planId"/>
        <id column="check_time" property="checkTime"/>
        <id column="is_compliant" property="isCompliant"/>
        <id column="problem_type" property="problemType"/>
        <id column="check_description" property="checkDescription"/>
        <id column="check_images" property="checkImages"/>
        <id column="check_signature" property="checkSignature"/>
        <id column="check_status" property="checkStatus"/>
        <id column="code" property="code"/>
        <id column="workType" property="workType"/>
        <id column="workLevel" property="workLevel"/>
        <id column="stakeholderWork" property="stakeholderWork"/>
        <id column="check_signature_time" property="checkSignatureTime"/>
        <id column="check_name" property="checkName"/>
        <id column="check_id" property="checkId"/>
        <id column="basic_id" property="basicId"/>
    </resultMap>

    <select id="selectTHazardWorkPlanCheckList" resultMap="BaseResultMap">
        select hwpc.*,hwp.code code,hwp.work_type workType,hwp.work_level workLevel,hwp.stakeholder_work stakeholderWork
        from t_hazard_work_plan_check hwpc
        left join t_hazard_work_plan hwp on hwpc.plan_id = hwp.id
        where hwpc.status = '0' and hwpc.plan_id = #{param.planId}
        order by hwpc.create_date desc
    </select>

    <select id="selectAppTHazardWorkPlanCheckList" resultMap="BaseResultMap">
        select hwpc.*,hwp.code code,hwp.work_type workType,hwp.work_level workLevel,hwp.stakeholder_work stakeholderWork
        from t_hazard_work_plan_check hwpc
        left join t_hazard_work_plan hwp on hwpc.plan_id = hwp.id
        left join
        t_sys_dict_data dd on hwp.work_type = dd.dict_data_id
        left join
        t_sys_dict_data dd2 on hwp.work_level = dd2.dict_data_id
        left join
        t_sys_dict_data dd3 on hwpc.problem_type = dd3.dict_data_id
        where hwpc.status = '0'  and hwpc.create_by=#{param.createBy}
        <if test="param.planId!=null and param.planId!=''">
            and hwpc.plan_id = #{param.planId}
        </if>
        <if test="param.workType!=null and param.workType!=''">
            and hwp.work_type = #{param.workType}
        </if>
        <if test="param.keywords!=null and param.keywords!=''">
            AND (
            hwpc.basic_unit LIKE CONCAT('%', #{param.keywords}, '%')
            OR dd.dict_value LIKE CONCAT('%', #{param.keywords}, '%')
            OR dd2.dict_value LIKE CONCAT('%', #{param.keywords}, '%')
            OR hwpc.check_description LIKE CONCAT('%', #{param.keywords}, '%')
            OR (
            CASE
            WHEN hwpc.is_compliant = 1 THEN '是'
            WHEN hwpc.is_compliant = 0 THEN '否'
            ELSE ''
            END
            ) LIKE CONCAT('%', #{param.keywords}, '%')
            OR dd3.dict_value LIKE CONCAT('%', #{param.keywords}, '%')
            OR (
            CASE
            WHEN hwpc.check_status = 1 THEN '暂存'
            WHEN hwpc.check_status = 2 THEN '已完成'
            ELSE ''
            END
            ) LIKE CONCAT('%', #{param.keywords}, '%')
            )
        </if>
        order by hwpc.check_time desc
    </select>

    <select id="selectTHazardWorkPlanCheckManageList" resultMap="BaseResultMap">
        select hwpc.*,hwp.code code,hwp.work_type workType,hwp.work_level workLevel,hwp.stakeholder_work stakeholderWork
        from t_hazard_work_plan_check hwpc
        left join t_hazard_work_plan hwp on hwpc.plan_id = hwp.id
        where hwpc.status = '0'
        <if test="param.code!=null and param.code!=''">
            and hwp.code like concat('%', #{param.code}, '%')
        </if>
        <if test="param.workType!=null and param.workType!=''">
            and hwp.work_type = #{param.workType}
        </if>
        <if test="param.workLevel!=null and param.workLevel!=''">
            and hwp.work_level = #{param.workLevel}
        </if>
        <if test="param.stakeholderWork!=null and param.stakeholderWork!=''">
            and hwp.stakeholder_work = #{param.stakeholderWork}
        </if>
        <if test="param.isCompliant!=null and param.isCompliant!=''">
            and hwpc.is_compliant = #{param.isCompliant}
        </if>
        <if test="param.problemType!=null and param.problemType!=''">
            and hwpc.problem_type = #{param.problemType}
        </if>
        <if test="param.checkDescription!=null and param.checkDescription!=''">
            and hwpc.check_description like concat('%', #{param.checkDescription}, '%')
        </if>
        <if test="param.checkName!=null and param.checkName!=''">
            and hwpc.check_name like concat('%', #{param.checkName}, '%')
        </if>
        <if test="param.startTime != null and param.startTime != ''  and param.endTime != null and param.endTime != ''">
            and hwpc.check_time between #{param.startTime} and #{param.endTime}
        </if>
        <if test="param.orgIdList != null and param.orgIdList.size()>0">
            and (
            <foreach item="id" collection="param.orgIdList" separator=" OR ">
                hwpc.basic_id LIKE concat('%', #{id}, '%')
            </foreach>
            )
        </if>
        order by hwpc.check_time desc
    </select>

    <select id="selectTHazardWorkPlanCheckManageExportList" resultMap="BaseResultMap">
        select
        hwpc.id,hwpc.plan_id,hwpc.check_time,hwpc.is_compliant,dd4.dict_value problem_type,hwpc.check_description,hwpc.check_images,hwpc.check_signature,hwpc.status,
        hwpc.create_by,hwpc.create_date,hwpc.update_by,hwpc.update_date,hwpc.remarks,hwpc.check_unit,hwpc.basic_unit,hwpc.check_status,hwpc.check_signature_time,hwpc.check_name,hwpc.check_id,hwpc.basic_id,
        hwp.code code,
        dd.dict_value as workType,
        dd2.dict_value workLevel,
        dd3.dict_value stakeholderWork
        from
        t_hazard_work_plan_check hwpc
        left join
        t_hazard_work_plan hwp on hwpc.plan_id = hwp.id
        left join
        t_sys_dict_data dd on hwp.work_type = dd.dict_data_id
        left join
        t_sys_dict_data dd2 on hwp.work_level = dd2.dict_data_id
        left join
        t_sys_dict_data dd3 on hwp.stakeholder_work = dd3.dict_data_id
        left join
        t_sys_dict_data dd4 on hwpc.problem_type = dd4.dict_data_id
        where hwpc.status = '0'
        <if test="param.code!=null and param.code!=''">
            and hwp.code like concat('%', #{param.code}, '%')
        </if>
        <if test="param.workType!=null and param.workType!=''">
            and hwp.work_type = #{param.workType}
        </if>
        <if test="param.workLevel!=null and param.workLevel!=''">
            and hwp.work_level = #{param.workLevel}
        </if>
        <if test="param.stakeholderWork!=null and param.stakeholderWork!=''">
            and hwp.stakeholder_work = #{param.stakeholderWork}
        </if>
        <if test="param.isCompliant!=null and param.isCompliant!=''">
            and hwpc.is_compliant = #{param.isCompliant}
        </if>
        <if test="param.problemType!=null and param.problemType!=''">
            and hwpc.problem_type = #{param.problemType}
        </if>
        <if test="param.checkDescription!=null and param.checkDescription!=''">
            and hwpc.check_description like concat('%', #{param.checkDescription}, '%')
        </if>
        <if test="param.checkName!=null and param.checkName!=''">
            and hwpc.check_name like concat('%', #{param.checkName}, '%')
        </if>
        <if test="param.startTime != null and param.startTime != ''  and param.endTime != null and param.endTime != ''">
            and hwpc.check_time between #{param.startTime} and #{param.endTime}
        </if>
        <if test="param.orgIdList != null and param.orgIdList.size()>0">
            and (
            <foreach item="id" collection="param.orgIdList" separator=" OR ">
                hwpc.basic_id LIKE concat('%', #{id}, '%')
            </foreach>
            )
        </if>
        order by hwpc.check_time desc
    </select>

    <select id="detail" resultMap="BaseResultMap">
        select hwpc.*,hwp.code code,hwp.work_type workType,hwp.work_level workLevel,hwp.stakeholder_work stakeholderWork
        from t_hazard_work_plan_check hwpc
        left join t_hazard_work_plan hwp on hwpc.plan_id = hwp.id
        where hwpc.status = '0' and hwpc.id = #{id}
    </select>

    <select id="selectCheckComplianceStatistics" resultType="com.testor.module.hazard.model.vo.HazardWorkPlanCheckComplianceStatisticsVO">
        SELECT
        COALESCE(COUNT(*), 0) AS checkCount,
        COALESCE(SUM(CASE WHEN hwpc.is_compliant = 1 THEN 1 ELSE 0 END), 0) AS checkQualifiedCount,
        COALESCE(ROUND(
        CASE
        WHEN COUNT(*) = 0 THEN 0
        ELSE SUM(CASE WHEN hwpc.is_compliant = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(*)
        END,
        2
        ), 0) AS complianceRatePercent
        FROM
        t_hazard_work_plan_check hwpc
        LEFT JOIN t_hazard_work_plan hwp ON hwpc.plan_id = hwp.id
        WHERE
        hwpc.status = '0'
        <if test="param.orgIdList != null and param.orgIdList.size()>0">
            and (
            <foreach item="id" collection="param.orgIdList" separator=" OR ">
                hwpc.basic_id LIKE concat('%', #{id}, '%')
            </foreach>
            )
        </if>
        <if test="param.workType!=null and param.workType!=''">
            and hwp.work_type = #{param.workType}
        </if>
        <if test="param.workLevel!=null and param.workLevel!=''">
            and hwp.work_level = #{param.workLevel}
        </if>
        <if test="param.stakeholderWork!=null and param.stakeholderWork!=''">
            and hwp.stakeholder_work = #{param.stakeholderWork}
        </if>
        <if test="param.startTime != null and param.startTime != ''  and param.endTime != null and param.endTime != ''">
            and hwpc.check_time between #{param.startTime} and #{param.endTime}
        </if>
    </select>

    <select id="selectCheckProblemTypeStatistics" resultType="com.testor.module.hazard.model.vo.HazardWorkPlanCheckProblemTypeStatisticsVO">
        select dd.dict_value problemName,count(*) problemCount
        from  t_sys_dict_data dd
        left join t_hazard_work_plan_check hwpc on hwpc.problem_type = dd.dict_data_id
        LEFT JOIN t_hazard_work_plan hwp ON hwpc.plan_id = hwp.id
        where hwpc.status = '0' AND hwpc.is_compliant = 0 AND hwpc.problem_type IS NOT NULL
        <if test="param.orgIdList != null and param.orgIdList.size()>0">
            and (
            <foreach item="id" collection="param.orgIdList" separator=" OR ">
                hwpc.basic_id LIKE concat('%', #{id}, '%')
            </foreach>
            )
        </if>
        <if test="param.workType!=null and param.workType!=''">
            and hwp.work_type = #{param.workType}
        </if>
        <if test="param.workLevel!=null and param.workLevel!=''">
            and hwp.work_level = #{param.workLevel}
        </if>
        <if test="param.stakeholderWork!=null and param.stakeholderWork!=''">
            and hwp.stakeholder_work = #{param.stakeholderWork}
        </if>
        <if test="param.startTime != null and param.startTime != ''  and param.endTime != null and param.endTime != ''">
            and hwpc.check_time between #{param.startTime} and #{param.endTime}
        </if>
        group by dd.dict_value
    </select>

    <select id="selectCheckProblemCountStatistics" resultType="com.testor.module.hazard.model.vo.HazardWorkPlanCheckProblemCountStatisticsVO">
        SELECT
        dates.timeStr AS problemDate,
        COUNT(hwpc.id) AS problemCount
        FROM
        (SELECT generate_series(
        #{param.startTime}::timestamp,
        #{param.endTime}::timestamp,
        '1 day'::interval
        )::date AS timeStr) dates
        LEFT JOIN t_hazard_work_plan_check hwpc ON hwpc.check_time::date = dates.timeStr
        AND hwpc.status = '0'
        AND hwpc.is_compliant = 0
        AND hwpc.problem_type IS NOT NULL
        <if test="param.orgIdList != null and param.orgIdList.size()>0">
            and (
            <foreach item="id" collection="param.orgIdList" separator=" OR ">
                hwpc.basic_id LIKE concat('%', #{id}, '%')
            </foreach>
            )
        </if>
        <if test="param.startTime != null and param.startTime != ''  and param.endTime != null and param.endTime != ''">
            and hwpc.check_time between #{param.startTime} and #{param.endTime}
        </if>
        LEFT JOIN t_hazard_work_plan hwp ON hwpc.plan_id = hwp.id
        <if test="param.workType!=null and param.workType!=''">
            and hwp.work_type = #{param.workType}
        </if>
        <if test="param.workLevel!=null and param.workLevel!=''">
            and hwp.work_level = #{param.workLevel}
        </if>
        <if test="param.stakeholderWork!=null and param.stakeholderWork!=''">
            and hwp.stakeholder_work = #{param.stakeholderWork}
        </if>

        GROUP BY
          dates.timeStr
        ORDER BY
          dates.timeStr
    </select>

</mapper>