/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKSvkeiSkekkaUpdCC
*   ソースファイル名：JKKSvkeiSkekkaUpdCC.java
*   作成者          ：富士通
*   日付            ：2015年01月05日
*＜機能概要＞
*   サービス契約審査結果更新CCです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*  v12.00.00    2015/01/05   FJ)江藤     新規作成（【ANK-2384-00-00】住変パターン識別フラグの追加）
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKSvkeiSkekkaUpdConstCC;
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.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0091A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0091C040CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0101A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0101C040CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0111A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0111C040CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0121A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0121C040CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0141A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0141C040CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg;

/**
 * サービス契約審査結果更新CCです。<p>
 * <br>
 * @author FJ
 */
public class JKKSvkeiSkekkaUpdCC extends AbstractCommonComponent
{
	/** エラーメッセージ */
	public static final String ERR_MSG = "INVALID_RETURN_MESSAGE";

	/** エラーメッセージ：パラメータ設定不正 */
	private static final String ERR_MSG_PARAM = "リクエストパラメータに誤りがあります。";

	/** サービスインタフェース呼び出しで使用するマッパー群 */
	private JKKSvkeiSkekkaUpdMapperCC mapper = null;

	/** SC呼び出し部品 */
	ServiceComponentRequestInvoker scCall = null;

	/** サービス種別コード　1：eo光ネット */
	public static final int SVC_SBT_CD_EOHNT = 1;
	
	/** サービス種別コード　2：eo光TV */
	public static final int SVC_SBT_CD_EOHTV = 2;
	
	/** サービス種別コード　3：eo光電話 */
	public static final int SVC_SBT_CD_EOHTL = 3;
	
	/** サービス種別コード　4：eoモバイル */
	public static final int SVC_SBT_CD_EOMOBA = 4;
	
	/** サービス種別コード　5：eoADSL */
	public static final int SVC_SBT_CD_EOADSL = 5; 

	/**
	 * サービス契約審査結果更新の初期処理です。
	 * <br>
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @throws Throwable 
	 */
	private void init(IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		// マッパーの初期化
		if (null == this.mapper)
		{
			this.mapper = new JKKSvkeiSkekkaUpdMapperCC();
		}

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
		if (null == this.scCall)
		{
			this.scCall = new ServiceComponentRequestInvoker();
		}

		// リターンコードに正常を設定
		param.setControlMapData(SCControlMapKeys.RETURN_CODE, JCMConstants.RET_NORMAL);
	}

