/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JFUWebMskmNyoDeleteCC
 *   ソースファイル名：JFUWebMskmNyoDeleteCC.java
 *   作成者          ：富士通
 *   日付            ：2022年9月6日
 *＜機能概要＞
 *   WEB申込内容削除CC
 *＜修正履歴＞
 *   バージョン  	修正日      修正者      修正内容
 *   v60.0.0		2022/9/6	FJ			ANK-4231-11-00_【OMO構想対応】10月リリース対応
 *
 **********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import static com.fujitsu.futurity.bp.custom.common.JCNDslCommonUtil.callECK0011B050;
import static com.fujitsu.futurity.bp.custom.common.JCNDslCommonUtil.callECK0011C060;
import static com.fujitsu.futurity.bp.custom.common.JCNDslCommonUtil.callECK0151D010Map;
import static com.fujitsu.futurity.bp.custom.common.JCNDslCommonUtil.stdardContDsl;
import static com.fujitsu.futurity.bp.custom.common.JCNDslScParamHenshu.getResultMsgList;
import static com.fujitsu.futurity.bp.custom.common.JCNDslScParamHenshu.getResultString;
import static com.fujitsu.futurity.bp.custom.common.JCNDslScParamHenshu.isError;
import static com.fujitsu.futurity.bp.custom.common.JCNDslScParamHenshu.isSuccess;
import static eo.common.constant.JCKStrConst.SJISHO_TRN_CD_ADMIN_API;
import static eo.common.constant.JCNStrConst.ADMIN_SJISHO_PARAM1_DEL;
import static eo.common.constant.JCNStrConst.TAIKAI_RSN_CD_CUST_OWN;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.CKSV9001_CKSV9001OP_CKSV900101CC;
import com.fujitsu.futurity.bp.custom.constant.JFUMkmInfoAddFrontiaConstCC;
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.JCCSuperComExecUtil;
import com.fujitsu.futurity.common.JCCSyslogFormat;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.JSYLogBase;
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 com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.ECK0011B050CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B050CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0011C180CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0151D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EFU0381A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EFU0381B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EFU0381B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EFU0381E010CBSMsg;
import eo.ejb.cbs.cbsmsg.EFU0391A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EFU0391E010CBSMsg;

/**
 * WEB申込内容削除CC
 *
 * <br>
 * 
 * @author 富士通
 */
public class JFUWebMskmNyoDeleteCC extends AbstractCommonComponent {
	private static final String ERROR_INFO = "ERROR_INFO";
	private static final String ERROR_CODE = "errCode";
	private static final String ERROR_MESSAGE = "errMessage";

	/** テンプレートID */
	private static final String TEMPLATE_ID_EFU0391E010 = "EFU0391E010";
	private static final String TEMPLATE_ID_EFU0381B010 = "EFU0381B010";
	private static final String TEMPLATE_ID_EFU0381E010 = "EFU0381E010";
	private static final String TEMPLATE_ID_EFU0381A010 = "EFU0381A010";
	private static final String TEMPLATE_ID_EFU0391A010 = "EFU0391A010";

	/** SYSIDパラメータ名 */
	private static final String SYSID = "sysid";
	private static final String RESULT = "result";

