/********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************
 *＜プログラム内容＞
 *  システム名      ：eo顧客基幹システム
 *  モジュール名    ：住所情報変更 機器オプション情報変更コンポーネント部品クラス
 *  ソースファイル名：JKKAdchgKkopInfoChgCC.java
 *  作成者          ：FJ
 *  日付            ：2013年12月12日
 *＜機能概要＞
 *  住所変更本登録にいて機器オプションを登録、変更を行う
 *＜修正履歴＞
 *  バージョン  修正日      修正者      修正内容
 *  v1.00.00    2013/12/12  FJ          新規作成 ANK-1578-00-00
 *  v8.00.00    2014/03/04  FJ)星野     IT2-2014-0000179対応
 *  v8.01.00    2014/04/10  FJ)金田     IT2-2014-0000187対応
 *  v8.02.00    2014/04/18  FJ)金田     IT2-2014-0000197対応
 *  v8.03.00    2014/05/04  FJ)阮       OM-2014-0001708対応
 *  v8.04.00    2014/06/03  FJ)星野     OM-2014-0001924対応
 * v10.00.00    2014/08/11  FJ)江藤     IT1-2014-0000289対応
 * v10.01.00    2014/10/08  FJ)江藤    【ANK-1918-06-00】出荷指図連携タイミングの見直しについて
 * v13.00.00    2015/04/21   FJ)阮     【OM-2015-0000170】対応
 * v15.00.00    2015/08/25  FJ)三浦    【OM-2015-0001342】対応
 * v19.00.00    2015/10/27  FJ)谷口    【OM-2015-0000661】対応
 * v20.00.00    2015/12/17  FJ)林      【ANK-2290-00-00】 ＭＴ関連の解約⇒新規の住変時、ネットに紐付く機器で「交換」の蓋閉じ対応
 * v60.00.00    2022/08/22  FJ)平野    【IT1-2022-0000054】工事スキップのマンションで機器がお客様直送されない
 * v60.00.01	2022/09/26	FJ)平野		【ANK-4244-11-00】MT既設賃貸対応（スキップ工事中の機器出荷直送対応）
 * v61.00.00	2023/01/04	FJ)澤田		【ANK-4315-00-00】【eo定期】 eoホームゲートウェイ導入対応
********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKAdchgConstCC;
import com.fujitsu.futurity.bp.custom.constant.JKKSvcConst;
import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.sun.enterprise.tools.common.util.StringUtils;

import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0251A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B032CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B504CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341C030CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C340CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C350CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2011B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2101B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2811A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2811B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2811C030CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2811C040CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2811C070CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2811C140CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2811C150CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2811C250CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2811C260CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2811D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2881B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA0020002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0020002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA0020002CBSMsg2List;
import eo.ejb.cbs.cbsmsg.EKU0011A010CBSMsg1List;

/**
 * 住所情報変更 電話番号情報変更コンポーネント部品クラス
 * <br>
 * @author FJ
 */
public class JKKAdchgKkopInfoChgCC extends AbstractCommonComponent {

// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD START（IT1-2013-0001743）
	/** 住所変更明細キー：機器オプションサービス契約：一覧 */
	public static final String ADCHG_DTL_KKOP_LIST = "adchg_dtl_kkop_list";

	/** 住所変更明細キー：機器オプションサービス契約：機器提供サービス契約番号（転居元の多機能ルータ） */
	public static final String MOTO_MULTI_ROUTER_KKTK_SVC_KEI_NO = "moto_multi_router_kktk_svc_kei_no";

	/** 住所変更明細キー：機器オプションサービス契約：機器提供サービス契約番号（転居先の多機能ルータ） */
	public static final String SAKI_MULTI_ROUTER_KKTK_SVC_KEI_NO = "saki_multi_router_kktk_svc_kei_no";

	/** 住所変更明細キー：機器オプションサービス契約：機器オプションサービス契約番号（転居元の機器オプション） */
	public static final String MOTO_KKOP_SVC_KEI_NO = "moto_kkop_svc_kei_no";

	/** 住所変更明細キー：機器オプションサービス契約：機器オプションサービス契約番号（転居先の機器オプション） */
	public static final String SAKI_KKOP_SVC_KEI_NO = "saki_kkop_svc_kei_no";
// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD END  （IT1-2013-0001743）
// ANK-1664-00-00 2014.01.13 T.TORIKAI ADD START
	/** 住所変更明細キー：機器オプションサービスコード ※一時保存の登録時に使用 */
	public static final String KKOP_SVC_CD = "kkop_svc_cd";
// ANK-1664-00-00 2014.01.13 T.TORIKAI ADD END

	/** 機器オプションサービスコード：ルータ機能 */
	private final String KKOP_SVC_CD_ROUTER = "G01";

	/** 機器オプションサービスコード：ＶＡ機能 */
	private final String KKOP_SVC_CD_TEL_VA = "G02";
	
	/** 照査解約完了コード：OK */
	private final String SHOSA_DSL_FIN_CD_OK = "1";

	/** 機器オプションサービス契約変更種別コード（処理区分）：追加 */
	private final String KKOP_SYORI_KBN_ADD = "1";

	/** 機器オプションサービス契約変更種別コード（処理区分）：解約 */
	private final String KKOP_SYORI_KBN_DSL = "3";

// ANK-1578-00-00 2013.12.24 T.TORIKAI ADD START（IT1-2013-0001736）
	/** 機器オプションサービス契約変更種別コード（処理区分）：引継 */
	private final String KKOP_SYORI_KBN_CON = "2";

	/** 機器オプションサービス契約変更種別コード（処理区分）：変更 */
	private final String KKOP_SYORI_KBN_CHG = "4";
// ANK-1578-00-00 2013.12.24 T.TORIKAI ADD START（IT1-2013-0001736）

// ANK-1578-00-00 2014.01.27 T.TORIKAI ADD START（IT1-2014-0000047）
	/** 利用サービス変更区分: 引継 ※サービス追加判定用 */
	private static final String USE_SVC_CHG_DIV_CON = "0";

	/** 利用サービス変更区分: 変更 ※サービス追加判定用 */
	private static final String USE_SVC_CHG_DIV_CHG = "1";
// ANK-1578-00-00 2014.01.27 T.TORIKAI ADD END  （IT1-2014-0000047）

	/** 利用サービス変更区分: 追加 ※サービス追加判定用 */
	private static final String USE_SVC_CHG_DIV_ADD = "3";

	/** 利用サービス変更区分: 解約 ※サービス解約判定用 */
	private static final String USE_SVC_CHG_DIV_DSL = "4";

	/** 自動登録機器倉庫コード */
	private static final String SOKO_CD_AUTO_REGIST = "000001";

	/** 配送有無：必要 */
	private static final String HAISO_FLG_NEED = "1";

// ANK-1578-00-00 2014.01.27 T.TORIKAI ADD START（IT1-2014-0000047）
	/** CC呼出用キー：ルーターキャンセル */
	private static final String FIXED_TEXT_ROUTER_CANCEL = "_ROUTER_CANCEL";

	/** CC呼出用キー：ルーター解約 */
	private static final String FIXED_TEXT_ROUTER_DSL = "_ROUTER_DSL";

	/** CC呼出用キー：ＶＡキャンセル */
	private static final String FIXED_TEXT_TEL_VA_CANCEL = "_TEL_VA_CANCEL";

	/** CC呼出用キー：ＶＡ解約 */
	private static final String FIXED_TEXT_TEL_VA_DSL = "_TEL_VA_DSL";

	/** CC呼出用キー：配送取消（多機能ルーター） */
	private static final String FIXED_TEXT_HAISO_CANCEL_MULTI_ROUTER = "_HAISO_CANCEL_MULTI_ROUTER";

	/** CC呼出用キー：配送取消（ルーター） */
	private static final String FIXED_TEXT_HAISO_CANCEL_ROUTER = "_HAISO_CANCEL_ROUTER";

	/** CC呼出用キー：配送取消（ＶＡ） */
	private static final String FIXED_TEXT_HAISO_CANCEL_TEL_VA = "_HAISO_CANCEL_TEL_VA";
// ANK-1578-00-00 2014.01.27 T.TORIKAI ADD END  （IT1-2014-0000047）

	/** セッションハンドル保持域 */
	private static ThreadLocal<SessionHandle> keepSesHandle = new ThreadLocal<SessionHandle>();

	/** リクエストパラメータ保持域 */
	private static ThreadLocal<IRequestParameterReadWrite> keepReqParam = new ThreadLocal<IRequestParameterReadWrite>();

	/** FixedText保持域 */
	private static ThreadLocal<String> keepFixedText = new ThreadLocal<String>();

	/** 住所変更登録コモンコンポーネントマッピングクラスインスタンス */
	private JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();

	/** SCリクエストInvoker */
	private ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD START（IT1-2013-0001743）
	/** 住所変更明細：機器オプションサービス契約 */
	private List<Map<String, String>> adchgDtlKkopList = null;
// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD END  （IT1-2013-0001743）

// ANK-1578-00-00 2014.01.27 T.TORIKAI ADD START（IT1-2014-0000047）
	/** 多機能ルータの機器提供サービス契約番号：追加時 */
	private String appendMultiRouterNo = null;

	/** 多機能ルータの機器提供サービス契約番号：キャンセル時 */
	private String cancelMultiRouterNo = null;
// ANK-1578-00-00 2014.01.27 T.TORIKAI ADD END  （IT1-2014-0000047）
// IT2-2014-0000197 2014.04.18 Y.Kanata ADD START
	/** 機器オプションサービス契約変更種別コード（処理区分）：残置 */
	private final String KKOP_SYORI_KBN_ZAN = "2";
	/** 機器オプションVA機能の１番号コース料金コード */
	private static String KKOP_VA_1NUM_PCRS_CD = "G03";
	/** 機器オプションVA機能の１番号コース料金コード */
	private static String KKOP_VA_2NUM_PCRS_CD = "G04";
// IT2-2014-0000197 2014.04.18 Y.Kanata ADD END

	/**
	 * 機器オプションの追加、変更
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable {
		try {
			/** リソース保持 */
			keepSesHandle.set( handle );	// セッションハンドル
			keepReqParam.set( param );		// リクエストパラメータ
			keepFixedText.set( fixedText );	// FixedText

			HashMap<String, Object> parameter = getRequestParameter();
			if (parameter == null || parameter.isEmpty()) {
				return param;
			}

			// ネットサービスの状態
			String netUse = (String)parameter.get("net_svc_use_chg_div");
			// 電話サービスの状態
			String telUse = (String)parameter.get("tel_svc_use_chg_div");
			// 機器オプション情報
			List<Map<String, String>> kkopInfoList = (List<Map<String, String>>)parameter.get("kkop_info_list");
			// 配送フラグ
			boolean haisoFlg = false;
			if (HAISO_FLG_NEED.equals(parameter.get("haiso_flg"))) {
				haisoFlg = true;
			}
// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD START（IT1-2013-0001743）
			// 住変明細：機器オプションサービス契約の格納先を初期化
			adchgDtlKkopList = new ArrayList<Map<String, String>>();
// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD END  （IT1-2013-0001743）
// ANK-1578-00-00 2013.12.24 T.TORIKAI ADD START（IT1-2013-0001736）
			// 転居先で使用する多機能ルータの機器提供サービス契約番号を取得する
			String kktkSvcKeiNo = getKktkSvcKeiNo(kkopInfoList);
// ANK-1578-00-00 2013.12.24 T.TORIKAI ADD END  （IT1-2013-0001736）
// ANK-2290-00-00 2015.12.14 M.HAYASHI ADD START
			// 機器提供サービス契約番号存在フラグ
			boolean kktkSvcKeiNoFlg = true;
			// 機器提供サービス契約番号が存在しない
			if (kktkSvcKeiNo == null){
				kktkSvcKeiNoFlg = false;
			}
// ANK-2290-00-00 2015.12.14 M.HAYASHI ADD END
			for (Map<String, String> kkopInfo : kkopInfoList) {
				// 処理区分
				String kkopSyoriKbn = kkopInfo.get("kkop_syori_kbn");
				// 追加
				if (KKOP_SYORI_KBN_ADD.equals(kkopSyoriKbn)) {
// ANK-1578-00-00 2013.12.24 T.TORIKAI MOD START（IT1-2013-0001736）
//					addKkop(kkopInfo, netUse, telUse, haisoFlg);
					kktkSvcKeiNo = addKkop(kkopInfo, netUse, telUse, haisoFlg, kktkSvcKeiNo);
// ANK-1578-00-00 2013.12.24 T.TORIKAI MOD END  （IT1-2013-0001736）
				}
				
				// 解約
				if (KKOP_SYORI_KBN_DSL.equals(kkopSyoriKbn)) {
					dslKkop(kkopInfo, netUse, telUse);
				}
// ANK-1578-00-00 2013.12.24 T.TORIKAI MOD START（IT1-2013-0001736）
// ANK-2290-00-00 2015.12.14 M.HAYASHI MOD START
//				// 引継・変更
//				if (KKOP_SYORI_KBN_CON.equals(kkopSyoriKbn) || KKOP_SYORI_KBN_CHG.equals(kkopSyoriKbn)) {
//					chgKkop(kkopInfo, netUse, telUse, haisoFlg, kktkSvcKeiNo);
//				}
				// 引継・変更
				if ((KKOP_SYORI_KBN_CON.equals(kkopSyoriKbn) ||
						KKOP_SYORI_KBN_CHG.equals(kkopSyoriKbn)) &&
							(kktkSvcKeiNoFlg == true)){
					chgKkop(kkopInfo, netUse, telUse, haisoFlg, kktkSvcKeiNo);
				}
				// 引継・変更且つ機器提供サービス番号が存在しない
				if ((KKOP_SYORI_KBN_CON.equals(kkopSyoriKbn) ||
						KKOP_SYORI_KBN_CHG.equals(kkopSyoriKbn)) &&
							(kktkSvcKeiNoFlg == false)){
					// 撤去し新規追加の為、解約後に追加
					dslKkop(kkopInfo, netUse, telUse);		// 解約
					kktkSvcKeiNo = addKkop(kkopInfo, netUse, telUse, haisoFlg, kktkSvcKeiNo);		// 追加
				}
// ANK-2290-00-00 2015.12.14 M.HAYASHI MOD END
// ANK-1578-00-00 2013.12.24 T.TORIKAI MOD END  （IT1-2013-0001736）
			}
// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD START（IT1-2013-0001743）
			// 住変明細の情報をワーク領域へ格納する
			addKkopInfoCcWork();
// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD END  （IT1-2013-0001743）

			return param;

		} finally {
			/** リソース開放 */
			if (keepSesHandle.get() != null) {
				keepSesHandle.remove();		// セッションハンドル開放
			}
			if (keepReqParam.get() != null) {
				keepReqParam.remove();		// リクエストパラメータ開放
			}
			if (keepFixedText.get() != null) {
				keepFixedText.remove();		// FixedText開放
			}
		}
	}

// ANK-1664-00-00 2014.01.12 T.TORIKAI メソッド追加
	/**
	 * 機器オプションの追加、変更（２周目用）
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute2(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable {
		try {
			/** リソース保持 */
			keepSesHandle.set( handle );	// セッションハンドル
			keepReqParam.set( param );		// リクエストパラメータ
			keepFixedText.set( fixedText );	// FixedText

			HashMap<String, Object> parameter = getRequestParameter();
			if (parameter == null || parameter.isEmpty()) {
				return param;
			}

			// ネットサービスの状態
			String netUse = (String)parameter.get("net_svc_use_chg_div");
			// 電話サービスの状態
			String telUse = (String)parameter.get("tel_svc_use_chg_div");
			// 機器オプション情報
			List<Map<String, String>> kkopInfoList = (List<Map<String, String>>)parameter.get("kkop_info_list");
			// 配送フラグ
			boolean haisoFlg = false;
			if (HAISO_FLG_NEED.equals(parameter.get("haiso_flg"))) {
				haisoFlg = true;
			}
			// 一時保存：機器オプション
			ArrayList<HashMap<String, Object>> listEKK2881B001 = getKkopTppv();

			// 多機能ルータの機器提供サービス契約番号をを取得
			String multiRouterNo = getKktkSvcKeiNoAddMultiRouter(false);	// 転居先の回線に追加された機器より取得
			if (StringUtils.isEmpty(multiRouterNo)) {
				multiRouterNo = getKktkSvcKeiNo(kkopInfoList);				// 転居元より移設される機器より取得
			}

			// 住変明細：機器オプションサービス契約の格納先を初期化
			adchgDtlKkopList = new ArrayList<Map<String, String>>();

// ANK-1578-00-00 2014.01.27 T.TORIKAI ADD START（IT1-2014-0000047）
			// 多機能ルータの追加・キャンセルの有無を初期化
			appendMultiRouterNo = null;
			cancelMultiRouterNo = null;
// ANK-1578-00-00 2014.01.27 T.TORIKAI ADD END  （IT1-2014-0000047）

// ANK-2290-00-00 2015.12.14 M.HAYASHI ADD START
			// 転居先で使用する多機能ルータの機器提供サービス契約番号を取得する
			String kktkSvcKeiNo = getKktkSvcKeiNo(kkopInfoList);
			// 機器提供サービス契約番号存在フラグ
			boolean kktkSvcKeiNoFlg = true;
			// 機器提供サービス契約番号が存在しない
			if (kktkSvcKeiNo == null){
				kktkSvcKeiNoFlg = false;
			}
// ANK-2290-00-00 2015.12.14 M.HAYASHI ADD END
			for (Map<String, String> kkopInfo : kkopInfoList) {
				// 処理区分
				String kkopSyoriKbn = kkopInfo.get("kkop_syori_kbn");
// IT2-2014-0000197 2014.04.18 Y.Kanata ADD START
				String kkopSvcKeiNo = kkopInfo.get("kkop_svc_kei_no");
// ANK-2290-00-00 2015.12.14 M.HAYASHI MOD START
//				String kktkSvcKeiNo = kkopInfo.get("kktk_svc_kei_no");
				kktkSvcKeiNo = kkopInfo.get("kktk_svc_kei_no");
// ANK-2290-00-00 2015.12.14 M.HAYASHI MOD END
				String kkopSvcCd = kkopInfo.get("kkop_svc_cd");
// IT2-2014-0000197 2014.04.18 Y.Kanata ADD END
				
				// 追加
				if (KKOP_SYORI_KBN_ADD.equals(kkopSyoriKbn)) {
					multiRouterNo = appendKkop(kkopInfo, netUse, telUse, haisoFlg, multiRouterNo, listEKK2881B001);
// IT2-2014-0000197 2014.04.18 Y.Kanata ADD START
					// 下記3点の条件に当て嵌まる場合、住所変更登録では機器オプションVA機能の料金コースが更新されず
					// 住所変更確定処理においても料金コースが更新されないため料金コースの更新を行う。
					//	1.住所変更登録で追加された機器オプションのVA機能であること
					//	2.電話サービス追加ではない
					//	3.住所変更の修正モードで番号追加・番号解約を行う
					changeKkopVaCourse(parameter, kkopSvcCd, listEKK2881B001);
// IT2-2014-0000197 2014.04.18 Y.Kanata ADD END
				}

// IT2-2014-0000197 2014.04.18 Y.Kanata DEL START
// 処理追加時に変数使用のためfor開始直後に移動
//				String kkopSvcKeiNo = kkopInfo.get("kkop_svc_kei_no");
//				String kktkSvcKeiNo = kkopInfo.get("kktk_svc_kei_no");
//				String kkopSvcCd = kkopInfo.get("kkop_svc_cd");
// IT2-2014-0000197 2014.04.18 Y.Kanata DEL END
				
				// 解約
				if (KKOP_SYORI_KBN_DSL.equals(kkopSyoriKbn)) {
					// 解約：２周目で新たに機器オプションを解約することはないので処理不要
					// 住変明細用の処理結果のみ追加する
					appendAdchgDltKkopList(kktkSvcKeiNo, null, kkopSvcKeiNo, null, kkopSvcCd);
				}
// ANK-2290-00-00 2015.12.14 M.HAYASHI MOD START
//				// 引継・変更
//				if (KKOP_SYORI_KBN_CON.equals(kkopSyoriKbn) || KKOP_SYORI_KBN_CHG.equals(kkopSyoriKbn)) {
//					// 引継：２周目では「変更」→「引継」が発生するが、料金コースは住変確定で変更されるため不要
//					// 変更：２周目では「引継」→「変更」が発生するが、料金コースは住変確定で変更されるため不要
//					// 住変明細用の処理結果のみ追加する
//					String sakiKkopSvcKeiNo = getSakiKkopSvcKeiNo(kktkSvcKeiNo, multiRouterNo, kkopSvcKeiNo);
//					appendAdchgDltKkopList(kktkSvcKeiNo, multiRouterNo, kkopSvcKeiNo, sakiKkopSvcKeiNo, kkopSvcCd);
//// IT2-2014-0000197 2014.04.18 Y.Kanata ADD START
//					// ネット残置・電話引越による新多機能ルータ出荷時、機器オプション(VA機能)の料金コース変更を行う。
//					if (KKOP_SYORI_KBN_ZAN.equals(netUse)) {
//						changeKkopVaCourse(parameter, kkopSvcCd, listEKK2881B001);
//					}
//// IT2-2014-0000197 2014.04.18 Y.Kanata ADD END
				// 引継・変更
				if ((KKOP_SYORI_KBN_CON.equals(kkopSyoriKbn) ||
						KKOP_SYORI_KBN_CHG.equals(kkopSyoriKbn)) &&
							(kktkSvcKeiNoFlg == true)){
					// 引継：２周目では「変更」→「引継」が発生するが、料金コースは住変確定で変更されるため不要
					// 変更：２周目では「引継」→「変更」が発生するが、料金コースは住変確定で変更されるため不要
					// 住変明細用の処理結果のみ追加する
					String sakiKkopSvcKeiNo = getSakiKkopSvcKeiNo(kktkSvcKeiNo, multiRouterNo, kkopSvcKeiNo);
					appendAdchgDltKkopList(kktkSvcKeiNo, multiRouterNo, kkopSvcKeiNo, sakiKkopSvcKeiNo, kkopSvcCd);
// IT2-2014-0000197 2014.04.18 Y.Kanata ADD START
					// ネット残置・電話引越による新多機能ルータ出荷時、機器オプション(VA機能)の料金コース変更を行う。
					if (KKOP_SYORI_KBN_ZAN.equals(netUse)) {
						changeKkopVaCourse(parameter, kkopSvcCd, listEKK2881B001);
					}
// IT2-2014-0000197 2014.04.18 Y.Kanata ADD END
				}
				// 引継・変更且つ機器提供サービス番号が存在しない
				if ((KKOP_SYORI_KBN_CON.equals(kkopSyoriKbn) ||
						KKOP_SYORI_KBN_CHG.equals(kkopSyoriKbn)) &&
							(kktkSvcKeiNoFlg == false)){
					// 住変明細用の処理結果のみ追加する
					appendAdchgDltKkopList(kktkSvcKeiNo, null, kkopSvcKeiNo, null, kkopSvcCd);
					multiRouterNo = appendKkop(kkopInfo, netUse, telUse, haisoFlg, multiRouterNo, listEKK2881B001);
					changeKkopVaCourse(parameter, kkopSvcCd, listEKK2881B001);
// IT2-2014-0000197 2014.04.18 Y.Kanata ADD START
					// ネット残置・電話引越による新多機能ルータ出荷時、機器オプション(VA機能)の料金コース変更を行う。
					if (KKOP_SYORI_KBN_ZAN.equals(netUse)) {
						changeKkopVaCourse(parameter, kkopSvcCd, listEKK2881B001);
					}
// IT2-2014-0000197 2014.04.18 Y.Kanata ADD END
				}
// ANK-2290-00-00 2015.12.14 M.HAYASHI MOD END
			}

