/********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************
 *＜プログラム内容＞
 *  システム名      ：eo顧客基幹システム
 *  モジュール名    ：JKKAdchgSvcKeiDelCC
 *  ソースファイル名：JKKAdchgSvcKeiDelCC.java
 *  作成者          ：FJ
 *  日付            ：2012年12月15日
 *＜機能概要＞
 *  サービス契約論理削除CC部品
 *＜修正履歴＞
 *  バージョン  修正日      修正者      修正内容
 *  v1.00.00    2012/12/15  FJ          新規作成
*	v8.00.00	2014/04/20	FJ）星野	OM-2014-0000041対応
 * v19.00.00	2015/11/12	FJ) 谷口	OM-2015-0002823対応
 ********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKAdchgConstCC;
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.EKK0081B024CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081E010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0101A010CBSMsg1List;

public class JKKAdchgSvcKeiDelCC extends AbstractCommonComponent {

	/** セッションハンドル保持域 */
	private static ThreadLocal<SessionHandle> keepSesHandle = new ThreadLocal<SessionHandle>()
	{
		// 保持域への設定はinitialValue()ではなくset()を使用する為、
		// initialValue()は実装しない
	};

	/**
	 * コンストラクタ.
	 * <br>
	 */
	public JKKAdchgSvcKeiDelCC() {
	}
	

	/**
	 * サービス契約を論理削除します。
	 * <br>
	 * @param   handle     セッションマネージャなどを持ったハンドル情報
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @throws  Throwable  例外が発生した場合
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	public IRequestParameterReadWrite updateRonriDel(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable {
// OM-2013-0004303対応 20131120 星野 ADD START
		try {
// OM-2013-0004303対応 20131120 星野 ADD END
			// セッションハンドルをローカル変数に保持
			keepSesHandle.set( handle );
	
			// 事前準備
			HashMap<String, String> condMap = new HashMap<String, String>();
			HashMap<String, Object> reqMap;
			Map<?, ?> resMap;
	
			// 住所情報変更初期表示情報取得コモンコンポーネント
			// マッピングクラスインスタンスを取得
			JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
	
			// SCリクエストInvokerを取得
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
			HashMap<String, Object> paramMap = (HashMap<String, Object>)( param.getData(fixedText) );
	
			// サービス契約番号
			String svcKeiNo = (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_SVC_KEI_NO);
	// OM-2013-0003604対応 20131025 星野 MOD START
			// 申込明細番号
			String mskmDtlNo = (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_MSKM_DTL_NO);
	// OM-2013-0003604対応 20131025 星野 MOD END
	
	// 住所変更キャンセル品質向上 2013/06/11 START
	//		// サービス契約一意照会
	//		HashMap<String, Object> kk0081_a010_map = selectSvcKeiBySvcKeiNo( param, fixedText, svcKeiNo, null);
	//		 
	//		// kk0081_a010_mapへ更新年月日時分秒(更新前)を設定
	//		kk0081_a010_map.put( JKKAdchgMapperCC.UPD_DT_SVC_KEI_UPD_DTM_BEF, (String) kk0081_a010_map.get(EKK0081A010CBSMsg1List.LAST_UPD_DTM) );
	//
	//		// kk0081_a010_mapへ更新年月日時分秒(更新前)を設定
	//		kk0081_a010_map.put( JKKAdchgMapperCC.UPD_DT_SVC_KEI_GENE_ADD_DTM, (String) kk0081_a010_map.get(EKK0081A010CBSMsg1List.GENE_ADD_DTM) );
	//
	//		// 論理削除
	//		HashMap<String, Object> kk0081_e010_map = svcKeiRonriDelUpdate( param, fixedText, kk0081_a010_map);
	//
	//		// 更新後の更新年月日時分秒をparamへ設定
	//		paramMap.put( JKKAdchgConstCC.PARAM_KEY_SVC_KEI_UPD_DTM_AFT, (String)kk0081_e010_map.get( EKK0081E010CBSMsg.UPD_DTM ) );
			
			
			/** 予約のデータを論理削除 */
	//		condMap.put( JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, svcKeiNo);
	//		condMap.put( JKKAdchgMapperCC.COND_KEY_RSV_APLY_YMD, JCCBPCommon.getOpeDate(null) );
	//		reqMap = mapper.setEKK0081B017( param, fixedText, condMap );
	//		resMap = scCall.run( reqMap, keepSesHandle.get() );
	//		ArrayList<HashMap<String, Object>> kk0081_b017_List = mapper.getEKK0081B017( param, fixedText, resMap );
	//		mapper.scResultCheck( param );
	//		
	//		for (HashMap<String, Object> kk0081_b017_map : kk0081_b017_List ) {
	//			
	//			String geneAddDtm = (String)kk0081_b017_map.get(EKK0081B017CBSMsg1List.GENE_ADD_DTM);
	//			
	//			// サービス契約一意照会
	//			HashMap<String, Object> kk0081_a010_map = selectSvcKeiBySvcKeiNo( param, fixedText, svcKeiNo, geneAddDtm);
	//			
	//			String idoDiv = (String)kk0081_a010_map.get(EKK0081A010CBSMsg1List.IDO_DIV);
	//			String svcKeiState = (String)kk0081_a010_map.get(EKK0081A010CBSMsg1List.SVC_KEI_STAT_NM);
	//			
	//			if ("00019".equals(idoDiv) && !"910".equals(svcKeiState)) {
	//				
	//				// kk0081_a010_mapへ更新年月日時分秒(更新前)を設定
	//				kk0081_a010_map.put( JKKAdchgMapperCC.UPD_DT_SVC_KEI_UPD_DTM_BEF, (String) kk0081_a010_map.get(EKK0081A010CBSMsg1List.LAST_UPD_DTM) );
	//
	//				// kk0081_a010_mapへ更新年月日時分秒(更新前)を設定
	//				kk0081_a010_map.put( JKKAdchgMapperCC.UPD_DT_SVC_KEI_GENE_ADD_DTM, (String) kk0081_a010_map.get(EKK0081A010CBSMsg1List.GENE_ADD_DTM) );
	//
	//				// 論理削除
	//				HashMap<String, Object> kk0081_e010_map = svcKeiRonriDelUpdate( param, fixedText, kk0081_a010_map);
	//
	//				// 更新後の更新年月日時分秒をparamへ設定
	//				paramMap.put( JKKAdchgConstCC.PARAM_KEY_SVC_KEI_UPD_DTM_AFT, (String)kk0081_e010_map.get( EKK0081E010CBSMsg.UPD_DTM ) );
	//
	//			}
	//			
	//		}
			
			String opeDate = JCCBPCommon.getOpeDate(null);
			
			// 2013/06/13の時点では未来で積まれるデータはMAX3件だが、余裕を見て5回ループさせる
			// また、無限ループはリスクが高いため不採用
			for (int i = 0 ; i < 5 ; i++) {
				
				// サービス契約一意照会を実行
				HashMap<String , Object>k081_a001_map = null;
				condMap.clear();
				condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, svcKeiNo);
				condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, "20991231");
				reqMap = mapper.setEKK0081A010( param, fixedText, condMap);
				resMap = scCall.run( reqMap, handle);
				k081_a001_map = mapper.getEKK0081A010( param, fixedText, resMap );
				mapper.scResultCheck( param );
				
				if (k081_a001_map.isEmpty()) {
					continue;
				}
				
				String rsvYmd = (String)k081_a001_map.get(EKK0081A010CBSMsg1List.RSV_APLY_YMD);
				String idoDiv = (String)k081_a001_map.get(EKK0081A010CBSMsg1List.IDO_DIV);
	// IT1-2013-0001554 2013.08.07 T.TORIKAI MOD START
	//			String svcKeiState = (String)k081_a001_map.get(EKK0081A010CBSMsg1List.SVC_KEI_STAT_NM);
				String svcKeiState = (String)k081_a001_map.get(EKK0081A010CBSMsg1List.SVC_KEI_STAT);
	// IT1-2013-0001554 2013.08.07 T.TORIKAI MOD END
				
				if (rsvYmd.compareTo(opeDate) <= 0) {
					// 予約適用年月日が運用日付以下なら終了
					break;
				}
				
				if ("00019".equals(idoDiv) && !"910".equals(svcKeiState)) {
					
					// kk0081_a010_mapへ更新年月日時分秒(更新前)を設定
					k081_a001_map.put( JKKAdchgMapperCC.UPD_DT_SVC_KEI_UPD_DTM_BEF, (String) k081_a001_map.get(EKK0081A010CBSMsg1List.LAST_UPD_DTM) );
	
					// kk0081_a010_mapへ更新年月日時分秒(更新前)を設定
					k081_a001_map.put( JKKAdchgMapperCC.UPD_DT_SVC_KEI_GENE_ADD_DTM, (String) k081_a001_map.get(EKK0081A010CBSMsg1List.GENE_ADD_DTM) );
	
					// 論理削除
					HashMap<String, Object> kk0081_e010_map = svcKeiRonriDelUpdate( param, fixedText, k081_a001_map);
	
					// 更新後の更新年月日時分秒をparamへ設定
					paramMap.put( JKKAdchgConstCC.PARAM_KEY_SVC_KEI_UPD_DTM_AFT, (String)kk0081_e010_map.get( EKK0081E010CBSMsg.UPD_DTM ) );
				}
				
			}
			
			
	// OM-2013-0003604対応 20131025 星野 MOD START
	// 論理削除ではなく、変更項目を戻し更新する方式に変更
	//		/** 運用日付ベースでの更新のキャンセル */
	//		/** 変更項目の戻し更新 */
	//		condMap.put( JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, svcKeiNo);
	//		reqMap = mapper.setEKK0081B024( param, fixedText, condMap );
	//		resMap = scCall.run( reqMap, keepSesHandle.get() );
	//		ArrayList<HashMap<String, Object>> kk0081_b024_List = mapper.getEKK0081B024( param, fixedText, resMap );
	//		mapper.scResultCheck( param );
	//		
	//		for (HashMap<String, Object> kk0081_b024_map : kk0081_b024_List ) {
	//			
	//			String geneAddDtm = (String)kk0081_b024_map.get(EKK0081B024CBSMsg1List.GENE_ADD_DTM);
	//			
	//			// サービス契約一意照会
	//			HashMap<String, Object> kk0081_a010_map = selectSvcKeiBySvcKeiNo( param, fixedText, svcKeiNo, geneAddDtm);
	//			
	//			String idoDiv = (String)kk0081_a010_map.get(EKK0081A010CBSMsg1List.IDO_DIV);
	//// IT1-2013-0001554 2013.08.07 T.TORIKAI MOD START
	////			String svcKeiState = (String)kk0081_a010_map.get(EKK0081A010CBSMsg1List.SVC_KEI_STAT_NM);
	//			String svcKeiState = (String)kk0081_a010_map.get(EKK0081A010CBSMsg1List.SVC_KEI_STAT);
	//// IT1-2013-0001554 2013.08.07 T.TORIKAI MOD END
	//			
	//			if ("00019".equals(idoDiv) && !"910".equals(svcKeiState)) {
	//				
	//				// kk0081_a010_mapへ更新年月日時分秒(更新前)を設定
	//				kk0081_a010_map.put( JKKAdchgMapperCC.UPD_DT_SVC_KEI_UPD_DTM_BEF, (String) kk0081_a010_map.get(EKK0081A010CBSMsg1List.LAST_UPD_DTM) );
	//
	//				// kk0081_a010_mapへ更新年月日時分秒(更新前)を設定
	//				kk0081_a010_map.put( JKKAdchgMapperCC.UPD_DT_SVC_KEI_GENE_ADD_DTM, (String) kk0081_a010_map.get(EKK0081A010CBSMsg1List.GENE_ADD_DTM) );
	//
	//				// 論理削除
	//				HashMap<String, Object> kk0081_e010_map = svcKeiRonriDelUpdate( param, fixedText, kk0081_a010_map);
	//
	//				// 更新後の更新年月日時分秒をparamへ設定
	//				paramMap.put( JKKAdchgConstCC.PARAM_KEY_SVC_KEI_UPD_DTM_AFT, (String)kk0081_e010_map.get( EKK0081E010CBSMsg.UPD_DTM ) );
	//
	//			}
	//		}
				
			/** 運用日付ベースでの更新のキャンセル */
			/** 変更項目の戻し更新 */
			// サービス契約一意照会を実行（運用日時点のカレント）
			HashMap<String, Object> kk0081_a010_map = selectSvcKeiBySvcKeiNo(param, fixedText, svcKeiNo, null);
			// サービス契約<サブタイプ>一意照会を実行（運用日時点のカレント）
			HashMap<String, Object> kk00x1_a010_map = selectSvcKeiSubType( param, fixedText, svcKeiNo, (String)kk0081_a010_map.get(EKK0081A010CBSMsg1List.GENE_ADD_DTM));
			
			// サービス契約ステータス
			String svcKeiState = (String)kk0081_a010_map.get(EKK0081A010CBSMsg1List.SVC_KEI_STAT);
			
			// カレントが解約済の場合は更新しない
			if(!"910".equals(svcKeiState)) {
				
				// サービス契約履歴一覧照会
				condMap.put( JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, svcKeiNo);
				reqMap = mapper.setEKK0081B024( param, fixedText, condMap );
				resMap = scCall.run( reqMap, keepSesHandle.get() );
				ArrayList<HashMap<String, Object>> kk0081_b024_List = mapper.getEKK0081B024( param, fixedText, resMap );
				mapper.scResultCheck( param );
				
				// 前世代保持用変数
				HashMap<String, Object> kk0081_b024_bfGene_map = null;
				// S-IFは世代降順で返却してくるので、逆ループして世代の若い方から探す
				for(int i=kk0081_b024_List.size()-1; i>=0; i--){
					HashMap<String, Object> kk0081_b024_map = kk0081_b024_List.get(i);
					
					// 異動区分と申込明細番号を元に、住所変更・登録で積んだ世代を確認
					if(!StringUtils.isEmpty(mskmDtlNo) 
						&& "00019".equals( kk0081_b024_map.get(EKK0081B024CBSMsg1List.IDO_DIV) )
						&& mskmDtlNo.equals( kk0081_b024_map.get(EKK0081B024CBSMsg1List.MSKM_DTL_NO) )
					){
						// 住所変更世代
						HashMap<String, Object> kk0081_b024_map_jh = kk0081_b024_map;
						// 住所変更・登録で積んだ世代の前世代が住所変更前レコード
						HashMap<String, Object> kk0081_b024_map_jhbf = kk0081_b024_bfGene_map;
						
						String jhGeneAddDtm = (String)kk0081_b024_map_jh.get(EKK0081B024CBSMsg1List.GENE_ADD_DTM);
						String jhbfGeneAddDtm = (String)kk0081_b024_map_jhbf.get(EKK0081B024CBSMsg1List.GENE_ADD_DTM);
						
						/** カレントのマップに差分を反映 */
						editKkx1MapDiffRollback(param, fixedText, kk0081_a010_map, kk00x1_a010_map, jhbfGeneAddDtm, jhGeneAddDtm );
					}
					
					// 前世代用変数に保持して次の世代へ
					kk0081_b024_bfGene_map = kk0081_b024_map;
				}
				
				
				// 最後に異動区分と申込明細番号をセット
				kk0081_a010_map.put(EKK0081A010CBSMsg1List.IDO_DIV, "00019");
				kk0081_a010_map.put(EKK0081A010CBSMsg1List.MSKM_DTL_NO, mskmDtlNo);
				/** 差分反映後のカレントマップを元に、サービス契約情報変更（住所変更） */
				svcKeiInfChgUpdate(param, fixedText, kk0081_a010_map, kk00x1_a010_map);
				
			}
	// OM-2013-0003604対応 20131025 星野 MOD END
	// 住所変更キャンセル品質向上 2013/06/11 END
			
			
			return param;
