/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCKCustRrksInfoOPMSCC
*   ソースファイル名：JCKCustRrksInfoOPMSCC.java
*   作成者          ：FJ
*	日付			：2023年1月20日
*＜機能概要＞
*   お客さま連絡先情報照会(OPMS)CC
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*	v64.00.00   2023/01/19  FJ)北村    【ANK-4347-00-00】工事関連情報のメール／SMS／LINE通知対応
*	v64.00.01   2023/01/19  FJ)北村    【IT1-2023-0000005】エラー項目名の修正対応
*	v64.00.02   2023/03/02  FJ)北村    【ST-2023-0000002】お客さま連絡先情報照会のAPIを実行したら LINE IDが取得できるところ 取得できなかった
*	v64.00.03   2023/03/03  FJ)北村    【IT1-2023-0000008】値が空の項目をレスポンスに設定していた
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKAdchgConstCC;
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 com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;

import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0011B050CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B050CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0131A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0131A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0141B005CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0141B005CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0201B004CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0201B004CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0271B010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0271B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKU0081B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0081B010CBSMsg1List;

/**
 * お客さま連絡先情報照会(OPMS)CC
 * 
 * @author 富士通
 */
public class JCKCustRrksInfoOPMSCC  extends AbstractCommonComponent
{
	// ----------
	// TemplateID
	// ----------
	/** サービス契約_工事案件一覧照会 */
	private static final String TEMPLATE_ID_EKU0081B010 = "EKU0081B010";
	/** サービス契約一意照会 */
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	/** 連絡先一覧照会(SYSID) */
	private static final String TEMPLATE_ID_ECK0201B004 = "ECK0201B004";
	/** お客様情報照会(PMP連携用) */
	private static final String TEMPLATE_ID_ECK0011B050 = "ECK0011B050";
	/** お客様一意照会 */
	private static final String TEMPLATE_ID_ECK0011A010 = "ECK0011A010";
	/** オプトインメール受信設定一覧照会(SYSID)２ */
	private static final String TEMPLATE_ID_ECK0141B005 = "ECK0141B005";
	/** オプトインメール一意照会 */
	private static final String TEMPLATE_ID_ECK0131A010 = "ECK0131A010";
	/** LINE情報管理一覧照会 */
	private static final String TEMPLATE_ID_ECK0271B010 = "ECK0271B010";
	
	// ------------------------
	// CCパラメータ
	// ------------------------
	/** CCパラメータ：ボディ情報 */
	private final String BODY_INFO = "BODY_INFO";
	/** CCパラメータ：エラー情報 */
	private static final String CC_PARAM_ERROR_INFO = "ERROR_INFO";
// IT1-2023-0000005 MOD START
	/** エラーコードマップキー*/
	//private static final String CC_PARAM_ERR_CD = "errCode";
	private static final String CC_PARAM_ERR_CD = "errorCode";
	/** エラーメッセージマップキー*/
	//private static final String CC_PARAM_ERR_MSG = "errMessage";
	private static final String CC_PARAM_ERR_MSG = "errorMessage";
// IT1-2023-0000005 MOD END
	// ------------------------
	// パラメータ定数
	// ------------------------
	/** パラメータ 取得元種別 */
	private static final String IN_PARAM_SOURCE_DIV = "sourceDiv";
	/** パラメータ 取得元リスト */
	private static final String IN_PARAM_SOURCE_LIST = "sourceList";
	/** パラメータ 検索キー */
	private static final String IN_PARAM_SOURCE_KEY = "searchKey";
	/** パラメータ お客さま連絡先リスト */
	private static final String OUT_PARAM_CONTRACTINFOLIST = "contractInfoList";
	/** パラメータ 検索キー */
	private static final String OUT_PARAM_SEARCHKEY = "searchKey";
	/** パラメータ 会員種別 */
	private static final String OUT_PARAM_MEMBERDIV = "memberDiv";
	/** パラメータ 契約者電話番号 */
	private static final String OUT_PARAM_CONTRACTORTEL = "contractorTel";
	/** パラメータ コンテンツ連絡先電話番号 */
	private static final String OUT_PARAM_CONTENTTEL = "contentTel";
	/** パラメータ 優先連絡先電話番号 */
	private static final String OUT_PARAM_PREFFEREDCONTACTTEL = "prefferedContactTel";
	/** パラメータ コンテンツ連絡用メールアドレス */
	private static final String OUT_PARAM_CONTENTMAILADDRESS = "contentMailAddress";
	/** パラメータ メール受信設定リスト */
	private static final String OUT_PARAM_MAILRECEPTIONSETTINGLIST = "mailReceptionSettingList";
	/** パラメータ 項番 */
	private static final String OUT_PARAM_COLUMNNUMBER = "columnNumber";
	/** パラメータ 受信区分 */
	private static final String OUT_PARAM_RECEPTIONDIV = "receptionDiv";
	/** パラメータ 受信項目名 */
	private static final String OUT_PARAM_RECEPTIONNAME = "receptionName";
	/** パラメータ LINEID */
	private static final String OUT_PARAM_LINEID = "lineId";


	// ----------
	// エラー定数
	// ----------
	/** リターンメッセージの書式指定文字列 */
	private static final String RETURN_MESSAGE_FORMAT = "%1$04d";
	/** エラー項目接尾辞 */
	private static final String ERRITEM_SUFFIX = "_err";
	/** リターンメッセージ取得キー */
	private static final String RETURN_MESSAGE_STRING = "RETURN_MESSAGE_";
	/** エラーコード 必須チェックエラー*/
	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 CODE_VALUE_ERROR = "1004";
	/** エラーコード 契約_データ存在チェックエラー*/
	private static final String SVC_EXISTS_ERROR = "2001";
	/** エラーコード SYSID特定不可チェックエラー*/
	private static final String SYSID_UNSPECIFIED_ERROR = "2001";
	/** エラーコード 検索キー設定件数チェックエラー*/
	private static final String SEARCH_KEY_COUNT_ERROR  = "2003";
	/** 単項目チェックでエラー発生 */
	public static final int DOMAIN_ERR = 1000;
	/** 関連チェックでエラー発生 */
	public static final int RELATION_ERR = 1100;
	/** リターンコード(システムエラー) */
	public static final String RETURN_CODE_SYSTEMERR = "3001";
	/** 検索キーの最大設定件数 */
	public static final int SEARCH_KEY_MAX_COUNT = 100;
	
