/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JSYejbEDK0301B030TPDA
*	ソースファイル名：JSYejbEDK0301B030TPDA.java
*	作成者			：EK909139
*	日付			：2011年07月09日
*＜機能概要＞
*	返品エラーリスト一覧照会テンプレートDBアクセス部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*
********************************************************************************/

package eo.ejb.cbs.sqlf;

import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANSQLFacility;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
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.TemplateDBAccessHandler;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import static eo.common.util.JDKCommonUtil.*;
import static eo.common.constant.JPCModelConstant.*;
import eo.ejb.cbs.cbsmsg.EDK0301B030CBSMsg;
import eo.ejb.cbs.cbsmsg.EDK0301B030CBSMsg1List;
import eo.ejb.cbm.entity.DK0321ETMsg;
import eo.ejb.common.JDKModelCommon;
import static eo.ejb.common.JDKModelCommon.*;
import static eo.common.constant.JZM0171Constant.*;

/**
*
*  テンプレートDBアクセス部品　EDK0301B030_SQLF<br>
*  入力された項目からSQL文を動的に組み立て、<br>
*  検索結果をCBSMsgにセットします。<br>
*/
public class JSYejbEDK0301B030TPDA extends CAANSQLFacility implements TemplateDBAccessHandler{
	
	/**
	 * コンストラクタ
	 */
	public JSYejbEDK0301B030TPDA()	{
	}
	
	/**
	 * 取得項目一覧
	 */
	private static String[] MSG_KEY_LIST = {
			  EDK0301B030CBSMsg1List.HMPIN_SBT_CD
			, EDK0301B030CBSMsg1List.HMPIN_SBT_NM
			, EDK0301B030CBSMsg1List.HMPIN_UK_YMD
			, EDK0301B030CBSMsg1List.TAKNKIKI_MODEL_CD
			, EDK0301B030CBSMsg1List.KIKI_SEIZO_NO
			, EDK0301B030CBSMsg1List.SHUKKA_LOT_NO
			, EDK0301B030CBSMsg1List.SVC_KEI_NO
			, EDK0301B030CBSMsg1List.KOJIAK_NO
			, EDK0301B030CBSMsg1List.HMPIN_RSN_CD
			, EDK0301B030CBSMsg1List.HMPIN_RSN_NM
			, EDK0301B030CBSMsg1List.HMPIN_RSN_MEMO
			, EDK0301B030CBSMsg1List.GDS_STAT_CD
			, EDK0301B030CBSMsg1List.GDS_STAT_NM
			, EDK0301B030CBSMsg1List.GOODS_NM
			, EDK0301B030CBSMsg1List.HMPINSHA_PCD
			, EDK0301B030CBSMsg1List.HMPINSHA_STATE_NM
			, EDK0301B030CBSMsg1List.HMPINSHA_CITY_NM
			, EDK0301B030CBSMsg1List.HMPINSHA_OAZTSU_NM
			, EDK0301B030CBSMsg1List.HMPINSHA_AZCHO_NM
			, EDK0301B030CBSMsg1List.HMPINSHA_BNCHIGO
			, EDK0301B030CBSMsg1List.HMPINSHA_ADRTTM
			, EDK0301B030CBSMsg1List.HMPINSHA_ADRRM
			, EDK0301B030CBSMsg1List.HMPINSHA_TELNO
			, EDK0301B030CBSMsg1List.HMPINSHA_NM
			, EDK0301B030CBSMsg1List.KEISHA_NM
			, EDK0301B030CBSMsg1List.RENT_DSL_MSKMSHO_UM
			, EDK0301B030CBSMsg1List.WMS_HMPIN_NO
			, EDK0301B030CBSMsg1List.HMPIN_REC_SEQ
			, EDK0301B030CBSMsg1List.HMPIN_ERR_SEQ
			, EDK0301B030CBSMsg1List.HMPIN_KIKI_ERR_CD
			, EDK0301B030CBSMsg1List.HMPIN_KIKI_ERR_NM
	};
	

