/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKsvkeiGrpSeteAddCC
*   ソースファイル名：JKKsvkeiGrpSeteAddCC.java
*   作成者          ：富士通
*   日付            ：2015年07月16日
*＜機能概要＞
*   eo電気契約取得(SYSID)CC
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v16.00.00   2015/07/16   FJ）阮  ANK-2480-00-00 新電力対応
*   v41.00.00	2019/04/24   FJ) 上間  【ANK-3638-00-00】eo電気紐付けプルダウンリストの表示条件変更
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKAdchgConstCC;
import com.fujitsu.futurity.bp.custom.constant.JKKSvcConst;
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.JKKStrConst;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B016CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2961B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2961B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2961B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2961B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2961D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2961E010CBSMsg;


/**
 * サービス契約グループ設定登録コモンコンポーネント部品です。
 * <br>
 * @author 富士通
 */
public class JKKsvkeiGrpSeteAddCC extends AbstractCommonComponent
{
	/** エラーメッセージ */
	public static final String ERR_MSG = "INVALID_RETURN_MESSAGE";

	/**
	 * eo電気契約取得(SYSID)を行います。
	 * <br>
	 * 
	 * @param	handle		セッションハンドル
	 * @param	param		リクエストパラメータ
	 * @param	fixedText	サービスメッセージ
	 * @return	param		リクエストパラメータ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite geteoDksysid(
			SessionHandle				handle
		,	IRequestParameterReadWrite	param
		,	String						fixedText
	) throws Throwable
	{
		
		// 住所変更登録コモンコンポーネントマッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
		// SCリクエストInvokerを取得
		HashMap<String, String> condMap = new HashMap<String, String>();
		
		// ユーザ情報取得
		HashMap<String, Object> CCmap = (HashMap<String, Object>)param.getData(fixedText);
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		// ＫＥＹ＿同一利用場所eo電気リスト
		String svcKeiInf = (String)CCmap.get("ITENS_EOELEC_SVKEI_NO");
		// ＫＥＹ＿移転先サービス契約回線内訳
		String itensSvkeiKisenUcwkNo = (String)CCmap.get("itens_svkei_kaisen_ucwk_no");
		// 異動区分
		String idoDiv = (String)CCmap.get("ido_div");
		// 機能コード
		String funcCode = (String)CCmap.get("func_code");
				
		// データなしの場合は処理終了
		if (svcKeiInf == null || "".equals(svcKeiInf)
				|| itensSvkeiKisenUcwkNo == null || "".equals(itensSvkeiKisenUcwkNo))
		{
			return param;
		} else if ("該当なし".equals(svcKeiInf))
		{
			// 転居先回線がNULLでない場合
			if (itensSvkeiKisenUcwkNo != null && !"".equals(itensSvkeiKisenUcwkNo)) {
				// サービス契約グループ設定一覧照会（サービス契約番号）
				ArrayList<HashMap<String, Object>> listMapEKK2961B002Out = null;
				listMapEKK2961B002Out = callEKK2961B002(
						handle
					,	param
					,	CCmap
					,	fixedText
					,	itensSvkeiKisenUcwkNo
				);
				if (listMapEKK2961B002Out.size() <= 0) {
					// 対象サービスは現状どの回線とも紐付き無のため、後続処理は不要
					return param;
				}
				// 該当グループの削除を行なう
				else
				{
					for (int i = 0;i < listMapEKK2961B002Out.size(); i++ ) {
						HashMap<String, Object> mapChildEKK2961B002O = listMapEKK2961B002Out.get(i);
						String svcKeiNo = (String)mapChildEKK2961B002O.get(EKK2961B002CBSMsg1List.SVC_KEI_NO);
						ArrayList<HashMap<String, Object>> listMapEKK0081A010;
						{
							HashMap<String, Object> inMap = new HashMap<String, Object>();
							// サービス契約番号
							inMap.put("svc_kei_no", svcKeiNo);
							// 予約適用年月日
							inMap.put("rsv_aply_ymd", JCCBPCommon.getOpeDate(null));
							// サービス契約一意照会(カレント取得)
							listMapEKK0081A010 = callEKK0081A010(handle, param, inMap, "2");
							if (listMapEKK0081A010 != null && listMapEKK0081A010.size() > 0)
							{
								// サービス契約ステータスが「解約済み」「キャンセル済み」ならば削除対象としない
								String svcKeiStat = (String)listMapEKK0081A010.get(0).get(EKK0081A010CBSMsg1List.SVC_KEI_STAT);
								if (JKKSvcConst.SVC_KEI_STAT_910.equals(svcKeiStat) || JKKSvcConst.SVC_KEI_STAT_920.equals(svcKeiStat))
								{
									continue;
								}
							}
						}
						condMap.clear();
						condMap.put(EKK2961E010CBSMsg.SVKEI_GRP_SETE_NO, (String)mapChildEKK2961B002O.get(EKK2961B002CBSMsg1List.SVKEI_GRP_SETE_NO));
						HashMap<String, Object> reqMap = mapper.setEKK2961E010(param, fixedText, condMap ,funcCode);
						Map<?, ?> resMap = scCall.run(reqMap, handle);
						mapper.getEKK2961E010(param, fixedText, resMap);
						mapper.scResultCheck(param);
					}
					return param;
				}
			}
			else
			{
				// ないもしない
				return param;
			}
			
		}
		
		// 有効な文字列と判断
		String [] itensEoElecSvkeisub = svcKeiInf.split(":", -1);
		
		// １項目目サービス契約を摘出
		if (itensEoElecSvkeisub.length >= 3) {
			svcKeiInf = (String)itensEoElecSvkeisub[0];
		}
		else
		{
			// 不正な分割文字のため、何もしない
		}
		
		// サービス契約グループ設定一覧照会（サービス契約番号）
		ArrayList<HashMap<String, Object>> listMapEKK2961B001Out = null;
		listMapEKK2961B001Out = callEKK2961B001(
				handle
			,	param
			,	CCmap
			,	fixedText
			,	svcKeiInf
		);
		
		if (listMapEKK2961B001Out.size() <= 0) {
			// 対象サービスは現状どの回線とも紐付き無のため後続に遷移
		}
		else
		{
			for (int i = 0; i < listMapEKK2961B001Out.size(); i++) {
				HashMap<String, Object> mapChildEKK2961B001O = listMapEKK2961B001Out.get(i);
				String kizonSvcKeiNo = (String)mapChildEKK2961B001O.get(EKK2961B001CBSMsg1List.SVC_KEI_NO);
				String kizonSvkeiGrpSkbtNo = (String)mapChildEKK2961B001O.get(EKK2961B001CBSMsg1List.SVKEI_GRP_SKBT_NO);
				
				// 住所変更本登録モードで転居先と紐付けしているデータが来た場合のみ何も更新せずにリターン
				if (svcKeiInf.equals(kizonSvcKeiNo) && itensSvkeiKisenUcwkNo.equals(kizonSvkeiGrpSkbtNo)) {
					return param;
				}
				else {
// ANK-3638-00-00 MOD START
//					// 後続に進む
					// 取得したサービス契約グループ設定が登録対象の回線とサービス契約（電気）のレコードでない場合、削除する
					ArrayList<HashMap<String, Object>> listMapEKK0081A010;
					HashMap<String, Object> inMap = new HashMap<String, Object>();
					// サービス契約番号
					inMap.put("svc_kei_no", kizonSvcKeiNo);
					// 予約適用年月日
					inMap.put("rsv_aply_ymd", JCCBPCommon.getOpeDate(null));
					// サービス契約一意照会(カレント取得)
					listMapEKK0081A010 = callEKK0081A010(handle, param, inMap, "2");
					if (listMapEKK0081A010 != null && listMapEKK0081A010.size() > 0)
					{
						// サービス契約ステータスが「解約済み」「キャンセル済み」ならば削除対象としない
						String svcKeiStat = (String)listMapEKK0081A010.get(0).get(EKK0081A010CBSMsg1List.SVC_KEI_STAT);
						if (JKKSvcConst.SVC_KEI_STAT_910.equals(svcKeiStat) || JKKSvcConst.SVC_KEI_STAT_920.equals(svcKeiStat))
						{
							continue;
						}
					}
					condMap.clear();
					condMap.put(EKK2961E010CBSMsg.SVKEI_GRP_SETE_NO, (String)mapChildEKK2961B001O.get(EKK2961B001CBSMsg1List.SVKEI_GRP_SETE_NO));
					HashMap<String, Object> reqMap = mapper.setEKK2961E010(param, fixedText, condMap ,funcCode);
					Map<?, ?> resMap = scCall.run(reqMap, handle);
					mapper.getEKK2961E010(param, fixedText, resMap);
					mapper.scResultCheck(param);
// ANK-3638-00-00 MOD END
				}
				
			}
		}
		
		// 直前で登録するデータが既存かどうか確認しているため、更新値が既存値と同値の場合は何もしない、
		// 更新値が既存値に存在しない場合、まずは既存の紐付きを確認し、存在する場合は削除
		// 転居先回線がNULLでない場合
		if (itensSvkeiKisenUcwkNo != null && !"".equals(itensSvkeiKisenUcwkNo)) {
			// サービス契約グループ設定一覧照会（サービス契約番号）
			ArrayList<HashMap<String, Object>> listMapEKK2961B002Out = null;
			listMapEKK2961B002Out = callEKK2961B002(
					handle
				,	param
				,	CCmap
				,	fixedText
				,	itensSvkeiKisenUcwkNo
			);
			if (listMapEKK2961B002Out.size() <= 0) {
				// 対象サービスは現状どの回線とも紐付き無のため、後続処理へ
			}
			// 該当グループの削除を行なう
			else
			{
				for (int i = 0;i < listMapEKK2961B002Out.size(); i++ ) {
					HashMap<String, Object> mapChildEKK2961B002O = listMapEKK2961B002Out.get(i);
					String svcKeiNo = (String)mapChildEKK2961B002O.get(EKK2961B002CBSMsg1List.SVC_KEI_NO);
					ArrayList<HashMap<String, Object>> listMapEKK0081A010;
					{
						HashMap<String, Object> inMap = new HashMap<String, Object>();
						// サービス契約番号
						inMap.put("svc_kei_no", svcKeiNo);
						// 予約適用年月日
						inMap.put("rsv_aply_ymd", JCCBPCommon.getOpeDate(null));
						// サービス契約一意照会(カレント取得)
						listMapEKK0081A010 = callEKK0081A010(handle, param, inMap, "2");
						if (listMapEKK0081A010 != null && listMapEKK0081A010.size() > 0)
						{
							// サービス契約ステータスが「解約済み」「キャンセル済み」ならば削除対象としない
							String svcKeiStat = (String)listMapEKK0081A010.get(0).get(EKK0081A010CBSMsg1List.SVC_KEI_STAT);
							if (JKKSvcConst.SVC_KEI_STAT_910.equals(svcKeiStat) || JKKSvcConst.SVC_KEI_STAT_920.equals(svcKeiStat))
							{
								continue;
							}
						}
					}
					condMap.clear();
					condMap.put(EKK2961E010CBSMsg.SVKEI_GRP_SETE_NO, (String)mapChildEKK2961B002O.get(EKK2961B002CBSMsg1List.SVKEI_GRP_SETE_NO));
					HashMap<String, Object> reqMap = mapper.setEKK2961E010(param, fixedText, condMap ,funcCode);
					Map<?, ?> resMap = scCall.run(reqMap, handle);
					mapper.getEKK2961E010(param, fixedText, resMap);
					mapper.scResultCheck(param);
				}
			}
		}
		else
		{
			// ないもしない
			return param;
		}
		
		condMap.clear();
		condMap.put(EKK2961D010CBSMsg.SVC_KEI_NO, svcKeiInf);
		condMap.put(EKK2961D010CBSMsg.SVKEI_GRP_SBT_CD, "01");
		condMap.put(EKK2961D010CBSMsg.SVKEI_GRP_SKBT_NO, itensSvkeiKisenUcwkNo);
		condMap.put(EKK2961D010CBSMsg.SVKEI_GRP_SETE_TSTAYMD, "19000101");
		condMap.put(EKK2961D010CBSMsg.FUNC_CODE, funcCode);

		HashMap<String, Object> reqMap = mapper.setEKK2961D010(param, fixedText, condMap);
		Map<?, ?> resMap = scCall.run(reqMap, handle);
		mapper.getEKK2961D010(param, fixedText, resMap);
		mapper.scResultCheck(param);

		return param;
	}
	
	/**
	 * サービス契約グループ設定一覧照会（サービス契約番号）SIFを呼び出します。
	 * @param	handle				セッションハンドル
	 * @param	param				リクエストパラメータ
	 * @param	fixedText			サービスメッセージ
	 * @param	listMapEKK0081B016	EKK0081B016eo電気契約取得結果
	 * @return	result				処理結果
	 * @throws Throwable 
	 */
	private ArrayList<HashMap<String, Object>> callEKK2961B001(
			SessionHandle				handle
		,	IRequestParameterReadWrite	param
		,	HashMap<String, Object>		CCmap
		,	String						fixedText
		,	String						svcKeiNo
	) throws Throwable
	{
		ArrayList<HashMap<String, Object>>	listResult = new ArrayList<HashMap<String, Object>>();;

		// テンプレート作成
		CAANMsg template = new CAANMsg(EKK2961B001CBSMsg.class.getName());
		// テンプレートID
		template.set(EKK2961B001CBSMsg.TEMPLATEID, "EKK2961B001");
		// 機能コード
		template.set(EKK2961B001CBSMsg.FUNC_CODE, "1");
		// テンプレート共通情報設定処理
		setTemplateCommon(param, template);
		// ＫＥＹ＿サービス契約番号
		template.set(EKK2961B001CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
		// ＫＥＹ＿サービス契約グループ種別コード
		template.set(EKK2961B001CBSMsg.KEY_SVKEI_GRP_SBT_CD, "01");

		// SIF実行
		Map<?, ?> mapSIFResult = null;
		mapSIFResult = executeSIF(handle, param, fixedText, template);

		// ユーザ情報エラー設定
		CAANMsg[] retTemplates = (CAANMsg[])mapSIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg retTemplate = retTemplates[0];
		if (!retTemplate.isNull(EKK2961B001CBSMsg.KEY_SVC_KEI_NO_ERR)) {
			if (!CCmap.containsKey("sysid_err")) {
				CCmap.put("sysid_err", retTemplate.getString(EKK2961B001CBSMsg.KEY_SVC_KEI_NO_ERR));
			}
		}
		if (!retTemplate.isNull(EKK2961B001CBSMsg.EKK2961B001CBSMSG1LIST_ERR)) {
			if (!CCmap.containsKey("sysid_err")) {
				CCmap.put("sysid_err", retTemplate.getString(EKK2961B001CBSMsg.EKK2961B001CBSMSG1LIST_ERR));
			}
		}

				// SIF実行エラーチェック
		executeSIFErrCheck(mapSIFResult);

		// 処理結果リストを設定
		ArrayList<HashMap<String, Object>> listRetEKK2961B001 = new ArrayList<HashMap<String,Object>>();
		listRetEKK2961B001.addAll(
			mappingCAANOutMsg(
					EKK2961B001CBSMsg.EKK2961B001CBSMSG1LIST
				,	(CAANMsg[])mapSIFResult.get(JCMConstants.TEMPLATE_LIST_KEY)
			)
		);
		
		return listRetEKK2961B001;
	}
	
	/**
	 * サービス契約グループ設定一覧照会（サービス契約グループ識別番号）SIFを呼び出します。
	 * @param	handle				セッションハンドル
	 * @param	param				リクエストパラメータ
	 * @param	fixedText			サービスメッセージ
	 * @param	listMapEKK0081B016	EKK0081B016eo電気契約取得結果
	 * @return	result				処理結果
	 * @throws Throwable 
	 */
	private ArrayList<HashMap<String, Object>> callEKK2961B002(
			SessionHandle				handle
		,	IRequestParameterReadWrite	param
		,	HashMap<String, Object>		CCmap
		,	String						fixedText
		,	String						itensSvkeiKisenUcwkNo
	) throws Throwable
	{
		ArrayList<HashMap<String, Object>>	listResult = new ArrayList<HashMap<String, Object>>();;

		// テンプレート作成
		CAANMsg template = new CAANMsg(EKK2961B002CBSMsg.class.getName());
		// テンプレートID
		template.set(EKK2961B002CBSMsg.TEMPLATEID, "EKK2961B002");
		// 機能コード
		template.set(EKK2961B002CBSMsg.FUNC_CODE, "1");
		// テンプレート共通情報設定処理
		setTemplateCommon(param, template);
		// ＫＥＹ＿サービス契約番号
		template.set(EKK2961B002CBSMsg.KEY_SVKEI_GRP_SKBT_NO, itensSvkeiKisenUcwkNo);
		// ＫＥＹ＿サービス契約グループ種別コード
		template.set(EKK2961B002CBSMsg.KEY_SVKEI_GRP_SBT_CD, "01");

		// SIF実行
		Map<?, ?> mapSIFResult = null;
		mapSIFResult = executeSIF(handle, param, fixedText, template);

		// ユーザ情報エラー設定
		CAANMsg[] retTemplates = (CAANMsg[])mapSIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg retTemplate = retTemplates[0];
		if (!retTemplate.isNull(EKK2961B002CBSMsg.KEY_SVKEI_GRP_SKBT_NO_ERR)) {
			if (!CCmap.containsKey("sysid_err")) {
				CCmap.put("sysid_err", retTemplate.getString(EKK2961B002CBSMsg.KEY_SVKEI_GRP_SKBT_NO_ERR));
			}
		}
		if (!retTemplate.isNull(EKK2961B002CBSMsg.EKK2961B002CBSMSG1LIST_ERR)) {
			if (!CCmap.containsKey("sysid_err")) {
				CCmap.put("sysid_err", retTemplate.getString(EKK2961B002CBSMsg.EKK2961B002CBSMSG1LIST_ERR));
			}
		}

				// SIF実行エラーチェック
		executeSIFErrCheck(mapSIFResult);

		// 処理結果リストを設定
		ArrayList<HashMap<String, Object>> listRetEKK2961B002 = new ArrayList<HashMap<String,Object>>();
		listRetEKK2961B002.addAll(
			mappingCAANOutMsg(
					EKK2961B002CBSMsg.EKK2961B002CBSMSG1LIST
				,	(CAANMsg[])mapSIFResult.get(JCMConstants.TEMPLATE_LIST_KEY)
			)
		);
		
		return listRetEKK2961B002;
	}

	/**
	 * サービス契約一意照会SIFを呼び出します。
	 * @param	handle				セッションハンドル
	 * @param	param				リクエストパラメータ
	 * @param	inMap				入力マップ
	 * @return	サービス契約グループ設定一覧
	 * @throws Throwable 
	 */
	private ArrayList<HashMap<String, Object>> callEKK0081A010(
			SessionHandle				handle
		,	IRequestParameterReadWrite	param
		,	HashMap<String, Object>		inMap
		,	String funcCode
	) throws Throwable
	{
		// テンプレート作成
		CAANMsg template = new CAANMsg(EKK0081A010CBSMsg.class.getName());
		// テンプレートID
		template.set(EKK0081A010CBSMsg.TEMPLATEID, "EKK0081A010");
		// 機能コード
		template.set(EKK0081A010CBSMsg.FUNC_CODE, funcCode);
		// テンプレート共通情報設定処理
		setTemplateCommon(param, template);
		// ＫＥＹ＿サービス契約番号
		template.set(EKK0081A010CBSMsg.KEY_SVC_KEI_NO, inMap.get("svc_kei_no"));
		// ＫＥＹ＿予約適用年月日
		String rsvAplyYmd = (String)inMap.get("rsv_aply_ymd");
		if (rsvAplyYmd == null || "".equals(rsvAplyYmd)) {
			template.setNull(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD);
		} else {
			template.set(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, rsvAplyYmd);
		}
		// SIF実行
		Map<?, ?> mapSIFResult = null;
		mapSIFResult = executeSIF(handle, param, "", template);

		// SIF実行エラーチェック
		executeSIFErrCheck(mapSIFResult);

		return mappingCAANOutMsg(
					EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST
				,	(CAANMsg[])mapSIFResult.get(JCMConstants.TEMPLATE_LIST_KEY)
			);
	}

	/**
	 * SIFを呼び出します。
	 * @param	handle		セッションハンドル
	 * @param	param		リクエストパラメータ
	 * @param	fixedText	サービスメッセージ
	 * @param	template	テンプレート
	 * @return	処理結果リスト(ArrayListのハッシュマップ)
	 */
	private Map<?, ?> executeSIF(
			SessionHandle				handle
		,	IRequestParameterReadWrite	param
		,	String						fixedText
		,	CAANMsg						template
	) throws Throwable
	{
		// リクエスト用クラスの設定
		// リクエスト用クラスの設定
		HashMap<String, Object> mapSIFRequest = setSCInputCommonData(param);
		mapSIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

		// SIF実行
		Map<?, ?> mapSIFResult = null;
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		mapSIFResult = scCall.run(mapSIFRequest, handle);

		// コントロールマップエラー情報設定
		setCtlMapErrInfo(param, mapSIFResult);

		return mapSIFResult;
	}
	
	/**
	 * SCインプット共通データ設定処理を行います。
	 * <br>
	 * @param	param						リクエストパラメータ
	 * @return	なし
	 * @throws	RequestParameterException
	 */
	private HashMap<String, Object> setSCInputCommonData(
			IRequestParameterReadWrite	param
	) throws RequestParameterException
	{
		HashMap<String, Object> mapSCInputCommon = new HashMap<String, Object>();

		// 電文ID
		mapSCInputCommon.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		mapSCInputCommon.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		mapSCInputCommon.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		mapSCInputCommon.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());
		// 依頼先ホスト名
		mapSCInputCommon.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		mapSCInputCommon.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		mapSCInputCommon.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		mapSCInputCommon.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		return mapSCInputCommon;
	}
	
