/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JCRToiawaseSvcInfoParamOpsCC
*	ソースファイル名：JCRToiawaseSvcInfoParamOpsCC.java
*	作成者			：FJ)澤田
*	日付			：2019年04月01日
*＜機能概要＞
*	問合せ客情報一覧照会（オペレータ支援）マッピングCCの共通コンポーネントクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v62.00.00	2022/09/20	FJ)澤田		【ANK-4237-00-00】問合せ客情報一覧照会（オペレータ支援）
*	v62.00.01	2022/12/26	FJ)澤田		【OM-2022-0001164】オペレータ支援でお客様を照会したら 対象者が２人で照会されるところ １人だけ照会された
*	v64.00.00	2023/02/09	FJ)藤本涼	【ANK-4378-00-00】オペレータ支援向けAPI変更対応（2023年3月）
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.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.CCException;
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 com.fujitsu.futurity.model.common.check.DatetimeCheck;
import com.fujitsu.futurity.model.common.check.EmsizeCharCheck;
import com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;
import com.fujitsu.futurity.model.common.check.MixCharCheck;

import eo.common.constant.JCRStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JCRUtilCommon;
import eo.common.util.JKKCommonUtil;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.ECK0051B020CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECR0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECR0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0251A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0251A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0491A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2961B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2961B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2981A010CBSMsg;

public class JCRToiawaseSvcInfoParamOpsCC extends AbstractCommonComponent{

	/** テンプレートID(ECR0011A010) 対応記録一意照会 */
	private static final String TEMPLATE_ID = "ECR0011A010";
	//ANK-4378-00-00 ADD START
	/** テンプレートID(EKK2961B001) サービス契約グループ設定一覧照会（サービス契約番号） */
	private static final String TEMPLATE_ID_EKK2961B001 = "EKK2961B001";
	
	/** テンプレートID(EKK0251A010) サービス契約回線内訳一意照会 */
	private static final String TEMPLATE_ID_EKK0251A010 = "EKK0251A010";
	//ANK-4378-00-00 ADD END
	/** エラー情報マップキー*/
	private static final String KEY_ERROR_INFO = "ERROR_INFO";
	
	/** エラーコードマップキー*/
	private static final String KEY_ERR_CD = "errCode";

	/** エラーメッセージマップキー*/
	private static final String KEY_ERRMSG = "errMessage";

	/** エラーコード 必須チェックエラー*/
	private static final String REQUIRED_ERROR 	= "1001";

	/** エラーコード 属性チェックエラー*/
	private static final String ATTRIBUTE_ERROR	= "1002";

	/** エラーコード 桁数チェックエラー*/
	private static final String LENGTH_ERROR		= "1003";

	/** エラーコード リクエストチェックエラー*/
	private static final String REQUEST_ERROR		= "1004";

	/** エラーコード 件数結果チェック*/
	private static final String NODATE_ERROR		= "2001";

	/** エラーコード 件数結果チェック*/
	private static final String LIMIT_OVER_ERROR	= "2002";
	
	/**
	 * 形式             チェックパラメータ
	 * ---------------+----------------------------------
	 * 半角英数字1		hannkakuesuuji1
	 * 半角英数字2		hannkakuesuuji2
	 * 半角英数字8		hannkakuesuuji8
	 * 半角数字1		hannkakusuuji1
	 * 全角英数字カナ	zenkakueisuujikana
	 * 氏名/住所		simeijyuusho
	 * 年月日1			yyyymmdd1
	 * TEL2				tel2
	 * E-mail			e-mail
     */
	
	/**
	 * eoID項目チェック
	 */
	private static final String[] EOID_MAP_CHECK = {
		"key_eoid:1:hannkakuesuuji2:1:80:-:SEARCHEOIDCC:key_eoid", 				// eoID
		"fuzzy_search:0:hannkakuesuuji2:1: 1:-:SEARCHEOIDCC:fuzzy_search",		// あいまい検索 ****
	};
	
	/**
	 * 住所項目チェック
	 */
	private static final String[] AD_MAP_CHECK = {
		"key_pcd  :2:hannkakusuuji1 : 7: 7:-:CRSV009801SC:key_cust_pcd",				// 郵便番号
		"key_stat_nm  :2:simeijyuusho : 1: 4:-:CRSV009801SC:key_cust_state_nm",			// 都道府県
		"key_city_nm  :2:simeijyuusho : 1: 12:-:CRSV009801SC:key_cust_city_nm",			// 市区町村
		"key_oazatsu_nm  :2:simeijyuusho : 1: 18:-:CRSV009801SC:key_cust_oaztsu_nm",	// 大字通称
		"key_azcho_nm  :2:simeijyuusho : 1: 12:-:CRSV009801SC:key_cust_azcho_nm",		// 字丁目
		"key_bnchigo  :2:simeijyuusho : 1: 61:-:CRSV009801SC:key_cust_bnchigo",			// 番地・号
		"key_adrttm  :2:simeijyuusho : 1: 45:-:CRSV009801SC:key_cust_adrttm",			// 建物名
		"key_adrrm  :2:simeijyuusho : 1: 15:-:CRSV009801SC:key_cust_adrrm",				// 部屋番号
	};

	/**
	 * グループ化していないパラメタチェック
	 */
	private static final String[] NOGRP_PARAM_CHECK = {
		"cust_resp_limit_cnt:1:hannkakusuuji1 :1:  4:-:APIPARAMETER:cust_resp_limit_cnt", 			// 検索上限数（お客様）
		"proscst_resp_limit_cnt:1:hannkakusuuji1 :1:  4:-:APIPARAMETER:proscst_resp_limit_cnt", 	// 検索上限数（問合せ客）
		"key_svc_kei_no        :0:hannkakuesuuji1      :10:  10:-:CRSV009801SC:key_svc_kei_no",		// お客様ID
		"key_uketuke_no        :0:hannkakuesuuji8:10:  10:-:CRSV009801SC:key_mskmsho_no",			// 受付番号
		"key_kojiak_no         :0:hannkakuesuuji1:10:  10:-:CRSV009801SC:key_kojiak_no",			// 工事案件番号
		"key_id_toroku_no      :0:hannkakuesuuji1        :14:14:-:CRSV009801SC:key_seiri_no",		// ID登録証番号
		"key_ninsho_id         :0:hannkakuesuuji2   :1: 64:-:CRSV009801SC:key_ninsho_id",			// 認証ID
		"key_cust_type         :0:hannkakusuuji1   :1: 1:-:CRSV009801SC:key_cust_type_cd",			// 顧客タイプ
		"key_cust_nm           :0:simeijyuusho   :1: 121:-:CRSV009801SC:key_cust_nm",				// お客様名
		"key_cust_kana_nm      :0:zenkakueisuujikana   :1: 121:-:CRSV009801SC:key_cust_kana",		// お客様カナ名
		"key_telno             :0:hannkakuesuuji2   :1: 12:-:CRSV009801SC:key_cust_telno",			// 電話番号
		"key_sex_cd            :0:hannkakuesuuji2   :1: 1:-:CRSV009801SC:key_cust_sex_cd",			// 性別
		"key_birthday          :0:yyyymmdd1      :8:  8:-:CRSV009801SC:key_cust_birthd",			// 生年月日（西暦）
		"key_mlad              :0:hannkakuesuuji2:1:256:-:CRSV009801SC:key_cust_mlad",				// メールアドレス
		"key_toiawase_id       :0:hannkakuesuuji1:10:10:-:CRSV009801SC:key_toiawase_id",			// 問合せID
	};	
	
	// --------------
	// パラメータ定数
	// --------------
	/** パラメータ：エラーコード */
	private final String PARAM_ERRCODE = "errCode";
	/** パラメータ：エラーメッセージ */
	private final String PARAM_ERRMESSAGE = "errMessage";

	/**  SYSIDリスト */
	private final String KEY_REQ_SYSID_LIST = "sysid_list";

	/**  SYSID */
	private final String KEY_REQ_KEY_SYSID = "key_sysid";
	/**  お客様ID */
	private final String KEY_REQ_KEY_SVC_KEI_NO = "key_svc_kei_no";
	/**  問合せ客番号リスト */
	private final String KEY_REQ_PROSCST_NO_LIST = "proscst_no_list";
	/**  問合せ客番号 */
	private final String KEY_REQ_KEY_PROSCST_NO = "key_proscst_no";
	/**  問合せID */
	private final String KEY_REQ_KEY_TOIAWASE_ID = "key_toiawase_id";

