/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JSYejbECR0011B050TPDA
*	ソースファイル名：JSYejbECR0011B050TPDA.java
*	作成者			：EK907766
*	日付			：2011年10月04日
*＜機能概要＞
*	SQLFacility
*	テンプレートDBアクセス部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*	ｖ10.00.00	2014/07/23	FJ)伊藤		ANK-2048-00-00  【ＮＯ．８２２】簡易メモ一括入力機能
*	ｖ29.00.00	2017/02/15	FJ)澤田		ANK-2922-00-00  (客B) クエリ問合せ一覧照会の機能改善
*	ｖ60.00.00	2022/08/22	FJ)宇野		OM-2022-0000272  瑕疵外9月改修対応 問合せクエリ オープン状態のみ処理対応
********************************************************************************/

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 java.util.HashMap;

import eo.common.constant.JACStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.ECR0011B050CBSMsg;
import eo.ejb.cbs.cbsmsg.ECR0011B050CBSMsg1List;
import eo.ejb.cbm.entity.CR0011ETMsg;
import eo.ejb.cbm.entity.ZM0321ETMsg;
import eo.ejb.cbm.entity.ZM0321LE;
import eo.ejb.common.JCRModelCommon;

/**
*
*  テンプレートDBアクセス部品　ECR0011B050_SQLF<br>
*  入力された項目からSQL文を動的に組み立て、<br>
*  検索結果をCBSMsgにセットします。<br>
*/
public class JSYejbECR0011B050TPDA extends CAANSQLFacility implements TemplateDBAccessHandler{

// v10.00.00 ANK-2048-00-00 MOD START
	private final static String SELECT_ITEMS = 
//		"CR0011.TAIO_KIROK_NO.:CR0011.TAIO_STA_DTM.:CR0011.TITLE.:KK0781.PRC_GRP_NM.:CR0011.TOIAWASE_STAT_CD.CD00229:CK0011.EOID.:KK0081.SVC_KEI_NO.:CR0011.TMP_SAVE_UM.:CR0011.UPD_DTM.:";
		"CR0011.TAIO_KIROK_NO.:CR0011.TAIO_STA_DTM.:CR0011.TITLE.:KK0781.PRC_GRP_NM.:CR0011.TOIAWASE_STAT_CD.CD00229:CK0011.EOID.:KK0081.SVC_KEI_NO.:CR0011.TMP_SAVE_UM.:CR0011.UPD_DTM.:CR0011.EASY_MEMO.:";
// v10.00.00 ANK-2048-00-00 MOD END
	
	/**
	 * コンストラクタ
	 */
	public JSYejbECR0011B050TPDA()	{
	}
	
