/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：
 *	モジュール名	：JKKDslLetterSearchApiCC
 *	ソースファイル名：JKKDslLetterSearchApiCC.java
 *	作成者			：GDC
 *	日付			：2021年02月08日
 *＜機能概要＞
 *	解約レター照会CC
 *＜修正履歴＞
 *	バージョン		修正日		修正者			修正内容
 *  v52.00.00   2021/02/08  GDC)ニール     	【ANK-3909-00-00】解約レター電子化
 *  v71.00.00   2024/01/11  FJ)新井     	【ANK-4468-00-00】eo光ネット「シンプルプラン」追加対応
 *  v74.00.00	2025/03/12	FJ)橋本			【#86617】解約レター照会できない（ネット含まない場合） ANK4427-00-00 NTT卸対応の切り戻し後対応
 **********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.bp.x21.sc.exception.SCException;
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.util.JPCDateUtil;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B040CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B040CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1681B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1681B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3111A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3111A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3111B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3111B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg1List;

/**
 * @author ニール
 * 
 */
public class JKKDslLetterSearchApiCC extends AbstractCommonComponent {

	/** CCパラメータ：SYSID_マスター会員 */
	private static final String SYSID = "sysid";

	private static final String ERROR_INFO = "ERROR_INFO";
	private static final String ERROR_CODE = "errCode";
	private static final String ERROR_MESSAGE = "errMessage";

	private static final String TEMPLATE_ID_EKK3111A010 = "EKK3111A010";
	private static final String TEMPLATE_ID_EKK3111B010 = "EKK3111B010";
	private static final String TEMPLATE_ID_EKK0081B040 = "EKK0081B040";
	private static final String TEMPLATE_ID_EKK1681B001 = "EKK1681B001";
	// ANK-4468-00-00 ADD START
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	// ANK-4468-00-00 ADD END
	// #86617 ADD START
	/** 業務パラメータ管理一意照会 */
	private static final String TEMPLATE_ID_EZM0321A010 = "EZM0321A010";
	// #86617 ADD END
	/** 空白 */
	private static final String EMPTY = "";
	private static final String DSL_LETTER_INFO_LIST = "dslLetterInfoList";
	private static final String DSL_DIV = "dslDiv";
	
