/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名			：eo顧客基幹システム
 *	モジュール名		：JBSbatFUFrntHisukZkErrListOut
 *	ソースファイル名	：JBSbatFUFrntHisukZkErrListOut.java
 *	作成者				：富士通
 *	作成日				：2013年02月18日
 *＜機能概要＞
 *　Ｗｅｂ受付処理結果エラーリスト出力処理部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2013/02/18   富士通		新規作成
 *	v1.01.00	2013/05/15   FJ)岡井	【TAI-2013-0000026】日中バッチ運用日付対応
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.util.table.JBSbatFU_T_FRNT_HISUK_ZKUP;
import eo.common.constant.JFUStrConst;
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.util.JBSbatBusinessFileUtil;

/**
 * (クラスの機能概要)
 * <p>
 *<BR>
 *
 * @author 富士通
 */
public class JBSbatFUFrntHisukZkErrListOut extends JBSbatBusinessService
{

	/** メッセージキー */
	private static final String EFUB0030KE = JPCBatchMessageConstant.EFUB0030KE;

	/** 処理結果 */
	private static final String HISUK_ZKUP_RSLT_NM = "HISUK_ZKUP_RSLT_NM";

	/** 詳細内容 */
	private static final String HISUK_ZKUP_RSLT_DTL_NM = "HISUK_ZKUP_RSLT_DTL_NM";

	/** 申込日時 */
	private static final String GENE_ADD_DTM = "GENE_ADD_DTM";

	/** サービス契約名 */
	private static final String SVC_NM = "SVC_NM";

	/** サービス契約番号 */
	private static final String SVC_KEI_NO = "SVC_KEI_NO";

	/** ▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼ */

	/** テーブル(フロント配送受付在庫更新) */
	private static final String D_TBL_NAME_FU_T_FRNT_HISUK_ZKUP = "FU_T_FRNT_HISUK_ZKUP";

	/** SQL定義キー(FU_DELETE_001)*/
	private static final String FU_T_FRNT_HISUK_ZKUP_FU_DELETE_001 = "FU_DELETE_001";

	/** SQL定義キー(FU_SELECT_002) */
	private static final String FU_T_FRNT_HISUK_ZKUP_FU_SELECT_002 = "FU_SELECT_002";

	/** SQL定義キー(FU_UPDATE_002) */
	private static final String FU_T_FRNT_HISUK_ZKUP_FU_UPDATE_002 = "FU_UPDATE_002";

	/** テーブルアクセスクラス(フロント配送受付在庫更新) */
	private JBSbatSQLAccess db_FU_T_FRNT_HISUK_ZKUP = null;

	/** ▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲ */

	/**
	 * 初期処理
	 *
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		/** ▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼ */
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_FU_T_FRNT_HISUK_ZKUP = new JBSbatSQLAccess(commonItem, D_TBL_NAME_FU_T_FRNT_HISUK_ZKUP);
		/** ▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲ */
		/** ▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * 主処理
	 *
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
		/** ▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼ */

		String strJobid = commonItem.getJobid();
		String strBatchUserId = commonItem.getBatchUserId();
		String strSqlDefFilePath = commonItem.getSqlDefFilePath();
		super.logPrint.printDebugLog(strJobid + JFUStrConst.HALF_COLON + strBatchUserId);
		super.logPrint.printDebugLog(strJobid + JFUStrConst.HALF_COLON + strSqlDefFilePath);

		// FREEパラメータ取得
		String strFreeParam = commonItem.getFreeItem();
		if (strFreeParam == null || strFreeParam.length() == 0)
		{
			throw new JBSbatBusinessException(EFUB0030KE);
		}

		// パラメータを区切り文字で分割する
		String[] lines = strFreeParam.split(JFUStrConst.S_PARAM_DELIM);
		if (lines == null || lines.length > 1)
		{
			throw new JBSbatBusinessException(EFUB0030KE);
		}

		// オンライン運用日を取得する。
		String strOpeDate = commonItem.getOnlineOpeDate();

		// -------- （１）Ｗｅｂ受付処理結果不要データ物理削除処理 --------//

		JBSbatCommonDBInterface delFrntHisukZkupInfo = new JBSbatCommonDBInterface();

		// Ｗｅｂ受付処理結果で不要となったデータの物理削除を行う。
		delFrntHisukZkupInfo.setValue(strOpeDate); // オンライン運用日
		executeFU_T_FRNT_HISUK_ZKUP_FU_DELETE_001(delFrntHisukZkupInfo.getList().toArray());
		super.commit();

