/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JCKKKojiakUpdCC.java
*	ソースファイル名：JCKKKojiakUpdCC.java.java
*	作成者			：FJ
*	日付			：2013年03月22日
*＜機能概要＞
*	工事案件諸変更の共通コンポーネント
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2013/03/22	FJ)稲岡		【IT1-2013-0000576】対応
*	v4.00.01	2013/03/24	FJ)稲岡		【IT1-2013-0000600】対応
*	v22.00.00	2016/01/07	FJ)徳永		【OM-2015-0003328】対応
*	v45.00.00	2019/10/17	FJ)吉田		【OM-2019-0000515】対応
**********************************************************************/
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.JKKSvcConst;
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.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EKK0451B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKU0021A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0021C010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0061A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0061C010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0081B010CBSMsg;

/**
 * 工事案件諸変更共通部品。<p>
 * <BR>
 * @author 富士通
 */
public class JCKKKojiakUpdCC extends AbstractCommonComponent
{
	/** サービス契約_工事案件一覧照会 */
	private static final String TEMPLATE_ID_EKU0081B010 = "EKU0081B010";
	/** 工事案件<eo光ネット>一意照会 */
	private static final String TEMPLATE_ID_EKU0021A010 = "EKU0021A010";
	/** 工事案件<eo光ネットマンション>一意照会 */
	private static final String TEMPLATE_ID_EKU0061A010 = "EKU0061A010";
	/** 工事案件（eo光ネット）諸変更 */
	private static final String TEMPLATE_ID_EKU0021C010 = "EKU0021C010";
	/** 工事案件（eo光テレビ）諸変更 */
	private static final String TEMPLATE_ID_EKU0031C010 = "EKU0031C010";
	/** 工事案件（eo光テレビ回線）諸変更 */
	private static final String TEMPLATE_ID_EKU0041C010 = "EKU0041C010";
	/** 工事案件（eo光ネットマンション）諸変更 */
	private static final String TEMPLATE_ID_EKU0061C010 = "EKU0061C010";
	/* ++++++++++ v22.00.00 追加開始 ++++++++++ */
	/** 工事案件一意照会 */
	private static final String TEMPLATE_ID_EKU0011A010 = "EKU0011A010";
	/* ++++++++++ v22.00.00 追加終了 ++++++++++ */
	// OM-2019-0000515 ADD START
	/** 割引サービス契約一覧照会（割引サービス指定） */
	private static final String TEMPLATE_ID_EKK0451B010 = "EKK0451B010";
	// OM-2019-0000515 ADD END
	
	/** 工事受付コード "070":内容変更*/
	private static final String KOJI_UK_CD_NYO_CHG = "070";
	/** 工事受付詳細コード "A2":サービス内容変える */
	private static final String KOJI_UK_DTAIL_CD_SVC_NYO_CHG = "A2";
	
	/** サービスIF_ID */
	private static final String TEMPLATEID = "templateID";
	/** 機能コード */
	public static final String FUNC_CODE = "func_code";
	/** 申込明細番号 */
	public static final String MSKM_DTL_NO = "mskm_dtl_no";
	/** サービス契約番号 */
	public static final String SVC_KEI_NO = "svc_kei_no";
	/** サービス契約回線内訳番号 */
	public static final String SVC_KEI_KAISEN_UCWK_NO = "svc_kei_kaisen_ucwk_no";
	/** 工事受付コード */
	public static final String KOJI_UK_CD = "koji_uk_cd";
	/** 工事受付詳細コード */
	public static final String KOJI_UK_DTAIL_CD = "koji_uk_dtail_cd";
	/** 工事受付契機異動年月日時分秒 */
	public static final String KOJI_UK_OPTNTY_IDO_DTM = "koji_uk_optnty_ido_dtm";
	/** サービスコード */
	public static final String SVC_CD = "svc_cd";
	/** SYSID */
	public static final String SYSID = "sysid";
	
