/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACKcatJsStbMhSksi
*	ソースファイル名	：JBSbatACKcatJsStbMhSksi.java
*	作成者				：富士通　
*	作成日				：2012年01月18日
*＜機能概要＞
*　ＫＣＡＴ事業者間精算ＳＴＢ明細表作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/01/18   富士通		新規作成
*	v3.00		2012/08/03   FJ）冨井	【TGI-2012-0000054】ダミーレコード設定位置修正
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JACBatCommon;
import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.util.file.JBSbatACIFM112;
import eo.business.util.file.JBSbatACIFM118;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_OPUT_NM;
import eo.business.util.table.JBSbatKK_T_KKTK_SVC_KEI;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JPCFomatString;
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 JBSbatACKcatJsStbMhSksi extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(機器提供サービス契約)*/
	private static final String D_TBL_NAME_KK_T_KKTK_SVC_KEI = "KK_T_KKTK_SVC_KEI";

	/** テーブル(料金項目出力名称)*/
	private static final String D_TBL_NAME_CH_M_PRC_KMK_OPUT_NM = "CH_M_PRC_KMK_OPUT_NM";

	/** SQL定義キー(AC_SELECT_002)*/
	private static final String KK_T_KKTK_SVC_KEI_AC_SELECT_002 = "AC_SELECT_002";

	/** SQL定義キー(AC_SELECT_006)*/
	private static final String CH_M_PRC_KMK_OPUT_NM_AC_SELECT_006 = "AC_SELECT_006";

	/** テーブルアクセスクラス(機器提供サービス契約)*/
	private JBSbatSQLAccess db_KK_T_KKTK_SVC_KEI = null;

	/** テーブルアクセスクラス(料金項目出力名称)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_OPUT_NM = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/**▼▼▼▼▼▼クラス変数追加 開始▼▼▼▼▼▼*/

	/** ＳＴＢ利用料（料金項目コードの下二桁） */
	private static final String STB_USE_PRC = "01";
	
	/** ＳＴＢ利用料減額（料金項目コードの下二桁） */
	private static final String STB_USE_GEN_PRC = "15";
	
	/** ファイル名（フルパス） */
	private String fileNm = JACStrConst.KARA_MOJI;
	
	/** ファイル識別変更フラグ */
	private String fileSkbtChgFlg = JACStrConst.KARA_MOJI;
	
	/** 前回キー（縦位置＋精算項目コード） */
	private String prvKey = JACStrConst.KARA_MOJI;
	
	/** 前回サービス契約番号 */
	private String prvSvcKeiNo = JACStrConst.KARA_MOJI;
	
	/** 検索キー（サービス契約番号＋料金コースコード＋料金サービスコード） */
	private String prvSelectKry = JACStrConst.KARA_MOJI;
	
	/** 機器サービスコード */
	private String kkSvcCd = JACStrConst.KARA_MOJI;
	
	/** サービス課金開始日 */
	private String tmpSvcChrgStaYmd = JACStrConst.KARA_MOJI;
	
	/** サービス課金終了日 */
	private String tmpSvcChrgEndYmd = JACStrConst.KARA_MOJI;
	
	/** 出力件数 */
	private int outputCnt = 0;
	
	/** 出力情報設定キーリスト */
	private ArrayList<String>outputKeyList = null;
	
	/** 機器サービス名称マップ */
	private HashMap<String, String>kkNmMap = null;
	
	/** 出力情報 */
	private HashMap<String, Object> tmpOutputInf = null;
	
	/** ファイルインスタンス */
	private JBSbatBusinessFileUtil outFileObj = null;

	/**▲▲▲▲▲▲クラス変数追加 終了▲▲▲▲▲▲*/
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_KKTK_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KKTK_SVC_KEI);
		db_CH_M_PRC_KMK_OPUT_NM = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_OPUT_NM);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][opeDate=" + super.opeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][freeItem=" + super.freeItem + "]");
		
		// 機器サービス名称マップを作成します。
		this.makeKkNmMap();
		
		// 請求年月を取得します。
		String sikyYm = this.getSikyYm();
		
		// 外部パラメータを分割します。
		String[] freeItems = super.freeItem.split(JACStrConst.SEMI_COLON);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][freeItems=" + freeItems[0] + ", " + freeItems[1] + "]");
		
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		
		// ファイルIDを取得します。
		String fileId = JACStrConst.KARA_MOJI;
		try
		{
			// ファイルID取得
			fileId = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_IDAC_KCAT_STB_DTL_FID);
		}
		finally
		{
			paramUtil.close();
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][fileId=" + fileId + "]");
		
		// ファイル生成します。
		// （引数：バッチ共通パラメータ, ファイルID, ファイル分割有無, ファイル連番, 請求年月, 自由設定, 文字コード, 変換前改行コード）
		ArrayList<Object> fileInf = JACBatCommon.geneFile(commonItem, fileId, freeItems[0], freeItems[1], sikyYm, JACStrConst.KARA_MOJI, JACStrConst.KARA_MOJI, JACStrConst.KARA_MOJI, JACStrConst.LINE_CRLF);
		
		this.fileNm = (String)fileInf.get(0);							// ファイル名（フルパス）
		this.outFileObj = (JBSbatBusinessFileUtil)fileInf.get(2);		// ファイルインスタンス
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][fileNm=" + this.fileNm + "]");
		
		// 出力情報設定キーリストを作成します。
		this.makeOutputKeyList();
		
		this.tmpOutputInf = new HashMap<String, Object>();
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @param outputInItem 入力情報
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap=" + inMap.getMap().toString() + "]") : true;
		assert this.tmpOutputInf != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][tmpOutputInf=" + this.tmpOutputInf.toString() + "]") : true;
		assert this.fileSkbtChgFlg != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][fileSkbtChgFlg=" + this.fileSkbtChgFlg + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][outputCnt=" + this.outputCnt + "]");
		
		//1件目のレコードの場合
		if(!outputInItem.isOutMapList())
		{
			// ダミーレコードセット
			outputInItem.addOutMapList(new JBSbatServiceInterfaceMap());
		}
		
		// 入力情報＝nullの場合
		if(null == inMap)
		{
			// 出力されていない情報が存在している場合
			if(!this.tmpOutputInf.isEmpty())
			{
				// ファイル出力処理
				this.outputRecord();
			}
			
			String[] outCntMsg = {JACStrConst.LOG_MSG_EXECUTE, String.valueOf(this.outputCnt)};
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0560AI, outCntMsg);
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
			return outputInItem;
		}
		
		String fileSkbtFlg = inMap.getString(JBSbatACIFM118.FILE_SKBT_FLG);		// ファイル識別フラグ
		
		// ファイル識別フラグ＝ヘッダの場合
		if(JACStrConst.OUTDATASKBT_HEADER.equals(fileSkbtFlg))
		{
			String wkKey = this.makeWkKey(inMap);									// WKキー
			
			assert this.prvKey != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][prvKey=" + this.prvKey + "]") : true;
			assert wkKey != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][wkKey=" + wkKey + "]") : true;
			
			// 前回キー≠WKキーの場合
			if(!this.prvKey.equals(wkKey))
			{
				// 前回キー＝""（空）の場合
				if(JACStrConst.KARA_MOJI.equals(this.prvKey))
				{
					// ファイル識別変更フラグ　退避
					this.fileSkbtChgFlg = fileSkbtFlg;
				}
				
				// 出力されていない情報が存在している場合
				if(!this.tmpOutputInf.isEmpty())
				{
					// ファイル出力処理
					this.outputRecord();
				}
				// キー退避
				this.prvKey = wkKey;
			}
			// ヘッダ情報作成処理を行います。
			this.makeHedderInf(inMap);
		}
		// ファイル識別フラグ＝明細の場合
		else if(JACStrConst.OUTDATASKBT_DTL.equals(fileSkbtFlg))
		{
			String wkKey = inMap.getString(JBSbatACIFM118.SVKEI_NO);		// サービス契約番号
			
			// 退避．ファイル識別変更フラグ　≠　入力．ファイル識別フラグ
			if(!this.fileSkbtChgFlg.equals(fileSkbtFlg))
			{
				// ファイル出力処理
				this.outputRecord();
				
				// ファイル識別変更フラグ　退避
				this.fileSkbtChgFlg = fileSkbtFlg;
				
				// 前回キー　初期化
				this.prvKey = JACStrConst.KARA_MOJI;
			}
			// 入力．検索キー（サービス契約番号　＋　料金コースコード　＋　料金サービスコード）
			String selectKey = this.makeSelectKey(inMap);
			
			assert this.prvSelectKry != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][prvSelectKry=" + this.prvSelectKry + "]") : true;
			assert selectKey != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][selectKey=" + selectKey + "]") : true;
			
			// 退避．検索キー　≠　入力．検索キーの場合
			if(!this.prvSelectKry.equals(selectKey))
			{
				// 機器提供サービス情報取得
				this.selectKktkSvcKei(inMap);
				
				// 検索キー　退避
				this.prvSelectKry = selectKey;
			}
			
			assert this.prvSvcKeiNo != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][prvSvcKeiNo=" + this.prvSvcKeiNo + "]") : true;
			assert wkKey != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][wkKey=" + wkKey + "]") : true;
			
			// 前回サービス契約番号≠WKキーの場合
			if(!this.prvSvcKeiNo.equals(wkKey))
			{
				// 前回サービス契約番号≠""（空）の場合
				if(!JACStrConst.KARA_MOJI.equals(this.prvSvcKeiNo))
				{
					// ファイル出力処理
					this.outputRecord();
				}
				
				// サービス契約番号退避
				this.prvSvcKeiNo = wkKey;
			}
			// 明細情報作成処理を行います。
			this.makeDtlInf(inMap);
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_KKTK_SVC_KEI.close();
		db_CH_M_PRC_KMK_OPUT_NM.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		
		// ファイルインスタンスがNULLでない場合
		if(null != this.outFileObj)
		{
			// ファイルクローズ
			JCCBatCommon.closeBusinessFileUtil(this.outFileObj);
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * SQLKEY(AC_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 executeKK_T_KKTK_SVC_KEI_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());

		// DBアクセスを実行します
		db_KK_T_KKTK_SVC_KEI.selectBySqlDefine(paramList, KK_T_KKTK_SVC_KEI_AC_SELECT_002);
	}

	/**
	 * SQLKEY(AC_SELECT_006)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	料金項目名称種別コード
	 *			予約適用年月日
	 *		 	料金項目出力名称適用開始年月日
	 *		 	料金項目出力名称適用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_M_PRC_KMK_OPUT_NM_AC_SELECT_006(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_CH_M_PRC_KMK_OPUT_NM.selectBySqlDefine(paramList, CH_M_PRC_KMK_OPUT_NM_AC_SELECT_006);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**▼▼▼▼▼▼メソッド追加 開始▼▼▼▼▼▼*/
	
	/**
	 * 機器サービス名称マップを作成します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeKkNmMap() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeKkNmMap]");
		
		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();
		
		whereParam.setValue(JACStrConst.PRC_KMK_NM_SBT_CD_JGSYA_KMK_NM);	// 料金項目種別コード
		whereParam.setValue(super.opeDate);									// バッチ運用日
		whereParam.setValue(super.opeDate);									// バッチ運用日
		whereParam.setValue(super.opeDate);									// バッチ運用日
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeKkNmMap][whereParam=" + whereParam.getList().toString() + "]");
		
		// 料金出力名称スキーマを検索します。
		executeCH_M_PRC_KMK_OPUT_NM_AC_SELECT_006(whereParam.getList().toArray());
		
		JBSbatCommonDBInterface dbMap = db_CH_M_PRC_KMK_OPUT_NM.selectNext();
		
		// 取得できなかった場合
		if(null == dbMap)
		{
			// 該当データなし
			String[] msgParam = new String[]
			{ JBSbatCH_M_PRC_KMK_OPUT_NM.TABLE_NAME, whereParam.getList().toString() };
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0240CW, msgParam);
		}
		
		this.kkNmMap = new HashMap<String, String>();
		
		while(null != dbMap)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeKkNmMap][dbMap=" + dbMap.getMap().toString() + "]");
			
			// 値をマップに設定（KEY:料金項目コード、VALUE:料金項目名称）
			this.kkNmMap.put(dbMap.getString(JBSbatCH_M_PRC_KMK_OPUT_NM.PRC_KMK_CD),	dbMap.getString(JBSbatCH_M_PRC_KMK_OPUT_NM.PRC_KMK_NM));
			
			dbMap = db_CH_M_PRC_KMK_OPUT_NM.selectNext();
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeKkNmMap]");
	}
	
	/**
	 * 請求年月を取得します。
	 * 
	 * @return String 請求年月
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private String getSikyYm() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getSikyYm]");
		
		String sikyYm = JACStrConst.KARA_MOJI;
		
		JACbatSchdlUtil su = new JACbatSchdlUtil(commonItem);
		try
		{
			// 請求年月取得
			sikyYm = su.getBillDate(super.opeDate, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getSikyYm][sikyYm=" + sikyYm + "]");
		}
		finally
		{
			su.close();
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getSikyYm]");
		return sikyYm;
	}
	
	/**
	 * 出力情報設定キーリストを作成します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeOutputKeyList() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputKeyList]");
		
		this.outputKeyList = new ArrayList<String>(10);
		
		this.outputKeyList.add(JBSbatACIFM112.SVC_KEI_NO);			// サービス契約番号
		this.outputKeyList.add(JBSbatACIFM112.SEIKY_KEI_NO);		// 請求契約番号
		this.outputKeyList.add(JBSbatACIFM112.KKTSV_CD);			// 機器提供サービスコード
		this.outputKeyList.add(JBSbatACIFM112.KK_SVC_NM);			// 機器サービス名称
		this.outputKeyList.add(JBSbatACIFM112.CHRG_STA_YMD);		// 課金開始日
		this.outputKeyList.add(JBSbatACIFM112.DSL_KISAN_YMD);		// 解約起算日
		this.outputKeyList.add(JBSbatACIFM112.STB_PRC);				// ＳＴＢ料金
		this.outputKeyList.add(JBSbatACIFM112.STB_PRC_GENGAKU_CP);	// ＳＴＢ料金減額（ＣＰ）
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputKeyList][outputKeyList=" + this.outputKeyList.toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputKeyList]");
	}
	
	/**
	 * ヘッダ情報を作成します。
	 * 
	 * @param inMap 入力電文
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeHedderInf(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeHedderInf]");
		
		// 出力情報が存在していない場合
		if(null == this.tmpOutputInf)
		{
			// 出力情報生成
			this.tmpOutputInf = new HashMap<String, Object>();
		}
		
		// 横位置
		int sidePosition = Integer.parseInt(inMap.getString(JBSbatACIFM118.SIDE_POSITION));
		
		// 横位置　≦　退避．出力情報設定キーリストのサイズ　かつ　横位置　＞　0の場合
		if(sidePosition <= this.outputKeyList.size() && sidePosition > 0)
		{
			// 出力情報に値を設定するかを判定し、その結果をもとに値を設定します。
			// 引数：出力情報キーリスト．Value, 入力．出力項目, 入力．項目編集コード
			this.putOutputInf(this.outputKeyList.get(sidePosition - 1), inMap.getString(JBSbatACIFM118.OUTPUT_KMK), inMap.getString(JBSbatACIFM118.KMK_HENSHU_SKBT_CD));
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeHedderInf]");
	}
	
	/**
	 * ファイルを出力します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void outputRecord() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][outputRecord]");
		
		// ファイル出力を行う
		JCCBatCommon.printBusinessFileUtil(this.outFileObj, this.chgMapToList());
		
		this.outputCnt++;		// 出力件数カウントアップ
		
		this.tmpOutputInf.clear();		// 出力情報クリア
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][outputRecord]");
	}
	
	/**
	 * マップをリストに詰め替えます。
	 * 
	 * @return ArrayList<Object> 出力情報（リスト）
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private ArrayList<Object> chgMapToList() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][chgMapToList]");
		
		ArrayList<Object> outList = new ArrayList<Object>(25);
		
		int size = this.outputKeyList.size();
		
		for(int i = 0; i < size; i++)
		{
			// 出力情報キーリスト．VALUEが出力情報のキーに含まれる場合
			if(this.tmpOutputInf.containsKey(this.outputKeyList.get(i)))
			{
				Object value = this.tmpOutputInf.get(this.outputKeyList.get(i));
				
				// 出力情報の値がnullの場合
				if(value == null)
				{
					outList.add(JACStrConst.KARA_MOJI);		// 空文字
				}
				// 上記以外の場合
				else
				{
					outList.add(value);						// 取得した値
				}
			}
			else
			{
				outList.add(JACStrConst.KARA_MOJI);		// 空文字
			}
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][chgMapToList][outList=" + outList.toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][chgMapToList]");
		return outList;
	}
	
	/**
	 * 機器提供サービススキーマを検索します。
	 * 
	 * @param inMap 入力電文
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void selectKktkSvcKei(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][selectKktkSvcKei]");
		
		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();
		
		whereParam.setValue(inMap.getString(JBSbatACIFM118.SVKEI_NO));			// サービス契約番号
		whereParam.setValue(inMap.getString(JBSbatACIFM118.PCRS_CD));			// 料金コースコード
		whereParam.setValue(inMap.getString(JBSbatACIFM118.PRC_SVC_CD));		// 料金サービスコード
		whereParam.setValue(super.opeDate);										// バッチ運用日
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][selectKktkSvcKei][whereParam=" + whereParam.getList().toString() + "]");
		
		// 機器提供サービススキーマを検索します。
		executeKK_T_KKTK_SVC_KEI_AC_SELECT_002(whereParam.getList().toArray());
		
		JBSbatCommonDBInterface dbMap = db_KK_T_KKTK_SVC_KEI.selectNext();
		
		// 退避情報クリア
		this.kkSvcCd = JACStrConst.KARA_MOJI;
		this.tmpSvcChrgStaYmd = JACStrConst.KARA_MOJI;
		this.tmpSvcChrgEndYmd = JACStrConst.KARA_MOJI;
		
		// 取得できなかった場合
		if(null == dbMap)
		{
			// 該当データなし
			String[] msgParam = new String[]
			{ JBSbatKK_T_KKTK_SVC_KEI.TABLE_NAME, whereParam.getList().toString() };
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0240CW, msgParam);
		}
		// 上記以外の場合
		else
		{
			// 機器サービスコード　更新
			this.kkSvcCd = dbMap.getString(JBSbatKK_T_KKTK_SVC_KEI.KKTK_SVC_CD);
			// サービス課金開始日　更新
			this.tmpSvcChrgStaYmd = dbMap.getString(JBSbatKK_T_KKTK_SVC_KEI.SVC_CHRG_STAYMD);
			// サービス課金終了日　更新
			this.tmpSvcChrgEndYmd = dbMap.getString(JBSbatKK_T_KKTK_SVC_KEI.SVC_CHRG_ENDYMD);
		}
		
		assert this.kkSvcCd != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[[E][selectKktkSvcKei][kkSvcCd=" + this.kkSvcCd + "]") : true;
		assert this.tmpSvcChrgStaYmd != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][selectKktkSvcKei][tmpSvcChrgStaYmd=" + this.tmpSvcChrgStaYmd + "]") : true;
		assert this.tmpSvcChrgEndYmd != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][selectKktkSvcKei][tmpSvcChrgEndYmd=" + this.tmpSvcChrgEndYmd + "]") : true;
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][selectKktkSvcKei]");
	}
	
	/**
	 * 明細情報を作成します。
	 * 
	 * @param inMap  入力電文
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeDtlInf(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeDtlInf]");
		
		// 出力情報が存在していない場合
		if(null == this.tmpOutputInf)
		{
			// 出力情報生成
			this.tmpOutputInf = new HashMap<String, Object>();
		}
		
		// 横位置
		int sidePosition = Integer.parseInt(inMap.getString(JBSbatACIFM118.SIDE_POSITION));
		
		String kmkHnsySkbtCd = inMap.getString(JBSbatACIFM118.KMK_HENSHU_SKBT_CD);		// 項目編集コード
		String ssnKmkCd = inMap.getString(JBSbatACIFM118.SSN_KMK_CD);					// 精算項目コード
		
		// 横位置　＝　1　または　横位置　＝　2　の場合
		if(sidePosition == 1 || sidePosition == 2)
		{
			String putKey = this.outputKeyList.get(sidePosition - 1);		// 出力情報設定キー
			
			// 退避．出力情報．KEYに出力情報設定キーが含まれない場合
			if(!this.tmpOutputInf.containsKey(putKey))
			{
				// 出力情報に値を設定するかを判定し、その結果をもとに値を設定します。
				// 引数：出力情報キーリスト．Value, 入力情報．出力項目, 入力．項目編集コード
				this.putOutputInf(putKey, inMap.getString(JBSbatACIFM118.OUTPUT_KMK), kmkHnsySkbtCd);
			}
		}
		
		// 出力情報に値を設定するかを判定し、その結果をもとに値を設定します。
		
		// 引数：機器提供サービスコード, 退避．機器提供サービスコード, 入力．項目編集コード
		this.putOutputInf(JBSbatACIFM112.KKTSV_CD, this.kkSvcCd, kmkHnsySkbtCd);
		
		// 機器サービス名称マップ．KEYに入力．精算項目コードが含まれている場合
		if(this.kkNmMap.containsKey(ssnKmkCd))
		{
			// 引数：機器提供サービス名称, 退避．機器サービス名称マップ．KEY, 入力．項目編集コード
			this.putOutputInf(JBSbatACIFM112.KK_SVC_NM, this.kkNmMap.get(ssnKmkCd), kmkHnsySkbtCd);
		}
		// 引数：課金開始日, 退避．サービス課金開始日, 入力．項目編集コード
		this.putOutputInf(JBSbatACIFM112.CHRG_STA_YMD, this.tmpSvcChrgStaYmd, kmkHnsySkbtCd);
		// 引数：解約起算日, 退避．サービス課金終了日, 入力．項目編集コード
		this.putOutputInf(JBSbatACIFM112.DSL_KISAN_YMD, this.tmpSvcChrgEndYmd, kmkHnsySkbtCd);
		
		// 精算項目コード　≠　null　かつ　精算項目コードの長さ　≧　2の場合
		if(null != ssnKmkCd && ssnKmkCd.length() >= 2)
		{
			String ssnkmkSkbt = ssnKmkCd.substring(ssnKmkCd.length() - 2);	// 精算項目コードの下二桁
			
			// 精算項目コードの下二桁　＝　"01"（料金）の場合
			if(ssnkmkSkbt.equals(STB_USE_PRC))
			{
				// 引数：ＳＴＢ料金, 入力．出力値, 入力．項目編集コード
				this.putOutputInf(JBSbatACIFM112.STB_PRC, inMap.getString(JBSbatACIFM118.OUTPUT_KMK), kmkHnsySkbtCd);
			}
			// 精算項目コードの下二桁　＝　"15"（減額）
			else if(ssnkmkSkbt.equals(STB_USE_GEN_PRC))
			{
				// 引数：ＳＴＢ料金減額（ＣＰ）, 入力．出力値, 入力．項目編集コード
				this.putOutputInf(JBSbatACIFM112.STB_PRC_GENGAKU_CP, inMap.getString(JBSbatACIFM118.OUTPUT_KMK), kmkHnsySkbtCd);
			}
		}
		
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeDtlInf][tmpOutputInf=" + tmpOutputInf.toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeDtlInf]");
	}
	
	/**
	 * 対象キーと設定値を基に退避．出力情報に設定するかどうかの判定を行い、その結果をもとに値を設定します。
	 * 
	 * @param setKey 設定キー
	 * @param setValue 設定値
	 * @param kmkHnsySkbtCd 項目編集識別コード（0:編集なし、1:カンマ区切り）
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void putOutputInf(String setKey, String setValue, String kmkHnsySkbtCd) throws Exception
	{
		// 退避．出力情報．KEYに設定キーが含まれない場合
		if(!this.tmpOutputInf.containsKey(setKey))
		{
			// 設定値　≠　null　かつ　設定値　≠　""（空文字）
			if(null != setValue && !JACStrConst.KARA_MOJI.equals(setValue))
			{
				// 退避．出力情報に値を設定
				this.tmpOutputInf.put(setKey, this.chgKgrMoji(setValue, kmkHnsySkbtCd));
			}
		}
	}
	
	/**
	 * 項目編集識別コードを基にカンマ区切りを行うか判定し、その結果を返します。
	 * 
	 * @param trgStr 対象文字
	 * @param kmkHnsySkbtCd 項目編集識別コード（0:編集なし、1:カンマ区切り）
	 * @return String 対象文字　または　対象文字をカンマ区切りした文字
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private String chgKgrMoji(String trgStr, String kmkHnsySkbtCd) throws Exception
	{
		String rtnStr = trgStr;
		
		// 入力．項目編集識別コード　＝　"1"（数値桁区切り）の場合
		if(JACStrConst.KMK_HENSHU_SKBT_CD_DIGIT.equals(kmkHnsySkbtCd))
		{
			// カンマ区切りを行う
			rtnStr = JPCFomatString.formatNumber(trgStr);
		}
		return rtnStr;
	}
	
	/**
	 * 入力電文を基にキーを作成します。
	 * 
	 * @param inMap 入力電文
	 * @return String キー
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private String makeWkKey(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		StringBuffer bufKey = new StringBuffer();
		
		bufKey.append(inMap.get(JBSbatACIFM118.SVKEI_NO));			// サービス契約番号
		bufKey.append(inMap.get(JBSbatACIFM118.PCRS_CD));			// 料金コースコード 
		bufKey.append(inMap.get(JBSbatACIFM118.LENGTH_POSITION));	// 縦位置
		bufKey.append(inMap.get(JBSbatACIFM118.SSN_KMK_CD));		// 精算項目コード
		
		return bufKey.toString();
	}
	
	/**
	 * 入力電文を基に検索キーを作成します。
	 * 
	 * @param inMap 入力電文
	 * @return String キー
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private String makeSelectKey(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		StringBuffer bufKey = new StringBuffer();
		
		bufKey.append(inMap.get(JBSbatACIFM118.SVKEI_NO));		// サービス契約番号
		bufKey.append(inMap.get(JBSbatACIFM118.PCRS_CD));		// 料金コースコード
		bufKey.append(inMap.get(JBSbatACIFM118.PRC_SVC_CD));	// 料金サービスコード
		
		return bufKey.toString();
	}
	
	/**▲▲▲▲▲▲メソッド追加 終了▲▲▲▲▲▲*/
}
