/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKOneStopApiCommonUtil
*   ソースファイル名：JKKOneStopApiCommonUtil.java
*   作成者          ：富士通
*   日付            ：2015年06月08日
*＜機能概要＞
*   ワンストップ用共通機能を提供します。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v18.00.00   2015/06/08   FJ）阪口    【ANK-2631-00-00】ワンストップ案件（ＳＴＥＰ１）
 *  v51.00.00	2020/10/29	 FJ)星野	 【ANK-3946-00-00】eフロント向け追加申込API対応
**********************************************************************/
package eo.web.webview.common;

import java.io.IOException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;

import javax.servlet.ServletRequest;

import com.fujitsu.futurity.common.JSYwebLog;
import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;
import com.fujitsu.futurity.web.x31.X31CMessageResult.X31CMessageMoreInfo;
import com.fujitsu.futurity.web.x33.HttpDispatchContext;
import com.fujitsu.futurity.web.x33.X33CUtil;
import com.fujitsu.futurity.web.x33.X33WSessionController;

import eo.web.webview.commonOneStop.JKKCommonConst;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.commonOneStop.KKW00145SFConst;

/**
 * ワンストップ連携にかかる共通機能を提供します。<br />
 * ※当部品のメソッドは、特定の業務要件に対する共通処理です。
 * @author FJ
 *
 */
public class JKKOneStopApiCommonUtil
{
	/**
	 * XMLデータ受信<br />
	 * <pre>
	 * ≪補足≫
	 *  ・リクエストからXMLの取得、および Mapに変換して返却します。
	 *  ※koptCommonのJCCMapConvXmlはSOAP通信用で使用出来ないため独自実装とします。
	 * </pre>
	 * @param セッションID
	 * @return 変換後Map
	 * @throws IOException 
	 */
	@SuppressWarnings("unchecked")
	public static Map<String, Object> getReceiveXml(String sessionId) throws Exception
	{
		ServletRequest request = getServletRequest(sessionId);
		Map receiveMap = getRequestParamMap(request, "UTF-8");

		String receiveXml = (String)receiveMap.get("receiveXml");
		
		Map<String, Object> parseMap = JKKOneStopDataConverter.parseXml(receiveXml, "UTF-8");
		
		for (String key : parseMap.keySet())
		{
			if (key.endsWith("_RECEIVE"))
			{
				// 受信データ内の要素数がゼロの場合にNULLとなるため、新規Mapオブジェクトを詰め直す
				if (parseMap.get(key) == null || !(parseMap.get(key) instanceof Map))
				{
					parseMap.put(key, new HashMap());
				}
				break;
			}
		}
		return parseMap;
	}
	
	/**
	 * 返却用XMLデータを作成する（正常終了・システムエラー用）
	 * @param ifId インターフェイスID
	 * @param returnCd リターンコード
	 * @return XML文字列
	 */
	public static String createRetuenXml(String ifId, String returnCd)
	{
		return createRetuenXml(ifId, returnCd, null);
	}
	
	/**
	 * 返却用XMLデータを作成する（単項目・単関連・関連チェックエラー用）
	 * @param ifId インターフェイスID
	 * @param returnCd リターンコード
	 * @param errList エラー情報リスト
	 * @return XML文字列
	 */
	public static String createRetuenXml(String ifId, String returnCd, List<Map<String, String>> errList)
	{
// ANK-3946-00-00対応 20201029 星野 ADD START
		return createRetuenXml(ifId, returnCd, errList, null);
	}
	
	/**
	 * 返却用XMLデータを作成する（単項目・単関連・関連チェックエラー用）
	 * @param ifId インターフェイスID
	 * @param returnCd リターンコード
	 * @param errList エラー情報リスト
	 * @param additionalColumnsMap インターフェース固有項目返却用Map
	 * @return XML文字列
	 */
	@SuppressWarnings("unchecked")
	public static String createRetuenXml(String ifId, String returnCd, List<Map<String, String>> errList, Map<String, ?> additionalColumnsMap)
	{
// ANK-3946-00-00対応 20201029 星野 ADD END
		Map returnMap = new LinkedHashMap();
		
// ANK-3946-00-00対応 20201029 星野 ADD START
// インターフェース固有項目をreturnMapに設定
// 共通項目を上書きして壊すのが怖いので、最初にやっておく
		if(additionalColumnsMap != null)
		{
			returnMap.putAll(additionalColumnsMap);
		}
// ANK-3946-00-00対応 20201029 星野 ADD END

		
		returnMap.put("return_code", returnCd);
		
		if (errList != null && errList.size() > 0)
		{
			Map errListMap = new HashMap();
			errListMap.put("err_inf", errList);
			returnMap.put("err_list", errListMap);
		}
		
		
		Map parentMap = new HashMap();
		parentMap.put(ifId + "_SEND", returnMap);
		
		return JKKOneStopDataConverter.parseMapToXml(parentMap);
	}
	