	/**
	 * サービス契約審査結果更新処理を行います。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite runSvkeiSkekkaUpd(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		JKKBpCommon.printBpDebugLog(this.getClass(), "【サービス契約審査結果更新CC】start");
		
		init(param, fixedText);
		
		// 対象データ取得
		HashMap inMap = (HashMap)param.getData(fixedText);
		
		// 対象データリスト取得
		ArrayList<HashMap<String, Object>> trgtDataList = (ArrayList<HashMap<String, Object>>)inMap.get(JKKSvkeiSkekkaUpdConstCC.TRGT_DATA_LIST);
		
		// 対象データリスト数分ループ
		for (HashMap<String, Object> trgtData : trgtDataList)
		{
			// 入力パラメータチェック処理
			String errMsg = chkInput(handle, param, trgtData);
			
			if (!JKKCommonUtil.isNull(errMsg))
			{
				// チェックエラー
				throw new CCException("", new SCCallException(errMsg, String.valueOf(9051), 8011));
			}
			
			// サービス契約一意照会
			CAANMsg msgEKK0081A010 = searchSvKei(handle, param, fixedText, trgtData);
			
			// 審査結果更新判定
			if (isExecuteCheck(handle, param, fixedText, trgtData, msgEKK0081A010))
			{
				JKKBpCommon.printBpDebugLog(this.getClass(), "【サービス契約審査結果更新CC】 審査結果更新判定 true");
				
				// 審査結果更新処理
				updSkekka(handle, param, fixedText, trgtData, msgEKK0081A010);
				
				// 進捗一覧照会
				CAANMsg[] msgListEKK1091B001 = searchPrg(handle, param, fixedText, (String)trgtData.get(JKKSvkeiSkekkaUpdConstCC.SVC_KEI_NO), (String)trgtData.get(JKKSvkeiSkekkaUpdConstCC.IDO_DIV));
					
				// 進捗登録処理
				addPrg(handle, param, fixedText, trgtData, msgEKK0081A010, msgListEKK1091B001);
			}
			else
			{
				JKKBpCommon.printBpDebugLog(this.getClass(), "【サービス契約審査結果更新CC】審査結果更新判定 false");
			}
			
		}
		
		JKKBpCommon.printBpDebugLog(this.getClass(), "【サービス契約審査結果更新CC】サービス契約審査結果更新CC end");
		
		return param;
	}
	
	/**
	 * 入力パラメータのチェックを行います。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param trgtData 対象データ
	 * @return エラーメッセージ
	 */
	private String chkInput(SessionHandle handle, IRequestParameterReadWrite param, HashMap<String, Object> trgtData)
	{
		// サービス契約番号が設定されていない
		String wkStr = null;
		wkStr = (String)trgtData.get(JKKSvkeiSkekkaUpdConstCC.SVC_KEI_NO);
		
		JKKBpCommon.printBpDebugLog(this.getClass(), "【サービス契約審査結果更新CC】 サービス契約番号:" + wkStr);
		
		if (JKKCommonUtil.isNull(wkStr))
		{
			return ERR_MSG_PARAM + "サービス契約番号が設定されていません。";
		}
		
		// 異動区分が設定されていない
		wkStr = (String)trgtData.get(JKKSvkeiSkekkaUpdConstCC.IDO_DIV);
		JKKBpCommon.printBpDebugLog(this.getClass(), "【サービス契約審査結果更新CC】 異動区分:" + wkStr);
		if (JKKCommonUtil.isNull(wkStr))
		{
			return ERR_MSG_PARAM + "異動区分が設定されていません。";
		}
		
		// 申込明細番号が設定されていない
		wkStr = (String)trgtData.get(JKKSvkeiSkekkaUpdConstCC.MSKM_DTL_NO);
		JKKBpCommon.printBpDebugLog(this.getClass(), "【サービス契約審査結果更新CC】 申込明細番号:" + wkStr);
		if (JKKCommonUtil.isNull(wkStr))
		{
			return ERR_MSG_PARAM + "申込明細番号が設定されていません。";
		}
		
		// チェックOK
		return "";
	}

	/**
	 * 審査結果更新を実行するか判定を行います。<br>
	 * 下記条件を全て満たす場合、True<br>
	 * ・審査結果補記コードが設定されていない<br>
	 * ・審査結果詳細コードが設定されている<br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param msgEKK0081A010 サービス契約一意照会結果
	 * @return true:実行する、false:実行しない
	 */
	private boolean isExecuteCheck(
			SessionHandle handle
			, IRequestParameterReadWrite param
			, String fixedText
			, HashMap<String, Object> trgtData
			, CAANMsg msgEKK0081A010
			)
	{
		
		boolean result = false;
		
		// 審査結果補記コード
		String skekkaHokiCd = msgEKK0081A010.getString(EKK0081A010CBSMsg1List.SKEKKA_HOKI_CD);
		
		// 審査結果詳細コード
		String skekkaDtlCd = msgEKK0081A010.getString(EKK0081A010CBSMsg1List.SKEKKA_DTL_CD);
		
		if (JKKBpCommon.isNull(skekkaHokiCd)
				&& !JKKBpCommon.isNull(skekkaDtlCd)
			)
		{
			result = true;
		}
		
		// チェックOK
		return result;
	}
	
