/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKFmtcelIdoInfAdd
*   ソースファイル名：JKKFmtcelIdoInfAdd.java
*   作成者          ：富士通
*   日付            ：2012年07月25日
*＜機能概要＞
*   フェムトセル異動情報登録部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00.00    2012/07/25   FJ）        新規作成
*  v12.00.00    2015/01/08   FJ)三村     【ANK-2442-00-00】【障害】【OM-2014-0003663】　E→G切替工事中にフェムトセルで「引越し中」のエラーを返却してしまう
*  v25.00.00    2016/07/07   FJ)江藤     【OM-2016-0001521】住所変更解約処理の見直し
*
**********************************************************************/
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.custom.constant.JKKFmtcelIdoInfAddConstCC;
import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.common.constant.JKKStrConst;
import eo.common.util.JKKCommonUtil;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0351A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0351B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0361A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2421D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0011B030CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0011B030CBSMsg1List;

/**
 * フェムトセル異動情報登録部品です。<p>
 * <br>
 * @author FJ
 */
public class JKKFmtcelIdoInfAdd extends AbstractCommonComponent
{
	/** エラーメッセージ ：INVALID_RETURN_MESSAGE */
	public static final String ERR_MSG_INVALID_RET_MSG = "INVALID_RETURN_MESSAGE";

	/** エラーメッセージ：処理対象外の異動区分 */
	private static final String ERR_MSG_TG_GAI_IDO_DIV = "処理対象外の異動区分です。";

	/** エラーメッセージ：パラメータ設定不正 */
	private static final String ERR_MSG_PARAM = "リクエストパラメータに誤りがあります。";

	/** サービスインタフェース呼び出しで使用するマッパー群 */
	private JKKFmtcelIdoInfAddMapperCC mapper = null;
	
	/** SC呼び出し部品 */
	ServiceComponentRequestInvoker scCall = null;

	/**
	 * フェムトセル異動情報登録の初期処理です。
	 * <br>
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @throws Throwable 
	 */
	private void init(IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		// マッパーの初期化
		if (null == this.mapper)
		{
			this.mapper = new JKKFmtcelIdoInfAddMapperCC();
		}

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
		if (null == this.scCall)
		{
			this.scCall = new ServiceComponentRequestInvoker();
		}

		// リターンコードに正常を設定
		param.setControlMapData(SCControlMapKeys.RETURN_CODE, JCMConstants.RET_NORMAL);
	}

