/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：契約管理
*	モジュール名	：JKKKoshMsenLanUserChgeCC
*	ソースファイル名：JKKKoshMsenLanUserChgeCC.java
*	作成者			：FJ
*	日付			：2011年12月20日
*＜機能概要＞
*	公衆無線LAN利用者変更CC
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/12/20	FJ		新規作成
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
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.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.util.JPCDateChecker;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0121A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0121A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161B004CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161B004CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0201A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0201A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0201C080CBSMsg;
import eo.ejb.cbs.cbsmsg.ESC0031D010CBSMsg;


/**
 * 公衆無線LAN利用者の変更を行い、サービスの解約SOD依頼とサービスの登録SOD依頼を行う部品。
 * 
 * @author 富士通
 *
 */
public class JCNKoshMsenLanUserChge 
{
	/** CBSMsgのテンプレートID項目 */
	private static final String TEMPLATEID = "templateID";
	
	/** CBSMsgの機能コード項目 */
	private static final String FUNC_CODE = "func_code";
	
	/** CBSMsgのステータス項目 */
	private static final String STATUS = "status";
	
	/** ユーザー情報 */
	private static final String SERVICE_ID = "KKSV034402CC";
	
	/** テンプレートID (EKK0161B004) */
	private static final String TEMPLATE_ID_EKK0161B004 = "EKK0161B004";
	
	/** テンプレートID (EKK0081A010) */
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	
	/** テンプレートID (EKK0201A010) */
	private static final String TEMPLATE_ID_EKK0201A010 = "EKK0201A010";
	
	/** テンプレートID (EKK0201C080) */
	private static final String TEMPLATE_ID_EKK0201C080 = "EKK0201C080";
	
	/** テンプレートID (ESC0031D010) */
	private static final String TEMPLATE_ID_ESC0031D010 = "ESC0031D010";
	
