/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：
*	モジュール名	：JKUKjPrgJokyoShokaiCC
*	ソースファイル名：JKUKjPrgJokyoShokaiCC.java
*	作成者			：FJ)西川
*	日付			：2023年01月24日
*＜機能概要＞
*	工事進捗状況照会を取得する。
*	外部I/F：「KUIFE081_工事進捗状況照会」
*＜修正履歴＞
*	バージョン		修正日		修正者		修正内容
*   v64.00.00		2023/1/24	FJ)西川		ANK-4316-00-00_ｅｏアプリ対応
*   v66.00.00		2023/5/1	FJ)西川		ANK-4316-06-00_【eoアプリ対応】コース変更中の工事案件番号の除外条件の緩和
*   v70.00.00		2024/4/23	GDC)v.auditor	ANK-4578-00-00_API：工事進捗状況照会のレスポンス項目追加
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
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.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.ejb.cbs.cbsmsg.ECK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0251A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0081B110CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0081B110CBSMsg1List;

public class JKUKjPrgJokyoShokaiCC extends AbstractCommonComponent
{

	/** リクエストキー：SYSID：sysid */
	private static final String REQ_KEY_SYSID = "sysid";
	/** リクエストキー：変換後SYSID：_sysid:「※headerのSYSIDが設定される」*/
	private static final String REQ_KEY_CHANGE_SYSID = "_sysid";
	/** リクエストキー：回線内訳番号：access_item_number */
	private static final String REQ_KEY_ACCESS_ITEM_NUMBER = "access_item_number";
	/** リクエストキー：お客さまID：svc_kei_no */
	private static final String REQ_KEY_SVC_KEI_NO = "svc_kei_no";
	/** リクエストキー：取得範囲：acquisition_range:「"0":最新工事のみ　"1":最新以外も含む※省略された場合は"0"とみなす」 */
	private static final String REQ_KEY_ACQUISITION_RANGE = "acquisition_range";

	/** サービスIF ECK0011A010_お客様一意照会 */
	private static final String SVC_IF_ID_ECK0011A010 = "ECK0011A010";

	/** サービスIF EKK0251A010_サービス契約回線内訳一意照会 */
	private static final String SVC_IF_ID_EKK0251A010 = "EKK0251A010";

	/** サービスIF EKK0081A010_サービス契約一意照会 */
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";

	/** サービスIF EKU0081B110_工事進捗状況照会 */
	private static final String TEMPLATE_ID_EKU0081B110 = "EKU0081B110";

	/** エラーコード:2001:対象の工事が見つかりません　各スキーマのデータ取得ができない場合エラー */
	private static final String RETURN_CD_2001 = "2001";

	/** エラーコード:3001:システムエラー */
	private static final String RETURN_CD_3001 = "3001";

	/** CCパラメータ：ボディ情報 */
	public static final String BODY_INFO = "BODY_INFO";
	/** CCパラメータ：エラー情報 */
	public static final String ERROR_INFO = "ERROR_INFO";
	/** エラーコード **/
	private static final String ERROR_CODE = "errorCode";
	/** エラーメッセージ **/
	private static final String ERROR_MESSAGE = "errorMessage";

	private static final String SVC_LIST_OUTPUT = "svc_list";

	/** 受付フラグ **/
	private static final String KAISEN_SBT = "kaisen_sbt";
	/** 受付フラグ **/
	private static final String UK_FLG = "uk_flg";
	/** 工事工程進捗年月日 **/
	private static final String KOJI_STEP_PRG_YMD = "koji_step_prg_ymd";
	/** 工程宅内調査承諾書受領年月日 **/
	private static final String STEP_TAKCHO_SDAKS_RCP_YMD = "step_takcho_sdaks_rcp_ymd";
	/** 宅内調査年月日 **/
	private static final String TAKCHO_YMD = "takcho_ymd";
	/** 宅内調査時分 **/
	private static final String TAKCHO_HM = "takcho_hm";
	/** 工事案件完了予定年月日 **/
	private static final String KOJIAK_FIN_RSV_YMD = "kojiak_fin_rsv_ymd";
	/** 工期フローコード **/
	private static final String KOKI_FLOW_CD = "koki_flow_cd";
	/** 宅内工事予定年月日 **/
	private static final String TAKNIKJ_RSV_YMD = "taknikj_rsv_ymd";
	/** 宅内工事予定時分 **/
	private static final String TAKNIKJ_RSV_HM = "taknikj_rsv_hm";
	/** 工程受付完了コード **/
	private static final String STEP_UK_FIN_CD = "step_uk_fin_cd";
	/** 工程光ルート調査設計コード **/
	private static final String STEP_HROUTE_CHOSA_DSGN_CD = "step_hroute_chosa_dsgn_cd";
	/** 工程お客様宅内調査日程調整コード **/
	private static final String STEP_CUST_TAKCHO_NTADJ_CD = "step_cust_takcho_ntadj_cd";
	/** 工程お客様宅内調査コード **/
	private static final String STEP_CUST_TAKCHO_CD = "step_cust_takcho_cd";
	/** 工程各種許可申請コード **/
	private static final String STEP_VARI_KYOKA_SHINSEI_CD = "step_vari_kyoka_shinsei_cd";
	/** 工程宅内調査承諾書受領コード **/
	private static final String STEP_TAKCHO_SDAKS_RCP_CD = "step_takcho_sdaks_rcp_cd";
	/** 工程光ケーブル線路工事コード **/
	private static final String STEP_HCABLE_LINE_KOJI_CD = "step_hcable_line_koji_cd";
	/** 工程お客様宅内工事コード **/
	private static final String STEP_CUST_TAKNI_KOJI_CD = "step_cust_takni_koji_cd";
	/** 工程ご利用開始コード **/
	private static final String STEP_USE_STA_CD = "step_use_sta_cd";
	/** 設計ＮＧフラグ **/
	private static final String DSGN_NG_FLG = "dsgn_ng_flg";
	/** 調査ＮＧフラグ **/
	private static final String CHOSA_NG_FLG = "chosa_ng_flg";
	/** キャンセルフラグ **/
	private static final String CANCEL_FLG = "cancel_flg";
	/** イレギュラーフラグ **/
	private static final String IRREGULAR_FLG = "irregular_flg";
	/** 宅内調査実施フラグ **/
	private static final String TAKCHO_JSSI_FLG = "takcho_jssi_flg";
	/** 工期変更理由メモ **/
	private static final String KOKI_CHGRE_MEMO = "koki_chgre_memo";
	/** 工事案件番号 **/
	private static final String KOJIAK_NO = "kojiak_no";