	/**
	 * フェムトセル異動情報の登録処理を行います。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param trgtData 対象データ
	 * @param fixedText ユーザ任意文字列
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public void addFmtcelIdoInf(SessionHandle handle, IRequestParameterReadWrite param, HashMap trgtData, String fixedText)
	throws Throwable
	{
		init(param, fixedText);

		// 対象データから業務情報を取得
		String sysid = (String)trgtData.get(JKKFmtcelIdoInfAddConstCC.SYSID);
		String svcKeiNo = (String)trgtData.get(JKKFmtcelIdoInfAddConstCC.SVC_KEI_NO);
		String opSvcKeiNo = (String)trgtData.get(JKKFmtcelIdoInfAddConstCC.OP_SVC_KEI_NO);
		String idoDiv = (String)trgtData.get(JKKFmtcelIdoInfAddConstCC.IDO_DIV);

		// 入力パラメータチェック処理
		String errMsg = chkInput(handle, param, trgtData);
		if (!JKKCommonUtil.isNull(errMsg))
		{
			// 処理対象外の場合
			if (ERR_MSG_TG_GAI_IDO_DIV.equals(errMsg))
			{
				// 処理終了
				return;
			}
			else
			{
				// チェックエラー
				throw new CCException(errMsg, new Exception());
			}
		}

		// フェムトセルオプション取得処理
		List<HashMap> fmtcelOpList = getFmtcelOp(handle, param, fixedText, idoDiv, sysid, svcKeiNo, opSvcKeiNo);

		for (HashMap fmtcelOp : fmtcelOpList)
		{
			// フェムトセル異動通知登録処理
			addFmtcelIdoTchi(handle, param, fixedText, trgtData, fmtcelOp);
		}
	}

	/**
	 * 入力パラメータのチェックを行います。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param trgtData 対象データ
	 * @return エラーメッセージ
	 */
	@SuppressWarnings("unchecked")
	private String chkInput(SessionHandle handle, IRequestParameterReadWrite param, HashMap trgtData)
	{
		// 必須チェック
		String idoDiv = (String)trgtData.get(JKKFmtcelIdoInfAddConstCC.IDO_DIV);
		String prgDtm = (String)trgtData.get(JKKFmtcelIdoInfAddConstCC.PRG_DTM);
		String fmtcelIdoDtlCd = (String)trgtData.get(JKKFmtcelIdoInfAddConstCC.FMTCEL_IDO_DTL_CD);

		// 異動区分、進捗年月日時分秒、フェムトセル異動詳細コードが設定されていない
		if (JKKCommonUtil.isNull(idoDiv) || JKKCommonUtil.isNull(prgDtm) || JKKCommonUtil.isNull(fmtcelIdoDtlCd))
		{
			return ERR_MSG_PARAM + "必須項目が設定されていません。";
		}

		// 処理対象異動チェック
		// 入力パラメータ.異動区分が「オプション設定」「キャンセル」「回復」「強制解約」「解約」「撤去(解約)」
		// 「住所変更・登録」「住所変更・確定」「休止受付」「休止変更・予約取消」「移設工事」「お客様情報変更」
		// 「お客様分割」「お客様併合」「サービス追加」「住所一括更新」以外の場合
		if (!JKKStrConst.CD00576_00031.equals(idoDiv) && !JKKStrConst.CD00576_CNCL.equals(idoDiv)
			&& !JKKStrConst.CD00576_KAIHK.equals(idoDiv) && !JKKStrConst.CD00576_KSI_DSL.equals(idoDiv)
			&& !JKKStrConst.CD00576_DSL.equals(idoDiv) && !JKKStrConst.CD00576_TK_DSL.equals(idoDiv)
			&& !JKKStrConst.CD00576_ADCHG_ADD.equals(idoDiv) && !JKKStrConst.CD00576_ADCHG_FIX.equals(idoDiv)
			&& !JKKStrConst.CD00576_PAUSE_UK.equals(idoDiv) && !JKKStrConst.CD00576_PAUSE_CHG_RSV_CL.equals(idoDiv)
			&& !JKKStrConst.CD00576_ISETSU_KJ.equals(idoDiv) && !JKKStrConst.CD00576_CUST_INFO_CHG.equals(idoDiv)
			&& !JKKStrConst.CD00576_CUST_BNKT.equals(idoDiv) && !JKKStrConst.CD00576_CUST_HEIGO.equals(idoDiv)
			&& !JKKStrConst.CD00576_00002.equals(idoDiv) && !JKKStrConst.CD00576_AD_IKT_UPD.equals(idoDiv))
		{
			// 異動情報登録処理の対象外
			return ERR_MSG_TG_GAI_IDO_DIV;
		}

		String sysid = (String)trgtData.get(JKKFmtcelIdoInfAddConstCC.SYSID);
		String svcKeiNo = (String)trgtData.get(JKKFmtcelIdoInfAddConstCC.SVC_KEI_NO);
		String opSvcKeiNo = (String)trgtData.get(JKKFmtcelIdoInfAddConstCC.OP_SVC_KEI_NO);

		// 入力パラメータ.SYSIDを基に処理を行う異動区分の場合
		if (isSysid(idoDiv))
		{
			if (JKKCommonUtil.isNull(sysid))
			{
				// SYSIDが設定されていないのでエラー
				return ERR_MSG_PARAM + "SYSIDが設定されていません。";
			}
		}
		// 入力パラメータ.サービス契約番号を基に処理を行う異動区分の場合
		else
		{
			if (JKKCommonUtil.isNull(svcKeiNo))
			{
				// サービス契約番号が設定されていないのでエラー
				return ERR_MSG_PARAM + "サービス契約番号が設定されていません。";
			}
		}

		// 入力パラメータ.オプションサービス契約番号を基に処理を行う異動区分で、オプションサービス契約番号が設定されていない場合
		if (isOpSvcKeiNo(idoDiv) && JKKCommonUtil.isNull(opSvcKeiNo))
		{
			return ERR_MSG_PARAM + "オプションサービス契約番号が設定されていません。";
		}

		// チェックOK
		return "";
	}

