/********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************
 *＜プログラム内容＞
 *  システム名      ：eo顧客基幹システム
 *  モジュール名    ：JKKAdchgKikiSvcCC
 *  ソースファイル名：JKKAdchgKikiSvcCC.java
 *  作成者          ：FJ
 *  日付            ：2012年12月14日
 *＜機能概要＞
 *  機器提供サービス契約CC部品
 *＜修正履歴＞
 *  バージョン  修正日      修正者      修正内容
 *  v1.00.00    2012/12/14  FJ          新規作成
 *  v8.00.00    2014/04/14  FJ)金田     OM-2014-0001454
 *  v8.01.00    2014/05/15  FJ)星野     OM-2014-0001512
 *  v9.00.00    2014/07/07  FJ)星野     OM-2014-0002198
 * v33.00.00	2017/09/09	FJ)星野		OM-2017-0000920
 * v44.00.00	2019/07/03	FJ)舘山		ANK-3221-00-00【瑕疵外障害の案件化】住変キャンセル時に生じる不正排他エラーの解消(OM-2017-0000295)
 ********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

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.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.bp.x21.sc.exception.SCException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;
import com.sun.enterprise.tools.common.util.StringUtils;

import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B031CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B032CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341C330CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C340CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C350CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C540CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0481A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0481A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0481B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0481B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0481E010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2101B001CBSMsg1List;

public class JKKAdchgKikiSvcCC extends AbstractCommonComponent {

	/**
	 * コンストラクタ.
	 * <br>
	 */
	public JKKAdchgKikiSvcCC() {
	}
	

	/**
	 * 機器提供サービス契約履歴一覧を照会し、予約適用年月日＝"20991231"の場合は
	 * 機器提供サービス契約論理削除SC(EKK0341E010)を呼ぶ。
	 * <br>
	 * @param   handle     セッションマネージャなどを持ったハンドル情報
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @throws  Throwable  例外が発生した場合
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	public IRequestParameterReadWrite updateRonriDel(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable {

		/** 事前準備 */
		HashMap<String, Object> paramMap = (HashMap<String, Object>)param.getData(fixedText);

//		String svc_kei_no  = (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_SVC_KEI_NO);
//		
//		if(svc_kei_no == null || "".equals(svc_kei_no))
//		{
//			return param;
//		}
		
		
		// 住所変更登録コモンコンポーネントマッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();

		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 機器提供サービス契約一覧照会の結果リスト
		List<HashMap<String, Object>> retList = null;
		
// OM-2017-0000920対応 20170920 星野 MOD START
//// 20130106 星野 MOD START
////		/** EKK0341B025　機器提供サービス契約履歴一覧照会を取得 */
////		HashMap<String, String> condMap = new HashMap<String, String>();
////		condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_SVC_KEI_NO));
////		HashMap<String, Object> reqMap = mapper.setEKK0341B025( param, fixedText, condMap);
////		Map<?, ?> resMap = scCall.run( reqMap, handle);
////		retList = mapper.getEKK0341B025( param, fixedText, resMap );
////		mapper.scResultCheck( param );
//		
//		
//
//		/** EKK0341B031　機器提供サービス契約履歴一覧照会（SYSID） */
//		HashMap<String, String> condMap = new HashMap<String, String>();
//		condMap.put(JKKAdchgMapperCC.COND_KEY_SYSID, (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_SYSID));
//		condMap.put(JKKAdchgMapperCC.COND_KEY_IDO_DIV, (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_IDO_DIV));
//		HashMap<String, Object> reqMap = mapper.setEKK0341B031( param, fixedText, condMap);
//		Map<?, ?> resMap = scCall.run( reqMap, handle);
//		retList = mapper.getEKK0341B031( param, fixedText, resMap );
//		mapper.scResultCheck( param );
//// 20130106 星野 MOD END
		
		HashMap<String, String> condMap = new HashMap<String, String>();
		HashMap<String, Object> reqMap;
		Map<?, ?> resMap;
		
		String adchgNo = (String)paramMap.get("adchg_no");
		
		/** EKK0341B031　機器提供サービス契約履歴一覧照会（SYSID） */
		String sysid = (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_SYSID);
		String idoDiv = (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_IDO_DIV);
		
		// サービス契約から拾ったSYSIDも合わせてSYSIDリストを作成
		// お客様併合・分割によりSYSIDが複数となっているケースの考慮
		List<String> sysidList = makeSysidList(handle, param, fixedText, adchgNo, mapper, scCall, sysid);

		retList = getKktkSvcKeiList(handle, param, fixedText, sysidList, idoDiv);
// OM-2017-0000920対応 20170920 星野 MOD END
		
// OM-2013-0004454対応 20131124 星野 ADD START
		String mskmDtlNoNet = (String)paramMap.get("mskm_dtl_no_net");
		String mskmDtlNoTel = (String)paramMap.get("mskm_dtl_no_tel");
		String mskmDtlNoTv  = (String)paramMap.get("mskm_dtl_no_tv");