	/**
	 * 工事案件諸変更の共通処理をする。
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle,
												IRequestParameterReadWrite param,
												String fixedText) throws Throwable
	{
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		Map workMap = param.getMappingWorkArea();
		HashMap workDataMap = (HashMap)workMap.get("WORK");
		// params[0]：料金グループコード
		// params[1]：サービス契約番号
		// params[2]：運用日
		// params[3]：マンション物件コード
		// params[4]：申込明細番号
		// params[5]：サービス契約回線内訳番号
		// params[6]：工事受付契機異動年月日時分秒
		// params[7]：サービスコード
		// params[8]：サービス開始年月日
		// params[9]：SYSID
		// params[10]：マンション通信設備コード
		String[] params = (String[])workDataMap.get("params");
		
		// 工事諸変更処理
		executeKojiakUpd(handle, param, fixedText, params);
		
		return param;
	}
	
	/**
	 * 工事案件諸変更処理を行う。
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param sysid
	 * @param mskmDtlNo
	 * @param ccMsg
	 * @throws Exception
	 */
	private void executeKojiakUpd(SessionHandle handle,
								IRequestParameterReadWrite param,
								String fixedText,
								String[] params) throws Exception
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		Object[][] inMsg = null;
		String famipaKeiUm = "";				// ファミリーパック契約有無
		boolean famipaKeiNonFixdFlg = false;	// ファミリーパック契約無 固定
		boolean eku0021SearchFlg = false;		// 工事案件<eo光ネット>検索フラグ
		boolean eku0061SearchFlg = false;		// 工事案件<eo光ネットマンション検索フラグ
		boolean execEKU0021C010Flg = false;	// 工事案件＜eo光ネット＞諸変更
		boolean execEKU0031C010Flg = false;	// 工事案件＜eo光テレビ＞諸変更
		boolean execEKU0041C010Flg = false;	// 工事案件＜eo光テレビ回線＞諸変更
		boolean execEKU0061C010Flg = false;	// 工事案件＜eo光ネットマンション＞諸変更
		
		String prcGrpCd = params[0];			// 料金グループコード
		String mansionBukkenCd = params[3];		// マンション物件コード
		
		// 料金グループコード"02":ｅｏ光ネットホームタイプ
		if(JKKSvcConst.PRC_GRP_CD_NET_HM.equals(prcGrpCd))
		{
			execEKU0021C010Flg = true;
			eku0021SearchFlg = true;
		}
		// 料金グループコード"03":ｅｏ光ネットメゾンタイプ または "04":ｅｏ光ネットマンションタイプ
		else if(JKKSvcConst.PRC_GRP_CD_NET_MZ.equals(prcGrpCd) || JKKSvcConst.PRC_GRP_CD_NET_MT.equals(prcGrpCd))
		{
			execEKU0061C010Flg = true;
			eku0061SearchFlg = true;
		}
		// 料金グループコード"10":ｅｏ光電話
		else if(JKKSvcConst.PRC_GRP_CD_TEL.equals(prcGrpCd))
		{
			famipaKeiNonFixdFlg = true;
			
/* ++++++++++ v4.00.01 追加開始 ++++++++++ */
			// マンション物件コード"001":マンション または "002":メゾン
			if (JKKStrConst.MANSION_BUKKEN_CD_MANSION.equals(mansionBukkenCd) 
			 || JKKStrConst.MANSION_BUKKEN_CD_MEZON.equals(mansionBukkenCd))
/* ++++++++++ v4.00.01 追加終了 ++++++++++ */
			{
				execEKU0061C010Flg = true;
			}
			else
			{
				execEKU0021C010Flg = true;
			}
		}
		// 料金グループコードが"11":ｅｏ光テレビ(Ｋ−ＣＡＴ) または "13":ｅｏ光テレビ(再送信)
		else if(JKKSvcConst.PRC_GRP_CD_TV_KCAT.equals(prcGrpCd) || JKKSvcConst.PRC_GRP_CD_TV_RE_SEND.equals(prcGrpCd))
		{
			execEKU0031C010Flg = true;
		}
		// 料金グループコードが"12":ｅｏ光テレビ(ＫＣＮ)
		else if(JKKSvcConst.PRC_GRP_CD_TV_KCN.equals(prcGrpCd))
		{
			execEKU0041C010Flg = true;
		}
		