	/**
	 * WEB申込内容削除CC <br>
	 * 
	 * @param handle
	 *            セッションハンドル
	 * @param param
	 *            リクエストパラメータ
	 * @param fixedText
	 *            ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable
	 *             例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, 
																IRequestParameterReadWrite param, 
																String fixedText) throws Throwable
	{
		Map<String, Object> ccMsg = (Map<String, Object>) param.getData(fixedText);
		String funcCode = (String) ccMsg.get(JFUMkmInfoAddFrontiaConstCC.FUNC_CODE);
		String preSysid = JFUStrConst.EMPTY;

		try
		{
			// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

			if (!JFUMkmInfoAddFrontiaConstCC.FUNC_CODE_CONF.equals(funcCode))
			{
				preSysid = (String)ccMsg.get(SYSID);
			} else {
				// Web申込内容一時保存一意照会
				String mskmsho_no = (String) ccMsg.get(JFUMkmInfoAddFrontiaConstCC.MSKMSHO_NO);
				CAANMsg efu0381a010Msg = null;

				// Web申込内容一時保存一意照会の上りマッピング
				Object[][] efu0381a010 = {
						{ EFU0381A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EFU0381A010 },
						{ EFU0381A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
						{ EFU0381A010CBSMsg.KEY_MSKMSHO_NO, mskmsho_no } };

				// サービスIF実行
				efu0381a010Msg = callSC(handle, scCall, param, fixedText, efu0381a010);
				CAANMsg[] efu0381a010MsgList = efu0381a010Msg.getCAANMsgList(EFU0381A010CBSMsg.EFU0381A010CBSMSG1LIST);
				preSysid = efu0381a010MsgList[0].getString(EFU0381B010CBSMsg1List.SYSID);
				// プレ登録されていない場合はなにもせず処理終了
				if (JFUBPCommon.isNull(preSysid))
				{
					return param;
				}
			}
			// データチェック
			/* 単項目チェック */
			if (!checkUnitParam(ccMsg))
			{
				if (!JFUMkmInfoAddFrontiaConstCC.FUNC_CODE_CONF.equals(funcCode))
				{
					param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
					param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
				}
				return param;
			}

			String opeDate = JCCBPCommon.getOpeDate(null);
			String updDtmSysid = null;
			String svcKeiNo = null;
			String updDtmSvcKei = null;