	/** テンプレートID (EKK0121A010) */
	private static final String TEMPLATE_ID_EKK0121A010 = "EKK0121A010";
	
	
	/**
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	public IRequestParameterReadWrite searchKoshMsenLanUserChge(SessionHandle handle, 
															IRequestParameterReadWrite param, 
															String fixedText) throws Exception
	{
		HashMap<String, Object> dataMap = null;
		boolean cntFlg = false;
		
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(SERVICE_ID);
		
		HashMap<String, Object> workMap01 = (HashMap<String, Object>)param.getData("KKSV0344WORK01");
		
		// 作業領域の取得
		Map workMap = param.getMappingWorkArea();
		
		// お客様変更からの呼び出し
		if (fixedText.equals("CKSV000930CC"))
		{
			inMap = (HashMap<String, Object>)param.getData(fixedText);
			
			// 対象なしの場合
			if (inMap == null)
			{
				return param;
			}
			
			ArrayList svcKeiList = (ArrayList)inMap.get("svc_kei_no_list");
			// オンライン処理日
			String ope_date = (String)workMap01.get("ope_date");
			
			// サービス契約分繰り返し
			for (int i = 0; i < svcKeiList.size(); i++)
			{
				HashMap svcMap = (HashMap)svcKeiList.get(i);
				HashMap workDataMap = new HashMap();
				ArrayList workDataList = new ArrayList();
				
				// *** ■ EKK0161B004(サービス契約内訳一覧照会) の実行 *****
				Object[][] ekk0161b004IN = {
						{EKK0161B004CBSMsg.KEY_SVC_KEI_NO, svcMap.get("key_svc_kei_no")},
						{EKK0161B004CBSMsg.KEY_PCRS_CD, svcMap.get("key_pcrs_cd")},
						{EKK0161B004CBSMsg.KEY_SVC_PRD_FLG, inMap.get("key_svc_prd_flg")}
				};
				
				// ◇ SC呼出実行
				CAANMsg ekk0161b004Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0161B004, "1", ekk0161b004IN);
				
				// 処理結果判定
				CAANMsg[] ekk0161b004MsgList = ekk0161b004Msg.getCAANMsgList(EKK0161B004CBSMsg.EKK0161B004CBSMSG1LIST);
				
				if (ekk0161b004MsgList != null)
				{
					for (int j = 0; j < ekk0161b004MsgList.length; j++)
					{
						CAANMsg msg = ekk0161b004MsgList[i];
						
						String svc_sta_ymd = msg.getString(EKK0161B004CBSMsg1List.SVC_STA_YMD);
						String svc_endymd = msg.getString(EKK0161B004CBSMsg1List.SVC_ENDYMD);
						
						if (svc_sta_ymd == null || "".equals(svc_sta_ymd) || svc_endymd == null || "".equals(svc_endymd))
						{
							continue;
						}
						
						// 未来日チェック(オンライン処理日よりサービス開始年月日が未来日の場合はtrue) または
						// 過去日チェック(オンライン処理日よりサービス終了年月日が過去日の場合はtrue)
						if (JPCDateChecker.isFutureDate(svc_sta_ymd, ope_date, "0") ||
								JPCDateChecker.isPastDate(svc_endymd, ope_date, "0"))
						{
							continue;
						}
						
						HashMap childMap = new HashMap();
						workDataList.add(childMap);
						
						// サービス契約内訳一覧照会マップ.サービス契約内訳一覧照会明細.サービス契約内訳番号 ← サービス契約内訳一覧照会明細.サービス契約内訳番号
						if (msg.isNull(EKK0161B004CBSMsg1List.SVC_KEI_UCWK_NO)) {
							childMap.put("svc_kei_ucwk_no", new String());
						} else {
							childMap.put("svc_kei_ucwk_no", msg.getString(EKK0161B004CBSMsg1List.SVC_KEI_UCWK_NO));
						}
						
						// サービス契約内訳一覧照会マップ.サービス契約内訳一覧照会明細.申込明細番号 ← サービス契約内訳一覧照会明細.申込明細番号
						if (msg.isNull(EKK0161B004CBSMsg1List.MSKM_DTL_NO)) {
							childMap.put("mskm_dtl_no", new String());
						} else {
							childMap.put("mskm_dtl_no", msg.getString(EKK0161B004CBSMsg1List.MSKM_DTL_NO));
						}
					}
					workDataMap.put("EKK0161B004CBSMsg1List", workDataList);
				}
				
				svcMap.put("svc_kei_no", svcMap.get("key_svc_kei_no"));
				cntFlg = callMain(handle, param, scCall, svcMap, workMap01, workDataMap);
				
				// サービス契約内訳＜eoモバイル＞一意照会サービスインターフェイスで対象データが０件（対象データが存在しない）の場合
				if(!cntFlg)
				{
					dataMap = new HashMap<String, Object>();
					dataMap.put("return_result_cd", "819002");
					dataMap.put("knryo_cd", "30");
					dataMap.put("shosi_cd", "47802");
					param.setData("KKSV0344WORK02", dataMap);
					
					return param;
				}
			}
		}
		// APIからの呼び出し
		else
		{
			inMap.put("svc_kei_no", inMap.get("key_svc_kei_no"));
			cntFlg = callMain(handle, param, scCall, inMap, workMap01, (HashMap)workMap.get("WORK"));
			
			// サービス契約内訳＜eoモバイル＞一意照会サービスインターフェイスで対象データが０件（対象データが存在しない）の場合
			if(!cntFlg)
			{
				dataMap = new HashMap<String, Object>();
				dataMap.put("return_result_cd", "819002");
				dataMap.put("knryo_cd", "30");
				dataMap.put("shosi_cd", "47802");
				param.setData("KKSV0344WORK02", dataMap);
				
				return param;
			}
		}
		
		// 正常の場合、返却結果コードに"000000"を設定
		dataMap = new HashMap<String, Object>();
		dataMap.put("return_result_cd", "000000");
		param.setData("KKSV0344WORK02", dataMap);
		
		return param;
	}
	
	/**
	 * チェック処理用のサービスインターフェイスを作成し、返却する。
	 * 
	 * @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
	{
		
		ArrayList<CAANMsg> templateList = new ArrayList<CAANMsg>();
		
		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(SERVICE_ID);
		
		// *** EKK0121A010(サービス契約＜eoモバイル＞一意照会) の実行 *****
		Object[][] ekk0121a010IN = {
				// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
				{EKK0121A010CBSMsg.KEY_SVC_KEI_NO, inMap.get("key_svc_kei_no")},
				// "" => ＫＥＹ＿世代登録年月日時分秒
				{EKK0121A010CBSMsg.KEY_GENE_ADD_DTM, ""}
		};
		
		// 上りマッピングの処理結果を取得するためのマップを生成
		HashMap<String, Object> paramMap = editInMsg(param, TEMPLATE_ID_EKK0121A010, "2", ekk0121a010IN);
		templateList.add(((CAANMsg[])paramMap.get(JCMConstants.TEMPLATE_LIST_KEY))[0]);
		
		// *** EKK0081A010(サービス契約一意照会) の実行 *****
		Object[][] ekk0081a010IN = {
				// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
				{EKK0081A010CBSMsg.KEY_SVC_KEI_NO, inMap.get("key_svc_kei_no")},
				// "" => ＫＥＹ＿世代登録年月日時分秒
				{EKK0081A010CBSMsg.KEY_GENE_ADD_DTM, ""},
				// 運用日 => ＫＥＹ＿予約適用年月日
				{EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null)}
				
		};
		
		// 上りマッピングの処理結果を取得するためのマップを生成
		paramMap = editInMsg(param, TEMPLATE_ID_EKK0081A010, "2", ekk0081a010IN);
		templateList.add(((CAANMsg[])paramMap.get(JCMConstants.TEMPLATE_LIST_KEY))[0]);
		
		// リストに追加されたCAANMsgを配列に変換し、TEMPLATE_LIST_KEYに入れなおす
		CAANMsg[] templates = templateList.toArray(new CAANMsg[0]);
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * サービス契約内訳＜eoモバイル＞一意照会の上りマッピング処理です。
	 * 
	 * @param param リクエストパラメータ
	 * @param inWorkMap 上り作業領域マップ
	 * @return CAANMsg サービスインターフェイス
	 * @throws RequestParameterException
	 */
	private CAANMsg editInMsg_EKK0201A010(IRequestParameterReadWrite param,
											HashMap<String, Object> inWorkMap) throws RequestParameterException
	{
		//  サービス契約内訳＜eoモバイル＞一意照会サービスインターフェイスを作成
		CAANMsg template = new CAANMsg(EKK0201A010CBSMsg.class.getName());

		// テンプレートID
		template.set(EKK0201A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0201A010);

		// 機能コード
		template.set(EKK0201A010CBSMsg.FUNC_CODE, "2");

		// オペレータ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);
		
		// 世代登録年月日時分秒
		template.setNull(EKK0201A010CBSMsg.KEY_GENE_ADD_DTM);
		
		

		// ◇ 業務データの設定
		// 作業項目マップ.サービス契約内訳番号 → サービス契約内訳＜eoモバイル＞一意照会.ＫＥＹ＿サービス契約内訳番号
		if ("".equals(inWorkMap.get("svc_kei_ucwk_no")))
		{
			template.setNull(EKK0201A010CBSMsg.KEY_SVC_KEI_UCWK_NO);
		}
		else
		{
			template.set(EKK0201A010CBSMsg.KEY_SVC_KEI_UCWK_NO, (String)inWorkMap.get("svc_kei_ucwk_no"));
		}
		
		return template;
	}
	