		// ■ファミリーパック契約有無判定
		if (famipaKeiNonFixdFlg)
		{
			// ネット契約以外はファミリーパック契約はできないがｅｏ光電話の場合
			// サービスI/FのIN項目であり工事側のOPMS連携で必須項目の為に"0":無を設定
			famipaKeiUm = JKKSvcConst.UM_NASI;
		}
		else
		{
			// ※ネット契約(ホーム・メゾン・マンション)の場合
			// 料金グループコード"02":ｅｏ光ネットホームタイプ
			if (eku0021SearchFlg)
			{
				// 工事案件<eo光ネット>.ファミリーパック契約有無の値を格納
				famipaKeiUm = getFamipaKeiUm(handle, scCall, param, fixedText, params[1], false);
			}
			// 料金グループコード"04":ｅｏ光ネットマンションタイプ
			// 料金グループコード"03":ｅｏ光ネットメゾンタイプ
			else if (eku0061SearchFlg)
			{
				// 工事案件<eo光ネットマンション>.ファミリーパック契約有無の値を格納
				famipaKeiUm = getFamipaKeiUm(handle, scCall, param, fixedText, params[1], true);
			}
		}
		
		// ■メッセージ作成
		if (execEKU0021C010Flg)
		{
			// 工事案件(eo光ネット)諸変更
			/* ++++++++++ v22.00.00 変更開始 ++++++++++ */
//			inMsg = editInMsgKojiakUpdNet(params, famipaKeiUm);
			inMsg = editInMsgKojiakUpdNet(params, famipaKeiUm, handle, scCall, param, fixedText);
			/* ++++++++++ v22.00.00 変更終了 ++++++++++ */
		}
		else if (execEKU0031C010Flg)
		{
			// 工事案件(eo光テレビ)諸変更
			inMsg = editInMsgKojiakUpd(params, TEMPLATE_ID_EKU0031C010);
		}
		else if(execEKU0041C010Flg)
		{
			// 工事案件(eo光テレビ回線)諸変更
			inMsg = editInMsgKojiakUpd(params, TEMPLATE_ID_EKU0041C010);
		}
		else if(execEKU0061C010Flg)
		{
			// 工事案件(eo光ネットマンション)諸変更
			/* ++++++++++ v22.00.00 変更開始 ++++++++++ */
//			inMsg = editInMsgKojiakUpdMans(params, famipaKeiUm);
			inMsg = editInMsgKojiakUpdMans(params, famipaKeiUm, handle, scCall, param, fixedText);
			/* ++++++++++ v22.00.00 変更終了 ++++++++++ */
		}
		
