/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKPrcCalcWribInfoOpsCC
*	ソースファイル名：JKKPrcCalcWribInfoOpsCC.java
*	作成者			：FJ
*	日付			：2019年05月13日
*＜機能概要＞
*	料金計算用割引情報照会(オペレータ支援)の共通コンポーネント
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v43.00.00   2019/05/13  FJ)谷川     【ANK-3594-00-00】オペレータ支援対応に伴うeo顧客機能改修（料金計算ツール）
*	v43.00.01   2019/08/19  FJ)謝       【ANK-3594-01-00】ｅｏ光電話パックを内訳毎に識別
*	v66.00.00   2023/06/12  FJ)蔵田     【ANK-4404-01-00】オペレータ支援向けAPI変更対応（2023年6月）（長割追加対応）
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

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.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.EKK0081B554CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0441B005CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0441B005CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0451B015CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451B015CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0481B008CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0481B008CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0481B009CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0481B009CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0491B011CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0491B011CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2361B011CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2361B011CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3131B051CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3131B051CBSMsg1List;

/**
 * 料金計算用割引情報照会(オペレータ支援)の共通コンポーネントクラスです。
 * <br>
 * @author 富士通
 *
 */
public class JKKPrcCalcWribInfoOpsCC extends AbstractCommonComponent
{
	/** テンプレートID(EKK0081B554) サービス契約情報照会（オペレータ支援）*/
	private static final String TEMPLATE_ID_EKK0081B554 = "EKK0081B554";

	/** テンプレートID(EKK0491B011) 請求契約情報照会（オペレータ支援） */
	private static final String TEMPLATE_ID_EKK0491B011 = "EKK0491B011";

	/** テンプレートID(EKK0451B015) 割引サービス契約情報照会（オペレータ支援） */
	private static final String TEMPLATE_ID_EKK0451B015 = "EKK0451B015";

	/** テンプレートID(EKK0481B008) 割引サービス対象契約情報照会（オペレータ支援） */
	private static final String TEMPLATE_ID_EKK0481B008 = "EKK0481B008";

	/** テンプレートID(EKK2361B011) 割引サービス契約内訳情報照会（オペレータ支援） */
	private static final String TEMPLATE_ID_EKK2361B011 = "EKK2361B011";

	/** テンプレートID(EKK3131B051) 工事費割賦契約情報照会（オペレータ支援） */
	private static final String TEMPLATE_ID_EKK3131B051 = "EKK3131B051";

	/** テンプレートID(EKK0441B005) 請求オプションサービス契約情報照会（オペレータ支援） */
	private static final String TEMPLATE_ID_EKK0441B005 = "EKK0441B005";

// ANK-3594-01-00 ADD START
	/** テンプレートID(EKK0481B009) サービス契約内訳番号取得（オペレータ支援） */
	private static final String TEMPLATE_ID_EKK0481B009 = "EKK0481B009";
// ANK-3594-01-00 ADD END

	/** サービス契約回線内訳番号 */
	private static final String SVKEI_KISUW_NO = "svkei_kisuw_no";

	/** サービス契約番号（ネット） */
	private static final String SVC_KEI_NO_NET = "svc_kei_no_net";

	/** サービス契約番号（電話） */
	private static final String SVC_KEI_NO_TEL = "svc_kei_no_tel";

	/** サービス契約番号（テレビ） */
	private static final String SVC_KEI_NO_TV = "svc_kei_no_tv";

	/** 請求契約番号リスト */
	private static final String SIKY_KEI_NO_LIST = "siky_kei_no_list";

	/** 請求契約番号 */
	private static final String SIKY_KEI_NO = "siky_kei_no";

	/** データ種別 */
	private static final String DATA_SBT = "data_sbt";

	/** 料金プランコード */
	private static final String PPLAN_CD = "pplan_cd";

	/** 請求契約番号 */
	private static final String SEIKY_KEI_NO = "seiky_kei_no";

	/** 契約状態 */
	private static final String KIST = "kist";

	/** 請求書発行要否 */
	private static final String SEIKYUS_HAKYH = "seikyus_hakyh";

	/** 請求方法コード */
	private static final String SKYWAY_CD = "skyway_cd";

	/** 割引サービスコード */
	private static final String WRIB_SVC_CD = "wrib_svc_cd";

	/** 割引サービス契約番号 */
	private static final String WRIB_SVC_KEI_NO = "wrib_svc_kei_no";

	/** 機器提供サービス契約番号 */
	private static final String KKTK_SVC_KEI_NO = "kktk_svc_kei_no";

	/** サービス開始年月日 */
	private static final String SVC_STA_YMD = "svc_sta_ymd";

	/** サービス終了年月日 */
	private static final String SVC_END_YMD = "svc_end_ymd";

	/** サービス課金開始年月日 */
	private static final String SVC_CHRG_STA_YMD = "svc_chrg_sta_ymd";

	/** サービス課金終了年月日 */
	private static final String SVC_CHRG_END_YMD = "svc_chrg_end_ymd";

	/** サービス解約年月日 */
	private static final String SVC_DSL_YMD = "svc_dsl_ymd";

	/** サービス解約理由 */
	private static final String SVC_DLRE = "svc_dlre";

	/** 違約金発生コード */
	private static final String PNLTY_HASSEI_CD = "pnlty_hassei_cd";

	/** サービス回復年月日 */
	private static final String SVC_KAIHK_YMD = "svc_kaihk_ymd";

	/** プラン開始年月日 */
	private static final String PLAN_STA_YMD = "plan_sta_ymd";

	/** プラン終了年月日 */
	private static final String PLAN_END_YMD = "plan_end_ymd";

	/** プラン課金開始年月日 */
	private static final String PLAN_CHRG_STA_YMD = "plan_chrg_sta_ymd";

	/** プラン課金終了年月日 */
	private static final String PLAN_CHRG_END_YMD = "plan_chrg_end_ymd";

// ANK-3594-01-00 ADD START
	/** サービス契約内訳番号 */
	private static final String SVC_KEI_UCWK_NO = "svc_kei_ucwk_no";
// ANK-3594-01-00 ADD END
	
// ANK-4404-01-00 ADD START
	/** 申込起算年月日 */
	private static final String MSKM_KISAN_YMD = "mskm_kisan_ymd";
// ANK-4404-01-00 ADD END

	/** 割引サービス詳細コード */
	private static final String WRISVC_DTL_CD = "wrisvc_dtl_cd";

	/** 割引サービス契約内訳番号 */
	private static final String WRIB_SVC_KEI_UCWK_NO = "wrib_svc_kei_ucwk_no";

	/** 割引適用回数 */
	private static final String WRIB_APLY_CNT = "wrib_aply_cnt";

	/** 割賦プランコード */
	private static final String KAPPLAN_CD = "kapplan_cd";