		// -------- （２）Ｗｅｂ受付処理結果エラーリストデータ抽出処理 --------//

		// Ｗｅｂ受付処理結果エラーリストデータ抽出結果格納領域を生成する。
		JBSbatCommonDBInterface selFrntHisukZkupInfo = new JBSbatCommonDBInterface();

		// Ｗｅｂ受付処理結果エラーリストデータ抽出する。
		selFrntHisukZkupInfo.setValue(strOpeDate); // オンライン運用日
		executeFU_T_FRNT_HISUK_ZKUP_FU_SELECT_002(selFrntHisukZkupInfo.getList().toArray());

		ArrayList<HashMap<String, String>> frntHisukZkupInfoList = new ArrayList<HashMap<String, String>>();

		int recordCnt = 0;

		for (selFrntHisukZkupInfo = db_FU_T_FRNT_HISUK_ZKUP.selectNext(); null != selFrntHisukZkupInfo; selFrntHisukZkupInfo =
				db_FU_T_FRNT_HISUK_ZKUP.selectNext())
		{
			// 取得したレコードを1件づつ読込みSQL取得項目を各変数へ格納する。
			recordCnt++;

			// 在庫処理未済データリスト格納領域を生成する。
			HashMap<String, String> frntHisukZkupInfoMap = new HashMap<String, String>();

			// フロント配送受付在庫更新番号
			String frntHisukZkupNo = selFrntHisukZkupInfo.getString(JBSbatFU_T_FRNT_HISUK_ZKUP.FRNT_HISUK_ZKUP_NO);
			// サービス名
			String svcNm = selFrntHisukZkupInfo.getString(SVC_NM);
			// サービス契約番号
			String svcKeiNo = selFrntHisukZkupInfo.getString(SVC_KEI_NO);
			// 世代登録年月日時分秒
			String geneAddDtm = selFrntHisukZkupInfo.getString(GENE_ADD_DTM);
			// フロント配送受付在庫更新結果名
			String hisukZkupRsltNm = selFrntHisukZkupInfo.getString(HISUK_ZKUP_RSLT_NM);
			// フロント配送受付在庫更新結果詳細名
			String hisukZkupRsltDtlNm = selFrntHisukZkupInfo.getString(HISUK_ZKUP_RSLT_DTL_NM);
			// フロント配送受付在庫更新結果コード
			String hisukZkupRsltCd = selFrntHisukZkupInfo.getString(JBSbatFU_T_FRNT_HISUK_ZKUP.HISUK_ZKUP_RSLT_CD);
			// フロント配送受付在庫更新結果詳細コード
			String hisukZkupRsltDtlCd = selFrntHisukZkupInfo.getString(JBSbatFU_T_FRNT_HISUK_ZKUP.HISUK_ZKUP_RSLT_DTL_CD);
			// 機器提供サービス契約番号
			String kktkSvcKeiNo = selFrntHisukZkupInfo.getString(JBSbatFU_T_FRNT_HISUK_ZKUP.KKTK_SVC_KEI_NO);
			// 機器変更番号
			String kikiChgNo = selFrntHisukZkupInfo.getString(JBSbatFU_T_FRNT_HISUK_ZKUP.KIKI_CHG_NO);
			// 在庫更新不可リスト出力年月日
			String zkupFailListOputYmd = selFrntHisukZkupInfo.getString(JBSbatFU_T_FRNT_HISUK_ZKUP.ZKUP_FAIL_LIST_OPUT_YMD);
			// 在庫確認済フラグ
			String zaikoCfmZmFlg = selFrntHisukZkupInfo.getString(JBSbatFU_T_FRNT_HISUK_ZKUP.ZAIKO_CFM_ZM_FLG);
			// 在庫確認年月日時分秒
			String zaikoCfmDtm = selFrntHisukZkupInfo.getString(JBSbatFU_T_FRNT_HISUK_ZKUP.ZAIKO_CFM_DTM);

			frntHisukZkupInfoMap.put(JBSbatFU_T_FRNT_HISUK_ZKUP.FRNT_HISUK_ZKUP_NO, frntHisukZkupNo);
			frntHisukZkupInfoMap.put(JBSbatFU_T_FRNT_HISUK_ZKUP.KKTK_SVC_KEI_NO, kktkSvcKeiNo);
			frntHisukZkupInfoMap.put(JBSbatFU_T_FRNT_HISUK_ZKUP.KIKI_CHG_NO, kikiChgNo);
			frntHisukZkupInfoMap.put(JBSbatFU_T_FRNT_HISUK_ZKUP.HISUK_ZKUP_RSLT_CD, hisukZkupRsltCd);
			frntHisukZkupInfoMap.put(JBSbatFU_T_FRNT_HISUK_ZKUP.HISUK_ZKUP_RSLT_DTL_CD, hisukZkupRsltDtlCd);
			frntHisukZkupInfoMap.put(JBSbatFU_T_FRNT_HISUK_ZKUP.ZKUP_FAIL_LIST_OPUT_YMD, zkupFailListOputYmd);
			frntHisukZkupInfoMap.put(JBSbatFU_T_FRNT_HISUK_ZKUP.ZAIKO_CFM_ZM_FLG, zaikoCfmZmFlg);
			frntHisukZkupInfoMap.put(JBSbatFU_T_FRNT_HISUK_ZKUP.ZAIKO_CFM_DTM, zaikoCfmDtm);
			frntHisukZkupInfoMap.put(SVC_NM, svcNm);
			frntHisukZkupInfoMap.put(SVC_KEI_NO, svcKeiNo);
			frntHisukZkupInfoMap.put(GENE_ADD_DTM, geneAddDtm);
			frntHisukZkupInfoMap.put(HISUK_ZKUP_RSLT_NM, hisukZkupRsltNm);
			frntHisukZkupInfoMap.put(HISUK_ZKUP_RSLT_DTL_NM, hisukZkupRsltDtlNm);

			frntHisukZkupInfoList.add(frntHisukZkupInfoMap);
		}

