/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKGetSvcTokkiCC
*   ソースファイル名：JKKGetSvcTokkiCC.java
*   作成者          ：富士通
*   日付            ：2011年06月13日
*＜機能概要＞
*   特記照会部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/10/20   FJ）山川    新規作成
*   v1.00.00    2012/03/14   FJ) 長野    UI残765,784対応
*   v4.00.00    2012/11/28   FJ）松川    【ANK-1247-00-00】工事依頼情報_連絡事項桁数対応
*   v4.01.00    2012/12/05   FJ）岡野    【IT1-2012-0002309】特記照会項目取得方法の変更
*   v4.02.00    2012/12/25   FJ）松田    【KAD-2012-0001108】書面での受付番号の申込イメージの紐付けについて
*   v4.03.00    2013/01/18   FJ）中山    【ST1-2013-0000146】バリューコードの登録処理の修正
*   v4.04.00    2013/01/22   FJ）渡邉    【ST1-2013-0000149】バリューコードの照会処理の修正
*   v5.00.00    2013/01/15   FJ）松田    【KAD-2012-0001108】書面での受付番号の申込イメージの紐付けについて
*   v5.01.00    2013/02/07   FJ) 中山    【ST2-2013-0000666】DB照会データがNULLの場合の空文字列変換
*   v5.02.00    2013/09/20   FJ) 中山    【OM-2013-0002313】キューBOXの量販店代理受付対応
*   v10.00.00   2014/07/23   FJ) 中山    【ANK-2137-00-00】提携住宅会社用WEB受付画面配置
*   v73.00.00	2024/10/23   FJ) 舘山    【ANK-4427-00-00】NNT卸対応
**********************************************************************/
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.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.ICommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.common.constant.JKKStrConst;
import eo.ejb.cbs.cbsmsg.EKK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0061A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0061A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0071B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0071B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0271A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0271A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2441B003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2441B003CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2451B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2451B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKU0071B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0071B010CBSMsg1List;



/**
 * 特記の照会を行います。
 * <br>
 * @author 富士通
 */
public class JKKGetSvcTokkiCC extends AbstractCommonComponent implements ICommonComponent
{
	/** ネットのサービス契約番号を取得するキー */
	private static final String MAP_KEY_SVC_KEI_NO_NET = "MapKeySvcKeiNoNet";
	/** 電話のサービス契約番号を取得するキー */
	private static final String MAP_KEY_SVC_KEI_NO_TEL = "MapKeySvcKeiNoTel";

	/**
	 * 特記照会処理
	 * <br />
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccName ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite getSvcKeiTokki(SessionHandle handle, IRequestParameterReadWrite param, String ccName) throws Throwable
	{
		Map<String, Object> ccParam = (Map<String, Object>)param.getData(ccName);
		if (ccParam == null)
		{
			return param;
		}

		// エラーフラグ(実行判定用)
		String errFlgCc = "0";

		// 作業用変数の初期化
		Map<?, ?> result = null;
		Map mskmDtlNoAll = new HashMap();

		// データ返却用のマップオブジェクト
		Map userMap = new HashMap();

		// 運用日付
		String opeDate = (String)ccParam.get("ope_date");
		
		// 照査種別
		String shosaSbt = (String)ccParam.get("shosa_sbt");
		
		// サービス契約番号
		String svcKeiNo = (String)ccParam.get("svc_kei_no");

		// ワークエリアからサービス契約情報を取得する
		Map svcKeiMap = getSvcKeiMap(param, mskmDtlNoAll);
		
		if (svcKeiMap == null)
		{
			// サービス契約情報が存在しなければ、処理終了
			return param;
		}

		// 申込番号の取得
		String mskmNo = (String)svcKeiMap.get("mskm_no");
		
		/****************************************************/
		/** 申込一意照会                                    */
		/****************************************************/
		result = callGetMskmListSc(handle, param, mskmNo);
		if (JKKBpCommon.isSuccess(result)) 
		{
			String listNamePre = EKK0011A010CBSMsg.EKK0011A010CBSMSG1LIST + "[0].";

			// 電話連絡希望日種別コード
			setDataMap(userMap, "tel_rrk_kibod_sbt_cd", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.TEL_RRK_KIBOD_SBT_CD));
			// 電話連絡希望時間帯コード
			setDataMap(userMap, "tel_rrk_kibo_time_cd", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.TEL_RRK_KIBO_TIME_CD));
			// 宅内調査希望日種別コード
			setDataMap(userMap, "takcho_kibod_sbt_cd", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.TAKCHO_KIBOD_SBT_CD));
			// 利用サービス継続種別コード
			setDataMap(userMap, "use_svc_keizk_sbt_cd", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.USE_SVC_KEIZK_SBT_CD));
			// 照査前連絡事項要否
			setDataMap(userMap, "shosa_bf_rrk_jiko_yh", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.SHOSA_BF_RRK_JIKO_YH));
			// 照査前連絡事項
			setDataMap(userMap, "shosa_bf_rrk_jiko", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.SHOSA_BF_RRK_JIKO));
			// 更新年月日時分秒
			setDataMap(userMap, "kk0011_upd_dtm", JKKBpCommon.getResultString(result, listNamePre + EKK0011A010CBSMsg1List.UPD_DTM));
			// 代理店申込取次有無
			setDataMap(userMap, "agnt_mskm_trtg_um", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.AGNT_MSKM_TRTG_UM));
			// 工事依頼情報連絡事項
			setDataMap(userMap, "koji_req_info_rrk_jiko", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.KOJI_REQ_INFO_RRK_JIKO));
			// 総合営業申込契機コード
			setDataMap(userMap, "ttl_business_mskm_opt_cd", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.TTL_BUSINESS_MSKM_OPT_CD));
			// 提携住宅会社コード
			setDataMap(userMap, "tkjcp_cd", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.TKJCP_CD));
			// 提携住宅会社名
			setDataMap(userMap, "tkjcp_nm", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.TKJCP_NM));
			// 提携住宅会社支店・営業所名
			setDataMap(userMap, "tkjcp_stnegs_nm", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.TKJCP_STNEGS_NM));
			// 提携住宅会社担当者名
			setDataMap(userMap, "tkjcptts_nm", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.TKJCPTTS_NM));
			// 提携住宅会社担当者職種名
			setDataMap(userMap, "tkjcptts_shksnm", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.TKJCPTTS_SHKSNM));
			// 提携住宅会社担当者電話番号
			setDataMap(userMap, "tkjcptts_tln", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.TKJCPTTS_TLN));
			// 分譲地名
			setDataMap(userMap, "bunjochi_nm", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.BUNJOCHI_NM));
			// 分譲地区画番号メモ
			setDataMap(userMap, "bunjochi_kkk_no_memo", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.BUNJOCHI_KKK_NO_MEMO));
			// 入居予定時期
			setDataMap(userMap, "nyukyo_rsv_jk", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.NYUKYO_RSV_JK));
