/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JKKGetJdgDtlCC
*	ソースファイル名	：JKKGetJdgDtlCC.java
*	作成者				：富士通　
*	作成日				：2011年08月23日
*＜機能概要＞
*　審査詳細取得部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00		2011/08/23	富士通		新規作成
*	v5.00		2013/04/04	FJ)清崎		【ST3-2013-0000830】不良顧客チェック後、審査確認画面表示不具合対応
*	v4.00		2013/04/09	FJ)砂川		【IT1-2013-0000551】サービス契約番号がNULLの場合は入力パラメータから審査番号リストを取得する対応
*********************************************************************/
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.CCException;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.ErrorInfoMapKeys;
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 eo.common.constant.JPCModelConstant;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK1071ETMsg;
import eo.ejb.cbs.cbsmsg.EKK1071B011CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1071B011CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1821B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1821B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1981B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1981B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0171A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0171A010CBSMsg1List;

/**
 * 審査詳細取得クラス
 * @author 富士通
 */
public class JKKGetJdgDtlCC extends AbstractCommonComponent
{
	// 2013/04/04 [ST3-2013-0000830] 不良顧客チェック後、審査確認画面表示不具合対応 ADD START
	/** 審査種別コード_不良顧客 */
	private static final String JUDGE_SBT_CD_06 = "06";
	/** 審査判定結果コード_OK */
	private static final String JUDGE_JUDGE_RSLT_CD_00 = "00";
	// 2013/04/04 [ST3-2013-0000830] 不良顧客チェック後、審査確認画面表示不具合対応 ADD END
	
