/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom, 2011
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JKKSameScreenHeaderCC
 *   ソースファイル名：JKKSameScreenHeaderCC.java
 *   作成者          ：富士通
 *   日付            ：2012年11月09日
 *＜機能概要＞
 *   契約管理システム内画面共通ヘッダに表示する情報を取得する
 *   
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2012/11/09   FJ          新規作成
 *   v41.00.00	 2019/02/13	  FJ)杉本	 【ANK-3396-00-00】利用停止スケジュールの変更
 **********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKAdInfChgConstCC;
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.IRequestParameterReadOnly;
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.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.sun.enterprise.tools.common.util.StringUtils;

import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0081B003CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0451B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0411A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0411A010CBSMsg1List;


/**
 * 住所情報更新画面の照会モード時、共通ヘッダ部の表示情報を取得します。
 * 現状、
 *   ・ファミリーパック
 * 　・ルータ種別
 * を取得できます。
 * 
 * @author 富士通
 * @since 2012-11-09 新規（IT1-2012-0001709対応）
 */
public class JKKAdInfChgScreenHeaderCC extends AbstractCommonComponent
{

	private static final String ERR_MSG = "INVALID_RETURN_MESSAGE";

	/** 入力データ：SYSID */
	public static final String IN_SYSID = "sysid";

	/** 入力データ：サービス契約番号 */
	public static final String IN_SVC_KEI_NO = "svc_kei_no";

	/** 入力データ：割引サービスコード*/
	public static final String IN_WRIB_SVC_CD = "wrib_svc_cd";

	/** 出力データ：ファミリーパック有無 */
	public static final String OUT_FAMILY_PACK_UM = "family_pack_um";

	/** 出力データ：ルータ種別 */
	public static final String OUT_ROUTER_SBT_NM = "router_sbt_nm";

	/**  除外するステータスを定義 */
	private static final String[] IGNORE_STATUS = {
								"910",		// 解約済ステータス
								"920",		// キャンセル済ステータス
						};

	/** 入力パラメータ：ＫＥＹ＿宅内機器型式コード */
	private static final String IN_KEY_TAKNKIKI_MODEL_CD = "key_taknkiki_model_cd";

	/** 検索条件：機器提供サービスコード(BBR)  */
	private static final String DEF_KKTK_SVC_CD = "C014";

	/** 割引サービスコード：ファミリーパック */
	private static final String WRIB_SVC_CD_FP_WRIB = "W00000006";

	/** ソート区分 */
	private static final String DEF_SORT_KBN = "1";
	
	/** 検索パラメータ：最大件数 */
	private static final String MAX_DATA_COUNT = "10000";

	/** 検索パラメータ：検索ページ番号 */
	private static final String START_PAGE_NO = "1";

	/** 有 */
	private static final String ARI = "有";

	/** 無 */
	private static final String NASHI = "無";

	/** 機器が存在しない場合のステータス文字 */
	private static final String NOTHING_MGS = "無";

	/** 機器が複数存在する場合のステータス文字 */
	private static final String SOME_ROUTER_MSG = "複数";

	/**
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite runGetSameScreenHeaderInfo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
// ANK-3396-00-00 2019/02/13 ADD START
		HashMap<String, Object> paramMap = (HashMap<String, Object>)param.getData(fixedText);

		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		HashMap inMap = null;

		/* 作業項目情報 */
		if (workMap != null)
		{
			inMap = (HashMap)workMap.get("WORK");
		}
		else
		{
			inMap = null;
		}

