/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKBcasStcTkDataSend
*	ソースファイル名	：JBSbatKKBcasStcTkDataSend.java
*	作成者				：富士通　
*	作成日				：2012年07月02日
*＜機能概要＞
*　Ｂ−ＣＡＳデータ解約分送信データファイル送信部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v3.00.00	2012/07/03   FJ)団		新規作成
*	v49.00.00	2020/05/30  FJ)Eric		ANK-3807-00-00
*********************************************************************/
package eo.business.service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JCCbatDenshiFileUtil;
import eo.business.common.JKKBatConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JPCDateUtil;
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.log.JBSbatLogUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKBcasStcTkDataSend extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/**
	 * FREE項目数
	 */
// ANK-3807-00-00 MOD START
//	private static final int FREE_ITEM = 3;
	private static final int FREE_ITEM = 5;
// ANK-3807-00-00 MOD END
	
	/**
	 * 外部インターフェイスファイル「B-CASデータ（設置分）送信」ファイルパス
	 */
	private String gaibu_stc_file_path = "";
	
	/**
	 * 外部インターフェイスファイル「B-CASデータ（解約分）送信」ファイルパス
	 */
	private String gaibu_dsl_file_path = "";
	
	/**
	 * ファイル名用システム日付
	 */
	private String file_nm_sysdate = "";
	
	/**
	 * 外部インターフェイスID（B-CASデータ（設置分）送信）
	 */
	private static final String IF_ID_169 = "KKIFE169";
	
	/**
	 * 外部インターフェイスID（B-CASデータ（撤去分）送信）
	 */
	private static final String IF_ID_170 = "KKIFE170";
	
	/**
	 * B-CASデータ（設置分）送信ファイル名
	 */
	private static final String FILE_NAME_STC = "KKIFE169_SETCHI_";
	
	/**
	 * B-CASデータ（解約分）送信ファイル名
	 */
	private static final String FILE_NAME_DSL = "KKIFE170_TEKKYO_";
	
	/**
	 *  拡張子（データファイル）
	 */
	private static final String FILE_KEISHIKI_CSV = ".csv";
	
	/**
	 *  拡張子（件数ファイル）
	 */
	private static final String FILE_KEISHIKI_CNT = ".cnt";
	
	/**
	 *  拡張子（フラグファイル）
	 */
	private static final String FILE_KEISHIKI_FLG = ".flg";
	
	// ANK-3807-00-00 ADD START
	/** DBアクセスクラス(ダウンロードファイル管理) */
	private JBSbatSQLAccess db_ZM_T_DL_FILE_KANRI = null;
	
	private static final String TBL_ZM_T_DL_FILE_KANRI = "ZM_T_DL_FILE_KANRI";
	
	/** SQL定義キー(ダウンロードファイル管理　INSERT_002) */
	private static final String ZM_T_DL_FILE_KANRI_KK_INSERT_002 = "KK_INSERT_002";
	
	private static final String FILE_CD = "0000";
	
	private static final String FILE_NAME_2 = "B-CASデータ（設置分）ファイル_%s.csv";
	
	private static final String FILE_NAME_3 = "B-CASデータ（撤去分）ファイル_%s.csv";
	
	private String gaibu_stc_file_cnt = "";
	
	private String gaibu_dsl_file_cnt = "";
	
	// ANK-3807-00-00 ADD END
	
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		// フリー項目値の取得をします。
		String[] free_item = commonItem.getFreeItem().split(JKKBatConst.S_PARAM_DELIM);
		
		// パラメータ数チェックをします。
		if (FREE_ITEM != free_item.length)
		{
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0130CE, new String[]{"FREE"});
		}
		
		// フリー項目値をセットします。
		// １．外部インターフェイスファイル「B-CASデータ（設置分）送信」ファイルパス
		gaibu_stc_file_path = free_item[0];
		
		// ２．外部インターフェイスファイル「B-CASデータ（解約分）送信」ファイルパス
		gaibu_dsl_file_path = free_item[1];
		
		// ３．ファイル名用運用日付＋システム時分秒
		file_nm_sysdate = free_item[2];
		
		
		//ANK-3807-00-00 ADD START
		gaibu_stc_file_cnt = free_item[3];
		
		gaibu_dsl_file_cnt = free_item[4];
		
		//ANK-3807-00-00 ADD END
		
		
		// ログレベルがデバッグモードの場合
		if (super.logPrint.chkLogLevel(JBSbatLogUtil.MODE_DEBUG))
		{
			super.logPrint.printDebugLog("gaibu_stc_file_path：" + gaibu_stc_file_path);
			super.logPrint.printDebugLog("gaibu_dsl_file_path：" + gaibu_dsl_file_path);
			super.logPrint.printDebugLog("file_nm_sysdate：" + file_nm_sysdate);
		}
		
		//ANK 3807-00-00 ADD START
		db_ZM_T_DL_FILE_KANRI = new JBSbatSQLAccess(commonItem, TBL_ZM_T_DL_FILE_KANRI);
		//ANK 3807-00-00 ADD END
		
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		super.logPrint.printDebugLog("execute_START");

		//ANK-3807-00-00 DEL START
		// 「B-CASデータ（設置分）送信」を送信します。
		//executeSendtFile(editSendFileNm(gaibu_stc_file_path, FILE_NAME_STC, file_nm_sysdate, FILE_KEISHIKI_CSV), IF_ID_169);
		//executeSendtFile(editSendFileNm(gaibu_stc_file_path, FILE_NAME_STC, file_nm_sysdate, FILE_KEISHIKI_CNT), IF_ID_169);
		//executeSendtFile(editSendFileNm(gaibu_stc_file_path, FILE_NAME_STC, file_nm_sysdate, FILE_KEISHIKI_FLG), IF_ID_169);

		// 「B-CASデータ（解約分）送信」を送信します。
		//executeSendtFile(editSendFileNm(gaibu_dsl_file_path, FILE_NAME_DSL, file_nm_sysdate, FILE_KEISHIKI_CSV), IF_ID_170);
		//executeSendtFile(editSendFileNm(gaibu_dsl_file_path, FILE_NAME_DSL, file_nm_sysdate, FILE_KEISHIKI_CNT), IF_ID_170);
		//executeSendtFile(editSendFileNm(gaibu_dsl_file_path, FILE_NAME_DSL, file_nm_sysdate, FILE_KEISHIKI_FLG), IF_ID_170);
		//ANK-3807-00-00 DEL END
		
		//ANK-3807-00-00 ADD START
		String delYmd = JPCDateUtil.addMonth(opeDate, 1);
		addEfileKanriDlFileKanri(Integer.valueOf(gaibu_stc_file_cnt), FILE_CD, editSendFileNm(gaibu_stc_file_path, FILE_NAME_STC, file_nm_sysdate, FILE_KEISHIKI_CSV), delYmd, String.format(FILE_NAME_2, this.file_nm_sysdate));
		
		addEfileKanriDlFileKanri(Integer.valueOf(gaibu_dsl_file_cnt), FILE_CD, editSendFileNm(gaibu_dsl_file_path, FILE_NAME_DSL, file_nm_sysdate, FILE_KEISHIKI_CSV), delYmd, String.format(FILE_NAME_3, this.file_nm_sysdate));
		
		
		//ANK-3807-00-00 ADD END
		
		super.logPrint.printDebugLog("execute_END");
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		//ANK 3807-00-00 ADD START
		db_ZM_T_DL_FILE_KANRI.close();
		//ANK 3807-00-00 ADD END
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 送信ファイル名を編集します。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.ファイル名を返却します。<br>
	 * 
	 * </pre>
	 * <p>
	 * @param filePath　ファイルパス。
	 * @param fileName　対象ファイル名。
	 * @param dtm　付加日時。
	 * @param type　拡張子。
	 * @return String　フルパスファイル名。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private String editSendFileNm(String filePath, String fileName, String dtm, String type) throws Exception
	{
		StringBuffer file_nm = new StringBuffer();
		file_nm.append(filePath);
		file_nm.append(fileName);
		file_nm.append(dtm);
		file_nm.append(type);
		return file_nm.toString();
	}
	
	/**
	 * 中間ファイルを送信します。<br>
	 * 共通イメージ（ESBサーバ）へデータ、件数、フラグファイルを送信します。
	 * <p>
	 * @param new_filePath 送信ファイルパス
	 * @param ifID インターフェイスＩＤ
	 * @throws JBSbatBusinessException 
	 * @throws IOException 業務サービス内で発生した例外全般。
	 */	
	@SuppressWarnings("unchecked")
	private void executeSendtFile(String new_filePath, String ifID) throws IOException, JBSbatBusinessException
	{
		ArrayList<String> file_list = new ArrayList<String>(1);
		HashMap<String, Object> out_map = new HashMap<String, Object>(3);
		
		file_list.add(new_filePath);
		
		// 転送処理を実行します
		boolean result = JCCBatCommon.putFTP(super.commonItem, file_list, ifID, JCCBatCommon.ISI, out_map);
		
		// エラー判定をします
		if(!result)
		{
			String kbn = out_map.get("ERR_KBN").toString();
			String err_msg = "";
			// ファイルエラーの場合
			if("2".equals(kbn))
			{
				err_msg = (String)((HashMap)((ArrayList)out_map.get("FILE_ERR")).get(0)).get("ERR_MESSAGE");
			}
			else
			{
				err_msg = (String)((HashMap)out_map.get("CONNECT_ERR")).get("ERR_MESSAGE");
			}

			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0200CE, new String[] {new_filePath, err_msg});
		}
	}
	
	// ANK-3807-00-00 ADD START
	/**
	 * 電子ファイル管理・ダウンロードファイル管理へ登録します。
	 * <br>
	 * @param dataCnt データ件数
	 * @param fileCd ファイルコード
	 * @param filePath
	 * @param fileDelYmd ファイル削除年月日
	 * @param fileName
	 * @throws Exception 例外が発生した場合
	 */
	private void addEfileKanriDlFileKanri(int dataCnt, String fileCd, String filePath,
			String fileDelYmd, String fileName) throws Exception
	{
		// 電子ファイル管理登録
		String[] ret = JCCbatDenshiFileUtil.createDenshiFile(this.commonItem, fileCd,
				filePath, fileDelYmd);
		
		// ダウンロードファイル管理登録
		String[] paramIns = {
				JKKStrConst.TRAN_KANRI_NO_220							// 処理管理番号
				, fileName												// ダウンロードファイル名
				, String.valueOf(dataCnt)												// データ件数
				, ret[0]												// 電子ファイル管理番号
				, ret[1]												// 世代登録年月日時分秒
		};
		
		executeZM_T_DL_FILE_KANRI_KK_INSERT_002(paramIns);
	}

	/**
	 * SQLKEY(KK_INSERT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *			TRN_KANRI_NO
	 *			FILE_NM
	 *			DATA_CNT
	 *			EFILE_KANRI_NO
	 *			GENE_ADD_DTM
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_T_DL_FILE_KANRI_KK_INSERT_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());
		paramList.setValue(param[4].toString());
		
		// DBアクセスを実行します
		db_ZM_T_DL_FILE_KANRI.executeBySqlDefine(paramList, ZM_T_DL_FILE_KANRI_KK_INSERT_002);
	}
	// ANK-3807-00-00 ADD END
}
