/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JCKLineIdInfoAddCC
*	ソースファイル名：JCKLineIdInfoAddCC.java
*	作成者			：FJ)吉田
*	日付			：2019年01月31日
*＜機能概要＞
*	LINE-ID情報登録(LINE)の共通コンポーネントクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v41.00.00	2019/01/31	FJ)吉田		【ANK-3355-00-00】LINEへの契約情報連携
*	v43.00.00	2019/05/24	FJ)吉田		【ANK-3629-00-00】LINE-ID連携：認証解除登録対応
*	v56.00.00	2021/11/05	FJ)杉本		【ANK-4008-00-00】LINE-ID認証：未解除情報の解除対応
*	v63.00.00	2022/09/28	FJ)渋谷		【ANK-4276-00-00】LINE-ID認証：複数SYSID紐付き解除対応
*
**********************************************************************/
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.common.JCMConstants;
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.DatetimeCheck;
import com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;

import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0271A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0271A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0271B010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0271B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0271C010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0271D010CBSMsg;

public class JCKLineIdInfoAddCC extends AbstractCommonComponent
{

	// -------------
	// 作業用マップ
	// -------------
	/** 作業用マップ名 */
	private final String WORK_MAP_NAME = "JCKLineIdInfoAddCC";
	/** 作業用マップキー：ECK0011A010_お客さま一意照会 */
	private final String WORK_KEY_ECK0011A010 = "WM_ECK0011A010";
	/** 作業用マップキー：ECK0271A010_LINE情報管理一意照会 */
	private final String WORK_KEY_ECK0271A010 = "WM_ECK0271A010";
	// ANK-4008-00-00 ADD START
	/** 作業用マップキー：ECK0271B010_LINE情報管理一覧照会 */
	private final String WORK_KEY_ECK0271B010 = "WM_ECK0271B010";
	// ANK-4008-00-00 ADD END
	// ANK-4276-00-00 ADD START
	/** 作業用マップキー：ECK0271B010_LINE情報管理一覧照会 */
	private final String WORK_KEY_ECK0271B010_2 = "WM_ECK0271B010_2";
	// ANK-4276-00-00 ADD END
	/** 作業用マップキー：ECK0271C010_LINE情報管理更新 */
	private final String WORK_KEY_ECK0271C010 = "WM_ECK0271C010";
	/** 作業用マップキー：ECK0271D010_LINE情報管理登録 */
	private final String WORK_KEY_ECK0271D010 = "WM_ECK0271D010";
	
	// ----------
	// TemplateID
	// ----------
	/** TamplateID：ECK0011A010_お客さま一意照会 */
	private final String TEMPLATE_ID_ECK0011A010 = "ECK0011A010";
	/** TamplateID：ECK0271A010_LINE情報管理一意照会 */
	private final String TEMPLATE_ID_ECK0271A010 = "ECK0271A010";
	// ANK-4008-00-00 ADD START
	/** TamplateID：ECK0271B010_LINE情報管理一覧照会 */
	private final String TEMPLATE_ID_ECK0271B010 = "ECK0271B010";
	// ANK-4008-00-00 ADD END
	/** TamplateID：ECK0271C010_LINE情報管理更新 */
	private final String TEMPLATE_ID_ECK0271C010 = "ECK0271C010";
	/** TamplateID：ECK0271D010_LINE情報管理登録 */
	private final String TEMPLATE_ID_ECK0271D010 = "ECK0271D010";
	
	// ------------------------
	// CCパラメータ
	// ------------------------
	/** CCパラメータ：ボディ情報 */
	private final String CC_PARAM_BODY_INFO = "BODY_INFO";
	/** CCパラメータ：エラー情報 */
	private final String CC_PARAM_ERROR_INFO = "ERROR_INFO";
	
	// ------------------------
	// リクエストパラメータ定数
	// ------------------------
	/** リクエストパラメータ：SYSID */
	private final String REQ_PARAM_SYSID = "sysid";
	/** リクエストパラメータ：LINE-ID */
	private final String REQ_PARAM_LINE_ID = "line_id";
	// ANK-3629-00-00 ADD START
	/** リクエストパラメータ：認証区分 */
	private final String REQ_PARAM_NINSHO_DIV = "ninsho_div";
	/** リクエストパラメータ：認証日時 */
	private final String REQ_PARAM_NINSHO_DTM = "ninsho_dtm";
	// ANK-3629-00-00 ADD END
	
	// ------------------------
	// レスポンスパラメータ定数
	// ------------------------
	/** レスポンスパラメータ：エラーコード */
	private final String RES_PARAM_ERRCODE = "errCode";
	/** レスポンスパラメータ：エラーメッセージ */
	private final String RES_PARAM_ERRMESSAGE = "errMessage";
	/** レスポンスパラメータ：LINE-ID */
	private final String RES_PARAM_LINE_ID = "line_id";
	// ANK-3629-00-00 ADD START
	/** レスポンスパラメータ：認証区分 */
	private final String RES_PARAM_NINSHO_DIV = "ninsho_div";
	/** レスポンスパラメータ：認証日時 */
	private final String RES_PARAM_NINSHO_DTM = "ninsho_dtm";
	// ANK-3629-00-00 ADD END
	
	// ----------
	// エラー定数
	// ----------
	/** エラーコード */
	public static final String ERROR_CODE = "errCode";
	/** エラーメッセージ */
	public static final String ERROR_MESSAGE = "errMessage";
	/** リターンメッセージ取得キー */
	private static final String RETURN_MESSAGE_STRING = "RETURN_MESSAGE_";
	/** リターンメッセージの書式指定文字列 */
	private static final String RETURN_MESSAGE_FORMAT = "%1$04d";
	/** エラー項目接尾辞 */
	private static final String ERRITEM_SUFFIX = "_err";
	