	/** CCパラメータ：DSL_LETTER_ADD_NO_マスター会員 */
	private static final String DSL_LETTER_ADD_NO = "dslLetterAddNo";
	/** CCパラメータ：DSL_LETTER_HAK_YH_マスター会員 */
	private static final String DSL_LETTER_HAK_YH = "dslLetterHakYh";
	/** CCパラメータ：NET_PRC_GRP_CD_マスター会員 */
	private static final String NET_PRC_GRP_CD = "netPrcGrpCd";
	/** CCパラメータ：NET_PRC_GRP_NM_マスター会員 */
	private static final String NET_PRC_GRP_NM = "netPrcGrpNm";
	// ANK-4468-00-00 ADD START
	/** CCパラメータ：NET_PCRS_CD_マスター会員 */
	private static final String NET_PCRS_CD = "netPcrsCd";
	/** CCパラメータ：NET_PCRS_NM_マスター会員 */
	private static final String NET_PCRS_NM = "netPcrsNm";
	// ANK-4468-00-00 ADD END
	/** CCパラメータ：NET_SVC_KEI_NO_マスター会員 */
	private static final String NET_SVC_KEI_NO = "netSvcKeiNo";
	/** CCパラメータ：NET_SEIKY_KEI_NO_マスター会員 */
	private static final String NET_SEIKY_KEI_NO = "netSeikyKeiNo";
	/** CCパラメータ：NET_IDO_DIV_マスター会員 */
	private static final String NET_IDO_DIV = "netIdoDiv";
	/** CCパラメータ：NET_DEL_SSN_AMNT_マスター会員 */
	private static final String NET_DEL_SSN_AMNT = "netDelSsnAmnt";
	/** CCパラメータ：NET_DEL_YMD_マスター会員 */
	private static final String NET_DEL_YMD = "netDelYmd";
	/** CCパラメータ：TEL_PRC_GRP_CD_マスター会員 */
	private static final String TEL_PRC_GRP_CD = "telPrcGrpCd";
	/** CCパラメータ：TEL_PRC_GRP_NM_マスター会員 */
	private static final String TEL_PRC_GRP_NM = "telPrcGrpNm";
	/** CCパラメータ：TEL_SVC_KEI_NO_マスター会員 */
	private static final String TEL_SVC_KEI_NO = "telSvcKeiNo";
	/** CCパラメータ：TEL_SEIKY_KEI_NO_マスター会員 */
	private static final String TEL_SEIKY_KEI_NO = "telSeikyKeiNo";
	/** CCパラメータ：TEL_IDO_DIV_マスター会員 */
	private static final String TEL_IDO_DIV = "telIdoDiv";
	/** CCパラメータ：TEL_DEL_YMD_マスター会員 */
	private static final String TEL_DEL_YMD = "telDelYmd";
	/** CCパラメータ：TV_PRC_GRP_CD_マスター会員 */
	private static final String TV_PRC_GRP_CD = "tvPrcGrpCd";
	/** CCパラメータ：TV_PRC_GRP_NM_マスター会員 */
	private static final String TV_PRC_GRP_NM = "tvPrcGrpNm";
	/** CCパラメータ：TV_SVC_KEI_NO_マスター会員 */
	private static final String TV_SVC_KEI_NO = "tvSvcKeiNo";
	/** CCパラメータ：TV_SEIKY_KEI_NO_マスター会員 */
	private static final String TV_SEIKY_KEI_NO = "tvSeikyKeiNo";
	/** CCパラメータ：TV_IDO_DIV_マスター会員 */
	private static final String TV_IDO_DIV = "tvIdoDiv";
	/** CCパラメータ：TV_DEL_SSN_AMNT_マスター会員 */
	private static final String TV_DEL_SSN_AMNT = "tvDelSsnAmnt";
	/** CCパラメータ：TV_DEL_YMD_マスター会員 */
	private static final String TV_DEL_YMD = "tvDelYmd";
	/** CCパラメータ：DSL_LETTER_UEPCAD_PCD_マスター会員 */
	private static final String DSL_LETTER_UEPCAD_PCD = "dslLetterUepcadPcd";
	/** CCパラメータ：DSL_LETTER_UEPCAD_マスター会員 */
	private static final String DSL_LETTER_UEPCAD = "dslLetterUepcad";
	/** CCパラメータ：DSL_LETTER_ADD_YMD_マスター会員 */
	private static final String DSL_LETTER_ADD_YMD = "dslLetterAddYmd";
	/** CCパラメータ：MYPAGE_DSP_NAIYO_マスター会員 */
	private static final String MYPAGE_DSP_NAIYO = "myPageDspNaiyo";
	// #86617 ADD START
	/** 業務パラメータ管理 料金グループ名称（ＮＴＴ卸） */
	private static final String KK_NTTORS_C_GRPNM_01 = "KK_NTTORS_C_GRPNM_01";
	// #86617 ADD END
	
