<?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.yiqi.system.mapper.SysUserMapper">

    <resultMap type="com.yiqi.common.core.domain.entity.SysUser" id="SysUserResult">
        <id property="userId" column="user_id"/>
        <result property="deptId" column="dept_id"/>
        <result property="storeId" column="store_id"/>
        <result property="storeName" column="store_name"/>
        <result property="factoryId" column="factory_id"/>
        <result property="factoryName" column="factory_name"/>
        <result property="userName" column="user_name"/>
        <result property="userType" column="user_type"/>
        <result property="nickName" column="nick_name"/>
        <result property="email" column="email"/>
        <result property="phonenumber" column="phonenumber"/>
        <result property="sex" column="sex"/>
        <result property="avatar" column="avatar"/>
        <result property="password" column="password"/>
        <result property="status" column="status"/>
        <result property="delFlag" column="del_flag"/>
        <result property="loginIp" column="login_ip"/>
        <result property="loginDate" column="login_date"/>
        <result property="employeeNo" column="employee_no"/>
        <result property="certType" column="cert_type"/>
        <result property="certNo" column="cert_no"/>
        <result property="joinDate" column="join_date"/>
        <result property="leaveDate" column="leave_date"/>
        <result property="contractNature" column="contract_nature"/>
        <result property="contractStartDate" column="contract_start_date"/>
        <result property="contractEndDate" column="contract_end_date"/>
        <result property="nation" column="nation"/>
        <result property="certAddress" column="cert_address"/>
        <result property="nativePlace" column="native_place"/>
        <result property="maritalStatus" column="marital_status"/>
        <result property="emergencyContact" column="emergency_contact"/>
        <result property="emergencyPhone" column="emergency_phone"/>
        <result property="college" column="college"/>
        <result property="education" column="education"/>
        <result property="speciality" column="speciality"/>
        <result property="birthDay" column="birth_day"/>
        <result property="createBy" column="create_by"/>
        <result property="createTime" column="create_time"/>
        <result property="updateBy" column="update_by"/>
        <result property="updateTime" column="update_time"/>
        <result property="remark" column="remark"/>
        <association property="dept" column="dept_id" javaType="com.yiqi.common.core.domain.entity.SysDept" resultMap="deptResult"/>
        <collection property="roles" javaType="java.util.List" resultMap="RoleResult"/>
    </resultMap>

    <resultMap id="deptResult" type="com.yiqi.common.core.domain.entity.SysDept">
        <id property="deptId" column="dept_id"/>
        <result property="parentId" column="parent_id"/>
        <result property="deptName" column="dept_name"/>
        <result property="ancestors" column="ancestors"/>
        <result property="orderNum" column="order_num"/>
        <result property="leader" column="leader"/>
        <result property="status" column="dept_status"/>
    </resultMap>

    <resultMap id="RoleResult" type="com.yiqi.common.core.domain.entity.SysRole">
        <id property="roleId" column="role_id"/>
        <result property="roleName" column="role_name"/>
        <result property="roleKey" column="role_key"/>
        <result property="roleSort" column="role_sort"/>
        <result property="dataScope" column="data_scope"/>
        <result property="status" column="role_status"/>
    </resultMap>

    <sql id="selectUserVo">
        select u.user_id,u.store_id,s.name as store_name,u.factory_id,f.factory_name, u.dept_id, u.user_name, u.nick_name,u.user_type, u.email, u.avatar, u.phonenumber, u.password, u.sex,
        u.status, u.del_flag, u.login_ip, u.login_date, u.employee_no, u.cert_type, u.cert_no, u.join_date, u.leave_date,
        u.contract_nature, u.contract_start_date, u.contract_end_date, u.nation, u.cert_address, u.native_place,
        u.marital_status, u.emergency_contact, u.emergency_phone, u.college, u.education, u.speciality, u.birth_day,
        u.create_by, u.create_time, u.remark,
        d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
        r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
        from sys_user u
        left join manage_factory f on f.id=u.factory_id
        left join sys_store s on s.id=u.store_id
        left join sys_dept d on u.dept_id = d.dept_id
        left join sys_user_role ur on u.user_id = ur.user_id
        left join sys_role r on r.role_id = ur.role_id
    </sql>

    <select id="selectUserList" parameterType="com.yiqi.common.core.domain.entity.SysUser" resultMap="SysUserResult">
        select u.user_id, u.store_id,s.name as store_name,u.factory_id,f.factory_name,u.dept_id, u.nick_name, u.user_name,u.user_type, u.email, u.avatar, u.phonenumber, u.sex, u.status,
        u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user
        u
        left join manage_factory f on f.id=u.factory_id
        left join sys_store s on s.id=u.store_id
        left join sys_dept d on u.dept_id = d.dept_id
        where u.del_flag = '0'
        <if test="storeId != null and storeId != 0">
            AND u.store_id = #{storeId}
        </if>
        <if test="factoryId != null and factoryId != 0">
            AND u.factory_id = #{factoryId}
        </if>
        <if test="userId != null and userId != 0">
            AND u.user_id = #{userId}
        </if>
        <if test="userName != null and userName != ''">
            AND u.user_name like concat('%', #{userName}, '%')
        </if>
        <if test="status != null and status != ''">
            AND u.status = #{status}
        </if>
        <if test="userType != null and userType != ''">
            AND u.user_type = #{userType}
        </if>
        <if test="phonenumber != null and phonenumber != ''">
            AND u.phonenumber like concat('%', #{phonenumber}, '%')
        </if>
        <if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
            AND date_format(u.create_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')
        </if>
        <if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
            AND date_format(u.create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
        </if>
        <if test="deptId != null and deptId != 0">
            AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId},
            ancestors) ))
        </if>
        <!-- 数据范围过滤 -->
        ${params.dataScope}
    </select>

    <select id="selectAllocatedList" parameterType="com.yiqi.common.core.domain.entity.SysUser" resultMap="SysUserResult">
        select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
        from sys_user u
        left join sys_dept d on u.dept_id = d.dept_id
        left join sys_user_role ur on u.user_id = ur.user_id
        left join sys_role r on r.role_id = ur.role_id
        where u.del_flag = '0' and r.role_id = #{roleId}
        <if test="userName != null and userName != ''">
            AND u.user_name like concat('%', #{userName}, '%')
        </if>
        <if test="phonenumber != null and phonenumber != ''">
            AND u.phonenumber like concat('%', #{phonenumber}, '%')
        </if>
        <!-- 数据范围过滤 -->
        ${params.dataScope}
    </select>

    <select id="selectUnallocatedList" parameterType="com.yiqi.common.core.domain.entity.SysUser" resultMap="SysUserResult">
        select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
        from sys_user u
        left join sys_dept d on u.dept_id = d.dept_id
        left join sys_user_role ur on u.user_id = ur.user_id
        left join sys_role r on r.role_id = ur.role_id
        where u.del_flag = '0' and (r.role_id != #{roleId} or r.role_id IS NULL)
        and u.user_id not in (select u.user_id from sys_user u inner join sys_user_role ur on u.user_id = ur.user_id and
        ur.role_id = #{roleId})
        <if test="userType != null and userType != ''">
            AND u.user_type = #{userType}
        </if>
        <if test="storeId != null and storeId != 0">
            AND u.store_id = #{storeId}
        </if>
        <if test="factoryId != null and factoryId != 0">
            AND u.factory_id = #{factoryId}
        </if>
        <if test="userName != null and userName != ''">
            AND u.user_name like concat('%', #{userName}, '%')
        </if>
        <if test="phonenumber != null and phonenumber != ''">
            AND u.phonenumber like concat('%', #{phonenumber}, '%')
        </if>
        <!-- 数据范围过滤 -->
        ${params.dataScope}
    </select>

    <select id="selectUserByIds" parameterType="Long" resultMap="SysUserResult">
        <include refid="selectUserVo"/>
        where u.user_id in
        <foreach collection="array" item="userId" open="(" separator="," close=")">
            #{userId}
        </foreach>
    </select>

    <select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult">
        <include refid="selectUserVo"/>
        where u.user_name = #{userName} and u.del_flag = '0'
    </select>

    <select id="selectUserById" parameterType="Long" resultMap="SysUserResult">
        <include refid="selectUserVo"/>
        where u.user_id = #{userId}
    </select>

    <select id="checkUserNameUnique" parameterType="String" resultMap="SysUserResult">
        select user_id, user_name from sys_user where user_name = #{userName} and del_flag = '0' limit 1
    </select>

    <select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult">
        select user_id, phonenumber from sys_user where phonenumber = #{phonenumber} and del_flag = '0' limit 1
    </select>

    <select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
        select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1
    </select>

    <insert id="insertUser" parameterType="com.yiqi.common.core.domain.entity.SysUser" useGeneratedKeys="true" keyProperty="userId">
        insert into sys_user(
        <if test="userId != null and userId != 0">user_id,</if>
        <if test="userType != null and userType != ''">user_type,</if>
        <if test="storeId != null and storeId != 0">store_id,</if>
        <if test="factoryId != null and factoryId != 0">factory_id,</if>
        <if test="deptId != null and deptId != 0">dept_id,</if>
        <if test="userName != null and userName != ''">user_name,</if>
        <if test="nickName != null and nickName != ''">nick_name,</if>
        <if test="email != null and email != ''">email,</if>
        <if test="avatar != null and avatar != ''">avatar,</if>
        <if test="phonenumber != null and phonenumber != ''">phonenumber,</if>
        <if test="sex != null and sex != ''">sex,</if>
        <if test="password != null and password != ''">password,</if>
        <if test="status != null and status != ''">status,</if>
        <if test="employeeNo != null">employee_no,
        </if>
        <if test="certType != null">cert_type,
        </if>
        <if test="certNo != null">cert_no,
        </if>
        <if test="joinDate != null">join_date,
        </if>
        <if test="leaveDate != null">leave_date,
        </if>
        <if test="contractNature != null">contract_nature,
        </if>
        <if test="contractStartDate != null">contract_start_date,
        </if>
        <if test="contractEndDate != null">contract_end_date,
        </if>
        <if test="nation != null">nation,
        </if>
        <if test="certAddress != null">cert_address,
        </if>
        <if test="nativePlace != null">native_place,
        </if>
        <if test="maritalStatus != null">marital_status,
        </if>
        <if test="emergencyContact != null">emergency_contact,
        </if>
        <if test="emergencyPhone != null">emergency_phone,
        </if>
        <if test="college != null">college,
        </if>
        <if test="education != null">education,
        </if>
        <if test="speciality != null">speciality,
        </if>
        <if test="birthDay != null">birth_day,
        </if>
        <if test="createBy != null and createBy != ''">create_by,</if>
        <if test="remark != null and remark != ''">remark,</if>
        create_time
        )values(
        <if test="userId != null and userId != ''">#{userId},</if>
        <if test="userType != null and userType != ''">#{userType},</if>
        <if test="storeId != null and storeId != ''">#{storeId},</if>
        <if test="factoryId != null and factoryId != ''">#{factoryId},</if>
        <if test="deptId != null and deptId != ''">#{deptId},</if>
        <if test="userName != null and userName != ''">#{userName},</if>
        <if test="nickName != null and nickName != ''">#{nickName},</if>
        <if test="email != null and email != ''">#{email},</if>
        <if test="avatar != null and avatar != ''">#{avatar},</if>
        <if test="phonenumber != null and phonenumber != ''">#{phonenumber},</if>
        <if test="sex != null and sex != ''">#{sex},</if>
        <if test="password != null and password != ''">#{password},</if>
        <if test="status != null and status != ''">#{status},</if>
        <if test="employeeNo != null">#{employeeNo},
        </if>
        <if test="certType != null">#{certType},
        </if>
        <if test="certNo != null">#{certNo},
        </if>
        <if test="joinDate != null">#{joinDate},
        </if>
        <if test="leaveDate != null">#{leaveDate},
        </if>
        <if test="contractNature != null">#{contractNature},
        </if>
        <if test="contractStartDate != null">#{contractStartDate},
        </if>
        <if test="contractEndDate != null">#{contractEndDate},
        </if>
        <if test="nation != null">#{nation},
        </if>
        <if test="certAddress != null">#{certAddress},
        </if>
        <if test="nativePlace != null">#{nativePlace},
        </if>
        <if test="maritalStatus != null">#{maritalStatus},
        </if>
        <if test="emergencyContact != null">#{emergencyContact},
        </if>
        <if test="emergencyPhone != null">#{emergencyPhone},
        </if>
        <if test="college != null">#{college},
        </if>
        <if test="education != null">#{education},
        </if>
        <if test="speciality != null">#{speciality},
        </if>
        <if test="birthDay != null">#{birthDay},
        </if>
        <if test="createBy != null and createBy != ''">#{createBy},</if>
        <if test="remark != null and remark != ''">#{remark},</if>
        sysdate()
        )
    </insert>

    <update id="updateUser" parameterType="com.yiqi.common.core.domain.entity.SysUser">
        update sys_user
        <set>
            <if test="storeId != null and storeId != 0">store_id = #{storeId},</if>
            <if test="factoryId != null and factoryId != 0">factory_id = #{factoryId},</if>
            <if test="deptId != null and deptId != 0">dept_id = #{deptId},</if>
            <if test="userName != null and userName != ''">user_name = #{userName},</if>
            <if test="nickName != null and nickName != ''">nick_name = #{nickName},</if>
            <if test="email != null ">email = #{email},</if>
            <if test="phonenumber != null ">phonenumber = #{phonenumber},</if>
            <if test="sex != null and sex != ''">sex = #{sex},</if>
            <if test="avatar != null and avatar != ''">avatar = #{avatar},</if>
            <if test="password != null and password != ''">password = #{password},</if>
            <if test="status != null and status != ''">status = #{status},</if>
            <if test="loginIp != null and loginIp != ''">login_ip = #{loginIp},</if>
            <if test="loginDate != null">login_date = #{loginDate},</if>
            <if test="employeeNo != null">employee_no =
                #{employeeNo},
            </if>
            <if test="certType != null">cert_type =
                #{certType},
            </if>
            <if test="certNo != null">cert_no =
                #{certNo},
            </if>
            <if test="joinDate != null">join_date =
                #{joinDate},
            </if>
            <if test="leaveDate != null">leave_date =
                #{leaveDate},
            </if>
            <if test="contractNature != null">contract_nature =
                #{contractNature},
            </if>
            <if test="contractStartDate != null">contract_start_date =
                #{contractStartDate},
            </if>
            <if test="contractEndDate != null">contract_end_date =
                #{contractEndDate},
            </if>
            <if test="nation != null">nation =
                #{nation},
            </if>
            <if test="certAddress != null">cert_address =
                #{certAddress},
            </if>
            <if test="nativePlace != null">native_place =
                #{nativePlace},
            </if>
            <if test="maritalStatus != null">marital_status =
                #{maritalStatus},
            </if>
            <if test="emergencyContact != null">emergency_contact =
                #{emergencyContact},
            </if>
            <if test="emergencyPhone != null">emergency_phone =
                #{emergencyPhone},
            </if>
            <if test="college != null">college =
                #{college},
            </if>
            <if test="education != null">education =
                #{education},
            </if>
            <if test="speciality != null">speciality =
                #{speciality},
            </if>
            <if test="birthDay != null">birth_day =
                #{birthDay},
            </if>
            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
            <if test="remark != null">remark = #{remark},</if>
            update_time = sysdate()
        </set>
        where user_id = #{userId}
    </update>

    <update id="updateUserStatus" parameterType="com.yiqi.common.core.domain.entity.SysUser">
        update sys_user set status = #{status} where user_id = #{userId}
    </update>

    <update id="updateUserAvatar" parameterType="com.yiqi.common.core.domain.entity.SysUser">
        update sys_user set avatar = #{avatar} where user_name = #{userName}
    </update>

    <update id="resetUserPwd" parameterType="com.yiqi.common.core.domain.entity.SysUser">
        update sys_user set password = #{password} where user_name = #{userName}
    </update>

    <delete id="deleteUserById" parameterType="Long">
        update sys_user set del_flag = '2' where user_id = #{userId}
    </delete>

    <delete id="deleteUserByIds" parameterType="Long">
        update sys_user set del_flag = '2' where user_id in
        <foreach collection="array" item="userId" open="(" separator="," close=")">
            #{userId}
        </foreach>
    </delete>

</mapper>