		// ■サービスI/F実行
		if (inMsg != null)
		{
			CAANMsg outMsg = callSC(handle, scCall, param, fixedText, inMsg);
		}
	}
	
	/**
	 * ファミリーパック契約有無取得処理を行う。
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param svcKeiNo
	 * @param mansFlg
	 * @throws Exception
	 */
	private String getFamipaKeiUm(
									SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String fixedText,
									String svcKeiNo, 
									boolean mansFlg) throws Exception
	{
		// ■サービス契約_工事案件一覧照会
		Object[][] eku0081b010In = {{EKU0081B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKU0081B010},
									{EKU0081B010CBSMsg.FUNC_CODE, "1"},
									{EKU0081B010CBSMsg.KEY_SVC_KEI_NO, svcKeiNo}};
		
		CAANMsg[] eku81b010Out = callSC(handle, scCall, param, fixedText, eku0081b010In).getCAANMsgList(EKU0081B010CBSMsg.EKU0081B010CBSMSG1LIST);
		
		if (null != eku81b010Out && eku81b010Out.length > 0)
		{
			// 工事案件番号取得
			String kojiakNo = eku81b010Out[0].getString("kojiak_no");
			
			if (mansFlg)
			{
				// ■工事案件<eo光ネットマンション>一意照会
				Object[][] eku0061a010In = {{EKU0061A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKU0061A010},
											{EKU0061A010CBSMsg.FUNC_CODE, "1"},
											{EKU0061A010CBSMsg.KEY_KOJIAK_NO, kojiakNo}};
				
				CAANMsg[] eku0061a010Out = callSC(handle, scCall, param, fixedText, eku0061a010In).getCAANMsgList(EKU0061A010CBSMsg.EKU0061A010CBSMSG1LIST);
				if (null != eku0061a010Out && eku0061a010Out.length > 0)
				{
					// ファミリーパック契約有無
					// OM-2019-0000515 MOD START
					// ファミリーパック契約有無が""(空)の場合はファミリーパックの割引契約が存在するか確認する。
					// (撤去工事を掴んだ場合、""(空)となるため)
//					return eku0061a010Out[0].getString("famipa_kei_um");
					return checkFamipaKeiUm(handle, scCall, param, fixedText, svcKeiNo, eku0061a010Out[0].getString("famipa_kei_um"));
					// OM-2019-0000515 MOD END
				}
			}
			else
			{
				// ■工事案件<eo光ネット>一意照会
				Object[][] eku0021a010In = {{EKU0021A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKU0021A010},
											{EKU0021A010CBSMsg.FUNC_CODE, "1"},
											{EKU0021A010CBSMsg.KEY_KOJIAK_NO, kojiakNo}};
				
				CAANMsg[] eku0021a010Out = callSC(handle, scCall, param, fixedText, eku0021a010In).getCAANMsgList(EKU0021A010CBSMsg.EKU0021A010CBSMSG1LIST);
				if (null != eku0021a010Out && eku0021a010Out.length > 0)
				{
					// ファミリーパック契約有無
					// OM-2019-0000515 MOD START
					// ファミリーパック契約有無が""(空)の場合はファミリーパックの割引契約が存在するか確認する。
					// (撤去工事を掴んだ場合、""(空)となるため)
//					return eku0021a010Out[0].getString("famipa_kei_um");
					return checkFamipaKeiUm(handle, scCall, param, fixedText, svcKeiNo, eku0021a010Out[0].getString("famipa_kei_um"));
					// OM-2019-0000515 MOD END
				}
			}
		}
		
		return "";
	}
	
	// OM-2019-0000515 ADD START
	/**
	 * ファミリーパック契約有無のチェック処理を行う。
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param svcKeiNo
	 * @param famipaKeiUm
	 * @return 0:ファミリーパック契約なし 1:ファミリーパック契約あり
	 * @throws Exception
	 */
	private String checkFamipaKeiUm(
								SessionHandle handle,
								ServiceComponentRequestInvoker scCall,
								IRequestParameterReadWrite param,
								String fixedText,
								String svcKeiNo,
								String famipaKeiUm
	) throws Exception
	{
		// 引数のファミリーパック契約有無が""(空)かnullではない場合、チェック処理は不要
		if (!JKKStringUtil.isNullEmpty(famipaKeiUm)) 
		{
			return famipaKeiUm;
		}
		
		// ■割引サービス契約一覧照会（割引サービス指定）
		Object[][] ekk0451b010In = {
									{EKK0451B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0451B010},
									{EKK0451B010CBSMsg.FUNC_CODE, "1"},
									{EKK0451B010CBSMsg.KEY_SVC_KEI_NO, svcKeiNo},
									{EKK0451B010CBSMsg.KEY_WRIB_SVC_CD, JKKStrConst.WRIB_SVC_FAMIPA}
		};
		
		CAANMsg[] ekk0451b010Out = callSC(handle, scCall, param, fixedText, ekk0451b010In).getCAANMsgList(EKK0451B010CBSMsg.EKK0451B010CBSMSG1LIST);
		
		if (null != ekk0451b010Out && ekk0451b010Out.length > 0)
		{
			return "1";
		}
		
		return "0";
	}
	// OM-2019-0000515 ADD END
	
	/**
	 * チェック処理<br>
	 * サービスコンポーネント実行用CAANMsgを返却します。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param (I) 業務データ取得用I/F
	 * @param fixedText (I) ユーザ定義文字列
	 * @return HashMap<String, Object>
	 * @exception RequestParameterExceptionがスローされます 。
	 */
	@SuppressWarnings("unchecked")
	public  HashMap<String, Object> getInvokeCBS(SessionHandle handle,
												IRequestParameterReadWrite param,
												String fixedText) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		List<CAANMsg> templates = new ArrayList<CAANMsg>();
		
		// チェック用サービスインターフェイス
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, Arrays.asList(templates));
		
		return paramMap;
	}
	
	/**
	 * サービスインターフェイス処理結果(エラー情報)の取得<br>
	 * 業務データ取得・書込用I/Fをそのまま返却します。<br>
	 * <br>
	 * @param param デルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param templates CAANMsgクラス配列
	 * @param returnCode リターンコード
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param,
													CAANMsg[] templates,
													int returnCode,
													String fixedText) throws Throwable
	{
		for (int i = 0; i < templates.length; i++)
		{
			editErrorInfo(param, templates, returnCode, fixedText);
		}
		return param;
	}
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * <br>
	 * @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);
		
		editErrorInfo(param, templates, (Integer)return_code, dataMapKey, mappingData);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(return_code.toString()) && 0 == status))
		{
			if(!("0".equals(return_code.toString()) && 4 == status))
			{
				throw new SCCallException("戻り値不正", return_code.toString(), status);
			}
		}
		
		return msg;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param dataMapKey
	 * @param mappingData
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfo(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 (0 != returnCode)
		{
			templateStatus = 9000;
		}
		
		if (null == JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)))
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (null == obj)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}
		
		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		HashMap<String, String> inMap = null;
		
		// ユーザデータ情報
		inMap = (HashMap<String, String>)param.getData(dataMapKey);
		
		for (int i = 0; i < mappingData.length; i++)
		{
			if (!template.isNull(mappingData[i][0] + "_err"))
			{
				if (!inMap.containsKey(mappingData[i][0] + "_err"))
				{
					inMap.put(mappingData[i][0] + "_err", template.getString(mappingData[i][0] + "_err"));
				}
			}
		}
		
		return param;
	}
	
	/**
	 * @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));
		setMsgAll(template);
		
		// オペレータ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++)
		{
			template = setMsgVal(template, (String)mappingData[i][0], (String)mappingData[i][1]);
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		return paramMap;
	}
	
	/**
	 * 上り項目全てに空値を設定します。
	 * <br>
	 * @param msg
	 */
	@SuppressWarnings("unchecked")
	private void setMsgAll(CAANMsg msg)
	{
		Iterator<String> msgKey = msg.getSchema().getSchemaKeySet().iterator();
		
		while (msgKey.hasNext())
		{
			String key = msgKey.next();
			
			if (!key.endsWith("_err"))
			{
				msg.setNull(key);
			}
		}
	}
	
	/**
	 * 値を設定します。
	 * <br>
	 * @param msg
	 * @param key
	 * @param value
	 * @return CAANMsg
	 */
	private CAANMsg setMsgVal(CAANMsg msg, String key, String value)
	{
		if (value == null || "".equals(value))
		{
			msg.setNull(key);
		}
		else
		{
			msg.set(key, value);
		}
		return msg;
	}
	
	/**
	 * 工事案件(eo光ネット)諸変更用のメッセージを作成します。
	 * <br>
	 * @param params
	 * @param famipaKeiUm
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @return Object[][]
	 * @throws Exception
	 */
	/* ++++++++++ v22.00.00 変更開始 ++++++++++ */
