/********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************
 *＜プログラム内容＞
 *  システム名      ：eo顧客基幹システム
 *  モジュール名    ：工事案件機器取得コンポーネント部品クラス
 *  ソースファイル名：JKKAdchgSelectKojiKikiCC.java
 *  作成者          ：FJ
 *  日付            ：2013年1月12日
 *＜機能概要＞
 *＜修正履歴＞
 *  バージョン  修正日      修正者      修正内容
 *  v1.00.00    2013/1/12  FJ          新規作成
 *  v61.00.00	2023/06/14  FJ)新井	   【ANK-4315-00-00】【eo定期】 eoホームゲートウェイ導入対応
 *
 ********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKAdchgConstCC;
import com.fujitsu.futurity.bp.custom.constant.JKKKojiAnkenConstCC;
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.EKK0341A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B504CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1681B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1681B001CBSMsg1List;

/**
 * 工事案件機器取得コンポーネント部品クラス.
 * <br>
 * @author FJ
 */
public class JKKAdchgSelectKojiKikiCC extends AbstractCommonComponent {

	/** セッションハンドル保持域 */
	private static ThreadLocal<SessionHandle> keepSesHandle = new ThreadLocal<SessionHandle>()
	{
		// 保持域への設定はinitialValue()ではなくset()を使用する為、
		// initialValue()は実装しない
	};

	/**
	 * コンストラクタ.
	 * <br>
	 */
	public JKKAdchgSelectKojiKikiCC() {
	}
	

	/**
	 * 転居元・先の機器情報取得処理
	 * <dd>転居および転居先の機器情報を取得し工事案件へKEY項目を設定します。
	 * <br>
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   keepSesHandle  	セッションハンドル
	 * @param   fixedText  ユーザ任意文字列
	 * @throws  Exception  例外が発生した場合
	 */
	public IRequestParameterReadWrite getSvcData(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception{
		
		/** 事前準備 */
		try {
	
			/** 事前準備 */
			HashMap<String, Object> paramMap = (HashMap<String, Object>)param.getData(fixedText);
	
			/** リソース保持 */
			// セッションハンドルをローカル変数に保持
			keepSesHandle.set(handle);
	
			// 住所変更登録コモンコンポーネントマッピングクラスインスタンス
			JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
			// SCリクエストInvoker
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
	
			ArrayList<HashMap<String,Object>> new_net_kktk_list = new ArrayList<HashMap<String,Object>>();
			ArrayList<HashMap<String,Object>> new_tl_kktk_list = new ArrayList<HashMap<String,Object>>();
			ArrayList<HashMap<String,Object>> new_netTl_kktk_list = new ArrayList<HashMap<String,Object>>();
			ArrayList<HashMap<String,Object>> new_tv_kktk_list = new ArrayList<HashMap<String,Object>>();
			ArrayList<HashMap<String,Object>> old_net_kktk_list = new ArrayList<HashMap<String,Object>>();
			ArrayList<HashMap<String,Object>> old_tl_kktk_list = new ArrayList<HashMap<String,Object>>();
			ArrayList<HashMap<String,Object>> old_tv_kktk_list = new ArrayList<HashMap<String,Object>>();
			HashMap<String, String> condMap = new HashMap<String, String>();
			HashMap<String, Object> requestMap;
			Map<?, ?> resMap;
	
			ArrayList<HashMap<String, Object>> adchgDtlListkiki = (ArrayList<HashMap<String, Object>>)paramMap.get(JKKAdchgConstCC.PARAM_KEY_ADCHG_DTL_LIST_KKTK_SVC_KEI);
			for(int i = 0; i < adchgDtlListkiki.size() ; i++ )
			{
				HashMap<String, Object> adchgDtlMapSvcKei = adchgDtlListkiki.get(i);
				
				if (adchgDtlMapSvcKei == null) {
					continue;
				}
	
				String paramKeyAdchgDtlChgTgKeiNo = null;
				paramKeyAdchgDtlChgTgKeiNo = (String) adchgDtlMapSvcKei.get(JKKAdchgConstCC.PARAM_KEY_ADCHG_DTL_CHG_TG_KEI_NO);
				if (StringUtils.isEmpty(paramKeyAdchgDtlChgTgKeiNo)) {
					continue;
				}
	
				// 転居先の機器情報を取得
				condMap.put(JKKAdchgMapperCC.COND_KEY_KKTK_SVC_KEI_NO, paramKeyAdchgDtlChgTgKeiNo);
				condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE,(String) JKKAdchgConstCC.DEFAULT_RSV_APLY_YMD);
				requestMap = mapper.setEKK0341B032( param, fixedText, condMap );
				resMap = scCall.run( requestMap, handle );
				List<HashMap<String, Object>> kk0341_b032_map_af = mapper.getEKK0341B032( param, fixedText, resMap );
				mapper.scResultCheck( param );
				
				HashMap<String, Object> kk0341_a010_map_af = new HashMap<String, Object>();
				if (kk0341_b032_map_af.size() > 0) {
					kk0341_a010_map_af = kk0341_b032_map_af.get(0);
				}
				
				// 転居元の機器情報を取得
				condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE,(String) JCCBPCommon.getOpeDate(null));
				requestMap = mapper.setEKK0341A010( param, fixedText, condMap );
				resMap = scCall.run( requestMap, handle );
				HashMap<String, Object> kk0341_a010_map_bf = mapper.getEKK0341A010( param, fixedText, resMap );
				mapper.scResultCheck( param );
	
				// 機器情報格納用マップ生成
				HashMap<String, Object> kj_kktk_map = new HashMap<String, Object>();
				
				// 機器情報格納用マップ生成(撤去用)
				HashMap<String, Object> kj_kktk_map_old = new HashMap<String, Object>();
	
				// 転居先のSTBの料金コースコードを取得する
				// 宅内機器種別コード
				if(JKKAdchgConstCC.TAKNKIKI_SBT.CODE_A0.equals(kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD))
				) {
	
					HashMap<String, Object> resAdchgMap = selectIdoRsvBySvcKeiUcwkNo(param, fixedText, (String) kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.SVC_KEI_UCWK_NO));
	
					if (resAdchgMap != null && !resAdchgMap.isEmpty()) {
						kj_kktk_map.put(EKK1681B001CBSMsg1List.NEW_PCRS_CD, resAdchgMap.get(EKK1681B001CBSMsg1List.NEW_PCRS_CD));
					}
				}
				String bf_add = (String)kk0341_a010_map_bf.get(EKK0341A010CBSMsg1List.GENE_ADD_DTM);
	
