/*******************************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JKKejbExclusiveProcKK3241
 *	ソースファイル名：JKKejbExclusiveProcKK3241.java
*	作成者			：
*	日付			：2020年06月01日
 *＜機能概要＞
 *	トビラフォンIDを起点とするルートの排他処理部品。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v50.00.00	2020/06/01	FJ)中原		【ANK-3754-00-00】トビラフォン対応
 *
 ********************************************************************************/

package eo.ejb.common.db;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbDBAccess;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.ejb.cbm.entity.KK3241ETMsg;

/**
 * <p>
 * トビラフォンIDを起点とするルートの排他処理部品です。
 * </p>
 * @author 富士通
 *
 */
public class JKKejbExclusiveProcKK3241
{
	
	/** データ取得結果設定項目名（プライマリキー） */
	private static final String SET_PRIMARY = "SET_PRIMARY";

	/** データ取得結果設定項目名（更新年月日時分秒） */
	private static final String SET_UPD_DTM = "SET_UPD_DTM";
	
	/** トビラフォンID取得項目（トビラフォンID) */
	private static final String TOBILAPH_ID = "tobilaph_id";


	
	/**
	 * トビラフォンIDスキーマのトビラフォンIDの未使用の最小値を取出し、
	 * レコードのロック、ロック対象レコードの更新を行います。
	 * @param inETMsg 処理内で使用する項目を保持しているメッセージ
	 * @param funcCd 機能コード
	 * @return ロック失敗の場合、はnullを返却する。
	 */
	public CAANMsg isExProcTobilaphId(CAANMsg inETMsg, String funcCd)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbExclusiveProcKK3241#isExProcTobilaphId");

		CAANMsg outETMsg = new CAANMsg(KK3241ETMsg.class.getName());

		// データ設定用MAP
		HashMap<String, ArrayList<String>> retMap = new HashMap<String, ArrayList<String>>();

		// レコードロック、データ取得の実行
		try 
		{
			retMap = execSQLForLockTobilaphId(inETMsg);
		}
		catch (CAANRuntimeException ce)
		{
			// レコードロックに失敗した場合はnullを返却する
			return outETMsg;
		}

		// 取得結果からそれぞれのリストを取り出す
		ArrayList<String> keyArray = retMap.get(SET_PRIMARY);
		ArrayList<String> updArray = retMap.get(SET_UPD_DTM);

		// データが取得できなかった場合はtrueを返却する
		if(keyArray.size() < 1)
		{
			return outETMsg;
		}

		// 共通処理のインスタンスを生成
		JKKejbExclusiveProcCommon epc = new JKKejbExclusiveProcCommon();

		// 機能コードが実行モードの場合はロック対象レコード更新処理を行う
		if (!epc.isFuncMode(funcCd))
		{
			epc.updateKK3241(inETMsg, keyArray);
		}
		outETMsg.set(KK3241ETMsg.TOBILAPH_ID, keyArray.get(0));

		return outETMsg;
	}
	

	/**
	 * トビラフォンIDスキーマに存在する
	 * 各ルートから導き出される親契約のロックとデータの取得を行います。
	 * @param inMsg バインド変数に設定するための情報を保持しているメッセージ
	 * @return 実行結果を保持したリスト
	 * 			┣トビラフォンID
	 * 			┗更新年月日時分秒
	 */
	private HashMap<String, ArrayList<String>> execSQLForLockTobilaphId(CAANMsg inMsg)
	{
		// データベースアクセス機能インスタンスを生成
		JSYejbDBAccess jsydba = new JSYejbDBAccess(KK3241ETMsg.getTableName());

		try
		{
			// 初期化処理を行う
			jsydba.initialize();

			// プリコンパイルするSQL文を設定（レコードロック、データ取得用SQL文）
			jsydba.prepareStatement(new JKKejbExclusiveProcCommon().creSQLForLock(creSQLTobilaphId()));

			// PreparedStatementオブジェクトのSQLクエリを実行
			jsydba.executeQuery();

			// 結果設定用ArrayList
			ArrayList<String> setKey = new ArrayList<String>();
			ArrayList<String> setUpd = new ArrayList<String>();

			// 取得結果をメッセージキャリアに格納
			while (jsydba.next())
			{
				// ArrayListに取得結果を設定
				StringBuffer primary = new StringBuffer();
				primary.append(jsydba.getString(KK3241ETMsg.TOBILAPH_ID));
				
				setKey.add(primary.toString());
				setUpd.add(jsydba.getString(KK3241ETMsg.UPD_DTM));
			}

			// 返却用HashMap
			HashMap<String, ArrayList<String>> retMap = new HashMap<String, ArrayList<String>>();

			// 設定したArrayListをHashMapに格納
			retMap.put(SET_PRIMARY, setKey);
			retMap.put(SET_UPD_DTM, setUpd);

			return retMap;
		}
		catch(SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// リソースの開放処理を行う
			jsydba.terminal();
		}
	}


	/**
	 * トビラフォンIDスキーマに存在する未使用でかつ最小のトビラフォンID、各ルートから親契約を取得するためのSQL文を作成します。
	 * @return データ取得用のSQL文。
	 */
	private String creSQLTobilaphId()
	{
		StringBuffer buff = new StringBuffer();

		buff.append(" SELECT ");
		buff.append("   KK3241.TOBILAPH_ID ");
		buff.append("   , KK3241.UPD_DTM  ");
		buff.append(" FROM ");
		buff.append("   KK_M_TOBILAPH_ID KK3241  ");
		buff.append(" WHERE ");
		buff.append("   KK3241.TOBILAPH_ID = (  ");
		buff.append("     SELECT ");
		buff.append("       MIN(KK3241_MIN.TOBILAPH_ID) ");
		buff.append("     FROM ");
		buff.append("       KK_M_TOBILAPH_ID KK3241_MIN  ");
		buff.append("     WHERE ");
		buff.append("       KK3241_MIN.USE_STAYMD = '20991231'  ");
		buff.append("       AND KK3241_MIN.USE_ENDYMD = '20991231'  ");
		buff.append("       AND KK3241_MIN.MK_FLG = '0' ");
		buff.append("   )  ");
		buff.append("   AND KK3241.MK_FLG = '0' ");

		return buff.toString();
	}

}