//	private Object[][] editInMsgKojiakUpdNet(String[] params, String famipaKeiUm)
	private Object[][] editInMsgKojiakUpdNet(
			String[] params,
			String famipaKeiUm,
			SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String fixedText) throws Exception
/* ++++++++++ v22.00.00 変更開始 ++++++++++ */	
	{
		/* ++++++++++ v22.00.00 追加開始 ++++++++++ */
		String kojiAkNo = "";
		String opSvKeiHktgiFlg = "";				// SIF:EKU0021C010のOPSVKEI_HKTGI_FLGに設定する変数
		String kepcoCustInfoJujuDoiUm = "";			// SIF:EKU0021C010のKEPCO_CTINFO_JUJU_DOI_UMに設定する変数
		
		// ■サービス契約_工事案件一覧照会
		Object[][] eku0081b010In = {{EKU0081B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKU0081B010},
									{EKU0081B010CBSMsg.FUNC_CODE, "1"},
									{EKU0081B010CBSMsg.KEY_SVC_KEI_NO, params[1]}};
		
		CAANMsg[] eku81b010Out = callSC(handle, scCall, param, fixedText, eku0081b010In).getCAANMsgList(EKU0081B010CBSMsg.EKU0081B010CBSMSG1LIST);
		
		if(null != eku81b010Out && eku81b010Out.length > 0)
		{
			// 工事案件番号取得
			 kojiAkNo = eku81b010Out[0].getString("kojiak_no");
		}
		
		if(!"".equals(kojiAkNo))
		{
			Object[][] eku0011A010In = {{EKU0011A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKU0011A010 },
										{EKU0011A010CBSMsg.FUNC_CODE, "1" },
										{EKU0011A010CBSMsg.KEY_KOJIAK_NO, kojiAkNo}};

			CAANMsg[] eku0011A010cbsMsg1list = callSC(handle, scCall, param, fixedText, eku0011A010In).getCAANMsgList(EKU0011A010CBSMsg.EKU0011A010CBSMSG1LIST);
			
			opSvKeiHktgiFlg = eku0011A010cbsMsg1list[0].getString(EKU0011A010CBSMsg1List.OPSVKEI_HKTGI_FLG);
			kepcoCustInfoJujuDoiUm = eku0011A010cbsMsg1list[0].getString(EKU0011A010CBSMsg1List.KEPCO_CUSTINFO_JUJU_DOI_UM);
		}
		
		/* ++++++++++ v22.00.00 追加終了 ++++++++++ */
		Object[][] inMsg = {{EKU0021C010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKU0021C010},
							{EKU0021C010CBSMsg.FUNC_CODE, "1"},
							{EKU0021C010CBSMsg.MSKM_DTL_NO, params[4]},
							{EKU0021C010CBSMsg.SVC_KEI_NO, params[1]},
							{EKU0021C010CBSMsg.SVC_KEI_KAISEN_UCWK_NO, params[5]},
							{EKU0021C010CBSMsg.KOJI_UK_CD, KOJI_UK_CD_NYO_CHG},
							{EKU0021C010CBSMsg.KOJI_UK_DTAIL_CD, KOJI_UK_DTAIL_CD_SVC_NYO_CHG},
							{EKU0021C010CBSMsg.KOJI_UK_OPTNTY_IDO_DTM, params[6]},
							{EKU0021C010CBSMsg.SVC_CD, params[7]},
							{EKU0021C010CBSMsg.SYSID, params[9]},
							/* ++++++++++ v22.00.00 変更開始 ++++++++++ */
//							{EKU0021C010CBSMsg.FAMILY_KEI_FLG, famipaKeiUm}};
							{EKU0021C010CBSMsg.FAMILY_KEI_FLG, famipaKeiUm},
							{EKU0021C010CBSMsg.OPSVKEI_HKTGI_FLG, opSvKeiHktgiFlg},
							{EKU0021C010CBSMsg.KEPCO_CTINFO_JUJU_DOI_UM, kepcoCustInfoJujuDoiUm}};
							/* ++++++++++ v22.00.00 変更終了 ++++++++++ */
		
		return inMsg;
	}
	
	/**
	 * 工事案件(eo光テレビ・eo光テレビ回線)諸変更用のメッセージを作成します。
	 * <br>
	 * @param params
	 * @return Object[][]
	 */
	private Object[][] editInMsgKojiakUpd(String[] params, String templateID)
	{
		Object[][] inMsg = {{TEMPLATEID, templateID},
							{FUNC_CODE, "1"},
							{MSKM_DTL_NO, params[4]},
							{SVC_KEI_NO, params[1]},
							{SVC_KEI_KAISEN_UCWK_NO, params[5]},
							{KOJI_UK_CD, KOJI_UK_CD_NYO_CHG},
							{KOJI_UK_DTAIL_CD, KOJI_UK_DTAIL_CD_SVC_NYO_CHG},
							{KOJI_UK_OPTNTY_IDO_DTM, params[6]},
							{SVC_CD, params[7]},
							{SYSID, params[9]}};
		
		return inMsg;
	}
	
	/**
	 * 工事案件(eo光ネットマンション)諸変更用のメッセージを作成します。
	 * <br>
	 * @param params
	 * @param famipaKeiUm
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @return Object[][]
	 * @throws Exception 
	 */