	/** 工事費割賦契約番号 */
	private static final String KOJIHI_KAP_KEI_NO = "kojihi_kap_kei_no";

	/** 割賦一括請求切替年月 */
	private static final String KAP_IKTSIKY_SWCH_YM = "kap_iktsiky_swch_ym";

	/** 割賦契約課金開始年月日 */
	private static final String KAPKEI_CHRG_STA_YMD = "kapkei_chrg_sta_ymd";

	/** 割賦請求開始年月 */
	private static final String KAPSIKY_STA_YM = "kapsiky_sta_ym";

	/** 割賦請求終了年月日 */
	private static final String KAPSIKY_END_YMD = "kapsiky_end_ymd";

	/** 割賦支払い残回数 */
	private static final String KAPPAY_ZAN_CNT = "kappay_zan_cnt";

	/** 請求オプションサービス契約番号 */
	private static final String SEIOPSVC_KEI_NO = "seiopsvc_kei_no";

	/** NHK団体一括支払サイクルコード */
	private static final String NHK_DNTIKT_PAY_CYCLE_CD = "nhk_dntikt_pay_cycle_cd";

	/** 請求契約リスト */
	private static final String SEIKY_KEI_LIST = "seiky_kei_list";

	/** 割引サービス契約リスト */
	private static final String WRIB_SVC_KEI_LIST = "wrib_svc_kei_list";

	/** 割引サービス内訳契約リスト */
	private static final String WRISVC_KEI_UCWK_LIST = "wrisvc_kei_ucwk_list";

	/** 工事費割賦契約リスト */
	private static final String KOJIHI_KAP_KEI_LIST = "kojihi_kap_kei_list";

	/** 請求オプションサービス契約リスト */
	private static final String SEIOPSVC_KEI_LIST = "seiopsvc_kei_list";

	/** CCパラメータ：エラー情報 */
	private static final String ERROR_INFO = "ERROR_INFO";

	/** CCパラメータ：エラーコード */
	private static final String ERROR_CODE = "errCode";

	/** CCパラメータ：エラーメッセージ */
	private static final String ERROR_MESSAGE = "errMessage";

	// コード関連
	/** データ種別（請求オプションサービス契約） */
	private static final String DATA_SBT_05 = "05";

	/** データ種別（請求契約） */
	private static final String DATA_SBT_06 = "06";

	/** データ種別（割引サービス契約） */
	private static final String DATA_SBT_09 = "09";

	/** データ種別（割引サービス契約内訳） */
	private static final String DATA_SBT_10 = "10";

	/** データ種別（工事費割賦契約） */
	private static final String DATA_SBT_12 = "12";