	/** 宅内調査予約形態 **/
	private static final String TAKCHO_RSV_WAY = "takcho_rsv_way";
	
	// ANK-4578-00-00 ADD START
	/** 工事案件種別コード **/
	private static final String KOJIAK_SBT_CD = "kojiak_sbt_cd";
	// ANK-4578-00-00 ADD END

	/** 状態 **/
	private static final String STATUS = "status";
	/** 次の状態 **/
	private static final String NEXT_STATUS = "next_status";
	/** 進捗割合 **/
	private static final String PROGRESS_RATE = "progress_rate";

	/** 処理対象外工事番号の判断値_JP案件 **/
	private static final String KOJIAK_NO_JP = "JP";
	/** 処理対象外工事番号の判断値_JP案件(住変) **/
	private static final String KOJIAK_NO_JHUN = "JHUN";
	/** 処理対象外工事番号の判断値_移設に伴うダミー工事案件 **/
	private static final String KOJIAK_NO_CTJH = "CTJH";

	/** 処理対象外工事の工事案件番号の工事案件種別（001:新設、003:住変(新設)） **/
	private static final List<String> JP_KOJIAK_NO_CHECK_TARGET = Arrays.asList(JKKStrConst.CD00577_NEWESTA, JKKStrConst.CD00577_ADCHG_NEWESTA);

	/** 空白 */
	private static final String EMPTY = "";

