/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JFUWebMskmNyoBrdelCC
 *   ソースファイル名：JFUWebMskmNyoBrdelCC.java
 *   作成者          ：富士通
 *   日付            ：2023年2月20日
 *＜機能概要＞
 *   WEB申込内容削除CC
 *＜修正履歴＞
 *   バージョン  	修正日      修正者      修正内容
 *   v64.0.0		2023/2/20	FJ			ANK-4385-00-00_Web申込一時保存情報の物理削除対応
 *
 **********************************************************************/
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.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.Map;

import com.fujitsu.futurity.bp.custom.constant.CKSV9001_CKSV9001OP_CKSV900101CC;
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.ejb.common.JSYejbLog;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JPCDateUtil;
import eo.common.util.JPCUtilCommon;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg1List;
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.EFU0381A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EFU0381B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EFU0381B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EFU0381E020CBSMsg;
import eo.ejb.cbs.cbsmsg.EFU0391A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EFU0391A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EFU0391E020CBSMsg;

/**
 * WEB申込内容物理削除CC
 *
 * <br>
 *
 * @author 富士通
 */
public class JFUWebMskmNyoBrdelCC extends AbstractCommonComponent
{

	/** テンプレートID */
	private static final String TEMPLATE_ID_EFU0391E020 = "EFU0391E020";
	private static final String TEMPLATE_ID_EFU0381B010 = "EFU0381B010";
	private static final String TEMPLATE_ID_EFU0381E020 = "EFU0381E020";
	private static final String TEMPLATE_ID_EFU0381A010 = "EFU0381A010";
	private static final String TEMPLATE_ID_EFU0391A010 = "EFU0391A010";
	private static final String TEMPLATE_ID_ECK0011A010 = "ECK0011A010";

	/** 業務パラメータ管理キー：Web申込内容保存期間 */
	private static final String FU_WEBMKNYO_SAVE_PRD = "FU_WEBMKNYO_SAVE_PRD";

	/** SYSIDパラメータ名 */
	private static final String PARAM_SYSID = "sysid";

	/** 申込書番号パラメータ名 */
	private static final String PARAM_MSKMSHO_NO = "mskmsho_no";

	/** 無効フラグパラメータ名 */
	private static final String PARAM_MK_FLG = "mk_flg";

	/** 更新年月日時分秒パラメータ名 */
	private static final String PARAM_UPD_DTM = "upd_dtm";

	/** OUT項目：リターンコード */
	private static final String OUT_PARAM_RETURN_CD = "return_Cd";
	/** OUT項目：リターンメッセージ */
	private static final String OUT_PARAM_RETURN_MESSAGE = "return_Message";

	/** リターンコード(0:正常終了) */
	private static final String RETURN_CD_0 = "0";
	/** リターンコード(1:異常終了) */
	private static final String RETURN_CD_1 = "1";

