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

	<resultMap type="SysUser" id="SysUserResult">
		<id     property="userId"       column="user_id"      />
		<result property="staffId"       column="staffid"      />
		<result property="deptId"       column="dept_id"      />
		<result property="userName"     column="user_name"    />
		<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="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"       />
		<result property="homeType"       column="home_type"       />
		<result property="dataScope"          column="data_scope"            />
		<result property="deptCheckStrictly"  column="dept_check_strictly"   />
		<result property="signUrl"  column="sign_url"   />
		<association property="dept"    column="dept_id" javaType="SysDept" resultMap="deptResult" />
		<collection  property="roles"   javaType="java.util.List"        resultMap="RoleResult" />
	</resultMap>

	<resultMap id="deptResult" type="SysDept">
		<id     property="deptId"   column="dept_id"     />
		<result property="parentId" column="parent_id"   />
		<result property="deptName" column="dept_name"   />
		<result property="orderNum" column="order_num"   />
		<result property="leader"   column="leader"      />
		<result property="status"   column="dept_status" />
	</resultMap>

	<resultMap id="RoleResult" type="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>

	<select id="selectUserPost" parameterType="tStaffmgr" resultMap="SysUserResult">
		select b.USER_ID ,b.NICK_NAME ,b.STAFFID from T_STAFFMGR a
		left join SYS_USER b on a.STAFFID=b.STAFFID
		left join sys_dept d on a.dept_id = d.dept_id
		<where>
			<if test="actualposts != null  and actualposts != ''">
				and a.actualpost in
				<foreach collection="actualposts.split(',')" item="item" index="index"
						 open="(" close=")" separator=",">
					#{item}
				</foreach>
			</if>
			<if test="deptId != null  and deptId != ''"> and a.dept_id=#{deptId}</if>
			and a.DEL_FLAG=0
			and b.USER_ID is not null
		</where>
		${params.dataScope}
	</select>

	<select id="selectUserByMgrRegion" parameterType="tStaffmgr" resultType="map">
		SELECT
		a.region,
		listagg ( b.NICK_NAME, '，' ) within GROUP ( ORDER BY a.region ) nickName,
		listagg ( b.user_id, ',' ) within GROUP ( ORDER BY a.region ) userId
		FROM
		T_STAFFMGR a
		LEFT JOIN SYS_USER b ON a.STAFFID = b.STAFFID
		LEFT JOIN sys_dept d ON a.dept_id = d.dept_id
		<where>
			(
			a.region = '芳烃抽提'
			OR a.region = '汽油加氢'
			OR a.region = '压缩'
			OR a.region = '分离'
			OR a.region = '裂解'
			)
			AND a.DEL_FLAG = 0
			AND b.USER_ID IS NOT NULL
		</where>
		${params.dataScope}
		GROUP BY
		a.region
	</select>

	<select id="selectAllUser" resultType="SysUser">
		select * from sys_user u where u.del_flag = '0'
	</select>

	<sql id="selectUserVo">
        select u.user_id,u.staffid,u.home_type, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
			   u.data_scope, u.dept_check_strictly,u.sign_url,
        d.dept_id, d.parent_id, 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 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="selectSafeManagerUserByPlantCode" resultType="SysUser">
		SELECT
			nick_name,
			phonenumber
		FROM
		SYS_USER
		WHERE
		USER_ID = (
		SELECT
		USER_ID
		FROM
		SYS_USER_ROLE
		WHERE
		ROLE_ID = 10020
		AND USER_ID IN (
		SELECT
		USER_ID
		FROM
		SYS_USER
		WHERE
		DEPT_ID = (
		SELECT
		DEPT_ID
		FROM
		SYS_DEPT
		WHERE
		DEPT_NAME = (
		    SELECT DEPT_CODE FROM SYS_PLANT WHERE NAME = (
		        SELECT PLANT_CODE FROM T_REPORT_HI_YLRQ WHERE PLANT_CODE = #{plantCode} AND ROWNUM <![CDATA[ < ]]> 2 )
		    AND LENGTH(DEPT_CODE) > 0 )
		)
		)
		AND ROWNUM <![CDATA[ < ]]> 2
		)
	</select>


	<select id="selectUserSingle" parameterType="SysUser" resultMap="SysUserResult">
		select u.user_id,u.staffid,u.home_type, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.password, 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 sys_dept d on u.dept_id = d.dept_id
		where u.del_flag = '0' and 2 > ROWNUM
		<if test="nickName != null and nickName != ''">
			AND u.nick_name = #{nickName}
		</if>
		<if test="staffId != null and staffId != ''">
			AND u.staffid = #{staffId}
		</if>
		<if test="deptId != null and deptId != 0">
			AND u.dept_id = #{deptId}
		</if>
	</select>

    <select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
		select u.user_id,u.staffid,u.home_type, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.password, 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 sys_dept d on u.dept_id = d.dept_id
		where u.del_flag = '0'
		<if test="userName != null and userName != ''">
			AND u.user_name like concat(concat('%',#{userName}),'%')
		</if>
		<if test="staffId != null and staffId != ''">
			AND u.staffid like concat(concat('%',#{staffId}),'%')
		</if>
		<if test="nickName != null and nickName != ''">
			AND u.nick_name like concat(concat('%',#{nickName}),'%')
		</if>
		<if test="status != null and status != ''">
			AND u.status = #{status}
		</if>
		<if test="phonenumber != null and phonenumber != ''">
			AND u.phonenumber like concat(concat('%',#{phonenumber}),'%')
		</if>
		<if test="beginTime != null and beginTime != ''"><!-- 开始时间检索 -->
			AND u.create_time &gt;= to_date(#{beginTime},'yyyy-MM-dd HH24:mi:ss')
		</if>
		<if test="endTime != null and endTime != ''"><!-- 结束时间检索 -->
			AND u.create_time &lt;= to_date(#{endTime},'yyyy-MM-dd HH24:mi:ss')
		</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) <![CDATA[ <> ]]> 0 ))
		</if>
		<!-- 数据范围过滤 -->
		${params.dataScope}
	</select>

	<select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult">
	    <include refid="selectUserVo"/>
		where upper(u.user_name)= upper(#{userName})
	</select>

	<select id="selectUserByDept" parameterType="Long" resultMap="SysUserResult">
		<include refid="selectUserVo"/>
		where u.dept_id = #{deptId}
	</select>

	<select id="selectUserListByPost" parameterType="String" resultMap="SysUserResult">
		select u.user_id,u.staffid,u.email, u.dept_id, u.user_name, u.nick_name||'__'||d.dept_name as nick_name
		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
		LEFT JOIN SYS_USER_POST sp on u.USER_ID = sp.USER_ID
		LEFT JOIN SYS_POST p on p.POST_ID = sp.POST_ID
		where u.del_flag = '0' and u.staffid is not null
		<if test="postCode != null and postCode != ''">
			and p.POST_CODE = #{postCode}
		</if>
	</select>

	<select id="selectUserListByRoleAndDept" parameterType="SysUser" resultMap="SysUserResult">
		select u.user_id,u.staffid,u.email, u.dept_id, u.user_name, u.nick_name ,d.dept_name,r.ROLE_ID
		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
		LEFT JOIN SYS_USER_POST sp on u.USER_ID = sp.USER_ID
		LEFT JOIN SYS_POST p on p.POST_ID = sp.POST_ID
		where u.del_flag = '0' and u.staffid is not null
		<if test="roleId != null and roleId != ''">
			and r.role_id = #{roleId}
		</if>
		<if test="deptId != null and deptId != ''">
			and d.dept_id = #{deptId}
		</if>
	</select>

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

	<select id="selectNickNameById" parameterType="Long" resultMap="SysUserResult">
		select u.nick_name from SYS_USER u
		where u.user_id = #{userId}
	</select>

	<select id="selectUserByStaffId" parameterType="String" resultMap="SysUserResult">
		<include refid="selectUserVo"/>
		where u.staffid = #{staffid}
	</select>

	<select id="checkUserNameUnique" parameterType="String" resultType="int">
		select count(1) from sys_user where user_name = #{userName} and rownum <![CDATA[ <= ]]> 1
	</select>

	<select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult">
		select user_id, phonenumber from sys_user where phonenumber = #{phonenumber} and rownum <![CDATA[ <= ]]> 1
	</select>

	<select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
		select user_id, email from sys_user where email = #{email} and rownum <![CDATA[ <= ]]> 1
	</select>

	<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
	    <selectKey keyProperty="userId" order="BEFORE" resultType="Long">
			select seq_sys_user.nextval as userId from DUAL
		</selectKey>
 		insert into sys_user(
 			<if test="userId != null and userId != 0">user_id,</if>
			<if test="staffId != null and staffId != 0">staffid,</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="homeType != null and homeType != ''">home_type,</if>
 			<if test="password != null and password != ''">password,</if>
 			<if test="status != null and status != ''">status,</if>
 			<if test="createBy != null and createBy != ''">create_by,</if>
 			<if test="remark != null and remark != ''">remark,</if>
			<if test="signUrl != null and signUrl != ''">sign_url,</if>
 			create_time
 		)values(
 			<if test="userId != null and userId != ''">#{userId},</if>
			<if test="staffId != null and staffId != ''">#{staffId},</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="homeType != null and homeType != ''">#{homeType},</if>
 			<if test="password != null and password != ''">#{password},</if>
 			<if test="status != null and status != ''">#{status},</if>
 			<if test="createBy != null and createBy != ''">#{createBy},</if>
 			<if test="remark != null and remark != ''">#{remark},</if>
			<if test="signUrl != null and signUrl != ''">#{signUrl},</if>
			sysdate
 		)
	</insert>

	<update id="updateUser" parameterType="SysUser">
 		update sys_user
 		<set>
 			<if test="deptId != null and deptId != 0">dept_id = #{deptId},</if>
			<if test="staffId != null and staffId != 0">staffid = #{staffId},</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 and email != ''">email = #{email},</if>
 			<if test="phonenumber != null and phonenumber != ''">phonenumber = #{phonenumber},</if>
 			<if test="sex != null and sex != ''">sex = #{sex},</if>
			<if test="homeType != null and homeType != ''">home_type = #{homeType},</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="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
 			<if test="remark != null">remark = #{remark},</if>
			<if test="dataScope != null and dataScope != ''">data_scope = #{dataScope},</if>
			<if test="deptCheckStrictly != null">dept_check_strictly = #{deptCheckStrictly},</if>
			<if test="signUrl != null">sign_url = #{signUrl},</if>
 			update_time = sysdate
 		</set>
 		where user_id = #{userId}
	</update>

	<update id="updateUserStatus" parameterType="SysUser">
 		update sys_user set status = #{status} where user_id = #{userId}
	</update>

	<update id="updateUserAvatar" parameterType="SysUser">
 		update sys_user set avatar = #{avatar} where user_name = #{userName}
	</update>

	<update id="resetUserPwd" parameterType="SysUser">
 		update sys_user set password = #{password} where user_name = #{userName}
	</update>

	<delete id="deleteUserById" parameterType="Long">
 		delete from sys_user where user_id = #{userId}
 	</delete>

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

	<delete id="deleteUserDeptByUserId" parameterType="Long">
		delete from sys_user_dept where user_id=#{userId}
	</delete>

</mapper>
