<?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">
	 
	<!-- 해당 부분의 namespace는 project package + Mapper Package + Mapper Interface 이름입니다. -->
	<mapper namespace="com.elt.ems.mapper.UserMapper">
	


	
	    <sql id="tableNameLogin"> t_login_2021 </sql>
	    	
	    <sql id="commonPagingHeader"  >
	      SELECT R1.* FROM (
	    </sql>
	    
	    <sql id="commonPagingFooter"  >
	      ) R1 LIMIT #{pgtl.startNo}, #{pgtl.listPerPage}
	    </sql>   
	    	
		<!-- 해당 부분의 id는 MapperClass의 함수 이름과 유사하여야 합니다. -->
		
		<select id="selectListCount"  resultType="int">
			select 
				count(u.id) as count
			from t_user u where 1=1 
            <!-- 
			<if test="id != null and id != '' "> and u.id like concat('%', #{id}, '%')</if> -->
			<if test="id != null and id != '' "> and u.id = #{id} </if>
			<if test="name != null and name != '' "> and u.name like concat('%', #{name}, '%')</if>
			<if test="roleCode != null and roleCode != '-1' "> and u.roleCode = #{roleCode}</if>
			<if test="statusCode != null and statusCode != '-1' "> and u.statusCode = #{statusCode}</if>
		</select>
			
					
		<select id="selectList"  resultType="com.elt.ems.vo.UserVo">
	      <if test="pgtl != null">
	        <include refid="commonPagingHeader" /> 
	      </if>
			select u.*, m.*  from (		      
	            select u.*, l.loginChannel, l.loginDate, l.loginTime, l.loginCount
	            from t_user u left join
	            (
					select l.*, a.loginCount
					from <include refid="tableNameLogin" /> l, (
						select max(seq) as seq, count(seq) as loginCount
						from <include refid="tableNameLogin" />
						group by id
					) a
	                where l.seq = a.seq
				) l
	            on u.id = l.id
	            where 1=1
	            <!-- 
				<if test="id != null and id != '' "> and u.id like concat('%', #{id}, '%')</if> -->
				<if test="id != null and id != '' "> and u.id = #{id} </if>
				<if test="name != null and name != '' "> and u.name like concat('%', #{name}, '%')</if>
				<if test="roleCode != null and roleCode != '-1' "> and u.roleCode = #{roleCode}</if>
				<if test="statusCode != null and statusCode != '-1' "> and u.statusCode = #{statusCode}</if>
				
			) u left join (
				select m.userId, m.plantSeq , group_concat(m.plantSeq) as plantSeqArray, group_concat(p.name) as plantNameArray
			    from t_user_plant_mapping m, t_plant p
				where m.plantSeq = p.seq and p.plantStatus = '01'
			    group by m.userId
			) m
			on u.id = m.userId		
			order by u.createDatetime desc		
			
	      <if test="pgtl != null">
	        <include refid="commonPagingFooter" />
	      </if>			
		</select>
		
		<select id="selectActiveUser"  resultType="com.elt.ems.vo.UserVo" parameterType="String">
			select 
				*
			from t_user where id = #{id} and statusCode = '01'
		</select>
	
		<resultMap id="userMap" type="com.elt.ems.vo.UserVo">
		    <result property="id" column="id"/>
		    <result property="name" column="name"/>
		    <result property="roleCode" column="roleCode"/>
		    <result property="statusCode" column="statusCode"/>
		    <result property="createDatetime" column="createDatetime"/>
		    <result property="updateDatetime" column="updateDatetime"/>
		    <result property="loginCount" column="loginCount"/>
		    <result property="loginDate" column="loginDate"/>
		    <result property="loginTime" column="loginTime"/>
		    
		    <collection property="plantList"  column="plantSeq" javaType="java.util.ArrayList" ofType="com.elt.ems.vo.UserPlantMappingVo" select="selectPlantActiveList"/>
		</resultMap>
		
		
		<select id="selectListMap"  resultMap="userMap">
	      <if test="pgtl != null">
	        <include refid="commonPagingHeader" /> 
	      </if>
            select u.*, l.loginDate, l.loginTime, l.loginCount
            from t_user u left join
            (
				select l.*, a.loginCount
				from <include refid="tableNameLogin" /> l, (
					select max(seq) as seq, count(seq) as loginCount
					from <include refid="tableNameLogin" />
					group by id
				) a
                where l.seq = a.seq
			) l
            on u.id = l.id
            where 1=1
			<if test="id != null and id != '' "> and u.id like concat('%', #{id}, '%')</if>
			<if test="name != null and name != '' "> and u.name like concat('%', #{name}, '%')</if>
			<if test="roleCode != null and roleCode != '-1' "> and u.roleCode = #{roleCode}</if>
			<if test="statusCode != null and statusCode != '-1' "> and u.statusCode = #{statusCode}</if>
			order by u.createDatetime desc
			
	      <if test="pgtl != null">
	        <include refid="commonPagingFooter" />
	      </if>			
		</select>
		
			
	    	
<!--  sample 	

	<resultMap id="boradResult" type="net.krespo.mybatis.Board">
	    <result property="boardid" column="BOARDID"/>
	    <result property="title" column="TITLE"/>
	    <result property="content" column="CONTENT"/>
	    <collection property="comments" column="BOARDID" javaType="java.util.ArrayList" ofType="net.krespo.mybatis.Comment" select="getCommentListById"/>
	</resultMap>
	 
	<select id="getBoardById" resultMap="boardResult">
	    SELECT boardid, title, content FROM board WHERE boardid = #{boardid}
	</select>
	<select id="getCommentListById" resultType="net.krespo.mybatis.Comment">
	    SELECT commentid, boardid, writer, content FROM comment WHERE boardid = #{boardid}
	</select>
 -->
	    			
		<update id="update"  parameterType="com.elt.ems.vo.UserVo">
			update t_user set 
				name = #{name},
				<if test="password != null and password != '' ">password = #{password}, </if>
				statusCode = #{statusCode},
				roleCode = #{roleCode},
				clientSeq = #{clientSeq},
				updateDatetime = now()
			where id = #{id}
		</update>	
		
		<insert id="insert"  parameterType="com.elt.ems.vo.UserVo">
			insert into t_user (
				id, name, password, statusCode, roleCode, clientSeq, createDateTime, updateDatetime
			) values (
				#{id},
				#{name},
				#{password},
				#{statusCode},
				#{roleCode},
				#{clientSeq},
				now(),
				now()
			)
		</insert>
					
		<insert id="insertLogin"  parameterType="com.elt.ems.vo.LoginVo">
			insert into <include refid="tableNameLogin" /> (
				id, roleCode, sessionId, loginChannel, loginDate, loginTime, updateTime
			) values (
				#{id},
				#{roleCode},				
				#{sessionId},
				#{loginChannel},
				curdate(),
				curtime(),
				curtime()
			)
		</insert>
			    		
		<update id="updateLogin"  parameterType="com.elt.ems.vo.LoginVo">
			update <include refid="tableNameLogin" /> set 
				updateTime = curtime()
			where id = #{id} and sessionId= #{sessionId}
		</update>		
				
		<select id="selectLoginList"  resultType="com.elt.ems.vo.LoginVo">
			SELECT R1.* FROM (
				select 
					*
				from <include refid="tableNameLogin" /> where id = #{id}
				order by seq desc
			) R1 LIMIT 0, 10
		</select>
				
		<select id="selectByUserId"  resultType="com.elt.ems.vo.UserVo" parameterType="String">
			select 
				*
			from t_user where id = #{id} and statusCode = '01'
		</select>
		
		<select id="selectPlantMappingList"  resultType="com.elt.ems.vo.UserPlantMappingVo" parameterType="String">
			select m.*, p.name as plantName, p.plantStatus
			from t_user_plant_mapping m, t_plant p 
			where m.plantSeq = p.seq and m.userId=#{id}
		</select>
				
		<select id="selectPlantActiveMappingList"  resultType="com.elt.ems.vo.UserPlantMappingVo" parameterType="String">
			select m.*, p.name as plantName
			from t_user_plant_mapping m, t_plant p 
			where m.plantSeq = p.seq and p.plantStatus = '01' and m.userId=#{id}
		</select>	
		
		<select id="selectPlantActiveOmList"  resultType="com.elt.ems.vo.UserPlantMappingVo" parameterType="int">
			select p.seq as plantSeq, p.name as plantName
			from t_plant p 
			where p.plantStatus = '01' and p.clientOrderSeq = #{clientOrderSeq};
		</select>	
				
		<select id="selectPlantActiveList"  resultType="com.elt.ems.vo.UserPlantMappingVo" parameterType="String">
			select 
				p.seq as plantSeq, p.name as plantName
			from t_plant p left join t_pms m
			on p.seq = m.plantSeq and p.plantStatus = '01' and m.pmsStatus = '01'
			order by p.seq desc
		</select> 
			
		<insert id="insertMapping"  parameterType="com.elt.ems.vo.UserPlantMappingVo">
			insert into t_user_plant_mapping (
				userId, plantSeq, createUserId, createDatetime
			) values (
				#{userId},
				#{plantSeq},
				#{createUserId},
				now()
			)
		</insert>
		
		<insert id="deleteMapping"  parameterType="com.elt.ems.vo.UserPlantMappingVo">
			delete from t_user_plant_mapping where plantSeq = #{plantSeq} and userId=#{userId} and seq &gt; 0
		</insert>		
		
		
	</mapper>