/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKThSTBKrStcRnkFileSks
*	ソースファイル名	：JBSbatKKThSTBKrStcRnkFileSks.java
*	作成者				：富士通　
*	作成日				：2014年08月22日
*＜機能概要＞
*　宅配ＳＴＢ仮設置連携ファイル作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2014/08/22  富士通		新規作成（ANK-2141-00-00）
*   v10.00.01   2014/10/23  富士通		【OM-2014-0003458】宅内機器異動コード変更対応
*   v22.00.00	2015/11/26	FJ)金本		【ANK-2732-00-00】 プロジェクト正常化 サービス開始に関するソース可読性向上
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatKKConst;
import eo.business.util.file.JBSbatKKIFM628;
import eo.business.util.file.JBSbatWCIFI006;
import eo.business.util.table.JBSbatKK_T_KKTK_SVC_KEI;
import eo.business.util.table.JBSbatZM_M_WORK_PARAM_KNRI;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessError;
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;
import eo.framework.log.JBSbatLogPrintControl;
import eo.framework.util.JBSbatStringUtil;
import eo.framework.util.JCCBatchEsbInterface;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKThSTBKrStcRnkFileSks extends JBSbatBusinessService
{
	// ++++++++++ v22.00.00	 削除開始 ++++++++++
//	/** 依頼処理コード："02"（新STB鍵開け） */
//	private static final String REQ_TRN_CD_02 = "02";
	// ++++++++++ v22.00.00	 削除終了 ++++++++++
	/** 工事案件番号："9999999999"  */
	private static final String KJ_ANK_NO_ALL9 = "9999999999";
	/** 旧STBに関する項目：""（宅内機器異動コードが"01"の場合、""となる。 */
	private static final String OLD_VALUE = "";
	/* ++++++++++ v10.00.01 変更開始 ++++++++++ */
	/** 宅内機器異動コード："01"（追加） */
//	private static final String TKNI_KIKI_IDO_CD_01 = "01";
	// ++++++++++ v22.00.00	 削除開始 ++++++++++
//	private static final String TKNI_KIKI_IDO_CD_01 = "02";
	// ++++++++++ v22.00.00	 削除終了 ++++++++++
	/* ++++++++++ v10.00.01 変更終了 ++++++++++ */
	/** サービス呼出時のリターンコード："0000"（正常） */
	private static final String RETURN_CODE_0000 = "0000";

	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(業務パラメータ管理)*/
	private static final String D_TBL_NAME_ZM_M_WORK_PARAM_KNRI = "ZM_M_WORK_PARAM_KNRI";

	/** SQL定義キー(KK_SELECT_020)*/
	private static final String ZM_M_WORK_PARAM_KNRI_KK_SELECT_020 = "KK_SELECT_020";

	/** テーブルアクセスクラス(業務パラメータ管理)*/
	private JBSbatSQLAccess db_ZM_M_WORK_PARAM_KNRI = null;

	/* ++++++++++ v10.00.01 追加開始 ++++++++++ */
	/** テーブル(機器提供サービス契約)*/
	private static final String D_TBL_NAME_KK_T_KKTK_SVC_KEI = "KK_T_KKTK_SVC_KEI";

	/** SQL定義キー(KK_SELECT_210)*/
	private static final String KK_T_KKTK_SVC_KEI_KK_SELECT_210 = "KK_SELECT_210";

	/** テーブルアクセスクラス(機器提供サービス契約)*/
	private JBSbatSQLAccess db_KK_T_KKTK_SVC_KEI = null;
	/* ++++++++++ v10.00.01 追加終了 ++++++++++ */

	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_ZM_M_WORK_PARAM_KNRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_WORK_PARAM_KNRI);
		/* ++++++++++ v10.00.01 追加開始 ++++++++++ */
		db_KK_T_KKTK_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KKTK_SVC_KEI);
		/* ++++++++++ v10.00.01 追加終了 ++++++++++ */
		
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		//出力ファイル 
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		//出力ファイルに設定する値を格納
		JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();
		// 新STBID
		String strNewStbId = "";
		// ティアグループコード
		String strTiaGroupCd = "";

		// inMapがNULLになる場合の考慮
		if (inMap == null) 
		{
			return outputItem;
		}
		
		/* ++++++++++ v10.00.01 追加開始 ++++++++++ */
		String inTaknkikiModelCd = inMap.getString(JBSbatKKIFM628.TAKNKIKI_MODEL_CD);
		String inKikiSeizoNo = inMap.getString(JBSbatKKIFM628.KIKI_SEIZO_NO);
		/* ++++++++++ v10.00.01 追加終了 ++++++++++ */
		
		// =============================== //
		// 新STBIDを取得する。             //
		// =============================== //
		// サービス呼出
		/* ++++++++++ v10.00.01 変更開始 ++++++++++ */
