/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKCourseRkRtrNsIdChgCC
*   ソースファイル名：JKKCourseRkRtrNsIdChgCC.java
*   作成者          ：FJ
*   日付            ：2013年10月30日
*＜機能概要＞
*   コース変更予約取消の共通コンポーネント（ルーター認証ＩＤ変更）
*＜修正履歴＞
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*	v5.00.00	2013/10/30	FJ)稲岡		【OM-2013-0003452】
*	v7.00.00	2014/02/26	FJ)辛		【OM-2014-0000794】
*	v8.01.00	2014/05/28	FJ)田中		【OM-2014-0001951】
*	v15.00.00	2015/07/23	FJ)松岡		【OM-2015-0000591】
*   v61.00.00	2023/07/12	 FJ)西窪	 【ANK-4315-00-00】【eo定期】 eoホームゲートウェイ導入対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.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.exception.SCCallException;
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 eo.common.constant.JKKStrConst;
import eo.ejb.cbs.cbsmsg.EKK0161B004CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161B004CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161B512CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0251B003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0251B003CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B504CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B504CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1081C011CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1081D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1551D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2811B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2811B010CBSMsg1List;
//OM-2015-0000591 ADD START
import eo.ejb.cbs.cbsmsg.EKK1081B001CBSMsg;
//OM-2015-0000591 ADD END

/**
 *  ルーター認証ＩＤ変更部品。<p>
 * <BR>
 * @author 富士通
 */
public class JKKCourseRkRtrNsIdChgCC extends AbstractCommonComponent
{
	/** サービス契約内訳一覧照会*/
	private static final String TEMPLATE_ID_EKK0161B004 = "EKK0161B004";
	/** 機器提供サービス契約一覧照会（サービス契約番号）*/
	private static final String TEMPLATE_ID_EKK0341B002 = "EKK0341B002";
	/** 同一処理番号採番 */
	private static final String TEMPLATE_ID_EKK1081C011 = "EKK1081C011";
	/** オーダ発行条件登録 */
	private static final String TEMPLATE_ID_EKK1081D010 = "EKK1081D010";
	/** オーダ情報作成ワーク登録 */
	private static final String TEMPLATE_ID_EKK1551D010 = "EKK1551D010";
	
	/** サービス契約ステータス サービス提供中 */
	private static final String SVC_KEI_UCWK_STAT_100 = "100";
	/** サービス契約ステータス 休止・中断中 */
	private static final String SVC_KEI_UCWK_STAT_210 = "210";
	/** サービス契約ステータス 停止中 */
	private static final String SVC_KEI_UCWK_STAT_220 = "220";
	/** サービス契約ステータス 解約済 */
	private static final String SVC_KEI_UCWK_STAT_910 = "910";
	/** サービス契約ステータス キャンセル済 */
	private static final String SVC_KEI_UCWK_STAT_920 = "920";
	
	/** オーダ種別コード：1（ネット） */
	private static final String ORDER_SBT_CD_NET = "1";
	/** サービスオーダコード：0A(ルータ向け情報) */
	private static final String SVC_ORDER_CD_ROUTER = "0A";
	/** 要求種別コード：04(変更) */
	private static final String YOKYU_SBT_CD_CHG = "04";
	/** オーダ発行条件コード：01(即時発行) */
	private static final String ODR_HAKKO_JOKEN_CD_SOKJI_HAKKO = "01";
	/** オーダ内容コード：163(ルーター向け接続情報・変更) */
	private static final String ODR_NAIYO_CD_163 = "163";
	
	/** 機能コード "1"(チェック＆更新)*/
	private static final String FUNC_CODE_1 = "1";
	/** 機能コード "2"(チェックのみ)*/
	private static final String FUNC_CODE_2 = "2";
	/** 機能コード "3"*/
	private static final String FUNC_CODE_3 = "3";
	
