/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCNSbcdRkkmcdChk
*	ソースファイル名	：JBSbatCNSbcdRkkmcdChk.java
*	作成者				：富士通　
*	作成日				：2011年08月12日
*＜機能概要＞
*　サービスコード・料金項目コードチェック処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/08/12   富士通		新規作成
*	v4.00.00	2013/02/21	FJ)木村		【TAI-2012-0000142】料金項目コード不正時のエラーメッセージ見直し
*	v8.00.00	2014/01/10	FJ)鄭		【ANK-1585-00-00】050電話番号付与処理を追加
*********************************************************************/
package eo.business.service;

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.common.constant.JCNStrConst;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.util.JBSbatStringUtil;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.file.JBSbatInputFileUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCNSbcdRkkmcdChk extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** メッセージキー(ECNB0030KE)*/
	private static final String ECNB0350KE = "ECNB0350KE";
	
	/** メッセージキー(ECNB0150KE)*/
	private static final String ECNB0150KE = "ECNB0150KE";
	
	/** メッセージキー(ECNB0170KE)*/
	private static final String ECNB0170AI = "ECNB0170AI";
	
	/** メッセージキー(ECNB0230KE)*/
	private static final String ECNB0230KE = "ECNB0230KE";
	
	/** メッセージキー(ECNB090AI)*/
	private static final String ECNB0390AI = "ECNB0390AI";
	
	/** メッセージキー(ECNB090AI)*/
	private static final String ECNB0400AI = "ECNB0400AI";
	
	/** 機能名(サービスコード・料金項目コードチェック処理) */
	private static final String S_CN_FUNC_NM = "料金項目コードチェック処理";
	
	/** コード名称*/
	private static final String S_PRC_SVC_CD = "料金項目コード";
	
	/** INPUTファイル名*/
	private static String strInFileNm = "";
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		// パラメータ読み出し
		String strFreeParam = commonItem.getFreeItem();
		// パラメータを区切り文字で分割する
		String[] lines = strFreeParam.split(JCNStrConst.S_PARAM_DELIM);
		if(lines.length != 1 || "".equals(lines[0]))
		{
			throw new JBSbatBusinessException(ECNB0230KE);
		}
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// パラメータ読み出し
		String strFreeParam = commonItem.getFreeItem();
		// パラメータを区切り文字で分割する
		String[] lines = strFreeParam.split(JCNStrConst.S_PARAM_DELIM);
		
		String strFreeParam1 = lines[0];	// 050電話番号付与済みISP課金ファイル
		strInFileNm = lines[0];				// ファイル名称を格納
		
		try
		{
			// 050電話番号付与済みISP課金ファイル読み込み
			ArrayList<String> ispList = new ArrayList<String>();
			ispList = readFile(strFreeParam1);
			
			String sContSvcCd = "";	// コンテンツサービスコード
			String sTaxarea = "";	// 税区分
			int iReadRecCnt = 0;	// ファイル読み込み件数
			int iTrueRecCnt = 0;	// 読み込み正常件数
			int iErrRecCnt = 0;		// エラーカウント件数
			ArrayList<String> lstErrorContCdList = new ArrayList<String>();	// 料金項目コードが取得出来なかったコンテンツコードのリスト
			
			for(int i = 0; i < ispList.size(); i++)
			{
				// ファイルレコードを区切り文字で分割する
				String[] strRec = ispList.get(i).split(JCNStrConst.S_SEP_CAM);
				// 1項目目がNULLもしくはNO_DATAの場合は処理結果0件としてループを抜ける。
				if(iReadRecCnt == 0)
				{
					if(strRec.length == 0)
					{
						break;
					}
					if(strRec[0].equals(JCNStrConst.S_NO_DATA))
					{
						break;
					}
				}
				
				// 前処理で読み込んだコンテンツサービスコードと税区分が等しい場合は処理を飛ばす。
				if(!sContSvcCd.equals(strRec[2]) | !sTaxarea.equals(strRec[3]))
				{
					// 料金項目コードが空白の場合はエラー件数をカウントする
					if("".equals(strRec[4].trim()))
					{
						lstErrorContCdList.add(strRec[2]);
						iErrRecCnt++;
					}
					else
					{
						iTrueRecCnt++;
					}
				}
				
				sContSvcCd = strRec[2];	// 読み込んだレコードのコンテンツサービスコードを取得
				sTaxarea = strRec[3];	// 読み込んだレコードの税区分を取得
				
				iReadRecCnt++;			// 読み込み件数カウント
			}
			
			// 処理結果ログ出力
			super.logPrint.printBusinessErrorLog(ECNB0170AI, new String[]{strInFileNm, String.valueOf(iReadRecCnt)});		// ファイル読み込み件数
			super.logPrint.printBusinessErrorLog(ECNB0390AI, new String[]{strInFileNm, String.valueOf(iTrueRecCnt)});		// ファイル読み込み正常件数
			super.logPrint.printBusinessErrorLog(ECNB0400AI, new String[]{strInFileNm, String.valueOf(iErrRecCnt)});		// ファイル読み込み異常件数
			
			if(iErrRecCnt > 0)
			{
				String strContCdCheckError = strInFileNm + " コンテンツサービスコード=" + JBSbatStringUtil.convListToString(lstErrorContCdList);
				super.logPrint.printBusinessErrorLog(ECNB0350KE, new String[] {strContCdCheckError, S_PRC_SVC_CD});
				throw new JBSbatBusinessException(ECNB0350KE, new String[] {strContCdCheckError, S_PRC_SVC_CD});
			}
			
			return null;
		}
		catch(SQLException se)
		{
			throw new JBSbatBusinessException(ECNB0150KE);
		}
		
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * ファイル読み込み処理を行います。<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();
		}
	}
	
}