	/**
	 * スポットSYSID変更の上りマッピング処理です。
	 * 
	 * @param param
	 * @param inWorkMap 上り作業領域マップ
	 * @param inWorkMap01 上り作業領域マップ01
	 * @return CAANMsg サービスインターフェイス
	 * @throws RequestParameterException
	 */
	private CAANMsg editInMsg_EKK0201C080(IRequestParameterReadWrite param,
											HashMap<String, Object> inWorkMap,
											HashMap<String, Object> inWorkMap01,
											String lastUpdDtm) throws RequestParameterException
	{
		//  スポットログインSYSID変更サービスインターフェイスを作成
		CAANMsg template = new CAANMsg(EKK0201C080CBSMsg.class.getName());
		
		// テンプレートID
		template.set(EKK0201C080CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0201C080);

		// 機能コード
		template.set(EKK0201C080CBSMsg.FUNC_CODE, "1");

		// オペレータ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);

		// ◇ 業務データの設定
		// 作業項目マップ.サービス契約内訳番号 → スポットログインSYSID変更.サービス契約内訳番号
		if ("".equals(inWorkMap.get("svc_kei_ucwk_no")))
		{
			template.setNull(EKK0201C080CBSMsg.SVC_KEI_UCWK_NO);
		}
		else
		{
			template.set(EKK0201C080CBSMsg.SVC_KEI_UCWK_NO, (String)inWorkMap.get("svc_kei_ucwk_no"));
		}
		
		// 作業項目マップ.申込明細番号 → スポットログインSYSID変更.サービス契約内訳番号
		if ("".equals(inWorkMap.get("mskm_dtl_no")))
		{
			template.setNull(EKK0201C080CBSMsg.MSKM_DTL_NO);
		}
		else
		{
			template.set(EKK0201C080CBSMsg.MSKM_DTL_NO, (String)inWorkMap.get("mskm_dtl_no"));
		}
		
		// 作業項目マップ01.変更後SYSID → スポットログインSYSID変更.スポットログインSYSID
		if ("".equals(inWorkMap01.get("after_sysid")))
		{
			template.setNull(EKK0201C080CBSMsg.SPOT_LOGIN_SYSID);
		}
		else
		{
			template.set(EKK0201C080CBSMsg.SPOT_LOGIN_SYSID, (String)inWorkMap01.get("after_sysid"));
		}
		
		// 最終更新年月日時分秒 → スポットログインSYSID変更.更新年月日時分秒
		if("".equals(lastUpdDtm))
		{
			template.setNull(EKK0201C080CBSMsg.UPD_DTM_BF);
		}
		else
		{
			template.set(EKK0201C080CBSMsg.UPD_DTM_BF, lastUpdDtm);
		}
		
		return template;
	}
	
	/**
	 * モバイルオーダ受付（サービスの解約SOD依頼）（変更前）の上りマッピング処理です。
	 * 
	 * @param param リクエストパラメータ
	 * @param inMap 上りマップ
	 * @param inWorkMap 上り作業領域マップ
	 * @param inWorkMap01 上り作業領域マップ01
	 * @param sessioncntMap セッション数を格納したMap
	 * @return CAANMsg サービスインターフェイス
	 * @throws RequestParameterException
	 */
	private CAANMsg editInMsg_ESC0031D010_Before(IRequestParameterReadWrite param,
											HashMap<String, Object> inMap,
											HashMap<String, Object> inWorkMap,
											HashMap<String, Object> inWorkMap01,
											HashMap<String, Object> sessioncntMap) throws RequestParameterException
	{
		// モバイルオーダ受付（サービスの解約SOD依頼）サービスインターフェイスを作成
		CAANMsg template = new CAANMsg(ESC0031D010CBSMsg.class.getName());
		
		// テンプレートID
		template.set(ESC0031D010CBSMsg.TEMPLATEID, TEMPLATE_ID_ESC0031D010);

		// 機能コード
		template.set(ESC0031D010CBSMsg.FUNC_CODE, "5");

		// オペレータ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);

		// 要求元アプリ種別コード
		template.set(ESC0031D010CBSMsg.YOKYU_MT_APL_SBT_CD, "3");
		
		// モバイルオーダコード
		template.set(ESC0031D010CBSMsg.MOBILE_ORDER_CD, "30");
		
		// 要求種別コード
		template.set(ESC0031D010CBSMsg.YOKYU_SBT_CD, "08");
		
		// 法人eo読替サービス契約番号
		template.setNull(ESC0031D010CBSMsg.HJIN_EO_YKAE_SVKEI_NO);
		
		// スケジュール年月日
		template.setNull(ESC0031D010CBSMsg.SCHEDULE_YMD);
		
		// UQ認証ID
		template.setNull(ESC0031D010CBSMsg.UQ_NINSHO_ID);
		
		// UQ認証IDパスワード
		template.setNull(ESC0031D010CBSMsg.UQ_NINSHO_ID_PWD);
		
		// UQMACアドレス
		template.setNull(ESC0031D010CBSMsg.UQ_MACAD);
		
		// UQROM種別コード
		template.setNull(ESC0031D010CBSMsg.UQ_ROM_SBT_CD);
		
		// UQ料金プランコード
		template.setNull(ESC0031D010CBSMsg.UQ_PPLAN_CD);
		
		// EM再販事業者様設定課金開始日
		template.setNull(ESC0031D010CBSMsg.EM_SIJGSHA_SET_CHRG_STAYMD);
		
		// EM契約者コード
		template.setNull(ESC0031D010CBSMsg.EM_KEISHA_CD);
		
		// EM連携抑止フラグ
		template.setNull(ESC0031D010CBSMsg.EM_RNKI_STP_FLG);
		
		// ◇ 業務データの設定
		// 公衆無線LAN利用者変更マップ.サービス契約番号 → モバイルオーダ受付（サービスの解約SOD依頼）.サービス契約番号
		if("".equals(inMap.get("svc_kei_no")))
		{
			template.setNull(ESC0031D010CBSMsg.SVC_KEI_NO);
		}
		else
		{
			template.set(ESC0031D010CBSMsg.SVC_KEI_NO, (String)inMap.get("svc_kei_no"));
		}
		// 作業項目マップ.サービス契約内訳番号 → モバイルオーダ受付（サービスの解約SOD依頼）.サービス契約内訳番号
		if ("".equals(inWorkMap.get("svc_kei_ucwk_no")))
		{
			template.setNull(ESC0031D010CBSMsg.SVC_KEI_UCWK_NO);
		}
		else
		{
			template.set(ESC0031D010CBSMsg.SVC_KEI_UCWK_NO, (String)inWorkMap.get("svc_kei_ucwk_no"));
		}
		
		// 作業項目マップ.変更前SYSID → モバイルオーダ受付（サービスの解約SOD依頼）.SYSID
		if ("".equals(inWorkMap01.get("before_sysid")))
		{
			template.setNull(ESC0031D010CBSMsg.SYSID);
		}
		else
		{
			template.set(ESC0031D010CBSMsg.SYSID, (String)inWorkMap01.get("before_sysid"));
		}
		
		// 公衆無線LAN利用者変更マップ.セッション数 → モバイルオーダ受付（サービスの解約SOD依頼）.旧セッション数
		if("".equals(sessioncntMap.get("session_cnt")))
		{
			template.setNull(ESC0031D010CBSMsg.OLD_SPOT_SESSION_CNT);
		}
		else
		{
			template.set(ESC0031D010CBSMsg.OLD_SPOT_SESSION_CNT, (String)sessioncntMap.get("session_cnt"));
		}
		
		// 公衆無線LAN利用者変更マップ.セッション数 → モバイルオーダ受付（サービスの解約SOD依頼）.セッション数
		if("".equals(sessioncntMap.get("session_cnt")))
		{
			template.setNull(ESC0031D010CBSMsg.SPOT_SESSION_CNT);
		}
		else
		{
			template.set(ESC0031D010CBSMsg.SPOT_SESSION_CNT, (String)sessioncntMap.get("session_cnt"));
		}
		
		return template;
	}
	