// ANK-1578-00-00 2014.01.23 T.TORIKAI ADD START（IT1-2014-0000040）
			// 住変明細の情報をワーク領域へ格納する
			addKkopInfoCcWork();
// ANK-1578-00-00 2014.01.23 T.TORIKAI ADD END  （IT1-2014-0000040）

			// 転居先に追加した機器オプションが不要になった場合はキャンセルする
			cancelKkop(listEKK2881B001, kkopInfoList);
			
// IT1-2014-0000040 2014/01/24 阮 ADD START
			// 機器提供サービス契約のキャンセル要否判断
			cancelKktkSvcKei(multiRouterNo);
// IT1-2014-0000040 2014/01/24 阮 ADD END

// ANK-1578-00-00 2014.01.27 T.TORIKAI ADD START（IT1-2014-0000047）
			// 多機能ルータ追加時は「追加」「引継」したBBR・VAを「キャンセル」「撤去する」
			if (!StringUtils.isEmpty(appendMultiRouterNo)) {
				cancelOtherKiki(appendMultiRouterNo);
			}
			// 多機能ルータキャンセル時は配送取消し
			if (!StringUtils.isEmpty(cancelMultiRouterNo)) {
				String svcKeiNo = (String)parameter.get("eoh_tl_svc_kei_no");
				haisoCancel(cancelMultiRouterNo, svcKeiNo);
			}
// ANK-1578-00-00 2014.01.27 T.TORIKAI ADD END  （IT1-2014-0000047）

			return param;

		} finally {
			/** リソース開放 */
			if (keepSesHandle.get() != null) {
				keepSesHandle.remove();		// セッションハンドル開放
			}
			if (keepReqParam.get() != null) {
				keepReqParam.remove();		// リクエストパラメータ開放
			}
			if (keepFixedText.get() != null) {
				keepFixedText.remove();		// FixedText開放
			}
		}
	}

// ANK-1578-00-00 2014.01.20 T.TORIKAI メソッド追加（IT2-2014-0000046）
	/**
	 * 住所変更・確定時に機器オプションをサービス提供中とする
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite kkopServiceStart(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable {
		try {
			/** リソース保持 */
			keepSesHandle.set( handle );	// セッションハンドル
			keepReqParam.set( param );		// リクエストパラメータ
			keepFixedText.set( fixedText );	// FixedText

			HashMap<String, Object> parameter = getRequestParameter();
			if (parameter == null || parameter.isEmpty()) {
				return param;
			}

			String adchgNo = (String)parameter.get("adchg_no");				// 住所変更番号
			String neySvcKeiNo = (String)parameter.get("net_svc_kei_no");	// サービス契約番号（ネット）
			String telSvcKeiNo = (String)parameter.get("tel_svc_kei_no");	// サービス契約番号（電話）
// IT2-2014-0000089対応 20140127 星野 ADD START
			String netMskmDtlNo = (String)parameter.get("net_mskm_dtl_no");
			String telMskmDtlNo = (String)parameter.get("tel_mskm_dtl_no");
// IT2-2014-0000089対応 20140127 星野 ADD END
			String idoDiv = (String)parameter.get("ido_div");				// 異動区分

			// 住変明細（機器オプション）取得
			ArrayList<HashMap<String, Object>> listEKK2101B001 = getEKK2101B001(adchgNo, "09");
			if (listEKK2101B001 == null) {
				return param;
			}
			for (HashMap<String, Object> mapEKK2101B001 : listEKK2101B001) {
				String afterNo = (String)mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHAF_SKBT_NO);
				if (StringUtils.isEmpty(afterNo)) {
					continue;	// 転居先に存在しないので対象外
				}
				if (!isNeedServieStart(afterNo, neySvcKeiNo, telSvcKeiNo)) {
					continue;	// ステータス変更の対象外
				}
				// サービス提供中へ
				startKkopSvcKei(afterNo, idoDiv);
				
// IT2-2014-0000089対応 20140127 星野 ADD START
				dslOldKktk(adchgNo, afterNo, netMskmDtlNo, telMskmDtlNo, idoDiv);
// IT2-2014-0000089対応 20140127 星野 ADD END
			}

			return param;

		} finally {
			/** リソース開放 */
			if (keepSesHandle.get() != null) {
				keepSesHandle.remove();		// セッションハンドル開放
			}
			if (keepReqParam.get() != null) {
				keepReqParam.remove();		// リクエストパラメータ開放
			}
			if (keepFixedText.get() != null) {
				keepFixedText.remove();		// FixedText開放
			}
		}
	}


// IT2-2014-0000089対応 20140127 星野 ADD START
	private void dslOldKktk(String adchgNo, String kkopSvcKeiNo, String netMskmDtlNo, String telMskmDtlNo, String idoDiv) throws Throwable {
		
		// 機器オプションサービス契約一意照会
		HashMap<String, Object> mapEKK2811A010 = (HashMap<String, Object>)getEKK2811A010(kkopSvcKeiNo);
		if (mapEKK2811A010 == null) {
			return;
		}
		String taknKikiSbtCd;
		String mskmDtlNo;
		String kkopSvcCd = (String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.KKOP_SVC_CD);
		if( KKOP_SVC_CD_ROUTER.equals(kkopSvcCd) ){
			// ルータ機能に対応するのは旧ルータ
			taknKikiSbtCd = "F0";
			mskmDtlNo = netMskmDtlNo;
		}else if( KKOP_SVC_CD_TEL_VA.equals(kkopSvcCd) ){
			// VA機能に対応するのは旧VA
			taknKikiSbtCd = "50";
			mskmDtlNo = telMskmDtlNo;
		}else{
			return;
		}
		
		
		// 住変明細（機器提供サービス契約）取得
		ArrayList<HashMap<String, Object>> listEKK2101B001 = getEKK2101B001(adchgNo, "03");
		if (listEKK2101B001 == null) {
			return;
		}
		for (HashMap<String, Object> mapEKK2101B001 : listEKK2101B001) {
			String chgTgKeiNo = (String)mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHG_TG_KEI_NO);
			String chbfSkbtNo = (String)mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHBF_SKBT_NO);
			String chafSkbtNo = (String)mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHAF_SKBT_NO);
			
			// 機器解約/交換（多）となっているものを対象とする
			if(!StringUtils.isEmpty(chbfSkbtNo) && StringUtils.isEmpty(chafSkbtNo)){
				// 機器提供サービス契約一覧照会
				ArrayList<HashMap<String, Object>> listEKK0341B032 = (ArrayList<HashMap<String, Object>>)getEKK0341B032(chgTgKeiNo);
				if (listEKK0341B032 == null || listEKK0341B032.isEmpty()) {
					continue;
				}
				HashMap<String, Object> mapEKK0341B032 = listEKK0341B032.get(0);
				if (mapEKK0341B032 == null) {
					continue;
				}
				
				// 対象機器か判定
				if(!taknKikiSbtCd.equals(mapEKK0341B032.get(EKK0341B032CBSMsg1List.TAKNKIKI_SBT_CD))){
					continue;
				}
				
				// すでに解約済なら処理対象外
				String kktkSvcKeiStat = (String)mapEKK0341B032.get(EKK0341B032CBSMsg1List.KKTK_SVC_KEI_STAT);
				if("910".equals(kktkSvcKeiStat) || "920".equals(kktkSvcKeiStat)){
					continue;
				}
				
				// 機器提供サービス契約解約呼び出し
				String lastUpdDtm = (String) mapEKK0341B032.get(EKK0341B032CBSMsg1List.LAST_UPD_DTM);
				
				if(!StringUtils.isEmpty(mskmDtlNo)){
					mapEKK0341B032.put(JKKAdchgConstCC.PARAM_KEY_MSKM_DTL_NO, mskmDtlNo);
				}
				mapEKK0341B032.put(EKK0341C340CBSMsg.RSV_TSTA_KIBO_YMD, JCCBPCommon.getOpeDate(null));
				mapEKK0341B032.put(EKK0341C340CBSMsg.SVC_ENDYMD, JCCBPCommon.getOpeDate(null));
				mapEKK0341B032.put(EKK0341C340CBSMsg.SVC_CHRG_ENDYMD, JCCBPCommon.getOpeDate(null));
				mapEKK0341B032.put(EKK0341C340CBSMsg.PNLTY_HASSEI_CD, null);
				mapEKK0341B032.put(EKK0341C340CBSMsg.IDO_DIV, idoDiv);
				mapEKK0341B032.put(JKKAdchgMapperCC.UPD_DT_KKTK_SVC_KEI_UPD_DTM_BEF, lastUpdDtm);

				HashMap<String, Object> reqMap = mapper.setEKK0341C340(keepReqParam.get(), keepFixedText.get(), mapEKK0341B032);
				Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
				HashMap<String, Object> kk0341_c340_map = mapper.getEKK0341C340(keepReqParam.get(), keepFixedText.get(), resMap);
				mapper.scResultCheck(keepReqParam.get());
				
				lastUpdDtm = (String) kk0341_c340_map.get(EKK0341C340CBSMsg.UPD_DTM);
				mapEKK0341B032.put(EKK0341C350CBSMsg.UPD_DTM_BF, lastUpdDtm);

				// 機器提供サービス契約解約確定呼び出し
				reqMap = mapper.setEKK0341C350(keepReqParam.get(), keepFixedText.get(), mapEKK0341B032);
				resMap = scCall.run(reqMap, keepSesHandle.get());
				mapper.getEKK0341C350(keepReqParam.get(), keepFixedText.get(), resMap);
				mapper.scResultCheck(keepReqParam.get());
			}
		}

		

	}