	// ----------
	// 定数
	// ----------
	/** 取得元種別（工事案件番号）*/
	private static final String SOURCE_DIV_KOJI = "01";
	/** 取得元種別（SYSID）*/
	private static final String SOURCE_DIV_SYSID = "02";
	/** サービス契約ステータス 照査済 */
	private static final String SVC_KEI_STAT_SHOSA_ZM = "020";
	/** サービス契約ステータス 締結済 */
	private static final String SVC_KEI_STAT_TEIKETSU_ZM = "030";
	/** サービス契約ステータス(サービス提供中) */
	public static final String SVC_KEI_STAT_KEI = "100";
	/** サービス契約ステータス(休止・中断中) */
	public static final String SVC_KEI_STAT_PAUSE_STP_CHU = "210";
	/** サービス契約ステータス(利用停止中) */
	public static final String SVC_KEI_STAT_RIYO_TEISHI = "220";
	/** 照査解約完了コード：OK */
	private final String SHOSA_DSL_FIN_CD_OK = "1";
	/** エラーメッセージ：2001 */
	private final String MSG_ERROR_2001 = "対象のお客さま情報が見つかりません";
	/** オプトインメール受信設定ステータス:有効 */
	public static final String OPTINM_RCV_SETTE_STAT_YK = "010";
	/** エラーメッセージ　項目名、設定値間の値 */
	public static final String MSG_ERR_COLON = " : ";