	/* ++++++++++ v7.00.00 追加開始 ++++++++++ */
	/** EKK0251B003_サービス契約回線内訳一覧照会（現在利用中） */
	private static final String TEMPLATE_ID_EKK0251B003 = "EKK0251B003";
	/** サービス契約回線内訳ステータス 解約済 */
	private static final String SVC_KEI_KAISEN_UCWK_STAT_910 = "910";
	/** サービス契約回線内訳ステータス キャンセル済 */
	private static final String SVC_KEI_KAISEN_UCWK_STAT_920 = "920";
	/** EKK0341B504_機器提供サービス契約一覧照会(サービス契約回線内訳) */
	private static final String TEMPLATE_ID_EKK0341B504 = "EKK0341B504";
	/** 機器提供サービス契約ステータス キャンセル済 */
	private static final String KKTK_SVC_KEI_STAT_920 = "920";
	// OM-2014-0001951対応 田中 ADD START
	/** 機器提供サービス契約ステータス 解約済 */
	private static final String KKTK_SVC_KEI_STAT_910 = "910";
	// OM-2014-0001951対応 田中 ADD END
	/** EKK2811B010_機器オプションサービス契約一覧照会（機器提供ＳＶ） */
	private static final String TEMPLATE_ID_EKK2811B010 = "EKK2811B010";
	/** 機器提供サービスコード ：ｅｏ光多機能ルーター */
	public static final String CD00132_MULTI_ROUTER = "C024";
	// ANK-4315-00-00 ADD START
	/** 機器提供サービスコード ：ｅｏ光多機能ルーター */
	public static final String CD00132_HGW = "C025";
	// ANK-4315-00-00 ADD END
	/** サービスオーダコード：26(多機能ルーター向け情報) */
	private static final String SVC_ORDER_CD_MULTI_ROUTER = "26";
	/** オーダ内容コード：404(多機能ルーター設定・変更(ルーター機能・接続情報変更)) */
	private static final String ODR_NAIYO_CD_404 = "404";
	/** オーダ種別コード：2（電話ＳＯＤ：多機能ルーター変更） */
	private static final String ORDER_SBT_CD_MULTI_2 = "2";
	/* ++++++++++ v7.00.00 追加終了 ++++++++++ */
	
	// OM-2014-0001951対応 田中 ADD START
	/** 機器提供サービスコード ：ｅｏ光多機能ルーター */
	public static final String MULTI_ROUTER_VA_OP = "G02";
	// OM-2014-0001951対応 田中 ADD END
	
	//OM-2015-0000591 ADD START
	/** 要求種別コード：02(登録) */
	private static final String YOKYU_SBT_CD_REG = "02";
	/** 登録オーダ存在チェック判定フラグ */
	private static  boolean isRegiOrdered =false;
	/** オーダ発行条件一覧照会 */
	private static final String TEMPLATE_ID_EKK1081B001 = "EKK1081B001";
	//OM-2015-0000591 ADD END
	