	/**
	 * オプションサービス契約・オプションサービス契約<ISP>の一覧照会を行い、利用中のフェムトセルオプションを取得します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param idoDiv 異動区分
	 * @param sysid SYSID
	 * @param svcKeiNo サービス契約番号
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return フェムトセルオプションデータリスト
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private List<HashMap> getFmtcelOp(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			String idoDiv, String sysid, String svcKeiNo, String opSvcKeiNo)
	throws Throwable
	{
		// フェムトセルオプションデータリスト
		List<HashMap> fmtcelOpList = new ArrayList<HashMap>();

		// オプションサービス契約を取得するサービス契約番号
		List<String> svcKeiNoList = new ArrayList<String>();

		// SYSIDを基に処理を行う異動の場合のみ、SYSIDからサービス契約を取得する
		if (isSysid(idoDiv))
		{
			// サービス契約一覧照会(SYSID)処理を呼び出す
			CAANMsg[] msgListEKK0081B002 = searchSvcKei(handle, param, fixedText, sysid);
			for (CAANMsg msgEKK0081B002 : msgListEKK0081B002)
			{
				// サービス契約ステータスが「サービス提供中」の場合
				if (JKKStrConst.CD00037_SVCTK_CHU.equals(msgEKK0081B002.getString(EKK0081B002CBSMsg1List.SVC_KEI_STAT)))
				{
					svcKeiNoList.add(msgEKK0081B002.getString(EKK0081B002CBSMsg1List.SVC_KEI_NO));
				}
			}
		}
		// サービス契約番号を基に処理を行う異動の場合
		else
		{
			svcKeiNoList.add(svcKeiNo);
		}

		// 利用中オプションサービス契約取得
		for (String trgtSvcKeiNo : svcKeiNoList)
		{
			// 利用中オプションサービス契約一覧照会処理を呼び出す
			// 2012/10/23 IT1-2012-0001563 MOD START サービスインターフェースを変更
			CAANMsg[] msgListEKK0351B010 = searchUseChuOpSvcKei(handle, param, fixedText, trgtSvcKeiNo);
			for (CAANMsg msgEKK0351B010 : msgListEKK0351B010)
			{
				String trgtOpSvcKeiNo = msgEKK0351B010.getString(EKK0351B010CBSMsg1List.OP_SVC_KEI_NO);
//			CAANMsg[] msgListEKK0351B005 = searchUseChuOpSvcKei(handle, param, fixedText, trgtSvcKeiNo);
//			for (CAANMsg msgEKK0351B005 : msgListEKK0351B005)
//			{
//				String opSvcCd = msgEKK0351B005.getString(EKK0351B005CBSMsg1List.OP_SVC_CD);
//				String trgtOpSvcKeiNo = msgEKK0351B005.getString(EKK0351B005CBSMsg1List.OP_SVC_KEI_NO);
//
//				// オプションサービスコードが「フェムトセル」の場合
//				if (JKKStrConst.OP_SVC_CD_FMTCEL.equals(opSvcCd))
//				{
			// 2012/10/23 IT1-2012-0001563 MOD END サービスインターフェースを変更

				// オプションサービス契約<ISP>取得
				CAANMsg msgEKK0361A010 = null;
				// 入力パラメータ.オプションサービス契約番号を基に処理を行う異動区分の場合
				// OM-2016-0001521 「住所変更・確定」でオプションサービス契約番号が指定されている場合、オプションサービス契約番号を基に処理するよう修正 2016/07/07 MOD START
//				if (isOpSvcKeiNo(idoDiv))
				if (isOpSvcKeiNo(idoDiv, opSvcKeiNo))
				// OM-2016-0001521 「住所変更・確定」でオプションサービス契約番号が指定されている場合、オプションサービス契約番号を基に処理するよう修正 2016/07/07 MOD END
				{
					// 入力パラメータ.オプションサービス契約番号と一致する場合
					if (trgtOpSvcKeiNo.equals(opSvcKeiNo))
					{
						// オプションサービス契約<ISP>一意照会処理を呼び出す
						msgEKK0361A010 = searchOpsvkeiIsp(handle, param, fixedText, trgtOpSvcKeiNo);
					}
				}
				// 入力パラメータ.オプションサービス契約番号を基に処理を行う異動区分でない場合
				else
				{
					// オプションサービス契約<ISP>一意照会処理を呼び出す
					msgEKK0361A010 = searchOpsvkeiIsp(handle, param, fixedText, trgtOpSvcKeiNo);
				}
				// オプションサービス契約<ISP>一意照会結果を取得した場合
				if (msgEKK0361A010 != null)
				{
					// ▼▼▼▼▼ 2012/12/27 ADD START ▼▼▼▼▼
					// オプションサービス契約一意照会処理を呼び出す
					CAANMsg msgEKK0351A010 = searchOpsvkei(handle, param, fixedText, trgtOpSvcKeiNo);

					// OM-2013-0003127 既にフェムトセルが解約済であってもフェムトセル異動情報が出力される 2013/10/11 START
//					// ※下記条件の場合、異動通知を出力しない
//					// @フェムトセルオプション単体で「解約」「キャンセル」されている
//					// A異動区分が「キャンセル」「解約」「強制解約」「撤去解約」「休止受付」
//					String tmpIdoDiv        = msgEKK0351A010.getString(EKK0351A010CBSMsg1List.IDO_DIV);
					String trgtOpSvcKeiStat = msgEKK0351A010.getString(EKK0351A010CBSMsg1List.OP_SVC_KEI_STAT);
//					if (
//							JKKStrConst.CD00576_00031.equals(tmpIdoDiv)
//							&& (
//									JKKStrConst.CD00037_DSL_ZM.equals(trgtOpSvcKeiStat)
//									|| JKKStrConst.CD00037_CANCEL_ZM.equals(trgtOpSvcKeiStat)
//							)
//							&& (
//									JKKStrConst.CD00576_CNCL.equals(idoDiv)
//									|| JKKStrConst.CD00576_KSI_DSL.equals(idoDiv)
//									|| JKKStrConst.CD00576_DSL.equals(idoDiv)
//									|| JKKStrConst.CD00576_TK_DSL.equals(idoDiv)
//									|| JKKStrConst.CD00576_PAUSE_UK.equals(idoDiv)
//							)
//					)
//					{
//						continue;
//					}
//					// ▲▲▲▲▲ 2012/12/27 ADD E N D ▲▲▲▲▲
					boolean adds = false;
					// フェムトセルオプションが解約済・キャンセル済以外の場合（フェムトセルオプションはサービス提供中未満はない）
					if (!JKKStrConst.CD00037_DSL_ZM.equals(trgtOpSvcKeiStat)
						&& !JKKStrConst.CD00037_CANCEL_ZM.equals(trgtOpSvcKeiStat))
					{
						adds = true;
					}
					// フェムトセルオプションが解約済・キャンセル済の場合
					else
					{
						// OM-2016-0001521 「住所変更・確定」でオプションサービス契約番号が指定されている場合、親サービスと同時解約は判定しないよう修正 2016/07/07 MOD START
						// オプション設定で解約された場合
//						if (JKKStrConst.CD00576_00031.equals(idoDiv))
						// 入力パラメータ.オプションサービス契約番号を基に処理を行う異動区分の場合
						if (isOpSvcKeiNo(idoDiv, opSvcKeiNo))
						// OM-2016-0001521 「住所変更・確定」でオプションサービス契約番号が指定されている場合、親サービスと同時解約は判定しないよう修正 2016/07/07 MOD END
						{
							adds = true;
						}
						// サービス契約解約系の異動の場合
						else if (JKKStrConst.CD00576_CNCL.equals(idoDiv)
							|| JKKStrConst.CD00576_KSI_DSL.equals(idoDiv)
							|| JKKStrConst.CD00576_DSL.equals(idoDiv)
							|| JKKStrConst.CD00576_TK_DSL.equals(idoDiv)
							|| JKKStrConst.CD00576_ADCHG_FIX.equals(idoDiv))
						{
							// サービス契約一意照会
							CAANMsg msgEKK0081A010 = searchSvcKei2(handle, param, fixedText, svcKeiNo);
							String mskmDtlNo = msgEKK0081A010.getString(EKK0081A010CBSMsg1List.MSKM_DTL_NO);
							String opSvcKeiMskmDtlNo = msgEKK0351A010.getString(EKK0351A010CBSMsg1List.MSKM_DTL_NO);
							// サービス契約の申込明細番号とオプションサービス契約の申込明細番号が一致する場合
							if (mskmDtlNo.equals(opSvcKeiMskmDtlNo))
							{
								adds = true;
							}
						}
					}

					if (adds)
					{
						// オプションサービス契約<ISP>一意照会結果をコピー
						HashMap fmtcelOp = msgEKK0361A010.getMsgData();
						// 親のサービス契約番号を保持しておく
						fmtcelOp.put(JKKFmtcelIdoInfAddConstCC.SVC_KEI_NO, trgtSvcKeiNo);
						// フェムトセルオプションデータリストに追加
						fmtcelOpList.add(fmtcelOp);
					}
					// OM-2013-0003127 既にフェムトセルが解約済であってもフェムトセル異動情報が出力される 2013/10/11 END
				}
//				}
			}
		}

		return fmtcelOpList;
	}

	/**
	 * フェムトセル異動通知登録サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param fmtcelOp フェムトセルオプションデータ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void addFmtcelIdoTchi(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap trgtData, HashMap fmtcelOp)
	throws Throwable
	{
		// 対象データ、フェムトセルオプションデータから業務情報を取得
		String svcKeiNo = (String)fmtcelOp.get(JKKFmtcelIdoInfAddConstCC.SVC_KEI_NO);
		String idoDiv = (String)trgtData.get(JKKFmtcelIdoInfAddConstCC.IDO_DIV);
		String fmtcelIdoDtlCd = (String)trgtData.get(JKKFmtcelIdoInfAddConstCC.FMTCEL_IDO_DTL_CD);

		// フェムトセル異動詳細コード変換
		String chgFmtcelIdoDtlCd = fmtcelIdoDtlCd;
		// 入力パラメータ.異動区分が「オプション設定」、入力パラメータ.フェムトセル異動詳細コードが「回復」の場合
		if (JKKStrConst.CD00576_00031.equals(idoDiv) && JKKStrConst.CD01420_KAIHK.equals(fmtcelIdoDtlCd))
		{
			// 工事案件一覧照会処理を呼び出す。
			CAANMsg[] msgListEKU0011B030 = searchKojiak(handle, param, fixedText, svcKeiNo);
			for (CAANMsg msgEKU0011B030 : msgListEKU0011B030)
			{
				String kojiakStat = msgEKU0011B030.getString(EKU0011B030CBSMsg1List.KOJIAK_STAT);
				String kojiakSbtCd = msgEKU0011B030.getString(EKU0011B030CBSMsg1List.KOJIAK_SBT_CD);
				// ANK-2442-00-00  E→G切替工事中にフェムトセルで「引越し中」のエラーを返却してしまう ADD START
				String kojiukoptntyidodiv = msgEKU0011B030.getString(EKU0011B030CBSMsg1List.KOJI_UK_OPTNTY_IDO_DIV);
				// ANK-2442-00-00  E→G切替工事中にフェムトセルで「引越し中」のエラーを返却してしまう ADD END
				// 工事案件ステータスが「工事完了済」未満の場合
				if (JKKStrConst.CD00474_KJ_FIN_ZM.compareTo(kojiakStat) > 0)
				{
					// 工事案件種別コードが「撤去(解約)」の場合
					if (JKKStrConst.CD00577_TK_DSL.equals(kojiakSbtCd))
					{
						// フェムトセル異動詳細コードを「撤去工事中回復」に変換
						chgFmtcelIdoDtlCd = JKKStrConst.CD01420_TK_KJ_CHU_KAIHK;
						break;
					}
					// 工事案件種別コードが「住所変更(撤去)」の場合
					// ANK-2442-00-00  E→G切替工事中にフェムトセルで「引越し中」のエラーを返却してしまう ADD START
					else if (JKKStrConst.CD00577_ADCHG_TK.equals(kojiakSbtCd) && JKKStrConst.CD00576_ADCHG_ADD.equals(kojiukoptntyidodiv))
					// ANK-2442-00-00  E→G切替工事中にフェムトセルで「引越し中」のエラーを返却してしまう ADD END
					{
						// フェムトセル異動詳細コードを「住所変更中回復」に変換
						chgFmtcelIdoDtlCd = JKKStrConst.CD01420_ADCHG_CHU_KAIHK;
						break;
					}
				}
			}
		}

		// フェムトセル異動通知登録サービスインターフェースを呼び出す
		// 上りマッピング処理
		HashMap<String, Object> inMapEKK2421D010 = this.mapper.editInMsgEKK2421D010(param, trgtData, fmtcelOp, chgFmtcelIdoDtlCd);

		// サービスインターフェース呼び出し
		callSvcInter(handle, param, fixedText, inMapEKK2421D010, new EKK2421D010CBSMsg().getContents());
	}

	/**
	 * サービス契約一覧照会(SYSID)サービスインタフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param sysid SYSID
	 * @return サービス契約一覧照会(SYSID)結果
	 * @throws Throwable
	 */
	private CAANMsg[] searchSvcKei(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String sysid)
	throws Throwable
	{
		// 上りマッピング処理
		HashMap<String, Object> inMapEKK0081B002 = this.mapper.editInMsgEKK0081B002(param, sysid);

		// サービスインターフェース呼び出し
		CAANMsg rsltMsgEKK0081B002 = callSvcInter(handle, param, fixedText, inMapEKK0081B002, new EKK0081B002CBSMsg().getContents());

		// 照会結果を返す
		return rsltMsgEKK0081B002.getCAANMsgList(EKK0081B002CBSMsg.EKK0081B002CBSMSG1LIST);
	}

