/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCROutaiKubunChuushutu
*	ソースファイル名	：JBSbatCROutaiKubunChuushutu.java
*	作成者				：富士通　
*	作成日				：2011年06月02日
*＜機能概要＞
*　応対区分抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/06/02   富士通		新規作成
*	v5.00.00	2013/08/26  FJ斉藤諭	OM-2013-0000997対応
*********************************************************************/
package eo.business.service;

import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCRBatCommon;
import eo.business.util.table.JBSbatCC_T_EFILE_KANRI;
import eo.business.util.table.JBSbatCR_M_TAIORRK_BATCTRL;
import eo.business.util.table.JBSbatCR_T_TAIOKRK_DTL;
import eo.business.util.table.JBSbatCR_T_TAIOKRK_UCWK;
import eo.business.util.table.JBSbatCR_T_TAIO_KIROK;
import eo.business.util.table.JBSbatCR_T_TORK_EFILE_KNRI;
import eo.business.util.table.JBSbatZM_M_CD_NM_KANRI;
import eo.common.constant.JCRStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.constant.JZM0171Constant;
import eo.common.util.JCCFileUtil;
import eo.common.util.JCRUtilCommon;
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.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatBusinessFileUtil;

/**
* 応対区分抽出 <p>
*<BR>
* @author 富士通
*/
public class JBSbatCROutaiKubunChuushutu extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(対応記録内訳)*/
	private static final String D_TBL_NAME_CR_T_TAIOKRK_UCWK = "CR_T_TAIOKRK_UCWK";

	/** テーブル(対応記録)*/
	private static final String D_TBL_NAME_CR_T_TAIO_KIROK = "CR_T_TAIO_KIROK";

	/** テーブル(対応記録内訳抽出ワーク)*/
	private static final String D_TBL_NAME_CR_T_TIOKR_UW_CST_WK = "CR_T_TIOKR_UW_CST_WK";

	/** テーブル(対応履歴電子ファイル管理)*/
	private static final String D_TBL_NAME_CR_T_TORK_EFILE_KNRI = "CR_T_TORK_EFILE_KNRI";

	/** テーブル(対応履歴バッチ制御)*/
	private static final String D_TBL_NAME_CR_M_TAIORRK_BATCTRL = "CR_M_TAIORRK_BATCTRL";

	/** SQL定義キー(CR_SELECT_003)*/
	private static final String CR_T_TAIOKRK_UCWK_CR_SELECT_003 = "CR_SELECT_003";

	/** SQL定義キー(CR_SELECT_007)*/
	private static final String CR_T_TAIO_KIROK_CR_SELECT_007 = "CR_SELECT_007";

	/** SQL定義キー(CR_DELETE_001)*/
	private static final String CR_T_TIOKR_UW_CST_WK_CR_DELETE_001 = "CR_DELETE_001";

	/** SQL定義キー(CR_SELECT_004)*/
	private static final String CR_T_TORK_EFILE_KNRI_CR_SELECT_004 = "CR_SELECT_004";

	/** SQL定義キー(CR_UPDATE_002)*/
	private static final String CR_T_TORK_EFILE_KNRI_CR_UPDATE_002 = "CR_UPDATE_002";

	/** SQL定義キー(CR_SELECT_003)*/
	private static final String CR_T_TORK_EFILE_KNRI_CR_SELECT_003 = "CR_SELECT_003";

	/** テーブルアクセスクラス(対応記録内訳)*/
	private JBSbatSQLAccess db_CR_T_TAIOKRK_UCWK = null;

	/** テーブルアクセスクラス(対応記録)*/
	private JBSbatSQLAccess db_CR_T_TAIO_KIROK = null;

	/** テーブルアクセスクラス(対応記録内訳抽出ワーク)*/
	private JBSbatSQLAccess db_CR_T_TIOKR_UW_CST_WK = null;

	/** テーブルアクセスクラス(対応履歴電子ファイル管理)*/
	private JBSbatSQLAccess db_CR_T_TORK_EFILE_KNRI = null;

	/** テーブルアクセスクラス(対応履歴バッチ制御)*/
	private JBSbatSQLAccess db_CR_M_TAIORRK_BATCTRL = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	// 定数
	/** CSVファイルの内容を区切る区切り文字 */
	private static final String KUGIRIMOJI = ",";
	
	/** CSVファイル名を作成するための拡張子 */
	private static final String EXT_CSV = ".csv";
	
	/** 抽出ファイル保存期間(日) */
	private String hozonKikan = null;
	
	/** 抽出ファイル保存先ファイルパス */
	private List<String> outaiFilePathList = null;

	/** 抽出ファイルマップ */
	private Map<String, JBSbatBusinessFileUtil> chushutuFileMap = null;

	/** システム日付時分秒(17桁) */
	private String sysDtms = null;

	/** システム日付時分秒(14桁) */
	private String sysDtm = null;

	/** 主処理実行フラグ */
	private boolean executeFlg = false;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CR_T_TAIOKRK_UCWK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CR_T_TAIOKRK_UCWK);
		db_CR_T_TAIO_KIROK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CR_T_TAIO_KIROK);
		db_CR_T_TIOKR_UW_CST_WK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CR_T_TIOKR_UW_CST_WK);
		db_CR_T_TORK_EFILE_KNRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CR_T_TORK_EFILE_KNRI);
		db_CR_M_TAIORRK_BATCTRL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CR_M_TAIORRK_BATCTRL);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// 初期処理開始
		super.logPrint.printDebugLog("初期処理開始");

		// 処理日時取得(共通部品)
		sysDtms = JCRBatCommon.getSysDateTimeStamp();

		// プロパティーファイルチェック＆設定
		String hozonPath = checkApplicationProperty();
		
		// 応対区分取得
		List<JBSbatCommonDBInterface> outaiKubunList  = JCRBatCommon.getCodeNm(commonItem, JZM0171Constant.CD00234);
		
		// 応対区分抽出ファイル作成
		createFile(outaiKubunList, hozonPath);
		super.logPrint.printDebugLog("初期処理終了");

	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// 主処理開始
		super.logPrint.printDebugLog("主処理開始");
		
		// 主処理実行フラグをONにする
		executeFlg = true;
		// システム日付時分秒を取得
		sysDtm = inMap.getString("SYSDTM");
		
		// 対応記録番号取得
		String taioKiokNo = inMap.getString(JBSbatCR_T_TAIOKRK_DTL.TAIO_KIROK_NO);
		
		// 応対データ検索
		List<JBSbatCommonDBInterface> taioKirokUcwkList = selectUcwkData(taioKiokNo);
		if(taioKirokUcwkList != null)
		{
			for(int i = 0; i < taioKirokUcwkList.size(); i++)
			{
				// 応対区分抽出情報取得
				Map<String, String> taioKirokMap = selectTaioKiok(taioKiokNo);
				// 応対区分抽出情報ファイル出力
				writeOutaiFile(inMap, taioKirokUcwkList.get(i), taioKirokMap);
				// 	対応記録内訳抽出ワークデータ削除
				deleteUcwkWork(taioKirokUcwkList.get(i));
			}
		}

		// 主処理終了
		super.logPrint.printDebugLog("主処理終了");
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CR_T_TAIOKRK_UCWK.close();
		db_CR_T_TAIO_KIROK.close();
		db_CR_T_TIOKR_UW_CST_WK.close();
		db_CR_T_TORK_EFILE_KNRI.close();
		db_CR_M_TAIORRK_BATCTRL.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/

		// 終了処理開始
		super.logPrint.printDebugLog("終了処理開始");
		
		// 主処理未実行
		if(!executeFlg)	
		{
			// 処理日時取得(共通部品)
			sysDtm = commonItem.getOpeDate() + "235959";

			super.logPrint.printDebugLog("応対区分抽出対象レコードはありません。");
		}
		// ファイルクローズ処理
		fileObjClose();
		
		File outaiFile = null;
		for(int i = 0; i < outaiFilePathList.size(); i++)
		{
			// ファイルパス取得
			String filePath = outaiFilePathList.get(i);

			// 圧縮ファイルのフルパスを取得
			String zipFilePath = createZip(filePath);

			// 重複ファイル削除
			deleteOutaiDenshiFile(commonItem, zipFilePath);
			// 電子ファイル管理テーブル登録
			String[] fileData = JCRBatCommon.createDenshiFile(commonItem, null, zipFilePath, null);
			// 電子ファイル管理番号取得
			String denshiKanriNo = fileData[0];
			// 対応履歴電子ファイル管理テーブル登録
			entryTaioBunsho(denshiKanriNo, zipFilePath);

			// 応対区分抽出ファイル削除
			outaiFile = new File(JCRUtilCommon.inspection(filePath));
			outaiFile.delete();
			super.logPrint.printDebugLog("取込元CSVファイル配置パス:" + filePath + "ファイルを削除");

			outaiFile = new File(JCRUtilCommon.inspection(zipFilePath));
			outaiFile.delete();
			super.logPrint.printDebugLog(zipFilePath + "ファイルを削除");

		}
		// 保存期間経過ファイル削除
		deleteLimitOverFile();

		// 前回実行日更新
		updateJikkoubi();

		// データアクセスオブジェクトクローズ
		JCRBatCommon.closeDataAccessObj(commonItem);

		// 終了処理終了
		super.logPrint.printDebugLog("終了処理終了");
		/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * ファイルをZip形式で圧縮します。<br>
	 * 圧縮処理が正常に行われた場合、圧縮ファイルのファイル名込みの絶対パスを<br>
	 * String型で返却します。<br>
	 * @param filePath 圧縮前ファイルの絶対パス
	 * @return String 生成した圧縮ファイルの絶対パス
	 * @throws Exception 例外
	 */
	public static String createZip(String filePath) throws Exception
	{
		File fl = null;

		// 圧縮ファイルを一時保存するディレクトリをAPLConstから取得
		String outDirPath = JCRBatCommon.getApplicationConst("DIR_COMP_TMP");
		if(null == outDirPath)
		{
			throw new Exception("APLConstに圧縮ファイルを一時保存するディレクトリを設定するキー[DIR_COMP_TMP]が設定されていません。");
		}
		// 圧縮レベルをAPLConstから取得
		String compLevel = JCRBatCommon.getApplicationConst("COMP_LEVEL");
		if(null == compLevel)
		{
			throw new Exception("APLConstに圧縮レベルを設定するキー[COMP_LEVEL]が設定されていません。");
		}
		// 一意となるディレクトリを生成してその中に圧縮ファイルを生成する
		String outTmpPath = JCCFileUtil.createFileNameUid(outDirPath);
		fl = new File(outTmpPath);
		if(fl.mkdirs() == false)
		{
			throw new Exception("作業ディレクトリの作成に失敗しました");
		}

		// 圧縮ファイルのフルパスを取得
		String zipFilePath = JCRBatCommon.compressFile(filePath, outTmpPath, compLevel);

		return zipFilePath;
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(CR_SELECT_003)で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_TAIOKRK_UCWK_CR_SELECT_003(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CR_T_TAIOKRK_UCWK.selectBySqlDefine(paramList, CR_T_TAIOKRK_UCWK_CR_SELECT_003);
	}

	/**
	 * SQLKEY(CR_SELECT_007)で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_TAIO_KIROK_CR_SELECT_007(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CR_T_TAIO_KIROK.selectBySqlDefine(paramList, CR_T_TAIO_KIROK_CR_SELECT_007);
	}

	/**
	 * SQLKEY(CR_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 executeCR_T_TIOKR_UW_CST_WK_CR_DELETE_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_CR_T_TIOKR_UW_CST_WK.executeBySqlDefine(paramList, CR_T_TIOKR_UW_CST_WK_CR_DELETE_001);
	}

	/**
	 * SQLKEY(CR_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 executeCR_T_TORK_EFILE_KNRI_CR_SELECT_004(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_CR_T_TORK_EFILE_KNRI.selectBySqlDefine(paramList, CR_T_TORK_EFILE_KNRI_CR_SELECT_004);
	}

	/**
	 * 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_TORK_EFILE_KNRI_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_TORK_EFILE_KNRI.executeBySqlDefine(paramList, CR_T_TORK_EFILE_KNRI_CR_UPDATE_002);
	}

	/**
	 * SQLKEY(CR_SELECT_003)で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_TORK_EFILE_KNRI_CR_SELECT_003(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_TORK_EFILE_KNRI.selectBySqlDefine(paramList, CR_T_TORK_EFILE_KNRI_CR_SELECT_003);
	}

	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	/**
	 * プロパティ情報設定とチェック<br>
	 * 初期処理でプロパティ情報を取得し設定します<br>
	 * @return 保存先のパス
	 * @throws Exception 例外
	 */
	private String checkApplicationProperty() throws Exception
	{
		// 抽出ファイル保存期間(日)を取得
		hozonKikan = JCRBatCommon.getApplicationConst("CR_CHUSHUTU_FILE_SAVE_DATE");
		if (hozonKikan == null  || "".equals(hozonKikan.trim()))
		{
			// ECRB0010KW:プロパティーファイルの設定が正しくありません。(項目名:%1%)
			throw new JBSbatBusinessException(JPCBatchMessageConstant.ECRB0010KW, new String[] { "抽出ファイル保存期間(日)" });
		}
		// 数値チェック
		if(!JCRBatCommon.isHannkakuSuuji1(hozonKikan))
		{
			// ECRB0010KW:プロパティーファイルの設定が正しくありません。(項目名:%1%)
			throw new JBSbatBusinessException(JPCBatchMessageConstant.ECRB0010KW, new String[] { "抽出ファイル保存期間(日)" });
		}

		// 抽出ファイル保存先ファイルパスを取得
		String hozonPath = JCRBatCommon.getApplicationConst("CR_CHUSHUTU_FILE_DIR");
		if (hozonPath == null || "".equals(hozonPath.trim()))
		{
			// ECRB0010KW:プロパティーファイルの設定が正しくありません。(項目名:%1%)
			throw new JBSbatBusinessException(JPCBatchMessageConstant.ECRB0010KW, new String[] { "取込元CSVファイル配置パス:"});
		}
		else
		{
			File csvPath = JCRUtilCommon.checkDirExist(hozonPath);
			if (csvPath == null)
			{
				// 存在しない場合
				// ECRB0160KW:指定されたパスが存在しません。(%1%)
				throw new JBSbatBusinessException(JPCBatchMessageConstant.ECRB0160KW, new String[]{hozonPath});
			}
			super.logPrint.printDebugLog("取込元CSVファイル配置パス:" + csvPath);
		}
		
		return hozonPath;
	}
	
	
	/**
	 * 応対区分抽出ファイル作成<br>
	 * 主処理で応対区分抽出ファイルを作成<br>
	 * @param outaiKubunList バッチ処理共通インターフェースリスト
	 * @param filePath 応対区分抽出ファイルパス
	 * @throws Exception 例外
	 */
	private void createFile(List<JBSbatCommonDBInterface> outaiKubunList, String filePath) throws Exception
	{
		outaiFilePathList = new ArrayList<String>();
		chushutuFileMap = new HashMap<String, JBSbatBusinessFileUtil>();
		
		// 取得した応対区分の件数分ファイルを作成
		for(int i = 0; i < outaiKubunList.size(); i++)
		{
			// ファイル名を取得
			JBSbatCommonDBInterface outaiKubun = outaiKubunList.get(i);
			if(outaiKubun != null)
			{
				String fileName = filePath + JCRStrConst.FILE_KUGIRI + outaiKubun.getString(JBSbatZM_M_CD_NM_KANRI.CD_DIV_NM) + "_" + 
									JCRBatCommon.getSysDate() +  EXT_CSV;
				outaiFilePathList.add(fileName);
				JBSbatBusinessFileUtil busFileUtil = JCRBatCommon.createBusinessFileUtil(fileName, JCRStrConst.DEFAULT_ENCODE, JCRStrConst.KAIGYO_CD, KUGIRIMOJI);
				super.logPrint.printDebugLog("応対区分抽出ファイル作成:" + filePath);
				chushutuFileMap.put(outaiKubun.getString(JBSbatZM_M_CD_NM_KANRI.CD_DIV), busFileUtil);
			}
		}
	}
	
	/**
	 * 対応記録内訳情報取得<br>
	 * 主処理で応対区分抽出対象の内訳レコードを取得<br>
	 * @param taioKiokNo 対応記録番号
	 * @return List<JBSbatCommonDBInterface> SQLの取得結果
	 * @throws Exception 例外
	 */
	private List<JBSbatCommonDBInterface> selectUcwkData(String taioKiokNo) throws Exception
	{
		// 対応記録内訳テーブルからファイル出力に必要な情報を取得
		executeCR_T_TAIOKRK_UCWK_CR_SELECT_003(new Object[]{taioKiokNo});
		return JCRBatCommon.getSelectedDataList(db_CR_T_TAIOKRK_UCWK);
	}

	/**
	 * 応対区分抽出情報取得<br>
	 * 主処理で対応記録情報を取得<br>
	 * @param  taioKiokNo 対応記録番号
	 * @return Map<String, String> 対応記録情報
	 * @throws Exception 例外
	 */
	private Map<String, String> selectTaioKiok(String taioKiokNo) throws Exception
	{
		// 対応記録テーブルからファイル出力に必要な情報を取得
		Map<String, String> taioKirokMap = new HashMap<String, String>();
		executeCR_T_TAIO_KIROK_CR_SELECT_007(new Object[]{taioKiokNo});
		JBSbatCommonDBInterface selectedData = db_CR_T_TAIO_KIROK.selectNext();
		if(selectedData == null)
		{
			// レコードが取得できない場合は、対応記録テーブルの取得項目に空文字を設定
			taioKirokMap.put(JBSbatCR_T_TAIO_KIROK.ADD_DTM, "");
			taioKirokMap.put(JBSbatCR_T_TAIO_KIROK.TITLE, "");
			taioKirokMap.put(JBSbatCR_T_TAIO_KIROK.TAIO_KIROK_RIREKI, "");
		}
		else
		{
			taioKirokMap.put(JBSbatCR_T_TAIO_KIROK.ADD_DTM, selectedData.getString(JBSbatCR_T_TAIO_KIROK.ADD_DTM));
			taioKirokMap.put(JBSbatCR_T_TAIO_KIROK.TITLE, selectedData.getString(JBSbatCR_T_TAIO_KIROK.TITLE));
			taioKirokMap.put(JBSbatCR_T_TAIO_KIROK.TAIO_KIROK_RIREKI, selectedData.getString(JBSbatCR_T_TAIO_KIROK.TAIO_KIROK_RIREKI));			
		}
		
		return taioKirokMap;
	}
	
	/**
	 * 応対区分抽出情報取得<br>
	 * 応対区分抽出情報を指定された応対区分ごとのファイルに書込む<br>
	 * @param taioKiokDtl 対応記録明細情報
	 * @param taioKiokUcwkData 対応記録内訳情報
	 * @param taioKiokData 対応記録情報
	 * @throws Exception 例外
	 */
	private void writeOutaiFile(JBSbatServiceInterfaceMap taioKiokDtl,
									JBSbatCommonDBInterface taioKiokUcwkData,
									Map<String, String> taioKiokData) throws Exception
	{
		ArrayList<String> inputDataList = new ArrayList<String>();

		inputDataList.add(JCRUtilCommon.addDblQut(taioKiokData.get(JBSbatCR_T_TAIO_KIROK.ADD_DTM)));				// 対応記録_登録年月日時分秒
		inputDataList.add(JCRUtilCommon.addDblQut(taioKiokDtl.getString(JBSbatCR_T_TAIO_KIROK.TAIO_KIROK_NO)));		// 対応記録_対応記録番号
		inputDataList.add(JCRUtilCommon.addDblQut(taioKiokDtl.getString(JBSbatCR_T_TAIOKRK_DTL.TAIO_USER_ID)));		// 対応記録明細_対応記録ユーザーID
		inputDataList.add(JCRUtilCommon.addDblQut(taioKiokData.get(JBSbatCR_T_TAIO_KIROK.TITLE)));					// 対応記録_タイトル
		inputDataList.add(JCRUtilCommon.addDblQut(taioKiokDtl.getString(JBSbatCR_T_TAIOKRK_DTL.TOIAWASE_NAIYO)));	// 対応記録明細_問合せ内容
		inputDataList.add(JCRUtilCommon.addDblQut(taioKiokDtl.getString(JBSbatCR_T_TAIOKRK_DTL.ANS_NAIYO)));		// 対応記録明細_回答内容
		inputDataList.add(JCRUtilCommon.addDblQut(taioKiokData.get(JBSbatCR_T_TAIO_KIROK.TAIO_KIROK_RIREKI)));		// 対応記録_対応記録履歴

		// 応対区分抽出ファイル書き込み
		String fileMapCd = taioKiokUcwkData.getString(JBSbatCR_T_TAIOKRK_UCWK.TOIAWASE_RSP_DIV);
		JBSbatBusinessFileUtil busFileUtil = chushutuFileMap.get(fileMapCd);
		if(busFileUtil != null)
		{
			JCRBatCommon.printBusinessFileUtil(busFileUtil, inputDataList);
		}
	}

	/**
	 * 対応記録内訳抽出ワークレコード物理削除<br>
	 * @param taioKiokUcwkData 共通DBインターフェース<br>
	 * @throws Exception 例外
	 */
	private void deleteUcwkWork(JBSbatCommonDBInterface taioKiokUcwkData) throws Exception
	{
		executeCR_T_TIOKR_UW_CST_WK_CR_DELETE_001(new Object[]{
				taioKiokUcwkData.getString(JBSbatCR_T_TAIOKRK_UCWK.TAIO_KIROK_NO),
				taioKiokUcwkData.getString(JBSbatCR_T_TAIOKRK_UCWK.TAIO_KIROK_UCWK_NO)});
		
		super.logPrint.printDebugLog("対応記録内訳抽出ワークレコード物理削除:");
		super.logPrint.printDebugLog("対応記録番号:" + taioKiokUcwkData.getString(JBSbatCR_T_TAIOKRK_UCWK.TAIO_KIROK_NO));
		super.logPrint.printDebugLog("対応記録内訳番号:" + taioKiokUcwkData.getString(JBSbatCR_T_TAIOKRK_UCWK.TAIO_KIROK_UCWK_NO));
	}

	/**
	 * 対応記録内訳抽出ワークレコード物理削除<br>
	 * @param commonItem バッチ共通パラメータ電文
	 * @param filePath 抽出ファイルパス
	 * @throws Exception 例外
	 */
	private void deleteOutaiDenshiFile(JBSbatCommonItem commonItem, String filePath) throws Exception
	{
		String outaiFileName = new File(JCRUtilCommon.inspection(filePath)).getName().replaceAll(EXT_CSV, "");
		// 重複ファイルチェック
		executeCR_T_TORK_EFILE_KNRI_CR_SELECT_004(new Object[]{outaiFileName, JCRStrConst.CD_DIV_BUNSHO_SBT_CD_OUTAI});
		JBSbatCommonDBInterface batDbInterface = db_CR_T_TORK_EFILE_KNRI.selectNext();
		if(batDbInterface == null)
		{
			super.logPrint.printDebugLog("ファイル名：" + outaiFileName + "は電子ファイル管理テーブルに存在しません。");
			return;
		}

		super.logPrint.printDebugLog("ファイル名：" + outaiFileName + "は電子ファイル管理テーブルに存在するため論理削除します。");

		// 共通部品電子ファイル管理番号
		String denshiKanriNo = batDbInterface.getString(JBSbatCR_T_TORK_EFILE_KNRI.EFILE_KANRI_NO);

		deleteDenshiFile(denshiKanriNo);
	}

	/**
	 * ファイルオブジェクトクローズ処理<br>
	 * 終了処理でファイル作成オブジェクトのクローズを行う。<br>
	 * @throws Exception 例外
	 */
	private void fileObjClose() throws Exception
	{
		// ファイルオブジェクトのクローズ
		Collection<JBSbatBusinessFileUtil> fileColl = chushutuFileMap.values();
		Iterator<JBSbatBusinessFileUtil> ite = fileColl.iterator();
		while(ite.hasNext())
		{
			JCRBatCommon.closeBusinessFileUtil(ite.next());
		}
		super.logPrint.printDebugLog("ファイルクローズ処理実行");
	}

	/**
	 * 対応履歴電子ファイル管理テーブル登録<br>
	 * 応対区分抽出ファイルの情報を対応履歴電子ファイル管理テーブルに登録<br>
	 * @param denshiKanriNo 電子対応記録番号
	 * @param failePath 登録対象ファイルパス
	 * @throws Exception 例外
	 */
	private void entryTaioBunsho(String denshiKanriNo, String failePath) throws Exception
	{
		Map<String, String> dataMap = new HashMap<String, String>();
		
		// 文書種別コード
		dataMap.put(JBSbatCR_T_TORK_EFILE_KNRI.BUNSHO_SBT_CD, JCRStrConst.CD_DIV_BUNSHO_SBT_CD_OUTAI);

		// 電子ファイル管理番号
		dataMap.put(JBSbatCR_T_TORK_EFILE_KNRI.EFILE_KANRI_NO, denshiKanriNo);

		// 対応履歴文書ファイル名
		String fileName = (new File(JCRUtilCommon.inspection(failePath)).getName()).replaceAll(EXT_CSV, "");
		dataMap.put(JBSbatCR_T_TORK_EFILE_KNRI.TAIORRKI_BUNSHO_FILE_NM, fileName);

		JCRBatCommon.entryTaioBunsho(commonItem, dataMap);
		super.logPrint.printDebugLog("対応履歴電子ファイル管理、電子ファイル管理テーブル登録");
		super.logPrint.printDebugLog("電子ファイル管理番号:" + denshiKanriNo);
		super.logPrint.printDebugLog("ファイル名:" + fileName);
	}

	/**
	 * 保存期限経過ファイル論理削除<br>
	 * 終了処理で保存期限が過ぎた応対区分抽出ファイルの論理削除<br>
	 * @throws Exception 例外
	 */
	private void deleteLimitOverFile() throws Exception
	{
		// 保存期限経過ファイル存在チェック
		executeCR_T_TORK_EFILE_KNRI_CR_SELECT_003(new Object[]{JCRStrConst.CD_DIV_BUNSHO_SBT_CD_OUTAI, sysDtm, hozonKikan});
		List<JBSbatCommonDBInterface> selectBunshoData = JCRBatCommon.getSelectedDataList(db_CR_T_TORK_EFILE_KNRI);
		if(selectBunshoData == null)
		{
			super.logPrint.printDebugLog("保存期限経過ファイルは存在しません。");
			return;
		}
		super.logPrint.printDebugLog("保存期限経過ファイル削除");
		
		for(int i = 0; i < selectBunshoData.size(); i++)
		{
			String denshiKanriNo = selectBunshoData.get(i).getString(JBSbatCC_T_EFILE_KANRI.EFILE_KANRI_NO);
			// 保存期限経過ファイル削除
			deleteDenshiFile(denshiKanriNo);
		}
	}
	
	/**
	 * 電子文書ファイル論理削除<br>
	 * @param denshiKanriNo 電子対応記録番号
	 * @throws Exception 例外
	 */
	private void deleteDenshiFile(String denshiKanriNo) throws Exception
	{
		if(denshiKanriNo == null)
		{
			return;
		}
		//  対応履歴電子ファイル管理テーブルのレコードを論理削除
		executeCR_T_TORK_EFILE_KNRI_CR_UPDATE_002(new Object[]{sysDtms, batchUserId, sysDtms, batchUserId, denshiKanriNo});

		// 共通電子ファイル管理テーブルのレコードを論理削除
		JCRBatCommon.deleteDenshiFile(commonItem, denshiKanriNo);
		super.logPrint.printDebugLog(" 対応履歴電子ファイル管理、電子ファイル管理テーブル論理削除");
		super.logPrint.printDebugLog("電子ファイル管理番号:" + denshiKanriNo);

	}
	
	/**
	 * 前回実行日更新<br>
	 * 終了処理で応対区分抽出処理の実施日付を登録
	 * @throws Exception 例外
	 */
	private void updateJikkoubi() throws Exception
	{
		JBSbatCommonDBInterface where = new JBSbatCommonDBInterface();
		JBSbatCommonDBInterface updateVaule = new JBSbatCommonDBInterface();

		updateVaule.setValue(JBSbatCR_M_TAIORRK_BATCTRL.BATCTRL_VALUE, sysDtm);
		where.setValue(JBSbatCR_M_TAIORRK_BATCTRL.TAIORRK_BATCTRL_NO, JCRStrConst.BATCTRL_OUTAI_ZENKAI_DTM);
		db_CR_M_TAIORRK_BATCTRL.updateByPrimaryKeys(where, updateVaule);
		super.logPrint.printDebugLog("前回実行日付更新:" + sysDtm);
	}

}