	/**
	 * MapオブジェクトをXML文字列に変換する。
	 * @param map マップオブジェクト
	 * @return XML文字列
	 */
	@SuppressWarnings("unchecked")
	public static String parseMapToXml(Map map)
	{
		return JKKOneStopDataConverter.parseMapToXml(map);
	}
	
	/**
	 * ServletRequestオブジェクトを取得します。<br />
	 * @param sessionId セッションID
	 * @return リクエストオブジェクト
	 */
	public static ServletRequest getServletRequest(String sessionId) throws Exception
	{
		ServletRequest servletRequest = null;
		
		X33WSessionController controller = X33CUtil.getSession(sessionId);
		HttpDispatchContext context = (HttpDispatchContext)controller.getContext();
		servletRequest = context.getServletRequest();
		
		return servletRequest;
	}

	/**
	 * リクエストパラメータをマップに設定し返却します。<br />
	 * @param request リクエストオブジェクト
	 * @param encoding 文字コード
	 * @return Map リクエストデータマップ
	 * @throws IOException
	 */
	@SuppressWarnings("unchecked")
	public static Map getRequestParamMap(ServletRequest request, String encoding) throws IOException
	{
		TreeMap requestParamMap = new TreeMap();

		String contentType = request.getContentType();
		String nowEncoding = request.getCharacterEncoding();
		nowEncoding = ((nowEncoding != null) ? nowEncoding : encoding);

		// 入力ストリームからの受信
		java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(request.getInputStream(), encoding));
		while (true)
		{
			String line = reader.readLine();
			if (line == null)
			{
				break;
			}

			String[] keyVals = line.split("&");
			for (int i = 0; i < keyVals.length; i++)
			{
				String[] keyVal = (keyVals[i]).split("=");
				if (keyVal.length == 2)
				{
					if (contentType == null)
					{
						// コンテンツタイプが不明の時は、コンテナによるデコードが行なわれていない状態の為、自力でデコードする
						keyVal[1] = URLDecoder.decode(keyVal[1], nowEncoding);
					}
					requestParamMap.put(keyVal[0], keyVal[1]);
				}
				else if (keyVal.length == 1)
				{
					requestParamMap.put(keyVal[0], "");
				}
			}
		}

		// パラメータ受信
		java.util.Enumeration params = request.getParameterNames();
		while (params.hasMoreElements())
		{
			String paramName = (String)params.nextElement();
			String paramValue = new String((request.getParameter(paramName)).getBytes(nowEncoding), encoding);
			paramValue = convMS932(paramValue);
			requestParamMap.put(paramName, paramValue);
		}