	// OM-2013-0003127 既にフェムトセルが解約済であってもフェムトセル異動情報が出力される 2013/10/11 START
	/**
	 * サービス契約一意照会サービスインタフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param svcKeiNo サービス契約番号
	 * @return サービス契約一意照会結果
	 * @throws Throwable
	 */
	private CAANMsg searchSvcKei2(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String svcKeiNo)
	throws Throwable
	{
		// 上りマッピング処理
		HashMap<String, Object> inMapEKK0081A010 = this.mapper.editInMsgEKK0081A010(param, svcKeiNo);

		// サービスインターフェース呼び出し
		CAANMsg rsltMsgEKK0081A010 = callSvcInter(handle, param, fixedText, inMapEKK0081A010, new EKK0081A010CBSMsg().getContents());

		// 照会結果を返す
		CAANMsg msgEKK0081A010 = null;

		CAANMsg[] msgListEKK0081A010 = rsltMsgEKK0081A010.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
		if (msgListEKK0081A010 != null && msgListEKK0081A010.length > 0)
		{
			msgEKK0081A010 = msgListEKK0081A010[0];
		}

		return msgEKK0081A010;
	}
	// OM-2013-0003127 既にフェムトセルが解約済であってもフェムトセル異動情報が出力される 2013/10/11 END

