/*******************************************************************************
 *	 All Rights reserved,Copyright (c) K-Opticom 
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JSYejbECK0061B001TPDA
 *	ソースファイル名：JSYejbECK0061B001TPDA.java
 *	作成者			：EK103127
 *	日付			：2011年10月04日
 *＜機能概要＞
 *	SQLFacility
 *	テンプレートDBアクセス部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	ｖ1.00.00
 *
 ********************************************************************************/

package eo.ejb.cbs.sqlf;

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.CK0061ETMsg;
import eo.ejb.cbs.cbsmsg.ECK0061B001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0061B001CBSMsg1List;
import eo.ejb.common.JKKejbPagingUtil;
import eo.ejb.common.JZMModelCommon;

/**
 *
 *  テンプレートDBアクセス部品　ECK0061B001_SQLF<br>
 *  入力された項目からSQL文を動的に組み立て、<br>
 *  検索結果をCBSMsgにセットします。<br>
 */
public class JSYejbECK0061B001TPDA extends CAANSQLFacility implements TemplateDBAccessHandler{

	/**
	 * コンストラクタ
	 */
	public JSYejbECK0061B001TPDA()	{
	}

	/**
	 *   ECK0061B001_SQLF<br>
	 *   @param inMsg    入力値の格納されたCBSMsg <br>
	 *   @return void
	 */
	public void invoke(CAANMsg inMsg,AgentDispatchContext inContext){

		// コネクション
		Connection con1 = null;

		// プリペアステートメント
		PreparedStatement pstmt_Count = null;
		PreparedStatement pstmt_Page = null;

		// リザルトセット
		ResultSet rsltQuery_Count = null;
		ResultSet rsltQuery_Page = null;

		// パラメータのカウント
		int iPCnt = 0;

		/******************** 
		 * SQL文の作成
		 ********************/

		try{

			//コネクション取得
			con1 = JSYejbConnection.getConnection(CK0061ETMsg.getTableName());

			// SQL文の作成(ページングヘッダ)
			// (1)
			StringBuffer sql_Buff1 = new StringBuffer();
			sql_Buff1.append("SELECT *  ")
			.append("FROM (  ")
			.append("    SELECT ALL_SELECT.*, ROWNUM AS LINE  ")
			.append("    FROM (  ");

			// SQL文の作成(件数取得用)
			// (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 CK0061.HURYO_CUST_ADD_CD ")
			.append("       ,( SELECT ZM0171_01.CD_DIV_NM ")
			.append("          FROM   ZM_M_CD_NM_KANRI ZM0171_01 ")
			.append("          WHERE  ZM0171_01.CD_SBT_CD = 'CD00256' ")
			.append("            AND  ZM0171_01.CD_DIV = CK0061.HURYO_CUST_ADD_CD ")
			.append("            AND  ZM0171_01.MK_FLG = '0' ")
			.append("        ) AS HURYO_CUST_ADD_CD_NM ")
			.append("       ,CK0061.TAJU_MSKM_GRP_CD ")
			.append("       ,CK0061.HURYO_CUST_KANA ")
			.append("       ,CK0061.HURYO_CUST_NM ")
			.append("       ,CK0061.HURYO_CUST_BIRTHD ")
			.append("       ,CK0061.HURYO_CUST_PCD ")
			.append("       ,CK0061.HURYO_CUST_TELNO ")
			.append("       ,CK0061.HURYO_CUST_MOVE_TELNO ")
			.append("       ,CK0061.HURYO_CUST_JIGYOSHA_CD ")
			.append("       ,( SELECT ZM0171_01.CD_DIV_NM ")
			.append("          FROM   ZM_M_CD_NM_KANRI ZM0171_01 ")
			.append("          WHERE  ZM0171_01.CD_SBT_CD = 'CD00255' ")
			.append("            AND  ZM0171_01.CD_DIV = CK0061.HURYO_CUST_JIGYOSHA_CD ")
			.append("            AND  ZM0171_01.MK_FLG = '0' ")
			.append("        ) AS HURYO_CUST_JIGYOSHA_CD_NM ")
			.append("       ,CK0061.HURYO_CUST_NO ");
			
			// SQL文の作成(FROM句/WHERE句)
			// (4)
			StringBuffer sql_Buff4 = new StringBuffer();
			if ( "1".equals( inMsg.getObject(ECK0061B001CBSMsg.FUNC_CODE).toString() ) ) {

				sql_Buff4.append(" FROM ")
						.append(" CK_T_HURYO_CUST CK0061 ")
						.append(" WHERE ")

				// 無効フラグの設定
				.append(" CK0061.MK_FLG = '0' ");

				// ＫＥＹ＿不良顧客登録コードの設定判定
				if (!inMsg.isNull(ECK0061B001CBSMsg.KEY_HURYO_CUST_ADD_CD)) {
					sql_Buff4.append(" AND CK0061.HURYO_CUST_ADD_CD = ? ");
				}
				// ＫＥＹ＿多重申込グループコードの設定判定
				if (!inMsg.isNull(ECK0061B001CBSMsg.KEY_TAJU_MSKM_GRP_CD)) {
					sql_Buff4.append(" AND CK0061.TAJU_MSKM_GRP_CD = ? ");
				}
				// ＫＥＹ＿不良顧客カナ名の設定判定
				if (!inMsg.isNull(ECK0061B001CBSMsg.KEY_HURYO_CUST_KANA)) {
					sql_Buff4.append(" AND CK0061.HURYO_CUST_KANA LIKE ? ");
					// エスケープ付与
					sql_Buff4.append(JZMModelCommon.ESCAPE_SQL_STRING);
				}
				// ＫＥＹ＿不良顧客名の設定判定
				if (!inMsg.isNull(ECK0061B001CBSMsg.KEY_HURYO_CUST_NM)) {
					sql_Buff4.append(" AND CK0061.HURYO_CUST_NM LIKE ? ");
					// エスケープ付与
					sql_Buff4.append(JZMModelCommon.ESCAPE_SQL_STRING);
				}
				// ＫＥＹ＿不良顧客生年月日の設定判定
				if (!inMsg.isNull(ECK0061B001CBSMsg.KEY_HURYO_CUST_BIRTHD)) {
					sql_Buff4.append(" AND CK0061.HURYO_CUST_BIRTHD = ? ");
				}
				// ＫＥＹ＿不良顧客郵便番号の設定判定
				if (!inMsg.isNull(ECK0061B001CBSMsg.KEY_HURYO_CUST_PCD)) {
					sql_Buff4.append(" AND CK0061.HURYO_CUST_PCD = ? ");
				}
				// ＫＥＹ＿不良顧客電話番号の設定判定
				if (!inMsg.isNull(ECK0061B001CBSMsg.KEY_HURYO_CUST_TELNO)) {
					sql_Buff4.append(" AND CK0061.HURYO_CUST_TELNO = ? ");
				}
				// ＫＥＹ＿不良顧客移動電話番号の設定判定
				if (!inMsg.isNull(ECK0061B001CBSMsg.KEY_HURYO_CUST_MOVE_TELNO)) {
					sql_Buff4.append(" AND CK0061.HURYO_CUST_MOVE_TELNO = ? ");
				}
			}

			// SQL文の作成(ORDER BY句)
			// (5)
			StringBuffer sql_Buff5 = new StringBuffer();
			sql_Buff5.append(" ORDER BY CK0061.HURYO_CUST_ADD_CD ASC ")
			.append("         ,CK0061.HURYO_CUST_KANA ASC ")
			.append("         ,CK0061.HURYO_CUST_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文をセット
			pstmt_Count = con1.prepareStatement(sql_Count.toString());

			//ログ出力(SQL文の出力_件数取得用)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Count);

			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			if ( "1".equals( inMsg.getString(ECK0061B001CBSMsg.FUNC_CODE))) {
				
				// パラメータの設定
				iPCnt = setPram(inMsg, pstmt_Count, iPCnt);
			}

			// ResultSetの取得
			rsltQuery_Count = pstmt_Count.executeQuery();

			// 総検索件数を取得する
			Long iDataCnt = 0L;
			if (rsltQuery_Count.next())
			{
				iDataCnt = rsltQuery_Count.getLong("CNT");
			}

			// 表示件数
			Long iDispNum = inMsg.getStringAsLong(ECK0061B001CBSMsg.DISPLAY_NUM);

			// 表示ページ数
			Long iDispPage = inMsg.getStringAsLong(ECK0061B001CBSMsg.DISPLAY_PAGE_NUM);

			// 総ページ数
			String strMaxPage = JKKejbPagingUtil.calcTotalPage(iDataCnt, iDispNum);

			// 共通部に値を設定する
			// 総検索件数
			inMsg.set(ECK0061B001CBSMsg.TOTAL_SEARCH_NUM, String.valueOf(iDataCnt));

			// 総ページ数
			inMsg.set(ECK0061B001CBSMsg.TOTAL_PAGE_NUM, strMaxPage);

			// 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文をセット
			pstmt_Page = con1.prepareStatement(sql_Page.toString());

			// ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Page);

			// 検索対象を算出する
			long[] iPages = JKKejbPagingUtil.calcSearchRows(iDispPage, iDispNum);
			long iRowSta = iPages[0];
			long iRowEnd = iPages[1];

			// パラメータカウントの初期化
			iPCnt = 0;

			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			if ( "1".equals( inMsg.getString(ECK0061B001CBSMsg.FUNC_CODE))) {
				
				// パラメータの設定
				iPCnt = setPram(inMsg, pstmt_Page, iPCnt);
				// パラメータの設定(検索開始行を指定)
				CAANJDBCUtil.setParam(pstmt_Page, ++iPCnt, iRowSta);
				// パラメータの設定(検索終了行を指定)
				CAANJDBCUtil.setParam(pstmt_Page, ++iPCnt, iRowEnd);
			}

			// ResultSetの取得
			rsltQuery_Page = pstmt_Page.executeQuery();

			// ECK0061B001CBSMsgの明細にセットする項目
			String[] msgKeyList1 = {
					ECK0061B001CBSMsg1List.HURYO_CUST_ADD_CD
					, ECK0061B001CBSMsg1List.HURYO_CUST_ADD_CD_NM
					, ECK0061B001CBSMsg1List.TAJU_MSKM_GRP_CD
					, ECK0061B001CBSMsg1List.HURYO_CUST_KANA
					, ECK0061B001CBSMsg1List.HURYO_CUST_NM
					, ECK0061B001CBSMsg1List.HURYO_CUST_BIRTHD
					, ECK0061B001CBSMsg1List.HURYO_CUST_PCD
					, ECK0061B001CBSMsg1List.HURYO_CUST_TELNO
					, ECK0061B001CBSMsg1List.HURYO_CUST_MOVE_TELNO
					, ECK0061B001CBSMsg1List.HURYO_CUST_JIGYOSHA_CD
					, ECK0061B001CBSMsg1List.HURYO_CUST_JIGYOSHA_CD_NM
					, ECK0061B001CBSMsg1List.HURYO_CUST_NO
			};

			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery_Page,msgKeyList1,"eo.ejb.cbs.cbsmsg.ECK0061B001CBSMsg1List",0);

			// 取得結果が0件の場合は表示ページ該当なしエラー
			if (0L == outMsg1.length)
			{
				inMsg.set(ECK0061B001CBSMsg.SEARCH_ERR_FLG, JPCModelConstant.SEARCH_ERR_FLG_NODATA);
				return;
			}

			// inMsg(CBSMsg)に明細をセット
			inMsg.set("ECK0061B001CBSMsg1List", outMsg1);

		} catch(SQLException e) {
			inMsg.set(ECK0061B001CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try{
				if(rsltQuery_Count != null){
					rsltQuery_Count.close();
				}
				if(rsltQuery_Page != null){
					rsltQuery_Page.close();
				}
				if(pstmt_Count != null){
					pstmt_Count.close();
				}
				if(pstmt_Page != null){
					pstmt_Page.close();
				}
				if(con1 != null){
					closeConnection(con1);
				}
			}catch(SQLException e){
				inMsg.set(ECK0061B001CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}

	/**
	 * <p>
	 * パラメータの設定を行います。
	 * </p>
	 * @param inMsg 入力値の格納されたCBSMsg
	 * @param pstmt プリペアステートメント
	 * @param iPCnt パラメータのカウント
	 * @return iPCnt パラメータのカウント
	 * @exception SQLException
	*/
	private int setPram(CAANMsg inMsg, PreparedStatement pstmt, int iPCnt) throws SQLException
	{
		// パラメータの設定(ＫＥＹ＿不良顧客登録コードを指定)
		if (!inMsg.isNull(ECK0061B001CBSMsg.KEY_HURYO_CUST_ADD_CD)) {
			CAANJDBCUtil.setParam(pstmt, ++iPCnt, inMsg.getObject(ECK0061B001CBSMsg.KEY_HURYO_CUST_ADD_CD));
		}
		// パラメータの設定(ＫＥＹ＿多重申込グループコードを指定)
		if (!inMsg.isNull(ECK0061B001CBSMsg.KEY_TAJU_MSKM_GRP_CD)) {
			CAANJDBCUtil.setParam(pstmt, ++iPCnt, inMsg.getObject(ECK0061B001CBSMsg.KEY_TAJU_MSKM_GRP_CD));
		}
		// パラメータの設定(ＫＥＹ＿不良顧客カナ名を指定)
		if (!inMsg.isNull(ECK0061B001CBSMsg.KEY_HURYO_CUST_KANA)) {

			// LIKE検索文字列置き換え処理
			String keyHuryoCustKana = JZMModelCommon.replaceLikeValue(inMsg.getObject(ECK0061B001CBSMsg.KEY_HURYO_CUST_KANA));

			if ("1".equals(inMsg.getObject((ECK0061B001CBSMsg.KEY_HURYO_CUST_KANA_FLG)))) {
				// 部分一致の場合
				keyHuryoCustKana = "%" + keyHuryoCustKana + "%";
			}else{
				// 前方一致の場合
				keyHuryoCustKana = keyHuryoCustKana + "%";
			}
			CAANJDBCUtil.setParam(pstmt, ++iPCnt, (Object)keyHuryoCustKana);
		}
		// パラメータの設定(ＫＥＹ＿不良顧客名を指定)
		if (!inMsg.isNull(ECK0061B001CBSMsg.KEY_HURYO_CUST_NM)) {

			// LIKE検索文字列置き換え処理
			String keyHuryoCustNm = JZMModelCommon.replaceLikeValue(inMsg.getObject(ECK0061B001CBSMsg.KEY_HURYO_CUST_NM));

			if ("1".equals(inMsg.getObject((ECK0061B001CBSMsg.KEY_HURYO_CUST_NM_FLG)))) {
				// 部分一致の場合
				keyHuryoCustNm = "%" + keyHuryoCustNm + "%";
			}else{
				// 前方一致の場合
				keyHuryoCustNm = keyHuryoCustNm + "%";
			}
			CAANJDBCUtil.setParam(pstmt, ++iPCnt, (Object)keyHuryoCustNm);
		}
		// パラメータの設定(ＫＥＹ＿不良顧客生年月日を指定)
		if (!inMsg.isNull(ECK0061B001CBSMsg.KEY_HURYO_CUST_BIRTHD)) {
			CAANJDBCUtil.setParam(pstmt, ++iPCnt, inMsg.getObject(ECK0061B001CBSMsg.KEY_HURYO_CUST_BIRTHD));
		}
		// パラメータの設定(ＫＥＹ＿不良顧客郵便番号を指定)
		if (!inMsg.isNull(ECK0061B001CBSMsg.KEY_HURYO_CUST_PCD)) {
			CAANJDBCUtil.setParam(pstmt, ++iPCnt, inMsg.getObject(ECK0061B001CBSMsg.KEY_HURYO_CUST_PCD));
		}
		// パラメータの設定(ＫＥＹ＿不良顧客電話番号を指定)
		if (!inMsg.isNull(ECK0061B001CBSMsg.KEY_HURYO_CUST_TELNO)) {
			CAANJDBCUtil.setParam(pstmt, ++iPCnt, inMsg.getObject(ECK0061B001CBSMsg.KEY_HURYO_CUST_TELNO));
		}
		// パラメータの設定(ＫＥＹ＿不良顧客移動電話番号を指定)
		if (!inMsg.isNull(ECK0061B001CBSMsg.KEY_HURYO_CUST_MOVE_TELNO)) {
			CAANJDBCUtil.setParam(pstmt, ++iPCnt, inMsg.getObject(ECK0061B001CBSMsg.KEY_HURYO_CUST_MOVE_TELNO));
		}
		return iPCnt;
	}
}
