/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom  					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACFileMakeCtrl
*	ソースファイル名	：JBSbatACFileMakeCtrl.java
*	作成者				：富士通　
*	作成日				：2011年07月11日
*＜機能概要＞
*　ファイル作成制御部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/07/11   富士通		新規作成
*	v3.00		2012/04/25   FJ)永田	【ANK-0024-04-00】	出力項目追加
*	v4.00		2013/04/05   FJ) 小柴	【IKK-2013-0000783】文字化け対策のため、エンコード形式の変更
*	v8.00		2013/12/13   FJ) 鈴木	【ANK-1794-00-00】L2-MVNO対応（請求書電話番号表示（LC含む））
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import eo.business.common.JACBatCommon;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.util.file.JBSbatACIFM040;
import eo.business.util.table.JBSbatAC_M_FILE_GENE_CTRL;
import eo.business.util.table.JBSbatAC_M_FILE_OPUT_CTRL;
import eo.common.constant.JACStrConst;
import eo.common.util.JPCUtilCommon;
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 JBSbatACFileMakeCtrl extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(ファイル生成制御)*/
	private static final String D_TBL_NAME_AC_M_FILE_GENE_CTRL = "AC_M_FILE_GENE_CTRL";

	/** テーブル(ファイル出力制御)*/
	private static final String D_TBL_NAME_AC_M_FILE_OPUT_CTRL = "AC_M_FILE_OPUT_CTRL";

	/** SQL定義キー(AC_SELECT_001)*/
	private static final String AC_M_FILE_GENE_CTRL_AC_SELECT_001 = "AC_SELECT_001";

	/** SQL定義キー(AC_SELECT_002)*/
	private static final String AC_M_FILE_OPUT_CTRL_AC_SELECT_002 = "AC_SELECT_002";

	/** SQL定義キー(AC_SELECT_003)*/
	private static final String AC_M_FILE_OPUT_CTRL_AC_SELECT_003 = "AC_SELECT_003";

	/** テーブルアクセスクラス(ファイル生成制御)*/
	private JBSbatSQLAccess db_AC_M_FILE_GENE_CTRL = null;

	/** テーブルアクセスクラス(ファイル出力制御)*/
	private JBSbatSQLAccess db_AC_M_FILE_OPUT_CTRL = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 退避リストインデックス（固定項目） */
	private static final Integer IDX_TMP_LIST_FIXITEM = 0;
	
	/** 出力ファイル名 */
	private String		outFileName			= null;

	/** 項目区切り文字 */
	private String		delimCode			= null;

	/** 出力データ識別コード(明細) */
	private String 	outDataSkbtDtl 		= null;
	
	/** 出力データ識別コード(ヘッダ)  */
	private String 	outDataSkbtHeader 	= null;
	
	/** 項目識別コード(固定項目)  */
	private String 	kmkSkbtKotei 		= null;
	
	/** 処理中ファイルオブジェクト */
	private JBSbatBusinessFileUtil fileObj	= null;	
	
	/** ファイル生成制御マスタ　ハッシュマップ */
	private HashMap<String, JBSbatCommonDBInterface> gFileItemMap = null;
	
	/** ファイル出力管理ハッシュマップ */
	private HashMap<String, Boolean> 				fileOutputMap = null;
	
	/** ファイル分割識別コード */
	private String dbFileDivSkbtCd = JACStrConst.KARA_MOJI;
	
	/** 多重番号 */
	private String divNo 			= JACStrConst.KARA_MOJI;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_AC_M_FILE_GENE_CTRL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_M_FILE_GENE_CTRL);
		db_AC_M_FILE_OPUT_CTRL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_M_FILE_OPUT_CTRL);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		// パラメータ取得クラス生成
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);

		// 業務パラメータ情報取得
		// 出力データ識別コード(明細)
		this.outDataSkbtDtl = paramUtil.getGyoumuParameter(JACStrConst.WORKID_AC_OUT_SKBT_DTL);
		assert JACBatCommon.printDebugLog(super.logPrint, "出力データ識別コード(明細)：" + this.outDataSkbtDtl);
		
		// 出力データ識別コード(ヘッダ)
		this.outDataSkbtHeader = paramUtil.getGyoumuParameter(JACStrConst.WORKID_AC_OUT_SKBT_HEADER);
		assert JACBatCommon.printDebugLog(super.logPrint, "出力データ識別コード(ヘッダ)：" + this.outDataSkbtHeader);
		
		// 項目識別コード(固定項目) 
		this.kmkSkbtKotei = paramUtil.getGyoumuParameter(JACStrConst.WORKID_AC_KMK_SKBT_KOTEI);
		assert JACBatCommon.printDebugLog(super.logPrint, "項目識別コード(固定項目)：" + this.kmkSkbtKotei);
		
		// パラメータ取得クラスクローズ
		paramUtil.close();

		// FREEITEMの取得
		String[] freeItems = super.freeItem.split(JACStrConst.SEMI_COLON);

		// ファイル分割識別コード
		this.dbFileDivSkbtCd = freeItems[0];
		
		// ファイル分割識別コードが分割あり場合
		if (this.dbFileDivSkbtCd.equals(JACStrConst.FILE_DIV_SKBT_CD_ARI))
		{
			// 多重番号
			this.divNo = freeItems[1];
		}
		
		// ファイル生成制御マスタ メモリ展開
		// 対象キーの設定
		JBSbatCommonDBInterface dbSelectList = new JBSbatCommonDBInterface();

		// パラメタ設定
		dbSelectList.setValue(super.systemCode); 		// システムコード
		dbSelectList.setValue(this.dbFileDivSkbtCd); 	// ファイル分割識別コード
		dbSelectList.setValue(super.opeDate); 			// バッチ運用日

		// SELECT文発行
		executeAC_M_FILE_GENE_CTRL_AC_SELECT_001(dbSelectList.getList().toArray());

		// 結果を取得
		JBSbatCommonDBInterface dbMap = this.db_AC_M_FILE_GENE_CTRL.selectNext();

		// マップキーArrayList
		String mapKey = null;
		
		// ファイル生成制御マスタハッシュマップ
		this.gFileItemMap = new HashMap<String, JBSbatCommonDBInterface>(32);
		
		// ファイル出力管理ハッシュマップ
		this.fileOutputMap = new HashMap<String, Boolean>(32);
		// 取得データ分のファイルを作成する
		while (dbMap != null)
		{
			mapKey = dbMap.getString(JBSbatAC_M_FILE_GENE_CTRL.FILE_ID);// ファイルＩＤ
			
			// ファイル生成制御マスタハッシュマップ値を保持する
			this.gFileItemMap.put(mapKey, dbMap);
			
			// ファイル出力管理ハッシュマップ値を保持する
			this.fileOutputMap.put(mapKey, true);
			
			// 次データ読込
			dbMap = this.db_AC_M_FILE_GENE_CTRL.selectNext();
		}
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @param outputInItem 入力情報
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// ブレイクキー（入力）
		String inBKey1 = null;
		// ブレークキー（退避）
		String tmpBKey1 = null;

		// 入力情報が存在する場合
		if (inMap != null)
		{
			// ブレークキー（入力）を設定する
			inBKey1 = inMap.getString(JBSbatACIFM040.FILE_ID);
		}

		// ＫＥＹ格納リストに要素がある場合
		if (outputInItem.isKeyList())
		{
			// ブレークキー１（退避）を設定する
			tmpBKey1 = (String)outputInItem.getKeyList().get(0); 
		}

		// ファイルＩＤブレイク処理(ブレークキー１（退避）＝ null または ブレークキー１（退避）≠ ブレークキー１（入力）の場合)
		if (tmpBKey1 == null || !tmpBKey1.equals(inBKey1))
		{
			// ファイル終了処理を行う
			if (this.fileObj != null)
			{
				// 退避情報（ファイル出力インスタンス）が存在する場合ファイルクローズを行う
				JCCBatCommon.closeBusinessFileUtil(this.fileObj);
				
				// 退避領域を開放する
				this.fileObj = null;
				outputInItem.clearTmpList();
			}

			// ファイル生成制御情報を取得する
			String key = inMap.getString(JBSbatACIFM040.FILE_ID);  // ファイルＩＤ
			
			JBSbatCommonDBInterface fileItemMstMap = (JBSbatCommonDBInterface)this.gFileItemMap.get(key);

			// ファイル生成制御情報が存在しない場合
			if (fileItemMstMap == null)
			{
				// 処理を終了する
				return outputInItem;
			}

			// ファイルオープン処理を行う
			this.fileObj = this.openOutFile(inMap, fileItemMstMap);
			
			// ファイル出力管理ハッシュマップ　値更新
			this.fileOutputMap.put(key, false);
			
			// 出力共通電文．退避エリアに情報を設定する
			outputInItem.addTmpList(this.getFixItemList(inMap)); 	// 固定項目出力制御情報リスト

			// ＫＥＹリストの設定
			outputInItem.clearKeyList(); 		// ＫＥＹリストのクリア
			outputInItem.addKeyList(inBKey1); 	// 入力．ブレイクキーの設定

			// ヘッダ情報出力処理を行う
			this.printHeaderInfo(inMap, outputInItem);
		}

		// 明細情報出力処理を行う
		this.printDetailInfo(inMap, outputInItem);

		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_AC_M_FILE_GENE_CTRL.close();
		db_AC_M_FILE_OPUT_CTRL.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		// ファイル終了処理を行う
		if (this.fileObj != null)
		{
			// ファイル出力インスタンスが存在する場合ファイルクローズ
			JCCBatCommon.closeBusinessFileUtil(this.fileObj);
		}
		
		// ０バイトファイル生成
		openOutBlankFile();
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * SQLKEY(AC_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 executeAC_M_FILE_GENE_CTRL_AC_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_AC_M_FILE_GENE_CTRL.selectBySqlDefine(paramList, AC_M_FILE_GENE_CTRL_AC_SELECT_001);
	}

	/**
	 * SQLKEY(AC_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	システムコード
	 *		 	ファイルID
	 *		 	出力データ識別コード
	 *		 	項目識別コード
	 *		 	バッチ運用日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeAC_M_FILE_OPUT_CTRL_AC_SELECT_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_AC_M_FILE_OPUT_CTRL.selectBySqlDefine(paramList, AC_M_FILE_OPUT_CTRL_AC_SELECT_002);
	}

	/**
	 * SQLKEY(AC_SELECT_003)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	システムコード
	 *		 	ファイルID
	 *		 	出力データ識別コード
	 *		 	バッチ運用日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeAC_M_FILE_OPUT_CTRL_AC_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());
		paramList.setValue(param[3].toString());

		// DBアクセスを実行します
		db_AC_M_FILE_OPUT_CTRL.selectBySqlDefine(paramList, AC_M_FILE_OPUT_CTRL_AC_SELECT_003);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 入力情報をリストに格納を行います。
	 * 
	 * @param inMap ファイル出力料金情報
	 * @return ArrayList ファイル出力料金情報(リスト)
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private ArrayList<Object> getListMap(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		ArrayList<Object> list = new ArrayList<Object>(20);

		// 入力情報を配列に格納する
		list.add(inMap.getString(JBSbatACIFM040.SEIKY_KEI_NO)); 		// 請求先番号
		list.add(inMap.getString(JBSbatACIFM040.SEIKY_YM)); 			// 請求年月
		list.add(inMap.getString(JBSbatACIFM040.SEIRI_NO)); 			// 整理番号
		list.add(inMap.getString(JBSbatACIFM040.SVC_NO)); 				// サービス番号
		list.add(inMap.getString(JBSbatACIFM040.SVC_SKBT_CD)); 			// 料金サービス識別コード
		list.add(inMap.getString(JBSbatACIFM040.PRC_GRP_CD)); 			// 料金グループコード
		list.add(inMap.getString(JBSbatACIFM040.PCRS_CD)); 				// 料金コースコード
		list.add(inMap.getString(JBSbatACIFM040.PRC_SVC_CD)); 			// 料金サービスコード
		list.add(inMap.getString(JBSbatACIFM040.PRC_KMK_CD)); 			// 料金項目コード
		list.add(inMap.getBigDecimal(JBSbatACIFM040.PRC)); 				// 料金
		list.add(inMap.getString(JBSbatACIFM040.USE_STAYMD)); 			// 利用開始日
		list.add(inMap.getString(JBSbatACIFM040.USE_ENDYMD)); 			// 利用終了日
		list.add(inMap.getString(JBSbatACIFM040.AIT_DIV)); 				// 相対区分
		list.add(inMap.getString(JBSbatACIFM040.SIME_DAY)); 			// 締め日
		list.add(inMap.getString(JBSbatACIFM040.FILE_ID)); 				// ファイルＩＤ
		list.add(inMap.getBigDecimal(JBSbatACIFM040.LENGTH_POSITION));	// 縦位置
		list.add(inMap.getBigDecimal(JBSbatACIFM040.SIDE_POSITION)); 	// 横位置
		list.add(inMap.getString(JBSbatACIFM040.KMK_HENSHU_SKBT_CD)); 	// 項目編集識別コード
		list.add(inMap.getString(JBSbatACIFM040.NM_SKBT_CD)); 			// 名称識別コード
		list.add(inMap.getString(JBSbatACIFM040.SVC_DTL_SKBT_NO)); 		// サービス詳細識別番号

		return list;
	}

	/**
	 * ファイル出力制御情報（ヘッダ出力制御情報）の取得を行います。
	 * 
	 * @param inMap ファイル出力料金情報
	 * @return JBSbatCommonDBInterface ファイル出力制御情報（ヘッダ出力制御）
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private JBSbatCommonDBInterface getFileMakeMstHeader(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		// 対象キーの設定
		JBSbatCommonDBInterface dbSelectList = new JBSbatCommonDBInterface();

		// パラメタ設定
		dbSelectList.setValue(super.systemCode); 								// システムコード
		dbSelectList.setValue(inMap.getString(JBSbatACIFM040.FILE_ID)); 		// ファイルＩＤ
		dbSelectList.setValue(this.outDataSkbtHeader);		 					// 出力データ区分
		dbSelectList.setValue(super.opeDate); 									// バッチ運用日

		// SELECT文発行
		executeAC_M_FILE_OPUT_CTRL_AC_SELECT_003(dbSelectList.getList().toArray());

		// 結果を取得
		JBSbatCommonDBInterface dbMap = this.db_AC_M_FILE_OPUT_CTRL.selectNext();

		return dbMap;
	}

	/**
	 * ファイル出力制御情報（固定項目出力制御情報）の取得を行います。
	 * 
	 * @param inMap ファイル出力料金情報
	 * @return JBSbatCommonDBInterface ファイル出力制御情報（固定項目出力制御）
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private JBSbatCommonDBInterface getFileMakeMstFixItem(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		// 対象キーの設定
		JBSbatCommonDBInterface dbSelectList = new JBSbatCommonDBInterface();

		// パラメタ設定
		dbSelectList.setValue(super.systemCode); 								//システムコード
		dbSelectList.setValue(inMap.getString(JBSbatACIFM040.FILE_ID)); 		// ファイルＩＤ
		dbSelectList.setValue(this.outDataSkbtDtl); 							// 出力データ区分
		dbSelectList.setValue(this.kmkSkbtKotei); 								// 項目区分
		dbSelectList.setValue(super.opeDate); 									// バッチ運用日

		// SELECT文発行
		executeAC_M_FILE_OPUT_CTRL_AC_SELECT_002(dbSelectList.getList().toArray());

		// 結果を取得
		JBSbatCommonDBInterface dbMap = this.db_AC_M_FILE_OPUT_CTRL.selectNext();

		return dbMap;
	}

	/**
	 * 出力ファイルのオープンを行います。
	 * 
	 * @param inMap ファイル出力料金情報
	 * @param dbMap ファイル生成制御情報
	 * @return BGOutputFileUtil 出力ファイルオブジェクト
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private JBSbatBusinessFileUtil openOutFile(JBSbatServiceInterfaceMap inMap, JBSbatCommonDBInterface dbMap) throws Exception
	{

		JBSbatBusinessFileUtil outFileObj = null;
		String[] fileKbnArray = new String[]{ 
				super.systemCode, 										// システムコード
				inMap.getString(JBSbatACIFM040.SEIKY_YM), 				// 請求年月
				super.opeDate, 											// バッチ運用日
				JCCBatCommon.getSysDateTimeStamp(), 					// システム日時
				JACStrConst.KARA_MOJI, 									// 自由設定
				this.divNo }; 											// 多重番号
		
		// ファイル名編集
		String[] fileInfo = JACBatCommon.editFileItemName(dbMap.getString(JBSbatAC_M_FILE_GENE_CTRL.FILE_NO), dbMap, fileKbnArray);
		this.outFileName = fileInfo[0]; 	// 出力ファイル名（フルパス）
		this.delimCode = fileInfo[1]; 		// 区切り文字

		// 出力ファイルをオープンする
		// 改行コード(CR+LF)
		outFileObj = JCCBatCommon.createBusinessFileUtil(this.outFileName, JACStrConst.ENCODE_MS932, JACBatCommon.chgKaigyo(JACStrConst.LINE_CRLF), this.delimCode);

		return outFileObj;
	}

	/**
	 * ０バイトファイル生成を行います。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void openOutBlankFile() throws Exception
	{
		JBSbatCommonDBInterface dbMap = null;
		Iterator<String> iter = this.fileOutputMap.keySet().iterator();
		while (iter.hasNext())
		{
			String mapKey = iter.next();

			if (this.fileOutputMap.get(mapKey))
			{
				dbMap = this.gFileItemMap.get(mapKey);
				
				// 出力ファイルをオープンする
				JBSbatBusinessFileUtil tmpFileObj = openOutFile(new JBSbatServiceInterfaceMap(), dbMap);
				// 出力ファイルをクローズする
				JCCBatCommon.closeBusinessFileUtil(tmpFileObj);	
			}
		}
	}
	
	/**
	 * 固定項目出力制御情報リストを取得を行います。
	 * 
	 * @param inMap ファイル出力料金情報
	 * @return ArrayList 固定項目出力制御情報リスト
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private ArrayList<JBSbatCommonDBInterface> getFixItemList(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		// 固定項目出力制御リスト
		ArrayList<JBSbatCommonDBInterface> fixItemList = new ArrayList<JBSbatCommonDBInterface>(32);

		// ファイル出力制御情報（固定項目出力制御情報）を取得する
		JBSbatCommonDBInterface mstMap = this.getFileMakeMstFixItem(inMap);

		// 抽出されたレコード分繰り返す
		while (mstMap != null)
		{
			// 固定項目出力情報リストに追加する
			fixItemList.add(mstMap);

			// 次レコード検索を行う
			mstMap = this.db_AC_M_FILE_OPUT_CTRL.selectNext();
		}

		if (fixItemList.isEmpty())
		{
			return null;
		}
		else
		{
			return fixItemList;
		}
	}

	/**
	 * ヘッダ情報をファイルに出力を行います。
	 * 
	 * @param inMap ファイル出力料金情報
	 * @param outputBean 出力共通電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void printHeaderInfo(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputBean) throws Exception
	{
		// ファイル出力制御情報（ヘッダ出力制御情報）を取得する
		JBSbatCommonDBInterface mstMap = this.getFileMakeMstHeader(inMap);

		// ファイル出力制御情報（ヘッダ出力制御情報）が存在しない場合
		if (mstMap == null)
		{
			// ヘッダ情報出力処理を抜ける
			return;
		}

		// ヘッダレコードの編集を行う
		ArrayList<String> outList = new ArrayList<String>(100); // 出力情報リスト
		
		// 固定長の場合
		if ("".equals(this.delimCode))
		{
			
			// 抽出されたレコード分繰り返す
			while (mstMap != null)
			{ 
				String outItem = null; // 出力項目

				int keta = mstMap.getBigDecimal(JBSbatAC_M_FILE_OPUT_CTRL.DIGITNO).intValue(); // 桁数

				// 桁数＞0の場合は、桁合わせを行う
				if (keta > 0)
				{
					outItem = JPCUtilCommon.adjustCharSize(mstMap.getString(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_KMK), keta, "");
				}
				else
				{
					outItem = mstMap.getString(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_KMK);
				}
				// 出力情報リストに追加
				outList.add(outItem);
				// 次レコード検索を行う
				mstMap = this.db_AC_M_FILE_OPUT_CTRL.selectNext();
			}
		}
		// 固定長以外の場合
		else
		{
			
			// 抽出されたレコード分繰り返す
			while (mstMap != null)
			{
				// 出力情報リストに追加
				outList.add(mstMap.getString(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_KMK));
				// 次レコード検索を行う
				mstMap = this.db_AC_M_FILE_OPUT_CTRL.selectNext();
			}
		}
		// ファイル出力を行う
		JCCBatCommon.printBusinessFileUtil(this.fileObj, outList);
	}

	/**
	 * 明細情報をファイルに出力を行います。
	 * @param inMap ファイル出力料金情報
	 * @param outputItem 出力共通電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void printDetailInfo(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputItem) throws Exception
	{
		ArrayList<Object> outList = null; // 出力情報リスト
		ArrayList<JBSbatCommonDBInterface> fixItemList = (ArrayList<JBSbatCommonDBInterface>)outputItem.getTmpList().get(IDX_TMP_LIST_FIXITEM); // 固定項目出力制御情報
		// 入力情報をリスト化する
		ArrayList<Object> inList = this.getListMap(inMap); // 入力情報リスト

		// 明細情報の編集を行う
		// 固定項目出力制御情報が存在しない
		if (fixItemList == null)
		{
			
			// 入力情報リストを出力情報リストとして設定
			outList = inList;
		}
		// 固定項目出力制御情報が存在する
		else
		{
			
			outList = new ArrayList<Object>();
			Iterator<JBSbatCommonDBInterface> ite = fixItemList.iterator();
			
			// 固定長の場合
			if (JACStrConst.KARA_MOJI.equals(this.delimCode))
			{
				while (ite.hasNext())
				{
					String outItem = null; // 出力項目
					JBSbatCommonDBInterface dbMap = (JBSbatCommonDBInterface)ite.next();

					int motoItem = dbMap.getBigDecimal(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_MT_KMK_CD).intValue(); // 出力元項目

					// 出力元項目　＝　０（固定値使用）
					if (motoItem == 0)
					{
						outItem = dbMap.getString(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_KMK);
					}
					else
					{
						outItem = this.convStringFormat(inList, motoItem);
					}

					int keta = dbMap.getBigDecimal(JBSbatAC_M_FILE_OPUT_CTRL.DIGITNO).intValue(); // 桁数
					
					// 桁数＞0の場合は、桁合わせを行う
					if (keta > 0)
					{
						outItem = JPCUtilCommon.adjustCharSize(outItem, keta, "");
					}
					// 出力情報リストに追加
					outList.add(outItem);
				}
			}
			// 固定長以外の場合
			else
			{
				
				while (ite.hasNext())
				{
					String outItem = null; // 出力項目
					JBSbatCommonDBInterface dbMap = (JBSbatCommonDBInterface)ite.next();

					int motoItem = dbMap.getBigDecimal(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_MT_KMK_CD).intValue(); // 出力元項目

					// 出力元項目 ＝ ０（固定値使用）
					if (motoItem == 0)
					{
						outItem = dbMap.getString(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_KMK);
					}
					else
					{
						outItem = this.convStringFormat(inList, motoItem);
					}
					// 出力情報リストに追加
					outList.add(outItem);
				}
			}
		}

		// ファイル出力を行う
		JCCBatCommon.printBusinessFileUtil(this.fileObj, outList);
	}

	/**
	 * 入力値によって、文字列への変換方法の変更を行います。
	 * 
	 * @param inList 入力値：ファイル出力料金情報
	 * @param motoItem 出力元項目
	 * @return String
	 */
	private String convStringFormat(ArrayList<Object> inList, int motoItem)
	{

		String returnStr = null;
		if (inList.get(motoItem - 1) instanceof BigDecimal)
		{
			returnStr = ((BigDecimal)inList.get(motoItem - 1)).toString();
		}
		else
		{
			returnStr = (String)inList.get(motoItem - 1);
		}
		return returnStr;
	}
	
}
