/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKKoshMsenLanUserChgeCC
*	ソースファイル名：JKKKoshMsenLanUserChgeCC.java
*	作成者			：富士通
*	日付			：2011年12月20日
*＜機能概要＞
*	公衆無線LAN利用者変更CC
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/12/20   FJ          新規作成
*   v3.00.00    2012/09/05   FJ) 団      【ANK-0546-02-00】イオスマートリンク対応
*   v3.01.00    2012/09/06   FJ)強矢     ST1-2012-0000535対応
*   v4.00.00    2013/04/24   FJ)強矢     IT1-2013-0001021対応
*   v11.00.00   2014/12/09   FJ)舩橋     OM-2014-0003688対応
*
**********************************************************************/
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.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.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161A010CBSMsg1List;
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.EKK0201B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0201B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0201C080CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1081D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1551D010CBSMsg;


/**
 * 公衆無線LAN利用者の変更を行い、SOD発行を依頼するデータの作成を行う部品。
 * 
 * @author 富士通
 *
 */
public class JKKKoshMsenLanUserChgeCC extends AbstractCommonComponent
{
	/** 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 (EKK0201B001) */
	private static final String TEMPLATE_ID_EKK0201B001 = "EKK0201B001";
	
	/** テンプレートID (EKK0161A010) */
	private static final String TEMPLATE_ID_EKK0161A010 = "EKK0161A010";
	
	/** テンプレートID (EKK1081D010) */
	private static final String TEMPLATE_ID_EKK1081D010 = "EKK1081D010";
	
	/** テンプレートID (EKK1551D010) */
	private static final String TEMPLATE_ID_EKK1551D010 = "EKK1551D010";
	
	/** 料金コースコード ("A45":モバイル ＷＩ−ＦＩ 定額無料) */
	private static final String PCRS_CD_WIFI = "A45";
	
