/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUMineoSetPlanWribCC
*   ソースファイル名：JFUMineoSetPlanWribCC.java
*   作成者          ：富士通
*   日付            ：2018年05月08日
*＜機能概要＞
*   mineoセット割申込割引情報取得コモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v38.00      2018/06/15  FJ) 美濃原    【ANK-3436-00-00】eo光×eo電気×mineoセット割対応
*
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.model.ejb.common.JSYejbLog;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JPCDateUtil;
import eo.ejb.cbs.cbsmsg.EKK0841A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0841A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0321B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321B010CBSMsg1List;

/**
 * mineoセット割申込割引情報取得コモンコンポーネント部品です。
 * <br>
 * @author 富士通
 */

@SuppressWarnings("unchecked")
public class JFUMineoSetPlanWribCC extends JFUBaseCC
{

	/* ■□ IN項目 ■□ */
	/** IN：ＫＥＹ＿更新区分 */
	private static final String KEY_UPD_KBN = "key_upd_kbn";
	/** ＫＥＹ＿更新区分　"1"（新規系） */
	private static final String KEY_UPD_KBN_NEW = "1";
	/** ＫＥＹ＿更新区分　"2"（変更系） */
	private static final String KEY_UPD_KBN_UPD = "2";

	/* ■□ OUT項目 ■□ */
	/** OUT：処理結果 */
	private static final String RESULT = "result";
	/** OUT：割引サービスコード */
	private static final String WRIB_SVC_CD = "wrib_svc_cd";
	/** OUT：表示用キャンペーンコード */
	private static final String DSP_CAMPAIGN_CD = "dsp_campaign_cd";
	/** OUT：受付開始年月日時分 */
	private static final String UK_STA_YMDHM = "uk_sta_ymdhm";
	/** OUT：受付終了年月日時分 */
	private static final String UK_END_YMDHM = "uk_end_ymdhm";
	/** OUT：変更系受付終了年月日 */
	private static final String HK_UK_END_YMD = "hk_uk_end_ymd";

	/** 処理結果　"0"（正常終了） */
	private static final String RESULT_NORMAL = "0";
	/** 処理結果　"9"（パラメータエラー） */
	private static final String RESULT_ERR_9 = "9";

	//-------------------------------------------------------------------------------------------------//
	/* 【マスタ】■□ EZM0321B010_業務パラメータ管理一覧照会 ■□ */
	//-------------------------------------------------------------------------------------------------//
	/** テンプレートID(業務パラメータ管理一覧照会) */
	private static final String TEMPLATE_ID_EZM0321B010 = "EZM0321B010";

	/** テンプレートID(業務パラメータ管理一覧照会.明細) */
	private static final String TEMPLATE_ID_EZM0321B010_DTL = EZM0321B010CBSMsg.EZM0321B010CBSMSG1LIST;

	/** IN項目リスト(業務パラメータ管理一覧照会) */
	private static final List<String> IN_COLUMN_LIST_EZM0321B010 = Arrays.asList(EZM0321B010CBSMsg.KEY_WORK_PARAM_ID);

	/** 関連チェックエラー項目(業務パラメータ管理一覧照会) */
	private static final String ERROR_COLUMN_EZM0321B010 = "key_work_param_id_err";

	/** SC実行結果取得キー(業務パラメータ管理一覧照会) */
	private static final String TEMP_TEMPLATE_KEY_EZM0321B010_PREFIX = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_EZM0321B010 + TEMP_TEMPLATE_PRIFIX_SEP;

	/** テンプレートID(業務パラメータ管理一覧照会) ＫＥＹ＿業務パラメータID */
	private static final String KEY_WORK_PARAM_ID_EZM0321B010 = "^KK_SETWARI_";

	/** 業務パラメータ設定値 キャンペーンコード */
	private static final int SETTE_VALUE_DSP_CAMPAIGN_CD = 0;
	/** 業務パラメータ設定値 割引サービスコード */
	private static final int SETTE_VALUE_WRIB_SVC_CD = 1;
	/** 業務パラメータ設定値 Web可否フラグ */
	private static final int SETTE_VALUE_WEB_KAHI = 4;