//		strNewStbId = this.callKKSV0691(inMap);
		strNewStbId = this.callKKSV0691(inTaknkikiModelCd, inKikiSeizoNo);
		/* ++++++++++ v10.00.01 変更終了 ++++++++++ */
		
		/* ++++++++++ v10.00.01 追加開始 ++++++++++ */
		// 旧機器の機器提供サービス契約番号を取得
		String old_kktk_svc_kei_no = inMap.getString(JBSbatKKIFM628.KKTK_SVC_KEI_NO);
		
		// 旧機器のカレント情報を取得する
		JBSbatCommonDBInterface resultMap = getKktkSvcKeiInfo(old_kktk_svc_kei_no);
		
		// 旧機器の宅内機器型式コード、機器製造番号を取得
		String old_taknkiki_model_cd = "";
		String old_kiki_seizo_no = "";
		
		if (resultMap != null)
		{
			old_taknkiki_model_cd = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_KKTK_SVC_KEI.TAKNKIKI_MODEL_CD));
			old_kiki_seizo_no = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_KKTK_SVC_KEI.KIKI_SEIZO_NO));
		}
		
		// 旧機器のＳＴＢＩＤを取得する
		String old_stb_id = this.callKKSV0691(old_taknkiki_model_cd, old_kiki_seizo_no);
		/* ++++++++++ v10.00.01 追加終了 ++++++++++ */

		// ティアグループコードを取得する。
		strTiaGroupCd = this.getTiaGrpCd(inMap);

		// =============================================== //
		// 出力ファイルへ入力電文の内容を移し替える        //
		// =============================================== //
		// ++++++++++ v22.00.00 変更開始 ++++++++++
//		outmap.set(JBSbatWCIFI006.REQ_TRN_CD, REQ_TRN_CD_02);
		outmap.set(JBSbatWCIFI006.REQ_TRN_CD, JBSbatKKConst.WCIFI007_REQ_TRN_CD_02);
		// ++++++++++ v22.00.00 変更終了 ++++++++++
		outmap.set(JBSbatWCIFI006.KOJIAK_NO, KJ_ANK_NO_ALL9);
		outmap.set(JBSbatWCIFI006.SVC_KEI_NO, inMap.getString(JBSbatKKIFM628.SVC_KEI_NO));
		outmap.set(JBSbatWCIFI006.NEW_TAKNKIKI_MODEL_CD, inMap.getString(JBSbatKKIFM628.TAKNKIKI_MODEL_CD));
		outmap.set(JBSbatWCIFI006.NEW_KIKI_SEIZO_NO, inMap.getString(JBSbatKKIFM628.KIKI_SEIZO_NO));
		outmap.set(JBSbatWCIFI006.NEW_STB_ID, strNewStbId);
		/* ++++++++++ v10.00.01 変更開始 ++++++++++ */
//		outmap.set(JBSbatWCIFI006.OLD_TAKNKIKI_MODEL_CD, OLD_VALUE);
//		outmap.set(JBSbatWCIFI006.OLD_KIKI_SEIZO_NO, OLD_VALUE);
//		outmap.set(JBSbatWCIFI006.OLD_STB_ID, OLD_VALUE);
		outmap.set(JBSbatWCIFI006.OLD_TAKNKIKI_MODEL_CD, old_taknkiki_model_cd);
		outmap.set(JBSbatWCIFI006.OLD_KIKI_SEIZO_NO, old_kiki_seizo_no);
		outmap.set(JBSbatWCIFI006.OLD_STB_ID, old_stb_id);
		/* ++++++++++ v10.00.01 変更終了 ++++++++++ */
		// ++++++++++ v22.00.00 変更開始 ++++++++++