	/**
	 * 利用中オプションサービス契約一覧照会サービスインタフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param svcKeiNo サービス契約番号
	 * @return 利用中オプションサービス契約一覧照会結果
	 * @throws Throwable
	 */
	private CAANMsg[] searchUseChuOpSvcKei(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String svcKeiNo)
	throws Throwable
	{
		// 2012/10/23 IT1-2012-0001563 MOD START サービスインターフェースを変更
		// 上りマッピング処理
		HashMap<String, Object> inMapEKK0351B010 = this.mapper.editInMsgEKK0351B010(param, svcKeiNo, JKKStrConst.OP_SVC_CD_FMTCEL);

		// サービスインターフェース呼び出し
		CAANMsg rsltMsgEKK0351B010 = callSvcInter(handle, param, fixedText, inMapEKK0351B010, new EKK0351B010CBSMsg().getContents());

		// 照会結果を返す
		return rsltMsgEKK0351B010.getCAANMsgList(EKK0351B010CBSMsg.EKK0351B010CBSMSG1LIST);
//		// 上りマッピング処理
//		HashMap<String, Object> inMapEKK0351B005 = this.mapper.editInMsgEKK0351B005(param, svcKeiNo);
//
//		// サービスインターフェース呼び出し
//		CAANMsg rsltMsgEKK0351B005 = callSvcInter(handle, param, fixedText, inMapEKK0351B005, new EKK0351B005CBSMsg().getContents());
//
//		// 照会結果を返す
//		return rsltMsgEKK0351B005.getCAANMsgList(EKK0351B005CBSMsg.EKK0351B005CBSMSG1LIST);
		// 2012/10/23 IT1-2012-0001563 MOD END サービスインターフェースを変更
	}