// OM-2013-0004303対応 20131120 星野 ADD START
		} finally {

			// ・セッションハンドル保持域
			if(keepSesHandle.get() != null){
				keepSesHandle.remove();
			}
		}

// OM-2013-0004303対応 20131120 星野 ADD END
	}


	/**
	 * サービス契約の論理削除メソッド
	 * @param param モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param fixedText ユーザ任意文字列
	 * @param kk0081_a010_map サービス契約一意照会の結果map
	 * @return
	 * @throws Exception
	 */
	private HashMap<String, Object> svcKeiRonriDelUpdate(IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> kk0081_a010_map) throws Exception
	{
		// 住所情報変更初期表示情報取得コモンコンポーネント
		// マッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
		
		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// ・EKK0081E010  サービス契約論理削除
		HashMap<String, Object> reqMap = mapper.setEKK0081E010( param, fixedText, kk0081_a010_map );
		Map<?, ?> resMap = scCall.run( reqMap, keepSesHandle.get() );
		HashMap<String, Object> kk0081_e010_map = mapper.getEKK0081E010( param, fixedText, resMap );
		mapper.scResultCheck( param );

		return kk0081_e010_map;
	}

	
	/**
	 * サービス契約一意照会を実行します。
	 * @param param モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param fixedText ユーザ任意文字列
	 * @param svcKeiNo サービス契約番号
	 * @return サービス契約一意照会の結果map
	 * @throws Exception
	 */
	 private HashMap<String, Object> selectSvcKeiBySvcKeiNo(IRequestParameterReadWrite param, String fixedText, String svcKeiNo ,String geneAddDtm) throws Exception
	{
		if (StringUtils.isEmpty(svcKeiNo)) {
			return null;
		}
		
		HashMap<String, String> condMap = new HashMap<String, String>();
		HashMap<String, Object> reqMap;
		Map<?, ?> resMap;

		// 住所情報変更初期表示情報取得コモンコンポーネント
		// マッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();

		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		condMap.put( JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, svcKeiNo);
// OM-2013-0003604対応 20131025 星野 ADD START
		// 世代登録年月日時分秒が設定有の場合は世代指定
		if(!StringUtils.isEmpty(geneAddDtm)){
// OM-2013-0003604対応 20131025 星野 ADD END
			condMap.put( JKKAdchgMapperCC.COND_KEY_GENE_ADD_DTM, geneAddDtm);
			reqMap = mapper.setEKK0081A010_2( param, fixedText, condMap );
		
// OM-2013-0003604対応 20131025 星野 ADD START
		// 世代登録指定なしの場合は運用日時点のカレント
		}else{
			condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, JCCBPCommon.getOpeDate(null));
			reqMap = mapper.setEKK0081A010( param, fixedText, condMap);
		}
