/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKElecAdChgCaseRnk
*	ソースファイル名	：JBSbatKKElecAdChgCaseRnk.java
*	作成者				：富士通　
*	作成日				：2022年05月06日
*＜機能概要＞
*　電気利用場所変更ＣＡＳＥ連携処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v59.00.00    2022/05/06  GDC)j.lawsin        【ANK-4187-00-00】電気利用者の利用場所住所変更に伴うＣＡＳＥ自動登録
*********************************************************************/
package eo.business.service;

import java.io.IOException;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JKKBatCommon;
import eo.business.common.JKKBatConst;
import eo.business.util.file.JBSbatKKIFM948;
import eo.business.util.file.JBSbatKKIFM949;
import eo.business.util.file.JBSbatKKIFM950;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatOutputFileUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.util.JBSbatAplConst;

/**
* (クラスの機能概要) <p>
*<BR>
* @author GDC)j.lawsin
*/
public class JBSbatKKElecAdChgCaseRnk extends JBSbatBusinessService
{
	/** 受付者、担当者 */
	private String taioRrkAddUser = null;
	
	/** 出力ファイル名用のタイムスタンプ */
	private String fileTimeStamp = null;
	
	/** 電気利用場所変更ＣＡＳＥファイル配置先パス */
	private static final String CASE_FILE_PATH = "CR_TWS_RK_FILE_DIR";
	
	/** 電気利用場所変更ＣＡＳＥファイル */
	private static final String CASE_FILE_NM = "CASE_ELECADCHG_yyyyMMddhhmmss.CSV";
	
	/** 電気利用場所変更ＣＡＳＥ件数ファイル */
	private static final String CASE_CNT_FILE_NM = "CASE_ELECADCHG_yyyyMMddhhmmss_CNT.TXT";
	
	/** 電気利用場所変更ＣＡＳＥフラグファイル */
	private static final String CASE_FLG_FILE_NM = "CASE_ELECADCHG_yyyyMMddhhmmss_FTP.FLG";
	
	/** 電気利用場所変更ＣＡＳＥファイル定義 */
	private static final String CASE_FILE_DEF_NM = "KKIFM949.def";
	
	/** 電気利用場所変更ＣＡＳＥ件数ファイル定義 */
	private static final String CASE_CNT_FILE_DEF_NM = "KKIFM950.def";
	
	/** CASEファイルオブジェクト */
	private JBSbatOutputFileUtil caseFileObj = null;
	
	/** CASE件数ファイルオブジェクト */
	private JBSbatOutputFileUtil caseCntFileObj = null;
	
	/** CASEフラグファイルオブジェクト*/
	private JBSbatOutputFileUtil caseFlgFileObj = null;
	
	/** CASEファイル定義オブジェクト */
	private JBSbatDefFileUtil caseFileDef = null;
	
	/** CASE件数ファイル定義オブジェクト*/
	private JBSbatDefFileUtil caseCntFileDef = null;
	
