/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom ,2011
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatZMFixIpAki
*	ソースファイル名	：JBSbatZMFixIpAki.java
*	作成者				：富士通　
*	作成日				：2011年07月12日
*＜機能概要＞
*　固定ＩＰ空き状況チェックリストファイル作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v2.00.00	2011/07/12  FJ) 岩元	新規作成
*	v4.00.00	2013/01/09  FJ）日野	【TAI-2012-0000141】バッチ異常終了時のメッセージについて【優先度特A】
*	v54.00.00	2021/08/12  GDC)オーヴィー	【ANK-4069-00-00】EOL対応(バッチ・DBサーバリプレース対応)
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatZMCsvFileSyori;
import eo.business.common.JZMBatCommon;
import eo.business.common.JZMBatConst;
import eo.business.util.table.JBSbatZM_M_CD_NM_KANRI;
import eo.business.util.table.JBSbatZM_M_WORK_PARAM_KNRI;
import eo.common.constant.JPCBatchMessageConstant;
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.util.JBSbatBusinessFileUtil;

/**
* 固定ＩＰ空き状況チェックリストファイル出力 <p>
*<BR>
* @author 富士通
*/
public class JBSbatZMFixIpAki extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(コード名称管理)*/
	private static final String D_TBL_NAME_ZM_M_CD_NM_KANRI = "ZM_M_CD_NM_KANRI";

	/** テーブル(業務パラメータ管理)*/
	private static final String D_TBL_NAME_ZM_M_WORK_PARAM_KNRI = "ZM_M_WORK_PARAM_KNRI";

	/** SQL定義キー(ZM_SELECT_001)*/
	private static final String ZM_M_CD_NM_KANRI_ZM_SELECT_001 = "ZM_SELECT_001";

	/** SQL定義キー(ZM_SELECT_001)*/
	private static final String ZM_M_WORK_PARAM_KNRI_ZM_SELECT_001 = "ZM_SELECT_001";

	/** テーブルアクセスクラス(コード名称管理)*/
	private JBSbatSQLAccess db_ZM_M_CD_NM_KANRI = null;

	/** テーブルアクセスクラス(業務パラメータ管理)*/
	private JBSbatSQLAccess db_ZM_M_WORK_PARAM_KNRI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/* ++++++++++ v1.0.0 追加開始 ++++++++++ */
	
	/** 固定ＩＰ取得種別コードキー(業務パラメータ)  */
	private static final String KOTEI_IP_STKU_SBT_CD = "ZM_FIX_IP_STKU_SBT_";
	
	/** コメント  */
	private static final String COMMENT = "固定ＩＰアドレスを至急追加してください。";
	
	/** 出力ファイル名の先頭文字 */
	private static final String OUTPUT_FILE_PREFIX = "ZML00301_";
	
	/** 割り当て固定IPアドレス */
	private static final String ADD_IP_FILE_NM = "ZMIFM001001.csv";
	
	/** 使用固定IPアドレス */
	private static final String USED_IP_FILE_NM = "ZMIFM002001.csv";
	
	/** システム日付 */
	private String sysDate = null;
	
	/** 割り当て固定ＩＰカウント情報リスト */
	private ArrayList<ArrayList<String>> addIpCntList = null;
	
	/** 使用固定ＩＰカウント情報リスト */
	private ArrayList<ArrayList<String>> useIpCntList = null;
	
	/** 出力ファイル制御クラス */
	private JBSbatBusinessFileUtil outputFile = null;
	
	/** 項目数カウント*/
	private int cnt = 0;
	
	/** 出力ファイルフルパス */
	private String fileFullPath = null;
	
	/** コード名称管理" */
	private String ZM_M_CD_NM_KANRI = "コード名称管理";
	
	/** メッセージ置換文字列　固定IP取得種別コード */
	private String MSG_KOTEI_IP_STKU_SBT_CD = "固定IP取得種別コード";
	
	/** メッセージ置換文字列　集約局・中心局コード */
	private String MSG_SHYAKK_CHUSKK_CD = "集約局・中心局コード";
	
	/* ++++++++++ v1.0.0 追加終了 ++++++++++ */

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_ZM_M_CD_NM_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_CD_NM_KANRI);
		db_ZM_M_WORK_PARAM_KNRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_WORK_PARAM_KNRI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		/* ++++++++++ v1.0.0 追加開始 ++++++++++ */
		
		// 処理日
		sysDate = commonItem.getOpeDate();
		
		// 中間ファイルパス
		String midDirPath = JZMBatCommon.getMidDir();
		
		// 割り当て固定IPカウントファイルパス
		String addIpCntPath = midDirPath + ADD_IP_FILE_NM;
		
		// 使用固定IPカウントファイルパス
		String useIpCntPath = midDirPath + USED_IP_FILE_NM;
		
		// 出力ファイルフルパス
		fileFullPath = getOutputPath();
		
		// ファイル出力制御クラス生成
		outputFile = JZMBatCommon.getBusinessFileUtil(fileFullPath);
		
		// 割り当て固定ＩＰカウント情報ファイルの読込
		addIpCntList = JBSbatZMCsvFileSyori.convCsvFiletoList(commonItem, addIpCntPath);
		
		// 使用固定ＩＰカウント情報ファイルの読込
		useIpCntList = JBSbatZMCsvFileSyori.convCsvFiletoList(commonItem, useIpCntPath);

		/* ++++++++++ v1.0.0 追加終了 ++++++++++ */
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		/* ++++++++++ v1.0.0 追加開始 ++++++++++ */
		
		for(int i = 0; i < addIpCntList.size(); i++)
		{
			
			// 集約局・中心局コード
			String shyakkChuskkCd = (String)addIpCntList.get(i).get(0);
			
			// 固定ＩＰ取得種別コード
			String koteiIpStkuSbtCd = (String)addIpCntList.get(i).get(1);
			
			// 固定ＩＰ取得種別コード名
			String koteiIpStkuSbtCdNm = null;
			
			// 割り当て固定ＩＰアドレス数
			String addIpCnt = nullToZero((String)addIpCntList.get(i).get(2));
			
			// 使用固定ＩＰアドレス数
			String useIpCnt = JZMBatConst.ZERO;
			
			// コメント
			String comment = JZMBatConst.BLANK;
			
			// 未使用件数
			int noUseCnt = 0;
			
			// 未使用件数最小保有数
			String noUseCntMin = JZMBatConst.BLANK;
			
			// 未使用件数最小保有数(比較用)
			String noUseCntMinHikaku = JZMBatConst.ZERO;
			
			// 割り当て固定IPカウント情報ファイルと使用固定IPカウント情報ファイルのマッチング
			for(int j = 0; j < useIpCntList.size(); j++)
			{
				if(shyakkChuskkCd.equals((String)useIpCntList.get(j).get(0)) && koteiIpStkuSbtCd.equals((String)useIpCntList.get(j).get(1)))
				{
					useIpCnt = nullToZero((String)useIpCntList.get(j).get(2));
					break;
				}	
			}
			
			// 未使用固定IPアドレス数を算出
			noUseCnt = Integer.parseInt(addIpCnt) - Integer.parseInt(useIpCnt);
			
			// 未使用件数最小保有数を取得
			executeZM_M_WORK_PARAM_KNRI_ZM_SELECT_001(new Object[] {KOTEI_IP_STKU_SBT_CD + koteiIpStkuSbtCd, sysDate, sysDate});
			
			// 結果を取得
			JBSbatCommonDBInterface selectedData =  db_ZM_M_WORK_PARAM_KNRI.selectNext();
			
			// 未使用件数最小保有数の設定
			if (selectedData != null)
			{
				noUseCntMin = selectedData.getString(JBSbatZM_M_WORK_PARAM_KNRI.WORK_PARAM_SETTE_VALUE);
			}
			
			// コメントの判定
			if(!isNullorBlank(noUseCntMin))
			{
				noUseCntMinHikaku = noUseCntMin;
			}
			if(noUseCnt < Integer.parseInt(noUseCntMinHikaku))
			{
				comment = COMMENT;
			}
			
			// 固定ＩＰ取得種別コード名取得
			executeZM_M_CD_NM_KANRI_ZM_SELECT_001(new Object[] {koteiIpStkuSbtCd, sysDate, sysDate});
			
			selectedData = db_ZM_M_CD_NM_KANRI.selectNext();
			
			if(selectedData == null)
			{
				StringBuffer sb = new StringBuffer();
				sb.append(MSG_KOTEI_IP_STKU_SBT_CD);
				sb.append(JZMBatConst.EQUAL);
				sb.append(koteiIpStkuSbtCd);
				sb.append(JZMBatConst.CONMA);
				sb.append(MSG_SHYAKK_CHUSKK_CD);
				sb.append(JZMBatConst.EQUAL);
				sb.append(shyakkChuskkCd);
				
				// DB存在チェックエラー
				throw new JBSbatBusinessException(JPCBatchMessageConstant.EZMB0270CW, 
						new String[]{ZM_M_CD_NM_KANRI, MSG_KOTEI_IP_STKU_SBT_CD, sb.toString()});
			}
			
			koteiIpStkuSbtCdNm = selectedData.getString(JBSbatZM_M_CD_NM_KANRI.CD_DIV_NM);
			
			// データ格納用List
			ArrayList<String> resultList = new ArrayList<String>();
			
			// 結果出力
			addResultList(resultList, shyakkChuskkCd);				// 集約局・中心局コード
			addResultList(resultList, koteiIpStkuSbtCdNm);			// 固定IP取得種別コード名
			addResultList(resultList, String.valueOf(noUseCnt));	// 未使用件数
			addResultList(resultList, noUseCntMin);					// 未使用件数最小保有数
			addResultList(resultList, comment);						// コメント
			JZMBatCommon.printBusinessFileUtil(outputFile, resultList);
			cnt++;
		}
		
		super.logPrint.printDebugLog("正常終了");
		return null;
		
		/* ++++++++++ v1.0.0 追加終了 ++++++++++ */

	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/* ++++++++++ v1.0.0 追加開始 ++++++++++ */
	
	/**
	 * nullでないかどうかを判定します。
	 * @param value 対象値
	 * @return 判定値
	 */
	private boolean isNullorBlank(String value)
	{
		if(value == null || JZMBatConst.BLANK.equals(value))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * nullまたはブランクの場合0を返します。
	 * @param value 対象値
	 * @return 返却値
	 */
	private String nullToZero(String value)
	{
		if(isNullorBlank(value))
		{
			return JZMBatConst.ZERO;
		}
		return value;
	}
	
	
	/**
	 * 結果リストに値を追加します。
	 * @param list 結果リスト
	 * @param value 値
	 * @throws Exception
	 */
	private void addResultList(ArrayList<String> list, String value)
	{
		list.add(JZMBatCommon.addDoubleQuot(value));
	}
	
	/**
	 * 出力ファイルパスを取得します。
	 * @return 出力ファイルパス
	 * @throws JBSbatBusinessException
	 */
	private String getOutputPath() throws JBSbatBusinessException
	{
		StringBuilder sb = new StringBuilder();
		sb.append(JZMBatCommon.getGaibuSendDir(JZMBatConst.ZMIFE008_DIR));
		sb.append(OUTPUT_FILE_PREFIX);
		sb.append(JZMBatCommon.getSysDateTime());
		return sb.toString();
	}

	/* ++++++++++ v1.0.0 追加終了 ++++++++++ */
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_ZM_M_CD_NM_KANRI.close();
		db_ZM_M_WORK_PARAM_KNRI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
		

		/* ++++++++++ v1.0.0 追加開始 ++++++++++ */
		
		JZMBatCommon.closeBusinessFileUtil(outputFile);
		
		String fileFullPathCnt = fileFullPath + JZMBatConst.CNT;
		// 件数ファイルの作成
		JZMBatCommon.printDoubleQuoteCntFile(fileFullPathCnt, cnt);
		String fileFullPathFlg = fileFullPath + JZMBatConst.FLG;
		// フラグファイルの作成
		JZMBatCommon.printDoubleQuoteFlgFile(fileFullPathFlg);
		// ANK-4069-00-00 DEL START
		//ArrayList<String> sendList = new ArrayList<String>();
		//sendList.add(fileFullPath);
		//sendList.add(fileFullPathCnt);
		//sendList.add(fileFullPathFlg);
		//JZMBatCommon.putFTPGaibu(commonItem, sendList, JZMBatConst.ZMIFE008);
		// ANK-4069-00-00 DEL END

		/* ++++++++++ v1.0.0 追加終了 ++++++++++ */
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * SQLKEY(ZM_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 executeZM_M_CD_NM_KANRI_ZM_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_ZM_M_CD_NM_KANRI.selectBySqlDefine(paramList, ZM_M_CD_NM_KANRI_ZM_SELECT_001);
	}

	/**
	 * SQLKEY(ZM_SELECT_001)で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 executeZM_M_WORK_PARAM_KNRI_ZM_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_ZM_M_WORK_PARAM_KNRI.selectBySqlDefine(paramList, ZM_M_WORK_PARAM_KNRI_ZM_SELECT_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲  */
	
}