	//-------------------------------------------------------------------------------------------------//
	/* 【マスタ】■□ EKK0841A010_割引サービス一意照会 ■□ */
	//-------------------------------------------------------------------------------------------------//
	/** テンプレートID(割引サービス一意照会) */
	private static final String TEMPLATE_ID_EKK0841A010 = "EKK0841A010";

	/** テンプレートID(割引サービス一意照会.明細) */
	private static final String TEMPLATE_ID_EKK0841A010_DTL = EKK0841A010CBSMsg.EKK0841A010CBSMSG1LIST;

	/** IN項目リスト(割引サービス一意照会) */
	private static final List<String> IN_COLUMN_LIST_EKK0841A010 =
			Arrays.asList(EKK0841A010CBSMsg.KEY_WRIB_SVC_CD, EKK0841A010CBSMsg.KEY_GENE_ADD_DTM, EKK0841A010CBSMsg.KEY_RSV_APLY_YMD);

	/** 関連チェックエラー項目(割引サービス一意照会) */
	private static final String ERROR_COLUMN_EKK0841A010 = "key_wrib_svc_cd_err";

	/** SC実行結果取得キー(割引サービス一意照会) */
	private static final String TEMP_TEMPLATE_KEY_EKK0841A010_PREFIX = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_EKK0841A010 + TEMP_TEMPLATE_PRIFIX_SEP;

	//-------------------------------------------------------------------------------------------------//
	/** 年月 substring start*/
	private static final int YM_0 = 0;
	/** 年月 substring end*/
	private static final int YM_6 = 6;
	//-------------------------------------------------------------------------------------------------//
	/** フラグON */
	private static final String FLG_ON = "1";

	/** 変更系の受付終了日付の加算月数 */
	private static final int ADD_MONTH_1 = 1;