	/**  お客様情報リスト */
	private final String KEY_RES_CUST_LIST = "cust_list";
	/**  SYSID */
	private final String KEY_RES_SYSID = "sysid";
	/**  お客さま名 */
	private final String KEY_RES_CUST_NM = "cust_nm";
	/**  お客さま名（カナ） */
	private final String KEY_RES_CUST_KANA = "cust_kana";
	/**  契約者携帯番号 */
	private final String KEY_RES_KEISHA_TELNO = "keisha_telno";
	/**  昼間の連絡先 */
	private final String KEY_RES_RRKS_TELNO = "rrks_telno";
	/**  電話番号 */
	private final String KEY_RES_TELNO = "telno";
	/**  生年月日 */
	private final String KEY_RES_CUST_BIRTHD = "cust_birthd";
	/**  会員種別 */
	private final String KEY_RES_MEMBER_SBT_CD = "member_sbt_cd";
	/**  会員種別名 */
	private final String KEY_RES_MEMBER_SBT_NM = "member_sbt_nm";
	/**  eoID */
	private final String KEY_RES_EOID = "eoid";
	/**  初期eoID */
	private final String KEY_RES_SHK_EOID = "shk_eoid";
	/**  契約者タイプコード */
	private final String KEY_RES_KEISHA_TYPE_CD = "keisha_type_cd";
	/**  お客様性別コード */
	private final String KEY_RES_CUST_SEX_CD = "cust_sex_cd";
	/**  契約者住所コード */
	private final String KEY_RES_KEISHA_AD_CD = "keisha_ad_cd";
	/**  契約者郵便番号 */
	private final String KEY_RES_KEISHA_PCD = "keisha_pcd";
	/**  契約者住所 */
	private final String KEY_RES_KEISHA_AD = "keisha_ad";
	/**  お客様入退会コード */
	private final String KEY_RES_CUST_NTAIKAI_CD = "cust_ntaikai_cd";
	/**  お客様退会年月日 */
	private final String KEY_RES_CUST_TAIKAI_YMD = "cust_taikai_ymd";
	/**  お客様退会理由コード */
	private final String KEY_RES_CUST_TAIKAI_RSN_CD = "cust_taikai_rsn_cd";
	
	/**  回線単位契約情報リスト */
	private final String KEY_RES_KISN_TANI_KEI_IF_LIST = "kisn_tani_kei_if_list";
	/**  サービス契約回線内訳番号 */
	private final String KEY_RES_SVC_KEI_KAISEN_UCWK_NO = "svc_kei_kaisen_ucwk_no";
	/**  利用場所郵便番号 */
	private final String KEY_RES_USEPLACE_PCD = "useplace_pcd";
	/**  利用場所住所 */
	private final String KEY_RES_USEPLACE_AD_NM = "useplace_ad_nm";
	
	/**  回線内サービス契約リスト */
	private final String KEY_RES_KISN_NAI_SVC_KEI_LIST = "kisn_nai_svc_kei_list";
	/**  サービス契約番号 */
	private final String KEY_RES_SVC_KEI_NO = "svc_kei_no";
	/**  サービス契約ステータス */
	private final String KEY_RES_SVC_KEI_STAT = "svc_kei_stat";
	/**  料金グループコード */
	private final String KEY_RES_PRC_GRP_CD = "prc_grp_cd";
	/**  料金グループ名 */
	private final String KEY_RES_PRC_GRP_NM = "prc_grp_nm";
	/**  料金コースコード */
	private final String KEY_RES_PCRS_CD = "pcrs_cd";
	/**  料金コース名 */	/**  料金プランコード */
	private final String KEY_RES_PPLAN_CD = "pplan_cd";
	/**  料金プラン名 */
	private final String KEY_RES_PPLAN_NM = "pplan_nm";

	/**  サービス契約内訳リスト */
	private final String KEY_RES_SVC_KEI_UCWK_LIST = "svc_kei_ucwk_list";
	/**  サービス契約内訳番号 */
	private final String KEY_RES_SVC_KEI_UCWK_NO = "svc_kei_ucwk_no";
	/**  サービス契約内訳ステータス */
	private final String KEY_RES_SVC_KEI_UCWK_STAT = "svc_kei_ucwk_stat";
	/**  光電話番号 */
	private final String KEY_RES_EO_TELNO = "eo_telno";
	/**  代表電話番号 */
	private final String KEY_RES_DAIHYO_TELNO = "daihyo_telno";
	/**  電話番号順番 */
	private final String KEY_RES_TELNO_JUN = "telno_jun";
	/**  継続後契約変更手続中フラグ */
	private final String KEY_RES_KEIZK_AF_KEI_CHGECHU_FLG = "keizk_af_kei_chgechu_flg";

	/**  回線なし契約情報リスト */
	private final String KEY_RES_KISN_NASHI_KEI_IF_LIST = "kisn_nashi_kei_if_list";
	
	/**  問合せ客情報リスト */
	private final String KEY_RES_PROSCST_LIST = "proscst_list";
	/**  問合せ客番号 */
	private final String KEY_RES_PROSCST_NO = "proscst_no";
	/**  お客さま名 */
	private final String KEY_RES_PROSCST_NM = "proscst_nm";
	/**  お客さま郵便番号 */
	private final String KEY_RES_PROSCST_PCD = "proscst_pcd";
	/**  お客さま住所 */
	private final String KEY_RES_PROSCST_AD_NM = "proscst_ad_nm";
	