	/**
	 * 料金計算用割引情報照会(オペレータ支援)の取得を行う。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite getPrcCalcWribInfoOps(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		// 料金計算用割引情報照会(オペレータ支援)CCマップ
		Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);

		// 請求契約リスト
		ArrayList<HashMap<String, Object>> seikyKeiList = new ArrayList<HashMap<String, Object>>();

		// 割引サービス契約リスト
		ArrayList<HashMap<String, Object>> wribSvcKeiList = new ArrayList<HashMap<String, Object>>();

		// 割引サービス内訳契約リスト
		ArrayList<HashMap<String, Object>> wrisvcKeiUcwkList = new ArrayList<HashMap<String, Object>>();

		// 工事費割賦契約リスト
		ArrayList<HashMap<String, Object>> kojihiKapKeiList = new ArrayList<HashMap<String, Object>>();

		// 請求オプションサービス契約リスト
		ArrayList<HashMap<String, Object>> seiopsvcKeiList = new ArrayList<HashMap<String, Object>>();

		// 割引サービス契約番号（機器提供サービス契約番号取得用）（IN句向け）
		String wribSvcKeiNoKktk = new String();

		// 割引サービス契約番号（機器提供サービス契約番号取得用）（編集用）
		StringBuilder sbWribSvcKeiNoKktk = new StringBuilder();

		// 割引サービス契約番号（割引サービス契約内訳取得用）（IN句向け）
		String wribSvcKeiNoUcwk = new String();

		// 割引サービス契約番号（割引サービス契約内訳取得用）（編集用）
		StringBuilder sbWribSvcKeiNoUcwk = new StringBuilder();

		// 機器提供サービス契約番号（割賦割引契約対象のみ）
		HashMap<String, String> kapKktkSvcKeiMap = new HashMap<String,String>();

// ANK-3594-01-00 ADD START
		// 割引サービス契約番号（サービス契約内訳番号取得用）（IN句向け）
		String wribSvcKeiNoSvkeiuw = new String();

		// 割引サービス契約番号（サービス契約内訳番号取得用）（編集用）
		StringBuilder sbWribSvcKeiNoSvkeiuw = new StringBuilder();

		// サービス契約内訳番号（パック割引契約対象のみ）
		HashMap<String, String> packSvcKeiUcwkNoMap = new HashMap<String,String>();
// ANK-3594-01-00 ADD END

		try
		{
			// 単項目チェック
			if (!checkUnitParam(ccMsg))
			{
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
				return param;
			}

			// 単関連チェック
			if (!checkItemRelation(ccMsg))
			{
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
				return param;
			}

			// サービス契約回線内訳番号
			String svkeiKisuwNo = (String)ccMsg.get(SVKEI_KISUW_NO);

			// サービス契約番号（ネット）
			String svcKeiNoNet = (String)ccMsg.get(SVC_KEI_NO_NET);

			// サービス契約番号（電話）
			String svcKeiNoTel = (String)ccMsg.get(SVC_KEI_NO_TEL);

			// サービス契約番号（TV）
			String svcKeiNoTv = (String)ccMsg.get(SVC_KEI_NO_TV);

			// サービス契約番号（ネット）、サービス契約番号（電話）、サービス契約番号（テレビ）をカンマ区切りで並べる
			StringBuilder sbSvcKeiNoList = new StringBuilder();

			// 請求契約番号リスト
			List<Map<String,String>> sikyKeiNoList = (List<Map<String,String>>)ccMsg.get(SIKY_KEI_NO_LIST);

			// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

			// サービス契約番号（ネット）が設定されている場合
			if (!JKKStringUtil.isNullBlank(svcKeiNoNet))
			{
				// サービス契約情報照会（ネット）（オペレータ支援）の上りマッピング
				Object[][] ekk0081B554In =
				{
					{EKK0081B554CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081B554},
					{EKK0081B554CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
					{EKK0081B554CBSMsg.KEY_SVC_KEI_NO, svcKeiNoNet},
					{EKK0081B554CBSMsg.KEY_SVC_CD, JKKStrConst.CD00130_01}
				};

				// サービスIF実行
				CAANMsg ekk0081b554Msg = callSC(handle, scCall, param, fixedText, ekk0081B554In, new EKK0081B554CBSMsg().getContents());

				// サービス契約情報照会（ネット）（オペレータ支援）明細
				CAANMsg[] ekk0081b554Msg1List = ekk0081b554Msg.getCAANMsgList(EKK0081B554CBSMsg.EKK0081B554CBSMSG1LIST);

				// サービスIF実行結果チェック
				if (!checkResult(param, ccMsg, ekk0081b554Msg1List, TEMPLATE_ID_EKK0081B554, SVC_KEI_NO_NET, svcKeiNoNet))
				{
					return param;
				}

				// 割引サービス契約情報照会（オペレータ支援）用の検索条件を作成
				sbSvcKeiNoList.append(JKKStrConst.COMMA);
				sbSvcKeiNoList.append(svcKeiNoNet);
			}

			// サービス契約番号（電話）が設定されている場合
			if (!JKKStringUtil.isNullBlank(svcKeiNoTel))
			{
				// サービス契約情報照会（電話）（オペレータ支援）の上りマッピング
				Object[][] ekk0081B554In =
				{
					{EKK0081B554CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081B554},
					{EKK0081B554CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
					{EKK0081B554CBSMsg.KEY_SVC_KEI_NO, svcKeiNoTel},
					{EKK0081B554CBSMsg.KEY_SVC_CD, JKKStrConst.CD00130_02}
				};

				// サービスIF実行
				CAANMsg ekk0081b554Msg = callSC(handle, scCall, param, fixedText, ekk0081B554In, new EKK0081B554CBSMsg().getContents());

				// サービス契約情報照会（電話）（オペレータ支援）明細
				CAANMsg[] ekk0081b554Msg1List = ekk0081b554Msg.getCAANMsgList(EKK0081B554CBSMsg.EKK0081B554CBSMSG1LIST);

				// サービスIF実行結果チェック
				if (!checkResult(param, ccMsg, ekk0081b554Msg1List, TEMPLATE_ID_EKK0081B554, SVC_KEI_NO_TEL, svcKeiNoTel))
				{
					return param;
				}

				// 割引サービス契約情報照会（オペレータ支援）用の検索条件を作成
				sbSvcKeiNoList.append(JKKStrConst.COMMA);
				sbSvcKeiNoList.append(svcKeiNoTel);
			}

			// サービス契約番号（テレビ）が設定されている場合
			if (!JKKStringUtil.isNullBlank(svcKeiNoTv))
			{
				// サービス契約情報照会（テレビ）（オペレータ支援）の上りマッピング
				Object[][] ekk0081B554In =
				{
					{EKK0081B554CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081B554},
					{EKK0081B554CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
					{EKK0081B554CBSMsg.KEY_SVC_KEI_NO, svcKeiNoTv},
					{EKK0081B554CBSMsg.KEY_SVC_CD, JKKStrConst.CD00130_03}
				};

				// サービスIF実行
				CAANMsg ekk0081b554Msg = callSC(handle, scCall, param, fixedText, ekk0081B554In, new EKK0081B554CBSMsg().getContents());

				// サービス契約情報照会（テレビ）（オペレータ支援）明細
				CAANMsg[] ekk0081b554Msg1List = ekk0081b554Msg.getCAANMsgList(EKK0081B554CBSMsg.EKK0081B554CBSMSG1LIST);

				// サービスIF実行結果チェック
				if (!checkResult(param, ccMsg, ekk0081b554Msg1List, TEMPLATE_ID_EKK0081B554, SVC_KEI_NO_TV, svcKeiNoTv))
				{
					return param;
				}

				// 割引サービス契約情報照会（オペレータ支援）用の検索条件を作成
				sbSvcKeiNoList.append(JKKStrConst.COMMA);
				sbSvcKeiNoList.append(svcKeiNoTv);
			}
			// リスト内の請求契約番号をカンマ区切りで並べる
			StringBuilder sbSikyKeiNoList = new StringBuilder();
			for (int i = 0; i < sikyKeiNoList.size(); i++)
			{
				sbSikyKeiNoList.append(JKKStrConst.COMMA);
				sbSikyKeiNoList.append(sikyKeiNoList.get(i).get(SIKY_KEI_NO));
			}

			// 先頭のカンマを除去し、変数に格納する
			String sikyKeiNo = sbSikyKeiNoList.toString().substring(1);

			// 請求契約情報照会（オペレータ支援）の上りマッピング
			Object[][] ekk0491B011In =
			{
				{EKK0491B011CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0491B011},
				{EKK0491B011CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
				{EKK0491B011CBSMsg.KEY_SEIKY_KEI_NO, sikyKeiNo}
			};

			// サービスIF実行
			CAANMsg ekk0491b011Msg = callSC(handle, scCall, param, fixedText, ekk0491B011In, new EKK0491B011CBSMsg().getContents());

			// 請求契約情報照会（オペレータ支援）明細
			CAANMsg[] ekk0491b011Msg1List = ekk0491b011Msg.getCAANMsgList(EKK0491B011CBSMsg.EKK0491B011CBSMSG1LIST);

			// サービスIF実行結果チェック
			if (!checkResult(param, ccMsg, ekk0491b011Msg1List, TEMPLATE_ID_EKK0491B011, SIKY_KEI_NO, sikyKeiNoList.get(0).get(SIKY_KEI_NO)))
			{
				return param;
			}
			else
			{
				// 請求契約情報照会（オペレータ支援）明細の件数ループ
				for (int i = 0; i < ekk0491b011Msg1List.length; i++)
				{
					HashMap<String,Object> seikyKeiMap = new HashMap<String,Object>();
					// データ種別 "06"(請求契約)【固定】
					seikyKeiMap.put(DATA_SBT, DATA_SBT_06);
					// 料金プランコード "PE0101"【固定】
					seikyKeiMap.put(PPLAN_CD, JKKStrConst.CD00565_SKSHKTSR);
					// 請求契約番号
					seikyKeiMap.put(SEIKY_KEI_NO, nullToStr(ekk0491b011Msg1List[i].getString(EKK0491B011CBSMsg1List.SEIKY_KEI_NO)));
					// 契約状態
					seikyKeiMap.put(KIST, nullToStr(ekk0491b011Msg1List[i].getString(EKK0491B011CBSMsg1List.SEIKY_KEI_STAT)));
					// 請求書発行要否
					seikyKeiMap.put(SEIKYUS_HAKYH, nullToStr(ekk0491b011Msg1List[i].getString(EKK0491B011CBSMsg1List.SEIKYUS_HAKKO_YH)));
					// 請求方法コード
					seikyKeiMap.put(SKYWAY_CD, nullToStr(ekk0491b011Msg1List[i].getString(EKK0491B011CBSMsg1List.SEIKY_WAY_CD)));
					// 請求契約リストへマップを追加
					seikyKeiList.add(seikyKeiMap);
				}
			}

			// 先頭のカンマを除去し、変数に格納する
			String svcKeiNo = sbSvcKeiNoList.toString().substring(1);

			// 割引サービス契約情報照会（オペレータ支援）の上りマッピング
			Object[][] ekk0451B015In =
			{
				{EKK0451B015CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0451B015},
				{EKK0451B015CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
				{EKK0451B015CBSMsg.KEY_SVC_KEI_NO, svcKeiNo}
			};

			// サービスIF実行
			CAANMsg ekk0451b015Msg = callSC(handle, scCall, param, fixedText, ekk0451B015In, new EKK0451B015CBSMsg().getContents());

			// 割引サービス契約情報照会（オペレータ支援）明細
			CAANMsg[] ekk0451b015Msg1List = ekk0451b015Msg.getCAANMsgList(EKK0451B015CBSMsg.EKK0451B015CBSMSG1LIST);

			if (ekk0451b015Msg1List != null && ekk0451b015Msg1List.length != 0)
			{
				// 割引サービス契約情報照会（オペレータ支援）明細の件数ループ
				for (int i = 0; i < ekk0451b015Msg1List.length; i++)
				{
					// 割引サービス契約番号取得
					String wribSvcKeiNo = nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.WRIB_SVC_KEI_NO));
					// 割引タイプコード取得
					String wribTypeCd = nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.WRIB_TYPE_CD));
// ANK-3594-01-00 ADD START
					// 置換型割引置換種別コード取得
					String reptpwrCkanSbtCd = nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.REPTPWR_CKAN_SBT_CD));
// ANK-3594-01-00 ADD END
					// 割引タイプコードが「42（割賦契約割引）」の場合
					if (JKKStrConst.WARIB_TYPE_KAP.equals(wribTypeCd))
					{
						sbWribSvcKeiNoKktk.append(JKKStrConst.COMMA);
						sbWribSvcKeiNoKktk.append(wribSvcKeiNo);
					}
// ANK-3594-01-00 ADD START
					// 割引タイプコードが"20"（パック割引)かつ置換型割引置換種別コードが"02"（サービス契約内訳単位)の場合
					else if (JKKStrConst.WARIB_TYPE_PACK.equals(wribTypeCd)
							&& JKKStrConst.REPTPWR_CKAN_SBT_CD_SVKEIUW.equals(reptpwrCkanSbtCd))
					{
						sbWribSvcKeiNoSvkeiuw.append(JKKStrConst.COMMA);
						sbWribSvcKeiNoSvkeiuw.append(wribSvcKeiNo);
					}
// ANK-3594-01-00 ADD END
				}
			}

			// 割引タイプコードが「42（割賦契約割引）」が存在した場合
			if (!JKKStringUtil.isNullBlank(sbWribSvcKeiNoKktk.toString()))
			{
				// 先頭のカンマを除去し、変数に格納する（機器提供サービス契約番号用）
				wribSvcKeiNoKktk = sbWribSvcKeiNoKktk.toString().substring(1);

				// 割引サービス対象契約情報照会（オペレータ支援）の上りマッピング
				Object[][] ekk0481B008In =
				{
					{EKK0481B008CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0481B008},
					{EKK0481B008CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
					{EKK0481B008CBSMsg.KEY_WRIB_SVC_KEI_NO, wribSvcKeiNoKktk}
				};

				// サービスIF実行
				CAANMsg ekk0481b008Msg = callSC(handle, scCall, param, fixedText, ekk0481B008In, new EKK0481B008CBSMsg().getContents());

				// 割引サービス対象契約情報照会（オペレータ支援）明細
				CAANMsg[] ekk0481b008Msg1List = ekk0481b008Msg.getCAANMsgList(EKK0481B008CBSMsg.EKK0481B008CBSMSG1LIST);

				if (ekk0481b008Msg1List != null && ekk0481b008Msg1List.length != 0)
				{
					// 割引サービス対象契約情報照会（オペレータ支援）明細の件数ループ
					for (int i = 0; i < ekk0481b008Msg1List.length; i++)
					{
						// 機器提供サービス契約番号マップ（key:割引サービス契約番号, value:機器提供サービス契約番号）
						kapKktkSvcKeiMap.put(nullToStr(ekk0481b008Msg1List[i].getString(EKK0481B008CBSMsg1List.WRIB_SVC_KEI_NO)),
								nullToStr(ekk0481b008Msg1List[i].getString(EKK0481B008CBSMsg1List.KKTK_SVC_KEI_NO)));
					}
				}
			}
// ANK-3594-01-00 ADD START
			// パック割引の割引サービス契約情報が存在した場合
			if (!JKKStringUtil.isNullBlank(sbWribSvcKeiNoSvkeiuw.toString()))
			{
				// 先頭のカンマを除去し、変数に格納する（サービス契約内訳番号用）
				wribSvcKeiNoSvkeiuw = sbWribSvcKeiNoSvkeiuw.toString().substring(1);

				// サービス契約内訳番号取得（オペレータ支援）の上りマッピング
				Object[][] ekk0481B009In =
				{
					{EKK0481B009CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0481B009},
					{EKK0481B009CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
					{EKK0481B009CBSMsg.KEY_WRIB_SVC_KEI_NO, wribSvcKeiNoSvkeiuw}
				};

				// サービスIF実行
				CAANMsg ekk0481b009Msg = callSC(handle, scCall, param, fixedText, ekk0481B009In, new EKK0481B009CBSMsg().getContents());

				// サービス契約内訳番号取得（オペレータ支援）明細
				CAANMsg[] ekk0481b009Msg1List = ekk0481b009Msg.getCAANMsgList(EKK0481B009CBSMsg.EKK0481B009CBSMSG1LIST);

				if (ekk0481b009Msg1List != null && ekk0481b009Msg1List.length != 0)
				{
					// サービス契約内訳番号取得（オペレータ支援）明細の件数ループ
					for (int i = 0; i < ekk0481b009Msg1List.length; i++)
					{
						// サービス契約内訳番号マップ（key:割引サービス契約番号, value:サービス契約内訳番号）
						packSvcKeiUcwkNoMap.put(nullToStr(ekk0481b009Msg1List[i].getString(EKK0481B009CBSMsg1List.WRIB_SVC_KEI_NO)),
								nullToStr(ekk0481b009Msg1List[i].getString(EKK0481B009CBSMsg1List.SVC_KEI_UCWK_NO)));
					}
				}
			}
// ANK-3594-01-00 ADD END

			if (ekk0451b015Msg1List != null && ekk0451b015Msg1List.length != 0)
			{
				// 割引サービス契約情報照会（オペレータ支援）明細の件数ループ
				for (int i = 0; i < ekk0451b015Msg1List.length; i++)
				{
					// 割引サービス契約番号取得
					String wribSvcKeiNo = nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.WRIB_SVC_KEI_NO));
					HashMap<String,Object> wribSvcKeiMap = new HashMap<String,Object>();
					// データ種別 "09"(割引サービス契約)【固定】
					wribSvcKeiMap.put(DATA_SBT, DATA_SBT_09);
					// 割引サービスコード
					wribSvcKeiMap.put(WRIB_SVC_CD, nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.WRIB_SVC_CD)));
					// 割引サービス契約番号
					wribSvcKeiMap.put(WRIB_SVC_KEI_NO, wribSvcKeiNo);
					// 割引サービス契約ステータス
					wribSvcKeiMap.put(KIST, nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.WRIB_SVC_KEI_STAT)));
					// サービス開始年月日
					wribSvcKeiMap.put(SVC_STA_YMD, nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.SVC_STA_YMD)));
					// サービス終了年月日
					wribSvcKeiMap.put(SVC_END_YMD, nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.SVC_ENDYMD)));
					// サービス課金開始年月日
					wribSvcKeiMap.put(SVC_CHRG_STA_YMD, nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.SVC_CHRG_STAYMD)));
					// サービス課金終了年月日
					wribSvcKeiMap.put(SVC_CHRG_END_YMD, nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.SVC_CHRG_ENDYMD)));
					// サービス解約年月日
					wribSvcKeiMap.put(SVC_DSL_YMD, nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.SVC_DSL_YMD)));
					// サービス解約年月日
					wribSvcKeiMap.put(SVC_DLRE, nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.SVC_DLRE_CD)));
					// 違約金発生コード
					wribSvcKeiMap.put(PNLTY_HASSEI_CD, nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.PNLTY_HASSEI_CD)));
					// 回復年月日
					wribSvcKeiMap.put(SVC_KAIHK_YMD, nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.KAIHK_YMD)));
					// プラン開始年月日
					wribSvcKeiMap.put(PLAN_STA_YMD, nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.PLAN_STAYMD)));
					// プラン終了年月日
					wribSvcKeiMap.put(PLAN_END_YMD, nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.PLAN_ENDYMD)));
					// プラン課金開始年月日
					wribSvcKeiMap.put(PLAN_CHRG_STA_YMD, nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.PLAN_CHRG_STAYMD)));
					// プラン課金終了年月日
					wribSvcKeiMap.put(PLAN_CHRG_END_YMD, nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.PLAN_CHRG_ENDYMD)));
					// 機器提供サービス契約番号
					wribSvcKeiMap.put(KKTK_SVC_KEI_NO, nullToStr(kapKktkSvcKeiMap.get(wribSvcKeiNo)));
// ANK-3594-01-00 ADD START
					// サービス契約内訳番号
					wribSvcKeiMap.put(SVC_KEI_UCWK_NO, nullToStr(packSvcKeiUcwkNoMap.get(wribSvcKeiNo)));
// ANK-3594-01-00 ADD END
// ANK-4404-01-00 ADD START
					// 申込起算年月日
					wribSvcKeiMap.put(MSKM_KISAN_YMD, nullToStr(ekk0451b015Msg1List[i].getString(EKK0451B015CBSMsg1List.MSKM_KISAN_YMD)));
// ANK-4404-01-00 ADD END

					// 割引サービス契約リストへマップを追加
					wribSvcKeiList.add(wribSvcKeiMap);

					// 割引サービス契約内訳取得用
					sbWribSvcKeiNoUcwk.append(JKKStrConst.COMMA);
					sbWribSvcKeiNoUcwk.append(wribSvcKeiNo);
				}
			}

			// 割引サービス契約番号が設定されている場合
			if (!JKKStringUtil.isNullBlank(sbWribSvcKeiNoUcwk.toString()))
			{
				// 先頭のカンマを除去し、変数に格納する（割引サービス契約内訳取得用）
				wribSvcKeiNoUcwk = sbWribSvcKeiNoUcwk.toString().substring(1);

				// 割引サービス契約内訳情報照会（オペレータ支援）の上りマッピング
				Object[][] ekk2361B011In =
				{
					{EKK2361B011CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK2361B011},
					{EKK2361B011CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
					{EKK2361B011CBSMsg.KEY_WRIB_SVC_KEI_NO, wribSvcKeiNoUcwk}
				};

				// サービスIF実行
				CAANMsg ekk2361b011Msg = callSC(handle, scCall, param, fixedText, ekk2361B011In, new EKK2361B011CBSMsg().getContents());

				// 割引サービス契約内訳情報照会（オペレータ支援）明細
				CAANMsg[] ekk2361b011Msg1List = ekk2361b011Msg.getCAANMsgList(EKK2361B011CBSMsg.EKK2361B011CBSMSG1LIST);

				if (ekk2361b011Msg1List != null && ekk2361b011Msg1List.length != 0)
				{
					// 割引サービス契約内訳情報照会（オペレータ支援）明細の件数ループ
					for (int i = 0; i < ekk2361b011Msg1List.length; i++)
					{
						HashMap<String,Object> wrisvcKeiUcwkMap = new HashMap<String,Object>();
						// データ種別 "10"(割引サービス契約内訳)【固定】
						wrisvcKeiUcwkMap.put(DATA_SBT, DATA_SBT_10);
						// 割引サービス詳細コード
						wrisvcKeiUcwkMap.put(WRISVC_DTL_CD, nullToStr(ekk2361b011Msg1List[i].getString(EKK2361B011CBSMsg1List.WRIB_SVC_DTL_CD)));
						// 割引サービス契約番号
						wrisvcKeiUcwkMap.put(WRIB_SVC_KEI_NO, nullToStr(ekk2361b011Msg1List[i].getString(EKK2361B011CBSMsg1List.WRIB_SVC_KEI_NO)));
						// 割引サービス契約内訳番号
						wrisvcKeiUcwkMap.put(WRIB_SVC_KEI_UCWK_NO, nullToStr(ekk2361b011Msg1List[i].getString(EKK2361B011CBSMsg1List.WRIB_SVC_KEI_UCWK_NO)));
						// 契約状態
						wrisvcKeiUcwkMap.put(KIST, nullToStr(ekk2361b011Msg1List[i].getString(EKK2361B011CBSMsg1List.WRIB_SVC_KEI_UCWK_STAT)));
						// サービス課金開始年月日
						wrisvcKeiUcwkMap.put(SVC_CHRG_STA_YMD, nullToStr(ekk2361b011Msg1List[i].getString(EKK2361B011CBSMsg1List.SVC_CHRG_STAYMD)));
						// サービス課金終了年月日
						wrisvcKeiUcwkMap.put(SVC_CHRG_END_YMD, nullToStr(ekk2361b011Msg1List[i].getString(EKK2361B011CBSMsg1List.SVC_CHRG_ENDYMD)));
						// 割引適用回数
						wrisvcKeiUcwkMap.put(WRIB_APLY_CNT, nullToStr(ekk2361b011Msg1List[i].getString(EKK2361B011CBSMsg1List.WRIB_APLY_CNT)));
						// 割引サービス内訳契約リストへマップを追加
						wrisvcKeiUcwkList.add(wrisvcKeiUcwkMap);
					}
				}
			}

			// 工事費割賦契約情報照会（オペレータ支援）の上りマッピング
			Object[][] ekk3131B051In =
			{
				{EKK3131B051CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3131B051},
				{EKK3131B051CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
				{EKK3131B051CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO, svkeiKisuwNo}
			};

			// サービスIF実行
			CAANMsg ekk3131b051Msg = callSC(handle, scCall, param, fixedText, ekk3131B051In, new EKK3131B051CBSMsg().getContents());

			// 工事費割賦契約情報照会（オペレータ支援）明細
			CAANMsg[] ekk3131b051Msg1List = ekk3131b051Msg.getCAANMsgList(EKK3131B051CBSMsg.EKK3131B051CBSMSG1LIST);

			if (ekk3131b051Msg1List != null && ekk3131b051Msg1List.length != 0)
			{
				// 工事費割賦契約情報照会（オペレータ支援）明細の件数ループ
				for (int i = 0; i < ekk3131b051Msg1List.length; i++)
				{
					HashMap<String,Object> kojihiKapKeiMap = new HashMap<String,Object>();
					// データ種別 "12"(工事費割賦契約)【固定】
					kojihiKapKeiMap.put(DATA_SBT, DATA_SBT_12);
					// 割賦プランコード
					kojihiKapKeiMap.put(KAPPLAN_CD, nullToStr(ekk3131b051Msg1List[i].getString(EKK3131B051CBSMsg1List.KAP_PLAN_CD)));
					// 工事費割賦契約番号
					kojihiKapKeiMap.put(KOJIHI_KAP_KEI_NO, nullToStr(ekk3131b051Msg1List[i].getString(EKK3131B051CBSMsg1List.KOJIHI_KAP_KEI_NO)));
					// 契約状態
					kojihiKapKeiMap.put(KIST, nullToStr(ekk3131b051Msg1List[i].getString(EKK3131B051CBSMsg1List.KAP_KEI_STAT)));
					// 割賦一括請求切替年月
					kojihiKapKeiMap.put(KAP_IKTSIKY_SWCH_YM, nullToStr(ekk3131b051Msg1List[i].getString(EKK3131B051CBSMsg1List.KAP_IKT_SIKY_SWCH_YM)));
					// 割賦契約課金開始年月日
					kojihiKapKeiMap.put(KAPKEI_CHRG_STA_YMD, nullToStr(ekk3131b051Msg1List[i].getString(EKK3131B051CBSMsg1List.KAP_KEI_CHRG_STAYMD)));
					// 割賦請求開始年月
					kojihiKapKeiMap.put(KAPSIKY_STA_YM, nullToStr(ekk3131b051Msg1List[i].getString(EKK3131B051CBSMsg1List.KAP_SEIKY_STA_YM)));
					// 割賦請求終了年月日
					kojihiKapKeiMap.put(KAPSIKY_END_YMD, nullToStr(ekk3131b051Msg1List[i].getString(EKK3131B051CBSMsg1List.KAP_KEI_ENDYMD)));
					// 割賦支払い残回数
					kojihiKapKeiMap.put(KAPPAY_ZAN_CNT, nullToStr(ekk3131b051Msg1List[i].getString(EKK3131B051CBSMsg1List.KAP_PAY_ZAN_CNT)));
					// 工事費割賦契約リストへマップを追加
					kojihiKapKeiList.add(kojihiKapKeiMap);
				}
			}

			// 請求オプションサービス契約情報照会（オペレータ支援）の上りマッピング
			Object[][] ekk0441B005In =
			{
				{EKK0441B005CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0441B005},
				{EKK0441B005CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
				{EKK0441B005CBSMsg.KEY_SEIKY_KEI_NO, sikyKeiNo}
			};

			// サービスIF実行
			CAANMsg ekk0441b005Msg = callSC(handle, scCall, param, fixedText, ekk0441B005In, new EKK0441B005CBSMsg().getContents());

			// 請求オプションサービス契約情報照会（オペレータ支援）明細
			CAANMsg[] ekk0441b005Msg1List = ekk0441b005Msg.getCAANMsgList(EKK0441B005CBSMsg.EKK0441B005CBSMSG1LIST);

			if (ekk0441b005Msg1List != null && ekk0441b005Msg1List.length != 0)
			{
				// 請求オプションサービス契約情報照会（オペレータ支援）明細の件数ループ
				for (int i = 0; i < ekk0441b005Msg1List.length; i++)
				{
					HashMap<String,Object> seiopsvcKeiMap = new HashMap<String,Object>();
					// データ種別 "05"(請求オプションサービス契約)【固定】
					seiopsvcKeiMap.put(DATA_SBT, DATA_SBT_05);
					// 料金プランコード
					seiopsvcKeiMap.put(PPLAN_CD, nullToStr(ekk0441b005Msg1List[i].getString(EKK0441B005CBSMsg1List.PPLAN_CD)));
					// 請求オプションサービス契約番号
					seiopsvcKeiMap.put(SEIOPSVC_KEI_NO, nullToStr(ekk0441b005Msg1List[i].getString(EKK0441B005CBSMsg1List.SEIOPSVC_KEI_NO)));
					// 契約状態
					seiopsvcKeiMap.put(KIST, nullToStr(ekk0441b005Msg1List[i].getString(EKK0441B005CBSMsg1List.SEIOPSVC_KEI_STAT)));
					// サービス開始年月日
					seiopsvcKeiMap.put(SVC_STA_YMD, nullToStr(ekk0441b005Msg1List[i].getString(EKK0441B005CBSMsg1List.SVC_STA_YMD)));
					// サービス終了年月日
					seiopsvcKeiMap.put(SVC_END_YMD, nullToStr(ekk0441b005Msg1List[i].getString(EKK0441B005CBSMsg1List.SVC_ENDYMD)));
					// サービス課金開始年月日
					seiopsvcKeiMap.put(SVC_CHRG_STA_YMD, nullToStr(ekk0441b005Msg1List[i].getString(EKK0441B005CBSMsg1List.SVC_CHRG_STAYMD)));
					// サービス課金終了年月日
					seiopsvcKeiMap.put(SVC_CHRG_END_YMD, nullToStr(ekk0441b005Msg1List[i].getString(EKK0441B005CBSMsg1List.SVC_CHRG_ENDYMD)));
					// サービス解約年月日
					seiopsvcKeiMap.put(SVC_DSL_YMD, nullToStr(ekk0441b005Msg1List[i].getString(EKK0441B005CBSMsg1List.SVC_DSL_YMD)));
					// サービス解約理由
					seiopsvcKeiMap.put(SVC_DLRE, nullToStr(ekk0441b005Msg1List[i].getString(EKK0441B005CBSMsg1List.SVC_DLRE_CD)));
					// 違約金発生コード
					seiopsvcKeiMap.put(PNLTY_HASSEI_CD, nullToStr(ekk0441b005Msg1List[i].getString(EKK0441B005CBSMsg1List.PNLTY_HASSEI_CD)));
					// サービス回復年月日
					seiopsvcKeiMap.put(SVC_KAIHK_YMD, nullToStr(ekk0441b005Msg1List[i].getString(EKK0441B005CBSMsg1List.KAIHK_YMD)));
					// プラン開始年月日
					seiopsvcKeiMap.put(PLAN_STA_YMD, nullToStr(ekk0441b005Msg1List[i].getString(EKK0441B005CBSMsg1List.PLAN_STAYMD)));
					// プラン終了年月日
					seiopsvcKeiMap.put(PLAN_END_YMD, nullToStr(ekk0441b005Msg1List[i].getString(EKK0441B005CBSMsg1List.PLAN_ENDYMD)));
					// プラン課金開始年月日
					seiopsvcKeiMap.put(PLAN_CHRG_STA_YMD, nullToStr(ekk0441b005Msg1List[i].getString(EKK0441B005CBSMsg1List.PLAN_CHRG_STAYMD)));
					// プラン課金終了年月日
					seiopsvcKeiMap.put(PLAN_CHRG_END_YMD, nullToStr(ekk0441b005Msg1List[i].getString(EKK0441B005CBSMsg1List.PLAN_CHRG_ENDYMD)));
					// NHK団体一括支払サイクルコード
					seiopsvcKeiMap.put(NHK_DNTIKT_PAY_CYCLE_CD, nullToStr(ekk0441b005Msg1List[i].getString(EKK0441B005CBSMsg1List.NHK_GRP_IKT_PAY_CYCLE_CD)));
					// 請求オプションサービス契約リストへマップを追加
					seiopsvcKeiList.add(seiopsvcKeiMap);
				}
			}

			// 各リストをCCマップへ設定
			// 請求契約リスト
			ccMsg.put(SEIKY_KEI_LIST, seikyKeiList);
			// 割引サービス契約リスト
			ccMsg.put(WRIB_SVC_KEI_LIST, wribSvcKeiList);
			// 割引サービス内訳契約リスト
			ccMsg.put(WRISVC_KEI_UCWK_LIST, wrisvcKeiUcwkList);
			// 工事費割賦契約リスト
			ccMsg.put(KOJIHI_KAP_KEI_LIST, kojihiKapKeiList);
			// 請求オプションサービス契約リスト
			ccMsg.put(SEIOPSVC_KEI_LIST, seiopsvcKeiList);

			// 正常終了
			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;
	}

	/**
	 * サービスインターファイス実行結果チェック
	 * @param param
	 * @param ccMsg
	 * @param msg1List
	 * @param templateId
	 * @param itemName
	 * @param itemValue
	 * @return チェックの判定
	 * @throws Exception
	 */
	private boolean checkResult(IRequestParameterReadWrite param, Map<String, Object> ccMsg, CAANMsg[] msg1List, String templateId, String itemName, String itemValue)
	throws Exception
	{

		// エラーメッセージ設定
		String errMessage = itemName + JKKStrConst.COLON + itemValue;

		// サービスインターフェースIDが「EKK0081B554」の場合
		if (TEMPLATE_ID_EKK0081B554.equals(templateId))
		{
			// 取得件数が0件の場合、業務エラーを設定する
			if (msg1List == null || msg1List.length == 0)
			{
				// エラーリスト
				List<Map<String, String>> errList = new ArrayList<Map<String, String>>();

				Map<String, String> returnMap = new HashMap<String, String>();

				// 業務エラー設定
				returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_2002);
				returnMap.put(ERROR_MESSAGE, errMessage);
				errList.add(returnMap);
				ccMsg.put(ERROR_INFO, errList);

				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
				return false;
			}
		}
		// サービスインターフェースIDが「EKK0491B011」の場合
		else if (TEMPLATE_ID_EKK0491B011.equals(templateId))
		{
			// 取得件数が0件の場合、業務エラーを設定する
			if (msg1List == null || msg1List.length == 0)
			{
				// エラーリスト
				List<Map<String, String>> errList = new ArrayList<Map<String, String>>();

				Map<String, String> returnMap = new HashMap<String, String>();

				// 業務エラー設定
				returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_2003);
				returnMap.put(ERROR_MESSAGE, errMessage);
				errList.add(returnMap);
				ccMsg.put(ERROR_INFO, errList);

				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
				return false;
			}
		}
		return true;
	}

	/**
	 * 項目名がnullかチェックする
	 * @param str 項目名
	 * @return 項目名
	 */
	private String nullToStr(String str)
	{
		if(str == null)
		{
			str = "";
		}
		return str;
	}

	/**
	 * 単項目チェック
	 * @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;

		List<Map<String, String>> itemSikyKeiNoList = new ArrayList<Map<String, String>>();

		// サービス契約回線内訳番号
		itemName = SVKEI_KISUW_NO;
		itemValue = (String)ccMsg.get(itemName);
		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap(itemName, ""));
		}
		else if (!HalfCharCheck.isEnNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(itemName, itemValue));
		}
		else if (!LengthCheck.isLength1Check(itemValue, 12))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(itemName, itemValue));
		}

		// サービス契約番号（ネット）
		itemName = SVC_KEI_NO_NET;
		itemValue = (String)ccMsg.get(itemName);
		// 値が設定されている場合のみ属性・桁数チェック
		if (!JKKStringUtil.isNullBlank(itemValue))
		{
			// 属性チェック
			if (!HalfCharCheck.isEnNumber1Check(itemValue))
			{
				// 属性チェックエラー
				errList.add(getFormErrInfMap(itemName, itemValue));
			}
			else if (!LengthCheck.isLength1Check(itemValue, 10))
			{
				// 桁数チェックエラー
				errList.add(getLenErrInfMap(itemName, itemValue));
			}
		}

		// サービス契約番号（電話）
		itemName = SVC_KEI_NO_TEL;
		itemValue = (String)ccMsg.get(itemName);
		// 値が設定されている場合のみ属性・桁数チェック
		if (!JKKStringUtil.isNullBlank(itemValue))
		{
			// 属性チェック
			if (!HalfCharCheck.isEnNumber1Check(itemValue))
			{
				// 属性チェックエラー
				errList.add(getFormErrInfMap(itemName, itemValue));
			}
			else if (!LengthCheck.isLength1Check(itemValue, 10))
			{
				// 桁数チェックエラー
				errList.add(getLenErrInfMap(itemName, itemValue));
			}
		}

		// サービス契約番号（テレビ）
		itemName = SVC_KEI_NO_TV;
		itemValue = (String)ccMsg.get(itemName);
		// 値が設定されている場合のみ属性・桁数チェック
		if (!JKKStringUtil.isNullBlank(itemValue))
		{
			// 属性チェック
			if (!HalfCharCheck.isEnNumber1Check(itemValue))
			{
				// 属性チェックエラー
				errList.add(getFormErrInfMap(itemName, itemValue));
			}
			else if (!LengthCheck.isLength1Check(itemValue, 10))
			{
				// 桁数チェックエラー
				errList.add(getLenErrInfMap(itemName, itemValue));
			}
		}

		// 請求契約番号リスト取得
		itemName = SIKY_KEI_NO;
		itemSikyKeiNoList = (List<Map<String, String>>)ccMsg.get(SIKY_KEI_NO_LIST);
		// 請求契約番号リストがnullまたは０件の場合
		if (itemSikyKeiNoList == null || itemSikyKeiNoList.size() == 0)
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap(SIKY_KEI_NO_LIST,""));
		}
		else
		{
			for (int i = 0; i < itemSikyKeiNoList.size(); i++)
			{
				if (itemSikyKeiNoList.get(i) == null)
				{
					// 必須チェックエラー
					errList.add(getReqErrInfMap(SIKY_KEI_NO_LIST, ""));
				}
				else
				{
					itemValue = (String)itemSikyKeiNoList.get(i).get(itemName);
					// 必須チェック
					if ( itemValue == null || "".equals(itemValue) )
					{
						// 必須チェックエラー
						errList.add(getReqErrInfMap(itemName, ""));
					}
					else if (!HalfCharCheck.isEnNumber1Check(itemValue))
					{
						// 属性チェックエラー
						errList.add(getFormErrInfMap(itemName, itemValue));
					}
					else if (!LengthCheck.isLength1Check(itemValue, 10))
					{
						// 桁数チェックエラー
						errList.add(getLenErrInfMap(itemName, itemValue));
					}
				}
			}
		}

		// エラーが存在する場合
		if (errList.size() > 0)
		{
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}

		return true;
	}

	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @param contents CAANMsgのコンテンツ
	 * @return CAANMsg
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param, String dataMapKey,
			Object[][] mappingData, Object[][] contents)
	throws Throwable
	{
		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);

		editErrorInfoCom(param, templates, (Integer)return_code, dataMapKey, mappingData, contents);

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);

		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));

		// SCCallExceptionはスローしない

		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]);
			}
		}

		CAANMsg[] templates = new CAANMsg[1];

		templates[0] = template;

		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * エラー情報を取得します。
	 * @param param リクエストパラメータ
	 * @param templates CAANMsgクラス
	 * @param returnCode リターンコード
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @param contents CAANMsgのコンテンツ
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, String dataMapKey,
			Object[][] mappingData, Object[][] contents)
	throws RequestParameterException
	{
		CAANMsg template = templates[0];

		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if (0 != returnCode)
		{
			templateStatus = 9000;
		}

		if (null == JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)))
		{
			templateStatus = 0;
		}

		int bpStatus = 0;

		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);

		if (null == obj)
		{
			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);
		}

		Map<String, String> inMap = null;

		// ユーザデータ情報
		inMap = (Map<String, String>)param.getData(dataMapKey);

		for (int i = 0; null != contents && i < contents.length ; i++)
		{
			String itemNm = (String)contents[i][0];
			if (itemNm.endsWith("_err"))
			{
				String errCd = (String)template.getString(itemNm);
				if (!JKKStringUtil.isNullBlank(errCd))
				{
					inMap.put(itemNm, errCd);
				}
			}
		}
		return param;
	}

	/**
	 * 単項目チェックの必須エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @param itemValue 項目値
	 * @return
	 */
	private Map<String, String> getReqErrInfMap(String itemName, String itemValue)
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		// エラーメッセージ設定
		String errMessage = itemName + JKKStrConst.COLON + itemValue;

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1001);
		returnMap.put(ERROR_MESSAGE, errMessage);

		return returnMap;
	}

	/**
	 * 単項目チェックの属性エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @param itemValue 項目値
	 * @return
	 */
	private Map<String, String> getFormErrInfMap(String itemName, String itemValue)
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		// エラーメッセージ設定
		String errMessage = itemName + JKKStrConst.COLON + itemValue;

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1002);
		returnMap.put(ERROR_MESSAGE, errMessage);

		return returnMap;
	}

	/**
	 * 単項目チェックの桁数エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @param itemValue 項目値
	 * @return
	 */
	private Map<String, String> getLenErrInfMap(String itemName, String itemValue)
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		// エラーメッセージ設定
		String errMessage = itemName + JKKStrConst.COLON + itemValue;

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1003);
		returnMap.put(ERROR_MESSAGE, errMessage);

		return returnMap;
	}


	/**
	 * 単関連チェックを行います。
	 * <br>
	 * @param ccMsg 契約者情報登録マップ
	 * @throws Throwable 例外が発生した場合
	 */
	private boolean checkItemRelation(Map<String, Object> ccMsg)
	throws Exception
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();

		// サービス契約番号（ネット）
		String svcKeiNoNet = (String)ccMsg.get(SVC_KEI_NO_NET);

		// サービス契約番号（電話）
		String svcKeiNoTel = (String)ccMsg.get(SVC_KEI_NO_TEL);

		// サービス契約番号（TV）
		String svcKeiNoTv = (String)ccMsg.get(SVC_KEI_NO_TV);

		// サービス契約番号（ネット）、サービス契約番号（電話）、サービス契約番号（TV）の
		// すべてが未設定の場合
		if (JKKStringUtil.isNullBlank(svcKeiNoNet) && JKKStringUtil.isNullBlank(svcKeiNoTel) && JKKStringUtil.isNullBlank(svcKeiNoTv))
		{
			// 単関連チェックエラー
			errList.add(getReqRelationErrInfMap());
		}

		// エラーが存在する場合
		if (errList.size() > 0)
		{
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}

		return true;

	}

	/**
	 * 単関連チェックの必須エラーマップ作成メソッドです。
	 * 
	 * @return
	 */
	private Map<String, String> getReqRelationErrInfMap()
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1101);
		returnMap.put(ERROR_MESSAGE, "");

		return returnMap;
	}

}
