/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKUEnetTikChgSaisoCst
*	ソースファイル名	：JBSbatKUEnetTikChgSaisoCst.java
*	作成者				：富士通　
*	作成日				：2012年03月01日
*＜機能概要＞
*　イーサネット帯域変更再送抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v3.00.00	2012/03/01  FJ)小川		新規作成
*	v7.00.00	2014/02/19  FJ)高橋	【TAI-2014-0000009】
*********************************************************************/
package eo.business.service;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JKUBatCommon;
import eo.common.constant.JPCBatchMessageConstant;
import eo.business.util.file.JBSbatKUIFE029;
import eo.business.util.table.JBSbatKU_T_ENET_TIK_CHG;
import eo.common.constant.JKUStrConst;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.application.JBSbatBusinessError;
import eo.framework.db.JBSbatSQLAccess;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKUEnetTikChgSaisoCst extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(工事案件)*/
	private static final String D_TBL_NAME_KU_T_KOJIAK = "KU_T_KOJIAK";

	/** テーブル(イーサネット帯域変更)*/
	private static final String D_TBL_NAME_KU_T_ENET_TIK_CHG = "KU_T_ENET_TIK_CHG";

	/** テーブルアクセスクラス(工事案件)*/
	private JBSbatSQLAccess db_KU_T_KOJIAK = null;

	/** テーブルアクセスクラス(イーサネット帯域変更)*/
	private JBSbatSQLAccess db_KU_T_ENET_TIK_CHG = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	/**▼▼▼▼▼▼業務チームで作成した宣言です 開始▼▼▼▼▼▼*/
	/** 申込明細番号編集用 */
	private static final String TEN_SPACE = "          ";
	/**▲▲▲▲▲▲業務チームで作成した宣言です 終了▲▲▲▲▲▲*/

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KU_T_KOJIAK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KU_T_KOJIAK);
		db_KU_T_ENET_TIK_CHG = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KU_T_ENET_TIK_CHG);
			/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		try
		{
			// 工事案件を格納する変数
			String kojiakNo = inMap.getString(JBSbatKU_T_ENET_TIK_CHG.KOJIAK_NO);
			
			/******************************************************/
			/***** 工事案件をレコードロックする。（wait指定） *****/
			/******************************************************/
			excCtrlKojiak(kojiakNo);
			
			/******************************************************/
			

			// 取得する条件を設定
			Object[] whereParam = new Object[1];
			
			// イーサネット帯域変更番号を設定
			whereParam[0] = inMap.getString(JBSbatKU_T_ENET_TIK_CHG.ENET_TIK_CHG_NO);
			
			// 抽出したイーサネット帯域変更のイーサネット帯域変更番号で抽出する
			JBSbatCommonDBInterface enetTikChgSelect = this.executeKU_T_ENET_TIK_CHG_PKSELECT(whereParam);
			
			// イーサネット帯域変更に存在しない場合
			if (null == enetTikChgSelect)
			{
				// 次レコードへ
				super.commit();
				return null;
			}
			
			if(enetTikChgChanged(enetTikChgSelect))
			{
				// 次レコードへ
				super.commit();
				return null;
			}
			
			// 出力ファイルを編集する
			JBSbatServiceInterfaceMap outMap = setOutMap(inMap);
	
			// 出力共通電文に入出力インターフェースを設定する
			outputBean.addOutMapList(outMap);
			
			// イーサネット帯域変更を更新
			updateEnetTikChg(inMap);
			
		}
		catch (JBSbatBusinessError eBusiness)
		{
			// ロールバック
			commonItem.getConnection().rollback();
			throw eBusiness;
		}

		// コミット
		super.commit();
		
		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KU_T_KOJIAK.close();
		db_KU_T_ENET_TIK_CHG.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
