/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKKikiIchiranKeiChgCancelCC
*	ソースファイル名：JKKKikiIchiranKeiChgCancelCC.java
*	作成者			：FJ
*	日付			：2012年06月06日
*＜機能概要＞
*	機器一覧契約変更取消処理の共通コンポーネント
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/06/06	FJ			新規作成
*	v4.01.00	2013/02/05	FJ			【IT1-2013-0000185】障害対応
*	v5.00.00	2013/03/05	FJ) 田原	【ANK-1438-00-00】緊急出荷機能の実装漏れ（２）
*	v4.02.00	2013/02/05	FJ			【IT2-2013-0000295】障害対応
*	v5.01.00	2013/03/14	FJ) 古田	【IT1-2013-0000466】回線データの排他エラー
*	v5.02.00	2013/03/05	FJ) 田原	【ANK-1429-00-00】住所変更に伴うVA移動機器登録の解除の対応
*	v5.02.01	2013/03/29	FJ) 鳩本	【IT1-2013-0000696】障害対応
*	v5.03.00	2013/04/16	FJ) 鳩本	【OT-2013-0000664】関連対応
*	v5.04.00	2013/05/29	FJ) 鳩本	【IT1-2013-0001246】障害対応
*	v5.04.01	2013/06/20	FJ) 古田	【IT1-2013-0001272】関連対応
*	v5.04.02	2013/09/30	FJ) 古田	【OM-2013-0002685】関連対応
*   v5.04.03	2013/10/03	FJ) 辛	    【OM-2013-0002683】障害対応
*   v6.00.01	2013/12/25	FJ)田原	    【OM-2013-0004239】対応
*   v10.00.00	2014/09/01	FJ)星野	    【IT1-2014-0000299】対応
*   v15.00.00	2015/07/31	FJ)谷本	    【OM-2015-0000080】対応
*   v40.00.00	2019/01/31	FJ)謝       【ANK-3488-10-00】在庫出荷によるＢＣＡＳ解約対応
*   v41.00.00	2019/02/20	FJ)謝       【ANK-3412-12-00】【５ギガ・１０ギガ】多機能ルータ交換取り消し
*   v47.00.00	2019/12/24	FJ)謝       【OM-2019-0001295】対応
*	v61.00.00	2022/01/31	FJ) 永江	【ANK-4315-00-00】【eo定期】 eoホームゲートウェイ導入対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
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.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.ejb.cbs.cbsmsg.EDK0301A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EDK0301A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EDK0301B060CBSMsg;
import eo.ejb.cbs.cbsmsg.EDK0301B060CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EDK0301B080CBSMsg;
import eo.ejb.cbs.cbsmsg.EDK0301B080CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EDK0301C040CBSMsg;
import eo.ejb.cbs.cbsmsg.EDK0301D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B009CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B009CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B012CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B501CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B501CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341C170CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C330CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C340CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C350CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C540CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1681A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1681A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1681B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1681B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1681C010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2811B504CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2811B504CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKU0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKU0081B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0081B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg1List;


/**
 * 機器一覧契約変更取消処理を行います。<p>
 * <BR>
 * @author 富士通
 */
public class JKKKikiIchiranKeiChgCanCC extends AbstractCommonComponent
{
	/** サービス契約一意照会 */
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	/** 機器提供サービス契約機器変更手続中止 */
	private static final String TEMPLATE_ID_EKK0341C540 = "EKK0341C540";
	/** 機器提供サービス契約料金コース変更中止 */
	private static final String TEMPLATE_ID_EKK0341C170 = "EKK0341C170";
	/** 返品機器一意照会 */
	private static final String TEMPLATE_ID_EDK0301A010 = "EDK0301A010";
	/** 返品機器取消 */
	private static final String TEMPLATE_ID_EDK0301C040 = "EDK0301C040";
	/** 進捗登録 */
	private static final String TEMPLATE_ID_EKK1091D010 = "EKK1091D010";
	/** 工事案件一意照会 */
	private static final String TEMPLATE_ID_EKU0011A010 = "EKU0011A010";
	/* ++++++++++ v5.01.00 変更開始 ++++++++++ */
	/** 機器提供サービス契約一意照会 */
	private static final String TEMPLATE_ID_EKK0341A010 = "EKK0341A010";
	/* ++++++++++ v5.01.00 変更完了 ++++++++++ */
	/* ++++++++++ v5.02.01 追加開始 ++++++++++ */
	/** 返品機器受付 */
	private static final String TEMPLATE_ID_EDK0301D010 = "EDK0301D010";
	/* ++++++++++ v5.02.01 追加完了 ++++++++++ */
	
	/** サービス契約の更新タイムスタンプ格納キー */
	private static final String KK_COM_SVC_UP_DTM = "KK_COM_SVC_UP_DTM";

	/* ++++++++++ v4.01.00 追加開始 ++++++++++ */
	/** 機器登録CC内で使用する異動登録時の更新タイムスタンプ格納キー */
	private static final String KK_COM_IDO_UP_DTM = "KK_COM_IDO_UP_DTM";
	/* ++++++++++ v4.01.00 追加完了 ++++++++++ */
	
	/* ++++++++++ v5.04.00 修正開始 ++++++++++ */
//	/** 進捗ステータス コース変更予約取消*/
//	private static final String PRG_STAT_9911 = "9911";
	/** 進捗ステータス 機器契約変更取消完了 */
	private static final String PRG_STAT_3503 = "3503";
	/* ++++++++++ v5.04.00 修正完了 ++++++++++ */

	/** 予約適用コード 予約取消 */
	private static final String RSV_APLY_CD_3 = "3";
	/** 配送ステータス 受付済 */
	private static final String HAISO_STAT_001 = "001";
	/** 配送ステータス 指示済 */
	private static final String HAISO_STAT_002 = "002";
	/* ++++++++++ v5.03.00 追加開始 ++++++++++ */
	/** 配送ステータス 出荷済 */
	private static final String HAISO_STAT_003 = "003";
	/* ++++++++++ v5.03.00 追加完了 ++++++++++ */
	/* ++++++++++ v5.02.01 追加開始 ++++++++++ */
	/** 配送ステータス 完了済 */
	private static final String HAISO_STAT_004 = "004";
	
	/** 返品機器ステータス 受付済 */
	private static final String HMPIN_KIKI_STAT_001 = "001";
	/** 返品機器ステータス 取消済 */
	private static final String HMPIN_KIKI_STAT_004 = "004";
	
	/* ++++++++++ v5.03.00 追加開始 ++++++++++ */
	/** 返品区分（キャンセル品）*/
	private static final String HENPIN_DIV_CANCAL = "1";
	/* ++++++++++ v5.03.00 追加完了 ++++++++++ */
	/** 返品区分（レンタル品）*/
	private static final String HENPIN_DIV_RENTAL = "2";
	
	/** エラーフラグ（エラー） */
	private static final String ERR_FLG_ERR = "E";
	/** エラーフラグ（ワーニング） */
	private static final String ERR_FLG_WARNING = "W";
	
	/** 機器提供サービス契約履歴一覧照会ID*/
	private static final String SCRN_ID_KKW03307 = "KKW03307";
	/* ++++++++++ v5.02.01 追加完了 ++++++++++ */
	
	/* ++++++++++ v5.00.00 追加開始 ++++++++++ */
	/** サービス契約_工事案件一覧照会(工事中取得) */
	private static final String TEMPLATE_ID_EKU0081B010 = "EKU0081B010";
	/** 機能コード（チェック＆登録） */
	private static final String FUNC_CODE_1 = "1";
	/** 機能コード（チェックのみ）*/
	private static final String FUNC_CODE_2 = "2";
	/** 工事中工事案件ステータス（受付済（130）依頼済（140）宅内調査完了済（150）
	 工事会社決定済（160）宅内機器予定登録済（170）仮鍵開発行依頼済（180））*/
	private static final String[] KOJICHU_KOJIAK_STAT = new String[]{"130", "140", "150", "160", "170", "180"};
	/** 工事案件種別コード(新設) */
	private static final String KOJIAK_SBT_CD_NEW = "001";
	/** 工事案件種別コード（住所変更（新設）） */
	private static final String KOJIAK_SBT_CD_JUUSHOHENKOU = "003";
	/** 異動区分（住所変更・登録） */
	public static final String IDO_DIV_VALUE_00019 = "00019";
	/** 異動予約一覧照会 */
	private static final String TEMPLATE_ID_EKK1681B001 = "EKK1681B001";
	/** 異動予約詳細コード（コース変更） */
	public static final String IDO_RSV_DTL_CD_VALUE_003 = "003";
	/** 異動予約状態コード（未反映）*/
	public static final String IDO_RSV_STAT_CD_VALUE_00 = "00";
	/** 異動予約状態コード（予約手続中）*/
	public static final String IDO_RSV_STAT_CD_VALUE_03 = "03";
	/** 住所変更明細種別コード_機器提供サービス契約番号 */
	private static final String ADCHG_DTL_SBT_CD_KIKI = "03";
	/* ++++++++++ v5.00.00 追加終了 ++++++++++ */
	
	/* ++++++++++ v5.04.00 追加開始 ++++++++++ */
	/** 進捗情報出力判定情報保持  */
	private static final String KKW03301_PRG_WORK = "KKW03301_PRG_WORK";
	/* ++++++++++ v5.04.00 追加完了 ++++++++++ */
	/* ++++++++++ v15.00.00 追加開始 ++++++++++ */
	/** 返品機器取消一覧照会 */
	private static final String TEMPLATE_ID_EDK0301B060 = "EDK0301B060";
	/* ++++++++++ v15.00.00 追加終了 ++++++++++ */
	/* ++++++++++ v5.04.01 変更開始 ++++++++++ */
	/** 機器提供サービス契約返品機器一覧照会 */
	private static final String TEMPLATE_ID_EDK0301B080 = "EDK0301B080";
	/** 機器提供サービス契約返品機器一覧照会 */
	private static final String HMPIN_KIKI_INFO = "hmpin_kiki_info";
	/* ++++++++++ v5.04.01 変更完了 ++++++++++ */
	/* ++++++++++ v5.04.03 追加開始 ++++++++++ */
	/** 機器提供サービスコード(光電話用VA) */
	private static final String KKTK_SVC_CD_C004 = "C004";
	/** 画面一覧パラメータ（処理対象リスト）格納キー */
	private static final String SHORI_LIST_SCRN_PARAM = "scrnIchiranParam";
	/** 更新前リスト（処理対象リスト）格納キー */
	private static final String SHORI_LIST_KIKILIST_BF = "kikiList_bf";
	/** ＶＡ未返却解約チェックCC */
	private static final String JKK_VA_MIHENKYAKU_CHECK_CC = "JKKVaMihenkyakuCheckCC";
	/** チェック結果 */
	private static final String CHECK_RESULT = "check_result";
	/** チェック結果（連携中） */
	private static final String CHECK_RESULT_RENKEI = "1";
	/* ++++++++++ v5.04.03 追加完了 ++++++++++ */
	/* ++++++++++ v10.00.00 追加開始 ++++++++++ */
	/** 異動予約一意照会 */
	private static final String TEMPLATE_ID_EKK1681A010 = "EKK1681A010";
	/** 異動予約異動予約状態変更 */
	private static final String TEMPLATE_ID_EKK1681C010 = "EKK1681C010";
	/* ++++++++++ v10.00.00 追加終了 ++++++++++ */
// ANK-3488-10-00 ADD START
	/** 業務パラメータ管理一意照会 */
	private static final String TEMPLATE_ID_EZM0321A010 = "EZM0321A010";
	/** 機器提供サービス契約一覧照会(サービス契約内訳番号) */
	private static final String TEMPLATE_ID_EKK0341B501 = "EKK0341B501";
	/** 機器提供サービス契約キャンセル */
	private static final String TEMPLATE_ID_EKK0341C330 = "EKK0341C330";
// ANK-3488-10-00 ADD END
// ANK-3412-12-00 ADD START
	/** 機器オプションサービス契約一覧照会（複合検索） */
	private static final String TEMPLATE_ID_EKK2811B504 = "EKK2811B504";
	/** 同一場所サービス契約情報照会 */
	private static final String TEMPLATE_ID_EKK0081B009 = "EKK0081B009";
// ANK-3412-12-00 ADD END
// OM-2019-0001295 ADD START
	/** 機器提供サービス契約解約 */
	private static final String TEMPLATE_ID_EKK0341C340 = "EKK0341C340";
	/** 機器提供サービス契約解約確定 */
	private static final String TEMPLATE_ID_EKK0341C350 = "EKK0341C350";
// OM-2019-0001295 ADD END
// ANK-4315-00-00 ADD START
	/** 異動予約詳細コード（機器コース変更） */
	private static final String IDO_RSV_DTL_CD_KKCOURSECHG = "011";
// ANK-4315-00-00 ADD END
	
	/**
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execKeiChgCan(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		String dataMapKey = fixedText;
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		
		/* ++++++++++ v5.02.01 修正開始 ++++++++++ */
		// エラーフラグ
		ccMsg.put("err_flg", "");

		// メッセージ情報
		ArrayList<HashMap<String, Object>> messageInfo = new ArrayList<HashMap<String, Object>>();

		// メッセージコードリスト
		ccMsg.put("message_list", messageInfo);
		/* ++++++++++ v5.02.01 修正完了 ++++++++++ */
		
		// 一時領域データ
		HashMap<String, Object> temporaryData = new HashMap<String, Object>();
		initializeTempData(ccMsg, temporaryData, param);
		
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		/**
		 * 処理実行
		 */
		
// ANK-3488-10-00 ADD START
		// B-CAS不要HDD容量コード
		List<String> hddCapaBcasnoneList = Arrays.asList(getWorkParamSetteValue(handle, scCall, param, dataMapKey, JKKStrConst.KK_HDD_CAPA_BCASNONE).split(","));
// ANK-3488-10-00 ADD END
		/** EKK0081A010（サービス契約一意照会）*/ 
		CAANMsg ekk0081a010OUT = execEKK0081A010(handle, scCall, param, dataMapKey);
		
