/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JKKCascdInfOperateCC
 *	ソースファイル名：JKKCascdInfOperateCC.java
 *	作成者			：FJ)Tsukuda
 *	日付			：2025年01月10日
 *＜機能概要＞
 *	CASカード情報操作CC
 *＜修正履歴＞
 *	バージョン	     修正日		 修正者		            修正内容
 *   v74.00.00       2025/01/20  FJ）佃      【ANK-4592-00-00】テレビ新コース（スカパー用）導入対応
 *   v75.00.00       2025/06/27  FJ) 橋本    【ANK-4673-10-00】テレビ新コース（スカパー用）導入対応　2025年6月フォロー案件 仕様変更１０（ＣＡＳカード番号体系チェックの追加）
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;

import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JDKCommonUtil;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0351A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1681B004CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1681B004CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1681B005CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3541A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3541A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3541B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3541B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3541B011CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3541B011CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3541C010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3541D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3541E010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3551B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3551B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3551D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3561B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3561B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3561E010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3571D010CBSMsg;
import eo.ejb.common.JCCModelCommon;

/**
 * CASカード情報操作の共通コンポーネントクラスです。
 * <br>
 * @author 富士通
 *
 */
public class JKKCascdInfOperateCC extends AbstractCommonComponent
{	
	/** サービス契約一意照会 */
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	/** オプションサービス契約一意照会 */
	private static final String TEMPLATE_ID_EKK0351A010 = "EKK0351A010";
	/** 異動予約一覧照会（異動予約状態コード） */
	private static final String TEMPLATE_ID_EKK1681B004 = "EKK1681B004";
	/** 異動予約一覧照会（オプションサービス契約番号） */
	private static final String TEMPLATE_ID_EKK1681B005 = "EKK1681B005";
	/** CASカード管理一意照会 */
	private static final String TEMPLATE_ID_EKK3541A010 = "EKK3541A010";
	/** CASカード管理一覧照会 */
	private static final String TEMPLATE_ID_EKK3541B010 = "EKK3541B010";
	/** CASカード管理一覧照会（CAS番号登録年月日） */
	private static final String TEMPLATE_ID_EKK3541B011 = "EKK3541B011";
	/** CASカード管理変更 */
	private static final String TEMPLATE_ID_EKK3541C010 = "EKK3541C010";
	/** CASカード管理登録 */
	private static final String TEMPLATE_ID_EKK3541D010 = "EKK3541D010";
	/** CASカード管理物理削除 */
	private static final String TEMPLATE_ID_EKK3541E010 = "EKK3541E010";
	/** CASカード管理履歴一覧照会 */
	private static final String TEMPLATE_ID_EKK3551B010 = "EKK3551B010";
	/** CASカード管理履歴登録 */
	private static final String TEMPLATE_ID_EKK3551D010 = "EKK3551D010";
	/** CAS番号対象オプションサービス契約一覧照会 */
	private static final String TEMPLATE_ID_EKK3561B010 = "EKK3561B010";
	/** CAS番号対象オプションサービス契約物理削除 */
	private static final String TEMPLATE_ID_EKK3561E010 = "EKK3561E010";
	/** CAS番号対象オプションサービス契約履歴登録 */
	private static final String TEMPLATE_ID_EKK3571D010 = "EKK3571D010";
	
	/** 機能コード：1（更新） */
	private static final String FUNC_CD_1 = "1";
	/** 機能コード：2（チェックのみ） */
	private static final String FUNC_CD_2= "2";
	/** 機能コード：3（照会） */
	private static final String FUNC_CD_3 = "3";
	/** 機能コード：4（画面呼出チェック） */
	private static final String FUNC_CD_4 = "4";

	/** 相手システムID：1（CMP） */
	private static final String AITE_SYSID_1 = "1";
	/** 相手システムID：2（DEN） */
	private static final String AITE_SYSID_2 = "2";
	/** 相手システムID：3（バックヤード） */
	private static final String AITE_SYSID_3 = "3";
	/** 相手システムID：4（フロント） */
	private static final String AITE_SYSID_4 = "4";

	/** 変更区分：1（登録） */
	private static final String CHG_DIV_1 = "1";
	/** 変更区分：2（削除） */
	private static final String CHG_DIV_2 = "2";
	/** 変更区分：3（承認） */
	private static final String CHG_DIV_3 = "3";

	/** エラーコード：null（正常） */
	private static final String ERR_CD_NULL = null;
	/** エラーコード：01（変更回数エラー） */
	private static final String ERR_CD_01 = "01";
	/** エラーコード：02（重複エラー） */
	private static final String ERR_CD_02 = "02";
	/** エラーコード：03（形式エラー） */
	private static final String ERR_CD_03 = "03";
	/** エラーコード：04（登録状態エラー） */
	private static final String ERR_CD_04 = "04";
	/** エラーコード：05（削除状態エラー） */
	private static final String ERR_CD_05 = "05";
	/** エラーコード：06（サービスコードエラー） */
	private static final String ERR_CD_06 = "06";
	/** エラーコード：07（CAS番号相違エラー） */
	private static final String ERR_CD_07 = "07";
	/** エラーコード：08（チェックディジット判定エラー） */
	private static final String ERR_CD_08 = "08";
	/** エラーコード：09（取消状態エラー） */
	private static final String ERR_CD_09 = "09";
	/** エラーコード：10（承認状態エラー） */
	private static final String ERR_CD_10 = "10";
	/** エラーコード：11（オプション予約存在エラー） */
	private static final String ERR_CD_11 = "11";
	/** エラーコード：99（異常） */
	private static final String ERR_CD_99 = "99";
	
	/** 鍵閉め理由コード 個別鍵閉め */
	private static final String KEYCLS_RSN_CD_1 = "1";
	
	/** オプション有無フラグ ：0（無） */
	private static final String OP_UM_FLG_0 = "0";
	/** オプション有無フラグ名称 ：0（無） */
	private static final String OP_UM_FLG_NM_0 = "無";
	/** オプション有無フラグ ：1（有） */
	private static final String OP_UM_FLG_1 = "1";
	/** オプション有無フラグ名称 ：1（有） */
	private static final String OP_UM_FLG_NM_1 = "有";
	
	/** オプションサービス契約有無フラグ ：0（無） */
	private static final String OPSVKEI_UM_FLG_0 = "0";
	/** オプションサービス契約有無フラグ ：1（有） */
	private static final String OPSVKEI_UM_FLG_1 = "1";
	
	/** 空白 */
	private static final String EMPTY = "";
	
	/** 変更回数 ゼロ */
	private static final String CHG_CNT_ZERO = "0";
	
	/**
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle,
			IRequestParameterReadWrite param, String fixedText)
			throws Throwable {
		
		String dataMapKey = fixedText;
		
		// CCマップ存在チェック
		HashMap<String, Object> ccMsg = (HashMap<String, Object>) param.getData(dataMapKey);
		
		if (ccMsg == null)
		{
			return param;
		}
		
		// 機能コード
		String funcCd = (String) ccMsg.get("func_cd");
		// サービス契約番号
		String svcKeiNo = (String)ccMsg.get("svc_kei_no");
		// CAS更新リスト
		ArrayList<HashMap<String, Object>> casUpdList = (ArrayList<HashMap<String, Object>>)ccMsg.get("cas_upd_list");
		
		// 検索用枠番号取得
		String paraFrameNo = null;
		
		ArrayList<String> fixedFrameNo = new ArrayList<String>(Arrays.asList("1","2","3"));
		// 変更回数取得用に枠番号固定
		paraFrameNo = JDKCommonUtil.join(",", fixedFrameNo);
		if (!(FUNC_CD_3.equals(funcCd)))
		{
			// 相手システムID存在チェック
			if (!(AITE_SYSID_1.equals(ccMsg.get("aite_sysid"))) &&
				!(AITE_SYSID_2.equals(ccMsg.get("aite_sysid"))) &&
				!(AITE_SYSID_3.equals(ccMsg.get("aite_sysid"))))
			{
				ccMsg.put("err_cd", ERR_CD_99);
				return param;
			}
			
			// CAS更新リスト存在チェック
			if (casUpdList == null || casUpdList.size() == 0)
			{
				ccMsg.put("err_cd", ERR_CD_99);
				return param;
			}
			else
			{
				ArrayList<String> frameNo = new ArrayList<String>();
				for (int i = 0 ; i < casUpdList.size() ; i++)
				{
					
					HashMap<String, Object> wkCasUpdMap = casUpdList.get(i);
					
					// CAS更新リスト内項目存在チェック
					if (JKKStringUtil.isNullEmpty(wkCasUpdMap.get("cascd_no")) ||
							JKKStringUtil.isNullEmpty(wkCasUpdMap.get("frame_no")) ||
							JKKStringUtil.isNullEmpty(wkCasUpdMap.get("chg_div")))
					{
						ccMsg.put("err_cd", ERR_CD_99);
						return param;
					}
				}
			}
		}
		
		
		// 照会結果格納用HashMap
		HashMap<String, String> rsltMap = new HashMap<String, String>();
		
		// 照会S-IF呼出
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		/**
		 * (1) サービス契約一意照会サービスIF実行
		 */
		CAANMsg ekk0081a010MsgList = execEKK0081A010(handle, scCall, param, dataMapKey, svcKeiNo);
		if (ekk0081a010MsgList != null)
		{
			// サービス契約ステータス
			rsltMap.put("svc_kei_stat", ekk0081a010MsgList.getString(EKK0081A010CBSMsg1List.SVC_KEI_STAT));
			// サービスコード
			rsltMap.put("svc_cd", ekk0081a010MsgList.getString(EKK0081A010CBSMsg1List.SVC_CD));
			// 料金コースコード
			rsltMap.put("pcrs_cd", ekk0081a010MsgList.getString(EKK0081A010CBSMsg1List.PCRS_CD));
			// （OUTPUT）サービス契約番号
			ccMsg.put("svc_kei_no", ekk0081a010MsgList.getString(EKK0081A010CBSMsg1List.SVC_KEI_NO));
			// （OUTPUT）料金コースコード
			ccMsg.put("pcrs", ekk0081a010MsgList.getString(EKK0081A010CBSMsg1List.PCRS_CD));
			// （OUTPUT）料金コースコード名称
			ccMsg.put("pcrs_nm", ekk0081a010MsgList.getString(EKK0081A010CBSMsg1List.PCRS_CD_NM));
			// （OUTPUT）料金プランコード
			ccMsg.put("pplan", ekk0081a010MsgList.getString(EKK0081A010CBSMsg1List.PPLAN_CD));
			// （OUTPUT）料金プラン名称
			ccMsg.put("pplan_nm", ekk0081a010MsgList.getString(EKK0081A010CBSMsg1List.PPLAN_CD_NM));
			// （OUTPUT）サービス契約ステータス
			ccMsg.put("svc_kei_stat", ekk0081a010MsgList.getString(EKK0081A010CBSMsg1List.SVC_KEI_STAT));
		}
		