	/**
	 * モバイルオーダ受付（サービスの登録SOD依頼）（変更後）の上りマッピング処理です。
	 * 
	 * @param param リクエストパラメータ
	 * @param inMap 上りマップ
	 * @param inWorkMap 上り作業領域マップ
	 * @param inWorkMap01 上り作業領域マップ01
	 * @param sessioncntMap セッション数を格納したMap
	 * @return CAANMsg サービスインターフェイス
	 * @throws RequestParameterException
	 */
	private CAANMsg editInMsg_ESC0031D010_After(IRequestParameterReadWrite param,
											HashMap<String, Object> inMap,
											HashMap<String, Object> inWorkMap,
											HashMap<String, Object> inWorkMap01,
											HashMap<String, Object> sessioncntMap) throws RequestParameterException
	{
		// モバイルオーダ受付（サービスの登録SOD依頼）サービスインターフェイスを作成
		CAANMsg template = new CAANMsg(ESC0031D010CBSMsg.class.getName());
		
		// テンプレートID
		template.set(ESC0031D010CBSMsg.TEMPLATEID, TEMPLATE_ID_ESC0031D010);

		// 機能コード
		template.set(ESC0031D010CBSMsg.FUNC_CODE, "5");

		// オペレータ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);

		// 要求元アプリ種別コード
		template.set(ESC0031D010CBSMsg.YOKYU_MT_APL_SBT_CD, "3");
		
		// モバイルオーダコード
		template.set(ESC0031D010CBSMsg.MOBILE_ORDER_CD, "30");
		
		// 要求種別コード
		template.set(ESC0031D010CBSMsg.YOKYU_SBT_CD, "02");

		// 法人eo読替サービス契約番号
		template.setNull(ESC0031D010CBSMsg.HJIN_EO_YKAE_SVKEI_NO);
		
		// スケジュール年月日
		template.setNull(ESC0031D010CBSMsg.SCHEDULE_YMD);
		
		// UQ認証ID
		template.setNull(ESC0031D010CBSMsg.UQ_NINSHO_ID);
		
		// UQ認証IDパスワード
		template.setNull(ESC0031D010CBSMsg.UQ_NINSHO_ID_PWD);
		
		// UQMACアドレス
		template.setNull(ESC0031D010CBSMsg.UQ_MACAD);
		
		// UQROM種別コード
		template.setNull(ESC0031D010CBSMsg.UQ_ROM_SBT_CD);
		
		// UQ料金プランコード
		template.setNull(ESC0031D010CBSMsg.UQ_PPLAN_CD);
		
		// EM再販事業者様設定課金開始日
		template.setNull(ESC0031D010CBSMsg.EM_SIJGSHA_SET_CHRG_STAYMD);
		
		// EM契約者コード
		template.setNull(ESC0031D010CBSMsg.EM_KEISHA_CD);
		
		// EM連携抑止フラグ
		template.setNull(ESC0031D010CBSMsg.EM_RNKI_STP_FLG);
		
		// ◇ 業務データの設定
		// サービス契約番号 → モバイルオーダ受付（サービスの登録SOD依頼）.サービス契約番号
		if("".equals(inMap.get("svc_kei_no")))
		{
			template.setNull(ESC0031D010CBSMsg.SVC_KEI_NO);
		}
		else
		{
			template.set(ESC0031D010CBSMsg.SVC_KEI_NO, (String)inMap.get("svc_kei_no"));
		}
		// 作業項目マップ.サービス契約内訳番号 → モバイルオーダ受付（サービスの登録SOD依頼）.サービス契約内訳番号
		if ("".equals(inWorkMap.get("svc_kei_ucwk_no")))
		{
			template.setNull(ESC0031D010CBSMsg.SVC_KEI_UCWK_NO);
		}
		else
		{
			template.set(ESC0031D010CBSMsg.SVC_KEI_UCWK_NO, (String)inWorkMap.get("svc_kei_ucwk_no"));
		}
		
		// 作業項目マップ.変更後SYSID → モバイルオーダ受付（サービスの登録SOD依頼）.SYSID
		if ("".equals(inWorkMap01.get("after_sysid")))
		{
			template.setNull(ESC0031D010CBSMsg.SYSID);
		}
		else
		{
			template.set(ESC0031D010CBSMsg.SYSID, (String)inWorkMap01.get("after_sysid"));
		}
		
		// 公衆無線LAN利用者変更マップ.セッション数 → モバイルオーダ受付（サービスの解約SOD依頼）.旧セッション数
		if("".equals(sessioncntMap.get("session_cnt")))
		{
			template.setNull(ESC0031D010CBSMsg.OLD_SPOT_SESSION_CNT);
		}
		else
		{
			template.set(ESC0031D010CBSMsg.OLD_SPOT_SESSION_CNT, (String)sessioncntMap.get("session_cnt"));
		}
		
		// 公衆無線LAN利用者変更マップ.セッション数 → モバイルオーダ受付（サービスの解約SOD依頼）.セッション数
		if("".equals(sessioncntMap.get("session_cnt")))
		{
			template.setNull(ESC0031D010CBSMsg.SPOT_SESSION_CNT);
		}
		else
		{
			template.set(ESC0031D010CBSMsg.SPOT_SESSION_CNT, (String)sessioncntMap.get("session_cnt"));
		}
		
		return template;
	}
	