	/**
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	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");
			// オンライン処理日
			@SuppressWarnings("unused")
			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[j];
						
						String svc_kei_ucwk_stat = msg.getString(EKK0161B004CBSMsg1List.SVC_KEI_UCWK_STAT);
						// "020"(照査済)"030"(締結済)"100"(サービス提供中)"210"(休止・中断中)"220"(停止中)以外は対象データとしない。
						if (!("020".equals(svc_kei_ucwk_stat) 
								|| "030".equals(svc_kei_ucwk_stat) 
								|| "100".equals(svc_kei_ucwk_stat) 
								|| "210".equals(svc_kei_ucwk_stat)
								|| "220".equals(svc_kei_ucwk_stat)))
						{
							continue;
						}
						
						HashMap<String, Object> childMap = new HashMap<String, Object>();
						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"));
				//OM-2014-0003688 MOD START
//				cntFlg = callMain(handle, param, scCall, svcMap, workMap01, workDataMap);
				cntFlg = callMain(handle, param, scCall, svcMap, workMap01, workDataMap, false);
				//OM-2014-0003688 MOD END
				
				// サービス契約内訳＜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"));
			//OM-2014-0003688 MOD START
//			cntFlg = callMain(handle, param, scCall, inMap, workMap01, (HashMap)workMap.get("WORK"));
			cntFlg = callMain(handle, param, scCall, inMap, workMap01, (HashMap)workMap.get("WORK"), true);
			//OM-2014-0003688 MOD END
			
			// サービス契約内訳＜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);
		
		// *** 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)}
				
		};
		
		// 上りマッピングの処理結果を取得するためのマップを生成
		HashMap<String, Object> 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;
	}
	
	/**
	 * SYSIDより公衆無線ＬＡＮの利用者情報を返却します。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param scCall
	 * @param sysid SYSID (お客様変更画面より呼び出す場合は、ファミリー会員のSYSID)
	 * @return 公衆無線LAN利用者の情報 (サービス契約内訳のサービス契約内訳番号と料金コースコード)
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public ArrayList getKoshMsenLanUsingData(SessionHandle handle,
											IRequestParameterReadWrite param,
											ServiceComponentRequestInvoker scCall,
											String sysid) throws Exception
	{
		
		ArrayList lanSvcKei = new ArrayList();
		
		// *** EKK0201B001(サービス契約内訳<eoモバイル>一覧照会（スポットログインSYSID）) *****
		Object[][] ekk0201b001IN = {
				// ＫＥＹ＿スポットログインSYSID
				{EKK0201B001CBSMsg.KEY_SPOT_LOGIN_SYSID, sysid}
		};
		
		// ◇ SC呼出実行
		CAANMsg ekk0201b001Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0201B001, "1", ekk0201b001IN);
		
		// 処理結果判定
		CAANMsg[] ekk0201b001MsgList = ekk0201b001Msg.getCAANMsgList(EKK0201B001CBSMsg.EKK0201B001CBSMSG1LIST);
		
		if (ekk0201b001MsgList != null && 0 < ekk0201b001MsgList.length)
		{
			for (int i = 0; i < ekk0201b001MsgList.length; i++)
			{
				// *** EKK0161A010(サービス契約内訳一意照会) *****
				Object[][] ekk0161a010IN = {
						// EKK0201B001.サービス契約内訳番号 => ＫＥＹ＿サービス契約内訳番号
						{EKK0161A010CBSMsg.KEY_SVC_KEI_UCWK_NO, ekk0201b001MsgList[i].getString(EKK0201B001CBSMsg1List.SVC_KEI_UCWK_NO)},
						// "" => ＫＥＹ＿世代登録年月日時分秒
						{EKK0161A010CBSMsg.KEY_GENE_ADD_DTM, ""},
						// 運用日 => ＫＥＹ＿予約適用年月日
						{EKK0161A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null)}
				};
				
				// ◇ SC呼出実行
				CAANMsg ekk0161a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0161A010, "2", ekk0161a010IN);
				
				// 処理結果判定
				CAANMsg[] ekk0161a010MsgList = ekk0161a010Msg.getCAANMsgList(EKK0161A010CBSMsg.EKK0161A010CBSMSG1LIST);
				
				// ※ サービス契約内訳一覧照会（SYSID）に対するサービス契約内訳一意照会であるため、必ずデータが存在する
				
				// 対象データ判定 (KKA137 JKKKsmslKysSvkeiInfoCC と同一の判定とする)
				// サービス契約内訳ステータスが"020"(照査済)or"030"(締結済)or"100"(サービス提供中)or"210"(休止・中断中)であること。
				String svc_kei_ucwk_stat = ekk0161a010MsgList[0].getString(EKK0161A010CBSMsg1List.SVC_KEI_UCWK_STAT);
				if (!("020".equals(svc_kei_ucwk_stat)
						|| "030".equals(svc_kei_ucwk_stat)
						|| "100".equals(svc_kei_ucwk_stat)
						|| "210".equals(svc_kei_ucwk_stat)))
				{
					continue;
				}
				
				// サービス契約内訳．料金コースコードが"A45"(モバイル ＷＩ−ＦＩ 定額無料)であること。
				if (!PCRS_CD_WIFI.equals(ekk0161a010MsgList[0].getString(EKK0161A010CBSMsg1List.PCRS_CD)))
				{
					continue;
				}
				
				// 公衆無線ＬＡＮ利用者の情報をリストに設定する
				HashMap lanMap = new HashMap();
				lanMap.put("svc_kei_no", ekk0161a010MsgList[0].getString(EKK0161A010CBSMsg1List.SVC_KEI_NO));
				lanMap.put("pcrs_cd", ekk0161a010MsgList[0].getString(EKK0161A010CBSMsg1List.PCRS_CD));
				lanSvcKei.add(lanMap);
			}
		}
		
		return lanSvcKei;
	}
	
	/**
	 * 同一SYSIDで他のWi-Fiスポットが何件あるかチェックし、要求種別コード("02":新規、"04":変更、"08":消去)を返します。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param scCall
	 * @param sysid 変更前SYSID または 変更後SYSID
	 * @param beforeFlg 変更前SYSIDの場合はtrue, 変更後SYSIDの場合はfalse
	 * @return 要求種別コード
	 * @throws Exception
	 */
	private String checkOtherWifiSpotCnt(SessionHandle handle,
										IRequestParameterReadWrite param,
										ServiceComponentRequestInvoker scCall,
										String sysid,
										boolean beforeFlg) throws Exception
	{
		
		// 同一SYSIDで他のWi-Fiスポットが何件あるかチェック
		int cnt = getKoshMsenLanUsingData(handle, param, scCall, sysid).size();
		
		// 変更前SYSIDのチェックの場合
		if (beforeFlg)
		{
			// 変更前SYSIDしかない場合
			if (cnt <= 1)
			{
				// "08"(消去)
				return "08";
			}
			// 他のWi-Fiスポットがある場合
			else
			{
				// "04"(変更)
				return "04";
			}
		}
		// 変更後SYSIDのチェックの場合
		else
		{
			// 変更後SYSIDがない場合
			if (cnt == 0)
			{
				// "02"(新規)
				return "02";
			}
			// 他のWi-Fiスポットがある場合
			else
			{
				// "04"(変更)
				return "04";
			}
		}
	}
	