	/**
	 * オプションサービス契約<ISP>一意照会サービスインタフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return オプションサービス契約<ISP>一意照会結果
	 * @throws Throwable
	 */
	private CAANMsg searchOpsvkeiIsp(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String opSvcKeiNo)
	throws Throwable
	{
		// 上りマッピング処理
		HashMap<String, Object> inMapEKK0361A010 = this.mapper.editInMsgEKK0361A010(param, opSvcKeiNo);

		// サービスインターフェース呼び出し
		CAANMsg rsltMsgEKK0361A010 = callSvcInter(handle, param, fixedText, inMapEKK0361A010, new EKK0361A010CBSMsg().getContents());

		// 照会結果を返す
		CAANMsg msgEKK0361A010 = null;

		CAANMsg[] msgListEKK0361A010 = rsltMsgEKK0361A010.getCAANMsgList(EKK0361A010CBSMsg.EKK0361A010CBSMSG1LIST);
		if (msgListEKK0361A010 != null && msgListEKK0361A010.length > 0)
		{
			msgEKK0361A010 = msgListEKK0361A010[0];
		}

		return msgEKK0361A010;
	}

	/**
	 * 工事案件一覧照会(複合検索)のサービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param svcKeiNo サービス契約番号
	 * @return サービス契約一覧照会(SYSID)結果
	 * @throws Throwable
	 */
	private CAANMsg[] searchKojiak(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String svcKeiNo)
	throws Throwable
	{
		// 上りマッピング処理
		HashMap<String, Object> inMapEKU0011B030 = this.mapper.editInMsgEKU0011B030(param, svcKeiNo);

		// サービスインターフェース呼び出し
		CAANMsg rsltMsgEKU0011B030 = callSvcInter(handle, param, fixedText, inMapEKU0011B030, new EKU0011B030CBSMsg().getContents());

		// 照会結果を返す
		return rsltMsgEKU0011B030.getCAANMsgList(EKU0011B030CBSMsg.EKU0011B030CBSMSG1LIST);
	}