	/**
	 * 審査結果更新処理
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param msgEKK0081A010 サービス契約一意照会結果
	 * @return 
	 */
	private void updSkekka(
			SessionHandle handle
			, IRequestParameterReadWrite param
			, String fixedText
			, HashMap<String, Object> trgtData
			, CAANMsg msgEKK0081A010
			)
	throws Throwable
	{
		
		// サービス毎に情報変更のSIFを呼び出し、審査結果コードの更新を行う。
		int svcSbtCd = getSvcSbtCd(msgEKK0081A010.getString(EKK0081A010CBSMsg1List.SVC_CD), msgEKK0081A010.getString(EKK0081A010CBSMsg1List.PRC_GRP_CD));
		
		switch (svcSbtCd)
		{
			// eo光ネット
			case SVC_SBT_CD_EOHNT:
				
				JKKBpCommon.printBpDebugLog(this.getClass(), "【サービス契約審査結果更新CC】 eo光ネット");
				
				// サービス契約＜eo光ネット＞一意照会処理
				CAANMsg msgEKK0091A010 = searchSvKeiEohnt(handle, param, fixedText, trgtData, msgEKK0081A010);
				
				// 審査結果更新（eoネット）処理
				updSkekkaEohnt(handle, param, fixedText, trgtData, msgEKK0081A010, msgEKK0091A010);
				
				break;
				
			// eo光電話
			case SVC_SBT_CD_EOHTL:
				
				JKKBpCommon.printBpDebugLog(this.getClass(), "【サービス契約審査結果更新CC】 eo光電話");
				
				// サービス契約＜eo光電話＞一意照会処理
				CAANMsg msgEKK0111A010 = searchSvKeiEohtl(handle, param, fixedText, trgtData, msgEKK0081A010);
				
				// 審査結果更新（eo光電話）処理
				updSkekkaEohtl(handle, param, fixedText, trgtData, msgEKK0081A010, msgEKK0111A010);
				
				break;
			
			// eo光TV
			case SVC_SBT_CD_EOHTV:
				
				JKKBpCommon.printBpDebugLog(this.getClass(), "【サービス契約審査結果更新CC】 eo光TV");
				
				// サービス契約＜eo光TV＞一意照会処理
				CAANMsg msgEKK0101A010 = searchSvKeiEohtv(handle, param, fixedText, trgtData, msgEKK0081A010);
				
				// 審査結果更新（eo光TV）処理
				updSkekkaEohtv(handle, param, fixedText, trgtData, msgEKK0081A010, msgEKK0101A010);
				
				break;
			
			// eoモバイル
			case SVC_SBT_CD_EOMOBA:
				
				JKKBpCommon.printBpDebugLog(this.getClass(), "【サービス契約審査結果更新CC】 eoモバイル");
				
				// サービス契約＜eoモバイル＞一意照会処理
				CAANMsg msgEKK0121A010 = searchSvKeiEomoba(handle, param, fixedText, trgtData, msgEKK0081A010);
				
				// 審査結果更新（eoモバイル）処理
				updSkekkaEomoba(handle, param, fixedText, trgtData, msgEKK0081A010, msgEKK0121A010);
				
				break;
			
			// eoADSL
			default:
				
				JKKBpCommon.printBpDebugLog(this.getClass(), "【サービス契約審査結果更新CC】 eoADSL");
				
				// サービス契約＜eoADSL＞一意照会処理
				CAANMsg msgEKK0141A010 = searchSvKeiEoadsl(handle, param, fixedText, trgtData, msgEKK0081A010);
				
				// 審査結果更新（eoADSL）処理
				updSkekkaEoadsl(handle, param, fixedText, trgtData, msgEKK0081A010, msgEKK0141A010);
				
				break;
				
		}
		
	}
	
	
	/**
	 * サービス種別コードの取得処理です。
	 * サービスコード、料金グループコードからサービスを判定する。
	 * <br>
	 * @param svcCd サービスコード
	 * @param prcGrpCd 料金グループコード
	 * @return サービス種別コード
	 */
	private int getSvcSbtCd(String svcCd, String prcGrpCd)
	{
		int svcSbtCd = SVC_SBT_CD_EOHNT;
		
		// インターネットサービス
		if (JKKStrConst.CD00130_01.equals(svcCd))
		{
			//  eo光ネットホームタイプ or eo光ネットメゾンタイプ or eo光ネットマンションタイプ
			if (JKKStrConst.CD00133_02.equals(prcGrpCd) 
					|| JKKStrConst.CD00133_03.equals(prcGrpCd)
					||JKKStrConst.CD00133_04.equals(prcGrpCd)
				)
			{
				// eo光ネット
				svcSbtCd = SVC_SBT_CD_EOHNT;
			}
			// eoADSL(eAccess) or eoADSL(フレッツ)
			else if (JKKStrConst.CD00133_05.equals(prcGrpCd)
					 	|| JKKStrConst.CD00133_06.equals(prcGrpCd)
					)
			{
				// eoADSL
				svcSbtCd = SVC_SBT_CD_EOADSL;
			}
			// 上記以外(モバイル)
			else
			{
				// eoモバイル
				svcSbtCd = SVC_SBT_CD_EOMOBA;
			}
		}
		// 電話サービス
		else if (JKKStrConst.CD00130_02.equals(svcCd))
		{
			// eo光電話
			svcSbtCd = SVC_SBT_CD_EOHTL;
		}
		// 上記以外（テレビサービス）
		else
		{
			// eo光TV
			svcSbtCd = SVC_SBT_CD_EOHTV;
		}
		
		return svcSbtCd;
	}