	public void invoke(CAANMsg inMsg,AgentDispatchContext inContext){
		if ("1".equals( inMsg.getString(EDK0301B030CBSMsg.FUNC_CODE) )) 
		{
			invokeFindLimited(inMsg, inContext);
		}
		else if ("2".equals( inMsg.getString(EDK0301B030CBSMsg.FUNC_CODE) ))
		{
			invokeFindAll(inMsg, inContext);
		}
	}

	
	/**
	*   EDK0301B030_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @return void
	*/
	public void invokeFindLimited(CAANMsg inMsg,AgentDispatchContext inContext){
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmtForCount = null;
		PreparedStatement pstmtForFetch = null;
		
		// リザルトセット
		ResultSet rsltQueryForCount = null;
		ResultSet rsltQueryForFetch = null;
		
		/******************** 
		 * SQL文の作成
		 ********************/

		try{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(DK0321ETMsg.getTableName());
			String sql = makeSqlForCount(makeSql());
			
			//prepareStatementにSQL文をセット
			pstmtForCount = con1.prepareStatement(sql);
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql);
			
			// ResultSetの取得
			rsltQueryForCount = pstmtForCount.executeQuery();
			
			// EDK0301B020CBSMsgの明細にセットする項目
			String[] msgKeyList1 = {
					EDK0301B030CBSMsg.TOTAL_SEARCH_NUM
			};
			
			rsltQueryForCount.next();
			mapMessage(rsltQueryForCount, msgKeyList1, inMsg);
			
			
			
			// 総ページ数設定
			int iTotal = Integer.parseInt(inMsg.getString(EDK0301B030CBSMsg.TOTAL_SEARCH_NUM));
			// 検索件数が最大検索件数を超えた場合、エラーフラグに"2"を設定する
			// 最大検索件数分の取得を保障するために検索処理は続行する
			if (Integer.parseInt(inMsg.getString(EDK0301B030CBSMsg.MAX_SEARCH_NUM)) < iTotal)
			{
				inMsg.set(EDK0301B030CBSMsg.SEARCH_ERR_FLG, SEARCH_ERR_FLG_OVERMAX);
				iTotal = Integer.parseInt(inMsg.getString(EDK0301B030CBSMsg.MAX_SEARCH_NUM));
			}
			
			int iDispNum = Integer.parseInt(inMsg.getString(EDK0301B030CBSMsg.DISPLAY_NUM));
			int iSearchDivDisp =  iTotal / iDispNum;
			int iRest =  iTotal % iDispNum;
			// 割り切れない場合は総ページ数を増やす
			if (0 != iRest)
			{
				iSearchDivDisp = iSearchDivDisp + 1;
			}
			inMsg.set(EDK0301B030CBSMsg.TOTAL_PAGE_NUM, Integer.toString(iSearchDivDisp));
			
			// 検索件数が0件の場合、エラーフラグに"1"を設定して処理終了
			if (0 == (Integer.parseInt(inMsg.getString(EDK0301B030CBSMsg.TOTAL_SEARCH_NUM))))
			{
				inMsg.set(EDK0301B030CBSMsg.SEARCH_ERR_FLG, SEARCH_ERR_FLG_ZERO);
				return;
			}

			
			
			int iDispPageNum = Integer.parseInt(inMsg.getString(EDK0301B030CBSMsg.DISPLAY_PAGE_NUM));
			int iStartNum = iDispNum * (iDispPageNum - 1) + 1;
			int iEndNum = iDispNum * iDispPageNum;
			if (iEndNum > iTotal)
			{
				iEndNum = iTotal;
			}
			if (iSearchDivDisp < iDispPageNum)
			{
				inMsg.set(EDK0301B030CBSMsg.SEARCH_ERR_FLG, SEARCH_ERR_FLG_NODATA);
				return;
			}
			
			// 範囲検索開始
			sql = makeSqlForRealm(makeSql(), "col", "row_num");
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql);