// OM-2013-0004454対応 20131124 星野 ADD END
// OM-2013-0004691対応 20131211 星野 ADD START
// OM-2017-0000920対応 20170920 星野 DEL START
// 上に移動
//		String adchgNo = (String)paramMap.get("adchg_no");
// OM-2017-0000920対応 20170920 星野 DEL END
		String svcKeiNoNet = (String)paramMap.get("svc_kei_no_net");
		String svcKeiNoTel = (String)paramMap.get("svc_kei_no_tel");
		String svcKeiNoTv = (String)paramMap.get("svc_kei_no_tv");
		
		// 追加機器リストの作成
		List<String> addKikiList = getAddKikiList(handle, param, fixedText, adchgNo);
		
		// 削除対象追加機器セット
		// 機器提供サービス契約番号の重複追加があるためListではなくSetにしておく
		Set<String> cancelAddKikiSet = new HashSet<String>();
// OM-2013-0004691対応 20131211 星野 ADD END
		
		
		for (HashMap<String, Object> kikiteikyoMap : retList ) {

// ANK-1578-00-00 2014.01.27 T.TORIKAI ADD START（IT1-2014-0000047）
			if (!isCancelTgKktkSvcKeiNo(paramMap, (String)kikiteikyoMap.get(EKK0341B031CBSMsg1List.KKTK_SVC_KEI_NO))) {
				continue;
			}
// ANK-1578-00-00 2014.01.27 T.TORIKAI ADD END  （IT1-2014-0000047）

// OM-2013-0004454対応 20131124 星野 ADD START
			// 機器提供サービス契約一意照会（予約手続中含む）
			condMap.clear();
			condMap.put(JKKAdchgMapperCC.COND_KEY_KKTK_SVC_KEI_NO, (String)kikiteikyoMap.get(EKK0341B031CBSMsg1List.KKTK_SVC_KEI_NO));
			condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, JKKAdchgConstCC.DEFAULT_RSV_APLY_YMD);
			reqMap = mapper.setEKK0341B032(param, fixedText, condMap);
			resMap = scCall.run(reqMap, handle);
			List<HashMap<String, Object>> kk0341_b032_map_af = mapper.getEKK0341B032( param, fixedText, resMap );
			mapper.scResultCheck(param);
			
			HashMap<String, Object> kk0341_a010_map = new HashMap<String, Object>();
			if (kk0341_b032_map_af.size() > 0) {
				kk0341_a010_map = kk0341_b032_map_af.get(0);
			}else{
				continue;
			}
// OM-2013-0004454対応 20131124 星野 ADD END
			
// 住所変更キャンセル品質向上 2013/06/11 START
// OM-2013-0004454対応 20131124 星野 MOD START
// カレントの機器提供サービス契約ステータスを取得
//			String kktkSvcState = (String)kikiteikyoMap.get(EKK0341B031CBSMsg1List.KKTK_SVC_KEI_STAT);
			String kktkSvcState = (String)kk0341_a010_map.get(EKK0341B032CBSMsg1List.KKTK_SVC_KEI_STAT);
// OM-2013-0004454対応 20131124 星野 MOD END
			
			// 解約済み・キャンセル済みの場合は無視
			// 後続のSOD送信バッチで参照するので無効化してはいけない
			if ("910".equals(kktkSvcState)
// OM-2013-0003213対応 20131011 星野 ADD START
				|| "920".equals(kktkSvcState)
// OM-2013-0003213対応 20131011 星野 ADD END
			) {
				continue;
			}
// 住所変更キャンセル品質向上 2013/06/11 END
			
// OM-2013-0004454対応 20131124 星野 ADD START
			// 対象世代の申込明細番号を取得
			String mskmDtlNo = (String)kikiteikyoMap.get(EKK0341B031CBSMsg1List.MSKM_DTL_NO);
			// ネット・電話・ＴＶいずれの申込明細番号とも不一致の場合、処理対象外
			if( StringUtils.isEmpty(mskmDtlNo) ||
				( !mskmDtlNo.equals(mskmDtlNoNet)&& !mskmDtlNo.equals(mskmDtlNoTel) && !mskmDtlNo.equals(mskmDtlNoTv) )
			){
				continue;
			}
// OM-2013-0004454対応 20131124 星野 ADD END
			
// OM-2014-0002198関連対応 20140707 星野 DEL START
// 下へ移動
//// OM-2014-0001512対応 20140515 星野 ADD START
//			// 対象世代の予約適用年月日を取得
//			String rsvAplyYmd = (String)kikiteikyoMap.get(EKK0341B031CBSMsg1List.RSV_APLY_YMD);
//			// 運用日当日か過去日の場合は処理対象外
//			// 交換中レコードを考慮し、未設定は処理対象とする
//			if( !StringUtils.isEmpty(rsvAplyYmd) && rsvAplyYmd.compareTo(JCCBPCommon.getOpeDate(null))<=0 ){
//				continue;
//			}
//// OM-2014-0001512対応 20140515 星野 ADD END
// OM-2014-0002198関連対応 20140707 星野 DEL END


// 20130106 星野 MOD START
//			// 機器提供サービス契約番号
//			String kktkSvcNo = (String)kikiteikyoMap.get(EKK0341B025CBSMsg1List.KKTK_SVC_KEI_NO);
//			String geneAddDtm = (String)kikiteikyoMap.get(EKK0341B025CBSMsg1List.GENE_ADD_DTM);
//			String rsvAplyYmd = (String)kikiteikyoMap.get(EKK0341B025CBSMsg1List.RSV_APLY_YMD);
			// 機器提供サービス契約番号
			String kktkSvcNo = (String)kikiteikyoMap.get(EKK0341B031CBSMsg1List.KKTK_SVC_KEI_NO);
			String geneAddDtm = (String)kikiteikyoMap.get(EKK0341B031CBSMsg1List.GENE_ADD_DTM);