	/**
	 * サービス契約一意照会処理
	 * <br>
	 * サービス契約一意照会サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @return サービス契約一意照会結果
	 * @throws Throwable
	 */
	private CAANMsg searchSvKei(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> trgtData)
	throws Throwable
	{
		// 照会結果
		CAANMsg result = null;

		// 上りマッピング処理
		HashMap<String, Object> inMap = this.mapper.editInMsgEKK0081A010(param, (String)trgtData.get(JKKSvkeiSkekkaUpdConstCC.SVC_KEI_NO));
		// サービスインターフェース呼び出し
		CAANMsg rsltMsg = callSvcInter(handle, param, fixedText, inMap, new EKK0081A010CBSMsg().getContents());

		// 結果を返却
		CAANMsg[] rsltMsgList = rsltMsg.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
		if (rsltMsgList != null && rsltMsgList.length > 0)
		{
			result = rsltMsgList[0];
		}
		else
		{
			throw new CCException("", new SCCallException("EKK0081A010の照会結果が取得できない", String.valueOf(9051), 8011));
		}

		return result;
	}

	/**
	 * サービス契約＜eo光ネット＞一意照会処理
	 * <br>
	 * サービス契約＜eo光ネット＞一意照会サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param msgEKK0081A010 サービス契約一意照会結果
	 * @return サービス契約＜eo光ネット＞一意照会結果
	 * @throws Throwable
	 */
	private CAANMsg searchSvKeiEohnt(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> trgtData, CAANMsg msgEKK0081A010)
	throws Throwable
	{
		// 照会結果
		CAANMsg result = null;

		// 上りマッピング処理
		HashMap<String, Object> inMap = this.mapper.editInMsgEKK0091A010(param, msgEKK0081A010);
		// サービスインターフェース呼び出し
		CAANMsg rsltMsg = callSvcInter(handle, param, fixedText, inMap, new EKK0091A010CBSMsg().getContents());

		// 結果を返却
		CAANMsg[] rsltMsgList = rsltMsg.getCAANMsgList(EKK0091A010CBSMsg.EKK0091A010CBSMSG1LIST);
		if (rsltMsgList != null && rsltMsgList.length > 0)
		{
			result = rsltMsgList[0];
		}
		else
		{
			throw new CCException("", new SCCallException("EKK0091A010の照会結果が取得できない", String.valueOf(9051), 8011));
		}

		return result;
	}