	/**
	 * ルーター認証ＩＤ変更処理を行う。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, 
												IRequestParameterReadWrite param, 
												String fixedText) throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// ユーザデータ情報
		HashMap<String, Object> paramMap = (HashMap<String, Object>)param.getData(fixedText);
		// 機能コード
		String funcCode = (String)paramMap.get("func_code");
		
		// 作業領域
		Map workMap = param.getMappingWorkArea();
		HashMap workDataMap = (HashMap)workMap.get("WORK");
		// サービス契約番号
		String svcKeiNo = (String)workDataMap.get("svc_kei_no");
		// 世代登録年月日時分秒
		String kk0081GeneAddDtm = (String)workDataMap.get("gene_add_dtm");
		
		// サービス契約内訳取得
		CAANMsg ekk0161b004Msg = getSvcKeiUcwkMsg(handle, scCall, param, fixedText, svcKeiNo);
		if(null == ekk0161b004Msg)
		{
			return param;
		}
		
		// サービス契約内訳番号
		String svcKeiUcwkNo = ekk0161b004Msg.getString(EKK0161B004CBSMsg1List.SVC_KEI_UCWK_NO);
		// 世代登録年月日時分秒
		String kk0161GeneAddDtm = ekk0161b004Msg.getString(EKK0161B004CBSMsg1List.GENE_ADD_DTM);
		
		// 機器提供サービス契約取得
		CAANMsg ekk0341b002Msg = getKktkSvcKeiMsg(handle, scCall, param, fixedText, svcKeiNo);
		
		/* ++++++++++ v7.00.00 変更開始 ++++++++++ */
		//====================================
		//■無線ルーターの場合
		//====================================
		if(null != ekk0341b002Msg)
		{
			// 機器提供サービス契約番号
			String kktkSvcKeiNo = ekk0341b002Msg.getString(EKK0341B002CBSMsg1List.KKTK_SVC_KEI_NO);
			// 世代登録年月日時分秒
			String kk0341GeneAddDtm = ekk0341b002Msg.getString(EKK0341B002CBSMsg1List.GENE_ADD_DTM);
			/* ++++++++++ v7.00.00 追加開始 ++++++++++ */
			// 宅内機器型式コード
			String taknKikiMdCd = ekk0341b002Msg.getString(EKK0341B002CBSMsg1List.TAKNKIKI_MODEL_CD);
			// 機器製造番号
			String kikiSeizoNo = ekk0341b002Msg.getString(EKK0341B002CBSMsg1List.KIKI_SEIZO_NO);
			/* ++++++++++ v7.00.00 追加終了 ++++++++++ */
			
			// ルーター認証ＩＤ変更処理
			String[] params = new String[8];
			params[0] = svcKeiNo;
			params[1] = kk0081GeneAddDtm;
			params[2] = svcKeiUcwkNo;
			params[3] = kk0161GeneAddDtm;
			params[4] = kktkSvcKeiNo;
			params[5] = kk0341GeneAddDtm;
			/* ++++++++++ v7.00.00 追加開始 ++++++++++ */
			params[6] = taknKikiMdCd;
			params[7] = kikiSeizoNo;
			/* ++++++++++ v7.00.00 追加終了 ++++++++++ */
			
			execChgRouterNinshoId(handle, scCall, param, fixedText, funcCode, params);
			
		}
		//====================================
		//■多機能ルーターの場合
		//====================================
		else
		{
			//パラメタ設定
			HashMap<String,String> paMap = new HashMap<String,String>();
			paMap.put("svcKeiNo", svcKeiNo);
			paMap.put("ekk0081GeneAddDtm", kk0081GeneAddDtm);
			paMap.put("svcKeiUcwkNo", svcKeiUcwkNo);
			paMap.put("kk0161GeneAddDtm", kk0161GeneAddDtm);
			
			//サービス契約回線内訳番号取得
			CAANMsg ekk0251B003Msg = getMultiRTInfo(handle, scCall, param, fixedText, svcKeiNo);
			if(null == ekk0251B003Msg)
			{
				return param;
			}
			
			// サービス契約回線内訳番号
			String svcKeikaisenUwNo = ekk0251B003Msg.getString(EKK0251B003CBSMsg1List.SVC_KEI_KAISEN_UCWK_NO);
			// 世代登録年月日時分秒
			String ekk0251GeneAddDtm = ekk0251B003Msg.getString(EKK0251B003CBSMsg1List.GENE_ADD_DTM);
			//
			paMap.put("svcKeikaisenUwNo", svcKeikaisenUwNo);
			paMap.put("ekk0251GeneAddDtm", ekk0251GeneAddDtm);
			
			//EKK0341B504_機器提供サービス契約一覧照会(サービス契約回線内訳)
			CAANMsg ekk0341B504Msg = getmultiKktkSvcKeiMsg(handle, scCall, param, fixedText, svcKeikaisenUwNo);
			if(null == ekk0341B504Msg)
			{
				return param;
			}
			// 機器提供サービス契約番号
			String kktkSvcKeiNo = ekk0341B504Msg.getString(EKK0341B504CBSMsg1List.KKTK_SVC_KEI_NO);
			// 世代登録年月日時分秒
			String kk0341GeneAddDtm = ekk0341B504Msg.getString(EKK0341B504CBSMsg1List.GENE_ADD_DTM);
			// 宅内機器型式コード
			String kk0341TaknKikiMdCd = ekk0341B504Msg.getString(EKK0341B504CBSMsg1List.TAKNKIKI_MODEL_CD);
			// 機器製造番号
			String kk0341KikiSeizoNo = ekk0341B504Msg.getString(EKK0341B504CBSMsg1List.KIKI_SEIZO_NO);
			//
			paMap.put("kktkSvcKeiNo", kktkSvcKeiNo);
			paMap.put("kk0341GeneAddDtm", kk0341GeneAddDtm);
			paMap.put("taknKikiMdCd", kk0341TaknKikiMdCd);
			paMap.put("kikiSeizoNo", kk0341KikiSeizoNo);
			
			//EKK2811B010_機器オプションサービス契約一覧照会（機器提供ＳＶ）
			CAANMsg ekk2811B010Msg = getmultiKktkOpSvcKeiMsg(handle, scCall, param, fixedText, kktkSvcKeiNo);
			// OM-2014-0001951対応 田中 ADD STRT
			if(null == ekk2811B010Msg)
			{
				return param;
			}
			// OM-2014-0001951対応 田中 ADD END
			
			// 機器オプションサービス契約番号
			String kk2811KkOpSvcKeiNo = ekk2811B010Msg.getString(EKK2811B010CBSMsg1List.KKOP_SVC_KEI_NO);
			// 世代登録年月日時分秒
			String kk2811GeneAddDtm = ekk2811B010Msg.getString(EKK2811B010CBSMsg1List.GENE_ADD_DTM);
			//
			paMap.put("KkOpSvcKeiNo", kk2811KkOpSvcKeiNo);
			paMap.put("kk2811GeneAddDtm", kk2811GeneAddDtm);
			
			execChgMultiRouterNinshoId(handle, scCall, param, fixedText, funcCode, paMap);
		}
		
		/* ++++++++++ v7.00.00 変更終了 ++++++++++ */

