/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKEMoneyTktnIraiRnk
*	ソースファイル名	：JBSbatKKEMoneyTktnIraiRnk.java
*	作成者				：富士通　
*	作成日				：2022年01月24日
*＜機能概要＞
*　電子マネー向け特典適用依頼通知メール作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v57.00.00	2022/01/25   FJ）舘山	【ANK-4208-00-00】  電子マネー特定導入
*********************************************************************/
package eo.business.service;

import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatKKIFM940;
import eo.business.util.table.JBSbatKK_T_CMP_APLY_INFO;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
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 JBSbatKKEMoneyTktnIraiRnk extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(キャンペーン適用情報)*/
	private static final String D_TBL_NAME_KK_T_CMP_APLY_INFO = "KK_T_CMP_APLY_INFO";

	/** SQL定義キー(KK_SELECT_001)*/
	private static final String KK_T_CMP_APLY_INFO_KK_SELECT_001 = "KK_SELECT_001";

	/** テーブルアクセスクラス(キャンペーン適用情報)*/
	private JBSbatSQLAccess db_KK_T_CMP_APLY_INFO = null;

	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** ＳＹＳＩＤ*/
	private static final String PARAM_SYSID = "sysid";
	/** サービス契約番号*/
	private static final String PARAM_SVC_KEI_NO = "svc_kei_no";
	/** データ抽出項目設定番号*/
	private static final String PARAM_DCHSKMST_NO = "dchskmst_no";
	/** 電子マネー種別コード*/
	private static final String PARAM_EMONEY_SBT_CD = "emoney_sbt_cd";
	/** データ抽出項目名*/
	private static final String PARAM_DCHSKM_NM = "dchskm_nm";
	/** 電子マネー金額*/
	private static final String PARAM_EMONEY_AMNT = "emoney_amnt";
	/** キャンペーン適用情報更新年月日時分秒*/
	private static final String PARAM_CMP_APLY_INFO_UPD_DTM_BF = "cmp_aply_info_upd_dtm_bf";

	/** USECASE */
	private static final String USECASE_ID = "KKSV0992";
	/** OPERATION */
	private static final String OPERATION_ID = "KKSV0992OP";
	/** CCキー */
	private static final String KKSV099201CC = "KKSV099201CC";

	/** 結果コード（正常終了） */
	private static final String RESULT_CD_NORMAL = "000";
	/** 結果コード */
	private static final String PARAM_RESULT_CD = "resultCode";
	/** 処理ステータス（未発行） */
	private static final String TRN_STATE_MI_HAKKO = "000";

	/** 依頼完了フラグ（ＯＫ）*/
	private static final String IRI_FIN_FLG_OK = "0";
	/** 依頼完了フラグ（ＮＧ）*/
	private static final String IRI_FIN_FLG_NG = "1";

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		// DBアクセスクラスを生成します
		db_KK_T_CMP_APLY_INFO = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_CMP_APLY_INFO);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 主処理
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		super.logPrint.printDebugLog("execute_START");
		
		// サービスを呼び出すためにCCのマップを作成
		HashMap<String, Object> ccMap = createCCMap(inMap);
		if (ccMap == null)
		{
			// 抽出誤りのデータ。ログを出力しファイルも出力しない。
			printBusinessErrorLog(JPCBatchMessageConstant.EKKB1220CI, new String[] {"特典適用済(" + inMap.getString(JBSbatKKIFM940.DCHSKMST_NO) + ")"});
			return outputBean;
		}
		// サービスを呼び出す
		HashMap<String,Object> outputMap = invokeServiceKKSV0992(ccMap);
		
		// サービスの処理結果を判定
		String returnCode = outputMap.get(JCCBatchEsbInterface.RETURN_CODE).toString();
		
		//リターンコードが正常または警告以外であればエラーを発生
		if(!JCCBatchEsbInterface.RETURN_CODE_SUCCESS.equals(returnCode) && !JCCBatchEsbInterface.RETURN_CODE_WARNING.equals(returnCode))
		{
			super.logPrint.printDebugLog("returnCode:" + returnCode);
			// 例外を発行
			throw new JBSbatBusinessException(
					JPCBatchMessageConstant.EKKB0270CE, 
					new String[] { "KKSV0992(" + outputMap.toString() +")" }
					);
		}
		
		// サービスが正常終了した場合、特典適用依頼の実行結果を確認する
		// 特典適用依頼がエラーの場合、追加の情報をログへ出力
		HashMap<?, ?> paramMap = (HashMap<?, ?>)outputMap.get(KKSV099201CC);
		if (RESULT_CD_NORMAL.equals(paramMap.get(PARAM_RESULT_CD)))
		{
			outputBean.addOutMapList(createOutputMap(inMap, IRI_FIN_FLG_OK));
		}
		else
		{
			// メッセージを作成
			String[] errMessages = new String[] {
				"KKIFE478エラー：" + outputMap.toString()
			};
			// エラー情報のログ
			printBusinessErrorLog(JPCBatchMessageConstant.EKKB1010CW, errMessages);
			super.commonItem.setErrFlg(true);
			outputBean.addOutMapList(createOutputMap(inMap, IRI_FIN_FLG_NG));
		}
		
		super.logPrint.printDebugLog("execute_END");
		
		return outputBean; 
		/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		db_KK_T_CMP_APLY_INFO.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(KK_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	データ抽出設定番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_CMP_APLY_INFO_KK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_KK_T_CMP_APLY_INFO.selectBySqlDefine(paramList, KK_T_CMP_APLY_INFO_KK_SELECT_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * ＣＣ向けのマップを作成する。
	 * @param inMap 入力マップ
	 */
	private HashMap<String, Object> createCCMap(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		HashMap<String, Object> ccMap = new HashMap<String, Object>();

		// キャンペーン適用情報の存在チェック
		Object[] params = new Object[]{
			inMap.get(JBSbatKKIFM940.DCHSKMST_NO)
		};
		// キャンペーン適用情報
		executeKK_T_CMP_APLY_INFO_KK_SELECT_001(params);
		JBSbatCommonDBInterface resultMap = db_KK_T_CMP_APLY_INFO.selectNext();
		if (resultMap != null)
		{
			if (!TRN_STATE_MI_HAKKO.equals(resultMap.getString(JBSbatKK_T_CMP_APLY_INFO.TRN_STAT)))
			{
				// 未発行以外の場合特典適用依頼済の為、以降の作業をスキップ
				return null;
			}
			ccMap.put(PARAM_CMP_APLY_INFO_UPD_DTM_BF, resultMap.getString(JBSbatKK_T_CMP_APLY_INFO.UPD_DTM));
		}
		ccMap.put(PARAM_SYSID, inMap.get(JBSbatKKIFM940.SYSID));
		ccMap.put(PARAM_SVC_KEI_NO, inMap.get(JBSbatKKIFM940.SVC_KEI_NO));
		ccMap.put(PARAM_DCHSKMST_NO, inMap.get(JBSbatKKIFM940.DCHSKMST_NO));
		ccMap.put(PARAM_DCHSKM_NM, inMap.get(JBSbatKKIFM940.DCHSKM_NM));
		ccMap.put(PARAM_EMONEY_SBT_CD, inMap.get(JBSbatKKIFM940.EMONEY_SBT_CD));
		ccMap.put(PARAM_EMONEY_AMNT, inMap.get(JBSbatKKIFM940.EMONEY_AMNT));
		
		return ccMap;
	}
	
	/**
	 * サービス(KKSV0992)を呼び出す
	 * <br>
	 * @param ccMap
	 * @return
	 * @throws Exception 
	 */
	private HashMap<String, Object> invokeServiceKKSV0992(HashMap<String, Object> ccMap) 
	{

		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// 電子マネー特典適用依頼CC呼び出し
		paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_USECASE_ID, USECASE_ID);
		paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_OPERATION_ID, OPERATION_ID);
		// サービスに渡す業務データを格納するMAPです。
		HashMap<String, Object> inputMap = new HashMap<String, Object>();
		
		// inputMapにCCに必要な情報をセットする
		inputMap.put(KKSV099201CC, ccMap);
		
		// サービスの処理結果が格納されるMAPを生成
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		// サービスを呼び出す
		JCCBatchEsbInterface.invokeService(super.commonItem, paramMap, inputMap, outputMap);

		// 処理結果を返却する
		return outputMap;
	}
	
	/**
	 * 出力ファイル用のマップを作成する。
	 * 
	 * @param inMap 入力マップ
	 * @param finFlg 結果フラグ
	 * @return 出力マップ
	 */
	private JBSbatServiceInterfaceMap createOutputMap(JBSbatServiceInterfaceMap inMap, String finFlg)
	{
		JBSbatServiceInterfaceMap map = new JBSbatServiceInterfaceMap();
		map.set(JBSbatKKIFM940.SYSID, inMap.get(JBSbatKKIFM940.SYSID));
		map.set(JBSbatKKIFM940.SVC_KEI_NO, inMap.get(JBSbatKKIFM940.SVC_KEI_NO));
		map.set(JBSbatKKIFM940.DCHSKMST_NO, inMap.get(JBSbatKKIFM940.DCHSKMST_NO));
		map.set(JBSbatKKIFM940.DCHSKM_NM, inMap.get(JBSbatKKIFM940.DCHSKM_NM));
		map.set(JBSbatKKIFM940.EMONEY_SBT_CD, inMap.get(JBSbatKKIFM940.EMONEY_SBT_CD));
		map.set(JBSbatKKIFM940.EMONEY_AMNT, inMap.get(JBSbatKKIFM940.EMONEY_AMNT));
		map.set(JBSbatKKIFM940.TKTN_IRI_FIN_FLG, finFlg);
		map.setOutFlg(true);

		return map;
	}
	
	/**
	 * エラーログを出力する。
	 * @param errCode エラーコード
	 * @param param 置換文字列の配列
	 */
	private void printBusinessErrorLog(String errCode, String[] param)
	{
		commonItem.getLogPrint().printBusinessErrorLog(errCode, param);
	}
}