	/**
	 * SOD発行を依頼するためのデータを作成する(オーダ発行条件、オーダ情報作成ワークへの登録をする)処理です。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param scCall
	 * @param yokyu_sbt_cd (変更前 or 変更後の)要求種別コード
	 * @param svc_kei_no (変更前 or 変更後の)サービス契約番号
	 * @param svkei_gadtm (変更前 or 変更後の)サービス契約.世代登録年月日時分秒
	 * @param svc_kei_ucwk_no (変更前 or 変更後の)サービス契約内訳番号
	 * @param svkeiuw_gadtm (変更前 or 変更後の)サービス契約内訳.世代登録年月日時分秒
	 * @param spot_login_sysid 変更前SYSID or 変更後SYSID
	 * @throws Exception
	 */
	private void createSodRequestData(SessionHandle handle,
										IRequestParameterReadWrite param,
										ServiceComponentRequestInvoker scCall,
										String yokyu_sbt_cd,
										String svc_kei_no,
										String svkei_gadtm,
										String svc_kei_ucwk_no,
										String svkeiuw_gadtm,
										String spot_login_sysid) throws Exception
	{
		
		// *** EKK1081D010(オーダ発行条件登録) *****
		Object[][] ekk1081d010IN = {
				// サービス契約番号
				{EKK1081D010CBSMsg.SVC_KEI_NO, svc_kei_no},
				// サービス契約内訳番号
				{EKK1081D010CBSMsg.SVC_KEI_UCWK_NO, svc_kei_ucwk_no},
				// "3"(モバイル) => オーダ種別コード
				{EKK1081D010CBSMsg.ORDER_SBT_CD, "3"},
				// "30"(SPOT認証) => サービスオーダコード
				{EKK1081D010CBSMsg.SVC_ORDER_CD, "30"},
				// 要求種別コード
				{EKK1081D010CBSMsg.YOKYU_SBT_CD, yokyu_sbt_cd},
				// "01"(即時) => オーダ発行条件コード
				{EKK1081D010CBSMsg.ODR_HAKKO_JOKEN_CD, "01"},
				// スポットログインSYSID
				{EKK1081D010CBSMsg.SPOT_LOGIN_SYSID, spot_login_sysid}
		};
		
		// ◇ SC呼出実行
		CAANMsg ekk1081d010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK1081D010, "1", ekk1081d010IN);
		
		// オーダ内容コード
		String odr_naiyo_cd = "";
		