// OM-2014-0001454 2014.04.14 Y.Kanata MOD START
//			String last_upd_dtm = (String)kikiteikyoMap.get(EKK0341B031CBSMsg1List.LAST_UPD_DTM);
			String last_upd_dtm = (String)kk0341_a010_map.get(EKK0341B032CBSMsg1List.LAST_UPD_DTM);
// OM-2014-0001454 2014.04.14 Y.Kanata MOD END
// 20130106 星野 MOD END
			
// OM-2013-0005374対応 20140103 星野 ADD START
			// サービス提供中前のレコードはキャンセル／解約を行う。
			// Z1展開後のSOD送信時エラーに対処。論理削除を行うとSOD発行の際に契約情報が取れずエラーとなる。
			// また、照査済or締結済の機器はretListが履歴を含めた一覧照会結果であるが2重処理されることはない。
			// これは、kikiteikyoMapに対するカレントレコードを取得して処理を行うことから、最初に取得したレコードを
			// キャンセルor解約すると以降同じ機器提供サービス番号のレコードがこれより前の分岐でcontinueとなるため
			if ("010".equals(kktkSvcState)
					|| "020".equals(kktkSvcState)
					|| "030".equals(kktkSvcState)
				) {
				// 事前に追加分のキャンセル・解約を実施
				cancelDslKktkSvcKei(handle, param, fixedText, kktkSvcNo, mskmDtlNo);
				continue;
			}
// OM-2013-0005374対応 20140103 星野 ADD END
			
// OM-2014-0002198関連対応 20140707 星野 ADD START
// 上から移動
			// 対象世代の予約適用年月日を取得
			String rsvAplyYmd = (String)kikiteikyoMap.get(EKK0341B031CBSMsg1List.RSV_APLY_YMD);
			// 運用日当日か過去日の場合は処理対象外
			// 交換中レコードを考慮し、未設定は処理対象とする
			if( !StringUtils.isEmpty(rsvAplyYmd) && rsvAplyYmd.compareTo(JCCBPCommon.getOpeDate(null))<=0 ){
				continue;
			}
// OM-2014-0002198関連対応 20140707 星野 ADD END
// 20130106 星野 DEL START
// ヒットしたものは無条件で論理削除
//			// 予約適用年月日＝"20991231"のとき、機器提供サービス契約論理削除SC(EKK0341E010)を呼ぶ
//			if (JKKAdchgConstCC.DEFAULT_RSV_APLY_YMD.equals(rsvAplyYmd)) {
//				HashMap<String, String> condMapA010 = new HashMap<String, String>();
//				condMapA010.put(JKKAdchgMapperCC.COND_KEY_KKTK_SVC_KEI_NO, kktkSvcNo);
//				condMapA010.put(JKKAdchgMapperCC.COND_KEY_GENE_ADD_DTM, geneAddDtm);
//				condMapA010.put(JKKAdchgMapperCC.COND_KEY_RSV_APLY_YMD, rsvAplyYmd);
//				
//				// 機器提供サービス契約一意照会の呼び出し
//				HashMap<String, Object> reqMapA010 =  mapper.setEKK0341A010(param, fixedText, condMapA010);
//				Map<?,?>resMapA101 = scCall.run(reqMapA010, handle);
//				HashMap<String, Object>retListA010 = mapper.getEKK0341A010(param, fixedText, resMapA101);
//				
//				mapper.scResultCheck( param );
//	
//				String last_upd_dtm = (String)retListA010.get(EKK0341A010CBSMsg1List.GENE_ADD_DTM);
// 20130106 星野 DEL END

// OM-2014-0000170対応 20140114 星野 ADD START
			// 対象世代のステータスを取得
			String kktkSvcKeiStatTrgt = (String)kikiteikyoMap.get(EKK0341B031CBSMsg1List.KKTK_SVC_KEI_STAT);
			// 交換中世代は論理削除ではなく手続中止
			if("110".equals(kktkSvcKeiStatTrgt)){
				
				HashMap<String, String> updMap = new HashMap<String, String>();
				updMap.put(EKK0341C540CBSMsg.KKTK_SVC_KEI_NO, kktkSvcNo);
				updMap.put(EKK0341C540CBSMsg.GENE_ADD_DTM, geneAddDtm);
				updMap.put(EKK0341C540CBSMsg.RSV_CL_YMD, JCCBPCommon.getOpeDate(null));
				updMap.put(EKK0341C540CBSMsg.RSV_APLY_CD, "3");
				updMap.put(EKK0341C540CBSMsg.UPD_DTM_BF, last_upd_dtm);
					
				HashMap<String, Object> retMap=null;
				HashMap<String, Object> reqUpdMap = mapper.setEKK0341C540( param, fixedText, updMap);
				Map<?, ?> resUpdMap = scCall.run( reqUpdMap, handle);
				retMap = mapper.getEKK0341C540( param, fixedText, resUpdMap );
				mapper.scResultCheck( param );

			}else{
// OM-2014-0000170対応 20140114 星野 ADD END
	
			HashMap<String, String> updMap = new HashMap<String, String>();
			updMap.put(JKKAdchgMapperCC.COND_KEY_KKTK_SVC_KEI_NO, kktkSvcNo);
			updMap.put(JKKAdchgMapperCC.COND_KEY_GENE_ADD_DTM, geneAddDtm);
			updMap.put(JKKAdchgMapperCC.UPD_DT_KKTK_SVC_KEI_UPD_DTM_BEF, last_upd_dtm);
				
			HashMap<String, Object> retMap=null;
			HashMap<String, Object> reqUpdMap = mapper.setEKK0341E020( param, fixedText, updMap);
			Map<?, ?> resUpdMap = scCall.run( reqUpdMap, handle);
			retMap = mapper.getEKK0341E020( param, fixedText, resUpdMap );
			mapper.scResultCheck( param );
				
// OM-2014-0000170対応 20140114 星野 ADD START
			}
