/*******************************************************************************
* All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
* システム名        ：eo顧客基幹システム
* モジュール名      ：JZMSearcheoIDCC
* ソースファイル名  ：JZMSearcheoIDCC.java
* 作成者            ：富士通
* 日付              ：2012年01月31日
*＜機能概要＞
*   指定されたeoIDからあいまい検索を行い、検索結果をリスト形式で返します。
*＜修正履歴＞
*   バージョン    修正日      修正者      修正内容
*   v3.00         2012/01/31  FJ) 宮前    新規作成
*   v3.00         2012/01/31  FJ) 宮前    【ANK-0024-00-00】新規作成
*
********************************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;

import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.ECK0011B506CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B506CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0311B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0311B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg1List;

/**
 * eoIDあいまい検索コモンコンポーネント部品
 * @author FJ
 *
 */
public class JZMSearcheoIDCC extends AbstractCommonComponent 
{

	/** eoID あいまい検索サービスインターフェイス メッセージリスト */
	private static final String ECK0011_B506_CBSMSG1LIST = "ECK0011B506CBSMsg1List";

	/** eo ID */
	private static final String EOID = "eoid";

	/** eo ID 世代登録年月日時分秒 */
	private static final String KEY_GENE_ADD_DTM = "gene_add_dtm";

	/** システムID */
	private static final String KEY_SYSID = "sysid";

	/** 検索 トータルページ数 */
	private static final String KEY_TOTAL_PAGE_NUM = "total_page_num";

	/** 検索 トータル検索数 */
	private static final String KEY_TOTAL_SEARCH_NUM = "total_search_num";

	/** 検索条件 eo ID */
	private static final String KEY_EOID = "key_eoid";

	/** 検索エラーフラグ */
	private static final String KEY_SEARCH_ERR_FLG = "search_err_flg";

	/** 検索 1ページあたりの表示件数 */
	private static final String KEY_DISPLAY_PAGE_NUM = "display_page_num";
	
	/** 検索 ページ数 */
	private static final String KEY_DISPLAY_NUM = "display_num";

	/** 検索 最大件数 */
	private static final String KEY_MAX_SEARCH_NUM = "max_search_num";

	/** 検索タイプ */
	private static final String KEY_SEARCH_TYPE = "search_type";

	/** eo ID エイジング期間（業務パラメータ） */
	private static final String KEY_WK_PR_ZM_AGING_PRD_004 = "ZM_AGING_PRD_004";

	/** eo ID 検索セット（システムパラメータ） */
	private static final String KEY_SYS_PARAM_EOID_LIKE_SEARCH = "EOID_LIKE_SEARCH";

	/** 検索セット エラー項目 */
	private static final String SEARCH_KEY_SET_ERR = "search_key_set_err";

	/** 検索条件 eo ID */
	private static final String KEY_EOID_ERR = "key_eoid_err";

	/** ＫＥＹ＿業務パラメータID */
	private static final String KEY_WORK_PARAM_ID = "key_work_param_id";

	/** ＫＥＹ＿基準年月日 */
	private static final String KEY_STDARDYMD_ERR = "key_stdardymd_err";

	/** ＫＥＹ＿システムパラメータ分類コード */
	private static final String KEY_SYS_PARAM_BUNRUI_CD_ERR = "key_sys_param_bunrui_cd_err";

	/** CC エラーメッセージ 接頭辞 */
	private static final String KEY_RETURN_MESSAGE = "RETURN_MESSAGE_";

	/** CC エラーメッセージ */
	private static final String ERR_MSG_INVALID_RETURN_MESSAGE = "INVALID_RETURN_MESSAGE";

	/** マップ CC ID */
	private static final String CC_ID_SEARCHEOIDCC = "SEARCHEOIDCC";
	
	/** テンプレートID：EZM0311B010 */
	private static final String TEMPLATE_ID_EZM0311B010 = "EZM0311B010";
	
	/** テンプレートID：EZM0321A010 */
	private static final String TEMPLATE_ID_EZM0321A010 = "EZM0321A010";
	
	/** テンプレートID：ECK0011B506 */
	private static final String TEMPLATE_ID_ECK0011B506 = "ECK0011B506";
	
	/** 空文字 */
	private static final String BLANK = "";
	
	/** 初期eoID判定用 */
	private static final String INITIAL_EO_ID = "51";
	