		return requestParamMap;
	}

	/**
	 * パラメータ文字列の特定文字コード(Shift_JIS)をMS932に変換します。
	 * @param param
	 * @return 変換後文字列
	 */
	private static String convMS932(String param){

		char[][] CONV_MS932 = { /* {Shift_JISコード, MS932コード} */
								 {0x301c, 0xff5e}
								,{0x2016, 0x2225}
								,{0x2212, 0xff0d}
								,{0x00a2, 0xffe0}
								,{0x00a3, 0xffe1}
								,{0x00ac, 0xffe2}
								,{0x2010, 0x2015}
								};

		char[] charArray = param.toCharArray();
		
		for (int i = 0; i < charArray.length; i++)
		{
			char value = charArray[i];

			for (int j = 0; j < CONV_MS932.length; j++)
			{
				char[] conv = CONV_MS932[j];
				
				if (conv[0] == value)
				{
					charArray[i] = conv[1];
					break;
				}
			}
		}
		
		return new String(charArray);
	}

	/**
	 * 業務規制チェック。<br />
	 * @param bl Webビジネスロジックのインスタンス
	 * @param 更新可否チェック有無(更新操作への規制をチェックする場合はtrue)
	 * @param 照会可否チェック有無(照会操作への規制をチェックする場合はtrue)
	 * @return 業務規制結果(false:業務規制中、true:利用可能)
	 */
	private static boolean checkRegulation(JCCWebBusinessLogic bl, boolean updateMode, boolean searchMode)
	{
		X31SDataBeanAccess comInfoBean = bl.getCommonInfoBean();
		X31SDataBeanAccessArray beanArray = comInfoBean.getDataBeanArray(CommonInfoCFConst.REQUEST_RESTRICTION_LIST);
		for(int i=0; i < beanArray.getCount(); i++)	
		{	
			// システム全機能の参照/更新停止規制コードの場合
			if ((searchMode || updateMode) && ( "1".equals(beanArray.getDataBean(i).sendMessageString(
					CommonInfoCFConst.REQUEST_RESTRICTION_FLG_04, X31CWebConst.DATABEAN_GET_VALUE))))
			{
				return false;
			}
		}
		return true;
	}

	/**
	 * 業務規制チェック(更新系API用)。<br />
	 * @param bl Webビジネスロジックのインスタンス
	 * @return 業務規制結果(false:業務規制中、true:利用可能)
	 */
	public static boolean checkRegulationForUpdateApi(JCCWebBusinessLogic bl)
	{
		return checkRegulation(bl, true, false);
	}

	/**
	 * エラーログを出力する。<br />
	 * @param sessionId セッションID
	 * @param errMsg エラーメッセージ
	 * @param e 発生した例外(nullを指定した時はエラーメッセージのみログ出力します)
	 */
	public static void printErrorLog(String sessionId, String errMsg, Throwable e)
	{
		try
		{
			ServletRequest request = getServletRequest(sessionId);
			Map receiveMap = getRequestParamMap(request, "UTF-8");
			errMsg += "RequestParam=" + receiveMap.toString();
		}
		catch (Exception ex)
		{
			// 何もしない
		}
		StackTraceElement[] steAll = (e == null) ? Thread.currentThread().getStackTrace() : e.getStackTrace();
		String errorInfo = errMsg + "\n";
		errorInfo += (e != null) ? e.getClass().getName() + ": " + ((e.getMessage() != null) ? e.getMessage() : "") : "";
		for (int i = 0; i < steAll.length; i++) {
			StackTraceElement ste = steAll[i];
			if (e == null) {
				ste = steAll[2];
				i = steAll.length + 1;
			}
			errorInfo += "\n	at " + ste.getClassName() + "." + ste.getMethodName() + "(" + ste.getFileName() + ":" + ste.getLineNumber()+")"+ "\n";
		}
		errorInfo = errorInfo.replaceAll("\r\n", "\n");
		errorInfo = errorInfo.replaceAll("\n\n", "\n");
		JSYwebLog.println(JSYwebLog.ERROR, getTargetClass(), errorInfo, null, null, null);
	}

	/**
	 * 呼出元のクラスを取得する。<br />
	 * @return クラスClass
	 */
	@SuppressWarnings("unchecked")
	private static Class getTargetClass(){
		StackTraceElement[] steAll = Thread.currentThread().getStackTrace();
		StackTraceElement ste = steAll[3];
		Class cls = null;
		try {
			cls = Class.forName(ste.getClassName());
		} catch (ClassNotFoundException e) {
			// スタックトレースからの参照の為、Classが存在しない事はありえない
		}
		return cls;
	}
	
	/**
	 * API独自項目必須チェック部品です（タグなし不可・タグありNULL値不可用）<br />
	 * @param chkMap チェック対象Map
	 * @param chkKey Map内のチェック対象Key
	 * @return true:チェックOK false:チェックNG
	 */
	public static boolean checkRequireNotNull(Map<String, Object> chkMap, String chkKey)
	{
		// 引数が未設定である場合はfalse返却
		if (chkMap == null || chkKey == null || "".equals(chkKey))
		{
			return false;
		}
		
		if (!chkMap.containsKey(chkKey))
		{
			return false;
		}
		if (chkMap.get(chkKey) == null || "".equals(chkMap.get(chkKey)))
		{
			return false;
		}
		
		return true;
	}
	
	/**
	 * API独自項目必須チェック部品です（タグなし可・タグありNULL値不可用）<br />
	 * @param chkMap チェック対象Map
	 * @param chkKey Map内のチェック対象Key
	 * @return true:チェックOK false:チェックNG
	 */
	public static boolean checkRequireFailNullUpd(Map<String, Object> chkMap, String chkKey)
	{
		// 引数が未設定である場合はfalse返却
		if (chkMap == null || chkKey == null || "".equals(chkKey))
		{
			return false;
		}
		
		if(chkMap.containsKey(chkKey))
		{
			if (chkMap.get(chkKey) == null || "".equals(chkMap.get(chkKey)))
			{
				return false;
			}
		}
		return true;
	}
	
	/**
	 * ワンストップ用メッセージリスト確認用メソッドです。
	 * 画面独自処理にて発生したエラーを共有フォームビーン内のメッセージリストから検知し、エラー情報をデータビーンに設定します。
     * <BR>
     * @param bl JCCWebBusinessLogicクラス
     * @param warMsgMap ワーニングメッセージマップ(※NULL不可)
     * @param tkckErrMsgMap 単関連エラーメッセージマップ(※NULL不可)
     * @param errMsgMap エラーメッセージマップ(※NULL不可)
     * @param warnList ワーニングリスト(※NULL不可)
     * @param funcCode 機能コード
     * @param ifId インターフェイスID
	 * @return boolean true:エラーなし／false:エラーあり
	 * @throws Exception 
	 */
	public static boolean msgChk(JCCWebBusinessLogic bl, 
							Map<String, String[]> warMsgMap,
							Map<String, String[]> tkckErrMsgMap,
							Map<String, String[]> errMsgMap,
							List<Map<String, String>> warnList,
							String funcCode,
							String ifId) throws Exception
	{
		// サービスフォームBeanのアクセスクラス取得
		X31SDataBeanAccess  commonBean = bl.getCommonInfoBean();
		X31SDataBeanAccess serviceBean = bl.getServiceFormBean();
		
		X31SDataBeanAccessArray commonBeanArray = commonBean.getDataBeanArray(CommonInfoCFConst.MESSAGES_LIST);
		
		int cnt = commonBeanArray.getCount();
		if(cnt == 0)
		{
			// メッセージが0件の場合はエラーなし
			return true;
		}
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		HashSet<String> dbleSet = new HashSet<String>();
		String returnCd = null;
		for(int i = 0; i < cnt; i++)
		{
			X31SDataBeanAccess commonSubbean = commonBeanArray.getDataBean(i);
			String msg = commonSubbean.sendMessageString(CommonInfoCFConst.MESSAGE_02, X31CWebConst.DATABEAN_GET_VALUE);
			// ワーニングメッセージチェック(機能コードが2の場合のみ)
			if(warMsgMap.containsKey(msg))
			{
				// 機能コードが1の場合、ワーニングを発生させない。
				// また、メッセージIDの末尾がWの場合が存在するのでここで処理する。
				if(JKKCommonConst.FUNC_CODE_1.equals(funcCode))
				{
					continue;
				}
				
				Map<String, String> warMap = new LinkedHashMap<String, String>();
				String[] warInf = warMsgMap.get(msg);
				warMap.put("err_cd", warInf[0]);
				if (warInf[1] != null && !"".equals(warInf[1]))
				{
					warMap.put("err_item", warInf[1]);
				}
				// 重複チェック(同一メッセージを複数個返却する可能性があるため)
				if (!dbleSet.contains(warInf[0]))
				{
					// ワーニングリストに保持する(エラーが発生するか、処理が終了するまで保持し続ける)
					boolean dbleFlg = false;
					for (Map<String, String> warInfMap : warnList)
					{
						// リストにすでに存在するワーニングは無視する
						String errCd = warInfMap.get("err_cd");
						if (warInf[0].equals(errCd))
						{
							dbleFlg = true;
							break;
						}
					}
					if (!dbleFlg)
					{
						warnList.add(warMap);
						dbleSet.add(warInf[0]);
					}
				}
			}
			// 単関連エラーメッセージチェック
			else if(tkckErrMsgMap.containsKey(msg))
			{
				Map<String, String> tkckErrMap = new LinkedHashMap<String, String>();
				String[] tkckErrInf = tkckErrMsgMap.get(msg);
				tkckErrMap.put("err_cd", tkckErrInf[0]);
				tkckErrMap.put("err_item", tkckErrInf[1]);
				// 重複チェック(同一メッセージを複数個返却する可能性があるため)
				if (!dbleSet.contains(tkckErrInf[0]))
				{
					errList.add(tkckErrMap);
					returnCd = "10";
					dbleSet.add(tkckErrInf[0]);
				}
			}
			// エラーメッセージチェック
			else if(errMsgMap.containsKey(msg))
			{
				Map<String, String> errMap = new HashMap<String, String>();
				String[] errInf = errMsgMap.get(msg);
				errMap.put("err_cd", errInf[0]);
				errList.add(errMap);
				returnCd = "10";
				// "Exxxx"エラーは発生時点で処理終了
				break;
			}
			// メッセージIDの末尾が"I"でも"Q"でもない想定外のメッセージが発生している場合は、例外をスローする。
			else
			{
				String msgId = commonSubbean.sendMessageString(CommonInfoCFConst.MESSAGE_ID_02, X31CWebConst.DATABEAN_GET_VALUE);
				if(!msgId.endsWith("I") && !msgId.endsWith("Q"))
				{
					String errMsg = msgId + ":" + msg;
					throw new Exception(errMsg);
				}
			}
		}
		// エラーが一件以上存在する場合
		if(errList.size() > 0)
		{
			errList.addAll(warnList);
			serviceBean.sendMessageString("返却データ", X31CWebConst.DATABEAN_SET_VALUE, createRetuenXml(ifId, returnCd, errList));
			return false;
		}
		return true;
	}
	
	/**
	 * ワンストップ用サービスインターフェイスエラー確認用メソッドです。
	 * ワンストップ業務処理にて発生したSIFエラーを検知し、エラー情報をデータビーンに設定します。
     * <BR>
     * @param bl JCCWebBusinessLogicクラス
     * @param messageResult 返却メッセージ情報クラス
     * @param errMsgMap サービスインターフェイスエラーマップ(※NULL不可)
     * @param warnList ワーニングリスト(※NULL不可)
     * @param ifId インターフェイスID
	 * @throws Exception 
	 */
	public static void sifErrChk(JCCWebBusinessLogic bl,
							X31CMessageResult messageResult,
							Map<String, String[]> sifErrMap,
							List<Map<String, String>> warnList,
							String ifId) throws Exception
	{
		// サービスフォームBeanのアクセスクラス取得
		X31SDataBeanAccess serviceBean = bl.getServiceFormBean();
		
		X31CMessageMoreInfo[] messageMoreInfoAll = messageResult.getMessageMoreInfoList();
		
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		
		StringBuilder errMsgSB = new StringBuilder();
		
		for (X31CMessageMoreInfo messageMoreInfo : messageMoreInfoAll)
		{
			// 異動可否判定エラー
			if ("ido_div".equals(messageMoreInfo.getItemId())
					&& "1300".equals(messageMoreInfo.getStatus()))
			{
				Map<String, String> errMap = new HashMap<String, String>();
				errMap.put("err_cd", "E50" + messageMoreInfo.getItemCheckErr());
				errList.add(errMap);
				
				errList.addAll(warnList);
				serviceBean.sendMessageString("返却データ", X31CWebConst.DATABEAN_SET_VALUE, createRetuenXml(ifId, "10", errList));
				return;
			}
			
			StringBuilder strKey = new StringBuilder();
			strKey.append(messageMoreInfo.getTemplateId());
			strKey.append(",");
			strKey.append(messageMoreInfo.getStatus());
			strKey.append(",");
			strKey.append(messageMoreInfo.getItemId());
			strKey.append(",");
			strKey.append(messageMoreInfo.getItemCheckErr());
			
			if (sifErrMap.containsKey(strKey.toString()))
			{
				Map<String, String> errMap = new HashMap<String, String>();
				String[] sifErrInf = sifErrMap.get(strKey.toString());
				errMap.put("err_cd", sifErrInf[0]);
				errList.add(errMap);
				
				errList.addAll(warnList);
				serviceBean.sendMessageString("返却データ", X31CWebConst.DATABEAN_SET_VALUE, createRetuenXml(ifId, "10", errList));
				return;
			}
			errMsgSB.append(strKey.toString() + "/");
		}
		// 想定外のエラーの為、例外をスローする。
		throw new Exception(errMsgSB.toString());
	}
	
	/**
	 * API独自単項目チェックの必須エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @return
	 */
	public static Map<String, String> getReqErrInfMap(String itemName)
	{
		Map<String, String> returnMap = new LinkedHashMap<String, String>();
		
		returnMap.put("err_cd", "E1001");
		returnMap.put("err_item", itemName);
		
		return returnMap;
	}
	
	/**
	 * API独自単項目チェックの形式エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @return
	 */
	public static Map<String, String> getFormErrInfMap(String itemName)
	{
		Map<String, String> returnMap = new LinkedHashMap<String, String>();
		
		returnMap.put("err_cd", "E2001");
		returnMap.put("err_item", itemName);
		
		return returnMap;
	}
	
	/**
	 * API独自単項目チェックの桁数エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @return
	 */
	public static Map<String, String> getLenErrInfMap(String itemName)
	{
		Map<String, String> returnMap = new LinkedHashMap<String, String>();
		
		returnMap.put("err_cd", "E3001");
		returnMap.put("err_item", itemName);
		
		return returnMap;
	}
	
	/**
	 * API独自単項目チェックのリファレンスエラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @return
	 */
	public static Map<String, String> getRefErrInfMap(String itemName)
	{
		Map<String, String> returnMap = new LinkedHashMap<String, String>();
		
		returnMap.put("err_cd", "E4001");
		returnMap.put("err_item", itemName);
		
		return returnMap;
	}
	
	/**
	 * API独自単関連チェックのエラー・ワーニングマップ作成メソッドです。
	 * 
	 * @param errCd エラーコード
	 * @param itemName 項目名
	 * @return
	 */
	public static Map<String, String> getTkckErrInfMap(String errCd, String itemName)
	{
		Map<String, String> returnMap = new LinkedHashMap<String, String>();
		
		returnMap.put("err_cd", errCd);
		returnMap.put("err_item", itemName);
		
		return returnMap;
	}
	
	/**
	 * API独自関連チェックのエラー・ワーニングマップ作成メソッドです。
	 * 
	 * @param errCd エラーコード
	 * @return
	 */
	public static Map<String, String> getkrckErrInfMap(String errCd)
	{
		Map<String, String> returnMap = new HashMap<String, String>();
		
		returnMap.put("err_cd", errCd);
		
		return returnMap;
	}
	
	/**
	 * 返却データ設定メソッドです。<br>
	 * データビーンに返却データ情報をXML変換し設定します。
	 * 
	 * @param bl JCCWebBusinessLogicクラス
	 * @param returnCd リターンコード
	 * @param errList エラーリスト
	 * @param warnList ワーニングリスト
	 * @param funcCode 機能コード
	 * @param ifId インターフェイスID
	 * @return
	 */
	public static void setReturnXml(JCCWebBusinessLogic bl,
										String returnCd,
										List<Map<String, String>> errList,
										List<Map<String, String>> warnList,
										String funcCode,
										String ifId)
	{
// ANK-3946-00-00対応 20201029 星野 ADD START
		setReturnXml(bl, returnCd, errList, warnList, funcCode, ifId, null);
	}
	
	/**
	 * 返却データ設定メソッドです。<br>
	 * データビーンに返却データ情報をXML変換し設定します。
	 * 
	 * @param bl JCCWebBusinessLogicクラス
	 * @param returnCd リターンコード
	 * @param errList エラーリスト
	 * @param warnList ワーニングリスト
	 * @param funcCode 機能コード
	 * @param ifId インターフェイスID
	 * @param additionalColumnsMap インターフェース固有項目返却用Map
	 * @return
	 */
	public static void setReturnXml(JCCWebBusinessLogic bl,
										String returnCd,
										List<Map<String, String>> errList,
										List<Map<String, String>> warnList,
										String funcCode,
										String ifId,
										Map<String, ?> additionalColumnsMap)
	{
// ANK-3946-00-00対応 20201029 星野 ADD END
		X31SDataBeanAccess bean = bl.getServiceFormBean();
		List<Map<String, String>> returnList = new ArrayList<Map<String, String>>();
		
		// リターンコードが99(システムエラー)でない場合
		if (!"99".equals(returnCd))
		{
			// 機能コードが"2"の場合はワーニングリストとエラーリストを統合する
			if (JKKCommonConst.FUNC_CODE_2.equals(funcCode))
			{
				if (warnList == null || warnList.size() == 0)
				{
					if (errList == null || errList.size() == 0)
					{
						returnList = null;
					}
					else
					{
						returnList.addAll(errList);
					}
				}
				else
				{
					if (errList == null || errList.size() == 0)
					{
						returnList.addAll(warnList);
						returnCd = "04";
					}
					else
					{
						errList.addAll(warnList);
						returnList.addAll(errList);
					}
				}
			}
			// 機能コードが"1"の場合は、エラーリストのみ出力する
			else
			{
				if (errList != null && errList.size() > 0)
				{
					returnList.addAll(errList);
				}
			}
		}
		
// ANK-3946-00-00対応 20201029 星野 MOD START
//		String xml = JKKOneStopApiCommonUtil.createRetuenXml(ifId, returnCd, returnList);
		String xml = JKKOneStopApiCommonUtil.createRetuenXml(ifId, returnCd, returnList, additionalColumnsMap);
// ANK-3946-00-00対応 20201029 星野 MOD END
		bean.sendMessageString("返却データ", X31CWebConst.DATABEAN_SET_VALUE, xml);
	}
	
	/**
	 * 返却データ設定メソッドです。（API独自関連エラー用）<br>
	 * データビーンに返却データ情報をXML変換し設定します。
	 * 
	 * @param bl JCCWebBusinessLogicクラス
	 * @param errCd エラーコード
	 * @param warnList ワーニングリスト
	 * @param funcCode 機能コード
	 * @param ifId インターフェイスID
	 * @return
	 */
	public static void setReturnXml(JCCWebBusinessLogic bl,
										String errCd,
										List<Map<String, String>> warnList,
										String funcCode,
										String ifId)
	{
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		errList.add(JKKOneStopApiCommonUtil.getkrckErrInfMap(errCd));
		setReturnXml(bl, "10", errList, warnList, funcCode, ifId);
	}
	
	/**
	 * 異動理由大分類・中分類組合せチェックメソッドです。<br>
	 * 異動区分に対して選択可能な異動理由大分類であるか<br>
	 * 異動理由大分類に対して選択可能な異動理由中分類であるかどうかのチェックを行います。<br>
	 * 
	 * @param kksv0463OutputMap KKSV0463サービスの実行結果格納マップ
	 * @param kksv0551OutputMap KKSV0551サービスの実行結果格納マップ
	 * @param bean ワンストップデータビーン
	 * @param idoRsnDbriCd チェック対象異動理由大分類コード
	 * @param idoRsnCbriCd チェック対象異動理由中分類コード
	 * @return boolean true:チェックOK／false:チェックNG
	 */
	public static boolean checkIdoRsnCdPair(HashMap<String, Object> kksv0463OutputMap, HashMap<String, Object> kksv0551OutputMap,
									OneStopDataBeanAccess bean, String idoRsnDbriCd, String idoRsnCbriCd)
	{
		// 選択可能異動理由大分類リスト作成処理
		JKKOneStopIdoDivSelectChkUtil svcKeiIdoPsbChk = new JKKOneStopIdoDivSelectChkUtil();
		svcKeiIdoPsbChk.getIdoRsnDbriInf(bean, kksv0463OutputMap);
		
		OneStopDataBeanAccessArray idoRsnDbriPulldowninfList = bean.getDataBeanArray(KKW00145SFConst.IDO_RSN_DBRI_PULLDOWN_INF);
		OneStopDataBeanAccess idoRsnDbriPulldowninf = idoRsnDbriPulldowninfList.getDataBean(0);
		ArrayList<String> idoRsnDbriList = (ArrayList<String>)idoRsnDbriPulldowninf.get(KKW00145SFConst.CD_DIV_LIST_03);
		
		boolean idoRsnDbriChk = false;
		// 受信パラメタとリスト内容の突合せを行う
		for(int i = 1; i < idoRsnDbriList.size(); i++)
		{
			String chkRsnDbriCd = idoRsnDbriList.get(i);
			if (chkRsnDbriCd.equals(idoRsnDbriCd))
			{
				idoRsnDbriChk = true;
				break;
			}
		}
		
		if (!idoRsnDbriChk)
		{
			// 選択可能な異動理由大分類でないため、エラー
			return false;
		}
		
		// 選択可能異動理由中分類リスト作成処理
		svcKeiIdoPsbChk.getIdoRsnCbriInf(bean, kksv0551OutputMap, false);
		
		OneStopDataBeanAccessArray idoRsnCbriPulldowninfList = bean.getDataBeanArray(KKW00145SFConst.IDO_RSN_CBRI_PULLDOWN_INF);
		OneStopDataBeanAccess idoRsnCbriPulldowninf = idoRsnCbriPulldowninfList.getDataBean(0);
		ArrayList<String> idoRsnCbriList = (ArrayList<String>)idoRsnCbriPulldowninf.get(KKW00145SFConst.CD_DIV_LIST_03);
		
		boolean idoRsnCbriChk = false;
		
		// 受信パラメタの異動理由中分類が未設定で、且つ選択可能異動理由中分類リストが空（※空行1行のみ）の場合はチェックOK
		if ((idoRsnCbriCd == null || "".equals(idoRsnCbriCd)) && idoRsnCbriList.size() == 1)
		{
			idoRsnCbriChk = true;
		}
		// 選択可能な中分類がある状態で受信パラメタの異動理由中分類が未設定であればチェックNG
		else if (idoRsnCbriCd == null || "".equals(idoRsnCbriCd))
		{
			idoRsnCbriChk = false;
		}
		else
		{
			// 上記以外は受信パラメタとリスト内容の突合せを行う
			for(int j = 1; j < idoRsnCbriList.size(); j++)
			{
				String chkRsnCbriCd = idoRsnCbriList.get(j);
				if (chkRsnCbriCd.equals(idoRsnCbriCd))
				{
					idoRsnCbriChk = true;
					break;
				}
			}
		}
		
		if (!idoRsnCbriChk)
		{
			// 選択可能な異動理由中分類でないため、エラー
			return false;
		}
		
		return true;
	}
	
	/**
	 * サービス契約異動可能チェックメソッドです。<br>
	 * 当該サービス契約状態で指定された異動が可能であるかどうかのチェックを行います。<br>
	 * 
	 * @param outputMap KKSV0062サービスの実行結果格納マップ
	 * @param bean ワンストップデータビーン
	 * @param idoDiv チェック対象異動区分
	 * @return boolean true:チェックOK／false:チェックNG
	 */
	public static boolean checkSvcKeiIdoPsb(HashMap<String, Object> outputMap, OneStopDataBeanAccess bean, String idoDiv)
	{
		// 選択可能異動区分リスト作成処理
		JKKOneStopIdoDivSelectChkUtil svcKeiIdoPsbChk = new JKKOneStopIdoDivSelectChkUtil();
		svcKeiIdoPsbChk.getIdoDivPulldownInf(bean, outputMap);
		
		OneStopDataBeanAccessArray idoDivPulldowninfList = bean.getDataBeanArray(KKW00145SFConst.IDO_DIV_PULLDOWN_INF);
		OneStopDataBeanAccess idoDivPulldowninf = idoDivPulldowninfList.getDataBean(0);
		ArrayList<String> idoDivList = (ArrayList<String>)idoDivPulldowninf.get(KKW00145SFConst.CD_DIV_LIST_03);
		
		if (idoDivList == null)
		{
			return false;
		}
		boolean svcKeiStatChk = false;
		for(int i = 0; i < idoDivList.size(); i++)
		{
			String chkIdoDiv = idoDivList.get(i);
			if (chkIdoDiv.equals(idoDiv))
			{
				svcKeiStatChk = true;
				break;
			}
		}
		
		if (!svcKeiStatChk)
		{
			// 対象のサービス契約の状態で選択可能な異動区分でないため、エラー
			return false;
		}
		return true;
	}
	
	/**
	 * SYSID存在チェックメソッドです。<br>
	 * KKSV0820サービスの実行結果からSYSIDの存在チェックを行います。<br>
	 * 
	 * @param outputMap KKSV0820サービスの実行結果格納マップ
	 * @return boolean true:チェックOK／false:チェックNG
	 */
	public static boolean checkExistSysid(HashMap<String, Object> outputMap)
	{
		Map<String, Object> kksv082001ccMap = (Map<String, Object>) outputMap.get("KKSV082001CC");
		Map<String, Object> ECK0011A010Map  = (Map<String, Object>) kksv082001ccMap.get("ECK0011A010Map");
		List<Object> eck0011a010List = (List<Object>) ECK0011A010Map.get("ECK0011A010CBSMsg1List");
		
		// ECK0011A010_お客様一意照会の結果が存在しない場合は、存在チェックエラー
		if (eck0011a010List == null || eck0011a010List.size() == 0)
		{
			return false;
		}
		
		return true;
	}
	
	/**
	 * サービス契約番号存在チェックメソッドです。<br>
	 * KKSV0820サービスの実行結果からサービス契約番号の存在チェックを行います。<br>
	 * 
	 * @param outputMap KKSV0820サービスの実行結果格納マップ
	 * @return boolean true:チェックOK／false:チェックNG
	 */
	public static boolean checkExistSvcKeiNo(HashMap<String, Object> outputMap)
	{
		Map<String, Object> kksv082001ccMap = (Map<String, Object>) outputMap.get("KKSV082001CC");
		Map<String, Object> EKK0081A010Map  = (Map<String, Object>) kksv082001ccMap.get("EKK0081A010Map");
		List<Object> ekk0081a010List = (List<Object>) EKK0081A010Map.get("EKK0081A010CBSMsg1List");
		
		// ECK0081A010_サービス契約一意照会の結果が存在しない場合は、存在チェックエラー
		if (ekk0081a010List == null || ekk0081a010List.size() == 0)
		{
			return false;
		}
		
		return true;
	}
	
	/**
	 * ユーザID存在チェックメソッドです。<br>
	 * KKSV0820サービスの実行結果からユーザIDの存在チェックを行います。<br>
	 * 
	 * @param outputMap KKSV0820サービスの実行結果格納マップ
	 * @return boolean true:チェックOK／false:チェックNG
	 */
	public static boolean checkExistUserId(HashMap<String, Object> outputMap)
	{
		Map<String, Object> kksv082001ccMap = (Map<String, Object>) outputMap.get("KKSV082001CC");
		Map<String, Object> KKSV082003SCMap = (Map<String, Object>) kksv082001ccMap.get("EZM0051A010Map");
		List<Object> ezm0051a010List = (List<Object>) KKSV082003SCMap.get("EZM0051A010CBSMsg1List");
		
		// EZM0051A010_ユーザー一意照会の結果が存在しない場合は、存在チェックエラー
		if (ezm0051a010List == null || ezm0051a010List.size() == 0)
		{
			return false;
		}
		
		return true;
	}
}