	// ----------
	// エラー定数
	// ----------
	/** エラーコード */
	public static final String ERROR_CODE = "errCode";
	/** エラーメッセージ */
	public static final String ERROR_MESSAGE = "errMessage";
	/** リターンメッセージ取得キー */
	private static final String RETURN_MESSAGE_STRING = "RETURN_MESSAGE_";
	/** リターンメッセージの書式指定文字列 */
	private static final String RETURN_MESSAGE_FORMAT = "%1$04d";
	/** エラー項目接尾辞 */
	private static final String ERRITEM_SUFFIX = "_err";
	
	
	/**
	 * 検索条件をチェックし、各マップに検索条件を設定する。
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite setupRequestParameter(SessionHandle handle, 
														IRequestParameterReadWrite param, 
														String fixedText) throws Throwable
	{
		// エラーチェック情報
		ArrayList<HashMap<String, Object>> errList = new ArrayList<HashMap<String, Object>>();
		// ユーザデータ情報
		HashMap<Object, Object> inMap = (HashMap<Object, Object>)param.getData(fixedText);
		// 出力データ
		HashMap<String, HashMap<String, Object>> outMap = new HashMap<String, HashMap<String, Object>>();
		// 後続で仕様するマップ
		HashMap<String, Object> crsv009801scMap = new HashMap<String, Object>();
		HashMap<String, Object> searchEOIDccMap = new HashMap<String, Object>();
		HashMap<String, Object> apiParameterMap = new HashMap<String, Object>();

		outMap.put("SEARCHEOIDCC", searchEOIDccMap);
		outMap.put("CRSV009801SC", crsv009801scMap);
		outMap.put("APIPARAMETER", apiParameterMap);

		try 
		{
			// 項目チェック
			checkData(inMap, outMap, errList);
		}
		catch (IllegalArgumentException e)
		{
			// エラーメッセージを作成し、処理を終了する。
			HashMap<String, Object> outputParamMap = new HashMap<String, Object>();
			outputParamMap.put(KEY_ERROR_INFO, errList);
			param.setData(fixedText, outputParamMap);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_1000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, JKKStrConst.RETURN_MESSAGE_ZOKUSEI_CHECK_ERROR);
			return param;
		}
		
		// 入力以外のパラメータを設定
		
		// 共通情報のマッピング
		searchEOIDccMap.put("func_code", JPCModelConstant.FUNC_CD_1);

		// 共通情報のマッピング
		crsv009801scMap.put("func_code", JPCModelConstant.FUNC_CD_1);

		// 部品呼び出し → 問合せ客検索一覧照会マップ.検索処理パターン
		crsv009801scMap.put("search_type", "1");
		
		//内部仕様の上限数は、集約前の（お客様と問合せ客の両方を合算した）検索件数を対象としてチェックを行う。上限値は2,000件とする。
		crsv009801scMap.put("max_serch_num", "2000");

		// 部品呼び出し → 問合せ客検索一覧照会マップ.表示件数
		crsv009801scMap.put("display_num", "99999");
		
		// 表示ページ番号
		crsv009801scMap.put("display_page_num", String.valueOf("1"));
		
		crsv009801scMap.put("sort_shitei_kmk_nm", "SYSID");
		// 基準日 → 問合せ客検索一覧照会マップ.基準日
		crsv009801scMap.put("key_stdardymd", JCCBPCommon.getOnlineOpeDate(null));

		// 問合せID
		String toiawaseId = JKKStringUtil.nullToBlank((String)inMap.get(KEY_REQ_KEY_TOIAWASE_ID));
		String toiawaseIdSvckeiNo = "";
		String toiawaseIdProscstNo = "";
		// 問合せIDが入力有の場合
		if (!JKKStringUtil.isNullBlank(toiawaseId))
		{			
			// 対応記録一意照会の上りマッピング
			Object[][] ecr0011a010In =
					{ { ECR0011A010CBSMsg.TEMPLATEID, TEMPLATE_ID }, 
							{ ECR0011A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
							{ ECR0011A010CBSMsg.KEY_TAIO_KIROK_NO, toiawaseId } };

			// SC実行
			CAANMsg[] msgList = callSC(handle,  param, ecr0011a010In,
					fixedText, new ECR0011A010CBSMsg().getContents()).getCAANMsgList(ECR0011A010CBSMsg.ECR0011A010CBSMSG1LIST);
			
			if (msgList != null && (msgList.length > 0))
			{
				for (CAANMsg ecr0011a010Msg1 : msgList)
				{
					toiawaseIdSvckeiNo = JKKStringUtil.nullToBlank(ecr0011a010Msg1.getString(ECR0011A010CBSMsg1List.SVC_KEI_NO));
					toiawaseIdProscstNo = JKKStringUtil.nullToBlank(ecr0011a010Msg1.getString(ECR0011A010CBSMsg1List.PROSCST_NO));
				}
			}
			else
			{
				// 0件エラー 検索条件不一致
				// 検索結果が0件
				HashMap<String, Object> responseParam = new HashMap<String, Object>();
				param.setData("SEARCHEOIDCC", searchEOIDccMap);
				param.setData(fixedText, responseParam);
				errList.add(createError(NODATE_ERROR, ""));
				responseParam.put(KEY_ERROR_INFO, errList);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_1100);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, "NO DATA");
				return param;
			}
			
			// 問合せIDからお客様IDが取得できた場合
			if (!JKKStringUtil.isNullBlank(toiawaseIdSvckeiNo))
			{
				// リクエストパラメータのお客様IDと値が違う場合
				if (!toiawaseIdSvckeiNo.equals((String)inMap.get(KEY_REQ_KEY_SVC_KEI_NO)))
				{
					// リクエストパラメータのお客様IDが設定される場合
					if (!JKKStringUtil.isNullBlank((String)inMap.get(KEY_REQ_KEY_SVC_KEI_NO)))
					{
						// 0件エラー 検索条件不一致
						// 検索結果が0件
						HashMap<String, Object> responseParam = new HashMap<String, Object>();
						param.setData("SEARCHEOIDCC", searchEOIDccMap);
						param.setData(fixedText, responseParam);
						errList.add(createError(NODATE_ERROR, ""));
						responseParam.put(KEY_ERROR_INFO, errList);
						param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_1100);
						param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, "NO DATA");
						return param;
					}
					else
					{
						// 問合せIDから取得したお客さまIDを問合せ客検索一覧照会のパラメータに設定
						crsv009801scMap.put("key_svc_kei_no", toiawaseIdSvckeiNo);
					}
				}
			}
			// 問合せIDからお客様IDが取得できた場合
			if (!JKKStringUtil.isNullBlank(toiawaseIdProscstNo))
			{
				// リクエストパラメータのお客様IDと値が違う場合
				if (!toiawaseIdProscstNo.equals((String)inMap.get(KEY_REQ_KEY_PROSCST_NO)))
				{
					// リクエストパラメータのお客様IDが設定される場合
					if (!JKKStringUtil.isNullBlank((String)inMap.get(KEY_REQ_KEY_PROSCST_NO)))
					{
						// 0件エラー 検索条件不一致
						// 検索結果が0件
						HashMap<String, Object> responseParam = new HashMap<String, Object>();

						param.setData(fixedText, responseParam);
						param.setData("SEARCHEOIDCC", searchEOIDccMap);
						errList.add(createError(NODATE_ERROR, ""));
						responseParam.put(KEY_ERROR_INFO, errList);
						param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_1100);
						param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, "NO DATA");
						return param;
					}
					else
					{
						// 問合せIDから取得したお客さまIDを問合せ客検索一覧照会のパラメータに設定
						crsv009801scMap.put("key_proscst_no", toiawaseIdProscstNo);
					}
				}
			}	
		}
		
		// 最後に検索用マップをパラメータに設定
		param.setData("CRSV009801SC", crsv009801scMap);
		param.setData("SEARCHEOIDCC", searchEOIDccMap);
		param.setData("APIPARAMETER", apiParameterMap);

		return param;
	}

	/**
	 * 検索結果を更新する。
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite updateResponseParameter(SessionHandle handle, 
														IRequestParameterReadWrite param, 
														String fixedText) throws Throwable
	{
		// 返却値を設定する
		HashMap<String, Object> responseParam = new HashMap<String, Object>();
		ArrayList<Object> custList = new ArrayList<Object>();
		ArrayList<Object> proscstList = new ArrayList<Object>();
		ArrayList<HashMap<String, Object>> eck0051B020list = new ArrayList<HashMap<String, Object>>();
		responseParam.put(KEY_RES_CUST_LIST, custList);
		responseParam.put(KEY_RES_PROSCST_LIST, proscstList);
		param.setData(fixedText, responseParam);
		
		// 検索結果を取得
		HashMap<String, Object> searchMap = (HashMap<String, Object>)param.getData("CRSV009801SC");

		// 検索結果を取得
		HashMap<String, Object> apiparameterMap = (HashMap<String, Object>)param.getData("APIPARAMETER");
		
		// 検索上限数（お客様）
		int custRespLimitCnt = Integer.parseInt((String)apiparameterMap.get("cust_resp_limit_cnt"));
		// 検索上限数（問合せ客）
		int proscstRespLimitCnt = Integer.parseInt((String)apiparameterMap.get("proscst_resp_limit_cnt"));
		
		// データが検索出来た場合
		if (searchMap != null)
		{
			ArrayList<HashMap<String, Object>> errList = new ArrayList<HashMap<String, Object>>();
			// 検索結果フラグをチェックする
			Object errFlg =  searchMap.get("search_err_flg");
			if ("1".equals(errFlg))
			{
				// 検索結果が0件
				errList.add(createError(NODATE_ERROR, ""));
				responseParam.put(KEY_ERROR_INFO, errList);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_1100);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, "NO DATA");
				return param;
			}
			if ("2".equals(errFlg))
			{
				// 最大取得検索オーバー
				errList.add(createError(LIMIT_OVER_ERROR, ""));
				responseParam.put(KEY_ERROR_INFO, errList);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_1100);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, "LIMIT OVER");
				return param;
			}
			// データをマップに詰め込む
			if (searchMap.containsKey("ECK0051B020CBSMsg1List")) 
			{
				eck0051B020list = (ArrayList<HashMap<String, Object>>)searchMap.get("ECK0051B020CBSMsg1List");
				if (eck0051B020list != null && eck0051B020list.size() != 0) 
				{
					
					//ANK-4378-00-00 ADD START
					// 電気契約の住所情報と回線番号を更新する。
					for (HashMap<String, Object> item : eck0051B020list)
					{
						String svcKeiNo = JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SVC_KEI_NO));
						String prcGrpCd = JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.PRC_GRP_CD));
						String edenkeishaAd = "";
						//電気の回線を取得する。
						if ((JKKStrConst.CD00133_17).equals(prcGrpCd))
						{
							CAANMsg[] msgList = getEKK2961B001CAANMsg(handle, param, fixedText, svcKeiNo);
							
							String svkeiGrpSkbtNo = "";
							if (msgList != null && (msgList.length > 0))
							{
								for (CAANMsg ekk2961b001Msg1 : msgList)
								{
									svkeiGrpSkbtNo = JKKStringUtil.nullToBlank(ekk2961b001Msg1.getString(EKK2961B001CBSMsg1List.SVKEI_GRP_SKBT_NO));
								}
							}
							if (!JKKStringUtil.isNullBlank(svkeiGrpSkbtNo))
							{
								CAANMsg[] ekk0251a010msgList = getEKK0251A010CAANMsg(handle, param, fixedText, svkeiGrpSkbtNo);
								
								if (ekk0251a010msgList != null && (ekk0251a010msgList.length > 0))
								{
									for (CAANMsg ekk0251a010Msg1 : ekk0251a010msgList)
									{
										edenkeishaAd = JKKStringUtil.nullToBlank((String)ekk0251a010Msg1.getString(EKK0251A010CBSMsg1List.KAISEN_PLACE_STATE_NM)) + JKKStringUtil.nullToBlank((String)ekk0251a010Msg1.getString(EKK0251A010CBSMsg1List.KAISEN_PLACE_CITY_NM)) + JKKStringUtil.nullToBlank((String)ekk0251a010Msg1.getString(EKK0251A010CBSMsg1List.KAISEN_PLACE_OAZTSU_NM)) + JKKStringUtil.nullToBlank((String)ekk0251a010Msg1.getString(EKK0251A010CBSMsg1List.KAISEN_PLACE_AZCHO_NM)) + JKKStringUtil.nullToBlank((String)ekk0251a010Msg1.getString(EKK0251A010CBSMsg1List.KAISEN_PLACE_BNCHIGO)) + JKKStringUtil.nullToBlank((String)ekk0251a010Msg1.getString(EKK0251A010CBSMsg1List.KAISEN_PLACE_ADRTTM)) + JKKStringUtil.nullToBlank((String)ekk0251a010Msg1.getString(EKK0251A010CBSMsg1List.KAISEN_PLACE_ADRRM));
										break;
									}
								}
								item.put(EKK0251A010CBSMsg1List.KAISEN_PLACE_STATE_NM, edenkeishaAd);
								item.put(EKK0251A010CBSMsg1List.SVC_KEI_KAISEN_UCWK_NO, svkeiGrpSkbtNo);
							}
						}
					}
					//ANK-4378-00-00 ADD END
					
					// 「SYSID、サービス契約回線内訳番号」昇順でソート
					Comparator<Map<String, Object>> opComparator = new Comparator<Map<String, Object>>() {
						public int compare(Map<String, Object> o1, Map<String, Object> o2) {
							// SYSID（昇順）
							int result = JKKStringUtil.nullToBlank((String)o1.get("sysid")).compareTo(JKKStringUtil.nullToBlank((String)o2.get("sysid")));
							
							if (result == 0) {
							// サービス契約回線内訳番号（昇順）
								result = JKKStringUtil.nullToBlank((String)o1.get("svc_kei_kaisen_ucwk_no")).compareTo(JKKStringUtil.nullToBlank((String)o2.get("svc_kei_kaisen_ucwk_no")));
							}
							if (result == 0) {
								// サービス契約番号（昇順）
								result = JKKStringUtil.nullToBlank((String)o1.get("svc_kei_no")).compareTo(JKKStringUtil.nullToBlank((String)o2.get("svc_kei_no")));
							}
							if (result == 0) {
								// サービス契約内訳番号（昇順）
								result = JKKStringUtil.nullToBlank((String)o1.get("svc_kei_ucwk_no")).compareTo(JKKStringUtil.nullToBlank((String)o2.get("svc_kei_ucwk_no")));
							}
							return result;
						}
					};
					Collections.sort(eck0051B020list, opComparator);
				}
				
				// SYSIDのみ取得してリストへ値を設定する。
				HashMap<String, Object> sysIdMap = new HashMap<String, Object>();
				HashMap<String, Object> kisnNashiMap = new HashMap<String, Object>();
				HashMap<String, Object> kisnTaniMap = new HashMap<String, Object>();
				HashMap<String, Object> kisnNaiSvcKeiMap = new HashMap<String, Object>();
				HashMap<String, Object> svcKeiUcwkMap = new HashMap<String, Object>();
				HashMap<String, Object> proscstMap = new HashMap<String, Object>();
				
				ArrayList<Object> kisnNashiKeiIfList = new ArrayList<Object>();
				ArrayList<Object> kisnTaniKeiIfList = new ArrayList<Object>();
				ArrayList<Object> kisnNaiSvcKeiList = new ArrayList<Object>();
				ArrayList<Object> svcKeiUcwkList = new ArrayList<Object>();
				//前レコードのSYSID
				String sysidBef = "";
				//前レコードのサービス契約回線内訳番号
				String svcKeiKaisenUcwkNoBef = "";
				//前レコードのサービス契約番号
				String svcKeiNoBef = "";
				//前レコードのサービス契約内訳番号
				String svcKeiUcwkNoBef = "";
				for (HashMap<String, Object> item : eck0051B020list)
				{
					String sysid = JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SYSID));
					String svcKeiKaisenUcwkNo = JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SVC_KEI_KAISEN_UCWK_NO));
					String prcsCd = JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.PCRS_CD));
					String svcKeiNo = JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SVC_KEI_NO));
					String svcKeiUcwkNo = JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SVC_KEI_UCWK_NO));
					// SYSIDが存在する場合
					if (!JKKStringUtil.isNullBlank((sysid)))
					{
						//回線ありで前レコードのSYSIDが別の場合
						if (!JKKStringUtil.nullToBlank((String)sysidBef).equals(sysid))
						{	
							kisnNashiKeiIfList = new ArrayList<Object>();
							kisnTaniKeiIfList = new ArrayList<Object>();
							kisnNaiSvcKeiList = new ArrayList<Object>();
							svcKeiUcwkList = new ArrayList<Object>();
							sysIdMap = new HashMap<String, Object>();
							custList.add(sysIdMap);
							sysIdMap.put(KEY_RES_SYSID,JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SYSID)));
							sysIdMap.put(KEY_RES_CUST_NM,JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.CUST_NM)));
							sysIdMap.put(KEY_RES_CUST_KANA,JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.CUST_KANA)));
							sysIdMap.put(KEY_RES_KEISHA_TELNO,JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.CUST_TELNO)));
							sysIdMap.put(KEY_RES_RRKS_TELNO,JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.CUST_HANDY_TELNO)));
							sysIdMap.put(KEY_RES_TELNO,JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.CONT_TELNO)));
							sysIdMap.put(KEY_RES_CUST_BIRTHD,JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.CUST_BIRTHD)));
							sysIdMap.put(KEY_RES_MEMBER_SBT_CD,JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.MEMBER_SBT_CD)));
							sysIdMap.put(KEY_RES_MEMBER_SBT_NM,JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.MEMBER_SBT_NM)));
							sysIdMap.put(KEY_RES_EOID,JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.EOID)));
							sysIdMap.put(KEY_RES_SHK_EOID,JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SHK_EOID)));
							sysIdMap.put(KEY_RES_KEISHA_TYPE_CD,JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KEISHA_TYPE_CD)));
							sysIdMap.put(KEY_RES_CUST_SEX_CD,JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.CUST_SEX_CD)));
							sysIdMap.put(KEY_RES_KEISHA_AD_CD,JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KEISHA_AD_CD)));
							String keishaAd = JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KEISHA_STATE_NM)) + JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KEISHA_CITY_NM)) + JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KEISHA_OAZTSU_NM)) + JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KEISHA_AZCHO_NM)) + JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KEISHA_BNCHIGO)) + JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KEISHA_ADRTTM)) + JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KEISHA_ADRRM));
							sysIdMap.put(KEY_RES_KEISHA_AD,JKKStringUtil.nullToBlank(keishaAd));
							sysIdMap.put(KEY_RES_KEISHA_PCD,JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KEISHA_PCD)));
							sysIdMap.put(KEY_RES_CUST_NTAIKAI_CD,JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.CUST_NTAIKAI_CD)));
							sysIdMap.put(KEY_RES_CUST_TAIKAI_YMD,JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.CUST_TAIKAI_YMD)));
							sysIdMap.put(KEY_RES_CUST_TAIKAI_RSN_CD,JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.CUST_TAIKAI_RSN_CD)));
							sysIdMap.put(KEY_RES_KISN_NASHI_KEI_IF_LIST, kisnNashiKeiIfList);
							// OM-2022-0001164 ADD START
							// SYSIDが変更された場合は、前サービス回線内訳番号をリセットする。
							svcKeiKaisenUcwkNoBef = "";
							// SYSIDが変更された場合は、前サービス契約内訳番号をリセットする。
							svcKeiUcwkNoBef = "";
							// SYSIDが変更された場合は、前サービス契約番号をリセットする。
							svcKeiNoBef = "";
							// OM-2022-0001164 ADD END
						}
						
						//回線なし
						if (JKKStringUtil.isNullBlank((svcKeiKaisenUcwkNo)))
						{
							//前レコードのサービス契約番号が別の場合
							if (!JKKStringUtil.nullToBlank(svcKeiNoBef).equals(svcKeiNo))
							{
								kisnNashiMap = new HashMap<String, Object>();
								kisnNashiMap.put(KEY_RES_SVC_KEI_NO, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SVC_KEI_NO)));
								kisnNashiMap.put(KEY_RES_SVC_KEI_STAT, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SVC_KEI_STAT)));
								kisnNashiMap.put(KEY_RES_PRC_GRP_CD, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.PRC_GRP_CD)));
								kisnNashiMap.put(KEY_RES_PRC_GRP_NM, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.PRC_GRP_NM)));
								kisnNashiMap.put(KEY_RES_PCRS_CD, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.PCRS_CD)));
								kisnNashiMap.put(KEY_RES_PPLAN_CD, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.PPLAN_CD)));
								kisnNashiMap.put(KEY_RES_PPLAN_NM, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.PPLAN_NM)));
								
								kisnNashiKeiIfList.add(kisnNashiMap);
							}
						}
						//回線あり
						else 
						{
							//サービス契約回線内訳番号 同じ
							if (JKKStringUtil.nullToBlank(svcKeiKaisenUcwkNoBef).equals(svcKeiKaisenUcwkNo))
							{
								kisnNaiSvcKeiMap = new HashMap<String, Object>();
								
								//前レコードのサービス契約番号が同じ場合
								if (JKKStringUtil.nullToBlank(svcKeiNoBef).equals(svcKeiNo))
								{
									//電話サービスの場合は、1番号と2番号が別レコードで出力されるため、この処理は基本2番号の処理
									if ((JKKSvcConst.PCRS_CD_TEL_1BAN.equals(prcsCd) || JKKSvcConst.PCRS_CD_TEL_2BAN.equals(prcsCd)) && !JKKStringUtil.nullToBlank(svcKeiUcwkNoBef).equals(svcKeiUcwkNo))
									{
										svcKeiUcwkMap = new HashMap<String, Object>();
										svcKeiUcwkMap.put(KEY_RES_SVC_KEI_UCWK_NO, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SVC_KEI_UCWK_NO)));
										svcKeiUcwkMap.put(KEY_RES_SVC_KEI_UCWK_STAT, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SVC_KEI_UCWK_STAT)));
										svcKeiUcwkMap.put(KEY_RES_EO_TELNO, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.EO1_TELNO)));
										svcKeiUcwkMap.put(KEY_RES_DAIHYO_TELNO, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.EO2_TELNO)));
										svcKeiUcwkMap.put(KEY_RES_TELNO_JUN, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.TELNO_JUN)));
										svcKeiUcwkMap.put(KEY_RES_KEIZK_AF_KEI_CHGECHU_FLG, "0");
										svcKeiUcwkList.add(svcKeiUcwkMap);
									}
								}
								//前レコードのサービス契約番号が別の場合
								else
								{
									svcKeiUcwkList = new ArrayList<Object>();
									kisnNaiSvcKeiMap.put(KEY_RES_SVC_KEI_NO, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SVC_KEI_NO)));
									kisnNaiSvcKeiMap.put(KEY_RES_SVC_KEI_STAT, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SVC_KEI_STAT)));
									kisnNaiSvcKeiMap.put(KEY_RES_PRC_GRP_CD, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.PRC_GRP_CD)));
									kisnNaiSvcKeiMap.put(KEY_RES_PRC_GRP_NM, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.PRC_GRP_NM)));
									kisnNaiSvcKeiMap.put(KEY_RES_PCRS_CD, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.PCRS_CD)));
									kisnNaiSvcKeiMap.put(KEY_RES_PPLAN_CD, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.PPLAN_CD)));
									kisnNaiSvcKeiMap.put(KEY_RES_PPLAN_NM, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.PPLAN_NM)));

									//電話サービスの場合は、1番号と2番号が別レコードで出力されるため、この処理は基本1番号の処理
									if (JKKSvcConst.PCRS_CD_TEL_1BAN.equals(prcsCd) || JKKSvcConst.PCRS_CD_TEL_2BAN.equals(prcsCd))
									{
										svcKeiUcwkMap = new HashMap<String, Object>();
										svcKeiUcwkMap.put(KEY_RES_SVC_KEI_UCWK_NO, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SVC_KEI_UCWK_NO)));
										svcKeiUcwkMap.put(KEY_RES_SVC_KEI_UCWK_STAT, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SVC_KEI_UCWK_STAT)));
										svcKeiUcwkMap.put(KEY_RES_EO_TELNO, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.EO1_TELNO)));
										svcKeiUcwkMap.put(KEY_RES_DAIHYO_TELNO, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.EO2_TELNO)));
										svcKeiUcwkMap.put(KEY_RES_TELNO_JUN, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.TELNO_JUN)));
										svcKeiUcwkMap.put(KEY_RES_KEIZK_AF_KEI_CHGECHU_FLG, "0");
										svcKeiUcwkList.add(svcKeiUcwkMap);
										kisnNaiSvcKeiMap.put(KEY_RES_SVC_KEI_UCWK_LIST, svcKeiUcwkList);
									}
									kisnNaiSvcKeiList.add(kisnNaiSvcKeiMap);
								}
							}
							//サービス契約回線内訳番号が別の場合
							else
							{
								kisnNaiSvcKeiList = new ArrayList<Object>();
								svcKeiUcwkList = new ArrayList<Object>();
								kisnTaniMap = new HashMap<String, Object>();
								kisnTaniMap.put(KEY_RES_SVC_KEI_KAISEN_UCWK_NO, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SVC_KEI_KAISEN_UCWK_NO)));
								kisnTaniMap.put(KEY_RES_USEPLACE_PCD, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KAISEN_PLACE_PCD)));
								String kaisenAd = JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KAISEN_PLACE_STATE_NM)) + JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KAISEN_PLACE_CITY_NM)) + JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KAISEN_PLACE_OAZTSU_NM)) + JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KAISEN_PLACE_AZCHO_NM)) + JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KAISEN_PLACE_BNCHIGO)) + JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KAISEN_PLACE_ADRTTM)) + JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KAISEN_PLACE_ADRRM));
								kisnTaniMap.put(KEY_RES_USEPLACE_AD_NM, JKKStringUtil.nullToBlank(kaisenAd));
								
								kisnTaniKeiIfList.add(kisnTaniMap);
								
								kisnNaiSvcKeiMap = new HashMap<String, Object>();
								kisnNaiSvcKeiMap.put(KEY_RES_SVC_KEI_NO, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SVC_KEI_NO)));
								kisnNaiSvcKeiMap.put(KEY_RES_SVC_KEI_STAT, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SVC_KEI_STAT)));
								kisnNaiSvcKeiMap.put(KEY_RES_PRC_GRP_CD, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.PRC_GRP_CD)));
								kisnNaiSvcKeiMap.put(KEY_RES_PRC_GRP_NM, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.PRC_GRP_NM)));
								kisnNaiSvcKeiMap.put(KEY_RES_PCRS_CD, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.PCRS_CD)));
								kisnNaiSvcKeiMap.put(KEY_RES_PPLAN_CD, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.PPLAN_CD)));
								kisnNaiSvcKeiMap.put(KEY_RES_PPLAN_NM, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.PPLAN_NM)));

								//電話サービスの場合は、1番号と2番号が別レコードで出力されるため、この処理は基本1番号の処理
								if (JKKSvcConst.PCRS_CD_TEL_1BAN.equals(prcsCd) || JKKSvcConst.PCRS_CD_TEL_2BAN.equals(prcsCd))
								{
									svcKeiUcwkList = new ArrayList<Object>();
									svcKeiUcwkMap = new HashMap<String, Object>();
									svcKeiUcwkMap.put(KEY_RES_SVC_KEI_UCWK_NO, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SVC_KEI_UCWK_NO)));
									svcKeiUcwkMap.put(KEY_RES_SVC_KEI_UCWK_STAT, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.SVC_KEI_UCWK_STAT)));
									svcKeiUcwkMap.put(KEY_RES_EO_TELNO, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.EO1_TELNO)));
									svcKeiUcwkMap.put(KEY_RES_DAIHYO_TELNO, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.EO2_TELNO)));
									svcKeiUcwkMap.put(KEY_RES_TELNO_JUN, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.TELNO_JUN)));
									svcKeiUcwkMap.put(KEY_RES_KEIZK_AF_KEI_CHGECHU_FLG, "0");
									svcKeiUcwkList.add(svcKeiUcwkMap);
									kisnNaiSvcKeiMap.put(KEY_RES_SVC_KEI_UCWK_LIST, svcKeiUcwkList);
								}
								kisnNaiSvcKeiList.add(kisnNaiSvcKeiMap);
								kisnTaniMap.put(KEY_RES_KISN_NAI_SVC_KEI_LIST, kisnNaiSvcKeiList);
								sysIdMap.put(KEY_RES_KISN_TANI_KEI_IF_LIST, kisnTaniKeiIfList);
							}
							svcKeiKaisenUcwkNoBef = svcKeiKaisenUcwkNo;
							svcKeiUcwkNoBef = svcKeiUcwkNo;
							svcKeiNoBef = svcKeiNo;
						}
						sysidBef = sysid;
					}
					// SYSIDが存在しない場合は、問合せリストに出力する。
					else
					{
						proscstMap = new HashMap<String, Object>();
						proscstMap.put(KEY_RES_PROSCST_NO, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.PROSCST_NO)));
						proscstMap.put(KEY_RES_PROSCST_NM, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.CUST_NM)));
						proscstMap.put(KEY_RES_PROSCST_PCD, JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KAISEN_PLACE_PCD)));
						String kaisenAd = JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KAISEN_PLACE_STATE_NM)) + JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KAISEN_PLACE_CITY_NM)) + JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KAISEN_PLACE_OAZTSU_NM)) + JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KAISEN_PLACE_AZCHO_NM)) + JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KAISEN_PLACE_BNCHIGO)) + JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KAISEN_PLACE_ADRTTM)) + JKKStringUtil.nullToBlank((String)item.get(ECK0051B020CBSMsg1List.KAISEN_PLACE_ADRRM));
						proscstMap.put(KEY_RES_PROSCST_AD_NM, JKKStringUtil.nullToBlank(kaisenAd));
						proscstList.add(proscstMap);
					}
				}
			}
		}
		else
		{
			// システムエラー？
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_9000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, JKKStrConst.RETURN_MESSAGE_SYSTEM_ERROR);
			throw new CCException("", new Exception("検索結果を取得できない"));
		}
		
		int svcKeiNoCnt = 0;

		// 問合せ客検索一覧照会結果から問合せ客情報を除いて、契約情報のみの件数を取得する。
		if (eck0051B020list != null && proscstList != null) 
		{
			svcKeiNoCnt = eck0051B020list.size() - proscstList.size();
		}
		
		// 検索上限数（お客様）上限チェック
		if (custRespLimitCnt < svcKeiNoCnt)
		{
			{
				ArrayList<HashMap<String, Object>> errList = new ArrayList<HashMap<String, Object>>();
				// 最大取得検索オーバー
				errList.add(createError(LIMIT_OVER_ERROR, ""));
				responseParam.put(KEY_ERROR_INFO, errList);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_1100);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, "LIMIT OVER");
				responseParam.put(KEY_RES_CUST_LIST, null);
				responseParam.put(KEY_RES_PROSCST_LIST, null);
				return param;
			}
		}
		
		if (proscstList != null && (proscstList.size() > 0))
		{
			// 検索上限数（問合せ客）上限チェック
			if (proscstRespLimitCnt < proscstList.size())
			{
				ArrayList<HashMap<String, Object>> errList = new ArrayList<HashMap<String, Object>>();
				// 最大取得検索オーバー
				errList.add(createError(LIMIT_OVER_ERROR, ""));
				responseParam.put(KEY_ERROR_INFO, errList);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_1100);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, "LIMIT OVER");
				responseParam.put(KEY_RES_CUST_LIST, null);
				responseParam.put(KEY_RES_PROSCST_LIST, null);
				return param;
			}
		}
		return param;
	}
	
	/**
	 * データをチェックする。
	 * <br>
	 * @param inMap 入力マップ
	 * @param outMap 出力マップ
	 */
	@SuppressWarnings("unchecked")
	private void checkData(HashMap<Object, Object> inMap, HashMap<String, HashMap<String, Object>> outMap, ArrayList<HashMap<String, Object>> errList) 
	{
		// SYSIDリストチェックチェック
		if (inMap.containsKey("sysid_list"))
		{
			StringBuffer buf = new StringBuffer();
			ArrayList<?> sysdList = (ArrayList<?>)inMap.get(KEY_REQ_SYSID_LIST);
			for (Object sysidMap : sysdList)
			{
				Object value = ((HashMap)sysidMap).get(KEY_REQ_KEY_SYSID);
				value = JCRUtilCommon.fillZero((String)value, 10, false);
				
				// 個別チェック
				String err = checkError(value, "0", "hannkakuesuuji1", 10, 10);
				if (err != null)
				{
					// エラー
					errList.add(createError(err, KEY_REQ_KEY_SYSID));
					throw new IllegalArgumentException();
				}
				// スペース区切りで設定
				if (buf.length() > 0) buf.append(JCRStrConst.FUZZY_SEARCH_KUGIRI);
				buf.append(value);
			}
			outMap.get("CRSV009801SC").put("key_sysid", buf.toString());
		}
		// 問合せ客番号リストチェック
		if (inMap.containsKey(KEY_REQ_PROSCST_NO_LIST))
		{
			StringBuffer buf = new StringBuffer();
			ArrayList<?> proscstNoList = (ArrayList<?>)inMap.get(KEY_REQ_PROSCST_NO_LIST);
			for (Object proscstNoMap : proscstNoList)
			{
				Object value = ((HashMap)proscstNoMap).get(KEY_REQ_KEY_PROSCST_NO);
				value = JCRUtilCommon.fillZero((String)value, 10, false);
				
				// 個別チェック
				String err = checkError(value, "0", "hannkakuesuuji1", 10, 10);
				if (err != null)
				{
					// エラー
					errList.add(createError(err, KEY_REQ_KEY_PROSCST_NO));
				}
				// スペース区切りで設定
				if (buf.length() > 0) buf.append(JCRStrConst.FUZZY_SEARCH_KUGIRI);
				buf.append(value);
			}
			outMap.get("CRSV009801SC").put("key_proscst_no", buf.toString());
		}
		
		// eoID項目チェック
		if (inMap.containsKey("eoId_map"))
		{
			checkParamMapData((HashMap<Object, Object>)inMap.get("eoId_map"), EOID_MAP_CHECK, null, outMap, errList);
		}
		
		// 住所項目チェック
		if (inMap.containsKey("ad_map"))
		{
			checkParamMapData((HashMap<Object, Object>)inMap.get("ad_map"), AD_MAP_CHECK, null, outMap, errList);
		}

		// その他の一括チェック項目
		checkParamMapData(inMap, NOGRP_PARAM_CHECK, null, outMap, errList);

		// 必須の項目に値が設定されない場合、エラー
		if (outMap.get("CRSV009801SC").isEmpty() && outMap.get("SEARCHEOIDCC").isEmpty())
		{
			// リクエストエラー
			errList.add(createError(REQUEST_ERROR, ""));
			throw new IllegalArgumentException();
		}
	}