	/**
	 * WEB申込内容削除CC <br>
	 *
	 * @param handle
	 *            セッションハンドル
	 * @param param
	 *            リクエストパラメータ
	 * @param fixedText
	 *            ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable
	 *             例外が発生した場合
	 */
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{

		Map<String, Object> ccMsg = null;
		try
		{
			ccMsg = (Map<String, Object>)param.getData(fixedText);
			String mskmshono = (String)ccMsg.get(PARAM_MSKMSHO_NO);
			String upddtm = (String)ccMsg.get(PARAM_UPD_DTM);
			String mkflg = (String)ccMsg.get(PARAM_MK_FLG);

			// OUT項目:リターンコード
			ccMsg.put(OUT_PARAM_RETURN_CD, RETURN_CD_0);

			// サービスIF実行
			// SC呼び出し部品のインスタンス生成
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

			//=================================================
			// 1.Web申込内容一時保存物理削除 判定処理
			//=================================================

			// 業務パラメータ：Web申込内容保存期間
			String fu_webmknyo_save_prd = JFUBPCommon.getWorkParamKnri(handle, param, FU_WEBMKNYO_SAVE_PRD);

			// 保存期限の年月日を生成(バッチ運用日付に対し、申込内容保存期間前の年月日)
			String saveprd = JPCDateUtil.addDay(JCCBPCommon.getBatOpeDate(null), Integer.parseInt(fu_webmknyo_save_prd) * -1);

			if (!JFUBPCommon.isNull(mskmshono) && !JFUBPCommon.isNull(upddtm) && !JFUBPCommon.isNull(mkflg))
			{
				// Web申込内容一時保存物理削除に必要な情報がある場合

				if ("1".equals(mkflg))
				{
					// Web申込内容一時保存が論理削除されている場合

					//***************************************************
					// Web申込内容一時保存検索（物理削除データが存在するか）
					//***************************************************
					CAANMsg efu0381a010Msg = null;
					CAANMsg[] efu0381a010Msg1List = null;
					Object[][] efu0381a010 =
							{ { EFU0381A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EFU0381A010 }, { EFU0381A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 }, { EFU0381A010CBSMsg.KEY_MSKMSHO_NO, mskmshono } };

					efu0381a010Msg = callSC(handle, scCall, param, fixedText, efu0381a010);
					efu0381a010Msg1List = efu0381a010Msg.getCAANMsgList(EFU0381A010CBSMsg.EFU0381A010CBSMSG1LIST);

					if (null != efu0381a010Msg1List && efu0381a010Msg1List.length > 0)
					{
						String updDtmCheck = efu0381a010Msg1List[0].getString(EFU0381A010CBSMsg1List.UPD_DTM);

						//***************************************************
						// Web申込内容一時保存物理削除
						//***************************************************
						execEFU0381E020(handle, scCall, param, fixedText, mskmshono, updDtmCheck);
					}
				}
				else
				{
					// Web申込内容一時保存のレコードが有効な場合

					//***************************************************
					// Web申込内容一時保存検索（更新年月日の最終チェック）
					// ※当バッチ処理と同タイミングで更新が発生していないかを確認
					//***************************************************
					CAANMsg efu0381a010Msg = null;
					CAANMsg[] efu0381a010Msg1List = null;
					Object[][] efu0381a010 =
							{ { EFU0381A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EFU0381A010 }, { EFU0381A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 }, { EFU0381A010CBSMsg.KEY_MSKMSHO_NO, mskmshono } };

					efu0381a010Msg = callSC(handle, scCall, param, fixedText, efu0381a010);
					efu0381a010Msg1List = efu0381a010Msg.getCAANMsgList(EFU0381A010CBSMsg.EFU0381A010CBSMSG1LIST);

					if (null != efu0381a010Msg1List && efu0381a010Msg1List.length > 0)
					{
						String updDtmCheck = efu0381a010Msg1List[0].getString(EFU0381A010CBSMsg1List.UPD_DTM);

						if (!JPCUtilCommon.isFutureDate(updDtmCheck.substring(0, 8), saveprd, "0"))
						{
							// 更新年月日が「業務パラメータ：Web申込内容保存期間」より算出した日付より古い場合（直前に更新が発生していない場合）

							//***************************************************
							// Web申込内容一時保存物理削除
							//***************************************************
							execEFU0381E020(handle, scCall, param, fixedText, mskmshono, updDtmCheck);
						}
						else
						{
							// 直前に更新が発生した場合

							// 物理削除も後続処理しないので正常終了。
							return param;
						}
					}
					else
					{
						// 取得できない場合は、バッチの処理中に論理削除されたと判断して、翌日の処理に任せる。

						// 物理削除も後続処理しないので正常終了。
						return param;
					}
				}
			}
			else
			{

				// Web申込内容一時保存物理削除に必要な情報がない場合

				// 物理削除しない。
			}

			//=================================================
			// 2.Web申込相談物理削除 判定処理
			//=================================================
			String sysid = (String)ccMsg.get(PARAM_SYSID);

			if (!JFUBPCommon.isNull(sysid))
			{
				// Web申込相談物理削除に必要な情報がある場合

				// Web申込相談物理削除の実施判断フラグ(true:物理削除する、false:物理削除しない)
				boolean webSoudanDelFlg = true;
				// 退会処理を実施判断フラグ(true:退会する、false:退会しない)
				boolean taikaiExecFlg = true;

				//***************************************************
				// Web申込内容一時保存検索（SYSIDに紐ずく有効なデータが存在しないかを確認する）
				//***************************************************
				CAANMsg efu0381b010Msg = null;
				CAANMsg[] efu0381b010Msg1List = 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);
				efu0381b010Msg1List = efu0381b010Msg.getCAANMsgList(EFU0381B010CBSMsg.EFU0381B010CBSMSG1LIST);

				if (null != efu0381b010Msg1List && efu0381b010Msg1List.length > 0)
				{
					//データ取得できた場合（SYSIDに紐ずく有効なデータが存在しないかを確認する）

					for (CAANMsg efu0381b010cbsmsg : efu0381b010Msg1List)
					{
						String updDtmCheck = efu0381b010cbsmsg.getString(EFU0381B010CBSMsg1List.UPD_DTM);

						// Web申込内容一時保存に保存期限が切れていないデータが存在するかチェック
						if (JPCUtilCommon.isFutureDate(updDtmCheck.substring(0, 8), saveprd, "0"))
						{

							// 切れていないデータが存在する場合(「業務パラメータ：Web申込内容保存期間」より算出した日付より新しい更新年月日のデータがある場合)

							// Web申込内容一時保存に有効なデータがあるため、Web申込相談物理削除も退会処理も実施しない。
							webSoudanDelFlg = false;
							taikaiExecFlg = false;
						}
					}
				}
				else
				{
					// Web申込内容一時保存に有効なデータがない場合

					// 後続でWeb申込相談物理削除も退会処理も実施対象と判断。
				}

				if (webSoudanDelFlg)
				{
					// Web申込相談物理削除の実施判断フラグが「true:物理削除する」の場合

					CAANMsg efu0391a010Msg = null;
					CAANMsg[] efu0391a010Msg1List = null;
					Object[][] efu0391a010 =
							{ { EFU0391A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EFU0391A010 }, { EFU0391A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 }, { EFU0391A010CBSMsg.KEY_SYSID, sysid } };

					efu0391a010Msg = callSC(handle, scCall, param, fixedText, efu0391a010);
					efu0391a010Msg1List = efu0391a010Msg.getCAANMsgList(EFU0391A010CBSMsg.EFU0391A010CBSMSG1LIST);
					if (null != efu0391a010Msg1List && efu0391a010Msg1List.length > 0)
					{
						// Web申込相談にデータ存在する場合

						String efu0391a010UpdDtm = efu0391a010Msg1List[0].getString(EFU0391A010CBSMsg1List.UPD_DTM);
						//***************************************************
						// Web申込相談物理削除
						//***************************************************
						execEFU0391E020(handle, scCall, param, fixedText, sysid, efu0391a010UpdDtm);

					}
					else
					{
						// Web申込相談にデータ存在しない場合

						// Web申込相談の物理削除はしない。

					}
				}
				else
				{
					// Web申込相談物理削除の実施判断フラグが「false:物理削除しない」の場合

					// Web申込相談の物理削除はしない。
				}

				//=================================================
				// 3.プレ会員の退会 判定処理
				//=================================================
				if (taikaiExecFlg)
				{
					// 退会処理を実施判断フラグが「true:退会する」の場合

					//***************************************************
					// お客様一意照会
					//***************************************************
					String opeDate = JCCBPCommon.getOpeDate(null);
					CAANMsg eck0011a010Msg = null;
					CAANMsg[] eck0011a010Msg1List = null;
					Object[][] eck0011a010 =
							{ { ECK0011A010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0011A010 }, { ECK0011A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 }, { ECK0011A010CBSMsg.KEY_SYSID, sysid },
									{ ECK0011A010CBSMsg.KEY_RSV_APLY_YMD, opeDate } };

					eck0011a010Msg = callSC(handle, scCall, param, fixedText, eck0011a010);
					eck0011a010Msg1List = eck0011a010Msg.getCAANMsgList(ECK0011A010CBSMsg.ECK0011A010CBSMSG1LIST);

					if (null != eck0011a010Msg1List && eck0011a010Msg1List.length > 0)
					{
						// お客様スキーマに有効なデータが存在する場合

						if (JFUStrConst.CD00260_0.equals(eck0011a010Msg1List[0].getString(ECK0011A010CBSMsg1List.CUST_NTAIKAI_CD))
								&& JFUBPCommon.isNull(eck0011a010Msg1List[0].getString(ECK0011A010CBSMsg1List.CUST_TAIKAI_YMD)))
						{
							// お客様入退会コード="入会"かつ「退会年月日」が未登録の場合（まだ退会済となっていない場合）

							String updDtmSysid = null;
							String svcKeiNo = null;
							String updDtmSvcKei = null;

							//***************************************************
							// お客様情報取得（退会に必要なキー情報を取得）
							//***************************************************
							Map resultCust = callECK0011B050(handle, param, "1", sysid);
							CAANMsg[] dataList = getResultMsgList(resultCust, ECK0011B050CBSMsg.ECK0011B050CBSMSG1LIST);
							if (dataList != null && dataList.length > 0)
							{
								// お客様関連にデータが存在する場合

								// お客様情報照会(PMP連携用)結果を取得
								// お客様情報照会(PMP連携用)結果マップを取得
								String mapKeyPre = ECK0011B050CBSMsg.ECK0011B050CBSMSG1LIST + "[0].";
								svcKeiNo = getResultString(resultCust, mapKeyPre + ECK0011B050CBSMsg1List.SVC_KEI_NO);
								updDtmSvcKei = getResultString(resultCust, mapKeyPre + ECK0011B050CBSMsg1List.UPD_DTM_SVC_KEI);
								updDtmSysid = getResultString(resultCust, mapKeyPre + ECK0011B050CBSMsg1List.UPD_DTM_SYSID);

								if (!JFUBPCommon.isNull(svcKeiNo) && !JFUBPCommon.isNull(updDtmSvcKei))
								{
									//***************************************************
									// サービス契約(標準コンテンツ同意（ホスティング）)解約
									//***************************************************
									Map resultSvcKei = stdardContDsl(handle, param, svcKeiNo, updDtmSvcKei, opeDate);
									if (isSuccess(resultSvcKei))
									{
										//***************************************************
										// お客様退会
										//***************************************************
										Map resultCustTaikai = callECK0011C060(handle, param, sysid, opeDate, TAIKAI_RSN_CD_CUST_OWN, updDtmSysid);
										if (isSuccess(resultCustTaikai))
										{
											updDtmSysid = getResultString(resultCustTaikai, ECK0011C180CBSMsg.UPD_DTM);

											//***************************************************
											// 指示書登録
											//***************************************************
											// 会員情報の削除連携用の指示書作成
											Map sjishoMap = createShijishoParamDelMmb(sysid);
											Map resultSjisho = callECK0151D010Map(handle, param, sjishoMap);
											if (isSuccess(resultSjisho))
											{
												//***************************************************
												// 会員情報更新依頼CC実行
												//***************************************************
												execJCKSV900101CC(handle, param, sysid);
											}
											else
											{
												printSyslog4Err(sysid, "1", "プレ会員情報の指示書登録でエラー。");
												// OUT項目:リターンコード
												ccMsg.put(OUT_PARAM_RETURN_CD, RETURN_CD_1);
												// OUT項目:リターンメッセージ
												ccMsg.put(OUT_PARAM_RETURN_MESSAGE, "プレ会員情報の指示書登録でエラー。(SYSID:" + sysid + ")");
												throw new CCException("INVALID_RETURN_MESSAGE", new Exception());
											}
										}
										else
										{
											printSyslog4Err(sysid, "1", "プレ会員情報のお客様退会でエラー。");
											// OUT項目:リターンコード
											ccMsg.put(OUT_PARAM_RETURN_CD, RETURN_CD_1);
											// OUT項目:リターンメッセージ
											ccMsg.put(OUT_PARAM_RETURN_MESSAGE, "プレ会員情報のお客様退会でエラー。(SYSID:" + sysid + ")");
											throw new CCException("INVALID_RETURN_MESSAGE", new Exception());
										}
									}
									else
									{
										printSyslog4Err(sysid, "1", "プレ会員情報のサービス契約(標準コンテンツ同意（ホスティング）)解約でエラー。");
										// OUT項目:リターンコード
										ccMsg.put(OUT_PARAM_RETURN_CD, RETURN_CD_1);
										// OUT項目:リターンメッセージ
										ccMsg.put(OUT_PARAM_RETURN_MESSAGE, "プレ会員情報のサービス契約(標準コンテンツ同意（ホスティング）)解約でエラー。(SYSID:" + sysid + ":サービス契約番号:" + svcKeiNo + ")");
										throw new CCException("INVALID_RETURN_MESSAGE", new Exception());
									}
								}
								else
								{
									// サービス契約(標準コンテンツ同意)解約に必要な情報がない場合

									// 何もしない。
								}
							}
							else
							{
								// 何もしない。
							}
						}
						else
						{
							// 既に退会済の場合

							// 何もしない。
						}
					}
					else
					{
						// お客様スキーマに有効なデータが存在しない場合

						// 何もしない。
					}
				}
			}
			else
			{
				// Web申込相談物理削除と退会に必要な情報がない場合

				// 何もしない。
			}
		}
		catch (SCCallException e)
		{
			// OUT項目:リターンコード
			ccMsg.put(OUT_PARAM_RETURN_CD, RETURN_CD_1);
			// OUT項目:リターンメッセージ
			ccMsg.put(OUT_PARAM_RETURN_MESSAGE, e.getMessage() + "(" + e.getErrorLevel() + ":" + e.getStatusCD() + ")");
			throw e;
		}
		catch (CCException e)
		{
			// OUT項目:リターンコード
			ccMsg.put(OUT_PARAM_RETURN_CD, RETURN_CD_1);
			// OUT項目:リターンメッセージ
			ccMsg.put(OUT_PARAM_RETURN_MESSAGE, e.getMessage() + "(" + e.getErrorLevel() + ")");
			throw e;
		}
		catch (Throwable e)
		{
			// OUT項目:リターンコード
			ccMsg.put(OUT_PARAM_RETURN_CD, RETURN_CD_1);
			// OUT項目:リターンメッセージ
			ccMsg.put(OUT_PARAM_RETURN_MESSAGE, e.getMessage());
			throw e;
		}
		return param;
	}

	/**
	 * 会員情報の削除連携用の指示書パラメータ作成。<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
	 */
	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 execEFU0391E020(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param, String fixedText, String sysid, String upddtm) throws Exception
	{
		Object[][] efu0391e020 = { { EFU0391E020CBSMsg.TEMPLATEID, TEMPLATE_ID_EFU0391E020 }, { EFU0391E020CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 }, { EFU0391E020CBSMsg.SYSID, sysid }, { EFU0391E020CBSMsg.UPD_DTM, upddtm } };
		// サービスIF実行
		callSC(handle, scCall, param, fixedText, efu0391e020);
	}

	/**
	 * 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 execEFU0381E020(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param, String fixedText, String strMskmshono, String strUpddtm)
			throws Exception
	{

		Object[][] efu0381e020 =
				{ { EFU0381E020CBSMsg.TEMPLATEID, TEMPLATE_ID_EFU0381E020 }, { EFU0381E020CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 }, { EFU0381E020CBSMsg.MSKMSHO_NO, strMskmshono },
						{ EFU0381E020CBSMsg.UPD_DTM, strUpddtm } };

		// サービスIF実行
		callSC(handle, scCall, param, fixedText, efu0381e020);

	}

	/**
	 * サービス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
	 */
	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 strSysid, String funcCode, String msgStr)
	{

		String proId = "JBSbatFUWebMskmNyoDelTgCst";

		StringBuilder msg = new StringBuilder(getClass().getSimpleName());
		msg.append("JFUWebMskmNyoBrdelCC_WEB申込内容物理削除CC：（" + msgStr + " : SYSID : " + strSysid + "）");

		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);
	}

}