				// 変更後機器情報の情報を設定 */
				// 機器提供サービス契約番号＿変更後
				kj_kktk_map.put(JKKKojiAnkenConstCC.KKTK_SVC_KEI_NO, kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
				// 世代登録年月日時分秒＿変更後
				kj_kktk_map.put(JKKKojiAnkenConstCC.KKTK_SVC_KEI_NO_GENE_ADD_DTM, kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.GENE_ADD_DTM));
				String af_add = (String)kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.GENE_ADD_DTM);
				
				// 撤去用の情報を格納
				kj_kktk_map_old.put(JKKKojiAnkenConstCC.KKTK_SVC_KEI_NO, kk0341_a010_map_bf.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
				kj_kktk_map_old.put(JKKKojiAnkenConstCC.KKTK_SVC_KEI_NO_GENE_ADD_DTM, kk0341_a010_map_bf.get(EKK0341A010CBSMsg1List.GENE_ADD_DTM));
				
				// 機器変更番号
				String bf_kkchg_no = (String)kk0341_a010_map_bf.get(EKK0341A010CBSMsg1List.KIKI_CHG_NO);
				String af_kkchg_no = (String)kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.KIKI_CHG_NO);
				
				/** 移動コードを判定 */
				String idoDiv = null;
				if (bf_kkchg_no.equals(af_kkchg_no) ){
					if( !bf_add.equals(af_add)) {
						idoDiv = "04"; // 移動
						// ONU/V-ONUは移動コード設定無し
						if (JKKAdchgConstCC.TAKNKIKI_SBT.CODE_D0.equals(kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD))
								|| JKKAdchgConstCC.TAKNKIKI_SBT.CODE_E0.equals(kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD))) {
							// 何もしない
						} else {
							kj_kktk_map.put("param_taknkiki_ido_cd", idoDiv);
							kj_kktk_map_old.put("param_taknkiki_ido_cd", idoDiv);
						}
						
					}else{
						idoDiv = "01"; // 撤去
					}
				}else{
					idoDiv = "02"; // 交換
					
				}
				
				
				// サービスコードに紐づくサービス契約番号を取得
				String svcKeiNet = (String) paramMap.get("eoh_nt_svc_kei_no");
				String svcKeitel = (String) paramMap.get("eoh_tl_svc_kei_no");
				String svcKeitv = (String) paramMap.get("eoh_tv_svc_kei_no");
				String svcKeiNetOld = (String) paramMap.get("eoh_nt_svc_kei_no_old");
				String svcKeitelOld = (String) paramMap.get("eoh_tl_svc_kei_no_old");
				String svcKeitvOld = (String) paramMap.get("eoh_tv_svc_kei_no_old");
				
				// D0、E0、HGWを判定
				if (StringUtils.isEmpty((String) kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.SVC_KEI_NO))) 
				{
					// D0またはHGWの場合、ネット・電話にリストを設定
					// ANK-4315-00-00 MOD START
					//if (JKKAdchgConstCC.TAKNKIKI_SBT.CODE_D0.equals(kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD)))
					if (JKKAdchgConstCC.TAKNKIKI_SBT.CODE_D0.equals(kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD))
							|| JKKAdchgConstCC.TAKNKIKI_SBT.CODE_S0.equals(kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD)))
					// ANK-4315-00-00 MOD END
					{
						if (adchgDtlMapSvcKei.containsKey("add_flg")) {
							new_net_kktk_list.add(kj_kktk_map);
							new_tl_kktk_list.add(kj_kktk_map);
							// ネット電話工事の諸変更用
							new_netTl_kktk_list.add(kj_kktk_map);
						} else if ("04".equals(idoDiv)) {
							new_net_kktk_list.add(kj_kktk_map);
							new_tl_kktk_list.add(kj_kktk_map);
							// ネット電話工事の諸変更用
							new_netTl_kktk_list.add(kj_kktk_map);
							old_net_kktk_list.add(kj_kktk_map_old);
							old_tl_kktk_list.add(kj_kktk_map_old);
						} else if ("01".equals(idoDiv)) {
							old_net_kktk_list.add(kj_kktk_map_old);
							old_tl_kktk_list.add(kj_kktk_map_old);
						} else {
							new_net_kktk_list.add(kj_kktk_map);
							new_tl_kktk_list.add(kj_kktk_map);
							// ネット電話工事の諸変更用
							new_netTl_kktk_list.add(kj_kktk_map);
							old_net_kktk_list.add(kj_kktk_map_old);
							old_tl_kktk_list.add(kj_kktk_map_old);
						}
						
					} 
					// E0の場合、テレビにリストを設定
					else if (JKKAdchgConstCC.TAKNKIKI_SBT.CODE_E0.equals(kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD))) 
					
					{
						if (adchgDtlMapSvcKei.containsKey("add_flg")) {
							new_tv_kktk_list.add(kj_kktk_map);
						} else if ("04".equals(idoDiv)) {
							new_tv_kktk_list.add(kj_kktk_map);
							old_tv_kktk_list.add(kj_kktk_map_old);
						} else if ("01".equals(idoDiv)) {
							old_tv_kktk_list.add(kj_kktk_map_old);
						} else {
							new_tv_kktk_list.add(kj_kktk_map);
							old_tv_kktk_list.add(kj_kktk_map_old);
						}
						
					}
					// R0またはS0の場合、ネット・電話にリストを設定
					// R0：多機能ルータまたはS0：HGWは利用中機器一覧にある場合（転居元で使用）のみここで処理される
					// 転居先に新規に登録された場合の処理は後続で別処理に実装
					// ANK-4315-00-00 MOD START
					//else if (JKKAdchgConstCC.TAKNKIKI_SBT.CODE_R0.equals(kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD)))
					else if (JKKAdchgConstCC.TAKNKIKI_SBT.CODE_R0.equals(kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD))
							  || JKKAdchgConstCC.TAKNKIKI_SBT.CODE_S0.equals(kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD)))
					// ANK-4315-00-00 MOD END
					{
						if ("01".equals(idoDiv)) {
							// 撤去  ※ネット・電話 両方の撤去に追加
							old_net_kktk_list.add(kj_kktk_map_old);
							old_tl_kktk_list.add(kj_kktk_map_old);
						} else {
							// 02：交換 or 04：移動（引継）※ネット・電話 両方の新設・撤去に追加
							new_net_kktk_list.add(kj_kktk_map);
							new_tl_kktk_list.add(kj_kktk_map);
							// ネット電話工事の諸変更用
							new_netTl_kktk_list.add(kj_kktk_map);
							old_net_kktk_list.add(kj_kktk_map_old);
							old_tl_kktk_list.add(kj_kktk_map_old);
						}
					}
					continue;
				}
				
				// サービス契約番号と突合せを行いリスト設定先を特定
				if (svcKeiNet.equals(kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.SVC_KEI_NO))
					|| ( !StringUtils.isEmpty(svcKeiNetOld) && svcKeiNetOld.equals( kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.SVC_KEI_NO) ) )
				){
					if ("04".equals(idoDiv)) {
						new_net_kktk_list.add(kj_kktk_map);
						// ネット電話工事の諸変更用
						new_netTl_kktk_list.add(kj_kktk_map);
						old_net_kktk_list.add(kj_kktk_map_old);
					} else if ("01".equals(idoDiv)) {
						old_net_kktk_list.add(kj_kktk_map_old);
					} else {
						new_net_kktk_list.add(kj_kktk_map);
						// ネット電話工事の諸変更用
						new_netTl_kktk_list.add(kj_kktk_map);
						old_net_kktk_list.add(kj_kktk_map_old);
					}
					
				}
				else if(svcKeitel.equals(kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.SVC_KEI_NO))
					|| ( !StringUtils.isEmpty(svcKeitelOld) && svcKeitelOld.equals( kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.SVC_KEI_NO) ) )
				){
					if ("04".equals(idoDiv)) {
						new_tl_kktk_list.add(kj_kktk_map);
						// ネット電話工事の諸変更用
						new_netTl_kktk_list.add(kj_kktk_map);
						old_tl_kktk_list.add(kj_kktk_map_old);
					} else if ("01".equals(idoDiv)) {
						old_tl_kktk_list.add(kj_kktk_map_old);
					} else {
						new_tl_kktk_list.add(kj_kktk_map);
						// ネット電話工事の諸変更用
						new_netTl_kktk_list.add(kj_kktk_map);
						old_tl_kktk_list.add(kj_kktk_map_old);
					}
					
				}
				else if(svcKeitv.equals(kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.SVC_KEI_NO))
					|| ( !StringUtils.isEmpty(svcKeitvOld) && svcKeitvOld.equals( kk0341_a010_map_af.get(EKK0341A010CBSMsg1List.SVC_KEI_NO) ) )
				){
					if ("04".equals(idoDiv)) {
						new_tv_kktk_list.add(kj_kktk_map);
						old_tv_kktk_list.add(kj_kktk_map_old);
					} else if ("01".equals(idoDiv)) {
						old_tv_kktk_list.add(kj_kktk_map_old);
					} else {
						new_tv_kktk_list.add(kj_kktk_map);
						old_tv_kktk_list.add(kj_kktk_map_old);
					}
					
				}
			}
			
			/** 追加機器の設定 */
			String svcKeiNet = (String) paramMap.get("eoh_nt_svc_kei_no");
			String svcKeitel = (String) paramMap.get("eoh_tl_svc_kei_no");
			String svcKeitv = (String) paramMap.get("eoh_tv_svc_kei_no");
			String kaisen_ucwk = (String) paramMap.get("new_kei_kais_ucwk_no");
			boolean newflg = true;
			
			//ネット編
			if (!StringUtils.isEmpty(svcKeiNet)) {
				
				// ・EKK0341B002 機器提供サービス契約一覧照会（サービス契約番号）
				condMap.clear();
				condMap.put("cond_key_svc_kei_no", svcKeiNet);
				requestMap = mapper.setEKK0341B002( param, fixedText, condMap);
				resMap = scCall.run( requestMap, handle);
				List<HashMap<String, Object>>kk0341_b002_map_list_net = mapper.getEKK0341B002( param, fixedText, resMap );
				mapper.scResultCheck( param );
				
				Iterator<HashMap<String, Object>> kk0341_b002_map_list_net_ite = kk0341_b002_map_list_net.iterator();
				while(kk0341_b002_map_list_net_ite.hasNext()) {
					
					newflg = true;	// 	フラグリセット
					// 機器情報格納用マップ生成
					HashMap<String, Object> kj_kktk_map = new HashMap<String, Object>();
					HashMap<String, Object> kikiteikyo_map = kk0341_b002_map_list_net_ite.next();
					String kikiteikyoNo = (String)kikiteikyo_map.get(EKK0341B002CBSMsg1List.KKTK_SVC_KEI_NO);
					
					// 機器提供サービス契約一意紹介
					condMap.clear();
					condMap.put(JKKAdchgMapperCC.COND_KEY_KKTK_SVC_KEI_NO, kikiteikyoNo);
					condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, JKKAdchgConstCC.DEFAULT_RSV_APLY_YMD);
					requestMap = mapper.setEKK0341A010(param, fixedText, condMap);
					resMap = scCall.run(requestMap, handle);
					HashMap<String, Object> kk0341_a010_map = mapper.getEKK0341A010(param, fixedText, resMap);
					mapper.scResultCheck(param);
					
					for(int i = 0; i < adchgDtlListkiki.size() ; i++ ) {
						
						HashMap<String, Object> adchgDtlMapSvcKei = adchgDtlListkiki.get(i);
						 String paramKktkKeiNo = (String) adchgDtlMapSvcKei.get(JKKAdchgConstCC.PARAM_KEY_ADCHG_DTL_CHG_TG_KEI_NO);
						if (paramKktkKeiNo.equals(kikiteikyoNo)) {
							newflg = false;
						}
					}
					
					// リストにヒットしなかった場合は新規機器
					if (newflg) {
						// 機器提供サービス契約番号＿変更後
						kj_kktk_map.put(JKKKojiAnkenConstCC.KKTK_SVC_KEI_NO, kk0341_a010_map.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
						// 世代登録年月日時分秒＿変更後
						kj_kktk_map.put(JKKKojiAnkenConstCC.KKTK_SVC_KEI_NO_GENE_ADD_DTM, kk0341_a010_map.get(EKK0341A010CBSMsg1List.GENE_ADD_DTM));
						new_net_kktk_list.add(kj_kktk_map);
						// ネット電話工事の諸変更用
						new_netTl_kktk_list.add(kj_kktk_map);
					}
				}
			}
			
			// 電話編
			if (!StringUtils.isEmpty(svcKeitel)) {
				
				// ・EKK0341B002 機器提供サービス契約一覧照会（サービス契約番号）
				condMap.clear();
				condMap.put("cond_key_svc_kei_no", svcKeitel);
				requestMap = mapper.setEKK0341B002( param, fixedText, condMap);
				resMap = scCall.run( requestMap, handle);
				List<HashMap<String, Object>>kk0341_b002_map_list_net = mapper.getEKK0341B002( param, fixedText, resMap );
				mapper.scResultCheck( param );
				
				Iterator<HashMap<String, Object>> kk0341_b002_map_list_net_ite = kk0341_b002_map_list_net.iterator();
				while(kk0341_b002_map_list_net_ite.hasNext()) {
					
					newflg = true;	// 	フラグリセット
					// 機器情報格納用マップ生成
					HashMap<String, Object> kj_kktk_map = new HashMap<String, Object>();
					HashMap<String, Object> kikiteikyo_map = kk0341_b002_map_list_net_ite.next();
					String kikiteikyoNo = (String)kikiteikyo_map.get(EKK0341B002CBSMsg1List.KKTK_SVC_KEI_NO);
					
					// 機器提供サービス契約一意紹介
					condMap.clear();
					condMap.put(JKKAdchgMapperCC.COND_KEY_KKTK_SVC_KEI_NO, kikiteikyoNo);
					condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, JKKAdchgConstCC.DEFAULT_RSV_APLY_YMD);
					requestMap = mapper.setEKK0341A010(param, fixedText, condMap);
					resMap = scCall.run(requestMap, handle);
					HashMap<String, Object> kk0341_a010_map = mapper.getEKK0341A010(param, fixedText, resMap);
					mapper.scResultCheck(param);
					
					for(int i = 0; i < adchgDtlListkiki.size() ; i++ ) {
						
						HashMap<String, Object> adchgDtlMapSvcKei = adchgDtlListkiki.get(i);
						 String paramKktkKeiNo = (String) adchgDtlMapSvcKei.get(JKKAdchgConstCC.PARAM_KEY_ADCHG_DTL_CHG_TG_KEI_NO);
						if (paramKktkKeiNo.equals(kikiteikyoNo)) {
							newflg = false;
						}
					}
					
					// リストにヒットしなかった場合は新規機器
					if (newflg) {
						// 機器提供サービス契約番号＿変更後
						kj_kktk_map.put(JKKKojiAnkenConstCC.KKTK_SVC_KEI_NO, kk0341_a010_map.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
						// 世代登録年月日時分秒＿変更後
						kj_kktk_map.put(JKKKojiAnkenConstCC.KKTK_SVC_KEI_NO_GENE_ADD_DTM, kk0341_a010_map.get(EKK0341A010CBSMsg1List.GENE_ADD_DTM));
						new_tl_kktk_list.add(kj_kktk_map);
						// ネット電話工事の諸変更用
						new_netTl_kktk_list.add(kj_kktk_map);
					}
				}
			}
			
			// テレビ編
			if (!StringUtils.isEmpty(svcKeitv)) {
				
				// ・EKK0341B002 機器提供サービス契約一覧照会（サービス契約番号）
				condMap.clear();
				condMap.put("cond_key_svc_kei_no", svcKeitv);
				requestMap = mapper.setEKK0341B002( param, fixedText, condMap);
				resMap = scCall.run( requestMap, handle);
				List<HashMap<String, Object>>kk0341_b002_map_list_net = mapper.getEKK0341B002( param, fixedText, resMap );
				mapper.scResultCheck( param );
				
				Iterator<HashMap<String, Object>> kk0341_b002_map_list_net_ite = kk0341_b002_map_list_net.iterator();
				while(kk0341_b002_map_list_net_ite.hasNext()) {
					
					newflg = true;	// 	フラグリセット
					// 機器情報格納用マップ生成
					HashMap<String, Object> kj_kktk_map = new HashMap<String, Object>();
					HashMap<String, Object> kikiteikyo_map = kk0341_b002_map_list_net_ite.next();
					String kikiteikyoNo = (String)kikiteikyo_map.get(EKK0341B002CBSMsg1List.KKTK_SVC_KEI_NO);
					
					// 機器提供サービス契約一意紹介
					condMap.clear();
					condMap.put(JKKAdchgMapperCC.COND_KEY_KKTK_SVC_KEI_NO, kikiteikyoNo);
					condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, JKKAdchgConstCC.DEFAULT_RSV_APLY_YMD);
					requestMap = mapper.setEKK0341A010(param, fixedText, condMap);
					resMap = scCall.run(requestMap, handle);
					HashMap<String, Object> kk0341_a010_map = mapper.getEKK0341A010(param, fixedText, resMap);
					mapper.scResultCheck(param);
					
					for(int i = 0; i < adchgDtlListkiki.size() ; i++ ) {
						
						HashMap<String, Object> adchgDtlMapSvcKei = adchgDtlListkiki.get(i);
						 String paramKktkKeiNo = (String) adchgDtlMapSvcKei.get(JKKAdchgConstCC.PARAM_KEY_ADCHG_DTL_CHG_TG_KEI_NO);
						if (paramKktkKeiNo.equals(kikiteikyoNo)) {
							newflg = false;
						}
					}
					
					// リストにヒットしなかった場合は新規機器
					if (newflg) {
						// 機器提供サービス契約番号＿変更後
						kj_kktk_map.put(JKKKojiAnkenConstCC.KKTK_SVC_KEI_NO, kk0341_a010_map.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
						// 世代登録年月日時分秒＿変更後
						kj_kktk_map.put(JKKKojiAnkenConstCC.KKTK_SVC_KEI_NO_GENE_ADD_DTM, kk0341_a010_map.get(EKK0341A010CBSMsg1List.GENE_ADD_DTM));
						new_tv_kktk_list.add(kj_kktk_map);
					}
				}
			}
			// 追加された多機能ルータの情報をネット・電話に追加する
			Map<Object, Object> workMap = param.getMappingWorkArea();
			if (workMap != null) {
				Map<String, Object> ccWorkMap = (Map<String, Object>)workMap.get(JKKAdchgConstCC.CC_WORK_AREA_NAME_KKOP);
				if (ccWorkMap != null) {
					// 機器提供サービス契約番号
					String kktkSvcKeiNo = (String)ccWorkMap.get("append_kktk_svc_kei_no");
					if (kktkSvcKeiNo != null) {
						// 多機能ルーターの追加あり
	
						// 機器提供サービス契約一意照会
						condMap.clear();
						condMap.put(JKKAdchgMapperCC.COND_KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo);
						condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, JKKAdchgConstCC.DEFAULT_RSV_APLY_YMD);
						requestMap = mapper.setEKK0341A010(param, fixedText, condMap);
						resMap = scCall.run(requestMap, handle);
						HashMap<String, Object> mapEKK0341A010 = mapper.getEKK0341A010(param, fixedText, resMap);
						mapper.scResultCheck(param);
	
						// ネット・電話の新設機器リストへ追加
						HashMap<String, Object> kktkMap = new HashMap<String, Object>();
						kktkMap.put(JKKKojiAnkenConstCC.KKTK_SVC_KEI_NO, mapEKK0341A010.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
						kktkMap.put(JKKKojiAnkenConstCC.KKTK_SVC_KEI_NO_GENE_ADD_DTM, mapEKK0341A010.get(EKK0341A010CBSMsg1List.GENE_ADD_DTM));
						new_net_kktk_list.add(kktkMap);
						new_tl_kktk_list.add(kktkMap);
						// ネット電話工事の諸変更用
						new_netTl_kktk_list.add(kktkMap);
					}
				}
			}
			// 回線に紐づく機器(新規分)
			if (!StringUtils.isEmpty(kaisen_ucwk)) {
				// ・EKK0341B504 機器提供サービス契約一覧照会（サービス契約回線内訳番号）
				condMap.clear();
				condMap.put("key_svc_kei_kaisen_ucwk_no", kaisen_ucwk);
				requestMap = mapper.setEKK0341B504( param, fixedText, condMap);
				resMap = scCall.run( requestMap, handle);
				List<HashMap<String, Object>> kk0341_b504_map_list = mapper.getEKK0341B504( param, fixedText, resMap );
				mapper.scResultCheck( param );
				
				if (kk0341_b504_map_list != null) {
					Iterator<HashMap<String, Object>> kk0341_b504_map_list_ite = kk0341_b504_map_list.iterator();
					while(kk0341_b504_map_list_ite.hasNext()) {

						HashMap<String, Object> kikiteikyo_map = kk0341_b504_map_list_ite.next();
						String kktkSvcKeiStat = (String)kikiteikyo_map.get(EKK0341B504CBSMsg1List.KKTK_SVC_KEI_STAT);
						if("910".equals(kktkSvcKeiStat) || "920".equals(kktkSvcKeiStat)){
							continue;
						}
						newflg = true;	// 	フラグリセット
						// 機器情報格納用マップ生成
						HashMap<String, Object> kj_kktk_map = new HashMap<String, Object>();

						String kikiteikyoNo = (String)kikiteikyo_map.get(EKK0341B504CBSMsg1List.KKTK_SVC_KEI_NO);
						// 機器提供サービス契約一意紹介
						condMap.clear();
						condMap.put(JKKAdchgMapperCC.COND_KEY_KKTK_SVC_KEI_NO, kikiteikyoNo);
						condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, JKKAdchgConstCC.DEFAULT_RSV_APLY_YMD);
						requestMap = mapper.setEKK0341A010(param, fixedText, condMap);
						resMap = scCall.run(requestMap, handle);
						HashMap<String, Object> kk0341_a010_map = mapper.getEKK0341A010(param, fixedText, resMap);
						mapper.scResultCheck(param);
						
						for(int i = 0; i < adchgDtlListkiki.size() ; i++ ) {
							
							HashMap<String, Object> adchgDtlMapSvcKei = adchgDtlListkiki.get(i);
							 String paramKktkKeiNo = (String) adchgDtlMapSvcKei.get(JKKAdchgConstCC.PARAM_KEY_ADCHG_DTL_CHG_TG_KEI_NO);
							if (paramKktkKeiNo.equals(kikiteikyoNo)) {
								newflg = false;
							}
						}
						
						// リストにヒットしなかった場合は新規機器
						if (newflg) {
							// 機器提供サービス契約番号＿変更後
							kj_kktk_map.put(JKKKojiAnkenConstCC.KKTK_SVC_KEI_NO, kk0341_a010_map.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
							// 世代登録年月日時分秒＿変更後
							kj_kktk_map.put(JKKKojiAnkenConstCC.KKTK_SVC_KEI_NO_GENE_ADD_DTM, kk0341_a010_map.get(EKK0341A010CBSMsg1List.GENE_ADD_DTM));
							
							// D0、E0、HGWを判定
							if (StringUtils.isEmpty((String) kk0341_a010_map.get(EKK0341A010CBSMsg1List.SVC_KEI_NO))) 
							{
								// D0またはHGWの場合、ネット・電話にリストを設定
								// ANK-4315-00-00 MOD START
								//if (JKKAdchgConstCC.TAKNKIKI_SBT.CODE_D0.equals(kk0341_a010_map.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD)))
								if (JKKAdchgConstCC.TAKNKIKI_SBT.CODE_D0.equals(kk0341_a010_map.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD))
										|| JKKAdchgConstCC.TAKNKIKI_SBT.CODE_S0.equals(kk0341_a010_map.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD)))
								// ANK-4315-00-00 MOD END
								{
									new_net_kktk_list.add(kj_kktk_map);
									new_tl_kktk_list.add(kj_kktk_map);
									// ネット電話工事の諸変更用
									new_netTl_kktk_list.add(kj_kktk_map);
								} 
								// E0の場合、テレビにリストを設定
								else if (JKKAdchgConstCC.TAKNKIKI_SBT.CODE_E0.equals(kk0341_a010_map.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD))) 
								{
									new_tv_kktk_list.add(kj_kktk_map);
								}
								// R0またはS0の場合
								// ANK-4315-00-00 MOD START
								//else if(JKKAdchgConstCC.TAKNKIKI_SBT.CODE_R0.equals(kk0341_a010_map.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD)))
								else if((JKKAdchgConstCC.TAKNKIKI_SBT.CODE_R0.equals(kk0341_a010_map.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD)))
										  ||
										 (JKKAdchgConstCC.TAKNKIKI_SBT.CODE_S0.equals(kk0341_a010_map.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD))))
								// ANK-4315-00-00 MOD END
								{
									if (workMap != null) {
										Map<String, Object> ccWorkMap = (Map<String, Object>)workMap.get(JKKAdchgConstCC.CC_WORK_AREA_NAME_KKOP);
										if (ccWorkMap != null) {
											// 機器提供サービス契約番号
											String kktkSvcKeiNo = (String)ccWorkMap.get("append_kktk_svc_kei_no");
											if(kikiteikyoNo.equals(kktkSvcKeiNo)){
												// 上で処理済なのでここでは対象外
											}else{
												// 1周目で追加されてそのままの多機能ルータ
												// ネット・電話にリストを設定
												new_net_kktk_list.add(kj_kktk_map);
												new_tl_kktk_list.add(kj_kktk_map);
												// ネット電話工事の諸変更用
												new_netTl_kktk_list.add(kj_kktk_map);
											}
										}
									}

								}
								// 60(VDSLモデム)およびその付属品は工事に乗らないので考慮しない
							}
						}

					}
				}
			}
	
			// paramMapに格納(工事案件へ連携)
			paramMap.put(JKKAdchgConstCC.NEW_KJ_KKTK_LIST_NT, new_net_kktk_list);
			paramMap.put(JKKAdchgConstCC.NEW_KJ_KKTK_LIST_TL, new_tl_kktk_list);
			paramMap.put(JKKAdchgConstCC.NEW_KJ_KKTK_LIST_TV, new_tv_kktk_list);
			paramMap.put("new_kj_kktk_list_ntTl", new_netTl_kktk_list);
			paramMap.put("old_kj_kktk_list_nt", old_net_kktk_list);
			paramMap.put("old_kj_kktk_list_tl", old_tl_kktk_list);
			paramMap.put("old_kj_kktk_list_tv", old_tv_kktk_list);
			
		} finally {
			
			// ・セッションハンドル保持域
			if(keepSesHandle.get() != null){
				keepSesHandle.remove();
			}
		}
	
		return param;
	}


	/**
	 * 指定されたサービス契約内訳番号でコース変更の異動予約を取得します.
	 * @param param リクエストパラメータ
	 * @param fixedText 任意文字列
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @return 異動予約レコードのうち、予約適用年月日が最大のもの
	 * @throws Exception
	 */
	private HashMap<String, Object> selectIdoRsvBySvcKeiUcwkNo(IRequestParameterReadWrite param, String fixedText, String svcKeiUcwkNo) throws Exception {

		if (StringUtils.isEmpty(svcKeiUcwkNo)) {
			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(EKK1681B001CBSMsg.KEY_IDO_RSV_DTL_CD, JKKAdchgConstCC.IDO_RSV_DTL_CD.CHG_PCRS);
		// ＫＥＹ＿異動区分
		condMap.put(EKK1681B001CBSMsg.KEY_IDO_DIV, "00019");
		// ＫＥＹ＿サービス契約内訳番号
		condMap.put(EKK1681B001CBSMsg.KEY_SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		// ＫＥＹ＿ソート項目Ｎｏ
		condMap.put(EKK1681B001CBSMsg.KEY_SORT_ITEM_NO, JKKAdchgConstCC.EKK1681B001_SORT_ITEM.RSV_APLY_YMD);
		// ＫＥＹ＿ソート区分
		condMap.put(EKK1681B001CBSMsg.KEY_SORT_KBN, JKKAdchgConstCC.SORT_KBN.DESC);
		// ＫＥＹ＿異動予約状態コード
		condMap.put(EKK1681B001CBSMsg.KEY_IDO_RSV_STAT_CD, "00,03");

		reqMap = mapper.setEKK1681B001(param, fixedText, condMap);
		resMap = scCall.run( reqMap, keepSesHandle.get());
		ArrayList<HashMap<String,Object>> resultList = mapper.getEKK1681B001(param, fixedText, resMap);
		mapper.scResultCheck(param);
		if (resultList != null && !resultList.isEmpty()) {
			// 結果が取得できた場合、予約適用年月日が最新のものを返却
			return resultList.get(0);
		}
		return null;
	}
}