	/**
	 * 審査詳細取得処理を実施する
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// サービス契約情報を取得
		ArrayList<HashMap<String, String>> svcKeiList = (ArrayList<HashMap<String, String>>)param.getData(KK0081ETMsg.getTableName());
		HashMap<String, String> svcKeiMap = svcKeiList.get(0);
		
		// 20130404 IT1-2013-0000551 Add Start
		// 審査番号を設定するMap
		ArrayList<String> judgeList = new ArrayList<String>();
		if(null != svcKeiMap.get(KK0081ETMsg.SVC_KEI_NO) && !("".equals(svcKeiMap.get(KK0081ETMsg.SVC_KEI_NO))))
		{
			//サービス契約番号がある場合、審査一覧照会を実施し審査番号を取得する
			judgeList = getJudgeList(svcKeiMap, param, handle);
		}
		else
		{
			// サービス契約番号がない場合、審査情報を取得する
			ArrayList<HashMap<String, String>> judgeNoList = (ArrayList<HashMap<String, String>>)param.getData(KK1071ETMsg.getTableName());
			
			if(null != judgeNoList)
			{
				HashMap<String, String> judgeNoMap = new HashMap<String, String>();
				for(int i = 0; i < judgeNoList.size(); i++)
				{
					judgeNoMap = (HashMap<String, String>)judgeNoList.get(i);
					
					if(null != judgeNoMap.get(KK1071ETMsg.JUDGE_NO) && !("".equals(judgeNoMap.get(KK1071ETMsg.JUDGE_NO))))
					{
						judgeList.add(judgeNoMap.get(KK1071ETMsg.JUDGE_NO));
					}
				}
			}
		}
		// 20130404 IT1-2013-0000551 Add End
		// 20130404 IT1-2013-0000551 Delete Start
//		// 審査一覧照会で取得した結果コードを設定するMap
//		ArrayList<String> judgeList = getJudgeList(svcKeiMap, param, handle);
		// 20130404 IT1-2013-0000551 Delete End
		
		// 審査詳細情報を設定するリスト
		ArrayList<HashMap<String, String>> judgeDtlList = new ArrayList<HashMap<String, String>>();
		
		
		for(String judgeNo : judgeList)
		{
			// 審査詳細情報を取得
			CAANMsg[] judgeDtlArray = getJudgeDtl(judgeNo, param, handle);
			
			// 審査詳細情報が取得できない場合
			if(judgeDtlArray == null)
			{
				continue;
			}
			
			for(CAANMsg judgeDtlTemp : judgeDtlArray)
			{
				HashMap<String, String> judgeDtlMap = new HashMap<String, String>();
				
				// メッセージ内容を設定
				judgeDtlMap.put(JKKJudgeConstCC.RSLT_MSG_NAIYO, getJudgeDtlSbt(judgeDtlTemp, param, handle));
				
				// 審査対象画面タブコードの名称を設定
				String judgeTgScreenTabCd = judgeDtlTemp.getString(EKK1981B001CBSMsg1List.JUDGE_TG_SCREEN_TAB_CD);
				if(judgeTgScreenTabCd != null && !"".equals(judgeTgScreenTabCd))
				{
					judgeDtlMap.put(JKKJudgeConstCC.RSLT_CHK_TG_INFO, 
							getCdNm(JKKJudgeConstCC.CD_SBT_JUDGE_TG_SCREEN_TAB_CD, judgeTgScreenTabCd, param, handle));
				}
				else
				{
					judgeDtlMap.put(JKKJudgeConstCC.RSLT_CHK_TG_INFO, "");
				}
				
				// 審査対象画面項目コードの名称を設定
				String judgeTgScreenKmkCd = judgeDtlTemp.getString(EKK1981B001CBSMsg1List.JUDGE_TG_SCREEN_KMK_CD);
				if(judgeTgScreenKmkCd != null && !"".equals(judgeTgScreenKmkCd))
				{
					judgeDtlMap.put(JKKJudgeConstCC.RSLT_KMK_NM, 
							getCdNm(JKKJudgeConstCC.CD_SBT_JUDGE_TG_SCREEN_KMK_CD, judgeTgScreenKmkCd, param, handle));
				}
				else
				{
					judgeDtlMap.put(JKKJudgeConstCC.RSLT_KMK_NM, "");
				}
				
				// 審査判定結果コード取得
				String judgeJudgeRsltCd = judgeDtlTemp.getString(EKK1981B001CBSMsg1List.JUDGE_JUDGE_RSLT_CD);
				
				// 審査判定結果コードの名称を設定
				judgeDtlMap.put(JKKJudgeConstCC.RSLT_CD, judgeJudgeRsltCd);
				
				// 審査判定結果コードの名称を設定
				if(judgeJudgeRsltCd != null && !"".equals(judgeJudgeRsltCd))
				{
					judgeDtlMap.put(JKKJudgeConstCC.RSLT, 
							getCdNm(JKKJudgeConstCC.CD_SBT_JUDGE_JUDGE_RSLT_CD, judgeJudgeRsltCd, param, handle));
				}
				else
				{
					judgeDtlMap.put(JKKJudgeConstCC.RSLT, "");
				}
				
				// メッセージ埋込文字を設定
				judgeDtlMap.put(JKKJudgeConstCC.RSLT_MSG_UMKM_MOJI, judgeDtlTemp.getString(EKK1981B001CBSMsg1List.MSG_UMKM_MOJI));
				
				// メッセージＩＤを設定
				judgeDtlMap.put(JKKJudgeConstCC.RSLT_MSG_ID, judgeDtlTemp.getString(EKK1981B001CBSMsg1List.JDG_DTL_MSG_ID));
				
				
				judgeDtlList.add(judgeDtlMap);
			}
		}
		
		// 審査詳細情報を設定
		param.setData(JKKJudgeConstCC.JDG_DTL_INFO, judgeDtlList);
		
		String isOnlyCheck = (String)param.getData(JKKJudgeConstCC.IS_ONLY_CHECK);
		if (JKKJudgeConstCC.ONLY_CHECK_KBN.equals(isOnlyCheck))
		{
			addError(param, "EZM0101B030CBSMsg1List_err", "EA", "EZM0101B030", JPCModelConstant.RELATION_ERR, 0);
			throw new SCCallException("INVALID_RETURN_MESSAGE", String.valueOf(0), JPCModelConstant.RELATION_ERR);
		}
		
		return param;
	}
	
	/**
	 * CCで検知したエラー情報を呼び出し元に通知します。
	 * @param param パラメータ
	 * @param itemName エラーの起こった項目名
	 * @param errorLevel Eから始まるエラーレベル
	 * @param ifId エラーが起こったことにするインターフェイスＩＤ
	 * @throws RequestParameterException 例外発生時
	 */
	@SuppressWarnings("unchecked")
	public static void addError(IRequestParameterReadWrite param, String itemName, String errorLevel, String ifId, int status, int returnCode) throws RequestParameterException
	{
		List<Map<String, Object>> errors = null;
		Object errorInfos = param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errorInfos == null)
		{
			errors = new ArrayList<Map<String, Object>>();
			param.setControlMapData(SCControlMapKeys.ERROR_INFO, errorInfos);
		}
		else
		{
			errors = (List<Map<String, Object>>)errorInfos;
		}
		