	/**
	 * サービス契約＜eo光TV＞一意照会処理
	 * <br>
	 * サービス契約＜eo光TV＞一意照会サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param msgEKK0081A010 サービス契約一意照会結果
	 * @return サービス契約＜eo光TV＞一意照会結果
	 * @throws Throwable
	 */
	private CAANMsg searchSvKeiEohtv(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> trgtData, CAANMsg msgEKK0081A010)
	throws Throwable
	{
		// 照会結果
		CAANMsg result = null;

		// 上りマッピング処理
		HashMap<String, Object> inMap = this.mapper.editInMsgEKK0101A010(param, msgEKK0081A010);
		// サービスインターフェース呼び出し
		CAANMsg rsltMsg = callSvcInter(handle, param, fixedText, inMap, new EKK0101A010CBSMsg().getContents());

		// 結果を返却
		CAANMsg[] rsltMsgList = rsltMsg.getCAANMsgList(EKK0101A010CBSMsg.EKK0101A010CBSMSG1LIST);
		if (rsltMsgList != null && rsltMsgList.length > 0)
		{
			result = rsltMsgList[0];
		}
		else
		{
			throw new CCException("", new SCCallException("EKK0101A010の照会結果が取得できない", String.valueOf(9051), 8011));
		}

		return result;
	}

	/**
	 * サービス契約＜eo光電話＞一意照会処理
	 * <br>
	 * サービス契約＜eo光電話＞一意照会サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param msgEKK0081A010 サービス契約一意照会結果
	 * @return サービス契約＜eo光電話＞一意照会結果
	 * @throws Throwable
	 */
	private CAANMsg searchSvKeiEohtl(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> trgtData, CAANMsg msgEKK0081A010)
	throws Throwable
	{
		// 照会結果
		CAANMsg result = null;

		// 上りマッピング処理
		HashMap<String, Object> inMap = this.mapper.editInMsgEKK0111A010(param, msgEKK0081A010);
		// サービスインターフェース呼び出し
		CAANMsg rsltMsg = callSvcInter(handle, param, fixedText, inMap, new EKK0111A010CBSMsg().getContents());

		// 結果を返却
		CAANMsg[] rsltMsgList = rsltMsg.getCAANMsgList(EKK0111A010CBSMsg.EKK0111A010CBSMSG1LIST);
		if (rsltMsgList != null && rsltMsgList.length > 0)
		{
			result = rsltMsgList[0];
		}
		else
		{
			throw new CCException("", new SCCallException("EKK0111A010の照会結果が取得できない", String.valueOf(9051), 8011));
		}

		return result;
	}
	

	/**
	 * サービス契約＜eoモバイル＞一意照会処理
	 * <br>
	 * サービス契約＜eoモバイル＞一意照会サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param msgEKK0081A010 サービス契約一意照会結果
	 * @return サービス契約＜eo光電話＞一意照会結果
	 * @throws Throwable
	 */
	private CAANMsg searchSvKeiEomoba(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> trgtData, CAANMsg msgEKK0081A010)
	throws Throwable
	{
		// 照会結果
		CAANMsg result = null;

		// 上りマッピング処理
		HashMap<String, Object> inMap = this.mapper.editInMsgEKK0121A010(param, msgEKK0081A010);
		// サービスインターフェース呼び出し
		CAANMsg rsltMsg = callSvcInter(handle, param, fixedText, inMap, new EKK0121A010CBSMsg().getContents());

		// 結果を返却
		CAANMsg[] rsltMsgList = rsltMsg.getCAANMsgList(EKK0121A010CBSMsg.EKK0121A010CBSMSG1LIST);
		if (rsltMsgList != null && rsltMsgList.length > 0)
		{
			result = rsltMsgList[0];
		}
		else
		{
			throw new CCException("", new SCCallException("EKK0121A010の照会結果が取得できない", String.valueOf(9051), 8011));
		}

		return result;
	}
	