// OM-2014-0000170対応 20140114 星野 ADD END
// 20130106 星野 DEL START
//			}
// 20130106 星野 DEL END
			
// OM-2013-0004691対応 20131211 星野 ADD START
			// 論理削除した機器が追加機器の場合
			if(addKikiList.contains(kktkSvcNo)){
				// 削除対象追加機器セットに追加
				cancelAddKikiSet.add(kktkSvcNo);
			}
// OM-2013-0004691対応 20131211 星野 ADD END
		}
		
		
// OM-2013-0004691対応 20131211 星野 ADD START
		// 追加機器を論理削除した場合、割引との紐付けも切る必要がある
		if(!cancelAddKikiSet.isEmpty()){
			
			// 性能を考慮し、サービス契約番号もキーにして割引を探しに行く。
			// ネット・電話・テレビで3回。
			deleteWribSvcTgtKei(handle, param, fixedText, scCall, svcKeiNoNet, cancelAddKikiSet);
			deleteWribSvcTgtKei(handle, param, fixedText, scCall, svcKeiNoTel, cancelAddKikiSet);
			deleteWribSvcTgtKei(handle, param, fixedText, scCall, svcKeiNoTv, cancelAddKikiSet);
			
		}
// OM-2013-0004691対応 20131211 星野 ADD END

		return param;
	}


	// OM-2017-0000920対応 20170920 星野 ADD START
	private List<String> makeSysidList(
		SessionHandle handle, 
		IRequestParameterReadWrite param, 
		String fixedText,
		String adchgNo, 
		JKKAdchgMapperCC mapper,
		ServiceComponentRequestInvoker scCall, 
		String sysid
	) throws Exception {
		List<String> sysidList = new ArrayList<String>();
		sysidList.add(sysid);
		
		/** 住所変更明細スキーマデータの取得（サービス契約番号） */
		// ・EKK2101B001 住所変更明細一覧照会
		ArrayList<HashMap<String, Object>> svkei_kk2101_b001_list = getAdchgDtlList(handle, param, fixedText, adchgNo, JKKAdchgConstCC.CD01241_SVC_KEI_NO);
		if(svkei_kk2101_b001_list != null){
			for(HashMap<String, Object> svkei_kk2101:svkei_kk2101_b001_list){
				addSysidFromSvkei(handle, param, fixedText, sysidList,(String)svkei_kk2101.get(EKK2101B001CBSMsg1List.CHBF_SKBT_NO));
				addSysidFromSvkei(handle, param, fixedText, sysidList,(String)svkei_kk2101.get(EKK2101B001CBSMsg1List.CHAF_SKBT_NO));
			}
		}
		
		return sysidList;
	}

	private ArrayList<HashMap<String, Object>> getAdchgDtlList(
		SessionHandle handle, 
		IRequestParameterReadWrite param, 
		String fixedText,
		String adchgNo,
		String adchgDtlSbtCd
	) throws Exception{
		/** 事前準備 */
		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.clear();
		condMap.put( JKKAdchgMapperCC.COND_KEY_ADCHG_NO, adchgNo );
		condMap.put( JKKAdchgMapperCC.COND_KEY_ADCHG_DTL_SBT_CD, adchgDtlSbtCd );
		reqMap = mapper.setEKK2101B001( param, fixedText, condMap );
		resMap = scCall.run( reqMap, handle );
		ArrayList<HashMap<String, Object>> kk2101_b001_list = mapper.getEKK2101B001( param, fixedText, resMap );
		mapper.scResultCheck( param );
		return kk2101_b001_list;
	}
	
	private void addSysidFromSvkei(
		SessionHandle handle, 
		IRequestParameterReadWrite param,
		String fixedText, 
		List<String> sysidList,
		String svcKeiNo
	) throws Exception {
		
		// 住所情報変更初期表示情報取得コモンコンポーネント
		// マッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
		
		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		JKKAdchgCmnLogicCC lclCmnLogic = new JKKAdchgCmnLogicCC(handle);
		
		if(!StringUtils.isEmpty(svcKeiNo)){
			// EKK0081A010_サービス契約一意照会
			HashMap<String, Object> kk0081_a010_map = 
				lclCmnLogic.getEKK0081A010( param, mapper, fixedText, scCall, svcKeiNo, JCCBPCommon.getOpeDate(null) );
			if(kk0081_a010_map!=null){
				String sysid = (String)kk0081_a010_map.get(EKK0081A010CBSMsg1List.SYSID);
				if(!StringUtils.isEmpty(sysid) && !sysidList.contains(sysid)){
					sysidList.add(sysid);
				}
			}
	
		}
	}
	
	private ArrayList<HashMap<String, Object>> getKktkSvcKeiList(
		SessionHandle handle, 
		IRequestParameterReadWrite param, 
		String fixedText,
		List<String> sysidList,
		String idoDiv
	) throws Exception{
		
		
		ArrayList<HashMap<String, Object>> retList = new ArrayList<HashMap<String, Object>>();
		
		if(sysidList==null){
			return retList;
		}
		
		for(String sysid:sysidList){
			List<HashMap<String, Object>> ekk0341b031List = getEkk0341b031List(handle, param, fixedText, sysid, idoDiv);
			if(ekk0341b031List!=null){
				retList.addAll(ekk0341b031List);
			}
		}
		
		// 返却前に機器提供サービス契約番号（昇順）、世代登録年月日時分秒（降順）でソート
		Collections.sort(
			retList, 
			new Comparator<HashMap<String, Object>>(){
				public int compare(HashMap<String, Object> arg0, HashMap<String, Object> arg1) {
					if(arg0==null){
						arg0 = new HashMap<String, Object>();
					}
					if(arg1==null){
						arg1 = new HashMap<String, Object>();
					}
					
					String kktkSvcKeiNo0 = JKKStringUtil.nullToBlank((String)arg0.get(EKK0341B031CBSMsg1List.KKTK_SVC_KEI_NO)).trim();
					String kktkSvcKeiNo1 = JKKStringUtil.nullToBlank((String)arg1.get(EKK0341B031CBSMsg1List.KKTK_SVC_KEI_NO)).trim();
					String geneAddDtm0 = JKKStringUtil.nullToBlank((String)arg0.get(EKK0341B031CBSMsg1List.GENE_ADD_DTM)).trim();
					String geneAddDtm1 = JKKStringUtil.nullToBlank((String)arg1.get(EKK0341B031CBSMsg1List.GENE_ADD_DTM)).trim();
					
					// 機器提供サービス契約番号（昇順）
					int ret = kktkSvcKeiNo0.compareTo(kktkSvcKeiNo1);
					if(ret!=0){
						return ret;
					}else{
						// 世代登録年月日時分秒（降順）
						return geneAddDtm1.compareTo(geneAddDtm0);
					}
				}
			}
		);
		return retList;
	}
	
	private List<HashMap<String, Object>> getEkk0341b031List(
		SessionHandle handle, 
		IRequestParameterReadWrite param,
		String fixedText,
		String sysid, String idoDiv
	)
	throws RequestParameterException, SCException, Exception,
	CCException {
		// 住所情報変更初期表示情報取得コモンコンポーネント
		// マッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
		
		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		List<HashMap<String, Object>> retList;
		HashMap<String, String> condMap2 = new HashMap<String, String>();
		condMap2.put(JKKAdchgMapperCC.COND_KEY_SYSID, sysid);
		condMap2.put(JKKAdchgMapperCC.COND_KEY_IDO_DIV, idoDiv);
		HashMap<String, Object> reqMap2 = mapper.setEKK0341B031( param, fixedText, condMap2);
		Map<?, ?> resMap2 = scCall.run( reqMap2, handle);
		retList = mapper.getEKK0341B031( param, fixedText, resMap2 );
		mapper.scResultCheck( param );
		return retList;
	}
	// OM-2017-0000920対応 20170920 星野 ADD END