// OM-2013-0003604対応 20131025 星野 ADD END
		resMap = scCall.run( reqMap, keepSesHandle.get() );
		HashMap<String, Object> kk0081_a010_map = mapper.getEKK0081A010( param, fixedText, resMap );
		mapper.scResultCheck( param );
		
		return kk0081_a010_map;
	}
	
// OM-2013-0003604対応 20131025 星野 ADD START
	/**
	 * 変更前後の世代の差分を判定し、カレントのマップに戻し編集を行います。
	 * @throws Exception 
	 */
	private void editKkx1MapDiffRollback(
		IRequestParameterReadWrite param, 
		String fixedText, 
		HashMap<String, Object> kk0081_a010_map, 
		HashMap<String, Object> kk00x1_a010_map, 
		String jhbfGeneAddDtm, 
		String jhGeneAddDtm
	) throws Exception {
		
		if( kk0081_a010_map==null 
			|| kk00x1_a010_map==null
			|| StringUtils.isEmpty(jhbfGeneAddDtm)
			|| StringUtils.isEmpty(jhGeneAddDtm)
		){
			return;
		}
		
		String svcKeiNo = (String)kk0081_a010_map.get(EKK0081A010CBSMsg1List.SVC_KEI_NO);
		if(StringUtils.isEmpty(svcKeiNo)){
			return;
		}
		
		// 変更前世代一意照会
		HashMap<String, Object> kk0081_a010_map_modbf = selectSvcKeiBySvcKeiNo( param, fixedText, svcKeiNo, jhbfGeneAddDtm);
		HashMap<String, Object> kk00x1_a010_map_modbf = selectSvcKeiSubType( param, fixedText, svcKeiNo, jhbfGeneAddDtm);
		// 変更後世代一意照会
		HashMap<String, Object> kk0081_a010_map_mod = selectSvcKeiBySvcKeiNo( param, fixedText, svcKeiNo, jhGeneAddDtm);
		HashMap<String, Object> kk00x1_a010_map_mod = selectSvcKeiSubType( param, fixedText, svcKeiNo, jhGeneAddDtm);
		
		/** 差分戻し */
		// 整理番号
		editMapDiffRollback(EKK0081A010CBSMsg1List.SEIRI_NO, kk0081_a010_map, kk0081_a010_map_modbf, kk0081_a010_map_mod);
		// 審査結果送信コード
		// OM-2015-0002823 20151112 MOD START
		// "1"固定を設定する
//		editMapDiffRollback(EKK0081A010CBSMsg1List.SKEKKA_SEND_CD, kk0081_a010_map, kk0081_a010_map_modbf, kk0081_a010_map_mod);
		kk0081_a010_map.put(EKK0081A010CBSMsg1List.SKEKKA_SEND_CD, "1");
		// OM-2015-0002823 20151112 MOD END
		
		// 違約金発生コード
		editMapDiffRollback(EKK0081A010CBSMsg1List.PNLTY_HASSEI_CD, kk0081_a010_map, kk0081_a010_map_modbf, kk0081_a010_map_mod);
		
		// サービスコードによる判定
		String svc_cd = (String) kk0081_a010_map.get(EKK0081A010CBSMsg1List.SVC_CD);
		// ネットの場合
		if(JKKAdchgConstCC.CD00130_INET_SVC.equals(svc_cd)){
			// ネット固有の項目はなし
			
		// 電話の場合
		}else if( JKKAdchgConstCC.CD00130_TEL_SVC.equals(svc_cd) ){
			// 電話固有の項目はなし
			
		// テレビの場合
		}else if( JKKAdchgConstCC.CD00130_TV_SVC.equals(svc_cd) ){
			// 提供方式契約番号
// OM-2014-0000041対応 20140420 星野 MOD START
//			editMapDiffRollback(EKK0081A010CBSMsg1List.SEIRI_NO, kk0081_a010_map, kk0081_a010_map_modbf, kk0081_a010_map_mod);
			editMapDiffRollback(EKK0081A010CBSMsg1List.TK_HOSHIKI_KEI_NO, kk0081_a010_map, kk0081_a010_map_modbf, kk0081_a010_map_mod);
// OM-2014-0000041対応 20140420 星野 MOD END
			// 電波障害案件番号
			editMapDiffRollback(EKK0101A010CBSMsg1List.DMPS_ANKEN_NO, kk00x1_a010_map, kk00x1_a010_map_modbf, kk00x1_a010_map_mod);
			// 再送信種別コード
			editMapDiffRollback(EKK0101A010CBSMsg1List.RE_SEND_TK_SVC_SBT_CD, kk00x1_a010_map, kk00x1_a010_map_modbf, kk00x1_a010_map_mod);
			
		}
	}


	private void editMapDiffRollback(
		String key, 
		HashMap<String, Object> currentMap, 
		HashMap<String, Object> bfMap,
		HashMap<String, Object> afMap
	) {
		if( currentMap==null
			|| bfMap==null
			|| afMap==null
		){
			return;
		}
		
		String bfVal = (String)bfMap.get(key);
		String afVal = (String)afMap.get(key);
		
		if(bfVal!=null && !bfVal.equals(afVal)){
			currentMap.put(key, bfVal);
		}
	}
	 
	/**
	 * サービス契約<サブタイプ>一意照会を実行します。
	 * @param param モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param fixedText ユーザ任意文字列
	 * @param svcKeiNo サービス契約番号
	 * @return サービス契約一意照会の結果map
	 * @throws Exception
	 */
	 private HashMap<String, Object> selectSvcKeiSubType(IRequestParameterReadWrite param, String fixedText, String svcKeiNo ,String geneAddDtm) throws Exception
	{
		HashMap<String, Object> kk00x1_a010_map = null; 
		
		
		if (StringUtils.isEmpty(svcKeiNo)) {
			return null;
		}
		
		HashMap<String, String> condMap = new HashMap<String, String>();
		HashMap<String, Object> reqMap;
		Map<?, ?> resMap;

		// 住所情報変更初期表示情報取得コモンコンポーネント
		// マッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();

		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// サービス契約一意照会
		HashMap<String, Object> kk0081_a010_map = selectSvcKeiBySvcKeiNo(param, fixedText, svcKeiNo, geneAddDtm);
		
		if(kk0081_a010_map==null){
			return null;
		}
		
		String kk0081GeneAddDtm = (String)kk0081_a010_map.get(EKK0081A010CBSMsg1List.GENE_ADD_DTM);
		
		if(StringUtils.isEmpty(kk0081GeneAddDtm)){
			return null;
		}
		
		// サービスコードによる判定
		String svc_cd = (String) kk0081_a010_map.get(EKK0081A010CBSMsg1List.SVC_CD);
		// ネットの場合
		if(JKKAdchgConstCC.CD00130_INET_SVC.equals(svc_cd)){
			
			// ・EKK0091A010  サービス契約＜eo光ネット＞一意照会
			condMap = new HashMap<String, String>();
			condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, svcKeiNo);
			condMap.put( JKKAdchgMapperCC.COND_KEY_GENE_ADD_DTM, kk0081GeneAddDtm);
			reqMap = mapper.setEKK0091A010Gene(param, fixedText, condMap);
			resMap = scCall.run(reqMap, keepSesHandle.get());
			kk00x1_a010_map = mapper.getEKK0091A010(param, fixedText, resMap);
			mapper.scResultCheck(param);
			
		// 電話の場合
		}else if( JKKAdchgConstCC.CD00130_TEL_SVC.equals(svc_cd) ){
			
			// ・EKK0111A010  サービス契約＜eo光電話＞一意照会
			condMap = new HashMap<String, String>();
			condMap.put( JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, svcKeiNo );
			condMap.put( JKKAdchgMapperCC.COND_KEY_GENE_ADD_DTM, kk0081GeneAddDtm);
			reqMap = mapper.setEKK0111A010Gene( param, fixedText, condMap );
			resMap = scCall.run( reqMap, keepSesHandle.get() );
			kk00x1_a010_map = mapper.getEKK0111A010( param, fixedText, resMap );
			mapper.scResultCheck( param );

		// テレビの場合
		}else if( JKKAdchgConstCC.CD00130_TV_SVC.equals(svc_cd) ){
			
			// ・EKK0101A010  サービス契約＜eo光ＴＶ＞一意照会
			condMap = new HashMap<String, String>();
			condMap.put( JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, svcKeiNo );
			condMap.put( JKKAdchgMapperCC.COND_KEY_GENE_ADD_DTM, kk0081GeneAddDtm);
			reqMap = mapper.setEKK0101A010Gene( param, fixedText, condMap );
			resMap = scCall.run( reqMap, keepSesHandle.get() );
			kk00x1_a010_map = mapper.getEKK0101A010( param, fixedText, resMap );
			mapper.scResultCheck( param );
			
		}

		return kk00x1_a010_map;
	}

	private HashMap<String, Object> svcKeiInfChgUpdate(
		IRequestParameterReadWrite param, 
		String fixedText, 
		HashMap<String, Object> kk0081_a010_map,
		HashMap<String, Object> kk00x1_a010_map
	) throws Exception{
		
		HashMap<String, Object> retMap = null;
		
		HashMap<String, String> condMap = new HashMap<String, String>();
		HashMap<String, Object> reqMap;
		Map<?, ?> resMap;
		
		// 住所情報変更初期表示情報取得コモンコンポーネント
		// マッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
		
		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		if(kk0081_a010_map == null || kk00x1_a010_map==null){
			return null;
		}
		
		// サービスコードによる判定
		String svc_cd = (String) kk0081_a010_map.get(EKK0081A010CBSMsg1List.SVC_CD);
		// ネットの場合
		if(JKKAdchgConstCC.CD00130_INET_SVC.equals(svc_cd)){
			
			// ・EKK0091C041  サービス契約＜eo光ネット＞情報変更
			reqMap = mapper.setEKK0091C041(param, fixedText, kk0081_a010_map, kk00x1_a010_map);
			resMap = scCall.run(reqMap, keepSesHandle.get());
			retMap = mapper.getEKK0091C041(param, fixedText, resMap);
			mapper.scResultCheck(param);
			
			
		// 電話の場合
		}else if( JKKAdchgConstCC.CD00130_TEL_SVC.equals(svc_cd) ){
			
			// ・EKK0111C041  サービス契約＜eo光電話＞情報変更
			reqMap = mapper.setEKK0111C041( param, fixedText, kk0081_a010_map, kk00x1_a010_map );
			resMap = scCall.run( reqMap, keepSesHandle.get() );
			retMap = mapper.getEKK0111C041( param, fixedText, resMap );
			mapper.scResultCheck( param );
			
		// テレビの場合
		}else if( JKKAdchgConstCC.CD00130_TV_SVC.equals(svc_cd) ){
			
			// ・EKK0101C041  サービス契約＜eo光ＴＶ＞情報変更
			reqMap = mapper.setEKK0101C041( param, fixedText, kk0081_a010_map, kk00x1_a010_map );
			resMap = scCall.run( reqMap, keepSesHandle.get() );
			retMap = mapper.getEKK0101C041( param, fixedText, resMap );
			mapper.scResultCheck( param );
		}
		
		return retMap;
	}
// OM-2013-0003604対応 20131025 星野 ADD END


}