// IT2-2014-0000089対応 20140127 星野 ADD END
	/**
	 * カレントＣＣ用のパラメータを取得
	 * @return
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> getRequestParameter() throws Throwable {
		return (HashMap<String, Object>)keepReqParam.get().getData(keepFixedText.get());
	}

	/**
	 * 機器オプション追加処理
	 * 
	 * @param kkopInfo			機器オプション情報
	 * @param netUse			ネットサービスの状態
	 * @param telUse			電話サービスの状態
	 * @param haisoFlg			配送有無
	 * @param multiRouterNo		転居先で使用する多機能ルータの機器提供サービス契約番号
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
// ANK-1578-00-00 2013.12.24 T.TORIKAI MOD START（IT1-2013-0001736）
//	private void addKkop(Map<String, String> kkopInfo, String netUse, String telUse, boolean haisoFlg) throws Throwable {
	private String addKkop(Map<String, String> kkopInfo, String netUse, String telUse, boolean haisoFlg, String multiRouterNo) throws Throwable {
// ANK-1578-00-00 2013.12.24 T.TORIKAI MOD END  （IT1-2013-0001736）

		HashMap<String, Object> paramMap = getRequestParameter();

		boolean multiRouterAddFlg = false;		// 多機能ルータ追加有無

		// 多機能ルータが無い場合は追加する
// ANK-1578-00-00 2013.12.24 T.TORIKAI MOD START（IT1-2013-0001736）
//		String kktkSvcKeiNo = (String)kkopInfo.get("kktk_svc_kei_no");
		String kktkSvcKeiNo = multiRouterNo;
// ANK-1578-00-00 2013.12.24 T.TORIKAI MOD END  （IT1-2013-0001736）
		// 20141008 ANK-1918-06-00 配送予定年月日を配送受付処理にI/Fするよう修正 ADD START
		// 配送予定年月日
		String haisoRsvYmd = null;
		// 20141008 ANK-1918-06-00 配送予定年月日を配送受付処理にI/Fするよう修正 ADD END
		if (StringUtils.isEmpty(kktkSvcKeiNo)) {
			// 機器提供サービス契約登録
			HashMap<String, String> multiRouterInfo = (HashMap<String, String>)paramMap.get("multi_router_info");
			multiRouterInfo.put("seiky_kei_no", (String)paramMap.get("seiky_kei_no"));
			// 20141008 ANK-1918-06-00 配送予定日を配送受付処理にI/Fするよう修正 DEL START
//			// 20140811 IT1-2014-0000289 マンション（イーサ・VDDSL）で工事予定取込前の場合、配送予定年月日に未来日を設定する ADD
//			// 配送依頼指定年月日取得
//			String haisoReqShiteiYmd = getHaisoReqShiteiYmd();
//			
//			if(!JKKBpCommon.isNull(haisoReqShiteiYmd))
//			{
//				multiRouterInfo.put("haiso_req_shitei_ymd", haisoReqShiteiYmd);
//			}
//			// 20140811 IT1-2014-0000289 マンション（イーサ・VDDSL）で工事予定取込前の場合、配送予定年月日に未来日を設定する END
			// 20141008 ANK-1918-06-00 配送予定日を配送受付処理にI/Fするよう修正 DEL END

			// 20141008 ANK-1918-06-00 配送予定年月日を配送受付処理にI/Fするよう修正 ADD START
			haisoRsvYmd = getHaisoRsvYmd();
			// 20141008 ANK-1918-06-00 配送予定年月日を配送受付処理にI/Fするよう修正 ADD END
			Map<String, Object> mapEKK0341D010= registEKK0341D010(multiRouterInfo);
			kktkSvcKeiNo = (String)mapEKK0341D010.get(EKK0341D010CBSMsg.KKTK_SVC_KEI_NO);
			multiRouterAddFlg = true;
// ANK-1578-00-00 2014.01.27 T.TORIKAI ADD START（IT1-2014-0000047）
			appendMultiRouterNo = kktkSvcKeiNo;
// ANK-1578-00-00 2014.01.27 T.TORIKAI ADD END  （IT1-2014-0000047）
		}

// ANK-1578-00-00 2014.01.11 T.TORIKAI MOD START（IT2-2014-0000027）
//		// 機器提供サービス契約一意照会
//		Map<String, Object> mapEKK0341A010 = getEKK0341A010(kktkSvcKeiNo);
//		String lastUpdDtm = (String)mapEKK0341A010.get(EKK0341A010CBSMsg1List.LAST_UPD_DTM);
//
//		// 機器オプションを追加する
//		String kkopSvcCd = (String)kkopInfo.get("kkop_svc_cd");
//		if (KKOP_SVC_CD_ROUTER.equals(kkopSvcCd)) {
//			kkopInfo.put("mskm_dtl_no", (String)paramMap.get("mskm_dtl_no_nt"));
//		}
//		if (KKOP_SVC_CD_TEL_VA.equals(kkopSvcCd)) {
//			kkopInfo.put("mskm_dtl_no", (String)paramMap.get("mskm_dtl_no_tl"));
//		}
//		kkopInfo.put("kktk_svc_kei_no", kktkSvcKeiNo);
//		kkopInfo.put("seiky_kei_no", (String)paramMap.get("seiky_kei_no"));
//		kkopInfo.put("upd_dtm_bf", lastUpdDtm);
//
//		Map<String, Object> mapEKK2811D010 = registEKK2811D010(kkopInfo);
//		lastUpdDtm = (String)mapEKK2811D010.get(EKK2811D010CBSMsg.UPD_DTM);

		// 機器オプションのサービスコード
		String kkopSvcCd = (String)kkopInfo.get("kkop_svc_cd");
		String svcKeiNo = (String)kkopInfo.get("svc_kei_no");
		String mskmDtlNo = null;
		if (KKOP_SVC_CD_ROUTER.equals(kkopSvcCd)) {
			if (StringUtils.isEmpty(svcKeiNo)) {
				svcKeiNo = (String)paramMap.get("eoh_nt_svc_kei_no");
			}
			mskmDtlNo = (String)paramMap.get("mskm_dtl_no_nt");
		}
		if (KKOP_SVC_CD_TEL_VA.equals(kkopSvcCd)) {
			if (StringUtils.isEmpty(svcKeiNo)) {
				svcKeiNo = (String)paramMap.get("eoh_tl_svc_kei_no");
			}
			mskmDtlNo = (String)paramMap.get("mskm_dtl_no_tl");
		}

// ANK-1578-00-00 2014.01.15 T.TORIKAI DEL END  （IT2-2014-0000027）
//		// サービス契約一意照会
//		Map<String, Object> mapEKK0081A010 = getEKK0081A010(svcKeiNo);
//		String svcKeiLastUpdDtm = (String)mapEKK0081A010.get(EKK0081A010CBSMsg1List.LAST_UPD_DTM);
// ANK-1578-00-00 2014.01.15 T.TORIKAI DEL END  （IT2-2014-0000027）

		// 機器オプション追加のパラメータ編集
		kkopInfo.put("mskm_dtl_no", mskmDtlNo);
		kkopInfo.put("kktk_svc_kei_no", kktkSvcKeiNo);
		kkopInfo.put("seiky_kei_no", (String)paramMap.get("seiky_kei_no"));
// ANK-1578-00-00 2014.01.15 T.TORIKAI MOD END  （IT2-2014-0000027）
// ※住変では機器オプション登録時の排他制御はチェックプロパティの設定で無効としているため、
//   更新年月日時分秒（更新前）にはnullをセットする
//		kkopInfo.put("upd_dtm_bf", svcKeiLastUpdDtm);
		kkopInfo.put("upd_dtm_bf", null);
// ANK-1578-00-00 2014.01.15 T.TORIKAI MOD END  （IT2-2014-0000027）
		
		// 機器オプション登録（S-IF呼出）
		Map<String, Object> mapEKK2811D010 = registEKK2811D010(kkopInfo);
// ANK-1578-00-00 2014.01.11 T.TORIKAI MOD END  （IT2-2014-0000027）

// ANK-1578-00-00 2013.12.27 T.TORIKAI MOD START
//// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD START（IT1-2013-0001743）
//		// 住変明細：機器オプションの情報を追加する
//		appendAdchgDltKkopList(null, kktkSvcKeiNo, null, (String)mapEKK2811D010.get(EKK2811D010CBSMsg.KKTK_SVC_KEI_NO));
//// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD END  （IT1-2013-0001743）
		// 住変明細：機器オプションの情報を追加する
// ANK-1664-00-00 2014.01.13 T.TORIKAI MOD START
//		appendAdchgDltKkopList(null, kktkSvcKeiNo, null, (String)mapEKK2811D010.get(EKK2811D010CBSMsg.KKOP_SVC_CD));
		appendAdchgDltKkopList(null, kktkSvcKeiNo, null, (String)mapEKK2811D010.get(EKK2811D010CBSMsg.KKOP_SVC_KEI_NO), kkopSvcCd);
// ANK-1664-00-00 2014.01.13 T.TORIKAI MOD END
// ANK-1578-00-00 2013.12.27 T.TORIKAI MOD END

		// ワーク領域へ保存しておく
		addKkopInfoCcWork(mapEKK2811D010, multiRouterAddFlg);

		// 審査、照査
		boolean svcAddFlg = false;
		// ルータ機能追加
		if (KKOP_SVC_CD_ROUTER.equals(kkopSvcCd)) {
			if (USE_SVC_CHG_DIV_ADD.equals(kkopSvcCd)) {
				svcAddFlg = true;		// ネット追加
			}
// ANK-1578-00-00 2014.01.20 T.TORIKAI ADD START（ST-2014-0000026）
			else {
				if (isNetSvcChgDslAndNewAdd()) {
					svcAddFlg = true;	// 解約・新規なので転居先へはネット追加
				}
			}
// ANK-1578-00-00 2014.01.20 T.TORIKAI ADD END  （ST-2014-0000026）
		}
		// ＶＡ機能追加
		if (KKOP_SVC_CD_TEL_VA.equals(kkopSvcCd)) {
			if (USE_SVC_CHG_DIV_ADD.equals(kkopSvcCd)) {
				svcAddFlg = true;		// 電話追加
			}
		}
		if (!svcAddFlg) {
			// サービス追加時の機器オプション追加ではないので個別に照査する
			// ※サービス追加時であれば、サービスの審査、照査で一緒に実施される
			// ※個別の場合は審査は不要

			// 多機能ルータを照査
			if (multiRouterAddFlg) {
// ANK-1578-00-00 2014.01.11 T.TORIKAI MOD START（IT2-2014-0000027）
//				Map<String, Object> map0341C030 = verifyEKK0341C030(mapEKK0341A010, lastUpdDtm);
//				lastUpdDtm = (String)map0341C030.get(EKK0341D010CBSMsg.UPD_DTM);
				// 機器提供サービス契約一意照会
				Map<String, Object> mapEKK0341A010 = getEKK0341A010(kktkSvcKeiNo);
				String kktkSvcKeiLastUpdDtm = (String)mapEKK0341A010.get(EKK0341A010CBSMsg1List.LAST_UPD_DTM);
				// 機器提供サービス契約照査
				verifyEKK0341C030(mapEKK0341A010, kktkSvcKeiLastUpdDtm);
// ANK-1578-00-00 2014.01.11 T.TORIKAI MOD END  （IT2-2014-0000027）
			}
// ANK-1578-00-00 2014.01.11 T.TORIKAI ADD START（IT2-2014-0000027）
			// 機器オプションサービス契約一意照会
			String kkopSvcKeiNo = (String)mapEKK2811D010.get(EKK2811D010CBSMsg.KKOP_SVC_KEI_NO);
			Map<String, Object> mapEKK2811A010 = getEKK2811A010(kkopSvcKeiNo);
			String lastUpdDtm = (String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.LAST_UPD_DTM);
			if (StringUtils.isEmpty(lastUpdDtm)) {
				lastUpdDtm = (String)mapEKK2811D010.get(EKK2811D010CBSMsg.UPD_DTM);
			}
// ANK-1578-00-00 2014.01.11 T.TORIKAI ADD END  （IT2-2014-0000027）
			// 機器オプションを照査
			verifyEKK2811C030(mapEKK2811D010, lastUpdDtm);

// ANK-1578-00-00 2014.01.20 T.TORIKAI MOD START（ST-2014-0000026）
//			if (haisoFlg) {
			// 多機能ルータを追加し、配送作成が必要な場合
			if (multiRouterAddFlg && haisoFlg) {
// ANK-1578-00-00 2014.01.20 T.TORIKAI MOD END  （ST-2014-0000026）
				// 配送を作成
				ArrayList<HashMap<String, Object>> kktkSvcKeiInfList = new ArrayList<HashMap<String, Object>>();
				HashMap<String, Object> kktkSvcKeiInf = new HashMap<String, Object>();
				kktkSvcKeiInf.put("kktk_svc_kei_no", kktkSvcKeiNo);
				kktkSvcKeiInf.put("soko_cd", SOKO_CD_AUTO_REGIST);
				kktkSvcKeiInfList.add(kktkSvcKeiInf);
				// 物流部品呼出
				JKKBpCommon.createHaiso(keepReqParam.get()
									,	keepSesHandle.get()
									,	(String)paramMap.get("mskm_no")
									,	getMskmDtlNoMultiRouter()
									,	(String)paramMap.get("mskmsho_no")
									,	kktkSvcKeiInfList
									,	JKKSvcConst.IDO_DIV_ADCHGADD
									,	JKKSvcConst.ADCHG_IDO_DIVCOURSE_CHG
									,	new HashMap<String, Object>()
									,	keepFixedText.get()
									// 20141008 ANK-1918-06-00 配送予定年月日を配送受付処理にI/Fするよう修正 MOD START
//									, 	SOKO_CD_AUTO_REGIST);
									, 	SOKO_CD_AUTO_REGIST
									,	haisoRsvYmd
									);
									// 20141008 ANK-1918-06-00 配送予定年月日を配送受付処理にI/Fするよう修正 MOD END
			}
		}
// ANK-1578-00-00 2013.12.24 T.TORIKAI ADD START（IT1-2013-0001736）
		return kktkSvcKeiNo;
// ANK-1578-00-00 2013.12.24 T.TORIKAI ADD END  （IT1-2013-0001736）
	}

// ANK-1664-00-00 2014.01.12 T.TORIKAI メソッド追加
	/**
	 * 機器オプション追加処理（２周目用）
	 * @param kkopInfo
	 * @param netUse
	 * @param telUse
	 * @param haisoFlg
	 * @param multiRouterNo
	 * @param listEKK2881B001
	 * @return
	 * @throws Throwable
	 */
	private String appendKkop(Map<String, String> kkopInfo, String netUse, String telUse, boolean haisoFlg, String multiRouterNo, ArrayList<HashMap<String, Object>> listEKK2881B001) throws Throwable {

		// 既に追加済みの場合は処理不要
		String kkopSvcCd = kkopInfo.get("kkop_svc_cd");
		for (HashMap<String, Object> mapEKK2881B001 : listEKK2881B001) {
			String tppvKkopSvcCd = (String)mapEKK2881B001.get(EKK2881B001CBSMsg1List.KKOP_SVC_CD);
			if (kkopSvcCd.equals(tppvKkopSvcCd)) {
				// 追加済みなので処理不要
// ANK-1664-00-00 2014.01.14 T.TORIKAI ADD START
				appendAdchgDltKkopList(null, multiRouterNo, null, (String)mapEKK2881B001.get(EKK2881B001CBSMsg1List.KKOP_SVC_KEI_NO), kkopSvcCd);
// ANK-1664-00-00 2014.01.14 T.TORIKAI ADD END
				return multiRouterNo;
			}
		}

		// 追加
		String kktkSvcKeiNo = addKkop(kkopInfo, netUse, telUse, haisoFlg, multiRouterNo);

		return kktkSvcKeiNo;
	}

	/**
	 * 機器オプション登録結果の各種値をワーク領域へ格納する
	 * 
	 * @param mapEKK2811D010		機器オプションサービス契約登録結果
	 * @param multiRouterAddFlg		多機能ルータ追加有無
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void addKkopInfoCcWork(Map<String, Object> mapEKK2811D010, boolean multiRouterAddFlg) throws Exception {

		// 作業領域を取得
		Map workMap = keepReqParam.get().getMappingWorkArea();
		if (workMap == null) {
			workMap = new HashMap();
			keepReqParam.get().setMappingWorkArea(workMap);		// 未作成の場合はここで追加
		}

		// 機器オプションの作業領域を取得
		Map<String, Object> ccWorkMap =
			(Map<String, Object>)workMap.get(JKKAdchgConstCC.CC_WORK_AREA_NAME_KKOP);
		if (ccWorkMap == null) {
			ccWorkMap = new HashMap<String, Object>();
			workMap.put(JKKAdchgConstCC.CC_WORK_AREA_NAME_KKOP, ccWorkMap);		// 未作成の場合はここで追加
		}

		String kkopSvcCd = (String)mapEKK2811D010.get(EKK2811D010CBSMsg.KKOP_SVC_CD);
		Map<String, Object> kkopInfo = new HashMap<String, Object>();
		kkopInfo.put("kkop_svc_kei_no", mapEKK2811D010.get(EKK2811D010CBSMsg.KKOP_SVC_KEI_NO));
		kkopInfo.put("kktk_svc_kei_no", mapEKK2811D010.get(EKK2811D010CBSMsg.KKTK_SVC_KEI_NO));
		ccWorkMap.put(kkopSvcCd, kkopInfo);

		if (multiRouterAddFlg) {
			ccWorkMap.put("append_kktk_svc_kei_no", mapEKK2811D010.get(EKK2811D010CBSMsg.KKTK_SVC_KEI_NO));
		}
	}

// ANK-1578-00-00 2013.12.25 T.TORIKAI メソッド追加（IT1-2013-0001743）
	/**
	 * 機器オプション情報変更の処理結果をワーク領域へ格納する
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private void addKkopInfoCcWork() throws Exception {

		// 作業領域を取得
		Map workMap = keepReqParam.get().getMappingWorkArea();
		if (workMap == null) {
			workMap = new HashMap();
			keepReqParam.get().setMappingWorkArea(workMap);		// 未作成の場合はここで追加
		}

		// 機器オプションの作業領域を取得
		Map<String, Object> ccWorkMap =
			(Map<String, Object>)workMap.get(JKKAdchgConstCC.CC_WORK_AREA_NAME_KKOP);
		if (ccWorkMap == null) {
			ccWorkMap = new HashMap<String, Object>();
			workMap.put(JKKAdchgConstCC.CC_WORK_AREA_NAME_KKOP, ccWorkMap);		// 未作成の場合はここで追加
		}

		// 住変明細用の機器オプション情報を設定
		ccWorkMap.put(ADCHG_DTL_KKOP_LIST, adchgDtlKkopList);
	}

	/**
	 * 機器オプション解約処理
	 * 
	 * @param kkopInfo		機器オプション情報
	 * @param netUse		ネットサービスの状態
	 * @param telUse		電話サービスの状態
	 * @throws Throwable 
	 */
	private void dslKkop(Map<String, String> kkopInfo, String netUse, String telUse) throws Throwable {

// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD START（IT1-2013-0001743）
		// 住変明細：機器オプションの情報を追加する
// ANK-1664-00-00 2014.01.13 T.TORIKAI MOD START
//		appendAdchgDltKkopList(kkopInfo.get("kktk_svc_kei_no"), null, kkopInfo.get("kkop_svc_kei_no"), null);
		appendAdchgDltKkopList(kkopInfo.get("kktk_svc_kei_no"), null, kkopInfo.get("kkop_svc_kei_no"), null, (String)kkopInfo.get("kkop_svc_cd"));
// ANK-1664-00-00 2014.01.13 T.TORIKAI MOD END
// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD END  （IT1-2013-0001743）

		// サービス解約に伴う機器オプションの解約はサービス解約処理の中で行うのでここでは処理しない
		String kkopSvcCd = (String)kkopInfo.get("kkop_svc_cd");
		if (KKOP_SVC_CD_ROUTER.equals(kkopSvcCd)) {
			if (USE_SVC_CHG_DIV_DSL.equals(netUse)) {
				return;
			}
		}
		if (KKOP_SVC_CD_TEL_VA.equals(kkopSvcCd)) {
			if (USE_SVC_CHG_DIV_DSL.equals(telUse)) {
				return;
			}
		}

// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD START（IT1-2013-0001743）
		// 申込明細を設定
		Map<String, Object> paramMap = getRequestParameter();
		if (KKOP_SVC_CD_ROUTER.equals(kkopSvcCd)) {
			kkopInfo.put("mskm_dtl_no", (String)paramMap.get("mskm_dtl_no_nt"));
		}
		if (KKOP_SVC_CD_TEL_VA.equals(kkopSvcCd)) {
			kkopInfo.put("mskm_dtl_no", (String)paramMap.get("mskm_dtl_no_tl"));
		}
// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD END  （IT1-2013-0001743）

		// 機器オプション一意照会
		String kkopSvcKeiNo = kkopInfo.get("kkop_svc_kei_no");
		Map<String, Object> mapEKK2811A010 = getEKK2811A010(kkopSvcKeiNo);
		String lastUpdDtm = (String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.LAST_UPD_DTM);
		if (StringUtils.isEmpty(lastUpdDtm)) {
			lastUpdDtm = (String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.UPD_DTM);
		}

		// 機器オプション解約
		Map<String, Object> mapEKK2811C140 = dslEKK2811C140(kkopInfo, lastUpdDtm);

		// 機器オプション解約確定
		dslEKK2811C150(mapEKK2811C140);
	}

// ANK-1578-00-00 2013.12.24 T.TORIKAI メソッド追加（IT1-2013-0001736）
	/**
	 * 機器オプション引継・変更処理
	 * 
	 * @param kkopInfo			機器オプション情報
	 * @param netUse			ネットサービスの状態
	 * @param telUse			電話サービスの状態
	 * @param haisoFlg			配送有無
	 * @param multiRouterNo		転居先で使用する多機能ルータの機器提供サービス契約番号
	 * @throws Throwable 
	 */
	private String chgKkop(Map<String, String> kkopInfo, String netUse, String telUse, boolean haisoFlg, String multiRouterNo) throws Throwable {

		// 転居先で使用可能な多機能ルータが設定されている場合は処理不要
		String sakiMultiRouter = kkopInfo.get("kktk_svc_kei_no");
		if (!StringUtils.isEmpty(sakiMultiRouter)) {
// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD START（IT1-2013-0001743）
			// 住変明細：機器オプションの情報を追加する
			String kkopSvcKeiNo = kkopInfo.get("kkop_svc_kei_no");
// ANK-1664-00-00 2014.01.13 T.TORIKAI MOD START
//			appendAdchgDltKkopList(sakiMultiRouter, sakiMultiRouter, kkopSvcKeiNo, kkopSvcKeiNo);
			appendAdchgDltKkopList(sakiMultiRouter, sakiMultiRouter, kkopSvcKeiNo, kkopSvcKeiNo, (String)kkopInfo.get("kkop_svc_cd"));
// ANK-1664-00-00 2014.01.13 T.TORIKAI MOD END
// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD END  （IT1-2013-0001743）
			return multiRouterNo;
		}

// ANK-1664-00-00 2014.01.12 T.TORIKAI ADD START
		// 機器オプション一意照会
		String kkopSvcKeiNo = kkopInfo.get("kkop_svc_kei_no");
		Map<String, Object> mapEKK2811A010 = getEKK2811A010(kkopSvcKeiNo);
// ANK-1664-00-00 2014.01.12 T.TORIKAI ADD END

		// 転居元の多機能ルータは転居先に移動されないため、機器オプションは転居元を解約し、転居先に追加する
		Map<String, String> tmpKKopInfo = new HashMap<String, String>();
		tmpKKopInfo.putAll(kkopInfo);
		tmpKKopInfo.put("kkop_syori_kbn", KKOP_SYORI_KBN_DSL);
		tmpKKopInfo.put("kktk_svc_kei_no", kkopInfo.get("moto_kktk_svc_kei_no"));
		tmpKKopInfo.put("rsv_tsta_kibo_ymd", kkopInfo.get("dsl_rsv_tsta_kibo_ymd"));
		// 転居元の機器オプション解約
		dslKkop(tmpKKopInfo, netUse, telUse);

// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD START（IT1-2013-0001743）
		// 住変明細：機器オプションの情報を削除する（解約・新規で追加されるものを１つに纏める）
		adchgDtlKkopList.remove(adchgDtlKkopList.size() - 1);	// 最後に追加されたものを削除
// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD END  （IT1-2013-0001743）

		// 転居先へ機器オプション追加
		tmpKKopInfo.put("kkop_syori_kbn", KKOP_SYORI_KBN_ADD);
		tmpKKopInfo.put("kktk_svc_kei_no", multiRouterNo);
		tmpKKopInfo.put("rsv_tsta_kibo_ymd", kkopInfo.get("add_rsv_tsta_kibo_ymd"));
// ANK-1664-00-00 2014.01.12 T.TORIKAI ADD START
		// 料金コースは転居元と同じとしておく  ※料金コースの変更は住変確定に任せる
		tmpKKopInfo.put("pcrs_cd", (String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.PCRS_CD));
		tmpKKopInfo.put("pplan_cd", (String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.PPLAN_CD));
// ANK-1664-00-00 2014.01.12 T.TORIKAI ADD END
		String kktkSvcKeiNo = addKkop(tmpKKopInfo, netUse, telUse, haisoFlg, multiRouterNo);

// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD START（IT1-2013-0001743）
		// 住変明細：機器オプションの情報を更新する（解約・新規で追加されるものを１つに纏める）
		Map<String, String> adchgDtlKkopMap = adchgDtlKkopList.get(adchgDtlKkopList.size() - 1);	// 最後に追加されたものを取得
		adchgDtlKkopMap.put(MOTO_MULTI_ROUTER_KKTK_SVC_KEI_NO, kkopInfo.get("moto_kktk_svc_kei_no"));
		adchgDtlKkopMap.put(MOTO_KKOP_SVC_KEI_NO, kkopInfo.get("kkop_svc_kei_no"));
// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD END  （IT1-2013-0001743）

		return kktkSvcKeiNo;
	}

// ANK-1578-00-00 2013.12.24 T.TORIKAI メソッド追加（IT1-2013-0001736）
	/**
	 * 転居先で使用する多機能ルータの機器提供サービス契約番号を取得する
	 * @param kkopInfoList
	 * @return
	 */
	private String getKktkSvcKeiNo(List<Map<String, String>> kkopInfoList) {

		for (Map<String, String> kkopInfo : kkopInfoList) {
			// 処理区分
			String kkopSyoriKbn = kkopInfo.get("kkop_syori_kbn");
			if (KKOP_SYORI_KBN_DSL.equals(kkopSyoriKbn)) {
				continue;	// 解約は対象外
			}
			// 機器提供サービス契約番号
			String kktkSvcKeiNo = kkopInfo.get("kktk_svc_kei_no");
			if (StringUtils.isEmpty(kktkSvcKeiNo)) {
				continue;	// 機器提供サービス契約未設定
			}
			return kktkSvcKeiNo;
		}
		return null;	// 転居先に多機能ルータなし
	}

// ANK-1578-00-00 2013.12.25 T.TORIKAI ADD START（IT1-2013-0001743）
	/**
	 * 住変明細：機器オプションサービス契約の一覧に情報を追加する
	 * 
	 * @param motoMutiRouterNo
	 * @param sakiMutiRouterNo
	 * @param motoKkopSvcKeiNo
	 * @param sakiKkopSvcKeiNo
	 * @param kkopSvcCd
	 */