//		outmap.set(JBSbatWCIFI006.TAKNKIKI_IDO_CD, TKNI_KIKI_IDO_CD_01);
		outmap.set(JBSbatWCIFI006.TAKNKIKI_IDO_CD, JBSbatKKConst.CD00562_TAKNKIKI_IDO_CD_02);
		// ++++++++++ v22.00.00 変更終了 ++++++++++
		outmap.set(JBSbatWCIFI006.TIA_GRP_CD, strTiaGroupCd);

		//出力フラグを設定
		outmap.setOutFlg(true);
		//出力共通電文に入出力インターフェースを設定する。
		outputItem.addOutMapList(outmap);

		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_ZM_M_WORK_PARAM_KNRI.close();
		/* ++++++++++ v10.00.01 追加開始 ++++++++++ */
		db_KK_T_KKTK_SVC_KEI.close();
		/* ++++++++++ v10.00.01 追加終了 ++++++++++ */
		
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(KK_SELECT_020)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	業務パラメータID
	 *		 	業務パラメータ適用開始年月日
	 *		 	業務パラメータ適用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_M_WORK_PARAM_KNRI_KK_SELECT_020(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_ZM_M_WORK_PARAM_KNRI.selectBySqlDefine(paramList, ZM_M_WORK_PARAM_KNRI_KK_SELECT_020);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/


	/**
	 * @param inMap 入力電文
	 * @return String ティアグループコード
	 * @throws Exception 
	 */
	private String getTiaGrpCd(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		// バインド変数リスト
		Object[] param = new Object[]{"WC_TOK_DGTIA_GRP_CD1",super.opeDate,super.opeDate};
		// 検索結果取得マップ
		JBSbatCommonDBInterface MapResult = new JBSbatCommonDBInterface();

		// 業務パラメータ管理検索処処理
		this.executeZM_M_WORK_PARAM_KNRI_KK_SELECT_020(param);

		// 検索結果格納
		MapResult = db_ZM_M_WORK_PARAM_KNRI.selectNext();

		// 値が取得できなかった場合の考慮
		if (MapResult == null)
		{
			return "";
		}

		// 検索結果返却
		return JBSbatStringUtil.Rtrim(MapResult.getString(JBSbatZM_M_WORK_PARAM_KNRI.WORK_PARAM_SETTE_VALUE));
	}

	/**
	 * サービスインターフェース宅内機器一意照会（KKSV0691）の呼出を行い結果を取得します。
	 * 
	 * @param inMap　入力電文
	 * @return String サービス呼出結果により取得したSTBID
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	@SuppressWarnings("unchecked")
	/* ++++++++++ v10.00.01 変更開始 ++++++++++ */
//	private String callKKSV0691(JBSbatServiceInterfaceMap inMap) throws Exception
	private String callKKSV0691(String inTaknkikiModelCd, String inKikiSeizoNo) throws Exception
	{
	/* ++++++++++ v10.00.01 変更終了 ++++++++++ */
		// 
		HashMap<String, String> mapEKKA0020003CBSMsg = new HashMap<String, String>();
		/* ++++++++++ v10.00.01 削除開始 ++++++++++ */
//		String inTaknkikiModelCd = inMap.getString(JBSbatKKIFM628.TAKNKIKI_MODEL_CD);
//		String inKikiSeizoNo = inMap.getString(JBSbatKKIFM628.KIKI_SEIZO_NO);
		/* ++++++++++ v10.00.01 削除終了 ++++++++++ */
		
		ArrayList<HashMap<String, String>> aryEKKA0020003CBSMsg1List = new ArrayList<HashMap<String, String>>();

		// 宅内機器型式コード
		mapEKKA0020003CBSMsg.put("key_tk_mdl_cd", inTaknkikiModelCd);
		// 機器製造番号
		mapEKKA0020003CBSMsg.put("key_kk_seizo_no", inKikiSeizoNo);
		aryEKKA0020003CBSMsg1List.add(mapEKKA0020003CBSMsg);

		// サービスに渡す業務データを格納するMAPに設定するデータをHashMapで構築する。
		HashMap<String, Object> dataMap = new HashMap<String, Object>();
		dataMap.put("EKKA0020003CBSMsg1List", aryEKKA0020003CBSMsg1List);
		dataMap.put("func_code", "1");
		
		// サービスに渡す業務データを格納するMAP
		HashMap<String, Object> inputMap = new HashMap<String, Object>();
		inputMap.put("KKSV069101SC", dataMap);
		
		// ユースケースIDを格納するMAP
		HashMap<Object, Object> paramMap = new HashMap<Object, Object>();
		paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_USECASE_ID, "KKSV0691");
		paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_OPERATION_ID, "KKSV0691OP");
		
		// サービスの処理結果が格納されるMAP
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		
		// サービス呼び出し
		JCCBatchEsbInterface.invokeService(super.commonItem, paramMap, inputMap, outputMap);
		
		// エラー判定
		String returnCode = outputMap.get("RETURN_CODE").toString();
		if(!RETURN_CODE_0000.equals(returnCode))
		{
			String msg = JBSbatLogPrintControl.getMessage(JPCBatchMessageConstant.EKKB0270CE, new String[]{"KKSV0691"});
			JBSbatBusinessError ex = new JBSbatBusinessError(msg);
			throw ex;
		}

		// サービスの処理結果より取得
		HashMap<String, Object>  resultMap = (HashMap<String, Object>)outputMap.get("KKSV069101SC");
		ArrayList<HashMap<String, String>> resultList = (ArrayList<HashMap<String, String>>)resultMap.get("EKKA0020003CBSMsg2List");
		
		// サービスインターフェースより返却値が設定されている場合
		if(null != resultList && 0 != resultList.size())
		{
			// 一覧照会結果をループさせて、結果を取得する。
			for(int i=0;i<resultList.size();i++){
				HashMap<String, String> childMap = (HashMap<String, String>)resultList.get(i);
				
				String outTaknkikiModelCd = (String)childMap.get("tk_mdl_cd");
				String outKikiSeizoNo = (String)childMap.get("kk_seizo_no");
				
				// InデータとOutデータを比較して一致した場合、STB_IDを取得する。
				if(inTaknkikiModelCd.equals(outTaknkikiModelCd) && inKikiSeizoNo.equals(outKikiSeizoNo)){

					return (String)childMap.get("stbid");
				}
			}
		}
		return "";
	}
	
	/* ++++++++++ v10.00.01 追加開始 ++++++++++ */
	/**
	 * SQLKEY(KK_SELECT_210)で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_KKTK_SVC_KEI_KK_SELECT_210(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		
		// DBアクセスを実行します
		db_KK_T_KKTK_SVC_KEI.selectBySqlDefine(paramList, KK_T_KKTK_SVC_KEI_KK_SELECT_210);
	}
	
	/**
	 * @param kktk_svc_kei_no 機器提供サービス契約番号
	 * @return JBSbatCommonDBInterface 機器提供サービス契約検索結果マップ
	 * @throws Exception 
	 */
	private JBSbatCommonDBInterface getKktkSvcKeiInfo(String kktk_svc_kei_no) throws Exception
	{
		// バインド変数リスト
		Object[] param = new Object[]{super.opeDate, kktk_svc_kei_no};
		
		// 業務パラメータ管理検索処処理
		this.executeKK_T_KKTK_SVC_KEI_KK_SELECT_210(param);
		
		// 検索結果返却
		return db_KK_T_KKTK_SVC_KEI.selectNext();
	}
	/* ++++++++++ v10.00.01 追加終了 ++++++++++ */
}
