/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCRAticleSohuFin
*	ソースファイル名	：JBSbatCRAticleSohuFin.java
*	作成者				：富士通　
*	作成日				：2011年12月12日
*＜機能概要＞
*　資料送付完了処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/12/12   富士通		新規作成
*********************************************************************/
package eo.business.service;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCRBatCommon;
import eo.business.util.table.JBSbatCC_T_DLYD_TRN_REQ;
import eo.business.util.table.JBSbatCR_T_ATICLE_SOHU_KRK;
import eo.common.constant.JCRStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JCRUtilCommon;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.log.JBSbatLogPrintControl;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;

/**
* 資料送付完了処理 <p>
*<BR>
* @author 富士通
*/
public class JBSbatCRAticleSohuFin extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(資料送付記録)*/
	private static final String D_TBL_NAME_CR_T_ATICLE_SOHU_KRK = "CR_T_ATICLE_SOHU_KRK";

	/** SQL定義キー(CR_SELECT_001)*/
	private static final String CR_T_ATICLE_SOHU_KRK_CR_SELECT_001 = "CR_SELECT_001";

	/** SQL定義キー(CR_UPDATE_002)*/
	private static final String CR_T_ATICLE_SOHU_KRK_CR_UPDATE_002 = "CR_UPDATE_002";

	/** テーブルアクセスクラス(資料送付記録)*/
	private JBSbatSQLAccess db_CR_T_ATICLE_SOHU_KRK = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	// 定数定義

	/** エラーファイル名 */
	private static final String ERROR_FILENAME = "EO90M0110J0_";

	
	// 変数定義

	/** 処理日付格納用 */
	private String sysDateTime = null;

	/** 対応履歴一時ファイル保存先パス */
	private String tempFilePath = null;

	/** 初期処理エラーメッセージ */
	private String initErrMessage = null;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CR_T_ATICLE_SOHU_KRK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CR_T_ATICLE_SOHU_KRK);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// 初期処理開始
		
		// システム日付取得
		sysDateTime = JCRBatCommon.getSysDateTimeStamp();

		try
		{
			// プロパティーファイルチェックと情報取得
			checkApplicationProperty();
		}
		catch (Exception e)
		{
			// ECRB0260KW:%1%処理中に予期せぬエラーが発生しました。　%2%
			initErrMessage = JBSbatLogPrintControl.getMessage(JPCBatchMessageConstant.ECRB0260KW, new String[] {"資料送付完了", e.toString()});
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECRB0260KW, new String[] {"資料送付完了", e.toString()});
			super.logPrint.printDebugLog("例外発生:" + e.toString());
			super.logPrint.printDebugLog("　　　　:" + e.getMessage());
		}

	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * プロパティ情報設定とチェック<br>
	 * 初期処理でプロパティ情報を取得し設定します<br>
	 * @throws Exception 例外
	 */
	private void checkApplicationProperty() throws Exception
	{
		// 対応履歴一時ファイル保存パス取得＆チェック
		tempFilePath = checkTempFilePath();
	}

	/**
	 * 対応履歴一時ファイル保存先パス取得とチェック<br>
	 * @return 対応履歴一時ファイル保存先パス
	 * @throws Exception 例外
	 */
	private String checkTempFilePath() throws Exception
	{
		boolean existError = false;

		// 対応履歴一時ファイル保存先パスを取得
		String hozonPath = JCRBatCommon.getApplicationConst("CR_TEMP_FILE_DIR");
		if (hozonPath == null || "".equals(hozonPath.trim()))
		{
			// ECRB0010KW:プロパティーファイルの設定が正しくありません。(項目名:%1%)
			initErrMessage = JBSbatLogPrintControl.getMessage(JPCBatchMessageConstant.ECRB0010KW, new String[] {"対応履歴一時ファイル保存先パス"});
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECRB0010KW, new String[] {"対応履歴一時ファイル保存先パス"});
			existError = true;
		}
		else
		{
			File csvPath = JCRUtilCommon.checkDirExist(hozonPath);
			if (csvPath == null)
			{
				// 存在しない場合
				// ECRB0160KW:指定されたパスが存在しません。(%1%)
				initErrMessage = JBSbatLogPrintControl.getMessage(JPCBatchMessageConstant.ECRB0160KW, new String[] {hozonPath});
				super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECRB0160KW, new String[] {hozonPath});
				existError = true;
			}
			super.logPrint.printDebugLog("対応履歴一時ファイル保存先パス取得:" + csvPath);
		}
		if (existError == true)
		{
			hozonPath = null;
		}
		
		return hozonPath;
	}
	
	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{

		/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/


		// (1) ディレイド処理依頼情報取得
		ArrayList<HashMap<String, Object>> shoriIraiInfoList = JCRBatCommon.getShoriIraiInfo(commonItem, super.jobid);

		// ディレイド存在チェック
		if (shoriIraiInfoList == null || shoriIraiInfoList.size() == 0)
		{
			// 処理依頼が0件の場合、処理依頼が存在しないため処理を終了する。
			super.logPrint.printDebugLog("ディレイド処理依頼は存在しません。");
			
			// 処理件数ログ出力
			JCRBatCommon.printShoriCountLog(commonItem, "ディレイド処理依頼件数", 0);
			return null;
		}

		// 処理件数ログ出力
		JCRBatCommon.printShoriCountLog(commonItem, "ディレイド処理依頼件数", shoriIraiInfoList.size());

		// (2) ディレイド処理依頼情報1件読込
		for (int i = 0; i < shoriIraiInfoList.size(); i++)
		{
			List<String> errList = new ArrayList<String>();

			// 処理結果の初期化
			// ディレイド処理結果コード
			String shoriKekkaCd = JCRStrConst.DLYD_SYSTEM_ERR;

			// 資料送付記録ファイルパス
			String aticleSohuFilePath = null;

			// (3) ディレイド処理依頼情報1件読込
			// ディレイド処理依頼情報
			HashMap<String, Object> shoriIraiInfo = shoriIraiInfoList.get(i);

			// 処理依頼番号取得と電子ファイル管理番号取得
			String shoriiraiNo = (String)shoriIraiInfo.get(JBSbatCC_T_DLYD_TRN_REQ.DLYD_TRN_REQ_NO);
			String eFileKanriNo = (String)shoriIraiInfo.get(JBSbatCC_T_DLYD_TRN_REQ.INPUT_EFILE_KANRI_NO);

			super.logPrint.printDebugLog("処理依頼番号：" + shoriiraiNo + " 資料送付完了主処理開始");
			super.logPrint.printDebugLog("電子ファイル管理番号：" + eFileKanriNo);

			try
			{
				if (initErrMessage == null)
				{
					// (4) 資料送付記録ファイル取得
					aticleSohuFilePath = getFilePath(eFileKanriNo);
					
					List<List<String>> aticleDataList = getAticleSohuFile(aticleSohuFilePath, errList);

					// 業務エラーが無い場合
					if(errList.size() == 0)
					{
						for(int j = 0; j < aticleDataList.size(); j++)
						{
							// (5) 行読込
							List<String> aticleLineData = aticleDataList.get(j);

							
							// (6)(b) 項目数チェック
							if(aticleLineData.size() != 3)
							{
								// ECRB0180KW			項目数が正しくありません。（%1%）
								String[] chikanMoji = {"項目数:" + aticleLineData.size()};
								errList.add(setErrMsg(j + 1, JPCBatchMessageConstant.ECRB0180KW, chikanMoji));
								break;
							}
							
							String taioKirokNo = aticleLineData.get(0);
							String aticleSohuNo = aticleLineData.get(1);
							String aticleKirokNo = aticleLineData.get(2);
							
							// (6)(c) 資料送付記録情報取得
							String aticleSohuState = searchAticleSohuData(taioKirokNo, aticleSohuNo, aticleKirokNo);
							if(aticleSohuState == null)
							{
								// ECRB0250KW			データが登録されていません。（%1%）
								String[] chikanMoji = {"[資料送付記録テーブル]対応記録番号: " + taioKirokNo 
										+ "資料送付番号: " + aticleSohuNo
										+ "資料送付記録番号: " + aticleKirokNo};
								errList.add(setErrMsg(j + 1, JPCBatchMessageConstant.ECRB0250KW, chikanMoji));

								break;
							}
							
							// (7) データチェック処理
							if(!JCRStrConst.CD_DIV_SIRYOSOFU_KIROK_STAT_LABEL.equals(aticleSohuState))
							{
								// ECRB0190KW			%1%の内容が正しくありません。（%2%）
								String[] chikanMoji = {"資料送付記録ステータス", "資料送付記録ステータス: " + aticleSohuState};
								errList.add(setErrMsg(j + 1, JPCBatchMessageConstant.ECRB0190KW, chikanMoji));

								break;
							}
							// (8) 資料送付記録データ更新
							upDateAticleSohu(taioKirokNo, aticleSohuNo, aticleKirokNo);
						}
						
						// 業務エラーチェック
						if(errList.size() == 0)
						{
							// 正常終了
							shoriKekkaCd = JCRStrConst.DLYD_OK;
						}
						else
						{
							// 業務エラーが存在する場合
							shoriKekkaCd = JCRStrConst.DLYD_GYOMU_ERR;
						}
					}
					else
					{
						// 業務エラーが存在する場合
						shoriKekkaCd = JCRStrConst.DLYD_GYOMU_ERR;
					}
				}
			}
			catch (JBSbatBusinessException ex)
			{	
				// システムエラーフラグを設定する
				shoriKekkaCd = JCRStrConst.DLYD_SYSTEM_ERR;
				super.logPrint.printDebugLog("処理依頼番号：" + shoriiraiNo);
				super.logPrint.printDebugLog("システムエラー発生:" + ex.toString());
				super.logPrint.printDebugLog("　　　　　　　　　:" + ex.getMessage());
			}
			finally
			{
				// (9) 終了処理
				// エラーが存在しない場合
				if (JCRStrConst.DLYD_OK.equals(shoriKekkaCd))
				{
					// (9)(a)@ コミット
					super.commit();
					super.logPrint.printDebugLog("処理依頼番号：" + shoriiraiNo + " コミット実行");

					// (9)(c) ディレイド処理依頼結果更新処理(処理結果：正常)
					JCRBatCommon.updateShoriIraiResult(commonItem, shoriiraiNo, shoriKekkaCd, null);
					super.logPrint.printDebugLog("ディレイド処理依頼結果： 正常");
				}
				// エラーが存在する場合
				else
				{
					// (9)(a)A ロールバック
					commonItem.getConnection().rollback();
					super.logPrint.printDebugLog("処理依頼番号：" + shoriiraiNo + "  ロールバック実行");

					// 業務エラーの場合
					if(JCRStrConst.DLYD_GYOMU_ERR.equals(shoriKekkaCd))
					{
						// (9)(b) エラーファイル作成
						String errFile = entryErrFile(tempFilePath, errList);

						// (9)(c) ディレイド処理依頼結果更新処理(処理結果：業務エラー)
						HashMap<String, String> shoriKekkaMap =
							JCRBatCommon.updateShoriIraiResult(commonItem, shoriiraiNo, shoriKekkaCd, errFile);
						super.logPrint.printDebugLog("ディレイド処理依頼結果： 業務エラー");
						super.logPrint.printDebugLog("エラー電子ファイル管理番号： " + shoriKekkaMap.get("EFILE_KAMRI_NO"));

						// エラーファイルの一時ファイル物理削除
						JCRUtilCommon.deleteTempFile(errFile);
						super.logPrint.printDebugLog("エラーファイル物理削除： " + errFile);
					}

					// システムエラーが発生した場合
					else
					{
						// (9)(c) ディレイド処理依頼結果更新処理(処理結果：システムエラー)
						JCRBatCommon.updateShoriIraiResult(commonItem, shoriiraiNo, shoriKekkaCd, null);
						super.logPrint.printDebugLog("ディレイド処理依頼結果： システムエラー");
					}
				}
				
				// ディレイド処理結果コミット
				super.commit();
				super.logPrint.printDebugLog("処理依頼番号：" + shoriiraiNo + " コミット実行");

				// (9)(d) 一時ファイルの物理削除
				if (aticleSohuFilePath != null && !"".equals(aticleSohuFilePath))
				{
					int index = aticleSohuFilePath.lastIndexOf(JCRStrConst.FILE_KUGIRI);
					aticleSohuFilePath = aticleSohuFilePath.substring(0, index);
					JCRUtilCommon.deleteDir(aticleSohuFilePath);
					super.logPrint.printDebugLog("一時ファイル物理削除： " + aticleSohuFilePath);
				}
				// ログ出力処理
				super.logPrint.printDebugLog("処理依頼番号：" + shoriiraiNo + " 資料送付完了主処理終了");
			}
		}
		
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 資料送付記録ファイルパス取得処理<br>
	 * @param eKanriFileNo 電子ファイル番号
	 * @return 資料送付記録ファイルパス
	 * @throws JBSbatBusinessException 電子ファイル管理テーブルに電子ファイル管理番号が登録されていない場合
	 */
	private String getFilePath(String eKanriFileNo) throws JBSbatBusinessException
	{
		// ファイルパス取得
		String filePath = JCRBatCommon.searchDenshiFile(commonItem, eKanriFileNo);
		// 電子ファイル管理レコードの存在チェック
		if(filePath == null || "".equals(filePath))
		{
			// 電子ファイル管理テーブルの電子ファイルレコードが取得できない場合
			
			String[] chikanMoji = {"[電子ファイル管理テーブル]電子ファイル管理番号:" + eKanriFileNo};
			throw new JBSbatBusinessException(JPCBatchMessageConstant.ECRB0250KW, chikanMoji);
		}
		
		return filePath;
	}
	
	/**
	 * 資料送付記録ファイル取得処理<br>
	 * @param aticleSohuFile 資料送付記録ファイルパス
	 * @param errList エラーリスト
	 * @return 資料送付記録情報リスト
	 * @throws Exception 例外
	 */
	private List<List<String>> getAticleSohuFile(String aticleSohuFile, List<String> errList)  throws Exception
	{
		// 資料送付記録ファイルのデータを1行ずつリストに格納
		List<List<String>> aticleSohuList = JCRUtilCommon.convCsvFiletoList(aticleSohuFile);
		if(aticleSohuList == null || aticleSohuList.size() == 0)
		{
			// ECRB0190KW			%1%の内容が正しくありません。（%2%）
			String[] chikanMoji = {"資料送付記録ファイル", "ファイルフォーマットエラー"};
			errList.add(setErrMsg(JPCBatchMessageConstant.ECRB0190KW, chikanMoji));
		}
		return aticleSohuList;
	}

	/**
	 * 資料送付記録情報取得<br>
	 * @param  taioKirokNo		対応記録番号
	 * @param  aticleSohuNo		資料送付番号
	 * @param  aticleKirokNo	資料送付記録番号
	 * @return 資料送付記録ステータス
	 * @throws Exception 例外
	 */
	private String searchAticleSohuData(String taioKirokNo, String aticleSohuNo, String aticleKirokNo) throws Exception
	{
		String[] param = new String[]{taioKirokNo, aticleSohuNo, aticleKirokNo};
		
		// 資料送付記録ステータス検索
		executeCR_T_ATICLE_SOHU_KRK_CR_SELECT_001(param);
		JBSbatCommonDBInterface selectedData = db_CR_T_ATICLE_SOHU_KRK.selectNext();
		if(selectedData == null)
		{
			// レコードが取得できない場合
			return null;
		}
		String aticleSohuState = selectedData.getString(JBSbatCR_T_ATICLE_SOHU_KRK.ATICLE_SOHU_KIROK_STAT); 

		return aticleSohuState;
	}

	/**
	 * 資料送付記録データ更新
	 * @param  taioKirokNo		対応記録番号
	 * @param  aticleSohuNo		資料送付番号
	 * @param  aticleKirokNo	資料送付記録番号
	 * @throws Exception 例外
	 */
	private void upDateAticleSohu(String taioKirokNo, String aticleSohuNo, String aticleKirokNo)  throws Exception
	{
		String userId = commonItem.getBatchUserId();

		String[] param = new String[]{ sysDateTime, userId, taioKirokNo, aticleSohuNo, aticleKirokNo};
		
		// 資料送付記録ステータス更新
		executeCR_T_ATICLE_SOHU_KRK_CR_UPDATE_002(param);
		super.logPrint.printDebugLog("[資料送付記録テーブル]資料送付記録ステータス更新:" + JCRStrConst.CD_DIV_BUNSHO_SBT_CD_TRKM_CHKZUMI);
	}
	
	/**
	 * エラーファイル作成
	 * @param toiawaseFilePath	問合せ履歴ファイルディレクトリ
	 * @param errList	エラーリスト
	 * @return エラーファイル名
	 * @throws Exception 例外
	 */
	private String entryErrFile(String toiawaseFilePath, List<String> errList) throws Exception
	{
		String errFileName = toiawaseFilePath;
		errFileName = errFileName + JCRStrConst.FILE_KUGIRI + ERROR_FILENAME + sysDateTime + ".TXT";
		JCRBatCommon.entryErrFileData(commonItem, errFileName, errList);

		return errFileName;
	}

	/**
	 * エラーメッセージリスト格納処理(行数有り)
	 * @param line			エラー行数
	 * @param msgId			メッセージID
	 * @param chikanMoji	置換文字列
	 * @return エラーメッセージ
	 * @throws Exception 例外
	 */
	private String setErrMsg(int line, String msgId, String[] chikanMoji) throws Exception
	{
		// エラーメッセージ作成
		String lineMsg = line + "行目";
		String errMsg = JBSbatLogPrintControl.getMessage(msgId, chikanMoji);
		
		super.logPrint.printBusinessErrorLog(msgId, chikanMoji);
		super.logPrint.printDebugLog(lineMsg + errMsg);
		
		return lineMsg + errMsg;
	}
	

	/**
	 * エラーメッセージリスト格納処理(行数なし)
	 * @param msgId			メッセージID
	 * @param chikanMoji	置換文字列
	 * @return エラーメッセージ
	 * @throws Exception 	例外
	 * return 
	 */
	private String setErrMsg(String msgId, String[] chikanMoji) throws Exception
	{
		// エラーメッセージ作成
		String errMsg = JBSbatLogPrintControl.getMessage(msgId, chikanMoji);

		super.logPrint.printBusinessErrorLog(msgId, chikanMoji);
		super.logPrint.printDebugLog(errMsg);

		return errMsg;
	}

	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CR_T_ATICLE_SOHU_KRK.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(CR_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 executeCR_T_ATICLE_SOHU_KRK_CR_SELECT_001(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_CR_T_ATICLE_SOHU_KRK.selectBySqlDefine(paramList, CR_T_ATICLE_SOHU_KRK_CR_SELECT_001);
	}

	/**
	 * SQLKEY(CR_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 executeCR_T_ATICLE_SOHU_KRK_CR_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());
		paramList.setValue(param[3].toString());
		paramList.setValue(param[4].toString());

		// DBアクセスを実行します
		db_CR_T_ATICLE_SOHU_KRK.executeBySqlDefine(paramList, CR_T_ATICLE_SOHU_KRK_CR_UPDATE_002);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
