/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatFUWebMskmSeniSunk
*	ソースファイル名	：JBSbatFUWebMskmSeniSunk.java
*	作成者				：富士通
*	作成日				：2012年06月23日
*＜機能概要＞
*　ＷＥＢデータ申込遷移数集計処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/06/23   富士通		新規作成
*	v4.00.00	2012/11/19   味岡		IT2-2012-0001701 Webデータ集計 テーブル桁数変更対応
*	v4.01.00	2013/03/06   八坂		IT1-2013-0000523 障害対応
*********************************************************************/
package eo.business.service;

import java.io.IOException;
import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JFUBatCommon;
import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.util.JBSbatBusinessFileUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatFUWebMskmSeniSunk extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/**メッセージID */
	private static final String EFUB0120AI = JPCBatchMessageConstant.EFUB0120AI;

	/**出力ファイル名 */
	private static final String OUTPUTFILENM = "ＷＥＢ申込画面遷移結果ファイル";

	/**画面ID */
	private static final String FUW00122 = "FUW00122";

	/**画面ID */
	private static final String FUW00126 = "FUW00126";

	/**画面ID */
	private static final String FUW009 = "FUW009";

	/**メッセージID */
	private static final String EFUB0030KE = JPCBatchMessageConstant.EFUB0030KE;

	/** メッセージキー */
	private static final String EFUB0210KE = JPCBatchMessageConstant.EFUB0210KE;

	/**帳票出力用固定値:(1) */
	private static final String S_ONE = "1";

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// パラメータ読み出し
		String strFreeParam = commonItem.getFreeItem();

		// パラメータを区切り文字で分割する
		String[] lines = strFreeParam.split(JFUStrConst.S_PARAM_DELIM);
		// パラメータチェック
		if(lines.length != 3 || ("").equals(lines[0]))
		{
			throw new JBSbatBusinessException(EFUB0030KE);
		}
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// FREEパラメータ取得(入出力中間ファイルパス)
		String strFreeParam = commonItem.getFreeItem();

		// パラメータを区切り文字で分割する
		String[] lines = strFreeParam.split(JFUStrConst.S_PARAM_DELIM);
		// パラメータ取得
		String strFreeParam1 = lines[0];	// 起動パラメータ
		String strFreeParam2 = lines[1];	// ＷＥＢ申込実績データ抽出ファイル
		String strFreeParam3 = lines[2];	// ＷＥＢ申込画面遷移結果ファイル

		// 中間ファイル読み込み
		ArrayList<String> sContMstList = null;
		try {
			sContMstList = readFile(strFreeParam2);
		} catch (Exception e) {
			throw new JBSbatBusinessException(EFUB0210KE,
					new String[] { strFreeParam2 });
		}

		// 入力ファイルにレコードがない場合はそのまま終了。
		if(sContMstList.size() == 0)
		{
			JBSbatBusinessFileUtil obj = JFUBatCommon.createBusinessFileUtil(strFreeParam3, JFUStrConst.SJIS, JFUStrConst.S_LINE_SEPARAOR_LF, "");
			if (null != obj)
			{
				// ファイルオブジェクトをクローズ
				JFUBatCommon.closeBusinessFileUtil(obj);
			}
			return null;
		}

		// システム日付を取得
		String sysDate = JFUBatCommon.getSysDate();

		int iFileNum = 0;			// ファイル出力件数用カウンター
		int sumCnt = 0;				// セッションID毎のセッションID件数カウンター
		String bfSsId = "";			// セッションIDブレイク用変数
		String taiScIdLis = "";		// 退避用画面ID
		String taigamenYmd = "";	// 退避用画面表示年月日
		String taiScId = "";		// 退避用画面ID

		// ファイル出力オブジェクト生成
		JBSbatBusinessFileUtil obj = JFUBatCommon.createBusinessFileUtil(strFreeParam3, JFUStrConst.SJIS, JFUStrConst.S_LINE_SEPARAOR_LF, "");

		// 中間ファイルの件数分処理を繰り返す
		for(int i = 0; i < sContMstList.size(); i++)
		{

			// 読込ファイルのレコードを分割する。
			String[] filelines = sContMstList.get(i).split(JFUStrConst.S_SEP_CAM);

			String ssId = filelines[0];		// セッションID
			String scId = filelines[1];		// 画面ID
			String gamenYmd = filelines[2];	// 画面表示年月日

			// 定期起動時かつシステム日付と一致する画面表示年月日の場合は読み飛ばす。
			// 随時起動時は全てのレコードを読込む
			if(gamenYmd.startsWith(sysDate) && JFUStrConst.S_WEB_SHUK_KIDO_PARA_1.equals(strFreeParam1))
			{
				continue;
			}

			// 2013/01/10 ST1-2013-0000055 1回目のレコード集計かどうかの条件を追加
			/* 前処理セッションIDと異なっている場合は処理済み分のファイルレコードを出力し、
			カウンターをリセットする。 */
			if(i > 0 && !"".equals(taigamenYmd))
			{
				// 2013/03/06 【IT1-2013-0000523 障害対応】
				if(!bfSsId.equals(ssId) && !FUW009.equals(scId.substring(0, 6)))
				{
					// 処理済み分をファイル出力
					JFUBatCommon.printBusinessFileUtil(obj, makeRec(taiScIdLis, taiScId, taigamenYmd));
					// リストリセット
					taiScIdLis = "";
					// カウンターリセット
					sumCnt = 0;
					iFileNum++;
				}
			}
			// 2013/03/06 【IT1-2013-0000523 障害対応】
			if (FUW009.equals(scId.substring(0, 6)))
			{
				/* 入力ファイル最終行の場合、
				レコード出力する */
				if(i == sContMstList.size() - 1)
				{
					JFUBatCommon.printBusinessFileUtil(obj, makeRec(taiScIdLis, taiScId, taigamenYmd));
				}

				// カウンターリセット
				sumCnt = 0;
				continue;
			}

			// 読込み分の画面IDを追記
			if(sumCnt != 0 && sumCnt < 220)
			{
				taiScIdLis = taiScIdLis + JFUStrConst.S_SEP_CAM;	// 区切り文字用カンマ(セッションID1件目以外で設定)
			}
			// 画面ID追記件数が121件以上の場合はリストへの画面ID追記を実施しない
			if (sumCnt <= 219)
			{
				taiScIdLis = taiScIdLis + scId;		// リストに画面iDを追記
				taiScId = scId;						// 読込みレコード最新版の画面IDを退避
			}

			// 処理済みセッションIDを格納
			bfSsId = ssId;
			taigamenYmd = gamenYmd;

			sumCnt = sumCnt + 1;

			/* 入力ファイル最終行の場合、
			レコード出力する */
			if(i == sContMstList.size() - 1)
			{
				JFUBatCommon.printBusinessFileUtil(obj, makeRec(taiScIdLis, taiScId, taigamenYmd));
			}
		}

		if (null != obj)
		{
			// ファイルオブジェクトをクローズ
			JFUBatCommon.closeBusinessFileUtil(obj);
		}

		super.logPrint.printBusinessErrorLog(EFUB0120AI, new String[]{OUTPUTFILENM, String.valueOf(iFileNum)});

		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * ファイル出力用レコードを作成します。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数を元にファイル出力を行う1レコードを作成します。<br>
	 *
	 * </pre>
	 * <p>
	 * @param outScId    画面ID。
	 * @param scId        画面ID。
	 * @param gamenYmd    画面申込年月日。
	 * @return String     ファイル出力レコード
	 * @throws Exception    業務サービス内で発生した例外全般。
	 */
	private static String makeRec(String outScId, String scId, String gamenYmd) throws Exception
	{
		StringBuffer strRec = new StringBuffer();

		// 申込年月日
		strRec.append(gamenYmd.substring(0, 8));
		strRec.append(JFUStrConst.S_DELIM_TAB);
		// ＷＥＢ申込集計対象値判定
		if((FUW00122.equals(scId)) || (FUW00126.equals(scId)))
		{
			strRec.append(JFUStrConst.S_WEB_MSKM_SHUK_CD_4);
		}
		else
		{
			strRec.append(JFUStrConst.S_WEB_MSKM_SHUK_CD_5);
		}
		strRec.append(JFUStrConst.S_DELIM_TAB);

		// ＷＥＢ申込集計対象値
		strRec.append(outScId);
		strRec.append(JFUStrConst.S_DELIM_TAB);

		// 導線別申込件数
		strRec.append(S_ONE);

		return strRec.toString();
	}

	/**
	 * ファイル読み込み処理を行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で読込ファイルディレクトリ(フルパス)を設定します。<br>
	 *
	 * 2.引数を元にファイル読込を行い、行をListへ格納します。<br>
	 *
	 * </pre>
	 * <p>
	 * @param strFileDir    出力ディレクトリ(フルパス)。
	 * @return resultList   返却用List
	 * @throws Exception    業務サービス内で発生した例外全般。
	 */
	private static ArrayList<String> readFile(String strFileDir) throws Exception
	{
		ArrayList<String> resultList = new  ArrayList<String>();

		// 外部出力ファイルパス
		JBSbatInputFileUtil inFile = null;
		try
		{
			inFile = new JBSbatInputFileUtil(strFileDir);
			inFile.setEncode(JFUStrConst.SJIS);						// 文字コード
			inFile.setLine(JFUStrConst.S_LINE_SEPARAOR_LF);			// 改行コード
			inFile.createReader();

			while(true)
			{
				String line = inFile.readLine();
				if(line == null)
				{
					break;
				}
				resultList.add(line);
			}

			return resultList;
		}
		catch (IOException e)
		{
			throw e;
		}
		finally
		{
			if (null != inFile)
			{
				// ファイルオブジェクトをクローズ
				inFile.close();
			}
		}
	}
}