		if(paramMap != null)
		{
			// 作業項目リスト.ＫＥＹ＿請求契約番号 → ＫＥＹ＿請求契約番号
			if (inMap != null || inMap.get("key_seiky_kei_no") == null || "".equals(inMap.get("key_seiky_kei_no")))
			{
				paramMap.put("seiky_kei_no", inMap.get("key_seiky_kei_no"));
			}
		}

// ANK-3396-00-00 2019/02/13 ADD END
		// ▼▼▼▼▼ 2013/07/08 LT-2013-0000322 MOD START ▼▼▼▼▼
		/** 共通ヘッダ情報取得ＣＣより情報を取得 */
		JKKSameScreenHeaderCC headerCC = new JKKSameScreenHeaderCC();
		headerCC.runGetSameScreenHeaderInfo(handle, param, fixedText);
		
//		// サービス契約番号の取得
//		String keiyakuNo = getSvcKeiNo(handle, param, fixedText);
//		// ファミリーパック有無の取得
//		param = getFamilyPackUm(handle, param, fixedText, keiyakuNo);
//		// ルータ種別の取得
//		param = getRouterSBT(handle, param, fixedText, keiyakuNo);
		// ▲▲▲▲▲ 2013/07/08 LT-2013-0000322 MOD E N D ▲▲▲▲▲
		
		return param;
	}

	/**
	 * チェック処理<br>
	 * サービスコンポーネント実行用CAANMsgを返却します。<br>
	 * <br>
	 * 
	 * @param handle セッションハンドル
	 * @param param (I) 業務データ取得用I/F
	 * @param fixedText (I) ユーザ定義文字列
	 * @return サービスコンポーネント実行用CAANMsg
	 * @exception Throwableがスローされます 。
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		return null;
	}

	/**
	 * サービス契約番号を取得する
	 * <br>
	 * @param handle		セッションハンドラー
	 * @param param			入出力パラメータ
	 * @param fixedText	 	マップ名称
	 * @return 入出力パラメータを返す。
	 * @throws Throwable 例外の発生
	 */
	public String getSvcKeiNo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		/** 事前準備 */
		HashMap<String, String> condMap = new HashMap<String, String>();
		HashMap<String, Object> paramMap = (HashMap<String, Object>)param.getData(fixedText);
		HashMap<String, Object> reqMap;
		Map<?, ?> resMap;

		// 住所情報変更コモンコンポーネントマッピングクラスインスタンスを取得
		JKKAdInfChgMapperCC mapper = JKKAdInfChgMapperCC.getInstance();

		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// EKK0081B003  解約済以外サービス契約一覧照会（SYSID）
		condMap.clear();
		condMap.put( JKKAdInfChgConstCC.COND_KEY_SYSID, (String)paramMap.get( JKKAdInfChgConstCC.PARAM_KEY_SYSID ) );
		condMap.put( JKKAdInfChgConstCC.COND_KEY_OPEDATE, (String)paramMap.get( JKKAdInfChgConstCC.PARAM_KEY_OPE_DATE ) );
		reqMap = mapper.setEKK0081B003( param, fixedText, condMap );
		resMap = scCall.run( reqMap, handle );
		ArrayList<HashMap<String, Object>> ekk0081b003list = mapper.getEKK0081B003( param, fixedText, resMap );
		mapper.scResultCheck( param );