//	/**
//	 * PK(ＰＫ　検索)でDBアクセスを行います。<br>
//	 * <p>
//	 * <b>処理フロー</b><br>
//	 * <pre>
//	 * 1.引数で条件マップを作ります。<br>
//	 *
//	 * 2.DBアクセスを実行します。<br>
//	 * 
//	 * 3.メソッドの呼び出し方です。<br>
//	 *		引数:
//	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
//	 *		 	KOJIAK_NO
//	 * </pre>
//	 * <p>
//	 * @param whereParam 条件項目の値。
//	 * @return JBSbatCommonDBInterface 検索の結果。
//	 * @throws Exception 業務サービス内で発生した例外全般。
//	 */
//	private JBSbatCommonDBInterface executeKU_T_KOJIAK_PKSELECT(Object[] whereParam) throws Exception
//	{
//		// 条件のマップを作成します
//		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
//		whereMap.setValue("KOJIAK_NO", whereParam[0]);
//
//		// DBアクセスを実行します
//		return db_KU_T_KOJIAK.selectByPrimaryKeys(whereMap);
//	}

	/**
	 * PK(ＰＫ　更新)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.引数で条件マップを作ります。<br>
	 *
	 * 3.DBアクセスを実行します。<br>
	 * 
	 * 4.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	設定結果コード				SETTE_RSLT_CD
	 *		 	連携先依頼年月日時分秒				RNKS_REQ_DTM
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	ENET_TIK_CHG_NO
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @param whereParam 条件項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKU_T_ENET_TIK_CHG_PKUPDATE(Object[] setParam, Object[] whereParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("SETTE_RSLT_CD", setParam[0]);
		setMap.setValue("RNKS_REQ_DTM", setParam[1]);
	
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("ENET_TIK_CHG_NO", whereParam[0]);

		// DBアクセスを実行します
		db_KU_T_ENET_TIK_CHG.updateByPrimaryKeys(whereMap, setMap);
	}
	

	/**
	 * PK(ＰＫ　検索)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で条件マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	ENET_TIK_CHG_NO
	 * </pre>
	 * <p>
	 * @param whereParam 条件項目の値。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeKU_T_ENET_TIK_CHG_PKSELECT(Object[] whereParam) throws Exception
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("ENET_TIK_CHG_NO", whereParam[0]);

		// DBアクセスを実行します
		return db_KU_T_ENET_TIK_CHG.selectByPrimaryKeys(whereMap);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	/**▼▼▼▼▼▼業務チームで作成したメソッドです 開始▼▼▼▼▼▼*/


	/**
	 * 出力共通電文を設定します。
	 * @param inMap 入力電文
	 * @throws Exception
	 * @return 出力共通電文
	 */
	private JBSbatServiceInterfaceMap setOutMap(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		// 出力電文
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();

		// 明細申込番号編集（12桁→10桁）
		String subMskmNo = inMap.getString(JBSbatKU_T_ENET_TIK_CHG.MSKM_DTL_NO) + TEN_SPACE;
		subMskmNo = subMskmNo.substring(0, 10);
		
		// 編集後明細申込番号が10桁でない場合
		if (subMskmNo.trim().length() != 10) 
		{
			// ログ出力し、次レコードへ
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKUB0050TE, new String[]{
					"明細申込番号",
					subMskmNo});

			throw new JBSbatBusinessError();
		}

		// 明細申込番号
		outMap.setString(JBSbatKUIFE029.MSKM_DTL_NO, subMskmNo);

		// サービス契約番号
		outMap.setString(JBSbatKUIFE029.SVC_KEI_NO, inMap.getString(JBSbatKU_T_ENET_TIK_CHG.SVC_KEI_NO));
		
		// 旧料金プラン
		outMap.setString(JBSbatKUIFE029.OLD_PPLAN, inMap.getString(JBSbatKU_T_ENET_TIK_CHG.KOJI_OLD_PPLAN_CD));

		// 新料金プラン
		outMap.setString(JBSbatKUIFE029.NEW_PPLAN, inMap.getString(JBSbatKU_T_ENET_TIK_CHG.KOJI_NEW_PPLAN_CD));

		// 工事案件番号
		outMap.setString(JBSbatKUIFE029.KOJIAK_NO, inMap.getString(JBSbatKU_T_ENET_TIK_CHG.KOJIAK_NO));

		// イーサネット帯域変更番号
		outMap.setString(JBSbatKUIFE029.ENET_TIK_CHG_NO, inMap.getString(JBSbatKU_T_ENET_TIK_CHG.ENET_TIK_CHG_NO));

		// 予備１
		outMap.setString(JBSbatKUIFE029.YOBI_1, null);

		// 予備２
		outMap.setString(JBSbatKUIFE029.YOBI_2, null);

		// 予備３
		outMap.setString(JBSbatKUIFE029.YOBI_3, null);

		// 予備４
		outMap.setString(JBSbatKUIFE029.YOBI_4, null);

		// 予備５
		outMap.setString(JBSbatKUIFE029.YOBI_5, null);
		
		// 出力フラグを設定
		outMap.setOutFlg(true);
		
		return outMap;
	}

	/**
	 * イーサネット帯域変更を更新します。
	 * @param inMap 入力電文
	 * @throws Exception
	 */
	private void updateEnetTikChg(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		// 更新処理に渡すパラメタを初期化
		Object[] setParam = new Object[2];
		Object[] whereParam = new Object[1];
		
		// 更新処理に渡すパラメタを設定
		// 設定結果コード(3:再送信済)
		setParam[0] = JKUStrConst.CD01130_SAI_SOSHIN_ZM;
		// 連携先依頼年月日時分秒(システム日時)
		setParam[1] = JKUBatCommon.getSysDateTime();
		// イーサネット帯域変更番号
		whereParam[0] = inMap.getString(JBSbatKU_T_ENET_TIK_CHG.ENET_TIK_CHG_NO);
		
		// イーサネット帯域変更PK更新処理呼び出し
		this.executeKU_T_ENET_TIK_CHG_PKUPDATE(setParam, whereParam);
	}
	
	/**
	 * 工事案件のレコードロックを取得する。
	 * @param kojiakNo 工事案件番号
	 * @return 工事案件検索結果レコード
	 * @throws Exception
	 */
	private JBSbatCommonDBInterface excCtrlKojiak(String kojiakNo) throws Exception
	{
		/** DBアクセス結果を取得するためのMap */
		JBSbatCommonDBInterface kojiakMap = new JBSbatCommonDBInterface();
		
		// 検索処理に渡すパラメタを設定
		Object[] whereParam = new Object[1];
		
		whereParam[0] = kojiakNo;
		
		// 検索処理実行
		kojiakMap = this.executeKU_T_KOJIAK_PKSELECT(whereParam);
		
		// 検索結果が０件
		if (kojiakMap == null)
		{
			// 工事案件に該当の工事案件番号が存在しません。（0000000000）
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKUB0070KE, new String[]{
					JKUStrConst.SCHEMANM_KU0011,
					"工事案件番号",
					kojiakNo});
			
			throw new JBSbatBusinessError();
		}
		
		return kojiakMap;
	}

	
	/**
	 * PK(ＰＫ　検索)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で条件マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	KOJIAK_NO
	 * </pre>
	 * <p>
	 * @param whereParam 条件項目の値。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeKU_T_KOJIAK_PKSELECT(Object[] whereParam) throws Exception
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("KOJIAK_NO", whereParam[0]);

		// DBアクセスを実行します
		return db_KU_T_KOJIAK.selectByPrimaryKeysForUpdateWait(whereMap);
	}
	

	/**
	 * イーサネット帯域変更　変更有無チェック
	 * @param enetTikChgSelect 抽出イーサネット帯域変更
	 * @return boolean 変更有無
	 * @throws Exception
	 */
	private boolean enetTikChgChanged(JBSbatCommonDBInterface enetTikChgSelect) throws Exception
	{
		String setteRsltCd = enetTikChgSelect.getString(JBSbatKU_T_ENET_TIK_CHG.SETTE_RSLT_CD);
		
		if(JKUStrConst.CD01130_SAISO_REQ.equals(setteRsltCd))
		{
			// 設定結果コードが「再送依頼」
			return false;
		}
		else
		{
			// 上記に当てはまらない場合は変更されている
			return true;
		}
	}
	/**▲▲▲▲▲▲業務チームで作成したメソッドです 終了▲▲▲▲▲▲*/
}