// OM-2013-0004691対応 20131211 星野 ADD START
	private List<String> getAddKikiList( 
		SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String adchgNo 
	)throws Exception{
		
		// 住所変更登録コモンコンポーネントマッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();

		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		HashMap<String, String> condMap = new HashMap<String, String>();
		HashMap<String, Object> reqMap;
		Map<?, ?> resMap;
		/** EKK2101B001 住所変更明細一覧照会 */
		condMap.clear();
		condMap.put( JKKAdchgMapperCC.COND_KEY_ADCHG_NO, adchgNo );
		condMap.put( JKKAdchgMapperCC.COND_KEY_ADCHG_DTL_SBT_CD, "03" );
		reqMap = mapper.setEKK2101B001( param, fixedText, condMap );
		resMap = scCall.run( reqMap, handle );
		ArrayList<HashMap<String, Object>> kk2101_b001_list = mapper.getEKK2101B001( param, fixedText, resMap );
		mapper.scResultCheck( param );
		
		List<String> addKikiList = new ArrayList<String>();
		for(HashMap<String, Object> kk2101_b001_map : kk2101_b001_list){
			String kktkSvcKeiNo = (String)kk2101_b001_map.get(EKK2101B001CBSMsg1List.CHG_TG_KEI_NO);
			String chbfKikiChgNo = (String)kk2101_b001_map.get(EKK2101B001CBSMsg1List.CHBF_SKBT_NO);
			String chafKikiChgNo = (String)kk2101_b001_map.get(EKK2101B001CBSMsg1List.CHAF_SKBT_NO);
			
			// 機器追加のレコードを抽出
			if( !StringUtils.isEmpty(kktkSvcKeiNo)
				&& StringUtils.isEmpty(chbfKikiChgNo) && !StringUtils.isEmpty(chafKikiChgNo)
			){
				// 機器提供サービス契約番号を追加機器リストに格納
				addKikiList.add(kktkSvcKeiNo);
			}
		}
		return addKikiList;
	}
	
	private void deleteWribSvcTgtKei(
		SessionHandle handle,
		IRequestParameterReadWrite param, 
		String fixedText,
		ServiceComponentRequestInvoker scCall, 
		String svcKeiNo,
		Set<String> cancelAddKikiSet
	) throws Exception {
		
		if(StringUtils.isEmpty(svcKeiNo)){
			return;
		}
		
		// 割引サービス契約一覧照会（サービス契約番号）
		CAANMsg[] ekk0451b002cbsMsg1list = execEKK0451B002(handle, scCall, param, fixedText, svcKeiNo );
		if(ekk0451b002cbsMsg1list == null || ekk0451b002cbsMsg1list.length == 0)
		{
			return;
		}
		
		for (int i = 0; i < ekk0451b002cbsMsg1list.length; i++) {
			
			String wrib_svc_kei_no = (String)ekk0451b002cbsMsg1list[i].getString(EKK0451B002CBSMsg1List.WRIB_SVC_KEI_NO);
			
			for(String kktkSvcKeiNo : cancelAddKikiSet){
				
				if(StringUtils.isEmpty(kktkSvcKeiNo)){
					continue;
				}
			
				CAANMsg[] ekk0481b001cbsMsg1list = execEKK0481B001(handle, scCall, param, fixedText, kktkSvcKeiNo, wrib_svc_kei_no );
				if(ekk0481b001cbsMsg1list == null || ekk0481b001cbsMsg1list.length == 0)
				{
					continue;
				}
				
				for (int j = 0; j < ekk0481b001cbsMsg1list.length; j++) {
					
					wrib_svc_kei_no = (String)ekk0481b001cbsMsg1list[j].getString(EKK0481B001CBSMsg1List.WRIB_SVC_KEI_NO);
					String wrib_svc_trgt_kei_no = (String)ekk0481b001cbsMsg1list[j].getString(EKK0481B001CBSMsg1List.WRIB_SVC_TRGT_KEI_NO);
					
					// 割引サービス対象契約一意照会
					CAANMsg[] ekk0481a010cbsMsg1list = execEKK0481A010(handle, scCall, param, fixedText, wrib_svc_kei_no, wrib_svc_trgt_kei_no);
					if(ekk0481a010cbsMsg1list == null || ekk0481a010cbsMsg1list.length == 0)
					{
						continue;
					}
					
					// 対象機器が論理削除されているのでサービス契約排他制御にたどりつけず、LAST_UPD_DTMにはnullが返ってくる。
					// 何を入れても排他チェックは通るが、とりあえずUPD_DTMを設定
					String lastUpdDtm = ekk0481a010cbsMsg1list[0].getString(EKK0481A010CBSMsg1List.UPD_DTM);
					
					// 割引サービス対象契約論理削除
					execEKK0481E010(handle, scCall, param, fixedText, wrib_svc_kei_no, wrib_svc_trgt_kei_no, lastUpdDtm);
				}
			}
		}
	}

	/**
	 * 割引サービス契約一覧照会（サービス契約番号）<br>
	 * <br>
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param ekk2101b002CbsMsg
	 * @param adchgDtlSbtCd
	 * @return CAANMsg[]
	 * @throws Exception
	 */
	private CAANMsg[] execEKK0451B002(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param,
			String dataMapKey, String svcKeiNo) throws Exception
	{
		// ***** EKK0451B002（割引サービス契約一覧照会（サービス契約番号））******
		Object[][] ekk0451b002IN = {
				{ EKK0451B002CBSMsg.TEMPLATEID, "EKK0451B002" },
				{ EKK0451B002CBSMsg.FUNC_CODE, "1" }, // "1"固定
				{ EKK0451B002CBSMsg.KEY_SVC_KEI_NO, svcKeiNo }
		};

		// 割引サービス契約一覧照会（サービス契約番号）サービスインターフェイスの実行
		CAANMsg[] ekk0451b002cbsMsg1list = callSC(handle, scCall, param, dataMapKey, ekk0451b002IN).getCAANMsgList(
				EKK0451B002CBSMsg.EKK0451B002CBSMSG1LIST);

		return ekk0451b002cbsMsg1list;
	}
	
	/**
	 * 割引サービス対象契約一覧照会<br>
	 * <br>
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param ekk2101b002CbsMsg
	 * @param adchgDtlSbtCd
	 * @return CAANMsg[]
	 * @throws Exception
	 */
	private CAANMsg[] execEKK0481B001(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param,
			String dataMapKey, String kktkSvcKeiNo, String wrib_svc_kei_no) throws Exception
	{
		// ***** EKK0481B001（割引サービス対象契約一覧照会）******
		Object[][] ekk0481b001IN = {
				{ EKK0481B001CBSMsg.TEMPLATEID, "EKK0481B001" },
				{ EKK0481B001CBSMsg.FUNC_CODE, "1" }, // "1"固定
				{ EKK0481B001CBSMsg.KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo },
				{ EKK0481B001CBSMsg.KEY_WRIB_SVC_KEI_NO, wrib_svc_kei_no }
		};

		// 割引サービス対象契約一覧照会サービスインターフェイスの実行
		CAANMsg[] ekk0481b001cbsMsg1list = callSC(handle, scCall, param, dataMapKey, ekk0481b001IN).getCAANMsgList(
				EKK0481B001CBSMsg.EKK0481B001CBSMSG1LIST);

		return ekk0481b001cbsMsg1list;
	}
	
	/**
	 * 割引サービス対象契約一意照会<br>
	 * <br>
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param ekk2101b002CbsMsg
	 * @param adchgDtlSbtCd
	 * @return CAANMsg[]
	 * @throws Exception
	 */
	private CAANMsg[] execEKK0481A010(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param,
			String dataMapKey, String wrib_svc_kei_no, String wrib_svc_trgt_kei_no) throws Exception
	{
		// ***** EKK0481A010（割引サービス対象契約一意照会）******
		Object[][] EKK0481A010IN = {
				{ EKK0481A010CBSMsg.TEMPLATEID, "EKK0481A010" },
				{ EKK0481A010CBSMsg.FUNC_CODE, "2" }, // "2"固定
				{ EKK0481A010CBSMsg.KEY_WRIB_SVC_TRGT_KEI_NO, wrib_svc_trgt_kei_no },
				{ EKK0481A010CBSMsg.KEY_WRIB_SVC_KEI_NO, wrib_svc_kei_no }
		};

		// 割引サービス対象契約一意照会サービスインターフェイスの実行
		CAANMsg[] EKK0481A010cbsMsg1list = callSC(handle, scCall, param, dataMapKey, EKK0481A010IN).getCAANMsgList(
				EKK0481A010CBSMsg.EKK0481A010CBSMSG1LIST);

		return EKK0481A010cbsMsg1list;
	}
	
	/**
	 * 割引サービス対象契約論理削除 <br>
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param pcrsCd
	 * @param pplanCd
	 * @throws Throwable
	 */
	private void execEKK0481E010(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param, String dataMapKey,
			String wrib_svc_kei_no, String wrib_svc_trgt_kei_no, String updDtmBf) throws Exception
	{
		
		// ***** EKK0481E010（割引サービス対象契約論理削除）*****
		Object[][] ekk0481e010IN = {
				{ EKK0481E010CBSMsg.TEMPLATEID, "EKK0481E010" },
				{ EKK0481E010CBSMsg.FUNC_CODE, "1" },
				{ EKK0481E010CBSMsg.WRIB_SVC_KEI_NO, wrib_svc_kei_no },
				{ EKK0481E010CBSMsg.WRIB_SVC_TRGT_KEI_NO, wrib_svc_trgt_kei_no },
				{ EKK0481E010CBSMsg.UPD_DTM_BF, updDtmBf }
		};
		
		// 更新処理実行
		CAANMsg ekk0481e010Msg_out = callSC(handle, scCall, param, dataMapKey, ekk0481e010IN);
		
	}
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param, String dataMapKey,
			Object[][] mappingData) throws Exception
	{
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);

		Map<?, ?> result = scCall.run(paramMap, handle);

		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];

		// リターンコード取得
		Object return_code = result.get(JCMConstants.RET_CD_INT_KEY);
		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);

		editErrorInfoCom(param, templates, (Integer)return_code, dataMapKey, mappingData);

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));

		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(return_code.toString()) && 0 == status))
		{
			// 警告の場合、例外をスローしない
			if(!("0".equals(return_code.toString()) && 4 == status))
			{
				throw new SCCallException("戻り値不正", return_code.toString(), status);
			}
		}
		return msg;
	}
	
	/**
	 * @param param
	 * @param mappingData
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param, Object[][] mappingData) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		String svcIf = (String)mappingData[0][1];

		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));

		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));

		for (int i = 0; i < mappingData.length; i++)
		{
			if("".equals(mappingData[i][1]))
			{
				template.setNull((String)mappingData[i][0]);
			}
			else
			{
				template.set((String)mappingData[i][0], mappingData[i][1]);
			}
		}

		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param dataMapKey
	 * @param mappingData
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, String dataMapKey,
			Object[][] mappingData) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if(returnCode != 0)
		{
			templateStatus = 9000;
		}

		if(JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if(obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if(templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		HashMap<String, String> inMap = null;

		// ユーザデータ情報
		inMap = (HashMap<String, String>)param.getData(dataMapKey);

		for (int i = 0; i < mappingData.length; i++)
		{
			if(!template.isNull(mappingData[i][0] + "_err"))
			{
				if(!inMap.containsKey(mappingData[i][0] + "_err"))
				{
					inMap.put(mappingData[i][0] + "_err", template.getString(mappingData[i][0] + "_err"));
				}
			}
		}
		return param;
	}
// OM-2013-0004691対応 20131211 星野 ADD END
// OM-2013-0005374対応 20140103 星野 ADD START
	private void cancelDslKktkSvcKei(
		SessionHandle handle,
		IRequestParameterReadWrite param, 
		String fixedText,
		String kktkSvcKeiNo, 
		String mskmDtlNo
	) throws Exception {
		
		if (StringUtils.isEmpty(kktkSvcKeiNo)
				|| StringUtils.isEmpty(mskmDtlNo)) {
			return;
		}

		// 住所変更登録コモンコンポーネントマッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		/** EKK0341A010 機器提供サービス契約一意照会 */
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, JKKAdchgConstCC.MAX_DATE);
		HashMap<String, Object> reqMap = mapper.setEKK0341A010(param, fixedText, condMap);
		Map<?, ?> resMap = scCall.run(reqMap, handle);
		HashMap<String, Object> kk0341_a010_map = mapper.getEKK0341A010(param, fixedText, resMap);
		mapper.scResultCheck(param);

		String mskmDtlNoA010 = (String) kk0341_a010_map.get(EKK0341A010CBSMsg1List.MSKM_DTL_NO);
		String kktkStat = (String) kk0341_a010_map.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_STAT);

		if (mskmDtlNo.equals(mskmDtlNoA010)) {
			String lastUpdDtm = (String) kk0341_a010_map.get(EKK0341A010CBSMsg1List.LAST_UPD_DTM);

			if ("010".equals(kktkStat) || "020".equals(kktkStat)) {
				// サービス契約内訳キャンセル呼び出し
				condMap.clear();
				condMap.put(EKK0341C330CBSMsg.KKTK_SVC_KEI_NO, kktkSvcKeiNo);
				condMap.put(EKK0341C330CBSMsg.MSKM_DTL_NO, mskmDtlNo);
				condMap.put(EKK0341C330CBSMsg.SVC_CANCEL_RSN_CD, "02");
				condMap.put(EKK0341C330CBSMsg.IDO_DIV, JKKAdchgConstCC.IDO_DIV_ADCHG_RGST);
				condMap.put(EKK0341C330CBSMsg.UPD_DTM_BF, lastUpdDtm);

				reqMap = mapper.setEKK0341C330(param, fixedText, condMap);
				resMap = scCall.run(reqMap, handle);
				mapper.getEKK0341C330(param, fixedText, resMap);
				mapper.scResultCheck(param);

			} else if ("030".equals(kktkStat)) {
				// 機器提供サービス契約解約呼び出し
				kk0341_a010_map.put(JKKAdchgConstCC.PARAM_KEY_MSKM_DTL_NO, mskmDtlNo);
				kk0341_a010_map.put(EKK0341C340CBSMsg.RSV_TSTA_KIBO_YMD, JCCBPCommon.getOpeDate(null));
				kk0341_a010_map.put(EKK0341C340CBSMsg.SVC_ENDYMD, JCCBPCommon.getOpeDate(null));
				kk0341_a010_map.put(EKK0341C340CBSMsg.SVC_CHRG_ENDYMD, JCCBPCommon.getOpeDate(null));
				kk0341_a010_map.put(EKK0341C340CBSMsg.PNLTY_HASSEI_CD, null);
				kk0341_a010_map.put(JKKAdchgMapperCC.UPD_DT_KKTK_SVC_KEI_UPD_DTM_BEF, lastUpdDtm);

				reqMap = mapper.setEKK0341C340(param, fixedText, kk0341_a010_map);
				resMap = scCall.run(reqMap, handle);
				HashMap<String, Object> kk0341_c340_map = mapper.getEKK0341C340(param, fixedText, resMap);
				mapper.scResultCheck(param);

				lastUpdDtm = (String) kk0341_c340_map.get(EKK0341C340CBSMsg.UPD_DTM);
				kk0341_a010_map.put(EKK0341C350CBSMsg.UPD_DTM_BF, lastUpdDtm);
// ▽▽▽ ANK-3221-00-00 ADD START
				// 更新年月日時分秒の設定項目誤り。正しくはこのキーに登録する。
				kk0341_a010_map.put(JKKAdchgMapperCC.UPD_DT_KKTK_SVC_KEI_UPD_DTM_BEF, lastUpdDtm);
// △△△ ANK-3221-00-00 ADD END
				// 機器提供サービス契約解約確定呼び出し
				reqMap = mapper.setEKK0341C350(param, fixedText, kk0341_a010_map);
				resMap = scCall.run(reqMap, handle);
				mapper.getEKK0341C350(param, fixedText, resMap);
				mapper.scResultCheck(param);
			}
			// 上記以外は後続処理で論理削除
		}
	}
	