	/** 電気利用場所変更ＣＡＳＥ件数ファイル 出力件数 */
	private long caseFileCount = 0;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		// システム日時を取得する
		fileTimeStamp = JCCBatCommon.getSysDateTime();
		// 受付者、担当者用の文字列を取得する
		taioRrkAddUser = JKKBatCommon.getWorkParamSetteValue(super.commonItem, JKKStrConst.KK_TAIORRK_ADD_USER);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// サービス契約番号
		String svcKeiNo = inMap.getString(JBSbatKKIFM948.SVC_KEI_NO);
		// サービス契約ステータス
		String svcKeiStat = inMap.getString(JBSbatKKIFM948.SVC_KEI_STAT);
		// 当日回線場所番地号
		String tjituKaisenAdBnchigo = inMap.getString(JBSbatKKIFM948.TJITU_KAISEN_AD_BNCHIGO);
		// 当日回線場所住所コード
		String tjituKaisenAdCd = inMap.getString(JBSbatKKIFM948.TJITU_KAISEN_AD_CD);
		// 当日回線場所郵便番号
		String tjituKaisenPcd = inMap.getString(JBSbatKKIFM948.TJITU_KAISEN_PCD);
		// 当日回線場所都道府県市区町村名
		String tjituKaisenCityNm = inMap.getString(JBSbatKKIFM948.TJITU_KAISEN_STATE_CITY_NM);
		// 当日回線場所大字通称字丁目名
		String tjituKaisenAzchoNm = inMap.getString(JBSbatKKIFM948.TJITU_KAISEN_OAZTSU_AZCHO_NM);
		// 当日回線場所住所補記・建物名
		String tjituKaisenAdrttm = inMap.getString(JBSbatKKIFM948.TJITU_KAISEN_ADRTTM);
		// 当日回線場所住所補記・部屋番号
		String tjituKaisenAddrm = inMap.getString(JBSbatKKIFM948.TJITU_KAISEN_ADRRM);
		// 前日回線場所番地号
		String zjituKaisenAdBnchigo = inMap.getString(JBSbatKKIFM948.ZJITU_KAISEN_AD_BNCHIGO);
		// 前日回線場所住所コード
		String zjituKaisenAdCd = inMap.getString(JBSbatKKIFM948.ZJITU_KAISEN_AD_CD);
		// 前日回線場所郵便番号
		String zjituKaisenPcd = inMap.getString(JBSbatKKIFM948.ZJITU_KAISEN_PCD);
		// 前日回線場所都道府県市区町村名
		String zjituKaisenCityNm = inMap.getString(JBSbatKKIFM948.ZJITU_KAISEN_STATE_CITY_NM);
		// 前日回線場所大字通称字丁目名
		String zjituKaisenAzchoNm = inMap.getString(JBSbatKKIFM948.ZJITU_KAISEN_OAZTSU_AZCHO_NM);
		// 前日回線場所住所補記・建物名
		String zjituKaisenAdrttm = inMap.getString(JBSbatKKIFM948.ZJITU_KAISEN_ADRTTM);
		// 前日回線場所住所補記・部屋番号
		String zjituKaisenAddrm = inMap.getString(JBSbatKKIFM948.ZJITU_KAISEN_ADRRM);
		
		// サービス契約状態判定
		if (JKKBatConst.SVC_KEI_STAT_DSL_ZM.equals(svcKeiStat) 
			|| JKKBatConst.SVC_KEI_STAT_CNCL_ZM.equals(svcKeiStat))
		{
			return null;
		}
		
		// 利用場所変更判定
		if (tjituKaisenAdCd.equals(zjituKaisenAdCd)
			&& tjituKaisenPcd.equals(zjituKaisenPcd)
			&& tjituKaisenCityNm.equals(zjituKaisenCityNm)
			&& tjituKaisenAzchoNm.equals(zjituKaisenAzchoNm)
			&& tjituKaisenAdBnchigo.equals(zjituKaisenAdBnchigo)
			&& tjituKaisenAdrttm.equals(zjituKaisenAdrttm)
			&& tjituKaisenAddrm.equals(zjituKaisenAddrm))
		{
			return null;
		}
		
		// 電気利用場所変更ＣＡＳＥファイルにデータを出力する。
		outputCaseFile(svcKeiNo);

		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		// 電気利用場所変更ＣＡＳＥ件数ファイルが存在する場合
		if (caseFileObj != null)
		{
			// 電気利用場所変更ＣＡＳＥ件数ファイルを作成する
			createCaseCntFile();
			
			// 電気利用場所変更ＣＡＳＥフラグファイルを作成する
			createCaseFlgFile();
		}
		
