/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名				：eo顧客基幹システム
*	モジュール名			：JBSbatCKUpdLastSendDtmCustChgInfo
*	ソースファイル名			：JBSbatCKUpdLastSendDtmCustChgInfo.java
*	作成者				：GDC) ジョバニー
*	作成日				：2020年03月20日
*＜機能概要＞
 * シェルで取得したタイムスタンプをデータベースに入れる機能
*＜修正履歴＞
*	バージョン	    修正日		 修正者		     修正内容
*   v.49.00.00      2020/03/19   GDC) ジョバニー ANK-3815-00-00_eo顧客変更情報mineo連携
*********************************************************************/
package eo.business.service;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.util.file.JBSbatCKIFM027;
import eo.business.util.table.JBSbatKK_T_RNKI_FILE_CTRL;
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;

/**
* (クラスの機能概要) <p>
*<BR>
* @author j.hortilano
*/
public class JBSbatCKUpdLastSendDtmCustChgInfo extends JBSbatBusinessService
{
	/** テーブル(連携ファイル制御)*/
	private static final String D_TBL_NAME_KK_T_RNKI_FILE_CTRL = "KK_T_RNKI_FILE_CTRL";
	
	/** テーブルアクセスクラス(連携ファイル制御)*/
	private JBSbatSQLAccess db_KK_T_RNKI_FILE_CTRL = null;
	
	/** 物理バッチID（CKPRC03501）*/
	private static final String BAT_ID = "CKPRC03501";
	
