/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JKKSameSeikyskKeishaCC
 *	ソースファイル名：JKKSameSeikyskKeishaCC.java
 *	作成者			：FJ
 *	日付			：2012年01月04日
 *＜機能概要＞
 *	同一請求先契約者名照会共通コンポーネント
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2012/01/04	FJ			新規作成
 *	v3.00.00	2012/09/05	FJ) 団		【ANK-0546-02-00】イオスマートリンク対応
 *
 **********************************************************************/
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.util.JPCDateChecker;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;

/**
 * 同一請求先契約者名の照会を行う部品。<p>
 * 
 * @author 富士通
 *
 */
public class JKKSameSeikyskKeishaCC extends AbstractCommonComponent
{
	/**
	 * テンプレートID(EKK0081A010)
	 */
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	/**
	 * テンプレートID(ECK0011A010)
	 */
	private static final String TEMPLATE_ID_ECK0011A010 = "ECK0011A010";

	/**
	 * 課金先一覧照会（請求契約番号／サービス契約番号）明細の件数分、
	 *サービス契約一意照会、お客様一意照会サービスインターフェイスを呼出し、
	 *同一請求先契約者名の照会を行う。
	 *
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite searchSameSeikyskKeisha(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		Map<?, ?> result = null;
		HashMap<String, Object> dataMap = new HashMap<String, Object>();
		ArrayList<HashMap<String, Object>> work02List = new ArrayList<HashMap<String, Object>>();

		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData("KKSV033802CC");

		// 作業領域の取得
		Map workMap = param.getMappingWorkArea();
		/* 作業項目情報 */
		HashMap<String, Object> ekk0321B002WorkMap = (HashMap<String, Object>)workMap.get("WORK");
		ArrayList<HashMap<String, Object>> ekk0321B002workDataList = (ArrayList<HashMap<String, Object>>)ekk0321B002WorkMap.get("EKK0321B002CBSMsg1List");

		// リクエストパラメータ．課金先一覧照会（請求契約番号／サービス契約番号）の要素数分、処理を繰り返し行う。
		for (int i = 0; i < ekk0321B002workDataList.size(); i++)
		{
			HashMap<String, Object> ekk0321inWorkMap = (HashMap<String, Object>)ekk0321B002workDataList.get(i);

			//サービス契約一意照会サービスI/Fの実行
			//上りマッピング処理
			//リクエストパラメータを引数に上りマッピング処理メソッドを実行
			CAANMsg template = editInMsg_EKK0081A010(param, inMap, ekk0321inWorkMap);
			HashMap<String, Object> paramMap = getParamMsg(param, new CAANMsg[]{template});

			//サービスIFの実行
			result = scCall.run(paramMap, handle);

			CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
			CAANMsg parentTemplate = templates[0];

			//下りマッピング処理
			editOutMsg_EKK0081A010(result, param, inMap);

			/* 処理結果の判定*/
			// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
			String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
			Integer status = parentTemplate.getInt(JCMConstants.STATUS_INT_KEY);

			// 異常の場合、SCCallExceptionを生成してスローする
			if(!("0".equals(rtnCode) && 0 == status.intValue()))
			{
				// 異常の場合、返却結果コードに"009003"を設定
				dataMap = new HashMap<String, Object>();
				dataMap.put("return_result_cd", "009003");
				param.setData("KKSV0338WORK03", dataMap);

				SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
				throw scCallEx;
			}

			//お客様一意照会サービスI/Fの実行
			//上りマッピング処理
			/* 作業項目情報 */
			HashMap<String, Object> ekk0081inWorkMap = (HashMap<String, Object>)workMap.get("WORK");
			if(!"".equals(ekk0081inWorkMap.get("sysid")))
			{
				// リクエストパラメータを引数に上りマッピング処理メソッドを実行
				template = editInMsg_ECK0011A010(param, inMap, ekk0081inWorkMap);
				paramMap = getParamMsg(param, new CAANMsg[]{template});

				//サービスIFの実行
				result = scCall.run(paramMap, handle);

				//下りマッピング処理
				editOutMsg_ECK0011A010(result, param, inMap);
			}
			/* ◇処理結果の判定*/
			// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
			rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
			status = parentTemplate.getInt(JCMConstants.STATUS_INT_KEY);

			// 異常の場合、SCCallExceptionを生成してスローする
			if(!("0".equals(rtnCode) && 0 == status.intValue()))
			{
				// 異常の場合、返却結果コードに"009003"を設定
				dataMap = new HashMap<String, Object>();
				dataMap.put("return_result_cd", "009003");
				param.setData("KKSV0338WORK03", dataMap);

				SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
				throw scCallEx;
			}
			//同一請求先契約者名照会作業項目マップ02マッピング処理
			getKKSV0338WORK02mapping(work02List, ekk0321inWorkMap, ekk0081inWorkMap);
		}
		dataMap.put("KKSV0338WORK02List", work02List);
		param.setData("KKSV0338WORK02", dataMap);