	/**
	*   ECR0011B050_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @return void
	*/
	public void invoke(CAANMsg inMsg,AgentDispatchContext inContext){
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
// OM-2022-0000272 ADD START
		PreparedStatement pstmt2 = null;
// OM-2022-0000272 ADD END
		
		// リザルトセット
		ResultSet rsltQuery = null;
// OM-2022-0000272 ADD START
		ResultSet rsltQuery2 = null;
// OM-2022-0000272 ADD END
		
		/******************** 
		 * SQL文の作成
		 ********************/

		try{
			
			//--------------------------------------------------------------------------------------------------
			// 各項目取得
			//--------------------------------------------------------------------------------------------------
			//スキーマID
			String schma_id = inMsg.getString(ECR0011B050CBSMsg.KEY_SCHMA_ID);
			//クエリ対象項目管理番号
			String query_trgt_kmk_kanri_no = inMsg.getString(ECR0011B050CBSMsg.KEY_QUERY_TRGT_KMK_KANRI_NO);
			//クエリ項目番号
			String query_kmk_no = inMsg.getString(ECR0011B050CBSMsg.KEY_QUERY_KMK_NO);
			//クエリ項目名
			String query_kmk_nm = inMsg.getString(ECR0011B050CBSMsg.KEY_QUERY_KMK_NM);
			//フィールド名
			String field_nm = inMsg.getString(ECR0011B050CBSMsg.KEY_FIELD_NM);
			//フィールドタイプコード
			String field_type_cd = inMsg.getString(ECR0011B050CBSMsg.KEY_FIELD_TYPE_CD);
			//クエリ条件コード
			String query_joken_cd = inMsg.getString(ECR0011B050CBSMsg.KEY_QUERY_JOKEN_CD);
			//クエリ値コード
			String query_value = inMsg.getString(ECR0011B050CBSMsg.KEY_QUERY_VALUE);
			//OR条件有無
			String or_joken_um = inMsg.getString(ECR0011B050CBSMsg.KEY_OR_JOKEN_UM);
			//基準年月日
			String base_ymd = inMsg.getString(ECR0011B050CBSMsg.KEY_BASE_YMD);
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CR0011ETMsg.getTableName());
			
			//--------------------------------------------------------------------------------------------------
			// SQL文_基本部1
			//--------------------------------------------------------------------------------------------------
			// 使用部品 No.2 問合せクエリ条件作成部品
			HashMap condition_info_map = JCRModelCommon.createCondtionInfo(
																SELECT_ITEMS, schma_id, query_trgt_kmk_kanri_no , query_kmk_no, 
																query_kmk_nm, field_nm, field_type_cd, 
																query_joken_cd, query_value, or_joken_um, 
																base_ymd );
			
//OM-2022-0000272 ADD START
			//照会データ出力前に総件数取得
			
			// 業務機能識別コード取得
			String workParam[] = getWorkParam();
			
			//SQL文作成
			StringBuffer sql_Buff2 = new StringBuffer();
			//SELECT句
			sql_Buff2.append(" SELECT COUNT(*) AS ALL_CNT ")
					.append(" FROM (")
					.append(" SELECT DISTINCT ");
			// 使用部品 No.3 出力項目取得
			sql_Buff2.append(JCRModelCommon.getSelectItems(condition_info_map));
			
			//添付件数取得用
			sql_Buff2.append(",( SELECT COUNT(*) TEMP_CNT ")
					.append(" FROM CR_T_TORK_EFILE_KNRI CR0231 ")
					.append(" WHERE ")
					.append(" CR0011.TAIO_KIROK_NO = CR0231.TAIO_KIROK_NO AND CR0231.MK_FLG = '0'  )");
			sql_Buff2.append(",CR0011.CALLBK_KIBO_YMD ")
					.append(",CR0011.CALLBK_KIBO_TIME ")
					.append(",CR0011.CALLBK_SHITEI_TYPE_CD ")
					.append(",(SELECT ")
					.append("    CD03.CD_DIV_NM ")
					.append("FROM ")
					.append("    ZM_M_CD_NM_KANRI CD03 ")
					.append("WHERE ")
					.append("    CD03.CD_SBT_CD  = 'CD00457'                   AND ")
					.append("    CD03.CD_DIV     = CR0011.CALLBK_SHITEI_TYPE_CD  AND ")
					.append("    CD03.CD_TSTAYMD <= SUBSTR(CR0011.UPD_DTM, 1, 8) AND ")
					.append("    CD03.CD_TENDYMD >= SUBSTR(CR0011.UPD_DTM, 1, 8) AND ")
					.append("    CD03.MK_FLG     = '0' ")
					.append(") AS CALLBK_SHITEI_TYPE_NM ");
			//FROM句
			sql_Buff2.append(" FROM ");
			// 使用部品 No.4 テーブル結合条件取得
			sql_Buff2.append(JCRModelCommon.getJoinCondtion(condition_info_map));
			//--------------------------------------------------------------------------------------------------
			// SQL文_個別部1
			//--------------------------------------------------------------------------------------------------
			if ( JPCModelConstant.FUNC_CD_1.equals( inMsg.getObject(ECR0011B050CBSMsg.FUNC_CODE).toString() ) ) {
				//WHERE句
				sql_Buff2.append(" WHERE ");
				// 使用部品 No.5 個別条件取得
				sql_Buff2.append(JCRModelCommon.getCondtion(condition_info_map));
 				//対応開始年月日 FROM
				sql_Buff2.append(" AND CR0011.TAIO_STA_DTM >= ?");
 				//対応開始年月日 TO
				sql_Buff2.append(" AND CR0011.TAIO_STA_DTM <= ?");
 				//無効フラグ
				sql_Buff2.append(" AND CR0011.MK_FLG = '0'");
			}
			//ソート
			sql_Buff2.append("ORDER BY CR0011.TOIAWASE_STAT_CD , CR0011.TAIO_KIROK_NO DESC")
					 .append(" ) TAIO_KIROK_COUNT");
			
			
			//prepareStatementにSQL文をセット
			pstmt2 = con1.prepareStatement(sql_Buff2.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff2);
			
			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			// パラメータの設定(ＫＥＹ＿対応開始年月日時分秒（ＦＲＯＭ）)
			CAANJDBCUtil.setParam(pstmt2, 1, inMsg.getObject(ECR0011B050CBSMsg.KEY_TAIO_STA_DTM_FROM));
			//ＫＥＹ＿対応開始年月日時分秒（ＴＯ）
			CAANJDBCUtil.setParam(pstmt2, 2, inMsg.getObject(ECR0011B050CBSMsg.KEY_TAIO_STA_DTM_TO));
			
			// ResultSetの取得
			rsltQuery2 = pstmt2.executeQuery();
			
			if (rsltQuery2.next())
			{
				int allCnt  = Integer.parseInt(rsltQuery2.getString("ALL_CNT"));
				
				int errCnt  = Integer.parseInt(workParam[0]);
				int warCnt  = Integer.parseInt(workParam[1]);
				
				//総件数がワーニングの規定値を超えた場合
				if(allCnt >= warCnt){
					inMsg.set( ECR0011B050CBSMsg.SEARCH_ERR_FLG , JPCModelConstant.SEARCH_ERR_FLG_WARCOUNT );
				}
				
				//総件数がエラーの規定値を超えた場合、件数取得して、処理終了
				if(allCnt >= errCnt){
					inMsg.set( ECR0011B050CBSMsg.TOTAL_SEARCH_NUM, rsltQuery2.getString("ALL_CNT"));
					inMsg.set( ECR0011B050CBSMsg.MAX_ERR_CNT , workParam[0] );
					inMsg.set( ECR0011B050CBSMsg.SEARCH_ERR_FLG , JPCModelConstant.SEARCH_ERR_FLG_ERRCOUNT );
					return;
				}
			}
//OM-2022-0000272 ADD END
			
			//SQL文作成
			StringBuffer sql_Buff = new StringBuffer();
			//SELECT句
			sql_Buff.append(" SELECT DISTINCT ");
			// 使用部品 No.3 出力項目取得
			sql_Buff.append(JCRModelCommon.getSelectItems(condition_info_map));
			
			//添付件数取得用
			sql_Buff.append(",( SELECT COUNT(*) TEMP_CNT ")
					.append(" FROM CR_T_TORK_EFILE_KNRI CR0231 ")
					.append(" WHERE ")
					.append(" CR0011.TAIO_KIROK_NO = CR0231.TAIO_KIROK_NO AND CR0231.MK_FLG = '0'  )");
			// v29.00.00 ANK-2922-00-00 ADD START
			sql_Buff.append(",CR0011.CALLBK_KIBO_YMD ")
					.append(",CR0011.CALLBK_KIBO_TIME ")
					.append(",CR0011.CALLBK_SHITEI_TYPE_CD ")
					.append(",(SELECT ")
					.append("    CD03.CD_DIV_NM ")
					.append("FROM ")
					.append("    ZM_M_CD_NM_KANRI CD03 ")
					.append("WHERE ")
					.append("    CD03.CD_SBT_CD  = 'CD00457'                   AND ")
					.append("    CD03.CD_DIV     = CR0011.CALLBK_SHITEI_TYPE_CD  AND ")
					.append("    CD03.CD_TSTAYMD <= SUBSTR(CR0011.UPD_DTM, 1, 8) AND ")
					.append("    CD03.CD_TENDYMD >= SUBSTR(CR0011.UPD_DTM, 1, 8) AND ")
					.append("    CD03.MK_FLG     = '0' ")
					.append(") AS CALLBK_SHITEI_TYPE_NM ");
			// v29.00.00 ANK-2922-00-00 ADD END
			//FROM句
			sql_Buff.append(" FROM ");
			// 使用部品 No.4 テーブル結合条件取得
			sql_Buff.append(JCRModelCommon.getJoinCondtion(condition_info_map));
			//--------------------------------------------------------------------------------------------------
			// SQL文_個別部1
			//--------------------------------------------------------------------------------------------------
			if ( JPCModelConstant.FUNC_CD_1.equals( inMsg.getObject(ECR0011B050CBSMsg.FUNC_CODE).toString() ) ) {
				//WHERE句
 				sql_Buff.append(" WHERE ");
				// 使用部品 No.5 個別条件取得
 				sql_Buff.append(JCRModelCommon.getCondtion(condition_info_map));
 				//対応開始年月日 FROM
 				sql_Buff.append(" AND CR0011.TAIO_STA_DTM >= ?");
 				//対応開始年月日 TO
 				sql_Buff.append(" AND CR0011.TAIO_STA_DTM <= ?");
 				//無効フラグ
 				sql_Buff.append(" AND CR0011.MK_FLG = '0'");
			}
			//ソート
			sql_Buff.append("ORDER BY CR0011.TOIAWASE_STAT_CD , CR0011.TAIO_KIROK_NO DESC");
			
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			// パラメータの設定(ＫＥＹ＿対応開始年月日時分秒（ＦＲＯＭ）)
			CAANJDBCUtil.setParam(pstmt, 1, inMsg.getObject(ECR0011B050CBSMsg.KEY_TAIO_STA_DTM_FROM));
			//ＫＥＹ＿対応開始年月日時分秒（ＴＯ）
			CAANJDBCUtil.setParam(pstmt, 2, inMsg.getObject(ECR0011B050CBSMsg.KEY_TAIO_STA_DTM_TO));
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// ECR0011B050CBSMsgの明細にセットする項目
			String[] msgKeyList1 = {
					  ECR0011B050CBSMsg1List.TAIO_KIROK_NO
					, ECR0011B050CBSMsg1List.UK_DTM
					, ECR0011B050CBSMsg1List.TITLE
					, ECR0011B050CBSMsg1List.SVC_KEI_NO_NM
					, ECR0011B050CBSMsg1List.TOIAWASE_STAT_CD
					, ECR0011B050CBSMsg1List.TOIAWASE_STAT_CD_NM
					, ECR0011B050CBSMsg1List.EOID
					, ECR0011B050CBSMsg1List.SVC_KEI_NO
					, ECR0011B050CBSMsg1List.TMP_SAVE_UM
					, ECR0011B050CBSMsg1List.UPD_DTM
// v10.00.00 ANK-2048-00-00 ADD START
					, ECR0011B050CBSMsg1List.EASY_MEMO
// v10.00.00 ANK-2048-00-00 ADD END
					, ECR0011B050CBSMsg1List.TEMP_CNT
					// v29.00.00 ANK-2922-00-00 ADD START
					, ECR0011B050CBSMsg1List.CALLBK_KIBO_YMD
					, ECR0011B050CBSMsg1List.CALLBK_KIBO_TIME
					, ECR0011B050CBSMsg1List.CALLBK_SHITEI_TYPE_CD
					, ECR0011B050CBSMsg1List.CALLBK_SHITEI_TYPE_NM
					// v29.00.00 ANK-2922-00-00 ADD END
			};
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery,msgKeyList1,"eo.ejb.cbs.cbsmsg.ECR0011B050CBSMsg1List",0);
			//検索件数のセット
			inMsg.set( ECR0011B050CBSMsg.TOTAL_SEARCH_NUM, String.valueOf( outMsg1.length ));
			//0件の場合のエラーフラグセット
			if ( outMsg1.length == 0 ) {
				inMsg.set( ECR0011B050CBSMsg.SEARCH_ERR_FLG , JPCModelConstant.SEARCH_ERR_FLG_ZERO );
			}

