/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom, 2011
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKOldKkCnlDelKhkCC
*   ソースファイル名：JKKOldKkCnlDelKhkCC.java
*   作成者          ：富士通
*   日付            ：2013年12月04日
*＜機能概要＞
*   旧機器キャンセル・解約・回復用部品クラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v5.00.00    2013/12/04   FJ）阮      新規作成
*   v69.00.00   2024/02/05   FJ)舘山     【#83756】ネット追加〜解約でキャンセル済の多機能ルータが照査済となる
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
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.IRequestParameterReadOnly;
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.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B025CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B025CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341C330CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C340CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C350CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C380CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C410CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C420CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C430CBSMsg;

/**
 * 旧機器キャンセル・解約・回復用部品クラス
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JKKOldKkCnlDelKhkCC extends AbstractCommonComponent {
	
	/** データマップキー（対象データリスト） */
	public static final String KEY_TRGT_DATA_LIST = "trgt_data_list";
	
	/** 一意照会、一覧照会のサービスインタフェース呼び出しで使用するマッパー群 */
	private JKKSvkeiShosaClShokaiMapperCC shokaiMapper = null;
	
	/** 機器提供サービス契約一意照会 **/
	private static final String TEMPLATE_ID_EKK0341A010 = "EKK0341A010";
	
	/** サービス契約一意照会 **/
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	
	/** 機器提供サービス契約キャンセル **/
	private static final String TEMPLATE_ID_EKK0341C330 = "EKK0341C330";
	
	/** 機器提供サービス契約解約確定 **/
	private static final String TEMPLATE_ID_EKK0341C350 = "EKK0341C350";
	
	/** 機器提供サービス契約解約 **/
	private static final String TEMPLATE_ID_EKK0341C340 = "EKK0341C340";
	
	/** 機器提供サービス契約回復 **/
	private static final String TEMPLATE_ID_EKK0341C380 = "EKK0341C380";
	
	/** 照査前機器提供サービス契約キャンセル取消 **/
	private static final String TEMPLATE_ID_EKK0341C410 = "EKK0341C410";
	
	/** 照査後機器提供サービス契約キャンセル取消 **/
	private static final String TEMPLATE_ID_EKK0341C420 = "EKK0341C420";
	
	/** 機器提供サービス契約解約取消 **/
	private static final String TEMPLATE_ID_EKK0341C430 = "EKK0341C430";
	
	/** INPUT.サービス契約番号 */
	public static final String SVC_KEI_NO = "svc_kei_no";
	
	/** INPUT.機器提供サービス契約番号 */
	public static final String KKTK_SVC_KEI_NO = "kktk_svc_kei_no";
	
	/** INPUT.申込明細番号 */
	public static final String MSKM_SHO_DTL_NO = "mskm_sho_dtl_no";
	
	/** INPUT.キャンセル解約申込明細番号 */
	public static final String CANDSL_MSKM_DTL_NO = "candsl_mskm_dtl_no";
	
	/** データマップキー(更新年月日時分秒) */
	public static final String KEY_UPD_DTM = "upd_dtm";
	
	/** データマップキー(機器提供サービス契約) */
	public static final String KEY_KKTK_SVC_KEI_NO = "key_kktk_svc_kei_no";
	
	/** データマップキー(機器提供サービス契約ステータス) */
	public static final String KEY_KKTK_SVC_KEI_STAT = "key_kktk_svc_kei_stat";
	
	/** INPUT.異動区分 */
	public static final String IDO_DIV = "ido_div";
	
	/** サービスコード「０１：ネット」 */
	public static final String SVC_CD_01 = "01";
	
	/** サービスコード「０２：電話」 */
	public static final String SVC_CD_02 = "02";
	
	/** 運用日を取得する関数 */
	private String opeDate = "";
	
	/** ユーザ任意文字列 */
	private String fixedTextGlobal = null;

	/**
	 * 旧機器をキャンセル・解約を実施する処理を受理
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @throws Throwable
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	public IRequestParameterReadWrite oldKkCnlDelCall(SessionHandle handle, IRequestParameterReadWrite param,HashMap<String, Object> requestParam, String fixedText) throws Throwable
	{
		//  旧機器に対してキャンセル・解約処理を実施する
		return oldKkCnlDelKhkMain(handle, param, requestParam, fixedText, "0");
	}
	
	/**
	 * 旧機器を回復を実施する処理を受理
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @throws Throwable
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	public IRequestParameterReadWrite oldKkKhkCall(SessionHandle handle, IRequestParameterReadWrite param,HashMap<String, Object> requestParam, String fixedText) throws Throwable
	{
		//  旧機器に対して回復処理を実施する
		return oldKkCnlDelKhkMain(handle, param, requestParam, fixedText, "1");
	}

	/**
	 * 旧機器に対してキャンセル・解約・回復を行う機能のメイン処理
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @throws Throwable
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	private IRequestParameterReadWrite oldKkCnlDelKhkMain(SessionHandle handle, IRequestParameterReadWrite param,HashMap<String, Object> requestParam, String fixedText,String updMikstCd) throws Throwable
	{
		// S-IF結果格納用
		HashMap<String, Object> resultHash =  new HashMap<String, Object>();
		
		this.fixedTextGlobal = fixedText;
		
		HashMap trgtData = (HashMap)param.getData(this.fixedTextGlobal);
		ArrayList<HashMap<String, Object>> trgtDataList = (ArrayList<HashMap<String, Object>>)trgtData.get(KEY_TRGT_DATA_LIST);
		
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// INPUT.対象サービス契約番号
		String prm_svc_kei_no = (String)requestParam.get(SVC_KEI_NO);
		
		// INPUT.対象機器提供サービス契約番号を取得
		String prm_kktk_svc_kei_no = (String)requestParam.get(KKTK_SVC_KEI_NO);
		
		// INPUT.キャンセル・解約・回復の申込明細番号を取得
		String prm_mskm_sho_dtl_no = (String)requestParam.get(MSKM_SHO_DTL_NO);
		
		// INPUT.解約キャンセル時申込明細番号を取得
		String prm_canDsl_mskm_dtl_no = (String)requestParam.get(CANDSL_MSKM_DTL_NO);
		
		// INPUT.異動区分を取得
		String prm_ido_div = (String)requestParam.get(IDO_DIV);
		
		String last_upd_dtm = "";
		
		String key_kktk_svc_kei = "";
		
		String key_kktk_svc_kei_stat = "";
		
		// ステータスコード
		int statusCode = 0;
		
		// 運用日の取得
		opeDate = JCCBPCommon.getOpeDate(null);
		
		shokaiMapper = new JKKSvkeiShosaClShokaiMapperCC();
		
		List<CAANMsg> tgRirekiDataList = new ArrayList<CAANMsg>();
		
		//****************************************
		// ■サービス契約一意照会
		//****************************************
		statusCode = callEKK0081A010SC(param, handle, requestParam, resultHash, prm_svc_kei_no);
		if(statusCode != 0)
		{
			return param;
		}
		// サービス契約一意照会結果を取得
		HashMap<String, Object> eKK0081A010Hash = (HashMap<String, Object>)resultHash.get(TEMPLATE_ID_EKK0081A010);
		
		// サービスコードを取得
		String svc_cd  = (String)eKK0081A010Hash.get(EKK0081A010CBSMsg1List.SVC_CD);
		
		HashMap<String, Object> eKK0341A010Hash = new HashMap<String, Object>();
		
		if (prm_kktk_svc_kei_no != null && !"".equals(prm_kktk_svc_kei_no)) {
			// INPUT.対象機器提供サービス契約番号がNULLでない場合、旧VA機器であることが把握済であるため、
			// 機器提供サービス契約一意照会を実施
			statusCode = callEKK0341A010SC(param, handle, requestParam, resultHash, prm_kktk_svc_kei_no);
			// 機器提供サービス契約一意照会の実施結果を取得
			if(statusCode != 0)
			{
				return param;
			}
			eKK0341A010Hash = (HashMap<String, Object>)resultHash.get(TEMPLATE_ID_EKK0341A010);
		} else if (!"00004".endsWith(prm_ido_div)) {
			// INPUT.対象機器提供サービス契約番号がNULL、かつ異動区分が回復の場合
			
			// 機器提供サービス契約履歴一覧照会を実施し、対象機器の履歴一覧を取得
			List<CAANMsg> eKK0341B025CaanMsgList = shokaiMapper.editInMsgEKK0341B025(param,prm_svc_kei_no);
			HashMap<String, Object> inMsgEKK0341B025Map = editInMsgCmn(param, eKK0341B025CaanMsgList.get(0));
			Map<?, ?> rsltEKK0341B025 = scCall.run(inMsgEKK0341B025Map, handle);
			CAANMsg[] outMsgEKK0341B025List = getWorkData(EKK0341B025CBSMsg.EKK0341B025CBSMSG1LIST, rsltEKK0341B025);
			
			// 履歴一覧の取得結果を渡し
			// 対象サービス契約の回復後履歴特定処理をコール、回復後ステータスの対象レコードを取得
			tgRirekiDataList = rirekiTokutei(outMsgEKK0341B025List,prm_canDsl_mskm_dtl_no);
		} else {
			
			String kktk_svc_cd = "";
			
			// サービスコードが「01」ならネットサービス、「02」なら電話サービス
			if (SVC_CD_01.equals(svc_cd)) {
				kktk_svc_cd = "C014";
			} else {
				//処理区分が１の場合機器の回復処理を実施
				kktk_svc_cd = "C004";
			}
			List<CAANMsg> eKK0341B002CaanMsgList = shokaiMapper.editInMsgEKK0341B002(param, prm_svc_kei_no, kktk_svc_cd);
			HashMap<String, Object> inMsgEKK0341B002Map = editInMsgCmn(param, eKK0341B002CaanMsgList.get(0));
			Map<?, ?> rsltEKK0341B02 = scCall.run(inMsgEKK0341B002Map, handle);
			CAANMsg[] outMsgEKK0341B002List = getWorkData(EKK0341B002CBSMsg.EKK0341B002CBSMSG1LIST, rsltEKK0341B02);
			
			if (outMsgEKK0341B002List != null && !"".equals(outMsgEKK0341B002List) && outMsgEKK0341B002List.length > 0) {
				// 機器提供サービス契約一意照会を実施
				statusCode = callEKK0341A010SC(param, handle, requestParam, resultHash, outMsgEKK0341B002List[0].getString(EKK0341B002CBSMsg1List.KKTK_SVC_KEI_NO));
				// 機器提供サービス契約一意照会の実施結果を取得
				if(statusCode != 0)
				{
					return param;
				}
				eKK0341A010Hash = (HashMap<String, Object>)resultHash.get(TEMPLATE_ID_EKK0341A010);
			}
		}
		
		// サービスコードが「01」ならネットサービス、「02」なら電話サービス
		if (SVC_CD_01.equals(svc_cd)) {
			
			//処理区分が０の場合機器のキャンセ・解約を実施
			if ("0".equals(updMikstCd)){
				// 機器提供サービス契約ステータスを取得
				String kktk_svc_kei_stat = (String)eKK0341A010Hash.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_STAT);
				// 所持のルータ機器のステータスが「０１０：受付済」、「０２０：照査済」の場合、機器のキャンセルを実施
				if ("010".equals(kktk_svc_kei_stat)||"020".equals(kktk_svc_kei_stat)) {
					// 機器のキャンセルを実施
					CAANMsg eKK0341C330Hash = doKktkCancel(handle, param, fixedText, scCall, eKK0341A010Hash,prm_mskm_sho_dtl_no,prm_ido_div);
					last_upd_dtm = getNullToStr(eKK0341C330Hash.getString(EKK0341C330CBSMsg.UPD_DTM));
					key_kktk_svc_kei = getNullToStr(eKK0341C330Hash.getString(EKK0341C330CBSMsg.KKTK_SVC_KEI_NO));
					key_kktk_svc_kei_stat = getNullToStr(eKK0341C330Hash.getString(EKK0341C330CBSMsg.KKTK_SVC_KEI_STAT));
				}
				// 所持のルータ機器のステータスが「０３０：締結済」、「１００：サービス提供中」の場合、機器の解約を実施
				else if ("030".equals(kktk_svc_kei_stat)||"100".equals(kktk_svc_kei_stat)){
					// 機器提供サービス契約解約を実施
					CAANMsg eKK0341C340Hash = doOldKkDel(handle, param, fixedText, scCall, eKK0341A010Hash,prm_mskm_sho_dtl_no,prm_ido_div);
					// 機器提供サービス契約解約の更新年月日を取得
					String updDtm = getNullToStr(eKK0341C340Hash.getString(EKK0341C340CBSMsg.UPD_DTM));
					// 機器提供サービス契約解約確定を実施
					CAANMsg eKK0341C350Hash = doOldKkDelkkutei(handle, param, fixedText, scCall, eKK0341A010Hash,prm_mskm_sho_dtl_no,prm_ido_div,updDtm);
					// 最終更新年月日の取得
					last_upd_dtm = getNullToStr(eKK0341C350Hash.getString(EKK0341C350CBSMsg.UPD_DTM));
					key_kktk_svc_kei = getNullToStr(eKK0341C350Hash.getString(EKK0341C350CBSMsg.KKTK_SVC_KEI_NO));
					key_kktk_svc_kei_stat = getNullToStr(eKK0341C350Hash.getString(EKK0341C350CBSMsg.KKTK_SVC_KEI_STAT));
				}
			}
			//処理区分が１の場合機器の回復処理を実施
			else {
				for (CAANMsg tgRirekiData : tgRirekiDataList) {
					// 機器提供サービス契約状態
					String khk_kktk_svc_kei_stat = tgRirekiData.getString(EKK0341B025CBSMsg1List.KKTK_SVC_KEI_STAT);
					
					// 機器提供サービス一意照会を実施し、最終更新年月日を取得
					List<CAANMsg> eKK0341A010CaanMsgList = shokaiMapper.editInMsgEKK0341A010(param, fixedText, 0, tgRirekiData);
					HashMap<String, Object> inMsgEKK0341A010Map = editInMsgCmn(param, eKK0341A010CaanMsgList.get(0));
					Map<?, ?> rsltEKK0341A010 = scCall.run(inMsgEKK0341A010Map, handle);
					CAANMsg[] outMsgEKK0341A010List = getWorkData(EKK0341A010CBSMsg.EKK0341A010CBSMSG1LIST, rsltEKK0341A010);
					
					if ("010".equals(khk_kktk_svc_kei_stat)) {
						// 受付済の場合
						
						// 機器の照査前キャンセル取消を実施
						CAANMsg eKK0341C410Hash = doOldShosamaeKkCancelCl(handle, param, fixedText, scCall,outMsgEKK0341A010List[0],prm_mskm_sho_dtl_no,prm_ido_div);
						last_upd_dtm = getNullToStr(eKK0341C410Hash.getString(EKK0341C410CBSMsg.UPD_DTM));
						key_kktk_svc_kei = getNullToStr(eKK0341C410Hash.getString(EKK0341C410CBSMsg.KKTK_SVC_KEI_NO));
						key_kktk_svc_kei_stat = getNullToStr(eKK0341C410Hash.getString(EKK0341C410CBSMsg.KKTK_SVC_KEI_STAT));
					}
					else if ("020".equals(khk_kktk_svc_kei_stat)) {
						// 照査済の場合
						
						// 機器の照査後キャンセル取消を実施
						CAANMsg eKK0341C420Hash = doOldShosagoKkCancelCl(handle, param, fixedText, scCall,outMsgEKK0341A010List[0],prm_mskm_sho_dtl_no,prm_ido_div);
						last_upd_dtm = getNullToStr(eKK0341C420Hash.getString(EKK0341C420CBSMsg.UPD_DTM));
						key_kktk_svc_kei = getNullToStr(eKK0341C420Hash.getString(EKK0341C420CBSMsg.KKTK_SVC_KEI_NO));
						key_kktk_svc_kei_stat = getNullToStr(eKK0341C420Hash.getString(EKK0341C420CBSMsg.KKTK_SVC_KEI_STAT));
					}
					else if ("030".equals(khk_kktk_svc_kei_stat)) {
						// 締結済の場合
						
						// 機器の解約取消を実施
						CAANMsg eKK0341C430Hash = doOldKkDslCl(handle, param, fixedText, scCall,outMsgEKK0341A010List[0],prm_mskm_sho_dtl_no,prm_ido_div);
						last_upd_dtm = getNullToStr(eKK0341C430Hash.getString(EKK0341C430CBSMsg.UPD_DTM));
						key_kktk_svc_kei = getNullToStr(eKK0341C430Hash.getString(EKK0341C430CBSMsg.KKTK_SVC_KEI_NO));
						key_kktk_svc_kei_stat = getNullToStr(eKK0341C430Hash.getString(EKK0341C430CBSMsg.KKTK_SVC_KEI_STAT));
					}
					else if ("100".equals(khk_kktk_svc_kei_stat)) {
						// サービス提供中の場合
						
						// 機器の回復処理を実施
						CAANMsg eKK0341C380Hash = doOldKkKaihk(handle, param, fixedText, scCall,outMsgEKK0341A010List[0], prm_mskm_sho_dtl_no,prm_ido_div);
						last_upd_dtm = getNullToStr(eKK0341C380Hash.getString(EKK0341C380CBSMsg.UPD_DTM));
						key_kktk_svc_kei = getNullToStr(eKK0341C380Hash.getString(EKK0341C380CBSMsg.KKTK_SVC_KEI_NO));
						key_kktk_svc_kei_stat = getNullToStr(eKK0341C380Hash.getString(EKK0341C380CBSMsg.KKTK_SVC_KEI_STAT));
					}
				}
			}
		} else if (SVC_CD_02.equals(svc_cd)) {
			//処理区分が０の場合機器のキャンセ・解約を実施
			if ("0".equals(updMikstCd)){
				// 機器提供サービス契約ステータスを取得
				String kktk_svc_kei_stat = (String)eKK0341A010Hash.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_STAT);
				// 所持のVA機器のステータスが「０１０：受付済」、「０２０：照査済」の場合、機器のキャンセルを実施
				if ("010".equals(kktk_svc_kei_stat)||"020".equals(kktk_svc_kei_stat)) {
					// 機器のキャンセルを実施
					CAANMsg eKK0341C330Hash = doKktkCancel(handle, param, fixedText, scCall, eKK0341A010Hash,prm_mskm_sho_dtl_no,prm_ido_div);
					last_upd_dtm = getNullToStr(eKK0341C330Hash.getString(EKK0341C330CBSMsg.UPD_DTM));
					key_kktk_svc_kei = getNullToStr(eKK0341C330Hash.getString(EKK0341C330CBSMsg.KKTK_SVC_KEI_NO));
					key_kktk_svc_kei_stat = getNullToStr(eKK0341C330Hash.getString(EKK0341C330CBSMsg.KKTK_SVC_KEI_STAT));
				}
				else {
					// 所持のVA機器のステータスが０２０以上の場合、ここではなのも行わない
				}
			}
			//処理区分が１の場合機器の回復処理を実施
			else {
				for (CAANMsg tgRirekiData : tgRirekiDataList) {
					// 機器提供サービス契約状態
					String khk_kktk_svc_kei_stat = tgRirekiData.getString(EKK0341B025CBSMsg1List.KKTK_SVC_KEI_STAT);
					
					// 機器提供サービス一意照会を実施し、最終更新年月日を取得
					List<CAANMsg> eKK0341A010CaanMsgList = shokaiMapper.editInMsgEKK0341A010(param, fixedText, 0, tgRirekiData);
					HashMap<String, Object> inMsgEKK0341A010Map = editInMsgCmn(param, eKK0341A010CaanMsgList.get(0));
					Map<?, ?> rsltEKK0341A010 = scCall.run(inMsgEKK0341A010Map, handle);
					CAANMsg[] outMsgEKK0341A010List = getWorkData(EKK0341A010CBSMsg.EKK0341A010CBSMSG1LIST, rsltEKK0341A010);
					
					if ("010".equals(khk_kktk_svc_kei_stat)) {
						// 受付済の場合
						
						// 機器の照査前キャンセル取消を実施
						CAANMsg eKK0341C410Hash = doOldShosamaeKkCancelCl(handle, param, fixedText, scCall,outMsgEKK0341A010List[0],prm_mskm_sho_dtl_no,prm_ido_div);
						last_upd_dtm = getNullToStr(eKK0341C410Hash.getString(EKK0341C410CBSMsg.UPD_DTM));
						key_kktk_svc_kei = getNullToStr(eKK0341C410Hash.getString(EKK0341C410CBSMsg.KKTK_SVC_KEI_NO));
						key_kktk_svc_kei_stat = getNullToStr(eKK0341C410Hash.getString(EKK0341C410CBSMsg.KKTK_SVC_KEI_STAT));
					}
					else if ("020".equals(khk_kktk_svc_kei_stat)) {
						// 照査済の場合
						
						// 機器の照査後キャンセル取消を実施
						CAANMsg eKK0341C420Hash = doOldShosagoKkCancelCl(handle, param, fixedText, scCall,outMsgEKK0341A010List[0],prm_mskm_sho_dtl_no,prm_ido_div);
						last_upd_dtm = getNullToStr(eKK0341C420Hash.getString(EKK0341C420CBSMsg.UPD_DTM));
						key_kktk_svc_kei = getNullToStr(eKK0341C420Hash.getString(EKK0341C420CBSMsg.KKTK_SVC_KEI_NO));
						key_kktk_svc_kei_stat = getNullToStr(eKK0341C420Hash.getString(EKK0341C420CBSMsg.KKTK_SVC_KEI_STAT));
					}
				}
			}
		}
		HashMap<String, Object> updDtmMap  = new HashMap<String, Object>();
		updDtmMap.put(KEY_UPD_DTM, last_upd_dtm);
		updDtmMap.put(KEY_KKTK_SVC_KEI_NO, key_kktk_svc_kei);
		updDtmMap.put(KEY_KKTK_SVC_KEI_STAT, key_kktk_svc_kei_stat);
		trgtDataList.add(updDtmMap);

		return param;
	}
	
	/**
	 * サービス契約一意照会SIFを呼び出し
	 * @param	param		リクエストパラメータ	
	 * @param	handle		セッションハンドル
	 * @param	inHash		条件用Hash
	 * @param	resultHash	結果のハッシュ
	 * @param	svcKeiNo	サービス契約番号
	 * @return				サービスインターフェースのリターンコード
	 * @throws	RequestParameterException, SCException 例外時にスローされます
	 */
	private int callEKK0081A010SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash,
			String svcKeiNo
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0081A010への呼び出しパラメータ設定
		template = new CAANMsg(EKK0081A010CBSMsg.class.getName());
		mappingEKK0081A010InMsg(template, inHash, svcKeiNo);
		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		// エラーマッピング処理
		editResultRP(sIFResult, param);

		// エラーチェック
		errChk(sIFResult);

		// 結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		// ステータスが0以外はエラーとなっている
		if(status == 0)
		{
			resultHash.put(TEMPLATE_ID_EKK0081A010, mappingEKK0081A010SCOutMsg(resultMsgs));
		}

		return status;
		
	}
	
	/**
	 * 機器提供サービス契約一意照会SIFを呼び出し
	 * @param	param		リクエストパラメータ	
	 * @param	handle		セッションハンドル
	 * @param	inHash		条件用Hash
	 * @param	resultHash	結果のハッシュ
	 * @param	sysid	SYSID
	 * @return				サービスインターフェースのリターンコード
	 * @throws	RequestParameterException, SCException 例外時にスローされます
	 */
	private int callEKK0341A010SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash,
			String kktk_svc_kei_no
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0081A010への呼び出しパラメータ設定
		template = new CAANMsg(EKK0341A010CBSMsg.class.getName());
		mappingEKK0341A010InMsg(template, inHash, kktk_svc_kei_no);
		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		// エラーマッピング処理
		editResultRP(sIFResult, param);

		// エラーチェック
		errChk(sIFResult);

		// 結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		// ステータスが0以外はエラーとなっている
		if(status == 0)
		{
			resultHash.put(TEMPLATE_ID_EKK0341A010, mappingEKK0341A010SCOutMsg(resultMsgs));
		}

		return status;
		
	}
	
	/**
	 * サービスI/F実行用の共通部を設定します<br>
	 * <br>
	 * 
	 * @param param (I) 業務データ取得用I/F
	 * @param msg データ登録内容
	 * @return オプションサービス契約作成数
	 * @throws RequestParameterException
	 * @exception RequestParameterExceptionがスローされます 。
	 */
	private HashMap<String, Object> editInMsgCmn(IRequestParameterReadOnly param) 
	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));
		
		return paramMap;
	}
	

	/**
	 * templateに対してEKK0081A010の条件に関する部分を設定する
	 * @param template 条件の設定先
	 * @param inHash 設定条件
	 * @param svcKeiNo サービス契約番号
	 * @param requestParam アプリ固有のパラメータ
	 */
	private void mappingEKK0081A010InMsg(CAANMsg template, HashMap<String, Object> inHash, String svcKeiNo)
	{

		//まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0081A010CBSMsg().getContents());
		
		//テンプレートID(SIFのID)
		template.set(EKK0081A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081A010);

		//機能コード--サービス契約一意照会
		template.set(EKK0081A010CBSMsg.FUNC_CODE, "2");

		//ＫＥＹ＿サービス契約番号
		template.set(EKK0081A010CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
		
		//ＫＥＹ＿予約適用年月日
		template.set(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, opeDate);
		
		//ＫＥＹ＿世代登録年月日時分
		template.setNull(EKK0081A010CBSMsg.KEY_GENE_ADD_DTM);
	}
	
	/**
	 * templateに対してECK0011A010の条件に関する部分を設定する
	 * @param template 条件の設定先
	 * @param inHash 設定条件
	 * @param svcKeiNo サービス契約番号
	 * @param requestParam アプリ固有のパラメータ
	 */
	private void mappingEKK0341A010InMsg(CAANMsg template, HashMap<String, Object> inHash, String kktk_svc_kei_no)
	{

		//まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0341A010CBSMsg().getContents());
		
		//テンプレートID(SIFのID)
		template.set(EKK0341A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0341A010);

		//機能コード--お客様一意照会カレント検索
		template.set(EKK0341A010CBSMsg.FUNC_CODE, "2");

		// KEY_機器提供サービス契約番号
		template.set(EKK0341A010CBSMsg.KEY_KKTK_SVC_KEI_NO, kktk_svc_kei_no);
		
		// KEY_予約適用年月日
		template.set(EKK0341A010CBSMsg.KEY_RSV_APLY_YMD, opeDate);
		
		// KEY_世代登録年月日時分
		template.setNull(EKK0341A010CBSMsg.KEY_GENE_ADD_DTM);
	}
	
	/**
	 * 持ちうるフィールドにNullマッピングで埋める
	 * @param msg 対象クラス
	 * @param contents 対応クラスのフィールド列挙
	 */
	private void fillCAANMSGNullMapping(CAANMsg msg, Object[][] contents)
	{
		
		//要素ごとのループ
		for(int i = 0 ; i < contents.length ; i++)
		{
			
			Object element = null;
			
			//キーに該当する箇所の取得
			element = contents[i][0];

			//Nullでマッピング
			msg.setNull((String)element);
			
		}
	}
	
	/**
	 * 条件部の共通する項目の設定
	 * @param param リクエストパラメータ
	 * @param template template 条件の設定先
	 * @throws RequestParameterException
	 */
	private void editBasicCmn(IRequestParameterReadOnly param, CAANMsg template)
	throws RequestParameterException
	{
		
		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);
		
	}
	
	/**
	 * <pre>
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteに必要なデータをマッピングする
	 * 
	 * </pre>
	 * @param msgList CAANMsgクラス
	 * @param param 業務データ取得・書込用I/F
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	private void editResultRP(Map<?, ?> msgList, IRequestParameterReadWrite param) throws Throwable 
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);

		// テンプレートID、ステータス取得
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if (returnCode.intValue() != 0)
		{
			templateStatus = 9000;
		}
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));
	}
	
	/**
	 * エラーチェック処理です。
	 * <br>
	 * @param msgList サービスインタフェース実行結果
	 * @return void
	 * @throws SCCallException 
	 */
	private static void errChk(Map<?, ?> msgList) 
	throws SCCallException
	{
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);

		// ステータス
		int templateStatus = template.getInt(EKK0081A010CBSMsg.STATUS);

		if ((0 != returnCode.intValue()) || (0 != templateStatus))
		{
			String errMsg = "INVALID_RETURN_MESSAGE";
			throw new SCCallException(errMsg, String.valueOf(returnCode), templateStatus);
		}
	}
	
	/**
	 * EKK0081A010の結果をHashとして抽出する
	 * @param resultMsgs EKK0081A010のテンプレートリスト
	 * @return EKK0081A010の結果部分
	 */
	private HashMap<String, Object> mappingEKK0081A010SCOutMsg(CAANMsg[] resultMsgs)
	{
		
		HashMap<String, Object> retHash = null;
		CAANMsg msg = null;
		CAANMsg[] msgList = null;
		
		//結果の抽出
		msg = resultMsgs[0];
		
		//結果の取得
		msgList = 
			(CAANMsg[])msg.getMsgData().get(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
		retHash = msgList[0].getMsgData();
		
		return retHash;
	}
	
	/**
	 * EKK0341A010の結果をHashとして抽出する
	 * @param resultMsgs EKK0081A010のテンプレートリスト
	 * @return EKK0081A010の結果部分
	 */
	private HashMap<String, Object> mappingEKK0341A010SCOutMsg(CAANMsg[] resultMsgs)
	{
		
		HashMap<String, Object> retHash = null;
		CAANMsg msg = null;
		CAANMsg[] msgList = null;
		
		//結果の抽出
		msg = resultMsgs[0];
		
		//結果の取得
		msgList = 
			(CAANMsg[])msg.getMsgData().get(EKK0341A010CBSMsg.EKK0341A010CBSMSG1LIST);
		retHash = msgList[0].getMsgData();
		
		return retHash;
	}
	

	/**
	 * 機器提供サービス契約キャンセル処理を行います。<br>
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param ccMsg
	 * @param scCall
	 * @param msgData
	 * @param contInfAddFlg
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg doKktkCancel(SessionHandle handle,
									IRequestParameterReadWrite param,
									String fixedText,
									ServiceComponentRequestInvoker scCall,
									HashMap<String, Object> eKK0341A010Hash,
									String prm_mskm_sho_dtl_no,
									String prm_ido_div
									) throws Throwable
	{
		// 機器提供サービス契約キャンセル
		Object[][] eKK0341C330IN = getArraysDataEKK0341C330(eKK0341A010Hash,prm_mskm_sho_dtl_no,prm_ido_div);
		
		CAANMsg eKK0341C330MsgData = callSC(handle, scCall, param, fixedText, eKK0341C330IN);
		
		// 20140116　IT2-2014-0000039 呼出元サービスのWORKを上書きしてしまう＆work_upd_dtmは未使用のため削除 START
//		// 更新年月日時分秒を格納
//		Map workMap = (Map)param.getMappingWorkArea();
//		
//		HashMap workDataMap = new HashMap();
//		
//		workDataMap.put("work_upd_dtm", getNullToStr(eKK0341C330MsgData.getString(EKK0341C330CBSMsg.UPD_DTM)));
//		
//		workMap.put("WORK", workDataMap);
//		
//		param.setMappingWorkArea(workMap);
		// 20140116　IT2-2014-0000039 呼出元サービスのWORKを上書きしてしまう＆work_upd_dtmは未使用のため削除 END
		
		return eKK0341C330MsgData;
	}
	
	/**
	 * 機器提供サービス契約解約処理を行います。<br>
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param ccMsg
	 * @param scCall
	 * @param msgData
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg doOldKkDel(SessionHandle handle,
									IRequestParameterReadWrite param,
									String fixedText,
									ServiceComponentRequestInvoker scCall,
									HashMap<String, Object> eKK0341A010Hash,
									String prm_mskm_sho_dtl_no,
									String prm_ido_div
									) throws Throwable
	{
		// 機器提供サービス契約解約処理
		Object[][] EKK0341C340IN = getArraysDataEKK0341C340IN(eKK0341A010Hash,prm_mskm_sho_dtl_no,prm_ido_div);
		
		CAANMsg eKK0341C340MsgData = callSC(handle, scCall, param, fixedText, EKK0341C340IN);
		
		// 20140116　IT2-2014-0000039 呼出元サービスのWORKを上書きしてしまう＆work_upd_dtmは未使用のため削除 START
//		// 更新年月日時分秒を格納
//		Map workMap = (Map)param.getMappingWorkArea();
//		
//		HashMap workDataMap = new HashMap();
//		
//		workDataMap.put("work_upd_dtm", getNullToStr(eKK0341C340MsgData.getString(EKK0341C340CBSMsg.UPD_DTM)));
//		
//		workMap.put("WORK", workDataMap);
//		
//		param.setMappingWorkArea(workMap);
		// 20140116　IT2-2014-0000039 呼出元サービスのWORKを上書きしてしまう＆work_upd_dtmは未使用のため削除 END
		
		return eKK0341C340MsgData;
	}
	
	/**
	 * 機器提供サービス契約解約確定処理を行います。<br>
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param ccMsg
	 * @param scCall
	 * @param msgData
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg doOldKkDelkkutei(SessionHandle handle,
									IRequestParameterReadWrite param,
									String fixedText,
									ServiceComponentRequestInvoker scCall,
									HashMap<String, Object> eKK0341A010Hash,
									String prm_mskm_sho_dtl_no,
									String prm_ido_div,
									String upd_dtm
									) throws Throwable
	{
		// 機器提供サービス契約解約確定処理
		Object[][] EKK0341C350IN = getArraysDataEKK0341C350IN(eKK0341A010Hash,prm_mskm_sho_dtl_no,prm_ido_div,upd_dtm);
		
		CAANMsg eKK0341C350MsgData = callSC(handle, scCall, param, fixedText, EKK0341C350IN);
		
		// 20140116　IT2-2014-0000039 呼出元サービスのWORKを上書きしてしまう＆work_upd_dtmは未使用のため削除 START
//		// 更新年月日時分秒を格納
//		Map workMap = (Map)param.getMappingWorkArea();
//		
//		HashMap workDataMap = new HashMap();
//		
//		workDataMap.put("work_upd_dtm", getNullToStr(eKK0341C350MsgData.getString(EKK0341C350CBSMsg.UPD_DTM)));
//		
//		workMap.put("WORK", workDataMap);
//		
//		param.setMappingWorkArea(workMap);
		// 20140116　IT2-2014-0000039 呼出元サービスのWORKを上書きしてしまう＆work_upd_dtmは未使用のため削除 END
		
		return eKK0341C350MsgData;
	}
	
	/**
	 * 機器提供サービス契約回復処理を行います。<br>
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param ccMsg
	 * @param scCall
	 * @param msgData
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg doOldKkKaihk(SessionHandle handle,
									IRequestParameterReadWrite param,
									String fixedText,
									ServiceComponentRequestInvoker scCall,
									CAANMsg tgRirekiData,
									String prm_mskm_sho_dtl_no,
									String prm_ido_div
									) throws Throwable
	{
		// 機器提供サービス契約解約確定処理
		Object[][] EKK0341C380IN = getArraysDataEKK0341C380IN(tgRirekiData,prm_mskm_sho_dtl_no,prm_ido_div);
		
		CAANMsg eKK0341C380MsgData = callSC(handle, scCall, param, fixedText, EKK0341C380IN);
		
		// 20140116　IT2-2014-0000039 呼出元サービスのWORKを上書きしてしまう＆work_upd_dtmは未使用のため削除 START
//		// 更新年月日時分秒を格納
//		Map workMap = (Map)param.getMappingWorkArea();
//		
//		HashMap workDataMap = new HashMap();
//		
//		workDataMap.put("work_upd_dtm", getNullToStr(eKK0341C380MsgData.getString(EKK0341C380CBSMsg.UPD_DTM)));
//		
//		workMap.put("WORK", workDataMap);
//		
//		param.setMappingWorkArea(workMap);
		// 20140116　IT2-2014-0000039 呼出元サービスのWORKを上書きしてしまう＆work_upd_dtmは未使用のため削除 END
		
		return eKK0341C380MsgData;
	}
	
	/**
	 * 照査前機器提供サービス契約キャンセル取消処理を行います。<br>
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param ccMsg
	 * @param scCall
	 * @param msgData
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg doOldShosamaeKkCancelCl(SessionHandle handle,
									IRequestParameterReadWrite param,
									String fixedText,
									ServiceComponentRequestInvoker scCall,
									CAANMsg tgRirekiData,
									String prm_mskm_sho_dtl_no,
									String prm_ido_div
									) throws Throwable
	{
		// 機器提供サービス契約解約確定処理
		Object[][] EKK0341C410IN = getArraysDataEKK0341C410IN(tgRirekiData,prm_mskm_sho_dtl_no,prm_ido_div);
		
		CAANMsg eKK0341C410MsgData = callSC(handle, scCall, param, fixedText, EKK0341C410IN);
		
		// 20140116　IT2-2014-0000039 呼出元サービスのWORKを上書きしてしまう＆work_upd_dtmは未使用のため削除 START
//		// 更新年月日時分秒を格納
//		Map workMap = (Map)param.getMappingWorkArea();
//		
//		HashMap workDataMap = new HashMap();
//		
//		workDataMap.put("work_upd_dtm", getNullToStr(eKK0341C410MsgData.getString(EKK0341C410CBSMsg.UPD_DTM)));
//		
//		workMap.put("WORK", workDataMap);
//		
//		param.setMappingWorkArea(workMap);
		// 20140116　IT2-2014-0000039 呼出元サービスのWORKを上書きしてしまう＆work_upd_dtmは未使用のため削除 END
		
		return eKK0341C410MsgData;
	}
	
	/**
	 * 照査後機器提供サービス契約キャンセル取消処理を行います。<br>
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param ccMsg
	 * @param scCall
	 * @param msgData
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg doOldShosagoKkCancelCl(SessionHandle handle,
									IRequestParameterReadWrite param,
									String fixedText,
									ServiceComponentRequestInvoker scCall,
									CAANMsg tgRirekiData,
									String prm_mskm_sho_dtl_no,
									String prm_ido_div
									) throws Throwable
	{
		// 機器提供サービス契約解約確定処理
		Object[][] EKK0341C420IN = getArraysDataEKK0341C420IN(tgRirekiData,prm_mskm_sho_dtl_no,prm_ido_div);
		
		CAANMsg eKK0341C420MsgData = callSC(handle, scCall, param, fixedText, EKK0341C420IN);
		
		// 20140116　IT2-2014-0000039 呼出元サービスのWORKを上書きしてしまう＆work_upd_dtmは未使用のため削除 START
//		// 更新年月日時分秒を格納
//		Map workMap = (Map)param.getMappingWorkArea();
//		
//		HashMap workDataMap = new HashMap();
//		
//		workDataMap.put("work_upd_dtm", getNullToStr(eKK0341C420MsgData.getString(EKK0341C420CBSMsg.UPD_DTM)));
//		
//		workMap.put("WORK", workDataMap);
//		
//		param.setMappingWorkArea(workMap);
		// 20140116　IT2-2014-0000039 呼出元サービスのWORKを上書きしてしまう＆work_upd_dtmは未使用のため削除 END
		
		return eKK0341C420MsgData;
	}
	
	/**
	 * 機器提供サービス契約解約取消処理を行います。<br>
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param ccMsg
	 * @param scCall
	 * @param msgData
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg doOldKkDslCl(SessionHandle handle,
									IRequestParameterReadWrite param,
									String fixedText,
									ServiceComponentRequestInvoker scCall,
									CAANMsg tgRirekiData,
									String prm_mskm_sho_dtl_no,
									String prm_ido_div
									) throws Throwable
	{
		// 機器提供サービス契約解約確定処理
		Object[][] EKK0341C430IN = getArraysDataEKK0341C430IN(tgRirekiData,prm_mskm_sho_dtl_no,prm_ido_div);
		
		CAANMsg eKK0341C430MsgData = callSC(handle, scCall, param, fixedText, EKK0341C430IN);
		
		// 20140116　IT2-2014-0000039 呼出元サービスのWORKを上書きしてしまう＆work_upd_dtmは未使用のため削除 START
//		// 更新年月日時分秒を格納
//		Map workMap = (Map)param.getMappingWorkArea();
//		
//		HashMap workDataMap = new HashMap();
//		
//		workDataMap.put("work_upd_dtm", getNullToStr(eKK0341C430MsgData.getString(EKK0341C430CBSMsg.UPD_DTM)));
//		
//		workMap.put("WORK", workDataMap);
//		
//		param.setMappingWorkArea(workMap);
		// 20140116　IT2-2014-0000039 呼出元サービスのWORKを上書きしてしまう＆work_upd_dtmは未使用のため削除 END
		
		return eKK0341C430MsgData;
	}
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							Object[][] mappingData) throws Throwable
	{
		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 (null == errList)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(return_code.toString()) && 0 == status))
		{
			if(!("0".equals(return_code.toString()) && 4 == status))
			{
				throw new SCCallException("戻り値不正", return_code.toString(), status);
			}
		}
		
		return msg;
	}
	

	/**
	 * @param param
	 * @param dataMapKey
	 * @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++)
		{
			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;
	}
	
	/**
	 * 
	 * @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);
		
		if (0 != returnCode)
		{
			templateStatus = 9000;
		}
		
		if (null == JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)))
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (null == obj)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}
		
		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		HashMap<String, String> inMap = null;
		
		// ユーザデータ情報
		inMap = (HashMap<String, String>)param.getData(dataMapKey);
		
		for (int i = 0; i < mappingData.length; i++)
		{
				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;
	}
	
	/**
	 * 機器提供サービス契約キャンセル処理パラメータマップ<br>
	 * <br>
	 * @param ccMsg
	 * @param custMap
	 * @param contInfAddFlg
	 * @return Object[][]
	 */
	@SuppressWarnings("unchecked")
	private Object[][] getArraysDataEKK0341C330(HashMap custMap, String prm_mskm_sho_dtl_no,String ido_div)
	{
		// 検索してきた値を更新用のパラメータに格納
		HashMap map = getInputMap(custMap, TEMPLATE_ID_EKK0341C330);
		
		// 画面からの入力項目等を上書きする。
		// 機能コード
		map.put(EKK0341C330CBSMsg.FUNC_CODE,                JPCModelConstant.FUNC_CD_1);
		// 機器提供サービス契約番号
		map.put(EKK0341C330CBSMsg.KKTK_SVC_KEI_NO,          (String)custMap.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
		// 申込明細番号
		map.put(EKK0341C330CBSMsg.MSKM_DTL_NO,              prm_mskm_sho_dtl_no);
		// サービスキャンセル理由コード
		map.put(EKK0341C330CBSMsg.SVC_CANCEL_RSN_CD,        "05");
		// 異動区分
		map.put(EKK0341C330CBSMsg.IDO_DIV,                  ido_div);
		// 更新年月日時分秒(更新前)
		map.put(EKK0341C330CBSMsg.UPD_DTM_BF,               (String)custMap.get(EKK0341A010CBSMsg1List.LAST_UPD_DTM));
		
		// 更新用のHashMapを二次元配列に格納
		Object[][] arraysParam = getArraysParam(map, EKK0341C330CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0341C330);
		
		return arraysParam;
	}
	
	/**
	 * 機器提供サービス契約解約処理パラメータマップ<br>
	 * <br>
	 * @param ccMsg
	 * @param custMap
	 * @return Object[][]
	 */
	@SuppressWarnings("unchecked")
	private Object[][] getArraysDataEKK0341C340IN(HashMap eKK0341A010Hash, String prm_mskm_sho_dtl_no,String prm_ido_div)
	{
		// 検索してきた値を更新用のパラメータに格納
		HashMap map = getInputMap(eKK0341A010Hash, TEMPLATE_ID_EKK0341C340);
		
		// 画面からの入力項目等を上書きする。
		// 機能コード
		map.put(EKK0341C340CBSMsg.FUNC_CODE,             JPCModelConstant.FUNC_CD_1);
		// 機器提供サービス契約番号
		map.put(EKK0341C340CBSMsg.KKTK_SVC_KEI_NO,       (String)eKK0341A010Hash.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
		// サービス終了年月日
		map.put(EKK0341C340CBSMsg.SVC_ENDYMD,            opeDate);
		// 異動区分
		map.put(EKK0341C340CBSMsg.IDO_DIV,               prm_ido_div);
		// 申込明細番号
		map.put(EKK0341C340CBSMsg.MSKM_DTL_NO,           prm_mskm_sho_dtl_no);
		// サービス解約理由コード
		map.put(EKK0341C340CBSMsg.SVC_DLRE_CD,           "01");
		// 更新年月日時分秒(更新前)
		map.put(EKK0341C340CBSMsg.UPD_DTM_BF,            (String)eKK0341A010Hash.get(EKK0341A010CBSMsg1List.LAST_UPD_DTM));


		// 更新用のHashMapを二次元配列に格納
		Object[][] arraysParam = getArraysParam(map, EKK0341C340CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0341C340);
		
		return arraysParam;
	}
	
	/**
	 * 機器提供サービス契約解約処理パラメータマップ<br>
	 * <br>
	 * @param ccMsg
	 * @param custMap
	 * @return Object[][]
	 */
	@SuppressWarnings("unchecked")
	private Object[][] getArraysDataEKK0341C350IN(HashMap eKK0341A010Hash, String prm_mskm_sho_dtl_no,String prm_ido_div,String upd_dtm)
	{
		// 検索してきた値を更新用のパラメータに格納
		HashMap map = getInputMap(eKK0341A010Hash, TEMPLATE_ID_EKK0341C350);
		
		// 画面からの入力項目等を上書きする。
		// 機能コード
		map.put(EKK0341C350CBSMsg.FUNC_CODE,             JPCModelConstant.FUNC_CD_1);
		// 機器提供サービス契約番号
		map.put(EKK0341C350CBSMsg.KKTK_SVC_KEI_NO,       (String)eKK0341A010Hash.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
		// サービス終了年月日
		map.put(EKK0341C350CBSMsg.SVC_ENDYMD,            opeDate);
		// サービス課金終了年月日
		map.put(EKK0341C350CBSMsg.SVC_CHRG_ENDYMD,       addYYYYMMDD(opeDate, -1));
		// 異動区分
		map.put(EKK0341C350CBSMsg.IDO_DIV,               prm_ido_div);
		// 申込明細番号
		map.put(EKK0341C350CBSMsg.MSKM_DTL_NO,           prm_mskm_sho_dtl_no);
		// サービス解約理由コード
		map.put(EKK0341C350CBSMsg.SVC_DLRE_CD,           "01");
		// 更新年月日時分秒(更新前)
		map.put(EKK0341C350CBSMsg.UPD_DTM_BF,            (String)eKK0341A010Hash.get(EKK0341A010CBSMsg1List.LAST_UPD_DTM));


		// 更新用のHashMapを二次元配列に格納
		Object[][] arraysParam = getArraysParam(map, EKK0341C340CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0341C350);
		
		return arraysParam;
	}
	
	/**
	 * 機器提供サービス契約回復処理パラメータマップ<br>
	 * <br>
	 * @param ccMsg
	 * @param custMap
	 * @return Object[][]
	 */
	@SuppressWarnings("unchecked")
	private Object[][] getArraysDataEKK0341C380IN(CAANMsg tgRirekiData, String prm_mskm_sho_dtl_no,String prm_ido_div)
	{
		// 検索してきた値を更新用のパラメータに格納
		HashMap map = getInputMap(tgRirekiData, TEMPLATE_ID_EKK0341C380);
		
		// 画面からの入力項目等を上書きする。
		// 機能コード
		map.put(EKK0341C380CBSMsg.FUNC_CODE,             JPCModelConstant.FUNC_CD_1);
		// 機器提供サービス契約番号
		map.put(EKK0341C380CBSMsg.KKTK_SVC_KEI_NO,       tgRirekiData.getString(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
		// 回復年月日
		map.put(EKK0341C380CBSMsg.KAIHK_YMD,            opeDate);
		// 異動区分
		map.put(EKK0341C380CBSMsg.IDO_DIV,               prm_ido_div);
		// 申込明細番号
		map.put(EKK0341C380CBSMsg.MSKM_DTL_NO,           prm_mskm_sho_dtl_no);
		// 更新年月日時分秒(更新前)
		map.put(EKK0341C380CBSMsg.UPD_DTM_BF,            tgRirekiData.getString(EKK0341A010CBSMsg1List.LAST_UPD_DTM));


		// 更新用のHashMapを二次元配列に格納
		Object[][] arraysParam = getArraysParam(map, EKK0341C380CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0341C380);
		
		return arraysParam;
	}
	
	/**
	 * 照査前機器提供サービス契約キャンセル取消処理パラメータマップ<br>
	 * <br>
	 * @param ccMsg
	 * @param custMap
	 * @return Object[][]
	 */
	@SuppressWarnings("unchecked")
	private Object[][] getArraysDataEKK0341C410IN(CAANMsg tgRirekiData, String prm_mskm_sho_dtl_no,String prm_ido_div)
	{
		// 検索してきた値を更新用のパラメータに格納
		HashMap map = getInputMap(tgRirekiData, TEMPLATE_ID_EKK0341C410);
		
		// 画面からの入力項目等を上書きする。
		// 機能コード
		map.put(EKK0341C410CBSMsg.FUNC_CODE,             JPCModelConstant.FUNC_CD_1);
		// 機器提供サービス契約番号
		map.put(EKK0341C410CBSMsg.KKTK_SVC_KEI_NO,       tgRirekiData.getString(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
		// 異動区分
		map.put(EKK0341C410CBSMsg.IDO_DIV,               prm_ido_div);
		// 申込明細番号
		map.put(EKK0341C410CBSMsg.MSKM_DTL_NO,           prm_mskm_sho_dtl_no);
		// 更新年月日時分秒(更新前)
		map.put(EKK0341C410CBSMsg.UPD_DTM_BF,            tgRirekiData.getString(EKK0341A010CBSMsg1List.LAST_UPD_DTM));

		// 更新用のHashMapを二次元配列に格納
		Object[][] arraysParam = getArraysParam(map, EKK0341C410CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0341C410);
		
		return arraysParam;
	}
	
	/**
	 * 照査後機器提供サービス契約キャンセル取消処理パラメータマップ<br>
	 * <br>
	 * @param ccMsg
	 * @param custMap
	 * @return Object[][]
	 */
	@SuppressWarnings("unchecked")
	private Object[][] getArraysDataEKK0341C420IN(CAANMsg tgRirekiData, String prm_mskm_sho_dtl_no,String prm_ido_div)
	{
		// 検索してきた値を更新用のパラメータに格納
		HashMap map = getInputMap(tgRirekiData, TEMPLATE_ID_EKK0341C420);
		
		// 画面からの入力項目等を上書きする。
		// 機能コード
		map.put(EKK0341C420CBSMsg.FUNC_CODE,             JPCModelConstant.FUNC_CD_1);
		// 機器提供サービス契約番号
		map.put(EKK0341C420CBSMsg.KKTK_SVC_KEI_NO,       tgRirekiData.getString(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
		// 異動区分
		map.put(EKK0341C420CBSMsg.IDO_DIV,               prm_ido_div);
		// 申込明細番号
		map.put(EKK0341C420CBSMsg.MSKM_DTL_NO,           prm_mskm_sho_dtl_no);
		// 更新年月日時分秒(更新前)
		map.put(EKK0341C420CBSMsg.UPD_DTM_BF,            tgRirekiData.getString(EKK0341A010CBSMsg1List.LAST_UPD_DTM));


		// 更新用のHashMapを二次元配列に格納
		Object[][] arraysParam = getArraysParam(map, EKK0341C420CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0341C420);
		
		return arraysParam;
	}
	
	/**
	 * 機器提供サービス契約解約取消処理パラメータマップ<br>
	 * <br>
	 * @param ccMsg
	 * @param custMap
	 * @return Object[][]
	 */
	@SuppressWarnings("unchecked")
	private Object[][] getArraysDataEKK0341C430IN(CAANMsg tgRirekiData, String prm_mskm_sho_dtl_no,String prm_ido_div)
	{
		// 検索してきた値を更新用のパラメータに格納
		HashMap map = getInputMap(tgRirekiData, TEMPLATE_ID_EKK0341C430);
		
		// 画面からの入力項目等を上書きする。
		// 機能コード
		map.put(EKK0341C430CBSMsg.FUNC_CODE,             JPCModelConstant.FUNC_CD_1);
		// 機器提供サービス契約番号
		map.put(EKK0341C430CBSMsg.KKTK_SVC_KEI_NO,       tgRirekiData.getString(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
		// 異動区分
		map.put(EKK0341C430CBSMsg.IDO_DIV,               prm_ido_div);
		// 申込明細番号
		map.put(EKK0341C430CBSMsg.MSKM_DTL_NO,           prm_mskm_sho_dtl_no);
		// 更新年月日時分秒(更新前)
		map.put(EKK0341C430CBSMsg.UPD_DTM_BF,            tgRirekiData.getString(EKK0341A010CBSMsg1List.LAST_UPD_DTM));


		// 更新用のHashMapを二次元配列に格納
		Object[][] arraysParam = getArraysParam(map, EKK0341C430CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0341C430);
		
		return arraysParam;
	}
	
	/**
	 * 検索してきた項目を更新用の項目に格納します。
	 * @param custMap
	 * @param svcIf
	 * @return HashMap<String, String>
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, String> getInputMap(HashMap<String, String> custMap, String svcIf)
	{
		CAANMsg inMsg = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));
		
		HashMap<String, String> map = new HashMap<String, String>();
		
		Iterator<String> ite = inMsg.getSchema().getSchemaKeySet().iterator();
		while (ite.hasNext())
		{
			String key = (String)ite.next();
			
			if(key.endsWith("_err"))
			{
				
				String tmpKey = key.substring(0, key.length() - 4);
				
				if(custMap.containsKey(tmpKey))
				{
					
					map.put(tmpKey, custMap.get(tmpKey));
					
				}
			}
		}
		return map;
	}
	
	/**
	 * 検索してきた項目を更新用の項目に格納します。
	 * @param caanMsg
	 * @param svcIf
	 * @return HashMap<String, String>
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, String> getInputMap(CAANMsg caanMsg, String svcIf)
	{
		CAANMsg inMsg = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));
		
		HashMap<String, String> map = new HashMap<String, String>();
		
		Iterator<String> ite = inMsg.getSchema().getSchemaKeySet().iterator();
		while (ite.hasNext())
		{
			String key = (String)ite.next();
			
			if(key.endsWith("_err"))
			{
				
				String tmpKey = key.substring(0, key.length() - 4);
				
				if(caanMsg.containsKeyOfSchema(tmpKey))
				{
					
					map.put(tmpKey, caanMsg.getString(tmpKey));
					
				}
			}
		}
		return map;
	}
	
	/**
	 * 更新用のHashMapを二次元配列に格納します。
	 * @param map
	 * @param paramKey
	 * @param templateId
	 * @return Object[][]
	 */
	@SuppressWarnings("unchecked")
	private Object[][] getArraysParam(HashMap<String, String> map, String paramKey, String templateId)
	{
		// 先頭の要素にはTemplateIDを格納するため要素をひとつ多く生成しておく。
		Object[][] arraysParam = new Object[map.size() + 1][2];
		
		// TemplateIDを格納
		arraysParam[0][0] = paramKey;
		arraysParam[0][1] = templateId;
		
		// 更新用のHashMapを二次元配列に格納
		Iterator iter = map.keySet().iterator();
		int i = 1;
		while (iter.hasNext())
		{
			String key = (String)iter.next();
			
			arraysParam[i][0] = key;
			arraysParam[i][1] = map.get(key);
			
			i++;
			
		}
		return arraysParam;
	}
	
	/**
	 * パラメタがNullの場合空白を返却します。
	 * @param str 文字列
	 * @return str
	 */
	private String getNullToStr(String str)
	{
		if (str == null || "".equals(str.trim()))
		{
			return "";
		}
		return str;
	}
	
	public static String addYYYYMMDD(String trgtYmd, int addDay)
	{
		// 年月日が空の場合
		if (trgtYmd == null || "".equals(trgtYmd))
		{
			return trgtYmd;
		}

		// 年月日が８桁に満たない場合
		if (trgtYmd.length() < 8)
		{
			return trgtYmd;
		}

		// 年月日の抽出
		int year  = Integer.parseInt(trgtYmd.substring(0, 4));
		int month = Integer.parseInt(trgtYmd.substring(4, 6));
		int day   = Integer.parseInt(trgtYmd.substring(6, 8));

		Calendar cal = Calendar.getInstance();
		cal.set(year, month - 1, day);
		// 日付を算出
		cal.add(Calendar.DATE, addDay);

		return String.format("%tY%tm%td", cal, cal, cal);
	}
	
	/**
	 * サービスI/F実行用の共通部を設定します<br>
	 * <br>
	 * 
	 * @param param (I) 業務データ取得用I/F
	 * @param msg データ登録内容
	 * @return オプションサービス契約作成数
	 * @throws RequestParameterException
	 * @exception RequestParameterExceptionがスローされます 。
	 */
	private HashMap<String, Object> editInMsgCmn(IRequestParameterReadOnly param, CAANMsg msg) 
	throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		/* SCインプット共通データ */
		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());
		
		// **********************************************
		// 【取得元：ユーザエリア(コントロールマップ)】
		// **********************************************
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = msg;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
		
	}
	
	/**
	 * 業務データの取得処理です。
	 * <br>
	 * @param workMapKey 業務データのマップキー
	 * @param rsltShokai 一意照会、一覧照会の結果データ
	 * @return 業務データ
	 */
	protected CAANMsg[] getWorkData(String workMapKey, Map<?, ?> rsltShokai)
	{
		CAANMsg[] templateArray = null;
		CAANMsg[] templates = (CAANMsg[])rsltShokai.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];

		templateArray = parentTemplate.getCAANMsgList(workMapKey);
		
		return templateArray;
	}
	
	/**
	 * 回復後履歴特定処理
	 * @param rirekiGetMap 対象機器提供サービス契約の履歴データ
	 * @param mskm_dtl_no 解約キャンセル時の申込明細番号
	 * @return getTgdateMap 回復対象ステータスのレコード
	 */
	private List<CAANMsg> rirekiTokutei( CAANMsg[] rirekiGetMap , String mskm_dtl_no ) 
	{
		//回復対象ステータスのレコードを格納
		List<CAANMsg> getTgdateList = new ArrayList<CAANMsg>();
		
		if (rirekiGetMap != null && !"".equals(rirekiGetMap) && rirekiGetMap.length > 0) {
			for (int i = rirekiGetMap.length-1 ; i >= 0 ; i-- ) {
				CAANMsg getRirekiGetMap = rirekiGetMap[i];
				
// ▽▽▽ #83756 ADD START
				// 多機能ルータは対象外
				if ("R0".equals(getRirekiGetMap.getString(EKK0341B025CBSMsg1List.TAKNKIKI_SBT_CD)))
				{
					continue;
				}
// △△△ #83756 ADD END
				// 申込明細番号確認（キャンセル・解約時の申込番号であれば正）
				String now_mskm_dtl_no = (String)getRirekiGetMap.getString(EKK0341B025CBSMsg1List.MSKM_DTL_NO);
				// カーソルの申込明細番号とinparamの申込明細番号が一致すれば
				if (mskm_dtl_no.equals(now_mskm_dtl_no)) {
					// 機器提供サービス契約ステータスを取得
					String kkop_svc_kei_stat = (String)getRirekiGetMap.getString(EKK0341B025CBSMsg1List.KKTK_SVC_KEI_STAT);
					// キャンセル・解約のステータスの場合、後続処理を実施
					if ("910".equals(kkop_svc_kei_stat) || "920".equals(kkop_svc_kei_stat)) {
						// 再度履歴一覧ループを行う
						for (int a = i-1 ; a >= 0 ; a-- ) {
							// 解約キャンセル申込明細番号レコードより一個前の履歴から再建策
							CAANMsg tgRirekiGetMap = rirekiGetMap[a];
							
							// 履歴対象機器提供サービス契約ステータスを取得
							String tg_kkop_svc_kei_stat = (String)tgRirekiGetMap.getString(EKK0341B025CBSMsg1List.KKTK_SVC_KEI_STAT);
							if (tg_kkop_svc_kei_stat != null && !"".equals(tg_kkop_svc_kei_stat)) {
								// キャンセル、解約及び利用停止以外の場合は対象として認識
								if (!"910".equals(tg_kkop_svc_kei_stat) && !"920".equals(tg_kkop_svc_kei_stat) && !"220".equals(tg_kkop_svc_kei_stat)) {
									// 回復後対象データとして判断し、返却値に格納
									getTgdateList.add(tgRirekiGetMap);
									break;
								}
							}
						}
					}
				}
			}
		}
		// 回復対象ステータスのレコードを返却
		return getTgdateList;
	}
}