/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JSYejbEKK0341B006TPDA
*	ソースファイル名：JSYejbEKK0341B006TPDA.java
*	作成者			：EK912305
*	日付			：2012年11月19日
*＜機能概要＞
*	SQLFacility
*	テンプレートDBアクセス部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*
********************************************************************************/

package eo.ejb.cbs.sqlf;

import static eo.ejb.common.JDKModelCommon.cd;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

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.ejb.cbm.entity.KK0341ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B006CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B006CBSMsg1List;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKejbPagingUtil;

/**
*
*  テンプレートDBアクセス部品　EKK0341B006_SQLF<br>
*  入力された項目からSQL文を動的に組み立て、<br>
*  検索結果をCBSMsgにセットします。<br>
*/
public class JSYejbEKK0341B006TPDA extends CAANSQLFacility implements TemplateDBAccessHandler{

	/**
	 * コンストラクタ
	 */
	public JSYejbEKK0341B006TPDA()	{
	}

	/**
	*   EKK0341B006_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @return void
	*/
	public void invoke(CAANMsg inMsg,AgentDispatchContext inContext){

		// コネクション
		Connection con1 = null;

		// プリペアステートメント
		PreparedStatement pstmtForCount = null;
		PreparedStatement pstmtForFetch = null;

		// リザルトセット
		ResultSet rsltQueryForCount = null;
		ResultSet rsltQueryForFetch = null;

		/* ++++++++++ ｖ1.00.00 追加開始 ++++++++++ */
		/***************************************************** 
		 * サービスインターフェイス共通部の必須チェック
		 *****************************************************/
		
		// 最大検索件数、表示件数、表示ページ番号が未設定の場合
		// 例外をスローする
		if (inMsg.isNull(EKK0341B006CBSMsg.MAX_SEARCH_NUM)
				|| inMsg.isNull(EKK0341B006CBSMsg.DISPLAY_NUM)
				|| inMsg.isNull(EKK0341B006CBSMsg.DISPLAY_PAGE_NUM))
		{
			throw new IllegalArgumentException("サービスインターフェイス共通部の最大検索件数、表示件数は必須項目です。");
		}
		/* ++++++++++ ｖ1.00.00 追加終了 ++++++++++ */

		/******************** 
		 * SQL文の作成
		 ********************/

		try{

			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0341ETMsg.getTableName());

			// SQL文の作成(ページングヘッダ)
			// (1)
			StringBuffer sql_Buff1 = new StringBuffer();
			sql_Buff1.append("SELECT *  ")
					.append("FROM (  ")
					.append("    SELECT ALL_SELECT.*, ROWNUM AS LINE  ")
					.append("    FROM (  ");

			// SQL文の作成(COUNT用)
			// (2)
			StringBuffer sql_Buff2 = new StringBuffer();
			sql_Buff2.append(" SELECT  ")
					.append("     COUNT(*) AS CNT  ");

			// SQL文の作成(項目取得用)
			// (3)
			StringBuffer sql_Buff3 = new StringBuffer();
			sql_Buff3.append(" SELECT")
					.append("    DK0301.HMPIN_DIV")
					.append(     cd("CD00291", "DK0301.HMPIN_DIV", "HMPIN_DIV_NM"))
					.append("    , DK0301.LOAD_OYA_SVKEI_NO SVC_KEI_NO")
					.append("    , DK0301.KOJIAK_NO")
					.append("    , DK0301.KIKI_SEIZO_NO")
					.append("    , DK0301.TAKNKIKI_MODEL_CD")
					.append("    , DK0301.HUZOKUHIN_MODEL_CD")
					.append("    , DK0301.KKTK_SVC_KEI_NO")
					.append("    , KK0341.KKTK_SBT_CD")
					.append(     cd("CD00212", "KK0341.KKTK_SBT_CD", "KKTK_SBT_CD_NM"))
					.append("    , DK0301.HMPINSHA_AD_CD")
					.append("    , DK0301.HMPINSHA_PCD")
					.append("    , DK0301.HMPINSHA_TELNO")
					.append("    , DK0301.HMPINSHA_STATE_NM")
					.append("    , DK0301.HMPINSHA_CITY_NM")
					.append("    , DK0301.HMPINSHA_OAZTSU_NM")
					.append("    , DK0301.HMPINSHA_AZCHO_NM")
					.append("    , DK0301.HMPINSHA_BNCHIGO")
					.append("    , DK0301.HMPINSHA_ADRTTM")
					.append("    , DK0301.HMPINSHA_ADRRM")
					.append("    , DK0301.HMPINSHA_NM")
					.append("    , DK0301.HMPINSHA_AD_MAN_INPUT_FLG");

			// SQL文の作成(FROM句、WHERE句)
			// (4)
			StringBuffer sql_Buff4 = new StringBuffer();
			sql_Buff4.append(" FROM DK_T_HMPIN_KIKI DK0301")
					.append(" INNER JOIN KK_T_KKTK_SVC_KEI KK0341")
					.append("     ON DK0301.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO")
					.append("         AND DK0301.KIKI_CHG_NO = KK0341.KIKI_CHG_NO")
					.append("         AND KK0341.GENE_ADD_DTM = (SELECT")
					.append("                 MAX(KK0341_GENE.GENE_ADD_DTM) AS KK0341_MAX")
					.append("             FROM KK_T_KKTK_SVC_KEI KK0341_GENE")
					.append("             WHERE KK0341_GENE.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO")
					.append("                 AND KK0341_GENE.KIKI_CHG_NO = KK0341.KIKI_CHG_NO")
					.append("                 AND KK0341_GENE.MK_FLG = '0')")
					.append("         AND KK0341.MK_FLG = '0'")
					.append(" WHERE DK0301.HMPIN_KIKI_STAT = '001'")
					.append("     AND DK0301.HMPIN_DIV IN ('1', '2', '3', '5')")
					.append("     AND DK0301.MK_FLG = '0'");

			if ("1".equals(inMsg.getObject(EKK0341B006CBSMsg.FUNC_CODE).toString()))
			{
				sql_Buff4.append("     AND DK0301.KIKI_SEIZO_NO = ?");
			}
			else if ("2".equals(inMsg.getObject(EKK0341B006CBSMsg.FUNC_CODE).toString()))
			{
				sql_Buff4.append("     AND DK0301.LOAD_OYA_SVKEI_NO = ?");
			}
			else if ("3".equals(inMsg.getObject(EKK0341B006CBSMsg.FUNC_CODE).toString()))
			{
				sql_Buff4.append("     AND DK0301.KOJIAK_NO = ?");
			}

			// SQL文の作成(ORDER BY句)
			// (5)
			StringBuffer sql_Buff5 = new StringBuffer();
			sql_Buff5.append(" ORDER BY")
					.append("    DK0301.LOAD_OYA_SVKEI_NO DESC")
					.append("    , DK0301.TAKNKIKI_MODEL_CD DESC")
					.append("    , DK0301.KKTK_SVC_KEI_NO ASC");

			// SQL文の作成(ページングフッタ)
			// (6)
			StringBuffer sql_Buff6 = new StringBuffer();
			sql_Buff6.append("    ) ALL_SELECT  ")
					.append(") PAGE_SELECT  ")
					.append("WHERE PAGE_SELECT.LINE BETWEEN ? AND ?  ")
					.append("ORDER BY PAGE_SELECT.LINE ASC  ");

			// SQL文の組立て(件数取得用) (2) + (4)
			StringBuffer sql_Count = new StringBuffer();
			sql_Count.append(sql_Buff2)
					.append(sql_Buff4);

			//prepareStatementにSQL文をセット
			pstmtForCount = con1.prepareStatement(sql_Count.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Count);

			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			int paramIdx = 1;
			if ("1".equals(inMsg.getObject(EKK0341B006CBSMsg.FUNC_CODE).toString()))
			{
				CAANJDBCUtil.setParam(pstmtForCount, paramIdx++, inMsg.getObject(EKK0341B006CBSMsg.KEY_KIKI_SEIZO_NO));
			}
			else if ("2".equals(inMsg.getObject(EKK0341B006CBSMsg.FUNC_CODE).toString()))
			{
				CAANJDBCUtil.setParam(pstmtForCount, paramIdx++, inMsg.getObject(EKK0341B006CBSMsg.KEY_SVC_KEI_NO));
			}
			else if ("3".equals(inMsg.getObject(EKK0341B006CBSMsg.FUNC_CODE).toString()))
			{
				CAANJDBCUtil.setParam(pstmtForCount, paramIdx++, inMsg.getObject(EKK0341B006CBSMsg.KEY_KOJIAK_NO));
			}

			// ResultSetの取得
			rsltQueryForCount = pstmtForCount.executeQuery();

			// 総検索件数を取得する
			long lDataCnt = 0L;
			if (rsltQueryForCount.next())
			{
				lDataCnt = rsltQueryForCount.getLong("CNT");
			}

			// 表示件数
			long lDispNum = inMsg.getStringAsLong(EKK0341B006CBSMsg.DISPLAY_NUM);

			// 表示ページ数
			long lDispPage = inMsg.getStringAsLong(EKK0341B006CBSMsg.DISPLAY_PAGE_NUM);

			// 最大取得件数
			long lMaxNum = inMsg.getStringAsLong(EKK0341B006CBSMsg.MAX_SEARCH_NUM);

			// 総ページ数
			String strMaxPage = JKKejbPagingUtil.calcTotalPage(lDataCnt, lDispNum);

			// 共通部に値を設定する
			inMsg.set(EKK0341B006CBSMsg.TOTAL_SEARCH_NUM, String.valueOf(lDataCnt));   // 総検索件数
			inMsg.set(EKK0341B006CBSMsg.TOTAL_PAGE_NUM, strMaxPage);   // 総ページ数

			// データ取得件数が0件の場合エラー
			if (0L == lDataCnt)
			{
				inMsg.set(EKK0341B006CBSMsg.SEARCH_ERR_FLG, JPCModelConstant.SEARCH_ERR_FLG_ZERO);
				return;
			}

			// 最大取得件数を超えた場合エラー
			if (lDataCnt > lMaxNum)
			{
				inMsg.set(EKK0341B006CBSMsg.SEARCH_ERR_FLG, JPCModelConstant.SEARCH_ERR_FLG_OVERMAX);
				return;
			}

			// SQL文の組立て(項目取得・ページング用) (1) + (3) + (4) + (5) + (6)
			StringBuffer sql_Page = new StringBuffer();
			sql_Page.append(sql_Buff1)
					.append(sql_Buff3)
					.append(sql_Buff4)
					.append(sql_Buff5)
					.append(sql_Buff6);

			//prepareStatementにSQL文をセット
			pstmtForFetch = con1.prepareStatement(sql_Page.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Page);

			// 検索対象行を算出する
			long[] lPages = JKKejbPagingUtil.calcSearchRows(lDispPage, lDispNum);
			long lRowSta = lPages[0];
			long lRowEnd = lPages[1];

			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			paramIdx = 1;
			String opeDate = JKKModelCommon.getOpeDate(inMsg);
			CAANJDBCUtil.setParam(pstmtForFetch, paramIdx++, opeDate);
			CAANJDBCUtil.setParam(pstmtForFetch, paramIdx++, opeDate);
			if ("1".equals(inMsg.getObject(EKK0341B006CBSMsg.FUNC_CODE).toString()))
			{
				CAANJDBCUtil.setParam(pstmtForFetch, paramIdx++, inMsg.getObject(EKK0341B006CBSMsg.KEY_KIKI_SEIZO_NO));
			}
			else if ("2".equals(inMsg.getObject(EKK0341B006CBSMsg.FUNC_CODE).toString()))
			{
				CAANJDBCUtil.setParam(pstmtForFetch, paramIdx++, inMsg.getObject(EKK0341B006CBSMsg.KEY_SVC_KEI_NO));
			}
			else if ("3".equals(inMsg.getObject(EKK0341B006CBSMsg.FUNC_CODE).toString()))
			{
				CAANJDBCUtil.setParam(pstmtForFetch, paramIdx++, inMsg.getObject(EKK0341B006CBSMsg.KEY_KOJIAK_NO));
			}
			CAANJDBCUtil.setParam(pstmtForFetch, paramIdx++, lRowSta);
			CAANJDBCUtil.setParam(pstmtForFetch, paramIdx++, lRowEnd);

			// ResultSetの取得
			rsltQueryForFetch = pstmtForFetch.executeQuery();

			// EKK0341B006CBSMsgの明細にセットする項目
			String[] msgKeyList1 = {
					  EKK0341B006CBSMsg1List.HMPIN_DIV
					, EKK0341B006CBSMsg1List.HMPIN_DIV_NM
					, EKK0341B006CBSMsg1List.SVC_KEI_NO
					, EKK0341B006CBSMsg1List.KOJIAK_NO
					, EKK0341B006CBSMsg1List.KIKI_SEIZO_NO
					, EKK0341B006CBSMsg1List.TAKNKIKI_MODEL_CD
					, EKK0341B006CBSMsg1List.HUZOKUHIN_MODEL_CD
					, EKK0341B006CBSMsg1List.KKTK_SVC_KEI_NO
					, EKK0341B006CBSMsg1List.KKTK_SBT_CD
					, EKK0341B006CBSMsg1List.KKTK_SBT_CD_NM
					, EKK0341B006CBSMsg1List.HMPINSHA_AD_CD
					, EKK0341B006CBSMsg1List.HMPINSHA_PCD
					, EKK0341B006CBSMsg1List.HMPINSHA_TELNO
					, EKK0341B006CBSMsg1List.HMPINSHA_STATE_NM
					, EKK0341B006CBSMsg1List.HMPINSHA_CITY_NM
					, EKK0341B006CBSMsg1List.HMPINSHA_OAZTSU_NM
					, EKK0341B006CBSMsg1List.HMPINSHA_AZCHO_NM
					, EKK0341B006CBSMsg1List.HMPINSHA_BNCHIGO
					, EKK0341B006CBSMsg1List.HMPINSHA_ADRTTM
					, EKK0341B006CBSMsg1List.HMPINSHA_ADRRM
					, EKK0341B006CBSMsg1List.HMPINSHA_NM
					, EKK0341B006CBSMsg1List.HMPINSHA_AD_MAN_INPUT_FLG
			};

			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQueryForFetch, msgKeyList1, "eo.ejb.cbs.cbsmsg.EKK0341B006CBSMsg1List", 0);

			// 取得結果が0件の場合は表示ページ該当なしエラー
			if (0 >= outMsg1.length)
			{
				inMsg.set(EKK0341B006CBSMsg.SEARCH_ERR_FLG, JPCModelConstant.SEARCH_ERR_FLG_NODATA);
				return;
			}

			// inMsg(CBSMsg)に明細をセット
			inMsg.set("EKK0341B006CBSMsg1List", outMsg1);

		} catch(SQLException e) {
			inMsg.set(EKK0341B006CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try{
				if(rsltQueryForCount != null){
					rsltQueryForCount.close();
				}
				if(rsltQueryForFetch != null){
					rsltQueryForFetch.close();
				}
				if(pstmtForCount != null){
					pstmtForCount.close();
				}
				if(pstmtForFetch != null){
					pstmtForFetch.close();
				}
				if(con1 != null){
					closeConnection(con1);
				}
			}catch(SQLException e){
				inMsg.set(EKK0341B006CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
}