/* ++++++++++ v22.00.00 変更開始 ++++++++++ */
//	private Object[][] editInMsgKojiakUpdMans(String[] params, String famipaKeiUm)
	private Object[][] editInMsgKojiakUpdMans(
			String[] params,
			String famipaKeiUm,
			SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String fixedText) throws Exception
/* ++++++++++ v22.00.00 変更開始 ++++++++++ */
	{
		/* ++++++++++ v22.00.00 追加開始 ++++++++++ */
		String kojiAkNo = "";
		String rnkeiSvcStaymd = "";
		String opSvKeiHktgiFlg = "";				// SIF:EKU0061C010のOPSVKEI_HKTGI_FLGに設定する変数
		String kepcoCustInfoJujuDoiUm = "";			// SIF:EKU0061C010のKEPCO_CTINFO_JUJU_DOI_UMに設定する変数
		String svcStaYmd = "";						// SIF:EKU0061C010のSVC_STAYMDに設定する変数
		
		// ■サービス契約_工事案件一覧照会
		Object[][] eku0081b010In = {{EKU0081B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKU0081B010},
									{EKU0081B010CBSMsg.FUNC_CODE, "1"},
									{EKU0081B010CBSMsg.KEY_SVC_KEI_NO, params[1]}};
		
		CAANMsg[] eku81b010Out = callSC(handle, scCall, param, fixedText, eku0081b010In).getCAANMsgList(EKU0081B010CBSMsg.EKU0081B010CBSMSG1LIST);
		
		if(null != eku81b010Out && eku81b010Out.length > 0)
		{
			// 工事案件番号取得
			 kojiAkNo = eku81b010Out[0].getString("kojiak_no");
		}
		
		if(!"".equals(kojiAkNo))
		{
			Object[][] eku0011A010In = {{EKU0011A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKU0011A010 },
										{EKU0011A010CBSMsg.FUNC_CODE, "1" },
										{EKU0011A010CBSMsg.KEY_KOJIAK_NO, kojiAkNo}};

			CAANMsg[] eku0011A010cbsMsg1list = callSC(handle, scCall, param, fixedText, eku0011A010In).getCAANMsgList(EKU0011A010CBSMsg.EKU0011A010CBSMSG1LIST);
			
			rnkeiSvcStaymd = eku0011A010cbsMsg1list[0].getString(EKU0011A010CBSMsg1List.RNKI_SVC_STAYMD);
			opSvKeiHktgiFlg = eku0011A010cbsMsg1list[0].getString(EKU0011A010CBSMsg1List.OPSVKEI_HKTGI_FLG);
			kepcoCustInfoJujuDoiUm = eku0011A010cbsMsg1list[0].getString(EKU0011A010CBSMsg1List.KEPCO_CUSTINFO_JUJU_DOI_UM);
		}
		
		// 引き渡されたサービス開始日が空でない場合
		if(!"".equals(params[8]))
		{
			// 引き渡されたサービス開始日を設定
			svcStaYmd = params[8];
		}
		// 引き渡されたサービス開始日が空の場合
		else
		{
			// 工事案件より取得した連携サービス開始年月日を設定
			svcStaYmd = rnkeiSvcStaymd;
		}
		/* ++++++++++ v22.00.00 追加終了 ++++++++++ */
		Object[][] inMsg = {{EKU0061C010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKU0061C010},
							{EKU0061C010CBSMsg.FUNC_CODE, "1"},
							{EKU0061C010CBSMsg.MSKM_DTL_NO, params[4]},
							{EKU0061C010CBSMsg.SVC_KEI_NO, params[1]},
							{EKU0061C010CBSMsg.SVC_KEI_KAISEN_UCWK_NO, params[5]},
							{EKU0061C010CBSMsg.KOJI_UK_CD, KOJI_UK_CD_NYO_CHG},
							{EKU0061C010CBSMsg.KOJI_UK_DTAIL_CD, KOJI_UK_DTAIL_CD_SVC_NYO_CHG},
							{EKU0061C010CBSMsg.KOJI_UK_OPTNTY_IDO_DTM, params[6]},
							{EKU0061C010CBSMsg.SVC_CD, params[7]},
							{EKU0061C010CBSMsg.SYSID, params[9]},
							/* ++++++++++ v22.00.00 変更開始 ++++++++++ */
//							{EKU0061C010CBSMsg.SVC_STAYMD, params[8]},
							{EKU0061C010CBSMsg.SVC_STAYMD, svcStaYmd},
							/* ++++++++++ v22.00.00 変更終了 ++++++++++ */
							{EKU0061C010CBSMsg.PRC_GRP_CD, params[0]},
							{EKU0061C010CBSMsg.MANSION_BUKKEN_CD, params[3]},
							{EKU0061C010CBSMsg.MANS_TUSHIN_EQUIP_CD, params[10]},
							/* ++++++++++ v22.00.00 変更開始 ++++++++++ */
//							{EKU0021C010CBSMsg.FAMILY_KEI_FLG, famipaKeiUm}};
							{EKU0061C010CBSMsg.FAMILY_KEI_FLG, famipaKeiUm},
							{EKU0061C010CBSMsg.OPSVKEI_HKTGI_FLG, opSvKeiHktgiFlg},
							{EKU0061C010CBSMsg.KEPCO_CTINFO_JUJU_DOI_UM, kepcoCustInfoJujuDoiUm}};
							/* ++++++++++ v22.00.00 変更終了 ++++++++++ */
		
		return inMsg;
	}
}