	/**
	 * チェック
	 * <BR>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return HashMap<String, Object> 
	 * @throws RequestParameterException
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
																						throws RequestParameterException
	{
		
		// (1) サービスインターフェイスの作成
		// 上りマッピング処理(editInMsg)を呼び出す。
		HashMap<String, Object> paramMap = editInMsgForSysParam(param);
		
		// (2) リクエストパラメータ返却
		return paramMap;
	}
	
	/**
	 * eoIDあいまい検索一覧照会取得処理
	 * <BR>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return IrequestRparameterReadWrite
	 * @throws Exception
	 */
	public IRequestParameterReadWrite searcheoID(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
																						throws Exception
	{
		
		// (1) サービスインターフェイスの作成（EZM0311B010 システムパラメータ管理サービスインターフェイス）		
		// 上りマッピング処理（editInMsgForSysParam）を呼び出す。
		HashMap<String, Object> paramMap = editInMsgForSysParam(param);
		
		// (2) サービスインターフェイスの実行		
		// SC呼び出しクラス(com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker)を使用して、サービスインターフェイスを実行する。
		ServiceComponentRequestInvoker scEZM0311B010 = new ServiceComponentRequestInvoker();
		Map<?, ?> resultSysParam = scEZM0311B010.run(paramMap, handle);
		
		// (3) サービスインターフェイス実行結果判定
		// サービスインターフェイスの実行結果がエラーの場合、エラー処理（editErrorInfo）を呼び出し、処理を終了する。
		// テンプレート取得
		CAANMsg[] templates = (CAANMsg[])resultSysParam.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		// リターンコード取得
		int returnCode = (Integer)resultSysParam.get(JCMConstants.RET_CD_INT_KEY);
		
		// エラー処理
		editErrorInfo(param, templates, returnCode);
		
		// ◇処理結果の判定
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = resultSysParam.get(JCMConstants.RET_CD_INT_KEY).toString();
		String status = (String)param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == Integer.parseInt(status))) 
		{
			SCCallException scCallEx = new SCCallException(ERR_MSG_INVALID_RETURN_MESSAGE, rtnCode, Integer.parseInt(status));
			throw scCallEx;
		}
		
		// (4) サービスインターフェイスの作成（EZM0321A010 業務パラメータ管理サービスインターフェイス）		
		// 上りマッピング処理（editInMsgForWkParam）を呼び出す。
		paramMap = editInMsgForWkParam(param);
		
		Map<?, ?> resultWkParam = scEZM0311B010.run(paramMap, handle);
		
		// (6) サービスインターフェイス実行結果判定
		// サービスインターフェイスの実行結果がエラーの場合、エラー処理（editErrorInfo）を呼び出し、処理を終了する。
		// テンプレート取得
		templates = (CAANMsg[])resultWkParam.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		// リターンコード取得
		returnCode = (Integer)resultWkParam.get(JCMConstants.RET_CD_INT_KEY);
		
		// エラー処理
		editErrorInfo(param, templates, returnCode);
		