	/**
	 * 入力パラメータ.SYSIDを基に処理を行う異動区分かどうかを返します。
	 * <br>
	 * @param idoDiv 異動区分
	 * @return SYSIDを基に処理を行う異動区分の場合はtrue、そうでない場合はfalse
	 */
	private boolean isSysid(String idoDiv)
	{
		// 異動区分が「お客様情報変更」「お客様分割」「お客様併合」「サービス追加」「住所一括更新」の場合
		if (JKKStrConst.CD00576_CUST_INFO_CHG.equals(idoDiv) || JKKStrConst.CD00576_CUST_BNKT.equals(idoDiv)
			|| JKKStrConst.CD00576_CUST_HEIGO.equals(idoDiv) || JKKStrConst.CD00576_00002.equals(idoDiv)
			|| JKKStrConst.CD00576_AD_IKT_UPD.equals(idoDiv))
		{
			return true;
		}

		return false;
	}

	/**
	 * 入力パラメータ.オプションサービス契約番号が必須の異動区分かどうかを返します。
	 * <br>
	 * @param idoDiv 異動区分
	 * @return 必須の場合はtrue、そうでない場合はfalse
	 */
	private boolean isOpSvcKeiNo(String idoDiv)
	{
		// 異動区分が「オプション設定」の場合
		if (JKKStrConst.CD00576_00031.equals(idoDiv))
		{
			return true;
		}
		
		return false;
	}
	// OM-2016-0001521 「住所変更・確定」でオプションサービス契約番号が指定されている場合、親サービスと同時解約は判定しないよう修正 2016/07/07 ADD START
	/**
	 * 入力パラメータ.オプションサービス契約番号を基に処理を行う異動区分かどうかを返します。
	 * <br>
	 * @param idoDiv 異動区分
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return オプションサービス契約番号を基に処理を行う異動区分の場合はtrue、そうでない場合はfalse
	 */
	private boolean isOpSvcKeiNo(String idoDiv, String opSvcKeiNo)
	{
		// 異動区分が「オプション設定」「住所変更・確定」
		// 且つ、オプションサービス契約番号が指定されている場合
		if ((JKKStrConst.CD00576_00031.equals(idoDiv) 
				|| JKKStrConst.CD00576_ADCHG_FIX.equals(idoDiv)
			 )
			 && !JKKStringUtil.isNullBlank(opSvcKeiNo)
			)
		{
			return true;
		}
		
		return false;
	}
	// OM-2016-0001521 「住所変更・確定」でオプションサービス契約番号が指定されている場合、親サービスと同時解約は判定しないよう修正 2016/07/07 ADD END
	/*
	 * --------------------------------------------------------------------------------------------
	 *  以下共通で使用するUtil系のメソッド ↓↓↓↓↓
	 * --------------------------------------------------------------------------------------------
	 */