		if (recordCnt == 0)
		{
			super.logPrint.printDebugLog(strJobid + "：対象データが0件の為、後続処理を行わずに終了。");
			return null;
		}

		// ======= ▼▼▼ 整形した情報をCASEファイルへ出力する。 ▼▼▼ =======

		// Ｗｅｂ受付処理結果エラーリストファイル
		String webUktkShrErrListFile = lines[0];

		JBSbatBusinessFileUtil webUktkShrErrListFileObj = null;

		try
		{
			// Ｗｅｂ受付処理結果エラーリストファイルを生成する。
			webUktkShrErrListFileObj =
					JCCBatCommon.createBusinessFileUtil(webUktkShrErrListFile, JFUStrConst.SJIS, JFUStrConst.RETURN_CODE, JFUStrConst.S_SEP_CAM);
			super.logPrint.printDebugLog(strJobid + "：Ｗｅｂ受付処理結果エラーリストファイル名：" + webUktkShrErrListFile);

			for (int i = 0; i < frntHisukZkupInfoList.size(); i++)
			{
				HashMap<String, String> outMap = frntHisukZkupInfoList.get(i);

				// フロント配送受付在庫更新番号
				String frntHisukZkupNo = outMap.get(JBSbatFU_T_FRNT_HISUK_ZKUP.FRNT_HISUK_ZKUP_NO);
				// サービス名
				String svcNm = outMap.get(SVC_NM);
				// サービス契約番号
				String svcKeiNo = outMap.get(SVC_KEI_NO);
				// 世代登録年月日時分秒
				String geneAddDtm = outMap.get(GENE_ADD_DTM);
				// フロント配送受付在庫更新結果名
				String hisukZkupRsltNm = outMap.get(HISUK_ZKUP_RSLT_NM);
				// フロント配送受付在庫更新結果詳細名
				String hisukZkupRsltDtlNm = outMap.get(HISUK_ZKUP_RSLT_DTL_NM);
				// フロント配送受付在庫更新結果詳細コード
				String hisukZkupRsltDtlCd = outMap.get(JBSbatFU_T_FRNT_HISUK_ZKUP.HISUK_ZKUP_RSLT_DTL_CD);

				// CASEファイル出力リスト
				ArrayList<String> frntHisukZkupDataList = new ArrayList<String>();
				outputVal(frntHisukZkupNo, frntHisukZkupDataList);// 受付番号
				outputVal(svcNm, frntHisukZkupDataList);// 契約サービス
				outputVal(svcKeiNo, frntHisukZkupDataList);// サービス契約番号
				outputVal(geneAddDtm, frntHisukZkupDataList);// 申込日時
				outputVal(hisukZkupRsltNm, frntHisukZkupDataList);// 処理結果
				outputVal(hisukZkupRsltDtlCd, frntHisukZkupDataList);// 詳細コード
				outputVal(hisukZkupRsltDtlNm, frntHisukZkupDataList);// 詳細内容

				// Ｗｅｂ受付処理結果エラーリストファイルへ出力する。
				JCCBatCommon.printBusinessFileUtil(webUktkShrErrListFileObj, frntHisukZkupDataList);
			}

			// ======= ▼▼▼ 抽出データの在庫更新不可リスト出力済フラグ、在庫更新不可リスト出力年月日の更新を行う。 ▼▼▼ =======

			for (int i = 0; i < frntHisukZkupInfoList.size(); i++)
			{
				HashMap<String, String> outMap = frntHisukZkupInfoList.get(i);
				// フロント配送受付在庫更新番号
				String frntHisukZkupNo = outMap.get(JBSbatFU_T_FRNT_HISUK_ZKUP.FRNT_HISUK_ZKUP_NO);
				// 在庫確認済フラグ
				String zaikoCfmZmFlg = outMap.get(JBSbatFU_T_FRNT_HISUK_ZKUP.ZAIKO_CFM_ZM_FLG);

				super.logPrint.printDebugLog(strJobid + "：フロント配送受付在庫更新の在庫更新不可リスト出力済フラグ、在庫更新不可リスト出力年月日を更新する。");
				super.logPrint.printDebugLog(strJobid + "：オンライン運用日：" + strOpeDate);
				super.logPrint.printDebugLog(strJobid + "：フロント配送受付在庫更新番号：" + frntHisukZkupNo);

				// Ｗｅｂ受付処理結果エラーリスト内容
				JBSbatCommonDBInterface updFrntHisukZkupInfo = new JBSbatCommonDBInterface();
				updFrntHisukZkupInfo.setValue(JFUStrConst.CD00581_1.equals(zaikoCfmZmFlg) ? JFUStrConst.CD00581_1 : JFUStrConst.CD00581_0); // 在庫更新不可リスト出荷済フラグ
				updFrntHisukZkupInfo.setValue(strOpeDate); // オンライン運用日
				updFrntHisukZkupInfo.setValue(frntHisukZkupNo); // フロント配送受付在庫更新番号
				executeFU_T_FRNT_HISUK_ZKUP_FU_UPDATE_002(updFrntHisukZkupInfo.getList().toArray());
			}
		}
		catch (Exception e)
		{

			super.logPrint.printDebugLog(strJobid + "：例外発生の為、生成ファイルのクローズ処理を行う。");

			// 生成ファイルのクローズ処理
			if (null != webUktkShrErrListFileObj)
			{
				JCCBatCommon.closeBusinessFileUtil(webUktkShrErrListFileObj);
			}

			super.logPrint.printDebugLog(strJobid + "：例外発生の為、更新データがある場合はロールバックを行う。");

			throw e;
		}

