/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatDKKepTrmOvrInfDel
*	ソースファイル名	：JBSbatDKKepTrmOvrInfDel.java
*	作成者				：富士通　
*	作成日				：2011年09月09日
*＜機能概要＞
*　保存期間経過データ削除対象抽出（機器）部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/09/09   富士通		新規作成
*********************************************************************/
package eo.business.service;

import java.io.IOException;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JDKBatOutputFileUtil;
import eo.business.util.file.JBSbatDKIFM013001;
import eo.common.constant.JDKStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JPCDateUtil;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
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.JBSbatAplConst;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatDKKepTrmOvrInfDel extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(予備機器配送)*/
	private static final String D_TBL_NAME_DK_T_YBKIKI_HAISO = "DK_T_YBKIKI_HAISO";

	/** テーブル(倉庫棚移動)*/
	private static final String D_TBL_NAME_DK_T_SOKODNA_MOVE = "DK_T_SOKODNA_MOVE";

	/** テーブル(発注)*/
	private static final String D_TBL_NAME_DK_T_HATTCHU = "DK_T_HATTCHU";

	/** テーブル(入荷)*/
	private static final String D_TBL_NAME_DK_T_NYUKA = "DK_T_NYUKA";

	/** SQL定義キー(DK_SELECT_001)*/
	private static final String DK_T_YBKIKI_HAISO_DK_SELECT_001 = "DK_SELECT_001";

	/** SQL定義キー(DK_SELECT_001)*/
	private static final String DK_T_SOKODNA_MOVE_DK_SELECT_001 = "DK_SELECT_001";

	/** SQL定義キー(DK_SELECT_001)*/
	private static final String DK_T_HATTCHU_DK_SELECT_001 = "DK_SELECT_001";

	/** SQL定義キー(DK_SELECT_001)*/
	private static final String DK_T_NYUKA_DK_SELECT_001 = "DK_SELECT_001";

	/** テーブルアクセスクラス(予備機器配送)*/
	private JBSbatSQLAccess db_DK_T_YBKIKI_HAISO = null;

	/** テーブルアクセスクラス(倉庫棚移動)*/
	private JBSbatSQLAccess db_DK_T_SOKODNA_MOVE = null;

	/** テーブルアクセスクラス(発注)*/
	private JBSbatSQLAccess db_DK_T_HATTCHU = null;

	/** テーブルアクセスクラス(入荷)*/
	private JBSbatSQLAccess db_DK_T_NYUKA = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 保存期間経過データ物理削除中間ファイル名*/
	private static final String KEP_TRM_OVR_INF_MIDFN = "DKIFM013001";
	
	/** 保存期間経過データ物理削除中間ファイル定義 */
	public static final String DEF_KEP_TRM_OVR_INF = "DKIFM013001.def";
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_DK_T_YBKIKI_HAISO = new JBSbatSQLAccess(commonItem, D_TBL_NAME_DK_T_YBKIKI_HAISO);
		db_DK_T_SOKODNA_MOVE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_DK_T_SOKODNA_MOVE);
		db_DK_T_HATTCHU = new JBSbatSQLAccess(commonItem, D_TBL_NAME_DK_T_HATTCHU);
		db_DK_T_NYUKA = new JBSbatSQLAccess(commonItem, D_TBL_NAME_DK_T_NYUKA);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		
		// カウンター
		Long idx = new Long(0);
		
		//==================== 修正開始 ====================