	/**
	 * メイン処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Throwable 例外
	 */
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		try
		{
			HashMap<String, Object> inMap = (HashMap)param.getData(fixedText);

			// パラメータチェック処理
			if (isParamChkErr(inMap))
			{
				outDebugLog("★★★★★ JFUMineoSetPlanWribCC パラメータエラー ★★★★★");
				resultSet(param, fixedText, RESULT_ERR_9, null);
				return param;
			}

			// 業務パラメータ取得処理
			List<HashMap<String, Object>> workParamList = new ArrayList<HashMap<String, Object>>();
			getWorkParamKnri(handle, param, fixedText, workParamList);

			// キャンペーン0件チェック
			if (isListEmpty(workParamList))
			{
				outDebugLog("★★★★★ JFUMineoSetPlanWribCC 業務パラメータ設定無し ★★★★★");
				resultSet(param, fixedText, RESULT_NORMAL, null);
				return param;
			}

			// オンライン運用日付
			String opeDate = JFUBPCommon.getOpeDate(null);
			String key_upd_kbn = (String)inMap.get(KEY_UPD_KBN);

			// 割引サービス取得処理
			List<HashMap<String, Object>> wribSvcList = new ArrayList<HashMap<String, Object>>();
			for (HashMap<String, Object> workParamMap : workParamList)
			{
				getWribSvc(handle, param, fixedText, wribSvcList, workParamMap, opeDate);
			}

			// 対象キャンペーン判定処理
			getFrontWribSvc(handle, param, fixedText, wribSvcList, opeDate, key_upd_kbn);
		}
		finally
		{
			// 一時領域削除
			super.deleteTempArea(param, fixedText);
		}
		return param;
	}

	/**
	 * チェック処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドルo
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	{
		return null;
	}

	/**
	 * パラメータチェック処理。
	 * 
	 * <br>
	 * @param inMap inMap
	 * @return true：エラー、false：正常
	 */
	private boolean isParamChkErr(HashMap<String, Object> inMap)
	{
		if (inMap == null)
		{
			return true;
		}
		String key_upd_kbn = (String)inMap.get(KEY_UPD_KBN);
		if (KEY_UPD_KBN_NEW.equals(key_upd_kbn))
		{
			return false;
		}
		if (KEY_UPD_KBN_UPD.equals(key_upd_kbn))
		{
			return false;
		}
		return true;
	}

	/**
	 * 【マスタ】業務パラメータ取得処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws Throwable 
	 */
	private void getWorkParamKnri(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, List<HashMap<String, Object>> resultList)
			throws Throwable
	{

		// ユーザデータ初期化
		initData(param, fixedText, IN_COLUMN_LIST_EZM0321B010);
		// 検索エラーなし設定
		ignoreSearchError(param, fixedText);
		// 上りマッピング
		setInMapWorkParamKnri(param, fixedText);
		// サービスIF実行（EZM0321B010_業務パラメータ管理一覧照会）
		executeSC(handle, param, fixedText, TEMPLATE_ID_EZM0321B010, TEMPLATE_ID_EZM0321B010_DTL, IN_COLUMN_LIST_EZM0321B010,
				ERROR_COLUMN_EZM0321B010);
		// 下りマッピング
		getInMapWorkParamKnri(param, fixedText, resultList);
	}

	/** 上りマッピング項目設定(EZM0321B010_業務パラメータ管理一覧照会）です
	* 
	* <br>
	* @param param リクエストパラメータ
	* @param fixedText サービスメッセージ
	* @throws RequestParameterException
	*/
	private void setInMapWorkParamKnri(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		// 機能コード設定(1)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// ＫＥＹ＿業務パラメータID
		inMap.put(EZM0321B010CBSMsg.KEY_WORK_PARAM_ID, KEY_WORK_PARAM_ID_EZM0321B010);
	}

	/** 下りマッピング項目設定(EZM0321B010_業務パラメータ管理一覧照会）です
	* 
	* <br>
	* @param param リクエストパラメータ
	* @param fixedText サービスメッセージ
	* @return List<HashMap<String, Object>>
	* @throws RequestParameterException
	*/
	private void getInMapWorkParamKnri(IRequestParameterReadWrite param, String fixedText, List<HashMap<String, Object>> resultList)
			throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		List<HashMap> dtlList =
				getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_EZM0321B010_PREFIX), TEMPLATE_ID_EZM0321B010_DTL);

		if (dtlList != null)
		{
			// ●結果分ループ（「EZM0321B010 業務パラメータ管理一覧照会」の業務パラメータ管理一覧照会明細件数分）
			for (HashMap EZM0321B010Map : dtlList)
			{
				HashMap<String, Object> childMap = new HashMap<String, Object>();

				if (!JFUBPCommon.isNull(EZM0321B010Map.get(EZM0321B010CBSMsg1List.WORK_PARAM_SETTE_VALUE)))
				{
					String setValue = (String)EZM0321B010Map.get(EZM0321B010CBSMsg1List.WORK_PARAM_SETTE_VALUE);

					String workParamId = (String)EZM0321B010Map.get(EZM0321B010CBSMsg1List.WORK_PARAM_ID);
					String[] setValAry = setValue.split(JFUStrConst.COMMA);
					if (setValAry.length < SETTE_VALUE_WEB_KAHI)
					{
						outDebugLog("★★★★★ JFUMineoSetPlanWribCC (getInMapWorkParamKnri) 業務パラメータ設定値不備 ★★★★★");
						continue;
					}
					if (!FLG_ON.equals(setValAry[SETTE_VALUE_WEB_KAHI]))
					{
						outDebugLog("★★★★★ JFUMineoSetPlanWribCC (getInMapWorkParamKnri) フロント対象外キャンペーン ★★★★★ " + "WORK_PARAM_ID=[" + workParamId
								+ "] WORK_PARAM_SETTE_VALUE=[" + setValue + "]");
						continue;
					}
					// 業務パラメータID
					if (!JFUBPCommon.isNull(EZM0321B010Map.get(EZM0321B010CBSMsg1List.WORK_PARAM_ID)))
					{
						childMap.put(EZM0321B010CBSMsg1List.WORK_PARAM_ID, (String)EZM0321B010Map.get(EZM0321B010CBSMsg1List.WORK_PARAM_ID));
					}
					else
					{
						childMap.put(EZM0321B010CBSMsg1List.WORK_PARAM_ID, JFUStrConst.EMPTY);
					}
					// 業務パラメータ設定値
					childMap.put(EZM0321B010CBSMsg1List.WORK_PARAM_SETTE_VALUE, (String)EZM0321B010Map
							.get(EZM0321B010CBSMsg1List.WORK_PARAM_SETTE_VALUE));

					childMap.put(WRIB_SVC_CD, setValAry[SETTE_VALUE_WRIB_SVC_CD]);
					childMap.put(DSP_CAMPAIGN_CD, setValAry[SETTE_VALUE_DSP_CAMPAIGN_CD]);

					resultList.add(childMap);
				}

			}
		}
	}

	/**
	 * 【マスタ】割引サービス取得処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param workParamMap 業務パラメータ
	 * @param opeDate オンライン運用日付
	 * @throws Throwable 例外
	 *  
	 */
	private void getWribSvc(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, List<HashMap<String, Object>> resultList,
			HashMap<String, Object> workParamMap, String opeDate) throws Throwable
	{

		// ユーザデータ初期化
		initData(param, fixedText, IN_COLUMN_LIST_EKK0841A010);
		// 検索エラーなし設定
		ignoreSearchError(param, fixedText);
		// 上りマッピング
		setInMapWribSvc(param, fixedText, workParamMap, opeDate);
		// サービスIF実行（EKK0841A010_割引サービス一意照会）
		executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0841A010, TEMPLATE_ID_EKK0841A010_DTL, IN_COLUMN_LIST_EKK0841A010,
				ERROR_COLUMN_EKK0841A010);
		// 下りマッピング
		getInMapWribSvc(param, fixedText, resultList);

	}

	/** 上りマッピング項目設定(EKK0841A010_割引サービス一意照会）です
	* 
	* <br>
	* @param param リクエストパラメータ
	* @param fixedText サービスメッセージ
	* @param workParamMap 業務パラメータ設定値
	* @param opeDate オンライン運用日付
	* @throws RequestParameterException
	*/
	private void setInMapWribSvc(IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> workParamMap, String opeDate)
			throws RequestParameterException
	{
		// 機能コード設定(2)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);

		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// ＫＥＹ＿割引サービスコード
		inMap.put(EKK0841A010CBSMsg.KEY_WRIB_SVC_CD, (String)workParamMap.get(WRIB_SVC_CD));
		// ＫＥＹ＿予約適用年月日
		inMap.put(EKK0841A010CBSMsg.KEY_RSV_APLY_YMD, opeDate);
	}

	/** 下りマッピング項目設定(EKK0841A010_割引サービス一意照会）です
	* 
	* <br>
	* @param param リクエストパラメータ
	* @param fixedText サービスメッセージ
	* @param resultList 結果リスト
	* @throws RequestParameterException
	*/
	private void getInMapWribSvc(IRequestParameterReadWrite param, String fixedText, List<HashMap<String, Object>> resultList)
			throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		List<HashMap> dtlList =
				getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_EKK0841A010_PREFIX), TEMPLATE_ID_EKK0841A010_DTL);

		if (dtlList != null)
		{
			// ●結果分ループ（「EKK0841A010_割引サービス一意照会」割引サービス一意照会明細の件数分）
			for (HashMap EKK0841A010Map : dtlList)
			{
				HashMap<String, Object> childMap = new HashMap<String, Object>();

				// 割引サービスコード
				if (!JFUBPCommon.isNull(EKK0841A010Map.get(EKK0841A010CBSMsg1List.WRIB_SVC_CD)))
				{
					childMap.put(WRIB_SVC_CD, (String)EKK0841A010Map.get(EKK0841A010CBSMsg1List.WRIB_SVC_CD));
				}
				else
				{
					childMap.put(WRIB_SVC_CD, JFUStrConst.EMPTY);
				}
				// 表示用キャンペーンコード
				if (!JFUBPCommon.isNull(EKK0841A010Map.get(EKK0841A010CBSMsg1List.DSP_CAMPAIGN_CD)))
				{
					childMap.put(DSP_CAMPAIGN_CD, (String)EKK0841A010Map.get(EKK0841A010CBSMsg1List.DSP_CAMPAIGN_CD));
				}
				else
				{
					childMap.put(DSP_CAMPAIGN_CD, JFUStrConst.EMPTY);
				}
				// 受付開始年月日時分
				if (!JFUBPCommon.isNull(EKK0841A010Map.get(EKK0841A010CBSMsg1List.UK_STA_YMDHM)))
				{
					childMap.put(UK_STA_YMDHM, (String)EKK0841A010Map.get(EKK0841A010CBSMsg1List.UK_STA_YMDHM));
				}
				else
				{
					childMap.put(UK_STA_YMDHM, JFUStrConst.EMPTY);
				}
				// 受付終了年月日時分
				if (!JFUBPCommon.isNull(EKK0841A010Map.get(EKK0841A010CBSMsg1List.UK_END_YMDHM)))
				{
					childMap.put(UK_END_YMDHM, (String)EKK0841A010Map.get(EKK0841A010CBSMsg1List.UK_END_YMDHM));
				}
				else
				{
					childMap.put(UK_END_YMDHM, JFUStrConst.EMPTY);
				}

				resultList.add(childMap);

			}
		}

	}

	/**
	 * 対象キャンペーン判定処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param wribSvcList 割引サービス一意照会明細のレコード
	 * @param opeDate オンライン運用日付
	 * @param key_upd_kbn ＫＥＹ＿更新区分
	 * @throws ParseException 
	 * @throws NumberFormatException 
	 * @throws RequestParameterException 
	 *  
	 */
	private void getFrontWribSvc(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, List<HashMap<String, Object>> wribSvcList,
			String opeDate, String key_upd_kbn) throws NumberFormatException, ParseException, RequestParameterException
	{

		// ■割引サービス一意照会．割引サービス一意照会明細のレコードを受付開始年月日時分 昇順、受付終了年月日時分 昇順にソートする。
		Collections.sort(wribSvcList, new Comparator<Map<String, Object>>()
		{

			/**
			 * 割引サービス一意照会明細リストの並び替え
			 * 
			 * <br>
			 * 受付開始年月日時分（昇順）、
			 * 受付終了年月日時分（昇順）で並び替えます。
			 * @param map1 割引サービス一意照会明細が格納されているMap
			 * @param map2 割引サービス一意照会明細が格納されているMap
			 * @return 比較結果
			 */
			@Override
			public int compare(Map<String, Object> map1, Map<String, Object> map2)
			{
				Long ukStaYmdhm_1 = Long.parseLong((String)map1.get(UK_STA_YMDHM));
				Long ukStaYmdhm_2 = Long.parseLong((String)map2.get(UK_STA_YMDHM));
				if (ukStaYmdhm_1.compareTo(ukStaYmdhm_2) == 0)
				{
					// 受付開始年月日時分が同値の場合、e受付終了年月日時分で並び替える
					Long ukEndYmdhm_1 = Long.parseLong((String)map1.get(UK_END_YMDHM));
					Long ukEndYmdhm_2 = Long.parseLong((String)map2.get(UK_END_YMDHM));
					return ukEndYmdhm_1.compareTo(ukEndYmdhm_2);
				}
				else
				{
					return ukStaYmdhm_1.compareTo(ukStaYmdhm_2);
				}
			}
		});

		// □デバッグ用ログ
		outDebugLog("■■■■■ 運用日付[" + opeDate + "] ■■■■■");
		outDebugWribSvcList(wribSvcList);

		if (KEY_UPD_KBN_NEW.equals(key_upd_kbn))
		{
			// ＫＥＹ＿更新区分＝"1"（新規系）の場合
			getFrontWribSvcNew(handle, param, fixedText, wribSvcList, opeDate);
		}
		else
		{
			// ＫＥＹ＿更新区分＝"1"（新規系）以外の場合　（ＫＥＹ＿更新区分＝"2"（変更系）を想定）
			getFrontWribSvcUpd(handle, param, fixedText, wribSvcList, opeDate);
		}

	}

	/**
	 * 対象キャンペーン判定処理（ＫＥＹ＿更新区分＝"1"（新規系））
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param wribSvcList 割引サービス一意照会明細のレコード
	 * @param opeDate オンライン運用日付
	 * @throws RequestParameterException 
	 *  
	 */
	private void getFrontWribSvcNew(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			List<HashMap<String, Object>> wribSvcList, String opeDate) throws RequestParameterException
	{

		HashMap<String, String> resultMap = new HashMap<String, String>();
		HashMap<String, String> maxEndMap = new HashMap<String, String>();
		long maxEndYmd = 0;

		for (HashMap<String, Object> workParamMap : wribSvcList)
		{
			long curStaYmd = parseNum(getYmd(workParamMap, UK_STA_YMDHM));
			long curEndYmd = parseNum(getYmd(workParamMap, UK_END_YMDHM));
			long opeYmd = parseNum(opeDate);
			if (curStaYmd <= opeYmd && opeYmd <= curEndYmd)
			{
				// 【割引対象用の変数】「受付開始年月日時分の年月日　≦　オンライン運用日付　≦　受付終了年月日時分の年月日」
				resultMap.put(WRIB_SVC_CD, (String)workParamMap.get(WRIB_SVC_CD));
				resultMap.put(DSP_CAMPAIGN_CD, (String)workParamMap.get(DSP_CAMPAIGN_CD));
				resultMap.put(UK_STA_YMDHM, (String)workParamMap.get(UK_STA_YMDHM));
				resultMap.put(UK_END_YMDHM, (String)workParamMap.get(UK_END_YMDHM));
				resultMap.put(HK_UK_END_YMD, JFUStrConst.EMPTY);
			}
			if (curStaYmd <= opeYmd)
			{
				if (maxEndYmd <= curEndYmd)
				{
					// 【割引未取得時用の変数】「受付開始年月日時分の年月日　≦　オンライン運用日付」場合で、最大の受付終了日のとき
					maxEndMap.put(WRIB_SVC_CD, (String)workParamMap.get(WRIB_SVC_CD));
					maxEndMap.put(DSP_CAMPAIGN_CD, (String)workParamMap.get(DSP_CAMPAIGN_CD));
					maxEndMap.put(UK_STA_YMDHM, (String)workParamMap.get(UK_STA_YMDHM));
					maxEndMap.put(UK_END_YMDHM, (String)workParamMap.get(UK_END_YMDHM));
					maxEndMap.put(HK_UK_END_YMD, JFUStrConst.EMPTY);
					maxEndYmd = curEndYmd;
				}
			}
		}

		if (resultMap.size() == 0)
		{
			if (maxEndMap.size() > 0)
			{
				// 【割引未取得時用の変数】最新の受付終了年月日のキャンペーン
				outDebugLog("★★★★★ getFrontWribSvcNew 最新の受付終了年月日のキャンペーン ★★★★★");
				resultSet(param, fixedText, RESULT_NORMAL, maxEndMap);
			}
			else
			{
				outDebugLog("★★★★★ getFrontWribSvcNew 割引サービス設定無し ★★★★★");
				resultSet(param, fixedText, RESULT_NORMAL, null);
			}
		}
		else
		{
			// 【割引対象用の変数】割引対象のキャンペーン
			outDebugLog("★★★★★ getFrontWribSvcNew 受付日付範囲内のキャンペーン取得 ★★★★★");
			resultSet(param, fixedText, RESULT_NORMAL, resultMap);
		}

	}

	/**
	 * 対象キャンペーン判定処理（ＫＥＹ＿更新区分＝"2"（変更系））
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param wribSvcList 割引サービス一意照会明細のレコード
	 * @param opeDate オンライン運用日付
	 * @throws ParseException 
	 * @throws NumberFormatException 
	 * @throws RequestParameterException 
	 *  
	 */
	private void getFrontWribSvcUpd(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			List<HashMap<String, Object>> wribSvcList, String opeDate) throws NumberFormatException, ParseException, RequestParameterException
	{
		HashMap<String, String> resultMap = new HashMap<String, String>();
		for (HashMap<String, Object> workParamMap : wribSvcList)
		{
			long curStaYmd = parseNum(getYmd(workParamMap, UK_STA_YMDHM));
			String endYmd = getYmd(workParamMap, UK_END_YMDHM);
			long curEndYmd = getNextYmd(endYmd);
			long opeYmd = parseNum(opeDate);

			outDebugLog("■■■■■ 受付終了年月日[" + endYmd + "] ＋ 1ヶ月 → 変更系受付終了年月日[" + String.valueOf(curEndYmd) + "] ■■■■■");

			if (curStaYmd <= opeYmd && opeYmd <= curEndYmd)
			{
				// 「受付開始年月日時分の年月日　≦　オンライン運用日付　≦　変更系受付終了年月日」
				resultMap.put(WRIB_SVC_CD, (String)workParamMap.get(WRIB_SVC_CD));
				resultMap.put(DSP_CAMPAIGN_CD, (String)workParamMap.get(DSP_CAMPAIGN_CD));
				resultMap.put(UK_STA_YMDHM, (String)workParamMap.get(UK_STA_YMDHM));
				resultMap.put(UK_END_YMDHM, (String)workParamMap.get(UK_END_YMDHM));
				resultMap.put(HK_UK_END_YMD, String.valueOf(curEndYmd));
			}
		}

		if (resultMap.size() == 0)
		{
			outDebugLog("★★★★★ getFrontWribSvcUpd 割引サービス設定無し ★★★★★");
			resultSet(param, fixedText, RESULT_NORMAL, null);
		}
		else
		{
			outDebugLog("★★★★★ getFrontWribSvcUpd 受付日付範囲内のキャンペーン取得 ★★★★★");
			resultSet(param, fixedText, RESULT_NORMAL, resultMap);
		}

	}

	/**
	 * 次月取得（月末日考慮）
	 * 
	 * <br>
	 * @param paramYmd 年月日
	 * @return 次月
	 * @throws ParseException
	 */
	private long getNextYmd(String paramYmd) throws ParseException
	{
		// 次月
		if (parseNum(JFUStrConst.DEFAULT_YYYYMMDD) <= parseNum(paramYmd))
		{
			// 日付最大値を超える場合は、そのまま返却
			return parseNum(paramYmd);
		}
		String nextYmd = JPCDateUtil.addMonth(paramYmd, ADD_MONTH_1);

		// パラメータ日付の末日取得
		String wkEndYmd = paramYmd.substring(YM_0, YM_6) + JPCDateUtil.getEndOfMonth(paramYmd);
		if (paramYmd.equals(wkEndYmd))
		{
			// パラメータが月末日の場合は、月末日を設定する
			nextYmd = nextYmd.substring(YM_0, YM_6) + JPCDateUtil.getEndOfMonth(nextYmd);
		}
		long intNextYmd = parseNum(nextYmd);
		return intNextYmd;

	}

	/**
	 * 年月日取得
	 * 
	 * <br>
	 * @param map ＩＮ項目
	 * @param itemName 項目名
	 * @return 年月日
	 */
	private String getYmd(HashMap<String, Object> map, String itemName)
	{

		if (map == null)
		{
			return JFUStrConst.EMPTY;
		}

		String wk = (String)map.get(itemName);
		if (wk == null || JFUStrConst.EMPTY.equals(wk))
		{
			return JFUStrConst.EMPTY;
		}
		if (wk.length() < 12)
		{
			return JFUStrConst.EMPTY;
		}
		return wk.substring(0, 8);

	}

	/**
	 * List項目がnullか判定
	 * 
	 * <br>
	 * @param paramList
	 * @return true：null又は空
	 */
	private boolean isListEmpty(List<HashMap<String, Object>> paramList)
	{
		if (paramList == null || paramList.size() == 0)
		{
			return true;
		}
		return false;
	}

	/**
	 * 数値変換
	 * 
	 * <br>
	 * @param val 値
	 * @return 数値
	 */
	private long parseNum(String val)
	{
		if (val == null || JFUStrConst.EMPTY.equals(val))
		{
			return 0;
		}
		long wk = Long.parseLong(val);
		return wk;
	}

	/**
	 * 処理結果設定
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param result リターンコード
	 * @param wribMap 割引サービス情報
	 * @throws RequestParameterException 
	 */
	private void resultSet(IRequestParameterReadWrite param, String fixedText, String result, HashMap<String, String> wribMap)
			throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		String wrib_svc_cd = JFUStrConst.EMPTY;
		String dsp_campaign_cd = JFUStrConst.EMPTY;
		String uk_sta_ymdhm = JFUStrConst.EMPTY;
		String uk_end_ymdhm = JFUStrConst.EMPTY;
		String hk_uk_end_ymd = JFUStrConst.EMPTY;

		if (wribMap != null && wribMap.size() > 0)
		{
			wrib_svc_cd = wribMap.get(WRIB_SVC_CD);
			dsp_campaign_cd = wribMap.get(DSP_CAMPAIGN_CD);
			uk_sta_ymdhm = wribMap.get(UK_STA_YMDHM);
			uk_end_ymdhm = wribMap.get(UK_END_YMDHM);
			uk_end_ymdhm = wribMap.get(UK_END_YMDHM);
			hk_uk_end_ymd = wribMap.get(HK_UK_END_YMD);
		}

		// OUT項目:処理結果
		inMap.put(RESULT, result);
		// OUT項目:割引サービスコード
		inMap.put(WRIB_SVC_CD, wrib_svc_cd);
		// OUT項目:表示用キャンペーンコード
		inMap.put(DSP_CAMPAIGN_CD, dsp_campaign_cd);
		// OUT項目:受付開始年月日時分
		inMap.put(UK_STA_YMDHM, uk_sta_ymdhm);
		// OUT項目:受付終了年月日時分
		inMap.put(UK_END_YMDHM, uk_end_ymdhm);
		// OUT項目:変更系受付終了年月日
		inMap.put(HK_UK_END_YMD, hk_uk_end_ymd);

	}

	/**
	 * デバッグ出力処理
	 * 
	 * <br>
	 * @param wribSvcList 出力内容
	 */
	private void outDebugWribSvcList(List<HashMap<String, Object>> wribSvcList)
	{
		// デバッグ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "■■■■■<<List Start>>■■■■■", null, null, null);
		for (HashMap<String, Object> workParamMap : wribSvcList)
		{
			StringBuffer sb = new StringBuffer();
			sb.append(" WRIB_SVC_CD[" + (String)workParamMap.get(WRIB_SVC_CD) + "]");
			sb.append(" DSP_CAMPAIGN_CD[" + (String)workParamMap.get(DSP_CAMPAIGN_CD) + "]");
			sb.append(" UK_STA_YMDHM[" + (String)workParamMap.get(UK_STA_YMDHM) + "]");
			sb.append(" UK_END_YMDHM[" + (String)workParamMap.get(UK_END_YMDHM) + "]");

			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), sb.toString(), null, null, null);

		}
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "■■■■■<<List End>>■■■■■", null, null, null);
	}

	/**
	 * デバッグ出力処理
	 * 
	 * <br>
	 * @param obj 出力内容
	 */
	private void outDebugLog(Object obj)
	{
		// デバッグ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), obj, null, null, null);
	}

}