	/**
	 * <p>
	 *  お客さま連絡先情報照会(OPMS)CCを実行する。
	 * </p>
	 * @param inCBSMsg CBSメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable 
	{
		// ユーザデータ情報
		Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);

		// お客さま連絡先リスト
		List<Map<String, Object>> contractInfoList = new ArrayList<Map<String, Object>>();

		String opeDate = JCCBPCommon.getOpeDate(null);

		try
		{
			// エラーリスト
			List<Map<String, String>> errList = new ArrayList<Map<String, String>>();

			// リクエスト.取得元種別
			String stku_moto_sbt = (String)ccMsg.get(IN_PARAM_SOURCE_DIV);
			
			// 取得元種別の単項目チェック
			if (!checkUnitParam(ccMsg, IN_PARAM_SOURCE_DIV, stku_moto_sbt, false))
			{
				// 単項目チェックにてエラーが発生した場合、業務エラー
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				return param;
			}

			// 取得元種別のコード値チェック
			if ((!SOURCE_DIV_KOJI.equals(stku_moto_sbt) 
					&& !SOURCE_DIV_SYSID.equals(stku_moto_sbt)))
			{
				// 想定したコード値以外の場合、エラー
				errList.add(createErrorMap(IN_PARAM_SOURCE_DIV, stku_moto_sbt, CODE_VALUE_ERROR, false));
				ccMsg.put(CC_PARAM_ERROR_INFO, errList);

				// 取得元種別のコード値チェックでエラーの場合は業務エラー
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				return param;
			}

			// 検索キーリスト
			List<Map<String,String>> sch_key_List = (List<Map<String,String>>)ccMsg.get(IN_PARAM_SOURCE_LIST);

			// 検索キーの設定件数をチェック
			if (sch_key_List == null
					|| sch_key_List.size() == 0 )
			{
				// 設定なしの場合、必須チェックエラー
				errList.add(createErrorMap(IN_PARAM_SOURCE_KEY, "", REQUIRED_ERROR, false));
				ccMsg.put(CC_PARAM_ERROR_INFO, errList);

				// 検索キーリストの必須チェックでエラーの場合は業務エラー
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				return param;
			}
			else if (sch_key_List.size() > SEARCH_KEY_MAX_COUNT)
			{
				// 101件以上の場合、エラー
				errList.add(createErrorMap(IN_PARAM_SOURCE_KEY, "", SEARCH_KEY_COUNT_ERROR, false));
				ccMsg.put(CC_PARAM_ERROR_INFO, errList);

				// 検索キー設定件数チェックでエラーの場合は業務エラー
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				return param;
			}

			// 検索キーの件数分処理を実行
			for (int i = 0; i < sch_key_List.size(); i++) {

				// レスポンス値.お客さま連絡先リストの内容
				HashMap<String, Object> custRrksInfoMap = new HashMap<String, Object>();
				
				// 検索キー
				String search_key = (String)sch_key_List.get(i).get(IN_PARAM_SOURCE_KEY);
				// レスポンス値.検索キーに値を設定
				custRrksInfoMap.put(OUT_PARAM_SEARCHKEY, JKKStringUtil.nullToBlank(search_key));

				// パラメータチェックを実行する
				// 単項目チェック
				if (!checkUnitParam(ccMsg, IN_PARAM_SOURCE_KEY, search_key, true))
				{
					// 単項目チェックにてエラーが発生した場合、業務エラー
					param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
					return param;
				}

				// SYSID
				String sysid = null;

				// 取得元種別が"01"（工事案件番号）の場合
				if (SOURCE_DIV_KOJI.equals(stku_moto_sbt)) 
				{
					// 検索キーよりSYSIDを取得する。
					// サービス契約_工事案件一覧照会を実行する。
					CAANMsg[] eku0081b010List = callEKU0081B010(handle, param, fixedText, search_key);
					if (eku0081b010List == null || eku0081b010List.length == 0)
					{
						// データ存在チェックエラー
						errList.add(createErrorMap(MSG_ERROR_2001, search_key, SVC_EXISTS_ERROR, true));
						ccMsg.put(CC_PARAM_ERROR_INFO, errList);
						// データ存在チェックでエラーの場合は業務エラー
						param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
						return param;
					}

					// サービス契約_工事案件一覧照会にて取得した件数分、サービス契約よりデータを取得する。
					for (CAANMsg eku0081b010Map : eku0081b010List)
					{

						// サービス契約＿工事案件適用終了年月日を取得
						String tendYmd = eku0081b010Map.getString(EKU0081B010CBSMsg1List.SVKEI_KOJIAK_TENDYMD);
						// サービス契約＿工事案件が適用終了している場合
						if(!JKKAdchgConstCC.MAX_DATE.equals(tendYmd)){
							// false返却
							continue;
						}
						
						// サービス契約番号を取得する
						String svc_kei_no= eku0081b010Map.getString(EKU0081B010CBSMsg1List.SVC_KEI_NO);

						// サービス契約一意照会を実行する。
						CAANMsg[] ekk0081a010List = callEKK0081A010(handle, param, fixedText, svc_kei_no, opeDate);

						// サービス契約の存在チェック
						if (ekk0081a010List == null || ekk0081a010List.length == 0)
						{
							// データ存在チェックエラー
							errList.add(createErrorMap(MSG_ERROR_2001, search_key, SVC_EXISTS_ERROR, true));
							ccMsg.put(CC_PARAM_ERROR_INFO, errList);

							// データ存在チェックでエラーの場合は業務エラー
							param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
							return param;
						}

						// サービス契約ステータスを取得する。
						String svc_kei_stst = ekk0081a010List[0].getString(EKK0081A010CBSMsg1List.SVC_KEI_STAT);

						// 照査解約完了コードを取得する。
						String shosa_dsl_fin_cd = ekk0081a010List[0].getString(EKK0081A010CBSMsg1List.SHOSA_DSL_FIN_CD);
							
						// サービス契約ステータスが対象の状態であることを確認する。
						if (chkSvcKeiStat(svc_kei_stst, shosa_dsl_fin_cd)) {
							if (sysid == null || "".equals(sysid) ) 
							{
								// SYSIDを設定
								sysid = ekk0081a010List[0].getString(EKK0081A010CBSMsg1List.SYSID);
							} 
							else 
							{
								String chk_sysid = ekk0081a010List[0].getString(EKK0081A010CBSMsg1List.SYSID);
								// SYSID特定不可チェック
								// 工事案件番号より取得したSYSIDが前処理と違う値の場合、エラー
								if (!sysid.equals(chk_sysid)) {
									// SYSID特定不可チェックエラー
									errList.add(createErrorMap(MSG_ERROR_2001, search_key, SYSID_UNSPECIFIED_ERROR, true));
									ccMsg.put(CC_PARAM_ERROR_INFO, errList);

									// SYSID特定不可チェックでエラーの場合は業務エラー
									param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
									return param;
								}
							}
						}
					}

					// SYSIDが取得できなかった場合、エラーとする。
					if (sysid == null || "".equals(sysid)) 
					{
						// データ存在チェックエラー
						errList.add(createErrorMap(MSG_ERROR_2001, search_key, SVC_EXISTS_ERROR, true));
						ccMsg.put(CC_PARAM_ERROR_INFO, errList);
						// データ存在チェックでエラーの場合は業務エラー
						param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
						return param;
					}
				} else {
					// 検索キーはSYSIDの為、設定する。
					sysid = search_key;
				}

				// SYSIDを検索キーとし、お客様一意照会を実行し、お客様情報を取得する。
				CAANMsg[] eck0011a010List = callECK0011A010(handle, param, fixedText, sysid, opeDate);

				// お客様一意照会チェック
				if (eck0011a010List == null || eck0011a010List.length == 0)
				{
					// データ存在チェックエラー
					errList.add(createErrorMap(MSG_ERROR_2001, search_key, SVC_EXISTS_ERROR, true));
					ccMsg.put(CC_PARAM_ERROR_INFO, errList);

					// データ存在チェックでエラーの場合は業務エラー
					param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
					return param;
				}

				// 会員種別コード
				String member_sbt_cd = eck0011a010List[0].getString(ECK0011A010CBSMsg1List.MEMBER_SBT_CD);
// IT1-2023-0000008 MOD START
				//// レスポンス値.会員種別に値を設定
				//custRrksInfoMap.put(OUT_PARAM_MEMBERDIV, JKKStringUtil.nullToBlank(member_sbt_cd));
				// 会員種別コードに設定がある場合、レスポンスに設定する。
				if (!JKKStringUtil.isNullEmpty(member_sbt_cd)) {
					// レスポンス値.会員種別に値を設定
					custRrksInfoMap.put(OUT_PARAM_MEMBERDIV, JKKStringUtil.nullToBlank(member_sbt_cd));
				}
// IT1-2023-0000008 MOD END

				// 契約者電話番号
				String keisha_telno = eck0011a010List[0].getString(ECK0011A010CBSMsg1List.KEISHA_TELNO);
// IT1-2023-0000008 MOD START
				//// レスポンス値.契約者電話番号に値を設定
				//custRrksInfoMap.put(OUT_PARAM_CONTRACTORTEL, JKKStringUtil.nullToBlank(keisha_telno));
				// 契約者電話番号に設定がある場合、レスポンスに設定する。
				if (!JKKStringUtil.isNullEmpty(keisha_telno)) {
					// レスポンス値.契約者電話番号に値を設定
					custRrksInfoMap.put(OUT_PARAM_CONTRACTORTEL, JKKStringUtil.nullToBlank(keisha_telno));
				}
// IT1-2023-0000008 MOD END

				// 基準年月日時分秒を設定
				String key_base_dtm = JCCBPCommon.getOpeDateTimeStamp(null);
				
				// 連絡先コード ※条件無しのためnullセット
				String rrks_cd = null;
				// 連絡方法コード＝"003"：電話番号
				String rrk_way_cd = JKKStrConst.CD00790_TELNO;
				// 連絡先種別コード＝"1"：自宅
				String rrks_sbt_cd = JKKStrConst.CD00254_HOME;
				// 連絡先分類コード＝"1"：コンテンツ系連絡先
				String rrks_bunrui_cd = JKKStrConst.CD00871_CONT_RRS;

				// 連絡先履歴一覧照会(SYSID)を実行し、コンテンツ連絡先電話番号を取得する。
				CAANMsg[] eck0201b004List_cont_rrks = callECK0201B004(handle, param, fixedText
						, sysid, key_base_dtm, rrks_cd, rrk_way_cd, rrks_sbt_cd, rrks_bunrui_cd);

				// 電話番号（コンテンツ連絡先）
				String cont_rrks_telno = null;

				// コンテンツ連絡先電話番号の存在チェック
				if (eck0201b004List_cont_rrks != null && eck0201b004List_cont_rrks.length != 0)
				{
					// 電話番号を取得し、設定する。
					cont_rrks_telno = eck0201b004List_cont_rrks[0].getString(ECK0201B004CBSMsg1List.TELNO);
				}
// IT1-2023-0000008 MOD START
				//// レスポンス値.コンテンツ連絡先電話番号に値を設定
				//custRrksInfoMap.put(OUT_PARAM_CONTENTTEL, JKKStringUtil.nullToBlank(cont_rrks_telno));
				// 電話番号（コンテンツ連絡先）に設定がある場合、レスポンスに設定する。
				if (!JKKStringUtil.isNullEmpty(cont_rrks_telno)) {
					// レスポンス値.コンテンツ連絡先電話番号に値を設定
					custRrksInfoMap.put(OUT_PARAM_CONTENTTEL, JKKStringUtil.nullToBlank(cont_rrks_telno));
				}
// IT1-2023-0000008 MOD END

				// 連絡先コード ※条件無しのためnullセット
				rrks_cd = null;
				// 連絡方法コード＝"003"：電話番号
				rrk_way_cd = JKKStrConst.CD00790_TELNO;
				// 連絡先種別コード＝"2"：携帯
				rrks_sbt_cd = JKKStrConst.CD00254_KTAI;
				// 連絡先分類コード ※条件無しのためnullセット
				rrks_bunrui_cd = null;

				// 連絡先履歴一覧照会(SYSID)を実行し、優先連絡先電話番号を取得する。
				CAANMsg[] eck0201b004List_yusen_rrks = callECK0201B004(handle, param, fixedText
						, sysid, key_base_dtm, rrks_cd, rrk_way_cd, rrks_sbt_cd, rrks_bunrui_cd);

				// 電話番号（優先連絡先電話番号）
				String yusen_rrks_telno = null;

				// 優先連絡先電話番号の存在チェック
				if (eck0201b004List_yusen_rrks != null && eck0201b004List_yusen_rrks.length > 0)
				{
					// 電話番号を取得し、設定する。
					yusen_rrks_telno = eck0201b004List_yusen_rrks[0].getString(ECK0201B004CBSMsg1List.TELNO);
				}
// IT1-2023-0000008 MOD START
				//// レスポンス値.優先連絡先電話番号に値を設定
				//custRrksInfoMap.put(OUT_PARAM_PREFFEREDCONTACTTEL, JKKStringUtil.nullToBlank(yusen_rrks_telno));
				// 電話番号（優先連絡先電話番号）に設定がある場合、レスポンスに設定する。
				if (!JKKStringUtil.isNullEmpty(yusen_rrks_telno)) {
					// レスポンス値.優先連絡先電話番号に値を設定
					custRrksInfoMap.put(OUT_PARAM_PREFFEREDCONTACTTEL, JKKStringUtil.nullToBlank(yusen_rrks_telno));
				}
// IT1-2023-0000008 MOD END

				// お客様情報照会(PMP連携用)を実行し、コンテンツ連絡先メールアドレスを取得する。
				CAANMsg[] eck0011b050List = callECK0011B050(handle, param, fixedText, sysid);

				// メールアドレス（コンテンツ連絡先メールアドレス）
				String mlad = null;

				// コンテンツ連絡先メールアドレスの存在チェック
				if (eck0011b050List != null && eck0011b050List.length > 0)
				{
					// メールアドレスを取得し、設定する。
					mlad = getRrksMailAddress(eck0011b050List);
				}
// IT1-2023-0000008 MOD START
				//// レスポンス値.コンテンツ連絡用メールアドレスに値を設定
				//custRrksInfoMap.put(OUT_PARAM_CONTENTMAILADDRESS, JKKStringUtil.nullToBlank(mlad));
				// メールアドレス（コンテンツ連絡先メールアドレス）に設定がある場合、レスポンスに設定する。
				if (!JKKStringUtil.isNullEmpty(mlad)) {
					// レスポンス値.コンテンツ連絡用メールアドレスに値を設定
					custRrksInfoMap.put(OUT_PARAM_CONTENTMAILADDRESS, JKKStringUtil.nullToBlank(mlad));
				}
// IT1-2023-0000008 MOD END

				// レスポンス値.メール受信設定リストの内容
				List<Map<String, Object>> mailRcvstList = new ArrayList<Map<String, Object>>();

				// メールアドレスが設定されている場合のみ、取得処理を行う。
				if (mlad != null && !"".equals(mlad)) {
					// オプトインメール受信設定一覧照会(SYSID)２を実行し、オプトインメール受信設定を取得する。
					CAANMsg[] eck0141b005List = callECK0141B005(handle, param, fixedText, sysid, mlad);

					// オプトインメール受信設定の存在チェック
					if (eck0141b005List != null && eck0141b005List.length > 0)
					{
						// オプトインメール受信設定より取得した件数分、メール受信設定リストに設定する。
						for (CAANMsg eck0141b005Map : eck0141b005List) 
						{
							// オプトインメール番号
							String optinm_no = null;
							// 受信区分
							String rcv_div = null;
							// オプトインメール名
							String optinm_nm = null;

							HashMap<String, Object> mailRcvstListMap = new HashMap<String, Object>();

							String optinm_rcv_sette_stat = eck0141b005Map.getString(ECK0141B005CBSMsg1List.OPTINM_RCV_SETTE_STAT);
							// データを取得できた場合、オプトインメール受信設定ステータスが"010"(有効）であることを確認する。
							if (OPTINM_RCV_SETTE_STAT_YK.equals(optinm_rcv_sette_stat)) {
								// 返却値を設定する。
								optinm_no = eck0141b005Map.getString(ECK0141B005CBSMsg1List.OPTINM_NO);
								rcv_div = eck0141b005Map.getString(ECK0141B005CBSMsg1List.RCV_DIV);
							}

							// オプトインメール番号が設定されている場合のみ、取得処理を行う。
							if (optinm_no != null && !"".equals(optinm_no)) {
								// オプトインメール一意照会を実行し、オプトインメールを取得する。
								CAANMsg[] eck0131a010List = callECK0131A010(handle, param, fixedText, optinm_no, opeDate);

								// オプトインメールの存在チェック
								if (eck0131a010List != null && eck0131a010List.length > 0)
								{
									// 返却値を設定する。
									optinm_nm = eck0131a010List[0].getString(ECK0131A010CBSMsg1List.OPTINM_NM);
								}

// IT1-2023-0000008 MOD START
								//// レスポンス値.項番に値を設定
								//mailRcvstListMap.put(OUT_PARAM_COLUMNNUMBER, JKKStringUtil.nullToBlank(optinm_no));
								//// レスポンス値.受信区分に値を設定
								//mailRcvstListMap.put(OUT_PARAM_RECEPTIONDIV, JKKStringUtil.nullToBlank(rcv_div));
								//// レスポンス値.受信項目名 に値を設定
								//mailRcvstListMap.put(OUT_PARAM_RECEPTIONNAME, JKKStringUtil.nullToBlank(optinm_nm));

								//// MAPの内容をメール受信設定リストに入れる
								//mailRcvstList.add(mailRcvstListMap);

								boolean setFlg = false;
								// オプトインメール番号に設定がある場合、レスポンスに設定する。
								if (!JKKStringUtil.isNullEmpty(optinm_no)) {
									// レスポンス値.項番に値を設定
									mailRcvstListMap.put(OUT_PARAM_COLUMNNUMBER, JKKStringUtil.nullToBlank(optinm_no));
									setFlg = true;
								}
								// 受信区分に設定がある場合、レスポンスに設定する。
								if (!JKKStringUtil.isNullEmpty(rcv_div)) {
									// レスポンス値.受信区分に値を設定
									mailRcvstListMap.put(OUT_PARAM_RECEPTIONDIV, JKKStringUtil.nullToBlank(rcv_div));
									setFlg = true;
								}
								// オプトインメール名に設定がある場合、レスポンスに設定する。
								if (!JKKStringUtil.isNullEmpty(optinm_nm)) {
									// レスポンス値.受信項目名 に値を設定
									mailRcvstListMap.put(OUT_PARAM_RECEPTIONNAME, JKKStringUtil.nullToBlank(optinm_nm));
									setFlg = true;
								}

								if (setFlg) {
									// MAPの内容をメール受信設定リストに入れる
									mailRcvstList.add(mailRcvstListMap);
								}
// IT1-2023-0000008 MOD END
							}
						}
					}
				}

// IT1-2023-0000008 MOD START
				//// レスポンス値.メール受信設定リストにメール受信設定内容を設定
				//custRrksInfoMap.put(OUT_PARAM_MAILRECEPTIONSETTINGLIST, mailRcvstList);
				// メール受信設定内容に設定がある場合、レスポンスに設定する。
				if (mailRcvstList != null && mailRcvstList.size() > 0) {
					// レスポンス値.メール受信設定リストにメール受信設定内容を設定
					custRrksInfoMap.put(OUT_PARAM_MAILRECEPTIONSETTINGLIST, mailRcvstList);
				}
// IT1-2023-0000008 MOD END

				// line_id
				String line_id = null;
				// LINE情報管理一覧照会を実行し、LINE情報管理情報を取得する。
				CAANMsg[] eck0271b010List = callECK0271B010(handle, param, fixedText, sysid);

				// LINE情報管理情報の存在チェック
				if (eck0271b010List != null && eck0271b010List.length > 0)
				{
					for (CAANMsg eck0271b010Map : eck0271b010List) {
						String ninsho_rls_dtm = eck0271b010Map.getString(ECK0271B010CBSMsg1List.LINE_ID_NINSHO_RLS_DTM);
// ST-2023-0000002 ADD START
						// LINEID認証登録日時
						String nowNinshoAddDtm = eck0271b010Map.getString(ECK0271B010CBSMsg1List.LINE_ID_NINSHO_ADD_DTM);
// ST-2023-0000002 ADD END
						//  解除日時が空の場合、認証中の為、LINE_IDを設定
						if (ninsho_rls_dtm == null || "".equals(ninsho_rls_dtm)) {
							// 返却値よりLINE_IDを設定する。
							line_id = eck0271b010Map.getString(ECK0271B010CBSMsg1List.LINE_ID);
							break;
						} 
// ST-2023-0000002 ADD START
						// 認証日時 ＞ 解除日時 の場合、認証中の為、LINE_IDを設定
						else if (nowNinshoAddDtm.compareTo(ninsho_rls_dtm) > 0)
						{
							// 返却値よりLINE_IDを設定する。
							line_id = eck0271b010Map.getString(ECK0271B010CBSMsg1List.LINE_ID);
							break;
						}
// ST-2023-0000002 ADD END
					}
				}

// IT1-2023-0000008 MOD START
				//// レスポンス値.LINEIDに値を設定
				//custRrksInfoMap.put(OUT_PARAM_LINEID, JKKStringUtil.nullToBlank(line_id));
				// LINE_IDに設定がある場合、レスポンスに設定する。
				if (!JKKStringUtil.isNullEmpty(line_id)) {
					// レスポンス値.LINEIDに値を設定
					custRrksInfoMap.put(OUT_PARAM_LINEID, JKKStringUtil.nullToBlank(line_id));
				}
// IT1-2023-0000008 MOD END

				// お客様情報リストに設定
				contractInfoList.add(custRrksInfoMap);
			}

			// BODY情報を取得
			Map<String, Object> bodyMap = new HashMap<String, Object>();

			// お客さま連絡先リスト をレスポンスに設定
			bodyMap.put(OUT_PARAM_CONTRACTINFOLIST, contractInfoList);

			// 出力用BODY情報を上書き
			ccMsg.put(BODY_INFO, bodyMap);

			// 正常終了
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_0000);
		}
		catch (Exception e)
		{
			// エラーリスト
			List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
			errList.add(createErrorMap("", "", RETURN_CODE_SYSTEMERR, true));
			ccMsg.put(CC_PARAM_ERROR_INFO, errList);

			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
		}

		return param;
	}

	/**
	 * 単項目チェック
	 * @param ccMsg
	 * @param itemName
	 * @param itemValue
	 * @param serarchKeyChkFlg 検索キーチェックフラグ
	 * @return チェックの判定
	 * @throws Exception
	 */
	private boolean checkUnitParam(Map<String, Object> ccMsg, String itemName, String itemValue, boolean serarchKeyChkFlg)
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		// 取得元種別のチェックを行う場合は2桁を設定
		int checkLenValue = 2;
		