	/**
	 * 工事進捗状況照会の取得を行う。
	 *
	 * @param handle
	 *            セッションハンドル
	 * @param param
	 *            リクエストパラメータ
	 * @param fixedText
	 *            サービスメッセージ
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @throws Exception
	 */
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);

		// 返却用ボディ
		Map<String, Object> resultMap = new HashMap<String, Object>();

		// リクエスト項目と値を設定
		// リクエストキー：SYSID：sysid
		String reqSysid = (String)ccMsg.get(REQ_KEY_SYSID);
		if (ccMsg.containsKey(REQ_KEY_SYSID))
		{
			resultMap.put(REQ_KEY_SYSID, toEmpty(reqSysid));
		}
		// リクエストキー：回線内訳番号：access_item_number
		String reqAccessItemNumber = (String)ccMsg.get(REQ_KEY_ACCESS_ITEM_NUMBER);
		if (ccMsg.containsKey(REQ_KEY_ACCESS_ITEM_NUMBER))
		{
			resultMap.put(REQ_KEY_ACCESS_ITEM_NUMBER, toEmpty(reqAccessItemNumber));
		}
		// リクエストキー：お客さまID：svc_kei_no
		String reqSvcKeiNo = (String)ccMsg.get(REQ_KEY_SVC_KEI_NO);
		if (ccMsg.containsKey(REQ_KEY_SVC_KEI_NO))
		{
			resultMap.put(REQ_KEY_SVC_KEI_NO, toEmpty(reqSvcKeiNo));
		}
		// リクエストキー：取得範囲：acquisition_range:「"0":最新工事のみ　"1":最新以外も含む※省略された場合は"0"とみなす」
		String reqAcquisitionRange = (String)ccMsg.get(REQ_KEY_ACQUISITION_RANGE);
		if (ccMsg.containsKey(REQ_KEY_ACQUISITION_RANGE))
		{
			resultMap.put(REQ_KEY_ACQUISITION_RANGE, toEmpty(reqAcquisitionRange));
		}

		try
		{

			// ===================================================================================
			// (1)業務チェック
			// ===================================================================================

			// 単項目チェック
			if (!checkUnitParam(ccMsg))
			{
				ccMsg.put(BODY_INFO, resultMap);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
				return param;
			}

			// ===================================================================================
			// (2)パラメータチェック
			// ===================================================================================

			// 単関連チェック
			if (!checkUnitParamLink(ccMsg))
			{
				ccMsg.put(BODY_INFO, resultMap);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, EMPTY);
				return param;
			}

			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

			// リクエストキー：変換後SYSID：_sysid:「※headerのSYSIDを優先して使用」
			String sysid = (String)ccMsg.get(REQ_KEY_CHANGE_SYSID);

			if (isEmpty(sysid))
			{
				// リクエストキー：SYSID：sysid
				sysid = (String)ccMsg.get(REQ_KEY_SYSID);
			}

			if (!isEmpty(sysid))
			{
				// CK0011_お客様（CK_T_CUST）スキーマの存在チェック

				// ECK0011A010_お客様一意照会サービスIF実行
				CAANMsg[] eck0011a010INcbsMsg1list = execECK0011A010(handle, scCall, param, fixedText, sysid);

				// お客様スキーマの存在チェックを行い、チェック結果を返す。
				if (!isExistRecord(eck0011a010INcbsMsg1list, ccMsg))
				{
					// 「SYSID」または「変換後SYSID」がお客様スキーマに存在しない場合エラー

					ccMsg.put(BODY_INFO, resultMap);
					param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
					param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, EMPTY);
					return param;
				}
			}

			// リクエストキー：回線内訳番号：access_item_number
			String svcKeiKaisenUcwkNo = (String)ccMsg.get(REQ_KEY_ACCESS_ITEM_NUMBER);
			if (!isEmpty(svcKeiKaisenUcwkNo))
			{
				// KK0251_サービス契約回線内訳（KK_T_SVKEI_KAISEN_UW）スキーマの存在チェック

				// サービス契約回線内訳一意照会サービスIF実行
				CAANMsg[] ekk0251a010INcbsMsg1list = execEKK0251A010(handle, scCall, param, fixedText, svcKeiKaisenUcwkNo);

				// サービス契約回線内訳スキーマの存在チェックを行い、チェック結果を返す。
				if (!isExistRecord(ekk0251a010INcbsMsg1list, ccMsg))
				{
					// 「サービス契約回線内訳番号」がサービス契約回線内訳スキーマに存在しない場合エラー

					ccMsg.put(BODY_INFO, resultMap);
					param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
					param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, EMPTY);
					return param;
				}
			}

			// リクエストキー：お客さまID：svc_kei_no
			String svcKeiNo = (String)ccMsg.get(REQ_KEY_SVC_KEI_NO);
			if (!isEmpty(svcKeiNo))
			{
				// KK0081_サービス契約（KK_T_SVC_KEI）

				// サービス契約一意照会サービスIF実行
				CAANMsg[] ekk0081a010INcbsMsg1list = execEKK0081A010(handle, scCall, param, fixedText, svcKeiNo);

				// サービス契約スキーマの存在チェックを行い、チェック結果を返す。
				if (!existenceCheck(ekk0081a010INcbsMsg1list, ccMsg))
				{
					// 「サービス契約番号」がサービス契約スキーマに存在しない場合エラー

					ccMsg.put(BODY_INFO, resultMap);
					param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
					param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, EMPTY);
					return param;
				}
				else
				{
					if (isEmpty(sysid) && ekk0081a010INcbsMsg1list != null && ekk0081a010INcbsMsg1list.length != 0)
					{
						// sysid = ekk0081a010INcbsMsg1list[0].getString(EKK0081A010CBSMsg1List.SYSID);
					}
				}
			}

			// ===================================================================================
			// (3)工事進捗状況取得
			// ===================================================================================

			//・以下の条件で工事進捗状況を取得する。	
			//  サービス契約_工事案件.SYSID ＝ リクエスト.SYSID、または変換後SYSID
			//  サービス契約_工事案件.サービス契約回線内訳番号 ＝ リクエスト.回線内訳番号
			//  サービス契約_工事案件.サービス契約番号 ＝ リクエスト.サービス契約番号
			//  工事案件.工事案件番号 ＝ サービス契約_工事案件.工事案件番号
			//  工事案件.工事案件種別コード ＝ "001"(新設) または "003"(住所変更(新設)) または"009"(プラン変更(収容替))
			//  工事案件.工事案件ステータス ≠ "900"(中止)
			//  工事工程進捗.工事案件番号 ＝ 工事案件.工事案件番号 (*)
			//  工事工程進捗.工事工程進捗年月日 ＝ 条件(*)に該当する中で、最大の工事工程進捗年月日(最新のデータ)

			// 工事進捗状況照会サービスIF実行
			CAANMsg[] eku0081b110INcbsMsg1list = execEKU0081B110(handle, scCall, param, fixedText, sysid, svcKeiKaisenUcwkNo, svcKeiNo);
			if (!isExistRecord(eku0081b110INcbsMsg1list, ccMsg))
			{
				// 工事進捗状況照会がサービス契約_工事案件、工事案件スキーマに存在しない場合エラー

				ccMsg.put(BODY_INFO, resultMap);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, EMPTY);
				return param;
			}

			boolean isNoKojiakJpAk = false;

			// 同時工事案件番号を設定。（IPの工事案件番号：TVの工事案件番号を設定）
			HashMap<String, String> dojiKojiakNoIpTvMap = new HashMap<String, String>();

			// IPの工事案件番号を格納
			HashSet<String> kojiakIpCheck = new HashSet<String>();
			// TVの工事案件番号を格納
			HashSet<String> kojiakTvCheck = new HashSet<String>();

			for (CAANMsg eku0081b110INcbsMsg : eku0081b110INcbsMsg1list)
			{
				String kojiakNo = eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.KOJIAK_NO);
				String kojiakSbtCd = eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.KOJIAK_SBT_CD);
				// JP案件の工事は取得対象外
				if (!(JP_KOJIAK_NO_CHECK_TARGET.contains(kojiakSbtCd) && (
						KOJIAK_NO_JP.equals(kojiakNo.substring(2, 4)) 
						|| KOJIAK_NO_JHUN.equals(kojiakNo.substring(2, 6)) 
						|| KOJIAK_NO_CTJH.equals(kojiakNo.substring(2, 6))
						)))
				{
					// 工事案件.工事案件種別コード ＝ "001"(新設) または "003"(住所変更(新設)) の何れかでかつ「JP案件工事(工事案件番号の3〜4桁目が"JP"　または　3〜6桁目が"JHUN")または移設に伴うダミー工事(工事案件番号の3〜6桁目が"CTJH")」は抽出対象外とする。
					isNoKojiakJpAk = true;

					String svcCd = eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.SVC_CD);
					String dojiDaihyoKojiakNo = eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.DOJI_DAIHYO_KOJIAK_NO);
					if ("01".equals(svcCd) || "02".equals(svcCd))
					{
						if (!kojiakIpCheck.contains(kojiakNo))
						{
							kojiakIpCheck.add(kojiakNo);
						}
					}

					if ("03".equals(svcCd) && !isEmpty(dojiDaihyoKojiakNo) && !dojiKojiakNoIpTvMap.containsKey(dojiDaihyoKojiakNo))
					{
						// 回線種別に"3"(IP+TV)を判定するために、IP+TVの同時工事となるIPの工事案件番号を取得する
						dojiKojiakNoIpTvMap.put(dojiDaihyoKojiakNo, kojiakNo);
						if (!kojiakTvCheck.contains(kojiakNo))
						{
							kojiakTvCheck.add(kojiakNo);
						}
					}
				}
			}

			if (!isNoKojiakJpAk)
			{
				// 工事案件.工事案件種別コード ＝ "001"(新設) または "003"(住所変更(新設)) の何れかでかつ「JP案件工事(工事案件番号の3〜4桁目が"JP"　または　3〜6桁目が"JHUN")または移設に伴うダミー工事(工事案件番号の3〜6桁目が"CTJH")」以外の工事のレコードが存在しない場合エラー

				// エラーリスト
				List<Map<String, String>> errList = new ArrayList<Map<String, String>>();

				Map<String, String> returnMap = new HashMap<String, String>();

				returnMap.put(ERROR_CODE, RETURN_CD_2001);
				returnMap.put(ERROR_MESSAGE, "対象の工事が見つかりません");
				errList.add(returnMap);
				if (ccMsg.containsKey(REQ_KEY_CHANGE_SYSID))
				{
					ccMsg.remove(REQ_KEY_CHANGE_SYSID);
				}
				ccMsg.put(ERROR_INFO, errList);
				ccMsg.put(BODY_INFO, resultMap);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, EMPTY);
				return param;
			}

			// リクエストキー：取得範囲：acquisition_range:「"0":最新工事のみ　"1":最新以外も含む※省略された場合は"0"とみなす」
			String acquisitionRange = (String)ccMsg.get(REQ_KEY_ACQUISITION_RANGE);

			ArrayList<HashMap<String, String>> rsltMapList = new ArrayList<HashMap<String, String>>();
			// 
			HashSet<String> uniqueKojiakNoSet = new HashSet<String>();

			for (CAANMsg eku0081b110INcbsMsg : eku0081b110INcbsMsg1list)
			{
				HashMap<String, String> rsltMap = new HashMap<String, String>();
				String kojiakNo = eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.KOJIAK_NO);
				String kojiakSbtCd = eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.KOJIAK_SBT_CD);

				if (uniqueKojiakNoSet.contains(kojiakNo))
				{
					// 処理済みの同一の工事案件番号は、スキップする。
					// ※ネットと電話では、同一の工事案件番号（IPレコード）となり、工事工程進捗情報としても同じになるため返却不要と判断。
					continue;
				}

				if (JP_KOJIAK_NO_CHECK_TARGET.contains(kojiakSbtCd)
						&& (
								KOJIAK_NO_JP.equals(kojiakNo.substring(2, 4)) 
								|| KOJIAK_NO_JHUN.equals(kojiakNo.substring(2, 6))
								|| KOJIAK_NO_CTJH.equals(kojiakNo.substring(2, 6))
								))
				{
					// 工事案件.工事案件種別コード ＝ "001"(新設) または "003"(住所変更(新設)) の何れかでかつ「JP案件工事(工事案件番号の3〜4桁目が"JP"　または　3〜6桁目が"JHUN")または移設に伴うダミー工事(工事案件番号の3〜6桁目が"CTJH")」は抽出対象外とする。
					continue;
				}

				uniqueKojiakNoSet.add(kojiakNo);

				String svcCd = eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.SVC_CD);
				if ("1".equals(acquisitionRange))
				{
					// 条件に該当する工事情報を返却する。
					// ただし、同時工事案件番号に設定されている案件番号のIPが取得できているTVがある場合、そのTVのレコードは返さず
					String dojiDaihyoKojiakNo = eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.DOJI_DAIHYO_KOJIAK_NO);
					if ("01".equals(svcCd) || "02".equals(svcCd))
					{
						if (dojiKojiakNoIpTvMap.containsKey(kojiakNo) && dojiKojiakNoIpTvMap.get(kojiakNo).equals(dojiDaihyoKojiakNo) && kojiakTvCheck.contains(dojiDaihyoKojiakNo))
						{
							// IPレコードの工事案件番号とTVレコードの同時工事案件番号が同じ、且つその逆も同じ場合、回線種別に"3"(IP+TV)を設定する。

							rsltMap.put(KAISEN_SBT, "3");
							// 返却値をマッピング
							rsltMap = responseMapping(rsltMap, eku0081b110INcbsMsg);
						}
						else
						{
							// 回線種別
							// 1:IP
							rsltMap.put(KAISEN_SBT, "1");
							// 返却値をマッピング
							rsltMap = responseMapping(rsltMap, eku0081b110INcbsMsg);
						}
					}
					else if ("03".equals(svcCd))
					{
						if (!isEmpty(dojiDaihyoKojiakNo) && dojiKojiakNoIpTvMap.get(dojiDaihyoKojiakNo).equals(kojiakNo) && kojiakIpCheck.contains(dojiDaihyoKojiakNo))
						{
							// 同時工事案件番号に設定されている案件番号のIPが取得できているTVがある場合、そのTVのレコードは返さない。
							continue;
						}

						// 回線種別に2:TVを設定する。
						rsltMap.put(KAISEN_SBT, "2");
						// 返却値をマッピング
						rsltMap = responseMapping(rsltMap, eku0081b110INcbsMsg);
					}
					rsltMapList.add(rsltMap);
				}
				else
				{
					// 取得範囲：acquisition_range:「"0":最新工事のみ※省略された場合は"0"とみなす」
					// 工事案件依頼年月日（降順）、サービスコード（昇順）でソートした1件目の（最新の工事）情報を返却する。

					if ("01".equals(svcCd) || "02".equals(svcCd))
					{
						// 回線種別
						// 1:IP
						rsltMap.put(KAISEN_SBT, "1");
					}
					else if ("03".equals(svcCd))
					{
						// 回線種別
						// 2:TV
						rsltMap.put(KAISEN_SBT, "2");
					}

					// 返却値をマッピング
					rsltMap = responseMapping(rsltMap, eku0081b110INcbsMsg);
					rsltMapList.add(rsltMap);
					break;
				}
			}

			resultMap.put(SVC_LIST_OUTPUT, rsltMapList);
			param.setData(fixedText, resultMap);

			// 正常終了
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_0000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
			// サービスインターフェース呼び出しでエラーが発生した場合
		}
		catch (SCCallException scCallEx)
		{
			// エラーリスト
			List<Map<String, String>> errList = new ArrayList<Map<String, String>>();

			Map<String, String> returnMap = new HashMap<String, String>();

			returnMap.put(ERROR_CODE, RETURN_CD_3001);
			returnMap.put(ERROR_MESSAGE, EMPTY);
			errList.add(returnMap);
			if (ccMsg.containsKey(REQ_KEY_CHANGE_SYSID))
			{
				ccMsg.remove(REQ_KEY_CHANGE_SYSID);
			}
			ccMsg.put(ERROR_INFO, errList);
			ccMsg.put(BODY_INFO, resultMap);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, EMPTY);
		}

		return param;
	}

	/**
	 * 単項目チェック
	 * <br/>
	 * 項目に応じて以下のチェックを実行する。
	 * ・必須チェック	
	 * ・属性チェック	
	 * ・桁数チェック	
	 *
	 * @param ccMsg
	 * @return チェック結果 true:エラーなし、false:エラーあり
	 * @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：sysid
		itemName = REQ_KEY_SYSID;
		itemValue = (String)ccMsg.get(itemName);

		if (!isEmpty(itemValue))
		{
			// 値が存在する場合にチェックを行う。

			if (!HalfCharCheck.isEnNumber1Check(itemValue))
			{
				// 属性チェックエラー:半角英数字1
				errList.add(getFormErrInfMap(itemName, itemValue));
			}
			else if (!LengthCheck.isLength1Check(itemValue, 10))
			{
				// 桁数チェックエラー:10-10
				errList.add(getLenErrInfMap(itemName, itemValue));
			}
		}

		// リクエストキー：変換後SYSID：_sysid:「※headerのSYSIDが設定される」
		itemName = REQ_KEY_CHANGE_SYSID;
		itemValue = (String)ccMsg.get(itemName);

		if (!isEmpty(itemValue))
		{
			// 値が存在する場合にチェックを行う。

			if (!HalfCharCheck.isEnNumber1Check(itemValue))
			{
				// 属性チェックエラー:半角英数字1
				errList.add(getFormErrInfMap(itemName, itemValue));
			}
			else if (!LengthCheck.isLength1Check(itemValue, 10))
			{
				// 桁数チェックエラー:10-10
				errList.add(getLenErrInfMap(itemName, itemValue));
			}
		}

		// リクエストキー：回線内訳番号：access_item_number
		itemName = REQ_KEY_ACCESS_ITEM_NUMBER;
		itemValue = (String)ccMsg.get(itemName);

		if (!isEmpty(itemValue))
		{
			// 値が存在する場合にチェックを行う。

			if (!HalfCharCheck.isEnNumber1Check(itemValue))
			{
				// 属性チェックエラー:半角英数字1
				errList.add(getFormErrInfMap(itemName, itemValue));
			}
			else if (!LengthCheck.isLength1Check(itemValue, 12))
			{
				// 桁数チェックエラー:12-12
				errList.add(getLenErrInfMap(itemName, itemValue));
			}
		}

		// リクエストキー：お客さまID：svc_kei_no
		itemName = REQ_KEY_SVC_KEI_NO;
		itemValue = (String)ccMsg.get(itemName);

		if (!isEmpty(itemValue))
		{
			// 値が存在する場合にチェックを行う。

			if (!HalfCharCheck.isEnNumber1Check(itemValue))
			{
				// 属性チェックエラー:半角英数字1
				errList.add(getFormErrInfMap(itemName, itemValue));
			}
			else if (!LengthCheck.isLength1Check(itemValue, 10))
			{
				// 桁数チェックエラー:10-10
				errList.add(getLenErrInfMap(itemName, itemValue));
			}
		}

		// リクエストキー：取得範囲：acquisition_range:「"0":最新工事のみ　"1":最新以外も含む※省略された場合は"0"とみなす」
		itemName = REQ_KEY_ACQUISITION_RANGE;
		itemValue = (String)ccMsg.get(itemName);

		if (!isEmpty(itemValue))
		{
			// 値が存在する場合にチェックを行う。

			if (!HalfCharCheck.isNumber1Check(itemValue))
			{
				// 属性チェックエラー:半角数字1
				errList.add(getFormErrInfMap(itemName, itemValue));
			}
			else if (!("0".equals(itemValue) || "1".equals(itemValue)))
			{
				// 妥当性チェックエラー:"0"または"1"のみを許容（属性チェックエラーとする）
				errList.add(getFormErrInfMap(itemName, itemValue));
			}
			else if (!LengthCheck.isLength1Check(itemValue, 1))
			{
				// 桁数チェックエラー:1-1
				errList.add(getLenErrInfMap(itemName, itemValue));
			}
		}

		// エラーが存在する場合
		if (errList.size() > 0)
		{
			if (ccMsg.containsKey(REQ_KEY_CHANGE_SYSID))
			{
				ccMsg.remove(REQ_KEY_CHANGE_SYSID);
			}
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}

		return true;
	}

	/**
	 * 単関連チェック
	 * <br/>
	 * リクエスト項目の整合性(組み合わせ)チェックを行う
	 *
	 * @param ccMsg
	 * @return チェック結果 true:エラーなし、false:エラーあり
	 * @throws Exception
	 */
	private boolean checkUnitParamLink(Map<String, Object> ccMsg) throws Exception
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();

		// リクエストキー：取得範囲：acquisition_range:「"0":最新工事のみ　"1":最新以外も含む※省略された場合は"0"とみなす」
		String acquisitionRange = (String)ccMsg.get(REQ_KEY_ACQUISITION_RANGE);

		// リクエストキー：変換後SYSID：_sysid:「※headerのSYSIDを優先して使用」
		String sysid = (String)ccMsg.get(REQ_KEY_CHANGE_SYSID);

		if (isEmpty(sysid))
		{
			// リクエストキー：SYSID：sysid
			sysid = (String)ccMsg.get(REQ_KEY_SYSID);
		}

		if ("1".equals(acquisitionRange))
		{
			// 取得範囲が「"1"(最新以外も含む)」

			if (isEmpty(sysid))
			{
				// 取得範囲が「"1"(最新以外も含む)」かつSYSIDまたは変換後SYSIDが未設定の場合、エラーとする。

				Map<String, String> returnMap = new HashMap<String, String>();

				returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1005);
				StringBuilder sb = new StringBuilder();
				sb.append(String.format("%s:%s", REQ_KEY_ACQUISITION_RANGE, toEmpty(acquisitionRange)));
				sb.append(",");
				sb.append(String.format("%s:%s", REQ_KEY_SYSID, toEmpty(sysid)));
				returnMap.put(ERROR_MESSAGE, sb.toString());
				errList.add(returnMap);
			}
		}
		else
		{
			// 取得範囲が「"1"(最新以外も含む)」以外（取得範囲≠"1"）

			// リクエストキー：回線内訳番号：access_item_number
			String accessItemNumber = (String)ccMsg.get(REQ_KEY_ACCESS_ITEM_NUMBER);
			// リクエストキー：お客さまID：svc_kei_no
			String svcKeiNo = (String)ccMsg.get(REQ_KEY_SVC_KEI_NO);

			if (isEmpty(sysid) && isEmpty(accessItemNumber) && isEmpty(svcKeiNo))
			{
				//  @SYSIDまたは変換後SYSID、回線内訳番号、お客さまIDがすべて未設定

				Map<String, String> returnMap = new HashMap<String, String>();
				returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1005);
				StringBuilder sb = new StringBuilder();
				sb.append(String.format("%s:%s", REQ_KEY_ACQUISITION_RANGE, toEmpty(acquisitionRange)));
				sb.append(",");
				sb.append(String.format("%s:%s", REQ_KEY_SYSID, toEmpty(sysid)));
				sb.append(",");
				sb.append(String.format("%s:%s", REQ_KEY_ACCESS_ITEM_NUMBER, toEmpty(accessItemNumber)));
				sb.append(",");
				sb.append(String.format("%s:%s", REQ_KEY_SVC_KEI_NO, toEmpty(svcKeiNo)));
				returnMap.put(ERROR_MESSAGE, sb.toString());
				errList.add(returnMap);
			}
			else if ((!isEmpty(sysid) && isEmpty(accessItemNumber)) || (isEmpty(sysid) && !isEmpty(accessItemNumber)))
			{
				//  ASYSIDまたは変換後SYSIDが設定済、回線内訳番号が未設定
				//  BSYSIDまたは変換後SYSIDが未設定、回線内訳番号が設定済

				Map<String, String> returnMap = new HashMap<String, String>();
				returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1005);
				StringBuilder sb = new StringBuilder();
				sb.append(String.format("%s:%s", REQ_KEY_ACQUISITION_RANGE, toEmpty(acquisitionRange)));
				sb.append(",");
				sb.append(String.format("%s:%s", REQ_KEY_SYSID, toEmpty(sysid)));
				sb.append(",");
				sb.append(String.format("%s:%s", REQ_KEY_ACCESS_ITEM_NUMBER, toEmpty(accessItemNumber)));
				returnMap.put(ERROR_MESSAGE, sb.toString());
				errList.add(returnMap);
			}
		}

		// エラーが存在する場合
		if (errList.size() > 0)
		{
			if (ccMsg.containsKey(REQ_KEY_CHANGE_SYSID))
			{
				ccMsg.remove(REQ_KEY_CHANGE_SYSID);
			}
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}

		return true;
	}

	/**
	 *
	 * 存在チェック
	 *
	 * @param cbsMsglist
	 * @param ccMsg
	 * @return boolean 対象スキーマに対して該当レコードの存在チェック結果を返す。true:存在する、false:存在しない
	 * @throws Exception
	 */
	private boolean isExistRecord(CAANMsg[] cbsMsglist, Map<String, Object> ccMsg) throws Exception
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();

		if (cbsMsglist == null || cbsMsglist.length == 0)
		{
			//対象スキーマに対して該当レコードが存在するかのチェック結果を返す

			Map<String, String> returnMap = new HashMap<String, String>();

			returnMap.put(ERROR_CODE, RETURN_CD_2001);
			returnMap.put(ERROR_MESSAGE, "対象の工事が見つかりません");
			errList.add(returnMap);
		}

		/* エラーが存在する場合 */
		if (errList.size() > 0)
		{
			if (ccMsg.containsKey(REQ_KEY_CHANGE_SYSID))
			{
				ccMsg.remove(REQ_KEY_CHANGE_SYSID);
			}
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}
		return true;
	}

	/**
	 *
	 * 存在チェック１。サービス契約の存在チェックを行い、チェック結果を返す。
	 *
	 * @param ekk0081a010INcbsMsg1list
	 * @param ccMsg
	 * @return boolean
	 * @throws Exception
	 */
	private boolean existenceCheck(CAANMsg[] ekk0081a010INcbsMsg1list, Map<String, Object> ccMsg) throws Exception
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();

		if (ekk0081a010INcbsMsg1list == null || ekk0081a010INcbsMsg1list.length == 0)
		{
			Map<String, String> returnMap = new HashMap<String, String>();

			returnMap.put(ERROR_CODE, RETURN_CD_2001);
			returnMap.put(ERROR_MESSAGE, "対象の工事が見つかりません");
			errList.add(returnMap);
		}
		else
		{
			String svcCD = ekk0081a010INcbsMsg1list[0].getString(EKK0081A010CBSMsg1List.SVC_CD);

			if (!"01".equals(svcCD) && !"02".equals(svcCD) && !"03".equals(svcCD))
			{

				Map<String, String> returnMap = new HashMap<String, String>();

				returnMap.put(ERROR_CODE, RETURN_CD_2001);
				returnMap.put(ERROR_MESSAGE, "対象の工事が見つかりません");
				errList.add(returnMap);
			}
		}

		/* エラーが存在する場合 */
		if (errList.size() > 0)
		{
			if (ccMsg.containsKey(REQ_KEY_CHANGE_SYSID))
			{
				ccMsg.remove(REQ_KEY_CHANGE_SYSID);
			}
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}
		return true;
	}

	/**
	 * 単項目チェックの属性エラーマップ作成メソッドです。
	 *
	 * @param itemName
	 *            項目名
	 * @param itemValue
	 * 				項目値
	 * @return Map<String, String>
	 * @throws Exception
	 */
	private Map<String, String> getFormErrInfMap(String itemName, String itemValue) throws Exception
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1002);
		returnMap.put(ERROR_MESSAGE, String.format("%s:%s", itemName, toEmpty(itemValue)));

		return returnMap;
	}

	/**
	 * 単項目チェックの桁数エラーマップ作成メソッドです。
	 *
	 * @param itemName
	 *            項目名
	 * @param itemValue
	 * 				項目値
	 * @return Map<String, String>
	 * @throws Exception
	 */
	private Map<String, String> getLenErrInfMap(String itemName, String itemValue) throws Exception
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1003);
		returnMap.put(ERROR_MESSAGE, String.format("%s:%s", itemName, toEmpty(itemValue)));

		return returnMap;
	}

	/**
	 * サービスIF呼出し時の共通項目の上りマッピング
	 * @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++)
		{
			/* CAANMsg[]の場合 */
			if (mappingData[i][1] instanceof CAANMsg[])
			{
				template.set((String)mappingData[i][0], (CAANMsg[])mappingData[i][1]);
			}
			/* CAANMsg[]の以外 */
			else
			{
				/* nullの場合*/
				if (EMPTY.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;
	}

	/**
	 * サービスIFエラー時の設定処理
	 *
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param dataMapKey
	 * @param mappingData
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	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);

		/* 0以外のとき */
		if (returnCode != 0)
		{
			templateStatus = 9000;
		}

		/* nullのとき */
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		/* nullの場合 */
		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++)
		{
			/* nullチェック　*/
			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
	 */
	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;
	}

	/**
	 * お客様一意照会サービスIFを実行する。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param sysid SYSID
	 * @return お客様一意照会サービスIFの照会結果
	 * @throws Exception
	 */
	private CAANMsg[] execECK0011A010(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param, String fixedText, String sysid) throws Exception
	{

		// お客様一意照会サービスIFの上りマッピング
		Object[][] eck0011a010IN =
				{ { ECK0011A010CBSMsg.TEMPLATEID, SVC_IF_ID_ECK0011A010 }, { ECK0011A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 }, { ECK0011A010CBSMsg.KEY_SYSID, sysid },
						{ ECK0011A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null) } };

		// サービスIF実行
		CAANMsg[] eck0011a010INcbsMsg1list = callSC(handle, scCall, param, fixedText, eck0011a010IN).getCAANMsgList(ECK0011A010CBSMsg.ECK0011A010CBSMSG1LIST);

		return eck0011a010INcbsMsg1list;
	}

	/**
	 * サービス契約回線内訳一意照会サービスIFを実行する。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param svcKeiKaisenUcwkNo サービス契約回線内訳番号
	 * @return サービス契約回線内訳一意照会サービスIFの照会結果
	 * @throws Exception
	 */
	private CAANMsg[] execEKK0251A010(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param, String fixedText, String svcKeiKaisenUcwkNo) throws Exception
	{
		// サービス契約回線内訳一意照会サービスIFの上りマッピング
		Object[][] ekk0251a010IN =
				{ { EKK0251A010CBSMsg.TEMPLATEID, SVC_IF_ID_EKK0251A010 }, { EKK0251A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 },
						{ EKK0251A010CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO, svcKeiKaisenUcwkNo } };
		// サービスIF実行
		CAANMsg[] ekk0251a010INcbsMsg1list = callSC(handle, scCall, param, fixedText, ekk0251a010IN).getCAANMsgList(EKK0251A010CBSMsg.EKK0251A010CBSMSG1LIST);

		return ekk0251a010INcbsMsg1list;
	}

	/**
	 * サービス契約一意照会サービスIFを実行する。
	 *
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param svcKeiNo サービス契約番号
	 * @return CAANMsg[]
	 * @throws Exception
	 */
	private CAANMsg[] execEKK0081A010(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param, String fixedText, String svcKeiNo) throws Exception
	{

		// サービス契約一意照会サービスIFの上りマッピング
		Object[][] ekk0081a010IN =
				{ { EKK0081A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081A010 }, { EKK0081A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 }, { EKK0081A010CBSMsg.KEY_SVC_KEI_NO, svcKeiNo },
						{ EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null) } };

		// サービスIF実行
		CAANMsg[] ekk0081a010INcbsMsg1list = callSC(handle, scCall, param, fixedText, ekk0081a010IN).getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);

		return ekk0081a010INcbsMsg1list;
	}

	/**
	 * 工事進捗状況照会サービスIFを実行する。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param sysid SYSID
	 * @param svcKeiKaisenUcwkNo サービス契約回線内訳番号
	 * @param svcKeiNo サービス契約番号
	 * @return 工事進捗状況照会サービスIFの照会結果
	 * @throws Exception
	 */
	private CAANMsg[] execEKU0081B110(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param, String fixedText, String sysid, String svcKeiKaisenUcwkNo,
			String svcKeiNo) throws Exception
	{

		// 工事進捗状況照会の上りマッピング
		Object[][] eku0081b110IN =
				{ { EKU0081B110CBSMsg.TEMPLATEID, TEMPLATE_ID_EKU0081B110 }, { EKU0081B110CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 }, { EKU0081B110CBSMsg.KEY_SYSID, sysid },
						{ EKU0081B110CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO, svcKeiKaisenUcwkNo }, { EKU0081B110CBSMsg.KEY_SVC_KEI_NO, svcKeiNo }, };

		// サービスIF実行
		CAANMsg[] eku0081b110INcbsMsg1list = callSC(handle, scCall, param, fixedText, eku0081b110IN).getCAANMsgList(EKU0081B110CBSMsg.EKU0081B110CBSMSG1LIST);

		return eku0081b110INcbsMsg1list;
	}

	/**
	 * 返却項目と返却値を設定。
	 * 
	 * @param rsltMap IFの返却情報
	 * @param eku0081b110INcbsMsg 工事進捗状況照会サービスIFの照会結果
	 * @return IFの返却情報
	 * @throws Exception
	 */
	private HashMap<String, String> responseMapping(HashMap<String, String> rsltMap, CAANMsg eku0081b110INcbsMsg) throws Exception
	{
		if (isEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.KOJI_STEP_PRG_YMD)))
		{
			// 工事工程進捗年月日が未設定の場合、工事工程進捗なしと判断。

			// 受付フラグ
			rsltMap.put(UK_FLG, "1");
			// キャンセルフラグ
			rsltMap.put(CANCEL_FLG, EMPTY);
			// 工事工程進捗年月日
			rsltMap.put(KOJI_STEP_PRG_YMD, EMPTY);
			// 工期フローコード
			rsltMap.put(KOKI_FLOW_CD, EMPTY);
			// 工程宅内調査承諾書受領年月日
			rsltMap.put(STEP_TAKCHO_SDAKS_RCP_YMD, EMPTY);
			// 宅内調査年月日
			rsltMap.put(TAKCHO_YMD, EMPTY);
			// 宅内調査時分
			rsltMap.put(TAKCHO_HM, EMPTY);
			// 宅内工事予定年月日
			rsltMap.put(TAKNIKJ_RSV_YMD, EMPTY);
			// 宅内工事予定時分
			rsltMap.put(TAKNIKJ_RSV_HM, EMPTY);
			// 工事案件完了予定年月日
			rsltMap.put(KOJIAK_FIN_RSV_YMD, EMPTY);
			// 工事受付完了コード
			rsltMap.put(STEP_UK_FIN_CD, EMPTY);
			// 工程光ルート調査設計コード
			rsltMap.put(STEP_HROUTE_CHOSA_DSGN_CD, EMPTY);
			// 工程お客様宅内調査日程調整コード
			rsltMap.put(STEP_CUST_TAKCHO_NTADJ_CD, EMPTY);
			// 工程お客様宅内調査コード
			rsltMap.put(STEP_CUST_TAKCHO_CD, EMPTY);
			// 工程各種許可申請コード
			rsltMap.put(STEP_VARI_KYOKA_SHINSEI_CD, EMPTY);
			// 工程宅内調査承諾書受領コード
			rsltMap.put(STEP_TAKCHO_SDAKS_RCP_CD, EMPTY);
			// 工程光ケーブル線路工事コード
			rsltMap.put(STEP_HCABLE_LINE_KOJI_CD, EMPTY);
			// 工程お客様宅内工事コード
			rsltMap.put(STEP_CUST_TAKNI_KOJI_CD, EMPTY);
			// 工程ご利用開始コード
			rsltMap.put(STEP_USE_STA_CD, EMPTY);
			// 設計ＮＧフラグ
			rsltMap.put(DSGN_NG_FLG, EMPTY);
			// 調査ＮＧフラグ
			rsltMap.put(CHOSA_NG_FLG, EMPTY);
			// イレギュラーフラグ
			rsltMap.put(IRREGULAR_FLG, EMPTY);
			// 宅内調査実施フラグ
			rsltMap.put(TAKCHO_JSSI_FLG, EMPTY);
			// 工期変更理由メモ
			rsltMap.put(KOKI_CHGRE_MEMO, EMPTY);
			// 工事案件番号
			rsltMap.put(KOJIAK_NO, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.KOJIAK_NO)));
			// 宅内調査予約形態
			rsltMap.put(TAKCHO_RSV_WAY, EMPTY);
			// ANK-4578-00-00 ADD START
			// 工事案件種別コード
			rsltMap.put(KOJIAK_SBT_CD, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.KOJIAK_SBT_CD)));
			// ANK-4578-00-00 ADD END
		}
		else
		{
			// 受付フラグ
			rsltMap.put(UK_FLG, "0");
			// キャンセルフラグ
			rsltMap.put(CANCEL_FLG, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.CANCEL_FLG)));
			// 工事工程進捗年月日
			rsltMap.put(KOJI_STEP_PRG_YMD, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.KOJI_STEP_PRG_YMD)));
			// 工期フローコード
			rsltMap.put(KOKI_FLOW_CD, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.KOKI_FLOW_CD)));
			// 工程宅内調査承諾書受領年月日
			rsltMap.put(STEP_TAKCHO_SDAKS_RCP_YMD, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.STEP_TAKCHO_SDAKS_RCP_YMD)));
			// 宅内調査年月日
			rsltMap.put(TAKCHO_YMD, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.TAKCHO_FIN_YMD)));
			// 宅内調査時分
			rsltMap.put(TAKCHO_HM, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.TAKCHO_FIN_HM)));
			// 宅内工事予定年月日
			rsltMap.put(TAKNIKJ_RSV_YMD, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.TAKNIKJ_RSV_YMD)));
			// 宅内工事予定時分
			rsltMap.put(TAKNIKJ_RSV_HM, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.TAKNIKJ_RSV_HM)));
			// 工事案件完了予定年月日
			rsltMap.put(KOJIAK_FIN_RSV_YMD, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.KOJIAK_FIN_RSV_YMD)));
			// 工事受付完了コード
			rsltMap.put(STEP_UK_FIN_CD, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.STEP_UK_FIN_CD)));
			// 工程光ルート調査設計コード
			rsltMap.put(STEP_HROUTE_CHOSA_DSGN_CD, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.STEP_HROUTE_CHOSA_DSGN_CD)));
			// 工程お客様宅内調査日程調整コード
			rsltMap.put(STEP_CUST_TAKCHO_NTADJ_CD, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.STEP_CUST_TAKCHO_NTADJ_CD)));
			// 工程お客様宅内調査コード
			rsltMap.put(STEP_CUST_TAKCHO_CD, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.STEP_CUST_TAKCHO_CD)));
			// 工程各種許可申請コード
			rsltMap.put(STEP_VARI_KYOKA_SHINSEI_CD, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.STEP_VARI_KYOKA_SHINSEI_CD)));
			// 工程宅内調査承諾書受領コード
			rsltMap.put(STEP_TAKCHO_SDAKS_RCP_CD, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.STEP_TAKCHO_SDAKS_RCP_CD)));
			// 工程光ケーブル線路工事コード
			rsltMap.put(STEP_HCABLE_LINE_KOJI_CD, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.STEP_HCABLE_LINE_KOJI_CD)));
			// 工程お客様宅内工事コード
			rsltMap.put(STEP_CUST_TAKNI_KOJI_CD, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.STEP_CUST_TAKNI_KOJI_CD)));
			// 工程ご利用開始コード
			rsltMap.put(STEP_USE_STA_CD, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.STEP_USE_STA_CD)));
			// 設計ＮＧフラグ
			rsltMap.put(DSGN_NG_FLG, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.DSGN_NG_FLG)));
			// 調査ＮＧフラグ
			rsltMap.put(CHOSA_NG_FLG, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.CHOSA_NG_FLG)));
			// イレギュラーフラグ
			rsltMap.put(IRREGULAR_FLG, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.IRREGULAR_FLG)));
			// 宅内調査実施フラグ
			rsltMap.put(TAKCHO_JSSI_FLG, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.TAKCHO_JSSI_FLG)));
			// 工期変更理由メモ
			rsltMap.put(KOKI_CHGRE_MEMO, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.KOKI_CHGRE_MEMO)));
			// 工事案件番号
			rsltMap.put(KOJIAK_NO, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.KOJIAK_NO)));
			// 宅内調査予約形態
			rsltMap.put(TAKCHO_RSV_WAY, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.KJ_RSV_SBT_CD)));
			// ANK-4578-00-00 ADD START
			// 工事案件種別コード
			rsltMap.put(KOJIAK_SBT_CD, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.KOJIAK_SBT_CD)));
			// ANK-4578-00-00 ADD END

			// 進捗割合
			String progressRate = eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.KOJI_STEP_PRG_RT);
			if (!isEmpty(progressRate))
			{
				// 進捗割合が存在する場合（工事進捗率定義マスタとの一致した場合）
				rsltMap.put(PROGRESS_RATE, toEmpty(progressRate));
				// 状態
				rsltMap.put(STATUS, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.NOW_KOJI_STEP_PRG_STAT_NM)));
				// 次の状態
				rsltMap.put(NEXT_STATUS, toEmpty(eku0081b110INcbsMsg.getString(EKU0081B110CBSMsg1List.NEXT_KOJI_STEP_PRG_STAT_NM)));
			}
		}
		return rsltMap;
	}

	/**
	 * 値なしチェック
	 * 
	 * @param value 値
	 * @return 値がnullまたは空文字の場合:true、値がある場合:falseを返却。
	 * @throws Exception
	 */
	private boolean isEmpty(String value) throws Exception
	{
		return value == null || value.trim().length() == 0;
	}

	/**
	 * 未設定時に空文字を取得
	 * <br/>
	 * 
	 * 値がnull、又はトリム後に空文字の場合は空文字を返却。
	 * 
	 * @param value 値
	 * @return 値がnull、又はトリム後に空文字の場合は空文字を返却。
	 * @throws Exception
	 */
	private String toEmpty(String value) throws Exception
	{
		return value == null || value.trim().length() == 0 ? EMPTY : value;
	}

}