//		// パラメータの取得（Freeパラメータ）
//		// プロパティーファイル定義値の取得
//		String[] freeParam = commonItem.getFreeItem().split(",");
//		
//		// 環境変数から物流データ保存月数を取得します
////		String kepTrm = JBSbatAplConst.getAplConstValue(freeParam[0]);
//		String kepTrm = freeParam[0];
////		if (null == kepTrm)
//		if (kepTrm.equals(null) || kepTrm.equals(""))
//		{
//			// 環境変数未設定エラー
//			throw new JBSbatBusinessException("EDKB0020KE", new String[] {"環境変数",
//			"環境変数名＝DATA_KEEP_TERM_DK"});
//		}
//		
//		// 物流データ削除年月日の算出
//		String delDate = JPCDateUtil.addMonth(commonItem.getOpeDate(), Integer.parseInt(kepTrm)*-1);

		// 物流データ削除年月日の算出
		String delDate = JPCDateUtil.addMonth(commonItem.getOpeDate(), JDKStrConst.DATA_KEEP_TERM * -1);
		//==================== 修正終了 ====================
		delDate = delDate.substring(0,6)+"01";		// 物流データ削除年月日は月初日とする。

		
		// 保存期間経過データ物理削除中間ファイルを作成
		// 中間ファイルパス（パス + ファイル名）の取得
		String midFilePath = null;
		
		// 外部出力ファイルパス（パス + ファイル名）
		JBSbatOutputFileUtil outFile = null;

		try{
			// 中間ファイルパス（パス + ファイル名）の取得
			midFilePath = rnktPath(JBSbatAplConst.getAplConstValue(JDKStrConst.ENV_MID_DIR), "")
			+ KEP_TRM_OVR_INF_MIDFN 	+ ".csv";

			// 外部出力ファイルパス（パス + ファイル名）
			outFile = new JBSbatOutputFileUtil(midFilePath);
			outFile.setEncode(JDKStrConst.ENCODE_SJIS);		// 文字コード
			outFile.setLine(JDKStrConst.LINE_LF);			// 改行コード

			// 1.2.2.4 保存期間経過データ物理削除中間データファイルを作成する
			outFile.createWriter();

		}
		catch (IOException ex)
		{
			// 保存期間経過データ物理削除中間ファイル作成失敗
			commonItem.getConnection().rollback();
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0030CE, new String[] {midFilePath});
			throw ex;
		}

		// 1.2.2.5.(1).(b) ファイル出力用マップ作成
		JBSbatServiceInterfaceMap outDataMap = new JBSbatServiceInterfaceMap();		
		
		// 予備機器配送テーブルから情報抽出
		String[] strYbkikiHaisoParam = {delDate, delDate};
		
		// 予備機器配送テーブルカラム抽出
		String strYbkikiHaisoNo = "";	// 予備機器配送番号

		try
		{
			executeDK_T_YBKIKI_HAISO_DK_SELECT_001(strYbkikiHaisoParam);
		}
		catch (Exception ex)
		{
			// データが取得出来なかった場合
			super.logPrint.printDebugLog("予備機器配送なし");
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0020KE,
					new String[] {"予備機器配送", "物流データ削除年月日=" + delDate});
			throw ex;
		}

		JBSbatCommonDBInterface ybkikiHaisoMap = null;
		while (true)
		{
			// データ取得
			ybkikiHaisoMap = this.db_DK_T_YBKIKI_HAISO.selectNext();

			// 取得データが存在しない場合終了
			if (null == ybkikiHaisoMap)
			{
				break;
			}

			// 項目取得
			strYbkikiHaisoNo = ybkikiHaisoMap.getString("YBKIKI_HAISO_NO");	// 予備機器配送番号
			// テーブル名
			outDataMap.set(JBSbatDKIFM013001.TBL_NM, 
							JDKBatOutputFileUtil.encloseDQuot(D_TBL_NAME_DK_T_YBKIKI_HAISO));
			// 主キー１
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_1, 
							JDKBatOutputFileUtil.encloseDQuot(strYbkikiHaisoNo));	// 予備機器配送番号
			// 主キー２
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_2, "");
			// 主キー３
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_3, "");
			// 主キー４
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_4, "");
			// 主キー５
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_5, "");

			// ファイル出力
			outMidFile(outDataMap, outFile, midFilePath);

			// 連番に1追加
			idx++;
		}

		// 1.2.2.5.(2) 倉庫棚移動テーブルから情報抽出
		String[] strSokodanaMoveParam = {delDate, delDate};

		// 倉庫棚移動テーブルカラム抽出
		String strSokodanaMoveNo = "";	// 倉庫棚移動番号

		// カウンター
		Long idx2 = new Long(0);

		try
		{
			executeDK_T_SOKODNA_MOVE_DK_SELECT_001(strSokodanaMoveParam);
		}
		catch (Exception ex)
		{
			// データが取得出来なかった場合
			super.logPrint.printDebugLog("倉庫棚移動なし");
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0020KE,
					new String[] {"倉庫棚移動", "物流データ削除年月日=" + delDate});
			throw ex;
		}

		JBSbatCommonDBInterface sokodanaMoveMap = null;
		while (true)
		{
			// データ取得
			sokodanaMoveMap = this.db_DK_T_SOKODNA_MOVE.selectNext();

			// 取得データが存在しない場合終了
			if (null == sokodanaMoveMap)
			{
				break;
			}

			// 項目取得
			strSokodanaMoveNo = sokodanaMoveMap.getString("SOKODNA_MOVE_NO");	// 倉庫棚移動番号
			// テーブル名
			outDataMap.set(JBSbatDKIFM013001.TBL_NM, 
							JDKBatOutputFileUtil.encloseDQuot(D_TBL_NAME_DK_T_SOKODNA_MOVE));
			// 主キー１
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_1, 
							JDKBatOutputFileUtil.encloseDQuot(strSokodanaMoveNo));	// 倉庫棚移動番号
			// 主キー２
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_2, "");
			// 主キー３
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_3, "");
			// 主キー４
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_4, "");
			// 主キー５
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_5, "");

			// ファイル出力
			outMidFile(outDataMap, outFile, midFilePath);

			// 連番に1追加
			idx2++;
		}

		// 1.2.2.5.(3) 入荷テーブルから情報抽出
		String[] strNyukaParam = {delDate, delDate};

		// 入荷テーブルカラム抽出
		String strNyukaNo = "";			// 入荷番号
		String strHattchuLotNo = "";	// 発注ロット番号
		Long idx3 = new Long(0);		// カウンター

		try
		{
			executeDK_T_NYUKA_DK_SELECT_001(strNyukaParam);
		}
		catch(Exception ex)
		{
			// データが取得出来なかった場合
			super.logPrint.printDebugLog("入荷なし");
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0020KE,
					new String[] {"入荷", "物流データ削除年月日=" + delDate});
			throw ex;
		}

		JBSbatCommonDBInterface nyukaMap = null;
		while (true)
		{
			// データ取得
			nyukaMap = this.db_DK_T_NYUKA.selectNext();

			// 取得データが存在しない場合終了
			if (null == nyukaMap)
			{
				break;
			}

			// 項目取得
			strNyukaNo = nyukaMap.getString("NYUKA_NO");			// 入荷番号
			strHattchuLotNo = nyukaMap.getString("HATTCHU_LOT_NO");	// 発注ロット番号
			// テーブル名
			outDataMap.set(JBSbatDKIFM013001.TBL_NM, 
							JDKBatOutputFileUtil.encloseDQuot(D_TBL_NAME_DK_T_NYUKA));
			// 主キー１
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_1, 
							JDKBatOutputFileUtil.encloseDQuot(strNyukaNo));	// 入荷番号
			// 主キー２
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_2, 
					JDKBatOutputFileUtil.encloseDQuot(strHattchuLotNo));	// 発注ロット番号
			// 主キー３
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_3, "");
			// 主キー４
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_4, "");
			// 主キー５
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_5, "");

			// ファイル出力
			outMidFile(outDataMap, outFile, midFilePath);

			// 連番に1追加
			idx3++;
		}

		// 1.2.2.5.(4) 発注テーブルから情報抽出
		String[] strHattchuParam = {delDate, delDate};

		Long idx4 = new Long(0);		// カウンター

		try
		{
			executeDK_T_HATTCHU_DK_SELECT_001(strHattchuParam);
		}
		catch(Exception ex)
		{
			// データが取得出来なかった場合
			super.logPrint.printDebugLog("発注なし");
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0020KE,
					new String[] {"発注", "物流データ削除年月日=" + delDate});
			throw ex;
		}

		JBSbatCommonDBInterface HattchuMap = null;
		while (true)
		{
			// データ取得
			HattchuMap = this.db_DK_T_HATTCHU.selectNext();

			// 取得データが存在しない場合終了
			if (null == HattchuMap)
			{
				break;
			}

			// 項目取得
			strHattchuLotNo = HattchuMap.getString("HATTCHU_LOT_NO");	// 発注ロット番号
			// テーブル名
			outDataMap.set(JBSbatDKIFM013001.TBL_NM, 
							JDKBatOutputFileUtil.encloseDQuot(D_TBL_NAME_DK_T_HATTCHU));
			// 主キー１
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_1, 
							JDKBatOutputFileUtil.encloseDQuot(strHattchuLotNo));	// 発注ロット番号
			// 主キー２
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_2, "");
			// 主キー３
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_3, "");
			// 主キー４
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_4, "");
			// 主キー５
			outDataMap.set(JBSbatDKIFM013001.PRMKEY_5, "");

			// ファイル出力
			outMidFile(outDataMap, outFile, midFilePath);

			// 連番に1追加
			idx4++;
		}

		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_DK_T_YBKIKI_HAISO.close();
		db_DK_T_SOKODNA_MOVE.close();
		db_DK_T_HATTCHU.close();
		db_DK_T_NYUKA.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(DK_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 executeDK_T_YBKIKI_HAISO_DK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_DK_T_YBKIKI_HAISO.selectBySqlDefine(paramList, DK_T_YBKIKI_HAISO_DK_SELECT_001);
	}

	/**
	 * SQLKEY(DK_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 executeDK_T_SOKODNA_MOVE_DK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_DK_T_SOKODNA_MOVE.selectBySqlDefine(paramList, DK_T_SOKODNA_MOVE_DK_SELECT_001);
	}

	/**
	 * SQLKEY(DK_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 executeDK_T_HATTCHU_DK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_DK_T_HATTCHU.selectBySqlDefine(paramList, DK_T_HATTCHU_DK_SELECT_001);
	}

	/**
	 * SQLKEY(DK_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 executeDK_T_NYUKA_DK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_DK_T_NYUKA.selectBySqlDefine(paramList, DK_T_NYUKA_DK_SELECT_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 中間ファイル出力を行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.中間ファイルの出力を行います。<br>
	 * </pre>
	 * <p>
	 * @param outDataMap 中間ファイル出力用マップ。
	 * @param outFile 中間ファイルプロパティ。
	 * @param midFilePath 中間ファイル名（パス ＋ ファイル名）。
	 * @return なし。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void outMidFile(JBSbatServiceInterfaceMap outDataMap, 
		JBSbatOutputFileUtil outFile, String midFilePath ) throws Exception 
	{
		try
		{
			String defFile = rnktPath(JBSbatAplConst.getAplConstValue(JDKStrConst.DK_DIR_IND), "")
			+ DEF_KEP_TRM_OVR_INF;
			JBSbatDefFileUtil defDataUtil = new JBSbatDefFileUtil(defFile, outFile);
			outFile.print(outDataMap, defDataUtil);
		}
		catch (Exception ex)
		{
			super.logPrint.printDebugLog("保存期間経過データ物理削除中間ファイル書き込み失敗");
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0050CE, new String[] {midFilePath});
			throw ex;
		}
		finally
		{
//			outFile.close();	// ファイルクローズ
		}
	}

	/**
	 * パス文字列の連結
	 * 連結するパス文字列にパス区切り文字の設定を制御する。
	 * @param path1 パス文字列
	 * @param path2 パス文字列
	 * @return 連結したパス文字列
	 */
	private String rnktPath(String path1, String path2)
	{
		String pathDlmt = "/";
		if (-1 < path1.indexOf("\\") || -1 < path2.indexOf("\\"))
		{
			pathDlmt = "\\";
		}
		if (!path1.endsWith(pathDlmt))
		{
			return path1 + pathDlmt + path2;
		}
		return path1 + path2;
	}	


}