	/** ファイルID（CKIFE061）*/
	private static final String FILE_ID = "CKIFE061  ";

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_RNKI_FILE_CTRL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_RNKI_FILE_CTRL);
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
		// 業務サービスの主処理を記述してください。
		super.logPrint.printDebugLog("execute_START");

		// Get last/current timeStamp and operationDate, and put them to DB and file.
		JBSbatOutputItem outputBean = insertCurrentTimeStampAndOperationDate();

		super.logPrint.printDebugLog("execute_END");

		return outputBean;
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
		// DBアクセスクラスをクローズします
		if (db_KK_T_RNKI_FILE_CTRL != null) { 
			db_KK_T_RNKI_FILE_CTRL.close(); 
		}
	}	

	/**
	 * DBにタイムスタンプを入れる
	 * @return 
	 * @throws Exception
	 */
	private JBSbatOutputItem insertCurrentTimeStampAndOperationDate() throws Exception
	{
		// 1. get current timeStamp and operationDate
		DateFormat dFmtSendTimeStamp = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		Date dtCurrentSendTimeStamp = dFmtSendTimeStamp.parse(JCCBatCommon.getSysDate()+"000000000");

		DateFormat dFmtOperationData = new SimpleDateFormat("yyyyMMdd");
		Date dtCurrentSendOperationDate = dFmtOperationData.parse(super.opeDate);
		
		String currentSendTimeStamp = dFmtSendTimeStamp.format(dtCurrentSendTimeStamp);
		String currentSendOperationDate = dFmtOperationData.format(dtCurrentSendOperationDate);
		String lastSendTimeStamp = null;
		String lastSendOperationDate = null;
		
		// 2. select KK_T_RNKI_FILE_CTRL with PK(BUTSURI_BAT_ID, FILE_ID)
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		
		// 物理バッチID
		whereMap.setValue(JBSbatKK_T_RNKI_FILE_CTRL.BUTSURI_BAT_ID, BAT_ID);
		
		// ファイルID
		whereMap.setValue(JBSbatKK_T_RNKI_FILE_CTRL.FILE_ID, FILE_ID);
		
		// 連携ファイル制御排他検索を実施します。
		JBSbatCommonDBInterface outDbMap = db_KK_T_RNKI_FILE_CTRL.selectByPrimaryKeysForUpdateWait(whereMap);
		
		if (outDbMap == null) {

			// 3. if there's no record
			Calendar cal = Calendar.getInstance();

			cal.setTime(dtCurrentSendTimeStamp);
			cal.add(Calendar.DATE, -1);
			lastSendTimeStamp = dFmtSendTimeStamp.format(cal.getTime());

			cal.setTime(dtCurrentSendOperationDate);
			cal.add(Calendar.DATE, -1);
			lastSendOperationDate = dFmtOperationData.format(cal.getTime());

			// 連携ファイル制御登録処理を実施します。
			Object[] setParam = new Object[17];
			
			// 物理バッチID
			setParam[0]  = BAT_ID;
			// ファイルID
			setParam[1]  = FILE_ID;
			// 処理済ファイル通番
			setParam[2]  = "00000";
			// 前回処理実行年月日時分秒
			setParam[3]  = currentSendTimeStamp;
			setParam[4]  = "";
			setParam[5]  = "";
			setParam[6]  = "";
			setParam[7]  = "";
			setParam[8]  = "";
			setParam[9]  = "";
			setParam[10] = "";
			setParam[11]  = "";
			setParam[12]  = "";
			setParam[13]  = "";
			setParam[14]  = "";
			setParam[15]  = "";
			setParam[16]  = "";

			// 登録処理の実行
			insertKK_T_RNKI_FILE_CTRL(setParam);

		} else {

			// 4. If there is a record
			lastSendTimeStamp = outDbMap.getString(JBSbatKK_T_RNKI_FILE_CTRL.ZNKI_TRAN_RUN_DTM);
			lastSendOperationDate = outDbMap.getString(JBSbatKK_T_RNKI_FILE_CTRL.UPD_UNYO_YMD);

			Object[] setParam = new Object[2];
			// 処理済ファイル通番
			setParam[0] = "00000";
			// 前回処理年月日時分秒 → EO20H0110J0にて設定した抽出開始タイムスタンプで更新する。
			setParam[1] = currentSendTimeStamp;
			Object[] whereParam = new Object[2];
			whereParam[0] = BAT_ID;
			whereParam[1] = FILE_ID;

			updateKK_T_RNKI_FILE_CTRL(setParam, whereParam);

		}

		// 5. output file CKIFM027001.csv
		// =====================================
		// Create output CSV file
		// =====================================
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		// 入出力インターフェースオブジェクト作成
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 前回処理システム日時
		outMap.setString(JBSbatCKIFM027.ZNKI_TRN_SYS_DTM, lastSendTimeStamp);
		// 前回処理運用日
		outMap.setString(JBSbatCKIFM027.ZNKI_TRN_OPE_YMD, lastSendOperationDate);
		// 今回処理システム日時
		outMap.setString(JBSbatCKIFM027.KNKI_TRN_SYS_DTM, currentSendTimeStamp);
		// 今回処理運用日
		outMap.setString(JBSbatCKIFM027.KNKI_TRN_OPE_YMD, currentSendOperationDate);
		
		// 出力フラグをセット
		outMap.setOutFlg(true);
		// 出力共通電文に入出力インターフェースをセット
		outputBean.addOutMapList(outMap);
		
		return outputBean;
	}

	/**
	 * PK(全項目登録)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	物理バッチＩＤ					BUTSURI_BAT_ID
	 *		 	ファイルＩＤ						FILE_ID
	 *		 	処理済ファイル通番				TRAN_ZUMI_FILE_SEQ
	 *		 	前回処理実行年月日時分秒		ZNKI_TRAN_RUN_DTM
	 *		 	登録年月日時分秒				ADD_DTM
	 *		 	登録オペレータアカウント			ADD_OPEACNT
	 *		 	更新年月日時分秒				UPD_DTM
	 *		 	更新オペレータアカウント			UPD_OPEACNT
	 *		 	削除年月日時分秒				DEL_DTM
	 *		 	削除オペレータアカウント			DEL_OPEACNT
	 *		 	無効フラグ						MK_FLG
	 *		 	登録運用年月日				ADD_UNYO_YMD
	 *		 	登録処理ＩＤ					ADD_TRN_ID
	 *		 	更新運用年月日				UPD_UNYO_YMD
	 *		 	更新処理ＩＤ					UPD_TRN_ID
	 *		 	削除運用年月日				DEL_UNYO_YMD
	 *		 	削除処理ＩＤ					DEL_TRN_ID
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void insertKK_T_RNKI_FILE_CTRL(Object[] setParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("BUTSURI_BAT_ID", setParam[0]);
		setMap.setValue("FILE_ID", setParam[1]);
		setMap.setValue("TRAN_ZUMI_FILE_SEQ", setParam[2]);
		setMap.setValue("ZNKI_TRAN_RUN_DTM", setParam[3]);
		setMap.setValue("ADD_DTM", setParam[4]);
		setMap.setValue("ADD_OPEACNT", setParam[5]);
		setMap.setValue("UPD_DTM", setParam[6]);
		setMap.setValue("UPD_OPEACNT", setParam[7]);
		setMap.setValue("DEL_DTM", setParam[8]);
		setMap.setValue("DEL_OPEACNT", setParam[9]);
		setMap.setValue("MK_FLG", setParam[10]);
		setMap.setValue("ADD_UNYO_YMD", setParam[11]);
		setMap.setValue("ADD_TRN_ID", setParam[12]);
		setMap.setValue("UPD_UNYO_YMD", setParam[13]);
		setMap.setValue("UPD_TRN_ID", setParam[14]);
		setMap.setValue("DEL_UNYO_YMD", setParam[15]);
		setMap.setValue("DEL_TRN_ID", setParam[16]);

		// DBアクセスを実行します
		db_KK_T_RNKI_FILE_CTRL.insertByPrimaryKeys(setMap);
	}

	/**
	 * PK(ＰＫ　更新)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.引数で条件マップを作ります。<br>
	 *
	 * 3.DBアクセスを実行します。<br>
	 * 
	 * 4.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	処理済ファイル通番						TRAN_ZUMI_FILE_SEQ
	 *		 	前回処理実行年月日時分秒				ZNKI_TRAN_RUN_DTM
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	BUTSURI_BAT_ID
	 *		 	FILE_ID
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @param whereParam 条件項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void  updateKK_T_RNKI_FILE_CTRL(Object[] setParam, Object[] whereParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("TRAN_ZUMI_FILE_SEQ", setParam[0]);
		setMap.setValue("ZNKI_TRAN_RUN_DTM", setParam[1]);
	
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("BUTSURI_BAT_ID", whereParam[0]);
		whereMap.setValue("FILE_ID", whereParam[1]);

		// DBアクセスを実行します
		db_KK_T_RNKI_FILE_CTRL.updateByPrimaryKeys(whereMap, setMap);
	}
	
}
