/*******************************************************************************
 *	 All Rights reserved,Copyright (c) K-Opticom 
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JSYejbECR0011B010TPDA
 *	ソースファイル名：JSYejbECR0011B010TPDA.java
 *	作成者			：EK909999
 *	日付			：2011年10月31日
 *＜機能概要＞
 *	SQLFacility
 *	テンプレートDBアクセス部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	ｖ1.00.00
 *	ｖ6.00.00	2013/09/26	FJ）伊藤	OM-2013-0002109 性能改善（SQL修正）
 *	ｖ6.00.01	2013/11/19	FJ）伊藤	OM-2013-0002109 性能改善（SQL修正）
 *
 ********************************************************************************/

package eo.ejb.cbs.sqlf;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.base.CAANSQLFacility;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateDBAccessHandler;

import eo.common.constant.JPCModelConstant;
import eo.common.util.JCRUtilCommon;
import eo.ejb.cbm.entity.CR0201ETMsg;
import eo.ejb.cbs.cbsmsg.ECR0011B010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECR0011B010CBSMsg1List;

/**
*
*  テンプレートDBアクセス部品　ECR0011B010_SQLF<br>
*  入力された項目からSQL文を動的に組み立て、<br>
*  検索結果をCBSMsgにセットします。<br>
*/
public class JSYejbECR0011B010TPDA extends CAANSQLFacility implements TemplateDBAccessHandler{
	
	/**
	 * コンストラクタ
	 */
	public JSYejbECR0011B010TPDA()	{
	}
	
