<?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.PlantMapper">
			
		<!-- 
		<resultMap id="plantResult" type="com.elt.ems.vo.PlantVo">
		  <id property="seq" column="seq" />
		  <id property="name" column="name" />
		  <id property="plantType" column="plantType" />
		  <id property="plantStatus" column="plantStatus" />
		  <id property="supplyPower" column="supplyPower" />
		  <id property="beginDate" column="beginDate" />
		  <id property="geox" column="geox" />
		  <id property="geoy" column="geoy" />
		  <id property="weatherx" column="weatherx" />
		  <id property="weathery" column="weathery" />
		  <id property="omStartDate" column="omStartDate" />
		  <id property="omEndDate" column="omEndDate" />
		  <id property="createDatetime" column="createDatetime" />
		  <id property="updateDatetime" column="updateDatetime" />
		  <id property="pmsdataDatetime" column="pmsdataDatetime" />
		  
		  <association property="pms" column="plantSeq" javaType="com.elt.ems.vo.PmsVo" resultMap="pmsResult"/>
		</resultMap>
			
		<resultMap id="pmsResult" type="com.elt.ems.vo.PmsVo">
		  <id property="plantSeq" column="plantSeq"/>
		  <result property="ip" column="ip"/>
		  <result property="port" column="port"/>
		  <result property="status" column="status"/>
		  <result property="startIdx" column="startIdx"/>
		  <result property="pmsMaker" column="pmsMaker"/>
		  <result property="pcsMaker" column="pcsMaker"/>
		  <result property="batteryMaker" column="batteryMaker"/>
		  <result property="pcsQuantity" column="pcsQuantity"/>
		  <result property="pcsVolume" column="pcsVolume"/>
		</resultMap>    
		 -->    

		<!-- 해당 부분의 id는 MapperClass의 함수 이름과 유사하여야 합니다. -->
	    <sql id="commonPagingHeader"  >
	      SELECT R1.* FROM (
	    </sql>
	    
	    <sql id="commonPagingFooter"  >
	      ) R1 LIMIT #{pgtl.startNo}, #{pgtl.listPerPage}
	    </sql>    
	     		
	    <select id="selectListCount"  parameterType="com.elt.ems.vo.PlantVo" resultType="integer">
	
			select count(p.seq) as count 
			from t_plant p 
			where 1=1 
			<if test="seq > 0"> and p.seq = #{seq}</if>
			<if test="plantStatus != null and plantStatus != '' "> and p.plantStatus = #{plantStatus}</if>
			<if test="plantType != null and plantType != '' "> and p.plantType = #{plantType}</if>
			<if test="name != null and name != '' "> and p.name like concat('%', #{name}, '%')</if>    
	    </select>
	    		
	    <select id="selectList"  parameterType="com.elt.ems.vo.PlantVo" resultType="com.elt.ems.vo.PlantVo">
	
	      <if test="pgtl != null">
	        <include refid="commonPagingHeader" /> 
	      </if>
	
			select 
				p.*
			from t_plant p
			where 1=1 	 
			<if test="seq > 0"> and p.seq = #{seq}</if>			
			<if test="plantStatus != null and plantStatus != '' "> and p.plantStatus = #{plantStatus}</if>
			<if test="plantType != null and plantType != '' "> and p.plantType = #{plantType}</if>	
			<if test="name != null and name != '' "> and p.name like concat('%', #{name}, '%')</if> 		 
			order by p.seq desc
			
	      <if test="pgtl != null">
	        <include refid="commonPagingFooter" />
	      </if>
	      
	    </select>
	    
	    
	    <select id="selectListKescoPlantCount"  parameterType="com.elt.ems.vo.KescoPlantVo" resultType="int">

	      select count(plantSeq) count from (
				select 
					p.seq as plantSeq, p.name, p.plantType, p.plantStatus, p.supplyPower, p.beginDate, p.omStartDate, p.omEndDate, p.createDatetime,
					k.customerId, k.aesKey, k.kescoStatus, k.protoVer, k.kepcoId, k.rpsId, k.specialStatus,
				    (select count(d.seq) from t_kesco_data d where d.plantSeq = p.seq and d.inputDate = #{inputDate} <if test="inputHour != null and inputHour != '' "> and d.inputHour = #{inputHour}</if> ) as count,
				    (select count(d.seq) from t_kesco_data d where d.plantSeq = p.seq and d.inputDate = #{inputDate} and d.sendStatus='01' <if test="inputHour != null and inputHour != '' "> and d.inputHour = #{inputHour}</if> ) as successCount,
					(select max(d.createDatetime) from t_kesco_data d where d.plantSeq = p.seq and d.inputDate = #{inputDate} <if test="inputHour != null and inputHour != '' "> and d.inputHour = #{inputHour}</if> ) as kescodataDatetime
				from t_plant p left join t_kesco k
				on p.seq = k.plantSeq
				where 1=1
				<if test="plantSeq > 0"> and p.seq = #{plantSeq}</if>
				<if test="plantStatus != null and plantStatus != '-1' "> and p.plantStatus = #{plantStatus}</if>
				<if test="kescoStatus != null"> 
					<if test="kescoStatus == '-1' "> and k.kescoStatus is not null </if>
					<if test="kescoStatus != '-1' "> and k.kescoStatus = #{kescoStatus} </if>
				</if>
				<if test="name != null and name != '' "> and p.name like concat('%', #{name}, '%')</if>
				order by p.seq desc 
		 ) d
		 <if test="successCount != null and successCount > 0 "> where d.successCount &lt; #{successCount} </if>
	      
	    </select>
	    	    
	    <select id="selectListKescoPlant"  parameterType="com.elt.ems.vo.KescoPlantVo" resultType="com.elt.ems.vo.KescoPlantVo">
	
	      <if test="pgtl != null">
	        <include refid="commonPagingHeader" /> 
	      </if>
	      select * from (
				select 
					p.seq as plantSeq, p.name, p.plantType, p.plantStatus, p.supplyPower, p.beginDate, p.omStartDate, p.omEndDate, p.createDatetime,
					k.customerId, k.aesKey, k.kescoStatus, k.protoVer, k.kepcoId, k.rpsId, k.specialStatus,
				    (select count(d.seq) from t_kesco_data d where d.plantSeq = p.seq and d.inputDate = #{inputDate} <if test="inputHour != null and inputHour != '' "> and d.inputHour = #{inputHour}</if> ) as count,
				    (select count(d.seq) from t_kesco_data d where d.plantSeq = p.seq and d.inputDate = #{inputDate} and d.sendStatus='01' <if test="inputHour != null and inputHour != '' "> and d.inputHour = #{inputHour}</if> ) as successCount,
					(select max(d.createDatetime) from t_kesco_data d where d.plantSeq = p.seq and d.inputDate = #{inputDate} <if test="inputHour != null and inputHour != '' "> and d.inputHour = #{inputHour}</if> ) as kescodataDatetime
				from t_plant p left join t_kesco k
				on p.seq = k.plantSeq
				where 1=1
				<if test="plantSeq > 0"> and p.seq = #{plantSeq}</if>
				<if test="plantStatus != null and plantStatus != '-1' "> and p.plantStatus = #{plantStatus}</if>
				<if test="kescoStatus != null"> 
					<if test="kescoStatus == '-1' "> and k.kescoStatus is not null </if>
					<if test="kescoStatus != '-1' "> and k.kescoStatus = #{kescoStatus} </if>
				</if>
				<if test="name != null and name != '' "> and p.name like concat('%', #{name}, '%')</if>
				order by p.seq desc 
		 ) d
		 <if test="successCount != null and successCount > 0 "> where d.successCount &lt; #{successCount} </if>
			
	      <if test="pgtl != null">
	        <include refid="commonPagingFooter" />
	      </if>
	      
	    </select>
	    
	    <select id="selectListKescoTimetable"  parameterType="com.elt.ems.vo.KescoDataVo" resultType="com.elt.ems.vo.KescoDataVo">
	
			select
			*
			from t_kesco_data k
			where inputDate = #{inputDate} and plantSeq = #{plantSeq}
			order by inputHour desc
			
	    </select>	
	    
	    <select id="selectListKescoData"  parameterType="com.elt.ems.vo.KescoDataVo" resultType="com.elt.ems.vo.KescoDataVo">
			select 
			k.*,
			d.seq as pmsdataSeq, d.pcsIdx, d.inputDate, d.inputHour,
		    d.chargePower, d.dischargePower, d.pvPower,
			d.data1, d.data2, d.data3, d.data4, d.data5, d.data6, d.data7, d.data8, d.data9, d.data10,
			d.data11, d.data12, d.data13, d.data14, d.data15, d.data16, d.data17, d.data18, d.data19, d.data20,
			d.data21, d.data22, d.data23, d.data24, d.data25, d.data26, d.data27, d.data28, d.data29, d.data30,
			d.data31, d.data32, d.data33,
			d.data51, d.data52, d.data53, d.data54, d.data55, d.data56, d.data57, d.data58, d.data59, d.data60, 
			d.data61, d.data62, d.data63, d.data64, d.data65, d.data66, d.data67, d.data68, d.data69, d.data70
			from (
				select k.*, p.pcsMaker, p.batteryMaker
	            from t_kesco_data k, t_pms p
				where k.inputDate=#{inputDate} and k.plantSeq = p.plantSeq
			) k left join t_pmsdata_statistic_hour d
			on k.plantSeq = d.plantSeq and k.pmsdataSeq = d.seq and d.pcsIdx=0 and d.inputDate=#{inputDate}
			where k.inputDate = #{inputDate} and k.plantSeq = #{plantSeq}
			order by d.inputDate desc, d.inputHour desc, k.createDatetime desc
			
	    </select>	    
	    
	    
	    <select id="selectListPmsPlantCount"  parameterType="com.elt.ems.vo.PmsPlantVo" resultType="integer">
	
			select count(p.seq) as count 
			from t_plant p left join t_pms m
			on p.seq = m.plantSeq
			where 1=1 
			<if test="seq > 0"> and p.seq = #{seq}</if>
			<if test="plantStatus != null and plantStatus != '-1' "> and p.plantStatus = #{plantStatus}</if>
			<if test="pmsStatus != null and pmsStatus != '-1' "> and m.pmsStatus = #{pmsStatus}</if>
			<if test="plantType != null and plantType != '' "> and p.plantType = #{plantType}</if>
			<if test="pcsMaker != null and pcsMaker != '' "> and m.pcsMaker = #{pcsMaker}</if>
			<if test="batteryMaker != null and batteryMaker != '' "> and m.batteryMaker = #{batteryMaker}</if> 	
			<if test="name != null and name != '' "> and p.name like concat('%', #{name}, '%')</if>    
	    </select>
	    	    
	    <select id="selectListPmsPlant"  parameterType="com.elt.ems.vo.PmsPlantVo" resultType="com.elt.ems.vo.PmsPlantVo"> 
<!--     
			select 
				p.*,
				(select max(d.createDatetime) from t_pmsdata_${realtimeYear} d where d.plantSeq = p.seq and d.pcsIdx = 0 and d.inputDate = #{inputDate}) as pmsdataDatetime,
				(select count(d.seq) from t_pmsdata_${realtimeYear} d where d.plantSeq = p.seq and d.pcsIdx = 0 and d.inputDate = #{inputDate}) as count,
				(select max(d.timetableSeq) from t_pmsdata_${realtimeYear} d where d.plantSeq = p.seq and d.pcsIdx = 0 and d.inputDate =  #{inputDate}) as timetableSeq, 
				m.plantSeq, m.ip, m.port, m.pmsStatus, m.startIdx, m.pmsMaker, m.pmsModel, m.pcsMaker, m.pcsVolume, m.pcsQuantity, m.batteryMaker, m.batteryModel, m.batteryVolume, m.batteryQuantity,
				(m.pcsVolume * m.pcsQuantity) as pcsPower, (m.batteryVolume * m.batteryQuantity) as batteryPower
			from t_plant p  left join t_pms m
			on p.seq = m.plantSeq
			where 1=1 
			
 
			select p.*, d.createDatetime, d.count, d.timetableSeq
			from (   
				select p.*, 
					m.plantSeq, m.ip, m.port, m.pmsStatus, m.startIdx, m.pmsMaker, m.pmsModel, m.pcsMaker, m.pcsVolume, m.pcsQuantity, m.batteryMaker, m.batteryModel, m.batteryVolume, m.batteryQuantity, (m.pcsVolume * m.pcsQuantity) as pcsPower, (m.batteryVolume * m.batteryQuantity) as batteryPower 
				from t_plant p left join t_pms m 
				on p.seq = m.plantSeq 
				where 1=1 and m.pmsStatus = '01'
				<if test="seq > 0"> and p.seq = #{seq}</if>
				<if test="plantStatus != null and plantStatus != '-1' "> and p.plantStatus = #{plantStatus}</if>
				<if test="pmsStatus != null and pmsStatus != '-1' "> and m.pmsStatus = #{pmsStatus}</if>
				<if test="plantType != null and plantType != '' "> and p.plantType = #{plantType}</if>
				<if test="pcsMaker != null and pcsMaker != '' "> and m.pcsMaker = #{pcsMaker}</if>
				<if test="batteryMaker != null and batteryMaker != '' "> and m.batteryMaker = #{batteryMaker}</if>	
				<if test="name != null and name != '' "> and p.name like concat('%', #{name}, '%')</if> 				
			) p left join (
				select 
					plantSeq,  d.inputDate, d.pcsIdx, max(d.createDatetime) as createDatetime , count(d.seq) as count, max(timetableSeq) as timetableSeq 
					from t_pmsdata_2020 d 
					where d.pcsIdx = 0 and d.inputDate = '2020-10-08' group by plantSeq
			) d
			on p.plantSeq = d.plantSeq and d.inputDate = '2020-10-08' and d.pcsIdx = 0
			order by p.seq desc
						
 -->	
 
				select p.*, d.createDatetime, d.count, d.timetableSeq
				from (   
					select p.*, 
						m.plantSeq, m.ip, m.port, m.pmsStatus, m.startIdx, m.pmsMaker, m.pmsModel, m.pcsMaker, m.pcsVolume, m.pcsQuantity, m.batteryMaker, m.batteryModel, m.batteryVolume, m.batteryQuantity, 
						(m.pcsVolume * m.pcsQuantity) as pcsPower, (m.batteryVolume * m.batteryQuantity) as batteryPower 
					from t_plant p left join t_pms m 
					on p.seq = m.plantSeq 
					where m.pmsStatus = '01'
				<if test="seq > 0"> and p.seq = #{seq}</if>
				<if test="plantStatus != null and plantStatus != '-1' "> and p.plantStatus = #{plantStatus}</if>
				<if test="pmsStatus != null and pmsStatus != '-1' "> and m.pmsStatus = #{pmsStatus}</if>
				<if test="plantType != null and plantType != '' "> and p.plantType = #{plantType}</if>
				<if test="pcsMaker != null and pcsMaker != '' "> and m.pcsMaker = #{pcsMaker}</if>
				<if test="batteryMaker != null and batteryMaker != '' "> and m.batteryMaker = #{batteryMaker}</if>	
				<if test="name != null and name != '' "> and p.name like concat('%', #{name}, '%')</if> 					
				) p left join (
					select plantSeq,  d.inputDate, d.pcsIdx, max(d.createDatetime) as createDatetime , count(d.seq) as count, max(timetableSeq) as timetableSeq 
					from t_pmsdata_${realtimeYear} d 
					where d.inputDate = #{inputDate} and d.pcsIdx = 0 group by plantSeq
				) d
				on p.plantSeq = d.plantSeq and d.inputDate = #{inputDate} and d.pcsIdx = 0
				order by p.seq desc	      
	    </select>
	    
	    
	    <select id="selectListKescoMonthResult"  parameterType="com.elt.ems.vo.KescoDataVo" resultType="com.elt.ems.vo.KescoDataVo">
	    <!-- 
			select plantSeq, inputDate,  sendStatus, count(seq) as count
			from t_kesco_data t
			where inputDate like concat(#{inputDate}, '-__')
			<if test="plantSeq > 0"> and t.plantSeq = #{plantSeq}</if>
			group by plantSeq, inputDate, sendStatus
		 -->
			
			select 
				k.plantSeq, p.name as plantName, k.inputDate, count(k.seq) as count, sum(k.succCount) as succCount
			from 
			(
				select t1.*,
				CASE
					WHEN sendStatus='01' THEN '1'
					ELSE '0'
				END AS succCount
				from t_kesco_data t1
				where inputDate like concat(#{inputDate}, '-__')
				<if test="plantSeq > 0"> and t1.plantSeq = #{plantSeq}</if> 
			)  k, t_plant p
			where k.plantSeq = p.seq
			group by k.plantSeq, k.inputDate
			order by k.plantSeq, k.inputDate					
			    
	    </select>
	    	    
	    	    	    
	    	    
<!-- 	    	    
	    <select id="selectDetailList"  parameterType="com.elt.ems.vo.PmsVo" resultType="com.elt.ems.vo.PmsVo">
	
	      <if test="pgtl != null">
	        <include refid="commonPagingHeader" /> 
	      </if>
	
			select 
				p.*,
				(select max(d.createDatetime) from t_pmsdata_2020 d where d.plantSeq = p.seq and d.pcsIdx = 1 and d.inputDate = date_format(now(), '%Y-%m-%d')) as pmsdataDatetime,
				m.plantSeq, m.ip, m.port, m.pmsStatus, m.startIdx, m.pmsMaker, m.pmsModel, m.pcsMaker, m.pcsVolume, m.pcsQuantity, m.batteryMaker, m.batteryModel, m.batteryVolume, m.batteryQuantity,
				(m.pcsVolume * m.pcsQuantity) as pcsPower, (m.batteryVolume * m.batteryQuantity) as batteryPower
			from t_plant p  left join t_pms m
			on p.seq = m.plantSeq
			where 1=1 
			<if test="seq > 0"> and p.seq = #{seq}</if>
			<if test="plantStatus != null and plantStatus != '' "> and p.plantStatus = #{plantStatus}</if>
			<if test="plantType != null and plantType != '' "> and p.plantType = #{plantType}</if>
			<if test="pmsStatus != null and pmsStatus != '' "> and m.pmsStatus = #{pmsStatus}</if>
			<if test="pcsMaker != null and pcsMaker != '' "> and m.pcsMaker = #{pcsMaker}</if>
			<if test="batteryMaker != null and batteryMaker != '' "> and m.batteryMaker = #{batteryMaker}</if>	
			<if test="name != null and name != '' "> and p.name like concat('%', #{name}, '%')</if> 
			order by p.seq desc 
	      <if test="pgtl != null">
	        <include refid="commonPagingFooter" />
	      </if>
	      
	    </select>	
 -->      
	    
	<!-- 	    
		<select id="selectBySeq"  parameterType="int" resultMap="plantResult">
	       select * 
	       from t_plant p
	       where seq = #{seq} 		
	
			select 
				seq, name, plantType, plantStatus, beginDate, manageType, manageCompany,
				omStatus, omStartDay,  omEndDay, omPeriod, safetyManagerSeq, clientSeq, regionCode, address, memo, 
				supplyPower, battaryPower, pcsPower, pcsMadeby, battaryMadeby,
				ip, port, pcsStatus, pcsNum, startIdx, geox, geoy, createDateTime, updateDatetime,
        (select c.name from t_code c where c.groupType='battery_madeby' and c.id=p.battaryMadeby) as battaryMadebyName,
        (select c.name from t_code c where c.groupType='pcs_madeby' and c.id=p.pcsMadeby) as pcsMadebyName				
			from t_plant p where seq = #{seq}
 		
		</select>
	    
		<select id="selectDetailBySeq"  parameterType="int" resultType="com.elt.ems.vo.PlantDetailVo">
			select 
				p.*,
				m.ip, m.port 
				m.ip, m.port, m.status, m.startIdx, m.pmsMaker, m.pmsModel, m.pcsMaker, m.pcsVolume, m.pcsQuantity, m.batteryMaker, m.batteryModel, m.batteryVolume, m.batteryQuantity  
			from t_plant p left join t_pms m
			on p.seq = m.plantSeq
			where seq = #{seq} 				
		</select>		    
	-->	
	
		<update id="update"  parameterType="com.elt.ems.vo.PlantVo">
			update t_plant set 
				name = #{name},
				plantType = #{plantType},
				plantStatus = #{plantStatus},
				beginDate = #{beginDate},
				omStartDate = #{omStartDate},
				omEndDate = #{omEndDate},
				supplyPower = #{supplyPower},
				address = #{address},
				weatherCode = #{weatherCode},
		        geox = #{geox},
		        geoy = #{geoy},
		        weatherx = #{weatherx},
		        weathery = #{weathery},
				memo = #{memo},
				updateDatetime = now()
			where seq = #{seq}
		</update>	
		
		
		<insert id="insert"  parameterType="com.elt.ems.vo.PlantVo">
			insert into t_plant (
				name, plantType, plantStatus, beginDate, omStartDate,  omEndDate, supplyPower, address, weatherCode, geox, geoy, weatherx, weathery, memo, createDateTime, updateDatetime
			) values (
				#{name},
				#{plantType},
				#{plantStatus},
				#{beginDate},
				#{omStartDate},
				#{omEndDate},
				#{supplyPower},
				#{address},
		        #{weatherCode},
		        #{geox},
				#{geoy},
				#{weatherx},
				#{weathery},
				#{memo},
				now(),
				now()
			)
		</insert>	
				
		
	</mapper>