		// ファイルを閉じる
		closeFileObj();
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 電気利用場所変更ＣＡＳＥファイルを出力する
	 * @param svcKeiNo サービス契約番号
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void outputCaseFile(String svcKeiNo) throws Exception
	{
		if (caseFileObj == null)
		{
			// 電気利用場所変更ＣＡＳＥファイルを作成する
			createCaseFile();
		}
		
		// 出力データ作成
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 顧客タイプ
		outMap.setString(JBSbatKKIFM949.KOKYAKU_TYPE, "加入者");
		// お客様ID
		outMap.setString(JBSbatKKIFM949.CUST_ID, svcKeiNo);
		// 顧客氏名
		outMap.setString(JBSbatKKIFM949.KOKYAKU_NM, null);
		// 顧客氏名（カナ）
		outMap.setString(JBSbatKKIFM949.KOKYAKU_NM_KANA, null);
		// 電話番号
		outMap.setString(JBSbatKKIFM949.TEL_NO, null);
		// 電話番号2
		outMap.setString(JBSbatKKIFM949.TEL_NO_2, null);
		// 郵便番号
		outMap.setString(JBSbatKKIFM949.YUBIN_NO, null);
		// 住所1
		outMap.setString(JBSbatKKIFM949.JUSHO_1, null);
		// 住所2
		outMap.setString(JBSbatKKIFM949.JUSHO_2, null);
		// 住所3
		outMap.setString(JBSbatKKIFM949.JUSHO_3, null);
		// 性別
		outMap.setString(JBSbatKKIFM949.SEIBETSU, null);
		// 生年月日
		outMap.setString(JBSbatKKIFM949.SEINEN_GAPPI, null);
		// 状態
		outMap.setString(JBSbatKKIFM949.JYOUTAI, "エスカレーション");
		// ステータス
		outMap.setString(JBSbatKKIFM949.STATUS, "処理中");
		// 作成日時
		outMap.setString(JBSbatKKIFM949.SAKUSEI_DATE, JKKBatCommon.formatDatetimeSS(JKKBatCommon.getSysDateTime()));
		// 受付者
		outMap.setString(JBSbatKKIFM949.UKETSUKE, taioRrkAddUser);
		// 担当者
		outMap.setString(JBSbatKKIFM949.TANTOU, taioRrkAddUser);
		// キュー名
		outMap.setString(JBSbatKKIFM949.QUE_NM, "【電気事務】【00.受付】");
		// 受付種別
		outMap.setString(JBSbatKKIFM949.UKETSUKE_SBT, "その他");
		// タイトル
		outMap.setString(JBSbatKKIFM949.TITLE, "【eo電気】利用場所住所変更案件の情報提供");
		// カテゴリ１
		outMap.setString(JBSbatKKIFM949.CTGR_1, null);
		// カテゴリ２
		outMap.setString(JBSbatKKIFM949.CTGR_2, null);
		// カテゴリ３
		outMap.setString(JBSbatKKIFM949.CTGR_3, null);
		// カテゴリ４
		outMap.setString(JBSbatKKIFM949.CTGR_4, null);
		// カテゴリ５
		outMap.setString(JBSbatKKIFM949.CTGR_5, null);
		// カテゴリ６
		outMap.setString(JBSbatKKIFM949.CTGR_6, null);
		// カテゴリ７
		outMap.setString(JBSbatKKIFM949.CTGR_7, null);
		// カテゴリ８
		outMap.setString(JBSbatKKIFM949.CTGR_8, null);
		// カテゴリ９
		outMap.setString(JBSbatKKIFM949.CTGR_9, null);
		// カテゴリ１０
		outMap.setString(JBSbatKKIFM949.CTGR_10, null);
		// カテゴリ１１
		outMap.setString(JBSbatKKIFM949.CTGR_11, null);
		// 問合せ履歴
		outMap.setString(JBSbatKKIFM949.TOIAWASE_RIREKI, "・［同一利用場所・eo光］で紐づくeo光契約の利用場所住所が変更登録されました。" + JKKStrConst.LINE_SEPARATOR + "・eo電気の利用場所住所登録要否を確認の上、対応をお願いします。");
		// 問合せ客ID
		outMap.setString(JBSbatKKIFM949.TOIAWASE_KYAKU_ID, null);
		// eoID
		outMap.setString(JBSbatKKIFM949.EO_ID, null);
		// 申込書番号
		outMap.setString(JBSbatKKIFM949.MSKMSHO_NO, null);
		// エスカレーション日時
		outMap.setString(JBSbatKKIFM949.ESCLA_DATE, null);
		// コールバック時間指定タイプ
		outMap.setString(JBSbatKKIFM949.CALLBK_SHITEI_TYPE_CD, null);
		// 業務個別設定組織コード
		outMap.setString(JBSbatKKIFM949.WKKBT_ORG_CD, null);
		// 反響可能性フラグ
		outMap.setString(JBSbatKKIFM949.HANKYO_PSB_FLG, null);
		// 対応部署
		outMap.setString(JBSbatKKIFM949.TAIO_BUSHO, null);
		
		// データ部を出力する
		caseFileObj.print(outMap, caseFileDef);
		
		// 出力件数カウントアップ
		caseFileCount++;
	}
	
