<?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="cn.wisenergy.mapper.WorkTimeOrderMapper">

    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="cn.wisenergy.model.app.WorkTimeOrder">
        <id column="work_id" property="workId" />
        <result column="user_id" property="userId" />
        <result column="project_id" property="projectId" />
        <result column="dept_id" property="deptId" />
        <result column="work_time" property="workTime" />
        <result column="work_day" property="workDay" />
        <result column="status" property="status" />
        <result column="reviewer_id" property="reviewerId" />
        <result column="des" property="des" />
        <result column="reason" property="reason" />
        <result column="type" property="type" />
        <result column="is_overtime" property="isOvertime" />
        <result column="create_time" property="createTime" />
        <result column="modify_time" property="modifyTime" />
    </resultMap>


    <!-- 通用查询结果列 -->
    <sql id="vals">
       #{userId},#{projectId},#{deptId},#{workTime},#{workDay},#{status},#{reviewerId},#{des},#{reason},#{type},#{isOvertime},now(),now()
    </sql>
    <sql id="cols_exclude_id">
      user_id, project_id, dept_id, work_time, work_day, status, reviewer_id, des, reason, type, is_overtime, create_time, modify_time
    </sql>

    <sql id="criteria">
        <if test="workId != null">and work_id = #{workId}</if>
        <if test="userId != null">and user_id = #{userId}</if>
        <if test="projectId != null">and project_id =#{projectId}</if>
        <if test="deptId != null">and dept_id = #{deptId}</if>
        <if test="workTime != null">and work_time = #{workTime}</if>
        <if test="workDay != null">and  work_day = #{workDay}</if>
        <if test=" status != null">and `status` = #{status}</if>
        <if test=" reviewerId != null">and reviewer_id = #{reviewerId}</if>
        <if test="des != null">and des =#{des}</if>
        <if test="reason != null">and reason = #{reason}</if>
        <if test="type != null">and type = #{type}</if>
        <if test="isOvertime != null">and is_overtime = #{isOvertime}</if>
        <if test="createTime != null">and create_time &gt;= #{createTime}</if>
        <if test="modifyTime != null">and #{modifyTime} &gt;= modify_time</if>
    </sql>

    <resultMap id="dayWorkTimeAndType" type="cn.wisenergy.model.dto.DayWorkTimeAndType">
        <result property="day" column="day(work_day)"/>
        <result property="type" column="type"/>
        <result property="workTime" column="sum(work_time)"/>
    </resultMap>

    <resultMap id="monthlyWorkHourStatistics" type="cn.wisenergy.model.dto.MonthlyWorkingHoursStatistics">
        <result property="count" column="count(1)"/>
        <result property="workTime" column="sum(work_time)"/>
    </resultMap>

    <sql id="table">
        work_time_order
    </sql>

    <insert id="save"  keyProperty="workId" useGeneratedKeys="true">
        insert into
        <include refid="table"/>
        (<include refid="cols_exclude_id"/>)
        value(
        <include refid="vals"/>
        )
    </insert>

    <update id="updateByIds">
        UPDATE
        <include refid="table"/>
        SET status = 2,reviewer_id = #{reviewerId}
        WHERE work_id IN
        <foreach collection="ids" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </update>

    <update id="updateStatusById">
        UPDATE
        <include refid="table"/>
        SET status = 3,reason = #{reason},reviewer_id = #{reviewerId},modify_time=now()
        WHERE work_id = #{id}
    </update>


    <select id="getByDay" resultType="cn.wisenergy.model.app.WorkTimeOrder">
        SELECT <include refid="Base_Column_List"/>
        FROM <include refid="table"/>
        <where>
            <if test="null !=userId">
                <if test="null != userId">
                    AND   user_id = #{userId}
                </if>
                <if test="null != workDay">
                    AND   DATE_FORMAT(work_day, '%Y%m%d') = DATE_FORMAT(#{workDay} ,'%Y%m%d')
                </if>
            </if>
        </where>

    </select>
    <select id="queryByPage" resultType="cn.wisenergy.model.app.WorkTimeOrder">
        SELECT
        <include refid="Base_Column_List"/>
        FROM
        <include refid="table"/>
        <where>
            <if test="null != projectId">
            AND   project_id = #{projectId}
            </if>
            <if test="null != status">
            AND status = #{status}
            </if>
            <if test="null != types">
            AND type IN
            <foreach collection="types" item="type" open="(" close=")" separator=",">
                #{type}
            </foreach>
            </if>
        </where>
        ORDER BY work_day,project_id DESC
    </select>

    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        work_id, user_id, project_id,  dept_id, work_time, work_day, status, reviewer_id, des, reason, type, is_overtime, create_time, modify_time
    </sql>

    <select id="statisticsByProjectType" resultMap="monthlyWorkHourStatistics">
        select count(1),sum(work_time)
        from <include refid="table"/>
        where user_id = #{userId} AND type = #{projectType} AND work_day >=#{currentMonthFirstDay}
    </select>

    <select id="listByDateAndUserId" resultMap="dayWorkTimeAndType">
    select user_id,day(work_day),CASE when `type` = 3 then 1 when `type` = 4 then 2 else 0 end AS `type`, sum(work_time)
    from <include refid="table"/>
    where year(work_day) = #{year} AND month(work_day) = #{month} AND user_id = #{userId} AND status in (2,5)
    group by user_id,day(work_day), CASE when `type` = 3 then 1 when `type` = 4 then 2 else 0 end
    order by day(work_day)
    </select>

    <select id="getCountByCondition" resultType="integer" parameterType="map">
        select count(1)
        from <include refid="table"/>
        <where>
            <include refid="criteria"/>
            <if test="startDay != null">
                AND work_day>=#{startDay}
            </if>
            <if test="projectIds != null">
                AND project_id IN
                <foreach collection="projectIds" item="projectId" open="(" close=")" separator=",">
                    #{projectId}
                </foreach>
            </if>
            <if test="statusArray != null">
                AND `status` IN
                <foreach collection="statusArray" item="workStatus" open="(" close=")" separator=",">#{workStatus}</foreach>
            </if>
            <if test="typeArray != null">
                AND `type` IN
                <foreach collection="typeArray" item="type" open="(" close=")" separator=",">
                    #{type}
                </foreach>
            </if>
        </where>
    </select>

    <select id="getWorkTimeAndCostCollect" resultType="cn.wisenergy.model.dto.WorkTimeAndCostCollect" parameterType="integer">
        select case when `type`= 1 then '商机' when `type`= 0 then '项目' end AS type,dept_id, project_id,MIN(work_day) AS firstTime,MAX(work_day) AS lastTime,SUM(work_time)/8 AS totalTime,(SUM(work_time))/8*10 AS cost
        from <include refid="table"/>
        where status in (2,5) and project_id in
        <foreach collection="projectIds" item="projectId" open="(" close=")" separator=",">
            #{projectId}
        </foreach>
        <if test="firstDayOfMonth != null">
            AND work_day >= date(#{firstDayOfMonth})
        </if>
        group by `type`,dept_id, project_id
    </select>

    <select id="getDaysByDateAndStatus" resultType="date" >
        select distinct(work_day)
        from <include refid="table"/>
        where work_day >= #{firstDayOfMonth} AND user_id = #{userId}
    </select>
</mapper>