/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom                        *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKSkekkaFileSaksei
*	ソースファイル名	：JBSbatKKSkekkaFileSaksei.java
*	作成者				：富士通　
*	作成日				：2011年08月31日
*＜機能概要＞
*　審査結果ファイル作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/08/31  FJ)倉上		新規作成
*	v3.00.00	2012/08/18  FJ)藤本		【ST1-2012-0000330】編集要領修正
*	v3.01.00	2012/09/24  FJ)藤本		【ST2-2012-0001714】運用日の前日を抽出するように修正
*	v3.02.00	2012/10/26  FJ)藤本		【ST1-2012-0000713】運用日で抽出するように修正
*	v4.00.00	2013/01/17  FJ)団		【ST2-2013-0000113】連携ファイル制御で範囲指定するよう修正
*	v4.01.00	2013/03/22  FJ)柳		【IT1-2013-0000498】対応
*	v4.04.00	2013/03/27  FJ)藤本		【ST1-2013-0000499】対応
*********************************************************************/
package eo.business.service;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JKKBatConst;
import eo.business.util.file.JBSbatKKIFE046001;
import eo.business.util.table.JBSbatKK_T_JUDGE;
import eo.business.util.table.JBSbatKK_T_KCN_RNK_KEI_INF;
import eo.business.util.table.JBSbatKK_T_RNKI_FILE_CTRL;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatOutputFileUtil;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatDateUtil;
import eo.framework.util.JBSbatStringUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKSkekkaFileSaksei extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(連携ファイル制御)*/
	private static final String D_TBL_NAME_KK_T_RNKI_FILE_CTRL = "KK_T_RNKI_FILE_CTRL";

	/** テーブル(審査)*/
	private static final String D_TBL_NAME_KK_T_JUDGE = "KK_T_JUDGE";

	/** SQL定義キー(KK_SELECT_004)*/
	private static final String KK_T_JUDGE_KK_SELECT_004 = "KK_SELECT_004";

	/** テーブルアクセスクラス(連携ファイル制御)*/
	private JBSbatSQLAccess db_KK_T_RNKI_FILE_CTRL = null;

	/** テーブルアクセスクラス(審査)*/
	private JBSbatSQLAccess db_KK_T_JUDGE = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 物理バッチID（KKPRC01601）*/
	private static final String BAT_ID = "KKPRC01601";
	
	/** ファイルID（KKIFE044）*/
	private static final String FILE_ID = "KKIFE044  ";
	
	/** フラグファイル名 */
	private String FLG_FILE_NAME = "";
	
	/** 抽出開始時間 */
	private String SEARCH_TIME_STAMP = "";
	
	/** 該当データカウント */
	private int count = 0;
	
	/**
	 * 初期処理
	 * @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);
		db_KK_T_JUDGE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_JUDGE);

		// シェルからのFREEパラメータ取得
		String[] free_item = commonItem.getFreeItem().split(JKKBatConst.S_PARAM_DELIM);
		this.FLG_FILE_NAME = free_item[0];
		
		// 抽出開始時間を取得する。
		this.SEARCH_TIME_STAMP = this.getSearchTimeStamp(free_item[1]);
		
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		super.logPrint.printDebugLog("execute_START");
		
		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		JBSbatCommonDBInterface db_map = null;
		String znkiJssiDate = "";
		String znkiJssiTimestamp = "";

		// 連携ファイル制御を検索します。
		String[] para1 = {BAT_ID, FILE_ID};
		db_map = executeKK_T_RNKI_FILE_CTRL_PKSELECT(para1);
		// 前回実施日が取得できた場合
		if (null != db_map)
		{
			znkiJssiTimestamp = JBSbatStringUtil.Rtrim(db_map.getString(JBSbatKK_T_RNKI_FILE_CTRL.ZNKI_TRAN_RUN_DTM));
		}
		// 前回実施日が取得できなかった場合、バッチ運用日-1日を「前回運用日」とします。
		if("".equals(znkiJssiTimestamp))
		{
			znkiJssiTimestamp = JBSbatDateUtil.adjustDate(super.opeDate, -1) + "000000000";
		}
		
		// 前回実施日を取得
		if(8 <= znkiJssiTimestamp.length())
		{
			znkiJssiDate = znkiJssiTimestamp.substring(0, 8);
		}
		
		// 対象となるサービス契約の検索を行います。
		String[] para2 = {znkiJssiDate, super.opeDate, super.opeDate, znkiJssiTimestamp, SEARCH_TIME_STAMP, super.opeDate};
		this.executeKK_T_JUDGE_KK_SELECT_004(para2);
		JBSbatCommonDBInterface judgeResult = db_KK_T_JUDGE.selectNext();
		if(null == judgeResult)
		{
			super.logPrint.printDebugLog("異動日時＞「" + znkiJssiTimestamp + "」、異動日時＜＝「" + SEARCH_TIME_STAMP + "」の審査結果情報の検索結果がありませんでした。");
		}
		else
		{
			while(null != judgeResult)
			{
				// 入出力インターフェースオブジェクトを生成(審査結果ファイル送信用)
				JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();
		
				// お客様ID → サービス契約番号を設定します。
				outmap.set(JBSbatKKIFE046001.CUST_ID, JBSbatStringUtil.Rtrim(judgeResult.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_NO)));
				
				// 顧客コード → KCN番号を設定します。未設定の場合は10桁の半角空白を設定する。
				String kcn_no = JBSbatStringUtil.Rtrim(judgeResult.getString(JBSbatKK_T_KCN_RNK_KEI_INF.KCN_NO));
				if("".equals(kcn_no))
				{
					kcn_no = "          ";
				}
				outmap.set(JBSbatKKIFE046001.CUST_CD, kcn_no);
				
				// 審査結果コード → 取得した審査結果種別コードより判定します。
				String skekka_cd = JBSbatStringUtil.Rtrim(judgeResult.getString(JBSbatKK_T_JUDGE.JUDGE_SBT_CD));
				
				// 06：不良顧客チェックの場合、93：契約お断り（不良顧客）を設定
				if("06".equals(skekka_cd))
				{
					skekka_cd = "93";
				}
				// 13：エリアチェックの場合、91：エリアサービス外を設定
				else if("13".equals(skekka_cd))
				{
					skekka_cd = "91";
				}
				else
				{
					// 上記以外は取得値（71：加入御礼書）を設定
				}
				
				outmap.set(JBSbatKKIFE046001.SKEKKA_CD, skekka_cd);
				
				// 審査結果通知日 → バッチ運用日を設定します。
				outmap.set(JBSbatKKIFE046001.SKEKKA_TCH_DAY, super.opeDate);
				
				// ファイルに出力する
				outmap.setOutFlg(true);
				outputBean.addOutMapList(outmap);
				
				// 件数をカウントアップ
				count++;
				
				judgeResult = db_KK_T_JUDGE.selectNext();
			}
		}
		
		super.logPrint.printDebugLog("execute_END");
		
		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_RNKI_FILE_CTRL.close();
		db_KK_T_JUDGE.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		// 審査結果ファイル(etv3)フラグファイルオブジェクト生成
		JBSbatOutputFileUtil obj = super.commonItem.getOutPutFile2();
		
		// 該当レコード件数をダブルクォーテーションで囲み設定
		obj.write("\"" + count + "\"");
		
		// 審査結果ファイル(etv3)フラグファイルの出力
		this.createFlgFile();
		
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * PK(ＰＫ　検索)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で条件マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	BUTSURI_BAT_ID
	 *		 	FILE_ID
	 * </pre>
	 * <p>
	 * @param whereParam 条件項目の値。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeKK_T_RNKI_FILE_CTRL_PKSELECT(Object[] whereParam) throws Exception
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("BUTSURI_BAT_ID", whereParam[0]);
		whereMap.setValue("FILE_ID", whereParam[1]);

		// DBアクセスを実行します
		return db_KK_T_RNKI_FILE_CTRL.selectByPrimaryKeys(whereMap);
	}

	/**
	 * SQLKEY(KK_SELECT_004)で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_JUDGE_KK_SELECT_004(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
		paramList.setValue(param[4].toString());
		paramList.setValue(param[5].toString());

		// DBアクセスを実行します
		db_KK_T_JUDGE.selectBySqlDefine(paramList, KK_T_JUDGE_KK_SELECT_004);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * 審査結果ファイル(etv3)フラグファイルを出力します。<br>
	 * <p>
	 * @param str 指定文字列
	 * @return ダブルクォーテーションが付加された文字列
	 * @throws Exception 業務サービス内で発生した例外全般。	 */	
	private void createFlgFile() throws IOException, JBSbatBusinessException
	{
		// 一時ファイル読込み処理
		BufferedWriter wr = null;
		try
		{
			// 審査結果ファイル(etv3)フラグファイルの生成(SJIS)
			wr = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(FLG_FILE_NAME), JKKBatConst.SJIS));
			
			// ファイル出力
			wr.flush();
		}
		catch(IOException e)
		{
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0250CE, new String[]{FLG_FILE_NAME, e.getMessage()});
		}
		finally
		{
			if (wr != null)
			{
				wr.close();
			}
		}
	}
	
	/**
	 * EO20G0110J0にて出力された抽出開始タイムスタンプを取得します。<br>
	 * <p>
	 * @param String file_name　タイムスタンプが設定されたファイル名
	 * @return 抽出開始時分秒
	 * @throws JBSbatBusinessException 
	 * @throws IOException 業務サービス内で発生した例外全般。
	 */	
	private String getSearchTimeStamp(String file_name) throws JBSbatBusinessException, IOException
	{
		String searhTimeStamp = "";
		
		// 読み込みファイル名取得
		BufferedReader br = null;
		
		// 前回処理実行年月日時分秒保持ファイルを読み込みます。
		try
		{
			InputStreamReader is = new InputStreamReader(new FileInputStream(file_name), "Shift-JIS");
			br = new BufferedReader(is);
			
			if (br.ready())
			{
				// １行読込み
				searhTimeStamp = br.readLine();
			}
		}
		catch (IOException e)
		{
			// 前回処理実行年月日時分秒保持ファイルがない場合はエラー。
			throw new JBSbatBusinessException("EKKB0020CE", new String[]{file_name});
		}
		finally
		{
			if (null != br)
			{
				br.close();
			}
		}
		return searhTimeStamp;
	}
}