		return param;
	}
	
	/**
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param svcKeiNo
	 * @return String
	 */
	private CAANMsg getSvcKeiUcwkMsg(
										SessionHandle handle, 
										ServiceComponentRequestInvoker scCall, 
										IRequestParameterReadWrite param, 
										String fixedText, 
										String svcKeiNo) throws Exception
	{
		//**********************************************************
		// サービス契約内訳一覧照会（サービス契約番号）
		//**********************************************************
		Object[][] ekk0161b004InMsg = 
		{
			{EKK0161B004CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0161B004},
			{EKK0161B004CBSMsg.FUNC_CODE, FUNC_CODE_3},
			{EKK0161B004CBSMsg.KEY_SVC_KEI_NO, svcKeiNo},
		};
		
		CAANMsg[] ekk0161b004OutMsg = callSC(handle, scCall, param, fixedText, ekk0161b004InMsg).getCAANMsgList(EKK0161B004CBSMsg.EKK0161B004CBSMSG1LIST);
		
		for(int i=0; i<ekk0161b004OutMsg.length; i++)
		{
			// サービス契約内訳ステータス
			String svcKeiUcwkStat = ekk0161b004OutMsg[i].getString(EKK0161B512CBSMsg1List.SVC_KEI_UCWK_STAT);
			
			// サービス契約内訳ステータス = 910:"解約済" または 920:"キャンセル済" は対象外
			if(SVC_KEI_UCWK_STAT_910.equals(svcKeiUcwkStat) || SVC_KEI_UCWK_STAT_920.equals(svcKeiUcwkStat))
			{
				continue;
			}
			
			// サービス契約内訳ステータス = 100:"サービス提供中" または 210:"休止・中断中" または 220:"停止中"
			if(SVC_KEI_UCWK_STAT_100.equals(svcKeiUcwkStat) 
					|| SVC_KEI_UCWK_STAT_210.equals(svcKeiUcwkStat) 
					|| SVC_KEI_UCWK_STAT_220.equals(svcKeiUcwkStat))
			{
				return ekk0161b004OutMsg[i];
			}
		}
		
		return null;
	}
	
	/**
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param svcKeiNo
	 * @return CAANMsg
	 */
	private CAANMsg getKktkSvcKeiMsg(
										SessionHandle handle, 
										ServiceComponentRequestInvoker scCall, 
										IRequestParameterReadWrite param, 
										String fixedText, 
										String svcKeiNo) throws Exception
	{
		//**********************************************************
		// 機器提供サービス契約一覧照会（サービス契約番号）
		//**********************************************************
		Object[][] ekk0341b002InMsg = 
		{
			{EKK0341B002CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0341B002},
			{EKK0341B002CBSMsg.FUNC_CODE, FUNC_CODE_1},
			{EKK0341B002CBSMsg.KEY_SVC_KEI_NO, svcKeiNo}
		};
		
		CAANMsg[] ekk0341b002OutMsg = callSC(handle, scCall, param, fixedText, ekk0341b002InMsg).getCAANMsgList(EKK0341B002CBSMsg.EKK0341B002CBSMSG1LIST);
		
		for(int i=0; i<ekk0341b002OutMsg.length; i++)
		{
			// 機器提供サービスコードが"C014"(BBR)の場合
			if (JKKStrConst.CD00132_BBR.equals(ekk0341b002OutMsg[i].getString(EKK0341B002CBSMsg1List.KKTK_SVC_CD)))
			{
				return ekk0341b002OutMsg[i];
			}
		}
		
		return null;
	}
	
	/**
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param funcCode
	 * @param params
	 * @return CAANMsg
	 */
	private void execChgRouterNinshoId(
										SessionHandle handle, 
										ServiceComponentRequestInvoker scCall, 
										IRequestParameterReadWrite param, 
										String fixedText, 
										String funcCode, 
										String[] params) throws Exception
	{
		// params[0] = svcKeiNo;
		// params[1] = kk0081GeneAddDtm;
		// params[2] = svcKeiUcwkNo;
		// params[3] = kk0161GeneAddDtm;
		// params[4] = kktkSvcKeiNo;
		// params[5] = kk0341GeneAddDtm;
		// params[6] = taknKikiMdCd;
		// params[7] = kikiSeizoNo;
		
		//**********************************************************
		// 同一処理番号採番
		//**********************************************************
		Object[][] ekk1081c011InMsg = editInMsgEKK1081C011();
		// 実行
		CAANMsg ekk1081c011OutMsg = callSC(handle, scCall, param, fixedText, ekk1081c011InMsg);
		
		//**********************************************************
		// オーダ発行条件登録
		//**********************************************************
		Object[][] ekk1081d010InMsg = editInMsgEKK1081D010(
															funcCode, 
															params[0], 
															params[2], 
															params[4], 
															/* ++++++++++ v7.00.00 追加開始 ++++++++++ */
															params[6], 
															params[7], 
															/* ++++++++++ v7.00.00 追加終了 ++++++++++ */
															ekk1081c011OutMsg.getString(EKK1081C011CBSMsg.SAME_TRN_NO));
		// 実行
		CAANMsg ekk1081d010OutMsg = callSC(handle, scCall, param, fixedText, ekk1081d010InMsg);
		
		if(FUNC_CODE_1.equals(funcCode))
		{
			//**********************************************************
			// オーダ情報作成ワーク登録
			//**********************************************************
			Object[][] ekk1051d010InMsg = editInMsgEKK1551D010(
																funcCode, 
																ekk1081d010OutMsg.getString(EKK1081D010CBSMsg.ODR_HAKKO_JOKEN_NO), 
																params[0], 
																params[1], 
																params[2], 
																params[3],
																params[4], 
																params[5]);
			// 実行
			callSC(handle, scCall, param, fixedText, ekk1051d010InMsg);
		}
	}
	
	/**
	 * @return Object[][]
	 */
	private Object[][] editInMsgEKK1081C011()
	{
		Object[][] inMsg = 
		{
			{EKK1081C011CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1081C011},
			{EKK1081C011CBSMsg.FUNC_CODE, FUNC_CODE_1}
		};
		
		return inMsg;
	}
	
	/**
	 * @param funcCode
	 * @param svcKeiNo
	 * @param svcKeiUcwkNo
	 * @param kktkSvcKeiNo
	 * @param sameTrnNo
	 * @return Object[][]
	 */
	private Object[][] editInMsgEKK1081D010(String funcCode, String svcKeiNo, String svcKeiUcwkNo, String kktkSvcKeiNo, String taknKikiMdCd, String kikiSeizoNo, String sameTrnNo)
	{
		Object[][] inMsg = 
		{
			{EKK1081D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1081D010},
			{EKK1081D010CBSMsg.FUNC_CODE, funcCode},
			{EKK1081D010CBSMsg.SVC_KEI_NO, svcKeiNo},
			{EKK1081D010CBSMsg.SVC_KEI_UCWK_NO, svcKeiUcwkNo},
			{EKK1081D010CBSMsg.KKTK_SVC_KEI_NO, kktkSvcKeiNo},
			/* ++++++++++ v7.00.00 追加開始 ++++++++++ */
			{EKK1081D010CBSMsg.TAKNKIKI_MODEL_CD, taknKikiMdCd},
			{EKK1081D010CBSMsg.KIKI_SEIZO_NO, kikiSeizoNo},
			/* ++++++++++ v7.00.00 追加終了 ++++++++++ */
			{EKK1081D010CBSMsg.ORDER_SBT_CD, ORDER_SBT_CD_NET},
			{EKK1081D010CBSMsg.SVC_ORDER_CD, SVC_ORDER_CD_ROUTER},
			{EKK1081D010CBSMsg.YOKYU_SBT_CD, YOKYU_SBT_CD_CHG},
			{EKK1081D010CBSMsg.ODR_HAKKO_JOKEN_CD, ODR_HAKKO_JOKEN_CD_SOKJI_HAKKO},
			{EKK1081D010CBSMsg.SAME_TRN_NO, sameTrnNo}
		};
		
		return inMsg;
	}
	
	/**
	 * @param funcCode
	 * @param odrHakkoJokenNo
	 * @param svcKeiNo
	 * @param kk0081GeneAddDtm
	 * @param svcKeiUcwkNo
	 * @param kk0161GeneAddDtm
	 * @param kktkSvcKeiNo
	 * @param kk0341RsvGeneAddDtm
	 * @return Object[][]
	 */
	private Object[][] editInMsgEKK1551D010(
												String funcCode, 
												String odrHakkoJokenNo, 
												String svcKeiNo, 
												String kk0081GeneAddDtm, 
												String svcKeiUcwkNo, 
												String kk0161GeneAddDtm, 
												String kktkSvcKeiNo, 
												String kk0341RsvGeneAddDtm)
	{
		Object[][] inMsg = 
		{
			{EKK1551D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1551D010},
			{EKK1551D010CBSMsg.FUNC_CODE, funcCode},
			{EKK1551D010CBSMsg.ODR_HAKKO_JOKEN_NO, odrHakkoJokenNo},
			{EKK1551D010CBSMsg.ODR_NAIYO_CD, ODR_NAIYO_CD_163},
			{EKK1551D010CBSMsg.SVC_KEI_NO, svcKeiNo},
			{EKK1551D010CBSMsg.SVKEI_GADTM, kk0081GeneAddDtm},
			{EKK1551D010CBSMsg.SVC_KEI_UCWK_NO, svcKeiUcwkNo},
			{EKK1551D010CBSMsg.SVKEIUW_GADTM, kk0161GeneAddDtm},
			{EKK1551D010CBSMsg.KKTK_SVC_KEI_NO, kktkSvcKeiNo},
			{EKK1551D010CBSMsg.KKTSVKEI_GADTM, kk0341RsvGeneAddDtm}
		};
		
		return inMsg;
	}
	
	/**
	 * 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))
		{
			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 (((String)mappingData[i][0]).startsWith("key_"))
			{
				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;
	}
	
	/* ++++++++++ v7.00.00 追加開始 ++++++++++ */
	/**
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param svcKeiNo
	 * @return String
	 */
	private CAANMsg getMultiRTInfo(
										SessionHandle handle, 
										ServiceComponentRequestInvoker scCall, 
										IRequestParameterReadWrite param, 
										String fixedText, 
										String svcKeiNo) throws Exception
	{
		//**********************************************************
		// サービス契約回線内訳一覧照会（現在利用中）
		//**********************************************************
		Object[][] ekk0251B003InMsg = 
		{
			{EKK0251B003CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0251B003},
			{EKK0251B003CBSMsg.FUNC_CODE, FUNC_CODE_1},
			{EKK0251B003CBSMsg.KEY_SVC_KEI_NO, svcKeiNo},
		};
		
		CAANMsg[] ekk0251B003OutMsg = callSC(handle, scCall, param, fixedText, ekk0251B003InMsg).getCAANMsgList(EKK0251B003CBSMsg.EKK0251B003CBSMSG1LIST);
		
		for(int i=0; i<ekk0251B003OutMsg.length; i++)
		{
			// サービス契約回線内訳ステータス
			String svcKeiKaisenUcwkStat = ekk0251B003OutMsg[i].getString(EKK0251B003CBSMsg1List.SVC_KEI_KAISEN_UCWK_STAT);
			
			if (isBlank(svcKeiKaisenUcwkStat) || SVC_KEI_KAISEN_UCWK_STAT_910.equals(svcKeiKaisenUcwkStat) || SVC_KEI_KAISEN_UCWK_STAT_920.equals(svcKeiKaisenUcwkStat))
			{
				continue;
			}
			
			return ekk0251B003OutMsg[i];
		}
		
		return null;
	}
	
	/**
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param svcKeiNo
	 * @return CAANMsg
	 */
	private CAANMsg getmultiKktkSvcKeiMsg(
										SessionHandle handle, 
										ServiceComponentRequestInvoker scCall, 
										IRequestParameterReadWrite param, 
										String fixedText, 
										String svcKeiKaisenUwNo) throws Exception
	{
		//**********************************************************
		// 機器提供サービス契約一覧照会(サービス契約回線内訳)
		//**********************************************************
		Object[][] ekk0341B504InMsg = 
		{
			{EKK0341B504CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0341B504},
			{EKK0341B504CBSMsg.FUNC_CODE, FUNC_CODE_1},
			{EKK0341B504CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO, svcKeiKaisenUwNo}
		};
		
		CAANMsg[] ekk0341B504OutMsg = callSC(handle, scCall, param, fixedText, ekk0341B504InMsg).getCAANMsgList(EKK0341B504CBSMsg.EKK0341B504CBSMSG1LIST);

		for(int i=0; i<ekk0341B504OutMsg.length; i++)
		{
			// OM-2014-0001951対応 田中 解約済のものも除外するよう修正 ADD START
			//キャンセルされたものを除外 
			if (KKTK_SVC_KEI_STAT_920.equals(ekk0341B504OutMsg[i].getString(EKK0341B504CBSMsg1List.KKTK_SVC_KEI_STAT))
					|| KKTK_SVC_KEI_STAT_910.equals(ekk0341B504OutMsg[i].getString(EKK0341B504CBSMsg1List.KKTK_SVC_KEI_STAT)))
			{
				continue;
			}
			// OM-2014-0001951対応 田中 解約済のものも除外するよう修正 ADD END
			
			// ANK-4315-00-00 MOD START
			// 機器提供サービスコードが"C024"(ｅｏ光多機能ルーター)または"C025"(HGW)の場合
			if (CD00132_MULTI_ROUTER.equals(ekk0341B504OutMsg[i].getString(EKK0341B504CBSMsg1List.KKTK_SVC_CD)) || CD00132_HGW.equals(ekk0341B504OutMsg[i].getString(EKK0341B504CBSMsg1List.KKTK_SVC_CD)))
			// ANK-4315-00-00 MOD END
			{
				return ekk0341B504OutMsg[i];
			}
		}
		
		return null;
	}
	
	/**
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param svcKeiNo
	 * @return CAANMsg
	 */
	private CAANMsg getmultiKktkOpSvcKeiMsg(
										SessionHandle handle, 
										ServiceComponentRequestInvoker scCall, 
										IRequestParameterReadWrite param, 
										String fixedText, 
										String kktkSvcKeiNo) throws Exception
	{
		//**********************************************************
		// 機器オプションサービス契約一覧照会（機器提供ＳＶ）
		//**********************************************************
		Object[][] ekk2811B010InMsg = 
		{
			{EKK2811B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK2811B010},
			{EKK2811B010CBSMsg.FUNC_CODE, FUNC_CODE_1},
			{EKK2811B010CBSMsg.KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo}
		};
		
		CAANMsg[] ekk2811B010OutMsg = callSC(handle, scCall, param, fixedText, ekk2811B010InMsg).getCAANMsgList(EKK2811B010CBSMsg.EKK2811B010CBSMSG1LIST);

		for(int i=0; i<ekk2811B010OutMsg.length; i++)
		{
			
			//解約/キャンセルされたものを除外 
			if ("910".equals(ekk2811B010OutMsg[i].getString(EKK2811B010CBSMsg1List.KKOP_SVC_KEI_STAT)) || 
					"920".equals(ekk2811B010OutMsg[i].getString(EKK2811B010CBSMsg1List.KKOP_SVC_KEI_STAT)))
			{
				continue;
			}
			
			// OM-2014-0001951対応 田中 ADD START
			// 機器オプションサービスコードが「G02」の場合は対象外
			if (MULTI_ROUTER_VA_OP.equals(ekk2811B010OutMsg[i].getString(EKK2811B010CBSMsg1List.KKOP_SVC_CD)))
			{
				continue;
			}
			// OM-2014-0001951対応 田中 ADD END
			
			return ekk2811B010OutMsg[i];
		}
		
		return null;
	}
	
	/**
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param funcCode
	 * @param params
	 * @return CAANMsg
	 */
	private void execChgMultiRouterNinshoId(
										SessionHandle handle, 
										ServiceComponentRequestInvoker scCall, 
										IRequestParameterReadWrite param, 
										String fixedText, 
										String funcCode, 
										HashMap<String,String> paraMap) throws Exception
	{
		// OM-2015-0000591 ADD START
		String kktksvckeino = paraMap.get("kktkSvcKeiNo");
		isRegiOrdered = isRegiOrdExit(handle,scCall,param,fixedText,kktksvckeino,SVC_ORDER_CD_MULTI_ROUTER);
		if (isRegiOrdered) 
		{
		// OM-2015-0000591 ADD END
			//**********************************************************
			// 同一処理番号採番
			//**********************************************************
			Object[][] ekk1081c011InMsg = editInMsgEKK1081C011();
			// 実行
			CAANMsg ekk1081c011OutMsg = callSC(handle, scCall, param, fixedText, ekk1081c011InMsg);
			
			//**********************************************************
			// オーダ発行条件登録
			//**********************************************************
			Object[][] ekk1081d010InMsg = {
											{EKK1081D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1081D010},
											{EKK1081D010CBSMsg.FUNC_CODE, funcCode},
											{EKK1081D010CBSMsg.SVC_KEI_NO, paraMap.get("svcKeiNo")},
											{EKK1081D010CBSMsg.SVC_KEI_KAISEN_UCWK_NO, paraMap.get("svcKeikaisenUwNo")},  //サービス契約回線内訳番号
											{EKK1081D010CBSMsg.SVC_KEI_UCWK_NO, paraMap.get("svcKeiUcwkNo")},
											{EKK1081D010CBSMsg.KKTK_SVC_KEI_NO, paraMap.get("kktkSvcKeiNo")},
											{EKK1081D010CBSMsg.TAKNKIKI_MODEL_CD, paraMap.get("taknKikiMdCd")},           //宅内機器型式コード
											{EKK1081D010CBSMsg.KIKI_SEIZO_NO, paraMap.get("kikiSeizoNo")},                //機器製造番号
											{EKK1081D010CBSMsg.ORDER_SBT_CD, ORDER_SBT_CD_MULTI_2},                       //2:電話ＳＯＤ：多機能ルーター変更
											{EKK1081D010CBSMsg.SVC_ORDER_CD, SVC_ORDER_CD_MULTI_ROUTER},                  //26：多機能ルーター
											{EKK1081D010CBSMsg.YOKYU_SBT_CD, YOKYU_SBT_CD_CHG},
											{EKK1081D010CBSMsg.ODR_HAKKO_JOKEN_CD, ODR_HAKKO_JOKEN_CD_SOKJI_HAKKO},
											{EKK1081D010CBSMsg.SAME_TRN_NO, ekk1081c011OutMsg.getString(EKK1081C011CBSMsg.SAME_TRN_NO)}
			};
			
			// 実行
			CAANMsg ekk1081d010OutMsg = callSC(handle, scCall, param, fixedText, ekk1081d010InMsg);
			
			if(FUNC_CODE_1.equals(funcCode))
			{
				//**********************************************************
				// オーダ情報作成ワーク登録
				//**********************************************************
				Object[][] ekk1051d010InMsg = {
												{EKK1551D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1551D010},
												{EKK1551D010CBSMsg.FUNC_CODE, funcCode},
												{EKK1551D010CBSMsg.ODR_HAKKO_JOKEN_NO, ekk1081d010OutMsg.getString(EKK1081D010CBSMsg.ODR_HAKKO_JOKEN_NO)},
												{EKK1551D010CBSMsg.ODR_NAIYO_CD, ODR_NAIYO_CD_404},                         //404：多機能ルーター
												{EKK1551D010CBSMsg.SVC_KEI_NO, paraMap.get("svcKeiNo")},
												{EKK1551D010CBSMsg.SVKEI_GADTM, paraMap.get("ekk0081GeneAddDtm")},
												{EKK1551D010CBSMsg.SVC_KEI_UCWK_NO, paraMap.get("svcKeiUcwkNo")},
												{EKK1551D010CBSMsg.SVKEIUW_GADTM, paraMap.get("kk0161GeneAddDtm")},
												{EKK1551D010CBSMsg.KKOP_SVC_KEI_NO_1, paraMap.get("KkOpSvcKeiNo")},          //機器オプションサービス契約番号１(ルーター機能)
												{EKK1551D010CBSMsg.KKOSVKEI_GADTM_1, paraMap.get("kk2811GeneAddDtm")},     //機器オプションサービス契約世代登録年月日時分秒１(ルーター機能)
												{EKK1551D010CBSMsg.HUKA_INF_KEI_NO, paraMap.get("svcKeikaisenUwNo")},       //付加情報契約番号（サービス契約回線内訳番号）
												{EKK1551D010CBSMsg.HUKA_INF_KEI_GADTM, paraMap.get("ekk0251GeneAddDtm")},   //付加情報契約世代登録年月日時分秒（サービス契約回線内訳世代登録年月日時分秒）
												{EKK1551D010CBSMsg.KKTK_SVC_KEI_NO, paraMap.get("kktkSvcKeiNo")},
												{EKK1551D010CBSMsg.KKTSVKEI_GADTM, paraMap.get("kk0341GeneAddDtm")}
				};
				// 実行
				callSC(handle, scCall, param, fixedText, ekk1051d010InMsg);
			}
		// OM-2015-0000591 ADD START
		}
		// OM-2015-0000591 ADD END
	}
	
	/**
	 * Stringの値がNullか空白ならばtrue、それ以外はfalseを返します
	 * @param param
	 * @return boolean
	 */
	private boolean isBlank(String param)
	{
		if(null == param ||  "".equals(param)){
			return true;
		}
		return false;
	}
	/* ++++++++++ v7.00.00 追加終了 ++++++++++ */
	
	//OM-2015-0000591 ADD START
	/**
	 * オーダ発行条件に対してルータの登録オーダの存在チェックを行う
	 * 
	 * @param param
	 * @return boolean
	 */
	private boolean isRegiOrdExit(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param, 
									String fixedText, 
									String kktksvckeino,
									String svcOrdCd)throws Exception {
		
		// **********************************************************
		// オーダ発行条件一覧照会
		// **********************************************************
		Object[][] ekk1081b001InMsg = 
		{
				{ EKK1081B001CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1081B001 },
				{EKK1551D010CBSMsg.FUNC_CODE, FUNC_CODE_1},
				{ EKK1081B001CBSMsg.KEY_KKTK_SVC_KEI_NO, kktksvckeino},
				{ EKK1081B001CBSMsg.KEY_YOKYU_SBT_CD, YOKYU_SBT_CD_REG},
				{ EKK1081B001CBSMsg.KEY_SVC_ORDER_CD, svcOrdCd},
		};
		

		CAANMsg[] ekk1081b001OutMsg = callSC(handle, scCall, param, fixedText,
				ekk1081b001InMsg).getCAANMsgList(
				EKK1081B001CBSMsg.EKK1081B001CBSMSG1LIST);

		
		
		if(ekk1081b001OutMsg == null || ekk1081b001OutMsg.length == 0 )
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	//OM-2015-0000591 ADD END
}