		// 最終更新タイムスタンプの更新
		temporaryData.put("最終更新年月日時分秒", ekk0081a010OUT.getObject(EKK0081A010CBSMsg1List.LAST_UPD_DTM));
		
		
		// 上りマッピングで取得した機器提供サービス契約履歴リストを取得する
		List<HashMap<String, Object>> rirekiList = (List<HashMap<String, Object>>)ccMsg.get("rireki_list");
		
		/* ++++++++++ v5.04.01 変更開始 ++++++++++ */
		// 住所変更の場合、機器一覧のデータが表示されないパターンがあるため
		// 機器提供サービス契約カレントの料金コースと返品機器番号を取得して格納します。
		setCurKikiInfo(handle, scCall, param, dataMapKey, temporaryData, rirekiList);
		/* ++++++++++ v5.04.01 変更完了 ++++++++++ */
		
		/* ++++++++++ v5.02.01 追加開始 ++++++++++ */
		if(FUNC_CODE_2.equals((String)ccMsg.get("func_code")))
		{
			// 画面IDチェック(KKW03307以外の場合は実行しない)
			if(SCRN_ID_KKW03307.equals((String)ccMsg.get("check_scrn_id")))
			{
				// サーバーチェック部品呼び出し。（エラーの場合は後続処理を行いません。）
				if(!isKikiInfoServerChkCC(handle, scCall, param, dataMapKey, temporaryData))
				{
					return param;
				}
			}
		}
		/* ++++++++++ v5.02.01 追加完了 ++++++++++ */
		
		HashMap<String, Object> rirekiMap = null;
		/* ++++++++++ v5.01.00 変更開始 ++++++++++ */
		CAANMsg ekk0341a010cbsMsg = null;
		String lastUpdTime = "";
		/* ++++++++++ v5.01.00 変更完了 ++++++++++ */
		
		/* ++++++++++ v5.04.03 追加開始 ++++++++++ */
		// 一覧の情報が格納されているMap
		HashMap<String, String> workIchiranMap = null;
		/* ++++++++++ v5.04.03 追加終了 ++++++++++ */
		
		// 契約変更取消の件数分繰り返す
		for (int i = 0; i < rirekiList.size(); i++)
		{
			// リストから１件取得する。
			rirekiMap = (HashMap<String, Object>)rirekiList.get(i);
			
			/* ++++++++++ v5.01.00 変更開始 ++++++++++ */
			ekk0341a010cbsMsg = getKktkSvcKeiRireki(handle, scCall, param, dataMapKey, rirekiMap);
			// 取得できないことはあり得ない
			if(ekk0341a010cbsMsg == null)
			{
				continue;
			}
			/* ++++++++++ v5.04.03 追加開始 ++++++++++ */
			// 履歴一覧の選択データでMapを作成します。
			workIchiranMap = getMiHnkykRirekiScrnItemMap(rirekiMap);
			// 解約処理ため運用日を機器提供終了年月日（解約日）にセットします。
			workIchiranMap.put("dsl_ymd_edit", (String)param.getControlMapData(SCControlMapKeys.OPE_DATE));

			// 一覧処理マップ
			HashMap<String, Object> ichiranShoriMap = new HashMap<String, Object>();
			// 画面一覧パラメータ（一覧明細の値）を格納
			ichiranShoriMap.put(SHORI_LIST_SCRN_PARAM, workIchiranMap);

			// 更新前データを取得し格納
			ichiranShoriMap.put(SHORI_LIST_KIKILIST_BF, ekk0341a010cbsMsg);
			
			// 機器提供サービスコードを取得
			String kktkSvcCd = ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.KKTK_SVC_CD);
			// VA機器の場合チェックします。
			if(KKTK_SVC_CD_C004.equals(kktkSvcCd))
			{
				// VA電話番号紐付けチェック
				if(!isVAriyochu(handle, scCall, param, dataMapKey, ekk0341a010cbsMsg, ichiranShoriMap))
				{
					// エラーメッセージを設定して処理終了
					setMessageInfo(ccMsg, "EKB1040-JW", "電話番号,紐づいている機器,処理", "", ERR_FLG_ERR);
					return param;
				}
			}
			/* ++++++++++ v5.04.03 追加終了 ++++++++++ */
// ANK-3412-12-00 ADD START
// ANK-4315-00-00 MOD START
//			// 多機能ルーターの場合
//			else if (JKKStrConst.KKTK_SVC_CD_TAKINORT.equals(kktkSvcCd))
			// 多機能ルーター、HGWの場合
			else if (JKKStrConst.KKTK_SVC_CD_TAKINORT.equals(kktkSvcCd) || JKKStrConst.KKTK_SVC_CD_HGW.equals(kktkSvcCd))
// ANK-4315-00-00 MOD END
			{
				// VA機能利用中チェック
				if (!checkVAKinoRiyochu(handle, scCall, param, dataMapKey, ekk0341a010cbsMsg, ekk0081a010OUT))
				{
					// エラーメッセージを設定して処理終了
					setMessageInfo(ccMsg, "EKB1040-JW", "電話番号,紐づいている機器,処理", "", ERR_FLG_ERR);
					return param;
				}
			}
// ANK-3412-12-00 ADD END
			
			lastUpdTime = getNullToStr(ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.LAST_UPD_DTM));
			// 更新年月日時分秒を作業領域に設定
			setSvcUpdDtm(param, lastUpdTime);
			// 最終更新タイムスタンプの更新
			temporaryData.put("最終更新年月日時分秒", lastUpdTime);
			/* ++++++++++ v5.01.00 変更完了 ++++++++++ */
			
			// 料金コースコードが不一致の場合
			if (!rirekiMap.get("rsv_pcrs_cd").equals(rirekiMap.get("pcrs_cd")))
			{
				// ***** EKK0341C170（機器提供サービス契約料金コース変更中止）*****
				CAANMsg ekk0341c170OUT = execEKK0341C170(handle, scCall, param, rirekiMap, temporaryData, dataMapKey);
				
				// 更新年月日時分秒を作業領域に設定
				setSvcUpdDtm(param, ekk0341c170OUT.getString(EKK0341C170CBSMsg.UPD_DTM));
				// 最終更新タイムスタンプの更新
				temporaryData.put("最終更新年月日時分秒", ekk0341c170OUT.getObject(EKK0341C170CBSMsg.UPD_DTM));
			}
			else
			{
				// ***** EKK0341C540（機器提供サービス契約機器変更手続中止）*****
				CAANMsg ekk0341c540OUT = execEKK0341C540(handle, scCall, param, rirekiMap, temporaryData, dataMapKey);
				
//				// 更新年月日時分秒を作業領域に設定
				setSvcUpdDtm(param, ekk0341c540OUT.getString(EKK0341C540CBSMsg.UPD_DTM));
				// 最終更新タイムスタンプの更新
				temporaryData.put("最終更新年月日時分秒", ekk0341c540OUT.getObject(EKK0341C540CBSMsg.UPD_DTM));
// ANK-4315-00-00 ADD START
				// 異動予約取消処理（機器コース変更用）
				cancelIdoRsvKkCourseChg(handle, param, dataMapKey, scCall, ekk0341a010cbsMsg);
// ANK-4315-00-00 ADD END
			}
// ANK-3488-10-00 ADD START
			// BCAS取消処理を行う
			execBcasCancel(handle, scCall, param, dataMapKey, temporaryData, rirekiMap, ekk0081a010OUT, ekk0341a010cbsMsg, hddCapaBcasnoneList);
// ANK-3488-10-00 ADD END
			
			// 返品機器番号がないまたは配送ステータスが出荷済以降の場合、返品機器取消を呼ばない
			/* ++++++++++ v5.04.01 変更開始 ++++++++++ */
			if(isExecHenpinKikiCan(getNullToStr((String)rirekiMap.get("hmpin_kiki_no"))))
			/* ++++++++++ v5.04.01 変更完了 ++++++++++ */
			
			{
				/* ++++++++++ v5.04.01 変更開始 ++++++++++ */
//				// ***** EDK0301A010（返品機器一意照会）*****
//				CAANMsg edk0301a010OUT = execEDK0301A010(handle, scCall, param, rirekiMap, temporaryData, dataMapKey);
				CAANMsg edk0301a010OUT = (CAANMsg)rirekiMap.get(HMPIN_KIKI_INFO);
				/* ++++++++++ v5.04.01 変更完了 ++++++++++ */
				
				// ***** EDK0301C040（返品機器取消）*****
				execEDK0301C040(handle, scCall, param, rirekiMap, temporaryData, edk0301a010OUT, dataMapKey);
			}
			
			/* ++++++++++ v5.02.01 追加開始 ++++++++++ */
			if(isExecHenpinKikiUke( getNullToStr((String)rirekiMap.get("haiso_stat"))) )
			{
				/* ++++++++++ v6.00.01 変更開始 ++++++++++ */
//				// ***** EDK0301D010（返品機器受付）*****
//				execEDK0301D010(handle, scCall, param, rirekiMap, temporaryData, dataMapKey, ekk0341a010cbsMsg);
				if(isCurHmpinKiki(handle, scCall, param, dataMapKey, temporaryData, ekk0341a010cbsMsg))
				{
					// ***** EDK0301D010（返品機器受付）*****
					execEDK0301D010(handle, scCall, param, rirekiMap, temporaryData, dataMapKey, ekk0341a010cbsMsg);
				}
				/* ++++++++++ v6.00.01 変更終了 ++++++++++ */
			}
			/* ++++++++++ v5.02.01 追加完了 ++++++++++ */
			
			/* ++++++++++ v10.00.00 追加開始 ++++++++++ */
			// 異動予約取消処理（STB直送交換用）
			cancelIdoRsv(handle, param, dataMapKey, scCall, ekk0341a010cbsMsg);
			/* ++++++++++ v10.00.00 追加終了 ++++++++++ */
			
			
			/* ++++++++++ v5.00.00 追加開始 ++++++++++ */
			// 住所変更明細更新処理呼び出し
			if(!isExcecJuushoUpdateDtl(handle, scCall, param, dataMapKey, rirekiMap))
			{
				continue;
			}
			/* ++++++++++ v5.00.00 追加終了 ++++++++++ */
		}
		
		// ***** EKK1091D010（進捗登録）*****
		execEKK1091D010(handle, scCall, param, rirekiMap, temporaryData, ekk0081a010OUT, dataMapKey);
		
		return param;
	}

	/* ++++++++++ v10.00.00 追加開始 ++++++++++ */
	/**
	 * STB直送出荷の異動予約の取消を行う
	 * @param handle
	 * @param param
	 * @param dataMapKey
	 * @param scCall
	 * @param ekk0341a010cbsMsg
	 * @throws Exception
	 */
	private void cancelIdoRsv(SessionHandle handle,
			IRequestParameterReadWrite param, String dataMapKey,
			ServiceComponentRequestInvoker scCall, CAANMsg ekk0341a010cbsMsg)
			throws Exception {
		
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		
		// ***** EKK1681B001（異動予約一覧照会）*****
		String kktkSvcKeiNo = ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO);
		String kikiChgNo = ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.KIKI_CHG_NO);
		Object[][] ekk1681b001IN = { 
				{ EKK1681B001CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1681B001 }, 
				{ EKK1681B001CBSMsg.FUNC_CODE, "1" },
				{ EKK1681B001CBSMsg.KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo },		// ＫＥＹ＿機器提供サービス契約番号
				{ EKK1681B001CBSMsg.KEY_IDO_RSV_DTL_CD, "029" },				// ＫＥＹ＿異動予約詳細コード	「029（STB直送出荷）」固定
				{ EKK1681B001CBSMsg.KEY_IDO_RSV_STAT_CD, "00,03" }				// ＫＥＹ＿異動予約状態コード	「00（未反映）」「03（予約手続中）」
		};
		
		CAANMsg[] ekk1681b001cbsMsg1list = callSC(handle, scCall, param, dataMapKey, ekk1681b001IN).getCAANMsgList(EKK1681B001CBSMsg.EKK1681B001CBSMSG1LIST);
		
		if(ekk1681b001cbsMsg1list != null)
		{
			for(CAANMsg ekk1681Template : ekk1681b001cbsMsg1list){
				// 異動予約から新機器変更番号を取得
				String newKikiChgNo = getNullToStr(ekk1681Template.getString(EKK1681B001CBSMsg1List.NEW_KIKI_CHG_NO));
				
				// 機器変更番号が新機器変更番号と一致
				if(kikiChgNo.equals(newKikiChgNo)){
					
					String idoRsvNo = getNullToStr(ekk1681Template.getString(EKK1681B001CBSMsg1List.IDO_RSV_NO));
					// ***** EKK1681A010（異動予約一意照会）*****
					Object[][] ekk1681a010IN = {
							{ EKK1681A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1681A010 }, 
							{ EKK1681A010CBSMsg.FUNC_CODE, "1" },
							{ EKK1681A010CBSMsg.KEY_IDO_RSV_NO, idoRsvNo }		// ＫＥＹ＿異動予約番号
					};
					
					CAANMsg[] ekk1681a010cbsMsg1list = callSC(handle, scCall, param, dataMapKey, ekk1681a010IN).getCAANMsgList(EKK1681A010CBSMsg.EKK1681A010CBSMSG1LIST);
					
					if(ekk1681a010cbsMsg1list != null && ekk1681a010cbsMsg1list.length > 0)
					{
						CAANMsg ekk1681a010Template = ekk1681a010cbsMsg1list[0];
						
						String updDtm = getNullToStr(ekk1681a010Template.getString(EKK1681A010CBSMsg1List.UPD_DTM));
						// ***** EKK1681C010（異動予約異動予約状態変更）*****
						Object[][] ekk1681c010IN = { 
								{ EKK1681C010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1681C010 }, 
								{ EKK1681C010CBSMsg.FUNC_CODE, ccMsg.get("func_code") },
								{ EKK1681C010CBSMsg.IDO_RSV_NO,  idoRsvNo},									// 異動予約番号
								{ EKK1681C010CBSMsg.IDO_RSV_CL_YMD,  JPCBPCommon.getOpeDate(null)},			// 異動予約取消年月日
								{ EKK1681C010CBSMsg.IDO_RSV_STAT_CD, "02" },								// 異動予約状態コード
								{ EKK1681C010CBSMsg.UPD_DTM_BF,  updDtm}									// 更新年月日時分秒(更新前)
						};
						
						// サービスインターフェースの実行
						callSC(handle, scCall, param, dataMapKey, ekk1681c010IN);
					}
				}
			}
		}
	}
	/* ++++++++++ v10.00.00 追加終了 ++++++++++ */
