/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCNSvcKeiDataOutput
*	ソースファイル名	：JBSbatCNSvcKeiDataOutput.java
*	作成者				：富士通　
*	作成日				：2013年07月05日
*＜機能概要＞
*　サービス契約テーブル情報抽出処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2013/07/05   富士通		新規作成
*********************************************************************/
package eo.business.service;

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JCNBatCommon;
import eo.common.constant.JCNStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.util.JBSbatBusinessFileUtil;
import eo.framework.util.JBSbatCheckUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCNSvcKeiDataOutput extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(コード名称管理)*/
	private static final String D_TBL_NAME_ZM_M_CD_NM_KANRI = "ZM_M_CD_NM_KANRI";

	/** SQL定義キー(CN_SELECT_007)*/
	private static final String ZM_M_CD_NM_KANRI_CN_SELECT_007 = "CN_SELECT_007";

	/** SQL定義キー(CN_SELECT_008)*/
	private static final String ZM_M_CD_NM_KANRI_CN_SELECT_008 = "CN_SELECT_008";

	/** テーブルアクセスクラス(コード名称管理)*/
	private JBSbatSQLAccess db_ZM_M_CD_NM_KANRI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** メッセージキー*/
	private static final String ECNB0090AI = JPCBatchMessageConstant.ECNB0090AI;
	
	private static final String ECNB0230KE = JPCBatchMessageConstant.ECNB0230KE;
	
	/**
	 * 初期処理
	 * @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);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// パラメータ読み出し
		String strFreeParam = commonItem.getFreeItem();
		
		// パラメータを区切り文字で分割する
		String[] lines = strFreeParam.split(JCNStrConst.S_PARAM_DELIM);
		if(lines.length != 2)
		{
			throw new JBSbatBusinessException(ECNB0230KE);
		}
		// パラメータ取得
		String strFreeParam1 = lines[0];	// サービス契約スキーマ情報ファイル
		String strFreeParam2 = lines[1];	// サービス契約スキーマ情報ファイル(表示順込み)
		
		// コード名称管理よりコードのデータ件数を取得
		JBSbatCommonDBInterface map1 = new JBSbatCommonDBInterface(); 
		JBSbatCommonDBInterface dbList1 = new JBSbatCommonDBInterface();

		int iCdCount = 0;
		dbList1.setValue(JCNStrConst.S_CD01201);
		executeZM_M_CD_NM_KANRI_CN_SELECT_008(dbList1.getList().toArray());
		for(map1 = db_ZM_M_CD_NM_KANRI.selectNext(); null != map1; map1 = db_ZM_M_CD_NM_KANRI.selectNext())
		{
			iCdCount = Integer.parseInt(map1.getString("COUNT"));
		}
		
		// 取得した件数を元に格納配列を作成
		String[] strCdDivList = new String[iCdCount];
		String[] strCdDspJun = new String[iCdCount];
		int iCdDivcnt = 0;			// コード区分格納配列のアドレスカウント用変数
		int iCdJuncnt = 0;			// コード表示順配列のアドレスカウント用変数
		
		// サービス契約スキーマ情報ファイル(表示順込み)生成
		JBSbatBusinessFileUtil obj1 = JCCBatCommon.createBusinessFileUtil(strFreeParam2, JCNStrConst.SJIS, 
				JCNStrConst.S_LINE_SEPARAOR_LF, JCNStrConst.S_SEP_CAM);
		
		// コード名称管理よりデータを取得
		JBSbatCommonDBInterface map2 = new JBSbatCommonDBInterface(); 
		JBSbatCommonDBInterface dbList2 = new JBSbatCommonDBInterface();
		dbList2.setValue(JCNStrConst.S_CD01201);
		executeZM_M_CD_NM_KANRI_CN_SELECT_007(dbList2.getList().toArray());
		for(map2 = db_ZM_M_CD_NM_KANRI.selectNext(); null != map2; map2 = db_ZM_M_CD_NM_KANRI.selectNext())
		{
			strCdDivList[iCdDivcnt] = map2.getString("CD_DIV");
			strCdDspJun[iCdJuncnt] = map2.getString("DSP_JUN");
			iCdDivcnt++;
			iCdJuncnt++;
		}
		
		try
		{
			int iDataOutCnt = 0;		// データの読込み件数
			
			// サービス契約スキーマ情報ファイル
			ArrayList<String> svcKeiList = new ArrayList<String>();
			svcKeiList = readFile(strFreeParam1);
			
			String strDspJun = "";
			
			for(int i = 0; i < svcKeiList.size(); i++)
			{
				// レコードを取得し、区切り文字で分割する
				String[] strSvcKeiData = svcKeiList.get(i).split(JCNStrConst.S_SEP_CAM);
				
				// 各レコードに存在する料金グループコードに対してコード名称管理の表示順とマッチングを実施
				// コード名称管理の取得件数分ループを行う
				for(int i1 = 0; i1 < iCdCount; i1++)
				{
					// 比較用に""を付与する
//					String strCdDiv = JCNStrConst.S_SEP_DQ + strCdDivList[i1] + JCNStrConst.S_SEP_DQ;
					if(strCdDivList[i1].equals(strSvcKeiData[6]))
					{
						// ""で括りデータを格納する
//						strDspJun = JCNStrConst.S_SEP_DQ + strCdDspJun[i1] + JCNStrConst.S_SEP_DQ;
						strDspJun = strCdDspJun[i1];
						
						// 表示順が取得できればループを抜ける
						break;
					}
				}
				
				// 取得した表示順を加え、ダブルコーテーション括りで新たにファイル出力する
				ArrayList<String> outFileList = new ArrayList<String>();
				outFileList.add(strSvcKeiData[1]);		// SYSID
				outFileList.add(strSvcKeiData[0]);		// サービス契約番号
//				outFileList.add(strSvcKeiData[2]);		// 予約適用年月日
//				outFileList.add(strSvcKeiData[3]);		// 世代登録年月日時分秒
//				outFileList.add(strSvcKeiData[4]);		// 予約適用コード
//				outFileList.add(strSvcKeiData[5]);		// サービス契約ステータス
//				outFileList.add(strSvcKeiData[6]);		// 料金グループコード
//				outFileList.add(strSvcKeiData[7]);		// 料金コースコード
				outFileList.add(strDspJun);				// 表示順
//				outFileList.add(strSvcKeiData[8]);		// 照査年月日
//				outFileList.add(strSvcKeiData[9]);		// サービス終了年月日
//				outFileList.add(strSvcKeiData[10]);		// 無効フラグ
				
				// ファイルを1レコード出力する
				JCNBatCommon.printBusinessFileUtil(obj1, outFileList);
				iDataOutCnt++;
			}
			
			// 処理結果ログ出力
			super.logPrint.printBusinessErrorLog(ECNB0090AI, new String[] {strFreeParam2, String.valueOf(iDataOutCnt)});
			
			return null;
		}
		catch(SQLException se)
		{
			throw se;
		}
		catch(IOException ie)
		{
			throw ie;
		}

	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_ZM_M_CD_NM_KANRI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(CN_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 executeZM_M_CD_NM_KANRI_CN_SELECT_007(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_ZM_M_CD_NM_KANRI.selectBySqlDefine(paramList, ZM_M_CD_NM_KANRI_CN_SELECT_007);
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(CN_SELECT_008)で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_CN_SELECT_008(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_ZM_M_CD_NM_KANRI.selectBySqlDefine(paramList, ZM_M_CD_NM_KANRI_CN_SELECT_008);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * ファイル読み込み処理を行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で読込ファイルディレクトリ(フルパス)を設定します。<br>
	 *
	 * 2.引数を元にファイル読込を行い、行をListへ格納します。<br>
	 * 
	 * </pre>
	 * <p>
	 * @param strFileDir    出力ディレクトリ(フルパス)。
	 * @return resultList   返却用List
	 * @throws Exception    業務サービス内で発生した例外全般。
	 */
	private static ArrayList<String> readFile(String strFileDir) throws Exception
	{
		ArrayList<String> resultList = new  ArrayList<String>();
		
		// 外部出力ファイルパス
		JBSbatInputFileUtil inFile = new JBSbatInputFileUtil(strFileDir);
		inFile.setEncode(JCNStrConst.SJIS);						// 文字コード
		inFile.setLine(JCNStrConst.S_LINE_SEPARAOR_LF);			// 改行コード
		inFile.createReader();
		
		try
		{
			while(true)
			{
				String line = inFile.readLine();
				if(line == null)
				{
					inFile.close();
					break;
				}
				resultList.add(line);
			}
			
			return resultList;
		}
		catch (IOException e)
		{
			throw e;
		}
		finally
		{
			inFile.close();
		}
	}
}