		/**
		 * (2) 異動予約一覧照会（サービス契約番号）サービスIF実行
		 */
		CAANMsg[] ekk1681b004MsgList = execEKK1681B004(handle, scCall, param, dataMapKey, svcKeiNo);
		if (ekk1681b004MsgList != null && ekk1681b004MsgList.length > 0)
		{
			// 新料金コース
			if (JKKStringUtil.isNullEmpty(ekk1681b004MsgList[0].getString(EKK1681B004CBSMsg1List.NEW_PCRS_CD)))
			{
				rsltMap.put("new_pcrs_cd", EMPTY);
				
			}
			else
			{
				rsltMap.put("new_pcrs_cd", ekk1681b004MsgList[0].getString(EKK1681B004CBSMsg1List.NEW_PCRS_CD));
			}
			// （OUTPUT）新料金コースコード
			ccMsg.put("new_pcrs", rsltMap.get("new_pcrs_cd"));
		}
		else
		{
			rsltMap.put("new_pcrs_cd", EMPTY);
			// （OUTPUT）新料金コースコード
			ccMsg.put("new_pcrs", rsltMap.get("new_pcrs_cd"));
		}
		
		/**
		 * (3) CASカード管理一覧照会（CAS番号登録年月日）サービスIF実行
		 */
		CAANMsg[] ekk3541b011MsgList = execEKK3541B011(handle, scCall, param, dataMapKey, svcKeiNo, paraFrameNo);
		for (CAANMsg ekk3541b011Msg : ekk3541b011MsgList)
		{
			// <枠番号, 登録件数>
			rsltMap.put(ekk3541b011Msg.getString(EKK3541B011CBSMsg1List.FRAME_NO), ekk3541b011Msg.getString(EKK3541B011CBSMsg1List.REG_CNT));
		}
		
		
		// 返却用ArrayList
		ArrayList<HashMap<String, String>> cascdList = new ArrayList<HashMap<String, String>>();
		
		/**
		 * CASカード管理一覧照会サービスIF実行
		 */
		HashMap<String, Object> ekk3541b010MsgList = execEKK3541B010(handle, scCall, param, dataMapKey, funcCd, svcKeiNo, paraFrameNo);
		
		
		/**
		 * CASカード管理履歴一覧照会サービスIF実行
		 */
		CAANMsg[] ekk3551b010MsgList = execEKK3551B010(handle, scCall, param, dataMapKey, svcKeiNo);
		// CATV顧客番号
		String catvCustNo = null;
		Boolean existKAGIAKE = false;
		if (ekk3551b010MsgList != null && ekk3551b010MsgList.length > 0)
		{
			catvCustNo = ekk3551b010MsgList[0].getString(EKK3551B010CBSMsg1List.CATV_CUST_NO);
			rsltMap.put("catv_cust_no", catvCustNo);
			
			// スカパー連携ステータス「100：鍵開け済」存在チェック
			for (CAANMsg ekk3551b010Msg : ekk3551b010MsgList)
			{
				if (JKKStrConst.SPTV_RNK_STAT_KAGIAKEZUMI.equals(ekk3551b010Msg.getString(EKK3551B010CBSMsg1List.SPTV_RNK_STAT)))
				{
					existKAGIAKE = true;
					break;
				}
			}
		}
		
		
		// 取得結果をCCマップ.CASカードリストに格納
		if (FUNC_CD_3.equals(funcCd))
		{
			for (String frameNo : fixedFrameNo)
			{
				CAANMsg ekk3541b010Msg =(CAANMsg) ekk3541b010MsgList.get(frameNo);
				HashMap<String, String> cascdMap = editCascdList(handle, scCall, param, dataMapKey, ekk3541b010Msg, rsltMap);
				cascdList.add(cascdMap);
			}
		}
		// （OUTPUT）CATV顧客番号
		ccMsg.put("catv_cust_no", catvCustNo);
		// （OUTPUT）エラーコード
		ccMsg.put("err_cd", ERR_CD_NULL);
		// （OUTPUT）CASカードリスト
		ccMsg.put("cascd_list", cascdList);
		
		// 機能コード「3：照会」の場合
		if (FUNC_CD_3.equals(funcCd))
		{
			return param;
		}
		
		
		for (HashMap casUpdMap : casUpdList)
		{
			// 枠番号に紐づくCASカード管理一覧照会を取得する。
			CAANMsg ekk3541b010Msg =(CAANMsg) ekk3541b010MsgList.get(casUpdMap.get("frame_no"));
			
			// エラーチェック  
			callErrorCheck(handle, scCall, param, dataMapKey, ccMsg, ekk3541b010Msg, rsltMap, casUpdMap);
			
			// エラーコード返却された場合、処理を終了する。
			if (!(JKKStringUtil.isNullEmpty(ccMsg.get("err_cd"))))
			{
				// （OUTPUT）エラー枠番号返却
				ccMsg.put("err_frame_no", casUpdMap.get("frame_no"));
				// （OUTPUT）エラーCASカード番号返却
				ccMsg.put("err_cascd_no", casUpdMap.get("cascd_no"));
				return param;
			}
			
			
			// 機能コード「4：画面呼出チェック」の場合
			if (FUNC_CD_4.equals(funcCd))
			{
				// （OUTPUT）エラーコード
				ccMsg.put("err_cd", ERR_CD_NULL);
				return param;
			}
			
			
			// 機能コード「4：画面呼出チェック」以外の場合
			chgDivExec(handle, scCall, param, dataMapKey, ccMsg, funcCd, svcKeiNo, ekk3541b010Msg, rsltMap, casUpdMap, existKAGIAKE);
		}
		
		// （OUTPUT）エラーコード
		ccMsg.put("err_cd", ERR_CD_NULL);
		
