/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名			：eo顧客基幹システム
 *	モジュール名		：JBSbatFUSmtLnkFailData
 *	ソースファイル名	：JBSbatFUSmtLnkFailData.java
 *	作成者				：富士通
 *	作成日				：2013年01月26日
 *＜機能概要＞
 *　スマートリンク申込時督促確認実績連携部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2013/01/26   富士通		新規作成
 *	v1.01.00	2013/05/15   FJ)岡井	【TAI-2013-0000026】日中バッチ運用日付対応
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JFUBatCommon;
import eo.business.util.table.JBSbatFU_T_SMLN_MKJ_TS_CJK;
import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JPCUtilCommon;
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.util.JBSbatBusinessFileUtil;

/**
 * (クラスの機能概要)
 * <p>
 *<BR>
 *
 * @author 富士通
 */
public class JBSbatFUSmtLnkFailData extends JBSbatBusinessService
{
	/** メッセージキー */
	private static final String EFUB0030KE = JPCBatchMessageConstant.EFUB0030KE;

	/** 受付者 */
	private static final String UKETSUKE = "OTHER_SYSTEM";

	/** カテゴリ１ */
	private static final String CTGR_1 = "ＷＥＢ受付からの登録";

	/** カテゴリ２ */
	private static final String CTGR_2 = "スマートリンク未収チェック";

	/** カテゴリ３ */
	private static final String CTGR_3 = "その他";

	/** カテゴリ４ */
	private static final String CTGR_4 = "その他";

	/** 状態 */
	private static final String JYOUTAI = "クローズ";

	/** 顧客タイプ */
	private static final String KOKYAKU_TYPE = "加入者";

	/** キュー名 */
	private static final String QUE_NM = "【スマートリンク未収チェック】";

	/** ステータス */
	private static final String STATUS = "処理中";

	/** タイトル */
	private static final String TITLE = "スマートリンクWEB受付で督促チェックの為受付不可";

	/** 受付種別 */
	private static final String UKETSUKE_SBT = "他システム";

	/** 担当者 */
	private static final String TANTOU = "OTHER_SYSTEM";

	/** ▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼ */
	/** テーブル(スマートリンク申込時督促確認実績) */
	private static final String D_TBL_NAME_FU_T_SMLN_MKJ_TS_CJK = "FU_T_SMLN_MKJ_TS_CJK";

	/** SQL定義キー(FU_SELECT_001) */
	private static final String FU_T_SMLN_MKJ_TS_CJK_FU_SELECT_001 = "FU_SELECT_001";

	/** SQL定義キー(FU_UPDATE_001) */
	private static final String FU_T_SMLN_MKJ_TS_CJK_FU_UPDATE_001 = "FU_UPDATE_001";

	/** テーブルアクセスクラス(スマートリンク申込時督促確認実績) */
	private JBSbatSQLAccess db_FU_T_SMLN_MKJ_TS_CJK = null;

	/** ▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲ */

	/**
	 * 初期処理
	 *
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	@Override
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		/** ▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼ */
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_FU_T_SMLN_MKJ_TS_CJK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_FU_T_SMLN_MKJ_TS_CJK);
		/** ▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲ */
		/** ▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * 主処理
	 *
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
		/** ▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼ */
		String strJobid = commonItem.getJobid();
		String strBatchUserId = commonItem.getBatchUserId();
		String strSqlDefFilePath = commonItem.getSqlDefFilePath();
		super.logPrint.printDebugLog(strJobid + ":" + strBatchUserId);
		super.logPrint.printDebugLog(strJobid + ":" + strSqlDefFilePath);

		// FREEパラメータ取得
		String strFreeParam = commonItem.getFreeItem();
		if (strFreeParam == null || strFreeParam.length() == 0)
		{
			throw new JBSbatBusinessException(EFUB0030KE);
		}

		// パラメータを区切り文字で分割する
		String[] lines = strFreeParam.split(JFUStrConst.S_PARAM_DELIM);
		if (lines == null || lines.length < 3)
		{
			throw new JBSbatBusinessException(EFUB0030KE);
		}

		// オンライン運用日を取得する。
		String strOpeDate = commonItem.getOnlineOpeDate();

		// -------- （１）スマートリンク申込督促データ抽出処理 --------//

		// スマートリンク申込督促データ抽出結果格納領域を生成する。
		JBSbatCommonDBInterface selSmlnMkjTsCjkInfo = new JBSbatCommonDBInterface();

		// スマートリンク申込督促データ抽出する。
		executeFU_T_SMLN_MKJ_TS_CJK_FU_SELECT_001(selSmlnMkjTsCjkInfo.getList().toArray());

		ArrayList<HashMap<String, String>> smlnMkjTsCjkInfoList = new ArrayList<HashMap<String, String>>();

		int recordCnt = 0;

		for (selSmlnMkjTsCjkInfo = db_FU_T_SMLN_MKJ_TS_CJK.selectNext(); null != selSmlnMkjTsCjkInfo; selSmlnMkjTsCjkInfo =
				db_FU_T_SMLN_MKJ_TS_CJK.selectNext())
		{
			// 取得したレコードを1件づつ読込みSQL取得項目を各変数へ格納する。
			recordCnt++;

			// 更新対象のスマートリンク申込督促内容リスト格納領域を生成する。
			HashMap<String, String> smlnMkjTsCjkInfoMap = new HashMap<String, String>();

			// サービス契約番号
			String svcKeiNo = selSmlnMkjTsCjkInfo.getString(JBSbatFU_T_SMLN_MKJ_TS_CJK.SVC_KEI_NO);
			// 督促確認年月日
			String tkskCfmYmd = selSmlnMkjTsCjkInfo.getString(JBSbatFU_T_SMLN_MKJ_TS_CJK.TKSK_CFM_YMD);
			// 督促確認時分秒
			String tkskCfmHms = selSmlnMkjTsCjkInfo.getString(JBSbatFU_T_SMLN_MKJ_TS_CJK.TKSK_CFM_HMS);

			smlnMkjTsCjkInfoMap.put(JBSbatFU_T_SMLN_MKJ_TS_CJK.SVC_KEI_NO, svcKeiNo);
			smlnMkjTsCjkInfoMap.put(JBSbatFU_T_SMLN_MKJ_TS_CJK.TKSK_CFM_YMD, tkskCfmYmd);
			smlnMkjTsCjkInfoMap.put(JBSbatFU_T_SMLN_MKJ_TS_CJK.TKSK_CFM_HMS, tkskCfmHms);

			smlnMkjTsCjkInfoList.add(smlnMkjTsCjkInfoMap);
		}

		if (recordCnt == 0)
		{
			super.logPrint.printDebugLog(strJobid + ":対象データが0件の為、後続処理を行わずに終了。");
			return null;
		}

		// ======= ▼▼▼ 整形した情報をCASEファイルへ出力する。 ▼▼▼ =======

		// CASECSVファイル
		String caseCvsFile = lines[0];
		// CASE件数
		String caseCntFile = lines[1];
		// CASEフラグファイル
		String caseFlgFile = lines[2];

		JBSbatBusinessFileUtil caseCvsFileObj = null;
		JBSbatBusinessFileUtil caseCntFileObj = null;
		JBSbatBusinessFileUtil caseFlgFileObj = null;

		try
		{
			// CASECSVファイルを生成する。
			caseCvsFileObj = JCCBatCommon.createBusinessFileUtil(caseCvsFile, JFUStrConst.SJIS, JFUStrConst.RETURN_CODE, JFUStrConst.S_SEP_CAM);
			super.logPrint.printDebugLog(strJobid + ":CASECSVファイル名:" + caseCvsFile);

			for (int i = 0; i < smlnMkjTsCjkInfoList.size(); i++)
			{
				HashMap<String, String> outMap = smlnMkjTsCjkInfoList.get(i);

				// サービス契約番号
				String svcKeiNo = outMap.get(JBSbatFU_T_SMLN_MKJ_TS_CJK.SVC_KEI_NO);
				// 督促確認年月日
				String tkskCfmYmd = outMap.get(JBSbatFU_T_SMLN_MKJ_TS_CJK.TKSK_CFM_YMD);
				// 督促確認年月日
				String tkskCfmHms = outMap.get(JBSbatFU_T_SMLN_MKJ_TS_CJK.TKSK_CFM_HMS);

				// CASEファイル出力リスト
				ArrayList<String> smlnMkjTsCjkDataList = new ArrayList<String>();
				outputVal(KOKYAKU_TYPE, smlnMkjTsCjkDataList); // 顧客タイプ
				outputVal(svcKeiNo, smlnMkjTsCjkDataList); // お客様ID
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // 顧客氏名
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // 顧客氏名（カナ）
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // 電話番号
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // 電話番号2
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // 郵便番号
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // 住所1
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // 住所2
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // 住所3
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // 性別
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // 生年月日
				outputVal(JYOUTAI, smlnMkjTsCjkDataList); // 状態
				outputVal(STATUS, smlnMkjTsCjkDataList); // ステータス
				outputVal(JPCUtilCommon.formatDatetimeSS(tkskCfmYmd + tkskCfmHms), smlnMkjTsCjkDataList); // 作成日時
				outputVal(UKETSUKE, smlnMkjTsCjkDataList); // 受付者
				outputVal(TANTOU, smlnMkjTsCjkDataList); // 担当者
				outputVal(QUE_NM, smlnMkjTsCjkDataList); // キュー名
				outputVal(UKETSUKE_SBT, smlnMkjTsCjkDataList);// 受付種別
				outputVal(TITLE, smlnMkjTsCjkDataList); // タイトル
				outputVal(CTGR_1, smlnMkjTsCjkDataList); // カテゴリ１
				outputVal(CTGR_2, smlnMkjTsCjkDataList); // カテゴリ２
				outputVal(CTGR_3, smlnMkjTsCjkDataList); // カテゴリ３
				outputVal(CTGR_4, smlnMkjTsCjkDataList); // カテゴリ４
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // カテゴリ５
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // カテゴリ６
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // カテゴリ７
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // カテゴリ８
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // カテゴリ９
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // カテゴリ１０
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // カテゴリ１１
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // 問い合わせ履歴
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // SW顧客ID
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // eonetID1
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // eonetID2
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // eonetID3
				outputVal(JFUStrConst.EMPTY, smlnMkjTsCjkDataList); // eonetID4

				// CASECSVファイルへ出力する。
				JCCBatCommon.printBusinessFileUtil(caseCvsFileObj, smlnMkjTsCjkDataList);
			}

			// ======= ▼▼▼ 抽出対象データに対して対応履歴連携年月日、対応履歴連携済フラグを更新を行う。 ▼▼▼ =======

			for (int i = 0; i < smlnMkjTsCjkInfoList.size(); i++)
			{
				HashMap<String, String> outMap = smlnMkjTsCjkInfoList.get(i);
				String svcKeiNo = outMap.get(JBSbatFU_T_SMLN_MKJ_TS_CJK.SVC_KEI_NO);
				String tkskCfmYmd = outMap.get(JBSbatFU_T_SMLN_MKJ_TS_CJK.TKSK_CFM_YMD);

				super.logPrint.printDebugLog(strJobid + ":スマートリンク申込督促内容の対応履歴連携年月日、対応履歴連携済フラグを更新する。");
				super.logPrint.printDebugLog(strJobid + ":オンライン運用日:" + strOpeDate);
				super.logPrint.printDebugLog(strJobid + ":サービス契約番号:" + svcKeiNo);
				super.logPrint.printDebugLog(strJobid + ":督促確認年月日:" + tkskCfmYmd);

				// スマートリンク申込督促内容
				JBSbatCommonDBInterface updSmlnMkjTsCjkInfo = new JBSbatCommonDBInterface();
				updSmlnMkjTsCjkInfo.setValue(strOpeDate); // オンライン運用日
				updSmlnMkjTsCjkInfo.setValue(svcKeiNo); // サービス契約番号
				updSmlnMkjTsCjkInfo.setValue(tkskCfmYmd); // 督促確認年月日
				executeFU_T_SMLN_MKJ_TS_CJK_FU_UPDATE_001(updSmlnMkjTsCjkInfo.getList().toArray());
			}

			// CASE件数ファイルを生成する。
			caseCntFileObj = JCCBatCommon.createBusinessFileUtil(caseCntFile, JFUStrConst.SJIS, JFUStrConst.RETURN_CODE, JFUStrConst.EMPTY);
			super.logPrint.printDebugLog(strJobid + ":CASE件数ファイル名:" + caseCntFile);

			// CASE件数ファイルへ出力する。
			JCCBatCommon.printBusinessFileUtil(caseCntFileObj, String.valueOf(smlnMkjTsCjkInfoList.size()));

			// CASEフラグファイルを生成する。
			caseFlgFileObj = JCCBatCommon.createBusinessFileUtil(caseFlgFile, JFUStrConst.SJIS, JFUStrConst.EMPTY, JFUStrConst.EMPTY);
			super.logPrint.printDebugLog(strJobid + ":CASEフラグファイル名:" + caseFlgFile);
		}
		catch (Exception e)
		{

			super.logPrint.printDebugLog(strJobid + ":例外発生の為、生成ファイルのクローズ処理を行う。");

			// 生成ファイルのクローズ処理
			if (null != caseCvsFileObj)
			{
				JFUBatCommon.closeBusinessFileUtil(caseCvsFileObj);
			}
			if (null != caseCntFileObj)
			{
				JFUBatCommon.closeBusinessFileUtil(caseCntFileObj);
			}
			if (null != caseFlgFileObj)
			{
				JFUBatCommon.closeBusinessFileUtil(caseFlgFileObj);
			}

			super.logPrint.printDebugLog(strJobid + ":例外発生の為、更新データがある場合はロールバックを行う。");

			throw e;
		}
		if (null != caseCvsFileObj)
		{
			JFUBatCommon.closeBusinessFileUtil(caseCvsFileObj);
		}
		if (null != caseCntFileObj)
		{
			JFUBatCommon.closeBusinessFileUtil(caseCntFileObj);
		}
		if (null != caseFlgFileObj)
		{
			JFUBatCommon.closeBusinessFileUtil(caseFlgFileObj);
		}

		return null;

		/** ▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * 業務サービス終了処理
	 *
	 * @throws Exception
	 */
	@Override
	public void terminal() throws Exception
	{
		/** ▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼ */
		// DBアクセスクラスをクローズします
		db_FU_T_SMLN_MKJ_TS_CJK.close();
		/** ▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲ */
		/** ▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲ */
	}

	/** ▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼ */

	/**
	 * SQLKEY(FU_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 executeFU_T_SMLN_MKJ_TS_CJK_FU_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		// DBアクセスを実行します
		db_FU_T_SMLN_MKJ_TS_CJK.selectBySqlDefine(paramList, FU_T_SMLN_MKJ_TS_CJK_FU_SELECT_001);
	}

	/**
	 * SQLKEY(FU_UPDATE_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 executeFU_T_SMLN_MKJ_TS_CJK_FU_UPDATE_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_FU_T_SMLN_MKJ_TS_CJK.executeBySqlDefine(paramList, FU_T_SMLN_MKJ_TS_CJK_FU_UPDATE_001);
	}

	/** ▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲ */

	/**
	 * 出力用文字列の作成処理です。
	 *
	 * @param value 対象文字列
	 * @param list 出力対象リスト
	 * @return 対象文字列の結合情報
	 */
	private static List<String> outputVal(String value, List<String> list)
	{
		list.add(JFUStrConst.S_DUBLLEQ + value + JFUStrConst.S_DUBLLEQ);
		return list;
	}
}
