/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKCsCrsInfOperateCC
*	ソースファイル名：JKKCsCrsInfOperateCC.java
*	作成者			：FJ
*	日付			：2025/01/15
*＜機能概要＞
*	CSコース情報操作の共通コンポーネント
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v74.00.00   2025/01/15  FJ）三角      【ANK-4592-00-00】テレビ新コース（スカパー用）導入対応）
*   v75.00.00   2025/04/08  FJ）中川      【ANK-4673-00-00】テレビ新コース（スカパー用）導入対応 2025年6月フォロー案件
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;

import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKCommonUtil;
import eo.common.util.JPCDateUtil;
import eo.common.util.JPCUtilCommon;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3541B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3541B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3541C010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3541E010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3551D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3561B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3561B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3561C010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3571D010CBSMsg;

/**
 * CSコース情報操作の共通コンポーネントクラスです。
 * <br>
 * @author 富士通
 *
 */
public class JKKCsCrsInfOperateCC extends AbstractCommonComponent
{
	/** サービス契約一意照会 */
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	/** CASカード管理一覧照会 */
	private static final String TEMPLATE_ID_EKK3541B010 = "EKK3541B010";
	/** CASカード管理変更 */
	private static final String TEMPLATE_ID_EKK3541C010 = "EKK3541C010";
	/** CASカード管理物理削除 */
	private static final String TEMPLATE_ID_EKK3541E010 = "EKK3541E010";
	/** 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_EKK3561C010 = "EKK3561C010";
	/** CAS番号対象オプションサービス契約履歴登録 */
	private static final String TEMPLATE_ID_EKK3571D010 = "EKK3571D010";
	
	/** 機能コード 更新 */
	private static final String FUNC_CD_UPD = "1";
	/** 機能コード チェックのみ */
	private static final String FUNC_CD_CHK = "2";
	
	/** 処理コード コース変更 */
	private static final String SHORI_CD_CRS_CHG = "2";
	/** 処理コード コース変更取消 */
	private static final String SHORI_CD_CRS_CHG_CL = "3";
	/** 処理コード 解約・停止・休止 */
	private static final String SHORI_CD_DSL_STP_PAUSE = "4";
	/** 処理コード 回復・休止解除・停止解除 */
	private static final String SHORI_CD_KAIHK_PAUSE_STP_RLS = "5";
	
	/** スカパー適用基準年月日区分 即時 */
	private static final String SPTV_APLY_STDARDYMD_DIV_JST = "1";
	/** スカパー適用基準年月日区分 次月 */
	private static final String SPTV_APLY_STDARDYMD_DIV_NXTM = "2";
// ANK-4673-00-00 ADD START
	/** スカパー適用基準年月日区分 未定 */
	private static final String SPTV_APLY_STDARDYMD_DIV_MITEI = "4";
// ANK-4673-00-00 ADD END	
	/** 鍵閉め理由コード 個別鍵閉め */
	private static final String KEYCLS_RSN_CD_KBT = "1";
	/** 鍵閉め理由コード コース変更に伴う鍵閉め  */
	private static final String KEYCLS_RSN_CD_CSCH = "2";
	/** 鍵閉め理由コード サービスに伴う鍵閉め */
	private static final String KEYCLS_RSN_CD_SVC = "3";
	