	// ANK-3629-00-00 ADD START
	// ----------
	// クラス定数
	// ----------
	/** 認証区分：1(認証) */
	private static final String NINSHO_DIV_NINSYO = "1";
	/** 認証区分：2(解除) */
	private static final String NINSHO_DIV_KAIJYO = "2";
	// ANK-3629-00-00 ADD END
	// ANK-4008-00-00 ADD START
	/** 対象LINE-ID処理済みフラグ */
	private Boolean TGT_LINE_ID_TRN_DONE_FLG = false;
	// ANK-4008-00-00 ADD END
	// ANK-4276-00-00 ADD START
	/** 解除設定フラグ */
	private Boolean RLS_SET_FLG = false;
	// ANK-4276-00-00 ADD END
	
	
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite addLineIdInfo(SessionHandle handle,
			IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
	
		// ------------
		// CCマップ取得
		// ------------
		// LINE-ID情報登録(LINE)CCマップの取得
		Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);
		
		// ----------------
		// 作業用マップ取得
		// ----------------
		HashMap workmap = getCCWorkMap(param);
		
		// ------------------
		// 各種エラーチェック
		// ------------------
		// 単項目チェック
		if (!unitErrorChk(ccMsg))
		{
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
			return param;
		}
		
		// 関連チェック
		if (!parameterErrorChk(handle, param, fixedText, ccMsg))
		{
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
			return param;
		}
		