// ANK-1664-00-00 2014.01.13 T.TORIKAI MOD START
//	private void appendAdchgDltKkopList(String motoMutiRouterNo, String sakiMutiRouterNo, String motoKkopSvcKeiNo, String sakiKkopSvcKeiNo) {
	private void appendAdchgDltKkopList(String motoMutiRouterNo, String sakiMutiRouterNo, String motoKkopSvcKeiNo, String sakiKkopSvcKeiNo, String kkopSvcCd) {
// ANK-1664-00-00 2014.01.13 T.TORIKAI MOD END
		
		Map<String, String> adchgDtlKkopMap = new HashMap<String, String>();
		
		adchgDtlKkopMap.put(MOTO_MULTI_ROUTER_KKTK_SVC_KEI_NO, motoMutiRouterNo);
		adchgDtlKkopMap.put(SAKI_MULTI_ROUTER_KKTK_SVC_KEI_NO, sakiMutiRouterNo);
		adchgDtlKkopMap.put(MOTO_KKOP_SVC_KEI_NO, motoKkopSvcKeiNo);
		adchgDtlKkopMap.put(SAKI_KKOP_SVC_KEI_NO, sakiKkopSvcKeiNo);
// ANK-1664-00-00 2014.01.13 T.TORIKAI ADD START
		adchgDtlKkopMap.put(KKOP_SVC_CD, kkopSvcCd);
// ANK-1664-00-00 2014.01.13 T.TORIKAI ADD END
		
		adchgDtlKkopList.add(adchgDtlKkopMap);
	}

	/**
	 * EKK0341A010 機器提供サービス契約一意照会
	 * 
	 * @param kktkSvcKeiNo		機器提供サービス契約番号
	 * @return					機器提供サービス契約一意照会結果
	 * @throws Throwable
	 */
	private Map<String, Object> getEKK0341A010(String kktkSvcKeiNo) throws Throwable {

		// EKK2811D010_機器提供サービス契約登録
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, JCCBPCommon.getOpeDate(null));
		HashMap<String, Object> reqMap = mapper.setEKK0341A010(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		HashMap<String, Object> mapEKK0341A010 = mapper.getEKK0341A010(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());
		
		return mapEKK0341A010;
	}

	/**
	 * EKK0341C030 機器提供サービス契約照査
	 * 
	 * @param mapEKK0341A010	機器提供サービス契約一意照会結果
	 * @param updDtm			更新年月日時分秒
	 * @return					機器提供サービス契約照査結果
	 * @throws Throwable
	 */
	private Map<String, Object> verifyEKK0341C030(Map<String, Object> mapEKK0341A010, String updDtm) throws Throwable {

		// EKK0341C030 機器提供サービス契約照査
		HashMap<String, String> condMap = new HashMap<String, String>();
		// 機器提供サービス契約番号
		condMap.put(EKK0341C030CBSMsg.KKTK_SVC_KEI_NO, (String)mapEKK0341A010.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
		// 異動区分
		condMap.put(EKK0341C030CBSMsg.IDO_DIV, (String)mapEKK0341A010.get(JKKAdchgConstCC.PARAM_KEY_IDO_DIV));
		// 機器認証ID NULL
		condMap.put(EKK0341C030CBSMsg.KIKI_NINSHO_ID, null);
		// 機器認証IDパスワード NULL
		condMap.put(EKK0341C030CBSMsg.KIKI_NINSHO_ID_PWD, null);
		// 照査解約完了コード（照査OK）
		condMap.put(EKK0341C030CBSMsg.SHOSA_DSL_FIN_CD, SHOSA_DSL_FIN_CD_OK);
		// 更新年月日時分秒(更新前)
		condMap.put(EKK0341C030CBSMsg.UPD_DTM_BF, updDtm);

		HashMap<String, Object> reqMap = mapper.setEKK0341C030(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		Map<String, Object> mapEKK0341C320 = mapper.getEKK0341C320(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return mapEKK0341C320;
	}

	/**
	 * EKK0341D010 機器提供サービス契約登録
	 * 
	 * @return				機器提供サービス契約登録結果
	 * @throws Throwable
	 */
	private Map<String, Object> registEKK0341D010(Map<String, String> paramKktk) throws Throwable {

		// EKK0341D010_機器提供サービス契約登録
		HashMap<String, String> condMap = new HashMap<String, String>();

		// 機器提供サービスコード
		condMap.put(EKK0341D010CBSMsg.KKTK_SVC_CD, paramKktk.get(EKK0341D010CBSMsg.KKTK_SVC_CD));
		// 料金コースコード
		condMap.put(EKK0341D010CBSMsg.PCRS_CD, paramKktk.get(EKK0341D010CBSMsg.PCRS_CD));
		// 料金プランコード
		condMap.put(EKK0341D010CBSMsg.PPLAN_CD, paramKktk.get(EKK0341D010CBSMsg.PPLAN_CD));
		// 宅内機器種別コード
		condMap.put(EKK0341D010CBSMsg.TAKNKIKI_SBT_CD, paramKktk.get(EKK0341D010CBSMsg.TAKNKIKI_SBT_CD));
		// 機器提供種別コード
		condMap.put(EKK0341D010CBSMsg.KKTK_SBT_CD, "02");	// 02:レンタル
		condMap.put(EKK0341D010CBSMsg.HDD_CAPA_CD, "");
		condMap.put(EKK0341D010CBSMsg.SVC_USE_STA_KIBO_YMD, "");
		condMap.put(EKK0341D010CBSMsg.RSV_TSTA_KIBO_YMD_ERR, "");
		condMap.put(EKK0341D010CBSMsg.KIBO_MAKER_CD, "");
		// 販売種別コード
		condMap.put(EKK0341D010CBSMsg.HAMBAI_SBT_CD, "10");		// 10:新品
		condMap.put(EKK0341D010CBSMsg.TSUSHIN_KIKI_SET_CD, "");
		condMap.put(EKK0341D010CBSMsg.TAKNKIKI_MODEL_CD, "");
		condMap.put(EKK0341D010CBSMsg.KIKI_SEIZO_NO, "");
		condMap.put(EKK0341D010CBSMsg.TAKNKIKI_SETHIN_MODEL_CD, "");
		condMap.put(EKK0341D010CBSMsg.HUZOKUHIN_SBT_CD, "");
		// 移転先住所設置場所番号
		condMap.put(EKK0341D010CBSMsg.KIKI_STC_SAKI_PLACE_NO, getSetplaceNo(paramKktk));	// S-IFを使用して取得
		// 親契約識別コード
		condMap.put(EKK0341D010CBSMsg.OYA_KEI_SKBT_CD, "02");		// 02:サービス契約回線内訳
		condMap.put(EKK0341D010CBSMsg.SVC_KEI_NO, "");
		condMap.put(EKK0341D010CBSMsg.SVC_KEI_UCWK_NO, "");
		// サービス契約回線内訳番号
		String svcKeiKaisenUcwkNo = paramKktk.get(EKK0341D010CBSMsg.SVC_KEI_KAISEN_UCWK_NO);
		condMap.put(EKK0341D010CBSMsg.SVC_KEI_KAISEN_UCWK_NO, svcKeiKaisenUcwkNo);
		condMap.put(EKK0341D010CBSMsg.OP_SVC_KEI_NO, "");
		// SYSID
		condMap.put(EKK0341D010CBSMsg.SYSID, paramKktk.get(EKK0341D010CBSMsg.SYSID));
		// 申込明細番号
		condMap.put(EKK0341D010CBSMsg.MSKM_DTL_NO, getMskmDtlNoMultiRouter());
		condMap.put(EKK0341D010CBSMsg.LINK_STB_FLG, "");
		//  機器引当指定倉庫コード
		condMap.put(EKK0341D010CBSMsg.KIKI_HKAT_SHITEI_SOKO_CD, SOKO_CD_AUTO_REGIST);		// 000001:みなと倉庫コード
		// 機器引当指定倉庫棚コード
		condMap.put(EKK0341D010CBSMsg.KIKI_HKAT_SHITEI_SKDN_CD, "000");			// 000:通常棚
		condMap.put(EKK0341D010CBSMsg.KIKI_SORYO_UM, "");
		condMap.put(EKK0341D010CBSMsg.KIKI_SORYO_SAKSEI_YMD, "");
		
		// 送付先住所入力ありの場合
		if (!StringUtils.isEmpty(paramKktk.get(EKK0341D010CBSMsg.KIKI_SOHUS_PCD))){

			// 機器送付先住所手動入力フラグ
			condMap.put(EKK0341D010CBSMsg.KIKI_SHS_AD_MAN_INPUT_FLG, paramKktk.get(EKK0341D010CBSMsg.KIKI_SHS_AD_MAN_INPUT_FLG));
			// 機器送付先住所コード
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_AD_CD, paramKktk.get(EKK0341D010CBSMsg.KIKI_SOHUS_AD_CD));
			// 機器送付先郵便番号
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_PCD, paramKktk.get(EKK0341D010CBSMsg.KIKI_SOHUS_PCD));
			// 機器送付先都道府県名
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_STATE_NM, paramKktk.get(EKK0341D010CBSMsg.KIKI_SOHUS_STATE_NM));
			// 機器送付先市区町村名
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_CITY_NM, paramKktk.get(EKK0341D010CBSMsg.KIKI_SOHUS_CITY_NM));
			// 機器送付先大字通称名
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_OAZTSU_NM, paramKktk.get(EKK0341D010CBSMsg.KIKI_SOHUS_OAZTSU_NM));
			// 機器送付先字丁目名
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_AZCHO_NM, paramKktk.get(EKK0341D010CBSMsg.KIKI_SOHUS_AZCHO_NM));
			// 機器送付先番地号
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_BNCHIGO, paramKktk.get(EKK0341D010CBSMsg.KIKI_SOHUS_BNCHIGO));
			// 機器送付先住所補記・建物名
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_ADRTTM, paramKktk.get(EKK0341D010CBSMsg.KIKI_SOHUS_ADRTTM));
			// 機器送付先住所補記・部屋番号
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_ADRRM, paramKktk.get(EKK0341D010CBSMsg.KIKI_SOHUS_ADRRM));
			// 機器送付先名
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_NM, paramKktk.get(EKK0341D010CBSMsg.KIKI_SOHUS_NM));
			// 機器送付先カナ名
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_KANA, paramKktk.get(EKK0341D010CBSMsg.KIKI_SOHUS_KANA));
			// 機器送付先電話番号
// ANK-1578-00-00 2014.01.20 T.TORIKAI MOD START（ST-2014-0000022）
//			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_TELNO, paramKktk.get(EKK0341D010CBSMsg.KIKI_SOHUS_TELNO));
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_TELNO, paramKktk.get("kiki_shs_tln"));
// ANK-1578-00-00 2014.01.20 T.TORIKAI MOD END  （ST-2014-0000022）

		} else {
			// 機器送付先住所手動入力フラグ
			condMap.put(EKK0341D010CBSMsg.KIKI_SHS_AD_MAN_INPUT_FLG, "0");	// 手動入力ではない（移転先住所は手動入力不可）
			// 機器送付先住所コード
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_AD_CD, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_CD));
			// 機器送付先郵便番号
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_PCD, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_POST_CD));
			// 機器送付先都道府県名
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_STATE_NM, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_STATE));
			// 機器送付先市区町村名
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_CITY_NM, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_CITY));
			// 機器送付先大字通称名
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_OAZTSU_NM, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_OAZTSU));
			// 機器送付先字丁目名
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_AZCHO_NM, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_AZCHO));
			// 機器送付先番地号
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_BNCHIGO, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_BNCHIGO));
			// 機器送付先住所補記・建物名
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_ADRTTM, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_ADRTTM));
			// 機器送付先住所補記・部屋番号
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_ADRRM, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_ADRRM));
			// 機器送付先名
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_NM, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_CUST_NM));
			// 機器送付先カナ名
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_KANA, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_CUST_KANA));
			// 機器送付先電話番号
			condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_TELNO, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_TLN));
		}

		// マンション物件番号
		condMap.put(EKK0341D010CBSMsg.MANSION_BUKKEN_NO, paramKktk.get(EKK0341D010CBSMsg.MANSION_BUKKEN_NO));
		// 機器送付先_契約者住所差異フラグ
		condMap.put(EKK0341D010CBSMsg.KIKI_SOHUS_KSH_AD_SAI_FLG, paramKktk.get(EKK0341D010CBSMsg.KIKI_SOHUS_KSH_AD_SAI_FLG));
		// 機器設置先住所コード
		condMap.put(EKK0341D010CBSMsg.KIKI_STC_SAKI_AD_CD, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_CD));
		// 機器設置先郵便番号
		condMap.put(EKK0341D010CBSMsg.KIKI_STC_SAKI_PCD, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_POST_CD));
		// 機器設置先都道府県名
		condMap.put(EKK0341D010CBSMsg.KIKI_STC_SAKI_STATE_NM, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_STATE));
		// 機器設置先市区町村名
		condMap.put(EKK0341D010CBSMsg.KIKI_STC_SAKI_CITY_NM, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_CITY));
		// 機器設置先大字通称名
		condMap.put(EKK0341D010CBSMsg.KIKI_STC_SAKI_OAZTSU_NM, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_OAZTSU));
		// 機器設置先字丁目名
		condMap.put(EKK0341D010CBSMsg.KIKI_STC_SAKI_AZCHO_NM, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_AZCHO));
		// 機器設置先番地号
		condMap.put(EKK0341D010CBSMsg.KIKI_STC_SAKI_BNCHIGO, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_BNCHIGO));
		// 機器設置先住所補記・建物名
		condMap.put(EKK0341D010CBSMsg.KIKI_STC_SAKI_ADRTTM, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_ADRTTM));
		// 機器設置先住所補記・部屋番号
		condMap.put(EKK0341D010CBSMsg.KIKI_STC_SAKI_ADRRM, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_ADRRM));
		// 機器設置先_契約者住所差異フラグ
		condMap.put(EKK0341D010CBSMsg.KIKI_STC_SK_KSH_AD_SAI_FLG, paramKktk.get(EKK0341D010CBSMsg.KIKI_STC_SK_KSH_AD_SAI_FLG));
		// 機器設置先電話番号
		condMap.put(EKK0341D010CBSMsg.KIKI_STC_SK_TELNO, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_ITENS_TLN));
		// 住所未確定フラグ
		condMap.put(EKK0341D010CBSMsg.AD_MI_FIX_FLG, paramKktk.get(EKK0341D010CBSMsg.AD_MI_FIX_FLG));

		// 機器送付先個別指定フラグ
		condMap.put(EKK0341D010CBSMsg.KIKI_SHS_KBT_SHITEI_FLG, "1");		// 1：
		condMap.put(EKK0341D010CBSMsg.KIKI_SHS_HSK_CD_1, "");
		condMap.put(EKK0341D010CBSMsg.KIKI_SHS_HSK_CD_2, "");
		condMap.put(EKK0341D010CBSMsg.KIKI_SHS_HSK_MEMO, "");
		// 機器設置先区画整理中フラグ 
		condMap.put(EKK0341D010CBSMsg.KIKI_STS_KKK_SEIRI_CHU_FLG, "0");		// 0：整理中でない
		condMap.put(EKK0341D010CBSMsg.KIKI_STS_HSK_CD_1, "");
		condMap.put(EKK0341D010CBSMsg.KIKI_STS_HSK_CD_2, "");
		condMap.put(EKK0341D010CBSMsg.KIKI_STS_HSK_MEMO, "");
		// 配送区分 
		condMap.put(EKK0341D010CBSMsg.HAISO_DIV, "00");						// 00：直送
		condMap.put(EKK0341D010CBSMsg.FTRIAL_KANYU_YMD, "");
		condMap.put(EKK0341D010CBSMsg.FTRIAL_PRD_ENDYMD, "");
		condMap.put(EKK0341D010CBSMsg.HONKANYU_YMD, "");
		condMap.put(EKK0341D010CBSMsg.HONKANYU_IKO_KIGEN_YMD, "");
		condMap.put(EKK0341D010CBSMsg.HOSHO_CD, "");
		condMap.put(EKK0341D010CBSMsg.HOSHO_STAYMD, "");
		condMap.put(EKK0341D010CBSMsg.PNLTY_HASSEI_CD, "");
		// 異動区分
		condMap.put(EKK0341D010CBSMsg.IDO_DIV, paramKktk.get(JKKAdchgConstCC.PARAM_KEY_IDO_DIV));
		// 宅内機器異動コード
		condMap.put(EKK0341D010CBSMsg.TAKNKIKI_IDO_CD, "01");				// 01：追加
		condMap.put(EKK0341D010CBSMsg.CAS_CARD_USE_KYODAK_YMD, "");
		// 機器付加情報コード
		condMap.put(EKK0341D010CBSMsg.KIKI_HUKA_INFO_CD, "");				// 000：００
		condMap.put(EKK0341D010CBSMsg.HAISO_WAY_CD, "");
		condMap.put(EKK0341D010CBSMsg.PRC_KMK_CD, "");
		// 請求契約番号
		condMap.put(EKK0341D010CBSMsg.SEIKY_KEI_NO, paramKktk.get(EKK0341D010CBSMsg.SEIKY_KEI_NO));
// ANK-2290-00-00 2015.12.14 M.HAYASHI MOD START
//		// 更新年月日時分秒(更新前)
//		condMap.put(EKK0341D010CBSMsg.UPD_DTM_BF, getScKeiKaisenUcwkUpdDtmBf(svcKeiKaisenUcwkNo));
		String getScKeiKaisenUcwkUpdDtmBfDate = getScKeiKaisenUcwkUpdDtmBf(svcKeiKaisenUcwkNo);
		// 最終更新年月日null確認
		if ((getScKeiKaisenUcwkUpdDtmBfDate == null) ||
				getScKeiKaisenUcwkUpdDtmBfDate.length() == 0) {
			// 更新年月日時分秒(更新前)がnull時、運用日取得
			condMap.put(EKK0341D010CBSMsg.UPD_DTM_BF, JPCBPCommon.getOnlineOpeDateTimeStamp(null));
		} else {
			// 更新年月日時分秒(更新前)
			condMap.put(EKK0341D010CBSMsg.UPD_DTM_BF, getScKeiKaisenUcwkUpdDtmBf(svcKeiKaisenUcwkNo));
		}