	/**
	 * サービス契約＜eoADSL＞一意照会処理
	 * <br>
	 * サービス契約＜eoADSL＞一意照会サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param msgEKK0081A010 サービス契約一意照会結果
	 * @return サービス契約＜eo光電話＞一意照会結果
	 * @throws Throwable
	 */
	private CAANMsg searchSvKeiEoadsl(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> trgtData, CAANMsg msgEKK0081A010)
	throws Throwable
	{
		// 照会結果
		CAANMsg result = null;

		// 上りマッピング処理
		HashMap<String, Object> inMap = this.mapper.editInMsgEKK0141A010(param, msgEKK0081A010);
		// サービスインターフェース呼び出し
		CAANMsg rsltMsg = callSvcInter(handle, param, fixedText, inMap, new EKK0141A010CBSMsg().getContents());

		// 結果を返却
		CAANMsg[] rsltMsgList = rsltMsg.getCAANMsgList(EKK0141A010CBSMsg.EKK0141A010CBSMSG1LIST);
		if (rsltMsgList != null && rsltMsgList.length > 0)
		{
			result = rsltMsgList[0];
		}
		else
		{
			throw new CCException("", new SCCallException("EKK0141A010の照会結果が取得できない", String.valueOf(9051), 8011));
		}

		return result;
	}

	/**
	 * 審査結果更新（eoネット）処理<BR>
	 * サービス契約＜eo光ネット＞情報変更サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param msgEKK0081A010 サービス契約一意照会結果
	 * @param msgEKK0091A010 サービス契約＜eo光ネット＞一意照会結果
	 * @throws Throwable
	 */
	private void updSkekkaEohnt(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> trgtData, CAANMsg msgEKK0081A010, CAANMsg msgEKK0091A010)
	throws Throwable
	{
		// 上りマッピング処理
		HashMap<String, Object> inMap = this.mapper.editInMsgEKK0091C040(param, msgEKK0081A010, msgEKK0091A010);
		// サービスインターフェース呼び出し
		callSvcInter(handle, param, fixedText, inMap, new EKK0091C040CBSMsg().getContents());
	}
	
	/**
	 * 審査結果更新（eo光TV）処理<BR>
	 * サービス契約＜eo光TV＞情報変更サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param msgEKK0081A010 サービス契約一意照会結果
	 * @param msgEKK0101A010 サービス契約＜eo光TV＞一意照会結果
	 * @throws Throwable
	 */
	private void updSkekkaEohtv(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> trgtData, CAANMsg msgEKK0081A010, CAANMsg msgEKK0101A010)
	throws Throwable
	{
		// 上りマッピング処理
		HashMap<String, Object> inMap = this.mapper.editInMsgEKK0101C040(param, msgEKK0081A010, msgEKK0101A010);
		// サービスインターフェース呼び出し
		callSvcInter(handle, param, fixedText, inMap, new EKK0101C040CBSMsg().getContents());
	}
	
	/**
	 * 審査結果更新（eo光電話）処理<BR>
	 * サービス契約＜eo光電話＞情報変更サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param msgEKK0081A010 サービス契約一意照会結果
	 * @param msgEKK0111A010 サービス契約＜eo光電話＞一意照会結果
	 * @throws Throwable
	 */
	private void updSkekkaEohtl(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> trgtData, CAANMsg msgEKK0081A010, CAANMsg msgEKK0111A010)
	throws Throwable
	{
		// 上りマッピング処理
		HashMap<String, Object> inMap = this.mapper.editInMsgEKK0111C040(param, msgEKK0081A010, msgEKK0111A010);
		// サービスインターフェース呼び出し
		callSvcInter(handle, param, fixedText, inMap, new EKK0111C040CBSMsg().getContents());
	}
	
