/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKVtekkyoDslFin
*	ソースファイル名	：JBSbatKVtekkyoDslFin.java
*	作成者				：富士通　
*	作成日				：2013年09月10日
*＜機能概要＞
*　契約異動検証＿撤去解約完了部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2013/09/10   富士通		新規作成
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatKVIFM032;
import eo.business.util.table.JBSbatKK_T_KJ_FIN_WK;
import eo.business.util.table.JBSbatKK_T_SEIKY_KEI;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;


/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKVtekkyoDslFin extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(工事完了ワーク)*/
	private static final String D_TBL_NAME_KK_T_KJ_FIN_WK = "KK_T_KJ_FIN_WK";

	/** SQL定義キー(KV_SELECT_001)*/
	private static final String KK_T_KJ_FIN_WK_KV_SELECT_002 = "KV_SELECT_002";
	/** SQL定義キー(KV_SELECT_002)*/
	private static final String KK_T_KJ_FIN_WK_KV_SELECT_003 = "KV_SELECT_003";

	/** テーブルアクセスクラス(工事完了ワーク)*/
	private JBSbatSQLAccess db_KK_T_KJ_FIN_WK = null;

	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	/** FREE項目から取得した出力モード */
	private String outMode = null;
	/** FREE項目から取得した運用日 */
	private String prmOpDate = null;
	/** 初回読込フラグ */
	private boolean firstFlg = true;
	/** サービス契約番号 */
	private String svcKNo = null;
	/** 工事案件番号 */
	private String kojiakNo = null;
	/** 出力データ格納オブジェクト */
	JBSbatOutputItem outputItem = new JBSbatOutputItem();
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		// フリー項目を分割して日付を取得する。
		String[] freeItemArray = commonItem.getFreeItem().split("@");
		outMode = freeItemArray[0];
		prmOpDate = freeItemArray[1];
		// DBアクセスクラスを生成します
		db_KK_T_KJ_FIN_WK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KJ_FIN_WK);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		try {
			// 出力ファイルオブジェクトを生成
//			JBSbatOutputItem outputItem = new JBSbatOutputItem();
			isFirst(outputItem);		//１行目ならヘッダー情報セット
			// 工事完了データ格納用リスト
			ArrayList<JBSbatCommonDBInterface> finDataLst = getKojiFinData();

			if(0 == finDataLst.size()) return outputItem;

			for(JBSbatCommonDBInterface finData :finDataLst)
			{
				String stat = cnvNullToEmp(
						finData.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_STAT));
				svcKNo = cnvNullToEmp(
						finData.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_NO));
				kojiakNo = cnvNullToEmp(
						finData.getString(JBSbatKK_T_KJ_FIN_WK.KOJIAK_NO));

				if(!"910".equals(stat))
				{
					outputItem.addOutMapList(setOutInfo(finData, "1"));	//調査対象
				}else
				{
					if("2".equals(outMode) || "3".equals(outMode))
					{
						outputItem.addOutMapList(setOutInfo(finData, "2"));	//正常
					}
				}
			}

			//工事完了にしか存在しないサービス契約番号を検索
			ArrayList<JBSbatCommonDBInterface> notExistLst = slctSvckNotEexists();

			for(JBSbatCommonDBInterface notExistSvck :notExistLst)
			{
				svcKNo = cnvNullToEmp(
						notExistSvck.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_NO));
				kojiakNo = cnvNullToEmp(
						notExistSvck.getString(JBSbatKK_T_KJ_FIN_WK.KOJIAK_NO));
				if("2".equals(outMode) || "3".equals(outMode))
				{
					outputItem.addOutMapList(setOutInfoErr(notExistSvck, "3"));	//DB不整合
				}
			}

		} catch (Exception e) {
			super.logPrint.printBusinessErrorLog("EKKB0960AI", new String[]{
					"info：" + e + " " + svcKNo + " " + kojiakNo +
					" " + getStaCkInfo(e)});
		}
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_KJ_FIN_WK.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(KV_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 executeKK_T_KJ_FIN_WK_KV_SELECT_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());

		// DBアクセスを実行します
		db_KK_T_KJ_FIN_WK.selectBySqlDefine(paramList, KK_T_KJ_FIN_WK_KV_SELECT_002);
	}

	/**
	 * SQLKEY(KV_SELECT_003)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_KJ_FIN_WK_KV_SELECT_003() throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		// DBアクセスを実行します
		db_KK_T_KJ_FIN_WK.selectBySqlDefine(paramList, KK_T_KJ_FIN_WK_KV_SELECT_003);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	//ヘッダー出力判定
	private void isFirst(JBSbatOutputItem outputItem) throws Exception
	{
		if(firstFlg)
		{
			setHeader(outputItem);
			firstFlg = false;
		}
	}

	/**
	 * アウトプットファイルのヘッダー部設定
	 * アウトプットファイルのヘッダー部を設定する
	 * @param JBSbatOutputItem outputItem　出力共通電文クラス
	 * @throws Exception
	 */
	private void setHeader(JBSbatOutputItem outputItem) throws Exception
	{
		// 出力値編集
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		outMap.set(JBSbatKVIFM032.SYSID, "ＳＹＳＩＤ");
		outMap.set(JBSbatKVIFM032.SEIKY_KEI_NO, "請求契約番号");
		outMap.set(JBSbatKVIFM032.SVC_KEI_NO, "サービス契約番号");
		outMap.set(JBSbatKVIFM032.SVC_KEI_STAT, "サービス契約ステータス");
		outMap.set(JBSbatKVIFM032.PPLAN_CD, "料金プランコード");
		outMap.set(JBSbatKVIFM032.PPLAN_NM, "料金プランコード名称");
		outMap.set(JBSbatKVIFM032.KOJIAK_NO, "工事案件番号");
		outMap.set(JBSbatKVIFM032.OPMS_KOJIAK_RSLT_CD, "OPMS工事案件結果コード");
		outMap.set(JBSbatKVIFM032.CHOSA_TG_DIV, "調査対象区分");
		outMap.set(JBSbatKVIFM032.CHOSA_TG_DIV_NM, "調査対象区分名称");

		outMap.setOutFlg(true);

		outputItem.addOutMapList(outMap);
	}

	/**
	 * 出力情報を設定し返却する
	 * @param finData
	 * @param rslt
	 * @return
	 * @throws Exception
	 */
	private JBSbatServiceInterfaceMap setOutInfo(JBSbatCommonDBInterface finData,
			String rslt) throws Exception
	{
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		outMap.set(JBSbatKVIFM032.SYSID, 
				cnvNullToEmp(finData.getString(JBSbatKK_T_SVC_KEI.SYSID)));
		outMap.set(JBSbatKVIFM032.SEIKY_KEI_NO, 
				cnvNullToEmp(finData.getString(JBSbatKK_T_SEIKY_KEI.SEIKY_KEI_NO)));
		outMap.set(JBSbatKVIFM032.SVC_KEI_NO, svcKNo);
		outMap.set(JBSbatKVIFM032.SVC_KEI_STAT, 
				cnvNullToEmp(finData.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_STAT)));
		outMap.set(JBSbatKVIFM032.PPLAN_CD, 
				cnvNullToEmp(finData.getString(JBSbatKK_T_SVC_KEI.PPLAN_CD)));

		outMap.set(JBSbatKVIFM032.PPLAN_NM, cnvNullToEmp(finData.getString("PPLAN_NM")));
		outMap.set(JBSbatKVIFM032.KOJIAK_NO, kojiakNo);
		outMap.set(JBSbatKVIFM032.OPMS_KOJIAK_RSLT_CD, 
				cnvNullToEmp(finData.getString(JBSbatKK_T_KJ_FIN_WK.OPMS_KOJIAK_RSLT_CD)));

		outMap.set(JBSbatKVIFM032.CHOSA_TG_DIV, rslt);
		outMap.set(JBSbatKVIFM032.CHOSA_TG_DIV_NM, cnvChosaDiv(rslt));

		outMap.setOutFlg(true);
		return outMap;
	}

	/**
	 * 出力情報を設定し返却する
	 * @param data
	 * @param rslt
	 * @return
	 * @throws Exception
	 */
	private JBSbatServiceInterfaceMap setOutInfoErr(JBSbatCommonDBInterface data,
			String rslt) throws Exception
	{
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		outMap.set(JBSbatKVIFM032.SYSID, "");

		outMap.set(JBSbatKVIFM032.SEIKY_KEI_NO,
				cnvNullToEmp(data.getString(JBSbatKK_T_SEIKY_KEI.SEIKY_KEI_NO)));

		outMap.set(JBSbatKVIFM032.SVC_KEI_NO, svcKNo);

		outMap.set(JBSbatKVIFM032.SVC_KEI_STAT, "");
		outMap.set(JBSbatKVIFM032.PPLAN_CD, "");
		outMap.set(JBSbatKVIFM032.PPLAN_NM, "");

		outMap.set(JBSbatKVIFM032.KOJIAK_NO, kojiakNo);
		outMap.set(JBSbatKVIFM032.OPMS_KOJIAK_RSLT_CD, 
				cnvNullToEmp(data.getString(JBSbatKK_T_KJ_FIN_WK.OPMS_KOJIAK_RSLT_CD)));

		outMap.set(JBSbatKVIFM032.CHOSA_TG_DIV, rslt);
		outMap.set(JBSbatKVIFM032.CHOSA_TG_DIV_NM, cnvChosaDiv(rslt));

		outMap.setOutFlg(true);
		return outMap;
	}
	/**
	 * 工事完了データ抽出(解約・住変)
	 * @return 検索結果
	 * @throws Exception
	 */
	private ArrayList<JBSbatCommonDBInterface> getKojiFinData() throws Exception
	{
		executeKK_T_KJ_FIN_WK_KV_SELECT_001(
				new Object[]{prmOpDate,prmOpDate,prmOpDate,prmOpDate,prmOpDate});
		JBSbatCommonDBInterface dataMap = db_KK_T_KJ_FIN_WK.selectNext();

		ArrayList<JBSbatCommonDBInterface> finDataLst =
			new ArrayList<JBSbatCommonDBInterface>();

		if(null == dataMap)
		{
			commonItem.getLogPrint().printDebugLog(
					"工事完了データ該当なし 運用日:" + prmOpDate);
			return finDataLst;
		}

		while(null != dataMap)
		{
			finDataLst.add(dataMap);
			dataMap = db_KK_T_KJ_FIN_WK.selectNext();
		}
		super.logPrint.printDebugLog("工事完了 件数:" + finDataLst.size() +
				" バッチ運用日:" + prmOpDate);
		return finDataLst;
	}

	/**
	 * 工事完了のみに存在するサービス契約番号を抽出(サービス契約に存在しない)
	 * @return 検索結果
	 * @throws Exception
	 */
	private ArrayList<JBSbatCommonDBInterface> slctSvckNotEexists() throws Exception
	{
		executeKK_T_KJ_FIN_WK_KV_SELECT_003();
		JBSbatCommonDBInterface dataMap = db_KK_T_KJ_FIN_WK.selectNext();

		ArrayList<JBSbatCommonDBInterface> kojiDataLst =
			new ArrayList<JBSbatCommonDBInterface>();
		if(null == dataMap)
		{
			return kojiDataLst;
		}
		commonItem.getLogPrint().printDebugLog("不整合データあり");
		while(null != dataMap)
		{
			kojiDataLst.add(dataMap);
			dataMap = db_KK_T_KJ_FIN_WK.selectNext();
		}
		super.logPrint.printDebugLog("サービス契約なし 件数:" + kojiDataLst.size());
		return kojiDataLst;
	}

	//調査区分名取得
	private String cnvChosaDiv(String div)
	{
		if("1".equals(div))
		{
			return "調査対象";
		}
		if("2".equals(div))
		{
			return "正常";
		}
		if("3".equals(div))
		{
			return "DB不整合";
		}
		return "";
	}

	/**
	 * null → ""に変換するメソッド
	 * @param val 文字列
	 * @return 変換後文字列
	 */
	private String cnvNullToEmp(String val)
	{
		String rslt = val;
		if(null == val)
		{
			rslt = "";
		}
		return rslt;
	}

	/**
	 * 自分のクラスのException情報のみログ出力
	 * @param e
	 * @return
	 */
	private String getStaCkInfo(Exception e)
	{
		StringBuilder sb = new StringBuilder();
		StackTraceElement[] st = e.getStackTrace();

		for(StackTraceElement stInfo :st)
		{
			if(stInfo.getClassName().contains(this.getClassName()))
			{
				sb.append("/");
				sb.append(stInfo.getMethodName());
				sb.append(" Line:");
				sb.append(stInfo.getLineNumber());
			}
		}
		return String.valueOf(sb);
	}
}