			// inMsg(CBSMsg)に明細をセット
			inMsg.set("ECR0011B050CBSMsg1List", outMsg1);
			

		}
		catch(SQLException e)
		{
			inMsg.set(ECR0011B050CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		}
		catch(IllegalArgumentException e)
		{
			inMsg.set(ECR0011B050CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		}
		finally
		{
			// 資源の解放
			try{
				if(rsltQuery != null){
					rsltQuery.close();
				}
// OM-2022-0000272 ADD START
				if(rsltQuery2 != null){
					rsltQuery2.close();
				}
// OM-2022-0000272 ADD END
				if(pstmt != null){
					pstmt.close();
				}
// OM-2022-0000272 ADD START
				if(pstmt2 != null){
					pstmt2.close();
				}
// OM-2022-0000272 ADD END
				if(con1 != null){
					closeConnection(con1);
				}
			}catch(SQLException e){
				inMsg.set(ECR0011B050CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
	
//OM-2022-0000272 ADD START
	/**
	*   業務パラメーターから問合せクエリエラー件数、問合せワーニング件数の規定値を取得
	*   @return String[]
	*/
	private String[] getWorkParam(){
		
		String[] workParam = new String[2];

		// 業務パラメータ管理よりエラー件数を取得する
		CAANMsg msgZM0321 = new CAANMsg(ZM0321ETMsg.class.getName());
		ZM0321LE le = new ZM0321LE();

		//問合せクエリ実行時エラー件数を取得
		msgZM0321.set(ZM0321ETMsg.WORK_PARAM_ID, "TAWS_QUERY_ERR_CNT");
		msgZM0321.set(ZM0321ETMsg.MK_FLG, JACStrConst.MK_FLG_YK);

		CAANMsg retZM0321 = le.findByPrimaryKey(msgZM0321);
		
		if(retZM0321!=null){
			workParam[0] = retZM0321.getString(ZM0321ETMsg.WORK_PARAM_SETTE_VALUE);
		}
		
		// 問合せクエリ実行時ワーニング件数を取得
		msgZM0321.set(ZM0321ETMsg.WORK_PARAM_ID, "TAWS_QUERY_WAR_CNT");
		
		retZM0321 = le.findByPrimaryKey(msgZM0321);
		
		if(retZM0321!=null){
			workParam[1] = retZM0321.getString(ZM0321ETMsg.WORK_PARAM_SETTE_VALUE);
		}

		return workParam;
	}
//OM-2022-0000272 ADD END

}