	/**
	 * 取扱コード反映（営業支援）を行う。
	 * 
	 * @param handle
	 *            セッションハンドル
	 * @param param
	 *            リクエストパラメータ
	 * @param fixedText
	 *            サービスメッセージ
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable {

		Map<String, Object> ccMsg = (Map<String, Object>) param.getData(fixedText);

		try {
			// 単項目チェック
			if (!checkUnitParam(ccMsg)) {
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
				return param;
			}

			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
			
			// SYSID
			String sysid = (String) ccMsg.get(SYSID);
			CAANMsg[] ekk3111b010cbsMsg1list = execEKK3111B010(handle, scCall, param, fixedText, sysid, JKKBpCommon.getOpeDate(null));
			int ekk3111b010cbsMsg1ListLength = ekk3111b010cbsMsg1list != null ? ekk3111b010cbsMsg1list.length : 0;
			ArrayList<HashMap<String, String>> rsltList = new ArrayList<HashMap<String,String>>();
			
			for (int i = 0; i < ekk3111b010cbsMsg1ListLength; i++) {
				HashMap<String, String> rsltMap = new HashMap<String, String>();
				CAANMsg msg = ekk3111b010cbsMsg1list[i];
				String dlsLetterAddNo = msg.getString(EKK3111B010CBSMsg1List.DSL_LETTER_ADD_NO);
				CAANMsg[] ekk3111a010INcbsMsg1list = execEKK3111A010(handle, scCall, param, fixedText, dlsLetterAddNo);
				
				if (hasTargetRecord(ekk3111a010INcbsMsg1list)) {
					continue;
				}
				
				CAANMsg ekk3111a010INcbsMsg = ekk3111a010INcbsMsg1list[0];
				rsltMap.put(DSL_LETTER_ADD_NO, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.DSL_LETTER_ADD_NO)));
				rsltMap.put(DSL_LETTER_HAK_YH, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.DSL_LETTER_HAK_YH)));
				rsltMap.put(NET_PRC_GRP_CD, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.NET_PRC_GRP_CD)));
				rsltMap.put(NET_PRC_GRP_NM, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.NET_PRC_GRP_NM)));
				
				// ANK-4468-00-00 ADD START
				String svcKeiNo = nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.NET_SVC_KEI_NO));
				String rsvAplyYmd = JKKBpCommon.getOpeDate(null);
				if ( !"".equals(svcKeiNo)) {
					CAANMsg[] ekk0081a010INcbsMsg1list = execEKK0081A010(handle, scCall, param, fixedText, svcKeiNo, rsvAplyYmd);
					CAANMsg ekk0081a010INcbsMsg = ekk0081a010INcbsMsg1list[0];
					rsltMap.put(NET_PCRS_CD, nullToStr(ekk0081a010INcbsMsg.getString(EKK0081A010CBSMsg1List.PCRS_CD)));
					rsltMap.put(NET_PCRS_NM, nullToStr(ekk0081a010INcbsMsg.getString(EKK0081A010CBSMsg1List.PCRS_CD_NM)));
					// #86617 ADD START
					// NTT卸区分がNULLではない場合、料金グループ名称を化かす
					if(!"".equals(nullToStr(ekk0081a010INcbsMsg.getString(EKK0081A010CBSMsg1List.NTTORS_DIV))))
					{
						CAANMsg ezm0321a010Msg = execEZM0321A010(handle, scCall, param, fixedText, KK_NTTORS_C_GRPNM_01);
						if(null != ezm0321a010Msg && !"".equals(nullToStr(ezm0321a010Msg.getString(EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE))))
						{
							rsltMap.put(NET_PRC_GRP_NM, nullToStr(ezm0321a010Msg.getString(EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE)));
						}
					}
					// #86617 ADD END
				}
				else{
					rsltMap.put(NET_PCRS_CD, EMPTY);
					rsltMap.put(NET_PCRS_NM, EMPTY);
				}
					
				// ANK-4468-00-00 ADD END
				
				rsltMap.put(NET_SVC_KEI_NO, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.NET_SVC_KEI_NO)));
				rsltMap.put(NET_SEIKY_KEI_NO, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.NET_SEIKY_KEI_NO)));
				rsltMap.put(NET_IDO_DIV, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.NET_IDO_DIV)));
				rsltMap.put(NET_DEL_SSN_AMNT, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.NET_DEL_SSN_AMNT)));
				rsltMap.put(NET_DEL_YMD, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.NET_DEL_YMD)));
				rsltMap.put(TEL_PRC_GRP_CD, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.TEL_PRC_GRP_CD)));
				rsltMap.put(TEL_PRC_GRP_NM, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.TEL_PRC_GRP_NM)));
				rsltMap.put(TEL_SVC_KEI_NO, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.TEL_SVC_KEI_NO)));
				rsltMap.put(TEL_SEIKY_KEI_NO, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.TEL_SEIKY_KEI_NO)));
				rsltMap.put(TEL_IDO_DIV, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.TEL_IDO_DIV)));
				rsltMap.put(TEL_DEL_YMD, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.TEL_DEL_YMD)));
				rsltMap.put(TV_PRC_GRP_CD, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.TV_PRC_GRP_CD)));
				rsltMap.put(TV_PRC_GRP_NM, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.TV_PRC_GRP_NM)));
				rsltMap.put(TV_SVC_KEI_NO, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.TV_SVC_KEI_NO)));
				rsltMap.put(TV_SEIKY_KEI_NO, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.TV_SEIKY_KEI_NO)));
				rsltMap.put(TV_IDO_DIV, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.TV_IDO_DIV)));
				rsltMap.put(TV_DEL_SSN_AMNT, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.TV_DEL_SSN_AMNT)));
				rsltMap.put(TV_DEL_YMD, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.TV_DEL_YMD)));
				rsltMap.put(DSL_LETTER_UEPCAD_PCD, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.DSL_LETTER_UEPCAD_PCD)));
				rsltMap.put(DSL_LETTER_UEPCAD, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.DSL_LETTER_UEPCAD)));
				rsltMap.put(DSL_LETTER_ADD_YMD, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.DSL_LETTER_ADD_YMD)));
				rsltMap.put(MYPAGE_DSP_NAIYO, nullToStr(ekk3111a010INcbsMsg.getString(EKK3111A010CBSMsg1List.MYPAGE_DSP_NAIYO)));
				rsltList.add(rsltMap);
			}
			
			ccMsg.put(DSL_LETTER_INFO_LIST, rsltList);
			String dslDiv = getDslDiv(handle, param, scCall, fixedText, sysid);
			ccMsg.put(DSL_DIV, dslDiv);

			// 正常終了
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_0000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
		}
		// サービスインターフェース呼び出しでエラーが発生した場合
		catch (SCCallException scCallEx) {
			// システムエラーを設定する
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_9000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, JKKStrConst.RETURN_MESSAGE_SYSTEM_ERROR);
		}

		return param;
	}

	/**
	 * dslDiv編集
	 * 
	 * @param handle
	 * @param param
	 * @param scCall
	 * @param fixedText
	 * @param sysid
	 * @return String
	 * @throws SCException
	 */
	private String getDslDiv(SessionHandle handle, IRequestParameterReadWrite param, ServiceComponentRequestInvoker scCall, String fixedText, String sysid) throws SCException {
		HashMap<String, String> svcKeiNoMap = new HashMap<String, String>();
		
		try {
			// (1) サービス契約一覧照会 (EKK0081B040)
			CAANMsg[] ekk0081b040INcbsMsg1list = execEKK0081B040(handle, scCall, param, fixedText, sysid);
			int ekk0081b040INcbsMsg1listLength = ekk0081b040INcbsMsg1list != null ? ekk0081b040INcbsMsg1list.length : 0;
			
			// 検索結果レコード分
			// ループ
			for (int i = 0; i < ekk0081b040INcbsMsg1listLength; i++) {
				CAANMsg ekk0081b040INcbsMsg = ekk0081b040INcbsMsg1list[i];
				String svcKeiStat = ekk0081b040INcbsMsg.getString(EKK0081B040CBSMsg1List.SVC_KEI_STAT);
				String svcKeiNo = ekk0081b040INcbsMsg.getString(EKK0081B040CBSMsg1List.SVC_KEI_NO);
				
				// (2) キャンセル済判定
				if (JKKStrConst.CD00037_CANCEL_ZM.equals(svcKeiStat)) {
					continue;
				}
				
				// (3) 解約済判定
				if (JKKStrConst.CD00037_DSL_ZM.equals(svcKeiStat)) {
					// (6)svcKeiNoMap設定(解約済
					svcKeiNoMap.put(svcKeiNo, "1");
				} else {
					// (4) 異動予約一覧照会 (EKK1681B001)
					CAANMsg[] ekk1681b001INcbsMsg1list = execEKK1681B001(handle, scCall, param, fixedText, svcKeiNo);
					
					// (5) 該当レコードあり
					if (!hasTargetRecord(ekk1681b001INcbsMsg1list)) {
						// (7)svcKeiNoMap設定(契約中)
						svcKeiNoMap.put(svcKeiNo, "0");
					} else {
						// (6) svcKeiNoMap設定(解約済)
						svcKeiNoMap.put(svcKeiNo, "1");
					}					
				}
			}
		} catch (Exception e) {
			throw new SCException(e.getMessage(), e);
		}
		
		String dslDiv = "1";
		
		if (!svcKeiNoMap.containsValue("1")) {
			dslDiv = "0";
		} else {
			boolean hasFoundDSLDiv = true;
			
			for (Map.Entry<String, String> entry : svcKeiNoMap.entrySet()) {
				String svcKeiNoValue = entry.getValue();
				
				if (!"1".equals(svcKeiNoValue)) {
					hasFoundDSLDiv = false;
					break;
				}
			}

			if (hasFoundDSLDiv) {
				dslDiv = "2";
			}
		}

		// (8)dslDiv返却
		return dslDiv;
	}