// ANK-2290-00-00 2015.12.14 M.HAYASHI MOD END
		// 20140811 IT1-2014-0000289 マンション（イーサ・VDDSL）で工事予定取込前の場合、配送予定年月日に未来日を設定する ADD START
		String haisoReqShiteiYmd = paramKktk.get("haiso_req_shitei_ymd");
		if (!JKKBpCommon.isNull(haisoReqShiteiYmd))
		{
			condMap.put(EKK0341D010CBSMsg.HAISO_REQ_SHITEI_YMD, haisoReqShiteiYmd);
		}
		
		// 20140811 IT1-2014-0000289 マンション（イーサ・VDDSL）で工事予定取込前の場合、配送予定年月日に未来日を設定する ADD END
		HashMap<String, Object> reqMap = mapper.setEKK0341D010(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		HashMap<String, Object> mapEKK0341D010 = mapper.getEKK0341D010(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return mapEKK0341D010;
	}

	/**
	 * 多機能ルータに関連付く申込明細番号を取得する<br>
	 * 機器オプションに対応するサービス契約の申込明細番号を返却する<br>
	 * ネット、電話両方の機器オプションがある場合はネットの機器オプションを優先する
	 * 
	 * @return 申込明細番号
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private String getMskmDtlNoMultiRouter() throws Throwable {

		HashMap<String, Object> paramMap = getRequestParameter();

		List<Map<String, String>> kkopInfoList = (List<Map<String, String>>)paramMap.get("kkop_info_list");
		for (Map<String, String> kkopInfo : kkopInfoList) {
			// 処理区分
			String kkopSyoriKbn = kkopInfo.get("kkop_syori_kbn");
// IT2-2014-0000187 2014.04.10 Y.Kanata MOD START
//			if (!KKOP_SYORI_KBN_ADD.equals(kkopSyoriKbn)) {
			if (!KKOP_SYORI_KBN_ADD.equals(kkopSyoriKbn) 
					&& !KKOP_SYORI_KBN_CON.equals(kkopSyoriKbn) 
					&& !KKOP_SYORI_KBN_CHG.equals(kkopSyoriKbn)) {
// IT2-2014-0000187 2014.04.10 Y.Kanata MOD END
				continue;	// 追加ではない
			}
			// 機器オプションサービスコード
			String kkopSvcCd = kkopInfo.get("kkop_svc_cd");
			if (KKOP_SVC_CD_ROUTER.equals(kkopSvcCd)) {
				// ルータがある場合はネットの申込明細番号を返す（ネット優先）
				return (String)paramMap.get("mskm_dtl_no_nt");
			}
		}

		// 機器オプション：ルータ機能は存在しないので、電話の申込明細番号を返す
		return (String)paramMap.get("mskm_dtl_no_tl");
	}

	/**
	 * EKK2811A010 機器オプションサービス契約一意照会
	 * 
	 * kkopSvcKeiNo 機器オプションサービス契約番号
	 * @return
	 * @throws Throwable
	 */
	private Map<String, Object> getEKK2811A010(String kkopSvcKeiNo) throws Throwable {

		// EKK2811A010 機器オプションサービス契約一意照会
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_KKOP_SVC_KEI_NO, kkopSvcKeiNo);
		condMap.put(JKKAdchgMapperCC.COND_KEY_RSV_APLY_YMD, JCCBPCommon.getOpeDate(null));
		HashMap<String, Object> reqMap = mapper.setEKK2811A010(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		ArrayList<HashMap<String, Object>> listEKK2811A010 = mapper.getEKK2811A010(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		if (listEKK2811A010 == null || listEKK2811A010.isEmpty()) {
			return null;
		}

		return listEKK2811A010.get(0);
	}

	/**
	 * EKK2811C030 機器オプションサービス契約照査
	 * 
	 * @param mapEKK2811D010	機器オプションサービス契約登録結果
	 * @param updDtm			更新年月日時分秒
	 * @return
	 * @throws Throwable 
	 */
	private Map<String, Object> verifyEKK2811C030(Map<String, Object> mapEKK2811D010, String updDtm) throws Throwable {

		// EKK2811C030 機器オプションサービス契約照査
		HashMap<String, String> condMap = new HashMap<String, String>();
		// 機器オプションサービス契約番号
		condMap.put(EKK2811C030CBSMsg.KKOP_SVC_KEI_NO, (String)mapEKK2811D010.get(EKK2811D010CBSMsg.KKOP_SVC_KEI_NO));
		// 異動区分
		condMap.put(EKK2811C030CBSMsg.IDO_DIV, (String)mapEKK2811D010.get(EKK2811D010CBSMsg.IDO_DIV));
		// 照査解約完了コード
		condMap.put(EKK2811C030CBSMsg.SHOSA_DSL_FIN_CD, SHOSA_DSL_FIN_CD_OK);
		// 更新年月日時分秒(更新前)
		condMap.put(EKK2811C030CBSMsg.UPD_DTM_BF, updDtm);

		HashMap<String, Object> reqMap = mapper.setEKK2811C030(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		Map<String, Object> mapEKK2811C030 = mapper.getEKK2811C030(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return mapEKK2811C030;
	}

// ANK-1664-00-00 2014.01.12 T.TORIKAI メソッド追加
	/**
	 * EKK2811C110 機器オプションサービス契約キャンセル
	 * 
	 * @param kkopSvcKeiNo
	 * @param mskmDtlNo
	 * @param idoDiv
	 * @param lastUpdDtm
	 * @return
	 * @throws Throwable
	 */
	private Map<String, Object> cancelEKK2811C110(String kkopSvcKeiNo, String mskmDtlNo, String idoDiv, String lastUpdDtm) throws Throwable {
		
		// EKK2811C110 機器オプションサービス契約キャンセル
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_KKOP_SVC_KEI_NO, kkopSvcKeiNo);
		condMap.put(JKKAdchgMapperCC.COND_KEY_MSKM_DTL_NO, mskmDtlNo);
		condMap.put(JKKAdchgMapperCC.COND_KEY_IDO_DIV, idoDiv);
		condMap.put("upd_dtm_bf", lastUpdDtm);

		HashMap<String, Object> reqMap = mapper.setEKK2811C110(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		Map<String, Object> mapEKK2811C110 = mapper.getEKK2811C110(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return mapEKK2811C110;
	}

	/**
	 * EKK2811C140 機器オプションサービス契約解約
	 * 
	 * @param paramMap
	 * @param updDtm
	 * @return
	 * @throws Throwable
	 */
	private Map<String, Object> dslEKK2811C140(Map<String, String> paramMap, String updDtm) throws Throwable {
		
		// EKK2811C140 機器オプションサービス契約解約
		HashMap<String, String> condMap = new HashMap<String, String>();
		// 機器オプションサービス契約番号
		condMap.put(EKK2811C140CBSMsg.KKOP_SVC_KEI_NO, paramMap.get(EKK2811C140CBSMsg.KKOP_SVC_KEI_NO));
		// 申込明細番号
		condMap.put(EKK2811C140CBSMsg.MSKM_DTL_NO, paramMap.get(EKK2811C140CBSMsg.MSKM_DTL_NO));
		// 予約適用開始希望年月日
		condMap.put(EKK2811C140CBSMsg.RSV_TSTA_KIBO_YMD, paramMap.get(EKK2811C140CBSMsg.RSV_TSTA_KIBO_YMD));
		// サービス終了年月日
		condMap.put(EKK2811C140CBSMsg.SVC_ENDYMD, paramMap.get(EKK2811C140CBSMsg.SVC_ENDYMD));
		// サービス課金終了年月日
		condMap.put(EKK2811C140CBSMsg.SVC_CHRG_ENDYMD, paramMap.get(EKK2811C140CBSMsg.SVC_CHRG_ENDYMD));
		// サービス解約理由コード
		condMap.put(EKK2811C140CBSMsg.SVC_DLRE_CD, paramMap.get(EKK2811C140CBSMsg.SVC_DLRE_CD));
		// サービス解約理由メモ
		condMap.put(EKK2811C140CBSMsg.SVC_DLRE_MEMO, paramMap.get(EKK2811C140CBSMsg.SVC_DLRE_MEMO));
		// 違約金発生コード
		condMap.put(EKK2811C140CBSMsg.PNLTY_HASSEI_CD, paramMap.get(EKK2811C140CBSMsg.PNLTY_HASSEI_CD));
		// 異動区分
		condMap.put(EKK2811C140CBSMsg.IDO_DIV, paramMap.get(EKK2811C140CBSMsg.IDO_DIV));
		// 更新年月日時分秒(更新前)
		condMap.put(EKK2811C140CBSMsg.UPD_DTM_BF, updDtm);

		HashMap<String, Object> reqMap = mapper.setEKK2811C140(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		Map<String, Object> mapEKK2811C140 = mapper.getEKK2811C140(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return mapEKK2811C140;
	}

	/**
	 * EKK2811C150 機器オプションサービス契約解約確定
	 * 
	 * @param mapEKK2811C140	機器オプションサービス契約解約の結果
	 * @return
	 * @throws Throwable
	 */
	private Map<String, Object> dslEKK2811C150(Map<String, Object> mapEKK2811C140) throws Throwable {

		// EKK2811C150 機器オプションサービス契約解約確定
		HashMap<String, String> condMap = new HashMap<String, String>();
		// 機器オプションサービス契約番号
		condMap.put(EKK2811C150CBSMsg.KKOP_SVC_KEI_NO, (String)mapEKK2811C140.get(EKK2811C140CBSMsg.KKOP_SVC_KEI_NO));
		// サービス終了年月日
		condMap.put(EKK2811C150CBSMsg.SVC_ENDYMD, (String)mapEKK2811C140.get(EKK2811C140CBSMsg.SVC_ENDYMD));
		// サービス課金終了年月日
		condMap.put(EKK2811C150CBSMsg.SVC_CHRG_ENDYMD, (String)mapEKK2811C140.get(EKK2811C140CBSMsg.SVC_CHRG_ENDYMD));
		// プラン開始年月日			※設定値なし
		// プラン終了年月日			※設定値なし
		// プラン課金終了年月日		※設定値なし
		// サービス解約理由コード
		condMap.put(EKK2811C150CBSMsg.SVC_DLRE_CD, (String)mapEKK2811C140.get(EKK2811C140CBSMsg.SVC_DLRE_CD));
		// サービス解約理由メモ
		condMap.put(EKK2811C150CBSMsg.SVC_DLRE_MEMO, (String)mapEKK2811C140.get(EKK2811C140CBSMsg.SVC_DLRE_MEMO));
		// 更新年月日時分秒(更新前)
		condMap.put(EKK2811C150CBSMsg.UPD_DTM_BF, (String)mapEKK2811C140.get(EKK2811C140CBSMsg.UPD_DTM));

		HashMap<String, Object> reqMap = mapper.setEKK2811C150(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		Map<String, Object> mapEKK2811C150 = mapper.getEKK2811C150(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return mapEKK2811C150;
	}

	/**
	 * EKK2811D010 機器オプション登録
	 * 
	 * @param kkopInfo			機器オプション情報
	 * @return					機器オプション登録結果
	 * @throws Throwable
	 */
	private Map<String, Object> registEKK2811D010(Map<String, String> kkopInfo) throws Throwable {
		
		// EKK2811D010_機器オプションサービス契約登録
		HashMap<String, String> condMap = new HashMap<String, String>();

		// 機器オプションサービスコード	
		condMap.put(EKK2811D010CBSMsg.KKOP_SVC_CD, kkopInfo.get(EKK2811D010CBSMsg.KKOP_SVC_CD));
		// 料金コースコード
		condMap.put(EKK2811D010CBSMsg.PCRS_CD, kkopInfo.get(EKK2811D010CBSMsg.PCRS_CD));
		// 料金プランコード
		condMap.put(EKK2811D010CBSMsg.PPLAN_CD, kkopInfo.get(EKK2811D010CBSMsg.PPLAN_CD));
		// 機器提供サービス契約番号
		condMap.put(EKK2811D010CBSMsg.KKTK_SVC_KEI_NO, kkopInfo.get(EKK2811D010CBSMsg.KKTK_SVC_KEI_NO));
		// SYSID
		condMap.put(EKK2811D010CBSMsg.SYSID, kkopInfo.get(EKK2811D010CBSMsg.SYSID));
		// 申込明細番号
		condMap.put(EKK2811D010CBSMsg.MSKM_DTL_NO, kkopInfo.get(EKK2811D010CBSMsg.MSKM_DTL_NO));
		// 試用加入年月日
		condMap.put(EKK2811D010CBSMsg.FTRIAL_KANYU_YMD, kkopInfo.get(EKK2811D010CBSMsg.FTRIAL_KANYU_YMD));
		// 試用期間終了年月日
		condMap.put(EKK2811D010CBSMsg.FTRIAL_PRD_ENDYMD, kkopInfo.get(EKK2811D010CBSMsg.FTRIAL_PRD_ENDYMD));
		// 本加入年月日
		condMap.put(EKK2811D010CBSMsg.HONKANYU_YMD, kkopInfo.get(EKK2811D010CBSMsg.HONKANYU_YMD));
		// 本加入移行期限年月日
		condMap.put(EKK2811D010CBSMsg.HONKANYU_IKO_KIGEN_YMD, kkopInfo.get(EKK2811D010CBSMsg.HONKANYU_IKO_KIGEN_YMD));
		// サービス利用開始希望年月日
		condMap.put(EKK2811D010CBSMsg.SVC_USE_STA_KIBO_YMD, kkopInfo.get(EKK2811D010CBSMsg.SVC_USE_STA_KIBO_YMD));
		// 予約適用開始希望年月日
		condMap.put(EKK2811D010CBSMsg.RSV_TSTA_KIBO_YMD, kkopInfo.get(EKK2811D010CBSMsg.RSV_TSTA_KIBO_YMD));
		// 違約金発生コード
		condMap.put(EKK2811D010CBSMsg.PNLTY_HASSEI_CD, kkopInfo.get(EKK2811D010CBSMsg.PNLTY_HASSEI_CD));
		// 異動区分
		condMap.put(EKK2811D010CBSMsg.IDO_DIV, kkopInfo.get(EKK2811D010CBSMsg.IDO_DIV));
		// 機器連帯契約変更手続中フラグ
		condMap.put(EKK2811D010CBSMsg.KIKI_RNTAI_KEI_CHGECHU_FLG, kkopInfo.get(EKK2811D010CBSMsg.KIKI_RNTAI_KEI_CHGECHU_FLG));
		// 請求契約番号
		condMap.put(EKK2811D010CBSMsg.SEIKY_KEI_NO, kkopInfo.get(EKK2811D010CBSMsg.SEIKY_KEI_NO));
		// 更新年月日時分秒(更新前)
		condMap.put(EKK2811D010CBSMsg.UPD_DTM_BF, kkopInfo.get(EKK2811D010CBSMsg.UPD_DTM_BF));

		HashMap<String, Object> reqMap = mapper.setEKK2811D010(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		Map<String, Object> mapEKK2811D010 = mapper.getEKK2811D010(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());
		
		return mapEKK2811D010;
	}

	/**
	 * 設置場所番号の取得.
	 * <br>
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @param   pararmMap  入力マップ
	 * @throws Throwable 
	 */
	private String getSetplaceNo(Map<String, String> paramMap) throws Throwable {

		// EKKA0020002 設置場所番号取得
		ArrayList<HashMap<String, Object>> listEKKA0020002 = getEKKA0020002(paramMap);
		if (listEKKA0020002 == null || listEKKA0020002.isEmpty()) {
			return null;
		}

		// 設置場所番号を返却
		HashMap<String, Object> mapEKKA0020002 = listEKKA0020002.get(0);
		return (String)mapEKKA0020002.get(EKKA0020002CBSMsg2List.SETPLACE_NO);
	}

	/**
	 * EKKA0020002 設置場所番号取得
	 * 
	 * @param paramMap		設置場所の情報
	 * @return				設置場所番号取得結果
	 * @throws Throwable
	 */
	private ArrayList<HashMap<String, Object>> getEKKA0020002(Map<String, String> paramMap) throws Throwable {

		// EKKA0020002 設置場所番号取得
		HashMap<String, Object> setplaceMap = new HashMap<String, Object>();
		setplaceMap.put(EKKA0020002CBSMsg.EKKA0020002CBSMSG1LIST, new ArrayList<HashMap<String, Object>>());

		ArrayList<HashMap<String, Object>> setplaceList = new ArrayList<HashMap<String, Object>>();
		HashMap<String, Object> setplaceDetailMap = new HashMap<String, Object>();
		// 場所住所コード
		setplaceDetailMap.put(EKKA0020002CBSMsg1List.KEY_SETPLACE_AD_CD, paramMap.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_CD));
		// 場所郵便番号
		setplaceDetailMap.put(EKKA0020002CBSMsg1List.KEY_SETPLACE_PCD, paramMap.get(JKKAdchgConstCC.PARAM_KEY_ITENS_POST_CD));
		// 場所都道府県名
		setplaceDetailMap.put(EKKA0020002CBSMsg1List.KEY_SETPLACE_STATE_NM, paramMap.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_STATE));
		// 場所市区町村名
		setplaceDetailMap.put(EKKA0020002CBSMsg1List.KEY_SETPLACE_CITY_NM, paramMap.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_CITY));
		// 場所大字通称名
		setplaceDetailMap.put(EKKA0020002CBSMsg1List.KEY_SETPLACE_OAZTSU_NM, paramMap.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_OAZTSU));
		// 場所字丁目名
		setplaceDetailMap.put(EKKA0020002CBSMsg1List.KEY_SETPLACE_AZCHO_NM, paramMap.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_AZCHO));
		// 場所番地号
		setplaceDetailMap.put(EKKA0020002CBSMsg1List.KEY_SETPLACE_BNCHIGO, paramMap.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_BNCHIGO));
		// 場所住所補記・建物名
		setplaceDetailMap.put(EKKA0020002CBSMsg1List.KEY_SETPLACE_ADRTTM, paramMap.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_ADRTTM));
		// 場所住所補記・部屋番号
		setplaceDetailMap.put(EKKA0020002CBSMsg1List.KEY_SETPLACE_ADRRM, paramMap.get(JKKAdchgConstCC.PARAM_KEY_ITENS_AD_ADRRM));

		setplaceList.add(setplaceDetailMap);

		HashMap<String, Object> reqMap = mapper.setEKKA0020002(keepReqParam.get(), keepFixedText.get(), setplaceMap, setplaceList);

		Map<?, ?> resMap = scCall.run( reqMap, keepSesHandle.get() );
		ArrayList<HashMap<String, Object>> listEKKA0020002 = mapper.getEKKA0020002(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());
		
		return listEKKA0020002;
	}

	/**
	 * サービス契約回線内訳の更新年月日時分秒（更新前）を取得する
	 * 
	 * @param svcKeiKaisenUcwkNo サービス契約回線内訳
	 * @return		サービス契約回線内訳の更新年月日時分秒（更新前）
	 * @throws Throwable 
	 */
	private String getScKeiKaisenUcwkUpdDtmBf(String svcKeiKaisenUcwkNo) throws Throwable {

		Map<String, Object> mapEKK0251A01 = getEKK0251A010(svcKeiKaisenUcwkNo);

		return (String)mapEKK0251A01.get(EKK0251A010CBSMsg1List.LAST_UPD_DTM);
	}

	/**
	 * EKK0251A01 サービス契約回線内訳一意照会
	 * 
	 * @param svcKeiNo	サービス契約回線内訳番号
	 * @return
	 * @throws Throwable
	 */
	private Map<String, Object> getEKK0251A010(String svcKeiKaisenUcwkNo) throws Throwable {
		
		// EKK0251A010_サービス契約回線内訳一意照会
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_KAIS_UCWK_NO, svcKeiKaisenUcwkNo);
		condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, JCCBPCommon.getOpeDate(null));
		HashMap<String, Object> reqMap = mapper.setEKK0251A010(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		HashMap<String, Object> mapEKK0251A010 = mapper.getEKK0251A010(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return mapEKK0251A010;
	}

// ANK-1578-00-00 2014.01.11 T.TORIKAI メソッド追加（IT2-2014-0000027）
	/**
	 * EKK0081A01 サービス契約一意照会
	 * 
	 * @param svcKeiNo	サービス契約番号
	 * @return
	 * @throws Throwable
	 */
	private Map<String, Object> getEKK0081A010(String svcKeiNo) throws Throwable {

		// EKK0081A010 サービス契約一意照会
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, svcKeiNo);
		condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, JCCBPCommon.getOpeDate(null));
		HashMap<String, Object> reqMap = mapper.setEKK0081A010(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		HashMap<String, Object> mapEKK0081A010 = mapper.getEKK0081A010(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return mapEKK0081A010;
	}

// ANK-1664-00-00 2014.01.12 T.TORIKAI メソッド追加
	/**
	 * 住所変更申込機器オプション一時保存を取得する
	 * @return
	 * @throws Throwable
	 */
	private ArrayList<HashMap<String, Object>> getKkopTppv() throws Throwable {

		HashMap<String, Object> paramMap = getRequestParameter();
		String sysId = (String)paramMap.get("sysId");
		String svcKeiKaisenUcwkNo = (String)paramMap.get("moto_svc_kei_kaisen_ucwk_no");
// OM-2014-0001924対応 20140603 星野 ADD START
		String adchgNo = (String)paramMap.get("adchg_no");
// OM-2014-0001924対応 20140603 星野 ADD START

		ArrayList<HashMap<String, Object>> listEKK2011B001 = getEKK2011B001(sysId, svcKeiKaisenUcwkNo);
		if (listEKK2011B001 == null || listEKK2011B001.isEmpty()) {
			return new ArrayList<HashMap<String, Object>>();		// 空のリストを返す
		}
		String adchmTppvNo = (String)listEKK2011B001.get(0).get(EKK2011B001CBSMsg1List.ADCHM_TPPV_NO);

// OM-2015-0001342 2015/08/26 MOD START
//		ArrayList<HashMap<String, Object>> listEKK2881B001 = getEKK2881B001(sysId, adchmTppvNo);
//		if (listEKK2881B001 == null || listEKK2881B001.isEmpty()) {
//// OM-2014-0001924対応 20140603 星野 MOD START
////			return new ArrayList<HashMap<String, Object>>();		// 空のリストを返す
//			listEKK2881B001 = new ArrayList<HashMap<String, Object>>();		// 空のリストを返す
//// OM-2014-0001924対応 20140603 星野 MOD END
//		}
		ArrayList<HashMap<String, Object>> listEKK2881B001 = new ArrayList<HashMap<String, Object>>();
// OM-2015-0001342 2015/08/26 MOD END
		
// OM-2014-0001924対応 20140603 星野 ADD START
		if(!StringUtils.isEmpty(adchgNo)){
			// 住変明細より機器オプションの情報を取得する
			ArrayList<HashMap<String, Object>> listEKK2101B001 = getEKK2101B001(adchgNo, "09");
			if (listEKK2101B001 != null) {
				for (HashMap<String, Object> mapEKK2101B001 : listEKK2101B001) {
					String chafSkbtNo = (String)mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHAF_SKBT_NO);
					String chbfSkbtNo = (String)mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHBF_SKBT_NO);
					
					// 機器オプション追加の場合
					if(StringUtils.isEmpty(chbfSkbtNo) && !StringUtils.isEmpty(chafSkbtNo)){
// OM-2015-0001342 2015/08/26 DEL START
//						HashMap<String, Object> mapEKK2881B001Target = getTargetEKK2881Map(listEKK2881B001, chafSkbtNo);
//						
//						// 既に一時保存にあるなら追加不要
//						if(mapEKK2881B001Target!=null){
//							continue;
//						}
// OM-2015-0001342 2015/08/26 DEL END
						
						// 機器オプションサービス契約一意照会
						Map<String, Object> mapEKK2811A010 = getEKK2811A010(chafSkbtNo);
						if (mapEKK2811A010 == null) {
							continue;
						}
						
						// 住所変更中機器追加により機器オプションが追加された場合、住変明細のみができているので
						// 住変明細をもとに一時保存を捏造する
						HashMap<String, Object> mapEKK2881B001Dummy = new HashMap<String, Object>();
						mapEKK2881B001Dummy.put(EKK2881B001CBSMsg1List.SYSID, sysId);
						mapEKK2881B001Dummy.put(EKK2881B001CBSMsg1List.ADCHM_TPPV_NO, adchmTppvNo);
						mapEKK2881B001Dummy.put(EKK2881B001CBSMsg1List.KKOSVKEI_CHG_SBT_CD, KKOP_SYORI_KBN_ADD);
						mapEKK2881B001Dummy.put(EKK2881B001CBSMsg1List.KKTK_SVC_KEI_NO, (String)mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHG_TG_KEI_NO));
						mapEKK2881B001Dummy.put(EKK2881B001CBSMsg1List.KKOP_SVC_KEI_NO, chafSkbtNo);
						mapEKK2881B001Dummy.put(EKK2881B001CBSMsg1List.KKOP_SVC_CD, mapEKK2811A010.get(EKK2811A010CBSMsg1List.KKOP_SVC_CD));
						mapEKK2881B001Dummy.put(EKK2881B001CBSMsg1List.PCRS_CD, mapEKK2811A010.get(EKK2811A010CBSMsg1List.PCRS_CD));
						mapEKK2881B001Dummy.put(EKK2881B001CBSMsg1List.PPLAN_CD, mapEKK2811A010.get(EKK2811A010CBSMsg1List.PPLAN_CD));
						
						listEKK2881B001.add(mapEKK2881B001Dummy);
					}
				}
			}
		}

// OM-2014-0001924対応 20140603 星野 ADD END

		return listEKK2881B001;
	}

// OM-2014-0001924対応 20140603 星野 ADD START
	private HashMap<String, Object> getTargetEKK2881Map( ArrayList<HashMap<String, Object>> listEKK2881B001, String kkopSvcKeiNoTarget ) 
	{
		HashMap<String, Object> mapEKK2881B001Target = null;
		for (HashMap<String, Object> mapEKK2881B001 : listEKK2881B001) {
			
			String kkopSvcKeiNo = (String)mapEKK2881B001.get(EKK2881B001CBSMsg1List.KKOP_SVC_KEI_NO);
			if( StringUtils.isEmpty(kkopSvcKeiNo) ){
				continue;
			}
			
			if(kkopSvcKeiNo.equals(kkopSvcKeiNoTarget)){
				mapEKK2881B001Target = mapEKK2881B001;
				break;
			}
		}
		return mapEKK2881B001Target;
	}
// OM-2014-0001924対応 20140603 星野 ADD END