// ANK-4315-00-00 ADD START
	/**
	 * 機器コース変更の異動予約の取消を行う
	 * @param handle
	 * @param param
	 * @param dataMapKey
	 * @param scCall
	 * @param ekk0341a010cbsMsg
	 * @throws Exception
	 */
	private void cancelIdoRsvKkCourseChg(SessionHandle handle,
			IRequestParameterReadWrite param, String dataMapKey,
			ServiceComponentRequestInvoker scCall, CAANMsg ekk0341a010cbsMsg)
			throws Exception {
		
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		
		// ***** EKK1681B001（異動予約一覧照会）*****
		String kktkSvcKeiNo = ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO);
		Object[][] ekk1681b001IN = { 
				{ EKK1681B001CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1681B001 }, 
				{ EKK1681B001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
				{ EKK1681B001CBSMsg.KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo },							// ＫＥＹ＿機器提供サービス契約番号
				{ EKK1681B001CBSMsg.KEY_IDO_RSV_DTL_CD, IDO_RSV_DTL_CD_KKCOURSECHG },				// ＫＥＹ＿異動予約詳細コード	「011（機器コース変更）」固定
				{ EKK1681B001CBSMsg.KEY_IDO_RSV_STAT_CD, JKKStrConst.CD01168_IDO_RSV_STAT_CD_04 }	// ＫＥＹ＿異動予約状態コード	「04（異動予約対象外）」」固定
		};
		
		CAANMsg[] ekk1681b001cbsMsg1list = callSC(handle, scCall, param, dataMapKey, ekk1681b001IN).getCAANMsgList(EKK1681B001CBSMsg.EKK1681B001CBSMSG1LIST);
		
		if(ekk1681b001cbsMsg1list != null)
		{
			for(CAANMsg ekk1681Template : ekk1681b001cbsMsg1list)
			{
				// 異動予約から予約適用年月日を取得
				String rsvAplyYmd = getNullToStr(ekk1681Template.getString(EKK1681B001CBSMsg1List.RSV_APLY_YMD));
				
				// 予約適用年月日が運用日付より未来日のレコードが対象
				if(rsvAplyYmd.compareTo(JPCBPCommon.getOpeDate(null)) > 0)
				{
					
					String idoRsvNo = getNullToStr(ekk1681Template.getString(EKK1681B001CBSMsg1List.IDO_RSV_NO));
					// ***** EKK1681A010（異動予約一意照会）*****
					Object[][] ekk1681a010IN = {
							{ EKK1681A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1681A010 }, 
							{ EKK1681A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
							{ EKK1681A010CBSMsg.KEY_IDO_RSV_NO, idoRsvNo }		// ＫＥＹ＿異動予約番号
					};
					
					CAANMsg[] ekk1681a010cbsMsg1list = callSC(handle, scCall, param, dataMapKey, ekk1681a010IN).getCAANMsgList(EKK1681A010CBSMsg.EKK1681A010CBSMSG1LIST);
					
					if(ekk1681a010cbsMsg1list != null && ekk1681a010cbsMsg1list.length > 0)
					{
						CAANMsg ekk1681a010Template = ekk1681a010cbsMsg1list[0];
						
						String updDtm = getNullToStr(ekk1681a010Template.getString(EKK1681A010CBSMsg1List.UPD_DTM));
						// ***** EKK1681C010（異動予約異動予約状態変更）*****
						Object[][] ekk1681c010IN = { 
								{ EKK1681C010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1681C010 }, 
								{ EKK1681C010CBSMsg.FUNC_CODE, ccMsg.get("func_code") },
								{ EKK1681C010CBSMsg.IDO_RSV_NO,  idoRsvNo},										// 異動予約番号
								{ EKK1681C010CBSMsg.IDO_RSV_CL_YMD,  JPCBPCommon.getOpeDate(null)},				// 異動予約取消年月日
								{ EKK1681C010CBSMsg.IDO_RSV_STAT_CD, JKKStrConst.CD01168_IDO_RSV_STAT_CD_02 },	// 異動予約状態コード
								{ EKK1681C010CBSMsg.UPD_DTM_BF,  updDtm}										// 更新年月日時分秒(更新前)
						};
						
						// サービスインターフェースの実行
						callSC(handle, scCall, param, dataMapKey, ekk1681c010IN);
					}
				}
			}
		}
	}
// ANK-4315-00-00 ADD END
	
	/* ++++++++++ v5.04.01 変更開始 ++++++++++ */
	/**
	 * 返品機器番号、配送ステータスから返品機器取消実行するか判定します。
	 * <br>
	 * @param hmpin_kiki_no
	 * @return
	 */
	private boolean isExecHenpinKikiCan(String hmpin_kiki_no)
	{

		// 返品機器番号が設定なら true, 未設定なら false
		return !"".equals(hmpin_kiki_no);
	}
	/* ++++++++++ v5.04.01 変更完了 ++++++++++ */
	
	/* ++++++++++ v5.02.01 追加開始 ++++++++++ */
	/**
	 * 配送ステータスが"完了済み"かチェックする
	 * <br>
	 * @param haiso_stat
	 * @return
	 */
	private boolean isExecHenpinKikiUke(String haiso_stat)
	{
		/* ++++++++++ v5.03.00 修正開始 ++++++++++ */
//		return HAISO_STAT_004.equals(haiso_stat);
		
		return (HAISO_STAT_002.equals(haiso_stat) || HAISO_STAT_003.equals(haiso_stat) || HAISO_STAT_004.equals(haiso_stat));
		/* ++++++++++ v5.03.00 修正完了 ++++++++++ */
	}
	/* ++++++++++ v5.02.01 追加完了 ++++++++++ */
	
	/**
	 * 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);
		Integer 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;
	}

	/**
	 * @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));
		
		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", (String)mappingData[0][1]));
		
		// オペレータ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
	 * @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 (returnCode != 0)
		{
			templateStatus = 9000;
		}
		
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}
		
		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		HashMap<String, String> inMap = null;
		// ユーザデータ情報
		inMap = (HashMap<String, String>)param.getData(dataMapKey);
		
		for (int i = 0; i < mappingData.length; i++)
		{
			if (((String)mappingData[i][0]).startsWith("key_"))
			{
				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;
	}

	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param dataMapKey
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int returnCode,
														String dataMapKey) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (returnCode != 0)
		{
			templateStatus = 9000;
		}
		
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}
		
		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		HashMap<String, String> inMap = null;
		// ユーザデータ情報
		inMap = (HashMap<String, String>)param.getData(dataMapKey);
		
		Iterator<String> it = inMap.keySet().iterator();
		while (it.hasNext())
		{
			String key = it.next();
			if (key.endsWith("_err"))
			{
				if (!template.isNull(key))
				{
					if (!inMap.containsKey(key))
					{
						inMap.put(key, template.getString(key));
					}
				}
			}
		}
		return param;
	}

	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @param inListMsgName
	 * @param inList
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSCArray(SessionHandle handle, 
									ServiceComponentRequestInvoker scCall, 
									IRequestParameterReadWrite param, 
									String dataMapKey,
									Object[][] mappingData,
									String inListMsgName, 
									ArrayList<HashMap<String, Object>> inList
									) throws Exception
	{
		HashMap<String, Object> paramMap = editInArrayMsg(param, mappingData, inListMsgName, inList);
		
		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);
		
		editErrorInfoComArray(param, templates, (Integer)return_code, dataMapKey, mappingData, inListMsgName, inList);
		
		//エラー情報のマップを取得
		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;
	}

	/**
	 * @param param
	 * @param mappingData
	 * @param inListMsgName
	 * @param inList
	 * @return
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> editInArrayMsg(IRequestParameterReadWrite param,
													Object[][] mappingData, 
													String inListMsgName, 
													ArrayList<HashMap<String, Object>> inList) 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[] templateArray = template.getCAANMsgList(inListMsgName);
		
		if (templateArray == null)
		{
			templateArray = new CAANMsg[inList.size()];
		}
		
		for (int i = 0; i < inList.size(); i++)
		{
			HashMap childMap = (HashMap)inList.get(i);
			CAANMsg childTemplate = templateArray[i];
			if (childTemplate == null)
			{
				childTemplate = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg1List", svcIf));
			}
			
			Iterator it = childMap.keySet().iterator();
			while (it.hasNext())
			{
				String key = (String)it.next();
				
				if ("".equals(childMap.get(key)))
				{
					childTemplate.setNull(key);
				}
				else
				{
					childTemplate.set(key, (String)childMap.get(key));
				}
			}
			templateArray[i] = childTemplate;
		}
		template.set(inListMsgName, templateArray);
		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
	 * @param inListMsgName
	 * @param inList
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoComArray(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int returnCode,
														String dataMapKey,
														Object[][] mappingData,
														String inListMsgName, 
														ArrayList<HashMap<String, Object>> inList) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (returnCode != 0)
		{
			templateStatus = 9000;
		}
		
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}
		
		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		HashMap<String, String> inMap = (HashMap<String, String>)param.getData(dataMapKey);
		CAANMsg[] templateArray = template.getCAANMsgList(inListMsgName);
		
		for (int i = 0; i < inList.size(); i++)
		{
			HashMap childMap = (HashMap)inList.get(i);
			CAANMsg childTemplate = templateArray[i];
			
			Iterator it = childMap.keySet().iterator();
			while (it.hasNext())
			{
				String key = (String)it.next();
				if (!childTemplate.isNull(key + "_err"))
				{
					if (!inMap.containsKey(key + "_err"))
					{
						inMap.put(key + "_err", childTemplate.getString(key + "_err"));
					}
				}
			}
		}
		if (!template.isNull(inListMsgName + "_err"))
		{
			if (!inMap.containsKey(inListMsgName + "_err"))
			{
				inMap.put(inListMsgName + "_err", template.getString(inListMsgName + "_err"));
			}
		}
		return param;
	}

	/**
	 * 
	 * @param ccMsg
	 * @param tempData
	 * @throws RequestParameterException 
	 */
	private void initializeTempData(HashMap<String, Object> ccMsg, HashMap<String, Object> tempData, IRequestParameterReadWrite param) 
		throws RequestParameterException
	{
		// 作業領域の取得
		Map<Object, Object> workMap = param.getMappingWorkArea();
		if (workMap.get(KK_COM_SVC_UP_DTM) == null || "".equals(workMap.get(KK_COM_SVC_UP_DTM)))
		{
			tempData.put("最終更新年月日時分秒", ccMsg.get("upd_dtm_svc_kei"));
		}
		else
		{
			tempData.put("最終更新年月日時分秒", (String)workMap.get(KK_COM_SVC_UP_DTM));
		}
	}

	/**
	 * チェック処理用サービスインターフェイス作成。<br>
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return サービスコンポーネント実行用CAANMsg
	 * @exception RequestParameterExceptionがスローされます。
	 */
	@SuppressWarnings("unchecked")
	public  HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		List<CAANMsg> templates = new ArrayList<CAANMsg>();
		
		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());
		
		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		
		// チェック用サービスインターフェイス
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, Arrays.asList(templates));
		return paramMap;
	}

	/**
	 * IRequestParameterReadWriteにエラー情報をマッピングする。<br>
	 * <br>
	 * @param param (I) 業務データ取得・書込用I/F
	 * @param templates (I) CAANMsgクラス配列
	 * @param returnCode (I) リターンコード
	 * @param fixedText (I) ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @exception RequestParameterExceptionがスローされます。
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, String fixedText)
	throws RequestParameterException
	{
		for (int i = 0; i < templates.length; i++)
		{
			editErrorInfoCom(param, templates, returnCode, fixedText);
		}
		return param;
	}

	/**
	 * サービス契約の更新タイムスタンプを取得します。
	 * @param param リクエストパラメータ
	 * @param updDtm 更新時間
	 * @throws Exception 
	 */
	private void setSvcUpdDtm(IRequestParameterReadWrite param, String updDtm) throws Exception
	{
		// 作業領域の取得
		Map<Object, Object> workMap = param.getMappingWorkArea();
		if (updDtm != null && !"".equals(updDtm))
		{
			workMap.put(KK_COM_SVC_UP_DTM, updDtm);
		}
	}
	
	/**
	 * 機器提供サービス契約一意照会メソッド
	 * <br>
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param temporaryData
	 * @param ekk0341a010cbsMsg
	 * @return 
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg execEKK0081A010(SessionHandle handle, 
										ServiceComponentRequestInvoker scCall, 
										IRequestParameterReadWrite param, 
										String dataMapKey) throws Throwable
	{
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		
		// ***** EKK0081A010（サービス契約一意照会）*****
		Object[][] ekk0081a010IN = {
			{EKK0081A010CBSMsg.TEMPLATEID,       TEMPLATE_ID_EKK0081A010},
			{EKK0081A010CBSMsg.FUNC_CODE,        "2"},
			{EKK0081A010CBSMsg.KEY_SVC_KEI_NO,   ccMsg.get("svc_kei_no")},
			{EKK0081A010CBSMsg.KEY_GENE_ADD_DTM, ""},
			{EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null)},
		};
		
		return callSC(handle, scCall, param, dataMapKey, ekk0081a010IN).getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST)[0];
	}
	
	
	/**
	 * 機器提供サービス契約料金コース変更中止メソッド
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param rirekiMap
	 * @param temporaryData
	 * @param dataMapKey
	 * @return
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg execEKK0341C170(SessionHandle handle, 
									ServiceComponentRequestInvoker scCall, 
									IRequestParameterReadWrite param, 
									HashMap<String, Object> rirekiMap,
									HashMap<String, Object> temporaryData,
									String dataMapKey) throws Throwable
	{
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		
		// ***** EKK0341C170（機器提供サービス契約料金コース変更中止）*****
		Object[][] ekk0341c170IN = {
			{EKK0341C170CBSMsg.TEMPLATEID,      TEMPLATE_ID_EKK0341C170},
			{EKK0341C170CBSMsg.FUNC_CODE,       ccMsg.get("func_code")},
			{EKK0341C170CBSMsg.KKTK_SVC_KEI_NO, rirekiMap.get("kktk_svc_kei_no")},
			{EKK0341C170CBSMsg.GENE_ADD_DTM,    rirekiMap.get("gene_add_dtm")},
			{EKK0341C170CBSMsg.UPD_DTM_BF,      temporaryData.get("最終更新年月日時分秒")}
		};
		
		return 	callSC(handle, scCall, param, dataMapKey, ekk0341c170IN);
	}
	
	/**
	 * 機器提供サービス契約機器変更手続中止メソッド
	 * <br>
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param rirekiMap
	 * @param temporaryData
	 * @param dataMapKey
	 * @return
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg execEKK0341C540(SessionHandle handle, 
									ServiceComponentRequestInvoker scCall, 
									IRequestParameterReadWrite param, 
									HashMap<String, Object> rirekiMap,
									HashMap<String, Object> temporaryData,
									String dataMapKey) throws Throwable
	{
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		
		// ***** EKK0341C540（機器提供サービス契約機器変更手続中止）*****
		Object[][] ekk0341c540IN = {
			{EKK0341C540CBSMsg.TEMPLATEID,      TEMPLATE_ID_EKK0341C540},
			{EKK0341C540CBSMsg.FUNC_CODE,       ccMsg.get("func_code")},
			{EKK0341C540CBSMsg.KKTK_SVC_KEI_NO, rirekiMap.get("kktk_svc_kei_no")},
			{EKK0341C540CBSMsg.GENE_ADD_DTM,    rirekiMap.get("gene_add_dtm")},
			{EKK0341C540CBSMsg.RSV_CL_YMD,      JPCBPCommon.getOpeDate(null)},
			{EKK0341C540CBSMsg.RSV_APLY_CD,     RSV_APLY_CD_3},
			{EKK0341C540CBSMsg.UPD_DTM_BF,      temporaryData.get("最終更新年月日時分秒")}
		};
		
		return callSC(handle, scCall, param, dataMapKey, ekk0341c540IN);
	}
	
	/* ++++++++++ v5.04.01 変更開始 ++++++++++ */
	/**
	 * 返品機器一意照会メソッド
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param hmpin_kiki_no
	 * @param temporaryData
	 * @param dataMapKey
	 * @return
	 * @throws Throwable
	 */
	private CAANMsg execEDK0301A010(SessionHandle handle, 
									ServiceComponentRequestInvoker scCall, 
									IRequestParameterReadWrite param, 
									String hmpin_kiki_no,
									HashMap<String, Object> temporaryData,
									String dataMapKey) throws Throwable
	{
		
		// ***** EDK0301A010（返品機器一意照会）*****
		Object[][] edk0301a010IN = {
			{EDK0301A010CBSMsg.TEMPLATEID,        TEMPLATE_ID_EDK0301A010},
			{EDK0301A010CBSMsg.FUNC_CODE,         "1"},
			{EDK0301A010CBSMsg.KEY_HMPIN_KIKI_NO, hmpin_kiki_no},
			{EDK0301A010CBSMsg.KEY_UNYO_YMD,      JPCBPCommon.getOpeDate(null)},
			{EDK0301A010CBSMsg.KEY_BTRYHOZN_NO,   ""}
		};
		
		return  callSC(handle, scCall, param, dataMapKey, edk0301a010IN).getCAANMsgList(EDK0301A010CBSMsg.EDK0301A010CBSMSG1LIST)[0];
	}
	/* ++++++++++ v5.04.01 変更完了 ++++++++++ */
	
	
	/**
	 * 返品機器取消実行メソッド
	 * <br>
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param rirekiMap
	 * @param temporaryData
	 * @param edk0301a010OUT
	 * @param dataMapKey
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void execEDK0301C040(SessionHandle handle, 
									ServiceComponentRequestInvoker scCall, 
									IRequestParameterReadWrite param, 
									HashMap<String, Object> rirekiMap,
									HashMap<String, Object> temporaryData,
									CAANMsg edk0301a010OUT,
									String dataMapKey) throws Throwable
	{
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		
		// ***** EDK0301C040（返品機器取消）*****
		Object[][] edk0301c040IN = {
			{EDK0301C040CBSMsg.TEMPLATEID,        TEMPLATE_ID_EDK0301C040},
			{EDK0301C040CBSMsg.FUNC_CODE,         ccMsg.get("func_code")},
			{EDK0301C040CBSMsg.KEY_HMPIN_KIKI_NO, rirekiMap.get("hmpin_kiki_no")},
			{EDK0301C040CBSMsg.LAST_UPD_DTM_BF,   edk0301a010OUT.getString(EDK0301A010CBSMsg1List.UPD_DTM)}
		};
		callSC(handle, scCall, param, dataMapKey, edk0301c040IN);
	}
	
	
	
	@SuppressWarnings("unchecked")
	private void execEKK1091D010(SessionHandle handle, 
									ServiceComponentRequestInvoker scCall, 
									IRequestParameterReadWrite param, 
									HashMap<String, Object> rirekiMap,
									HashMap<String, Object> temporaryData,
									CAANMsg ekk0081a010OUT,
									String dataMapKey) throws Throwable
	{
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		
		/* ++++++++++ v5.04.00 追加開始 ++++++++++ */
		// 進捗ステータスに該当する進捗レコードが出力済みか判定する。
		if(!isExecShinchokuToroku(param, PRG_STAT_3503, ""))
		{
			return;
		}
		/* ++++++++++ v5.04.00 追加完了 ++++++++++ */
		
		// ***** EKK1091D010（進捗登録）*****
		Object[][] ekk1091d010IN = {
			{EKK1091D010CBSMsg.TEMPLATEID,             TEMPLATE_ID_EKK1091D010},
			{EKK1091D010CBSMsg.FUNC_CODE,              ccMsg.get("func_code")},
			{EKK1091D010CBSMsg.MSKM_DTL_NO,            ekk0081a010OUT.getString(EKK0081A010CBSMsg1List.MSKM_DTL_NO)},
			{EKK1091D010CBSMsg.SEIKY_KEI_NO,           ""},
			{EKK1091D010CBSMsg.SEIKY_WAY_NO_KOZA,      ""},
			{EKK1091D010CBSMsg.SEIKY_WAY_NO_CRECARD,   ""},
			{EKK1091D010CBSMsg.SVC_KEI_NO,             ccMsg.get("svc_kei_no")},
			{EKK1091D010CBSMsg.SVC_KEI_UCWK_NO,        ""},
			{EKK1091D010CBSMsg.SVC_KEI_KAISEN_UCWK_NO, ""},
			{EKK1091D010CBSMsg.KKTK_SVC_KEI_NO,        ""},
			{EKK1091D010CBSMsg.OP_SVC_KEI_NO,          ""},
			{EKK1091D010CBSMsg.SEIOPSVC_KEI_NO,        ""},
			{EKK1091D010CBSMsg.SBOP_SVC_KEI_NO,        ""},
			{EKK1091D010CBSMsg.WRIB_SVC_KEI_NO,        ""},
			{EKK1091D010CBSMsg.IDO_DIV,                ccMsg.get("ido_div")},
			
			/* ++++++++++ v4.01.00 修正開始 ++++++++++ */
//			{EKK1091D010CBSMsg.IDO_DTM,                JPCBPCommon.getOpeDateTimeStamp(null)},
			{EKK1091D010CBSMsg.IDO_DTM,                getIdoUpDtm(param)},
			/* ++++++++++ v4.01.00 修正完了 ++++++++++ */
			/* ++++++++++ v5.04.00 修正開始 ++++++++++ */
//			{EKK1091D010CBSMsg.PRG_STAT,               PRG_STAT_9911},
			{EKK1091D010CBSMsg.PRG_STAT,               PRG_STAT_3503},
			/* ++++++++++ v5.04.00 修正完了 ++++++++++ */
			{EKK1091D010CBSMsg.PRG_MEMO,               ""},
			{EKK1091D010CBSMsg.PRG_TKJK_1,             ""},
			{EKK1091D010CBSMsg.PRG_TKJK_2,             ""}
		};
		ArrayList<HashMap<String, Object>> inList = new ArrayList<HashMap<String, Object>>();
		ArrayList<HashMap<String, Object>> outList = (ArrayList)ccMsg.get("EKK1091D010CBSMsg1List");
		if (outList != null)
		{
			HashMap childMap = null;
			HashMap<String, Object> inMap = null;
			for (int j = 0; j < outList.size(); j++)
			{
				childMap = (HashMap)outList.get(j);
				inMap = new HashMap<String, Object>();
				// 進捗登録マップ.異動理由明細.異動理由コード → 異動理由明細.異動理由コード
				inMap.put(EKK1091D010CBSMsg1List.IDO_RSN_CD, childMap.get("ido_rsn_cd"));
				// 異動理由メモ
				inMap.put(EKK1091D010CBSMsg1List.IDO_RSN_MEMO, "");
				inList.add(inMap);
			}
		}
		// サービスインターフェース実行
		callSCArray(handle, scCall, param, dataMapKey, ekk1091d010IN, "EKK1091D010CBSMsg1List", inList);
		
		/* ++++++++++ v5.04.00 追加開始 ++++++++++ */
		setShinchokuTkjk(param, PRG_STAT_3503, "");
		/* ++++++++++ v5.04.00 追加完了 ++++++++++ */
	}
	
	/* ++++++++++ v5.04.00 追加開始 ++++++++++ */
	/**
	 * 進捗出力内容から進捗情報を出力するか判定します。
	 * <br>
	 * @param param
	 * @param dataMapKey
	 * @return true:出力する false:出力しない。
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private boolean isExecShinchokuToroku(IRequestParameterReadWrite param, 
											String prg_stat,
											String prg_tkjk) throws Throwable
	{
		// 作業領域の取得
		Map<Object, Object> workMap = param.getMappingWorkArea();
		
		// ワーク領域より処理一覧を取得
		HashMap<String, Object> prg_work_map = (HashMap<String, Object>)workMap.get(KKW03301_PRG_WORK);
		
		// 未設定の場合、進捗未出力として進捗登録を行う。
		if(prg_work_map == null)
		{
			return true;
		}
		
		// 進捗ステータスの存在チェック
		if(!prg_work_map.containsKey(prg_stat))
		{
			// 該当進捗ステータス未出力として進捗登録を行う。
			return true;
		}
		else
		{
			HashMap<String, Object> prg_stat_map = (HashMap<String, Object>)prg_work_map.get(prg_stat);
			
			if(prg_stat_map.containsKey(prg_tkjk))
			{
				// 進捗ステータス+特記事項が存在するため進捗登録は行わない
				return false;
			}
		}
		
		return true;
	}
	
	/**
	 * 進捗情報をworkMapに保持します。
	 * 
	 * @param param
	 * @param prg_stat
	 * @param prg_tkjk
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void setShinchokuTkjk(IRequestParameterReadWrite param, 
									String prg_stat,
									String prg_tkjk) throws Throwable
	{
		// 作業領域の取得
		Map<Object, Object> workMap = param.getMappingWorkArea();
		
		// ワーク領域より処理一覧を取得
		HashMap<String, Object> prg_work_map = (HashMap<String, Object>)workMap.get(KKW03301_PRG_WORK);
		
		// 未設定の場合、初期化後再設定
		if(prg_work_map == null)
		{
			prg_work_map = new HashMap<String, Object>();
			workMap.put(KKW03301_PRG_WORK, prg_work_map);
		}
		
		if(prg_work_map.containsKey(prg_stat))
		{
			// key_進捗ステータスが存在する場合、追加する。
			HashMap<String, Object> prg_stat_map = (HashMap<String, Object>)prg_work_map.get(prg_stat);
			
			prg_stat_map.put(prg_tkjk, "");
		}
		else
		{
			// key_進捗ステータスが存在しない場合、新規追加する。
			HashMap<String, Object> prg_stat_map = new HashMap<String, Object>();
			
			prg_stat_map.put(prg_tkjk, "");
			
			prg_work_map.put(prg_stat, prg_stat_map);
			
		}
	}
	/* ++++++++++ v5.04.00 追加完了 ++++++++++ */
	
	/* ++++++++++ v4.01.00 修正開始 ++++++++++ */
	/**
	 * ワーク領域に保持している異動年月日時分秒を取得します。
	 * 設定値がない場合は共通部品より取得します。
	 * <br>
	 * @param param リクエストパラメータ
	 * @return UpDtm 更新時間
	 * @throws Exception
	 */
	private String getIdoUpDtm(IRequestParameterReadWrite param) throws Exception
	{
		// 作業領域の取得
		Map<Object, Object> workMap = param.getMappingWorkArea();
		
		if("".equals(getNullToStr((String)workMap.get(KK_COM_IDO_UP_DTM))))
		{
			// 未設定時のみworkMapに新規格納
			workMap.put(KK_COM_IDO_UP_DTM, (JPCBPCommon.getSysDateTimeStamp()));
		}
		// workMapから取得
		return (String)workMap.get(KK_COM_IDO_UP_DTM);
	}
	
	/**
	 * パラメタがNullの場合空白を返却します。
	 * @param str 文字列
	 * @return str
	 */
	private String getNullToStr(String str)
	{
		if (str == null || "".equals(str.trim()))
		{
			return "";
		}
		return str;
	}
	/* ++++++++++ v4.01.00 修正完了 ++++++++++ */
	
	/* ++++++++++ v5.00.00 追加開始 ++++++++++ */
	/**
	 * サービス契約_工事案件一覧照会<br>
	 * <br>
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @return CAANMsg[]
	 * @throws Exception
	 */
	private CAANMsg[] execEKU0081B010(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param,
			String dataMapKey, HashMap<String, Object> ccMsg) throws Throwable
	{
		// ***** EKU0081B010（サービス契約_工事案件一覧照会）******
		Object[][] eku0081b010IN = {
				{ EKU0081B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKU0081B010 },
				{ EKU0081B010CBSMsg.FUNC_CODE, FUNC_CODE_1 },
				{ EKU0081B010CBSMsg.KEY_SVC_KEI_NO, ccMsg.get("svc_kei_no") },
				{ EKU0081B010CBSMsg.KEY_KOJIAK_NO, "" }
		};
		
		// サービス契約_工事案件一覧照会サービスインターフェイスの実行
		CAANMsg[] eku0081b010cbsMsg1list = callSC(handle, scCall, param, dataMapKey, eku0081b010IN).getCAANMsgList(
				EKU0081B010CBSMsg.EKU0081B010CBSMSG1LIST);

		return eku0081b010cbsMsg1list;
	}
	
	/**
	 * 工事案件一意照会を取得。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMap
	 * @param fixedText
	 * @return CAANMsg[]
	 * @throws Exception
	 */
	private CAANMsg[] execEKU0011A010(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param,
			String kojiAkNo, String dataMapKey) throws Exception
	{
		// ***** EKU0011A010（工事案件一意照会）*****
		Object[][] eku0011a010IN = {
		{ EKU0011A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKU0011A010 },
		{ EKU0011A010CBSMsg.FUNC_CODE, "1" },
		{ EKU0011A010CBSMsg.KEY_KOJIAK_NO, kojiAkNo } };

		CAANMsg[] EKU0011A010cbsMsg1list = callSC(handle, scCall, param, dataMapKey, eku0011a010IN).getCAANMsgList(EKU0011A010CBSMsg.EKU0011A010CBSMSG1LIST);

		return EKU0011A010cbsMsg1list;
	}
	
	/**	
	 * 工事案件工事中判断メソッド
	 * <dd>メソッド名：
	 * <dd>メソッド説明：工事が完了していないか判断します。
	 * <dd>備考：
	 * @param kojiStat
	 * @return boolean
	 */
	private boolean isKinkyuKojiakNo(String kojiStat)
	{
		for (int i = 0; i < KOJICHU_KOJIAK_STAT.length; i++)
		{
			if(KOJICHU_KOJIAK_STAT[i].equals(kojiStat))
			{
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 異動予約一覧照会メソッド<br>
	 * <br>
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @return CAANMsg[]
	 * @throws Exception
	 */
	private CAANMsg[] execEKK1681B001Tv(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param,
			String dataMapKey, String idoDiv) throws Exception
	{
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);

		// ***** EKK1681B001（異動予約一覧照会）******
		Object[][] ekk1681b001IN = {
				{ EKK1681B001CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1681B001 },
				{ EKK1681B001CBSMsg.FUNC_CODE, FUNC_CODE_1 }, // "1"固定
				{ EKK1681B001CBSMsg.KEY_IDO_DIV, idoDiv },
				{ EKK1681B001CBSMsg.KEY_IDO_RSV_DTL_CD, IDO_RSV_DTL_CD_VALUE_003 }, // コース変更
				{ EKK1681B001CBSMsg.KEY_RSV_APLY_YMD, ccMsg.get("unyo_ymd") },
				{ EKK1681B001CBSMsg.KEY_IDO_RSV_STAT_CD, IDO_RSV_STAT_CD_VALUE_00 + "," + IDO_RSV_STAT_CD_VALUE_03 }, // 未反映、予約手続中
				{ EKK1681B001CBSMsg.KEY_SVC_KEI_NO, ccMsg.get("svc_kei_no") } };

		// 異動予約一覧照会サービスインターフェイスの実行
		CAANMsg[] ekk1681b001cbsMsg1list = callSC(handle, scCall, param, dataMapKey, ekk1681b001IN).getCAANMsgList(
				EKK1681B001CBSMsg.EKK1681B001CBSMSG1LIST);

		return ekk1681b001cbsMsg1list;
	}
	
	/**
	 * 住所変更明細処理判定
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param kikiEditKbn
	 * @param kojiakNoKakutei
	 * @throws Throwable 
	 */
	private boolean isExcecJuushoUpdateDtl(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param,
			String dataMapKey, HashMap<String, Object> rirekiMap) throws Throwable
	{
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		
		// 工事案件種別コード
		String kojiakSbtCd = "";
		// 工事案件ステータス
		String kojiakStat = "";
		// 工事案件番号
		String kojiakNo = "";
		
		// 工事受付契機異動区分
		String kojiUkOptntyIdoDiv = "";
		
		CAANMsg[] eku0011A010cbsMsg1list = null;
		// サービス契約_工事案件一覧照会
		CAANMsg[] eku0081b010CbsMsg1List = execEKU0081B010(handle, scCall, param, dataMapKey, ccMsg);
		
		// 工事案件が無いため処理しない
		if(eku0081b010CbsMsg1List == null || eku0081b010CbsMsg1List.length == 0)
		{
			return false;
		}
		
		for (CAANMsg eku0081b010CbsMsg : eku0081b010CbsMsg1List)
		{
			kojiakNo = getNullToStr(eku0081b010CbsMsg.getString(EKU0081B010CBSMsg1List.KOJIAK_NO));
			
			eku0011A010cbsMsg1list = execEKU0011A010(handle, scCall, param, kojiakNo, dataMapKey);
	
			// 工事案件ステータスが工事中以外の場合処理しない。
			if(!isKinkyuKojiakNo(getNullToStr(eku0011A010cbsMsg1list[0].getString(EKU0011A010CBSMsg1List.KOJIAK_STAT))))
			{
				continue;
			}
	
			kojiakSbtCd = eku0011A010cbsMsg1list[0].getString(EKU0011A010CBSMsg1List.KOJIAK_SBT_CD);
	
			// 工事案件種別コード「住所変更（新設）または（新設）」以外の場合処理しない。
			if(!(KOJIAK_SBT_CD_JUUSHOHENKOU.equals(kojiakSbtCd) || KOJIAK_SBT_CD_NEW.equals(kojiakSbtCd)))
			{
				continue;
			}
	
			/* ++++++++++ v5.02.00 変更開始 ++++++++++ */
			kojiUkOptntyIdoDiv = eku0011A010cbsMsg1list[0].getString(EKU0011A010CBSMsg1List.KOJI_UK_OPTNTY_IDO_DIV);
			// 工事案件種別コード「（新設）」の場合
			if(KOJIAK_SBT_CD_NEW.equals(kojiakSbtCd))
			{
				// 工事受付契機異動区分が住所変更・登録以外の場合
				if(!IDO_DIV_VALUE_00019.equals(kojiUkOptntyIdoDiv))
				{
					continue;
				}
			}
			
//			// 工事案件種別コード「住所変更（新設）または（新設）」の場合
//			if(KOJIAK_SBT_CD_NEW.equals(kojiakSbtCd))
//			{
//				// 異動予約を検索して結果がない場合、住所変更による「新設」ではないので処理しない。
//				// 異動予約一覧照会の取得
//				CAANMsg[] ekk1681b001cbsMsg1list = execEKK1681B001Tv(handle, scCall, param, dataMapKey, IDO_DIV_VALUE_00019);
//				// 異動予約一覧照会実行結果がない場合
//				if(ekk1681b001cbsMsg1list == null || ekk1681b001cbsMsg1list.length == 0)
//				{
//					continue;
//				}
//			}
			/* ++++++++++ v5.02.00 変更終了 ++++++++++ */
			
			// 住所変更明細更新実行
			JKKJuushoUpdateDtlUpCC juushoUpdateDtlUpCC = new JKKJuushoUpdateDtlUpCC();
			param.setData("JuushoUpdateDtlUpCC", new HashMap<String, Object>());
			HashMap<String, Object> outMap = (HashMap<String, Object>)param.getData("JuushoUpdateDtlUpCC");
			// 機能コード
			outMap.put("func_code", ccMsg.get("func_code"));
			// 更新フラグ
			/* ++++++++++ v5.04.02 変更開始 ++++++++++ */
//			outMap.put("update_flg", "9");
			outMap.put("update_flg", "2");
			/* ++++++++++ v5.04.02 変更完了 ++++++++++ */
			// 変更対象契約番号
			outMap.put("chg_tg_kei_no", rirekiMap.get("kktk_svc_kei_no") );
			// 機器変更番号
			outMap.put("kiki_chg_no", "");
			// 工事案件番号
			outMap.put("kojiak_no", kojiakNo);
			// 住所変更明細種別コード
			outMap.put("adchg_dtl_sbt_cd_kiki", ADCHG_DTL_SBT_CD_KIKI);
			// サービス契約異動種別コード
			outMap.put("svc_kei_ido_sbt_cd", "");
			juushoUpdateDtlUpCC.updjuushoUpdateDtl(handle, param, "JuushoUpdateDtlUpCC");
			param.removeData("JuushoUpdateDtlUpCC");
		}
		
		return true;
	}
	/* ++++++++++ v5.00.00 追加終了 ++++++++++ */
	
	/* ++++++++++ v5.01.00 変更開始 ++++++++++ */
	/**
	 * 機器提供サービス契約一意照会データ取得を行います。
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param rireki
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg getKktkSvcKeiRireki(SessionHandle handle, 
										ServiceComponentRequestInvoker scCall, 
										IRequestParameterReadWrite param, 
										String dataMapKey,
										HashMap<String, Object> rireki)  throws Throwable
	{
		// 設定されていないため検索処理を実行
		 // ***** EKK0341A010（機器提供サービス契約一意照会）*****
		Object[][] ekk0341a010IN = {
				{ EKK0341A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0341A010 },
				{ EKK0341A010CBSMsg.FUNC_CODE, FUNC_CODE_1 },
				{ EKK0341A010CBSMsg.KEY_KKTK_SVC_KEI_NO, rireki.get("kktk_svc_kei_no") },
				{ EKK0341A010CBSMsg.KEY_GENE_ADD_DTM, rireki.get("gene_add_dtm") },
				{ EKK0341A010CBSMsg.KEY_RSV_APLY_YMD, "" }
		};
		
		CAANMsg[] ekk0341a010cbsMsgList = callSC(handle, scCall, param, dataMapKey, ekk0341a010IN).getCAANMsgList(EKK0341A010CBSMsg.EKK0341A010CBSMSG1LIST);
		
		if(ekk0341a010cbsMsgList == null || ekk0341a010cbsMsgList.length == 0)
		{
			return null;
		}
		
		return ekk0341a010cbsMsgList[0];
	}
	/* ++++++++++ v5.01.00 変更完了 ++++++++++ */
	
	/* ++++++++++ v5.02.01 追加開始 ++++++++++ */
	/**
	 * 返品機器受付を実行します。
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param rirekiMap
	 * @param temporaryData
	 * @param dataMapKey
	 * @param ekk0341a010cbsMsg
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void execEDK0301D010(SessionHandle handle,
									ServiceComponentRequestInvoker scCall, 
									IRequestParameterReadWrite param, 
									HashMap<String, Object> rirekiMap,
									HashMap<String, Object> temporaryData,
									String dataMapKey,
									CAANMsg ekk0341a010cbsMsg) throws Throwable
	{
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		
		 // ***** EDK0301D010（返品機器受付）*****
		Object[][] edk0301d010IN = {
				{ EDK0301D010CBSMsg.TEMPLATEID,           TEMPLATE_ID_EDK0301D010 },
				{EDK0301D010CBSMsg.FUNC_CODE,              ccMsg.get("func_code")}, 
				{EDK0301D010CBSMsg.HMPIN_UK_YMD,           JPCBPCommon.getOpeDate(null)}, // 固定部品より取得
				/* ++++++++++ v5.03.00 修正開始 ++++++++++ */
//				{EDK0301D010CBSMsg.HMPIN_DIV,              HENPIN_DIV_RENTAL},
				{EDK0301D010CBSMsg.HMPIN_DIV,              HENPIN_DIV_CANCAL},
				/* ++++++++++ v5.03.00 修正完了 ++++++++++ */
				{EDK0301D010CBSMsg.KOJI_COMP_CD,           setNull()},
				{EDK0301D010CBSMsg.YOTAKU_SAKI_OFFC_CD,    setNull()},
				{EDK0301D010CBSMsg.PLACE_NO,               ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.KIKI_STC_SAKI_PLACE_NO)},
				{EDK0301D010CBSMsg.KKTK_SVC_KEI_NO,        rirekiMap.get("kktk_svc_kei_no")},
				{EDK0301D010CBSMsg.TAKNKIKI_MODEL_CD,      ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.TAKNKIKI_MODEL_CD)},
				{EDK0301D010CBSMsg.KIKI_SEIZO_NO,          ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.KIKI_SEIZO_NO)},
				{EDK0301D010CBSMsg.HUZOKUHIN_MODEL_CD,     setNull()},
				{EDK0301D010CBSMsg.BTRYHOZN_NO,            setNull()},
				{EDK0301D010CBSMsg.HMPIN_MOTO_KSITEI_FLG,  setNull()},
				{EDK0301D010CBSMsg.HMPIN_RSN_CD,           setNull()},
				{EDK0301D010CBSMsg.HMPIN_RSN_MEMO,         setNull()},
				{EDK0301D010CBSMsg.TROUBLE_NAIYO,          setNull()},
				{EDK0301D010CBSMsg.ADD_OPTNTY_KEI_IDO_DIV, ccMsg.get("ido_div")},
				{EDK0301D010CBSMsg.ADD_OPTNTY_KEI_IDO_DTM, JPCBPCommon.getOpeDateTimeStamp(null)},
				{EDK0301D010CBSMsg.LOAD_OYA_SVKEI_NO,      ccMsg.get("svc_kei_no")},
				{EDK0301D010CBSMsg.GDS_STAT_CD,            setNull()},
				{EDK0301D010CBSMsg.TK_SBT_CD,              ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.KKTK_SBT_CD)},
				{EDK0301D010CBSMsg.BTRYHOZN_UK_YMD,        setNull()},
				{EDK0301D010CBSMsg.KIKI_CHG_NO,            ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.KIKI_CHG_NO)},
		};
		
		// サービスインターフェースの実行
		callSC(handle, scCall, param, dataMapKey, edk0301d010IN);
		
	}
	
	/**
	 * null を返します。
	 * <br>
	 * @return null
	 */
	private String setNull()
	{
		return null;
	}
	
	/**
	 * サーバーチェック部品を呼び出す。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param temporaryData
	 * @return boolean
	 * @throws Throwable 
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private boolean isKikiInfoServerChkCC(SessionHandle handle, 
											ServiceComponentRequestInvoker scCall, 
											IRequestParameterReadWrite param, 
											String dataMapKey,
											HashMap<String, Object> temporaryData) throws Throwable
	{
		// 機器提供サービス契約情報サーバーチェックCC実行処理
		String workJKKKikiInfoServerChkCC = "JKKKikiInfoServerChkCC";
		param.setData(workJKKKikiInfoServerChkCC, new HashMap<String, Object>());
		
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		HashMap<String, Object> outMap = (HashMap<String, Object>)param.getData(workJKKKikiInfoServerChkCC);
		
		// 機能コード
		outMap.put("func_code", ccMsg.get("func_code"));
		//チェック画面ＩＤ
		outMap.put("check_scrn_id", ccMsg.get("check_scrn_id"));
		//サービス契約番号
		outMap.put("svc_kei_no", ccMsg.get("svc_kei_no"));
		// 運用日
		outMap.put("std_ymd", JKKBpCommon.getOpeDate(null));
		
		// 履歴一覧
		outMap.put("rireki_list", ccMsg.get("rireki_list"));
		
		JKKKikiInfoServerChkCC jkkKikiInfoServerChkCC = new JKKKikiInfoServerChkCC();
		jkkKikiInfoServerChkCC.checkRirekiInfo(handle, param, workJKKKikiInfoServerChkCC);
		
		// チェック結果取得
		outMap = (HashMap<String, Object>)param.getData(workJKKKikiInfoServerChkCC);
		
		String err_flg = (String)outMap.get("err_flg");
		
		// チェック結果を格納します。
		ccMsg.put("err_flg", outMap.get("err_flg"));
		ccMsg.put("message_list", outMap.get("message_list"));
		
		param.removeData(workJKKKikiInfoServerChkCC);
		
		// エラーの場合処理終了
		if(ERR_FLG_ERR.equals(err_flg))
		{
			return false;
		}
		
		return true;
	}
	/* ++++++++++ v5.02.01 追加完了 ++++++++++ */
	
	/* ++++++++++ v5.04.01 変更開始 ++++++++++ */
	/**
	 * カレントの情報取得メソッド
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param temporaryData
	 * @param rirekiList
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private void setCurKikiInfo(SessionHandle handle, 
											ServiceComponentRequestInvoker scCall, 
											IRequestParameterReadWrite param, 
											String dataMapKey,
											HashMap<String, Object> temporaryData,
											List<HashMap<String, Object>> rirekiList) throws Throwable
	{
		
		HashMap<String, Object> rirekiMap = null;
		CAANMsg ekk0341a010cbsMsg = null;
		CAANMsg edk0301a010Msg = null;
		
		for (int i = 0; i < rirekiList.size(); i++)
		{
			rirekiMap = (HashMap<String, Object>)rirekiList.get(i);
			
			// カレントデータ取得
			ekk0341a010cbsMsg = getKktkSvcKeiCur(handle, scCall, param, dataMapKey, rirekiMap);
			// 機器提供サービス契約の料金コース
			rirekiMap.put("pcrs_cd", getNullToStr(ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.PCRS_CD)));
			
			// 返品機器情報を取得
			edk0301a010Msg = getCurHmpinKikiInfo(handle, scCall, param, dataMapKey, temporaryData, ekk0341a010cbsMsg);
			
			if(edk0301a010Msg != null)
			{
				rirekiMap.put("hmpin_kiki_no", edk0301a010Msg.getString(EDK0301A010CBSMsg1List.HMPIN_KIKI_NO));
				rirekiMap.put(HMPIN_KIKI_INFO, edk0301a010Msg);
				
			}
			else
			{
				rirekiMap.put("hmpin_kiki_no", "");
				rirekiMap.put(HMPIN_KIKI_INFO, null);
			}
		}
	}
	
	/**
	 * 機器提供サービス契約一意照会データ取得(カレント)
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param rireki
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg getKktkSvcKeiCur(SessionHandle handle, 
										ServiceComponentRequestInvoker scCall, 
										IRequestParameterReadWrite param, 
										String dataMapKey,
										HashMap<String, Object> rireki)  throws Throwable
	{
		 // ***** EKK0341A010（機器提供サービス契約一意照会）*****
		Object[][] ekk0341a010IN = {
				{ EKK0341A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0341A010 },
				{ EKK0341A010CBSMsg.FUNC_CODE, FUNC_CODE_2 },
				{ EKK0341A010CBSMsg.KEY_KKTK_SVC_KEI_NO, rireki.get("kktk_svc_kei_no") },
				{ EKK0341A010CBSMsg.KEY_GENE_ADD_DTM, "" },
				{ EKK0341A010CBSMsg.KEY_RSV_APLY_YMD, JKKBpCommon.getOpeDate(null) }
		};
		
		CAANMsg[] ekk0341a010cbsMsgList = callSC(handle, scCall, param, dataMapKey, ekk0341a010IN).getCAANMsgList(EKK0341A010CBSMsg.EKK0341A010CBSMSG1LIST);
		
		if(ekk0341a010cbsMsgList == null || ekk0341a010cbsMsgList.length == 0)
		{
			return null;
		}
		
		return ekk0341a010cbsMsgList[0];
	}
	
	/**
	 * 機器提供サービス契約返品機器一覧照会
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg[] getEDK0301B080(SessionHandle handle, 
										ServiceComponentRequestInvoker scCall, 
										IRequestParameterReadWrite param, 
										String dataMapKey,
										CAANMsg ekk0341a010cbsMsg)  throws Throwable
	{
		 // ***** EDK0301B080（機器提供サービス契約返品機器一覧照会）*****
		Object[][] edk0301b080IN = {
				{ EDK0301B080CBSMsg.TEMPLATEID, TEMPLATE_ID_EDK0301B080 },
				{ EDK0301B080CBSMsg.FUNC_CODE, FUNC_CODE_1 },
				{ EDK0301B080CBSMsg.KEY_KKTK_SVC_KEI_NO, ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO) },
				{ EDK0301B080CBSMsg.KEY_KIKI_CHG_NO, ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.KIKI_CHG_NO) }
		};
		
		CAANMsg[] edk0301b080cbsMsgList = callSC(handle, scCall, param, dataMapKey, edk0301b080IN).getCAANMsgList(EDK0301B080CBSMsg.EDK0301B080CBSMSG1LIST);
		
		if(edk0301b080cbsMsgList == null || edk0301b080cbsMsgList.length == 0)
		{
			return null;
		}
		
		return edk0301b080cbsMsgList;
	}
	
	/**
	 * 返品機器情報取得
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param temporaryData
	 * @param ekk0341a010cbsMsg
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg getCurHmpinKikiInfo(SessionHandle handle, 
										ServiceComponentRequestInvoker scCall, 
										IRequestParameterReadWrite param, 
										String dataMapKey,
										HashMap<String, Object> temporaryData,
										CAANMsg ekk0341a010cbsMsg)  throws Throwable
	{
		
		CAANMsg retEdk0301a010Msg = null;
		
		/* ++++++++++ v15.00.00 変更開始 ++++++++++ */
		CAANMsg[] edk0301b060cbsMsgList = getEDK0301B060(handle, scCall, param, dataMapKey, ekk0341a010cbsMsg);
		
		if(edk0301b060cbsMsgList == null)
		{
			return null;
		}
		
		String hmpinKikiNo = "";
		String hmpinKikiStat = "";
		CAANMsg edk0301a010Msg = null;
		
		for (int i = 0; i < edk0301b060cbsMsgList.length; i++)
		{
			hmpinKikiNo = getNullToStr(edk0301b060cbsMsgList[i].getString(EDK0301B080CBSMsg1List.HMPIN_KIKI_NO));
//		CAANMsg[] edk0301b080cbsMsgList = getEDK0301B080(handle, scCall, param, dataMapKey, ekk0341a010cbsMsg);
//		
//		if(edk0301b080cbsMsgList == null)
//		{
//			return null;
//		}
//		
//		String hmpinKikiNo = "";
//		String hmpinKikiStat = "";
//		CAANMsg edk0301a010Msg = null;
//		
//		for (int i = 0; i < edk0301b080cbsMsgList.length; i++)
//		{
//			hmpinKikiNo = getNullToStr(edk0301b080cbsMsgList[i].getString(EDK0301B080CBSMsg1List.HMPIN_KIKI_NO));
		/* ++++++++++ v15.00.00 変更終了 ++++++++++ */
			
			edk0301a010Msg = execEDK0301A010(handle, scCall, param, hmpinKikiNo, temporaryData, dataMapKey);
			
			hmpinKikiStat = getNullToStr(edk0301a010Msg.getString(EDK0301A010CBSMsg1List.HMPIN_KIKI_STAT));
			
			// 取消済以外の場合取得します。
			if(!HMPIN_KIKI_STAT_004.equals(hmpinKikiStat))
			{
				/* ++++++++++ v15.00.00 追加開始 ++++++++++ */
				// 返品機器.物流保全番号が設定されている場合は、返品機器の判定対象外とする。
				// ※修理のための返品なので
				// 物流保全番号
				if (!JKKBpCommon.isNull(edk0301a010Msg.getString(EDK0301A010CBSMsg1List.BTRYHOZN_NO)))
				{
					continue;
				}
				/* ++++++++++ v15.00.00 追加終了 ++++++++++ */

				retEdk0301a010Msg = edk0301a010Msg;
				break;
			}
		}
		
		
		return retEdk0301a010Msg;
	}
	/* ++++++++++ v5.04.01 変更完了 ++++++++++ */
	
	/* ++++++++++ v5.04.03 追加開始 ++++++++++ */
	/**
	 * 未返却機器解約履歴一覧データ取得 <br>
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 */
	private HashMap<String, String> getMiHnkykRirekiScrnItemMap(HashMap<String, Object> rirekiMap)
	{
		HashMap<String, String> retMap = new HashMap<String, String>();
		// 機器提供サービス契約番号
		retMap.put("kktk_svc_kei_no_bf", (String)rirekiMap.get("kktk_svc_kei_no"));
		// 配送ステータス
		retMap.put("haiso_stat_bf", (String)rirekiMap.get("haiso_stat"));
		// 停止ＳＯＤ送信年月日
		retMap.put("stp_sod_send_ymd", (String)rirekiMap.get("stp_sod_send_ymd"));
		
		return retMap;
	}
	/**
	 * メッセージIDを設定します。
	 * 
	 * @param ccMsg
	 *            パラメータMap
	 * @param pMessageId
	 *            メッセージID
	 * @param pReplaceCha
	 *            置換文字列
	 * @param pErrItem
	 *            エラー設定項目
	 * @param pErrFlg
	 *            エラーフラグ
	 */
	private void setMessageInfo(HashMap<String, Object> ccMsg, String pMessageId, String pReplaceCha, String pErrItem, String pErrFlg)
	{

		// エラーフラグの設定
		// エラーの場合はそのまま設定。　ワーニングの場合はエラーが設定されていない場合、設定
		String errFlg = (String)ccMsg.get("err_flg");

		if("".equals(errFlg) || ERR_FLG_WARNING.equals(errFlg))
		{
			ccMsg.put("err_flg", pErrFlg);
		}

		HashMap<String, Object> messageMap = new HashMap<String, Object>();
		// メッセージIDを設定
		messageMap.put("messageId", pMessageId);
		// 置換文字列
		messageMap.put("replaceCha", pReplaceCha);
		// エラー設定項目
		messageMap.put("errItem", pErrItem);

		ArrayList<HashMap<String, Object>> messageInfo = (ArrayList<HashMap<String, Object>>)ccMsg.get("message_list");
		messageInfo.add(messageMap);

	}
	/**
	 * VA利用中チェック<br>
	 * <br>
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param kktkSvcKeiMsg
	 * @param ichiranShoriMap
	 * @return boolean 連携中：false　未連携：true
	 * @throws Throwable 
	 */
	private boolean isVAriyochu(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param, String dataMapKey,
			CAANMsg kktkSvcKeiMsg, HashMap<String, Object> ichiranShoriMap) throws Throwable
	{
		// VA利用中チェック
		String checkResult = execJKKVaMihenkyakuCheckCC(handle, scCall, param, dataMapKey, kktkSvcKeiMsg, ichiranShoriMap);
		
		if(CHECK_RESULT_RENKEI.equals(checkResult))
		{
			return false;
		}
		
		return true;
	}
	/**
	 * VA利用中チェック実行<br>
	 * <br>
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param kktkSvcKeiMsg
	 * @param ichiranShoriMap
	 * @return boolean
	 * @throws Throwable 
	 */
	private String execJKKVaMihenkyakuCheckCC(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param, String dataMapKey,
			CAANMsg kktkSvcKeiMsg, HashMap<String, Object> ichiranShoriMap) throws Throwable
	{
		
		param.setData(JKK_VA_MIHENKYAKU_CHECK_CC, new HashMap<String, Object>());

		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		HashMap<String, Object> outMap = (HashMap<String, Object>)param.getData(JKK_VA_MIHENKYAKU_CHECK_CC);

		// 各画面CCへ渡すパラメタ（一覧の項目）
		HashMap<String, Object> scrnItemMap = (HashMap<String, Object>)ichiranShoriMap.get(SHORI_LIST_SCRN_PARAM);

		// 機能コード
		outMap.put("func_code", FUNC_CODE_2);
		// 機器提供サービス契約番号
		outMap.put("kktk_svc_kei_no", kktkSvcKeiMsg.getString(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
		// 機器提供サービス契約情報データ
		outMap.put("kktk_svc_kei_data", kktkSvcKeiMsg);
		// サービス契約番号
		outMap.put("svc_kei_no", ccMsg.get("svc_kei_no"));

		// ＶＡ未返却解約チェック処理部品呼び出し
		JKKVaMihenkyakuCheckCC jKkVaMihenkyakuChkCC = new JKKVaMihenkyakuCheckCC();
		jKkVaMihenkyakuChkCC.execVaUseCheck(handle, param, JKK_VA_MIHENKYAKU_CHECK_CC);

		String checResult = (String)outMap.get(CHECK_RESULT);
		 
		param.removeData(JKK_VA_MIHENKYAKU_CHECK_CC);
		
		return checResult;
	}
	/* ++++++++++ v5.04.03 追加終了 ++++++++++ */
	
	/* ++++++++++ v6.00.01 追加開始 ++++++++++ */
	/**
	 * 返品機器対象判定取得
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param temporaryData
	 * @param kikiInfoMsg
	 * @return true:返品対象　false:返品対象外
	 * @throws Throwable
	 */
	private boolean isCurHmpinKiki(SessionHandle handle, 
										ServiceComponentRequestInvoker scCall, 
										IRequestParameterReadWrite param, 
										String dataMapKey,
										HashMap<String, Object> temporaryData,
										CAANMsg kikiInfoMsg)  throws Throwable
	{
		CAANMsg[] edk0301b080cbsMsgList = getEDK0301B080(handle, scCall, param, dataMapKey, kikiInfoMsg);
		
		if(edk0301b080cbsMsgList == null)
		{
			return true;
		}
		
		String hmpinKikiNo = "";
		String hmpinKikiStat = "";
		CAANMsg edk0301a010Msg = null;
		
		for (int i = 0; i < edk0301b080cbsMsgList.length; i++)
		{
			hmpinKikiNo = getNullToStr(edk0301b080cbsMsgList[i].getString(EDK0301B080CBSMsg1List.HMPIN_KIKI_NO));
			
			edk0301a010Msg = execEDK0301A010(handle, scCall, param, hmpinKikiNo, temporaryData, dataMapKey);
			
			hmpinKikiStat = getNullToStr(edk0301a010Msg.getString(EDK0301A010CBSMsg1List.HMPIN_KIKI_STAT));
			
			// 取消済以外の場合取得します。
			if(!HMPIN_KIKI_STAT_004.equals(hmpinKikiStat))
			{
				return false;
			}
		}
		
		
		return true;
	}
	/* ++++++++++ v6.00.01 追加終了 ++++++++++ */
	
	/* ++++++++++ v15.00.00 追加開始 ++++++++++ */
	/**
	 * 返品機器取消一覧照会
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg[] getEDK0301B060(SessionHandle handle, 
										ServiceComponentRequestInvoker scCall, 
										IRequestParameterReadWrite param, 
										String dataMapKey,
										CAANMsg ekk0341a010cbsMsg)  throws Throwable
	{
		 // ***** EDK0301B060（機器提供サービス契約返品機器一覧照会）*****
		Object[][] edk0301b060IN = {
				{ EDK0301B060CBSMsg.TEMPLATEID, TEMPLATE_ID_EDK0301B060 },
				{ EDK0301B060CBSMsg.FUNC_CODE, FUNC_CODE_2 },
				{ EDK0301B060CBSMsg.KEY_KKTK_SVC_KEI_NO, ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO) },
				{ EDK0301B060CBSMsg.KEY_KIKI_CHG_NO, ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.KIKI_CHG_NO) }
		};
		
		CAANMsg[] edk0301b060cbsMsgList = callSC(handle, scCall, param, dataMapKey, edk0301b060IN).getCAANMsgList(EDK0301B060CBSMsg.EDK0301B060CBSMSG1LIST);
		
		if(edk0301b060cbsMsgList == null || edk0301b060cbsMsgList.length == 0)
		{
			return null;
		}
		
		return edk0301b060cbsMsgList;
	}
	/* ++++++++++ v15.00.00 追加終了 ++++++++++ */
// ANK-3488-10-00 ADD START
	/**
	 * BCAS取消処理を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param temporaryData 一時領域データ
	 * @param rirekiMap 契約変更取消データ
	 * @param ekk0081a010OUT サービス契約情報
	 * @param ekk0341a010cbsMsg 更新前データ
	 * @param hddCapaBcasnoneList B-CAS不要HDD容量コード
	 * @throws Throwable 
	 */
	private void execBcasCancel(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									HashMap<String, Object> temporaryData,
									HashMap<String, Object> rirekiMap,
									CAANMsg ekk0081a010OUT,
									CAANMsg ekk0341a010cbsMsg,
									List<String> hddCapaBcasnoneList) throws Throwable
	{
// OM-2019-0001295 ADD START
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
// OM-2019-0001295 ADD END
		
		// カレントデータを取得する
		CAANMsg ekk0341a010cbsMsgCur = getKktkSvcKeiCur(handle, scCall, param, dataMapKey, rirekiMap);
		if (ekk0341a010cbsMsgCur == null)
		{
			return;
		}
		
		// HDD容量コード(更新前)
		String hddCapaCdBf = ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.HDD_CAPA_CD);
		// HDD容量コード(更新後)
		String hddCapaCdAf = ekk0341a010cbsMsgCur.getString(EKK0341A010CBSMsg1List.HDD_CAPA_CD);
		
		// 4K-STB→STB交換取消の場合
		if (!hddCapaBcasnoneList.contains(hddCapaCdBf) && hddCapaBcasnoneList.contains(hddCapaCdAf))
		{
			// サービス契約内訳番号
			String svcKeiUcwkNo = ekk0341a010cbsMsgCur.getString(EKK0341A010CBSMsg1List.SVC_KEI_UCWK_NO);
			
			// 機器提供サービス契約一覧照会(サービス契約内訳番号)サービスI/F実行
			CAANMsg[] ekk0341B501MsgList = execEKK0341B501(handle, scCall, param, dataMapKey, svcKeiUcwkNo);
			if (ekk0341B501MsgList == null || ekk0341B501MsgList.length == 0)
			{
				return;
			}
			
			// BCASデータのメッセージ
			CAANMsg bcasMsg = null;
			for (CAANMsg ekk0341B501Msg : ekk0341B501MsgList)
			{
				// 機器提供サービス契約ステータスが解約済、キャンセル済以外かつ、
				// 機器提供サービスコードがB-CASのデータを取得する
				if (!JKKStrConst.CD00056_STAT_DSLZUMI.equals(ekk0341B501Msg.getString(EKK0341B501CBSMsg1List.KKTK_SVC_KEI_STAT))
						&& !JKKStrConst.CD00056_STAT_CANCELZUMI.equals(ekk0341B501Msg.getString(EKK0341B501CBSMsg1List.KKTK_SVC_KEI_STAT))
						&& JKKStrConst.KKTK_SVC_CD_B_CAS.equals(ekk0341B501Msg.getString(EKK0341B501CBSMsg1List.KKTK_SVC_CD)))
				{
					bcasMsg = ekk0341B501Msg;
					break;
				}
			}
			
			if (bcasMsg == null)
			{
				return;
			}
			
// OM-2019-0001295 ADD START
			// 機器提供サービス契約ステータスが受付済、照査済の場合、BCAS機器をキャンセルする
			if (JKKStrConst.CD00056_STAT_UKETSUKEZUMI.equals(bcasMsg.getString(EKK0341B501CBSMsg1List.KKTK_SVC_KEI_STAT))
					|| JKKStrConst.CD00056_STAT_SHOSAZUMI.equals(bcasMsg.getString(EKK0341B501CBSMsg1List.KKTK_SVC_KEI_STAT)))
			{
// OM-2019-0001295 ADD END
				// 機器提供サービス契約キャンセルサービスI/F実行
				CAANMsg ekk0341c330Msg = execEKK0341C330(handle, scCall, param, dataMapKey, temporaryData, bcasMsg);
				// 更新年月日時分秒を作業領域に設定
				setSvcUpdDtm(param, ekk0341c330Msg.getString(EKK0341C330CBSMsg.UPD_DTM));
				// 最終更新タイムスタンプの更新
				temporaryData.put("最終更新年月日時分秒", ekk0341c330Msg.getObject(EKK0341C330CBSMsg.UPD_DTM));
// OM-2019-0001295 ADD START
			}
			// それ以外の場合、BCAS機器を解約する
			else
			{
				// 機能コードが"1"の場合のみ実行する
				if (JPCModelConstant.FUNC_CD_1.equals(ccMsg.get("func_code")))
				{
					// 機器提供サービス契約解約サービスI/F実行
					CAANMsg ekk0341c340Msg = execEKK0341C340(handle, scCall, param, dataMapKey, temporaryData, bcasMsg);
					// 更新年月日時分秒を作業領域に設定
					setSvcUpdDtm(param, ekk0341c340Msg.getString(EKK0341C340CBSMsg.UPD_DTM));
					// 最終更新タイムスタンプの更新
					temporaryData.put("最終更新年月日時分秒", ekk0341c340Msg.getObject(EKK0341C340CBSMsg.UPD_DTM));
					
					// 機器提供サービス契約解約確定サービスI/F実行
					CAANMsg ekk0341c350Msg = execEKK0341C350(handle, scCall, param, dataMapKey, temporaryData, bcasMsg);
					// 更新年月日時分秒を作業領域に設定
					setSvcUpdDtm(param, ekk0341c350Msg.getString(EKK0341C350CBSMsg.UPD_DTM));
					// 最終更新タイムスタンプの更新
					temporaryData.put("最終更新年月日時分秒", ekk0341c350Msg.getObject(EKK0341C350CBSMsg.UPD_DTM));
				}
			}
// OM-2019-0001295 ADD END
		}
	}
	
	/**
	 * 業務パラメータ管理一意照会を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param workParamId 業務パラメータID
	 * @return 業務パラメータ設定値
	 * @throws Exception
	 */
	private String getWorkParamSetteValue(SessionHandle handle,
										ServiceComponentRequestInvoker scCall,
										IRequestParameterReadWrite param,
										String dataMapKey,
										String workParamId) throws Exception
	{
		// 戻り値
		String result = "";
		
		// 業務パラメータ管理一意照会サービスI/Fの上りマッピング
		Object[][] ezm0321a010In = {
				{EZM0321A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EZM0321A010},
				{EZM0321A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
				{EZM0321A010CBSMsg.KEY_WORK_PARAM_ID, workParamId}
		};
		
		// サービスI/F実行
		CAANMsg[] ezm0321a010MsgList = callSC(handle, scCall, param, dataMapKey, ezm0321a010In).getCAANMsgList(EZM0321A010CBSMsg.EZM0321A010CBSMSG1LIST);
		
		if (ezm0321a010MsgList != null && ezm0321a010MsgList.length > 0)
		{
			// 業務パラメータ設定値
			result = getNullToStr(ezm0321a010MsgList[0].getString(EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE));
		}
		
		return result;
	}
	
	/**
	 * 機器提供サービス契約一覧照会(サービス契約内訳番号)を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @return 機器提供サービス契約一覧照会(サービス契約内訳番号)マップ
	 * @throws Exception
	 */
	private CAANMsg[] execEKK0341B501(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String svcKeiUcwkNo) throws Exception
	{
		// 機器提供サービス契約一覧照会(サービス契約内訳番号)サービスI/Fの上りマッピング
		Object[][] ekk0341b501In = {
				{EKK0341B501CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0341B501},
				{EKK0341B501CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
				{EKK0341B501CBSMsg.KEY_SVC_KEI_UCWK_NO, svcKeiUcwkNo}
		};
		
		// サービスI/F実行
		CAANMsg[] ekk0341b501MsgList = callSC(handle, scCall, param, dataMapKey, ekk0341b501In).getCAANMsgList(EKK0341B501CBSMsg.EKK0341B501CBSMSG1LIST);
		
		return ekk0341b501MsgList;
	}
	
	/**
	 * 機器提供サービス契約キャンセルを行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param temporaryData 一時領域データ
	 * @param bcasMsg bcasデータのメッセージ
	 * @return 機器提供サービス契約キャンセルマップ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg execEKK0341C330(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									HashMap<String, Object> temporaryData,
									CAANMsg bcasMsg) throws Exception
	{
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		
		// 機器提供サービス契約キャンセルサービスI/Fの上りマッピング
		Object[][] ekk0341c330In = {
				{EKK0341C330CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0341C330},
				{EKK0341C330CBSMsg.FUNC_CODE, ccMsg.get("func_code")},
				{EKK0341C330CBSMsg.KKTK_SVC_KEI_NO, bcasMsg.getString(EKK0341B501CBSMsg1List.KKTK_SVC_KEI_NO)},
				{EKK0341C330CBSMsg.MSKM_DTL_NO, bcasMsg.getString(EKK0341B501CBSMsg1List.MSKM_DTL_NO)},
				{EKK0341C330CBSMsg.SVC_CANCEL_RSN_CD, JKKStrConst.CD01390_CL_MOUSHIDE},
				{EKK0341C330CBSMsg.IDO_DIV, bcasMsg.getString(EKK0341B501CBSMsg1List.IDO_DIV)},
				{EKK0341C330CBSMsg.UPD_DTM_BF, temporaryData.get("最終更新年月日時分秒")}
		};
		
		// サービスI/F実行
		CAANMsg ekk0341c330Msg = callSC(handle, scCall, param, dataMapKey, ekk0341c330In);
		
		return ekk0341c330Msg;
	}
// ANK-3488-10-00 ADD END
// ANK-3412-12-00 ADD START
	/**
	 * VA機能利用中チェック処理を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param ekk0341a010cbsMsg 機器提供サービス契約情報
	 * @param ekk0081a010cbsMsg サービス契約情報
	 * @return boolean 連携中：false　未連携：true
	 * @throws Throwable 
	 */
	private boolean checkVAKinoRiyochu(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									CAANMsg ekk0341a010cbsMsg,
									CAANMsg ekk0081a010cbsMsg) throws Throwable
	{
		// 機器提供サービス契約番号
		String kktkSvcKeiNo = ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO);
		// サービス契約番号
		String svcKeiNo = ekk0081a010cbsMsg.getString(EKK0081A010CBSMsg1List.SVC_KEI_NO);
		// サービスコード
		String svcCd = ekk0081a010cbsMsg.getString(EKK0081A010CBSMsg1List.SVC_CD);
		// 電話のサービス契約番号
		String svcKeiNoTel = "";
		
		// 機器オプションサービス契約一覧照会（複合検索）サービスI/F実行
		CAANMsg[] ekk2811b504MsgList = execEKK2811B504(handle, scCall, param, dataMapKey, kktkSvcKeiNo);
		if (ekk2811b504MsgList == null || ekk2811b504MsgList.length == 0)
		{
			return true;
		}
		
		// 電話アダプター機能有無 false:無　true:有
		boolean telAdaptUm = false;
		for (CAANMsg ekk2811b504Msg : ekk2811b504MsgList)
		{
			// 機器オプションサービス契約ステータスが解約済、キャンセル済以外かつ、
			// 機器オプションサービスコードが電話アダプター機能の場合
			if (!JKKStrConst.CD01616_STAT_DSLZUMI.equals(ekk2811b504Msg.getString(EKK2811B504CBSMsg1List.KKOP_SVC_KEI_STAT))
					&& !JKKStrConst.CD01616_STAT_CANCELZUMI.equals(ekk2811b504Msg.getString(EKK2811B504CBSMsg1List.KKOP_SVC_KEI_STAT))
					&& JKKStrConst.KKOP_SVC_CD_TEL_ADAPT.equals(ekk2811b504Msg.getString(EKK2811B504CBSMsg1List.KKOP_SVC_CD)))
			{
				telAdaptUm = true;
				break;
			}
		}
		
		// 電話アダプター機能がない場合、電話番号の紐付けチェックを行わない
		if (!telAdaptUm)
		{
			return true;
		}
		
		// 処理対象データ（サービス契約）が電話の場合
		if (JKKStrConst.CD00130_02.equals(svcCd))
		{
			svcKeiNoTel = svcKeiNo;
		}
		else
		{
			// 同一場所サービス契約情報照会サービスI/F実行
			CAANMsg[] ekk0081b009MsgList = execEKK0081B009(handle, scCall, param, dataMapKey, svcKeiNo);
			if (ekk0081b009MsgList == null || ekk0081b009MsgList.length == 0)
			{
				return true;
			}
			for (CAANMsg ekk0081b009Msg : ekk0081b009MsgList)
			{
				// サービス契約ステータスが解約済、キャンセル済以外かつ、
				// サービスコードが電話のサービス契約番号を取得する
				if (!JKKStrConst.CD00037_DSL_ZM.equals(ekk0081b009Msg.getString(EKK0081B009CBSMsg1List.SVC_KEI_STAT))
						&& !JKKStrConst.CD00037_CANCEL_ZM.equals(ekk0081b009Msg.getString(EKK0081B009CBSMsg1List.SVC_KEI_STAT))
						&& JKKStrConst.CD00130_02.equals(ekk0081b009Msg.getString(EKK0081B009CBSMsg1List.SVC_CD)))
				{
					svcKeiNoTel = ekk0081b009Msg.getString(EKK0081B009CBSMsg1List.SVC_KEI_NO);
					break;
				}
			}
		}
		
		// 電話のサービス契約が取得できない場合、電話番号の紐付けチェックを行わない
		if(JKKCommonUtil.isNull(svcKeiNoTel))
		{
			return true;
		}
		
		// ＶＡ未返却解約チェックCC実行
		param.setData(JKK_VA_MIHENKYAKU_CHECK_CC, new HashMap<String, Object>());
		HashMap<String, Object> outMap = (HashMap<String, Object>)param.getData(JKK_VA_MIHENKYAKU_CHECK_CC);
		
		// 機能コード
		outMap.put("func_code", FUNC_CODE_2);
		// 機器提供サービス契約番号
		outMap.put("kktk_svc_kei_no", kktkSvcKeiNo);
		// 機器提供サービス契約情報データ
		outMap.put("kktk_svc_kei_data", ekk0341a010cbsMsg);
		// サービス契約番号
		outMap.put("svc_kei_no", svcKeiNoTel);
		
		// ＶＡ未返却解約チェック処理部品呼び出し
		JKKVaMihenkyakuCheckCC jKkVaMihenkyakuChkCC = new JKKVaMihenkyakuCheckCC();
		jKkVaMihenkyakuChkCC.execVaUseCheck(handle, param, JKK_VA_MIHENKYAKU_CHECK_CC);
		
		// チェック結果
		String checkResult = (String)outMap.get(CHECK_RESULT);
		param.removeData(JKK_VA_MIHENKYAKU_CHECK_CC);
		
		// 連携中の場合
		if(CHECK_RESULT_RENKEI.equals(checkResult))
		{
			return false;
		}
		
		return true;
	}
	
	/**
	 * 機器オプションサービス契約一覧照会（複合検索）を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param kktkSvcKeiNo 機器提供サービス契約番号
	 * @return 機器オプションサービス契約一覧照会（複合検索）マップ
	 * @throws Exception
	 */
	private CAANMsg[] execEKK2811B504(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String kktkSvcKeiNo) throws Exception
	{
		// 機器オプションサービス契約一覧照会（複合検索）サービスI/Fの上りマッピング
		Object[][] ekk2811b504In = {
				{EKK2811B504CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK2811B504},
				{EKK2811B504CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
				{EKK2811B504CBSMsg.KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo},
				{EKK2811B504CBSMsg.KEY_RSV_APLY_YMD, JKKBpCommon.getOpeDate(null)}
		};
		
		// サービスI/F実行
		CAANMsg[] ekk2811b504MsgList = callSC(handle, scCall, param, dataMapKey, ekk2811b504In).getCAANMsgList(EKK2811B504CBSMsg.EKK2811B504CBSMSG1LIST);
		
		return ekk2811b504MsgList;
	}
	
	/**
	 * 同一場所サービス契約情報照会を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param svcKeiNo サービス契約番号
	 * @return 同一場所サービス契約情報照会マップ
	 * @throws Exception
	 */
	private CAANMsg[] execEKK0081B009(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String svcKeiNo) throws Exception
	{
		// 同一場所サービス契約情報照会サービスI/Fの上りマッピング
		Object[][] ekk0081b009In = {
				{EKK0081B009CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081B009},
				{EKK0081B009CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
				{EKK0081B009CBSMsg.KEY_SVC_KEI_NO, svcKeiNo}
		};
		
		// サービスI/F実行
		CAANMsg[] ekk0081b009MsgList = callSC(handle, scCall, param, dataMapKey, ekk0081b009In).getCAANMsgList(EKK0081B009CBSMsg.EKK0081B009CBSMSG1LIST);
		
		return ekk0081b009MsgList;
	}
// ANK-3412-12-00 ADD END
// OM-2019-0001295 ADD START
	/**
	 * 機器提供サービス契約解約を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param temporaryData 一時領域データ
	 * @param bcasMsg bcasデータのメッセージ
	 * @return 機器提供サービス契約解約マップ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg execEKK0341C340(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									HashMap<String, Object> temporaryData,
									CAANMsg bcasMsg) throws Exception
	{
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		
		// 機器提供サービス契約解約サービスI/Fの上りマッピング
		Object[][] ekk0341c340In = {
				{EKK0341C340CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0341C340},
				{EKK0341C340CBSMsg.FUNC_CODE, ccMsg.get("func_code")},
				{EKK0341C340CBSMsg.KKTK_SVC_KEI_NO, bcasMsg.getString(EKK0341B501CBSMsg1List.KKTK_SVC_KEI_NO)},
				{EKK0341C340CBSMsg.MSKM_DTL_NO, bcasMsg.getString(EKK0341B501CBSMsg1List.MSKM_DTL_NO)},
				{EKK0341C340CBSMsg.RSV_TSTA_KIBO_YMD, ""},
				{EKK0341C340CBSMsg.SVC_ENDYMD, JCCBPCommon.getOpeDate(null)},
				{EKK0341C340CBSMsg.SVC_CHRG_ENDYMD, getEndYmd(JCCBPCommon.getOpeDate(null))},
				{EKK0341C340CBSMsg.SVC_DLRE_CD, JKKStrConst.CD00879_TUJYO_DSL},
				{EKK0341C340CBSMsg.SVC_DLRE_MEMO, ""},
				{EKK0341C340CBSMsg.ZANCHI_FLG, ""},
				{EKK0341C340CBSMsg.PNLTY_HASSEI_CD, ""},
				{EKK0341C340CBSMsg.IDO_DIV, bcasMsg.getString(EKK0341B501CBSMsg1List.IDO_DIV)},
				{EKK0341C340CBSMsg.TAKNKIKI_IDO_CD, bcasMsg.getString(EKK0341B501CBSMsg1List.TAKNKIKI_IDO_CD)},
				{EKK0341C340CBSMsg.UPD_DTM_BF, temporaryData.get("最終更新年月日時分秒")},
				{EKK0341C340CBSMsg.SVC_KEI_NO, bcasMsg.getString(EKK0341B501CBSMsg1List.SVC_KEI_NO)}
		};
		
		// サービスI/F実行
		CAANMsg ekk0341c340Msg = callSC(handle, scCall, param, dataMapKey, ekk0341c340In);
		
		return ekk0341c340Msg;
	}
	
	/**
	 * 機器提供サービス契約解約確定を行う。
	 * @param handle セッションハンドル
	 * @param scCall SC呼出
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param temporaryData 一時領域データ
	 * @param bcasMsg bcasデータのメッセージ
	 * @return 機器提供サービス契約解約確定マップ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg execEKK0341C350(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									HashMap<String, Object> temporaryData,
									CAANMsg bcasMsg) throws Exception
	{
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		
		// 機器提供サービス契約解約確定サービスI/Fの上りマッピング
		Object[][] ekk0341c350In = {
				{EKK0341C350CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0341C350},
				{EKK0341C350CBSMsg.FUNC_CODE, ccMsg.get("func_code")},
				{EKK0341C350CBSMsg.KKTK_SVC_KEI_NO, bcasMsg.getString(EKK0341B501CBSMsg1List.KKTK_SVC_KEI_NO)},
				{EKK0341C350CBSMsg.SVC_ENDYMD, JCCBPCommon.getOpeDate(null)},
				{EKK0341C350CBSMsg.SVC_CHRG_ENDYMD, getEndYmd(JCCBPCommon.getOpeDate(null))},
				{EKK0341C350CBSMsg.SVC_DLRE_CD, JKKStrConst.CD00879_TUJYO_DSL},
				{EKK0341C350CBSMsg.SVC_DLRE_MEMO, ""},
				{EKK0341C350CBSMsg.ZANCHI_FLG, ""},
				{EKK0341C350CBSMsg.TAKNKIKI_IDO_CD, bcasMsg.getString(EKK0341B501CBSMsg1List.TAKNKIKI_IDO_CD)},
				{EKK0341C350CBSMsg.KAISHU_KIKI_UM, ""},
				{EKK0341C350CBSMsg.UPD_DTM_BF, temporaryData.get("最終更新年月日時分秒")},
				{EKK0341C350CBSMsg.PLAN_END_SBT_CD, ""}
		};
		
		// サービスI/F実行
		CAANMsg ekk0341c350Msg = callSC(handle, scCall, param, dataMapKey, ekk0341c350In);
		
		return ekk0341c350Msg;
	}
	
	/**
	 * 指定日付の月末日を取得する
	 * @param date 指定日付
	 * @return 月末日付(yyyyMMdd)
	 * @throws Exception
	 */
	private String getEndYmd(String date) throws Exception
	{
		if (JKKCommonUtil.isNull((date)))
		{
			return "";
		}
		
		String endYmd = date.substring(0, 6) + JPCDateUtil.getEndOfMonth(date);
		
		return endYmd;
	}
// OM-2019-0001295 ADD END

}