// OM-2013-0005374対応 20140103 星野 ADD END

// ANK-1578-00-00 2014.01.27 T.TORIKAI メソッド追加（IT1-2014-0000047）
	/**
	 * キャンセル対象機器か判定
	 * @param paramMap
	 * @param kktkSvcKeiNo
	 * @return
	 */
	private boolean isCancelTgKktkSvcKeiNo(HashMap<String, Object> paramMap, String kktkSvcKeiNo) {

		// キャンセル対象機器リストが未設定の場合は全て対象
		ArrayList<HashMap<String, String>> cancelKikiList = (ArrayList<HashMap<String, String>>)paramMap.get("cancel_kiki_list");
		if (cancelKikiList == null || cancelKikiList.isEmpty()) {
			return true;	// 全てキャンセル対象
		}

		// キャンセル対象機器リストの聞き提供サービス契約番号に一致する場合のみ対象
		for (HashMap<String, String> cancelKikiMap : cancelKikiList) {
			String cancelKktkSvcKeiNo = cancelKikiMap.get("kktk_svc_kei_no");
			if (kktkSvcKeiNo.equals(cancelKktkSvcKeiNo)) {
				return true;	// 指定された機器なのでキャンセル対象
			}
		}

		// キャンセル対象外
		return false;
	}

}