		return param;
	}
	
	
	/**
	 * サービス契約一意照会を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param svcKeiNo サービス契約番号
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg execEKK0081A010(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String svcKeiNo) throws Throwable
	{
		CAANMsg result = null;
		
		Object[][] ekk0081a010In =
		{
				{EKK0081A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081A010},
				{EKK0081A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2},
				{EKK0081A010CBSMsg.KEY_SVC_KEI_NO, svcKeiNo},
				{EKK0081A010CBSMsg.KEY_GENE_ADD_DTM, ""},
				{EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JCCBPCommon.getOpeDate(null)},
		};
		
		CAANMsg ekk0081a010Msg = callSC(handle, scCall, param, dataMapKey, ekk0081a010In);
		
		CAANMsg[] ekk0081a010MsgList = ekk0081a010Msg.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
		
		if (ekk0081a010MsgList != null && ekk0081a010MsgList.length > 0)
		{
			result = ekk0081a010MsgList[0];
		}
		
		return result;
	}
	
	
	/**
	 * オプションサービス契約一意照会を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg execEKK0351A010(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String opSvcKeiNo) throws Throwable
	{
		CAANMsg result = null;
		
		Object[][] ekk0351a010In =
		{
				{EKK0351A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0351A010},
				{EKK0351A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2},
				{EKK0351A010CBSMsg.KEY_OP_SVC_KEI_NO, opSvcKeiNo},
				{EKK0351A010CBSMsg.KEY_GENE_ADD_DTM, ""},
				{EKK0351A010CBSMsg.KEY_RSV_APLY_YMD, JCCBPCommon.getOpeDate(null)},
		};
		
		CAANMsg ekk0351a010Msg = callSC(handle, scCall, param, dataMapKey, ekk0351a010In);
		
		CAANMsg[] ekk0351a010MsgList = ekk0351a010Msg.getCAANMsgList(EKK0351A010CBSMsg.EKK0351A010CBSMSG1LIST);
		
		if (ekk0351a010MsgList != null && ekk0351a010MsgList.length > 0)
		{
			result = ekk0351a010MsgList[0];
		}
		
		return result;
	}
	
	
	/**
	 * 異動予約一覧照会(異動予約状態コード)を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param svcKeiNo サービス契約番号
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg[] execEKK1681B004(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String svcKeiNo) throws Throwable
	{
		
		// パラメータ:異動区分
		String idoDiv = JKKStrConst.CD00576_00009;
		// パラメータ:異動予約状態コード
		String idoRsvStatCd = JKKStrConst.CD01168_IDO_RSV_STAT_CD_00 + JKKStrConst.COMMA + JKKStrConst.CD01168_IDO_RSV_STAT_CD_03;
		
		Object[][] ekk1681b004In =
		{
				{EKK1681B004CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1681B004},
				{EKK1681B004CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
				{EKK1681B004CBSMsg.KEY_SVC_KEI_NO, svcKeiNo},
				{EKK1681B004CBSMsg.KEY_IDO_DIV, idoDiv},
				{EKK1681B004CBSMsg.KEY_IDO_RSV_STAT_CD, idoRsvStatCd},
		};
		
		CAANMsg ekk1681b004Msg = callSC(handle, scCall, param, dataMapKey, ekk1681b004In);
		
		CAANMsg[] ekk1681b004MsgList = ekk1681b004Msg.getCAANMsgList(EKK1681B004CBSMsg.EKK1681B004CBSMSG1LIST);
		
		return ekk1681b004MsgList;
	}
	
	
	/**
	 * 異動予約一覧照会(異動予約状態コード)を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg[] execEKK1681B005(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String opSvcKeiNo) throws Throwable
	{
		
		// パラメータ:異動区分
		String idoDiv = JKKStrConst.CD00576_00031;
		// パラメータ:異動予約状態コード
		String idoRsvStatCd = JKKStrConst.CD01168_IDO_RSV_STAT_CD_00 + JKKStrConst.COMMA + JKKStrConst.CD01168_IDO_RSV_STAT_CD_03;
		
		Object[][] ekk1681b005In =
		{
				{EKK1681B005CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1681B005},
				{EKK1681B005CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
				{EKK1681B005CBSMsg.KEY_OP_SVC_KEI_NO, opSvcKeiNo},
				{EKK1681B005CBSMsg.KEY_IDO_DIV, idoDiv},
				{EKK1681B005CBSMsg.KEY_IDO_RSV_STAT_CD, idoRsvStatCd},
		};
		
		CAANMsg ekk1681b005Msg = callSC(handle, scCall, param, dataMapKey, ekk1681b005In);
		
		CAANMsg[] ekk1681b005MsgList = ekk1681b005Msg.getCAANMsgList(EKK1681B005CBSMsg.EKK1681B005CBSMSG1LIST);
		
		return ekk1681b005MsgList;
	}
	
	
	/**
	 * CASカード管理一意照会を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param casCdNo CASカード番号
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg execEKK3541A010(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String casCdNo) throws Throwable
	{
		CAANMsg result = null;
		
		Object[][] ekk3541a010In =
		{
				{EKK3541A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3541A010},
				{EKK3541A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
				{EKK3541A010CBSMsg.KEY_CASCD_NO, casCdNo},
		};
		
		CAANMsg ekk3541a010Msg = callSC(handle, scCall, param, dataMapKey, ekk3541a010In);
		
		CAANMsg[] ekk3541a010MsgList = ekk3541a010Msg.getCAANMsgList(EKK3541A010CBSMsg.EKK3541A010CBSMSG1LIST);
		
		if (ekk3541a010MsgList != null && ekk3541a010MsgList.length > 0)
		{
			result = ekk3541a010MsgList[0];
		}
		
		return result;
	}
	
	
	/**
	 * CASカード管理一覧照会を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param funcCd 機能コード
	 * @param svcKeiNo サービス契約番号
	 * @param paraFrameNo 枠番号
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private HashMap<String, Object> execEKK3541B010(SessionHandle handle,
													ServiceComponentRequestInvoker scCall,
													IRequestParameterReadWrite param,
													String dataMapKey,
													String funcCd,
													String svcKeiNo,
													String paraFrameNo) throws Throwable
	{
		
		HashMap<String, Object> wkMap = new HashMap<String, Object>();
		
		if (FUNC_CD_4.equals(funcCd))
		{
			CAANMsg emptyList = new CAANMsg(EKK3541B010CBSMsg1List.class.getName());
			emptyList.set("frame_no", "0");
			wkMap.put("0", emptyList);
			return wkMap;
		}
		
		Object[][] ekk3541b010In =
		{
				{EKK3541B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3541B010},
				{EKK3541B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
				{EKK3541B010CBSMsg.KEY_SVC_KEI_NO, svcKeiNo},
				{EKK3541B010CBSMsg.KEY_FRAME_NO, paraFrameNo},
		};
		
		CAANMsg ekk3541b010Msg = callSC(handle, scCall, param, dataMapKey, ekk3541b010In);
		
		CAANMsg[] ekk3541b010MsgList = ekk3541b010Msg.getCAANMsgList(EKK3541B010CBSMsg.EKK3541B010CBSMSG1LIST);
		
		
		String[] strFrameNo = paraFrameNo.split(",");
		
		// paraFrameNo件数分、結果を返却する。（結果が存在しない場合、空を返却する）
		
		for (String frameNo : strFrameNo)
		{
			CAANMsg emptyList = new CAANMsg(EKK3541B010CBSMsg1List.class.getName());
			emptyList.set("frame_no", frameNo);
			
			if (ekk3541b010MsgList != null && ekk3541b010MsgList.length > 0)
			{
				for (CAANMsg ekk3541b010 : ekk3541b010MsgList)
				{
					if (frameNo.equals(ekk3541b010.getString(EKK3541B010CBSMsg1List.FRAME_NO)))
					{
						emptyList = ekk3541b010;
						break;
					}
				}
			}
			wkMap.put(frameNo, emptyList);
		}
		
		return wkMap;
	}
	
	
	/**
	 * CASカード管理一覧照会(CAS番号登録年月日)を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param svcKeiNo サービス契約番号
	 * @param paraFrameNo 枠番号
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg[] execEKK3541B011(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String svcKeiNo,
									String paraFrameNo) throws Throwable
	{
		
		Object[][] ekk3541b011In =
		{
				{EKK3541B011CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3541B011},
				{EKK3541B011CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
				{EKK3541B011CBSMsg.KEY_SVC_KEI_NO, svcKeiNo},
				{EKK3541B011CBSMsg.KEY_FRAME_NO, paraFrameNo},
				{EKK3541B011CBSMsg.KEY_CAS_NO_ADD_YMD, JCCBPCommon.getOpeDate(null)},
		};
		
		CAANMsg ekk3541b011Msg = callSC(handle, scCall, param, dataMapKey, ekk3541b011In);
		
		CAANMsg[] ekk3541b011MsgList = ekk3541b011Msg.getCAANMsgList(EKK3541B011CBSMsg.EKK3541B011CBSMSG1LIST);
		
		return ekk3541b011MsgList;
	}
	
	
	/**
	 * CASカード管理変更を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey データマップキー
	 * @param funcCd 機能コード
	 * @param paramInfo パラメータ
	 * @param updDtmBf 更新年月日時分秒（更新前）
	 * @throws Throwable
	 */
	private void execEKK3541C010(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String funcCd,
									HashMap<String, String> paramInfo,
									String updDtmBf) throws Throwable
	{
		
		Object[][] ekk3541c010In =
		{
				{EKK3541C010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3541C010},
				{EKK3541C010CBSMsg.FUNC_CODE, funcCd},
				{EKK3541C010CBSMsg.CASCD_NO, (String)paramInfo.get("cascd_no")},
				{EKK3541C010CBSMsg.FRAME_NO, (String)paramInfo.get("frame_no")},
				{EKK3541C010CBSMsg.SPTV_RNK_STAT, (String)paramInfo.get("sptv_rnk_stat")},
				{EKK3541C010CBSMsg.SVC_KEI_NO, (String)paramInfo.get("svc_kei_no")},
				{EKK3541C010CBSMsg.CATV_CUST_NO, (String)paramInfo.get("catv_cust_no")},
				{EKK3541C010CBSMsg.CAS_NO_ADD_YMD, (String)paramInfo.get("cas_no_add_ymd")},
				{EKK3541C010CBSMsg.CAS_NO_DEL_YMD, (String)paramInfo.get("cas_no_del_ymd")},
				{EKK3541C010CBSMsg.KEYOPN_YMD, (String)paramInfo.get("keyopn_ymd")},
				{EKK3541C010CBSMsg.CSCH_KEYOPN_YMD, (String)paramInfo.get("csch_keyopn_ymd")},
				{EKK3541C010CBSMsg.KEYCLS_YMD, (String)paramInfo.get("keycls_ymd")},
				{EKK3541C010CBSMsg.CAS_NO_APLY_YMD, (String)paramInfo.get("cas_no_aply_ymd")},
				{EKK3541C010CBSMsg.KEYCLS_RSN_CD, (String)paramInfo.get("keycls_rsn_cd")},
				{EKK3541C010CBSMsg.UPD_DTM_BF, updDtmBf},
		};
		
		callSC(handle, scCall, param, dataMapKey, ekk3541c010In);
	}
	
	
	/**
	 * CASカード管理登録を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey データマップキー
	 * @param funcCd 機能コード
	 * @param paramInfo パラメータ
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg execEKK3541D010(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String funcCd,
									HashMap<String, String> paramInfo) throws Throwable
	{
		Object[][] ekk3541d010In =
		{
				{EKK3541D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3541D010},
				{EKK3541D010CBSMsg.FUNC_CODE, funcCd},
				{EKK3541D010CBSMsg.CASCD_NO, (String)paramInfo.get("cascd_no")},
				{EKK3541D010CBSMsg.FRAME_NO, (String)paramInfo.get("frame_no")},
				{EKK3541D010CBSMsg.SPTV_RNK_STAT, (String)paramInfo.get("sptv_rnk_stat")},
				{EKK3541D010CBSMsg.SVC_KEI_NO, (String)paramInfo.get("svc_kei_no")},
				{EKK3541D010CBSMsg.CATV_CUST_NO, (String)paramInfo.get("catv_cust_no")},
				{EKK3541D010CBSMsg.CAS_NO_ADD_YMD, (String)paramInfo.get("cas_no_add_ymd")},
				{EKK3541D010CBSMsg.CAS_NO_DEL_YMD, (String)paramInfo.get("cas_no_del_ymd")},
				{EKK3541D010CBSMsg.KEYOPN_YMD, (String)paramInfo.get("keyopn_ymd")},
				{EKK3541D010CBSMsg.CSCH_KEYOPN_YMD, (String)paramInfo.get("csch_keyopn_ymd")},
				{EKK3541D010CBSMsg.KEYCLS_YMD, (String)paramInfo.get("keycls_ymd")},
				{EKK3541D010CBSMsg.CAS_NO_APLY_YMD, (String)paramInfo.get("cas_no_aply_ymd")},
				{EKK3541D010CBSMsg.KEYCLS_RSN_CD, (String)paramInfo.get("keycls_rsn_cd")},
		};
		
		return callSC(handle, scCall, param, dataMapKey, ekk3541d010In);
	}
	
	
	/**
	 * CASカード管理物理削除サービスIF実行する。
	 * 
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品のインスタンス
	 * @param param リクエストパラメータ
	 * @param dataMapKey データマップキー
	 * @param funcCd 機能コード
	 * @param cascdNo CASカード番号
	 * @param updDtmBf 更新年月日時分秒（更新前）
	 * @throws Exception
	 */
	private void execEKK3541E010(SessionHandle handle,
							ServiceComponentRequestInvoker scCall,
							IRequestParameterReadWrite param,
							String dataMapKey,
							String funcCd,
							String cascdNo,
							String updDtmBf) throws Exception
	{		
		Object[][] ekk3541e010 =
		{
				{EKK3541E010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3541E010},
				{EKK3541E010CBSMsg.FUNC_CODE, funcCd},
				{EKK3541E010CBSMsg.CASCD_NO, cascdNo},
				{EKK3541E010CBSMsg.UPD_DTM_BF, updDtmBf}
		};
		
		callSC(handle, scCall, param, dataMapKey, ekk3541e010);
	}
	
	
	/**
	 * CASカード管理履歴一覧照会を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param svcKeiNo サービス契約番号
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg[] execEKK3551B010(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String svcKeiNo) throws Throwable
	{
		
		Object[][] ekk3551b010In =
		{
				{EKK3551B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3551B010},
				{EKK3551B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
				{EKK3551B010CBSMsg.KEY_SVC_KEI_NO, svcKeiNo},
		};
		
		CAANMsg ekk3551b010Msg = callSC(handle, scCall, param, dataMapKey, ekk3551b010In);
		
		CAANMsg[] ekk3551b010MsgList = ekk3551b010Msg.getCAANMsgList(EKK3551B010CBSMsg.EKK3551B010CBSMSG1LIST);
		
		return ekk3551b010MsgList;
	}
	
	
	/**
	 * CASカード管理履歴登録を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey データマップキー
	 * @param funcCd 機能コード
	 * @param paramInfo パラメータ
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg execEKK3551D010(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String funcCd,
									HashMap<String, String> paramInfo) throws Throwable
	{
		Object[][] ekk3551d010In =
		{
				{EKK3551D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3551D010},
				{EKK3551D010CBSMsg.FUNC_CODE, funcCd},
				{EKK3551D010CBSMsg.CASCD_NO, (String)paramInfo.get("cascd_no")},
				{EKK3551D010CBSMsg.RK_ADD_DTM, JCCBPCommon.getSysDateTimeStamp()},
				{EKK3551D010CBSMsg.FRAME_NO, (String)paramInfo.get("frame_no")},
				{EKK3551D010CBSMsg.SPTV_RNK_STAT, (String)paramInfo.get("sptv_rnk_stat")},
				{EKK3551D010CBSMsg.SVC_KEI_NO, (String)paramInfo.get("svc_kei_no")},
				{EKK3551D010CBSMsg.CATV_CUST_NO, (String)paramInfo.get("catv_cust_no")},
				{EKK3551D010CBSMsg.CAS_NO_ADD_YMD, (String)paramInfo.get("cas_no_add_ymd")},
				{EKK3551D010CBSMsg.CAS_NO_DEL_YMD, (String)paramInfo.get("cas_no_del_ymd")},
				{EKK3551D010CBSMsg.KEYOPN_YMD, (String)paramInfo.get("keyopn_ymd")},
				{EKK3551D010CBSMsg.CSCH_KEYOPN_YMD, (String)paramInfo.get("csch_keyopn_ymd")},
				{EKK3551D010CBSMsg.KEYCLS_YMD, (String)paramInfo.get("keycls_ymd")},
				{EKK3551D010CBSMsg.CAS_NO_APLY_YMD, (String)paramInfo.get("cas_no_aply_ymd")},
				{EKK3551D010CBSMsg.KEYCLS_RSN_CD, (String)paramInfo.get("keycls_rsn_cd")},
		};
		
		return callSC(handle, scCall, param, dataMapKey, ekk3551d010In);
	}
	
	
	/**
	 * CAS番号対象オプションサービス契約一覧照会を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param cascdNo CASカード番号
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg[] execEKK3561B010(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String cascdNo) throws Throwable
	{
		
		Object[][] ekk3561b010In =
		{
				{EKK3561B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3561B010},
				{EKK3561B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
				{EKK3561B010CBSMsg.KEY_CASCD_NO, cascdNo},
		};
		
		CAANMsg ekk3561b010Msg = callSC(handle, scCall, param, dataMapKey, ekk3561b010In);
		
		CAANMsg[] ekk3561b010MsgList = ekk3561b010Msg.getCAANMsgList(EKK3561B010CBSMsg.EKK3561B010CBSMSG1LIST);
		
		return ekk3561b010MsgList;
	}
	
	
	/**
	 * CAS番号対象オプションサービス契約物理削除を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey データマップキー
	 * @param funcCd 機能コード
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param updDtmBf 更新年月日時分秒(更新前)
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg execEKK3561E010(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String funcCd,
									String opSvcKeiNo,
									String updDtmBf) throws Throwable
	{
		Object[][] ekk3561e010In =
		{
				{EKK3561E010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3561E010},
				{EKK3561E010CBSMsg.FUNC_CODE, funcCd},
				{EKK3561E010CBSMsg.OP_SVC_KEI_NO, opSvcKeiNo},
				{EKK3561E010CBSMsg.UPD_DTM_BF, updDtmBf},
		};
		
		return callSC(handle, scCall, param, dataMapKey, ekk3561e010In);
	}
	
	
	/**
	 * CAS番号対象オプションサービス契約履歴登録を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey データマップキー
	 * @param funcCd 機能コード
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param rkAddDtm 履歴登録年月日時分秒
	 * @param cascdNo CASカード番号
	 * @param sptvRnkStat スカパー連携ステータス
	 * @param keyopnYmd 鍵開け年月日
	 * @param keyclsYmd 鍵閉め年月日
	 * @param casNoTgAplyYmd CAS番号対象適用年月日
	 * @param keyclsRsnCd 鍵閉め理由コード
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg execEKK3571D010(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String funcCd,
									String opSvcKeiNo,
									String rkAddDtm,
									String cascdNo,
									String sptvRnkStat,
									String keyopnYmd,
									String keyclsYmd,
									String casNoTgAplyYmd,
									String keyclsRsnCd) throws Throwable
	{
		Object[][] ekk3571d010In =
		{
				{EKK3571D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3571D010},
				{EKK3571D010CBSMsg.FUNC_CODE, funcCd},
				{EKK3571D010CBSMsg.OP_SVC_KEI_NO, opSvcKeiNo},
				{EKK3571D010CBSMsg.RK_ADD_DTM, rkAddDtm},
				{EKK3571D010CBSMsg.CASCD_NO, cascdNo},
				{EKK3571D010CBSMsg.SPTV_RNK_STAT, sptvRnkStat},
				{EKK3571D010CBSMsg.KEYOPN_YMD, keyopnYmd},
				{EKK3571D010CBSMsg.KEYCLS_YMD, keyclsYmd},
				{EKK3571D010CBSMsg.CAS_NO_TG_APLY_YMD, casNoTgAplyYmd},
				{EKK3571D010CBSMsg.KEYCLS_RSN_CD, keyclsRsnCd},
		};
		
		return callSC(handle, scCall, param, dataMapKey, ekk3571d010In);
	}
	
	
	/**
	 * 取得結果をCCマップ.CASカードリストに格納する。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey データマップキー
	 * @param ekk3541b010MsgList CASカード管理一覧照会
	 * @param rsltMap 照会結果格納用HashMap
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private HashMap<String, String> editCascdList(SessionHandle handle,
																				ServiceComponentRequestInvoker scCall,
																				IRequestParameterReadWrite param,
																				String dataMapKey,
																				CAANMsg ekk3541b010Msg,
																				HashMap<String, String> rsltMap) throws Throwable
	{
		
		HashMap<String, String> cascdMap = new HashMap<String, String>();
		
		CAANMsg ekk0351a010MsgList = null;
		CAANMsg[] ekk3561b010MsgList = null;
		if (ekk3541b010Msg != null)
		{
			if (!(JKKStringUtil.isNullEmpty(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CASCD_NO))))
			{
				/**
				 * (1) CAS番号対象オプションサービス契約一覧照会サービスIF実行
				 */
				ekk3561b010MsgList = execEKK3561B010(handle, scCall, param, dataMapKey, ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CASCD_NO));
				
				// オプション有無判定
				boolean opUm = false;
				// オプションサービス契約有無判定
				boolean opsvkeiUm = false;
				if (ekk3561b010MsgList != null && ekk3561b010MsgList.length > 0)
				{
					for(int i = 0; i < ekk3561b010MsgList.length; i++)
					{
						String sptvRnkStat = ekk3561b010MsgList[i].getString(EKK3561B010CBSMsg1List.SPTV_RNK_STAT);
						if(!JKKStrConst.SPTV_RNK_STAT_KAGISIMEZUMI.equals(sptvRnkStat))
						{
							opUm = true;
							break;
						}
					}
					
					for(int i = 0; i < ekk3561b010MsgList.length; i++)
					{
						/**
						 * (2) オプションサービス契約一意照会サービスIF実行
						 */
						String opSvcKeiNo = ekk3561b010MsgList[i].getString(EKK3561B010CBSMsg1List.OP_SVC_KEI_NO);
						ekk0351a010MsgList = execEKK0351A010(handle, scCall, param, dataMapKey, opSvcKeiNo);
						if (ekk0351a010MsgList != null)
						{
							String opSvcKeiStat = ekk0351a010MsgList.getString(EKK0351A010CBSMsg1List.OP_SVC_KEI_STAT);
							if(!(JKKStrConst.OP_SVC_STAT_DSLZUMI.equals(opSvcKeiStat)
									||JKKStrConst.OP_SVC_STAT_CANCELZUMI.equals(opSvcKeiStat)))
							{
								opsvkeiUm = true;
								break;
							}
						}
					}
				}
				if (opUm)
				{
					// オプション有無フラグ
					cascdMap.put("op_um_flg", OP_UM_FLG_1);
					// オプション有無フラグ名称
					cascdMap.put("op_um_flg_nm", OP_UM_FLG_NM_1);
				}
				else
				{
					// オプション有無フラグ
					cascdMap.put("op_um_flg", OP_UM_FLG_0);
					// オプション有無フラグ名称
					cascdMap.put("op_um_flg_nm", OP_UM_FLG_NM_0);
				}
				
				if (opsvkeiUm)
				{
					// オプションサービス契約有無フラグ
					cascdMap.put("opsvkei_um_flg", OPSVKEI_UM_FLG_1);
				}
				else
				{
					// オプションサービス契約有無フラグ
					cascdMap.put("opsvkei_um_flg", OPSVKEI_UM_FLG_0);
				}
			}
			else
			{
				// オプション有無フラグ
				cascdMap.put("op_um_flg", null);
				// オプション有無フラグ名称
				cascdMap.put("op_um_flg_nm", null);
				// オプションサービス契約有無フラグ
				cascdMap.put("opsvkei_um_flg", null);
			}
		}
		
		
		// CASカード番号
		cascdMap.put("cascd_no", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CASCD_NO));
		// 枠番号
		cascdMap.put("frame_no", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.FRAME_NO));
		// スカパー連携ステータス
		cascdMap.put("sptv_rnk_stat", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT));
		// スカパー連携ステータス名称
		cascdMap.put("sptv_rnk_stat_nm", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT_NM));
		// CAS番号登録年月日
		cascdMap.put("cas_no_add_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CAS_NO_ADD_YMD));
		// CAS番号削除年月日
		cascdMap.put("cas_no_del_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CAS_NO_DEL_YMD));
		// 鍵開け年月日
		cascdMap.put("keyopn_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.KEYOPN_YMD));
		// コース変更鍵開け年月日
		cascdMap.put("csch_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CSCH_KEYOPN_YMD));
		// 鍵閉め年月日
		cascdMap.put("keycls_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.KEYCLS_YMD));
		// 変更回数
		String chgCnt = rsltMap.get(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.FRAME_NO));
		if(JKKStringUtil.isNullBlank(chgCnt))
		{
			cascdMap.put("chg_cnt", CHG_CNT_ZERO);
		}
		else
		{
			cascdMap.put("chg_cnt", chgCnt);
		}
		
		return cascdMap;
	}
	
	
	/**
	 * エラーチェックを行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param ccMsg データ情報
	 * @param ekk3541b010MsgList CASカード管理一覧照会
	 * @param rsltMap 照会結果格納用HashMap
	 * @param casUpdMap CCマップ.CAS更新リスト
	 * @throws Throwable
	 */
	private void callErrorCheck(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									HashMap<String, Object> ccMsg,
									CAANMsg ekk3541b010Msg,
									HashMap<String, String> rsltMap,
									HashMap<String, String> casUpdMap) throws Throwable
	{
		
		// 変更区分
		String chgDiv = casUpdMap.get("chg_div");
		
		// ■変更区分「1：登録」の場合
		if (CHG_DIV_1.equals(chgDiv))
		{
			if (AITE_SYSID_1.equals(ccMsg.get("aite_sysid")))
			{
				// 変更回数エラーチェック
				if (checkChangeCnt(rsltMap, casUpdMap))
				{
					ccMsg.put("err_cd", ERR_CD_01);
					return;
				}
			}
			// 重複エラーチェック
			if (checkDouble(handle, scCall, param, dataMapKey, ccMsg, casUpdMap))
			{
				ccMsg.put("err_cd", ERR_CD_02);
				return;
			}
			// 形式エラーチェック
			if (checkFormat(casUpdMap))
			{
				ccMsg.put("err_cd", ERR_CD_03);
				return;
			}
			// チェックディジット判定エラーチェック
			if (checkDigit(casUpdMap.get("cascd_no")))
			{
				ccMsg.put("err_cd", ERR_CD_08);
				return;
			}
			// サービスコードエラーチェック
			if (checkSvcCd(rsltMap))
			{
				ccMsg.put("err_cd", ERR_CD_06);
				return;
			}
			// 登録状態エラーチェック
			if (checkRegStat(ccMsg, ekk3541b010Msg, rsltMap, chgDiv))
			{
				ccMsg.put("err_cd", ERR_CD_04);
				return;
			}
		}
		// ■変更区分「2：削除」の場合
		else if (CHG_DIV_2.equals(chgDiv))
		{
			// サービスエラーチェック
			if (checkSvcCd(rsltMap))
			{
				ccMsg.put("err_cd", ERR_CD_06);
				return;
			}
			// CAS番号相違エラーチェック
			if (checkCasNo(ekk3541b010Msg, casUpdMap))
			{
				ccMsg.put("err_cd", ERR_CD_07);
				return;
			}
			// オプション予約存在エラーチェック
			if (checkOptionRsv(handle, scCall, param, dataMapKey, ekk3541b010Msg))
			{
				ccMsg.put("err_cd", ERR_CD_11);
				return;
			}
			// 削除状態エラーチェック
			if (checkDelStat(ccMsg, ekk3541b010Msg, rsltMap, chgDiv))
			{
				ccMsg.put("err_cd", ERR_CD_05);
				return;
			}
		}
		// ■変更区分「3：承認」の場合
		else if (CHG_DIV_3.equals(chgDiv))
		{
			// サービスエラーチェック
			if (checkSvcCd(rsltMap))
			{
				ccMsg.put("err_cd", ERR_CD_06);
				return;
			}
			// 承認状態エラーチェック
			if (checkAppStat(ccMsg, ekk3541b010Msg, rsltMap, chgDiv))
			{
				ccMsg.put("err_cd", ERR_CD_10);
				return;
			}
		}
		// ■想定外の変更区分の場合
		else
		{
			ccMsg.put("err_cd", ERR_CD_99);
			return;
		}
	}
	
	
	/**
	 * 変更回数エラーチェックを行う。
	 * @param rsltMap 照会結果格納用HashMap
	 * @param casUpdMap CCマップ.CAS更新リスト
	 * @return boolean
	 */
	private boolean checkChangeCnt(HashMap<String, String> rsltMap, HashMap<String, String> casUpdMap)
	{
		
		// 処理対象の枠番号の登録件数を取得
		String regCnt = rsltMap.get(casUpdMap.get("frame_no"));
		int chgCnt = 0;
		if (!JKKStringUtil.isNullEmpty(regCnt))
		{
			chgCnt = Integer.parseInt(regCnt);
		}
		
		// 変更回数が3件以上の場合
		if (chgCnt >= 3)
		{
			// チェックNG
			return true;
		}
		
		// チェックOK
		return false;
	}
	
	
	/**
	 * 重複エラーチェックを行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param ccMsg データ情報
	 * @param casUpdMap CCマップ.CAS更新リスト
	 * @return boolean
	 * @throws Throwable
	 */
	private boolean checkDouble(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									HashMap<String, Object> ccMsg,
									HashMap<String, String> casUpdMap) throws Throwable
	{
		
		/**
		 * (1) CASカード管理一意照会サービスIF実行
		 */
		CAANMsg ekk3541a010MsgList = execEKK3541A010(handle, scCall, param, dataMapKey, casUpdMap.get("cascd_no"));
		
		// 照会結果が存在する場合
		if (ekk3541a010MsgList != null)
		{
			// （OUTPUT）重複サービス契約番号
			ccMsg.put("dble_svc_kei_no", ekk3541a010MsgList.getString(EKK3541A010CBSMsg1List.SVC_KEI_NO));
			// チェックNG
			return true;
		}
		
		// チェックOK
		return false;
	}
	
	
	/**
	 * 形式エラーチェックを行う。
	 * @param casUpdMap CCマップ.CAS更新リスト
	 * @return boolean
	 */
	private boolean checkFormat(HashMap<String, String> casUpdMap)
	{
		// CASカード番号の前方6桁取得
		String casCdNo = casUpdMap.get("cascd_no").toString().substring(0,6);
		
// ANK-4673-10-00 MOD STAR
//		if (casCdNo.equals("000050") || casCdNo.equals("000055") ||
//				casCdNo.equals("000057") || casCdNo.equals("000028"))
		if(
			"000050".equals(casCdNo) ||
			"000055".equals(casCdNo) ||
			"000057".equals(casCdNo) ||
			"000028".equals(casCdNo) ||
			"000090".equals(casCdNo) ||
			"000091".equals(casCdNo) ||
			"000040".equals(casCdNo)
			)
// ANK-4673-10-00 MOD END
		{
			// チェックNG
			return true;
		}
		// チェックOK
		return false;
	}
	
	
	/**
	 * チェックディジット判定エラーチェックを行う。
	 * @param cascdNo CASカード番号
	 * @return boolean
	 */
	private boolean checkDigit(String cascdNo)
	{
		
			return JCCModelCommon.checkDigit(cascdNo);
	}
	
	
	/**
	 * サービスコードエラーチェックを行う。
	 * @param rsltMap 照会結果格納用HashMap
	 * @return boolean
	 */
	private boolean checkSvcCd(HashMap<String, String> rsltMap)
	{
		// サービスコードが「03：テレビ」以外の場合
		if (!(JKKStrConst.CD00130_03.equals(rsltMap.get("svc_cd"))))
		{
			// チェックNG
			return true;
		}
		
		// チェックOK
		return false;
	}

	
	/**
	 * CAS番号相違エラーチェックを行う。
	 * @param ekk3541b010Msg CASカード管理一覧照会
	 * @param casUpdMap CCマップ.CAS更新リスト
	 * @return boolean
	 */
	private boolean checkCasNo(CAANMsg ekk3541b010Msg, HashMap<String, String> casUpdMap)
	{
		// 
		if (!(casUpdMap.get("cascd_no").equals(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CASCD_NO))))
		{
			// チェックNG
			return true;
		}
		
		// チェックOK
		return false;
	}
	
	
	/**
	 * オプション予約存在エラーチェックを行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey データマップキー
	 * @param  ekk3541b010Msg CASカード管理一覧照会
	 * @return boolean
	 */
	private boolean checkOptionRsv(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String dataMapKey,
			CAANMsg ekk3541b010Msg) throws Throwable
	{
		
		/**
		 * CAS番号対象オプションサービス契約一覧照会サービスIF実行
		 */
		CAANMsg[] ekk3561b010MsgList = execEKK3561B010(handle, scCall, param, dataMapKey, ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CASCD_NO));
		
		// オプションサービス契約番号で異動予約検索
		if (ekk3561b010MsgList != null && ekk3561b010MsgList.length > 0)
		{
			for (CAANMsg ekk3561b010Msg : ekk3561b010MsgList)
			{
				String opSvcKeiNo = ekk3561b010Msg.getString(EKK3561B010CBSMsg1List.OP_SVC_KEI_NO);
				CAANMsg[] ekk1681b005MsgList = execEKK1681B005(handle, scCall, param, dataMapKey, opSvcKeiNo);
				
				if (ekk1681b005MsgList != null && ekk1681b005MsgList.length > 0)
				{
					// チェックNG
					return true;
				}
			}
		}
		
		// チェックOK
		return false;
	}
	
	
	/**
	 * 登録状態エラーチェックを行う。
	 * @param ccMsg
	 * @param ekk3541b010Msg CASカード管理一覧照会
	 * @param rsltMap 照会結果格納用HashMap
	 * @param chgDiv 変更区分
	 * @return boolean
	 */
	private boolean checkRegStat(HashMap<String, Object> ccMsg,
											CAANMsg ekk3541b010Msg,
											HashMap<String, String> rsltMap,
											String chgDiv)
	{
		
		// サービス契約ステータス判定
		if (AITE_SYSID_1.equals(ccMsg.get("aite_sysid")) ||
				AITE_SYSID_2.equals(ccMsg.get("aite_sysid")))
		{
			if (JKKStrConst.CD00037_STAT_PAUSE.equals(rsltMap.get("svc_kei_stat")) ||
					JKKStrConst.CD00037_STAT_STP.equals(rsltMap.get("svc_kei_stat")) ||
					JKKStrConst.CD00037_DSL_ZM.equals(rsltMap.get("svc_kei_stat")) ||
					JKKStrConst.CD00037_CANCEL_ZM.equals(rsltMap.get("svc_kei_stat")))
			{
				// チェックNG
				return true;
			}
		}
		else if (AITE_SYSID_3.equals(ccMsg.get("aite_sysid")))
		{
			if (
					JKKStrConst.CD00037_DSL_ZM.equals(rsltMap.get("svc_kei_stat")) ||
					JKKStrConst.CD00037_CANCEL_ZM.equals(rsltMap.get("svc_kei_stat")))
			{
				// チェックNG
				return true;
			}
		}
		
		// スカパー連携ステータス判定
		if (!(JKKStringUtil.isNullEmpty(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT))))
		{
			// チェックNG
			return true;
		}
		
		
		// 料金・新料金コース判定
		if (AITE_SYSID_1.equals(ccMsg.get("aite_sysid")) ||
				AITE_SYSID_2.equals(ccMsg.get("aite_sysid")))
		{
			// 現.料金コース = CSコース
			if (JKKStrConst.CD00134_AC0.equals(rsltMap.get("pcrs_cd")) ||
					JKKStrConst.CD00134_AC1.equals(rsltMap.get("pcrs_cd")))
			{
				// チェックOK
			}
			// 異動予約.新料金コース = CSコース
			else if (JKKStrConst.CD00134_AC0.equals(rsltMap.get("new_pcrs_cd")) ||
					JKKStrConst.CD00134_AC1.equals(rsltMap.get("new_pcrs_cd")))
			{
				// チェックOK
			}
			// その他
			else
			{
				// チェックNG
				return true;
			}
		}
		
		// チェックOK
		return false;
	}
	
	
	/**
	 * 削除状態エラーチェックを行う。
	 * @param ccMsg
	 * @param ekk3541b010Msg CASカード管理一覧照会
	 * @param rsltMap 照会結果格納用HashMap
	 * @param chgDiv 変更区分
	 * @return boolean
	 */
	private boolean checkDelStat(HashMap<String, Object> ccMsg,
											CAANMsg ekk3541b010Msg,
											HashMap<String, String> rsltMap,
											String chgDiv)
	{
		
		// サービス契約ステータス判定
		if (AITE_SYSID_1.equals(ccMsg.get("aite_sysid")) ||
				AITE_SYSID_2.equals(ccMsg.get("aite_sysid")))
		{
			if (JKKStrConst.CD00037_STAT_PAUSE.equals(rsltMap.get("svc_kei_stat")) ||
					JKKStrConst.CD00037_STAT_STP.equals(rsltMap.get("svc_kei_stat")) ||
					JKKStrConst.CD00037_DSL_ZM.equals(rsltMap.get("svc_kei_stat")) ||
					JKKStrConst.CD00037_CANCEL_ZM.equals(rsltMap.get("svc_kei_stat")))
			{
				// チェックNG
				return true;
			}
		}
		
		
		// スカパー連携ステータス判定
		if (EMPTY.equals(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT)) ||
				JKKStrConst.SPTV_RNK_STAT_KAGIAKEIRAICHU.equals(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT)) ||
				JKKStrConst.SPTV_RNK_STAT_KEIHENCHUKAGIAKEIRAICHU.equals(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT)) ||
				JKKStrConst.SPTV_RNK_STAT_KAGIAKEYOYAKUCHU.equals(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT)) ||
				JKKStrConst.SPTV_RNK_STAT_KAGISIMEIRAICHU.equals(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT)) ||
				JKKStrConst.SPTV_RNK_STAT_KAGISIMEYOYAKUCHU.equals(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT)) ||
				JKKStrConst.SPTV_RNK_STAT_SAKUJO.equals(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT)))
		{
			// チェックNG
			return true;
		}
		
		// チェックOK
		return false;
	}
	
	
	/**
	 * 承認状態エラーチェックを行う。
	 * @param ccMsg
	 * @param ekk3541b010Msg CASカード管理一覧照会
	 * @param rsltMap 照会結果格納用HashMap
	 * @param chgDiv 変更区分
	 * @return boolean
	 */
	private boolean checkAppStat(HashMap<String, Object> ccMsg,
											CAANMsg ekk3541b010Msg,
											HashMap<String, String> rsltMap,
											String chgDiv)
	{
		
		// サービス契約ステータス判定
		if (JKKStrConst.CD00037_UK_ZM.equals(rsltMap.get("svc_kei_stat")) ||
				JKKStrConst.CD00037_STAT_PAUSE.equals(rsltMap.get("svc_kei_stat")) ||
				JKKStrConst.CD00037_STAT_STP.equals(rsltMap.get("svc_kei_stat")) ||
				JKKStrConst.CD00037_DSL_ZM.equals(rsltMap.get("svc_kei_stat")) ||
				JKKStrConst.CD00037_CANCEL_ZM.equals(rsltMap.get("svc_kei_stat")))
		{
			// チェックNG
			return true;
		}
		
		
		// スカパー連携ステータス判定
		if (!(JKKStrConst.SPTV_RNK_STAT_KAGIAKEKARITOROKU.equals(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT))))
		{
			// チェックNG
			return true;
		}
		
		
		// 料金・新料金コース判定
		// 現.料金コース = CSコース
		if (JKKStrConst.CD00134_AC0.equals(rsltMap.get("pcrs_cd")) ||
				JKKStrConst.CD00134_AC1.equals(rsltMap.get("pcrs_cd")))
		{
			// チェックOK
		}
		// 異動予約.新料金コース = CSコース
		else if (JKKStrConst.CD00134_AC0.equals(rsltMap.get("new_pcrs_cd")) ||
				JKKStrConst.CD00134_AC1.equals(rsltMap.get("new_pcrs_cd")))
		{
			// チェックOK
		}
		// その他
		else
		{
			// チェックNG
			return true;
		}
		// チェックOK
		return false;
	}
	
	
	/**
	 * 変更区分ごとの更新処理を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param ccMsg データ情報
	 * @param funcCd 機能コード
	 * @param svcKeiNo サービス契約番号
	 * @param ekk3541b010Msg CASカード管理一覧照会
	 * @param rsltMap 照会結果格納用HashMap
	 * @param casUpdMap CCマップ.CAS更新リスト
	 * @param existKAGIAKE 鍵開け有無
	 * @throws Throwable
	 */
	private void chgDivExec(SessionHandle handle,
																	ServiceComponentRequestInvoker scCall,
																	IRequestParameterReadWrite param,
																	String dataMapKey,
																	HashMap<String, Object> ccMsg,
																	String funcCd,
																	String svcKeiNo,
																	CAANMsg ekk3541b010Msg,
																	HashMap<String, String> rsltMap,
																	HashMap<String, String> casUpdMap,
																	boolean existKAGIAKE) throws Throwable
	{
		
		// パラメーター
		HashMap<String, String> paramInfo = new HashMap<String, String>();
		
		// 変更区分
		String chgDiv = casUpdMap.get("chg_div");
		
		// ■変更区分「1：登録」の場合
		if (CHG_DIV_1.equals(chgDiv))
		{
			
			// 共通登録項目情報設定
			paramInfo = editCommonParamInfo(chgDiv, svcKeiNo, rsltMap.get("catv_cust_no"), casUpdMap, ekk3541b010Msg);
			
			// 鍵開け仮登録の登録
			if (!(AITE_SYSID_2.equals(ccMsg.get("aite_sysid"))) &&
					(JKKStrConst.CD00037_UK_ZM.equals(rsltMap.get("svc_kei_stat")) ||
					JKKStrConst.CD00037_SHOSA_ZUMI.equals(rsltMap.get("svc_kei_stat")) ||
					JKKStrConst.CD00037_CNC_ZM.equals(rsltMap.get("svc_kei_stat"))) &&
						!existKAGIAKE)
			{
				// スカパー連携ステータス
				paramInfo.put("sptv_rnk_stat", JKKStrConst.SPTV_RNK_STAT_KAGIAKEKARITOROKU);
				// 鍵開け年月日
				paramInfo.put("keyopn_ymd", null);
				/**
				 * (2) CASカード管理登録サービスIF実行
				 */
				CAANMsg ekk3541d010Msg = execEKK3541D010(handle, scCall, param, dataMapKey, funcCd, paramInfo);
				
				// 登録結果のCATV顧客番号で履歴も登録
				if (JKKStringUtil.isNullEmpty(rsltMap.get("catv_cust_no")))
				{
					paramInfo.put("catv_cust_no", ekk3541d010Msg.getString(EKK3541D010CBSMsg.CATV_CUST_NO));
					rsltMap.put("catv_cust_no", ekk3541d010Msg.getString(EKK3541D010CBSMsg.CATV_CUST_NO));
				}
				
				/**
				 * (3) CASカード管理履歴登録サービスIF実行
				 */
				execEKK3551D010(handle, scCall, param, dataMapKey, funcCd, paramInfo);
			}
			// 鍵開け依頼前の登録
			else
			{
				// スカパー連携ステータス
				paramInfo.put("sptv_rnk_stat", JKKStrConst.SPTV_RNK_STAT_KAGIAKEIRAIMAE);
				// 鍵開け年月日
				paramInfo.put("keyopn_ymd", JCCBPCommon.getOpeDate(null));
				/**
				 * (2) CASカード管理登録サービスIF実行
				 */
				CAANMsg ekk3541d010Msg = execEKK3541D010(handle, scCall, param, dataMapKey, funcCd, paramInfo);
				
				// 登録結果のCATV顧客番号で履歴も登録
				if (JKKStringUtil.isNullEmpty(rsltMap.get("catv_cust_no")))
				{
					paramInfo.put("catv_cust_no", ekk3541d010Msg.getString(EKK3541D010CBSMsg.CATV_CUST_NO));
					rsltMap.put("catv_cust_no", ekk3541d010Msg.getString(EKK3541D010CBSMsg.CATV_CUST_NO));
				}
				
				/**
				 * (3) CASカード管理履歴登録サービスIF実行
				 */
				execEKK3551D010(handle, scCall, param, dataMapKey, funcCd, paramInfo);
			}
		}
		// ■変更区分「2：削除」の場合
		else if (CHG_DIV_2.equals(chgDiv))
		{
			
			// 共通登録項目情報設定
			paramInfo = editCommonParamInfo(chgDiv, svcKeiNo, null, casUpdMap, ekk3541b010Msg);
			
			// スカパー連携不要である削除
			if (JKKStrConst.SPTV_RNK_STAT_KAGIAKEKARITOROKU.equals(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT)) ||
					JKKStrConst.SPTV_RNK_STAT_KAGIAKEIRAIMAE.equals(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT)) ||
					JKKStrConst.SPTV_RNK_STAT_KAGIAKEERROR.equals(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT)) ||
					JKKStrConst.SPTV_RNK_STAT_KAGISIMEZUMI.equals(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT)))
			{
				// スカパー連携ステータス
				paramInfo.put("sptv_rnk_stat", JKKStrConst.SPTV_RNK_STAT_SAKUJO);
				// 鍵閉め年月日
				paramInfo.put("keycls_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.KEYCLS_YMD));
				// 鍵閉め理由コード
				paramInfo.put("keycls_rsn_cd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.KEYCLS_RSN_CD));
				
				/**
				 * (1) CASカード管理物理削除サービスIF実行
				 */
				execEKK3541E010(handle, scCall, param, dataMapKey, funcCd, casUpdMap.get("cascd_no"), ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.UPD_DTM));
				
				/**
				 * (2) CASカード管理履歴登録サービスIF実行
				 */
				execEKK3551D010(handle, scCall, param, dataMapKey, funcCd, paramInfo);
				
				/**
				 * (3) CAS番号対象オプションサービス契約一覧照会サービスIF実行
				 */
				CAANMsg[] ekk3561b010MsgList = execEKK3561B010(handle, scCall, param, dataMapKey, casUpdMap.get("cascd_no"));
				
				// 紐づくCAS番号対象オプションサービス全てを物理削除する。
				if (ekk3561b010MsgList != null && ekk3561b010MsgList.length > 0)
				{
					for (int i = 0; i < ekk3561b010MsgList.length; i++)
					{
						// オプションサービス契約番号
						String opSvcKeiNo = ekk3561b010MsgList[i].getString(EKK3561B010CBSMsg1List.OP_SVC_KEI_NO);
						
						// CASカード番号
						String cascdNo = ekk3561b010MsgList[i].getString(EKK3561B010CBSMsg1List.CASCD_NO);
						
						// スカパー連携ステータス
						String sptvRnkStat = JKKStrConst.SPTV_RNK_STAT_SAKUJO;
						
						// 鍵開け年月日
						String keyopnYmd = ekk3561b010MsgList[i].getString(EKK3561B010CBSMsg1List.KEYOPN_YMD);
						
						// CAS番号対象適用年月日
						String casNoTgAplyYmd = ekk3561b010MsgList[i].getString(EKK3561B010CBSMsg1List.CAS_NO_TG_APLY_YMD);
						
						// 更新年月日時分秒(更新前)
						String updDtmBf = ekk3561b010MsgList[i].getString(EKK3561B010CBSMsg1List.UPD_DTM);
						
						// システム日付
						String sysDate = JCCBPCommon.getSysDateTimeStamp();
						
						// 鍵閉め年月日
						String keyclsYmd = ekk3561b010MsgList[i].getString(EKK3561B010CBSMsg1List.KEYCLS_YMD);
						
						// 鍵閉め理由コード
						String keyclsRsnCd = ekk3561b010MsgList[i].getString(EKK3561B010CBSMsg1List.KEYCLS_RSN_CD);
						
						/**
						 * (4) CAS番号対象オプションサービス契約物理削除サービスIF実行
						 */
						execEKK3561E010(handle, scCall, param, dataMapKey, funcCd, opSvcKeiNo, updDtmBf);
						
						/**
						 * (5) CAS番号対象オプションサービス契約履歴登録サービスIF実行
						 */
						execEKK3571D010(handle, scCall, param, dataMapKey, funcCd, opSvcKeiNo, sysDate, cascdNo, sptvRnkStat, keyopnYmd, keyclsYmd, casNoTgAplyYmd, keyclsRsnCd);
					}
				}
			}
			// スカパー連携必要である削除
			else if (JKKStrConst.SPTV_RNK_STAT_KEIHENCHUKAGIAKEIRAIMAE.equals(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT)) ||
					JKKStrConst.SPTV_RNK_STAT_KEIHENCHUKAGIAKEERROR.equals(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT)) ||
					JKKStrConst.SPTV_RNK_STAT_KAGIAKEZUMI.equals(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT)) ||
					JKKStrConst.SPTV_RNK_STAT_KAGISIMEIRAIMAE.equals(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT)) ||
					JKKStrConst.SPTV_RNK_STAT_KAGISIMEERROR.equals(ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT)))
			{
				// スカパー連携ステータス
				paramInfo.put("sptv_rnk_stat", JKKStrConst.SPTV_RNK_STAT_KAGISIMEIRAIMAE);
				// 鍵閉め年月日
				paramInfo.put("keycls_ymd", JCCBPCommon.getOpeDate(null));
				// 鍵閉め理由コード
				paramInfo.put("keycls_rsn_cd", KEYCLS_RSN_CD_1);
				
				/**
				 * (1) CASカード管理変更サービスIF実行
				 */
				execEKK3541C010(handle, scCall, param, dataMapKey, funcCd, paramInfo, ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.UPD_DTM));
				
				/**
				 * (2) CASカード管理履歴登録サービスIF実行
				 */
				execEKK3551D010(handle, scCall, param, dataMapKey, funcCd, paramInfo);
			}
		}
		// ■変更区分「3：承認」の場合
		else if (CHG_DIV_3.equals(chgDiv))
		{
			
			// 共通項目情報設定
			paramInfo = editCommonParamInfo(chgDiv, svcKeiNo, null, casUpdMap, ekk3541b010Msg);
			
			/**
			 * (1) CASカード管理変更サービスIF実行
			 */
			execEKK3541C010(handle, scCall, param, dataMapKey, funcCd, paramInfo, ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.UPD_DTM));
			
			/**
			 * (2) CASカード管理履歴登録サービスIF実行
			 */
			execEKK3551D010(handle, scCall, param, dataMapKey, funcCd, paramInfo);
		}
		
	}
	
	
	/**
	 * @param chgDiv リクエストパラメータ
	 * @param svcKeiNo サービス契約番号
	 * @param catvCustNo CATV顧客番号
	 * @param casUpdMap CCマップ.CAS更新リスト
	 * @param ekk3541b010Msg CASカード管理一覧照会
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, String> editCommonParamInfo(String chgDiv,
																						String svcKeiNo,
																						String catvCustNo,
																						HashMap<String, String> casUpdMap,
																						CAANMsg ekk3541b010Msg) throws RequestParameterException
	{
		
		HashMap<String, String> paramInfo = new HashMap<String, String>();
		
		// ■変更区分「1：登録」の場合
		if (CHG_DIV_1.equals(chgDiv))
		{
			// CASカード番号
			paramInfo.put("cascd_no", casUpdMap.get("cascd_no"));
			// 枠番号
			paramInfo.put("frame_no", casUpdMap.get("frame_no"));
			// サービス契約番号
			paramInfo.put("svc_kei_no", svcKeiNo);
			// CATV顧客番号
			paramInfo.put("catv_cust_no", catvCustNo);
			// CAS番号登録年月日
			paramInfo.put("cas_no_add_ymd", JCCBPCommon.getOpeDate(null));
			// CAS番号削除年月日
			paramInfo.put("cas_no_del_ymd", null);
			// コース変更鍵開け年月日
			paramInfo.put("csch_keyopn_ymd", null);
			// 鍵閉め年月日
			paramInfo.put("keycls_ymd", null);
			// CAS番号適用年月日
			paramInfo.put("cas_no_aply_ymd", null);
			// 鍵閉め理由コード
			paramInfo.put("keycls_rsn_cd", null);
		}
		// ■変更区分「2：削除」の場合
		else if (CHG_DIV_2.equals(chgDiv))
		{
			
			// CASカード番号
			paramInfo.put("cascd_no", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CASCD_NO));
			// 枠番号
			paramInfo.put("frame_no", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.FRAME_NO));
			// サービス契約番号
			paramInfo.put("svc_kei_no", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SVC_KEI_NO));
			// CATV顧客番号
			paramInfo.put("catv_cust_no", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CATV_CUST_NO));
			// CAS番号登録年月日
			paramInfo.put("cas_no_add_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CAS_NO_ADD_YMD));
			// CAS番号削除年月日
			paramInfo.put("cas_no_del_ymd", JCCBPCommon.getOpeDate(null));
			// 鍵開け年月日
			paramInfo.put("keyopn_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.KEYOPN_YMD));
			// コース変更鍵開け年月日
			paramInfo.put("csch_keyopn_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CSCH_KEYOPN_YMD));
			// CAS番号適用年月日
			paramInfo.put("cas_no_aply_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CAS_NO_APLY_YMD));
		}
		// ■変更区分「3：承認」の場合
		else if (CHG_DIV_3.equals(chgDiv))
		{
			// CASカード番号
			paramInfo.put("cascd_no", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CASCD_NO));
			// 枠番号
			paramInfo.put("frame_no", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.FRAME_NO));
			// スカパー連携ステータス
			paramInfo.put("sptv_rnk_stat", JKKStrConst.SPTV_RNK_STAT_KAGIAKEIRAIMAE);
			// サービス契約番号
			paramInfo.put("svc_kei_no", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SVC_KEI_NO));
			// CATV顧客番号
			paramInfo.put("catv_cust_no", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CATV_CUST_NO));
			// CAS番号登録年月日
			paramInfo.put("cas_no_add_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CAS_NO_ADD_YMD));
			// CAS番号削除年月日
			paramInfo.put("cas_no_del_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CAS_NO_DEL_YMD));
			// 鍵開け年月日
			paramInfo.put("keyopn_ymd", JCCBPCommon.getOpeDate(null));
			// コース変更鍵開け年月日
			paramInfo.put("csch_keyopn_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CSCH_KEYOPN_YMD));
			// 鍵閉め年月日
			paramInfo.put("keycls_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.KEYCLS_YMD));
			// CAS番号適用年月日
			paramInfo.put("cas_no_aply_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CAS_NO_APLY_YMD));
			// 鍵閉め理由コード
			paramInfo.put("keycls_rsn_cd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.KEYCLS_RSN_CD));
		}
		
		return paramInfo;
	}
	
	
	/**
	 * @param param リクエストパラメータ
	 * @param mappingData 
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param,
												Object[][] mappingData) 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));
		
		String svcIf = (String)mappingData[0][1];
		
		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));
		
		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		for (int i = 0; i < mappingData.length; i++)
		{
			/* CAANMsg[]の場合 */
			if (mappingData[i][1] instanceof CAANMsg[])
			{
				template.set((String)mappingData[i][0], (CAANMsg[])mappingData[i][1]);
			}
			/* CAANMsg[]の以外 */
			else
			{
				/* nullの場合*/
				if (EMPTY.equals(mappingData[i][1]))
				{
					template.setNull((String)mappingData[i][0]);
				}
				/* 他の場合*/
				else 
				{
					template.set((String)mappingData[i][0], mappingData[i][1]);
				}
			}
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * 
	 * @param param リクエストパラメータ
	 * @param templates
	 * @param returnCode
	 * @param fixedText サービスメッセージ
	 * @param mappingData
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates,
														int returnCode,
														String fixedText,
														Object[][] mappingData) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		/* 0以外のとき */
		if (returnCode != 0)
		{
			templateStatus = 9000;
		}
		
		/* nullのとき */
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		/* nullの場合 */
		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<String, String> inMap = null;
		
		// ユーザデータ情報
		inMap = (HashMap<String, String>)param.getData(fixedText);
		
		for (int i = 0; i < mappingData.length; i++)
		{
			/* nullチェック　*/
			if (!template.isNull(mappingData[i][0] + "_err"))
			{
				/* ユーザデータ情報にエラーを確認する　*/
				if (!inMap.containsKey(mappingData[i][0] + "_err"))
				{
					inMap.put(mappingData[i][0] + "_err", template.getString(mappingData[i][0] + "_err"));
				}
			}
		}
		return param;
	}


	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String fixedText,
			Object[][] mappingData) throws Exception
	{
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);
		
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		
		// リターンコード取得
		Object return_code = result.get(JCMConstants.RET_CD_INT_KEY);
		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		editErrorInfoCom(param, templates, (Integer)return_code, fixedText, mappingData);
		
		//エラー情報のマップを取得
		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));
		
		/* 異常の場合、SCCallExceptionを生成してスローする */
		if (!("0".equals(return_code.toString()) && 0 == status))
		{
			throw new SCCallException("戻り値不正", return_code.toString(), status);
		}
		return msg;
	}

}