	/**
	 * 電気利用場所変更ＣＡＳＥファイルを作成するを作成する
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void createCaseFile() throws Exception
	{
		// ファイルパス + ファイル名を作成する
		String caseFileName = JBSbatAplConst.getAplConstValue(CASE_FILE_PATH) + JKKBatConst.S_HALF_SLASH
								+ CASE_FILE_NM.replaceAll(JKKStrConst.FILE_TIMESTAMP_FORMAT, fileTimeStamp);
		
		try
		{
			// ファイルオブジェクトを作成する
			caseFileObj = new JBSbatOutputFileUtil(caseFileName);
			caseFileObj.setJobID(commonItem.getJobid());
			caseFileObj.setEncode(JKKStrConst.ENCODE_SJIS);
			caseFileObj.setLine(JKKBatConst.LINE_CRLF);
			
			// 定義ファイル名を取得する
			String caseDefFileNm = JBSbatAplConst.getAplConstValue(JKKStrConst.KK_DIR_IND) + CASE_FILE_DEF_NM;
			
			// 定義ファイルオブジェクトを作成する
			caseFileDef = new JBSbatDefFileUtil(caseDefFileNm, caseFileObj);
			
			// Writerオブジェクトを作成する
			caseFileObj.createWriter();
		}
		catch (IOException e)
		{
			// ファイルを閉じる
			closeFileObj();
			
			// メッセージ内容 ファイルの作成に失敗しました。%1%
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0500CE, new String[] {caseFileName});
		}
	}
	
	/**
	 * 電気利用場所変更ＣＡＳＥ件数ファイルを作成する
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void createCaseCntFile() throws Exception
	{
		// ファイルパス + ファイル名を作成する
		String caseCntFileName = JBSbatAplConst.getAplConstValue(CASE_FILE_PATH) + JKKBatConst.S_HALF_SLASH
								+ CASE_CNT_FILE_NM.replaceAll(JKKStrConst.FILE_TIMESTAMP_FORMAT, fileTimeStamp);
		
		try
		{
			// ファイルオブジェクトを作成する
			caseCntFileObj = new JBSbatOutputFileUtil(caseCntFileName);
			caseCntFileObj.setJobID(commonItem.getJobid());
			caseCntFileObj.setEncode(JKKStrConst.ENCODE_SJIS);
			caseCntFileObj.setLine(JKKBatConst.LINE_CRLF);
			
			// 定義ファイル名を取得する
			String caseDefFileNm = JBSbatAplConst.getAplConstValue(JKKStrConst.KK_DIR_IND) + CASE_CNT_FILE_DEF_NM;
			
			// 定義ファイルオブジェクトを作成する
			caseCntFileDef = new JBSbatDefFileUtil(caseDefFileNm, caseCntFileObj);
			
			// Writerオブジェクトを作成する
			caseCntFileObj.createWriter();
			
			// データ部を作成する
			JBSbatServiceInterfaceMap outDataMap = new JBSbatServiceInterfaceMap();
			outDataMap.set(JBSbatKKIFM950.CNT, caseFileCount);
			caseCntFileObj.print(outDataMap, caseCntFileDef);
		}
		catch (IOException e)
		{
			// ファイルを閉じる
			closeFileObj();
			
			// メッセージ内容 ファイルの作成に失敗しました。%1%
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0500CE, new String[] {caseCntFileName});
		}
	}
	
	/**
	 * 電気利用場所変更ＣＡＳＥフラグファイルを作成する
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void createCaseFlgFile() throws Exception
	{
		// ファイルパス + ファイル名を作成する
		String caseFlgFileName = JBSbatAplConst.getAplConstValue(CASE_FILE_PATH) + JKKBatConst.S_HALF_SLASH
								+ CASE_FLG_FILE_NM.replaceAll(JKKStrConst.FILE_TIMESTAMP_FORMAT, fileTimeStamp);
		
		try
		{
			// ファイルオブジェクトを作成する
			caseFlgFileObj = new JBSbatOutputFileUtil(caseFlgFileName);
			caseFlgFileObj.setJobID(commonItem.getJobid());
			caseFlgFileObj.setEncode(JKKStrConst.ENCODE_SJIS);
			caseFlgFileObj.setLine(JKKBatConst.LINE_CRLF);
			
			// Writerオブジェクトを作成する
			caseFlgFileObj.createWriter();
		}
		catch (IOException e)
		{
			// ファイルを閉じる
			closeFileObj();
			
			// メッセージ内容 ファイルの作成に失敗しました。%1%
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0500CE, new String[] {caseFlgFileName});
		}
	}
	
	/**
	 * ファイルを閉じる
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void closeFileObj() throws Exception
	{
		// ルータ／ＶＡ機器付替登録結果CASEファイルが存在する場合
		if (caseFileObj != null)
		{
			// ファイルを閉じる
			caseFileObj.close();
		}
		
		// ルータ／ＶＡ機器付替登録結果CASE件数ファイルが存在する場合
		if (caseCntFileObj != null)
		{
			// ファイルを閉じる
			caseCntFileObj.close();
		}
		
		// ルータ／ＶＡ機器付替登録結果CASEフラグファイルが存在する場合
		if (caseFlgFileObj != null)
		{
			// ファイルを閉じる
			caseFlgFileObj.close();
		}
	}
}