		if (serarchKeyChkFlg) {
			// 検索キーのチェックを行う場合は10桁を設定
			checkLenValue = 10;
		}

		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errList.add(createErrorMap(itemName, itemValue, REQUIRED_ERROR, false));
		}
		else if (!HalfCharCheck.isEnNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(createErrorMap(itemName, itemValue, ATTRIBUTE_ERROR, false));
		}
		else if (!LengthCheck.isLength1Check(itemValue, checkLenValue))
		{
			// 桁数チェックエラー
			errList.add(createErrorMap(itemName, itemValue, LENGTH_ERROR, false));
		}
		
		// エラーが存在する場合
		if (errList.size() > 0)
		{
			ccMsg.put(CC_PARAM_ERROR_INFO, errList);
			return false;
		}
		
		return true;
	}

	/**
	 * EKU0081B010_サービス契約_工事案件一覧照会を実行する。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param kojiak_no 工事案件番号
	 * @return 結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callEKU0081B010(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String kojiak_no) throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// サービス契約_工事案件一覧照会の上りマッピング
		Object[][] EKU0081B010In =
		{
			{EKU0081B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKU0081B010},
			{EKU0081B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}, 	// 機能コード："2"
			{EKU0081B010CBSMsg.KEY_KOJIAK_NO, kojiak_no}				// ＫＥＹ＿工事案件番号
		};
		
		// サービスIF実行
		CAANMsg[] EKU0081B010Out = callSC(handle, scCall, param, fixedText, EKU0081B010In).getCAANMsgList(EKU0081B010CBSMsg.EKU0081B010CBSMSG1LIST);
		
		// 結果を返却
		return EKU0081B010Out;

	}

	/**
	 * サービス契約一意照会サービスIF呼出処理
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param svc_kei_no サービス契約番号
	 * @param opeDate 運用日
	 * @param resultHash 結果のハッシュ
	 * @throws Throwable 例外時にスローされます
	 */
	private CAANMsg[] callEKK0081A010(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String svc_kei_no, String opeDate) throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// サービス契約一意照会の上りマッピング
		Object[][] EKK0081A010In =
		{
			{EKK0081A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081A010},
			{EKK0081A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}, 	// 機能コード："2"
			{EKK0081A010CBSMsg.KEY_SVC_KEI_NO, svc_kei_no},				// ＫＥＹ＿サービス契約番号
			{EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, opeDate}				// ＫＥＹ＿予約適用年月日
		};
		
		// サービスIF実行
		CAANMsg[] EKK0081A010Out = callSC(handle, scCall, param, fixedText, EKK0081A010In).getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
		
		// 結果を返却
		return EKK0081A010Out;
		
	}

	/**
	 *サービス契約ステータスの判定を行います。
	 * <br>
	 * @param svcKeiStat サービス契約ステータス
	 * @param shosa_dsl_fin_cd 照査解約完了コード
	 * @return boolean
	 */
	private boolean chkSvcKeiStat(String svcKeiStat, String shosa_dsl_fin_cd)
	{
		// 締結済（"030"）、サービス提供中（"100"）、休止・中断中（"210"）、利用停止中（"220"）
		if(SVC_KEI_STAT_TEIKETSU_ZM.equals(svcKeiStat)
				|| SVC_KEI_STAT_KEI.equals(svcKeiStat)
				|| SVC_KEI_STAT_PAUSE_STP_CHU.equals(svcKeiStat)
				|| SVC_KEI_STAT_RIYO_TEISHI.equals(svcKeiStat))
		{
			return true;
		}
		
		// サービス契約ステータスが"020":照査済かつ、照査解約完了コードが"1":照査OK
		if(SVC_KEI_STAT_SHOSA_ZM.equals(svcKeiStat) 
				&& SHOSA_DSL_FIN_CD_OK.equals(shosa_dsl_fin_cd))
		{
			return true;
		}
		
		return false;
	}

	/**
	 * お客様一意照会を行う。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param sysid
	 * @param opeDate
	 * @return CAANMsg[]
	 * @throws Exception
	 */
	private CAANMsg[] callECK0011A010(SessionHandle handle,
										IRequestParameterReadWrite param,
										String fixedText,
										String sysid,
										String opeDate) throws Exception
	{
		
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// お客様一意照会
		Object[][] eck0011a010In = {{ECK0011A010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0011A010},
									{ECK0011A010CBSMsg.FUNC_CODE, "2"},
									{ECK0011A010CBSMsg.KEY_SYSID, sysid},
									{ECK0011A010CBSMsg.KEY_RSV_APLY_YMD, opeDate}};
		// サービスIF実行
		CAANMsg[] ECK0011A010Out = callSC(handle, scCall, param, fixedText, eck0011a010In).getCAANMsgList(ECK0011A010CBSMsg.ECK0011A010CBSMSG1LIST);
		
		// 結果を返却
		return ECK0011A010Out;
	}

	/**
	 * ECK0201B004_連絡先一覧照会(SYSID)を実行する。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param sysid SYSID
	 * @param base_dtm 基準年月日時分秒
	 * @param rrks_cd 連絡先コード
	 * @param rrk_way_cd 連絡方法コード
	 * @param rrks_sbt_cd 連絡先種別コード
	 * @param rrks_bunrui_cd 連絡先分類コード
	 * @return 結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callECK0201B004(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, String sysid, String base_dtm, String rrks_cd, String rrk_way_cd
			, String rrks_sbt_cd, String rrks_bunrui_cd) throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 連絡先一覧照会(SYSID)の上りマッピング
		Object[][] ECK0201B004In =
		{
			{ECK0201B004CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0201B004},
			{ECK0201B004CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}, 	// 機能コード："1"
			{ECK0201B004CBSMsg.KEY_SYSID, sysid},						// ＫＥＹ＿SYSYID
			{ECK0201B004CBSMsg.KEY_BASE_DTM, base_dtm},					// ＫＥＹ＿基準年月日時分秒
			{ECK0201B004CBSMsg.KEY_RRKS_CD, rrks_cd},					// ＫＥＹ＿連絡先コード
			{ECK0201B004CBSMsg.KEY_RRK_WAY_CD, rrk_way_cd},				// ＫＥＹ＿連絡方法コード
			{ECK0201B004CBSMsg.KEY_RRKS_SBT_CD, rrks_sbt_cd},			// ＫＥＹ＿連絡先種別コード
			{ECK0201B004CBSMsg.KEY_RRKS_BUNRUI_CD, rrks_bunrui_cd}		// ＫＥＹ＿連絡先分類コード
		};
		
		// サービスIF実行
		CAANMsg[] ECK0201B004Out = callSC(handle, scCall, param, fixedText, ECK0201B004In).getCAANMsgList(ECK0201B004CBSMsg.ECK0201B004CBSMSG1LIST);
		
		// 結果を返却
		return ECK0201B004Out;

	}

	/**
	 * ECK0011B050_お客様情報照会(PMP連携用)を実行する。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param sysid SYSID
	 * @return 結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callECK0011B050(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String sysid) throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// サービス契約一覧照会(SYSID)の上りマッピング
		Object[][] ECK0011B050In =
		{
				{ECK0011B050CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0011B050},
				{ECK0011B050CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}, 	// 機能コード："1"
				{ECK0011B050CBSMsg.KEY_SYSID, sysid}						// ＫＥＹ＿SYSYID
		};

		// サービスIF実行
		CAANMsg[] ECK0011B050Out = callSC(handle, scCall, param, fixedText, ECK0011B050In).getCAANMsgList(ECK0011B050CBSMsg.ECK0011B050CBSMSG1LIST);

		// 結果を返却
		return ECK0011B050Out;

	}

	/**
	 * オプトインメール受信設定一覧照会(SYSID)２サービスIF呼出処理
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param sysid SYSID
	 * @param mlad メールアドレス
	 * @param resultHash 結果のハッシュ
	 * @throws Throwable 例外時にスローされます
	 */
	private CAANMsg[] callECK0141B005(SessionHandle handle,
			IRequestParameterReadWrite param, String fixedText, String sysid,
			String mlad) throws Exception {

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// オプトインメール受信設定一覧照会(SYSID)２
		Object[][] eck0141b005In = {{ECK0141B005CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0141B005},
									{ECK0141B005CBSMsg.FUNC_CODE, "1"},
									{ECK0141B005CBSMsg.KEY_SYSID, sysid},
									{ECK0141B005CBSMsg.KEY_MLAD, mlad}};
		// サービスIF実行
		CAANMsg[] ECK0141B005Out = callSC(handle, scCall, param, fixedText, eck0141b005In).getCAANMsgList(ECK0141B005CBSMsg.ECK0141B005CBSMSG1LIST);
		
		// 結果を返却
		return ECK0141B005Out;
	}

	/**
	 * オプトインメール一意照会サービスIF呼出処理
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param optinm_no オプトインメール番号
	 * @param opeDate 運用日
	 * @param resultHash 結果のハッシュ
	 * @throws Throwable 例外時にスローされます
	 */
	private CAANMsg[] callECK0131A010(SessionHandle handle,
			IRequestParameterReadWrite param, String fixedText, String optinm_no,
			String opeDate) throws Exception {

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// オプトインメール受信設定一意照会
		Object[][] eck0131a010In = {{ECK0131A010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0131A010},
									{ECK0131A010CBSMsg.FUNC_CODE, "2"},
									{ECK0131A010CBSMsg.KEY_OPTINM_NO, optinm_no},
									{ECK0131A010CBSMsg.KEY_RSV_APLY_YMD, opeDate}};
		// サービスIF実行
		CAANMsg[] ECK0131A010Out = callSC(handle, scCall, param, fixedText, eck0131a010In).getCAANMsgList(ECK0131A010CBSMsg.ECK0131A010CBSMSG1LIST);
		
		// 結果を返却
		return ECK0131A010Out;
	}

	/**
	 * LINE情報管理一覧照会サービスIF呼出処理
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param sysid SYSID
	 * @param resultHash 結果のハッシュ
	 * @throws Throwable 例外時にスローされます
	 */
	private CAANMsg[] callECK0271B010(SessionHandle handle,
			IRequestParameterReadWrite param, String fixedText, String sysid) throws Exception {

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// LINE情報管理一覧照会
		Object[][] eck0271b010In = {{ECK0271B010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0271B010},
									{ECK0271B010CBSMsg.FUNC_CODE, "1"},
									{ECK0271B010CBSMsg.KEY_SYSID, sysid}};
		// サービスIF実行
		CAANMsg[] ECK0271B010Out = callSC(handle, scCall, param, fixedText, eck0271b010In).getCAANMsgList(ECK0271B010CBSMsg.ECK0271B010CBSMSG1LIST);
		
		// 結果を返却
		return ECK0271B010Out;
	}

	/**
	 * 連絡先メールアドレスを取得する
	 * 
	 * @param eck0011b050List
	 * @return
	 * @throws Exception
	 */
	private String getRrksMailAddress(CAANMsg[] eck0011b050List) throws Exception
	{
		CAANMsg custInfo = eck0011b050List[0];
		
		// メールアドレスが設定されている且つ、メールアドレスと変更手続中メールアドレスが一致している場合
		if (custInfo.getString(ECK0011B050CBSMsg1List.MLAD) != null 
				&& custInfo.getString(ECK0011B050CBSMsg1List.MLAD).equals(custInfo.getString(ECK0011B050CBSMsg1List.CHGECHU_MLAD)))
		{
			return null;
		}
		
		return custInfo.getString(ECK0011B050CBSMsg1List.MLAD);
	}

	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Exception
	 */
	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];
		
		// リターンコード取得
		int returnCode = (Integer)result.get(JCMConstants.RET_CD_INT_KEY);
		
		int templateStatus = msg.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 (templateStatus > bpStatus)
		{
			// 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);
		}
		
		setErrorInf(msg, (HashMap<String, Object>)param.getData(dataMapKey));
		
		//エラー情報のマップを取得
		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));
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		Integer status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status.intValue()))
		{
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		return msg;
	}

	/**
	 * 共通領域のメッセージを作成します。
	 * 
	 * @param param
	 * @param mappingData
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param, Object[][] mappingData) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());
		
		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		
		String svcIf = (String)mappingData[0][1];
		
		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));
		
		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		for (int i = 0; i < mappingData.length; i++)
		{
			if ("".equals(mappingData[i][1]))
			{
				template.setNull((String)mappingData[i][0]);
			}
			else
			{
				template.set((String)mappingData[i][0], mappingData[i][1]);
			}
		}
		
		setNullToMsg(template);
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		return paramMap;
	}

	/**
	 * エラー情報を設定します。
	 * 
	 * @param msg
	 * @param map
	 * 
	 */
	private void setErrorInf(CAANMsg msg, HashMap<String, Object> map)
	{
		Iterator<String> msgKey = msg.getSchema().getSchemaKeySet().iterator();
		
		while (msgKey.hasNext())
		{
			String key = msgKey.next();
			
			if (key.endsWith(ERRITEM_SUFFIX))
			{
				if (!msg.isNull(key))
				{
					if (!map.containsKey(key))
					{
						map.put(key, msg.getString(key));
					}
				}
			}
		}
	}


	/**
	 * 未入力項目にnullを設定します。
	 * @param msg
	 */
	private void setNullToMsg(CAANMsg msg)
	{
		Iterator<String> caanMsgKeys = msg.getSchema().getSchemaKeySet().iterator();
		while (caanMsgKeys.hasNext())
		{
			String key = caanMsgKeys.next();
			if (key.endsWith(ERRITEM_SUFFIX))
			{
				String tmpKey = key.substring(0, key.length() - 4);
				
				if (!msg.containsKeyOfMsgData(tmpKey))
				{
					msg.setNull(tmpKey);
				}
			}
		}
	}

	/**
	 * エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @param itemValue 設定値
	 * @param errCd エラーコード
	 * @param mesSetflg メッセージ設定フラグ（定型文を設定する場合はtrue、「項目名：設定値」を返却する場合はfalse）
	 * @return
	 */
	private Map<String, String> createErrorMap(String itemName, String itemValue, String errCd, boolean mesSetflg)
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		// エラーメッセージ設定
		String errMessage = null;
		if (mesSetflg) {
			// 設定するメッセージをセット
			errMessage = itemName;
		}
		else
		{
			// 項目名 ： 設定値
			errMessage = itemName + MSG_ERR_COLON + itemValue;
		}

		returnMap.put(CC_PARAM_ERR_CD, errCd);

		if (errMessage != null && !"".equals(errMessage)) {
			returnMap.put(CC_PARAM_ERR_MSG, errMessage);
		}

		return returnMap;
	}
}