		String recentryErrorStatusString = (String)param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		Integer recentryErrorStatus = 0;
		try
		{
			if (recentryErrorStatusString != null)
			{
				recentryErrorStatus = Integer.parseInt(recentryErrorStatusString);
			}
		} catch (NumberFormatException e)
		{
		}
		if (status > recentryErrorStatus)
		{
			String formatStatus = String.format("%1$04d", status);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);	
		}

		Map<String, String> itemCheckErrorMap = new HashMap<String, String>();
		itemCheckErrorMap.put(itemName, errorLevel);
		
		Map<String, Object> errorInfoMap = new HashMap<String, Object>();
		errorInfoMap.put(ErrorInfoMapKeys.ITEM_CHECK_ERRORS, itemCheckErrorMap);
		errorInfoMap.put(ErrorInfoMapKeys.TEMPLATE_ID, ifId);
		errorInfoMap.put(ErrorInfoMapKeys.STATUS, status);
		errorInfoMap.put(ErrorInfoMapKeys.RETURN_CODE, returnCode);
		
		errors.add(errorInfoMap);
	}
	
	
	/**
	 * 審査一覧照会を実施し、結果を取得する
	 * @param svcKeiMap サービス契約情報
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル 
	 * @return 審査番号リスト
	 * @throws Throwable 
	 */
	private ArrayList<String> getJudgeList(HashMap<String, String> svcKeiMap,
											IRequestParameterReadWrite param, SessionHandle handle)  throws Throwable
	{
		ArrayList<CAANMsg> caanList = new ArrayList<CAANMsg>();
		
		
		/* 審査一覧照会サービスIF */
		CAANMsg judgeTemp = editInMsg(EKK1071B011CBSMsg.class.getName(), "EKK1071B011", "1", param);
		// サービス契約マップ.サービス契約番号 → サービス契約番号
		setSvcIFMapping(svcKeiMap.get(KK0081ETMsg.SVC_KEI_NO), EKK1071B011CBSMsg.KEY_SVC_KEI_NO, judgeTemp);
		//  審査番号
		setSvcIFMapping(null, EKK1071B011CBSMsg.KEY_JUDGE_NO, judgeTemp);
		//  審査種別コード
		setSvcIFMapping(null, EKK1071B011CBSMsg.KEY_JUDGE_SBT_CD, judgeTemp);
		//  審査対象種別コード
		setSvcIFMapping(null, EKK1071B011CBSMsg.KEY_JUDGE_TG_SBT_CD, judgeTemp);
		//  機器提供サービス契約番号
		setSvcIFMapping(null, EKK1071B011CBSMsg.KEY_KKTK_SVC_KEI_NO, judgeTemp);
		//  申込番号
		setSvcIFMapping(null, EKK1071B011CBSMsg.KEY_MSKM_DTL_NO, judgeTemp);
		//  オプションサービス契約番号
		setSvcIFMapping(null, EKK1071B011CBSMsg.KEY_OP_SVC_KEI_NO, judgeTemp);
		//  サブオプションサービス契約番号
		setSvcIFMapping(null, EKK1071B011CBSMsg.KEY_SBOP_SVC_KEI_NO, judgeTemp);
		//  請求オプションサービス契約番号
		setSvcIFMapping(null, EKK1071B011CBSMsg.KEY_SEIOPSVC_KEI_NO, judgeTemp);
		//  サービス契約内訳番号
		setSvcIFMapping(null, EKK1071B011CBSMsg.KEY_SVC_KEI_UCWK_NO, judgeTemp);
		//  SYSID
		setSvcIFMapping(null, EKK1071B011CBSMsg.KEY_SYSID, judgeTemp);
		//  割引サービス契約番号
		setSvcIFMapping(null, EKK1071B011CBSMsg.KEY_WRIB_SVC_KEI_NO, judgeTemp);
		
		
		caanList.add(judgeTemp);
		
		// サービスIFの実施
		Map<?, ?> rsltMap = executeSvcIF(caanList, param, handle);
        // エラー情報の設定
        param = editErrorInfoEKK1071B011(param, rsltMap);
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null){
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(rsltMap, errList));
		// 実行結果確認
		scResultCheck(param, rsltMap);
		// 結果をリストで取得
		ArrayList<CAANMsg> rsltCaanList = getRsltList(rsltMap);
		
		// 審査一覧照会で取得した結果コードを設定するリスト
		ArrayList<String> judgeList = new ArrayList<String>();
		
		CAANMsg judgeRsltTemp = rsltCaanList.get(0);
		CAANMsg[] judgeRsltList = judgeRsltTemp.getCAANMsgList(EKK1071B011CBSMsg.EKK1071B011CBSMSG1LIST);
		if(judgeRsltList != null)
		{
			for(CAANMsg judgeInTemp : judgeRsltList)
			{
// 2013/04/04 [ST3-2013-0000830] 不良顧客チェック後、審査確認画面表示不具合対応 ADD START
				// 審査判定結果コードがNULL出ない場合
				if(!judgeInTemp.isNull(EKK1071B011CBSMsg1List.JUDGE_JUDGE_RSLT_CD))
				{
					// 審査種別コードが不良顧客チェックまたは審査結果コードがOKでない場合
					if(!(judgeInTemp.getString(EKK1071B011CBSMsg1List.JUDGE_SBT_CD).equals(JUDGE_SBT_CD_06) || judgeInTemp.getString(EKK1071B011CBSMsg1List.JUDGE_JUDGE_RSLT_CD).equals(JUDGE_JUDGE_RSLT_CD_00)))
					{
// 2013/04/04 [ST3-2013-0000830] 不良顧客チェック後、審査確認画面表示不具合対応 ADD END
						// 審査番号を取得
						String judgeNo = judgeInTemp.getString(EKK1071B011CBSMsg1List.JUDGE_NO);

						judgeList.add(judgeNo);
					}
				}
			}
		}
		
		return judgeList;
	}
	
	/**
	 * 審査詳細一覧照会（審査番号）を実施し、結果を取得する
	 * @param judgeNo 審査番号
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル 
	 * @return 審査詳細情報
	 * @throws Throwable 
	 */
	private CAANMsg[] getJudgeDtl(String judgeNo, IRequestParameterReadWrite param, SessionHandle handle)  throws Throwable
	{
		ArrayList<CAANMsg> caanList = new ArrayList<CAANMsg>();
		
		
		/* 審査詳細一覧照会（審査番号）サービスIF */
		CAANMsg judgeDtlTemp = editInMsg(EKK1981B001CBSMsg.class.getName(), "EKK1981B001", "1", param);
		//  ＫＥＹ＿審査番号
		setSvcIFMapping(judgeNo, EKK1981B001CBSMsg.KEY_JUDGE_NO, judgeDtlTemp);
		//  ＫＥＹ＿審査詳細種別コード
		setSvcIFMapping(null, EKK1981B001CBSMsg.KEY_JDG_DTL_SBT_CD, judgeDtlTemp);
		
		
		caanList.add(judgeDtlTemp);
		
		// サービスIFの実施
		Map<?, ?> rsltMap = executeSvcIF(caanList, param, handle);
        // エラー情報の設定
        param = editErrorInfoEKK1981B001(param, rsltMap);
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null){
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(rsltMap, errList));
		// 実行結果確認
		scResultCheck(param, rsltMap);
		// 結果をリストで取得
		ArrayList<CAANMsg> rsltCaanList = getRsltList(rsltMap);
		
		CAANMsg judgeRsltTemp = rsltCaanList.get(0);
		
		return judgeRsltTemp.getCAANMsgList(EKK1981B001CBSMsg.EKK1981B001CBSMSG1LIST);
	}
	
	/**
	 * 審査詳細種別一覧照会（審査詳細種別コード）を実施し、結果を取得する
	 * @param judgeDtlTemp 審査詳細情報
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル 
	 * @return 審査番号リスト
	 * @throws Throwable 
	 */
	private String getJudgeDtlSbt(CAANMsg judgeDtlTemp, IRequestParameterReadWrite param, SessionHandle handle)  throws Throwable
	{
		ArrayList<CAANMsg> caanList = new ArrayList<CAANMsg>();
		
		
		/* 審査詳細種別一覧照会（審査詳細種別コード）サービスIF */
		CAANMsg judgeDtlSbtTemp = editInMsg(EKK1821B001CBSMsg.class.getName(), "EKK1821B001", "1", param);
		//  ＫＥＹ＿審査詳細種別コード
		setSvcIFMapping(judgeDtlTemp.getString(EKK1981B001CBSMsg1List.JDG_DTL_SBT_CD), EKK1821B001CBSMsg.KEY_JDG_DTL_SBT_CD, judgeDtlSbtTemp);
		//  ＫＥＹ＿審査詳細メッセージID
		setSvcIFMapping(null, EKK1821B001CBSMsg.KEY_JDG_DTL_MSG_ID, judgeDtlSbtTemp);
		
		
		caanList.add(judgeDtlSbtTemp);
		
		// サービスIFの実施
		Map<?, ?> rsltMap = executeSvcIF(caanList, param, handle);
        // エラー情報の設定
        param = editErrorInfoEKK1821B001(param, rsltMap);
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null){
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(rsltMap, errList));
		// 実行結果確認
		scResultCheck(param, rsltMap);
		// 結果をリストで取得
		ArrayList<CAANMsg> rsltCaanList = getRsltList(rsltMap);
		
		// 審査詳細より取得したメッセージID
		String msgId = judgeDtlTemp.getString(EKK1981B001CBSMsg1List.JDG_DTL_MSG_ID);
		
		// 審査詳細種別一覧照会で取得したメッセージ内容を設定する変数
		String jdgDtlMsgNaiyo = "";
		
		CAANMsg judgeRsltTemp = rsltCaanList.get(0);
		CAANMsg[] judgeRsltList = judgeRsltTemp.getCAANMsgList(EKK1821B001CBSMsg.EKK1821B001CBSMSG1LIST);
		if(judgeRsltList != null && judgeRsltList.length > 0)
		{
			for(int i = 0; i < judgeRsltList.length; i++)
			{
				CAANMsg judgeInTemp = judgeRsltList[i];
				
				// 審査詳細種別のメッセージID
				String tgMsgId = judgeInTemp.getString(EKK1821B001CBSMsg1List.JDG_DTL_MSG_ID);
				
				// 同じメッセージIDの場合
				if(tgMsgId.equals(msgId))
				{
					jdgDtlMsgNaiyo = judgeInTemp.getString(EKK1821B001CBSMsg1List.JDG_DTL_MSG_NAIYO);
				}
			}
		}
		
		return jdgDtlMsgNaiyo;
	}
	
	/**
	 * コード名称管理一意照会を実施し、結果を取得する
	 * @param cdSbtCd コード種別コード
	 * @param cdDiv コード区分
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル 
	 * @return 審査番号リスト
	 * @throws Throwable 
	 */
	private String getCdNm(String cdSbtCd, String cdDiv, IRequestParameterReadWrite param, SessionHandle handle)  throws Throwable
	{
		ArrayList<CAANMsg> caanList = new ArrayList<CAANMsg>();
		
		
		/* コード名称管理一意照会サービスIF */
		CAANMsg cdNmKanriTemp = editInMsg(EZM0171A010CBSMsg.class.getName(), "EZM0171A010", "1", param);
		
		// ＫＥＹ＿コード種別コード
		setSvcIFMapping(cdSbtCd, EZM0171A010CBSMsg.KEY_CD_SBT_CD, cdNmKanriTemp);
		// ＫＥＹ＿コード区分
		setSvcIFMapping(cdDiv, EZM0171A010CBSMsg.KEY_CD_DIV, cdNmKanriTemp);
		
		
		caanList.add(cdNmKanriTemp);
		
		// サービスIFの実施
		Map<?, ?> rsltMap = executeSvcIF(caanList, param, handle);
        // エラー情報の設定
        param = editErrorInfoEZM0171A010(param, rsltMap);
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null){
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(rsltMap, errList));
		// 実行結果確認
		scResultCheck(param, rsltMap);
		// 結果をリストで取得
		ArrayList<CAANMsg> rsltCaanList = getRsltList(rsltMap);
		
		// コード名称管理一意照会で取得したコード区分名を設定する変数
		String cdDivNm = "";
		
		CAANMsg rsltTemp = rsltCaanList.get(0);
		CAANMsg[] rsltList = rsltTemp.getCAANMsgList(EZM0171A010CBSMsg.EZM0171A010CBSMSG1LIST);
		if(rsltList != null && rsltList.length > 0)
		{
			CAANMsg inTemp = rsltList[0];
			
			cdDivNm = inTemp.getString(EZM0171A010CBSMsg1List.CD_DIV_NM);
		}
		
		return cdDivNm;
	}
	
	/**
	 * マッピングする際に行う共通の判定を行い、項目を設定する。
	 * @param setValue 設定項目値
	 * @param key マッピングキー
	 * @param template CAANMsgクラス
	 * @throws Throwable
	 */
	private void setSvcIFMapping(String setValue, String key, CAANMsg template) throws Throwable
	{
		// 設定項目値が空文字またはnullの場合
		if ("".equals(setValue) || setValue == null)
		{
			template.setNull(key);
		// 設定値がある場合
		}
		else
		{
			template.set(key, setValue);
		}
	}
	
	/**
	 * 共通の設定項目を設定する
	 * @param schemaClassNm スキーマクラス名
	 * @param templateID テンプレートID
	 * @param funcCd 機能ID
	 * @param param リクエストパラメータ 
	 * @return CAANMsgクラス
	 * @throws Throwable 
	 */
	private CAANMsg editInMsg(String schemaClassNm, String templateID, String funcCd,
								IRequestParameterReadWrite param) throws Throwable
	{
		CAANMsg template = new CAANMsg(schemaClassNm);
		
		// テンプレートID
		template.set(JCMConstants.TEMPLATE_ID_KEY, templateID);
		
		// 機能コード
		template.set(JCMConstants.FUNC_CODE_KEY, funcCd);
		
		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);
		
		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);
		
		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);
		
		return template;
	}
	
	/**
	 * サービスIFを呼び出し、その結果を取得する。
	 * @param caanList サービスIFリスト
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @return templateList 結果が格納されたリスト
	 * @throws Throwable 
	 */
	private Map<?, ?> executeSvcIF(ArrayList<CAANMsg> caanList, 
			IRequestParameterReadWrite param, SessionHandle handle) throws Throwable
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		CAANMsg[] caan = new CAANMsg[caanList.size()];
		int count = 0;
		for(CAANMsg template : caanList)
		{
			caan[count++] = template;
		}
		
		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文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));
		
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, caan);
		
		// SC呼出実行
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		return scCall.run(paramMap, handle);
	}
	
	/**
	 * サービスIFの結果を取得する。
	 * @param rsltMap サービスIFリスト
	 * @return templateList 結果が格納されたリスト
	 * @throws Throwable 
	 */
	private ArrayList<CAANMsg> getRsltList(Map<?, ?> rsltMap) throws Throwable
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])rsltMap.get(JCMConstants.TEMPLATE_LIST_KEY);
		ArrayList<CAANMsg> rsltCaanList = new ArrayList<CAANMsg>();
		for(int i = 0; i < templates.length; i++)
		{
			rsltCaanList.add(templates[i]);
		}
		
		return rsltCaanList;
	}
	
	/**
	 * 単項目のエラーマッピング.
	 * <br>
	 * @param  template  テンプレート情報
	 * @param  dataMap   マップ情報
	 * @param  targetNm  マッピング対象項目
	 */
	@SuppressWarnings( "unchecked" )
	private void errMapping( CAANMsg template, HashMap dataMap, String targetNm ) {
		if ( ( !template.isNull( targetNm ) ) && ( !dataMap.containsKey( targetNm ) ) ) {
			dataMap.put( targetNm, template.getString( targetNm ) );
		}
	}
	
	/**
	 * サービスコンポーネント実行結果確認.
	 * <br>
	 * @param   handle     セッションマネージャなどを持ったハンドル情報
	 * @throws  Exception  例外が発生した場合
	 */
	private void scResultCheck( IRequestParameterReadWrite param, Map<?, ?> resultMap ) throws Throwable {
		int rtnCode = Integer.parseInt(param.getControlMapData( SCControlMapKeys.RETURN_CODE).toString() );
		CAANMsg[] templates = (CAANMsg[])resultMap.get(JCMConstants.TEMPLATE_LIST_KEY);
		// サービスコンポーネントの実行結果に単項目以上のエラーがある場合、例外とする
		if ( rtnCode >= JPCModelConstant.SINGLEDATA_ERR ) {
			throw new CCException("", new Exception());
		}
	}
	
	/**
	 *<DL>
	 *<DT>処理概要:
	 *<DD>サービスコンポーネント(審査一覧照会)実行後に、IRequestParameterReadWriteにエラー情報をマッピングする
	 *<DT>入力パラメータ説明:
	 *<DD>特になし
	 *<DT>入力パラメータ説明：
	 *<DD>特になし
	 *<DT>出力パラメータ説明:
	 *<DD>特になし
	 *</DL>
	 * @param param (I) 業務データ取得・書込用I/F
	 * @param templates (I) CAANMsgクラス配列
	 * @param returnCode (I) リターンコード
	 * @return 業務データ取得・書込用I/F
	 * @since 2011.11.04
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoEKK1071B011(IRequestParameterReadWrite param, Map<?, ?> rsltMap)
	throws Throwable {
		// SCからの戻り値からCAANMsgを取得
		CAANMsg[] templates = (CAANMsg[])rsltMap.get(JCMConstants.TEMPLATE_LIST_KEY);
		// リターンコード取得
		Integer returnCode = (Integer)rsltMap.get(JCMConstants.RET_CD_INT_KEY);
		
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(EKK1071B011CBSMsg.STATUS);
		if (returnCode != 0) {
			templateStatus = 9000;
		}
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null) {
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null) {
			bpStatus = -1;
		} else {
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus) {
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		HashMap inMap = null;
		
		// 作業項目領域
		Map workMap = (Map)param.getMappingWorkArea();
		if (workMap == null) {
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}
		
		/* ユーザデータ情報 */
		inMap = (HashMap)param.getData("err_map");
		if (inMap == null) {
			inMap = new HashMap();
			param.setData("err_map", inMap);
		}

		// 審査一覧照会マップ.審査番号 → 審査番号 のエラー情報返却
		errMapping(template, inMap, EKK1071B011CBSMsg.KEY_JUDGE_NO_ERR);
		// 審査一覧照会マップ.審査種別コード → 審査種別コード のエラー情報返却
		errMapping(template, inMap, EKK1071B011CBSMsg.KEY_JUDGE_SBT_CD_ERR);
		// 審査一覧照会マップ.審査対象種別コード → 審査対象種別コード のエラー情報返却
		errMapping(template, inMap, EKK1071B011CBSMsg.KEY_JUDGE_TG_SBT_CD_ERR);
		// 審査一覧照会マップ.機器提供サービス契約番号 → 機器提供サービス契約番号 のエラー情報返却
		errMapping(template, inMap, EKK1071B011CBSMsg.KEY_KKTK_SVC_KEI_NO_ERR);
		// 審査一覧照会マップ.申込明細番号 → 申込明細番号 のエラー情報返却
		errMapping(template, inMap, EKK1071B011CBSMsg.KEY_MSKM_DTL_NO_ERR);
		// 審査一覧照会マップ.オプションサービス契約番号 → オプションサービス契約番号 のエラー情報返却
		errMapping(template, inMap, EKK1071B011CBSMsg.KEY_OP_SVC_KEI_NO_ERR);
		// 審査一覧照会マップ.サブオプションサービス契約番号 → サブオプションサービス契約番号 のエラー情報返却
		errMapping(template, inMap, EKK1071B011CBSMsg.KEY_SBOP_SVC_KEI_NO_ERR);
		// 審査一覧照会マップ.請求オプションサービス契約番号 → 請求オプションサービス契約番号 のエラー情報返却
		errMapping(template, inMap, EKK1071B011CBSMsg.KEY_SEIOPSVC_KEI_NO_ERR);
		// 審査一覧照会マップ.サービス契約番号 → サービス契約番号 のエラー情報返却
		errMapping(template, inMap, EKK1071B011CBSMsg.KEY_SVC_KEI_NO_ERR);
		// 審査一覧照会マップ.サービス契約内訳番号 → サービス契約内訳番号 のエラー情報返却
		errMapping(template, inMap, EKK1071B011CBSMsg.KEY_SVC_KEI_UCWK_NO_ERR);
		// 審査一覧照会マップ.SYSID → SYSID のエラー情報返却
		errMapping(template, inMap, EKK1071B011CBSMsg.KEY_SYSID_ERR);
		// 審査一覧照会マップ.割引サービス契約番号 → 割引サービス契約番号 のエラー情報返却
		errMapping(template, inMap, EKK1071B011CBSMsg.KEY_WRIB_SVC_KEI_NO_ERR);
		
		return param;
	}
	
	/**
	 *<DL>
	 *<DT>処理概要:
	 *<DD>サービスコンポーネント(審査詳細一覧照会)実行後に、IRequestParameterReadWriteにエラー情報をマッピングする
	 *<DT>入力パラメータ説明:
	 *<DD>特になし
	 *<DT>入力パラメータ説明：
	 *<DD>特になし
	 *<DT>出力パラメータ説明:
	 *<DD>特になし
	 *</DL>
	 * @param param (I) 業務データ取得・書込用I/F
	 * @param templates (I) CAANMsgクラス配列
	 * @param returnCode (I) リターンコード
	 * @return 業務データ取得・書込用I/F
	 * @since 2011.11.04
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoEKK1981B001(IRequestParameterReadWrite param, Map<?, ?> rsltMap)
	throws Throwable {
		// SCからの戻り値からCAANMsgを取得
		CAANMsg[] templates = (CAANMsg[])rsltMap.get(JCMConstants.TEMPLATE_LIST_KEY);
		// リターンコード取得
		Integer returnCode = (Integer)rsltMap.get(JCMConstants.RET_CD_INT_KEY);
		
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(EKK1981B001CBSMsg.STATUS);
		if (returnCode != 0) {
			templateStatus = 9000;
		}
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null) {
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null) {
			bpStatus = -1;
		} else {
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus) {
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		HashMap inMap = null;
		
		// 作業項目領域
		Map workMap = (Map)param.getMappingWorkArea();
		if (workMap == null) {
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}
		
		/* ユーザデータ情報 */
		inMap = (HashMap)param.getData("err_map");
		if (inMap == null) {
			inMap = new HashMap();
			param.setData("err_map", inMap);
		}

		// 審査詳細一覧照会マップ.審査番号 → 審査番号 のエラー情報返却
		errMapping(template, inMap, EKK1981B001CBSMsg.KEY_JUDGE_NO_ERR);
		// 審査詳細一覧照会マップ.審査詳細種別コード → 審査詳細種別コード のエラー情報返却
		errMapping(template, inMap, EKK1981B001CBSMsg.KEY_JDG_DTL_SBT_CD_ERR);
		
		return param;
	}
	
	/**
	 *<DL>
	 *<DT>処理概要:
	 *<DD>サービスコンポーネント(審査詳細詳細種別一覧照会)実行後に、IRequestParameterReadWriteにエラー情報をマッピングする
	 *<DT>入力パラメータ説明:
	 *<DD>特になし
	 *<DT>入力パラメータ説明：
	 *<DD>特になし
	 *<DT>出力パラメータ説明:
	 *<DD>特になし
	 *</DL>
	 * @param param (I) 業務データ取得・書込用I/F
	 * @param templates (I) CAANMsgクラス配列
	 * @param returnCode (I) リターンコード
	 * @return 業務データ取得・書込用I/F
	 * @since 2011.11.04
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoEKK1821B001(IRequestParameterReadWrite param, Map<?, ?> rsltMap)
	throws Throwable {
		// SCからの戻り値からCAANMsgを取得
		CAANMsg[] templates = (CAANMsg[])rsltMap.get(JCMConstants.TEMPLATE_LIST_KEY);
		// リターンコード取得
		Integer returnCode = (Integer)rsltMap.get(JCMConstants.RET_CD_INT_KEY);
		
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(EKK1821B001CBSMsg.STATUS);
		if (returnCode != 0) {
			templateStatus = 9000;
		}
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null) {
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null) {
			bpStatus = -1;
		} else {
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus) {
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		HashMap inMap = null;
		
		// 作業項目領域
		Map workMap = (Map)param.getMappingWorkArea();
		if (workMap == null) {
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}
		
		/* ユーザデータ情報 */
		inMap = (HashMap)param.getData("err_map");
		if (inMap == null) {
			inMap = new HashMap();
			param.setData("err_map", inMap);
		}

		// 審査詳細種別一覧照会マップ.審査詳細種別コード → 審査詳細種別コード のエラー情報返却
		errMapping(template, inMap, EKK1821B001CBSMsg.KEY_JDG_DTL_SBT_CD_ERR);
		// 審査詳細種別一覧照会マップ.審査詳細メッセージID → 審査詳細メッセージID のエラー情報返却
		errMapping(template, inMap, EKK1821B001CBSMsg.KEY_JDG_DTL_MSG_ID_ERR);
		
		return param;
	}
	
	/**
	 *<DL>
	 *<DT>処理概要:
	 *<DD>サービスコンポーネント(コード名称管理一意照会)実行後に、IRequestParameterReadWriteにエラー情報をマッピングする
	 *<DT>入力パラメータ説明:
	 *<DD>特になし
	 *<DT>入力パラメータ説明：
	 *<DD>特になし
	 *<DT>出力パラメータ説明:
	 *<DD>特になし
	 *</DL>
	 * @param param (I) 業務データ取得・書込用I/F
	 * @param templates (I) CAANMsgクラス配列
	 * @param returnCode (I) リターンコード
	 * @return 業務データ取得・書込用I/F
	 * @since 2011.11.04
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoEZM0171A010(IRequestParameterReadWrite param, Map<?, ?> rsltMap)
	throws Throwable {
		// SCからの戻り値からCAANMsgを取得
		CAANMsg[] templates = (CAANMsg[])rsltMap.get(JCMConstants.TEMPLATE_LIST_KEY);
		// リターンコード取得
		Integer returnCode = (Integer)rsltMap.get(JCMConstants.RET_CD_INT_KEY);
		
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(EZM0171A010CBSMsg.STATUS);
		if (returnCode != 0) {
			templateStatus = 9000;
		}
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null) {
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null) {
			bpStatus = -1;
		} else {
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus) {
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		HashMap inMap = null;
		
		// 作業項目領域
		Map workMap = (Map)param.getMappingWorkArea();
		if (workMap == null) {
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}
		
		/* ユーザデータ情報 */
		inMap = (HashMap)param.getData("err_map");
		if (inMap == null) {
			inMap = new HashMap();
			param.setData("err_map", inMap);
		}

		// コード名称管理一意照会マップ.コード種別コード → コード種別コード のエラー情報返却
		errMapping(template, inMap, EZM0171A010CBSMsg.KEY_CD_SBT_CD_ERR);
		// コード名称管理一意照会マップ.コード区分 → コード区分 のエラー情報返却
		errMapping(template, inMap, EZM0171A010CBSMsg.KEY_CD_DIV_ERR);
		
		return param;
	}
}