// ANK-1664-00-00 2014.01.12 T.TORIKAI メソッド追加
	/**
	 *  EKK2011B001 住所変更申込一時保存一覧照会
	 * 
	 * @param sysId					SYSID
	 * @param svcKeiKaisenUcwkNo	サービス契約回線内訳番号
	 * @return
	 * @throws Throwable 
	 */
	private ArrayList<HashMap<String, Object>> getEKK2011B001(String sysId, String svcKeiKaisenUcwkNo) throws Throwable {
		
		// EKK2011B001 住所変更申込一時保存一覧照会
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_SYSID, sysId);
		condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_KAIS_UCWK_NO, svcKeiKaisenUcwkNo);
		HashMap<String, Object> reqMap = mapper.setEKK2011B001(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		ArrayList<HashMap<String, Object>> listEKK2011B001 = mapper.getEKK2011B001(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return listEKK2011B001;
	}

// ANK-1664-00-00 2014.01.12 T.TORIKAI メソッド追加
	/**
	 * EKK2881B001 住所変更申込機器オプション一時保存一覧照会
	 * 
	 * @param sysId				SYSID
	 * @param adchmTppvNo		住所変更一時保存番号
	 * @return
	 * @throws Throwable 
	 */
	private ArrayList<HashMap<String, Object>> getEKK2881B001(String sysId, String adchmTppvNo) throws Exception {

		// EKK2881B001 住所変更申込機器オプション一時保存一覧照会
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_SYSID, sysId);
		condMap.put(JKKAdchgMapperCC.COND_KEY_ADCHM_TPPV_NO, adchmTppvNo);
		HashMap<String, Object> reqMap = mapper.setEKK2881B001(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		ArrayList<HashMap<String, Object>> listEKK2881B001 = mapper.getEKK2881B001(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return listEKK2881B001;
	}

// ANK-1664-00-00 2014.01.12 T.TORIKAI メソッド追加
	/**
	 * EKK0341B504 機器提供サービス契約一覧照会（サービス契約回線内訳）
	 * 
	 * @param svcKeiKaisenUcwkNo サービス契約回線内訳
	 * @return
	 * @throws Throwable 
	 */
	private ArrayList<HashMap<String, Object>> getEKK0341B504(String svcKeiKaisenUcwkNo) throws Exception {

		// EKK0341B504 機器提供サービス契約一覧照会
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put("key_svc_kei_kaisen_ucwk_no", svcKeiKaisenUcwkNo);
		HashMap<String, Object> reqMap = mapper.setEKK0341B504(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		ArrayList<HashMap<String, Object>> listEKK0341B504 = mapper.getEKK0341B504(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return listEKK0341B504;
	}

// ANK-1664-00-00 2014.01.12 T.TORIKAI メソッド追加
	/**
	 * 回線に紐付く多機能ルータの機器提供サービス契約番号を取得する
	 * 
	 * @param isMoto 転居元先で対象となるサービス契約回線内訳
	 * @return
	 * @throws Throwable
	 */
	private String getKktkSvcKeiNoAddMultiRouter(boolean isMoto) throws Throwable {

		// 回線に紐付く機器の一覧を取得
		HashMap<String, Object> paramMap = getRequestParameter();
		String svcKeiKaisenUcwkNo = (String)paramMap.get("saki_svc_kei_kaisen_ucwk_no");
		if (isMoto) {
			svcKeiKaisenUcwkNo = (String)paramMap.get("moto_svc_kei_kaisen_ucwk_no");
		}
		ArrayList<HashMap<String, Object>> listEKK0341B504 = getEKK0341B504(svcKeiKaisenUcwkNo);
		if (listEKK0341B504 == null || listEKK0341B504.isEmpty()) {
			return null;
		}

		// 多機能ルータを取得
		for (HashMap<String, Object> mapEKK0341B504 : listEKK0341B504) {
			String taknkikiSbtCd = (String)mapEKK0341B504.get(EKK0341B504CBSMsg1List.TAKNKIKI_SBT_CD);
// IT2-2014-0000179対応 20140403 星野 ADD START
			String kktkSvcKeiStat = (String)mapEKK0341B504.get(EKK0341B504CBSMsg1List.KKTK_SVC_KEI_STAT);
			if(!"910".equals(kktkSvcKeiStat) && !"920".equals(kktkSvcKeiStat)){
// IT2-2014-0000179対応 20140403 星野 ADD END
				// ANK-4315-00-00 MOD START
				//if ("R0".equals(taknkikiSbtCd)) {
				if ("R0".equals(taknkikiSbtCd) || "S0".equals(taknkikiSbtCd)) {
				// ANK-4315-00-00 MOD END
					return (String)mapEKK0341B504.get(EKK0341B504CBSMsg1List.KKTK_SVC_KEI_NO);
				}
// IT2-2014-0000179対応 20140403 星野 ADD START
			}
// IT2-2014-0000179対応 20140403 星野 ADD END
		}

		return null;
	}

// ANK-1664-00-00 2014.01.12 T.TORIKAI メソッド追加
	/**
	 * 転居先に追加した機器オプションが不要になった場合はキャンセルする
	 * @param listEKK2881B001
	 * @param kkopInfoList
	 * @throws Throwable 
	 */
	private void cancelKkop(ArrayList<HashMap<String, Object>> listEKK2881B001, List<Map<String, String>> kkopInfoList) throws Throwable {
		
		for (HashMap<String, Object> mapEKK2881B001 : listEKK2881B001) {
			String kkopSyoriKbn = (String)mapEKK2881B001.get(EKK2881B001CBSMsg1List.KKOSVKEI_CHG_SBT_CD);
			if (!KKOP_SYORI_KBN_ADD.equals(kkopSyoriKbn)) {
				continue;	// 「追加」ではないので対象外
			}
			String kkopSvcCd = (String)mapEKK2881B001.get(EKK2881B001CBSMsg1List.KKOP_SVC_CD);
			boolean exist = false;
			for (Map<String, String> kkopInfoMap : kkopInfoList) {
				if (kkopSvcCd.equals(kkopInfoMap.get("kkop_svc_cd"))) {
					exist = true;
					break;
				}
			}
			if (exist) {
				continue;	// ２周目でも「追加」が存在するので対象外
			}
// OM-2014-0001924対応 20140603 星野 ADD START
			// 現状仕様では、住所変更修正でルータ機能をキャンセルすることは無い。
			// 機器契約変更にて追加された機器オプションを消してしまうので、ここではじく
			if(KKOP_SVC_CD_ROUTER.equals(kkopSvcCd)){
				// ルータ機能はキャンセルしない
				continue;
			}
// OM-2014-0001924対応 20140603 星野 ADD END
			// １周目で追加した機器オプションを解約・キャンセル
			cancelKkopSvcKei(mapEKK2881B001);
		}
	}

// ANK-1664-00-00 2014.01.12 T.TORIKAI メソッド追加
	/**
	 * 機器オプションを解約・キャンセルする
	 * 
	 * @param mapEKK2881B001
	 * @throws Throwable
	 */
	private void cancelKkopSvcKei(HashMap<String, Object> mapEKK2881B001) throws Throwable {

		HashMap<String, Object> paramMap = getRequestParameter();

		// 機器オプションサービス契約一意照会
		String kkopSvcKeiNo = (String)mapEKK2881B001.get(EKK2881B001CBSMsg1List.KKOP_SVC_KEI_NO);
		Map<String, Object> mapEKK2811A010 = getEKK2811A010(kkopSvcKeiNo);
		if (mapEKK2811A010 == null) {
			return;
		}
		// 最終更新年月日
		String lastUpdDtm = (String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.LAST_UPD_DTM);
		if (StringUtils.isEmpty(lastUpdDtm)) {
			lastUpdDtm = (String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.UPD_DTM);
		}

		// ステータス
		String stat = (String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.KKOP_SVC_KEI_STAT);

		// 解約、キャンセル済みの場合は処理不要
		if (JKKSvcConst.SVC_KEI_STAT_910.compareTo(stat) <= 0) {
			return;
		}

		String kkopSvcCd = (String)mapEKK2881B001.get(EKK2881B001CBSMsg1List.KKOP_SVC_CD);
		String mskmDtlNo = null;
		if (KKOP_SVC_CD_ROUTER.equals(kkopSvcCd)) {
			mskmDtlNo = (String)paramMap.get("mskm_dtl_no_nt");
		}
		if (KKOP_SVC_CD_TEL_VA.equals(kkopSvcCd)) {
			mskmDtlNo = (String)paramMap.get("mskm_dtl_no_tl");
		}
		String idoDiv = (String)paramMap.get("ido_div");

		// 締結済までであればキャンセル
		if (JKKSvcConst.SVC_KEI_STAT_030.compareTo(stat) > 0) {
			cancelEKK2811C110(kkopSvcKeiNo, mskmDtlNo, idoDiv, lastUpdDtm);
			return;
		}

		String opeDate = JCCBPCommon.getOpeDate(null);

		// 締結済以降なので解約
		Map<String, String> condMap = new HashMap<String, String>();
		condMap.put(EKK2811C140CBSMsg.KKOP_SVC_KEI_NO, kkopSvcKeiNo);
		condMap.put(EKK2811C140CBSMsg.MSKM_DTL_NO, mskmDtlNo);
		condMap.put(EKK2811C140CBSMsg.SVC_ENDYMD, opeDate);
		condMap.put(EKK2811C140CBSMsg.SVC_CHRG_ENDYMD, JKKAdchgCancelKkopSvcKeiCC.addYYYYMMDD(opeDate, -1));
		condMap.put(EKK2811C140CBSMsg.IDO_DIV, idoDiv);
// IT2-2014-0000179対応　20140403 星野 ADD START
		condMap.put(EKK2811C140CBSMsg.SVC_DLRE_CD, "01");
// IT2-2014-0000179対応　20140403 星野 ADD END
		// 機器オプション解約
		Map<String, Object> mapEKK2811C140 = dslEKK2811C140(condMap, lastUpdDtm);
		// 機器オプション解約確定
		dslEKK2811C150(mapEKK2811C140);
	}

// ANK-1664-00-00 2014.01.14 T.TORIKAI メソッド追加
	/**
	 * 引継・変更の機器オプションで、転居元先で解約・新規となる場合に、転居先の機器オプション番号を取得する
	 * 
	 * @param motoMultiRouterNo		転居元の多機能ルータの機器提供サービス契約番号
	 * @param sakiMultiRouterNo		転居先の多機能ルータの機器提供サービス契約番号
	 * @param kkopSvcKeiNo			機器オプションサービス契約番号（追加時：転居先、左記以外：転居元）
	 * @return
	 * @throws Throwable
	 */
	private String getSakiKkopSvcKeiNo(String motoMultiRouterNo, String sakiMultiRouterNo, String kkopSvcKeiNo) throws Throwable {

		if (StringUtils.isEmpty(motoMultiRouterNo)) {
			return kkopSvcKeiNo;	// 転居元に多機能ルータなし
		}
		if (motoMultiRouterNo.equals(sakiMultiRouterNo)) {
			return kkopSvcKeiNo;	// 転居元先で多機能ルータは同じ（転居元先で機器オプション番号は同じ）
		}
		// 転居元先で多機能ルータの機器提供サービス契約番号が異なる

		HashMap<String, Object> paramMap = getRequestParameter();
		String adchgNo = (String)paramMap.get("adchg_no");

		// 住変明細より機器オプションの情報を取得する
		ArrayList<HashMap<String, Object>> listEKK2101B001 = getEKK2101B001(adchgNo, "09");
		if (listEKK2101B001 == null) {
			return kkopSvcKeiNo;
		}
		for (HashMap<String, Object> mapEKK2101B001 : listEKK2101B001) {
			String beforeNo = (String)mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHBF_SKBT_NO);
			if (motoMultiRouterNo.equals(beforeNo)) {
				// 元の一致する変更後識別番号を返却
				return (String)mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHAF_SKBT_NO);
			}
		}

		return kkopSvcKeiNo;
	}

// ANK-1664-00-00 2014.01.14 T.TORIKAI メソッド追加
	/**
	 * EKK2101B001 住所変更明細一覧照会
	 * 
	 * @param adchgNo			住所変更番号
	 * @param adchgDtlSbtCd		住所変更明細種別コード 
	 * @return
	 * @throws Throwable 
	 */
	private ArrayList<HashMap<String, Object>> getEKK2101B001(String adchgNo, String adchgDtlSbtCd) throws Exception {

		// EKK2101B001 住所変更明細一覧照会
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_ADCHG_NO, adchgNo);
		condMap.put(JKKAdchgMapperCC.COND_KEY_ADCHG_DTL_SBT_CD, adchgDtlSbtCd);
		HashMap<String, Object> reqMap = mapper.setEKK2101B001(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		ArrayList<HashMap<String, Object>> listEKK2101B001 = mapper.getEKK2101B001(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return listEKK2101B001;
	}

// ANK-1578-00-00 2014.01.20 T.TORIKAI メソッド追加（IT2-2014-0000046）
	/**
	 * 機器オプションをサービス提供中にする必要があるか判定
	 * @param kkopSvcKeiNo	機器オプションサービス契約番号
	 * @param netSvcKeiNo	サービス契約番号（ネット）
	 * @param telSvcKeiNo	サービス契約番号（電話）
	 * @return
	 * @throws Throwable 
	 */
	private boolean isNeedServieStart(String kkopSvcKeiNo, String netSvcKeiNo, String telSvcKeiNo) throws Throwable {

		// 機器オプションサービス契約一意照会
		HashMap<String, Object> mapEKK2811A010 = (HashMap<String, Object>)getEKK2811A010(kkopSvcKeiNo);
		if (mapEKK2811A010 == null) {
			return false;
		}
		String kkopSvcKeiStat = (String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.KKOP_SVC_KEI_STAT);
		if ("100".compareTo(kkopSvcKeiStat) <= 0) {
			return false;		// サービス提供中以降なので対象外
		}

		// 機器提供サービス契約一覧照会
		String kktkSvcKeiNo = (String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.KKTK_SVC_KEI_NO);
		ArrayList<HashMap<String, Object>> listEKK0341B032 = (ArrayList<HashMap<String, Object>>)getEKK0341B032(kktkSvcKeiNo);
		if (listEKK0341B032 == null || listEKK0341B032.isEmpty()) {
			return false;
		}
		HashMap<String, Object> mapEKK0341B032 = listEKK0341B032.get(0);
		if (mapEKK0341B032 == null) {
			return false;
		}
		String kktkSvcKeiStat = (String)mapEKK0341B032.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_STAT);
		if (!"100".equals(kktkSvcKeiStat)) {
			return false;		// サービス提供中ではないので対象外
		}

		// サービス契約一意照会
		String kkopSvcCd = (String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.KKOP_SVC_CD);
		String svcKeiNo = netSvcKeiNo;
		if (KKOP_SVC_CD_TEL_VA.equals(kkopSvcCd)) {
			svcKeiNo = telSvcKeiNo;
		}
		HashMap<String, Object> mapEKK0081A010 = (HashMap<String, Object>)getEKK0081A010(svcKeiNo);
		if (mapEKK0081A010 == null) {
			return false;
		}
		String svcKeiStat = (String)mapEKK0081A010.get(EKK0081A010CBSMsg1List.SVC_KEI_STAT);
		if (!"100".equals(svcKeiStat)) {
			return false;		// サービス提供中ではないので対象外
		}

		// 多機能ルータ、サービス契約ともサービス提供中
		return true;	// 機器オプションをサービス提供中とする必要有り
	}

// ANK-1578-00-00 2014.01.20 T.TORIKAI メソッド追加（IT2-2014-0000046）
	/**
	 * 機器オプションをサービス提供中へする
	 * @param kkopSvcKeiNo
	 * @throws Throwable 
	 */
	private void startKkopSvcKei(String kkopSvcKeiNo, String idoDiv) throws Throwable {

		// 機器オプションサービス契約一意照会
		HashMap<String, Object> mapEKK2811A010 = (HashMap<String, Object>)getEKK2811A010(kkopSvcKeiNo);
		if (mapEKK2811A010 == null) {
			return;
		}

		HashMap<String, Object> mapEKK2811C040 = null;

		String kkopSvcKeiStat = (String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.KKOP_SVC_KEI_STAT);
		if ("020".equals(kkopSvcKeiStat)) {
			// 機器オプションサービス契約締結
			mapEKK2811C040 = (HashMap<String, Object>)contractEKK2811C040(mapEKK2811A010, idoDiv);
		} else {
			// 締結済
			mapEKK2811C040 = new HashMap<String, Object>();
			mapEKK2811C040.put(EKK2811C040CBSMsg.KKOP_SVC_KEI_NO, mapEKK2811A010.get(EKK2811A010CBSMsg1List.KKOP_SVC_KEI_NO));
			mapEKK2811C040.put(EKK2811C040CBSMsg.UPD_DTM, mapEKK2811A010.get(EKK2811A010CBSMsg1List.LAST_UPD_DTM));
		}

		// 機器オプションサービス契約開始
		startEKK2811C070(mapEKK2811C040, idoDiv);
	}

// ANK-1578-00-00 2014.01.20 T.TORIKAI メソッド追加（IT2-2014-0000046）
	/**
	 * EKK2811C040 機器オプションサービス契約締結
	 * @param mapEKK2811A010
	 * @param idoDiv
	 * @return
	 * @throws Exception
	 */
	private HashMap<String, Object> contractEKK2811C040(HashMap<String, Object> mapEKK2811A010, String idoDiv) throws Exception {

		// EKK2811C040 機器オプションサービス契約締結
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(EKK2811C040CBSMsg.KKOP_SVC_KEI_NO, (String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.KKOP_SVC_KEI_NO));
		condMap.put(EKK2811C040CBSMsg.IDO_DIV, idoDiv);
		condMap.put(EKK2811C040CBSMsg.UPD_DTM_BF, (String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.LAST_UPD_DTM));
		HashMap<String, Object> reqMap = mapper.setEKK2811C040(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		HashMap<String, Object> mapEKK2811C040 = mapper.getEKK2811C040(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return mapEKK2811C040;
	}

// ANK-1578-00-00 2014.01.20 T.TORIKAI メソッド追加（IT2-2014-0000046）
	/**
	 * EKK2811C070 機器オプションサービス契約開始
	 * @param mapEKK2811C040
	 * @param idoDiv
	 * @return
	 * @throws Exception
	 */
	private HashMap<String, Object> startEKK2811C070(HashMap<String, Object> mapEKK2811C040, String idoDiv) throws Exception {

		// EKK2811C070 機器オプションサービス契約開始
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(EKK2811C070CBSMsg.KKOP_SVC_KEI_NO, (String)mapEKK2811C040.get(EKK2811C040CBSMsg.KKOP_SVC_KEI_NO));
		condMap.put(EKK2811C070CBSMsg.IDO_DIV, idoDiv);
		condMap.put(EKK2811C070CBSMsg.UPD_DTM_BF, (String)mapEKK2811C040.get(EKK2811C040CBSMsg.UPD_DTM));
		condMap.put(EKK2811C070CBSMsg.DOJI_STA_UMU, "0");
		HashMap<String, Object> reqMap = mapper.setEKK2811C070(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		HashMap<String, Object> mapEKK2811C070 = mapper.getEKK2811C070(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return mapEKK2811C070;
	}

// ANK-1578-00-00 2014.01.20 T.TORIKAI メソッド追加（IT2-2014-0000046）
	/**
	 * EKK0341B032 機器提供サービス契約一覧照会（銃変用）※ステータス：110（手続中）を含む
	 * @param kktkSvcKeiNo
	 * @return
	 * @throws Exception
	 */
	private ArrayList<HashMap<String, Object>> getEKK0341B032(String kktkSvcKeiNo) throws Exception {

		// EKK0341B032 機器提供サービス契約一覧照会
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, JCCBPCommon.getOpeDate(null));
		HashMap<String, Object> reqMap = mapper.setEKK0341B032(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		ArrayList<HashMap<String, Object>> listEKK0341B032 = mapper.getEKK0341B032(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return listEKK0341B032;
	}

// ANK-1578-00-00 2014.01.20 T.TORIKAI メソッド追加（ST-2014-0000026）
	/**
	 * ネットサービスの変更が解約・新規か判定
	 * @return
	 * @throws Throwable 
	 */
	private boolean isNetSvcChgDslAndNewAdd() throws Throwable {

		HashMap<String, Object> paramMap = getRequestParameter();

		String div = (String)paramMap.get("jdg_chg_div_net");
		if (StringUtils.isEmpty(div)) {
			return false;		// パラメータなし（解約・新規ではない）
		}

		if (String.valueOf(JKKAdchgSvcKeiDivJdgNetCC.AD_CHG_CMT_SLRE_WITH_ADD).equals(div)) {
			return true;		// 解約・新規
		}

		return false;			// 解約・新規ではない
	}
	
// IT1-2014-0000040 2014/01/25 阮 START
	private void cancelKktkSvcKei(String tgKktkSvcKeiNo) throws Throwable {
		HashMap<String, Object> paramMap = getRequestParameter();
		
		if (tgKktkSvcKeiNo == null || "".equals(tgKktkSvcKeiNo)) {
			return;
		}

		// 機器オプションサービス契約一覧照会を実施
		ArrayList<HashMap<String, Object>> listEKK2811B010 = (ArrayList<HashMap<String, Object>>)getEKK2811B010(tgKktkSvcKeiNo);
		if (listEKK2811B010 == null || listEKK2811B010.isEmpty()) {
			return ;
		}
		
		// 無効機器オプションカウンター
		int mkKkopConter = 0 ;
		
		if (listEKK2811B010.size() > 0)
		{
			// 取得した機器オプション分だけループ処理を実施
			for (int i = 0 ;i < listEKK2811B010.size() ; i++) {
				HashMap<String, Object> mapEKK2811B010 = listEKK2811B010.get(i);
				
				// 機器オプションサービス契約ステータスを取得
				String kkopSvcKeiStat = (String)mapEKK2811B010.get(EKK2811B010CBSMsg1List.KKOP_SVC_KEI_STAT);
				
				// 機器オプションサービス契約ステータスがNULLでなく、キャンセルまたは解約済の場合
				if ((kkopSvcKeiStat != null && !"".equals(kkopSvcKeiStat))
						&& ("910".equals(kkopSvcKeiStat) || ("920".equals(kkopSvcKeiStat)))) {
					// 無効機器オプションカウンターをカウントアップする
					mkKkopConter ++;
				}
			}
		}
		
		// 機器オプションの数＝無効機器の数の場合
		if (mkKkopConter == listEKK2811B010.size()) {
			// 全ての機器オプションが無効であることが確認されるため、機器の解約を実施
			// 機器提供サービス契約一意照会を実施
			Map<String, Object> mapEKK0341A010 = getEKK0341A010(tgKktkSvcKeiNo);
			
			// 最終更新年月日時分秒をキープ
			String kktkSvcKeiLastUpdDtm = (String)mapEKK0341A010.get(EKK0341A010CBSMsg1List.LAST_UPD_DTM);
			
			// 機器提供サービス契約ステータスを取得
			String kktkSvcKeiStat = (String)mapEKK0341A010.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_STAT);
			
			// 機器提供サービス契約ステータスが無効（910：解約済または920：キャンセル済）の場合
			// 後続の解約キャンセル処理を実施しない
			if ("910".equals(kktkSvcKeiStat) || "920".equals(kktkSvcKeiStat))
			{
				return;
			}
			// 申込明細番号取得
			String mskmDtlNo = null;
			
			mskmDtlNo = (String)mapEKK0341A010.get(EKK0341A010CBSMsg1List.MSKM_DTL_NO);

			String idoDiv = (String)paramMap.get("ido_div");
			
			// 機器提供サービス契約ステータスで分岐：締結済未満の場合、機器キャンセルを実施
			if ("030".compareTo(kktkSvcKeiStat) > 0) {
				// 機器提供サービス契約キャンセル実施
				
				cancelEKK0341C330(tgKktkSvcKeiNo, mskmDtlNo, idoDiv, kktkSvcKeiLastUpdDtm);
			}
			// 機器提供サービス契約ステータスで分岐：締結済以上の場合、機器の解約処理を実施
			else
			{
				// 機器提供サービス契約解約を実施
				// 残置フラグ
				String zanchiFlg =  (String)mapEKK0341A010.get(EKK0341A010CBSMsg1List.ZANCHI_FLG);
				// 宅内機器異動コード
				String taknkikiIdoCd =  (String)mapEKK0341A010.get(EKK0341A010CBSMsg1List.TAKNKIKI_IDO_CD);
				
				Map<String, Object> mapEKK0341C340 = cancelEKK0341C340(tgKktkSvcKeiNo, mskmDtlNo, idoDiv, kktkSvcKeiLastUpdDtm , zanchiFlg , taknkikiIdoCd);
				
				// 機器提供サービス契約解約確定を実施
				// OM-2015-0000661 20151027 MOD START
				// 機器提供サービス契約番号を渡す
//				cancelEKK0341C350(mapEKK0341C340);
				cancelEKK0341C350(mapEKK0341C340, tgKktkSvcKeiNo);
				// OM-2015-0000661 20151027 MOD END
			}
// ANK-1578-00-00 2014.01.27 T.TORIKAI ADD START（IT1-2014-0000047）
			cancelMultiRouterNo = tgKktkSvcKeiNo;
//ANK-1578-00-00 2014.01.27 T.TORIKAI ADD END  （IT1-2014-0000047）
		}

	}
	
	/**
	 * EKK2811B010 機器オプションサービス契約一覧照会
	 * @param kktkSvcKeiNo
	 * @return
	 * @throws Exception
	 */
	private ArrayList<HashMap<String, Object>> getEKK2811B010(String kktkSvcKeiNo) throws Exception {

		// EKK2811B010 機器オプションサービス契約一覧照会
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		HashMap<String, Object> reqMap = mapper.setEKK2811B010(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		ArrayList<HashMap<String, Object>> listEKK2811B010 = mapper.getEKK2811B010(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return listEKK2811B010;
	}
	
	/**
	 * EKK2811C110 機器提供サービス契約キャンセル
	 * 
	 * @param kkopSvcKeiNo
	 * @param mskmDtlNo
	 * @param idoDiv
	 * @param lastUpdDtm
	 * @return
	 * @throws Throwable
	 */
	private Map<String, Object> cancelEKK0341C330(String kktkSvcKeiNo, String mskmDtlNo, String idoDiv, String lastUpdDtm) throws Throwable {
		
		// EKK2811C110 機器オプションサービス契約キャンセル
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put("kktk_svc_kei_no", kktkSvcKeiNo);
		condMap.put("mskm_dtl_no", mskmDtlNo);
		condMap.put("svc_cancel_rsn_cd", "01");
		condMap.put("ido_div", idoDiv);
		condMap.put("upd_dtm_bf", lastUpdDtm);

		HashMap<String, Object> reqMap = mapper.setEKK0341C330(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		Map<String, Object> mapEKK0341C330 = mapper.getEKK0341C330(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return mapEKK0341C330;
	}
	
	/**
	 * EKK0341C340 機器提供サービス契約解約処理
	 * 
	 * @param kkopSvcKeiNo
	 * @param mskmDtlNo
	 * @param idoDiv
	 * @param lastUpdDtm
	 * @return
	 * @throws Throwable
	 */
	private Map<String, Object> cancelEKK0341C340(String kktkSvcKeiNo, String mskmDtlNo, String idoDiv, String lastUpdDtm , String zanchiFlg , String taknkikiIdoCd) throws Throwable {
		
		// EKK0341C340 機器提供サービス契約解約処理
		HashMap<String, Object> condMap = new HashMap<String, Object>();
		condMap.put("kktk_svc_kei_no", kktkSvcKeiNo);
		condMap.put("mskm_dtl_no", mskmDtlNo);
		// 予約適用開始希望年月日
		condMap.put("rsv_tsta_kibo_ymd", JCCBPCommon.getOpeDate(null));
		// サービス終了日
		condMap.put("svc_endymd", JCCBPCommon.getOpeDate(null));
		// 残置フラグ
		condMap.put("zanchi_flg", zanchiFlg);
		// 違約金発生コード
		condMap.put("pnlty_hassei_cd", "0");
		// 宅内機器異動コード
		condMap.put("taknkiki_ido_cd", taknkikiIdoCd);
		condMap.put("ido_div", idoDiv);
// IT2-2014-0000179対応 20140403 星野 MOD START
//		condMap.put("upd_dtm_bf", lastUpdDtm);
		condMap.put("upd_dt_kktk_svc_kei_upd_dtm_bef", lastUpdDtm);
// IT2-2014-0000179対応 20140403 星野 MOD END

		HashMap<String, Object> reqMap = mapper.setEKK0341C340(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		Map<String, Object> mapEKK0341C340 = mapper.getEKK0341C340(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());
		
		return mapEKK0341C340;
	}
	
	/**
	 * EKK0341C340 機器提供サービス契約解約処理
	 * 
	 * @param kkopSvcKeiNo
	 * @param mskmDtlNo
	 * @param idoDiv
	 * @param lastUpdDtm
	 * @return
	 * @throws Throwable
	 */
	// OM-2015-0000661 20151027 MOD START
//	private Map<String, Object> cancelEKK0341C350(Map<String, Object> mapEKK0341C340) throws Throwable {
	private Map<String, Object> cancelEKK0341C350(Map<String, Object> mapEKK0341C340, String kktkSvcKeino) throws Throwable {
	// OM-2015-0000661 20151027 MOD END
		
		// EKK0341C340 機器提供サービス契約解約処理
		HashMap<String, Object> condMap = new HashMap<String, Object>();
		// 機器提供サービス契約番号
		// OM-2015-0000661 20151027 MOD START
//		condMap.put("kktk_svc_kei_no", (String)mapEKK0341C340.get(EKK0341C340CBSMsg.KKTK_SVC_KEI_NO));
		condMap.put("kktk_svc_kei_no", kktkSvcKeino);
		// OM-2015-0000661 20151027 MOD END
		// サービス終了日
		condMap.put("svc_endymd", JCCBPCommon.getOpeDate(null));
		// サービス課金終了年月日
		condMap.put("svc_chrg_endymd", addYYYYMMDD(JCCBPCommon.getOpeDate(null), -1));
		// 更新年月日時分秒(更新前)
		// OM-2015-0000661 20151027 MOD START
//		condMap.put("upd_dtm_bf", (String)mapEKK0341C340.get(EKK0341C340CBSMsg.UPD_DTM));
		condMap.put("upd_dt_kktk_svc_kei_upd_dtm_bef", (String)mapEKK0341C340.get(EKK0341C340CBSMsg.UPD_DTM));
		// OM-2015-0000661 20151027 MOD END

		HashMap<String, Object> reqMap = mapper.setEKK0341C350(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		Map<String, Object> mapEKK0341C350 = mapper.getEKK0341C350(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return mapEKK0341C350;
	}
	
	public static String addYYYYMMDD(String trgtYmd, int addDay) throws Throwable
	{
		// 年月日が空の場合
		if (trgtYmd == null || "".equals(trgtYmd))
		{
			return trgtYmd;
		}

		// 年月日が８桁に満たない場合
		if (trgtYmd.length() < 8)
		{
			return trgtYmd;
		}

		// 年月日の抽出
		int year  = Integer.parseInt(trgtYmd.substring(0, 4));
		int month = Integer.parseInt(trgtYmd.substring(4, 6));
		int day   = Integer.parseInt(trgtYmd.substring(6, 8));

		Calendar cal = Calendar.getInstance();
		cal.set(year, month - 1, day);
		// 日付を算出
		cal.add(Calendar.DATE, addDay);

		return String.format("%tY%tm%td", cal, cal, cal);
	}
// IT1-2014-0000040 2014/01/25 阮 END

// ANK-1578-00-00 2014.01.27 T.TORIKAI メソッド追加（IT1-2014-0000047）
	/**
	 * 多機能ルータの追加により置き換わる機器のキャンセル・解約を行う
	 * 
	 * @param multiRouterNo
	 * @throws Throwable
	 */
	private void cancelOtherKiki(String multiRouterNo) throws Throwable {

		// 機器オプションサービス契約一覧照会
		ArrayList<HashMap<String, Object>> listEKK2811B010 = (ArrayList<HashMap<String, Object>>)getEKK2811B010(multiRouterNo);
		if (listEKK2811B010 == null || listEKK2811B010.isEmpty()) {
			return ;
		}

		boolean existKkopRouter = false;
		boolean existKkopTelVa = false;

		for (HashMap<String, Object> mapEKK2811B010 : listEKK2811B010) {
			String kkopSvcCd = (String)mapEKK2811B010.get(EKK2811B010CBSMsg1List.KKOP_SVC_CD);
			if (KKOP_SVC_CD_ROUTER.equals(kkopSvcCd)) {
				existKkopRouter = true;
			}
			if (KKOP_SVC_CD_TEL_VA.equals(kkopSvcCd)) {
				existKkopTelVa = true;
			}
		}
		// 機器オプション：ルーター機能
		if (existKkopRouter) {
			cancelRouterKiki();		// ルーターの「追加」「交換」「引継」をキャンセル
		}
		// 機器オプション：ＶＡ機能
		if (existKkopTelVa) {
			cancelTelVaKiki();		// ＶＡの「追加」「交換」「引継」をキャンセル
		}
	}

// ANK-1578-00-00 2014.01.27 T.TORIKAI メソッド追加（IT1-2014-0000047）
	/**
	 * ルーター機器の解約・キャンセルを行う。
	 * @throws Throwable
	 */
	private void cancelRouterKiki() throws Throwable {

		HashMap<String, Object> parameter = getRequestParameter();
		String adchgNo = (String)parameter.get("adchg_no");
		String svcKeiNo = (String)parameter.get("eoh_nt_svc_kei_no");
		String svcChgDiv = (String)parameter.get("net_svc_use_chg_div");

		if (!USE_SVC_CHG_DIV_ADD.equals(svcChgDiv) && !USE_SVC_CHG_DIV_CON.equals(svcChgDiv) && !USE_SVC_CHG_DIV_CHG.equals(svcChgDiv)) {
			return;
		}

		// ルーターの機器提供サービス契約を取得
		HashMap<String, String> kktkSvcKeiInfo = getKktkSvcKeiInfo(adchgNo, "F0");
		if (kktkSvcKeiInfo == null) {
			return;
		}

		// 撤去区分の判定：交換かどうか
		boolean isKikiChg = isKikiChg((String)kktkSvcKeiInfo.get("kktk_svc_kei_no"));

// OM-2014-0000457対応 20140131 星野 ADD START
		boolean isKikiAdd = isKikiAdd(kktkSvcKeiInfo);
		
		// 機器追加・機器交換の場合配送を取り消す
		if( isKikiAdd || isKikiChg ){
// OM-2014-0000457対応 20140131 星野 ADD END 
			// 配送取消し※機器提供サービス契約の予約レコード（転居先の情報）を削除前に転居先の配送を取消しておく
			haisoCancel(kktkSvcKeiInfo, svcKeiNo, FIXED_TEXT_HAISO_CANCEL_ROUTER);
// OM-2014-0000457対応 20140131 星野 ADD START
		}
// OM-2014-0000457対応 20140131 星野 ADD END

		// 機器提供サービスの予約レコードを削除
		// ※機器追加の場合は追加機器をキャンセルする
		kikiCancel(kktkSvcKeiInfo, FIXED_TEXT_ROUTER_CANCEL);

		// 転居元で使用している機器を解約
		if (USE_SVC_CHG_DIV_CON.equals(svcChgDiv) || USE_SVC_CHG_DIV_CHG.equals(svcChgDiv)) {
			kikiDsl(kktkSvcKeiInfo, isKikiChg, true);
		}
	}

// OM-2014-0000457対応 20140131 星野 ADD START
	private boolean isKikiAdd(HashMap<String, String> kktkSvcKeiInfo) {
		
		if(kktkSvcKeiInfo==null){
			return false;
		}
		
		String motoKikiChgNo = kktkSvcKeiInfo.get("moto_kiki_chg_no");
		String sakiKikiChgNo = kktkSvcKeiInfo.get("saki_kiki_chg_no");
		if( StringUtils.isEmpty(motoKikiChgNo) && !StringUtils.isEmpty(sakiKikiChgNo) ){
			return true;
		}else{
			return false;
		}
	}
// OM-2014-0000457対応 20140131 星野 ADD END

// ANK-1578-00-00 2014.01.27 T.TORIKAI メソッド追加（IT1-2014-0000047）
	/**
	 * ＶＡ機器の解約・キャンセルを行う。
	 * @throws Throwable
	 */
	private void cancelTelVaKiki() throws Throwable {

		HashMap<String, Object> parameter = getRequestParameter();
		String adchgNo = (String)parameter.get("adchg_no");
		String svcKeiNo = (String)parameter.get("eoh_tl_svc_kei_no");
		String svcChgDiv = (String)parameter.get("tel_svc_use_chg_div");
		if (!USE_SVC_CHG_DIV_ADD.equals(svcChgDiv) && !USE_SVC_CHG_DIV_CON.equals(svcChgDiv) && !USE_SVC_CHG_DIV_CHG.equals(svcChgDiv)) {
			return;
		}

		// VAの機器提供サービス契約を取得
		HashMap<String, String> kktkSvcKeiInfo = getKktkSvcKeiInfo(adchgNo, "50");
		if (kktkSvcKeiInfo == null) {
			return;
		}

		// 撤去区分の判定：交換かどうか
		boolean isKikiChg = isKikiChg((String)kktkSvcKeiInfo.get("kktk_svc_kei_no"));

// OM-2014-0000457対応 20140131 星野 ADD START
		boolean isKikiAdd = isKikiAdd(kktkSvcKeiInfo);
		
		// 機器追加・機器交換の場合配送を取り消す
		if( isKikiAdd || isKikiChg ){
// OM-2014-0000457対応 20140131 星野 ADD END 
			// 配送取消し※機器提供サービス契約の予約レコード（転居先の情報）を削除前に転居先の配送を取消しておく
			haisoCancel(kktkSvcKeiInfo, svcKeiNo, FIXED_TEXT_HAISO_CANCEL_TEL_VA);
// OM-2014-0000457対応 20140131 星野 ADD START
		}
// OM-2014-0000457対応 20140131 星野 ADD END
		
		// 機器提供サービスの予約レコードを削除
		// ※機器追加の場合は追加機器をキャンセルする
		kikiCancel(kktkSvcKeiInfo, FIXED_TEXT_TEL_VA_CANCEL);

		// 転居元で使用している機器を解約
		if (USE_SVC_CHG_DIV_CON.equals(svcChgDiv) || USE_SVC_CHG_DIV_CHG.equals(svcChgDiv)) {
			kikiDsl(kktkSvcKeiInfo, isKikiChg, false);
		}
	}

// ANK-1578-00-00 2014.01.27 T.TORIKAI メソッド追加（IT1-2014-0000047）
	/**
	 * 住変で追加した機器をキャンセルする
	 * 
	 * @param kktkSvcKeiInfo	機器提供サービス契約情報
	 * @param paramKey			CC呼出時に使用するFIXEDTEXT
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void kikiCancel(HashMap<String, String> kktkSvcKeiInfo, String paramKey) throws Throwable {

		HashMap<String, Object> parameter = getRequestParameter();

		// CC呼出用のパラメータ設定
		HashMap<String, Object> kikiCancelParam = (HashMap<String, Object>)parameter.get("cancel_kiki_param");
		ArrayList<HashMap<String, String>> cancelKikiList =  new ArrayList<HashMap<String, String>>();
		cancelKikiList.add(kktkSvcKeiInfo);
		kikiCancelParam.put("cancel_kiki_list", cancelKikiList);

		String fixedText = keepFixedText.get() + paramKey;
		keepReqParam.get().setData(fixedText, kikiCancelParam);

		// 機器キャンセルCC
		JKKAdchgKikiSvcCC jKKAdchgKikiSvcCC = new JKKAdchgKikiSvcCC();
		jKKAdchgKikiSvcCC.updateRonriDel(keepSesHandle.get(), keepReqParam.get(), fixedText);
	}

// ANK-1578-00-00 2014.01.27 T.TORIKAI メソッド追加（IT1-2014-0000047）
	/**
	 * 住変で引越する機器を撤去する（異動予約にて解約）
	 * 
	 * @param kktkSvcKeiInfo	機器提供サービス契約情報
	 * @param isKikiChg			撤去区分：交換の判定
	 * @param isRouter			解約対象：ルーターの判定（false：VA）
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void kikiDsl(HashMap<String, String> kktkSvcKeiInfo, boolean isKikiChg, boolean isRouter) throws Throwable {

		HashMap<String, Object> parameter = getRequestParameter();

		// ルーターの機器提供サービス契約：解約
		HashMap<String, Object> dslKikiParam = (HashMap<String, Object>)parameter.get("dsll_net_kiki_param");
		if (!isRouter) {
			dslKikiParam = (HashMap<String, Object>)parameter.get("dsll_tel_kiki_param");
		}

		ArrayList kikiList = new ArrayList();
		HashMap<String, Object> kktkSvcKeiMap = new HashMap<String, Object>();
		kktkSvcKeiMap.put("kktk_svc_kei_no", kktkSvcKeiInfo.get("kktk_svc_kei_no"));
		if (isKikiChg) {
			// 「交換」の場合は転居元の返品は作成済みなので解約にともなう返品は不要
			kktkSvcKeiMap.put("henpin_not_create_flg", "1");
		}
		kikiList.add(kktkSvcKeiMap);

		ArrayList ucwkList = new ArrayList();
		ucwkList.add(new HashMap());

		dslKikiParam.put("kktk_svc_kei_list", kikiList);
		dslKikiParam.put("svc_kei_ucwk_list", ucwkList);

		String fixedText = keepFixedText.get() + FIXED_TEXT_ROUTER_DSL;
		if (!isRouter) {
			fixedText = keepFixedText.get() + FIXED_TEXT_TEL_VA_DSL;
		}
		keepReqParam.get().setData(fixedText, dslKikiParam);

		// 機器提供サービス契約解約CC
		JKKAdchgKktkSvcKeiDslCC kktkSvcKeiDslCc = new JKKAdchgKktkSvcKeiDslCC();
		kktkSvcKeiDslCc.dslKktkSvcKei(keepSesHandle.get(), keepReqParam.get(), fixedText);
	}

// ANK-1578-00-00 2014.01.27 T.TORIKAI メソッド追加（IT1-2014-0000047）
	/**
	 * 配送取消し
	 * 
	 * @param kktkSvcKeiInfo
	 * @param svcKeiNo
	 * @param paramKey
	 * @throws Throwable
	 */
	private void haisoCancel(HashMap<String, String> kktkSvcKeiInfo, String svcKeiNo, String paramKey) throws Throwable {

		// CC呼出用のパラメータ設定
		HashMap<String, String> haisoCancelKiki = new HashMap<String, String>();
		haisoCancelKiki.put("kktkSvcKeiNo", kktkSvcKeiInfo.get("kktk_svc_kei_no"));
		haisoCancelKiki.put("kkChgNo", kktkSvcKeiInfo.get("saki_kiki_chg_no"));
		haisoCancelKiki.put("kikiChgNo", kktkSvcKeiInfo.get("saki_kiki_chg_no"));
		haisoCancelKiki.put("svcKeiNo", svcKeiNo);
		
		ArrayList<HashMap<String, String>> haisoCancelKikiList = new ArrayList<HashMap<String, String>>();
		haisoCancelKikiList.add(haisoCancelKiki);
		
		HashMap<String, Object> haisoCancelParam = new HashMap<String, Object>();
		haisoCancelParam.put("haiso_cancel_kiki_list", haisoCancelKikiList);

		String fixedText = keepFixedText.get() + paramKey;
		keepReqParam.get().setData(fixedText, haisoCancelParam);

		// 配送取消CC
		JKKAdchgCancelHaisoCC haisoCancelCc = new JKKAdchgCancelHaisoCC();
		haisoCancelCc.kikiHaisoCancel(keepSesHandle.get(), keepReqParam.get(), fixedText);
	}

// ANK-1578-00-00 2014.01.27 T.TORIKAI メソッド追加（IT1-2014-0000047）
	/**
	 * 配送取消し
	 * 
	 * @param cancelMultiRouterNo	多機能ルータの機器提供サービス契約番号
	 * @param svcKeiNo				サービス契約番号
	 * @throws Throwable
	 */
	private void haisoCancel(String cancelMultiRouterNo, String svcKeiNo) throws Throwable {

		// 機器提供サービス契約一意照会
		Map<String, Object> mapEKK0341A010 = getEKK0341A010(cancelMultiRouterNo);
		if (mapEKK0341A010 == null) {
			return;
		}

		// 追加をキャンセルした多機能ルータの配送を取消す
		HashMap<String, String> kktkSvcKeiInfo = new HashMap<String, String>();
		kktkSvcKeiInfo.put("kktk_svc_kei_no", cancelMultiRouterNo);
		kktkSvcKeiInfo.put("moto_kiki_chg_no", (String)mapEKK0341A010.get(EKK0341A010CBSMsg1List.KIKI_CHG_NO));
		kktkSvcKeiInfo.put("saki_kiki_chg_no", (String)mapEKK0341A010.get(EKK0341A010CBSMsg1List.KIKI_CHG_NO));

		haisoCancel(kktkSvcKeiInfo, svcKeiNo, FIXED_TEXT_HAISO_CANCEL_MULTI_ROUTER);
	}

// ANK-1578-00-00 2014.01.27 T.TORIKAI メソッド追加（IT1-2014-0000047）
	/**
	 * 住変明細より対象機器の機器提供サービス契約情報を取得する
	 * @param adchgNo
	 * @param taknkikiSbtCd
	 * @return
	 * @throws Throwable
	 */
	private HashMap<String, String> getKktkSvcKeiInfo(String adchgNo, String taknkikiSbtCd) throws Throwable {

		// 住変明細（機器）取得
		ArrayList<HashMap<String, Object>> listEKK2101B001 = getEKK2101B001(adchgNo, "03");
		if (listEKK2101B001 == null) {
			return null;
		}

		for (HashMap<String, Object> mapEKK2101B001 : listEKK2101B001) {
			// 機器提供サービス契約一意照会
			String kktkSvcKeiNo = (String)mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHG_TG_KEI_NO);
			Map<String, Object> mapEKK0341A010 = getEKK0341A010(kktkSvcKeiNo);
			if (mapEKK0341A010 == null) {
				continue;
			}
			String code = (String)mapEKK0341A010.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD);
			if (!taknkikiSbtCd.equals(code)) {
				continue;	// 宅内機器種別コードが異なるので対象外
			}
			
			if (StringUtils.isEmpty((String)mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHAF_SKBT_NO))) {
				return null;	// 転居先に無し
			}

			HashMap<String, String> resultMap = new HashMap<String, String>();
			resultMap.put("kktk_svc_kei_no", kktkSvcKeiNo);
			resultMap.put("moto_kiki_chg_no", (String)mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHBF_SKBT_NO));
			resultMap.put("saki_kiki_chg_no", (String)mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHAF_SKBT_NO));
			return resultMap;
		}
		return null;
	}

// ANK-1578-00-00 2014.01.27 T.TORIKAI メソッド追加（IT1-2014-0000047）
	/**
	 * 機器の撤去区分が交換か判定する<br>
	 * 機器提供サービス契約の最新レコードが手続き中の場合は交換
	 * @param kktkSvcKeiNo
	 * @return
	 * @throws Throwable
	 */
	private boolean isKikiChg(String kktkSvcKeiNo) throws Throwable {
		
		// 機器提供サービス契約一覧照会
		ArrayList<HashMap<String, Object>> listEKK0341B032 = (ArrayList<HashMap<String, Object>>)getEKK0341B032(kktkSvcKeiNo);
		if (listEKK0341B032 == null || listEKK0341B032.isEmpty()) {
			return false;
		}
		HashMap<String, Object> mapEKK0341B032 = listEKK0341B032.get(0);
		if (mapEKK0341B032 == null) {
			return false;
		}
		String kktkSvcKeiStat = (String)mapEKK0341B032.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_STAT);
		if (!"110".equals(kktkSvcKeiStat)) {
			return false;		// 手続き中ではない
		}
		
		return true;
	}
// IT2-2014-0000197 2014.04.18 Y.Kanata ADD START
	/**
	 * 機器オプション（VA機能）の番号追加・解約に伴う料金コース変更処理
	 */
	private void changeKkopVaCourse(
			HashMap<String, Object> parameter
			, String kkopSvcCd
			, ArrayList<HashMap<String, Object>> listEKK2881B001
			) throws Throwable {
		// 1.住所変更登録で追加された機器オプションのVA機能であること
		// 2.電話サービス追加ではない
		// 3.住所変更の修正モードで番号追加・番号解約を行う

		// 電話サービスの状態
		String telUse = (String) parameter.get("tel_svc_use_chg_div");
		// 電話サービス追加ではない
		// OM-2014-0001708 締結済以下の場合もプラン変する様に対応 2014/05/02 DEL START
//		if (USE_SVC_CHG_DIV_ADD.equals(telUse)) {
//			return;
//		}
		// OM-2014-0001708 締結済以下の場合もプラン変する様に対応 2014/05/02 DEL START
		// VA機能であること
		if (!KKOP_SVC_CD_TEL_VA.equals(kkopSvcCd)) {
			return;
		}
		// 番号追加 or 番号解約であること
		String selectPcrs = (String) parameter.get("tel_pcrs_cd");
		String registPplan = (String) parameter.get("regist_tel_pplan_cd");
		String registPcrs = "";
		if (!StringUtils.isEmpty(registPplan) && registPplan.length() == 6) {
			registPcrs = registPplan.substring(1, 4);
		}
		if (StringUtils.isEmpty(registPcrs) || registPcrs.equals(selectPcrs)) {
			return;
		}
		// 住所変更利用機器一時保存から機器オプションの処理区分を判断し、
		// 住所変更登録で追加された機器オプションのVA機能でなければ処理終了
		boolean vaKkopHasAddedInAdchg = isKkopVaAddInAdchg(listEKK2881B001);
		if (!vaKkopHasAddedInAdchg) {
			return;
		}
		// 住所変更登録によって追加された機器オプションサービス契約番号のうち、ＶＡ機能の契約番号を取得する。
		String kkopSvcKeiNo = "";
		for (HashMap<String, Object> mapEKK2881B001 : listEKK2881B001) {
			String tppvKkopSvcCd = (String)mapEKK2881B001.get(EKK2881B001CBSMsg1List.KKOP_SVC_CD);
			if (kkopSvcCd.equals(tppvKkopSvcCd)) {
				// 追加済みなので処理不要
				kkopSvcKeiNo = (String)mapEKK2881B001.get(EKK2881B001CBSMsg1List.KKOP_SVC_KEI_NO);
				break;
			}
		}
		if (StringUtils.isEmpty(kkopSvcKeiNo)) {
			return;
		}
		// 機器オプションサービス契約（VA機能）の料金コース・プランを更新
		updateVaKkop(kkopSvcKeiNo, parameter);

		return;
	}
	
	/**
	 * 住所変更明細と機器オプションサービス契約から<br/>
	 * 住所変更時に追加となった機器オプション（VA機能）が存在するか判定する。
	 * 
	 * @return bool
	 * @throws Throwable
	 */
	private boolean isKkopVaAddInAdchg(
			ArrayList<HashMap<String, Object>> listEKK2881B001
			) throws Throwable {

		if (listEKK2881B001 == null) {
			return false;
		}
		// 住変明細より機器オプションの情報を取得する
		HashMap<String, Object> paramMap = getRequestParameter();
		String adchgNo = (String) paramMap.get("adchg_no");
		ArrayList<HashMap<String, Object>> listEKK2101B001 = getEKK2101B001(adchgNo, "09");
		if (listEKK2101B001 == null) {
			return false;
		}
		// 変更後識別番号のみ設定(追加)されている種別コード（9:機器オプション）のレコードを探す
		for (HashMap<String, Object> mapEKK2101B001 : listEKK2101B001) {
			String beforeNo = (String) mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHBF_SKBT_NO);
			String afterNo = (String) mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHAF_SKBT_NO);
			if (StringUtils.isEmpty(beforeNo) && !StringUtils.isEmpty(afterNo)) {
				// 機器オプションサービス契約一覧照会結果を元にVA機能であることを確認する
				for (HashMap<String, Object> mapEKK2881B001 : listEKK2881B001) {
					String kkopKeiNo = (String) mapEKK2881B001.get(EKK2881B001CBSMsg1List.KKOP_SVC_KEI_NO);
					if (afterNo.equals(kkopKeiNo)) {
						String kkopSvcCd = (String) mapEKK2881B001.get(EKK2881B001CBSMsg1List.KKOP_SVC_CD);
						if (KKOP_SVC_CD_TEL_VA.equals(kkopSvcCd)) {
							return true;
						}
					}
				}
			}
		}
		
		// ネット残置、電話引越の場合に多機能ルータも残地される場合を考慮する。
		// VA機能の機器オプションサービス契約番号が紐付く機器提供サービス契約番号を取得
		// サービスの残置判定は関数呼び出し前に行っている前提
		String chgAfKktkNo = "";
		for (HashMap<String, Object> mapEKK2101B001 : listEKK2101B001) {
			String kktkSvcKeiNo = (String) mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHG_TG_KEI_NO);
			String afterNo = (String) mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHAF_SKBT_NO);
			// 機器オプションサービス契約一覧照会結果を元にVA機能であることを確認する
			for (HashMap<String, Object> mapEKK2881B001 : listEKK2881B001) {
				String kkopKeiNo = (String) mapEKK2881B001.get(EKK2881B001CBSMsg1List.KKOP_SVC_KEI_NO);
				if (afterNo.equals(kkopKeiNo)) {
					String kkopSvcCd = (String) mapEKK2881B001.get(EKK2881B001CBSMsg1List.KKOP_SVC_CD);
					if (KKOP_SVC_CD_TEL_VA.equals(kkopSvcCd)) {
						chgAfKktkNo = kktkSvcKeiNo;
					}
				}
			}
		}
		
		// 住変明細より機器の情報を取得する
		paramMap = getRequestParameter();
		adchgNo = (String) paramMap.get("adchg_no");
		ArrayList<HashMap<String, Object>> listEKK2101B001_kiki = getEKK2101B001(adchgNo, "03");
		if (listEKK2101B001_kiki == null) {
			return false;
		}
		// 変更後識別番号のみ設定(追加)されている種別コード（3:機器提供サービス契約）のレコードを探す
		for (HashMap<String, Object> mapEKK2101B001 : listEKK2101B001) {
			String kktkSvcKeiNo = (String) mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHG_TG_KEI_NO);
			String beforeNo = (String) mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHBF_SKBT_NO);
			String afterNo = (String) mapEKK2101B001.get(EKK2101B001CBSMsg1List.CHAF_SKBT_NO);
			if (!StringUtils.isEmpty(beforeNo) && !StringUtils.isEmpty(afterNo)) {
				// 転居先に追加した多機能ルータの機器提供サービス契約番号と一致することを確認する
				if (!StringUtils.isEmpty(chgAfKktkNo)  && kktkSvcKeiNo.equals(chgAfKktkNo)) {
					return true;
				}
			}
		}
		return false;
	}
	
	/**
	 *  機器オプションサービス契約（VA機能）の料金コース・プランを更新
	 * @param kkopSvcKeiNo
	 * @param telPcrsCd
	 * @throws Throwable
	 */
	private void updateVaKkop(
			String kkopSvcKeiNo
			, HashMap<String, Object> parameter
			) throws Throwable {
		
		// 電話料金コースの取得
		String telPcrsCd = (String)parameter.get("tel_pcrs_cd");
		// 更新後の料金コース
		String updPcrs = "";
		// 更新後の料金プラン
		String updPplan = "";
		if ("A31".equals(telPcrsCd)) {
			updPcrs = KKOP_VA_1NUM_PCRS_CD;
			updPplan = "P" + updPcrs + "01";
		} else if ("A32".equals(telPcrsCd)) {
			updPcrs = KKOP_VA_2NUM_PCRS_CD;
			updPplan = "P" + updPcrs + "01";
		} else {
			return;
		}
		
		// 機器オプションサービス契約一意照会
		HashMap<String, Object> mapEKK2811A010 = (HashMap<String, Object>)getEKK2811A010(kkopSvcKeiNo);
		if (mapEKK2811A010 == null) {
			return;
		}
		
		// OM-2014-0001708 締結済以下の場合もプラン変する様に対応 2014/05/02 ADD START
// OM-2014-0001924対応 20140606 星野 MOD START
//		if ("G03".equals((String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.PCRS_CD))) {
		if (updPcrs.equals((String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.PCRS_CD))) {
// OM-2014-0001924対応 20140606 星野 MOD END
			return;
		}
		// OM-2014-0001708 締結済以下の場合もプラン変する様に対応 2014/05/02 ADD START
		
		String mskmDtlNo = (String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.MSKM_DTL_NO);
		String lastUpdDtm = (String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.LAST_UPD_DTM);
		String rsvAplyYmd = (String)mapEKK2811A010.get(EKK2811A010CBSMsg1List.RSV_APLY_YMD);
// OM-2015-0000170 2015/04/23 ADD START
		// 機器オプションサービス契約の一意照会にて最終更新年月日時分秒が空白の場合は親サービスの最終更新年月日時分秒を流用
		if (lastUpdDtm == null || "".equals(lastUpdDtm))
		{
			// サービス契約一意照会(親の電話サービス契約キーに)
			HashMap<String, Object> mapEKK0081A010 = (HashMap<String, Object>)getEKK0081A010((String)parameter.get("eoh_tl_svc_kei_no"));
			if (mapEKK0081A010 != null) {
				lastUpdDtm = (String)mapEKK0081A010.get(EKK0081A010CBSMsg1List.LAST_UPD_DTM);
			}
		}
// OM-2015-0000170 2015/04/23 ADD END
		// EKK2811C250_機器オプションサービス契約料金コース変更
		HashMap<String, String> condMap = new HashMap<String, String>();
		// 機器オプションサービス契約番号
		condMap.put(EKK2811C250CBSMsg.KKOP_SVC_KEI_NO, kkopSvcKeiNo);
		// 異動区分
		condMap.put(EKK2811C250CBSMsg.IDO_DIV, "00019");
		// 予約適用年月日
		condMap.put(EKK2811C250CBSMsg.RSV_APLY_YMD, rsvAplyYmd);
		// 申込明細番号
		condMap.put(EKK2811C250CBSMsg.MSKM_DTL_NO, mskmDtlNo);
		// 料金コースコード
		condMap.put(EKK2811C250CBSMsg.PCRS_CD, updPcrs);
		// 料金プランコード
		condMap.put(EKK2811C250CBSMsg.PPLAN_CD, updPplan);
		// 更新年月日時分秒(更新前)
		condMap.put(EKK2811C250CBSMsg.UPD_DTM_BF, lastUpdDtm);

		HashMap<String, Object> reqMap = mapper.setEKK2811C250(keepReqParam.get(), keepFixedText.get(), condMap);
		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		Map<String, Object> mapEKK2811C250 = mapper.getEKK2811C250(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());
		if (mapEKK2811C250 == null) {
			return;
		}
		lastUpdDtm = (String)mapEKK2811C250.get(EKK2811C250CBSMsg.UPD_DTM);

		condMap.clear();
		// 機器オプションサービス契約番号
		condMap.put(EKK2811C260CBSMsg.KKOP_SVC_KEI_NO, kkopSvcKeiNo);
		// 予約適用年月日
		condMap.put(EKK2811C260CBSMsg.RSV_APLY_YMD, rsvAplyYmd);
		// 更新年月日時分秒(更新前)
		condMap.put(EKK2811C260CBSMsg.UPD_DTM_BF, lastUpdDtm);

		reqMap = mapper.setEKK2811C260(keepReqParam.get(), keepFixedText.get(), condMap);
		resMap = scCall.run(reqMap, keepSesHandle.get());
		mapper.getEKK2811C260(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());
	}
// IT2-2014-0000197 2014.04.18 Y.Kanata ADD END
	// 20140811 IT1-2014-0000289 マンション（イーサ・VDDSL）で工事予定取込前の場合、配送予定年月日に未来日を設定する ADD
	// 20141008 ANK-1918-06-00 配送予定年月日を配送受付処理にI/Fするよう修正 DEL START
//	/**
//	 *  配送依頼指定年月日の取得処理
//	 *  マンション（イーサ・VDSL）で、工事予定取込前の場合、配送依頼指定年月日を未来日(20991231)とする
//	 * @throws Throwable
//	 */
//	private String getHaisoReqShiteiYmd(
//			
//	) throws Throwable 
//	{
//		
//		HashMap<String, Object> paramMap = getRequestParameter();
//		
//		if(paramMap.containsKey("kojiak_no"))
//		{
//			// 工事案件番号取得
//			String kojiakNo = (String)paramMap.get("kojiak_no");
//			
//			if (JKKBpCommon.isNull(kojiakNo))
//			{
//				// 工事が登録される前の場合は、未来日とする
//				return "20991231";
//			}
//			else
//			{
//				// 工事案件一意照会
//				HashMap<String, Object> mapEKU0011A010 = (HashMap<String, Object>)getEKU0011A010(kojiakNo);
//				if (mapEKU0011A010 != null) 
//				{
//					// マンション工事案件状態コード
//					String mansKojiakStatCd = (String)mapEKU0011A010.get(EKU0011A010CBSMsg1List.MANS_KOJIAK_STAT_CD);
//					// 機器出荷予定日算出基準年月日が未設定の場合、工事予定取込前とする
//					String kkshkaRsvdSnststdYmd =  (String)mapEKU0011A010.get(EKU0011A010CBSMsg1List.KKSHKA_RSVD_SNSTSTD_YMD);
//					
//					if("200".compareTo(mansKojiakStatCd) > 0
//							&& !JKKBpCommon.isNull(kkshkaRsvdSnststdYmd) 
//						)
//					{
//						// 機器出荷予定日算出基準年月日が設定されている場合、未来日とする
//						return "20991231";
//					}
//				}
//			}
//		}
//		
//		return null;
//	}
	// 20141008 ANK-1918-06-00 配送予定年月日を配送受付処理にI/Fするよう修正 DEL END
	// 20141008 ANK-1918-06-00 配送予定年月日を配送受付処理にI/Fするよう修正 ADD START
	/**
	 *  配送予定年月日の取得処理
	 *  マンション（イーサ・VDSL）で、工事予定取込前の場合、配送予定年月日を未来日(20991231)とする
	 * @throws Throwable
	 */
	private String getHaisoRsvYmd(
	) throws Throwable 
	{
		// 配送予定年月日（戻り値）
		String haisoRsvYmd = null;
		
		HashMap<String, Object> paramMap = getRequestParameter();
		
		if(paramMap.containsKey("kojiak_no"))
		{
			// キーが存在する場合（US管理のサービスの場合）
			haisoRsvYmd = JKKBpCommon.getOpeDate(null);
			
			// 工事案件番号取得
			String kojiakNo = (String)paramMap.get("kojiak_no");
			//  IT1-2022-0000054 ADD START
			// 工事範囲コード取得
			String kojiScopeCd = (String)paramMap.get("koji_scope_cd");
			//  IT1-2022-0000054 ADD END
			if (JKKBpCommon.isNull(kojiakNo))
			{
				// 工事が登録される前の場合は、未来日とする
				haisoRsvYmd = "20991231";
			}
			else
			{
				// 工事案件一意照会
				HashMap<String, Object> mapEKU0011A010 = (HashMap<String, Object>)getEKU0011A010(kojiakNo);
				if (mapEKU0011A010 != null) 
				{
					// マンション工事案件状態コード
					String mansKojiakStatCd = (String)mapEKU0011A010.get(EKU0011A010CBSMsg1List.MANS_KOJIAK_STAT_CD);
					// 機器出荷予定日算出基準年月日が未設定の場合、工事予定取込前とする
					String kkshkaRsvdSnststdYmd =  (String)mapEKU0011A010.get(EKU0011A010CBSMsg1List.KKSHKA_RSVD_SNSTSTD_YMD);
					//  IT1-2022-0000054 ADD START
					if(kojiScopeCd != null && !"".equals(kojiScopeCd))
					{
						// パラメータの工事範囲コードが工事スキップの場合、
						if("070".equals(kojiScopeCd))
						{
							// 工事案件ステータスの取得値に上書きする
							mansKojiakStatCd = (String)mapEKU0011A010.get(EKU0011A010CBSMsg1List.KOJIAK_STAT);
						}
					}
					//  IT1-2022-0000054 ADD END
					// ANK-4244-11-00 MOD START
//					if("200".compareTo(mansKojiakStatCd) > 0
//							&& !JKKBpCommon.isNull(kkshkaRsvdSnststdYmd) 
//						)
					if("200".compareTo(mansKojiakStatCd) > 0
							&& JKKBpCommon.isNull(kkshkaRsvdSnststdYmd) 
						)
					// ANK-4244-11-00 MOD END
					{
						// 機器出荷予定日算出基準年月日が設定されていない場合、未来日とする
						haisoRsvYmd = "20991231";
					}
				}
			}
		}
		else
		{
			// キーが存在しない場合（US管理以外のサービスの場合）
		}
		
		return haisoRsvYmd;
	}	
	
	/**
	 * EKU0011A010 工事案件一意照会
	 * 
	 * kojiakNo 工事案件番号
	 * @return
	 * @throws Throwable
	 */
	private Map<String, Object> getEKU0011A010(String kojiakNo) throws Throwable {

		// EKU0011A010 工事案件一意照会
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_KOJIAK_NO, kojiakNo);
		HashMap<String, Object> reqMap = mapper.setEKU0011A010(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		HashMap<String, Object> eKU0011A010 = mapper.getEKU0011A010(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());
		
		return eKU0011A010;
	}
	// 20140811 IT1-2014-0000289 マンション（イーサ・VDDSL）で工事予定取込前の場合、配送予定年月日に未来日を設定する END
}