	/**
	 * パラメータのマップを定義に従いチェックする。
	 * <br>
	 * @param inMap
	 * @param itemCheckList
	 * @param reCheckList
	 * @param outMap
	 * @param errList
	 */
	private void checkParamMapData(HashMap<Object, Object> inMap, String[] itemCheckList, String[] reCheckList, 
									HashMap<String, HashMap<String, Object>> outMap, ArrayList<HashMap<String, Object>> errList)
	{
		// 汎用キー項目用の変数
		String sbtItem  = null;
		HashMap<String, String> valueMap = new HashMap<String, String>();

		// 必須チェック用の変数
		HashMap<Object, String> requiedTypeMap = new HashMap<Object, String>();
		int rrNorCnt = 0;
		int nnNorCnt = 0;
		
		// 入力マップに値が設定されていな場合、何もしない
		if (inMap.isEmpty()) return;
		
		// マップ内の項目をチェックする
		for (String checkItem : itemCheckList)
		{
			String[] items = getCheckInfo(checkItem); // 定義文字列を分解して値を取得
			
			// 対象文字列を取得
			Object value = inMap.get(items[0]);
			
			// 必須チェックの状態を保存する
			requiedTypeMap.put(items[0], items[1]);
			
			// 単項目チェック
			String err = checkError(value, items[1], items[2], Integer.parseInt(items[3]), Integer.parseInt(items[4]));
			if (err != null)
			{
				// エラーの場合は、エラーをリストに追加する。
				errList.add(createError(err, items[0]));
			}
			else
			{
				if ("I".equals(items[5]))		// 種別
				{
					if (!JKKStringUtil.isNullBlank((String) value))
					{
						sbtItem = items[0];
						valueMap.put(items[0], (String)value);
					}
				}
				else if ("V".equals(items[5]))	// 汎用キー
				{
					if (!JKKStringUtil.isNullBlank((String) value))
					{
						valueMap.put(items[0], (String)value);
					}
				}
				else if ("N".equals(items[5]))	// 出力マップに値を出力しない
				{
					
				}
				else							// 出力マップに値を代入
				{
					if (!JKKStringUtil.isNullBlank((String) value))
					{
						outMap.get(items[6]).put(items[7], value);
					}
				}
				
				// 必須チェックを厳密に行う為に正常に取得できた必須項目の数をカウントする。
				if ("1".equals(items[1])) // 必須項目
				{
					rrNorCnt++;
				}
				if ("2".equals(items[1])) // 任意項目
				{
					nnNorCnt++;
				}
			}
		}
		
		// リスト内のエラーを精査する
		checkErrorList(errList, rrNorCnt, nnNorCnt, requiedTypeMap);
		if (!errList.isEmpty())
		{
			// エラーが存在すれば例外を発生。
			throw new IllegalArgumentException();
		}
		
		// 汎用キーの変換を行うか判定
		if (sbtItem != null && !JKKStringUtil.isNullBlank(valueMap.get(sbtItem)) && reCheckList != null)
		{
			// 種別を取得
			int sbt = Integer.parseInt(valueMap.get(sbtItem));
			// 種別が範囲外か、定義が存在しない場合
			if (sbt <= 0 || reCheckList.length < sbt || JKKStringUtil.isNullBlank(reCheckList[sbt-1]))
			{
				// 範囲外のエラー
				// エラーの場合は、メッセージを設定
				errList.add(createError(ATTRIBUTE_ERROR, sbtItem));
				throw new IllegalArgumentException() ;
			}
			// 定義を変換
			String[] items = getCheckInfo(reCheckList[sbt-1]); // 定義文字列を分解して値を取得
			if (!"*".equals(items[0]))
			{
				// 単項目チェック
				String err = checkError(valueMap.get(items[0]), items[1], items[2], Integer.parseInt(items[3]), Integer.parseInt(items[4]));
				if (err != null)
				{
					// エラーの場合は、メッセージを設定
					errList.add(createError(err, items[0]));
					throw new IllegalArgumentException() ;
				}
				if (!JKKStringUtil.isNullBlank((String) valueMap.get(items[0])))
				{
					outMap.get(items[6]).put(items[7], valueMap.get(items[0]));
				}
			}
			else
			{
				for (int i=7; i < items.length; i=i+2)
				{
					if (valueMap.containsKey(items[i+1]))
					{
						if (!JKKStringUtil.isNullBlank((String) valueMap.get(items[i+1])))
						{
							// 指定のマップに値を代入
							outMap.get(items[6]).put(items[i], valueMap.get(items[i+1]));
						}
					}
				}
			}
		}
	}
	