		// 正常の場合、返却結果コードに"000000"を設定
		dataMap = new HashMap<String, Object>();
		dataMap.put("return_result_cd", "000000");
		param.setData("KKSV0338WORK03", dataMap);

		return param;
	}

	/**
	 * チェック処理用のサービスインターフェイスを作成し、返却する。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return HashMap<String, Object> サービスインターフェイスマップ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, 
			IRequestParameterReadWrite param, 
			String fixedText) throws RequestParameterException
	{

		ArrayList<CAANMsg> templateList = new ArrayList<CAANMsg>();

		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData("KKSV033802CC");

		// 作業領域の取得
		Map workMap = param.getMappingWorkArea();
		/* 作業項目情報 */
		HashMap<String, Object> workDataMap = (HashMap<String, Object>)workMap.get("WORK");
		ArrayList ekk0321B002workDataList = (ArrayList)workDataMap.get("EKK0321B002CBSMsg1List");

		// リクエストパラメータ．課金先一覧照会（請求契約番号／サービス契約番号）明細の要素数分、処理を繰り返し行う。
		for (int i = 0; i < ekk0321B002workDataList.size(); i++)
		{
			HashMap<String, Object> ekk0321inWorkMap = (HashMap)ekk0321B002workDataList.get(i);
			HashMap<String, Object> ekk0081inWorkMap = (HashMap<String, Object>)workMap.get("WORK");

			// ◇ 上りマッピング処理
			templateList.add(editInMsg_EKK0081A010(param, inMap, ekk0321inWorkMap));
			templateList.add(editInMsg_ECK0011A010(param, inMap, ekk0081inWorkMap));
		}
		// リストに追加されたCAANMsgを配列に変換する
		CAANMsg[] templates = templateList.toArray(new CAANMsg[0]);
		// サービスI/F実行用マップを取得
		HashMap<String, Object> paramMap = getParamMsg(param, templates);

		return paramMap;
	}

	/**
	 * サービスインターフェイスリスト(CAANMsg[])からサービスI/F実行用マップを作成します<br>
	 * 
	 * @param param リクエストパラメータ
	 * @param templates サービスインターフェイスリスト
	 * @return HashMap<String, Object> サービスI/F実行用マップ
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> getParamMsg(IRequestParameterReadWrite param, CAANMsg[] templates) 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));

		// テンプレートリスト
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * サービス契約一意照会の上りマッピング処理です。
	 * 
	 * @param param リクエストパラメータ
	 * @param inMap 上りマップ
	 * @param inWorkMap 上り作業領域マップ
	 * @return CAANMsg サービスインターフェイス
	 * @throws RequestParameterException
	 */
	private CAANMsg editInMsg_EKK0081A010(IRequestParameterReadWrite param,
			HashMap<String, Object> inMap,
			HashMap<String, Object> inWorkMap) throws RequestParameterException
	{
		// サービス契約一意照会サービスインターフェイスを作成
		CAANMsg template = new CAANMsg(EKK0081A010CBSMsg.class.getName());
		// テンプレートID
		template.set(EKK0081A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081A010);
		// 機能コード
		template.set(EKK0081A010CBSMsg.FUNC_CODE, (String)inMap.get("func_code"));
		// オペレータ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 ("".equals(inWorkMap.get("svc_kei_no")))
		{
			template.setNull(EKK0081A010CBSMsg.KEY_SVC_KEI_NO);
		}
		else
		{
			template.set(EKK0081A010CBSMsg.KEY_SVC_KEI_NO, (String)inWorkMap.get("svc_kei_no"));
		}

		// 同一請求先契約者名照会マップ.ＫＥＹ＿世代登録年月日時分秒 → サービス契約一意照会.ＫＥＹ＿世代登録年月日時分秒
		if ("".equals(inMap.get("key_gene_add_dtm")))
		{
			template.setNull(EKK0081A010CBSMsg.KEY_GENE_ADD_DTM);
		}
		else
		{
			template.set(EKK0081A010CBSMsg.KEY_GENE_ADD_DTM, (String)inMap.get("key_gene_add_dtm"));
		}

		// 同一請求先契約者名照会マップ.ＫＥＹ＿予約適用年月日 → サービス契約一意照会.ＫＥＹ＿予約適用年月日
		if ("".equals(inMap.get("key_rsv_aply_ymd")))
		{
			template.setNull(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD);
		}
		else
		{
			template.set(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, (String)inMap.get("key_rsv_aply_ymd"));
		}

		return template;
	}

	/**
	 * サービス契約一意照会の下りマッピング処理です。
	 * 
	 * @param msgList 結果CAANMsgリスト
	 * @param param リクエストパラメータ
	 * @param inMap 上りマップ
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsg_EKK0081A010(Map<?, ?> msgList,
			IRequestParameterReadWrite param,
			HashMap<String, Object> inMap) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];

		// リターンコード取得
		int returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);

		// 結果を詰めるマップを取得
		HashMap<String, Object> dataMap = null;
		ArrayList<HashMap<String, Object>> dataList = null;

		// 業務データ設定
		dataMap = (HashMap<String, Object>)param.getData("KKSV033802CC");
		if (dataMap == null)
		{
			dataMap = new HashMap<String, Object>();
			param.setData("KKSV033802CC", dataMap);
		}
		/* 作業領域データ設定 */
		Map workMap = param.getMappingWorkArea();
		HashMap<String, Object> workDataMap = (HashMap<String, Object>)workMap.get("WORK");
		workDataMap = new HashMap<String, Object>();
		workMap.put("WORK", workDataMap);
		
		CAANMsg[] templateArray = parentTemplate.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
		dataList = (ArrayList<HashMap<String, Object>>)dataMap.get("EKK0081A010CBSMsg1List");
		
		if (dataList == null)
		{
			dataList = new ArrayList<HashMap<String, Object>>();
		}

		if (templateArray != null)
		{
			// オンライン処理日
			HashMap work01Map = (HashMap)param.getData("KKSV0338WORK01");
			String ope_date = (String)work01Map.get("ope_date");
			
			for (int i = 0; i < templateArray.length; i++)
			{
				CAANMsg childTemplate = templateArray[i];

				// 対象データは、以下の条件をすべて満たすもの。
				String svc_kei_stat = childTemplate.getString(EKK0081A010CBSMsg1List.SVC_KEI_STAT);
				// "020"(照査済)"030"(締結済)"100"(サービス提供中)"210"(休止・中断中)"220"(停止中)以外は対象データとしない。
				if (!("020".equals(svc_kei_stat) 
						|| "030".equals(svc_kei_stat) 
						|| "100".equals(svc_kei_stat) 
						|| "210".equals(svc_kei_stat)
						|| "220".equals(svc_kei_stat)))
				{
					continue;
				}
				String svc_cancel_ymd = childTemplate.getString(EKK0081A010CBSMsg1List.SVC_CANCEL_YMD);
				if (svc_cancel_ymd != null && !"".equals(svc_cancel_ymd))
				{
					// 過去日チェック(オンライン処理日よりサービスキャンセル年月日が(同日を含めて)過去日の場合はtrue)
					if (JPCDateChecker.isPastDate(svc_cancel_ymd, ope_date, "1"))
					{
						continue;
					}
				}
				// ◇対象データのマッピングを行う
				HashMap<String, Object> childMap = new HashMap<String, Object>();
				
				// SYSID
				if (childTemplate.isNull(EKK0081A010CBSMsg1List.SYSID))
				{
					childMap.put("sysid", "");
					workDataMap.put("sysid", "");
				}
				else
				{
					childMap.put("sysid", childTemplate.getString(EKK0081A010CBSMsg1List.SYSID));
					workDataMap.put("sysid", childTemplate.getString(EKK0081A010CBSMsg1List.SYSID));
				}
				// サービスキャンセル年月日
				if (childTemplate.isNull(EKK0081A010CBSMsg1List.SVC_CANCEL_YMD))
				{
					childMap.put("svc_cancel_ymd", "");
				}
				else
				{
					childMap.put("svc_cancel_ymd", childTemplate.getString(EKK0081A010CBSMsg1List.SVC_CANCEL_YMD));
				}
				// サービス開始年月日
				if (childTemplate.isNull(EKK0081A010CBSMsg1List.SVC_STA_YMD))
				{
					childMap.put("svc_sta_ymd", "");
				}
				else
				{
					childMap.put("svc_sta_ymd", childTemplate.getString(EKK0081A010CBSMsg1List.SVC_STA_YMD));
				}
				// サービス終了年月日
				if (childTemplate.isNull(EKK0081A010CBSMsg1List.SVC_ENDYMD))
				{
					childMap.put("svc_endymd", "");
				}
				else
				{
					childMap.put("svc_endymd", childTemplate.getString(EKK0081A010CBSMsg1List.SVC_ENDYMD));
				}
				dataList.add(childMap);
			}
		}
		dataMap.put("EKK0081A010CBSMsg1List", dataList);

		// エラー情報の設定
		editErrorInfo_EKK0081A010(param, inMap, templates, returnCode);
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}

	/**
	 * お客様一意照会の上りマッピング処理です。
	 * 
	 * @param param リクエストパラメータ
	 * @param inMap 上りマップ
	 * @param inWorkMap 上り作業領域マップ
	 * @return CAANMsg サービスインターフェイス
	 * @throws RequestParameterException
	 */
	private CAANMsg editInMsg_ECK0011A010(IRequestParameterReadWrite param,
			HashMap<String, Object> inMap,
			HashMap<String, Object> inWorkMap) throws RequestParameterException
	{
		// お客様一意照会サービスインターフェイスを作成
		CAANMsg template = new CAANMsg(ECK0011A010CBSMsg.class.getName());

		// テンプレートID
		template.set(ECK0011A010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0011A010);
		// 機能コード
		template.set(ECK0011A010CBSMsg.FUNC_CODE, (String)inMap.get("func_code"));
		// オペレータ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);

		// ◇ 業務データの設定
		// 作業項目マップ.SYSID → お客様一意照会.ＫＥＹ＿SYSID
		if ("".equals(inWorkMap.get("sysid")))
		{
			template.setNull(ECK0011A010CBSMsg.KEY_SYSID);
		}
		else
		{
			template.set(ECK0011A010CBSMsg.KEY_SYSID, (String)inWorkMap.get("sysid"));
		}
		// 同一請求先契約者名照会マップ.ＫＥＹ＿世代登録年月日時分秒 → お客様一意照会.ＫＥＹ＿世代登録年月日時分秒
		if ("".equals(inMap.get("key_gene_add_dtm")))
		{
			template.setNull(ECK0011A010CBSMsg.KEY_GENE_ADD_DTM);
		}
		else
		{
			template.set(ECK0011A010CBSMsg.KEY_GENE_ADD_DTM, (String)inMap.get("key_gene_add_dtm"));
		}
		// 同一請求先契約者名照会マップ.ＫＥＹ＿予約適用年月日 → お客様一意照会.ＫＥＹ＿予約適用年月日
		if ("".equals(inMap.get("key_rsv_aply_ymd")))
		{
			template.setNull(ECK0011A010CBSMsg.KEY_RSV_APLY_YMD);
		}
		else
		{
			template.set(ECK0011A010CBSMsg.KEY_RSV_APLY_YMD, (String)inMap.get("key_rsv_aply_ymd"));
		}

		return template;
	}

	/**
	 * お客様一意照会の下りマッピング処理です。
	 * 
	 * @param msgList 結果CAANMsgリスト
	 * @param param リクエストパラメータ
	 * @param inMap 上りマップ
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsg_ECK0011A010(Map<?, ?> msgList,
			IRequestParameterReadWrite param,
			HashMap<String, Object> inMap) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];

		// リターンコード取得
		int returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);

		// 結果を詰めるマップを取得
		HashMap<String, Object> dataMap = null;
		ArrayList<HashMap<String, Object>> dataList = null;

		// 業務データ設定
		dataMap = (HashMap<String, Object>)param.getData("KKSV033802CC");
		if (dataMap == null)
		{
			dataMap = new HashMap<String, Object>();
			param.setData("KKSV033802CC", dataMap);
		}

		CAANMsg[] templateArray = parentTemplate.getCAANMsgList(ECK0011A010CBSMsg.ECK0011A010CBSMSG1LIST);
		dataList = (ArrayList<HashMap<String, Object>>)dataMap.get("ECK0011A010CBSMsg1List");
		if (dataList == null)
		{
			dataList = new ArrayList<HashMap<String, Object>>();
		}

		if (templateArray != null)
		{
			// オンライン処理日
			HashMap work01Map = (HashMap)param.getData("KKSV0338WORK01");
			@SuppressWarnings("unused")
			String ope_date = (String)work01Map.get("ope_date");

			for (int i = 0; i < templateArray.length; i++)
			{
				CAANMsg childTemplate = templateArray[i];

				// ◇対象データのマッピングを行う
				HashMap<String, Object> childMap = new HashMap<String, Object>();
				/* 作業領域データ設定 */
				Map workMap = param.getMappingWorkArea();
				HashMap<String, Object> workDataMap = (HashMap<String, Object>)workMap.get("WORK");
				
				// お客様名
				if (childTemplate.isNull(ECK0011A010CBSMsg1List.CUST_NM))
				{
					childMap.put("cust_nm", "");
					workDataMap.put("cust_nm", "");
				}
				else
				{
					childMap.put("cust_nm", childTemplate.getString(ECK0011A010CBSMsg1List.CUST_NM));
					workDataMap.put("cust_nm", childTemplate.getString(ECK0011A010CBSMsg1List.CUST_NM));
				}
				dataList.add(childMap);
			}
		}
		dataMap.put("ECK0011A010CBSMsg1List", dataList);

		// エラー情報の設定
		editErrorInfo_ECK0011A010(param, inMap, templates, returnCode);
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}

	/**
	 * 同一請求先契約者名照会作業項目マップ02マッピング
	 * @param list
	 * @param inWorkMap01 上り作業領域マップ
	 * @param inWorkMap02 上り作業領域マップ
	 */
	public void getKKSV0338WORK02mapping(ArrayList<HashMap<String, Object>> list, 
			HashMap<String, Object> inWorkMap01, 
			HashMap<String, Object> inWorkMap02)
	{
		HashMap<String, Object> childMap = new HashMap<String, Object>();

		// 同一請求先契約者名照会作業項目マップ02.サービス契約番号 ← 作業項目マップ.サービス契約番号
		childMap.put("svc_kei_no", (String)inWorkMap01.get("svc_kei_no"));
		// 同一請求先契約者名照会作業項目マップ02.SYSID ← 作業項目マップ.SYSID
		if ("".equals(inWorkMap02.get("sysid")))
		{
			childMap.put("sysid", "");
		}
		else
		{
			childMap.put("sysid", (String)inWorkMap02.get("sysid"));
		}
		// 同一請求先契約者名照会作業項目マップ02.お客様名 ← 作業項目マップ.お客様名
		if ("".equals(inWorkMap02.get("cust_nm")))
		{
			childMap.put("cust_nm", "");
		}
		else
		{
			childMap.put("cust_nm", (String)inWorkMap02.get("cust_nm"));
		}
		list.add(childMap);
	}

	/**
	 * サービス契約一意照会サービスインターフェイスのエラー情報をマッピングする。
	 * 
	 * @param param リクエストパラメータ
	 * @param inMap 上りマップ
	 * @param templates サービスインターフェイスリスト
	 * @param returnCode リターンコード
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @throws RequestParameterException
	 */
	private IRequestParameterReadWrite editErrorInfo_EKK0081A010(IRequestParameterReadWrite param, 
			HashMap<String, Object> inMap,
			CAANMsg[] templates,
			int returnCode) throws RequestParameterException
	{

		CAANMsg template = templates[0];

		int templateStatus = template.getInt(EKK0081A010CBSMsg.STATUS);
		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);
		}

		if (!template.isNull(EKK0081A010CBSMsg.KEY_SVC_KEI_NO_ERR))
		{
			if (!inMap.containsKey("key_svc_kei_no_err"))
			{
				inMap.put("key_svc_kei_no_err", template.getString(EKK0081A010CBSMsg.KEY_SVC_KEI_NO_ERR));
			}
		}

		if (!template.isNull(EKK0081A010CBSMsg.KEY_GENE_ADD_DTM_ERR))
		{
			if (!inMap.containsKey("key_gene_add_dtm_err"))
			{
				inMap.put("key_gene_add_dtm_err", template.getString(EKK0081A010CBSMsg.KEY_GENE_ADD_DTM_ERR));
			}
		}

		if (!template.isNull(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD_ERR))
		{
			if (!inMap.containsKey("key_rsv_aply_ymd_err"))
			{
				inMap.put("key_rsv_aply_ymd_err", template.getString(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD_ERR));
			}
		}

		return param;
	}

	/**
	 * お客様一意照会サービスインターフェイスのエラー情報をマッピングする。
	 * 
	 * @param param リクエストパラメータ
	 * @param inMap 上りマップ
	 * @param templates サービスインターフェイスリスト
	 * @param returnCode リターンコード
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @throws RequestParameterException
	 */
	private IRequestParameterReadWrite editErrorInfo_ECK0011A010(IRequestParameterReadWrite param, 
			HashMap<String, Object> inMap,
			CAANMsg[] templates,
			int returnCode) throws RequestParameterException
	{

		CAANMsg template = templates[0];

		int templateStatus = template.getInt(ECK0011A010CBSMsg.STATUS);
		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);
		}

		if (!template.isNull(ECK0011A010CBSMsg.KEY_SYSID_ERR))
		{
			if (!inMap.containsKey("key_sysid_err"))
			{
				inMap.put("key_sysid_err", template.getString(ECK0011A010CBSMsg.KEY_SYSID_ERR));
			}
		}

		if (!template.isNull(ECK0011A010CBSMsg.KEY_GENE_ADD_DTM_ERR))
		{
			if (!inMap.containsKey("key_gene_add_dtm_err"))
			{
				inMap.put("key_gene_add_dtm_err", template.getString(ECK0011A010CBSMsg.KEY_GENE_ADD_DTM_ERR));
			}
		}

		if (!template.isNull(ECK0011A010CBSMsg.KEY_RSV_APLY_YMD_ERR))
		{
			if (!inMap.containsKey("key_rsv_aply_ymd_err"))
			{
				inMap.put("key_rsv_aply_ymd_err", template.getString(ECK0011A010CBSMsg.KEY_RSV_APLY_YMD_ERR));
			}
		}

		return param;
	}

	/**
	 * サービスインターフェイスのエラー情報をマッピングする。
	 * 
	 * @param param リクエストパラメータ
	 * @param templates サービスインターフェイスリスト
	 * @param returnCode リターンコード
	 * @param fixedText サービスメッセージ
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @exception RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, 
			CAANMsg[] templates,
			int returnCode,
			String fixedText) throws RequestParameterException
	{

		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData("KKSV033802CC");

		for (int i = 0; i < templates.length; i++)
		{
			CAANMsg msg = templates[i];
			String templateID = msg.getString("templateID");

			if (TEMPLATE_ID_EKK0081A010.equals(templateID))
			{
				editErrorInfo_EKK0081A010(param, inMap, templates, returnCode);
			}

			if (TEMPLATE_ID_ECK0011A010.equals(templateID))
			{
				editErrorInfo_ECK0011A010(param, inMap, templates, returnCode);
			}
		}
		return param;
	}
}