	/**
	 * 審査結果更新（eoモバイル）処理<BR>
	 * サービス契約＜eoモバイル＞情報変更サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param msgEKK0081A010 サービス契約一意照会結果
	 * @param msgEKK0121A010 サービス契約＜eoモバイル＞一意照会結果
	 * @throws Throwable
	 */
	private void updSkekkaEomoba(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> trgtData, CAANMsg msgEKK0081A010, CAANMsg msgEKK0121A010)
	throws Throwable
	{
		// 上りマッピング処理
		HashMap<String, Object> inMap = this.mapper.editInMsgEKK0121C040(param, msgEKK0081A010, msgEKK0121A010);
		// サービスインターフェース呼び出し
		callSvcInter(handle, param, fixedText, inMap, new EKK0121C040CBSMsg().getContents());
	}
	
	/**
	 * 審査結果更新（eoADSL）処理<BR>
	 * サービス契約＜eoADSL＞情報変更サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param msgEKK0081A010 サービス契約一意照会結果
	 * @param msgEKK0111C040 サービス契約＜eoADSL＞一意照会結果
	 * @throws Throwable
	 */
	private void updSkekkaEoadsl(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> trgtData, CAANMsg msgEKK0081A010, CAANMsg msgEKK0111C040)
	throws Throwable
	{
		// 上りマッピング処理
		HashMap<String, Object> inMap = this.mapper.editInMsgEKK0141C040(param, msgEKK0081A010, msgEKK0111C040);
		// サービスインターフェース呼び出し
		callSvcInter(handle, param, fixedText, inMap, new EKK0141C040CBSMsg().getContents());
	}
	
	/**
	 * 進捗登録処理
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param msgEKK0081A010 サービス契約一意照会結果
	 * @param msgListEKK1091B001 進捗一覧照会結果
	 * @return 
	 */
	private void addPrg(
			SessionHandle handle
			, IRequestParameterReadWrite param
			, String fixedText
			, HashMap<String, Object> trgtData
			, CAANMsg msgEKK0081A010
			, CAANMsg[] msgListEKK1091B001
			)
	throws Throwable
	{
		
		// 上りマッピング処理
		HashMap<String, Object> inMap = this.mapper.editInMsgEKK1091D010(param, trgtData, msgEKK0081A010, msgListEKK1091B001);
		
		// サービスインターフェース呼び出し
		callSvcInter(handle, param, fixedText, inMap, new EKK1091D010CBSMsg().getContents());
		
	}

	/**
	 * 進捗情報一覧照会処理
	 * <br>
	 * 進捗情報一覧照会処理サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param svcKeiNo サービス契約番号
	 * @param idoDiv 異動区分
	 * @throws Throwable
	 */
	private CAANMsg[] searchPrg(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String svcKeiNo, String idoDiv)
	throws Throwable
	{
		// 照会結果
		CAANMsg[] result = null;
		
		// 上りマッピング処理
		HashMap<String, Object> inMap = this.mapper.editInMsgEKK1091B001(param, svcKeiNo, idoDiv);
		// サービスインターフェース呼び出し
		CAANMsg rsltMsg = callSvcInter(handle, param, fixedText, inMap, new EKK1091B001CBSMsg().getContents());

		CAANMsg[] msgList = rsltMsg.getCAANMsgList(EKK1091B001CBSMsg.EKK1091B001CBSMSG1LIST);
		
		if (msgList != null && msgList.length > 0)
		{
			result = msgList;
		}
		else
		{
			throw new CCException("", new SCCallException("EKK1091B001の照会結果が取得できない", String.valueOf(9051), 8011));
		}

		return result;
	}

	
	/*
	 * --------------------------------------------------------------------------------------------
	 *  以下共通で使用する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;
			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;
	}
}