			pstmtForFetch = con1.prepareStatement(sql);
			
			// ページング項目（検索処理パターン）
			int index = 1;
			// パラメータの設定(画面表示データ開始レコード行を指定)
			CAANJDBCUtil.setParam(pstmtForFetch, index++, iStartNum);
			// パラメータの設定(画面表示データ終了レコード行を指定)
			CAANJDBCUtil.setParam(pstmtForFetch, index++, iEndNum);
			
			// ResultSetの取得
			rsltQueryForFetch = pstmtForFetch.executeQuery();

			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQueryForFetch,MSG_KEY_LIST,"eo.ejb.cbs.cbsmsg.EDK0301B030CBSMsg1List",0);
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("EDK0301B030CBSMsg1List", outMsg1);
			
		} catch(SQLException e) {
			inMsg.set(EDK0301B030CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try{
				SQLException e = JDKModelCommon.close(pstmtForCount, pstmtForFetch, rsltQueryForCount, rsltQueryForFetch);
				if(con1 != null){
					closeConnection(con1);
				}
				if (e != null)
				{
					throw e;
				}
			}catch(SQLException e){
				inMsg.set(EDK0301B030CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}

	
	/**
	*   EDK0301B030_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @return void
	*/
	public void invokeFindAll(CAANMsg inMsg,AgentDispatchContext inContext){
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		/******************** 
		 * SQL文の作成
		 ********************/

		try{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(DK0321ETMsg.getTableName());
			
			String sql = makeSql();
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql);
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql);
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery,MSG_KEY_LIST,"eo.ejb.cbs.cbsmsg.EDK0301B030CBSMsg1List",0);
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("EDK0301B030CBSMsg1List", outMsg1);
			
			if (outMsg1.length == 0)
			{
				inMsg.set(EDK0301B030CBSMsg.SEARCH_ERR_FLG, SEARCH_ERR_FLG_ZERO);
			}

		} catch(SQLException e) {
			inMsg.set(EDK0301B030CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try{
				SQLException e = JDKModelCommon.close(pstmt, rsltQuery);
				if(con1 != null){
					closeConnection(con1);
				}
				if (e != null)
				{
					throw e;
				}
			}catch(SQLException e){
				inMsg.set(EDK0301B030CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
	
	
	/**
	 * SQLを生成します。
	 * @return SQL
	 */
	private String makeSql()
	{
		// SQL文_基本部1
		StringBuffer sql_Buff = new StringBuffer();
		sql_Buff.append(" SELECT ")
				.append("   HMPIN.HMPIN_SBT_CD         COL_HMPIN_SBT_CD, ")
				.append(    cdNoYmd(CD00292, "HMPIN.HMPIN_SBT_CD", COMMA.RIGHT, "COL_HMPIN_SBT_NM"))
				.append("   HMPIN.HMPIN_KURAIRE_YMD    COL_HMPIN_UK_YMD, ")
				.append("   NVL(HMPIN.TAKNKIKI_MODEL_CD, HMPIN.HUZOKUHIN_MODEL_CD) ")
				.append("                              COL_TAKNKIKI_MODEL_CD, ")
				.append("   HMPIN.KIKI_SEIZO_NO        COL_KIKI_SEIZO_NO, ")
				.append("   HMPIN.LOAD_SHKA_LOT_NO     COL_SHUKKA_LOT_NO, ")
				.append("   HMPIN.LOAD_OYA_SVKEI_NO    COL_SVC_KEI_NO, ")
				.append("   HMPIN.KOJIAK_NO            COL_KOJIAK_NO, ")
				.append("   HMPIN.HMPIN_RSN_CD         COL_HMPIN_RSN_CD, ")
				.append(    cdNoYmd(CD00293, "HMPIN.HMPIN_RSN_CD", COMMA.RIGHT, "COL_HMPIN_RSN_NM"))
				.append("   HMPIN.HMPIN_RSN_MEMO       COL_HMPIN_RSN_MEMO, ")
				.append("   HMPIN.GDS_STAT_CD          COL_GDS_STAT_CD, ")
				.append(    cdNoYmd(CD00274, "HMPIN.GDS_STAT_CD", COMMA.RIGHT, "COL_GDS_STAT_NM"))
				.append("   ZM0411.TAKNKIKI_MODEL_NM   COL_GOODS_NM, ")
				.append("   HMPIN.HMPINSHA_PCD         COL_HMPINSHA_PCD, ")
				.append("   HMPIN.HMPINSHA_STATE_NM    COL_HMPINSHA_STATE_NM, ")
				.append("   HMPIN.HMPINSHA_CITY_NM     COL_HMPINSHA_CITY_NM, ")
				.append("   HMPIN.HMPINSHA_OAZTSU_NM   COL_HMPINSHA_OAZTSU_NM, ")
				.append("   HMPIN.HMPINSHA_AZCHO_NM    COL_HMPINSHA_AZCHO_NM, ")
				.append("   HMPIN.HMPINSHA_BNCHIGO     COL_HMPINSHA_BNCHIGO, ")
				.append("   HMPIN.HMPINSHA_ADRTTM      COL_HMPINSHA_ADRTTM, ")
				.append("   HMPIN.HMPINSHA_ADRRM       COL_HMPINSHA_ADRRM, ")
				.append("   HMPIN.HMPINSHA_TELNO       COL_HMPINSHA_TELNO, ")
				.append("   HMPIN.HMPINSHA_NM          COL_HMPINSHA_NM, ")
				.append("   HMPIN.HMPIN_MT_KSH_NM      COL_KEISHA_NM, ")
				.append("   HMPIN.RENT_DSL_MSKMSHO_UM  COL_RENT_DSL_MSKMSHO_UM, ")
				.append("   HMPIN.WMS_HMPIN_NO         COL_WMS_HMPIN_NO, ")
				.append("   HMPIN.WMS_REC_SEQ          COL_WMS_REC_SEQ, ")
				.append("   ERR.HMPIN_ERR_SEQ          COL_HMPIN_ERR_SEQ, ")
				.append("   ERR.HMPIN_KIKI_ERR_CD      COL_HMPIN_KIKI_ERR_CD, ")
				.append(    cdNoYmd(CD00294, "ERR.HMPIN_KIKI_ERR_CD", COMMA.NONE, "COL_HMPIN_KIKI_ERR_NM"))
				.append(" FROM DK_T_HMPIN_ERR ERR ")
				.append("   INNER JOIN DK_T_HMPIN_KIKI HMPIN ")
				.append("     ON  ERR.HMPIN_KIKI_NO = HMPIN.HMPIN_KIKI_NO ")
				.append("     AND HMPIN.MK_FLG = '0' ")
				.append("   LEFT OUTER JOIN ZM_M_TAKNKIKI_MODEL ZM0411 ")
				.append("     ON  ZM0411.TAKNKIKI_MODEL_CD = HMPIN.TAKNKIKI_MODEL_CD ")
				.append("     AND ZM0411.MK_FLG = '0' ")
				.append(" WHERE ")
				.append("     ERR.MK_FLG = '0' ")
				.append(" ORDER BY ")
				.append("     HMPIN.HMPIN_KURAIRE_YMD DESC,  ")
				.append("     HMPIN.WMS_HMPIN_NO DESC, ")
				.append("     HMPIN.LOAD_OYA_SVKEI_NO ASC, ")
				.append("     NVL(HMPIN.TAKNKIKI_MODEL_CD, HMPIN.HUZOKUHIN_MODEL_CD) ASC ");
		
		return sql_Buff.toString();
	}
}