	private boolean hasTargetRecord(CAANMsg[] ekk1681b001INcbsMsg1list) {
		if( ekk1681b001INcbsMsg1list == null || ekk1681b001INcbsMsg1list.length == 0 ){
			return false;
		}
		
		for (CAANMsg ekk1681b001Msg : ekk1681b001INcbsMsg1list) {
			// 解約と撤去解約を対象とする
			if (JKKStrConst.CD00576_DSL.equals(ekk1681b001Msg.getString(EKK1681B001CBSMsg1List.IDO_DIV)))
			{
				return true;
			}else if (JKKStrConst.CD00576_TK_DSL.equals(ekk1681b001Msg.getString(EKK1681B001CBSMsg1List.IDO_DIV)))
			{
				return true;
			}
		}
		
		return false;
		
	}
	
	/**
	 * 単項目チェック
	 * 
	 * @param ccMsg
	 * @return チェックの判定
	 * @throws Exception
	 */
	private boolean checkUnitParam(Map<String, Object> ccMsg) throws Exception {
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();

		String itemName = null;
		String itemValue = null;

		// SYSID
		itemName = SYSID;
		itemValue = (String) ccMsg.get(itemName);
		// 必須チェック
		if (itemValue == null || itemValue.trim().isEmpty()) {
			// 必須チェックエラー
			errList.add(getReqErrInfMap(itemName));
		} else if (!HalfCharCheck.isEnNumber1Check(itemValue)) {
			// 属性チェックエラー
			errList.add(getFormErrInfMap(itemName));
		} else if (!LengthCheck.isLength1Check(itemValue, 10)) {
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(itemName));
		}