		// ECK0271A010：LINE情報管理一意照会
		execECK0271A010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID), (String)ccMsg.get(REQ_PARAM_LINE_ID));
		
		List<Map<String, String>> resultEck0271a010List = (List<Map<String, String>>)workmap.get(WORK_KEY_ECK0271A010);
		
		// ANK-3629-00-00 ADD START
		// リクエスト：認証区分
		String reqNinshoDiv = (String)ccMsg.get(REQ_PARAM_NINSHO_DIV);
		// リクエスト：認証日時
		String reqNinshoDtm = (String)ccMsg.get(REQ_PARAM_NINSHO_DTM);
		
		// 認証区分：１の場合
		if (NINSHO_DIV_NINSYO.equals(reqNinshoDiv))
		{
			// 照会データの状況によって登録、更新を行う。
			// ANK-3629-00-00 ADD END
			
			// ANK-4008-00-00 MOD START
//			// 照会データが存在すれば更新する
//			if (resultEck0271a010List != null && resultEck0271a010List.size() > 0)
//			{
//				// ANK-3629-00-00 ADD START
//				// 認証登録年月日時分秒
//				String ninshoAddDtm = resultEck0271a010List.get(0).get(ECK0271A010CBSMsg1List.LINE_ID_NINSHO_ADD_DTM);
//				// 認証解除年月日時分秒
//				String ninshoRlsDtm = resultEck0271a010List.get(0).get(ECK0271A010CBSMsg1List.LINE_ID_NINSHO_RLS_DTM);
//				
//				// 認証日時がLINE-ID登録日時より新しい値の場合
//				if (JKKStringUtil.isNullEmpty(ninshoAddDtm) || (reqNinshoDtm.compareTo(ninshoAddDtm) > 0))
//				{
//					// ANK-3629-00-00 ADD END
//					// ECK0271C010：LINE情報管理更新
//					// ANK-3629-00-00 MOD START
////					execECK0271C010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID), (String)ccMsg.get(REQ_PARAM_LINE_ID), resultEck0271a010List.get(0).get(ECK0271A010CBSMsg1List.UPD_DTM));
//					execECK0271C010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID), (String)ccMsg.get(REQ_PARAM_LINE_ID), 
//							reqNinshoDtm, ninshoRlsDtm, resultEck0271a010List.get(0).get(ECK0271A010CBSMsg1List.UPD_DTM));
//					// ANK-3629-00-00 MOD END
//					// ANK-3629-00-00 ADD START
//				}
//				// ANK-3629-00-00 ADD END
//			}
//			else
//			{
//				// ECK0271D010：LINE情報管理登録
//				// ANK-3629-00-00 MOD START
////				execECK0271D010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID), (String)ccMsg.get(REQ_PARAM_LINE_ID));
//				execECK0271D010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID), (String)ccMsg.get(REQ_PARAM_LINE_ID), reqNinshoDtm, "");
//				// ANK-3629-00-00 MOD END
//			}
			// SYSIDをキーにデータ取得
			// ECK0271B010：LINE情報管理一覧照会
			execECK0271B010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID));
			List<Map<String, String>> resultEck0271b010List = (List<Map<String, String>>)workmap.get(WORK_KEY_ECK0271B010);
			
			String maxNinshoAddDtm = "";
			// 照会データが存在すれば最大の認証登録年月日時分秒を取得し、取得データを処理する
			if (resultEck0271b010List != null && resultEck0271b010List.size() > 0)
			{
				// 最大の認証登録年月日時分秒を取得
				maxNinshoAddDtm = getMaxNinshoAddDtm(resultEck0271b010List);
			
				// 取得したデータを全件処理する
				for (int i = 0; i < resultEck0271b010List.size(); i++)
				{
					// 認証登録年月日時分秒
					String ninshoAddDtm = resultEck0271b010List.get(i).get(ECK0271B010CBSMsg1List.LINE_ID_NINSHO_ADD_DTM);
					// 認証解除年月日時分秒
					String ninshoRlsDtm = resultEck0271b010List.get(i).get(ECK0271B010CBSMsg1List.LINE_ID_NINSHO_RLS_DTM);
					
					// LINE-IDが一致する場合
					if(resultEck0271b010List.get(i).get(ECK0271B010CBSMsg1List.LINE_ID).compareTo((String)ccMsg.get(REQ_PARAM_LINE_ID)) == 0)
					{
						// 対象LINE-ID処理済みフラグ を ON
						TGT_LINE_ID_TRN_DONE_FLG = true;
						
						//処理中のLINE情報管理スキーマ．認証登録年月日時分秒 ＜ リクエスト．認証日時
						if (reqNinshoDtm.compareTo(ninshoAddDtm) > 0)
						{
							// 最大の認証登録年月日時分秒 > リクエスト.認証日時
							if (maxNinshoAddDtm.compareTo(reqNinshoDtm) > 0)
							{
								// リクエスト.認証日時を認証登録年月日時分秒、認証解除年月日時分秒に設定して更新
								execECK0271C010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID), (String)ccMsg.get(REQ_PARAM_LINE_ID)
										, reqNinshoDtm, reqNinshoDtm, resultEck0271b010List.get(i).get(ECK0271B010CBSMsg1List.UPD_DTM));
							}
							else
							{
								// リクエスト.認証日時を認証登録年月日時分秒に設定して更新
								execECK0271C010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID), (String)ccMsg.get(REQ_PARAM_LINE_ID)
										, reqNinshoDtm, ninshoRlsDtm, resultEck0271b010List.get(i).get(ECK0271B010CBSMsg1List.UPD_DTM));
							}
						}
						else
						{
							// 最大の認証登録年月日時分秒 > レコード.認証登録年月日時分秒
							if (maxNinshoAddDtm.compareTo(ninshoAddDtm) > 0)
							{
								// レコード.認証登録年月日時分秒を認証解除年月日時分秒に設定して更新
								execECK0271C010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID), (String)ccMsg.get(REQ_PARAM_LINE_ID)
										, ninshoAddDtm, ninshoAddDtm, resultEck0271b010List.get(i).get(ECK0271B010CBSMsg1List.UPD_DTM));
							}
						}
					}
					else
					{
						// レコード．認証登録年月日時分秒 ≧ リクエスト．認証日時
						if (ninshoAddDtm.compareTo(reqNinshoDtm) >= 0)
						{
							// 最大の認証登録年月日時分秒 ＞ レコード．認証登録年月日時分秒
							if (maxNinshoAddDtm.compareTo(ninshoAddDtm) > 0)
							{
								// レコード.認証登録年月日時分秒をLINE情報管理スキーマ.認証解除年月日時分秒に設定して更新
								execECK0271C010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID), resultEck0271b010List.get(i).get(ECK0271B010CBSMsg1List.LINE_ID)
										, ninshoAddDtm, ninshoAddDtm, resultEck0271b010List.get(i).get(ECK0271B010CBSMsg1List.UPD_DTM));
							}
							// ANK-4276-00-00 ADD START
							// レコード.認証日時 = リクエスト.認証登録日時
							else if(ninshoAddDtm.compareTo(reqNinshoDtm) == 0)
							{
								// レコード.認証解除年月日時分秒がNULL又は、レコード．認証解除年月日時分秒 ＜ レコード．認証登録年月日時分秒
								if (ninsyoJdg(ninshoAddDtm,ninshoRlsDtm))
								{
									// レコード.認証日時をレコード.認証解除年月日時分秒に設定して更新
									execECK0271C010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID), resultEck0271b010List.get(i).get(ECK0271B010CBSMsg1List.LINE_ID)
										, ninshoAddDtm, ninshoAddDtm, resultEck0271b010List.get(i).get(ECK0271B010CBSMsg1List.UPD_DTM));
								}
							}
							// ANK-4276-00-00 ADD END
						}
						else
						{
							// 処理中レコードのLINE情報管理スキーマ．認証解除年月日時分秒が空
							if (JKKStringUtil.isNullEmpty(ninshoRlsDtm))
							{
								// リクエスト.認証日時をLINE情報管理スキーマ.認証解除年月日時分秒に設定して更新
								execECK0271C010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID), resultEck0271b010List.get(i).get(ECK0271B010CBSMsg1List.LINE_ID)
										, ninshoAddDtm, reqNinshoDtm, resultEck0271b010List.get(i).get(ECK0271B010CBSMsg1List.UPD_DTM));
							}
							else
							{
								// レコード．認証解除年月日時分秒 ＜ レコード．認証登録年月日時分秒
								if (ninshoAddDtm.compareTo(ninshoRlsDtm) > 0)
								{
									// リクエスト.認証日時をLINE情報管理スキーマ.認証解除年月日時分秒に設定して更新
									execECK0271C010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID), resultEck0271b010List.get(i).get(ECK0271B010CBSMsg1List.LINE_ID)
											, ninshoAddDtm, reqNinshoDtm, resultEck0271b010List.get(i).get(ECK0271B010CBSMsg1List.UPD_DTM));
								}
							}
						}
					}
				}
			}
			// ANK-4276-00-00 ADD START
			// LINE-IDをキーにデータ取得
			// ECK0271B010：LINE情報管理一覧照会
			execECK0271B010_2(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_LINE_ID));
			List<Map<String, String>> resultLineIdicrnShokai = (List<Map<String, String>>)workmap.get(WORK_KEY_ECK0271B010_2);
			String maxLineNinshoAddDtm = "";		
			// 照会データが存在すれば最大の認証登録年月日時分秒を取得し、取得データを処理する
			if (resultLineIdicrnShokai != null && resultLineIdicrnShokai.size() > 0)
			{
				// 最大の認証登録年月日時分秒を取得
				maxLineNinshoAddDtm = getMaxNinshoAddDtm(resultLineIdicrnShokai);
				
				// 最大の認証登録年月日時分秒 ＞ リクエスト．認証日時
				if (maxLineNinshoAddDtm.compareTo(reqNinshoDtm) > 0)
				{
					RLS_SET_FLG = true;
				}
				// 取得したデータを全件処理する
				for (int i = 0; i < resultLineIdicrnShokai.size(); i++)
				{
					// 認証登録年月日時分秒
					String ninshoAddDtm = resultLineIdicrnShokai.get(i).get(ECK0271B010CBSMsg1List.LINE_ID_NINSHO_ADD_DTM);
					// 認証解除年月日時分秒
					String ninshoRlsDtm = resultLineIdicrnShokai.get(i).get(ECK0271B010CBSMsg1List.LINE_ID_NINSHO_RLS_DTM);
					
					// SYSIDが一致しない場合
					if(resultLineIdicrnShokai.get(i).get(ECK0271B010CBSMsg1List.SYSID).compareTo((String)ccMsg.get(REQ_PARAM_SYSID)) != 0)
					{
						// レコード.認証解除年月日時分秒がNULL又は、レコード．認証解除年月日時分秒 ＜ レコード．認証登録年月日時分秒
						if (ninsyoJdg(ninshoAddDtm,ninshoRlsDtm))
						{
							// レコード．認証登録年月日時分秒 ≧ リクエスト．認証日時
							if (ninshoAddDtm.compareTo(reqNinshoDtm) >= 0)
							{
								// 最大の認証登録年月日時分秒 ＞ レコード．認証登録年月日時分秒
								if (maxLineNinshoAddDtm.compareTo(ninshoAddDtm) > 0)
								{
									// 最大の認証登録年月日時分秒をLINE情報管理スキーマ.認証解除年月日時分秒に設定して更新
									execECK0271C010(handle, param, fixedText, resultLineIdicrnShokai.get(i).get(ECK0271B010CBSMsg1List.SYSID), (String)ccMsg.get(REQ_PARAM_LINE_ID)
											, ninshoAddDtm, maxLineNinshoAddDtm, resultLineIdicrnShokai.get(i).get(ECK0271B010CBSMsg1List.UPD_DTM));
								}
								// レコード.認証登録年月日時分秒 = リクエスト.認証登録日時
								else if(ninshoAddDtm.compareTo(reqNinshoDtm) == 0)
								{
									// リクエスト.認証登録日時をLINE情報管理スキーマ.認証解除年月日時分秒に設定して更新
									execECK0271C010(handle, param, fixedText, resultLineIdicrnShokai.get(i).get(ECK0271B010CBSMsg1List.SYSID), (String)ccMsg.get(REQ_PARAM_LINE_ID)
											, ninshoAddDtm, reqNinshoDtm, resultLineIdicrnShokai.get(i).get(ECK0271B010CBSMsg1List.UPD_DTM));
								}
							}
							else
							{
								// 最大の認証登録年月日時分秒 ＞ リクエスト．認証日時
								if (maxLineNinshoAddDtm.compareTo(reqNinshoDtm) > 0)
								{
									// 最大の認証登録年月日時分秒をLINE情報管理スキーマ.認証解除年月日時分秒に設定して更新
									execECK0271C010(handle, param, fixedText, resultLineIdicrnShokai.get(i).get(ECK0271B010CBSMsg1List.SYSID), (String)ccMsg.get(REQ_PARAM_LINE_ID)
											, ninshoAddDtm, maxLineNinshoAddDtm, resultLineIdicrnShokai.get(i).get(ECK0271B010CBSMsg1List.UPD_DTM));
								}
								else
								{
									// リクエスト.認証登録日時をLINE情報管理スキーマ.認証解除年月日時分秒に設定して更新
									execECK0271C010(handle, param, fixedText, resultLineIdicrnShokai.get(i).get(ECK0271B010CBSMsg1List.SYSID), (String)ccMsg.get(REQ_PARAM_LINE_ID)
											, ninshoAddDtm, reqNinshoDtm, resultLineIdicrnShokai.get(i).get(ECK0271B010CBSMsg1List.UPD_DTM));
								}
							}
						}
					}
				}
			}
			// ANK-4276-00-00 ADD END
			
			// リクエスト情報を登録する
			// 対象LINE-ID処理済みフラグ が OFF
			if (!TGT_LINE_ID_TRN_DONE_FLG)
			{
				// ANK-4276-00-00 ADD START
				if (RLS_SET_FLG)
				{
					// リクエスト.認証日時を認証登録年月日時分秒、認証解除年月日時分秒に最大の認証年月日時分秒を設定して登録
					execECK0271D010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID), (String)ccMsg.get(REQ_PARAM_LINE_ID), reqNinshoDtm, maxLineNinshoAddDtm);
				}
				// ANK-4276-00-00 ADD END
				// 最大の認証登録年月日時分秒 > リクエスト.認証日時
				// ANK-4276-00-00 MOD START
