/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JSYejbESC0101B020TPDA
*	ソースファイル名：JSYejbESC0101B020TPDA.java
*	作成者			：EK909733
*	日付			：2011年10月05日
*＜機能概要＞
*	SQLFacility
*	テンプレートDBアクセス部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*	ｖ8.00.00	2014/04/21	FJ)阪口		【OM-2014-0001522】サービスオーダ一覧照会性能改善
*
********************************************************************************/

package eo.ejb.cbs.sqlf;

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.base.CAANJDBCUtil;
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 eo.ejb.cbs.cbsmsg.ESC0101B020CBSMsg;
import eo.ejb.cbs.cbsmsg.ESC0101B020CBSMsg1List;
import eo.ejb.cbm.entity.SC0101ETMsg;


/**
*
*  テンプレートDBアクセス部品　ESC0101B020_SQLF<br>
*  入力された項目からSQL文を動的に組み立て、<br>
*  検索結果をCBSMsgにセットします。<br>
*/
public class JSYejbESC0101B020TPDA extends CAANSQLFacility implements TemplateDBAccessHandler{
	
	/**
	 * 検索エラーフラグ(0件)
	 */
	private static final String SEARCH_ERR_FLG_ZERO = "1";
	
	/**
	 * 検索エラーフラグ(最大検索件数超え)
	 */
	private static final String SEARCH_ERR_FLG_OVERMAX = "2";
	
	/**
	 * 検索エラーフラグ(表示ページに該当するデータなし)
	 */
	private static final String SEARCH_ERR_FLG_NODATA = "3";

	/**
	 * 	SOD日付種別コード：スケジュール日
	 */
	private static final String SOD_DAY_SBT_CD_SCHEDULE = "1";

	/**
	 * 	SOD日付種別コード：受信日時
	 */
	private static final String SOD_DAY_SBT_CD_UKE_DATE = "2";
	
	/**
	 * 	SOD日付種別コード：SOD投入日時
	 */
	private static final String SOD_DAY_SBT_CD_TONYU_DATE = "3";

	/**
	 * 	SOD日付種別コード：結果受信日時
	 */
	private static final String SOD_DAY_SBT_CD_RESULT_DATE = "4";

	
	/**
	 * コンストラクタ
	 */
	public JSYejbESC0101B020TPDA()	{
	}
	