	/** 操作区分 解約 */
	private static final String OPE_DIV_KAIYAKU = "1";
	/** 操作区分 休止  */
	private static final String OPE_DIV_KYUSI = "2";
	/** 操作区分 停止 */
	private static final String OPE_DIV_TEISI = "3";
	
	
	/**
	 * CSコース情報操作を行う。
	 * <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;
		
		// CSコース情報操作CCマップ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		
		
		if (ccMsg == null)
		{
			return param;
		}
		
		
		// システム日時を取得
		String sysDate =  JCCBPCommon.getSysDateTimeStamp();
		
		// 運用日付を取得
		String unyoDate = JCCBPCommon.getOpeDate(null);
		
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 機能コード
		String funcCd = (String)ccMsg.get("func_cd");
		
		// 機能コードが１（更新）または２（チェックのみ） 以外の場合
		if(!(FUNC_CD_UPD.equals(funcCd) || FUNC_CD_CHK.equals(funcCd)))
		{
			// エラーコード：異常
			ccMsg.put("err_cd", "99");
			return param;
		}
		
		// 処理コード
		String shoriCd = (String)ccMsg.get("shori_cd");
		
		// 処理コードが ４（解約・停止・休止）または ５（回復・休止解除・停止解除）の場合
		if(SHORI_CD_DSL_STP_PAUSE.equals(shoriCd) || SHORI_CD_KAIHK_PAUSE_STP_RLS.equals(shoriCd))
		{
			// 必須チェック
			// 算出元日付が未設定の場合、処理を終了する。
			if(JKKCommonUtil.isNull((String)ccMsg.get("snst_mt_ymd")))
			{
				// エラーコード：異常
				ccMsg.put("err_cd", "99");
				return param;
			}
			
			// 予約対象チェック
			// 算出元日付＞処理日付の場合、処理を終了する。
			if(((String)ccMsg.get("snst_mt_ymd")).compareTo(unyoDate) > 0)
			{
				// エラーコード：正常
				ccMsg.put("err_cd", null);
				return param;
			}
			
			// 処理コードが ５（回復・休止解除・停止解除）の場合
			if(SHORI_CD_KAIHK_PAUSE_STP_RLS.equals(shoriCd))
			{
				// サービス契約番号
				String svcKeiNo = (String)ccMsg.get("svc_kei_no");
				// サービス契約一意照会
				CAANMsg ekk0081a010Msg = execEKK0081A010(handle, scCall, param, dataMapKey, svcKeiNo);
				if (ekk0081a010Msg != null)
				{
					// 料金コースコード
					String pcrsCd = ekk0081a010Msg.getString(EKK0081A010CBSMsg1List.PCRS_CD);
					// サービス契約.料金コースがＣＳコース以外の場合、処理を終了する。
					if(!(JKKStrConst.CD00134_AC0.equals(pcrsCd) || JKKStrConst.CD00134_AC1.equals(pcrsCd)))
					{
						// エラーコード：正常
						ccMsg.put("err_cd", null);
						return param;
					}
				}
				else
				{
					// エラーコード：正常
					ccMsg.put("err_cd", null);
					return param;
				}
			}
		}
		// 算出元日付
		String snstMtYmd = (String)ccMsg.get("snst_mt_ymd");
		
		// CASカード管理情報リスト作成
		ArrayList<HashMap<String, Object>> cascdKnriList = new ArrayList<HashMap<String, Object>>();
		
		
		// CASカード管理情報取得
		cascdKnri(handle, scCall, param, dataMapKey, cascdKnriList, ccMsg);
		
		if(cascdKnriList == null || cascdKnriList.size() == 0)
		{
			// CASカード管理情報が空の場合、処理を終了する。
			ccMsg.put("err_cd", null);
			return param;
		}
		
		// 処理コードがコース変更の場合
		if (SHORI_CD_CRS_CHG.equals(shoriCd))
		{
			chgCrs(handle, scCall, param, dataMapKey, sysDate, unyoDate, funcCd, ccMsg);
		}
		// 処理コードがコース変更取消の場合
		else if (SHORI_CD_CRS_CHG_CL.equals(shoriCd))
		{
			clCrsChg(handle, scCall, param, dataMapKey, sysDate, unyoDate, funcCd, ccMsg);
		}
		// 処理コードが解約・停止・休止の場合
		else if (SHORI_CD_DSL_STP_PAUSE.equals(shoriCd))
		{
			dslStpPause(handle, scCall, param, dataMapKey, sysDate, unyoDate, funcCd, snstMtYmd, ccMsg);
		}
		// 処理コードが回復・休止解除・停止解除の場合
		else if (SHORI_CD_KAIHK_PAUSE_STP_RLS.equals(shoriCd))
		{
			kaihkPauseStpRls(handle, scCall, param, dataMapKey, sysDate, unyoDate, funcCd, ccMsg);
		}
		
		ccMsg.remove("cascd_knri_list");
		
		return param;
	}
	
	
	/**
	 * CASカード管理情報取得を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param ccMsg データ情報
	 * @throws Throwable
	 */
	private void cascdKnri(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									ArrayList<HashMap<String, Object>> cascdKnriList,
									HashMap<String, Object> ccMsg) throws Throwable
	{
		// サービス契約番号
		String svcKeiNo = (String)ccMsg.get("svc_kei_no");
		
		
		// CASカード管理一覧照会
		CAANMsg[] ekk3541b010MsgList = execEKK3541B010(handle, scCall, param, dataMapKey, svcKeiNo);
		
		if (ekk3541b010MsgList != null && ekk3541b010MsgList.length > 0)
		{
			for (CAANMsg ekk3541b010Msg : ekk3541b010MsgList)
			{
				
				// CASカード管理マップの初期化
				HashMap<String, Object> cascdKnriNoMap = new HashMap<String, Object>();
				
				// ＣＡＳカード番号
				cascdKnriNoMap.put("cascd_no", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CASCD_NO));
				// 枠番号
				cascdKnriNoMap.put("frame_no", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.FRAME_NO));
				// スカパー連携ステータス
				cascdKnriNoMap.put("sptv_rnk_stat", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.SPTV_RNK_STAT));
				// サービス契約番号
				cascdKnriNoMap.put("svc_kei_no", svcKeiNo);
				// ＣＡＴＶ顧客番号
				cascdKnriNoMap.put("catv_cust_no", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CATV_CUST_NO));
				// ＣＡＳ番号登録年月日
				cascdKnriNoMap.put("cas_no_add_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CAS_NO_ADD_YMD));
				// ＣＡＳ番号削除年月日
				cascdKnriNoMap.put("cas_no_del_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CAS_NO_DEL_YMD));
				// 鍵開け年月日
				cascdKnriNoMap.put("keyopn_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.KEYOPN_YMD));
				// コース変更鍵開け年月日
				cascdKnriNoMap.put("csch_keyopn_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CSCH_KEYOPN_YMD));
				// 鍵閉め年月日
				cascdKnriNoMap.put("keycls_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.KEYCLS_YMD));
				// ＣＡＳ番号適用年月日
				cascdKnriNoMap.put("cas_no_aply_ymd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.CAS_NO_APLY_YMD));
				// 鍵閉め理由コード
				cascdKnriNoMap.put("keycls_rsn_cd", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.KEYCLS_RSN_CD));
				// 更新年月日時分秒
				cascdKnriNoMap.put("upd_dtm", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.UPD_DTM));
				// 無効フラグ
				cascdKnriNoMap.put("mk_flg", ekk3541b010Msg.getString(EKK3541B010CBSMsg1List.MK_FLG));
				
				
				// CASカード管理情報リスト
				cascdKnriList.add(cascdKnriNoMap);
				
			}
		}
		
		ccMsg.put("cascd_knri_list", cascdKnriList);
		
	}
	
	
	/**
	 * コース変更を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param funcCd 機能コード
	 * @param ccMsg データ情報
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void chgCrs(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String sysDate,
									String unyoDate,
									String funcCd,
									HashMap<String, Object> ccMsg) throws Throwable
	{
		// 旧料金コースが未設定の場合、処理を終了する。
		if(JKKCommonUtil.isNull((String)ccMsg.get("old_pcrs")))
		{
			// エラーコード：異常
			ccMsg.put("err_cd", "99");
			return;
		}
		// 旧料金コース
		String oldPcrs = (String)ccMsg.get("old_pcrs");
		
		// 新料金コースが未設定の場合、処理を終了する。
		if(JKKCommonUtil.isNull((String)ccMsg.get("new_pcrs")))
		{
			// エラーコード：異常
			ccMsg.put("err_cd", "99");
			return;
		}
		// 新料金コース
		String newPcrs = (String)ccMsg.get("new_pcrs");
		
		// スカパー適用基準年月日区分
		String sptvAplyStdardymdDiv = (String)ccMsg.get("sptv_aply_stdardymd_div");
		
// ANK-4673-00-00 MOD START
//		// スカパー適用基準年月日区分が１（即時）または２（次月） 以外の場合、処理を終了する。
//		if(!(SPTV_APLY_STDARDYMD_DIV_JST.equals(sptvAplyStdardymdDiv) || SPTV_APLY_STDARDYMD_DIV_NXTM.equals(sptvAplyStdardymdDiv)))
		// スカパー適用基準年月日区分が１（即時）または２（次月）または４（未定） 以外の場合、処理を終了する。
		if(!(SPTV_APLY_STDARDYMD_DIV_JST.equals(sptvAplyStdardymdDiv) || SPTV_APLY_STDARDYMD_DIV_NXTM.equals(sptvAplyStdardymdDiv)
				|| SPTV_APLY_STDARDYMD_DIV_MITEI.equals(sptvAplyStdardymdDiv)))
// ANK-4673-00-00 MOD END
		{
			// エラーコード：異常
			ccMsg.put("err_cd", "99");
			return;
		}
		
		// CASカード管理一覧照会の結果を取得
		ArrayList cascdKnriList = (ArrayList)ccMsg.get("cascd_knri_list");
		
		
		for(int i = 0; i < cascdKnriList.size(); i++)
		{
			// CASカード管理マップの初期化
			HashMap<String, Object> cascdKnriNoMap = null;
			cascdKnriNoMap = (HashMap<String, Object>)cascdKnriList.get(i);
			
			// スカパー連携ステータス
			String sptvRnkStat = (String)cascdKnriNoMap.get("sptv_rnk_stat");
			
			// スカパー連携ステータス判定
			if(JKKStrConst.SPTV_RNK_STAT_KEIHENCHUKAGIAKEIRAIMAE.equals(sptvRnkStat)
					|| JKKStrConst.SPTV_RNK_STAT_KAGIAKEIRAICHU.equals(sptvRnkStat)
					|| JKKStrConst.SPTV_RNK_STAT_KEIHENCHUKAGIAKEIRAICHU.equals(sptvRnkStat)
					|| JKKStrConst.SPTV_RNK_STAT_KAGIAKEERROR.equals(sptvRnkStat)
					|| JKKStrConst.SPTV_RNK_STAT_KEIHENCHUKAGIAKEERROR.equals(sptvRnkStat))
			{
				// エラーコード：登録状態エラー
				ccMsg.put("err_cd", "04");
				return;
			}
		}
		
		// チェックOKの場合のみ、以降の処理を行う。
		for(int i = 0; i < cascdKnriList.size(); i++)
		{
			// CASカード管理マップの初期化
			HashMap<String, Object> cascdKnriNoMap = null;
			
			// CASカード管理物理削除フラグ
			boolean delFlg = false;
			
			cascdKnriNoMap = (HashMap<String, Object>)cascdKnriList.get(i);
			
			
			// ＣＡＳカード番号
			String cascdNo = (String)cascdKnriNoMap.get("cascd_no");
			// 枠番号
			String frameNo = (String)cascdKnriNoMap.get("frame_no");
			// スカパー連携ステータス
			String sptvRnkStat = (String)cascdKnriNoMap.get("sptv_rnk_stat");
			// サービス契約番号
			String svcKeiNo = (String)cascdKnriNoMap.get("svc_kei_no");
			// ＣＡＴＶ顧客番号
			String catvCustNo = (String)cascdKnriNoMap.get("catv_cust_no");
			// ＣＡＳ番号登録年月日
			String casNoAddYmd = (String)cascdKnriNoMap.get("cas_no_add_ymd");
			// ＣＡＳ番号削除年月日
			String casNoDelYmd = (String)cascdKnriNoMap.get("cas_no_del_ymd");
			// 鍵開け年月日
			String keyopnYmd = (String)cascdKnriNoMap.get("keyopn_ymd");
			// コース変更鍵開け年月日
			String cschKeyopnYmd = (String)cascdKnriNoMap.get("csch_keyopn_ymd");
			// 鍵閉め年月日
			String keyclsYmd = (String)cascdKnriNoMap.get("keycls_ymd");
			// ＣＡＳ番号適用年月日
			String casNoAplyYmd = (String)cascdKnriNoMap.get("cas_no_aply_ymd");
			// 鍵閉め理由コード
			String keyclsRsnCd = (String)cascdKnriNoMap.get("keycls_rsn_cd");
			// 更新年月日時分秒
			String updDtm = (String)cascdKnriNoMap.get("upd_dtm");
			
			
			// 旧料金コースがＣＳコース 且つ 新料金コースがＣＳコースの場合
			if ((JKKStrConst.CD00134_AC0.equals(oldPcrs) || JKKStrConst.CD00134_AC1.equals(oldPcrs))
					&& (JKKStrConst.CD00134_AC0.equals(newPcrs) || JKKStrConst.CD00134_AC1.equals(newPcrs)))
			{
				// コース変更日付設定処理判定
				if(JKKStrConst.SPTV_RNK_STAT_KAGIAKEZUMI.equals(sptvRnkStat))
				{
					// スカパー連携ステータス更新（契約変更中鍵開け依頼中）
					sptvRnkStat = JKKStrConst.SPTV_RNK_STAT_KEIHENCHUKAGIAKEIRAIMAE;
					
					// スカパー適用基準年月日区分が即時の場合
					if(SPTV_APLY_STDARDYMD_DIV_JST.equals(sptvAplyStdardymdDiv))
					{
						// 処理日付を設定
						cschKeyopnYmd = unyoDate;
					}
					// スカパー適用基準年月日区分が次月 かつ
					// 旧料金コースがＣＳベーシック かつ 新料金コースがＣＳプレミアムの場合
					else if(SPTV_APLY_STDARDYMD_DIV_NXTM.equals(sptvAplyStdardymdDiv)
							&& JKKStrConst.CD00134_AC0.equals(oldPcrs) && JKKStrConst.CD00134_AC1.equals(newPcrs))
					{
						// 当月末日を設定
						String operateDateEndday = JPCUtilCommon.getEndOfMonth(unyoDate.substring(0,6));
						cschKeyopnYmd = unyoDate.substring(0,6) + operateDateEndday;
					}
					// スカパー適用基準年月日区分が次月 かつ
					// 旧料金コースがＣＳプレミアム かつ 新料金コースがＣＳベーシックの場合
					else if(SPTV_APLY_STDARDYMD_DIV_NXTM.equals(sptvAplyStdardymdDiv)
							&& JKKStrConst.CD00134_AC1.equals(oldPcrs) && JKKStrConst.CD00134_AC0.equals(newPcrs))
					{
						// 翌月１日を設定
						String date = JPCDateUtil.addMonth(unyoDate, 1);
						cschKeyopnYmd = date.substring(0, 6) + "01";
					}
					
				}
				else
				{
					continue;
				}
			}
			// 旧料金コースがＣＳコース以外 且つ 新料金コースがＣＳコースの場合		
			else if (!(JKKStrConst.CD00134_AC0.equals(oldPcrs) || JKKStrConst.CD00134_AC1.equals(oldPcrs))
					&& (JKKStrConst.CD00134_AC0.equals(newPcrs) || JKKStrConst.CD00134_AC1.equals(newPcrs)))
			{
				// スカパー連携ステータスが鍵閉め依頼前の場合
				if(JKKStrConst.SPTV_RNK_STAT_KAGISIMEIRAIMAE.equals(sptvRnkStat))
				{
					// 鍵閉め理由コードが個別鍵閉め以外の場合
					if(!KEYCLS_RSN_CD_KBT.equals(keyclsRsnCd))
					{
						// スカパー連携ステータス（鍵開け済）
						sptvRnkStat = JKKStrConst.SPTV_RNK_STAT_KAGIAKEZUMI;
						// 鍵閉め年月日更新（NULL）
						keyclsYmd = "";
						// 鍵閉め理由コード更新（NULL）
						keyclsRsnCd = "";
						
					}
					else
					{
						continue;
					}
				}
				// スカパー連携ステータスが鍵閉め済の場合
				else if(JKKStrConst.SPTV_RNK_STAT_KAGISIMEZUMI.equals(sptvRnkStat))
				{
					// スカパー連携ステータス更新（鍵開け依頼前）
					sptvRnkStat = JKKStrConst.SPTV_RNK_STAT_KAGIAKEIRAIMAE;
					// 鍵開け年月日更新（処理日付）
					keyopnYmd = unyoDate;
					// 鍵閉め年月日更新（NULL）
					keyclsYmd = "";
					// 鍵閉め理由コード更新（NULL）
					keyclsRsnCd = "";
				}
				else
				{
					continue;
				}
			}
			// 旧料金コースがＣＳコース 且つ 新料金コースがＣＳコース以外の場合
			else if ((JKKStrConst.CD00134_AC0.equals(oldPcrs) || JKKStrConst.CD00134_AC1.equals(oldPcrs))
					&& !(JKKStrConst.CD00134_AC0.equals(newPcrs) || JKKStrConst.CD00134_AC1.equals(newPcrs)))
			{
				// スカパー連携ステータスが鍵開け仮登録 または 鍵開け依頼前の場合
				if(JKKStrConst.SPTV_RNK_STAT_KAGIAKEKARITOROKU.equals(sptvRnkStat) || JKKStrConst.SPTV_RNK_STAT_KAGIAKEIRAIMAE.equals(sptvRnkStat))
				{
					delFlg = true;
					
					// スカパー連携ステータス更新（削除）
					sptvRnkStat = JKKStrConst.SPTV_RNK_STAT_SAKUJO;
					// ＣＡＳ番号削除年月日更新（処理日付）
					casNoDelYmd = unyoDate;
				}
// ANK-4673-00-00 MOD START
//				// スカパー連携ステータスが鍵開け済の場合
//				else if(JKKStrConst.SPTV_RNK_STAT_KAGIAKEZUMI.equals(sptvRnkStat))
				// スカパー連携ステータスが鍵開け済、もしくは鍵閉め依頼前かつ鍵閉め年月日が"20991231"の場合
				else if(JKKStrConst.SPTV_RNK_STAT_KAGIAKEZUMI.equals(sptvRnkStat)
					|| (JKKStrConst.SPTV_RNK_STAT_KAGISIMEIRAIMAE.equals(sptvRnkStat) && JKKStrConst.END_YMD_DEFAULT.equals(keyclsYmd)))
// ANK-4673-00-00 MOD END
				{
					// スカパー連携ステータス更新（鍵閉め依頼前）
					sptvRnkStat = JKKStrConst.SPTV_RNK_STAT_KAGISIMEIRAIMAE;
// ANK-4673-00-00 ADD START
					// スカパー適用基準年月日区分の値によって、設定する鍵閉め年月日を決定する
					// １：即時の場合
					if(SPTV_APLY_STDARDYMD_DIV_JST.equals(sptvAplyStdardymdDiv))
					{
						// 鍵閉め年月日更新（処理日付）
						keyclsYmd = unyoDate;
					}
					// ２：次月の場合
					else if(SPTV_APLY_STDARDYMD_DIV_NXTM.equals(sptvAplyStdardymdDiv))
					{
// ANK-4673-00-00 ADD END
						// 鍵閉め年月日更新（翌月１日）
						String date = JPCDateUtil.addMonth(unyoDate, 1);
						keyclsYmd = date.substring(0, 6) + "01";
// ANK-4673-00-00 ADD START
					}
					// ４：未定の場合
					else if(SPTV_APLY_STDARDYMD_DIV_MITEI.equals(sptvAplyStdardymdDiv))
					{
						// 鍵閉め年月日更新（"20991231"固定）
						keyclsYmd = JKKStrConst.END_YMD_DEFAULT;
					}
// ANK-4673-00-00 ADD END
					// 鍵閉め理由コード更新（コース変更に伴う鍵閉め）
					keyclsRsnCd = KEYCLS_RSN_CD_CSCH;
				}
				else
				{
					continue;
				}
			}
			else
			{
				continue;
			}
			
			if(!delFlg)
			{
				// CASカード管理変更
				execEKK3541C010(handle, scCall, param, dataMapKey, funcCd, cascdNo, frameNo, sptvRnkStat,svcKeiNo,
						catvCustNo, casNoAddYmd, casNoDelYmd, keyopnYmd, cschKeyopnYmd, keyclsYmd, casNoAplyYmd, keyclsRsnCd, updDtm);
			}
			else
			{
				// CASカード管理物理削除
				execEKK3541E010(handle, scCall, param, dataMapKey, funcCd, cascdNo, updDtm);
			}
			
			// CASカード管理履歴登録
			execEKK3551D010(handle, scCall, param, dataMapKey, funcCd, cascdNo, sysDate, frameNo, sptvRnkStat,svcKeiNo,
					catvCustNo, casNoAddYmd, casNoDelYmd, keyopnYmd, cschKeyopnYmd, keyclsYmd, casNoAplyYmd, keyclsRsnCd);
			
		}
		
		// エラーコード：正常
		ccMsg.put("err_cd", null);
		
	}
	
	
	/**
	 * コース変更取消を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param funcCd 機能コード
	 * @param ccMsg データ情報
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void clCrsChg(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String sysDate,
									String unyoDate,
									String funcCd,
									HashMap<String, Object> ccMsg) throws Throwable
	{
		// 旧料金コースが未設定の場合、処理を終了する。
		if(JKKCommonUtil.isNull((String)ccMsg.get("old_pcrs")))
		{
			// エラーコード：異常
			ccMsg.put("err_cd", "99");
			return;
		}
		// 旧料金コース
		String oldPcrs = (String)ccMsg.get("old_pcrs");
		
		// 新料金コースが未設定の場合、処理を終了する。
		if(JKKCommonUtil.isNull((String)ccMsg.get("new_pcrs")))
		{
			// エラーコード：異常
			ccMsg.put("err_cd", "99");
			return;
		}
		// 新料金コース
		String newPcrs = (String)ccMsg.get("new_pcrs");
		
		
		// CASカード管理一覧照会の結果を取得
		ArrayList cascdKnriList = (ArrayList)ccMsg.get("cascd_knri_list");
		
		
		for(int i = 0; i < cascdKnriList.size(); i++)
		{
			// CASカード管理マップの初期化
			HashMap<String, Object> cascdKnriNoMap = null;
			cascdKnriNoMap = (HashMap<String, Object>)cascdKnriList.get(i);
			
			// スカパー連携ステータス
			String sptvRnkStat = (String)cascdKnriNoMap.get("sptv_rnk_stat");
			
			// スカパー連携ステータス判定
			if(JKKStrConst.SPTV_RNK_STAT_KAGIAKEIRAICHU.equals(sptvRnkStat)
					|| JKKStrConst.SPTV_RNK_STAT_KEIHENCHUKAGIAKEIRAICHU.equals(sptvRnkStat)
					|| JKKStrConst.SPTV_RNK_STAT_KAGIAKEERROR.equals(sptvRnkStat)
					|| JKKStrConst.SPTV_RNK_STAT_KEIHENCHUKAGIAKEERROR.equals(sptvRnkStat))
			{
				// エラーコード：登録状態エラー
				ccMsg.put("err_cd", "04");
				return;
			}
			// スカパー連携ステータスが契約変更中鍵開け依頼前の場合、
			// 旧料金コースがＣＳコース 且つ 新料金コースがＣＳコースの場合以外エラー
			if(JKKStrConst.SPTV_RNK_STAT_KEIHENCHUKAGIAKEIRAIMAE.equals(sptvRnkStat) && 
					(!((JKKStrConst.CD00134_AC0.equals(oldPcrs) || JKKStrConst.CD00134_AC1.equals(oldPcrs))
							&& (JKKStrConst.CD00134_AC0.equals(newPcrs) || JKKStrConst.CD00134_AC1.equals(newPcrs)))))
			{
				// エラーコード：登録状態エラー
				ccMsg.put("err_cd", "04");
				return;
			}
		}
		
		// チェックOKの場合のみ、以降の処理を行う。
		for(int i = 0; i < cascdKnriList.size(); i++)
		{
			// CASカード管理マップの初期化
			HashMap<String, Object> cascdKnriNoMap = null;
			
			// CASカード管理物理削除フラグ
			boolean delFlg = false;
			
			cascdKnriNoMap = (HashMap<String, Object>)cascdKnriList.get(i);
			
			
			// ＣＡＳカード番号
			String cascdNo = (String)cascdKnriNoMap.get("cascd_no");
			// 枠番号
			String frameNo = (String)cascdKnriNoMap.get("frame_no");
			// スカパー連携ステータス
			String sptvRnkStat = (String)cascdKnriNoMap.get("sptv_rnk_stat");
			// サービス契約番号
			String svcKeiNo = (String)cascdKnriNoMap.get("svc_kei_no");
			// ＣＡＴＶ顧客番号
			String catvCustNo = (String)cascdKnriNoMap.get("catv_cust_no");
			// ＣＡＳ番号登録年月日
			String casNoAddYmd = (String)cascdKnriNoMap.get("cas_no_add_ymd");
			// ＣＡＳ番号削除年月日
			String casNoDelYmd = (String)cascdKnriNoMap.get("cas_no_del_ymd");
			// 鍵開け年月日
			String keyopnYmd = (String)cascdKnriNoMap.get("keyopn_ymd");
			// コース変更鍵開け年月日
			String cschKeyopnYmd = (String)cascdKnriNoMap.get("csch_keyopn_ymd");
			// 鍵閉め年月日
			String keyclsYmd = (String)cascdKnriNoMap.get("keycls_ymd");
			// ＣＡＳ番号適用年月日
			String casNoAplyYmd = (String)cascdKnriNoMap.get("cas_no_aply_ymd");
			// 鍵閉め理由コード
			String keyclsRsnCd = (String)cascdKnriNoMap.get("keycls_rsn_cd");
			// 更新年月日時分秒
			String updDtm = (String)cascdKnriNoMap.get("upd_dtm");
			
			
			// 旧料金コースがＣＳコース 且つ 新料金コースがＣＳコースの場合
			if ((JKKStrConst.CD00134_AC0.equals(oldPcrs) || JKKStrConst.CD00134_AC1.equals(oldPcrs))
					&& (JKKStrConst.CD00134_AC0.equals(newPcrs) || JKKStrConst.CD00134_AC1.equals(newPcrs)))
			{
				// スカパー連携ステータスが契約変更中鍵開け依頼前の場合
				if(JKKStrConst.SPTV_RNK_STAT_KEIHENCHUKAGIAKEIRAIMAE.equals(sptvRnkStat))
				{
					// コース変更鍵開け年月日がNULL以外の場合
					if(!(JKKCommonUtil.isNull(cschKeyopnYmd)))
					{
						// スカパー連携ステータス更新（鍵開け済）
						sptvRnkStat = JKKStrConst.SPTV_RNK_STAT_KAGIAKEZUMI;
						// コース変更鍵開け年月日更新（NULL）
						cschKeyopnYmd = "";
					}
					else
					{
						continue;
					}
				}
				// スカパー連携ステータスが鍵開け済の場合
				else if(JKKStrConst.SPTV_RNK_STAT_KAGIAKEZUMI.equals(sptvRnkStat))
				{
					// スカパー連携ステータス更新（契約変更中鍵開け依頼中）
					sptvRnkStat = JKKStrConst.SPTV_RNK_STAT_KEIHENCHUKAGIAKEIRAIMAE;
					// コース変更鍵開け年月日更新（処理日付）
					cschKeyopnYmd = unyoDate;
				}
				else
				{
					continue;
				}
			}
			// 旧料金コースがＣＳコース 且つ 新料金コースがＣＳコース以外の場合		
			else if ((JKKStrConst.CD00134_AC0.equals(oldPcrs) || JKKStrConst.CD00134_AC1.equals(oldPcrs))
					&& !(JKKStrConst.CD00134_AC0.equals(newPcrs) || JKKStrConst.CD00134_AC1.equals(newPcrs)))
			{
				
				// スカパー連携ステータスが鍵開け仮登録 または 鍵開け依頼前の場合
				if(JKKStrConst.SPTV_RNK_STAT_KAGIAKEKARITOROKU.equals(sptvRnkStat) || JKKStrConst.SPTV_RNK_STAT_KAGIAKEIRAIMAE.equals(sptvRnkStat))
				{
					delFlg = true;
					
					// スカパー連携ステータス更新（削除）
					sptvRnkStat = JKKStrConst.SPTV_RNK_STAT_SAKUJO;
					// ＣＡＳ番号削除年月日更新（処理日付）
					casNoDelYmd = unyoDate;
				}
				// スカパー連携ステータスが鍵開け済の場合
				else if(JKKStrConst.SPTV_RNK_STAT_KAGIAKEZUMI.equals(sptvRnkStat))
				{
					// スカパー連携ステータス更新（鍵閉め依頼前）
					sptvRnkStat = JKKStrConst.SPTV_RNK_STAT_KAGISIMEIRAIMAE;
					// 鍵閉め年月日更新（処理日付）
					keyclsYmd = unyoDate;
					// 鍵閉め理由コード更新（コース変更に伴う鍵閉め）
					keyclsRsnCd = KEYCLS_RSN_CD_CSCH;
				}
				else
				{
					continue;
				}
			}
			// 旧料金コースがＣＳコース以外 且つ 新料金コースがＣＳコースの場合
			else if (!(JKKStrConst.CD00134_AC0.equals(oldPcrs) || JKKStrConst.CD00134_AC1.equals(oldPcrs))
					&& (JKKStrConst.CD00134_AC0.equals(newPcrs) || JKKStrConst.CD00134_AC1.equals(newPcrs)))
			{
				
				// スカパー連携ステータスが鍵閉め依頼前の場合
				if(JKKStrConst.SPTV_RNK_STAT_KAGISIMEIRAIMAE.equals(sptvRnkStat))
				{
					// 鍵閉め理由コードが個別鍵閉め以外の場合
					if(!KEYCLS_RSN_CD_KBT.equals(keyclsRsnCd))
					{
						// スカパー連携ステータス（鍵開け済）
						sptvRnkStat = JKKStrConst.SPTV_RNK_STAT_KAGIAKEZUMI;
						// 鍵閉め年月日更新（NULL）
						keyclsYmd = "";
						// 鍵閉め理由コード更新（NULL）
						keyclsRsnCd = "";
						
					}
					else
					{
						continue;
					}
				}
				// スカパー連携ステータスが鍵閉め済の場合
				else if(JKKStrConst.SPTV_RNK_STAT_KAGISIMEZUMI.equals(sptvRnkStat))
				{
					// スカパー連携ステータス更新（鍵開け依頼前）
					sptvRnkStat = JKKStrConst.SPTV_RNK_STAT_KAGIAKEIRAIMAE;
					// 鍵開け年月日更新（処理日付）
					keyopnYmd = unyoDate;
					// 鍵閉め年月日更新（NULL）
					keyclsYmd = "";
					// 鍵閉め理由コード更新（NULL）
					keyclsRsnCd = "";
				}
				else
				{
					continue;
				}
			}
			else
			{
				continue;
			}
			
			
			if(!delFlg)
			{
				// CASカード管理変更
				execEKK3541C010(handle, scCall, param, dataMapKey, funcCd, cascdNo, frameNo, sptvRnkStat,svcKeiNo,
						catvCustNo, casNoAddYmd, casNoDelYmd, keyopnYmd, cschKeyopnYmd, keyclsYmd, casNoAplyYmd, keyclsRsnCd, updDtm);
			}
			else
			{
				// CASカード管理物理削除
				execEKK3541E010(handle, scCall, param, dataMapKey, funcCd, cascdNo, updDtm);
			}
			
			// CASカード管理履歴登録
			execEKK3551D010(handle, scCall, param, dataMapKey, funcCd, cascdNo, sysDate, frameNo, sptvRnkStat,svcKeiNo,
					catvCustNo, casNoAddYmd, casNoDelYmd, keyopnYmd, cschKeyopnYmd, keyclsYmd, casNoAplyYmd, keyclsRsnCd);
			
		}
		
		// エラーコード：正常
		ccMsg.put("err_cd", null);
	}
	
	
	
	/**
	 * 解約・停止・休止を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param funcCd 機能コード
	 * @param ccMsg データ情報
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void dslStpPause(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String sysDate,
									String unyoDate,
									String funcCd,
									String snstMtYmd,
									HashMap<String, Object> ccMsg) throws Throwable
	{
		// 操作区分
		String opeDiv = (String)ccMsg.get("ope_div");
		
		// 操作区分が１（解約）または２（休止）または３（停止） 以外の場合、処理を終了する。
		if(!(OPE_DIV_KAIYAKU.equals(opeDiv) || OPE_DIV_KYUSI.equals(opeDiv) || OPE_DIV_TEISI.equals(opeDiv)))
		{
			// エラーコード：異常
			ccMsg.put("err_cd", "99");
			return;
		}
		
		// CASカード管理一覧照会の結果を取得
		ArrayList cascdKnriList = (ArrayList)ccMsg.get("cascd_knri_list");
		
		for(int i = 0; i < cascdKnriList.size(); i++)
		{
			// CASカード管理マップの初期化
			HashMap<String, Object> cascdKnriNoMap = null;
			
			// CASカード管理物理削除フラグ
			boolean delFlg = false;
			
			cascdKnriNoMap = (HashMap<String, Object>)cascdKnriList.get(i);
			
			
			// ＣＡＳカード番号
			String cascdNo = (String)cascdKnriNoMap.get("cascd_no");
			// 枠番号
			String frameNo = (String)cascdKnriNoMap.get("frame_no");
			// スカパー連携ステータス
			String sptvRnkStat = (String)cascdKnriNoMap.get("sptv_rnk_stat");
			// サービス契約番号
			String svcKeiNo = (String)cascdKnriNoMap.get("svc_kei_no");
			// ＣＡＴＶ顧客番号
			String catvCustNo = (String)cascdKnriNoMap.get("catv_cust_no");
			// ＣＡＳ番号登録年月日
			String casNoAddYmd = (String)cascdKnriNoMap.get("cas_no_add_ymd");
			// ＣＡＳ番号削除年月日
			String casNoDelYmd = (String)cascdKnriNoMap.get("cas_no_del_ymd");
			// 鍵開け年月日
			String keyopnYmd = (String)cascdKnriNoMap.get("keyopn_ymd");
			// コース変更鍵開け年月日
			String cschKeyopnYmd = (String)cascdKnriNoMap.get("csch_keyopn_ymd");
			// 鍵閉め年月日
			String keyclsYmd = (String)cascdKnriNoMap.get("keycls_ymd");
			// ＣＡＳ番号適用年月日
			String casNoAplyYmd = (String)cascdKnriNoMap.get("cas_no_aply_ymd");
			// 鍵閉め理由コード
			String keyclsRsnCd = (String)cascdKnriNoMap.get("keycls_rsn_cd");
			// 更新年月日時分秒
			String updDtm = (String)cascdKnriNoMap.get("upd_dtm");
			
			
			// スカパー連携ステータスが鍵開け仮登録 または 鍵開け依頼前 または 鍵開けエラーの場合
			if(JKKStrConst.SPTV_RNK_STAT_KAGIAKEKARITOROKU.equals(sptvRnkStat) || JKKStrConst.SPTV_RNK_STAT_KAGIAKEIRAIMAE.equals(sptvRnkStat)
					|| JKKStrConst.SPTV_RNK_STAT_KAGIAKEERROR.equals(sptvRnkStat))
			{
				delFlg = true;
				
				// スカパー連携ステータス更新（削除）
				sptvRnkStat = JKKStrConst.SPTV_RNK_STAT_SAKUJO;
				// ＣＡＳ番号削除年月日更新（処理日付）
				casNoDelYmd = unyoDate;
			}
			// スカパー連携ステータスが契約変更中鍵開け依頼前 または 契約変更中鍵開けエラー または 鍵開け済の場合
			else if(JKKStrConst.SPTV_RNK_STAT_KEIHENCHUKAGIAKEIRAIMAE.equals(sptvRnkStat) || JKKStrConst.SPTV_RNK_STAT_KEIHENCHUKAGIAKEERROR.equals(sptvRnkStat)
					|| JKKStrConst.SPTV_RNK_STAT_KAGIAKEZUMI.equals(sptvRnkStat))
			{
				// スカパー連携ステータス更新（鍵閉め依頼前）
				sptvRnkStat = JKKStrConst.SPTV_RNK_STAT_KAGISIMEIRAIMAE;
				// コース変更鍵開け年月日更新（NULL）
				cschKeyopnYmd = "";
				
				// 操作区分が解約の場合
				if(OPE_DIV_KAIYAKU.equals(opeDiv))
				{
					// 算出元日付の翌月１日を設定
					String date = JPCDateUtil.addMonth(snstMtYmd, 1);
					keyclsYmd = date.substring(0, 6) + "01";
				}
				// 操作区分が休止の場合
				else if(OPE_DIV_KYUSI.equals(opeDiv))
				{
					// 算出元日付＋１日を設定
					keyclsYmd = JPCDateUtil.addDay(snstMtYmd, 1);
				}
				// 操作区分が停止の場合
				else if(OPE_DIV_TEISI.equals(opeDiv))
				{
					// 処理日付を設定
					keyclsYmd = unyoDate;
				}
				
				// 鍵閉め理由コード更新（サービスに伴う鍵閉め）
				keyclsRsnCd = KEYCLS_RSN_CD_SVC;
			}
			else
			{
				continue;
			}
			
			
			if(!delFlg)
			{
				// CASカード管理変更
				execEKK3541C010(handle, scCall, param, dataMapKey, funcCd, cascdNo, frameNo, sptvRnkStat,svcKeiNo,
						catvCustNo, casNoAddYmd, casNoDelYmd, keyopnYmd, cschKeyopnYmd, keyclsYmd, casNoAplyYmd, keyclsRsnCd, updDtm);
			}
			else
			{
				// CASカード管理物理削除
				execEKK3541E010(handle, scCall, param, dataMapKey, funcCd, cascdNo, updDtm);
			}
			
			// CASカード管理履歴登録
			execEKK3551D010(handle, scCall, param, dataMapKey, funcCd, cascdNo, sysDate, frameNo, sptvRnkStat,svcKeiNo,
					catvCustNo, casNoAddYmd, casNoDelYmd, keyopnYmd, cschKeyopnYmd, keyclsYmd, casNoAplyYmd, keyclsRsnCd);
			
		}
		
		// エラーコード：正常
		ccMsg.put("err_cd", null);
	}
	
	
	
	/**
	 * 回復・休止解除・停止解除を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param funcCd 機能コード
	 * @param ccMsg データ情報
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void kaihkPauseStpRls(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String sysDate,
									String unyoDate,
									String funcCd,
									HashMap<String, Object> ccMsg) throws Throwable
	{
		// CASカード管理一覧照会の結果を取得
		ArrayList cascdKnriList = (ArrayList)ccMsg.get("cascd_knri_list");
		
		for(int i = 0; i < cascdKnriList.size(); i++)
		{
			// CASカード管理マップの初期化
			HashMap<String, Object> cascdKnriNoMap = null;
			
			cascdKnriNoMap = (HashMap<String, Object>)cascdKnriList.get(i);
			
			
			// ＣＡＳカード番号
			String cascdNo = (String)cascdKnriNoMap.get("cascd_no");
			// 枠番号
			String frameNo = (String)cascdKnriNoMap.get("frame_no");
			// スカパー連携ステータス
			String sptvRnkStat = (String)cascdKnriNoMap.get("sptv_rnk_stat");
			// サービス契約番号
			String svcKeiNo = (String)cascdKnriNoMap.get("svc_kei_no");
			// ＣＡＴＶ顧客番号
			String catvCustNo = (String)cascdKnriNoMap.get("catv_cust_no");
			// ＣＡＳ番号登録年月日
			String casNoAddYmd = (String)cascdKnriNoMap.get("cas_no_add_ymd");
			// ＣＡＳ番号削除年月日
			String casNoDelYmd = (String)cascdKnriNoMap.get("cas_no_del_ymd");
			// 鍵開け年月日
			String keyopnYmd = (String)cascdKnriNoMap.get("keyopn_ymd");
			// コース変更鍵開け年月日
			String cschKeyopnYmd = (String)cascdKnriNoMap.get("csch_keyopn_ymd");
			// 鍵閉め年月日
			String keyclsYmd = (String)cascdKnriNoMap.get("keycls_ymd");
			// ＣＡＳ番号適用年月日
			String casNoAplyYmd = (String)cascdKnriNoMap.get("cas_no_aply_ymd");
			// 鍵閉め理由コード
			String keyclsRsnCd = (String)cascdKnriNoMap.get("keycls_rsn_cd");
			// 更新年月日時分秒
			String updDtm = (String)cascdKnriNoMap.get("upd_dtm");
			
			// スカパー連携ステータスが鍵閉め依頼前の場合
			if(JKKStrConst.SPTV_RNK_STAT_KAGISIMEIRAIMAE.equals(sptvRnkStat))
			{
				// スカパー連携ステータス（鍵開け済）
				sptvRnkStat = JKKStrConst.SPTV_RNK_STAT_KAGIAKEZUMI;
				// 鍵閉め年月日更新（NULL）
				keyclsYmd = "";
				// 鍵閉め理由コード更新（NULL）
				keyclsRsnCd = "";
				
				
				// CASカード管理変更
				execEKK3541C010(handle, scCall, param, dataMapKey, funcCd, cascdNo, frameNo, sptvRnkStat,svcKeiNo,
						catvCustNo, casNoAddYmd, casNoDelYmd, keyopnYmd, cschKeyopnYmd, keyclsYmd, casNoAplyYmd, keyclsRsnCd, updDtm);
				
				// CASカード管理履歴登録
				execEKK3551D010(handle, scCall, param, dataMapKey, funcCd, cascdNo, sysDate, frameNo, sptvRnkStat,svcKeiNo,
						catvCustNo, casNoAddYmd, casNoDelYmd, keyopnYmd, cschKeyopnYmd, keyclsYmd, casNoAplyYmd, keyclsRsnCd);
				
			}
			// スカパー連携ステータスが鍵閉め済の場合
			else if(JKKStrConst.SPTV_RNK_STAT_KAGISIMEZUMI.equals(sptvRnkStat))
			{
				// スカパー連携ステータス更新（鍵開け依頼前）
				sptvRnkStat = JKKStrConst.SPTV_RNK_STAT_KAGIAKEIRAIMAE;
				// 鍵開け年月日更新（処理日付）
				keyopnYmd = unyoDate;
				// 鍵閉め年月日更新（NULL）
				keyclsYmd = "";
				// 鍵閉め理由コード更新（NULL）
				keyclsRsnCd = "";
				
				
				// CASカード管理変更
				execEKK3541C010(handle, scCall, param, dataMapKey, funcCd, cascdNo, frameNo, sptvRnkStat,svcKeiNo,
						catvCustNo, casNoAddYmd, casNoDelYmd, keyopnYmd, cschKeyopnYmd, keyclsYmd, casNoAplyYmd, keyclsRsnCd, updDtm);
				
				// CASカード管理履歴登録
				execEKK3551D010(handle, scCall, param, dataMapKey, funcCd, cascdNo, sysDate, frameNo, sptvRnkStat,svcKeiNo,
						catvCustNo, casNoAddYmd, casNoDelYmd, keyopnYmd, cschKeyopnYmd, keyclsYmd, casNoAplyYmd, keyclsRsnCd);
				
				
				// CAS番号対象オプションサービス契約一覧照会
				CAANMsg[] ekk3561b010MsgList = execEKK3561B010(handle, scCall, param, dataMapKey, cascdNo);
				
				if (ekk3561b010MsgList != null && ekk3561b010MsgList.length > 0)
				{
					for (CAANMsg ekk3561b010Msg : ekk3561b010MsgList)
					{
						
						// オプションサービス契約番号
						String opSvcKeiNo = ekk3561b010Msg.getString(EKK3561B010CBSMsg1List.OP_SVC_KEI_NO);
						// ＣＡＳカード番号
						String opCascdNo = ekk3561b010Msg.getString(EKK3561B010CBSMsg1List.CASCD_NO);
						// スカパー連携ステータス
						String opSptvRnkStat = ekk3561b010Msg.getString(EKK3561B010CBSMsg1List.SPTV_RNK_STAT);
						// 鍵開け年月日
						String opKeyopnYmd = ekk3561b010Msg.getString(EKK3561B010CBSMsg1List.KEYOPN_YMD);
						// 鍵閉め年月日
						String opKeyclsYmd = ekk3561b010Msg.getString(EKK3561B010CBSMsg1List.KEYCLS_YMD);
						// ＣＡＳ番号対象適用年月日
						String opCasNoTgAplyYmd = ekk3561b010Msg.getString(EKK3561B010CBSMsg1List.CAS_NO_TG_APLY_YMD);
						// 鍵閉め理由コード
						String opKeyclsRsnCd = ekk3561b010Msg.getString(EKK3561B010CBSMsg1List.KEYCLS_RSN_CD);
						// 更新年月日時分秒
						String opUpdDtm = ekk3561b010Msg.getString(EKK3561B010CBSMsg1List.UPD_DTM);
						
						
						// スカパー連携ステータスが鍵閉め済の場合
						if(JKKStrConst.SPTV_RNK_STAT_KAGISIMEZUMI.equals(opSptvRnkStat))
						{
							// スカパー連携ステータス更新（鍵開け依頼前）
							opSptvRnkStat = JKKStrConst.SPTV_RNK_STAT_KAGIAKEIRAIMAE;
							// CASカード管理.鍵開け年月日 ＜＝ 処理日付 の場合
							if(JKKCommonUtil.isNull(opKeyopnYmd) || opKeyopnYmd.compareTo(unyoDate) <= 0)
							{
								// 鍵開け年月日更新（処理日付）
								opKeyopnYmd = unyoDate;
							}
							// 鍵閉め年月日更新（NULL）
							opKeyclsYmd = "";
							// 鍵閉め理由コード更新（NULL）
							opKeyclsRsnCd = "";
							
							
							// CAS番号対象オプションサービス契約変更
							execEKK3561C010(handle, scCall, param, dataMapKey, funcCd, opSvcKeiNo, opCascdNo,
									opSptvRnkStat,opKeyopnYmd, opKeyclsYmd, opCasNoTgAplyYmd, opKeyclsRsnCd, opUpdDtm);
							
							// CAS番号対象オプションサービス契約履歴登録
							execEKK3571D010(handle, scCall, param, dataMapKey, funcCd, opSvcKeiNo, sysDate, opCascdNo,
									opSptvRnkStat,opKeyopnYmd, opKeyclsYmd, opCasNoTgAplyYmd, opKeyclsRsnCd);
						
						}
					}
				}
			}
		}
		
		// エラーコード：正常
		ccMsg.put("err_cd", null);
	}
	
	/**
	 * サービス契約一意照会を行う。
	 * @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;
	}
	
	/**
	 * CASカード管理一覧照会を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param svcKeiNo サービス契約番号
	 * @return CAANMsg[]
	 * @throws Throwable
	 */
	private CAANMsg[] execEKK3541B010(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String svcKeiNo) throws Throwable
	{
		
		Object[][] ekk3541b010In =
		{
				{EKK3541B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3541B010},
				{EKK3541B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
				{EKK3541B010CBSMsg.KEY_SVC_KEI_NO, svcKeiNo},
		};
		
		CAANMsg ekk3541b010Msg = callSC(handle, scCall, param, dataMapKey, ekk3541b010In);
		
		CAANMsg[] ekk3541b010MsgList = ekk3541b010Msg.getCAANMsgList(EKK3541B010CBSMsg.EKK3541B010CBSMSG1LIST);
		
		return ekk3541b010MsgList;
	}
	
	
	/**
	 * CASカード管理変更を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey データマップキー
	 * @param funcCd 機能コード
	 * @param cascdNo ＣＡＳカード番号
	 * @param frameNo 枠番号
	 * @param sptvRnkStat スカパー連携ステータス
	 * @param svcKeiNo サービス契約番号
	 * @param catvCustNo ＣＡＴＶ顧客番号
	 * @param casNoAddYmd ＣＡＳ番号登録年月日
	 * @param casNoDelYmd ＣＡＳ番号削除年月日
	 * @param keyopnYmd 鍵開け年月日
	 * @param cschKeyopnYmd コース変更鍵開け年月日
	 * @param keyclsYmd 鍵閉め年月日
	 * @param casNoAplyYmd ＣＡＳ番号適用年月日
	 * @param keyclsRsnCd 鍵閉め理由コード
	 * @param updDtmBf 更新年月日時分秒(更新前)
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private void execEKK3541C010(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String funcCd,
									String cascdNo,
									String frameNo,
									String sptvRnkStat,
									String svcKeiNo,
									String catvCustNo,
									String casNoAddYmd,
									String casNoDelYmd,
									String keyopnYmd,
									String cschKeyopnYmd,
									String keyclsYmd,
									String casNoAplyYmd,
									String keyclsRsnCd,
									String updDtm) throws Throwable
	{
		Object[][] ekk3541c010In =
		{
				{EKK3541C010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3541C010},
				{EKK3541C010CBSMsg.FUNC_CODE, funcCd},
				{EKK3541C010CBSMsg.CASCD_NO, cascdNo},
				{EKK3541C010CBSMsg.FRAME_NO, frameNo},
				{EKK3541C010CBSMsg.SPTV_RNK_STAT, sptvRnkStat},
				{EKK3541C010CBSMsg.SVC_KEI_NO, svcKeiNo},
				{EKK3541C010CBSMsg.CATV_CUST_NO, catvCustNo},
				{EKK3541C010CBSMsg.CAS_NO_ADD_YMD, casNoAddYmd},
				{EKK3541C010CBSMsg.CAS_NO_DEL_YMD, casNoDelYmd},
				{EKK3541C010CBSMsg.KEYOPN_YMD, keyopnYmd},
				{EKK3541C010CBSMsg.CSCH_KEYOPN_YMD, cschKeyopnYmd},
				{EKK3541C010CBSMsg.KEYCLS_YMD, keyclsYmd},
				{EKK3541C010CBSMsg.CAS_NO_APLY_YMD, casNoAplyYmd},
				{EKK3541C010CBSMsg.KEYCLS_RSN_CD, keyclsRsnCd},
				{EKK3541C010CBSMsg.UPD_DTM_BF, updDtm},
		};
		
		callSC(handle, scCall, param, dataMapKey, ekk3541c010In);
	}
	
	
	/**
	 * CASカード管理履歴登録を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey データマップキー
	 * @param funcCd 機能コード
	 * @param cascdNo ＣＡＳカード番号
	 * @param sysDate 履歴登録年月日時分秒
	 * @param frameNo 枠番号
	 * @param sptvRnkStat スカパー連携ステータス
	 * @param svcKeiNo サービス契約番号
	 * @param catvCustNo ＣＡＴＶ顧客番号
	 * @param casNoAddYmd ＣＡＳ番号登録年月日
	 * @param casNoDelYmd ＣＡＳ番号削除年月日
	 * @param keyopnYmd 鍵開け年月日
	 * @param cschKeyopnYmd コース変更鍵開け年月日
	 * @param keyclsYmd 鍵閉め年月日
	 * @param casNoAplyYmd ＣＡＳ番号適用年月日
	 * @param keyclsRsnCd 鍵閉め理由コード
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private void execEKK3551D010(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String funcCd,
									String cascdNo,
									String sysDate,
									String frameNo,
									String sptvRnkStat,
									String svcKeiNo,
									String catvCustNo,
									String casNoAddYmd,
									String casNoDelYmd,
									String keyopnYmd,
									String cschKeyopnYmd,
									String keyclsYmd,
									String casNoAplyYmd,
									String keyclsRsnCd) throws Throwable
	{
		Object[][] ekk3551d010In =
		{
				{EKK3551D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3551D010},
				{EKK3551D010CBSMsg.FUNC_CODE, funcCd},
				{EKK3551D010CBSMsg.CASCD_NO, cascdNo},
				{EKK3551D010CBSMsg.RK_ADD_DTM, sysDate},
				{EKK3551D010CBSMsg.FRAME_NO, frameNo},
				{EKK3551D010CBSMsg.SPTV_RNK_STAT, sptvRnkStat},
				{EKK3551D010CBSMsg.SVC_KEI_NO, svcKeiNo},
				{EKK3551D010CBSMsg.CATV_CUST_NO, catvCustNo},
				{EKK3551D010CBSMsg.CAS_NO_ADD_YMD, casNoAddYmd},
				{EKK3551D010CBSMsg.CAS_NO_DEL_YMD, casNoDelYmd},
				{EKK3551D010CBSMsg.KEYOPN_YMD, keyopnYmd},
				{EKK3551D010CBSMsg.CSCH_KEYOPN_YMD, cschKeyopnYmd},
				{EKK3551D010CBSMsg.KEYCLS_YMD, keyclsYmd},
				{EKK3551D010CBSMsg.CAS_NO_APLY_YMD, casNoAplyYmd},
				{EKK3551D010CBSMsg.KEYCLS_RSN_CD, keyclsRsnCd},
		};
		
		callSC(handle, scCall, param, dataMapKey, ekk3551d010In);
	}
	
	
	/**
	 * CASカード管理物理削除を行う。
	 * 
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey データマップキー
	 * @param cascdNo ＣＡＳカード番号
	 * @param updDtm 更新年月日時分秒
	 * @throws Exception
	 */
	private void execEKK3541E010(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String dataMapKey,
			String funcCd,
			String cascdNo,
			String updDtm) throws Exception
	{		
		Object[][] ekk3541e010In =
		{
				{EKK3541E010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3541E010},
				{EKK3541E010CBSMsg.FUNC_CODE, funcCd},
				{EKK3541E010CBSMsg.CASCD_NO, cascdNo},
				{EKK3541E010CBSMsg.UPD_DTM_BF, updDtm},
		};
		
		callSC(handle, scCall, param, dataMapKey, ekk3541e010In);
	}
	
	
	/**
	 * CAS番号対象オプションサービス契約一覧照会を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * 	 * @param funcCd 機能コード
	 * @param cascdNo ＣＡＳカード番号
	 * @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 cascdNo ＣＡＳカード番号
	 * @param sptvRnkStat スカパー連携ステータス
	 * @param keyopnYmd 鍵開け年月日
	 * @param keyclsYmd 鍵閉め年月日
	 * @param casNoTgAplyYmd ＣＡＳ番号対象適用年月日
	 * @param keyclsRsnCd 鍵閉め理由コード
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private void execEKK3561C010(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String funcCd,
									String opSvcKeiNo,
									String cascdNo,
									String sptvRnkStat,
									String keyopnYmd,
									String keyclsYmd,
									String casNoTgAplyYmd,
									String keyclsRsnCd,
									String updDtm) throws Throwable
	{
		Object[][] ekk3561c010In =
		{
				{EKK3561C010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3561C010},
				{EKK3561C010CBSMsg.FUNC_CODE, funcCd},
				{EKK3561C010CBSMsg.OP_SVC_KEI_NO, opSvcKeiNo},
				{EKK3561C010CBSMsg.CASCD_NO, cascdNo},
				{EKK3561C010CBSMsg.SPTV_RNK_STAT, sptvRnkStat},
				{EKK3561C010CBSMsg.KEYOPN_YMD, keyopnYmd},
				{EKK3561C010CBSMsg.KEYCLS_YMD, keyclsYmd},
				{EKK3561C010CBSMsg.CAS_NO_TG_APLY_YMD, casNoTgAplyYmd},
				{EKK3561C010CBSMsg.KEYCLS_RSN_CD, keyclsRsnCd},
				{EKK3561C010CBSMsg.UPD_DTM_BF, updDtm},
		};
		
		callSC(handle, scCall, param, dataMapKey, ekk3561c010In);
	}
	
	
	/**
	 * CAS番号対象オプションサービス契約履歴登録を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey データマップキー
	 * @param funcCd 機能コード
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param sysDate 履歴登録年月日時分秒
	 * @param cascdNo ＣＡＳカード番号
	 * @param sptvRnkStat スカパー連携ステータス
	 * @param keyopnYmd 鍵開け年月日
	 * @param keyclsYmd 鍵閉め年月日
	 * @param casNoTgAplyYmd ＣＡＳ番号対象適用年月日
	 * @param keyclsRsnCd 鍵閉め理由コード
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private void execEKK3571D010(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String funcCd,
									String opSvcKeiNo,
									String sysDate,
									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},
				{EKK3551D010CBSMsg.RK_ADD_DTM, sysDate},
				{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},
		};
		
		callSC(handle, scCall, param, dataMapKey, ekk3571d010In);
	}
	
	
	/**
	 * editInMsg
	 * @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 ("".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;
	}
	
	/**
	 * editErrorInfoCom
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param dataMapKey
	 * @param mappingData
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int returnCode,
														String dataMapKey,
														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(dataMapKey);
		
		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
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							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, dataMapKey, 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;
	}
}