/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JSYejbEDK0011B070TPDA
*	ソースファイル名：JSYejbEDK0011B070TPDA.java
*	作成者			：EK908580
*	日付			：2011年06月15日
*＜機能概要＞
*	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.DK0011ETMsg;
import eo.ejb.cbs.cbsmsg.EDK0011B070CBSMsg;
import eo.ejb.cbs.cbsmsg.EDK0011B070CBSMsg1List;
import eo.ejb.common.JDKModelCommon;
import eo.ejb.common.JDKModelCommon.COMMA;
import static eo.ejb.common.JDKModelCommon.*;
import static eo.common.constant.JZM0171Constant.*;

/**
*
*  テンプレートDBアクセス部品　EDK0011B070_SQLF<br>
*  入力された項目からSQL文を動的に組み立て、<br>
*  検索結果をCBSMsgにセットします。<br>
*/
public class JSYejbEDK0011B070TPDA extends CAANSQLFacility implements TemplateDBAccessHandler{
	
	/**
	 * コンストラクタ
	 */
	public JSYejbEDK0011B070TPDA()	{
	}
	
	/**
	*   EDK0011B070_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;
		
		/******************** 
		 * SQL文の作成
		 ********************/

		try{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(DK0011ETMsg.getTableName());
			
			
			// SQL文_基本部1
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("     HAISO.HAISO_NO ")
					.append("     , HAISO_TG_BPIN.HAISO_TAIBPIN_NO ")
					.append("     , HAISO.HISOS_KSITEI_FLG ")
					.append("     , HAISO.HISOS_PCD ")
					.append("     , HAISO.HISOS_STATE_NM ")
					.append("     , HAISO.HISOS_CITY_NM ")
					.append("     , HAISO.HISOS_OAZTSU_NM ")
					.append("     , HAISO.HISOS_AZCHO_NM ")
					.append("     , HAISO.HISOS_BNCHIGO ")
					.append("     , HAISO.HISOS_ADRTTM ")
					.append("     , HAISO.HISOS_ADRRM ")
					.append("     , HAISO.HISOS_STATE_NM || HAISO.HISOS_CITY_NM || ")
					.append("         HAISO.HISOS_OAZTSU_NM || HAISO.HISOS_AZCHO_NM || ")
					.append("         HAISO.HISOS_BNCHIGO || HAISO.HISOS_ADRTTM || ")
					.append("         HAISO.HISOS_ADRRM AS HAISOS_AD ")
					.append("     , HAISO.HISOS_TELNO ")
					.append("     , CASE HAISO.IDOMOTO_KRIPLACE_SKCD  ")
					.append("         WHEN '1' THEN SOKO.SOKO_NM ")
					.append("         WHEN '2' THEN KOJI_COMP.KOJI_COMP_NM ")
					.append("         WHEN '3' THEN YTK_SK_OFFC.YOTAKU_SAKI_OFFC_NM ")
					.append("         END  AS SOKO_NM ")
					.append(        cdNoYmd(
							CD00544,
							"DECODE(HAISO.IDOMOTO_KRIPLACE_SKCD , '1' , HAISO_TG_BPIN.HAISO_MOTO_SKDN_CD , "
									+ " '2', HAISO_TG_BPIN.IDOMOTO_KOCOMP_SLF_CD , "
									+ " '3', HAISO_TG_BPIN.IDOMOTO_YTKSKOF_SLF_CD , "
									+ " HAISO_TG_BPIN.HAISO_MOTO_SKDN_CD)",
							COMMA.LEFT,
							"SHELF_NM"))
					.append("     , CASE HAISO.IDOMOTO_KRIPLACE_SKCD  ")
					.append("         WHEN '1' THEN SOKO.SOKO_TELNO ")
					.append("         WHEN '2' THEN KOJI_COMP.KOJI_COMP_TLN ")
					.append("         WHEN '3' THEN YTK_SK_OFFC.OFFC_TLN ")
					.append("         END  AS SOKO_TELNO ")
					.append("     , CASE HAISO.IDOMOTO_KRIPLACE_SKCD  ")
					.append("         WHEN '1' THEN SOKO.SOKO_FAX_NO ")
					.append("         WHEN '2' THEN KOJI_COMP.KOJI_COMP_FAX_NO ")
					.append("         WHEN '3' THEN YTK_SK_OFFC.OFFC_FAX_NO ")
					.append("         END  AS SOKO_FAXNO ")
					.append("     , MKR.MAKER_NM_1 ")
					.append("     , HAISO_TG_BPIN.KIKI_SEIZO_NO ")
					.append("     , 1 AS CNT ")
					.append("     , HAISO_TG_BPIN.KIKI_HUKA_INFO_CD ")
					.append(      cd(CD00866, "HAISO_TG_BPIN.KIKI_HUKA_INFO_CD", "KIKI_HUKA_INFO_NM"))
					.append("     , HAISO.IDOMOTO_KRIPLACE_SKCD ")
					.append(" FROM DK_T_HAISO HAISO ")
					.append("     INNER JOIN DK_T_HAISO_TG_BPIN HAISO_TG_BPIN ")
					.append("       ON HAISO.HAISO_NO = HAISO_TG_BPIN.HAISO_NO ")
					.append("     LEFT OUTER JOIN DK_M_SOKO SOKO ")
					.append("       ON HAISO.HAISO_MOTO_SOKO_CD = SOKO.SOKO_CD ")
					.append("          AND SOKO.MK_FLG = '0' ")
					.append("     LEFT OUTER JOIN ZM_M_KOJI_COMP KOJI_COMP  ")
					.append("       ON KOJI_COMP.KOJI_COMP_CD = HAISO.IDOMOTO_KOCOMP_CD  ")
					.append("          AND KOJI_COMP.MK_FLG = '0'  ")
					.append("     LEFT OUTER JOIN ZM_M_YTK_SK_OFFC YTK_SK_OFFC  ")
					.append("       ON YTK_SK_OFFC.YOTAKU_SAKI_OFFC_CD = HAISO.IDOMOTO_YTKSKOF_CD  ")
					.append("          AND YTK_SK_OFFC.MK_FLG = '0'  ")
					.append("     LEFT OUTER JOIN ( ")
					.append("       SELECT TAKNKIKI.TAKNKIKI_MODEL_CD, TAKNKIKI.TAKNKIKI_MODEL_NM, TAKNKIKI.MAKER_CD, MAKER.MAKER_NM_1 ")
					.append("       FROM ZM_M_TAKNKIKI_MODEL TAKNKIKI ")
					.append("         INNER JOIN ZM_M_MAKER MAKER ")
					.append("           ON MAKER.MAKER_CD = TAKNKIKI.MAKER_CD) MKR ")
					.append("       ON MKR.TAKNKIKI_MODEL_CD = HAISO_TG_BPIN.TAKNKIKI_MODEL_CD ");
			// SQL文_個別部1
			if ( JPCModelConstant.FUNC_CD_1.equals( inMsg.getObject(EDK0011B070CBSMsg.FUNC_CODE).toString() ) ) {
				sql_Buff.append(" WHERE ")
						.append("      HAISO.HAISO_NO = ? ")
						.append("  AND HAISO_TG_BPIN.HAISO_TAIBPIN_NO = ? ")
						.append("  AND HAISO.MK_FLG = '0' ")
						.append("  AND HAISO_TG_BPIN.MK_FLG = '0' ");
			}
			
			/* ++++++++++ v1.00.01 修正開始 ++++++++++ */
			//=================================================================
			// 対象件数を取得するprepareStatementにSQL文をセット
			StringBuffer sql_cnt = new StringBuffer();
			sql_cnt.append(" SELECT COUNT(*) AS CNT ") 
				.append(" FROM ( ")
				.append(sql_Buff)
				.append(" ) A ");
			pstmtForCount = con1.prepareStatement(sql_cnt.toString());

			// パラメータの設定(ＫＥＹ＿運用日付を指定)
			CAANJDBCUtil.setParam(pstmtForCount, 1, inMsg.getObject(EDK0011B070CBSMsg.KEY_UNYO_YMD));

			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			if (JPCModelConstant.FUNC_CD_1.equals(inMsg.getString(EDK0011B070CBSMsg.FUNC_CODE)))
			{
				// パラメータの設定(ＫＥＹ＿配送番号を指定)
				CAANJDBCUtil.setParam(pstmtForCount, 2, inMsg.getObject(EDK0011B070CBSMsg.KEY_HAISO_NO));
				// パラメータの設定(ＫＥＹ＿配送対象物品番号を指定)
				CAANJDBCUtil.setParam(pstmtForCount, 3, inMsg.getObject(EDK0011B070CBSMsg.KEY_HAISO_TAIBPIN_NO));
			}
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// ResultSetの取得
			rsltQueryForCount = pstmtForCount.executeQuery();
			rsltQueryForCount.next();
			int totalSearchNum = rsltQueryForCount.getInt(1);

			//検索結果件数が0件
			if (totalSearchNum == 0)
			{
				inMsg.set("search_err_flg", JPCModelConstant.SEARCH_ERR_FLG_ZERO);
				return;
			}

			//prepareStatementにSQL文をセット
			pstmtForFetch = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			// パラメータの設定(ＫＥＹ＿運用日付を指定)
			CAANJDBCUtil.setParam(pstmtForFetch, 1, inMsg.getObject(EDK0011B070CBSMsg.KEY_UNYO_YMD));

			if (JPCModelConstant.FUNC_CD_1.equals(inMsg.getString(EDK0011B070CBSMsg.FUNC_CODE)))
			{
				// パラメータの設定(ＫＥＹ＿配送番号を指定)
				CAANJDBCUtil.setParam(pstmtForFetch, 2, inMsg.getObject(EDK0011B070CBSMsg.KEY_HAISO_NO));
				// パラメータの設定(ＫＥＹ＿配送対象物品番号を指定)
				CAANJDBCUtil.setParam(pstmtForFetch, 3, inMsg.getObject(EDK0011B070CBSMsg.KEY_HAISO_TAIBPIN_NO));
			}
			/* ++++++++++ v1.00.01 修正終了 ++++++++++ */
			
			// ResultSetの取得
			rsltQueryForFetch = pstmtForFetch.executeQuery();
			
			// EDK0011B070CBSMsgの明細にセットする項目
			String[] msgKeyList1 = {
					  EDK0011B070CBSMsg1List.HAISO_NO
					, EDK0011B070CBSMsg1List.HAISO_TAIBPIN_NO
					, EDK0011B070CBSMsg1List.HISOS_KSITEI_FLG
					, EDK0011B070CBSMsg1List.HISOS_PCD
					, EDK0011B070CBSMsg1List.HISOS_STATE_NM
					, EDK0011B070CBSMsg1List.HISOS_CITY_NM
					, EDK0011B070CBSMsg1List.HISOS_OAZTSU_NM
					, EDK0011B070CBSMsg1List.HISOS_AZCHO_NM
					, EDK0011B070CBSMsg1List.HISOS_BNCHIGO
					, EDK0011B070CBSMsg1List.HISOS_ADRTTM
					, EDK0011B070CBSMsg1List.HISOS_ADRRM
					, EDK0011B070CBSMsg1List.HISOS_AD
					, EDK0011B070CBSMsg1List.HISOS_TELNO
					, EDK0011B070CBSMsg1List.SOKO_NM
					, EDK0011B070CBSMsg1List.SHELF_NM
					, EDK0011B070CBSMsg1List.SOKO_TELNO
					, EDK0011B070CBSMsg1List.SOKO_FAXNO
					, EDK0011B070CBSMsg1List.MAKER_NM
					, EDK0011B070CBSMsg1List.KIKI_SEIZO_NO
					, EDK0011B070CBSMsg1List.CNT
					, EDK0011B070CBSMsg1List.KIKI_HUKA_INFO_CD
					, EDK0011B070CBSMsg1List.KIKI_HUKA_INFO_NM
					, EDK0011B070CBSMsg1List.IDOMOTO_KRIPLACE_SKCD
			};
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQueryForFetch,msgKeyList1,"eo.ejb.cbs.cbsmsg.EDK0011B070CBSMsg1List",0);
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("EDK0011B070CBSMsg1List", outMsg1);
			

		} catch(SQLException e) {
			inMsg.set(EDK0011B070CBSMsg.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(EDK0011B070CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
}