		// 要求種別コードが "02"(新規) の場合
		if ("02".equals(yokyu_sbt_cd))
		{
			// "301"(Wi-Fiスポット・登録) を設定
			odr_naiyo_cd = "301";
		}
		// 要求種別コードが "04"(変更) の場合
		else if ("04".equals(yokyu_sbt_cd))
		{
			// "302"(Wi-Fiスポット・変更) を設定
			odr_naiyo_cd = "302";
		}
		// 要求種別コードが "08"(消去) の場合
		else if ("08".equals(yokyu_sbt_cd))
		{
			// "303"(Wi-Fiスポット・消去) を設定
			odr_naiyo_cd = "303";
		}
		
		// *** EKK1551D010(オーダ情報作成ワーク登録) *****
		Object[][] ekk1551d010IN = {
				// EKK1081D010.オーダ発行条件番号 => オーダ発行条件番号
				{EKK1551D010CBSMsg.ODR_HAKKO_JOKEN_NO, ekk1081d010Msg.getString(EKK1081D010CBSMsg.ODR_HAKKO_JOKEN_NO)},
				// オーダ内容コード
				{EKK1551D010CBSMsg.ODR_NAIYO_CD, odr_naiyo_cd},
				// サービス契約番号
				{EKK1551D010CBSMsg.SVC_KEI_NO, svc_kei_no},
				// サービス契約世代登録年月日時分秒
				{EKK1551D010CBSMsg.SVKEI_GADTM, svkei_gadtm},
				// サービス契約内訳番号
				{EKK1551D010CBSMsg.SVC_KEI_UCWK_NO, svc_kei_ucwk_no},
				// サービス契約内訳世代登録年月日時分秒
				{EKK1551D010CBSMsg.SVKEIUW_GADTM, svkeiuw_gadtm}
		};
		
		// ◇ SC呼出実行
		callSC(handle, param, scCall, TEMPLATE_ID_EKK1551D010, "1", ekk1551d010IN);
		
	}
	
	/**
	 * サービスインターフェイスリスト(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 HashMap<String, Object>
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> 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>>();
		}
		
		HashMap<String, Object> outMap = new 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>();
				
				// サービス契約内訳番号
				outMap.put("svc_kei_ucwk_no", childTemplate.getString(EKK0201A010CBSMsg1List.SVC_KEI_UCWK_NO));
				
				// 世代登録年月日時分秒
				outMap.put("gene_add_dtm", childTemplate.getString(EKK0201A010CBSMsg1List.GENE_ADD_DTM));
				
				// スポットログイン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 outMap;
	}
	
	/**
	 * スポットSYSID変更の下りマッピング処理です。
	 * 
	 * @param msgList 結果CAANMsgリスト
	 * @param param リクエストパラメータ
	 * @param inMap 上りマップ
	 * @return HashMap<String, Object>
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> 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;
		@SuppressWarnings("unused")
		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);
		}
		
		HashMap<String, Object> outMap = new HashMap<String, Object>();
		
		// サービス契約内訳.世代登録年月日時分秒
		outMap.put("gene_add_dtm", parentTemplate.getString(EKK0201C080CBSMsg.KK0161_GENE_ADD_DTM));
		
		// エラー情報の設定
		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 outMap;
	}
	
	/**
	 * サービス契約内訳<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;
	}
	
	/**
	 * SC呼出
	 * 
	 * @param handle
	 * @param param
	 * @param scCall
	 * @param svcIfId
	 * @param funcCode
	 * @param svcIfMapData
	 * @return CAANMsg
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	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
	 * @param bolapi
	 * @return boolean
	 * @throws Exception
	 */
	//OM-2014-0003688 MOD START