		if (null != webUktkShrErrListFileObj)
		{
			JCCBatCommon.closeBusinessFileUtil(webUktkShrErrListFileObj);
		}

		return null;
		/** ▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * 業務サービス終了処理
	 *
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
		/** ▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼ */
		// DBアクセスクラスをクローズします
		db_FU_T_FRNT_HISUK_ZKUP.close();
		/** ▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲ */
		/** ▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲ */
	}

	/** ▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼ */

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(FU_DELETE_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 executeFU_T_FRNT_HISUK_ZKUP_FU_DELETE_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_FU_T_FRNT_HISUK_ZKUP.executeBySqlDefine(paramList, FU_T_FRNT_HISUK_ZKUP_FU_DELETE_001);
	}

	/**
	 * SQLKEY(FU_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 executeFU_T_FRNT_HISUK_ZKUP_FU_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[0].toString());
		paramList.setValue(param[0].toString());
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_FU_T_FRNT_HISUK_ZKUP.selectBySqlDefine(paramList, FU_T_FRNT_HISUK_ZKUP_FU_SELECT_002);
	}

	/**
	 * SQLKEY(FU_UPDATE_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 executeFU_T_FRNT_HISUK_ZKUP_FU_UPDATE_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_FU_T_FRNT_HISUK_ZKUP.executeBySqlDefine(paramList, FU_T_FRNT_HISUK_ZKUP_FU_UPDATE_002);
	}

	/** ▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲ */

	/**
	 * 出力用文字列の作成処理です。
	 *
	 * @param value 対象文字列
	 * @param list CASEファイル出力リスト
	 * @return 対象文字列の結合情報
	 */
	private static List<String> outputVal(String value, List<String> list)
	{
		list.add(JFUStrConst.S_DUBLLEQ + value + JFUStrConst.S_DUBLLEQ);
		return list;
	}
}