	/**
	 * チェック情報を取得する。
	 * <br>
	 * @param defstr
	 * @return チェック情報を配列で返す。
	 * 内容は受信キー文字、必須条件、形式、最小桁、最大桁、変換タイプ、マッピング文字列
	 */
	private String[] getCheckInfo(String defstr)
	{
		String[] values = defstr.split(":");
		// 余分な空白を削除
		for (int i=0; i < values.length; i++)
		{
			values[i] = values[i].trim();
		}
		return values;
	}
	
	/**
	 * エラーリスト内をチェックし、エラー内容を精査する
	 * <br>
	 * @param errList
	 * @param reqSuccCnt
	 * @param reqChoSuccCnt
	 * @param requiedTypeMap
	 */
	private void checkErrorList(ArrayList<HashMap<String, Object>> errList, int reqSuccCnt, int choReqSuccCnt, HashMap<Object, String> requiedTypeMap)
	{
		for (HashMap<String, Object> err : errList)
		{
			if (REQUIRED_ERROR.equals(err.get(KEY_ERR_CD)))
			{
				Object itemName = err.get(KEY_ERRMSG);
				
				// 必須チェックを無視してよいか判定する
				if ("1".equals(requiedTypeMap.get(itemName)) && (reqSuccCnt > 0 || choReqSuccCnt > 0))
				{
					// 必須の正常データが１件存在する場合はエラー
					errList.clear();
					errList.add(err);
					return ;
				}
				// 選択必須チェックを無視してよいか判定する
				if ("2".equals(requiedTypeMap.get(itemName)) && reqSuccCnt > 0 && choReqSuccCnt == 0)
				{
					errList.clear();
					errList.add(err);
					return ;
				}
			}
			else
			{
				// それ以外のエラーが発生している場合は、それだけを残しておく
				errList.clear();
				errList.add(err);
				return ;
			}
		}
		// 無視してよいエラーは全てクリア
		errList.clear();
	}