//	private boolean callMain(SessionHandle handle, 
//							IRequestParameterReadWrite param, 
//							ServiceComponentRequestInvoker scCall,
//							HashMap<String, Object> inMap,
//							HashMap<String, Object> workMap01,
//							HashMap parentWorkMap) throws Exception
	private boolean callMain(SessionHandle handle, 
			IRequestParameterReadWrite param, 
			ServiceComponentRequestInvoker scCall,
			HashMap<String, Object> inMap,
			HashMap<String, Object> workMap01,
			HashMap parentWorkMap,
			boolean bolapi) throws Exception
	//OM-2014-0003688 MOD END
	{
		
		// ■ 変更前SYSIDと同一SYSIDで他のWi-Fiスポットの件数をチェックし、要求種別コードを取得する
		String yokyu_sbt_cd_before = checkOtherWifiSpotCnt(handle, param, scCall, (String)workMap01.get("before_sysid"), true);
		
		// ■ 変更後SYSIDと同一SYSIDで他のWi-Fiスポットの件数をチェックし、要求種別コードを取得する
		String yokyu_sbt_cd_after = checkOtherWifiSpotCnt(handle, param, scCall, (String)workMap01.get("after_sysid"), false);
		
		
		Map<?, ?> result = null;
		HashMap<String, Object> dataMap = null;
		ArrayList workDataList = (ArrayList)parentWorkMap.get("EKK0161B004CBSMsg1List");
		
		boolean cntFlg = false;

		//OM-2014-0003688 ADD START
		String b_sysid = (String)workMap01.get("before_sysid");
		String a_sysid = (String)workMap01.get("after_sysid");

		// API関数から呼び出され、変更前SYSIDと変更後SYSIDが一致、サービス契約回線内訳に存在した場合、正常終了する
		if (bolapi && b_sysid.equals(a_sysid) && "04".equals(yokyu_sbt_cd_after)) {
			cntFlg = true;
			return cntFlg;
		}
		//OM-2014-0003688 ADD END
		
		// リクエストパラメータ．サービス契約内訳一覧照会明細の要素数分、処理を繰り返し行う。
		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];
			
			// ◇ 下りマッピング処理
			HashMap<String, Object> beforeOutMap = 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];
			
			// ◇ 下りマッピング処理
			HashMap<String, Object> afterOutMap = 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;
			}
			
			
			// サービス契約.サービス契約番号
			String svc_kei_no = ekk0081a010MsgList[0].getString(EKK0081A010CBSMsg1List.SVC_KEI_NO);
			// サービス契約.世代登録年月日時分秒
			String svkei_gene_add_dtm = ekk0081a010MsgList[0].getString(EKK0081A010CBSMsg1List.GENE_ADD_DTM);
			
			// サービス契約内訳.サービス契約内訳番号
			String svc_kei_ucwk_no = (String)beforeOutMap.get("svc_kei_ucwk_no");
			// (before)サービス契約内訳.世代登録年月日時分秒
			String svkeiuw_gene_add_dtm_before = (String)beforeOutMap.get("gene_add_dtm");
			
			// (after)サービス契約内訳.世代登録年月日時分秒
			String svkeiuw_gene_add_dtm_after = (String)afterOutMap.get("gene_add_dtm");
			
			try
			{
				// ■ (変更前)オーダ発行条件とオーダ情報作成ワークの登録処理を行う
				createSodRequestData(handle, param, scCall, yokyu_sbt_cd_before,
						svc_kei_no, svkei_gene_add_dtm, svc_kei_ucwk_no, svkeiuw_gene_add_dtm_before, (String)workMap01.get("before_sysid"));
			}
			catch (SCCallException scCallEx)
			{
				// 異常の場合、SOD発行エラーとして処理する
				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);
				
				throw scCallEx;
			}
			
			try
			{
				// ■ (変更後)オーダ発行条件とオーダ情報作成ワークの登録処理を行う
				createSodRequestData(handle, param, scCall, yokyu_sbt_cd_after,
						svc_kei_no, svkei_gene_add_dtm, svc_kei_ucwk_no, svkeiuw_gene_add_dtm_after, (String)workMap01.get("after_sysid"));
			}
			catch (SCCallException scCallEx)
			{
				// 異常の場合、SOD発行エラーとして処理する
				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);
				
				throw scCallEx;
			}
			
		}
		return cntFlg;
	}
	
	/**
	 * サービスインターフェイスのエラー情報をマッピングする。
	 * 
	 * @param param リクエストパラメータ
	 * @param templates サービスインターフェイスリスト
	 * @param returnCode リターンコード
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @exception RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	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;
	}
}