//				if (!JKKStringUtil.isNullEmpty(maxNinshoAddDtm) && maxNinshoAddDtm.compareTo(reqNinshoDtm) > 0)
				else if (!JKKStringUtil.isNullEmpty(maxNinshoAddDtm) && maxNinshoAddDtm.compareTo(reqNinshoDtm) > 0)
				// ANK-4276-00-00 MOD START
				{
					// リクエスト.認証日時を認証登録年月日時分秒、認証解除年月日時分秒に設定して登録
					execECK0271D010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID), (String)ccMsg.get(REQ_PARAM_LINE_ID), reqNinshoDtm, reqNinshoDtm);
				}
				else
				{
					// リクエスト.認証日時を認証登録年月日時分秒に設定して登録
					execECK0271D010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID), (String)ccMsg.get(REQ_PARAM_LINE_ID), reqNinshoDtm, "");
				}
			}
			// ANK-4008-00-00 MOD END
			// ANK-3629-00-00 ADD START
		}
		// 認証区分：２の場合
		else if (NINSHO_DIV_KAIJYO.equals(reqNinshoDiv)) 
		{
			// 照会データが存在すれば更新する
			if (resultEck0271a010List != null && resultEck0271a010List.size() > 0)
			{
				// 認証登録年月日時分秒
				String ninshoAddDtm = resultEck0271a010List.get(0).get(ECK0271A010CBSMsg1List.LINE_ID_NINSHO_ADD_DTM);
				// 認証解除年月日時分秒
				String ninshoRlsDtm = resultEck0271a010List.get(0).get(ECK0271A010CBSMsg1List.LINE_ID_NINSHO_RLS_DTM);
				
				// 認証日時がLINE-ID登録日時より新しい値の場合
				if (JKKStringUtil.isNullEmpty(ninshoRlsDtm) || (reqNinshoDtm.compareTo(ninshoRlsDtm) > 0))
				{
					// ECK0271C010：LINE情報管理更新
					execECK0271C010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID), (String)ccMsg.get(REQ_PARAM_LINE_ID), 
							ninshoAddDtm, reqNinshoDtm, resultEck0271a010List.get(0).get(ECK0271A010CBSMsg1List.UPD_DTM));
				}
			}
			// 照会データが存在しなければ登録する
			else
			{
				// ECK0271D010：LINE情報管理登録
				execECK0271D010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID), (String)ccMsg.get(REQ_PARAM_LINE_ID), "", reqNinshoDtm);
			}
		}
		// ANK-3629-00-00 ADD END
		
		// body用マップ
		Map<String, Object> bodyMap = new HashMap<String, Object>();
		
		// LINE-ID
		bodyMap.put(RES_PARAM_LINE_ID, ccMsg.get(REQ_PARAM_LINE_ID));
		// ANK-3629-00-00 ADD START
		bodyMap.put(RES_PARAM_NINSHO_DIV, ccMsg.get(REQ_PARAM_NINSHO_DIV));
		bodyMap.put(RES_PARAM_NINSHO_DTM, ccMsg.get(REQ_PARAM_NINSHO_DTM));
		// ANK-3629-00-00 ADD END
		
		ccMsg.put(CC_PARAM_BODY_INFO, bodyMap);
		ccMsg.put(CC_PARAM_ERROR_INFO, new ArrayList<Map<String, String>>());
		
		return param;
	}
	
	
	/**
	 * 作業項目情報の取得を行います。<br>
	 * 作業項目情報がない場合は作成します。<br>
	 * 
	 * @param workMap 作業領域
	 * @return 作業項目情報
	 */
	@SuppressWarnings("unchecked")
	private HashMap getCCWorkMap(IRequestParameterReadWrite param) throws RequestParameterException {
		Map workMap = param.getMappingWorkArea();
		if (workMap == null)
		{
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}
		
		HashMap clarisWorkMap = (HashMap)workMap.get(WORK_MAP_NAME);
		if (clarisWorkMap == null)
		{
			clarisWorkMap = new HashMap();
			workMap.put(WORK_MAP_NAME, clarisWorkMap);
		}
		return clarisWorkMap;
	}
	
	/**
	 * 単項目エラーチェックを行います。
	 * 
	 * @param ccMsg 
	 * @return
	 */
	private boolean unitErrorChk(Map<String, Object> ccMsg)
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		String itemValue = null;
		
		// SYSID
		itemValue = (String)ccMsg.get(REQ_PARAM_SYSID);
		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap(REQ_PARAM_SYSID));
		}
		else if (!HalfCharCheck.isEnNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(REQ_PARAM_SYSID));
		}
		else if (!LengthCheck.isLength1Check(itemValue, 10))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(REQ_PARAM_SYSID));
		}
		
		// LINE-ID
		itemValue = (String)ccMsg.get(REQ_PARAM_LINE_ID);
		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap(REQ_PARAM_LINE_ID));
		}
		else if (!HalfCharCheck.isEnNumber2Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(REQ_PARAM_LINE_ID));
		}
		else if (!LengthCheck.isLength2Check(itemValue, 1, 100))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(REQ_PARAM_LINE_ID));
		}
		
		// ANK-3629-00-00 ADD START
		// 認証区分
		itemValue = (String)ccMsg.get(REQ_PARAM_NINSHO_DIV);
		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap(REQ_PARAM_NINSHO_DIV));
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(REQ_PARAM_NINSHO_DIV));
		}
		else if (!LengthCheck.isLength2Check(itemValue, 1, 1))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(REQ_PARAM_NINSHO_DIV));
		}
		
		// 認証日時
		itemValue = (String)ccMsg.get(REQ_PARAM_NINSHO_DTM);
		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap(REQ_PARAM_NINSHO_DTM));
		}
		else if (!DatetimeCheck.isDatetimeCheck(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(REQ_PARAM_NINSHO_DTM));
		}
		else if (!LengthCheck.isLength2Check(itemValue, 17, 17))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(REQ_PARAM_NINSHO_DTM));
		}
		// ANK-3629-00-00 ADD END
		
		// エラーが存在する場合
		if (errList.size() > 0)
		{
			// body用マップ
			Map<String, Object> bodyMap = new HashMap<String, Object>();
			
			// LINE-ID
			bodyMap.put(RES_PARAM_LINE_ID, ccMsg.get(REQ_PARAM_LINE_ID));
			// ANK-3629-00-00 ADD START
			bodyMap.put(RES_PARAM_NINSHO_DIV, ccMsg.get(REQ_PARAM_NINSHO_DIV));
			bodyMap.put(RES_PARAM_NINSHO_DTM, ccMsg.get(REQ_PARAM_NINSHO_DTM));
			// ANK-3629-00-00 ADD END
			
			ccMsg.put(CC_PARAM_BODY_INFO, bodyMap);
			ccMsg.put(CC_PARAM_ERROR_INFO, errList);
			return false;
		}
		
		return true;
	}
	
	/**
	 * 関連チェックエラーを行います。
	 * 
	 * @param ccMsg
	 * @return
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private boolean parameterErrorChk(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, Map<String, Object> ccMsg) throws Throwable {
		
		HashMap workmap = getCCWorkMap(param);
		
		// ECK0011A010:お客さま一意照会
		execECK0011A010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID));
		
		// お客さま一意照会の結果を取得する。
		// データリスト
		List<Map<String, String>> resultEck0011a010List = (List<Map<String, String>>)workmap.get(WORK_KEY_ECK0011A010);

		// お客さま一意照会の結果がない場合
		if(resultEck0011a010List == null || resultEck0011a010List.size() == 0)
		{
			// SYSID存在チェックエラー
			setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2001, "");
			return false;
		}
		
		// ANK-3629-00-00 ADD START
		String ninshoDiv = (String)ccMsg.get(REQ_PARAM_NINSHO_DIV);
		// 認証区分が"1","2"以外の場合
		if (
				!NINSHO_DIV_NINSYO.equals(ninshoDiv)
			 && !NINSHO_DIV_KAIJYO.equals(ninshoDiv)
			)
		{
			// 認証区分エラー
			setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2002, "");
			return false;
		}
		// ANK-3629-00-00 ADD END
	
		return true;
	}
	
	/**
	 * レスポンス項目を設定します。
	 * <br>
	 * @param ccMsg お客様住所情報更新受付(CMP)CCマップ
	 * @param returnCode リターンコード
	 * @param returnMessage リターンメッセージ
	 */
	private void setResponse(IRequestParameterReadWrite param,  Map<String, Object> ccMsg, String errCode, String errMessage)
	throws Exception
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		// body用マップ
		Map<String, Object> bodyMap = new HashMap<String, Object>();
		
		errList.add(getCommonErrInfMap(errCode, errMessage));
		
		// LINE-ID
		bodyMap.put(RES_PARAM_LINE_ID, ccMsg.get(REQ_PARAM_LINE_ID));
		// ANK-3629-00-00 ADD START
		bodyMap.put(RES_PARAM_NINSHO_DIV, ccMsg.get(REQ_PARAM_NINSHO_DIV));
		bodyMap.put(RES_PARAM_NINSHO_DTM, ccMsg.get(REQ_PARAM_NINSHO_DTM));
		// ANK-3629-00-00 ADD END
		
		ccMsg.put(CC_PARAM_BODY_INFO, bodyMap);
		ccMsg.put(CC_PARAM_ERROR_INFO, errList);
	}
	
	/**
	 * ECK0011A010:お客さま一意照会 を呼び出す。
	 * 上りマッピング、実行、下りマッピングまで行います。
	 * 実行結果はworkmapに格納されます。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param ccMsg 
	 * @param ccMsg 
	 * @param campaign_cd
	 * @return
	 * @throws Throwable
	 */
	private void execECK0011A010(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String sysid)throws Throwable
	{
		
		// 上りマッピング
		Object[][] eck0011a010In = {
				  {ECK0011A010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0011A010}
				, {ECK0011A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
				, {ECK0011A010CBSMsg.KEY_SYSID, sysid}
				, {ECK0011A010CBSMsg.KEY_RSV_APLY_YMD, JCCBPCommon.getOpeDate(null)}
		};
		
		// SC実行
		CAANMsg[] eck0011a010MsgList = callSC(handle,  param, eck0011a010In,
				fixedText, new ECK0011A010CBSMsg().getContents()).getCAANMsgList(ECK0011A010CBSMsg.ECK0011A010CBSMSG1LIST);
		
		// 下りマッピング
		String[] eck0011a010Out = {
				  ECK0011A010CBSMsg1List.SYSID
		};
		
		// 下りマッピング
		createOutMap(param, eck0011a010MsgList, eck0011a010Out, WORK_KEY_ECK0011A010);
	}
	
	/**
	 * ECK0271A010：LINE情報管理一意照会 を呼び出す。
	 * 上りマッピング、実行、下りマッピングまで行います。
	 * 実行結果はworkmapに格納されます。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param campaign_cd
	 * @return
	 * @throws Throwable
	 */
	private void execECK0271A010(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String sysid, String lineId)throws Throwable
	{
		
		// 上りマッピング
		Object[][] eck0271a010In = {
				  {ECK0271A010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0271A010}
				, {ECK0271A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
				, {ECK0271A010CBSMsg.KEY_SYSID, sysid}
				, {ECK0271A010CBSMsg.KEY_LINE_ID, lineId}
		};
		
		// SC実行
		CAANMsg[] eck0271a010MsgList = callSC(handle,  param, eck0271a010In,
				fixedText, new ECK0271A010CBSMsg().getContents()).getCAANMsgList(ECK0271A010CBSMsg.ECK0271A010CBSMSG1LIST);
		
		// 下りマッピング
		String[] eck0271a010Out = {
				   ECK0271A010CBSMsg1List.SYSID
				,  ECK0271A010CBSMsg1List.LINE_ID
				// ANK-3629-00-00 MOD START
//				,  ECK0271A010CBSMsg1List.LINE_ID_ADD_YMD
				,  ECK0271A010CBSMsg1List.LINE_ID_NINSHO_ADD_DTM
				// ANK-3629-00-00 MOD END
				// ANK-3629-00-00 ADD START
				,  ECK0271A010CBSMsg1List.LINE_ID_NINSHO_RLS_DTM
				// ANK-3629-00-00 ADD END
				,  ECK0271A010CBSMsg1List.UPD_DTM
		};
		
		// 下りマッピング
		createOutMap(param, eck0271a010MsgList, eck0271a010Out, WORK_KEY_ECK0271A010);
	}
	// ANK-4008-00-00 ADD START
	/**
	 * ECK0271B010：LINE情報管理一覧照会 を呼び出す。
	 * 上りマッピング、実行、下りマッピングまで行います。
	 * 実行結果はworkmapに格納されます。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param sysid
	 * @return
	 * @throws Throwable
	 */
	private void execECK0271B010(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String sysid)throws Throwable
	{
		
		// 上りマッピング
		Object[][] eck0271b010In = {
				  {ECK0271B010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0271B010}
				, {ECK0271B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
				, {ECK0271B010CBSMsg.KEY_SYSID, sysid}
		};
		
		// SC実行
		CAANMsg[] eck0271b010MsgList = callSC(handle, param, eck0271b010In, fixedText
				, new ECK0271B010CBSMsg().getContents()).getCAANMsgList(ECK0271B010CBSMsg.ECK0271B010CBSMSG1LIST);
		
		// 下りマッピング
		String[] eck0271b010Out = {
				   ECK0271B010CBSMsg1List.SYSID
				,  ECK0271B010CBSMsg1List.LINE_ID
				,  ECK0271B010CBSMsg1List.LINE_ID_NINSHO_ADD_DTM
				,  ECK0271B010CBSMsg1List.LINE_ID_NINSHO_RLS_DTM
				,  ECK0271B010CBSMsg1List.UPD_DTM
		};
		
		// 下りマッピング
		createOutMap(param, eck0271b010MsgList, eck0271b010Out, WORK_KEY_ECK0271B010);
	}
	// ANK-4008-00-00 ADD END
	
	// ANK-4276-00-00 ADD START
	/**
	 * ECK0271B010：LINE情報管理一覧照会 を呼び出す。
	 * 上りマッピング、実行、下りマッピングまで行います。
	 * 実行結果はworkmapに格納されます。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param lineid
	 * @return
	 * @throws Throwable
	 */
	private void execECK0271B010_2(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String lineid)throws Throwable
	{
		
		// 上りマッピング
		Object[][] eck0271b010In = {
				  {ECK0271B010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0271B010}
				, {ECK0271B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
				, {ECK0271B010CBSMsg.KEY_LINE_ID, lineid}
		};
		
		// SC実行
		CAANMsg[] eck0271b010MsgList = callSC(handle, param, eck0271b010In, fixedText
				, new ECK0271B010CBSMsg().getContents()).getCAANMsgList(ECK0271B010CBSMsg.ECK0271B010CBSMSG1LIST);
		
		// 下りマッピング
		String[] eck0271b010Out = {
				   ECK0271B010CBSMsg1List.SYSID
				,  ECK0271B010CBSMsg1List.LINE_ID
				,  ECK0271B010CBSMsg1List.LINE_ID_NINSHO_ADD_DTM
				,  ECK0271B010CBSMsg1List.LINE_ID_NINSHO_RLS_DTM
				,  ECK0271B010CBSMsg1List.UPD_DTM
		};
		
		// 下りマッピング
		createOutMap(param, eck0271b010MsgList, eck0271b010Out, WORK_KEY_ECK0271B010_2);
	}
	// ANK-4276-00-00 ADD END

	/**
	 * ECK0271C010：LINE情報管理更新 を呼び出す。
	 * 上りマッピング、実行、下りマッピングまで行います。
	 * 実行結果はworkmapに格納されます。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param campaign_cd
	 * @return
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	// ANK-3629-00-00 MOD START
//	private void execECK0271C010(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String sysid, String lineId, String updDtmBf)throws Throwable
	private void execECK0271C010(
			SessionHandle handle
			, IRequestParameterReadWrite param
			, String fixedText
			, String sysid
			, String lineId
			, String ninshoAddDtm
			, String ninshoRlsDtm
			, String updDtmBf
			)throws Throwable
	// ANK-3629-00-00 MOD END
	{
		
		// 上りマッピング
		Object[][] eck0271c010In = {
				  {ECK0271C010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0271C010}
				, {ECK0271C010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
				, {ECK0271C010CBSMsg.SYSID, sysid}
				, {ECK0271C010CBSMsg.LINE_ID, lineId}
				// ANK-3629-00-00 MOD START
//				, {ECK0271C010CBSMsg.LINE_ID_ADD_YMD, JCCBPCommon.getOpeDate(null)}
				, {ECK0271C010CBSMsg.LINE_ID_NINSHO_ADD_DTM, ninshoAddDtm}
				// ANK-3629-00-00 MOD END
				// ANK-3629-00-00 ADD START
				, {ECK0271C010CBSMsg.LINE_ID_NINSHO_RLS_DTM, ninshoRlsDtm}
				// ANK-3629-00-00 ADD END
				, {ECK0271C010CBSMsg.UPD_DTM_BF, updDtmBf}
		};
		
		// SC実行
		CAANMsg eck0271c010MsgList = callSC(handle,  param, eck0271c010In,
				fixedText, new ECK0271C010CBSMsg().getContents());
		
		HashMap workmap = getCCWorkMap(param);
		workmap.put(WORK_KEY_ECK0271C010, eck0271c010MsgList);
	}
	
	/**
	 * ECK0271D010：LINE情報管理登録 を呼び出す。
	 * 上りマッピング、実行、下りマッピングまで行います。
	 * 実行結果はworkmapに格納されます。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param campaign_cd
	 * @return
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	// ANK-3629-00-00 MOD START
//	private void execECK0271D010(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String sysid, String lineId)throws Throwable
	private void execECK0271D010(
			SessionHandle handle
			, IRequestParameterReadWrite param
			, String fixedText
			, String sysid
			, String lineId
			, String ninshoAddDtm
			, String ninshoRlsDtm
		)throws Throwable
	// ANK-3629-00-00 MOD END
	{
		
		// 上りマッピング
		Object[][] eck0271d010In = {
				  {ECK0271D010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0271D010}
				, {ECK0271D010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
				, {ECK0271D010CBSMsg.SYSID, sysid}
				, {ECK0271D010CBSMsg.LINE_ID, lineId}
				// ANK-3629-00-00 MOD START
//				, {ECK0271D010CBSMsg.LINE_ID_ADD_YMD, JCCBPCommon.getOpeDate(null)}
				, {ECK0271D010CBSMsg.LINE_ID_NINSHO_ADD_DTM, ninshoAddDtm}
				// ANK-3629-00-00 MOD END
				// ANK-3629-00-00 ADD START
				, {ECK0271C010CBSMsg.LINE_ID_NINSHO_RLS_DTM, ninshoRlsDtm}
				// ANK-3629-00-00 ADD END
		};
		
		// SC実行
		CAANMsg eck0271d010MsgList = callSC(handle,  param, eck0271d010In,
				fixedText, new ECK0271D010CBSMsg().getContents());
		
		HashMap workmap = getCCWorkMap(param);
		workmap.put(WORK_KEY_ECK0271D010, eck0271d010MsgList);
	}
	
	/**
	 * 下りマップを作成し、CCにセットします。
	 * SC実行結果がない場合は、nullでセットされます。
	 * @param param 
	 * 
	 * @param result
	 * @param ccSetKey
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	private void createOutMap(IRequestParameterReadWrite param, CAANMsg[] result, String[] outKeyList, String wmKey) throws RequestParameterException
	{
		HashMap workmap = getCCWorkMap(param);
		
		// 作業マップのキー情報を初期化
		workmap.put(wmKey, null);
		
		// データが取得できた場合
		if (null != result && 0 < result.length)
		{
			List<Map<String, String>> resultList = new ArrayList<Map<String, String>>();
			// 取得した件数分データを取得する
			for (int i = 0; i < result.length; i++)
			{
				Map<String, String> resultMap = new HashMap<String, String>();
				// 取得キーに設定した値を取得
				for (int j = 0; j < outKeyList.length; j++)
				{
					resultMap.put(outKeyList[j], result[i].getString(outKeyList[j]));
				}
				resultList.add(resultMap);
			}
			
			// 作業マップに追加
			workmap.put(wmKey, resultList);
		}
	}
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param mappingData マッピングデータ
	 * @param fixedText ユーザ定義文字列
	 * @param contents CAANMsgのコンテンツ
	 * @return CAANMsg
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle,
			IRequestParameterReadWrite param, Object[][] mappingData,
			String fixedText, Object[][] contents) throws Throwable
	{
		// 上りマッピング処理
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);
		
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// サービスI/F呼出し実行
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		// SCからの戻り値からCAANMsgを取得
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		
		// リターンコード取得
		Object returnCode = result.get(JCMConstants.RET_CD_INT_KEY);
		// ステータス取得
		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		// エラー情報の設定
		editErrorInfo(param, templates, (Integer)returnCode, fixedText, contents);
		
		// エラー情報のマップを取得
		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));
		
		// 異常の場合、CCExceptionを生成してスローする
		if(!("0".equals(returnCode.toString()) && 0 == status))
		{
			throw new CCException("サービスコンポーネントエラー", new Exception());
		}
		
		return msg;
	}
	
	/**
	 * 共通項目のメッセージを作成します。
	 * @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));
		
		// サービスインターフェイス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[])
			{
				template.set((String)mappingData[i][0], (CAANMsg[])mappingData[i][1]);
			}
			else
			{
				if ("".equals(mappingData[i][1]))
				{
					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;
	}
	
	/**
	 * エラー情報を設定します。
	 * @param param リクエストパラメータ
	 * @param templates CAANMsgクラス
	 * @param returnCode リターンコード
	 * @param fixedText ユーザ定義文字列
	 * @param contents CAANMsgのコンテンツ
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param,
			CAANMsg[] templates, int returnCode, String fixedText, Object[][] contents) throws RequestParameterException
	{
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (returnCode != 0)
		{
			templateStatus = 9000;
		}
		
		if (JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + String.format(RETURN_MESSAGE_FORMAT, 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 (bpStatus < templateStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format(RETURN_MESSAGE_FORMAT, templateStatus);
			String message = JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		// ユーザデータ情報
		HashMap<String, String> inMap = (HashMap<String, String>)param.getData(fixedText);
		
		for (int i = 0; null != contents && i < contents.length ; i++)
		{
			String itemNm = (String)contents[i][0];
			if (itemNm.endsWith(ERRITEM_SUFFIX))
			{
				String errCd = (String)template.getString(itemNm);
				if (!JKKStringUtil.isNullBlank(errCd))
				{
					inMap.put(itemNm, errCd);
				}
			}
		}
		
		return param;
	}
	
	/**
	 * 単項目チェックの必須エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @return
	 */
	public Map<String, String> getReqErrInfMap(String itemName)
	{
		String errorCode = JKKStrConst.RETURN_CD_1001;
		String errorMessage = "";
		
		return getCommonErrInfMap(errorCode, errorMessage);
	}
	
	/**
	 * 単項目チェックの属性エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @return
	 */
	public Map<String, String> getFormErrInfMap(String itemName)
	{
		String errorCode = JKKStrConst.RETURN_CD_1002;
		String errorMessage = "";
		
		return getCommonErrInfMap(errorCode, errorMessage);
	}
	
	/**
	 * 単項目チェックの桁数エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @return
	 */
	public Map<String, String> getLenErrInfMap(String itemName)
	{
		String errorCode = JKKStrConst.RETURN_CD_1003;
		String errorMessage = "";
		
		return getCommonErrInfMap(errorCode, errorMessage);
	}
	
	/**
	 * 各業務エラーチェックのエラーマップ作成メソッド
	 * 
	 * @param return_cd
	 * @param errorMessage
	 * @return
	 */
	private Map<String, String> getCommonErrInfMap(String return_cd, String errorMessage)
	{
		Map<String, String> returnMap = new HashMap<String, String>();
		
		returnMap.put(RES_PARAM_ERRCODE, return_cd);
		returnMap.put(RES_PARAM_ERRMESSAGE, errorMessage);
		
		return returnMap;
	}
	// ANK-4008-00-00 ADD START
	/**
	 * LINE情報管理スキーマから取得した結果リストの中で、
	 * 解除中でない最大の認証登録年月日時分秒を取得するメソッド
	 * 
	 * @param tgtList LINE情報管理スキーマ取得一覧リスト
	 * @return 最大の認証登録年月日時分秒
	 */
	private String getMaxNinshoAddDtm(List<Map<String, String>> tgtList)
	{
		String maxNinshoAddDtm = "";
		
		for (int i = 0; i < tgtList.size(); i++)
		{
			// 解除中レコードは取得対象から除外
			String nowNinshoAddDtm = tgtList.get(i).get(ECK0271B010CBSMsg1List.LINE_ID_NINSHO_ADD_DTM);
			String ninshoRlsDtm = tgtList.get(i).get(ECK0271B010CBSMsg1List.LINE_ID_NINSHO_RLS_DTM);
			if (!JKKStringUtil.isNullEmpty(ninshoRlsDtm) && ninshoRlsDtm.compareTo(nowNinshoAddDtm) >= 0)
			{
				continue;
			}
			
			// 最大の認証登録年月日時分秒が空もしくは現在保持している最大の認証登録年月日時分秒より新しい場合、更新する
			if (JKKStringUtil.isNullEmpty(maxNinshoAddDtm) || nowNinshoAddDtm.compareTo(maxNinshoAddDtm) > 0)
			{
				maxNinshoAddDtm = nowNinshoAddDtm;
			}
		}
		
		return maxNinshoAddDtm;
	}
	// ANK-4008-00-00 ADD END
	
	// ANK-4276-00-00 ADD START
	/**
	 * 認証中か判定するメソッド

	 * @param ninshoAddDtm
	 * @param ninshoRlsDtm
	 * @return
	 *  認証中：true
	 *  解除中：false
	 */
	private boolean ninsyoJdg(String ninshoAddDtm, String ninshoRlsDtm){
		// 解除日時が空の場合、認証中
		if (JKKStringUtil.isNullEmpty(ninshoRlsDtm))
		{
			return true;
		}
		// 認証日時 ＜ 解除日時 の場合、認証中
		else if (ninshoAddDtm.compareTo(ninshoRlsDtm) > 0)
		{
			return true;
		}
		//その他 解除中
		return false;
	}
	// ANK-4276-00-00 ADD END
}