	/**
	 * サービスインターフェイスリスト(CAANMsg[])からサービスI/F実行用マップを作成します<br>
	 * 
	 * @param param リクエストパラメータ
	 * @param templates サービスインターフェイスリスト
	 * @return HashMap<String, Object> サービスI/F実行用マップ
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> getParamMsg(IRequestParameterReadWrite param, CAANMsg[] templates) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		/* SCインプット共通データ */
		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文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));
		
		// テンプレートリスト
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * サービス契約内訳＜eoモバイル＞一意照会の下りマッピング処理です。
	 * 
	 * @param msgList 結果CAANMsgリスト
	 * @param param リクエストパラメータ
	 * @param inMap 上りマップ
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @throws Exception
	 */
	private IRequestParameterReadWrite editOutMsg_EKK0201A010(Map<?, ?> msgList,
																IRequestParameterReadWrite param,
																HashMap<String, Object> inMap) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		
		// リターンコード取得
		int returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// 結果を詰めるマップを取得
		HashMap<String, Object> dataMap = null;
		ArrayList<HashMap<String, Object>> dataList = null;

		// 業務データ設定
		dataMap = (HashMap<String, Object>)param.getData(SERVICE_ID);
		if (null == dataMap)
		{
			dataMap = new HashMap<String, Object>();
			param.setData(SERVICE_ID, dataMap);
		}
		
		CAANMsg[] templateArray = parentTemplate.getCAANMsgList(EKK0201A010CBSMsg.EKK0201A010CBSMSG1LIST);
		dataList = (ArrayList<HashMap<String, Object>>)dataMap.get("EKK0201A010CBSMsg1List");
		
		if (null == dataList)
		{
			dataList = new ArrayList<HashMap<String, Object>>();
		}
		
		if (null != templateArray)
		{
			// オンライン処理日
			HashMap work01Map = (HashMap)param.getData("KKSV0344WORK01");
			
			for (int i = 0; i < templateArray.length; i++)
			{
				CAANMsg childTemplate = templateArray[i];
				
				// 対象データは、以下の条件をすべて満たすもの。
				// ・パラメータで取得した変更前SYSIDとサービス契約内訳＜eoモバイル＞.スポットログインSYSIDが同一であること。
				// 公衆無線LAN利用者変更作業項目マップ01.変更前SYSID = サービス契約内訳＜eoモバイル＞.スポットログインSYSID
				
				String sys_id = childTemplate.getString(EKK0201A010CBSMsg1List.SPOT_LOGIN_SYSID);
				
				if (null == sys_id || "".equals(sys_id))
				{
					continue;
				}
				
				// 変更前SYSIDとサービス契約内訳＜eoモバイル＞.スポットログインSYSIDが同一でない
				if (!sys_id.equals((String)work01Map.get("before_sysid")))
				{
					continue;
				}
				
				// ◇対象データのマッピングを行う
				HashMap<String, Object> childMap = new HashMap<String, Object>();
				
				// スポットログインSYSID
				if (childTemplate.isNull(EKK0201A010CBSMsg1List.SPOT_LOGIN_SYSID))
				{
					childMap.put("spot_login_sysid", "");
				}
				else
				{
					childMap.put("spot_login_sysid", childTemplate.getString(EKK0201A010CBSMsg1List.SPOT_LOGIN_SYSID));
				}
				
				dataList.add(childMap);
			}
		}
		dataMap.put("EKK0201A010CBSMsg1List", dataList);
		
		// エラー情報の設定
		editErrorInfo_EKK0201A010(param, inMap, templates, returnCode);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}
	
	/**
	 * スポットSYSID変更の下りマッピング処理です。
	 * 
	 * @param msgList 結果CAANMsgリスト
	 * @param param リクエストパラメータ
	 * @param inMap 上りマップ
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @throws Exception
	 */
	private IRequestParameterReadWrite editOutMsg_EKK0201C080(Map<?, ?> msgList,
																IRequestParameterReadWrite param,
																HashMap<String, Object> inMap) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		
		// リターンコード取得
		int returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// 結果を詰めるマップを取得
		HashMap<String, Object> dataMap = null;
		ArrayList<HashMap<String, Object>> dataList = null;

		// 業務データ設定
		dataMap = (HashMap<String, Object>)param.getData(SERVICE_ID);
		if (null == dataMap)
		{
			dataMap = new HashMap<String, Object>();
			param.setData(SERVICE_ID, dataMap);
		}
		
		
		
		// エラー情報の設定
		editErrorInfo_EKK0201C080(param, inMap, templates, returnCode);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}
	
	/**
	 * モバイルオーダ受付（サービスの解約SOD依頼）変更(変更前)の下りマッピング処理です。
	 * 
	 * @param msgList 結果CAANMsgリスト
	 * @param param リクエストパラメータ
	 * @param inMap 上りマップ
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @throws Exception
	 */
	private IRequestParameterReadWrite editOutMsg_ESC0031D010_Before(Map<?, ?> msgList,
																IRequestParameterReadWrite param,
																HashMap<String, Object> inMap) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		
		// リターンコード取得
		int returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// 結果を詰めるマップを取得
		HashMap<String, Object> dataMap = null;
		ArrayList<HashMap<String, Object>> dataList = null;

		// 業務データ設定
		dataMap = (HashMap<String, Object>)param.getData(SERVICE_ID);
		if (null == dataMap)
		{
			dataMap = new HashMap<String, Object>();
			param.setData(SERVICE_ID, dataMap);
		}
		
		// エラー情報の設定
		editErrorInfo_ESC0031D010(param, inMap, templates, returnCode);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}
	
	/**
	 * モバイルオーダ受付（サービスの解約SOD依頼）変更(変更後)の下りマッピング処理です。
	 * 
	 * @param msgList 結果CAANMsgリスト
	 * @param param リクエストパラメータ
	 * @param inMap 上りマップ
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @throws Exception
	 */
	private IRequestParameterReadWrite editOutMsg_ESC0031D010_After(Map<?, ?> msgList,
																IRequestParameterReadWrite param,
																HashMap<String, Object> inMap) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		
		// リターンコード取得
		int returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// 結果を詰めるマップを取得
		HashMap<String, Object> dataMap = null;
		ArrayList<HashMap<String, Object>> dataList = null;

		// 業務データ設定
		dataMap = (HashMap<String, Object>)param.getData(SERVICE_ID);
		if (null == dataMap)
		{
			dataMap = new HashMap<String, Object>();
			param.setData(SERVICE_ID, dataMap);
		}
		
		// エラー情報の設定
		editErrorInfo_ESC0031D010(param, inMap, templates, returnCode);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}
	
	/**
	 * サービス契約内訳<eoモバイル>一意照会サービスインターフェイスのエラー情報をマッピングする。
	 * 
	 * @param param リクエストパラメータ
	 * @param inMap 上りマップ
	 * @param templates サービスインターフェイスリスト
	 * @param returnCode リターンコード
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @throws RequestParameterException
	 */
	private IRequestParameterReadWrite editErrorInfo_EKK0201A010(IRequestParameterReadWrite param, 
																	HashMap<String, Object> inMap,
																	CAANMsg[] templates,
																	int returnCode) throws RequestParameterException
	{
		
		CAANMsg template = templates[0];

		int templateStatus = template.getInt(EKK0201A010CBSMsg.STATUS);
		if (0 != returnCode)
		{
			templateStatus = 9000;
		}
		
		if (null == JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)))
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (null == obj)
		{
			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("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		if (!template.isNull(EKK0201A010CBSMsg.KEY_SVC_KEI_UCWK_NO_ERR))
		{
			if (!inMap.containsKey("key_svc_kei_ucwk_no_err"))
			{
				inMap.put("key_svc_kei_ucwk_no_err", template.getString(EKK0201A010CBSMsg.KEY_SVC_KEI_UCWK_NO_ERR));
			}
		}

		return param;
	}
	
	/**
	 * スポットSYSID変更サービスインターフェイスのエラー情報をマッピングする。
	 * 
	 * @param param リクエストパラメータ
	 * @param inMap 上りマップ
	 * @param templates サービスインターフェイスリスト
	 * @param returnCode リターンコード
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @throws RequestParameterException
	 */
	private IRequestParameterReadWrite editErrorInfo_EKK0201C080(IRequestParameterReadWrite param, 
																	HashMap<String, Object> inMap,
																	CAANMsg[] templates,
																	int returnCode) throws RequestParameterException
	{
		
		CAANMsg template = templates[0];

		int templateStatus = template.getInt(EKK0201C080CBSMsg.STATUS);
		if (0 != returnCode)
		{
			templateStatus = 9000;
		}

		if (null == JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)))
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if(null == obj)
		{
			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("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		if(!template.isNull(EKK0201C080CBSMsg.SVC_KEI_UCWK_NO_ERR))
		{
			if (!inMap.containsKey(EKK0201C080CBSMsg.SVC_KEI_UCWK_NO_ERR))
			{
				inMap.put(EKK0201C080CBSMsg.SVC_KEI_UCWK_NO_ERR, template.getString(EKK0201C080CBSMsg.SVC_KEI_UCWK_NO_ERR));
			}
		}

		if(!template.isNull(EKK0201C080CBSMsg.MSKM_DTL_NO_ERR))
		{
			if (!inMap.containsKey(EKK0201C080CBSMsg.MSKM_DTL_NO_ERR))
			{
				inMap.put(EKK0201C080CBSMsg.MSKM_DTL_NO_ERR, template.getString(EKK0201C080CBSMsg.MSKM_DTL_NO_ERR));
			}
		}

		if(!template.isNull(EKK0201C080CBSMsg.SPOT_LOGIN_SYSID_ERR))
		{
			if (!inMap.containsKey(EKK0201C080CBSMsg.SPOT_LOGIN_SYSID_ERR))
			{
				inMap.put(EKK0201C080CBSMsg.SPOT_LOGIN_SYSID_ERR, template.getString(EKK0201C080CBSMsg.SPOT_LOGIN_SYSID_ERR));
			}
		}

		if(!template.isNull(EKK0201C080CBSMsg.UPD_DTM_BF_ERR))
		{
			if (!inMap.containsKey(EKK0201C080CBSMsg.UPD_DTM_BF_ERR))
			{
				inMap.put(EKK0201C080CBSMsg.UPD_DTM_BF_ERR, template.getString(EKK0201C080CBSMsg.UPD_DTM_BF_ERR));
			}
		}
		
		return param;
	}
	
	/**
	 * モバイルオーダ受付（サービスの解約SOD依頼）変更(変更前)サービスインターフェイスのエラー情報をマッピングする。
	 * 
	 * @param param リクエストパラメータ
	 * @param inMap 上りマップ
	 * @param templates サービスインターフェイスリスト
	 * @param returnCode リターンコード
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @throws RequestParameterException
	 */
	private IRequestParameterReadWrite editErrorInfo_ESC0031D010(IRequestParameterReadWrite param, 
																	HashMap<String, Object> inMap,
																	CAANMsg[] templates,
																	int returnCode) throws RequestParameterException
	{
		
		CAANMsg template = templates[0];

		int templateStatus = template.getInt(ESC0031D010CBSMsg.STATUS);
		if (0 != returnCode)
		{
			templateStatus = 9000;
		}

		if (null == JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)))
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if(null == obj)
		{
			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("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		if(!template.isNull(ESC0031D010CBSMsg.SVC_KEI_UCWK_NO_ERR))
		{
			if (!inMap.containsKey(ESC0031D010CBSMsg.SVC_KEI_UCWK_NO_ERR))
			{
				inMap.put(ESC0031D010CBSMsg.SVC_KEI_UCWK_NO_ERR, template.getString(ESC0031D010CBSMsg.SVC_KEI_UCWK_NO_ERR));
			}
		}

		if(!template.isNull(ESC0031D010CBSMsg.SVC_KEI_NO_ERR))
		{
			if (!inMap.containsKey(ESC0031D010CBSMsg.SVC_KEI_NO_ERR))
			{
				inMap.put(ESC0031D010CBSMsg.SVC_KEI_NO_ERR, template.getString(ESC0031D010CBSMsg.SVC_KEI_NO_ERR));
			}
		}
		
		if(!template.isNull(ESC0031D010CBSMsg.SYSID_ERR))
		{
			if (!inMap.containsKey(ESC0031D010CBSMsg.SYSID_ERR))
			{
				inMap.put(ESC0031D010CBSMsg.SYSID_ERR, template.getString(ESC0031D010CBSMsg.SYSID_ERR));
			}
		}
		
		return param;
	}
	
	/**
	 * SC呼出
	 * 
	 * @param handle
	 * @param param
	 * @param scCall
	 * @param svcIfId
	 * @param funcCode
	 * @param svcIfMapData
	 * @return CAANMsg
	 * @throws Exception
	 */
	private CAANMsg callSC(SessionHandle handle, 
							IRequestParameterReadWrite param, 
							ServiceComponentRequestInvoker scCall,
							String svcIfId,
							String funcCode,
							Object[][] svcIfMapData) throws Exception
	{
		
		// ◇ 上りマッピング処理
		// 上りマッピングの処理結果を取得するためのマップを生成
		HashMap<String, Object> paramMap = editInMsg(param, svcIfId, funcCode, svcIfMapData);
		
		// SC呼出実行
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		// 処理結果の判定
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		
		// エラー情報の転記
		editErrorInfo(param, templates, (Integer)result.get(JCMConstants.RET_CD_INT_KEY));
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
		int status = templates[0].getInt(STATUS);
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status))
		{
			throw new SCCallException("戻り値不正", rtnCode, status);
		}
		
		return ((CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY))[0];
	}
	
	/**
	 * 上りマッピング処理
	 * 
	 * @param param
	 * @param svcIfId
	 * @param funcCode
	 * @param mapData
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param, 
												String svcIfId, 
												String funcCode,
												Object[][] mapData) 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));

		CAANMsg template = new CAANMsg("eo.ejb.cbs.cbsmsg." + svcIfId + "CBSMsg");

		// テンプレートID
		template.set(TEMPLATEID, svcIfId);

		template.set(FUNC_CODE, funcCode);

		// オペレータ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);
		
		for (int i = 0; i < mapData.length; i++)
		{
			Object[] mapVal = mapData[i];
			if ("".equals(mapVal[1]))
			{
				template.setNull((String)mapVal[0]);
			}
			else
			{
				template.set((String)mapVal[0], (String)mapVal[1]);
			}
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * 主処理呼出
	 * 
	 * @param handle
	 * @param param
	 * @param scCall
	 * @param inMap
	 * @param workMap01
	 * @param parentWorkMap
	 * @return boolean
	 * @throws Exception
	 */
	private boolean callMain(SessionHandle handle, 
							IRequestParameterReadWrite param, 
							ServiceComponentRequestInvoker scCall,
							HashMap<String, Object> inMap,
							HashMap<String, Object> workMap01,
							HashMap parentWorkMap) throws Exception
	{
		Map<?, ?> result = null;
		HashMap<String, Object> dataMap = null;
		ArrayList workDataList = (ArrayList)parentWorkMap.get("EKK0161B004CBSMsg1List");
		
		// *** ■ EKK0121A010(サービス契約＜eoモバイル＞一意照会) の実行 *****
		Object[][] ekk0121a010IN = {
				// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
				{EKK0121A010CBSMsg.KEY_SVC_KEI_NO, inMap.get("key_svc_kei_no")},
				// "" => ＫＥＹ＿世代登録年月日時分秒
				{EKK0121A010CBSMsg.KEY_GENE_ADD_DTM, ""}
		};
		
		// ◇ SC呼出実行
		CAANMsg ekk0121a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0121A010, "2", ekk0121a010IN);
		
		// 処理結果判定
		CAANMsg[] ekk0121a010MsgList = ekk0121a010Msg.getCAANMsgList(EKK0121A010CBSMsg.EKK0121A010CBSMSG1LIST);
		
		// セッション数
		HashMap<String, Object> sessioncntMap = new HashMap<String, Object>();
		if (ekk0121a010MsgList != null && 0 < ekk0121a010MsgList.length)
		{
			sessioncntMap.put("session_cnt", ekk0121a010MsgList[0].getString(EKK0121A010CBSMsg1List.SESSION_CNT));
		}
		
		boolean cntFlg = false;
		
		// リクエストパラメータ．サービス契約内訳一覧照会明細の要素数分、処理を繰り返し行う。
		for (int i = 0; i < workDataList.size(); i++)
		{
			HashMap<String, Object> inWorkMap = (HashMap)workDataList.get(i);
			
			// *** ■ EKK0201A010(サービス契約内訳＜eoモバイル＞一意照会) の実行 *****
			// ◇ 上りマッピング処理
			// リクエストパラメータを引数に上りマッピング処理メソッドを実行
			CAANMsg template = editInMsg_EKK0201A010(param, inWorkMap);
			HashMap<String, Object> paramMap = getParamMsg(param, new CAANMsg[]{template});
			
			// ◇ SC呼出実行
			result = scCall.run(paramMap, handle);
			
			CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
			CAANMsg parentTemplate = templates[0];
			
			// ◇ 下りマッピング処理
			editOutMsg_EKK0201A010(result, param, inMap);
			
			/* ◇処理結果の判定*/
			// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
			String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
			Integer status = parentTemplate.getInt(JCMConstants.STATUS_INT_KEY);
			
			// 異常の場合、SCCallExceptionを生成してスローする
			if(!("0".equals(rtnCode) && 0 == status.intValue()))
			{
				// 異常の場合、返却結果コードに"009003"を設定
				dataMap = new HashMap<String, Object>();
				dataMap.put("return_result_cd", "009003");
				param.setData("KKSV0344WORK02", dataMap);
				
				SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
				throw scCallEx;
			}
			
			// サービス契約内訳＜eoモバイル＞取得件数チェック
			CAANMsg[] templateArray = parentTemplate.getCAANMsgList(EKK0201A010CBSMsg.EKK0201A010CBSMSG1LIST);
			
			// サービス契約内訳＜eoモバイル＞一意照会サービスインターフェイスで取得した、対象データが０件の場合
			if (templateArray == null || 0 == templateArray.length)
			{
				continue;
			}
			cntFlg = true;
			
			// *** ■ EKK0081A010(サービス契約一意照会) の実行 *****
			Object[][] ekk0081a010IN = {
					// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
					{EKK0081A010CBSMsg.KEY_SVC_KEI_NO, inMap.get("key_svc_kei_no")},
					// "" => ＫＥＹ＿世代登録年月日時分秒
					{EKK0081A010CBSMsg.KEY_GENE_ADD_DTM, ""},
					// 運用日 => ＫＥＹ＿予約適用年月日
					{EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null)}
					
			};
			
			// ◇ SC呼出実行
			CAANMsg ekk0081a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0081A010, "2", ekk0081a010IN);
			
			// 処理結果判定
			CAANMsg[] ekk0081a010MsgList = ekk0081a010Msg.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
			
			// EKK0161B004_サービス契約内訳一覧照会の検索結果が存在する場合、当ＣＣが実行されるため、サービス契約一意照会の結果は存在する。
			// 最終更新年月日時分秒
			String last_upd_dtm = ekk0081a010MsgList[0].getString(EKK0081A010CBSMsg1List.LAST_UPD_DTM);
			
			
			// *** ■ EKK0201C080(スポットログインSYSID変更) の実行 *****
			// リクエストパラメータを引数に上りマッピング処理メソッドを実行
			template = editInMsg_EKK0201C080(param, inWorkMap, workMap01, last_upd_dtm);
			paramMap = getParamMsg(param, new CAANMsg[]{template});
			
			// ◇ SC呼出実行
			result = scCall.run(paramMap, handle);
			
			templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
			parentTemplate = templates[0];
			
			// ◇ 下りマッピング処理
			editOutMsg_EKK0201C080(result, param, inMap);
			
			/* ◇処理結果の判定*/
			// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
			rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
			status = parentTemplate.getInt(JCMConstants.STATUS_INT_KEY);
			
			// 異常の場合、SCCallExceptionを生成してスローする
			if(!("0".equals(rtnCode) && 0 == status.intValue()))
			{
				// データ更新で排他エラーの場合
				if("EA".equals(inMap.get(EKK0201C080CBSMsg.UPD_DTM_BF_ERR)))
				{
					dataMap = new HashMap<String, Object>();
					dataMap.put("return_result_cd", "818001");
					dataMap.put("knryo_cd", "20");
					dataMap.put("shosi_cd", "47801");
					param.setData("KKSV0344WORK02", dataMap);
				}
				
				// サービス契約内訳の更新エラーの場合
				if("EA".equals(inMap.get(EKK0201C080CBSMsg.SVC_KEI_UCWK_NO_ERR)))
				{
					dataMap = new HashMap<String, Object>();
					dataMap.put("return_result_cd", "819002");
					dataMap.put("knryo_cd", "999");
					dataMap.put("shosi_cd", "47804");
					param.setData("KKSV0344WORK02", dataMap);
				}
				
				// 変更後SYSIDが有効でない場合
				if("EA".equals(inMap.get(EKK0201C080CBSMsg.SPOT_LOGIN_SYSID_ERR)))
				{
					dataMap = new HashMap<String, Object>();
					dataMap.put("return_result_cd", "819002");
					dataMap.put("knryo_cd", "30");
					dataMap.put("shosi_cd", "47803");
					param.setData("KKSV0344WORK02", dataMap);
				}
				
				// サービス契約内訳の追加エラーの場合
				if("EB".equals(inMap.get(EKK0201C080CBSMsg.SVC_KEI_UCWK_NO_ERR)) || "EC".equals(inMap.get(EKK0201C080CBSMsg.SVC_KEI_UCWK_NO_ERR)))
				{
					dataMap = new HashMap<String, Object>();
					dataMap.put("return_result_cd", "819002");
					dataMap.put("knryo_cd", "999");
					dataMap.put("shosi_cd", "47809");
					param.setData("KKSV0344WORK02", dataMap);
				}
				
				SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
				throw scCallEx;
			}
			
			
			// *** ■ ESC0031D010(モバイルオーダ受付（サービスの解約SOD依頼）) の実行 *****
			// ◇ 上りマッピング処理
			// リクエストパラメータを引数に上りマッピング処理メソッドを実行
			template = editInMsg_ESC0031D010_Before(param, inMap, inWorkMap, workMap01, sessioncntMap);
			paramMap = getParamMsg(param, new CAANMsg[]{template});
			
			// ◇ SC呼出実行
			result = scCall.run(paramMap, handle);
			
			templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
			parentTemplate = templates[0];
			
			// ◇ 下りマッピング処理
			editOutMsg_ESC0031D010_Before(result, param, inMap);
			
			/* ◇処理結果の判定*/
			// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
			rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
			status = parentTemplate.getInt(JCMConstants.STATUS_INT_KEY);
			
			// 異常の場合、SOD発行エラーとして処理する
			if(!("0".equals(rtnCode) && 0 == status.intValue()))
			{
				dataMap = new HashMap<String, Object>();
				dataMap.put("return_result_cd", "819002");
				dataMap.put("knryo_cd", "999");
				dataMap.put("shosi_cd", "47806");
				param.setData("KKSV0344WORK02", dataMap);
				
				SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
				throw scCallEx;
			}
			
			// *** ■ ESC0031D010(モバイルオーダ受付（サービスの登録SOD依頼）) の実行 *****
			// ◇ 上りマッピング処理
			// リクエストパラメータを引数に上りマッピング処理メソッドを実行
			template = editInMsg_ESC0031D010_After(param, inMap, inWorkMap, workMap01, sessioncntMap);
			paramMap = getParamMsg(param, new CAANMsg[]{template});
			
			// ◇ SC呼出実行
			result = scCall.run(paramMap, handle);
			
			templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
			parentTemplate = templates[0];
			
			// ◇ 下りマッピング処理
			editOutMsg_ESC0031D010_After(result, param, inMap);
			
			/* ◇処理結果の判定*/
			// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
			rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
			status = parentTemplate.getInt(JCMConstants.STATUS_INT_KEY);
			
			// 異常の場合、SOD発行エラーとして処理する
			if(!("0".equals(rtnCode) && 0 == status.intValue()))
			{
				dataMap = new HashMap<String, Object>();
				dataMap.put("return_result_cd", "819002");
				dataMap.put("knryo_cd", "999");
				dataMap.put("shosi_cd", "47807");
				param.setData("KKSV0344WORK02", dataMap);
				
				SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
				throw scCallEx;
			}
			
		}
		return cntFlg;
	}
	
	/**
	 * サービスインターフェイスのエラー情報をマッピングする。
	 * 
	 * @param param リクエストパラメータ
	 * @param templates サービスインターフェイスリスト
	 * @param returnCode リターンコード
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @exception RequestParameterException
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, 
													CAANMsg[] templates,
													int returnCode) throws RequestParameterException
	{
		
		for (int i = 0; i < templates.length; i++)
		{
			CAANMsg template = templates[i];
			int templateStatus = template.getInt(STATUS);
			if (returnCode != 0)
			{
				templateStatus = 9000;
			}
			if (JCMAPLConstMgr.getString("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("RETURN_MESSAGE_" + formatStatus);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
			}
			
			HashMap inMap = (HashMap)param.getData(SERVICE_ID);
			
			HashMap mp = template.getHashMap();
			
			Iterator it = mp.keySet().iterator();
			while (it.hasNext())
			{
				String key = (String)it.next();
				if (key.endsWith("_err"))
				{
					int keyIdx = key.lastIndexOf("_err");
					if (inMap.containsKey(key.substring(0, keyIdx)))
					{
						inMap.put(key, mp.get(key));
					}
				}
			}
			
		}
		
		return param;
	}
}
