/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACTaiikiLmtTchiTrgtMake
*	ソースファイル名	：JBSbatACTaiikiLmtTchiTrgtMake.java
*	作成者				：富士通　
*	作成日				：2012年08月21日
*＜機能概要＞
*　帯域制限通知対象者作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2012/08/21  FJ）今井	【ANK-0363-00-00】新規作成
*	v4.01.00	2013/03/23  FJ) 狭間	【ST4-2013-0000224】速度改善の為、Execute内部からのSELECTを廃止
*	v4.01.00	2013/04/17  FJ) 早崎	【ST2-2013-0001748】キー項目トリム修正
*	v5.00.00	2013/09/10  FJ) 小柴	【OM-2013-0001631】サービスインターフェイスエラー時の処理を異常終了から警告終了に変更
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import java.util.HashMap;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatRknBusinessUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM214;
import eo.business.util.table.JBSbatAC_M_TSRYO_CKTCSETE;
import eo.common.constant.JACStrConst;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JCCBatchEsbInterface;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACTaiikiLmtTchiTrgtMake extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(通信量超過通知設定)*/
	private static final String D_TBL_NAME_AC_M_TSRYO_CKTCSETE = "AC_M_TSRYO_CKTCSETE";

	/** SQL定義キー(AC_SELECT_002)*/
	private static final String AC_M_TSRYO_CKTCSETE_AC_SELECT_002 = "AC_SELECT_002";

	/** テーブルアクセスクラス(通信量超過通知設定)*/
	private JBSbatSQLAccess db_AC_M_TSRYO_CKTCSETE = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** ユースケースID（ＦＴＴＨ通信量超過実績登録）*/
	private static final String USECASE_ID = "ACSV0035";
	
	/** SCタイトル（ＦＴＴＨ通信量超過実績登録）*/
	private static final String SC_TITLE = "ACSV003501SC";
	
	/** 退避．通信量超過通知設定ＭＡＰ */
	private HashMap<String, BigDecimal> tsryoCkTcSeteMap = null;

	/**
	 * 初期処理
	 * @param commonItem バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_AC_M_TSRYO_CKTCSETE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_M_TSRYO_CKTCSETE);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][opeDate=" + super.opeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][freeItem=" + super.freeItem + "]");
		
		// 通信量超過通知設定マスタの検索
		this.tsryoCkTcSeteMap = this.getTsryoCkTcSeteMap();
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");

		/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap 入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap = " + inMap.getMap().toString() + "]") ;
		
		// ＦＴＴＨ通信量超過実績の存在チェック
//		JBSbatCommonDBInterface dbMap = this.selectFtthTsrckJsk(inMap);
		
		// 検索結果がなかった場合
//		if(BigDecimal.ZERO.equals(dbMap.getBigDecimal("CNT")))
		if(JACStrConst.KARA_MOJI.equals(inMap.getString(JBSbatACIFM214.JSK_FLG)))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][ＦＴＴＨ通信量超過実績なし]");
			
			// FTTH通信量合計情報の料金コースコード，料金サービスコードより、通信量超過通知設定を検索する。
			StringBuffer keyBuf = new StringBuffer();
			keyBuf.append(inMap.getString(JBSbatACIFM214.PCRS_CD));				// 料金コースコード
			keyBuf.append(inMap.getString(JBSbatACIFM214.PRC_SVC_CD).trim());	// 料金サービスコード
			
			BigDecimal upplChokTchSbtCd = this.tsryoCkTcSeteMap.get(keyBuf.toString());
			
			// 通信量超過通知設定マスタが取得できた場合
			if(null != upplChokTchSbtCd)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][通信量超過通知設定マスタあり]");
				
				BigDecimal mae = new BigDecimal(inMap.getString(JBSbatACIFM214.TUSHINRYOGKEI_MAE));	// 利用通信量合計（反映前）
				BigDecimal ato = new BigDecimal(inMap.getString(JBSbatACIFM214.TUSHINRYOGKEI_ATO));	// 利用通信量合計（反映後）
				
				// 通信量の判定
				// 利用通信量合計（反映前）　≦　通知対象通信量　＜　利用通信量合計（反映後）の場合
				if(mae.compareTo(upplChokTchSbtCd) <= 0 && upplChokTchSbtCd.compareTo(ato) < 0)
				{
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][通信量が通知対象を超えた]");
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][　通知対象通信量 = " + upplChokTchSbtCd + "]");
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][　利用通信量合計（反映前） = " + mae + "]");
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][　利用通信量合計（反映後） = " + ato + "]");
					
					// ＦＴＴＨ通信量超過実績を登録する。（サービス呼び出し）
					this.addTsrckJsk(this.makeInputMap(inMap));
				}
			}
		
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_AC_M_TSRYO_CKTCSETE.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(AC_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	上限超過通知種別コード
	 *		 	バッチ運用日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeAC_M_TSRYO_CKTCSETE_AC_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_AC_M_TSRYO_CKTCSETE.selectBySqlDefine(paramList, AC_M_TSRYO_CKTCSETE_AC_SELECT_002);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * 通信量超過通知設定マスタ情報取得処理を行います。 <BR>
	 * 
	 * @return HashMap 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private HashMap<String, BigDecimal> getTsryoCkTcSeteMap() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getTsryoCkTcSeteMap]");

		// 対象キーの設定
		JBSbatCommonDBInterface dbSelectList = new JBSbatCommonDBInterface();
		// パラメタ設定
		dbSelectList.setValue(JACStrConst.UPPL_CHOK_TCH_SBT_CD_TAILMT);		// 上限超過通知種別コード（"2"：帯域制御超過通知）
		dbSelectList.setValue(super.opeDate);								// バッチ運用日

		// SELECT文発行
		this.executeAC_M_TSRYO_CKTCSETE_AC_SELECT_002(dbSelectList.getList().toArray());

		// 結果を取得
		JBSbatCommonDBInterface dbMap = this.db_AC_M_TSRYO_CKTCSETE.selectNext();
		
		// 検索結果をHashMapに設定
		HashMap<String, BigDecimal> rtnMap = new HashMap<String, BigDecimal>();
		
		// 検索結果がないときは、初期状態のHashMapを返却
		if(dbMap == null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getTsryoCkTcSeteMap]");
			return rtnMap;
		}
		
		// 検索結果がなくなるまで繰り返す
		while (dbMap != null)
		{
			// キーの取得
			StringBuffer keyBuf = new StringBuffer();
			keyBuf.append(dbMap.getString(JBSbatAC_M_TSRYO_CKTCSETE.PCRS_CD));				// 料金コースコード
			keyBuf.append(dbMap.getString(JBSbatAC_M_TSRYO_CKTCSETE.PPLAN_CD));				// 料金プランコード
			
			// 値の取得
			BigDecimal value = dbMap.getBigDecimal(JBSbatAC_M_TSRYO_CKTCSETE.TCHI_TG_TSRYO);		// 通知対象通信量
			
			// Mapに設定
			rtnMap.put(keyBuf.toString(), value);

			// 次レコード取得
			dbMap = this.db_AC_M_TSRYO_CKTCSETE.selectNext();
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getTsryoCkTcSeteMap]");

		return rtnMap;
	}
	
	/**
	 * ＦＴＴＨ通信量超過実績登録（サービス）情報作成 <br>
	 * @param inMap 入力
	 * @return HashMap<String, String> ＦＴＴＨ通信量超過実績登録（サービス）の入力情報
	 * @throws Exception
	 */
	private HashMap<String, String> makeInputMap(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeInputMap]");

		HashMap<String, String> inputMap = new HashMap<String, String>();
		
		inputMap.put("svc_kei_no", 			inMap.getString(JBSbatACIFM214.SVKEI_NO));		// サービス契約番号
		inputMap.put("pcrs_cd", 			inMap.getString(JBSbatACIFM214.PCRS_CD));		// 料金コースコード
		inputMap.put("pplan_cd", 			inMap.getString(JBSbatACIFM214.PRC_SVC_CD));	// 料金プランコード
		inputMap.put("ftth_tushin_use_ym", 	inMap.getString(JBSbatACIFM214.RIYOU_YM));		// ＦＴＴＨ通信利用年月
		inputMap.put("tik_ctl_jssi_zm_flg", JACStrConst.ZUMI_FLG_MI);						// 帯域制御実施済フラグ "0"（未済み）

		inputMap.put("func_code",			"1");											// 機能コード
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeInputMap][inputMap=" + inputMap.toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeInputMap]");

		return inputMap;
	}

	/**
	 * ＦＴＴＨ通信量超過実績の登録（サービス呼び出し） <br>
	 * @param dataMap inputMapに設定するデータ
	 * @throws Exception
	 */
	private void addTsrckJsk(HashMap<String, String> dataMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][addTsrckJsk]");

		// ユースケースIDを格納するMAP
		HashMap<String, String> paramMap = new HashMap<String, String>();

		paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_USECASE_ID, USECASE_ID);

		// サービスに渡す業務データを格納するMAP
		HashMap<String, HashMap<String, String>> inputMap = new HashMap<String, HashMap<String, String>>();
		
		// inputMapにデータをSCのタイトルをキーとして設定する。
		inputMap.put(SC_TITLE, dataMap);

		// サービスの処理結果が格納されるMAP
		HashMap<Object, Object> outputMap = new HashMap<Object, Object>();

		// サービス呼び出し
		JCCBatchEsbInterface.invokeService(super.commonItem, paramMap, inputMap, outputMap);
		
		// サービスの処理結果が格納されたoutputMapからリターンコードを取得する。
		String returnCode = JCCBatchEsbInterface.getReturnCode(outputMap);
		// エラー判定
		if(!JCCBatchEsbInterface.RETURN_CODE_SUCCESS.equals(returnCode))
		{
			assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][addTsrckJsk][正常以外の場合]") ;
			// メソッド呼び出し
			JACbatRknBusinessUtil.esbErrOutputPrc(USECASE_ID, returnCode, outputMap, this.logPrint);
		
		}
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][addTsrckJsk][returnCode=" + returnCode + "]") ;
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][addTsrckJsk][returnCode=" + outputMap.toString() + "]") ;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][addTsrckJsk]");
		return;
	}
}
