/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatWCChkSelectSndInfGet
*	ソースファイル名	：JBSbatWCChkSelectSndInfGet.java
*	作成者				：富士通　
*	作成日				：2012年02月28日
*＜機能概要＞
*　チェック＿セレクト送信＿情報取得部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/02/28   富士通		新規作成
*	v3.00.00	2012/05/01	FJ)大山		【ANK-0315-00-00】宅内対応を実施
*	v3.01.00	2012/08/31	FJ)大山		【TAI-2012-0000094】JBSbatSQLAccessのinitial化対応
*	v3.01.01	2012/12/10	FJ)水谷		【TAI-2012-0000138】対応を実施
 *	v54.00.00	2021/09/01	FJ)星野		 ANK-4069-00-00_バッチ・DBサーバーリプレース対応
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JCCbatShoriIraiUtil;
import eo.business.common.JWCBatCommon;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.constant.JWCStrConst;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.log.JBSbatLogPrintControl;
import eo.framework.db.JBSbatSQLAccess;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatWCChkSelectSndInfGet extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(視聴制御ディレイド処理結果機器確認)*/
	private static final String D_TBL_NAME_WC_T_WC_DTR_KIKI_CFM = "WC_T_WC_DTR_KIKI_CFM";

	/** テーブル(視聴制御ＨＵＬＦＴ送信実績)*/
	private static final String D_TBL_NAME_WC_T_WC_HULFT_SDJSK = "WC_T_WC_HULFT_SDJSK";

	/** SQL定義キー(WC_SELECT_001)*/
	private static final String WC_T_WC_DTR_KIKI_CFM_WC_SELECT_001 = "WC_SELECT_001";

	/** SQL定義キー(WC_DELETE_001)*/
	private static final String WC_T_WC_DTR_KIKI_CFM_WC_DELETE_001 = "WC_DELETE_001";

	/** SQL定義キー(WC_INSERT_001)*/
	private static final String WC_T_WC_HULFT_SDJSK_WC_INSERT_001 = "WC_INSERT_001";

	/** テーブルアクセスクラス(視聴制御ディレイド処理結果機器確認)*/
	private JBSbatSQLAccess db_WC_T_WC_DTR_KIKI_CFM = null;

	/** テーブルアクセスクラス(視聴制御ＨＵＬＦＴ送信実績)*/
	private JBSbatSQLAccess db_WC_T_WC_HULFT_SDJSK = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** ファイル行数最大件数 **/
	private int maxSize = 2000;

	/** ＳＴＢＩＤ（システムエラー **/
	private static final String ERR_STBID = "";

	/**
	 * ファイル出力件数
	 */
	private int outputCount = 0;
	
	/**
	 * ファイル出力ストリーム
	 */
	private JBSbatOutputItem  outputBean = new JBSbatOutputItem();

	/**
	 * 電子ファイル管理番号
	 */
	private String chohyoTeigiNo = "";

	/**
	 * ディレイド処理依頼番号
	 */
	private String delayedno = "";
	
	/**
	 * 出力ファイル名
	 */
	private String str_outputFile = "";
	
	/**
	 * 入力ファイル名
	 */
	private String str_inputFile = "";

	/**
	 * エラーステータス
	 */
	private String errStatus = "";
	

	/**
	 * 処理名称
	 */
	private String shoriName = "";
	

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EWCB0010AI, 
				new String[]{"チェック＿セレクト送信＿情報取得"});
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_WC_T_WC_DTR_KIKI_CFM = new JBSbatSQLAccess(commonItem, D_TBL_NAME_WC_T_WC_DTR_KIKI_CFM);
		db_WC_T_WC_HULFT_SDJSK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_WC_T_WC_HULFT_SDJSK);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		String freeItem = commonItem.getFreeItem();
		String[] strArray = freeItem.split(JWCStrConst.FREE_PARAM_DELM);

		// 出力ファイル名をフリー項目から取得
		this.str_outputFile = strArray[0];
		
		this.logPrint.printDebugLog("*******************************************");
		this.logPrint.printDebugLog("出力ファイル名      =" + this.str_outputFile);
		this.maxSize = JWCBatCommon.getMaxDlydCount(commonItem);
		this.logPrint.printDebugLog("ディレイド最大処理件数 =" + this.maxSize);
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// ディレイド処理取得
		super.commonItem.getLogPrint().printDebugLog("ジョブＩＤ:" + super.jobid);
		ArrayList<HashMap<String, Object>>  delayedInfoList = JCCbatShoriIraiUtil.getShoriIraiInfo(commonItem, super.jobid);
		
		if(delayedInfoList == null) 
		{
			super.commonItem.getLogPrint().printDebugLog("処理依頼０件");
			return null;
		}
		else 
		{

			// ファイル行番号
			int lineno = 0;

			try 
			{
				// 処理名称取得
				shoriName = JWCBatCommon.getShoriNaiyo(commonItem, 0);

				HashMap<String, Object> delayedInfo = delayedInfoList.get(0);
				this.errStatus = "1";
				// エラーチェックフラグ（true)で処理ＯＫデータ存在
				boolean errChkFlg = false;
	
				this.chohyoTeigiNo = (String)delayedInfo.get("INPUT_EFILE_KANRI_NO");
				this.delayedno = (String)delayedInfo.get("DLYD_TRN_REQ_NO");
				this.str_inputFile = JCCBatCommon.searchDenshiFile(commonItem, chohyoTeigiNo);
	
				commonItem.getLogPrint().printDebugLog("ディレイド管理番号:" + delayedno);
				commonItem.getLogPrint().printDebugLog("入力ファイル:" + str_inputFile);
	
				// 視聴制御ディレイド処理結果機器確認テーブルの確認
				JWCBatCommon.chkDLRD_TRN_TBL(commonItem, delayedno, db_WC_T_WC_DTR_KIKI_CFM);

				// 処理名称取得
				shoriName = JWCBatCommon.getShoriNaiyo(commonItem, 1);

				// 電子ファイルの取得チェック
				if(this.str_inputFile != null && !"".equals(str_inputFile))
				{
					// CSVファイルの読み取り
					ArrayList<ArrayList<String>> teigiFileList = JWCBatCommon.readCSVFile(commonItem, str_inputFile, "");

					// ＣＳＶファイルの件数が２０００件を超えている場合には、エラーとする。
					if(teigiFileList.size() > this.maxSize) 
					{
						// エラー処理
						commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EWCB0400JE,new String[]{Integer.toString(this.maxSize)});
						this.errStatus = "2";
						String errNaiyo = JBSbatLogPrintControl.getMessage(JPCBatchMessageConstant.EWCB0400JE,new String[]{Integer.toString(this.maxSize)});

						// 視聴制御ディレイド処理結果機器確認テーブルの登録
						String[] dtr_kiki_cmf_param = JWCBatCommon.createWC_T_WC_DTR_KIKI_CFM_WC_INSERT_001Param(commonItem,delayedno, ERR_STBID, "", "", "",errNaiyo, "", "", "", "", "", "", "", "");
						JWCBatCommon.executeWC_T_WC_DTR_KIKI_CFM_WC_INSERT_001(commonItem, dtr_kiki_cmf_param, db_WC_T_WC_DTR_KIKI_CFM);

						return null;
					}
					else 
					{

						// 処理名称取得
						shoriName = JWCBatCommon.getShoriNaiyo(commonItem, 2);

						for(ArrayList<String> linedata :teigiFileList)
						{
							lineno++;
							// エラー内容
							String errNaiyo = "";
							// STB-ID
							String stb_id = "";
							// 機器製造番号
							String kikiseizo_no =  "";
							// CCASカードＩＤ
							String ccasid = "";
							// BCASカードＩＤ
							String bcasid = "";
							// 処理スキップフラグ
							boolean skipflg = false;
							// コマンドスキップフラグ
							boolean cmdskipflg = false;

							HashMap rsMap = new HashMap();

							if(linedata.size() == 1)
							{
								// STB-IDを取得
								stb_id = linedata.get(0);
							}
							
							commonItem.getLogPrint().printDebugLog("ＳＴＢＩＤ:" + stb_id);

							if(!"".equals(stb_id))
							{
								rsMap.put("STB_ID",stb_id);
							}

							// CSVファイルの形式チェック処理
							ArrayList<String>retList =  JWCBatCommon.isSingleCheckWCIFM021(commonItem, rsMap);

							if(retList.size() != 0) {
								// エラー処理
								this.errStatus = "2";
								errNaiyo = retList.get(0);
								skipflg = true;
							}

							if(!skipflg) 
							{
								// 出力ファイル設定メソッドを呼び出す。
								JBSbatServiceInterfaceMap outmap = JWCBatCommon.setJBSbatWCIFE006param(commonItem, this.outputCount + 1, "", "",stb_id);
								outmap.setOutFlg(true);

								outputBean.addOutMapList(outmap);

								this.outputCount++;
							}

							// 処理名称取得
							shoriName = JWCBatCommon.getShoriNaiyo(commonItem, 3);

							// 視聴制御ディレイド処理結果機器確認テーブルの登録
							String[] dtr_kiki_cmf_param = JWCBatCommon.createWC_T_WC_DTR_KIKI_CFM_WC_INSERT_001Param(commonItem,delayedno,stb_id,"","","",errNaiyo,"","","","","","","","");
							JWCBatCommon.executeWC_T_WC_DTR_KIKI_CFM_WC_INSERT_001(commonItem, dtr_kiki_cmf_param, db_WC_T_WC_DTR_KIKI_CFM);
						} // CSVファイル内部処理の繰り返し
					}
				}
				else 
				{
					// 処理名称取得
					shoriName = JWCBatCommon.getShoriNaiyo(commonItem, 3);

					this.outputCount = 0;
					this.outputBean = null;

					commonItem.getConnection().rollback();
					commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EWCB0390CE, new String[]{chohyoTeigiNo});
					this.errStatus = "3";
					String errNaiyo = JBSbatLogPrintControl.getMessage(JPCBatchMessageConstant.EWCB0390CE,new String[]{Integer.toString(this.maxSize)});

					// 視聴制御ディレイド処理結果機器確認テーブルの登録
					String[] dtr_kiki_cmf_param = JWCBatCommon.createWC_T_WC_DTR_KIKI_CFM_WC_INSERT_001Param(commonItem,delayedno,ERR_STBID,"","","",errNaiyo,"","","","","","","","");
					JWCBatCommon.executeWC_T_WC_DTR_KIKI_CFM_WC_INSERT_001(commonItem, dtr_kiki_cmf_param, db_WC_T_WC_DTR_KIKI_CFM);

					return null;
				}

			}
			catch(Exception e)
			{
				this.outputCount = 0;
				this.outputBean = null;

				commonItem.getConnection().rollback();

				commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EWCB0230CE, new String[]{shoriName});
				this.errStatus = "3";
				String errNaiyo = JBSbatLogPrintControl.getMessage(JPCBatchMessageConstant.EWCB0230CE, new String[]{shoriName});
				errNaiyo = errNaiyo + "(行番号：" + Integer.toString(lineno) + ")";

				// 視聴制御ディレイド処理結果機器確認テーブルの登録
				String[] dtr_kiki_cmf_param = JWCBatCommon.createWC_T_WC_DTR_KIKI_CFM_WC_INSERT_001Param(commonItem,delayedno,ERR_STBID,"","","",errNaiyo,"","","","","","","","");
				JWCBatCommon.executeWC_T_WC_DTR_KIKI_CFM_WC_INSERT_001(commonItem, dtr_kiki_cmf_param, db_WC_T_WC_DTR_KIKI_CFM);

				this.errStatus = "3";
				return null;
			}
		}

		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		try 
		{
			// 処理名称取得
			shoriName = JWCBatCommon.getShoriNaiyo(commonItem, 4);

			if(this.outputCount != 0) {
/**	
				// 視聴制御HULFT送信管理テーブルを登録する。
				String str_datetimestamp = JCCBatCommon.getSysDateTimeStamp();
		
				String str_seq_hulft_no = JBSbatOracleSeqUtil.getFormatedNextSeq(commonItem.getConnection() ,JWCStrConst.SEQ_WC_HULFT_SDJSK_NO , "",10);
				
				// HULFT送信実績の書き込みを行う。
				String[] paramList = new String[14];
				
				//視聴制御HULFT送信実績番号
				paramList[0] = str_seq_hulft_no;
				//HULFT送信年月日時分秒
				paramList[1] = JWCBatCommon.getTknFileTimeStamp(commonItem, this.str_outputFile) ;
				//送信ファイル名
				paramList[2] = this.str_outputFile;
				//連携ファイル名
				paramList[3] = this.str_inputFile;
				//継続処理ジョブＩＤ(チェック＿セレクト送信）
				paramList[4] = JWCStrConst.KEIZKJOB_EOC0C0210J0;
				//ディレイド処理依頼番号
				paramList[5] = "";
				//宅内機器情報抽出ファイル名
				paramList[6] = "";
				//登録年月日時分秒
				paramList[7] = str_datetimestamp;
				//登録オペレータアカウント
				paramList[8] = super.commonItem.getBatchUserId();
				//更新年月日時分秒
				paramList[9] = str_datetimestamp;
				//更新オペレータアカウント
				paramList[10] = super.commonItem.getBatchUserId();
				//削除年月日時分秒
				paramList[11] = "";
				//削除オペレータアカウント
				paramList[12] = "";
				//無効フラグ
				paramList[13] = "0";
**/				
				String[] paramList = JWCBatCommon.createWC_T_WC_HULFT_SDJSK_WC_INSERT_001(commonItem, JWCBatCommon.getTknFileTimeStamp(commonItem, this.str_outputFile), this.str_outputFile, this.str_inputFile, JWCStrConst.KEIZKJOB_EOC0C0210J0, this.delayedno, "");
				JWCBatCommon.executeWC_T_WC_HULFT_SDJSK_WC_INSERT_001(commonItem , paramList, db_WC_T_WC_HULFT_SDJSK);
	
				super.commonItem.getOutPutFile().close();
// ANK-4069-00-00対応 20210901 星野 DEL START
//				JWCBatCommon.putFtp(commonItem, this.str_outputFile, JWCStrConst.FILEID_WCIFE006, this.outputCount);
// ANK-4069-00-00対応 20210901 星野 DEL END
			}
			else
			{
				if(this.delayedno != null && !"".equals(this.delayedno))
				{
					// ディレイド処理結果を登録する。
					HashMap<String, String> map = JCCBatCommon.updateShoriIraiResult(commonItem, delayedno, errStatus, null);
				}
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
			this.outputCount = 0;
			this.outputBean = null;

			commonItem.getConnection().rollback();

			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EWCB0230CE, new String[]{shoriName});
			String errNaiyo = JBSbatLogPrintControl.getMessage(JPCBatchMessageConstant.EWCB0230CE, new String[]{shoriName});
			// 視聴制御ディレイド処理結果機器確認テーブルの登録
			String[] dtr_kiki_cmf_param = JWCBatCommon.createWC_T_WC_DTR_KIKI_CFM_WC_INSERT_001Param(commonItem,delayedno,ERR_STBID,"","","",errNaiyo,"","","","","","","","");
			JWCBatCommon.executeWC_T_WC_DTR_KIKI_CFM_WC_INSERT_001(commonItem, dtr_kiki_cmf_param, db_WC_T_WC_DTR_KIKI_CFM);

			this.errStatus = "3";

			// ディレイド処理結果を登録する。
			HashMap<String, String> map = JCCBatCommon.updateShoriIraiResult(commonItem, delayedno, errStatus, null);
			
		}

		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_WC_T_WC_DTR_KIKI_CFM.close();
		db_WC_T_WC_HULFT_SDJSK.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EWCB0020AI, 
				new String[]{"チェック＿セレクト送信＿情報取得"});
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}



	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(WC_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 executeWC_T_WC_DTR_KIKI_CFM_WC_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_WC_T_WC_DTR_KIKI_CFM.selectBySqlDefine(paramList, WC_T_WC_DTR_KIKI_CFM_WC_SELECT_001);
	}

	/**
	 * SQLKEY(WC_DELETE_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 executeWC_T_WC_DTR_KIKI_CFM_WC_DELETE_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_WC_T_WC_DTR_KIKI_CFM.executeBySqlDefine(paramList, WC_T_WC_DTR_KIKI_CFM_WC_DELETE_001);
	}

	/**
	 * SQLKEY(WC_INSERT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	視聴制御HULFT送信実績番号
	 *		 	HULFT_SEND_DTM
	 *		 	送信ファイル名
	 *		 	連携ファイル名
	 *		 	継続ジョブID
	 *		 	ディレイド処理依頼番号
	 *		 	宅内機器情報抽出ファイル名
	 *		 	登録年月日時分秒
	 *		 	登録オペレータアカウント
	 *		 	更新年月日時分秒
	 *		 	更新オペレータアカウント
	 *		 	削除年月日時分秒
	 *		 	削除オペレータアカウント
	 *		 	無効フラグ
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeWC_T_WC_HULFT_SDJSK_WC_INSERT_001(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());
		paramList.setValue(param[5].toString());
		paramList.setValue(param[6].toString());
		paramList.setValue(param[7].toString());
		paramList.setValue(param[8].toString());
		paramList.setValue(param[9].toString());
		paramList.setValue(param[10].toString());
		paramList.setValue(param[11].toString());
		paramList.setValue(param[12].toString());
		paramList.setValue(param[13].toString());

		// DBアクセスを実行します
		db_WC_T_WC_HULFT_SDJSK.executeBySqlDefine(paramList, WC_T_WC_HULFT_SDJSK_WC_INSERT_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