	/**
	*   ECR0011B010_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @return void
	*/
	public void invoke(CAANMsg inMsg,AgentDispatchContext inContext){
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント（件数取得用）
		PreparedStatement pstmtCount = null;
		
		// リザルトセット（件数取得用）
		ResultSet rsltQueryCount = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;

		/******************** 
		 * SQL文の作成
		 ********************/

		try{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CR0201ETMsg.getTableName());
			
			//****************** 以降、コーディング修正 START ************************************//
			ArrayList<ArrayList<String>> keyTaioKrkUwCtgrLvAry = new ArrayList<ArrayList<String>>();
			ArrayList<ArrayList<String>> keyTaioKrkUwCtgrNmAry = new ArrayList<ArrayList<String>>();
			ArrayList<Object> replaceList = new ArrayList<Object>();
			if (!JCRUtilCommon.isNull(inMsg.getString(ECR0011B010CBSMsg.KEY_TAIOKRK_UW_CTGR_LV))
				&& !JCRUtilCommon.isNull(inMsg.getString(ECR0011B010CBSMsg.KEY_TAIOKRK_UW_CTGR_NM))){
				// 対応記録内訳カテゴリーレベルリスト取得
				String[] keyWorkTaioKrkUwCtgrLv = inMsg.getString(ECR0011B010CBSMsg.KEY_TAIOKRK_UW_CTGR_LV).split(",");
				// 対応記録内訳カテゴリー名リスト取得
				String[] keyWorkTaioKrkUwCtgrNm = inMsg.getString(ECR0011B010CBSMsg.KEY_TAIOKRK_UW_CTGR_NM).split(",");
				
				ArrayList<String> keyWorkTaioKrkUwCtgrLvAry = new ArrayList<String>();
				ArrayList<String> keyWorkTaioKrkUwCtgrNmAry = new ArrayList<String>();

				keyTaioKrkUwCtgrLvAry.add(keyWorkTaioKrkUwCtgrLvAry);
				keyTaioKrkUwCtgrNmAry.add(keyWorkTaioKrkUwCtgrNmAry);

				for (int i = 0; i < keyWorkTaioKrkUwCtgrLv.length; i++)
				{
					if ("999".equals(keyWorkTaioKrkUwCtgrLv[i]))
					{
						
						keyWorkTaioKrkUwCtgrLvAry = new ArrayList<String>();
						keyWorkTaioKrkUwCtgrNmAry = new ArrayList<String>();

						keyTaioKrkUwCtgrLvAry.add(keyWorkTaioKrkUwCtgrLvAry);
						keyTaioKrkUwCtgrNmAry.add(keyWorkTaioKrkUwCtgrNmAry);

						continue;
					}

					keyWorkTaioKrkUwCtgrLvAry.add(keyWorkTaioKrkUwCtgrLv[i]);
					keyWorkTaioKrkUwCtgrNmAry.add(keyWorkTaioKrkUwCtgrNm[i]);
				}
			}

			// 検索条件の編集
			StringBuffer sql_Buff_whr = new StringBuffer();

			// SQL文_個別部1
			if ( JPCModelConstant.FUNC_CD_1.equals( inMsg.getObject(ECR0011B010CBSMsg.FUNC_CODE).toString() ) )
			{

				// ＫＥＹ＿対応記録内訳カテゴリーレベルが設定されている場合
				if (keyTaioKrkUwCtgrLvAry.size() > 0)
				{

					for (int i = 0; i < keyTaioKrkUwCtgrLvAry.size(); i++)
					{
						ArrayList<String> keyWorkTaioKrkUwCtgrLvAry = keyTaioKrkUwCtgrLvAry.get(i);
						ArrayList<String> keyWorkTaioKrkUwCtgrNmAry = keyTaioKrkUwCtgrNmAry.get(i);

						sql_Buff_whr.append("         AND EXISTS (SELECT 'X' ")
									.append("                       FROM CR_T_TAIOKRK_UCWK TKUW1 ")
									.append("                      WHERE TKUW1.TAIO_KIROK_NO = TKRK.TAIO_KIROK_NO ")
									.append("                        AND TKUW1.MK_FLG = '0' ");

						for (int j = 0; j < keyWorkTaioKrkUwCtgrLvAry.size(); j++)
						{
							sql_Buff_whr.append("                        AND EXISTS (SELECT 'X' FROM CR_T_TAIOKRK_UW_CTGR TKUC1 ")
										.append("                                     WHERE TKUC1.TAIO_KIROK_NO = TKUW1.TAIO_KIROK_NO ")
										.append("                                       AND TKUC1.TAIO_KIROK_UCWK_NO = TKUW1.TAIO_KIROK_UCWK_NO ")
										.append("                                       AND TKUC1.TAIOKRK_UW_CTGR_LV = '").append(keyWorkTaioKrkUwCtgrLvAry.get(j)).append("' ")
										.append("                                       AND TKUC1.TAIOKRK_UW_CTGR_NM = ? ")
										.append("                                       AND TKUC1.TAIOKRK_UW_CTGR_NM = ? ")
										.append("                                       AND TKUC1.MK_FLG = '0') ");
							// パラメータの設定(ＫＥＹ＿対応記録内訳カテゴリー名を指定) ※条件を二重にする（性能改善のため）
							replaceList.add(keyWorkTaioKrkUwCtgrNmAry.get(j));
							replaceList.add(keyWorkTaioKrkUwCtgrNmAry.get(j));
						}

						sql_Buff_whr.append("                     ) ");
					}
				}

				// ＫＥＹ＿対応開始年月日（自）が設定されている場合
				if (!inMsg.isNull(ECR0011B010CBSMsg.KEY_TAIO_STA_DTM_START)){
					sql_Buff_whr.append("         AND TKRK.TAIO_STA_DTM >= ? || '000000' ");
					// パラメータの設定(ＫＥＹ＿対応開始年月日（自）を指定)
					replaceList.add(inMsg.getObject(ECR0011B010CBSMsg.KEY_TAIO_STA_DTM_START));
				}

				// ＫＥＹ＿対応開始年月日（至）が設定されている場合
				if (!inMsg.isNull(ECR0011B010CBSMsg.KEY_TAIO_STA_DTM_END)){
					sql_Buff_whr.append("         AND TKRK.TAIO_STA_DTM <= ? || '999999' ");
					// パラメータの設定(ＫＥＹ＿対応開始年月日（至）を指定)
					replaceList.add(inMsg.getObject(ECR0011B010CBSMsg.KEY_TAIO_STA_DTM_END));
				}

				// ＫＥＹ＿タイトルが設定されている場合
				if (!inMsg.isNull(ECR0011B010CBSMsg.KEY_TITLE)){
					sql_Buff_whr.append("         AND TKRK.TITLE LIKE '%' || ? || '%' ");
					// パラメータの設定(ＫＥＹ＿タイトルを指定)
					replaceList.add(inMsg.getObject(ECR0011B010CBSMsg.KEY_TITLE));
				}
			}
			//****************** 以降、コーディング修正  END  ************************************//
			// SQL文_基本部1
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("     TBL2.TAIO_KIROK_NO, ")
					.append("     TBL2.TITLE, ")
					.append("     TBL2.TOIAWASE_STAT_CD, ")
					.append("     TBL2.TOIAWASE_STAT_NM, ")
					.append("     TBL2.TOIAWASE_UKETUKE_STAT, ")
					.append("     TBL2.TOIAWASE_UKETUKE_STAT_NM, ")
					.append("     TBL2.TAIO_STA_DTM ")
					.append(" FROM( ")
					.append("     SELECT ")
					.append("         TBL1.TAIO_KIROK_NO, ")
					.append("         TBL1.TITLE, ")
					.append("         TBL1.TOIAWASE_STAT_CD, ")
					.append("         (SELECT CNK01.CD_DIV_NM ")
					.append("            FROM ZM_M_CD_NM_KANRI CNK01 ")
					.append("           WHERE CNK01.CD_SBT_CD = 'CD00229' ")
					.append("             AND CNK01.CD_DIV = TBL1.TOIAWASE_STAT_CD ")
					.append("             AND CNK01.CD_TSTAYMD <= SUBSTR(TBL1.UPD_DTM,1,8) ")
					.append("             AND CNK01.CD_TENDYMD >= SUBSTR(TBL1.UPD_DTM,1,8) ")
					.append("             AND CNK01.MK_FLG = '0' ")
					.append("         ) AS TOIAWASE_STAT_NM, ")
					.append("         TBL1.TOIAWASE_UKETUKE_STAT, ")
					.append("         (SELECT CNK02.CD_DIV_NM ")
					.append("            FROM ZM_M_CD_NM_KANRI CNK02 ")
					.append("           WHERE CNK02.CD_SBT_CD = 'CD00233' ")
					.append("             AND CNK02.CD_DIV = TBL1.TOIAWASE_UKETUKE_STAT ")
					.append("             AND CNK02.CD_TSTAYMD <= SUBSTR(TBL1.UPD_DTM,1,8) ")
					.append("             AND CNK02.CD_TENDYMD >= SUBSTR(TBL1.UPD_DTM,1,8) ")
					.append("             AND CNK02.MK_FLG = '0' ")
					.append("         ) AS TOIAWASE_UKETUKE_STAT_NM, ")
					.append("         SUBSTR(TBL1.TAIO_STA_DTM,1,12) AS TAIO_STA_DTM, ")
					.append("         ROWNUM AS ROW_NUM ")
					.append("     FROM( ")
					.append("         SELECT ")
					.append("             TKRK.TAIO_KIROK_NO AS TAIO_KIROK_NO, ")
					.append("             TKRK.TITLE AS TITLE, ")
					.append("             TKRK.TOIAWASE_STAT_CD AS TOIAWASE_STAT_CD, ")
					.append("             TKRK.UPD_DTM AS UPD_DTM, ")
					.append("             TKRK.TOIAWASE_UK_SBT_CD AS TOIAWASE_UKETUKE_STAT, ")
					.append("             TKRK.TAIO_STA_DTM AS TAIO_STA_DTM ")
					.append("         FROM ")
					.append("             CR_T_TAIO_KIROK TKRK ")
					.append("         WHERE ")
					.append("             TKRK.MK_FLG = '0' ");
			// SQL文_個別部1
			//****************** 以降、コーディング修正 START ************************************//
			sql_Buff.append(sql_Buff_whr)
					.append("         ORDER BY TKRK.TAIO_KIROK_NO DESC ")
					.append("         ) TBL1 ")
					.append("     ) TBL2 ")
					.append(" WHERE ")
					.append("      TBL2.ROW_NUM BETWEEN ? AND ? ");
			replaceList.add(inMsg.getObject(ECR0011B010CBSMsg.KEY_START_NUM));
			replaceList.add(inMsg.getObject(ECR0011B010CBSMsg.KEY_END_NUM));
			//****************** 以降、コーディング修正 END ************************************//
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			//****************** 以降、コーディング修正 START ************************************//
			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			if ( JPCModelConstant.FUNC_CD_1.equals( inMsg.getString(ECR0011B010CBSMsg.FUNC_CODE) ) ) {
				for (int idx = 0; idx < replaceList.size(); idx++ ){
					CAANJDBCUtil.setParam(pstmt, idx+1, replaceList.get(idx));
				}
			}
			//****************** 以降、コーディング修正 END ************************************//
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// ECR0011B010CBSMsgの明細にセットする項目
			String[] msgKeyList2 = {
					  ECR0011B010CBSMsg1List.TAIO_KIROK_NO
					, ECR0011B010CBSMsg1List.TITLE
					, ECR0011B010CBSMsg1List.TOIAWASE_STAT_CD
					, ECR0011B010CBSMsg1List.TOIAWASE_STAT_CD_NM
					, ECR0011B010CBSMsg1List.TOIAWASE_UK_SBT_CD
					, ECR0011B010CBSMsg1List.TOIAWASE_UK_SBT_CD_NM
					, ECR0011B010CBSMsg1List.TAIO_STA_DTM
			};
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery,msgKeyList2,"eo.ejb.cbs.cbsmsg.ECR0011B010CBSMsg1List",0);
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("ECR0011B010CBSMsg1List", outMsg1);

			//****************** 以降、コーディング修正 START ************************************//
			// 総検索件数の設定
			inMsg.set(ECR0011B010CBSMsg.TOTAL_SEARCH_NUM, String.valueOf(outMsg1.length));
			//****************** 以降、コーディング修正 END ************************************//

		} catch(SQLException e) {
			inMsg.set(ECR0011B010CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try{
				if(rsltQueryCount != null){
					rsltQueryCount.close();
				}
				if(pstmtCount != null){
					pstmtCount.close();
				}
				if(rsltQuery != null){
					rsltQuery.close();
				}
				if(pstmt != null){
					pstmt.close();
				}
				if(con1 != null){
					closeConnection(con1);
				}
			}catch(SQLException e){
				inMsg.set(ECR0011B010CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
}