// ANK-4427-00-00 ADD START
			// 移転元サービス契約番号
			setDataMap(userMap, "itenm_svc_kei_no", JKKBpCommon.getResultString(result, listNamePre
					+ EKK0011A010CBSMsg1List.ITENM_SVC_KEI_NO));
// ANK-4427-00-00 ADD END
		}
		else
		{
			errFlgCc = "1";
			JKKBpCommon.setResultCtrlData(param, result);
		}
		
		/****************************************************/
		/** 申込＿代理店一覧照会                            */
		/****************************************************/
		ArrayList<String> dspJunList = new ArrayList<String>();
		CAANMsg[] agntList = null;
		result = callmskmAgntSc(handle, param, mskmNo);
		if (JKKBpCommon.isSuccess(result))
		{
			
			agntList = JKKBpCommon.getResultMsgList(result, EKK0071B002CBSMsg.EKK0071B002CBSMSG1LIST);
			String dspJun = "";
			for (int i = 0; i < agntList.length; i++)
			{
				String listNamePre = EKK0071B002CBSMsg.EKK0071B002CBSMSG1LIST + "[" + i + "].";
				// 表示順
				dspJun = JKKBpCommon.getResultString(result, listNamePre + EKK0071B002CBSMsg1List.DSP_JUN);
				// 代理店コード
				setDataMap(userMap, "agnt_cd" + dspJun, JKKBpCommon.getResultString(result, listNamePre + EKK0071B002CBSMsg1List.AGNT_CD));
				// 更新年月日
				setDataMap(userMap, "upd_dtm" + dspJun, JKKBpCommon.getResultString(result, listNamePre + EKK0071B002CBSMsg1List.UPD_DTM));
				
				// 代理店を検索するため表示順を退避する
				dspJunList.add(dspJun);
			}
		}
		else
		{
			errFlgCc = "1";
			JKKBpCommon.setResultCtrlData(param, result);
		}
		
		/****************************************************/
		/** 代理店一意照会                                  */
		/****************************************************/
		for(String dspJun : dspJunList)
		{
			result = callAgntSc(handle, param, (String)userMap.get("agnt_cd" + dspJun), opeDate);
			if (JKKBpCommon.isSuccess(result)) 
			{
				String listNamePre = EKK0061A010CBSMsg.EKK0061A010CBSMSG1LIST + "[0].";
				// 代理店名
				setDataMap(userMap, "agnt_nm" + dspJun, JKKBpCommon.getResultString(result, listNamePre + EKK0061A010CBSMsg1List.AGNT_NM));
			} 
			else 
			{
				errFlgCc = "1";
				JKKBpCommon.setResultCtrlData(param, result);
			}
		}

		/**************************************************************/
		/** 面開発案件番号・変更元法人eo読替サービス契約番号を取得    */
		/**************************************************************/
		String menkaihatAnkenNo = "";
		String ykaeSvkeiNo = "";
		ArrayList svkeiTokkiUseInfoList = new ArrayList();
		HashMap svkeiTokkiUseInfoNetMap = null;
		HashMap svkeiTokkiUseInfoTelMap = null;
		HashMap svkeiTokkiUseInfoTvMap = null;
		HashMap svkeiTokkiUseInfoMap = null;
		
		// eo光ネット・eo光電話・eo光テレビのサービス契約の照会結果を取得
		svkeiTokkiUseInfoNetMap = (HashMap)JKKBpCommon.getWkSvkeiTokkiUseInfoNet(param);
		svkeiTokkiUseInfoTelMap = (HashMap)JKKBpCommon.getWkSvkeiTokkiUseInfoTel(param);
		svkeiTokkiUseInfoTvMap = (HashMap)JKKBpCommon.getWkSvkeiTokkiUseInfoTv(param);
		
		// 照査種別が個別照査の場合
		if(JKKStrConst.SHOSA_SBT_KBT.equals(shosaSbt))
		{
			// サービス確定フラグ
			boolean svkeiFixFlg = false;
			
			// eo光ネットの結果が存在する場合かつサービス確定フラグがfalseの場合
			if(svkeiTokkiUseInfoNetMap != null)
			{
				// 画面連携されたサービス契約番号とeo光ネットのサービス契約番号が同じ場合
				if(svcKeiNo.equals(svkeiTokkiUseInfoNetMap.get("kk0081_svc_kei_no")))
				{
					svkeiTokkiUseInfoMap = svkeiTokkiUseInfoNetMap;
					svkeiFixFlg = true;
					
					// 変更元法人eo読替サービス契約番号
					ykaeSvkeiNo = (String)svkeiTokkiUseInfoMap.get("kk0081_chmt_hjin_eo_ykae_svkei_no");
				}
			}
			
			// eo光電話の結果が存在する場合かつサービス確定フラグがfalseの場合
			if(svkeiTokkiUseInfoTelMap != null && !svkeiFixFlg)
			{
				// 画面連携されたサービス契約番号とeo光電話のサービス契約番号が同じ場合
				if(svcKeiNo.equals(svkeiTokkiUseInfoTelMap.get("kk0081_svc_kei_no")))
				{
					svkeiTokkiUseInfoMap = svkeiTokkiUseInfoTelMap;
					svkeiFixFlg = true;
				}
			}
			
			// eo光テレビの結果が存在する場合かつサービス確定フラグがfalseの場合
			if(svkeiTokkiUseInfoTvMap != null && !svkeiFixFlg)
			{
				// 画面連携されたサービス契約番号とeo光テレビのサービス契約番号が同じ場合
				if(svcKeiNo.equals(svkeiTokkiUseInfoTvMap.get("kk0081_svc_kei_no")))
				{
					svkeiTokkiUseInfoMap = svkeiTokkiUseInfoTvMap;
					svkeiFixFlg = true;
				}
			}
		}
		else
		{
			// eo光ネットの結果が存在する場合、サービス契約照会結果リストに追加
			if(svkeiTokkiUseInfoNetMap != null)
			{
				svkeiTokkiUseInfoList.add(svkeiTokkiUseInfoNetMap);
				
				// 変更元法人eo読替サービス契約番号
				ykaeSvkeiNo = (String)svkeiTokkiUseInfoNetMap.get("kk0081_chmt_hjin_eo_ykae_svkei_no");
			}
			
			// eo光電話の結果が存在する場合、サービス契約照会結果リストに追加
			if(svkeiTokkiUseInfoTelMap != null)
			{
				svkeiTokkiUseInfoList.add(svkeiTokkiUseInfoTelMap);
			}
			
			// eo光テレビの結果が存在する場合、サービス契約照会結果リストに追加
			if(svkeiTokkiUseInfoTvMap != null)
			{
				svkeiTokkiUseInfoList.add(svkeiTokkiUseInfoTvMap);
			}
			
			if(svkeiTokkiUseInfoList.size() > 0)
			{
				// サービス契約照会結果リストを更新年月日時分秒の降順でソート
				Collections.sort(svkeiTokkiUseInfoList, new Comparator<Map<String, Object>>()
				{
					
					/**
					 * サービス契約照会結果リストの更新年月日時分秒を比較
					 * @param svkeiTokkiUseInfoAdslMap1
					 * @param svkeiTokkiUseInfoAdslMap2
					 * @return 更新年月日時分秒の比較結果
					 */
					public int compare(Map<String, Object> svkeiTokkiUseInfoAdslMap1, Map<String, Object> svkeiTokkiUseInfoAdslMap2)
					{
						String lastUpdDtm1 = (String)svkeiTokkiUseInfoAdslMap1.get("kk0081_upd_dtm");
						String lastUpdDtm2 = (String)svkeiTokkiUseInfoAdslMap2.get("kk0081_upd_dtm");
						return lastUpdDtm2.compareTo(lastUpdDtm1);
					}
				});
				
				// ソート結果の先頭をマップに設定
				svkeiTokkiUseInfoMap = (HashMap)svkeiTokkiUseInfoList.get(0);
			}
		}
		
		// サービス契約照会結果がnull以外の場合
		if(svkeiTokkiUseInfoMap != null)
		{
			menkaihatAnkenNo = (String)svkeiTokkiUseInfoMap.get("menkaihat_anken_no");
			setDataMap(userMap, "menkaihat_anken_no", menkaihatAnkenNo);
			String updDtm = (String)svkeiTokkiUseInfoMap.get("kk0081_upd_dtm");
			setDataMap(userMap, "kk0081_upd_dtm", updDtm);
		}
		else
		{
			menkaihatAnkenNo = "";
			userMap.put("menkaihat_anken_no", menkaihatAnkenNo);
			String updDtm = "";
			userMap.put("kk0081_upd_dtm", updDtm);
		}
		
		// 変更元法人eo読替サービス契約番号
		setDataMap(userMap, "chmt_hjin_eo_ykae_svkei_no", ykaeSvkeiNo);
		
		/****************************************************/
		/** 面開発案件一意照会                              */
		/****************************************************/
		if (!isNullOrBlank(menkaihatAnkenNo))
		{
			result = callGetMenkaihatAnkenSc(handle, param, menkaihatAnkenNo);
			if (JKKBpCommon.isSuccess(result))
			{
				String listItemName = EKK0271A010CBSMsg.EKK0271A010CBSMSG1LIST + "[0]." + EKK0271A010CBSMsg1List.ANKEN_NM;
				
				// 案件名
				setDataMap(userMap, "anken_nm", JKKBpCommon.getResultString(result, listItemName));

				// 面開発案件住所手動入力フラグ
				setDataMap(userMap, "mnkhtank_ad_man_input_flg", JKKBpCommon.getResultString(result,
						EKK0271A010CBSMsg.EKK0271A010CBSMSG1LIST + "[0]." + EKK0271A010CBSMsg1List.MNKHTANK_AD_MAN_INPUT_FLG));
				
				// 面開発案件住所手動入力フラグ名称
				setDataMap(userMap, "mnkhtank_ad_man_input_flg_nm", 
						JKKBpCommon.getResultString(result, EKK0271A010CBSMsg.EKK0271A010CBSMSG1LIST + "[0]." + EKK0271A010CBSMsg1List.MNKHTANK_AD_MAN_INPUT_FLG_NM));
			}
			else
			{
				errFlgCc = "1";
				JKKBpCommon.setResultCtrlData(param, result);
			}
		}
		
		/****************************************************/
		/** 顧客名取得                                      */
		/****************************************************/
		if (!isNullOrBlank(ykaeSvkeiNo))
		{
			result = callGetHjinSvkeiSc(handle, param, ykaeSvkeiNo);
			
			if (JKKBpCommon.isSuccess(result))
			{
				String listItemName = EKU0071B010CBSMsg.EKU0071B010CBSMSG1LIST + "[0]." + EKU0071B010CBSMsg1List.CUST_NM;
				
				// お客様名
				setDataMap(userMap, "cust_nm", JKKBpCommon.getResultString(result, listItemName));
			}
			else
			{
				errFlgCc = "1";
				JKKBpCommon.setResultCtrlData(param, result);
			}
		}

		// 既契約サービス有無フラグを設定
		String svcKeiNoNet = "";
		String svcKeiNoTel = "";
		HashMap svcKeiNoMap = setKiKeiSvc(param, userMap, ccName);
		if (svcKeiNoMap != null)
		{
			if (svcKeiNoMap.containsKey(MAP_KEY_SVC_KEI_NO_NET))
			{
				svcKeiNoNet = (String)svcKeiNoMap.get(MAP_KEY_SVC_KEI_NO_NET);
			}
			if (svcKeiNoMap.containsKey(MAP_KEY_SVC_KEI_NO_TEL))
			{
				svcKeiNoTel = (String)svcKeiNoMap.get(MAP_KEY_SVC_KEI_NO_TEL);
			}
		}
		
		if(getSmtvlFlg(param, svcKeiNoNet, svcKeiNoTel))
		{
			String svcKeiNoNetOrTel = svcKeiNoNet;
			// サービス契約番号(ネット)が存在しない場合、サービス契約番号(電話)を設定する
			if(isNullOrBlank(svcKeiNoNetOrTel))
			{
				svcKeiNoNetOrTel = svcKeiNoTel;
			}
			
			/****************************************************/
			/** 他事業者割引契約番号取得                        */
			/****************************************************/
			if(!isNullOrBlank(svcKeiNoNetOrTel))
			{
				result = callGetTajgsWribKeiSc(handle, param, svcKeiNoNetOrTel);
				if (!JKKBpCommon.isSuccess(result))
				{
					errFlgCc = "1";
					JKKBpCommon.setResultCtrlData(param, result);
				}
				else
				{
					// バリューコード
					String kddiValCd = JKKBpCommon.getResultString(result, EKK2441B003CBSMsg.EKK2441B003CBSMSG1LIST + "[0]." + EKK2441B003CBSMsg1List.KDDI_VAL_CD);
					setDataMap(userMap, "kddi_val_cd", kddiValCd);
					// 事業者契約管理番号
					String kddiJgsKeiKanriNo = JKKBpCommon.getResultString(result, 
							EKK2441B003CBSMsg.EKK2441B003CBSMSG1LIST + "[0]." + EKK2441B003CBSMsg1List.KDDI_JGS_KEI_KANRI_NO);
					setDataMap(userMap, "kddi_jgs_kei_kanri_no", kddiJgsKeiKanriNo);
					// 他事業者割引契約番号
					String tajgsWribKeiNo = JKKBpCommon.getResultString(result, 
							EKK2441B003CBSMsg.EKK2441B003CBSMSG1LIST + "[0]." + EKK2441B003CBSMsg1List.TAJGS_WRIB_KEI_NO);
					setDataMap(userMap, "tajgs_wrib_kei_no", tajgsWribKeiNo);
					// 他事業者契約番号が存在しない場合、何もしない
					if(!isNullOrBlank(tajgsWribKeiNo))
					{
						/****************************************************/
						/** 他事業者割引契約対象契約一覧照会                */
						/****************************************************/
						result = callGetTajgsWribKeiTrgSc(handle, param, tajgsWribKeiNo);
						if (JKKBpCommon.isSuccess(result))
						{
							String lastUpdDtm = JKKBpCommon.getResultString(result, 
									EKK2451B001CBSMsg.EKK2451B001CBSMSG1LIST + "[0]." + EKK2451B001CBSMsg1List.LAST_UPD_DTM);
							// 最終更新年月日時分秒
							setDataMap(userMap, "last_upd_dtm", lastUpdDtm);
						}
						else
						{
							errFlgCc = "1";
							JKKBpCommon.setResultCtrlData(param, result);
						}
					}
				}
			}
		}

		/***************************************************/
		/** 下りデータマッピング処理開始                   */
		/***************************************************/
		JKKBpCommon.setResultUserData(param, ccName, userMap);
		if ("0".equals(errFlgCc)) 
		{
			JKKBpCommon.setResultCtrlData(param, result, ccName, 0, 0);
		} 
		else 
		{
			String errMsg = "特記照会CCで例外が発生しました";
			throw new CCException(errMsg, new Exception(errMsg));
		}
		
		return param;
	}

	/**
	 * 申込一意照会SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param mskmNo 申込番号
	 * @return 実行結果
	 * @throws Throwable
	 */
	private Map<?, ?> callGetMskmListSc(SessionHandle handle,
			IRequestParameterReadWrite param, String mskmNo)
			throws Throwable 
	{

		/**************************************************************************/
		/** 申込一意照会SCへの上りマッピング                                      */
		/**************************************************************************/
		String funcCd = "2";
		Map<Object, Object> inMap = new HashMap<Object, Object>();
		inMap.put(EKK0011A010CBSMsg.KEY_MSKM_NO, mskmNo);
		HashMap<String, Object> paramMap = JKKBpCommon.createScParamForSearch(param, "EKK0011A010", EKK0011A010CBSMsg.class , inMap, funcCd);

		/**************************************************************************/
		/** ＳＣ呼出実行                                                          */
		/**************************************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		JKKBpCommon.printBpDebugLog(this.getClass(), "申込一意照会SC呼び出し開始（ 申込番号：" + mskmNo + " ）");
		Map<?, ?> result = scCall.run(paramMap, handle);
		JKKBpCommon.printBpDebugLog(this.getClass(), "申込一意照会SC呼び出し完了" + result);

		return result;
	}
	
	/**
	 * 申込＿代理店一意照会SC呼出SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param mskmNo 申込番号
	 * @return Map<?, ?> 実行結果
	 * @throws Throwable
	 */
	private Map<?, ?> callmskmAgntSc(SessionHandle handle,
			IRequestParameterReadWrite param, String mskmNo)
			throws Throwable
	{

		/**************************************************************************/
		/** 申込＿代理店一覧照会SCへの上りマッピング                              */
		/**************************************************************************/
		String funcCd = "1";
		String mkFlg = "0";
		Map<Object, Object> inMap = new HashMap<Object, Object>();
		inMap.put(EKK0071B002CBSMsg.KEY_MSKM_NO, mskmNo);
		inMap.put(EKK0071B002CBSMsg.KEY_MK_FLG, mkFlg);
		HashMap<String, Object> paramMap = JKKBpCommon.createScParamForSearch(param, "EKK0071B002", EKK0071B002CBSMsg.class , inMap, funcCd);

		/**************************************************************************/
		/** ＳＣ呼出実行                                                          */
		/**************************************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		JKKBpCommon.printBpDebugLog(this.getClass(), "申込＿代理店一覧照会SC呼び出し開始（申込番号：" + mskmNo + " ）");
		Map<?, ?> result = scCall.run(paramMap, handle);
		JKKBpCommon.printBpDebugLog(this.getClass(), "申込＿代理店一覧照会SC呼び出し完了" + result);

		return result;
	}
	
	/**
	 * 代理店一意照会SC呼出SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param agntCd 代理店コード
	 * @param opeDate システム日付
	 * @return Map<?, ?> 実行結果
	 * @throws Throwable
	 */
	private Map<?, ?> callAgntSc(SessionHandle handle,
			IRequestParameterReadWrite param, String agntCd, String opeDate)
			throws Throwable 
	{

		/**************************************************************************/
		/** 代理店一意照会SCへの上りマッピング                                    */
		/**************************************************************************/
		String funcCd = "2";
		Map<Object, Object> inMap = new HashMap<Object, Object>();
		inMap.put(EKK0061A010CBSMsg.KEY_RSV_APLY_YMD, opeDate);
		inMap.put(EKK0061A010CBSMsg.KEY_AGNT_CD, agntCd);
		HashMap<String, Object> paramMap = JKKBpCommon.createScParamForSearch(param, "EKK0061A010", EKK0061A010CBSMsg.class , inMap, funcCd);

		/**************************************************************************/
		/** ＳＣ呼出実行                                                          */
		/**************************************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		JKKBpCommon.printBpDebugLog(this.getClass(), "代理店一意照会SC呼び出し開始（代理店コード：" + agntCd + " ）");
		Map<?, ?> result = scCall.run(paramMap, handle);
		JKKBpCommon.printBpDebugLog(this.getClass(), "代理店一意照会SC呼び出し完了" + result);

		return result;
	}

	/**
	 * 法人サービス契約_工事案件一覧照会呼出SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ykaeSvkeiNo 変更元法人eo読替サービス契約番号
	 * @return Map<?, ?> メッセージリスト
	 * @throws Throwable
	 */
	private Map<?, ?> callGetHjinSvkeiSc(SessionHandle handle,
			IRequestParameterReadWrite param, String ykaeSvkeiNo)
			throws Throwable 
	{
		/**************************************************************************/
		/** 法人サービス契約_工事案件一覧照会SCへの上りマッピング                 */
		/**************************************************************************/
		String funcCd = "1";
		Map<Object, Object> inMap = new HashMap<Object, Object>();
		inMap.put(EKU0071B010CBSMsg.KEY_HJIN_EO_YKAE_SVKEI_NO, ykaeSvkeiNo);
		HashMap<String, Object> paramMap = JKKBpCommon.createScParamForSearch(param, "EKU0071B010", EKU0071B010CBSMsg.class , inMap, funcCd);

		/**************************************************************************/
		/** ＳＣ呼出実行                                                          */
		/**************************************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		JKKBpCommon.printBpDebugLog(this.getClass(), "法人サービス契約_工事案件一覧照会SC呼び出し開始（法人eo読替サービス契約番号：" + ykaeSvkeiNo + " ）");
		Map<?, ?> result = scCall.run(paramMap, handle);
		JKKBpCommon.printBpDebugLog(this.getClass(), "法人サービス契約_工事案件一覧照会SC呼び出し完了" + result);

		return result;
	}

	/**
	 * 面開発案件一意照会SC呼出SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param menkaihatAnkenNo 面開発案件番号
	 * @return Map<?, ?> メッセージリスト
	 * @throws Throwable
	 */
	private Map<?, ?> callGetMenkaihatAnkenSc(SessionHandle handle,
			IRequestParameterReadWrite param, String menkaihatAnkenNo)
			throws Throwable 
	{

		/**************************************************************************/
		/** 面開発案件一意照会SCへの上りマッピング                                */
		/**************************************************************************/
		String funcCd = "1";
		Map<Object, Object> inMap = new HashMap<Object, Object>();
		inMap.put(EKK0271A010CBSMsg.KEY_MENKAIHAT_ANKEN_NO, menkaihatAnkenNo);
		HashMap<String, Object> paramMap = JKKBpCommon.createScParamForSearch(param, "EKK0271A010", EKK0271A010CBSMsg.class , inMap, funcCd);

		/**************************************************************************/
		/** ＳＣ呼出実行                                                          */
		/**************************************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		JKKBpCommon.printBpDebugLog(this.getClass(), "面開発案件一意照会SC呼び出し開始（面開発案件番号：" + menkaihatAnkenNo + " ）");
		Map<?, ?> result = scCall.run(paramMap, handle);
		JKKBpCommon.printBpDebugLog(this.getClass(), "面開発案件一意照会SC呼び出し完了" + result);

		return result;
	}
	
	/**
	 * 他事業者割引契約一覧照会(サービス契約番号)呼出SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param svcKeiNo サービス契約番号 
	 * @return Map<?, ?> メッセージリスト
	 * @throws Throwable
	 */
	private Map<?, ?> callGetTajgsWribKeiSc(SessionHandle handle,
			IRequestParameterReadWrite param, String svcKeiNo)
			throws Throwable 
	{

		/**************************************************************************/
		/** 他事業者割引契約一覧照会(サービス契約番号)SCへの上りマッピング        */
		/**************************************************************************/
		String funcCd = "1";
		Map<Object, Object> inMap = new HashMap<Object, Object>();
		inMap.put(EKK2441B003CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
		HashMap<String, Object> paramMap = JKKBpCommon.createScParamForSearch(param, "EKK2441B003", EKK2441B003CBSMsg.class , inMap, funcCd);

		/**************************************************************************/
		/** ＳＣ呼出実行                                                          */
		/**************************************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		JKKBpCommon.printBpDebugLog(this.getClass(), "他事業者割引契約一覧照会(サービス契約番号)SC呼び出し開始（サービス契約番号：" + svcKeiNo + " ）");
		Map<?, ?> result = scCall.run(paramMap, handle);
		JKKBpCommon.printBpDebugLog(this.getClass(), "他事業者割引契約一覧照会(サービス契約番号)SC呼び出し完了" + result);

		return result;
	}

	/**
	 * 他事業者割引契約対象契約一覧照会呼出SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param tajgsWribKeiNo サービス契約番号 
	 * @return Map<?, ?> メッセージリスト
	 * @throws Throwable
	 */
	private Map<?, ?> callGetTajgsWribKeiTrgSc(SessionHandle handle,
			IRequestParameterReadWrite param, String tajgsWribKeiNo)
			throws Throwable 
	{

		/**************************************************************************/
		/** 他事業者割引契約一覧照会(サービス契約番号)SCへの上りマッピング        */
		/**************************************************************************/
		String funcCd = "1";
		Map<Object, Object> inMap = new HashMap<Object, Object>();
		inMap.put(EKK2451B001CBSMsg.KEY_TAJGS_WRIB_KEI_NO, tajgsWribKeiNo);
		HashMap<String, Object> paramMap = JKKBpCommon.createScParamForSearch(param, "EKK2451B001", EKK2451B001CBSMsg.class , inMap, funcCd);

		/**************************************************************************/
		/** ＳＣ呼出実行                                                          */
		/**************************************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		JKKBpCommon.printBpDebugLog(this.getClass(), "他事業者割引契約対象契約一覧照会SC呼び出し開始（他事業者割引契約番号：" + tajgsWribKeiNo + " ）");
		Map<?, ?> result = scCall.run(paramMap, handle);
		JKKBpCommon.printBpDebugLog(this.getClass(), "他事業者割引契約対象契約一覧照会SC呼び出し完了" + result);

		return result;
	}

	/**
	 * スマートバリュー情報を取得するかを判定します。
	 * @param param リクエストパラメータ
	 * @param svcKeiNoNet サービス契約番号(ネット)
	 * @param svcKeiNoTel サービス契約番号(テレビ)
	 * @return boolean 判定結果
	 * @throws RequestParameterException 
	 */
	private boolean getSmtvlFlg(IRequestParameterReadWrite param, String svcKeiNoNet, String svcKeiNoTel) throws RequestParameterException
	{
		// ネットサービス有無
		boolean netUmFlg = !isNullOrBlank(svcKeiNoNet);
		// 電話サービス有無
		boolean telUmFlg = !isNullOrBlank(svcKeiNoTel);
		// 既契約＿ネットサービス有無
		boolean kiNetUmFlg = JKKBpCommon.getWkKiNetUmFlg(param);
		// 既契約＿電話サービス有無
		boolean kiTelUmFlg = JKKBpCommon.getWkKiTelUmFlg(param);

		return (netUmFlg || kiNetUmFlg) && (telUmFlg || kiTelUmFlg) && !(kiNetUmFlg && kiTelUmFlg);
	}
	
	/**
	 * 既契約サービスを設定します。
	 * @param param リクエストパラメータ
	 * @param userMap ユーザーデータマップ
	 * @param ccName ユーザー固定文字列
	 * @return HashMap サービス契約番号マップ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private HashMap setKiKeiSvc(IRequestParameterReadWrite param, Map userMap, String ccName) throws RequestParameterException
	{
		Map mskmDtlNoAll = new HashMap();
		
		Map svcKeiMap = getSvcKeiMap(param, mskmDtlNoAll);
		
		// サービス契約情報から申込番号を取得
		String mskmNoSvcKei = (String)svcKeiMap.get("mskm_no") == null ? "": (String)svcKeiMap.get("mskm_no");
		
		HashMap parentMap = (HashMap)param.getData("KKSV007905SC");
		
		if (null == parentMap)
		{
			parentMap = (HashMap)param.getData("KKSV008103SC");
		}
		
		if (null == parentMap)
		{
			return null;
		}
		
		// 同一利用場所サービス契約を取得
		ArrayList<HashMap<String, Object>> ekk0081b011cbsmsg1List = (ArrayList<HashMap<String, Object>>)parentMap.get("EKK0081B011CBSMsg1List");
		
		if (null == ekk0081b011cbsmsg1List)
		{
			return null;
		}

		HashMap svcKeiNoMap = new HashMap();
		if (ekk0081b011cbsmsg1List != null)
		{
			// 申込新規登録、照査前登録の対象とならないサービス契約(既契約情報)を特定し、既契約サービス有無を設定する
			for (HashMap<String, Object> sameUepcadSvcKeiMap : ekk0081b011cbsmsg1List)
			{
				String svcKeiStat = (String)sameUepcadSvcKeiMap.get("svc_kei_stat");
				if (JKKStrConst.CD00037_DSL_ZM.compareTo(svcKeiStat) <= 0)
				{
					continue;
				}

				// 申込番号
				String mskmNo = (String)sameUepcadSvcKeiMap.get("mskm_no"); 
				// 料金グループコード
				String prcGrpCd = (String)sameUepcadSvcKeiMap.get("prc_grp_cd");
				
				// 解約済のサービス契約は使用しない
				if (JKKStrConst.CD00037_DSL_ZM.equals((String)sameUepcadSvcKeiMap.get("svc_kei_stat")))
				{
					continue;
				}
				
				// 登録対象の申込番号と既契約情報より取得した申込番号が一致した場合
				if (mskmNoSvcKei.equals(mskmNo))
				{
					// ネット・電話のサービス契約番号を設定する
					if (JKKCtrlyUtil.getNetSvcJdg(prcGrpCd))
					{
						svcKeiNoMap.put(MAP_KEY_SVC_KEI_NO_NET, sameUepcadSvcKeiMap.get("svc_kei_no"));
					}
					else if (JKKCtrlyUtil.getTelSvcJdg(prcGrpCd))
					{
						svcKeiNoMap.put(MAP_KEY_SVC_KEI_NO_TEL, sameUepcadSvcKeiMap.get("svc_kei_no"));
					}
				}
				else
				{
					// 既契約サービス有無を設定する
					JKKBpCommon.setWkKiNetUmFlg(param, JKKCtrlyUtil.getNetSvcJdg(prcGrpCd));
					JKKBpCommon.setWkKiTelUmFlg(param, JKKCtrlyUtil.getTelSvcJdg(prcGrpCd));
					JKKBpCommon.setWkKiTvUmFlg(param, JKKCtrlyUtil.getTvSvcJdg(prcGrpCd));
				}
			}
		}
		
		return svcKeiNoMap;
	}
	
	/**
	 * ワーク領域のサービス契約情報格納マップの取得を行います。
	 * @param param リクエストパラメータ
	 * @param mskmDtlNoAll 申込明細番号マップ
	 * @return Map サービス契約情報マップ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private Map getSvcKeiMap(IRequestParameterReadWrite param, Map mskmDtlNoAll) throws RequestParameterException
	{

		// eoモバイルの契約を格納するリスト
		HashMap svcKeiMap = new HashMap();

		// 作業領域のマップを取得
		Map workMap = param.getMappingWorkArea();
		if (workMap == null)
		{
			return svcKeiMap;
		}

		// 申込サービス契約内訳一覧照会ＣＣの作業領域のマップを取得
		HashMap mskmSvcKeiUcwkWorkMap = (HashMap)workMap.get("JKKGetMskmSvcKeiUcwkListCCWork");
		if (mskmSvcKeiUcwkWorkMap == null)
		{
			return svcKeiMap;
		}

		// 申込明細リストを取得
		ArrayList<HashMap> mskmDtlList = (ArrayList<HashMap>)mskmSvcKeiUcwkWorkMap.get("mskm_dtl_list");
		if (mskmDtlList == null)
		{
			return svcKeiMap;
		}

		svcKeiMap = ((ArrayList<HashMap>)mskmDtlList.get(0).get("svc_kei_list")).get(0);
		//申込番号をマップに追加
		svcKeiMap.put("mskm_no", mskmSvcKeiUcwkWorkMap.get("mskm_no"));
		//申込ステータスをマップに追加
		svcKeiMap.put("mskm_stat", mskmSvcKeiUcwkWorkMap.get("mskm_stat"));
		//コンシューマ営業用申込状態識別コードをマップに追加
		svcKeiMap.put("consmbsn_mskm_stat_skbt_cd", mskmSvcKeiUcwkWorkMap.get("consmbsn_mskm_stat_skbt_cd"));
		//SYSIDをマップに追加
		svcKeiMap.put("sysid", mskmSvcKeiUcwkWorkMap.get("sysid"));
		//申込番号明細番号をマップに追加
		svcKeiMap.put("mskm_dtl_no", mskmDtlList.get(0).get("mskm_dtl_no"));

		return svcKeiMap;
	}

	/**
	 * ＢＰチェック用の入力パラメータを作成する。
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザー固定文字列
	 * @return HashMap
	 */
	@SuppressWarnings("unchecked")
	public HashMap getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	{
		// チェックのみ行うCCの為、BPチェックは行わない(0件のCAANMsg配列を返却)
		HashMap param4BpChek = new HashMap();
		param4BpChek.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{});
		return param4BpChek;
	}

	/**
	 * ＢＰチェック結果を編集する。
	 * <br />
	 * @param param リクエストパラメータ
	 * @param caanMsgs サービスインターフェイス用のパラメータ配列
	 * @param returnCode リターンコード
	 * @return リクエストパラメータ
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] caanMsgs, Integer returnCode)
	{
		// BPチェックを行わない為、チェック結果の編集も不要
		return param;
	}
	
	/**
	 * 文字列がnullもしくは空文字の場合true
	 * 
	 * @param str チェック対象文字列
	 * @return 文字列がnullもしくは空文字の場合true
	 */
	private boolean isNullOrBlank(String str)
	{
		return null == str || "".equals(str);
	}

	/**
	 * ユーザデータ情報に値を設定します。<br>
	 * 　@getValueにデータが存在する場合、dataMapに設定します。<br>
	 * 　A上記以外の場合、空文字を設定します。<br>
	 * @param dataMap 値を設定するユーザデータ情報
	 * @param setKey ユーザデータ情報のキー名
	 * @param getValue メッセージキャリアからの取得値
	 */
	@SuppressWarnings("unchecked")
	private void setDataMap(Map dataMap, String setKey, String getValue)
	{
		if (null == getValue)
		{
			dataMap.put(setKey, "");
		}
		else
		{
			dataMap.put(setKey, getValue);
		}
	}
}