		// エラーが存在する場合
		if (errList.size() > 0) {
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}

		return true;
	}

	/**
	 * 単項目チェックの必須エラーマップ作成メソッドです。
	 * 
	 * @param itemName
	 *            項目名
	 * @return
	 */
	private Map<String, String> getReqErrInfMap(String itemName) {
		Map<String, String> returnMap = new HashMap<String, String>();

		// エラーメッセージ設定
		String errMessage = itemName + JKKStrConst.COLON;

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1001);
		returnMap.put(ERROR_MESSAGE, errMessage);

		return returnMap;
	}

	/**
	 * 単項目チェックの属性エラーマップ作成メソッドです。
	 * 
	 * @param itemName
	 *            項目名
	 * @return
	 */
	private Map<String, String> getFormErrInfMap(String itemName) {
		Map<String, String> returnMap = new HashMap<String, String>();

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1002);
		returnMap.put(ERROR_MESSAGE, "");

		return returnMap;
	}

	/**
	 * 単項目チェックの桁数エラーマップ作成メソッドです。
	 * 
	 * @param itemName
	 *            項目名
	 * @return
	 */
	private Map<String, String> getLenErrInfMap(String itemName) {
		Map<String, String> returnMap = new HashMap<String, String>();

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1003);
		returnMap.put(ERROR_MESSAGE, "");

		return returnMap;
	}

	/**
	 * @param param
	 * @param mappingData
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param,
												Object[][] mappingData) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		
		String svcIf = (String)mappingData[0][1];
		
		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));

		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		for (int i = 0; i < mappingData.length; i++)
		{
			if ("".equals(mappingData[i][1]))
			{
				template.setNull((String)mappingData[i][0]);
			}
			else
			{
				template.set((String)mappingData[i][0], mappingData[i][1]);
			}
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param dataMapKey
	 * @param mappingData
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int returnCode,
														String dataMapKey,
														Object[][] mappingData) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if (returnCode != 0)
		{
			templateStatus = 9000;
		}

		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		HashMap<String, String> inMap = null;

		// ユーザデータ情報
		inMap = (HashMap<String, String>)param.getData(dataMapKey);
		
		for (int i = 0; i < mappingData.length; i++)
		{
			if (!template.isNull(mappingData[i][0] + "_err"))
			{
				if (!inMap.containsKey(mappingData[i][0] + "_err"))
				{
					inMap.put(mappingData[i][0] + "_err", template.getString(mappingData[i][0] + "_err"));
				}
			}
		}
		return param;
	}
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							Object[][] mappingData) throws Exception
	{
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);
		
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		
		// リターンコード取得
		Object return_code = result.get(JCMConstants.RET_CD_INT_KEY);
		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		editErrorInfoCom(param, templates, (Integer)return_code, dataMapKey, mappingData);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(return_code.toString()) && 0 == status))
		{
			throw new SCCallException("戻り値不正", return_code.toString(), status);
		}
		return msg;
	}
	
	/**
	 * 項目名がnullかチェックする
	 * @param str 項目名
	 * @return 項目名
	 */
	private String nullToStr(String str)
	{
		if(str == null)
		{
			str = EMPTY;
		}
		return str;
	}
	
	/**
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param sysid
	 * @param opeDate
	 * @return CAANMsg[]
	 * @throws Exception
	 */
	private CAANMsg[] execEKK3111B010(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param,
				String fixedText, String sysid, String opeDate) throws Exception {

		String letterAddYMDBefore6Months = null;
		
		try {
			letterAddYMDBefore6Months = JPCDateUtil.addMonth(opeDate, -6);
		} catch (ParseException e) {
			throw new SCException(e.getMessage(), e);
		}
		
		// ***** EKK3111B010 ******
		Object[][] ekk3111b010IN = {
			{ EKK3111B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3111B010 },
			{ EKK3111B010CBSMsg.FUNC_CODE, "1" }, // "1"固定
			{ EKK3111B010CBSMsg.SEARCH_TYPE, "2" },
			{ EKK3111B010CBSMsg.MAX_SEARCH_NUM, "10000" },
			{ EKK3111B010CBSMsg.DISPLAY_NUM, "10000" },
			{ EKK3111B010CBSMsg.DISPLAY_PAGE_NUM, "1" },
			{ EKK3111B010CBSMsg.KEY_SYSID, sysid },
			{ EKK3111B010CBSMsg.KEY_LETTER_ADD_YMD_FROM, letterAddYMDBefore6Months },
			{ EKK3111B010CBSMsg.KEY_HAK_DIV, "01" },
			{ EKK3111B010CBSMsg.KEY_SORT_ITEM_NO, "3" },
			{ EKK3111B010CBSMsg.KEY_SORT_KBN, "2" },
			{ EKK3111B010CBSMsg.KEY_AFTER_SHOGO_STAT_FLG, "1" },
			{ EKK3111B010CBSMsg.KEY_MYPAGE_DSP_NAIYO_FLG, "1" }
		};
	
		// サービスインターフェイスの実行
		CAANMsg[] ekk3111b010cbsMsg1list = callSC(handle, scCall, param, fixedText, ekk3111b010IN).getCAANMsgList(EKK3111B010CBSMsg.EKK3111B010CBSMSG1LIST);
		
	
		return ekk3111b010cbsMsg1list;
	}
	
	/**
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param dlsLetterAddNo
	 * @return CAANMsg[]
	 * @throws Exception
	 */
	private CAANMsg[] execEKK3111A010(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param,
				String fixedText, String dlsLetterAddNo) throws Exception {
		
		// ***** EKK3111A010 ******
		Object[][] ekk3111a010IN = {
			{ EKK3111A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3111A010 },
			{ EKK3111A010CBSMsg.FUNC_CODE, "1" }, // "1"固定
			{ EKK3111A010CBSMsg.KEY_DSL_LETTER_ADD_NO, dlsLetterAddNo},
		};
	
		// サービスインターフェイスの実行
		CAANMsg[] ekk3111a010INcbsMsg1list = callSC(handle, scCall, param, fixedText, ekk3111a010IN).getCAANMsgList(EKK3111A010CBSMsg.EKK3111A010CBSMSG1LIST);
	
		return ekk3111a010INcbsMsg1list;
	}

	/**
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param sysid
	 * @return CAANMsg[]
	 * @throws Exception
	 */
	private CAANMsg[] execEKK0081B040(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param,
			String fixedText, String sysid) throws Exception {

		// ***** EKK0081B040 ******
		Object[][] ekk0081b040IN = {
			{ EKK0081B040CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081B040 },
			{ EKK0081B040CBSMsg.FUNC_CODE, "1" }, // "1"固定
			{ EKK0081B040CBSMsg.MAX_SEARCH_NUM, "100" },
			{ EKK0081B040CBSMsg.KEY_SYSID, sysid }
		};
		
		CAANMsg[] ekk0081b040INcbsMsg1list = callSC(handle, scCall, param, fixedText, ekk0081b040IN).getCAANMsgList(EKK0081B040CBSMsg.EKK0081B040CBSMSG1LIST);
		
		return ekk0081b040INcbsMsg1list;
	}
	
	/**
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param svcKeiNo
	 * @return CAANMsg[]
	 * @throws Exception
	 */
	private CAANMsg[] execEKK1681B001(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param,
			String fixedText, String svcKeiNo) throws Exception {
		
		// ***** EKK1681B001 ******
		Object[][] ekk1681b001IN = {
			{ EKK1681B001CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1681B001 },
			{ EKK1681B001CBSMsg.FUNC_CODE, "1" }, // "1"固定
			{ EKK1681B001CBSMsg.KEY_IDO_RSV_DTL_CD, "007" },
			{ EKK1681B001CBSMsg.KEY_IDO_RSV_STAT_CD, "00,03" },
			{ EKK1681B001CBSMsg.KEY_SVC_KEI_NO, svcKeiNo },
			{ EKK1681B001CBSMsg.KEY_SORT_ITEM_NO, "4" },
			{ EKK1681B001CBSMsg.KEY_SORT_KBN, "1" }
		};
	
		// サービスインターフェイスの実行
		CAANMsg[] ekk1681b001INcbsMsg1list = callSC(handle, scCall, param, fixedText, ekk1681b001IN).getCAANMsgList(EKK1681B001CBSMsg.EKK1681B001CBSMSG1LIST);
		
		
		return ekk1681b001INcbsMsg1list;
	}
	
	// ANK-4468-00-00 ADD START
	/**
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param sysid
	 * @param opeDate
	 * @return CAANMsg[]
	 * @throws Exception
	 */
	private CAANMsg[] execEKK0081A010(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param,
			String fixedText, String svcKeiNo , String rsvAplyYmd ) throws Exception {
		
		
		// ***** EKK0081A010 ******
		Object[][] ekk0081a010IN = {
			{ EKK0081A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081A010 },
			{ EKK0081A010CBSMsg.FUNC_CODE, "2" }, 
			{ EKK0081A010CBSMsg.KEY_SVC_KEI_NO, svcKeiNo },
			{ EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, rsvAplyYmd }
		};
	
		// サービスインターフェイスの実行
		CAANMsg[] ekk0081a010cbsMsg1list = callSC(handle, scCall, param, fixedText, ekk0081a010IN).getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
		
	
		return ekk0081a010cbsMsg1list;
	}
	// ANK-4468-00-00 ADD END
	// #86617 ADD START
	/**
	 * 業務パラメータ管理一意照会を実行します。 <br>
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param key_wotk_param_id
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg execEZM0321A010(SessionHandle handle, 
										ServiceComponentRequestInvoker scCall, 
										IRequestParameterReadWrite param, 
										String fixedText,
										String key_wotk_param_id) throws Throwable
	{
		CAANMsg ezm0321a010OUT = null;
		// ***** EZM0321A0101（パラメータ業務管理一意照会）*****
		Object[][] ezm0321a010IN = {
				{EZM0321A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EZM0321A010},
				{EZM0321A010CBSMsg.FUNC_CODE, "1"},
				{EZM0321A010CBSMsg.KEY_WORK_PARAM_ID, key_wotk_param_id},
		};
		// S-I/Fの実行
		CAANMsg[] ezm0321a010OUTList = callSC(handle, scCall, param, fixedText, ezm0321a010IN).getCAANMsgList(EZM0321A010CBSMsg.EZM0321A010CBSMSG1LIST);
		if(ezm0321a010OUTList != null && ezm0321a010OUTList.length > 0)
		{
			ezm0321a010OUT = ezm0321a010OUTList[0];
		}
		return ezm0321a010OUT;
	}
	// #86617 ADD END
}