	/**
	 * エラーを作成する。
	 * @param errCd
	 * @param paramName
	 * @return
	 */
	private HashMap<String, Object> createError(String errCd, Object paramName)
	{
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put(KEY_ERR_CD, errCd);
		map.put(KEY_ERRMSG, paramName);
		return map;
	}
	
	/**
	 * 単項目チェックの必須エラーマップ作成メソッドです。
	 * 
	 * @return
	 */
	public Map<String, String> getReqErrInfMap()
	{
		String errorCode = JKKStrConst.RETURN_CD_1001;
		String errorMessage = "";
		
		return getCommonErrInfMap(errorCode, errorMessage);
	}
	
	/**
	 * 単項目チェックの属性エラーマップ作成メソッドです。
	 * 
	 * @return
	 */
	public Map<String, String> getFormErrInfMap()
	{
		String errorCode = JKKStrConst.RETURN_CD_1002;
		String errorMessage = "";
		
		return getCommonErrInfMap(errorCode, errorMessage);
	}
	
	/**
	 * 単項目チェックの桁数エラーマップ作成メソッドです。
	 * 
	 * @return
	 */
	public Map<String, String> getLenErrInfMap()
	{
		String errorCode = JKKStrConst.RETURN_CD_1003;
		String errorMessage = "";
		
		return getCommonErrInfMap(errorCode, errorMessage);
	}
	
