/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKJoiKkSeizoNoUpd.java
*	ソースファイル名	：JBSbatKKJoiKkSeizoNoUpd.java.java
*	作成者				：富士通　
*	作成日				：2014年12月17日
*＜機能概要＞
*　上位機器製造番号更新部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2014/12/17   富士通		新規作成
*********************************************************************/
package eo.business.service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JKKBatConst;
import eo.business.util.table.JBSbatKK_T_KKTK_SVC_KEI;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessError;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.util.JBSbatStringUtil;
import eo.framework.util.JCCBatchEsbInterface;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKJoiKkSeizoNoUpd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(機器提供サービス契約)*/
	private static final String D_TBL_NAME_KK_T_KKTK_SVC_KEI = "KK_T_KKTK_SVC_KEI";
	
	/** SQL定義キー(KK_SELECT_002)*/
	private static final String KK_T_KKTK_SVC_KEI_KK_SELECT_212 = "KK_SELECT_212";

	/** テーブルアクセスクラス(機器提供サービス契約)*/
	private JBSbatSQLAccess db_KK_T_KKTK_SVC_KEI = null;
	
	/** ユースケースID */
	private final String USECASE_ID = "KKSV0801";
	
	/** オペレーションID */
	private final String OPERATION_ID = "KKSV0801OP";
	
	/** CCタイトル */
	private final String CC_TITLE_KKSV080101CC= "KKSV080101CC";
	
	/** ファイルINDEX STB 機器製造番号:1 */
	private final int INDEX_NEW_KIKI_SEIZO_NO = 1;
	
	/** ファイルINDEX STB 宅内機器型式コード:2 */
	private final int INDEX_NEW_TAKNKIKI_MODEL_CD = 2;
	
	/** 入力ファイルインデックス STB サービス契約内訳番号:4 */
	private final int INDEX_SVC_KEI_UCWK_NO = 4;
	
	/** 宅内機器種別コード B-CAS */
	private final String TAKNKIKI_SBT_CD_B0 = "B0";
	
	/** 上位機器製造番号CC用パラメータ マッピングキー 機器情報リスト KEY:kiki_info_list*/
	private final String KIKI_INFO_LIST = "kiki_info_list";
	
	/** 上位機器製造番号CC用パラメータ マッピングキー 宅内機器型式コード(B-CAS) KEY:takn_kiki_model_cd_bcas*/
	private final String MODEL_CD_BCAS = "takn_kiki_model_cd_bcas";
	
	/** 上位機器製造番号CC用パラメータ マッピングキー 機器製造番号(B-CAS) KEY:takn_kiki_model_cd_bcas*/
	private final String SEIZO_NO_BCAS = "kiki_seizo_no_bcas";
	
	/** 上位機器製造番号CC用パラメータ マッピングキー 宅内機器型式コード(STB) : takn_kiki_model_cd_stb */
	private final String MODEL_CD_STB = "takn_kiki_model_cd_stb";
	
	/** 上位機器製造番号CC用パラメータ マッピングキー 機器製造番号(STB) : kiki_seizo_no_stb */
	private final String SEIZO_NO_STB = "kiki_seizo_no_stb";
	
	/** エラー情報格納キー */
	private static final String RSULT_KEY_KKSV0801 = "RSULT_KEY_KKSV0801";

	
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		db_KK_T_KKTK_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KKTK_SVC_KEI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		/**
		 * 中間ファイル読込
		 */
		ArrayList<String[]> recList = getFile();
		int recListSize = recList.size();
		if(recListSize == 0) {
			// 処理件数0件の場合は処理終了
			return null;
		}
		
		/**
		 * サービス呼出準備
		 */
		ArrayList<HashMap<String, Object>> kikiInfoList = new ArrayList<HashMap<String, Object>>();		// 機器情報リスト
		
		// 中間ファイルから上位機器製造番号更新CC用パラメータを作成します。
		String[] rec = null;
		for (int i =0; i < recListSize; i++)
		{
			HashMap<String, Object> kikiMap = new HashMap<String, Object>();							// 機器情報リストの要素
			rec = recList.get(i);
			
			// 機器提供サービス契約スキーマからサービス契約内訳番号をキーにB-CASの情報を取得します。
			JBSbatCommonDBInterface kk0161Map = executeKK_T_KKTK_SVC_KEI_KK_SELECT_212(rec[INDEX_SVC_KEI_UCWK_NO]);
			
			if(kk0161Map == null)
			{
				// 交換前STB機器に紐づくB-CAS情報が取得できない場合
				// EACB0240CW	【警告】ＤＢ未存在エラー（DB：%1%　Key：%2%）
				String[] msg = new String[]{"機器提供サービス契約(KK_SELECT_212)", "サービス契約内訳番号：" + rec[INDEX_SVC_KEI_UCWK_NO]};
				super.logPrint.printBusinessErrorLog("EACB0240CW", msg);
				continue;
			}
			
			kikiMap.put(MODEL_CD_BCAS, JBSbatStringUtil.Rtrim(kk0161Map.getString(JBSbatKK_T_KKTK_SVC_KEI.TAKNKIKI_MODEL_CD)));
			kikiMap.put(SEIZO_NO_BCAS, JBSbatStringUtil.Rtrim(kk0161Map.getString(JBSbatKK_T_KKTK_SVC_KEI.KIKI_SEIZO_NO)));
			kikiMap.put(MODEL_CD_STB, rec[INDEX_NEW_TAKNKIKI_MODEL_CD]);
			kikiMap.put(SEIZO_NO_STB, rec[INDEX_NEW_KIKI_SEIZO_NO]);
			
			kikiInfoList.add(kikiMap);
		}
		
		HashMap<String, Object> reqMap = new HashMap<String, Object>();									// サービスの入力パラメータMap
		HashMap<String, Object> kksv080101map = new HashMap<String, Object>();							// 上位機器製造番号更新CCの全パラメータMap
		kksv080101map.put(KIKI_INFO_LIST, kikiInfoList);												// 上位機器製造番号更新CCのパラメータMap
		reqMap.put(CC_TITLE_KKSV080101CC, kksv080101map);
		
		// サービスの処理結果が格納されるMAP
		HashMap<Object, Object> resMap = new HashMap<Object, Object>();
		
		// ユースケースIDを格納するMAP
		HashMap<String, Object>  req = new HashMap<String, Object>();
		req.put(JCCBatchEsbInterface.TELEGRAM_INFO_USECASE_ID, USECASE_ID);
		req.put(JCCBatchEsbInterface.TELEGRAM_INFO_OPERATION_ID, OPERATION_ID);
		
		// サービス呼び出し
		JCCBatchEsbInterface.invokeService(super.commonItem, req, reqMap, resMap);
		
		// サービス処理結果を確認
		String returnCode = (String)resMap.get("RETURN_CODE");
		
		if(!"0000".equals(returnCode))
		{
			// サービスIF返却マップリストを取得
			ArrayList<HashMap<Object,Object>> mapList = (ArrayList<HashMap<Object, Object>>) resMap.get(RSULT_KEY_KKSV0801);
			// サービスIF返却マップ格納用
			HashMap<Object,Object> map = null;
			for (int i = 0; i < mapList.size(); i++)
			{
				map = mapList.get(i);
				
				if(map == null)
				{
					continue;
				}
				// ログメッセージ用
				StringBuilder message = new StringBuilder();
				
				Iterator<Object> it = map.keySet().iterator();
				while (it.hasNext())
				{
					String key = (String)it.next();
					message.append("[" + key + ":");
					message.append(map.get(key) + "] ");
				}
				
				message.append(" | ");
				super.logPrint.printBusinessErrorLog("EZMB0290CW", new String[]{"サービス呼出", message.toString()});
			}
			
			// EZMB0290CW	%1%でエラーが発生しました。 %2%	1	1	0
			String[] msg = new String[]{"サービス呼出(KKSV0801OP)","RETURN_CODE:" + returnCode};
			super.logPrint.printBusinessErrorLog("EZMB0290CW", msg);
			throw new JBSbatBusinessError();
		}
		
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 中間ファイルを読み込みます
	 * @throws JBSbatBusinessException
	 * @throws IOException
	 */
	private ArrayList<String[]> getFile() throws JBSbatBusinessException, IOException {
		String[] free_item = commonItem.getFreeItem().split(";");
		String filePath = free_item[0];
		
		if (filePath == null || 0 == filePath.length())
		{
			// ファイルパスが取得できなかった場合エラー
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0130CE, new String[]{"起動パラメータP18が不正です。"});
		}
		
		// ファイル読込
		JBSbatInputFileUtil fileObj = null;
		ArrayList<String[]> recList =  new ArrayList<String[]>();			// ファイルデータ保持用
		
		try
		{
			// KKIFM631001ファイルを読み込み
			fileObj = new JBSbatInputFileUtil(filePath);
			
			fileObj.setEncode(JKKBatConst.SJIS);
			fileObj.setLine(JKKStrConst.LINE_LF);
			fileObj.createReader();
			
			String line = null;												// ファイル1行保持
			
			// 入力件数分ループ
			while((line = fileObj.readLine()) != null) {
				String[] rec = null;											// ファイル1行分保持(カンマ分割済)
				
				// 1レコードを配列化
				rec = line.split(",");
				
				if("".equals(rec) || rec.length != 5)
				{
					// EKKB0010CW	エラーが発生しましたが、処理を継続します。エラー内容(%1%)
					String[] msg = new String[]{"ファイル読込処理：対象レコードの項目数が不正です。項目数[" + rec.length + "]"};
					super.logPrint.printBusinessErrorLog("EKKB0010CW", msg);
					continue;
				}
				
				for(int i =0; i < rec.length; i++)
				{
					// 全項目必須。1項目でも空白の場合は処理対象外。
					if("".equals(rec[i]))
					{
						// EKKB0010CW	エラーが発生しましたが、処理を継続します。エラー内容(%1%)
						String[] msg = new String[]{"ファイル読込処理：空白の項目が存在します。"};
						super.logPrint.printBusinessErrorLog("EKKB0010CW", msg);
						continue;
					}
				}
				
				// 処理対象としてリストへ格納します。
				recList.add(rec);
			}
			
		}
		catch (IOException e)
		{
			throw new JBSbatBusinessException("EKKB0020CE", new String[]{filePath});
		}
		finally
		{
			fileObj.close();
		}
		return recList;
	}
	
	/**
	 * SQLKEY(KK_SELECT_212)でDBアクセスを行います。<br>
	 * @param param バイント変数の値配列。
	 * @return 
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeKK_T_KKTK_SVC_KEI_KK_SELECT_212(String key) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(super.opeDate);
		paramList.setValue(TAKNKIKI_SBT_CD_B0);
		paramList.setValue(key);
		// DBアクセスを実行します
		db_KK_T_KKTK_SVC_KEI.selectBySqlDefine(paramList, KK_T_KKTK_SVC_KEI_KK_SELECT_212);
		
		return db_KK_T_KKTK_SVC_KEI.selectNext();
	}
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		db_KK_T_KKTK_SVC_KEI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