	/**
	 * サービスインターフェース呼び出し処理です。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param siInMap サービスインターフェースの入力マップ
	 * @param contents サービスインターフェースのテンプレート項目の配列
	 * @return 業務データ
	 * @throws Throwable 
	 */
	private CAANMsg callSvcInter(
			SessionHandle handle,
			IRequestParameterReadWrite param,
			String fixedText,
			HashMap<String, Object> siInMap,
			Object[][] contents)
			throws Throwable
	{
		
		// サービスインターフェースの呼び出し
		Map<?, ?> rsltMap = this.scCall.run(siInMap, handle);
		// エラーマッピング処理
		this.mapper.editResultRP(rsltMap, param, fixedText, contents);
		// エラーチェック処理
		errChk(rsltMap);
		// 業務データ取得処理
		CAANMsg workData = getWorkCAANMsg(rsltMap);

		return workData;
	}

	/**
	 * エラーチェック処理です。
	 * <br>
	 * @param msgList サービスインタフェース実行結果
	 * @throws SCCallException 
	 */
	private void errChk(
			Map<?, ?> msgList) 
			throws SCCallException
	{
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);

		// ステータス取得
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if ((0 != returnCode.intValue()) || (0 != templateStatus))
		{
			String errMsg = ERR_MSG_INVALID_RET_MSG;
			throw new SCCallException(errMsg, String.valueOf(returnCode), templateStatus);
		}
	}

	/**
	 * 業務データの取得処理です。
	 * <br>
	 * @param workMapKey 業務データのマップキー
	 * @param rslt SVIFの実行結果データ
	 * @return 業務データ
	 */
	private CAANMsg getWorkCAANMsg(Map<?, ?> rslt)
	{
		CAANMsg[] templates = (CAANMsg[])rslt.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];

		return parentTemplate;
	}

	/**
	 * オプションサービス契約一意照会サービスインタフェースを呼び出します。
	 * <br>
	 * @param	handle		セッションマネージャなどを持ったハンドル
	 * @param	param		モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param	fixedText	ユーザ任意文字列
	 * @param	opSvcKeiNo	オプションサービス契約番号
	 * @return				オプションサービス契約一意照会結果
	 * @throws	Throwable
	 */
	private CAANMsg searchOpsvkei(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String opSvcKeiNo)
	throws Throwable
	{
		// 上りマッピング処理
		HashMap<String, Object> inMapEKK0351A010 = this.mapper.editInMsgEKK0351A010(param, opSvcKeiNo);

		// サービスインターフェース呼び出し
		CAANMsg rsltMsgEKK0351A010 = callSvcInter(handle, param, fixedText, inMapEKK0351A010, new EKK0351A010CBSMsg().getContents());

		// 照会結果を返す
		CAANMsg msgEKK0351A010 = null;

		CAANMsg[] msgListEKK0351A010 = rsltMsgEKK0351A010.getCAANMsgList(EKK0351A010CBSMsg.EKK0351A010CBSMSG1LIST);
		if (msgListEKK0351A010 != null && msgListEKK0351A010.length > 0)
		{
			msgEKK0351A010 = msgListEKK0351A010[0];
		}

		return msgEKK0351A010;
	}
}