	/**
	 * 各業務エラーチェックのエラーマップ作成メソッド
	 * 
	 * @param return_cd
	 * @param errorMessage
	 * @return
	 */
	private Map<String, String> getCommonErrInfMap(String return_cd, String errorMessage)
	{
		Map<String, String> returnMap = new HashMap<String, String>();
		
		returnMap.put(PARAM_ERRCODE, return_cd);
		returnMap.put(PARAM_ERRMESSAGE, errorMessage);
		
		return returnMap;
	}
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param mappingData マッピングデータ
	 * @param fixedText ユーザ定義文字列
	 * @param contents CAANMsgのコンテンツ
	 * @return CAANMsg
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle,
			IRequestParameterReadWrite param, Object[][] mappingData,
			String fixedText, Object[][] contents) throws Throwable
	{
		// 上りマッピング処理
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);
		
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// サービスI/F呼出し実行
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		// SCからの戻り値からCAANMsgを取得
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		
		// リターンコード取得
		Object returnCode = result.get(JCMConstants.RET_CD_INT_KEY);
		// ステータス取得
		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		// エラー情報の設定
		editErrorInfo(param, templates, (Integer)returnCode, fixedText, contents);
		
		// エラー情報のマップを取得
		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));
		
		// 異常の場合、CCExceptionを生成してスローする
		if(!("0".equals(returnCode.toString()) && 0 == status))
		{
			throw new CCException("サービスコンポーネントエラー", new Exception());
		}
		
		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));
		
		// サービスインターフェイス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 (mappingData[i][1] instanceof CAANMsg[])
			{
				template.set((String)mappingData[i][0], (CAANMsg[])mappingData[i][1]);
			}
			else
			{
				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 CAANMsgクラス
	 * @param returnCode リターンコード
	 * @param fixedText ユーザ定義文字列
	 * @param contents CAANMsgのコンテンツ
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param,
			CAANMsg[] templates, int returnCode, String fixedText, Object[][] contents) 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 + String.format(RETURN_MESSAGE_FORMAT, 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 (bpStatus < templateStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format(RETURN_MESSAGE_FORMAT, templateStatus);
			String message = JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		// ユーザデータ情報
		HashMap<String, String> inMap = (HashMap<String, String>)param.getData(fixedText);
		
		for (int i = 0; null != contents && i < contents.length ; i++)
		{
			String itemNm = (String)contents[i][0];
			if (itemNm.endsWith(ERRITEM_SUFFIX))
			{
				String errCd = (String)template.getString(itemNm);
				if (!JKKStringUtil.isNullBlank(errCd))
				{
					inMap.put(itemNm, errCd);
				}
			}
		}
		
		return param;
	}
	
	/**
	 * エラーチェックを行い、エラーが見つかった場合、エラーコードを返す。
	 * <br>
	 * @param src	対象のオブジェクト
	 * @param requiredMode	必須チェックを行うかを指定
	 * @param attrType	属性チェックの種類を指定
	 * @param min	最小桁数を指定
	 * @param max	最大桁数を指定
	 * @return エラーが無ければnull。エラーが見つかった場合はエラーコードを返す。
	 */
	private String checkError(Object src, Object requiredMode, Object attrType, int min, int max) 
	{
		String target = (String)src;
		boolean required = !"0".equals(requiredMode);
		
		// 必須チェック
		if (required && JKKStringUtil.isNullBlank((String)target))
		{
			return REQUIRED_ERROR;
		}
		// 値が存在しない場合、以降のチェックは行わない
		else if (JKKStringUtil.isNullBlank((String)target)) 
		{
			// NULLの場合、以降のチェックは行わない
			return null;
		}
		// 桁数チェックエラー
		else if (min == max && !LengthCheck.isLength1Check(target, min))
		{
			return LENGTH_ERROR;
		}
		// 桁数チェックエラー
		else if (min != max && !LengthCheck.isLength2Check(target, min, max))
		{
			return LENGTH_ERROR;
		}
		// 属性チェックエラー(半角英数1)		"hannkakusuuji1"
		else if ("hannkakusuuji1".equals(attrType) && !HalfCharCheck.isNumber1Check(target))
		{
			return ATTRIBUTE_ERROR;
		}
		// 属性チェックエラー(半角英数字1)		"hannkakuesuuji1"
		else if ("hannkakuesuuji1".equals(attrType) && !HalfCharCheck.isEnNumber1Check(target))
		{
			return ATTRIBUTE_ERROR;
		}
		// 属性チェックエラー(半角英数字2)		"hannkakuesuuji2"
		else if ("hannkakuesuuji2".equals(attrType) && !HalfCharCheck.isEnNumber2Check(target))
		{
			return ATTRIBUTE_ERROR;
		}
		// 属性チェックエラー(半角英数字8)		"hannkakuesuuji8"
		else if ("hannkakuesuuji8".equals(attrType) && !HalfCharCheck.isEnNumber8Check(target))
		{
			return ATTRIBUTE_ERROR;
		}
		// 属性チェックエラー(全角英数字カナ)	"zenkakueisuujikana"
		else if ("zenkakueisuujikana".equals(attrType) && !EmsizeCharCheck.isEmsizeEnNumKanaCheck(target))
		{
			return ATTRIBUTE_ERROR;
		}
		// 属性チェックエラー(年月日1)* 年月日1	"yyyymmdd1"
		else if ("yyyymmdd1".equals(attrType) && !DatetimeCheck.isDateCheck(target))
		{
			return ATTRIBUTE_ERROR;
		}
		// 属性チェックエラー(TEL2)				"tel2"
		else if ("tel2".equals(attrType) && !HalfCharCheck.isTelno2Check(target))
		{
			return ATTRIBUTE_ERROR;
		}
		// 属性チェックエラー(氏名/住所)		"simeijyuusho"
		else if ("simeijyuusho".equals(attrType) && !MixCharCheck.isNameAddressCheck(target))
		{
			return ATTRIBUTE_ERROR;
		}
		// 属性チェックエラー(E-mail)			"e-mail"
		else if ("e-mail".equals(attrType) && !HalfCharCheck.isEmailCheck(target))
		{
			return ATTRIBUTE_ERROR;
		}
		return null;
	}
	
	// ANK-4378-00-00 ADD START
	/**
	 * サービス契約グループ設定一覧照会（サービス契約番号）サービスIFの実行の結果を返す。
	 * <br>
	 * @param handle
	 * @param param
	 * @param dataMapKey
	 * @param svcKeiNo
	 * @return CAANMsg[]
	 * @throws Throwable 
	 */
	private CAANMsg[] getEKK2961B001CAANMsg(SessionHandle handle, 
			IRequestParameterReadWrite param, 
			String dataMapKey,
			String svcKeiNo) throws Throwable 
	{
		
		CAANMsg[] result = null;
		
		// サービス契約グループ設定一覧照会（サービス契約番号）の上りマッピング 要メソッド化
		Object[][] ekk2961b001In =
				{ { EKK2961B001CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK2961B001 }, 
					{ EKK2961B001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
					{ EKK2961B001CBSMsg.KEY_SVC_KEI_NO, svcKeiNo },
					{ EKK2961B001CBSMsg.KEY_SVKEI_GRP_SBT_CD, "01" } };
		// SC実行
		result = callSC(handle,  param, ekk2961b001In,
				dataMapKey, new EKK2961B001CBSMsg().getContents()).getCAANMsgList(EKK2961B001CBSMsg.EKK2961B001CBSMSG1LIST);
		
		return result;
	}
	
	/**
	 * サービス契約回線内訳一意照会サービスIFの実行の結果を返す。
	 * <br>
	 * @param handle
	 * @param param
	 * @param dataMapKey
	 * @param svkeiGrpSkbtNo
	 * @throws Throwable 
	 */
	private CAANMsg[] getEKK0251A010CAANMsg(SessionHandle handle, 
			IRequestParameterReadWrite param, 
			String dataMapKey,
			String svkeiGrpSkbtNo) throws Throwable 
	{
		
		CAANMsg[] result = null;
		
		// サービス契約回線内訳一意照会の上りマッピング
		Object[][] ekk0251a010In =
				{ { EKK0251A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0251A010 }, 
						{ EKK0251A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 },
						{ EKK0251A010CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO, svkeiGrpSkbtNo } };

		// SC実行
		result = callSC(handle,  param, ekk0251a010In,
				dataMapKey, new EKK0251A010CBSMsg().getContents()).getCAANMsgList(EKK0251A010CBSMsg.EKK0251A010CBSMSG1LIST);
		
		return result;
	}
	// ANK-4378-00-00 ADD END
	
}