	/**
	*   ESC0101B020_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @return void
	*/
	public void invoke(CAANMsg inMsg,AgentDispatchContext inContext){
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		PreparedStatement pstmtForCnt = null;
		ResultSet rsltSetForCnt = null;

		checkInputItems(inMsg);
		
		/******************** 
		 * SQL文の作成
		 ********************/

		try{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(SC0101ETMsg.getTableName());
			
			// *** 総件数取得処理 *** -->
			
			StringBuffer sqlForCnt = new StringBuffer();
			sqlForCnt.append("SELECT ");
			sqlForCnt.append("    COUNT(*) ");
			sqlForCnt.append("FROM ");
			sqlForCnt.append("    ( ");
			sqlForCnt.append( createBaseSqlStatement(inMsg) );
			sqlForCnt.append("    ) ");
			
			//prepareStatementにSQL文をセット
			pstmtForCnt = con1.prepareStatement(sqlForCnt.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sqlForCnt);
			
			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			setParamValue(inContext, pstmtForCnt, inMsg, null, null);
			
			rsltSetForCnt = pstmtForCnt.executeQuery();

			String[] msgKeyList = {
					ESC0101B020CBSMsg.TOTAL_SEARCH_NUM
			};
			
			rsltSetForCnt.next();
			mapMessage(rsltSetForCnt, msgKeyList, inMsg);
			
			// 総ページ数設定
			int totalSearchNum = Integer.parseInt(inMsg.getString(ESC0101B020CBSMsg.TOTAL_SEARCH_NUM));
			int displayNum = Integer.parseInt(inMsg.getString(ESC0101B020CBSMsg.DISPLAY_NUM));
			
			int totalPageNum =  totalSearchNum / displayNum;
			int mod =  totalSearchNum % displayNum;

			// 割り切れない場合は総ページ数を増やす
			if (0 != mod) {
				totalPageNum = totalPageNum + 1;
			}

			inMsg.set(ESC0101B020CBSMsg.TOTAL_PAGE_NUM, Integer.toString(totalPageNum));

			// 検索件数が0件の場合、エラーフラグに"1"を設定して処理終了
			if (0 == (Integer.parseInt(inMsg.getString(ESC0101B020CBSMsg.TOTAL_SEARCH_NUM)))) {
				inMsg.set(ESC0101B020CBSMsg.SEARCH_ERR_FLG, SEARCH_ERR_FLG_ZERO);
				return;
			}
			
			// 検索件数が最大検索件数を超えた場合、エラーフラグに"2"を設定して処理終了
			if (Integer.parseInt(inMsg.getString(ESC0101B020CBSMsg.MAX_SEARCH_NUM))
					< (Integer.parseInt(inMsg.getString(ESC0101B020CBSMsg.TOTAL_SEARCH_NUM)))) {
				
				inMsg.set(ESC0101B020CBSMsg.SEARCH_ERR_FLG, SEARCH_ERR_FLG_OVERMAX);
				return;
			}
			
			// 表示ページに該当するデータがない場合、エラーフラグに"3"を設定して処理終了
			int displayPageNum = Integer.parseInt(inMsg.getString(ESC0101B020CBSMsg.DISPLAY_PAGE_NUM));
			
			int startNum = displayNum * (displayPageNum - 1) + 1;
			int endNum = displayNum * displayPageNum;
			
			if (totalPageNum < displayPageNum) {
				inMsg.set(ESC0101B020CBSMsg.SEARCH_ERR_FLG, SEARCH_ERR_FLG_NODATA);
				return;
			}
			
			// <-- *** 総件数取得処理 ***
			
			
			// SQL文_基本部1
			StringBuffer sql_Buff = new StringBuffer();
			
			sql_Buff.append(" SELECT ");
			sql_Buff.append("     SOD_SEND_RCV_SBT_CD, ");
			sql_Buff.append("     SRINF_KANRI_NO, ");
			sql_Buff.append("     SVC_ORDER_CD, ");
			sql_Buff.append("     SVC_ORDER_CD_NM, ");
			sql_Buff.append("     SVC_KEI_NO, ");
			sql_Buff.append("     SOD_STAT, ");
			sql_Buff.append("     SOD_STAT_NM, ");
			sql_Buff.append("     YOKYU_MT_APL_SBT_CD, ");
			sql_Buff.append("     YOKYU_MT_APL_SBT_CD_NM, ");
			sql_Buff.append("     YOKYU_SBT_CD, ");
			sql_Buff.append("     YOKYU_SBT_CD_NM, ");
			sql_Buff.append("     SCHEDULE_YMD, ");
			sql_Buff.append("     SOD_RENKEI_SEQ, ");
			sql_Buff.append("     OLD_SOD_RENKEI_SEQ, ");
			sql_Buff.append("     SOD_UK_DTM, ");
			sql_Buff.append("     SOD_TONYU_DTM, ");
			sql_Buff.append("     SOD_RSLT_ADD_DTM, ");
			sql_Buff.append("     SOD_TRAN_RSLT_CD, ");
			sql_Buff.append("     SOD_TRAN_RSLT_DTAIL_CD, ");
			sql_Buff.append("     ADD_DTM, ");
			sql_Buff.append("     ADD_OPEACNT, ");
			sql_Buff.append("     UPD_DTM, ");
			sql_Buff.append("     UPD_OPEACNT, ");
			sql_Buff.append("     DEL_DTM, ");
			sql_Buff.append("     DEL_OPEACNT, ");
			sql_Buff.append("     MK_FLG  ");
			sql_Buff.append(" FROM ");
			sql_Buff.append("   ( ");
			sql_Buff.append("     SELECT ");
			sql_Buff.append("       ROWNUM AS ROW_NUM, ");
			sql_Buff.append("       A.* ");
			sql_Buff.append("     FROM ");
			sql_Buff.append("       ( ");
			sql_Buff.append(  createBaseSqlStatement(inMsg) );
			sql_Buff.append("           ORDER BY SOD_UK_DTM DESC, SOD_RENKEI_SEQ DESC ");
			sql_Buff.append("       ) A");
			sql_Buff.append("    ) ");
			sql_Buff.append(" WHERE ");
			sql_Buff.append("   ROW_NUM BETWEEN ? AND ? ");	
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			if ( "1".equals( inMsg.getString(ESC0101B020CBSMsg.FUNC_CODE) ) ) {
				setParamValue(inContext, pstmt, inMsg, Integer.toString(startNum), Integer.toString(endNum));
			}
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// ESC0101B020CBSMsgの明細にセットする項目
			String[] msgKeyList1 = {
					  ESC0101B020CBSMsg1List.SOD_SEND_RCV_SBT_CD
					, ESC0101B020CBSMsg1List.SRINF_KANRI_NO
					, ESC0101B020CBSMsg1List.SVC_ORDER_CD
					, ESC0101B020CBSMsg1List.SVC_ORDER_CD_NM
					, ESC0101B020CBSMsg1List.SVC_KEI_NO
					, ESC0101B020CBSMsg1List.SOD_STAT
					, ESC0101B020CBSMsg1List.SOD_STAT_NM
					, ESC0101B020CBSMsg1List.YOKYU_MT_APL_SBT_CD
					, ESC0101B020CBSMsg1List.YOKYU_MT_APL_SBT_CD_NM
					, ESC0101B020CBSMsg1List.YOKYU_SBT_CD
					, ESC0101B020CBSMsg1List.YOKYU_SBT_CD_NM
					, ESC0101B020CBSMsg1List.SCHEDULE_YMD
					, ESC0101B020CBSMsg1List.SOD_RENKEI_SEQ
					, ESC0101B020CBSMsg1List.OLD_SOD_RENKEI_SEQ
					, ESC0101B020CBSMsg1List.SOD_UK_DTM
					, ESC0101B020CBSMsg1List.SOD_TONYU_DTM
					, ESC0101B020CBSMsg1List.SOD_RSLT_ADD_DTM
					, ESC0101B020CBSMsg1List.SOD_TRAN_RSLT_CD
					, ESC0101B020CBSMsg1List.SOD_TRAN_RSLT_DTAIL_CD
					, ESC0101B020CBSMsg1List.ADD_DTM
					, ESC0101B020CBSMsg1List.ADD_OPEACNT
					, ESC0101B020CBSMsg1List.UPD_DTM
					, ESC0101B020CBSMsg1List.UPD_OPEACNT
					, ESC0101B020CBSMsg1List.DEL_DTM
					, ESC0101B020CBSMsg1List.DEL_OPEACNT
					, ESC0101B020CBSMsg1List.MK_FLG
			};
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery,msgKeyList1,"eo.ejb.cbs.cbsmsg.ESC0101B020CBSMsg1List",0);
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("ESC0101B020CBSMsg1List", outMsg1);
			

		} catch(SQLException e) {
			inMsg.set(ESC0101B020CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try{
				
				if (null != rsltSetForCnt) {
					rsltSetForCnt.close();
				}
				
				if (null != pstmtForCnt) {
					pstmtForCnt.close();
				}
				
				if(rsltQuery != null){
					rsltQuery.close();
				}
				if(pstmt != null){
					pstmt.close();
				}
				if(con1 != null){
					closeConnection(con1);
				}
			}catch(SQLException e){
				inMsg.set(ESC0101B020CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}

	}
	
	/**
	 * PreparedStatementの指定されたパラメータカラムに 指定された値を設定
	 * @param inContext AgentDispatchContext
	 * @param pstmt PreparedStatement
	 * @param inMsg CAANMsg
	 * @param startNum 開始行
	 * @param endNum 終了行
	 * @throws SQLException
	 */
	private void setParamValue(AgentDispatchContext inContext, PreparedStatement pstmt, 
			CAANMsg inMsg, String startNum, String endNum) throws SQLException {

		int index  =1;
		
		index = processParam(inContext, pstmt, index, inMsg);
		index = processParam(inContext, pstmt, index, inMsg);
		index = processParam(inContext, pstmt, index, inMsg);
		
		if (null != startNum) {
		
			// パラメータの設定(検索開始行)
			CAANJDBCUtil.setParam(pstmt, index++, new Integer(startNum));
			
			// パラメータの設定(検索終了行)
			CAANJDBCUtil.setParam(pstmt, index++, new Integer(endNum));
		}
	}

	/**
	 * PreparedStatementの指定されたパラメータカラムに 指定された値を設定
	 * 
	 * @param inContext AgentDispatchContext
	 * @param pstmt PreparedStatement
	 * @param paramIdx パラメータインデックス
	 * @param inMsg CAANMsg
	 * @return パラメータインデックス
	 * @throws SQLException
	 */
	private int processParam(AgentDispatchContext inContext, PreparedStatement pstmt, 
									int paramIdx, CAANMsg inMsg) throws SQLException {
		
		int index = paramIdx;
		
		if (!inMsg.isNull(ESC0101B020CBSMsg.KEY_SVC_ORDER_CD)) {
			
			// パラメータの設定(ＫＥＹ＿サービスオーダコードを指定)
			CAANJDBCUtil.setParam(pstmt, index++, inMsg.getObject(ESC0101B020CBSMsg.KEY_SVC_ORDER_CD));
		}
		
		if (!inMsg.isNull(ESC0101B020CBSMsg.KEY_SVKEI_NO)) {
		
			// パラメータの設定(ＫＥＹ＿サービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, index++, inMsg.getObject(ESC0101B020CBSMsg.KEY_SVKEI_NO));
		}
		
		if (!inMsg.isNull(ESC0101B020CBSMsg.KEY_SOD_STAT)) {
		
			// パラメータの設定(ＫＥＹ＿ＳＯＤステータスを指定)
			CAANJDBCUtil.setParam(pstmt, index++, inMsg.getObject(ESC0101B020CBSMsg.KEY_SOD_STAT));
		}
	
		if (isScheduleDay(inMsg)) {
			
			// パラメータの設定(ＫＥＹ＿日時年を指定)
			CAANJDBCUtil.setParam(pstmt, index++, inMsg.getObject(ESC0101B020CBSMsg.KEY_DATE_YEAR));
			
			// パラメータの設定(ＫＥＹ＿日時月を指定)
			CAANJDBCUtil.setParam(pstmt, index++, inMsg.getObject(ESC0101B020CBSMsg.KEY_DATE_MON));
			
			// パラメータの設定(ＫＥＹ＿日時日を指定)
			CAANJDBCUtil.setParam(pstmt, index++, inMsg.getObject(ESC0101B020CBSMsg.KEY_DATE_DAY));
		
		} else if (isUketsukeDTM(inMsg) || isSODTonyuDTM(inMsg) || isSODResultAddDTM(inMsg)) {
		
			// パラメータの設定(ＫＥＹ＿日時年を指定)
			CAANJDBCUtil.setParam(pstmt, index++, inMsg.getObject(ESC0101B020CBSMsg.KEY_DATE_YEAR));
			
			// パラメータの設定(ＫＥＹ＿日時月を指定)
			CAANJDBCUtil.setParam(pstmt, index++, inMsg.getObject(ESC0101B020CBSMsg.KEY_DATE_MON));
			
			// パラメータの設定(ＫＥＹ＿日時日を指定)
			CAANJDBCUtil.setParam(pstmt, index++, inMsg.getObject(ESC0101B020CBSMsg.KEY_DATE_DAY));
			
			// パラメータの設定(ＫＥＹ＿日時開始時間を指定)
			CAANJDBCUtil.setParam(pstmt, index++, getStartTime(inMsg));
			
			// パラメータの設定(ＫＥＹ＿日時年を指定)
			CAANJDBCUtil.setParam(pstmt, index++, inMsg.getObject(ESC0101B020CBSMsg.KEY_DATE_YEAR));
			
			// パラメータの設定(ＫＥＹ＿日時月を指定)
			CAANJDBCUtil.setParam(pstmt, index++, inMsg.getObject(ESC0101B020CBSMsg.KEY_DATE_MON));
			
			// パラメータの設定(ＫＥＹ＿日時日を指定)
			CAANJDBCUtil.setParam(pstmt, index++, inMsg.getObject(ESC0101B020CBSMsg.KEY_DATE_DAY));
			
			// パラメータの設定(ＫＥＹ＿日時終了時間を指定)
			CAANJDBCUtil.setParam(pstmt, index++, getEndTime(inMsg));
		}
		
		return index;
	}
	
	/**
	 * 最大検索件数、表示件数、表示ページ番号が設定されているかチェックします。
	 * @param inMsg
	 * @throws IllegalArgumentException 最大検索件数、表示件数、表示ページ番号のいれれかが未設定の場合
	 */
	private void checkInputItems(CAANMsg inMsg) {

		if (inMsg.isNull(ESC0101B020CBSMsg.SEARCH_TYPE)
			|| inMsg.isNull(ESC0101B020CBSMsg.MAX_SEARCH_NUM)
			|| inMsg.isNull(ESC0101B020CBSMsg.DISPLAY_NUM)
			|| inMsg.isNull(ESC0101B020CBSMsg.DISPLAY_PAGE_NUM)) {
			
			throw new IllegalArgumentException("サービスインターフェイス共通部の検索処理パターン、最大検索件数、表示件数、表示ページ番号は必須項目です。");
		}
	}

	private String createBaseSqlStatement(CAANMsg inMsg) {
		StringBuffer sql_Buff = new StringBuffer();
		
		sql_Buff.append(" SELECT ");
		sql_Buff.append("     '1' AS SOD_SEND_RCV_SBT_CD, ");
		sql_Buff.append("     ODRSR.SRINF_KANRI_NO, ");
		sql_Buff.append("     ODRSR.SVC_ORDER_CD, ");
		sql_Buff.append("     (SELECT CDSOC.CD_DIV_NM ");
		sql_Buff.append("      FROM   ZM_M_CD_NM_KANRI CDSOC ");
		sql_Buff.append("      WHERE  (CDSOC.CD_SBT_CD = 'CD00310' or CDSOC.CD_SBT_CD = 'CD00311') ");
		sql_Buff.append("      AND    CDSOC.CD_DIV = ODRSR.SVC_ORDER_CD ");
		sql_Buff.append("      AND    CDSOC.MK_FLG = '0') AS SVC_ORDER_CD_NM, ");
		sql_Buff.append("     ODRSR.SVC_KEI_NO, ");
		sql_Buff.append("     ODRSR.SOD_STAT, ");
		sql_Buff.append("     (SELECT CDSOD.CD_DIV_NM ");
		sql_Buff.append("      FROM   ZM_M_CD_NM_KANRI CDSOD ");
		sql_Buff.append("      WHERE  CDSOD.CD_SBT_CD = 'CD00321' ");
		sql_Buff.append("      AND    CDSOD.CD_DIV = ODRSR.SOD_STAT ");
		sql_Buff.append("      AND    CDSOD.MK_FLG = '0') AS SOD_STAT_NM, ");
		sql_Buff.append("     ODRSR.YOKYU_MT_APL_SBT_CD, ");
		sql_Buff.append("     (SELECT CDYKM.CD_DIV_NM ");
		sql_Buff.append("      FROM   ZM_M_CD_NM_KANRI CDYKM ");
		sql_Buff.append("      WHERE  CDYKM.CD_SBT_CD = 'CD00329' ");
		sql_Buff.append("      AND    CDYKM.CD_DIV = ODRSR.YOKYU_MT_APL_SBT_CD ");
		sql_Buff.append("      AND    CDYKM.MK_FLG = '0') AS YOKYU_MT_APL_SBT_CD_NM, ");
		sql_Buff.append("     ODRSR.YOKYU_SBT_CD, ");
		sql_Buff.append("     (SELECT CDYKS.CD_DIV_NM ");
		sql_Buff.append("      FROM   ZM_M_CD_NM_KANRI CDYKS ");
		sql_Buff.append("      WHERE  CDYKS.CD_SBT_CD = 'CD00317' ");
		sql_Buff.append("      AND    CDYKS.CD_DIV = ODRSR.YOKYU_SBT_CD ");
		sql_Buff.append("      AND    CDYKS.MK_FLG = '0') AS YOKYU_SBT_CD_NM, ");
		sql_Buff.append("     ODRSR.SCHEDULE_YMD, ");
		sql_Buff.append("     ODRSR.SOD_RENKEI_SEQ, ");
		sql_Buff.append("     ODRSR.OLD_SOD_RENKEI_SEQ, ");
		sql_Buff.append("     ODRSR.SOD_UK_DTM, ");
		sql_Buff.append("     ODRSR.SOD_TONYU_DTM, ");
		sql_Buff.append("     ODRSR.SOD_RSLT_ADD_DTM, ");
		sql_Buff.append("     ODRSR.SOD_TRAN_RSLT_CD, ");
		sql_Buff.append("     ODRSR.SOD_TRAN_RSLT_DTAIL_CD, ");
		sql_Buff.append("     ODRSR.ADD_DTM, ");
		sql_Buff.append("     ODRSR.ADD_OPEACNT, ");
		sql_Buff.append("     ODRSR.UPD_DTM, ");
		sql_Buff.append("     ODRSR.UPD_OPEACNT, ");
		sql_Buff.append("     ODRSR.DEL_DTM, ");
		sql_Buff.append("     ODRSR.DEL_OPEACNT, ");
		sql_Buff.append("     ODRSR.MK_FLG  ");
		sql_Buff.append(" FROM ");
		sql_Buff.append("     SC_T_SVC_ODR_SRINF ODRSR ");
		sql_Buff.append(" WHERE  ");
		sql_Buff.append("     1 = 1 ");

		if (!inMsg.isNull(ESC0101B020CBSMsg.KEY_SVC_ORDER_CD)) {
			sql_Buff.append("     AND ODRSR.SVC_ORDER_CD = ? ");
		}
		
		if (!inMsg.isNull(ESC0101B020CBSMsg.KEY_SVKEI_NO)) {
			sql_Buff.append("     AND ODRSR.SVC_KEI_NO = ? ");
		}
		
		if (!inMsg.isNull(ESC0101B020CBSMsg.KEY_SOD_STAT)) {
			sql_Buff.append("     AND ODRSR.SOD_STAT = ? ");
		}
		
		if (isScheduleDay(inMsg)) {
			sql_Buff.append("     AND ODRSR.SCHEDULE_YMD = ? || ? || ?  ");
		} else if (isUketsukeDTM(inMsg)) {
			sql_Buff.append("     AND ODRSR.SOD_UK_DTM  >= ? || ? || ? || ? || '0000000' ");
			sql_Buff.append("     AND ODRSR.SOD_UK_DTM   < ? || ? || ? || ? || '0000000' ");
		} else if (isSODTonyuDTM(inMsg)) {
			sql_Buff.append("     AND ODRSR.SOD_TONYU_DTM  >= ? || ? || ? || ? || '0000000' ");
			sql_Buff.append("     AND ODRSR.SOD_TONYU_DTM   < ? || ? || ? || ? || '0000000' ");
		} else if (isSODResultAddDTM(inMsg)) {
			sql_Buff.append("     AND ODRSR.SOD_RSLT_ADD_DTM  >= ? || ? || ? || ? || '0000000' ");
			sql_Buff.append("     AND ODRSR.SOD_RSLT_ADD_DTM   < ? || ? || ? || ? || '0000000' ");
		}
		
		sql_Buff.append("     AND ODRSR.MK_FLG = '0' ");
		sql_Buff.append(" UNION ");
		sql_Buff.append(" SELECT ");
		sql_Buff.append("     '3' AS SOD_SEND_RCV_SBT_CD, ");
		sql_Buff.append("     ODRSR.SRINF_KANRI_NO, ");
		sql_Buff.append("     ODRSR.MOBILE_ORDER_CD AS SVC_ORDER_CD, ");
		sql_Buff.append("     (SELECT CDSOC.CD_DIV_NM ");
		sql_Buff.append("      FROM   ZM_M_CD_NM_KANRI CDSOC ");
		sql_Buff.append("      WHERE  CDSOC.CD_SBT_CD = 'CD00312' ");
		sql_Buff.append("      AND    CDSOC.CD_DIV = ODRSR.MOBILE_ORDER_CD ");
		sql_Buff.append("      AND    CDSOC.MK_FLG = '0') AS SVC_ORDER_CD_NM, ");
		sql_Buff.append("     ODRSR.SVC_KEI_NO, ");
		sql_Buff.append("     ODRSR.SOD_STAT, ");
		sql_Buff.append("     (SELECT CDSOD.CD_DIV_NM ");
		sql_Buff.append("      FROM   ZM_M_CD_NM_KANRI CDSOD ");
		sql_Buff.append("      WHERE  CDSOD.CD_SBT_CD = 'CD00321' ");
		sql_Buff.append("      AND    CDSOD.CD_DIV = ODRSR.SOD_STAT ");
		sql_Buff.append("      AND    CDSOD.MK_FLG = '0') AS SOD_STAT_NM, ");
		sql_Buff.append("     ODRSR.YOKYU_MT_APL_SBT_CD, ");
		sql_Buff.append("     (SELECT CDYKM.CD_DIV_NM ");
		sql_Buff.append("      FROM   ZM_M_CD_NM_KANRI CDYKM ");
		sql_Buff.append("      WHERE  CDYKM.CD_SBT_CD = 'CD00329' ");
		sql_Buff.append("      AND    CDYKM.CD_DIV = ODRSR.YOKYU_MT_APL_SBT_CD ");
		sql_Buff.append("      AND    CDYKM.MK_FLG = '0') AS YOKYU_MT_APL_SBT_CD_NM, ");
		sql_Buff.append("     ODRSR.YOKYU_SBT_CD, ");
		sql_Buff.append("     (SELECT CDYKS.CD_DIV_NM ");
		sql_Buff.append("      FROM   ZM_M_CD_NM_KANRI CDYKS ");
		sql_Buff.append("      WHERE  CDYKS.CD_SBT_CD = 'CD00317' ");
		sql_Buff.append("      AND    CDYKS.CD_DIV = ODRSR.YOKYU_SBT_CD ");
		sql_Buff.append("      AND    CDYKS.MK_FLG = '0') AS YOKYU_SBT_CD_NM, ");
		sql_Buff.append("     ODRSR.SCHEDULE_YMD, ");
		sql_Buff.append("     ODRSR.SOD_RENKEI_SEQ, ");
		sql_Buff.append("     ODRSR.OLD_SOD_RENKEI_SEQ, ");
		sql_Buff.append("     ODRSR.SOD_UK_DTM, ");
		sql_Buff.append("     ODRSR.SOD_TONYU_DTM, ");
		sql_Buff.append("     ODRSR.SOD_RSLT_ADD_DTM, ");
		sql_Buff.append("     ODRSR.SOD_TRAN_RSLT_CD, ");
		sql_Buff.append("     ODRSR.SOD_TRAN_RSLT_DTAIL_CD, ");
		sql_Buff.append("     ODRSR.ADD_DTM, ");
		sql_Buff.append("     ODRSR.ADD_OPEACNT, ");
		sql_Buff.append("     ODRSR.UPD_DTM, ");
		sql_Buff.append("     ODRSR.UPD_OPEACNT, ");
		sql_Buff.append("     ODRSR.DEL_DTM, ");
		sql_Buff.append("     ODRSR.DEL_OPEACNT, ");
		sql_Buff.append("     ODRSR.MK_FLG  ");
		sql_Buff.append(" FROM ");
		sql_Buff.append("     SC_T_UQ_ODR_SRINF ODRSR ");
		sql_Buff.append(" WHERE  ");
		sql_Buff.append("     1 = 1 ");
		
		if (!inMsg.isNull(ESC0101B020CBSMsg.KEY_SVC_ORDER_CD)) {
			sql_Buff.append("     AND ODRSR.MOBILE_ORDER_CD = ? ");
		}
		
		if (!inMsg.isNull(ESC0101B020CBSMsg.KEY_SVKEI_NO)) {
			sql_Buff.append("     AND ODRSR.SVC_KEI_NO = ? ");
		}
		
		if (!inMsg.isNull(ESC0101B020CBSMsg.KEY_SOD_STAT)) {
			sql_Buff.append("     AND ODRSR.SOD_STAT = ? ");
		}
		
		if (isScheduleDay(inMsg)) {
			sql_Buff.append("     AND ODRSR.SCHEDULE_YMD = ? || ? || ?  ");
		} else if (isUketsukeDTM(inMsg)) {
			sql_Buff.append("     AND ODRSR.SOD_UK_DTM  >= ? || ? || ? || ? || '0000000' ");
			sql_Buff.append("     AND ODRSR.SOD_UK_DTM   < ? || ? || ? || ? || '0000000' ");
		} else if (isSODTonyuDTM(inMsg)) {
			sql_Buff.append("     AND ODRSR.SOD_TONYU_DTM  >= ? || ? || ? || ? || '0000000' ");
			sql_Buff.append("     AND ODRSR.SOD_TONYU_DTM   < ? || ? || ? || ? || '0000000' ");
		} else if (isSODResultAddDTM(inMsg)) {
			sql_Buff.append("     AND ODRSR.SOD_RSLT_ADD_DTM  >= ? || ? || ? || ? || '0000000' ");
			sql_Buff.append("     AND ODRSR.SOD_RSLT_ADD_DTM   < ? || ? || ? || ? || '0000000' ");
		}

		sql_Buff.append("     AND ODRSR.MK_FLG = '0' ");
		sql_Buff.append(" UNION ");
		sql_Buff.append(" SELECT ");
		sql_Buff.append("     '2' AS SOD_SEND_RCV_SBT_CD, ");
		sql_Buff.append("     ODRSR.SRINF_KANRI_NO, ");
		sql_Buff.append("     ODRSR.MOBILE_ORDER_CD AS SVC_ORDER_CD, ");
		sql_Buff.append("     (SELECT CDSOC.CD_DIV_NM ");
		sql_Buff.append("      FROM   ZM_M_CD_NM_KANRI CDSOC ");
		sql_Buff.append("      WHERE  CDSOC.CD_SBT_CD = 'CD00312' ");
		sql_Buff.append("      AND    CDSOC.CD_DIV = ODRSR.MOBILE_ORDER_CD ");
		sql_Buff.append("      AND    CDSOC.MK_FLG = '0') AS SVC_ORDER_CD_NM, ");
		sql_Buff.append("     ODRSR.SVC_KEI_NO, ");
		sql_Buff.append("     ODRSR.SOD_STAT, ");
		sql_Buff.append("     (SELECT CDSOD.CD_DIV_NM ");
		sql_Buff.append("      FROM   ZM_M_CD_NM_KANRI CDSOD ");
		sql_Buff.append("      WHERE  CDSOD.CD_SBT_CD = 'CD00321' ");
		sql_Buff.append("      AND    CDSOD.CD_DIV = ODRSR.SOD_STAT ");
		sql_Buff.append("      AND    CDSOD.MK_FLG = '0') AS SOD_STAT_NM, ");
		sql_Buff.append("     ODRSR.YOKYU_MT_APL_SBT_CD, ");
		sql_Buff.append("     (SELECT CDYKM.CD_DIV_NM ");
		sql_Buff.append("      FROM   ZM_M_CD_NM_KANRI CDYKM ");
		sql_Buff.append("      WHERE  CDYKM.CD_SBT_CD = 'CD00329' ");
		sql_Buff.append("      AND    CDYKM.CD_DIV = ODRSR.YOKYU_MT_APL_SBT_CD ");
		sql_Buff.append("      AND    CDYKM.MK_FLG = '0') AS YOKYU_MT_APL_SBT_CD_NM, ");
		sql_Buff.append("     ODRSR.YOKYU_SBT_CD, ");
		sql_Buff.append("     (SELECT CDYKS.CD_DIV_NM ");
		sql_Buff.append("      FROM   ZM_M_CD_NM_KANRI CDYKS ");
		sql_Buff.append("      WHERE  CDYKS.CD_SBT_CD = 'CD00317' ");
		sql_Buff.append("      AND    CDYKS.CD_DIV = ODRSR.YOKYU_SBT_CD ");
		sql_Buff.append("      AND    CDYKS.MK_FLG = '0') AS YOKYU_SBT_CD_NM, ");
		sql_Buff.append("     ODRSR.SCHEDULE_YMD, ");
		sql_Buff.append("     ODRSR.SOD_RENKEI_SEQ, ");
		sql_Buff.append("     ODRSR.OLD_SOD_RENKEI_SEQ, ");
		sql_Buff.append("     ODRSR.SOD_UK_DTM, ");
		sql_Buff.append("     ODRSR.SOD_TONYU_DTM, ");
		sql_Buff.append("     ODRSR.SOD_RSLT_ADD_DTM, ");
		sql_Buff.append("     ODRSR.SOD_TRAN_RSLT_CD, ");
		sql_Buff.append("     ODRSR.SOD_TRAN_RSLT_DTAIL_CD, ");
		sql_Buff.append("     ODRSR.ADD_DTM, ");
		sql_Buff.append("     ODRSR.ADD_OPEACNT, ");
		sql_Buff.append("     ODRSR.UPD_DTM, ");
		sql_Buff.append("     ODRSR.UPD_OPEACNT, ");
		sql_Buff.append("     ODRSR.DEL_DTM, ");
		sql_Buff.append("     ODRSR.DEL_OPEACNT, ");
		sql_Buff.append("     ODRSR.MK_FLG ");
		sql_Buff.append(" FROM ");
		sql_Buff.append("     SC_T_SPOT_ODR_SRINF ODRSR ");
		sql_Buff.append(" WHERE  ");
		sql_Buff.append("     1 = 1 ");

		if (!inMsg.isNull(ESC0101B020CBSMsg.KEY_SVC_ORDER_CD)) {
			sql_Buff.append("     AND ODRSR.MOBILE_ORDER_CD = ? ");
		}
		
		if (!inMsg.isNull(ESC0101B020CBSMsg.KEY_SVKEI_NO)) {
			sql_Buff.append("     AND ODRSR.SVC_KEI_NO = ? ");
		}
		
		if (!inMsg.isNull(ESC0101B020CBSMsg.KEY_SOD_STAT)) {
			sql_Buff.append("     AND ODRSR.SOD_STAT = ? ");
		}
		
		if (isScheduleDay(inMsg)) {
			sql_Buff.append("     AND ODRSR.SCHEDULE_YMD = ? || ? || ?  ");
		} else if (isUketsukeDTM(inMsg)) {
			sql_Buff.append("     AND ODRSR.SOD_UK_DTM  >= ? || ? || ? || ? || '0000000' ");
			sql_Buff.append("     AND ODRSR.SOD_UK_DTM   < ? || ? || ? || ? || '0000000' ");
		} else if (isSODTonyuDTM(inMsg)) {
			sql_Buff.append("     AND ODRSR.SOD_TONYU_DTM  >= ? || ? || ? || ? || '0000000' ");
			sql_Buff.append("     AND ODRSR.SOD_TONYU_DTM   < ? || ? || ? || ? || '0000000' ");
		} else if (isSODResultAddDTM(inMsg)) {
			sql_Buff.append("     AND ODRSR.SOD_RSLT_ADD_DTM  >= ? || ? || ? || ? || '0000000' ");
			sql_Buff.append("     AND ODRSR.SOD_RSLT_ADD_DTM   < ? || ? || ? || ? || '0000000' ");
		}

		sql_Buff.append("     AND ODRSR.MK_FLG = '0' ");

		//sql_Buff.append(" ORDER BY ");
		//sql_Buff.append("     SOD_UK_DTM ");
	
		return sql_Buff.toString();
	}
	
	/**
	 * CAANMsgより日時開始時間を取得します。未設定の場合は00を返します。
	 * 
	 * @param inMsg CAANMsg
	 */
	private String getStartTime(CAANMsg inMsg) {
		String time = (String)inMsg.getObject(ESC0101B020CBSMsg.KEY_DATE_STA_TIME);
		return isNullOrBlank(time) ? "00" : time;
	}

	/**
	 * CAANMsgより日時終了時間を取得します。未設定の場合は24を返します。
	 * 
	 * @param inMsg CAANMsg
	 */
	private String getEndTime(CAANMsg inMsg) {
		String time = (String)inMsg.getObject(ESC0101B020CBSMsg.KEY_DATE_END_TIME);
		return isNullOrBlank(time) ? "24" : time;
	}

	/**
	 * SOD日時種別コードがスケジュール日かを判定します。SOD日時種別コードの値がスケジュール日
	 * であっても、日付が入力されていない場合はfalseを返します。
	 * 
	 * @param inMsg CAANMsg
	 * @return スケジュール日の場合true
	 */
	private boolean isScheduleDay(CAANMsg inMsg) {
		return hasDate(inMsg) && SOD_DAY_SBT_CD_SCHEDULE.equals( getSodDaySbtCd(inMsg) );
	}
	
	/**
	 * SOD日時種別コードが受付日時かを判定します。SOD日時種別コードの値が受付日時
	 * であっても、日付が入力されていない場合はfalseを返します。
	 * 
	 * @param inMsg CAANMsg
	 * @return 受付日時の場合true
	 */
	private boolean isUketsukeDTM(CAANMsg inMsg) {
		return hasDate(inMsg) && SOD_DAY_SBT_CD_UKE_DATE.equals( getSodDaySbtCd(inMsg) );
	}
	
	/**
	 * SOD日時種別コードがSOD投入日時かを判定します。SOD日時種別コードの値がSOD投入日時
	 * であっても、日付が入力されていない場合はfalseを返します。
	 * 
	 * @param inMsg CAANMsg
	 * @return SOD投入日時の場合true
	 */
	private boolean isSODTonyuDTM(CAANMsg inMsg) {
		return hasDate(inMsg) && SOD_DAY_SBT_CD_TONYU_DATE.equals( getSodDaySbtCd(inMsg) );
	}

	/**
	 * SOD日時種別コードが結果受信日時かを判定します。SOD日時種別コードの値が結果受信日時
	 * であっても、日付が入力されていない場合はfalseを返します。
	 * 
	 * @param inMsg CAANMsg
	 * @return 結果受信日時の場合true
	 */
	private boolean isSODResultAddDTM(CAANMsg inMsg) {
		return hasDate(inMsg) && SOD_DAY_SBT_CD_RESULT_DATE.equals( getSodDaySbtCd(inMsg) );
	}

	/**
	 * SOD日時種別コードの値を取得します。
	 * @param inMsg CAANMsg
	 * @return SOD日時種別コード
	 */
	private String getSodDaySbtCd(CAANMsg inMsg) {
		return inMsg.getObject(ESC0101B020CBSMsg.KEY_SOD_DAY_SBT_CD).toString();
	}
	
	/**
	 * 日時年、日時月、日時日の値が入力されているか調べます。
	 * @param inMsg
	 * @return　日時年、日時月、日時日の値が全て入力されている場合true
	 */
	private boolean hasDate(CAANMsg inMsg) {
		return !inMsg.isNull(ESC0101B020CBSMsg.KEY_DATE_YEAR) 
					&& !inMsg.isNull(ESC0101B020CBSMsg.KEY_DATE_MON)
					&& !inMsg.isNull(ESC0101B020CBSMsg.KEY_DATE_DAY);
	}
	
	private boolean isNullOrBlank(String str) {
		return str == null || str.trim().length() == 0;
	}

	
	
}