//IT2-2012-0001722 Y.MORIMOTO 2012.11.19 START
//		// 取得件数＝０であるかをチェック
//		if( ekk0081b003list.size() == 0 ){
//			// 取得件数＝０はIllegal-Caseとして例外を送出
//			throw new CCException( JKKAdInfChgConstCC.ERR_STR_RESULT_CD, new Exception() );
//		}
//IT2-2012-0001722 Y.MORIMOTO 2012.11.19 END
		String keiyakuNo = "";
		
		Iterator<HashMap<String, Object>> kyku_list_ite = ekk0081b003list.iterator();
		/** ネットサービスの判定処理 */
		while( kyku_list_ite.hasNext() )
		{
			HashMap<String, Object> ekk0081b003Map = kyku_list_ite.next();
			
			// サービスコードを取得
			String workSvcCd = getMapString( ekk0081b003Map, EKK0081B003CBSMsg1List.SVC_CD );
			// サービスコードがインターネットサービスの場合
			if ( JKKAdInfChgConstCC.SVC_CD_NET.equals(workSvcCd) )
			{
				// 料金グループコードを取得
				String workPrcGrpCd = getMapString( ekk0081b003Map, EKK0081B003CBSMsg1List.PRC_GRP_CD );
				// eoモバイル以外
				if ( !JKKAdInfChgConstCC.PRC_GRP_CD_07.equals( workPrcGrpCd ) &&
					 !JKKAdInfChgConstCC.PRC_GRP_CD_08.equals( workPrcGrpCd ) &&
					 !JKKAdInfChgConstCC.PRC_GRP_CD_09.equals( workPrcGrpCd ) )
				{
					// サービス契約番号
					keiyakuNo = getMapString( ekk0081b003Map, EKK0081B003CBSMsg1List.SVC_KEI_NO );
					break;
				}
				else
				{
					continue;
				}
			}
			else
			{
				continue;
			}
		}
		
		// ネットサービス契約番号が空の場合、引数のサービス契約番号を設定
		if ( keiyakuNo == null || StringUtils.isEmpty( keiyakuNo )  )
		{
//IT2-2012-0001722 Y.MORIMOTO 2012.11.19 START
//			keiyakuNo = (String)( (HashMap<String, Object>)ekk0081b003list.get( 0 ) ).get( EKK0081B003CBSMsg1List.SVC_KEI_NO );
			keiyakuNo = (String)paramMap.get( IN_SVC_KEI_NO );
//IT2-2012-0001722 Y.MORIMOTO 2012.11.19 END
		}
		
		return keiyakuNo;
	}
	
	
	/**
	 * ファミリーパック有無を取得する
	 * <br>
	 * @param handle		セッションハンドラー
	 * @param param			入出力パラメータ
	 * @param fixedText	 	マップ名称
	 * @param keiyakuNo		サービス契約番号
	 * @return 入出力パラメータを返す。
	 * @throws Throwable 例外の発生
	 */
	public IRequestParameterReadWrite getFamilyPackUm(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String keiyakuNo) throws Throwable
	{

		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 入力パラメータを取得
		HashMap<String, Object> ioMap = (HashMap<String, Object>)param.getData(fixedText);

		ioMap.put(IN_SVC_KEI_NO, keiyakuNo);
		ioMap.put(IN_WRIB_SVC_CD, WRIB_SVC_CD_FP_WRIB);
		// 割引サービス契約一覧照会（割引サービス指定）を取得して、ファミリーパック有無を取得する
		HashMap<String, Object> paramMap1 = editInEKK0451B010(param, ioMap);

		// サービスの呼び出し
		Map<?, ?> outputData1 = scCall.run(paramMap1, handle);

		// 有効な対象データを取得する
		ArrayList<String> equipmentList = resultEKK0451B010(param, outputData1);

		// エラーチェック
		errChk(outputData1);

		// 判定する
		if (equipmentList != null && 0 < equipmentList.size())
		{
			ioMap.put(OUT_FAMILY_PACK_UM, ARI);
		}
		else
		{
			ioMap.put(OUT_FAMILY_PACK_UM, NASHI);
		}
		
		return param;
	}
	
	/**
	 * ルータ種別を取得する
	 * <br>
	 * @param handle		セッションハンドラー
	 * @param param			入出力パラメータ
	 * @param fixedText	 	マップ名称
	 * @param keiyakuNo		サービス契約番号
	 * @return 入出力パラメータを返す。
	 * @throws Throwable 例外の発生
	 */
	public IRequestParameterReadWrite getRouterSBT(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String keiyakuNo) throws Throwable
	{

		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 入力パラメータを取得
		HashMap<String, Object> ioMap = (HashMap<String, Object>)param.getData(fixedText);

		ioMap.put(IN_SVC_KEI_NO, keiyakuNo);
		// 機器提供サービス契約一覧照会（サービス契約番号）を取得して、利用中の機器を取得する
		HashMap<String, Object> paramMap1 = editInEKK0341B002(param, ioMap);

		// サービスの呼び出し
		Map<?, ?> outputData1 = scCall.run(paramMap1, handle);

		// 有効な対象データを取得する
		ArrayList<String> equipmentList = getEquipmentList(outputData1);

		// エラーチェック
		errChk(outputData1);

		// 判定する
		if (equipmentList.size() > 1)
		{
			// 検索結果が複数ある場合
			ioMap.put(OUT_ROUTER_SBT_NM, SOME_ROUTER_MSG);
		}
		else if (equipmentList.size() == 1) 
		{
			// 検索結果が１つの場合
			ioMap.put(IN_KEY_TAKNKIKI_MODEL_CD, equipmentList.get(0));

			// 実行する
			HashMap<String, Object> paramMap2 = editInEZM0411A010(param, ioMap);
			Map<?, ?> outputData2 = new ServiceComponentRequestInvoker().run(paramMap2, handle);

			// 結果の取得
			ioMap.put(OUT_ROUTER_SBT_NM, getYryoMryoNm(outputData2));
			
			// エラーチェック
			errChk(outputData2);

		}
		else 
		{
			// 検索結果がない場合
			ioMap.put(OUT_ROUTER_SBT_NM, NOTHING_MGS);
		}
		
		return param;
	}
	
	/**
	 * 割引サービス契約一覧照会（割引サービス指定）の上りマップ
	 * <br>
	 * @param param		入出力パラメータ
	 * @param inMap		入力マップ
	 * @return	パラメータ
	 * @throws RequestParameterException パラメータ取得に失敗した場合に例外を発生する
	 */
	private HashMap<String, Object> editInEKK0451B010(IRequestParameterReadOnly param, HashMap<String, Object> inMap) throws Throwable
	{

		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		/* SCインプット共通データ */
		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文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));

		CAANMsg template = new CAANMsg(EKK0451B010CBSMsg.class.getName());

		// テンプレートID
		template.set(EKK0451B010CBSMsg.TEMPLATEID, "EKK0451B010");

		// 機能コード（デフォルト：１）
		template.set(EKK0451B010CBSMsg.FUNC_CODE, "1");

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);

		if (inMap != null) {
			// 機能コード
			template.set(EKK0451B010CBSMsg.FUNC_CODE, inMap.get(JCMConstants.FUNC_CODE_KEY));
		}

		// ＫＥＹ＿サービス契約番号
		String svKeiNo = (String)inMap.get(IN_SVC_KEI_NO);
		if (svKeiNo != null)
		{
			template.set(EKK0451B010CBSMsg.KEY_SVC_KEI_NO, svKeiNo);
		}

		// ＫＥＹ＿割引サービスコード
		String wribCd = (String)inMap.get(IN_WRIB_SVC_CD);
		if (wribCd != null)
		{
			template.set(EKK0451B010CBSMsg.KEY_WRIB_SVC_CD, wribCd);
		}

		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}
	
	/**
	 * 割引サービス契約一覧照会（割引サービス指定）の下りマップ
	 * <br>
	 * @param param		入出力パラメータ
	 * @param msgList	結果マップ
	 * @return	パラメータ
	 * @throws RequestParameterException パラメータ取得に失敗した場合に例外を発生する
	 */
	@SuppressWarnings("unchecked")
	public ArrayList<String> resultEKK0451B010(IRequestParameterReadWrite param, Map<?, ?> msgList) throws Throwable {

		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[]) msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;

		// 結果を詰めるマップを取得。
		ArrayList dataList = new ArrayList();
		
		templateArray = parentTemplate.getCAANMsgList(EKK0451B010CBSMsg.EKK0451B010CBSMSG1LIST);

		if (templateArray != null) {
			for (int i = 0; i < templateArray.length; i++) {
				CAANMsg childTemplate = templateArray[i];
				if ( i >= dataList.size()) {
					dataList.add(new HashMap());
				}
				HashMap childMap = (HashMap)dataList.get(i);

				
				// 割引サービス契約一覧照会（割引サービス指定）マップ.割引サービス契約一覧照会（割引サービス指定）明細.割引サービス契約番号 ← 割引サービス契約一覧照会（割引サービス指定）明細.割引サービス契約番号
				if (childTemplate.isNull(EKK0451B010CBSMsg1List.WRIB_SVC_KEI_NO)) {
					childMap.put("wrib_svc_kei_no", new String());
				} else {
					childMap.put("wrib_svc_kei_no", childTemplate.getString(EKK0451B010CBSMsg1List.WRIB_SVC_KEI_NO));
				}
			}
		}

		return dataList;
	}

	/**
	 * 機器提供サービス契約一覧照会（サービス契約番号）の上りマップ
	 * <br>
	 * @param param		入出力パラメータ
	 * @param inMap		入力マップ
	 * @return	パラメータ
	 * @throws RequestParameterException パラメータ取得に失敗した場合に例外を発生する
	 */
	private HashMap<String, Object> editInEKK0341B002(IRequestParameterReadWrite param, HashMap<String, Object> inMap) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		/* SCインプット共通データ */
		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文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));

		CAANMsg template = new CAANMsg(EKK0341B002CBSMsg.class.getName());

		// テンプレートID
		template.set(EKK0341B002CBSMsg.TEMPLATEID, "EKK0341B002");

		// 機能コード(機器提供サービス契約一覧照会（サービス契約番号）)
		template.set(EKK0341B002CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);
		
		// 検索処理パターン
		template.set(EKK0341B002CBSMsg.SEARCH_TYPE, JPCModelConstant.SAERCH_TYPE_IKT);

		// 最大検索件数
		template.set(EKK0341B002CBSMsg.MAX_SEARCH_NUM, MAX_DATA_COUNT);

		// 表示件数
		template.set(EKK0341B002CBSMsg.DISPLAY_NUM, MAX_DATA_COUNT);

		// 表示ページ番号
		template.set(EKK0341B002CBSMsg.DISPLAY_PAGE_NUM, START_PAGE_NO);

		// ＫＥＹ＿サービス契約番号
		String svKeiNo = (String)inMap.get(IN_SVC_KEI_NO);
		if (svKeiNo != null)
		{
			template.set(EKK0341B002CBSMsg.KEY_SVC_KEI_NO, svKeiNo);
		}
		// ＫＥＹ＿機器提供サービスコード
		template.set(EKK0341B002CBSMsg.KEY_KKTK_SVC_CD, DEF_KKTK_SVC_CD);
		
		// ＫＥＹ＿機器提供サービス契約番号 未設定
		template.setNull(EKK0341B002CBSMsg.KEY_KKTK_SVC_KEI_NO);

		// ＫＥＹ＿ソート区分
		template.set(EKK0341B002CBSMsg.KEY_SORT_KBN, DEF_SORT_KBN);
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap; 
	}
	
	/**
	 * サービス契約中の宅内機器型式コードのリストを返す。
	 * <br>
	 * @param msgList	SIF呼び出し結果
	 * @return	宅内機器型式コードをArrayList
	 */
	private ArrayList<String> getEquipmentList(Map<?, ?> msgList)  
	{

		ArrayList<String> equipmentList = new ArrayList<String>();

		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[]) msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;

		templateArray = parentTemplate.getCAANMsgList(EKK0341B002CBSMsg.EKK0341B002CBSMSG1LIST);
		  
		List<String> ignoreList = Arrays.asList(IGNORE_STATUS);	// 除外すべきステータスをチェック用にリストに追加

		if (templateArray != null) {
			for (int i = 0; i < templateArray.length; i++) {
				CAANMsg childTemplate = templateArray[i];

				if (!childTemplate.isNull(EKK0341B002CBSMsg1List.KKTK_SVC_KEI_STAT)) 
				{
					String stat = childTemplate.getString(EKK0341B002CBSMsg1List.KKTK_SVC_KEI_STAT);
					if (!ignoreList.contains(stat) && !childTemplate.isNull(EKK0341B002CBSMsg1List.TAKNKIKI_MODEL_CD))
					{
						// 宅内機器型式コードを結果に追加
						equipmentList.add(childTemplate.getString(EKK0341B002CBSMsg1List.TAKNKIKI_MODEL_CD));
					}

				}
			}
		}
		
		return equipmentList;
	}
	
	/**
	 * 宅内機器型式一意照会の上りマップ
	 * <br>
	 * @param param		入出力パラメータ
	 * @param inMap		入力マップ
	 * @return	パラメータ
	 * @throws RequestParameterException パラメータ取得に失敗した場合に例外を発生する
	 */
	private HashMap<String, Object> editInEZM0411A010(IRequestParameterReadWrite param, HashMap<String, Object> inMap) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		/* SCインプット共通データ */
		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文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));

		CAANMsg template = new CAANMsg(EZM0411A010CBSMsg.class.getName());

		// テンプレートID
		template.set(EZM0411A010CBSMsg.TEMPLATEID, "EZM0411A010");

		// 機能コード（宅内機器型式一意照会）
		template.set(EZM0411A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);
		
		// 検索処理パターン
		template.set(EZM0411A010CBSMsg.SEARCH_TYPE, JPCModelConstant.SAERCH_TYPE_IKT);

		// 最大検索件数
		template.set(EZM0411A010CBSMsg.MAX_SEARCH_NUM, MAX_DATA_COUNT);

		// 表示件数
		template.set(EZM0411A010CBSMsg.DISPLAY_NUM, MAX_DATA_COUNT);

		// 表示ページ番号
		template.set(EZM0411A010CBSMsg.DISPLAY_PAGE_NUM, START_PAGE_NO);

		// ＫＥＹ＿宅内機器型式コード
		template.set(EZM0411A010CBSMsg.KEY_TAKNKIKI_MODEL_CD, inMap.get(IN_KEY_TAKNKIKI_MODEL_CD));
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap; 
	}
	
	/**
	 * 対象の機器の有料／無料を返す。
	 * <br>
	 * @param msgList	SIF呼び出し結果
	 * @return 有料・無料を示す文字を返す
	 */
	private String getYryoMryoNm(Map<?, ?> msgList)
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[]) msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;

		templateArray = parentTemplate.getCAANMsgList(EZM0411A010CBSMsg.EZM0411A010CBSMSG1LIST);
		  
		if (templateArray != null) {
			for (int i = 0; i < templateArray.length; i++) {
				CAANMsg childTemplate = templateArray[i];
				if (!childTemplate.isNull(EZM0411A010CBSMsg1List.YRYO_MRYO_CD_NM))
				{
					return childTemplate.getString(EZM0411A010CBSMsg1List.YRYO_MRYO_CD_NM);
				}
			}
		}
		
		return "";
	}
	
	/**
	 * サービスインターフェイス処理結果(エラー情報)の取得<br>
	 * 業務データ取得・書込用I/Fをそのまま返却します。<br>
	 * <br>
	 * @param param デルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param templates CAANMsgクラス配列
	 * @param returnCode リターンコード
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param,
			CAANMsg[] templates, int returnCode) throws Throwable
	{
		return param;
	}

	/**
	 * エラーチェック処理
	 * <br>
	 * @param msgList サービスインタフェース実行結果
	 * return void
	 * @throws SCCallException 
	 */
	private static void errChk(Map<?, ?> msgList) throws SCCallException
	{
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		int returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// ステータス
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if ((0 != returnCode) || (0 != templateStatus))
		{
			throw new SCCallException(ERR_MSG, String.valueOf(returnCode), templateStatus);
		}
	}

	/**
	 * パラメータ取得(HashMap).
	 * <br>
	 * @param  targetMap  取得元マップ
	 * @param  targetKey  取得元キー項目
	 * @return 取得文字列
	 */
	private String getMapString( HashMap<String, Object> targetMap, String targetKey ) {
		String resultStr = new String();

		if ( targetMap != null ) {
			if ( ( targetKey != null ) && ( !"".equals( targetKey ) ) ) {
				if ( targetMap.containsKey( targetKey ) ) {
					resultStr = (String) targetMap.get(targetKey);
				}
			}
		}
		return resultStr;
	}

}