		// ◇処理結果の判定
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		rtnCode = resultWkParam.get(JCMConstants.RET_CD_INT_KEY).toString();
		status = (String)param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == Integer.parseInt(status))) 
		{
			SCCallException scCallEx = new SCCallException(ERR_MSG_INVALID_RETURN_MESSAGE, rtnCode, Integer.parseInt(status));
			throw scCallEx;
		}
		
		// (7) サービスインターフェイスの作成（ECK0011B506 eoIDあいまい検索一覧照会サービスインターフェイス）
		//     上りマッピング処理（editInMsg）を呼び出す。
		paramMap = editInMsg(resultSysParam, resultWkParam, param);
		
		// (8) サービスインターフェイスの実行
		//     SC呼び出しクラス(com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker)を使用して、サービスインターフェイスを実行する。
		ServiceComponentRequestInvoker scECK0011B506 = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scECK0011B506.run(paramMap, handle);
		
		// (9) サービスインターフェイス処理結果の取得		
		//     下りマッピング処理（editOutMsg）を呼び出す。
		editOutMsg(result, param);
		
		// (10) リクエストパラメータ返却		
		//     リクエストパラメータを返却する。
		return param;
	}
	
	/**
	 * エラー情報マッピング
	 * <BR>
	 * @param param リクエストパラメータ
	 * @param templates テンプレート
	 * @param returnCode リターンコード
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode) 
																							throws RequestParameterException
	{
		CAANMsg template = templates[0];
		int templateStatus = 0;
		
		boolean isEZM0311B010SIF = false;
		boolean isEZM0321A010SIF = false;
		if(EZM0311B010CBSMsg.class.getName().equals(template.getSchemaName()))
		{
			isEZM0311B010SIF = true;
		}
		if(EZM0321A010CBSMsg.class.getName().equals(template.getSchemaName()))
		{
			isEZM0321A010SIF = true;
		}
		
		// ステータスの取得
		if(isEZM0311B010SIF)
		{
			templateStatus = template.getInt(EZM0311B010CBSMsg.STATUS);
		}
		else
		{
			templateStatus = template.getInt(ECK0011B506CBSMsg.STATUS);
		}
		
		// リターンコードによる判定
		if (returnCode != 0)
		{
			templateStatus = 9000;
		}
		
		if (JCMAPLConstMgr.getString(KEY_RETURN_MESSAGE + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString(KEY_RETURN_MESSAGE + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		HashMap inMap = null;
		
		// ユーザデータ情報
		inMap = (HashMap)param.getData(CC_ID_SEARCHEOIDCC);
		if (inMap == null)
		{
			inMap = new HashMap();
			param.setData(CC_ID_SEARCHEOIDCC, inMap);
		}
		
		if(isEZM0311B010SIF)
		{
			
			// ＫＥＹ＿システムパラメータ分類コード
			if (!template.isNull(EZM0311B010CBSMsg.KEY_SYS_PARAM_BUNRUI_CD_ERR))
			{
				if (!inMap.containsKey(KEY_SYS_PARAM_BUNRUI_CD_ERR))
				{
					inMap.put(KEY_SYS_PARAM_BUNRUI_CD_ERR, template.getString(EZM0311B010CBSMsg.KEY_SYS_PARAM_BUNRUI_CD_ERR));
				}
			}
			
			// ＫＥＹ＿基準年月日
			if (!template.isNull(EZM0311B010CBSMsg.KEY_STDARDYMD_ERR))
			{
				if (!inMap.containsKey(KEY_STDARDYMD_ERR))
				{
					inMap.put(KEY_STDARDYMD_ERR, template.getString(EZM0311B010CBSMsg.KEY_STDARDYMD_ERR));
				}
			}
		}
		else if(isEZM0321A010SIF)
		{
			
			// ＫＥＹ＿業務パラメータID
			if(!template.isNull(EZM0321A010CBSMsg.KEY_WORK_PARAM_ID_ERR))
			{
				if(!inMap.containsKey(KEY_WORK_PARAM_ID))
				{
					inMap.put(KEY_WORK_PARAM_ID, template.getString(EZM0321A010CBSMsg.KEY_WORK_PARAM_ID_ERR));
				}
			}
		}
		else
		{
			
			// ＫＥＹ＿ｅｏＩＤ
			if (!template.isNull(ECK0011B506CBSMsg.KEY_EOID_ERR))
			{
				if (!inMap.containsKey(KEY_EOID_ERR))
				{
					inMap.put(KEY_EOID_ERR, template.getString(ECK0011B506CBSMsg.KEY_EOID_ERR));
				}
			}
			
			// 検索キーセット
			if (!template.isNull(ECK0011B506CBSMsg.SEARCH_KEY_SET_ERR))
			{
				if (!inMap.containsKey(SEARCH_KEY_SET_ERR))
				{
					inMap.put(SEARCH_KEY_SET_ERR, template.getString(ECK0011B506CBSMsg.SEARCH_KEY_SET_ERR));
				}
			}
			
		}
		return param;
	}
	
	/**
	 * システムパラメータ管理一覧照会 上りマッピング
	 * @param param リクエストパラメータ
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsgForSysParam(IRequestParameterReadWrite param) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		
		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		
		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		
		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		CAANMsg template = new CAANMsg(EZM0311B010CBSMsg.class.getName());
		
		// テンプレートID
		template.set(EZM0311B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EZM0311B010);
		
		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);
		
		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);
		
		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);
		
		//機能コード
		template.set(EZM0311B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
		
		// 検索処理パターン
		template.setNull(EZM0311B010CBSMsg.SEARCH_TYPE);
		
		// 最大検索件数
		template.setNull(EZM0311B010CBSMsg.MAX_SEARCH_NUM);
		
		// 表示件数
		template.setNull(EZM0311B010CBSMsg.DISPLAY_NUM);
		
		// 表示ページ番号
		template.setNull(EZM0311B010CBSMsg.DISPLAY_PAGE_NUM);
		
		// 検索エラーフラグ
		template.setNull(EZM0311B010CBSMsg.SEARCH_ERR_FLG);
		
		//ＫＥＹ＿システムパラメータ分類コード
		template.set(EZM0311B010CBSMsg.KEY_SYS_PARAM_BUNRUI_CD, KEY_SYS_PARAM_EOID_LIKE_SEARCH);
		
		//ＫＥＹ＿基準年月日
		template.set(EZM0311B010CBSMsg.KEY_STDARDYMD, JCCBPCommon.getSysDate());
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * システムパラメータ管理一覧照会 上りマッピング
	 * @param param リクエストパラメータ
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsgForWkParam(IRequestParameterReadWrite param) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		
		// 依頼元IPアドレス
		
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		
		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		
		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		CAANMsg template = new CAANMsg(EZM0321A010CBSMsg.class.getName());
		
		// テンプレートID
		template.set(EZM0321A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EZM0321A010);
		
		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);
		
		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);
		
		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);
		
		// 機能コード
		template.set(EZM0321A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
		
		// 検索処理パターン
		template.setNull(EZM0321A010CBSMsg.SEARCH_TYPE);
		
		// 最大検索件数
		template.setNull(EZM0321A010CBSMsg.MAX_SEARCH_NUM);
		
		// 表示件数
		template.setNull(EZM0321A010CBSMsg.DISPLAY_NUM);
		
		// 表示ページ番号
		template.setNull(EZM0321A010CBSMsg.DISPLAY_PAGE_NUM);
		
		// 検索エラーフラグ
		template.setNull(EZM0321A010CBSMsg.SEARCH_ERR_FLG);
		
		// ＫＥＹ＿システムパラメータ分類コード
		template.set(EZM0321A010CBSMsg.KEY_WORK_PARAM_ID, KEY_WK_PR_ZM_AGING_PRD_004);
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * 上りマッピング処理
	 * @param msglist_sys サービスインターフェイスから返却された下りユーザ情報（システムパラメータ）
	 * @param msglist_wk サービスインターフェイスから返却された下りユーザ情報（業務パラメータ）
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @return HashMap<String, Object> 
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(Map<?, ?> msglist_sys, Map<?, ?> msglist_wk, IRequestParameterReadWrite param) 
	throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		
		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		
		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		
		CAANMsg template = new CAANMsg(ECK0011B506CBSMsg.class.getName());
		
		// テンプレートID
		template.set(ECK0011B506CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0011B506);
		
		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);
		
		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);
		
		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);
		
		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(CC_ID_SEARCHEOIDCC);
		if (inMap == null)
		{
			inMap = new HashMap<String, Object>();
			param.setData(CC_ID_SEARCHEOIDCC, inMap);
		}
		
		// テンプレートID
		template.set(ECK0011B506CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0011B506);
		
		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);
		
		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);
		
		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);
		
		// 機能コード
		if(BLANK.equals(inMap.get(JCMConstants.FUNC_CODE_KEY)))
		{
			template.setNull(JCMConstants.FUNC_CODE_KEY);
		}
		else
		{
			template.set(ECK0011B506CBSMsg.FUNC_CODE, (String)inMap.get(JCMConstants.FUNC_CODE_KEY));
		}
		
		// 検索処理パターン
		if (BLANK.equals(inMap.get(KEY_SEARCH_TYPE)))
		{
			template.setNull(ECK0011B506CBSMsg.SEARCH_TYPE);
		}
		else
		{
			template.set(ECK0011B506CBSMsg.SEARCH_TYPE, (String)inMap.get(KEY_SEARCH_TYPE));
		}

		// 最大検索件数
		if (BLANK.equals(inMap.get(KEY_MAX_SEARCH_NUM)))
		{
			template.setNull(ECK0011B506CBSMsg.MAX_SEARCH_NUM);
		}
		else
		{
			template.set(ECK0011B506CBSMsg.MAX_SEARCH_NUM, (String)inMap.get(KEY_MAX_SEARCH_NUM));
		}

		// 表示件数
		if (BLANK.equals(inMap.get(KEY_DISPLAY_NUM)))
		{
			template.setNull(ECK0011B506CBSMsg.DISPLAY_NUM);
		}
		else
		{
			template.set(ECK0011B506CBSMsg.DISPLAY_NUM, (String)inMap.get(KEY_DISPLAY_NUM));
		}

		// 表示ページ番号
		if (BLANK.equals(inMap.get(KEY_DISPLAY_PAGE_NUM)))
		{
			template.setNull(ECK0011B506CBSMsg.DISPLAY_PAGE_NUM);
		}
		else
		{
			template.set(ECK0011B506CBSMsg.DISPLAY_PAGE_NUM, (String)inMap.get(KEY_DISPLAY_PAGE_NUM));
		}

		// 検索エラーフラグ
		if (BLANK.equals(inMap.get(KEY_SEARCH_ERR_FLG)))
		{
			template.setNull(ECK0011B506CBSMsg.SEARCH_ERR_FLG);
		}
		else
		{
			template.set(ECK0011B506CBSMsg.SEARCH_ERR_FLG, (String)inMap.get(KEY_SEARCH_ERR_FLG));
		}
		
		// ＫＥＹ＿ｅｏＩＤ
		if(BLANK.equals(inMap.get(KEY_EOID)))
		{
			template.setNull(ECK0011B506CBSMsg.KEY_EOID);
		}
		else
		{
			template.set(ECK0011B506CBSMsg.KEY_EOID, (String)inMap.get(KEY_EOID));
		}
		
		// (1) 検索キーセット
		String keySet = createSearchKeySet(msglist_sys);
		if(keySet == null)
		{
			template.setNull(ECK0011B506CBSMsg.SEARCH_KEY_SET);
		}
		else
		{
			template.set(ECK0011B506CBSMsg.SEARCH_KEY_SET, keySet);
		}
		
		// ＫＥＹ＿基準年月日
		template.set(ECK0011B506CBSMsg.KEY_STDARDYMD, JCCBPCommon.getSysDate());
		
		// ＫＥＹ＿履歴検索期間
		template.set(ECK0011B506CBSMsg.KEY_RK_SEARCH_PRD, getEoIDAging(msglist_wk));
		
		CAANMsg[] templates_ECK0011B506 = new CAANMsg[1];
		templates_ECK0011B506[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates_ECK0011B506);

		return paramMap;
	}
	
	/**
	 * 下りマッピング処理
	 * @param msgList サービスインターフェイスから返却された下りユーザ情報
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @return IRequestParameterReadWrite モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @throws Exception
	 */
	private IRequestParameterReadWrite editOutMsg(Map<?, ?> msgList, IRequestParameterReadWrite param) throws Exception
	{
		
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;

		// リターンコード取得
		Object return_code = msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// 結果を詰めるマップを取得。
		HashMap<String, Object> dataMap = null;
		ArrayList<HashMap<String, Object>> dataList = null;

		// 業務データ設定
		dataMap = (HashMap<String, Object>)param.getData(CC_ID_SEARCHEOIDCC);
		if (dataMap == null)
		{
			dataMap = new HashMap<String, Object>();
			param.setData(CC_ID_SEARCHEOIDCC, dataMap);
		}
		
		// 検索系 共通部
		dataMap.put(KEY_TOTAL_SEARCH_NUM, parentTemplate.getString(KEY_TOTAL_SEARCH_NUM));
		dataMap.put(KEY_TOTAL_PAGE_NUM, parentTemplate.getString(KEY_TOTAL_PAGE_NUM));
		dataMap.put(KEY_SEARCH_ERR_FLG, parentTemplate.getString(KEY_SEARCH_ERR_FLG));
		
		// Key_eoid
		String key_eoid = "";
		if(!BLANK.equals(dataMap.get(KEY_EOID)))
		{
			key_eoid = (String)dataMap.get(KEY_EOID);
		}
		
		templateArray = parentTemplate.getCAANMsgList(ECK0011B506CBSMsg.ECK0011B506CBSMSG1LIST);
		dataList = (ArrayList<HashMap<String, Object>>)dataMap.get(ECK0011_B506_CBSMSG1LIST);

		if (dataList == null)
		{
			dataList = new ArrayList<HashMap<String, Object>>();
		}

		if (templateArray != null)
		{
			for (int i = 0; i < templateArray.length; i++)
			{
				CAANMsg childTemplate = templateArray[i];
				if(i >= dataList.size())
				{
					dataList.add(new HashMap<String, Object>());
				}
				HashMap<String, Object> childMap = (HashMap<String, Object>)dataList.get(i);
				
				// ＳＹＳＩＤ
				if(childTemplate.isNull(ECK0011B506CBSMsg1List.SYSID))
				{
					childMap.put(KEY_SYSID, "");
				}
				else
				{
					childMap.put(KEY_SYSID, childTemplate.getString(ECK0011B506CBSMsg1List.SYSID));
				}
				
				// 世代登録年月日時分秒
				if(childTemplate.isNull(ECK0011B506CBSMsg1List.GENE_ADD_DTM))
				{
					childMap.put(KEY_GENE_ADD_DTM, "");
				}
				else
				{
					childMap.put(KEY_GENE_ADD_DTM, childTemplate.getString(ECK0011B506CBSMsg1List.GENE_ADD_DTM));
				}
				if(!"".equals(key_eoid) && key_eoid.startsWith(INITIAL_EO_ID))
				{
					
					// ｅｏＩＤ 検索条件 key_eoidが初期eoIDの場合、取得した初期eoIDをマッピングする。
					// 初期ｅｏＩＤ
					if(childTemplate.isNull(ECK0011B506CBSMsg1List.SHK_EOID))
					{
						childMap.put(EOID, "");
					}
					else
					{
						childMap.put(EOID, childTemplate.getString(ECK0011B506CBSMsg1List.SHK_EOID));
					}
				}
				else
				{
					
					// ｅｏＩＤ 検索条件 key_eoidが初期eoID以外の場合、取得したeoIDをマッピングする。
					// ｅｏＩＤ
					if(childTemplate.isNull(ECK0011B506CBSMsg1List.EOID))
					{
						childMap.put(EOID, "");
					}
					else
					{
						childMap.put(EOID, childTemplate.getString(ECK0011B506CBSMsg1List.EOID));
					}
				}
			}
		}
		dataMap.put(ECK0011_B506_CBSMSG1LIST, dataList);

        // エラー情報の設定
		editErrorInfo(param, templates, (Integer)return_code);
		
		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));
		
		
		// ◇処理結果の判定
		
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = msgList.get(JCMConstants.RET_CD_INT_KEY).toString();
		String status = (String)param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == Integer.parseInt(status))) 
		{
			SCCallException scCallEx = new SCCallException(ERR_MSG_INVALID_RETURN_MESSAGE, rtnCode, Integer.parseInt(status));
			throw scCallEx;
		}

		return param;
	}
	
	/**
	 * 検索キーセット作成
	 * @param msgList SCからの戻り値
	 * @return String 検索キーセット
	 */
	private String createSearchKeySet(Map<?, ?> msgList)
	{
		
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates_EZM0311B010 = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template_EZM0311B010 = templates_EZM0311B010[0];
		
		// システムパラメータ一覧照会 検索結果
		CAANMsg[] template_EZM0311B010Array = template_EZM0311B010.getCAANMsgList(EZM0311B010CBSMsg.EZM0311B010CBSMSG1LIST);
		
		// システムパラメータから1件も取得できなかった場合。
		if(template_EZM0311B010Array == null)
		{
			return null;
		}
		
		// 検索キーセット
		StringBuffer keySet = new StringBuffer();
		
		for(int iCnt = 0; iCnt < template_EZM0311B010Array.length; iCnt++)
		{
			
			// システムパラメータ設定値1
			if(!template_EZM0311B010Array[iCnt].isNull(EZM0311B010CBSMsg1List.SYS_PARAM_SETTE_VALUE_1))
			{
				keySet.append(template_EZM0311B010Array[iCnt].getString(EZM0311B010CBSMsg1List.SYS_PARAM_SETTE_VALUE_1))
					.append(" ");
			}
		}
		if(keySet.length() == 0)
		{
			return null;
		}
		else
		{
			return keySet.toString();
		}
	}
	
	/**
	 * エイジング期間を取得します。
	 * @param msglist SCからの戻り値
	 * @return String エイジング期間
	 */
	private String getEoIDAging(Map<?, ?> msglist)
	{
		
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates_EZM0321A010 = (CAANMsg[])msglist.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template_EZM0321A010 = templates_EZM0321A010[0];
		
		// システムパラメータ一覧照会 検索結果
		CAANMsg[] template_EZM0311B010Array = template_EZM0321A010.getCAANMsgList(EZM0321A010CBSMsg.EZM0321A010CBSMSG1LIST);
		
		// システムパラメータから1件も取得できなかった場合。
		if(template_EZM0311B010Array == null)
		{
			return null;
		}
		return template_EZM0311B010Array[0].getString(EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE);
	}
}