	/**
	 * <pre>
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteに必要なエラー情報をマッピングする
	 * 
	 * </pre>
	 * @param	param			リクエストパラメータ
	 * @param	mapSIFResult	SIF戻り値マップ
	 * @return	なし
	 * @throws Throwable
	 */
	private void setCtlMapErrInfo(
			IRequestParameterReadWrite	param
		,	Map<?, ?>					mapSIFResult
	) throws Throwable 
	{
		// SIF戻り値マップからCAANMsgを取得
		CAANMsg[] templates = (CAANMsg[])mapSIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// ステータス決定
		Integer returnCode = (Integer)mapSIFResult.get(JCMConstants.RET_CD_INT_KEY);
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		if (returnCode.intValue() != 0) {
			templateStatus = 9000;
		}
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null) {
			templateStatus = 0;
		}

		// BPステータス決定
		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));
		}

		// BPステータス設定
		if (templateStatus > bpStatus) {
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		// コントロールマップにエラー情報を設定
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null) {
			errList = new ArrayList<Object>();
		}
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(mapSIFResult, errList));

		return;
	}
	
	/**
	 * SIF実行エラーチェックを行ないます。
	 * <br>
	 * @param	mapSIFResult	SIF戻り値マップ
	 * @return	なし
	 * @throws	Exception
	 */
	private void executeSIFErrCheck(
			Map<?, ?> mapSIFResult
	) throws Exception
	{
		CAANMsg[] templates = (CAANMsg[])mapSIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)mapSIFResult.get(JCMConstants.RET_CD_INT_KEY);
		
		// ステータス取得
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if ((0 != returnCode.intValue()) || (0 != templateStatus)) {
			String errMsg = ERR_MSG;
			throw new SCCallException(errMsg, String.valueOf(returnCode), templateStatus);
		}
	}
	
	/**
	 * S/IF呼出時のテンプレート共通情報を設定します。
	 * @param	param		リクエストパラメータ
	 * @param	template	テンプレート
	 * @return	なし
	 * @throws RequestParameterException
	 */
	public void setTemplateCommon(
			IRequestParameterReadWrite	param
		,	CAANMsg						template
	) throws RequestParameterException
	{
		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);

		return;
	}
	
	/**
	 * CAANMsg[]の結果をHashとして抽出します（一覧照会用）。
	 * @param	mapKey		テンプレートリストのマップキー
	 * @param	scResult	SC処理結果
	 * @return	listResult	処理結果リスト(ArrayListのハッシュマップ)
	 */
	private ArrayList<HashMap<String, Object>> mappingCAANOutMsg(
			String		mapKey
		,	CAANMsg[]	scResult
	)
	{
		ArrayList<HashMap<String, Object>> listResult =
			new ArrayList<HashMap<String, Object>>();		// 処理結果リスト
		CAANMsg[] caanMsg = null;							// SC実行結果

		// 結果の抽出
		caanMsg = scResult[0].getCAANMsgList(mapKey);

		if(caanMsg != null)
		{
			for(int i = 0 ; i < caanMsg.length ; i++)
			{
				listResult.add(caanMsg[i].getMsgData());
			}
		}

		return listResult;
	}
}