			//***************************************************
			// Web申込相談一意照会
			//***************************************************
			CAANMsg efu0391a010Msg = null;
			CAANMsg[] efu0391a010MsgList = null;
			Object[][] efu0391a010 =
			{
				{EFU0391A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EFU0391A010},
				{EFU0391A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
				{EFU0391A010CBSMsg.KEY_SYSID, preSysid}
			};

			// サービスIF実行
			efu0391a010Msg = callSC(handle, scCall, param, fixedText, efu0391a010);
			efu0391a010MsgList = efu0391a010Msg.getCAANMsgList(EFU0391A010CBSMsg.EFU0391A010CBSMSG1LIST);
			if (efu0391a010MsgList == null || efu0391a010MsgList.length == 0) {
				if (!JFUMkmInfoAddFrontiaConstCC.FUNC_CODE_CONF.equals(funcCode))
				{
					// エラーリスト
					List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
					// 関連チェックエラー
					errList.add(getLinkErrInfMap("", ""));
					ccMsg.put(ERROR_INFO, errList);

					param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
					param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
				}
				return param;
			}

			//***************************************************
			// お客様情報取得
			//***************************************************
			Map result = callECK0011B050(handle, param, "1", preSysid);
			if (isSuccess(result))
			{

				CAANMsg[] dataList = getResultMsgList(result, ECK0011B050CBSMsg.ECK0011B050CBSMSG1LIST);
				if ((dataList == null) || (dataList.length == 0))
				{
					if (!JFUMkmInfoAddFrontiaConstCC.FUNC_CODE_CONF.equals(funcCode))
					{
						// エラーリスト
						List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
						// 関連チェックエラー
						errList.add(getLinkErrInfMap("", ""));
						ccMsg.put(ERROR_INFO, errList);

						param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
						param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
					}
					return param;
				}
				else
				{
					// お客様情報照会(PMP連携用)結果を取得
					// お客様情報照会(PMP連携用)結果マップを取得
					String mapKeyPre = ECK0011B050CBSMsg.ECK0011B050CBSMSG1LIST + "[0].";
					svcKeiNo = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.SVC_KEI_NO);
					updDtmSvcKei = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.UPD_DTM_SVC_KEI);
					updDtmSysid = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.UPD_DTM_SYSID);
				}
			}
			else
			{
				if (!JFUMkmInfoAddFrontiaConstCC.FUNC_CODE_CONF.equals(funcCode))
				{
					// エラーリスト
					List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
					// 関連チェックエラー
					errList.add(getLinkErrInfMap("", ""));
					ccMsg.put(ERROR_INFO, errList);

					param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
					param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
				}
				return param;
			}
			//***************************************************
			// サービス契約(標準コンテンツ同意)解約
			//***************************************************
			result = stdardContDsl(handle, param, svcKeiNo, updDtmSvcKei, opeDate);
			if (isError(result))
			{
				printSyslog4Err(preSysid, funcCode, "プレ会員情報のサービス契約(標準コンテンツ同意)解約でエラー。");

				if (!JFUMkmInfoAddFrontiaConstCC.FUNC_CODE_CONF.equals(funcCode))
				{
					// システムエラーを設定する
					param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_9000);
					param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, JKKStrConst.RETURN_MESSAGE_SYSTEM_ERROR);
				}
				throw new CCException("プレ会員情報のサービス契約(標準コンテンツ同意)解約でエラー。", new Exception());
			}

			//***************************************************
			// お客様退会
			//***************************************************
			result = callECK0011C060(handle, param, preSysid, opeDate, TAIKAI_RSN_CD_CUST_OWN, updDtmSysid);
			if (isSuccess(result))
			{
				updDtmSysid = getResultString(result, ECK0011C180CBSMsg.UPD_DTM);
			}
			else
			{
				printSyslog4Err(preSysid, funcCode, "プレ会員情報のお客様退会でエラー。");

				if (!JFUMkmInfoAddFrontiaConstCC.FUNC_CODE_CONF.equals(funcCode))
				{
					// システムエラーを設定する
					param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_9000);
					param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, JKKStrConst.RETURN_MESSAGE_SYSTEM_ERROR);
				}
				throw new CCException("プレ会員情報のお客様退会でエラー。", new Exception());
			}

			//***************************************************
			// Web申込相談登録削除
			//***************************************************
			execEFU0391E010(handle, scCall, param, fixedText, preSysid);

			//***************************************************
			// Web申込内容一時保存削除
			//***************************************************
			execEFU0381E010(handle, scCall, param, fixedText, preSysid);

			//***************************************************
			// 指示書登録
			//***************************************************
			// 会員情報の削除連携用の指示書作成
			if (isSuccess(result))
			{
				Map sjishoMap = createShijishoParamDelMmb(preSysid);
				result = callECK0151D010Map(handle, param, sjishoMap);
			}

			if (isError(result))
			{
				printSyslog4Err(preSysid, funcCode, "プレ会員情報の削除連携用の指示書登録でエラー。");

				if (!JFUMkmInfoAddFrontiaConstCC.FUNC_CODE_CONF.equals(funcCode))
				{
					// システムエラーを設定する
					param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_9000);
					param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, JKKStrConst.RETURN_MESSAGE_SYSTEM_ERROR);
				}
				throw new CCException("プレ会員情報の削除連携用の指示書登録でエラー。", new Exception());
			}

			//***************************************************
			// 会員情報更新依頼CC実行
			//***************************************************
			execJCKSV900101CC(handle, param, preSysid);

			ccMsg.remove(SYSID);
			ccMsg.put(RESULT, "0");
		}
		// サービスインターフェース呼び出しでエラーが発生した場合
		catch (SCCallException scCallEx)
		{
			printSyslog4Err(preSysid, funcCode, "サービスインターフェース呼び出しでエラー。");

			if (!JFUMkmInfoAddFrontiaConstCC.FUNC_CODE_CONF.equals(funcCode))
			{
				// システムエラーを設定する
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_9000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, JKKStrConst.RETURN_MESSAGE_SYSTEM_ERROR);
			}
			throw new CCException("サービスインターフェース呼び出しでエラー。", new Exception());
		}
		return param;
	}

	/**
	 * 単項目チェック <br>
	 * 
	 * @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 = SYSID;
		String itemValue = (String) ccMsg.get(itemName);
		/* 必須チェック */
		if (itemValue == null || itemValue.trim().isEmpty()) {
			// 必須チェックエラー
			errList.add(getReqErrInfMap(itemName));
		}
		if (!JKKStringUtil.isNullBlank(itemValue)) {
			/* 属性チェック */
			if (!HalfCharCheck.isEnNumber1Check(itemValue)) {
				// 属性チェックエラー
				errList.add(getFormErrInfMap(itemName, itemValue));
			}
			/* 桁数チェック */
			if (!LengthCheck.isLength2Check(itemValue, 10, 10)) {
				// 桁数チェックエラー
				errList.add(getLenErrInfMap(itemName, itemValue));
			}
		}

		/* エラーが存在する場合 */
		if (errList.size() > 0) {
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}

		return true;
	}

	/**
	 * 単項目チェックの必須エラーマップ作成メソッドです。 <br>
	 * 
	 * @param itemName
	 *            項目名
	 * @return 必須エラーマップ
	 */
	private Map<String, String> getReqErrInfMap(String itemName) {
		Map<String, String> returnMap = new HashMap<String, String>();

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1001);
		returnMap.put(ERROR_MESSAGE, itemName);

		return returnMap;
	}

	/**
	 * 単項目チェックの桁数エラーマップ作成メソッドです。 <br>
	 * 
	 * @param itemName
	 *            項目名
	 * @return 数エラーマップ
	 */
	private Map<String, String> getLenErrInfMap(String itemName,
			String itemValue) {
		Map<String, String> returnMap = new HashMap<String, String>();

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1003);
		returnMap.put(ERROR_MESSAGE, String
				.format("%s:%s", itemName, itemValue));

		return returnMap;
	}

	/**
	 * 単項目チェックの属性エラーマップ作成メソッドです。 <br>
	 * 
	 * @param itemName
	 *            項目名
	 * @return 属性エラーマップ
	 */
	private Map<String, String> getFormErrInfMap(String itemName,
			String itemValue) {
		Map<String, String> returnMap = new HashMap<String, String>();

		// エラーメッセージ設定
		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1002);
		returnMap.put(ERROR_MESSAGE, String
				.format("%s:%s", itemName, itemValue));

		return returnMap;
	}

	/**
	 * 関連チェックエラーマップ作成メソッドです。 <br>
	 * 
	 * @param itemName
	 *            項目名
	 * @return 属性エラーマップ
	 */
	private Map<String, String> getLinkErrInfMap(String itemName,
			String itemValue) {
		Map<String, String> returnMap = new HashMap<String, String>();

		// エラーメッセージ設定
		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_2001);
		returnMap.put(ERROR_MESSAGE, String
				.format("%s:%s", itemName, itemValue));

		return returnMap;
	}

	/**
	 * 会員情報の削除連携用の指示書パラメータ作成。<br />
	 * 
	 * @param sysid
	 *            SYSID
	 * @return 指示書登録用パラメータ
	 */
	private Map<String, Object> createShijishoParamDelMmb(String sysid) {
		Map<String, Object> inMap = new HashMap<String, Object>();
		inMap.put(ECK0151D010CBSMsg.TRN_CD, SJISHO_TRN_CD_ADMIN_API);
		inMap.put(ECK0151D010CBSMsg.ERR_CNT, "0");
		inMap.put(ECK0151D010CBSMsg.TRAN_TRGT_SYSID, sysid);
		inMap.put(ECK0151D010CBSMsg.RSLT_FLG, "0");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_YK_CNT, "22");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_1, ADMIN_SJISHO_PARAM1_DEL);
		inMap.put(ECK0151D010CBSMsg.PARAMETER_19, JCCBPCommon.getSysDateTime());
		return inMap;
	}

	/**
	 * 
	 * 会員情報更新依頼CC実行。会員情報更新依頼CCを行う。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void execJCKSV900101CC(SessionHandle handle,
			IRequestParameterReadWrite param, String sysid) throws Throwable {
		String fixedText = "IdaSijishoRenkeiCC";
		param.setData("IdaSijishoRenkeiCC", new HashMap<String, Object>());

		HashMap<String, Object> inMap = (HashMap<String, Object>) param
				.getData(fixedText);

		// パラメータ設定
		inMap.put(CKSV9001_CKSV9001OP_CKSV900101CC.TRN_CD,
				SJISHO_TRN_CD_ADMIN_API);
		inMap.put(CKSV9001_CKSV9001OP_CKSV900101CC.UPD_TRGT_SYSID, sysid);
		inMap.put(CKSV9001_CKSV9001OP_CKSV900101CC.TRGT_TABLE_ID, null);

		JCKSV900101CC jcksv900101cc = new JCKSV900101CC();
		jcksv900101cc.executeMain(handle, param, fixedText);
	}

	/**
	 * Web申込相談削除
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param mskmsho_no
	 * @param state
	 * @param mskm_uk_dtm
	 * @param mskm_naiyo
	 * @param sysid
	 * @throws Exception
	 */
	private void execEFU0391E010(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param, String fixedText, String sysid)
			throws Exception {
		Object[][] efu0391e010 = {
				{ EFU0391E010CBSMsg.TEMPLATEID, TEMPLATE_ID_EFU0391E010 },
				{ EFU0391E010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
				{ EFU0391E010CBSMsg.SYSID, sysid } };
		// サービスIF実行
		callSC(handle, scCall, param, fixedText, efu0391e010);
	}

	/**
	 * Web申込一時保存削除
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param mskmsho_no
	 * @param state
	 * @param mskm_uk_dtm
	 * @param mskm_naiyo
	 * @param sysid
	 * @throws Exception
	 */
	private void execEFU0381E010(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param, String fixedText, String sysid)
			throws Exception {

		CAANMsg efu0381b010Msg = null;
		Object[][] efu0381b010 = {
				{ EFU0381B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EFU0381B010 },
				{ EFU0381B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_3 },
				{ EFU0381B010CBSMsg.KEY_SYSID, sysid }
		};
		// サービスIF実行
		efu0381b010Msg = callSC(handle, scCall, param, fixedText, efu0381b010);

		CAANMsg[] efu0381b010cbsmsg1list = efu0381b010Msg.getCAANMsgList(EFU0381B010CBSMsg.EFU0381B010CBSMSG1LIST);
		if (efu0381b010cbsmsg1list != null && efu0381b010cbsmsg1list.length > 0)
		{
			for (CAANMsg efu0381b010cbsmsg : efu0381b010cbsmsg1list)
			{
				String mskmshoNo = efu0381b010cbsmsg.getString(EFU0381B010CBSMsg1List.MSKMSHO_NO);

				Object[][] efu0381e010 = {
						{ EFU0381E010CBSMsg.TEMPLATEID, TEMPLATE_ID_EFU0381E010 },
						{ EFU0381E010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
						{ EFU0381E010CBSMsg.MSKMSHO_NO, mskmshoNo } };
				// サービスIF実行
				callSC(handle, scCall, param, fixedText, efu0381e010);
			}
		}
	}

	/**
	 * サービスIFの呼び出し時の電文作成処理 <br/>
	 * 
	 * @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 (mappingData[i][1] instanceof CAANMsg[]) {
				// CAANMsg[]の場合
				template.set((String) mappingData[i][0],
						(CAANMsg[]) mappingData[i][1]);
			} else {
				// CAANMsg[]の以外
				if (JFUStrConst.EMPTY.equals(mappingData[i][1])) {
					// nullの場合

					template.setNull((String) mappingData[i][0]);
				} else {
					// それ以外

					template.set((String) mappingData[i][0], mappingData[i][1]);
				}
			}
		}

		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * サービスIFの呼び出しエラー時のレスポンス情報作成 <br/>
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * @param mappingData
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(
			IRequestParameterReadWrite param, CAANMsg[] templates,
			int returnCode, String fixedText, Object[][] mappingData)
			throws RequestParameterException {
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if (returnCode != 0) {
			// 0以外のとき

			templateStatus = 9000;
		}

		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_"
				+ String.format("%1$04d", templateStatus)) == null) {
			// nullの場合

			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null) {
			// nullの場合

			bpStatus = -1;
		} else {
			// 他の場合
			bpStatus = Integer.parseInt((String) param
					.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}
		if (templateStatus > bpStatus) {
			// ステータスを比較

			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_"
					+ formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		HashMap<String, String> inMap = null;

		// ユーザデータ情報
		inMap = (HashMap<String, String>) param.getData(fixedText);

		for (int i = 0; i < mappingData.length; i++) {
			if (!template.isNull(mappingData[i][0] + "_err")) {
				// nullの場合

				// ユーザデータ情報にエラーを確認する
				if (!inMap.containsKey(mappingData[i][0] + "_err")) {
					inMap.put(mappingData[i][0] + "_err", template
							.getString(mappingData[i][0] + "_err"));
				}
			}
		}
		return param;
	}

	/**
	 * SC(サービスインターフェイス）を呼び出す。 <br/>
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Exception
	 */
	private CAANMsg callSC(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param, String fixedText,
			Object[][] mappingData) throws Exception {
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);

		Map<?, ?> result = scCall.run(paramMap, handle);

		CAANMsg[] templates = (CAANMsg[]) result
				.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];

		// リターンコード取得
		Object return_code = result.get(JCMConstants.RET_CD_INT_KEY);
		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);

		editErrorInfoCom(param, templates, (Integer) return_code, fixedText,
				mappingData);

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>) param
				.getControlMapData(SCControlMapKeys.ERROR_INFO);

		if (errList == null) {
			// エラー情報のマップない場合

			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil
				.getErrorInfo(result, errList));

		if (!("0".equals(return_code.toString()) && 0 == status)) {
			// 異常の場合、SCCallExceptionを生成してスローする

			throw new SCCallException("戻り値不正", return_code.toString(), status);
		}
		return msg;
	}

	/**
	 * 削除処理失敗したSYSIDをシスログに出力する。
	 * @param sysid SYSID
	 * @param funcCode 機能コード
	 * @param msgStr メッセージ
	 */
	private void printSyslog4Err(String preSysid, String funcCode, String msgStr)
	{
		String proId = JFUStrConst.EMPTY;

		StringBuilder msg = new StringBuilder(getClass().getSimpleName());


		if (JFUMkmInfoAddFrontiaConstCC.FUNC_CODE_CONF.equals(funcCode))
		{
			proId = "FUIFE194";
			msg.append("FUIFE194_WEB申込内容登録：WEB申込内容削除CC（" + msgStr + " : SYSID : " + preSysid + "）");
		}
		else
		{
			proId = "FUIFE202";
			msg.append("FUIFE202_WEB申込内容削除：WEB申込内容削除CC（" + msgStr + " : SYSID : " + preSysid + "）");
		}

		HashMap<String, Object> propMap = new HashMap<String, Object>();
		propMap.put(JCCSuperComExecUtil.EXEC_BUFF_SIZE, JCMAPLConstMgr.getString(JCCSuperComExecUtil.EXEC_BUFF_SIZE));
		propMap.put(JCCSuperComExecUtil.EXEC_PERMIT_MEMORY, JCMAPLConstMgr.getString(JCCSuperComExecUtil.EXEC_PERMIT_MEMORY));
		propMap.put(JCCSyslogFormat.SYSLOG_FOMAT_PTN_KEY, JCMAPLConstMgr.getString(JCCSyslogFormat.SYSLOG_FOMAT_PTN_KEY));
		propMap.put(JCCSyslogFormat.SYSLOG_MAILING_ID_KEY, JCMAPLConstMgr.getString(JCCSyslogFormat.SYSLOG_MAILING_ID_KEY));
		propMap.put(JCCSyslogFormat.SYSLOG_OUT_DIR_OPTION, JCMAPLConstMgr.getString(JCCSyslogFormat.SYSLOG_OUT_DIR_OPTION));

		String sysdate = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date(System.currentTimeMillis()));
		String msgId = "EFUO0010CW";

		// シスログ(mes.log)に出力して、「"WAR"」でマイナーアラームとして検知させる。
		JCCSyslogFormat.logger(proId, msgId, sysdate, msg.toString(), "WAR", propMap);
		JSYejbLog.println(JSYLogBase.EXECUTION, this.getClass(), msg);
	}
}