/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKCreateECSmartLinkInfo
*	ソースファイル名	：JBSbatKKCreateECSmartLinkInfo.java
*	作成者				：富士通　
*	作成日				：2014年09月02日
*＜機能概要＞
*　ＥＣ向けスマートリンク契約情報ファイル作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v10.00.00	2014/09/03  FJ)藤田		【ANK-1847-00-00】新規作成
*	v10.01.00	2014/09/17  FJ)藤田		【IT2-2014-0000315】バックアップが重複してコピーされる
*	v11.00.00	2014/11/21  FJ)藤田		【ANK-2407-00-00】EC向けスマリン情報連携の仕変対応
*	v16.00.00	2015/09/08  FJ)原田		【ANK-2480-00-00】新電力対応（STEP1-2）
*	v23.00.00	2016/03/08  FJ)星野		【OM-2016-0000271】性能改善対応
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCNBatCommon;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.util.JBSbatBusinessFileUtil;
import eo.framework.util.JBSbatCheckUtil;
import eo.business.util.file.JBSbatKKIFE245;
import eo.business.util.file.JBSbatKKIFE246;
import eo.common.constant.JCNStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCBatchMessageConstant;

/**
* 受信したEC_SYSID.csvファイルから、ＥＣ向けスマートリンク契約情報ファイルを作成します<p>
*<BR>
* @author 富士通
*/
public class JBSbatKKCreateECSmartLinkInfo extends JBSbatBusinessService
{
	/* ++++++++++ v23.00.00 DEL START ++++++++++ */
//	/** テーブルアクセスクラス(サービス契約)*/
//	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;
	/* ++++++++++ v23.00.00 DEL END   ++++++++++ */
	/** テーブルアクセスクラス(サービスマスタ)*/
	private JBSbatSQLAccess db_KK_M_SVC = null;
	/** テーブルアクセスクラス(料金プランマスタ)*/
	private JBSbatSQLAccess db_KK_M_PPLAN = null;

	/* ++++++++++ v23.00.00 DEL START ++++++++++ */
//	/** テーブル(サービス契約) */
//	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";
	/* ++++++++++ v23.00.00 DEL END   ++++++++++ */
	/** テーブル(サービスマスタ) */
	private static final String D_TBL_NAME_KK_M_SVC = "KK_M_SVC";
	/** テーブル(料金プランマスタ) */
	private static final String D_TBL_NAME_KK_M_PPLAN = "KK_M_PPLAN";

	/* ++++++++++ v23.00.00 DEL START ++++++++++ */
//	/** SQL定義キー(KK_T_SVC-KK_SELECT_305)*/
//	private static final String KK_T_SVC_KEI_KK_SELECT_305 = "KK_SELECT_305";
	/* ++++++++++ v23.00.00 DEL END   ++++++++++ */

	/** SQL定義キー(KK_M_SVC-KK_SELECT_002)*/
	private static final String KK_M_SVC_KK_SELECT_002 = "KK_SELECT_002";

	/** SQL定義キー(KK_M_PPLAN-AK_SELECT_001)*/
	private static final String KK_M_PPLAN_AK_SELECT_001 = "AK_SELECT_001";

	/** 処理年月日 */
	private String tran_date = "";

	/* ++++++++++ v23.00.00 DEL START ++++++++++ */
//	/** 一括処理対処のSYSIDリスト */
//	private List<String> sysidList = null;
//	
//	/** 一括対象件数 */
//	private static int IKKATSU_KENSU;
	/* ++++++++++ v23.00.00 DEL END   ++++++++++ */
	
	/* ++++++++++ v23.00.00 ADD START ++++++++++ */
	// 抽出結果ファイルキャッシュリスト
	private List<JBSbatServiceInterfaceMap> KKIFM702List = new ArrayList<JBSbatServiceInterfaceMap>();
	
	// キーブレイク判定用SYSID
	private String tmpSysid = "";
	
	// 出力レコード件数
	private int outputCount = 0;
	/* ++++++++++ v23.00.00 ADD END   ++++++++++ */
	
	/** サービスコード名称マップ */
	private Map<String, String> svcCdNmMap = null;

	/** 料金プランコード名称マップ */
	private Map<String, String> pplanCdNmMap = null;
	
	// 優先度判定用の配列格納キー
	/** 優先レコード判定用キー eo光ネット */
	private static final String PRIOR_KEY_SVC_NET    = "1";
	/** 優先レコード判定用キー eo光テレビ */
	private static final String PRIOR_KEY_SVC_TV     = "2";
	/** 優先レコード判定用キー eo光電話 */
	private static final String PRIOR_KEY_SVC_TEL    = "3";
	/** 優先レコード判定用キー eoモバイル */
	private static final String PRIOR_KEY_SVC_MOBILE = "4";
	/** 優先レコード判定用キー MVNO */
	private static final String PRIOR_KEY_SVC_MVNO   = "5";
	// 「ANK-2480-00-00_新電力対応」【STEP1-2】2015/09/08 原田 ADD START
	/** 優先レコード判定用キー eo電気 */
	private static final String PRIOR_KEY_SVC_ELECTORIC   = "6";
	// 「ANK-2480-00-00_新電力対応」【STEP1-2】2015/09/08 原田 ADD START
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		/* ++++++++++ v23.00.00 DEL START ++++++++++ */
//		db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		/* ++++++++++ v23.00.00 DEL END   ++++++++++ */
		db_KK_M_SVC     = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_M_SVC);
		db_KK_M_PPLAN   = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_M_PPLAN);
		
		tran_date = commonItem.getOpeDate();
		
		/* ++++++++++ v23.00.00 DEL START ++++++++++ */
//		// 一括処理対象SYSIDリスト
//		sysidList = new ArrayList<String>();
//		
//		// 一括処理件数を設定
//		IKKATSU_KENSU = 50;
		/* ++++++++++ v23.00.00 DEL END   ++++++++++ */

		super.logPrint.printDebugLog("=== JBSbatKKCreateECSmartLinkInfo class initialized. ===");
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
//		super.logPrint.printDebugLog("=== JBSbatKKCreateECSmartLinkInfo class Main Process started. ===");
		// 入力レコードに異常があった場合
		if (inMap.isInputErrorFlg())
		{
			// 業務エラーログ出力
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB0100AE, new String[] {"EC_SYSID.csv"});
			// エラーフラグ設定
			super.commonItem.setErrFlg(true);
			return null;
		}

		/* ++++++++++ v23.00.00 DEL START ++++++++++ */
//		// データをHashMapに格納
//		HashMap rsMap = inMap.getMap();
		/* ++++++++++ v23.00.00 DEL END   ++++++++++ */

		// 抽出データ
		List<HashMap<String, Object>> ecRenkeiRecords = new ArrayList<HashMap<String, Object>>();
		
		// 入力データ取得
		String sysid = (String)inMap.get(JBSbatKKIFE245.SYSID);

		// IT2-2014-0000315 バックアップが重複してコピーされる 2014/09/17 藤田 DEL START
//		// 単項目チェック
//		if (!isSingleCheckKKIFE245_INF1(rsMap, getItemvalueMap(sysid)))
//		{
////			// エラーフラグ設定
//			commonItem.setErrFlg(true);
//			// 入力値に不正があっても出力します
////			return null;
//		}
		// IT2-2014-0000315 バックアップが重複してコピーされる 2014/09/17 藤田 DEL END

		/* ++++++++++ v23.00.00 DEL START ++++++++++ */
//		sysidList.add(sysid);
		/* ++++++++++ v23.00.00 DEL END   ++++++++++ */

		/* ++++++++++ v23.00.00 ADD START ++++++++++ */
		// 最終1件の場合はここでレコードをキャッシュリストに追加して処理する
		if(commonItem.isEndRecordFlg()){
			KKIFM702List.add(inMap);
		}
		/* ++++++++++ v23.00.00 ADD END   ++++++++++ */
		
		/* ++++++++++ v23.00.00 MOD START ++++++++++ */
//		// ＩＮ句に指定する数だけたまったらＳＱＬを発行
//		// または最後のデータを参照し終わったらＳＱＬを発行
//		if (sysidList.size() >= IKKATSU_KENSU || commonItem.isEndRecordFlg())
//		{
		
		// SYSIDがキーブレイクしたらレコード編集（性能改善前のSQL発行相当）
		// または最後のデータを参照し終わったらレコード編集
		if (!tmpSysid.equals(sysid) || commonItem.isEndRecordFlg())
		{
		/* ++++++++++ v23.00.00 MOD END   ++++++++++ */
			// コードマップの作成
			if (svcCdNmMap == null)
			{
				createSvcCdNmMap();
//				super.logPrint.printDebugLog("サービスコード名称マップ作成");
			}
			if (pplanCdNmMap == null)
			{
				createPPlanCdNmMap();
//				super.logPrint.printDebugLog("料金プランコード名称マップ作成");
			}
			
			
			/* ++++++++++ v23.00.00 MOD START ++++++++++ */
//			List<HashMap<String, Object>> rows = createECSmartLinkInfoRows(sysidList);
			List<HashMap<String, Object>> rows = createECSmartLinkInfoRows(KKIFM702List);
			/* ++++++++++ v23.00.00 MOD END   ++++++++++ */
			if (rows != null)
			{
				ecRenkeiRecords.addAll(rows);
			}
			/* ++++++++++ v23.00.00 MOD START ++++++++++ */
//			sysidList.clear();
			// レコードキャッシュをクリア
			KKIFM702List.clear();
			/* ++++++++++ v23.00.00 MOD END   ++++++++++ */
		}
		
		/* ++++++++++ v23.00.00 ADD START ++++++++++ */
		// キーブレイク判定用のSYSIDを更新
		tmpSysid = sysid;
		// 入力レコードをキャッシュ
		KKIFM702List.add(inMap);
		/* ++++++++++ v23.00.00 ADD END ++++++++++ */

		// 出力ファイル情報の作成
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		int n = ecRenkeiRecords.size();
		for (int i=0; i < n; i++)
		{
			HashMap<String, Object> inputMap = ecRenkeiRecords.get(i);
			
			// 入出力インターフェースオブジェクトを生成
			JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();
			
			// 出力項目設定
			setOutMap(outmap, inputMap);
			
			// レコード出力判定フラグを設定
			outmap.setOutFlg(true);
	
			// 出力共通電文に入出力インターフェースを設定する。
			outputBean.addOutMapList(outmap);
			/* ++++++++++ v23.00.00 ADD START ++++++++++ */
			// 出力レコード件数カウントアップ
			outputCount++;
			/* ++++++++++ v23.00.00 ADD END   ++++++++++ */
		}

		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		// DBアクセスクラスをクローズします
		/* ++++++++++ v23.00.00 DEL START ++++++++++ */
//		db_KK_T_SVC_KEI.close();
		/* ++++++++++ v23.00.00 DEL END ++++++++++ */
		db_KK_M_SVC.close();
		db_KK_M_PPLAN.close();

		// パラメータを区切り文字で分割する
		String strFreeParam = commonItem.getFreeItem();
		String[] lines = strFreeParam.split(JCNStrConst.S_PARAM_DELIM);
		
		String strFreeParam1 = lines[0];
		String strFreeParam2 = lines[1];
		
		// 件数ファイル出力
//			String strRecCnt = createCSV(new String[] {JCNBatCommon.strZeroPad(String.valueOf(commonItem.getInputCount()), 10)}, false);
		/* ++++++++++ v23.00.00 MOD START ++++++++++ */
//		String strRecCnt = "\"" + commonItem.getInputCount() + "\"";
		String strRecCnt = "\"" + outputCount + "\"";
		/* ++++++++++ v23.00.00 MOD END   ++++++++++ */
		JBSbatBusinessFileUtil obj2 = JCNBatCommon.createBusinessFileUtil(strFreeParam1, JCNStrConst.SJIS, JCNStrConst.S_LINE_SEPARAOR_LF, "");
		JCNBatCommon.printBusinessFileUtil(obj2, strRecCnt);
		JCNBatCommon.closeBusinessFileUtil(obj2);
		
		// FTPフラグファイル出力
		JBSbatBusinessFileUtil obj3 = JCNBatCommon.createBusinessFileUtil(strFreeParam2, JCNStrConst.SJIS, JCNStrConst.S_LINE_SEPARAOR_LF, "");
		JCNBatCommon.closeBusinessFileUtil(obj3);
		
//		if (commonItem.isErrFlg()) {
//			super.logPrint.printDebugLog("エラーが発生しています。");
//		}
		
		super.logPrint.printDebugLog("=== JBSbatKKCreateECSmartLinkInfo class terminated. ===");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * DB検索を行い、サービスコード名称マップを作成します。
	 * @throws Exception
	 */
	private void createSvcCdNmMap()
		throws Exception
	{
		svcCdNmMap = new HashMap<String, String>();
		
		JBSbatCommonDBInterface rcvMap = new JBSbatCommonDBInterface();		// 結果取得用
		Object[] params = {
				tran_date,
		};

		executeKK_M_SVC_KK_SELECT_002(params);

		// データを読む
		rcvMap = db_KK_M_SVC.selectNext();
		while(rcvMap != null)
		{
			String svcCd = rcvMap.getString("SVC_CD");
			String svcNm = rcvMap.getString("SVC_NM");
			
			svcCdNmMap.put(svcCd, svcNm);
			rcvMap = db_KK_M_SVC.selectNext();
		}
	}

	/**
	 * DB検索を行い、料金プランコード名称マップを作成します。
	 * @throws Exception
	 */
	private void createPPlanCdNmMap()
		throws Exception
	{
		pplanCdNmMap = new HashMap<String, String>();
		
		JBSbatCommonDBInterface rcvMap = new JBSbatCommonDBInterface();		// 結果取得用
		Object[] params = {
				tran_date,
				tran_date,
		};

		executeKK_M_PPLAN_AK_SELECT_001(params);

		// データを読む
		rcvMap = db_KK_M_PPLAN.selectNext();
		while(rcvMap != null)
		{
			String svcCd = rcvMap.getString("PPLAN_CD");
			String svcNm = rcvMap.getString("PPLAN_NM");
			
			pplanCdNmMap.put(svcCd, svcNm);
			rcvMap = db_KK_M_PPLAN.selectNext();
		}
	}
	
	/**
	 * EC向けスマートリンク契約情報ファイル用出力項目加工処理
	 */
	/* ++++++++++ v23.00.00 MOD START ++++++++++ */
//	private List<HashMap<String, Object>> createECSmartLinkInfoRows(List<String> sysidList)
	private List<HashMap<String, Object>> createECSmartLinkInfoRows(List<JBSbatServiceInterfaceMap> inMapList)
	/* ++++++++++ v23.00.00 MOD END ++++++++++ */
		throws Exception
	{
		/* ++++++++++ v23.00.00 DEL START ++++++++++ */
//		JBSbatCommonDBInterface rcvMap = new JBSbatCommonDBInterface();		// 結果取得用
//		
//		String[] sysidArray = sysidList.toArray(new String[sysidList.size()]);
//// ANK-2407-00-00 EC向けスマリン情報連携の仕変対応 2014/11/21 藤田 DEL START
////		Object[] paramKK305 = {
////				tran_date,
////				sysidArray,
////				tran_date,
////				tran_date,
////				sysidArray,
////				tran_date,
////				tran_date,
////		};
//// ANK-2407-00-00 EC向けスマリン情報連携の仕変対応 2014/11/21 藤田 DEL END
//// ANK-2407-00-00 EC向けスマリン情報連携の仕変対応 2014/11/21 藤田 ADD START
//		Object[] paramKK305 = {
//				sysidArray,
//				tran_date,
//				tran_date,
//				sysidArray,
//				tran_date,
//				tran_date,
//		};
//// ANK-2407-00-00 EC向けスマリン情報連携の仕変対応 2014/11/21 藤田 ADD END
//		
//		executeKK_T_SVC_KEI_KK_SELECT_305(paramKK305);
//
//		// データを読む
//		rcvMap = db_KK_T_SVC_KEI.selectNext();
		/* ++++++++++ v23.00.00 DEL END   ++++++++++ */
		
		// 出力対象リスト
		List<HashMap<String, Object>> rows = new ArrayList<HashMap<String, Object>>();
		
		String currentSysId = null;
		// SYSID毎サービス契約リスト
		List<HashMap<String, Object>> sysidSvcList = new ArrayList<HashMap<String, Object>>();
		
		/* ++++++++++ v23.00.00 MOD START ++++++++++ */
//		while(rcvMap != null)
//		{
		for( JBSbatServiceInterfaceMap rcvMap : inMapList )
		{
		/* ++++++++++ v23.00.00 MOD END   ++++++++++ */
			// SYSIDに紐付く電話契約の解約済・キャンセル済でない電話番号をすべて取得する
			String sysid = rcvMap.getString("SYSID");
			if (currentSysId == null) {
				currentSysId = sysid;
			}
			
			if (!currentSysId.equals(sysid))
			{
				// 取得データ選定処理
				if (sysidSvcList.size() > 0)
				{
					HashMap<String, Object> targetRecord = selectTargetRecord(sysidSvcList);
					if (targetRecord != null)
					{
						String rnkiKmkSettePtn = judgeRnkiKmkSettePtn(targetRecord);
						targetRecord.put(JBSbatKKIFE246.RNKI_KMK_SETTE_PTN, rnkiKmkSettePtn);
						rows.add(targetRecord);
					}
					sysidSvcList.clear();
				}
			}
			
			// リストに一時格納
			sysidSvcList.add(rcvMap.getMap());
			
			/* ++++++++++ v23.00.00 DEL START ++++++++++ */
//			// 次の1件を取得します
//			rcvMap = db_KK_T_SVC_KEI.selectNext();
			/* ++++++++++ v23.00.00 DEL END   ++++++++++ */
			
			currentSysId = sysid;
		}

		// 取得データ選定処理 (最終１件)
		if (sysidSvcList.size() > 0)
		{
			HashMap<String, Object> targetRecord = selectTargetRecord(sysidSvcList);
			if (targetRecord != null)
			{
				String rnkiKmkSettePtn = judgeRnkiKmkSettePtn(targetRecord);
				targetRecord.put(JBSbatKKIFE246.RNKI_KMK_SETTE_PTN, rnkiKmkSettePtn);
				rows.add(targetRecord);
			}
			sysidSvcList.clear();
		}
		
		
		/* ++++++++++ v23.00.00 DEL START ++++++++++ */
//		// ECから連携されたSYSIDの順に従い抽出データを並び替え、出力データを作成する。
//		List<HashMap<String, Object>> orderedRows = new ArrayList<HashMap<String, Object>>();
//		for (int i=0; i < sysidList.size(); i++)
//		{
//			// ECから連携されたSYSID
//			String sysid = sysidList.get(i);
//			boolean nodataFlg = true;
//			for (int j=0; j < rows.size(); j++)
//			{
//				HashMap<String, Object> map = rows.get(j);
//				// DBから抽出したSYSID
//				String tmpSysid = (String)map.get(JBSbatKKIFE246.SYSID);
//				if (sysid.equals(tmpSysid))
//				{
//					// 値が"完全に一致"→リストに詰める
//					orderedRows.add(map);
//					rows.remove(j);
//					nodataFlg = false;
//					break;
//				}
//			}
//			// ＤＢからデータが抽出されていない→空のデータとしてSYSIDのみ返す
//			if (nodataFlg)
//			{
//				HashMap<String, Object> map = new HashMap<String, Object>();
//				map.put(JBSbatKKIFE246.SYSID, sysid);
//				orderedRows.add(map);
//
//				// IT2-2014-0000315 バックアップが重複してコピーされる 2014/09/17 藤田 DEL START
////				super.logPrint.printDebugLog("出力対象となるレコードがありません：SYSID=[" + sysid + "]");
//				// IT2-2014-0000315 バックアップが重複してコピーされる 2014/09/17 藤田 DEL END
//			}
//		}
		/* ++++++++++ v23.00.00 DEL END   ++++++++++ */
		
		/* ++++++++++ v23.00.00 MOD START ++++++++++ */
//		return orderedRows;
		return rows;
		/* ++++++++++ v23.00.00 MOD END   ++++++++++ */
	}
	
	/**
	 * 優先順位に従った出力対象のレコードを選定します
	 * @param sysidSvcList
	 * @return
	 */
	private HashMap<String, Object> selectTargetRecord(List<HashMap<String, Object>> sysidSvcList)
	{
		// 優先レコード判定用マップ
		Map<String, HashMap<String, Object>> priorMap = new HashMap<String, HashMap<String, Object>>();
		for (int i=0; i < sysidSvcList.size(); i++)
		{
			HashMap<String, Object> sysidSvcMap = sysidSvcList.get(i);
			String opSvcKeiStat = (String)sysidSvcMap.get("OP_SVC_KEI_STAT");
			String svcCd = (String)sysidSvcMap.get("SVC_CD");
			String prcGrpCd = (String)sysidSvcMap.get("PRC_GRP_CD");
			
			if (existsSmartLinkContract(opSvcKeiStat))
			{
				// スマートリンクプレミアムを契約しているデータを抽出する
				// SQLの結果、opSvcCdがあればスマートリンクを持っているのと同義
				// スマートリンクプレミアム契約有無フラグに"有"をセット
				sysidSvcMap.put(JBSbatKKIFE246.SMLN_KEI_UM_FLG, JKKStrConst.CD_DIV_UM_ARI);
				return sysidSvcMap;
			}

			// スマートリンクプレミアム契約有無フラグに"無"をセット
// ANK-2407-00-00 EC向けスマリン情報連携の仕変対応 2014/11/21 藤田 MOD START
//			sysidSvcMap.put(JBSbatKKIFE246.SMLN_KEI_UM_FLG, JKKStrConst.CD_DIV_UM_NASHI);
			/* ++++++++++ v23.00.00 MOD START ++++++++++ */
//			if (svcCd != null) {
			if (svcCd != null && !"".equals( svcCd.trim() ) ) {
			/* ++++++++++ v23.00.00 MOD END   ++++++++++ */
				sysidSvcMap.put(JBSbatKKIFE246.SMLN_KEI_UM_FLG, JKKStrConst.CD_DIV_UM_NASHI);
			}
// ANK-2407-00-00 EC向けスマリン情報連携の仕変対応 2014/11/21 藤田 MOD END
			
			// サービスコードがインターネットサービス
			if (JKKStrConst.CD00130_01.equals(svcCd))
			{
				// 料金グループコードが"02":eo光ネットホームタイプ、"03":eo光ネットメゾンタイプ、
				// "04":eo光ネットマンションタイプ、"05":eoADSL(eAccess)、"06":eoADSL(フレッツ)
				if (JKKStrConst.CD00133_02.equals(prcGrpCd) || JKKStrConst.CD00133_03.equals(prcGrpCd)
				 || JKKStrConst.CD00133_04.equals(prcGrpCd) || JKKStrConst.CD00133_05.equals(prcGrpCd)
				 || JKKStrConst.CD00133_06.equals(prcGrpCd))
				{
					putMapWithNoContains(PRIOR_KEY_SVC_NET, sysidSvcMap, priorMap);
				}
				// 料金グループコードが"07":ｅｏモバイル（Ｗｉ−Ｆｉ）、"16":ｅｏメールアドレス、
				// "08":ｅｏモバイル（３Ｇ）、"09":ｅｏモバイル（ＵＱ−ＷｉＭＡＸ）
				else if (JKKStrConst.CD00133_07.equals(prcGrpCd) || JKKStrConst.CD00133_16.equals(prcGrpCd)
				  || JKKStrConst.CD00133_08.equals(prcGrpCd) || JKKStrConst.CD00133_09.equals(prcGrpCd))
				{
					putMapWithNoContains(PRIOR_KEY_SVC_MOBILE, sysidSvcMap, priorMap);
				}
			}
			// サービスコードが電話サービス
			else if (JKKStrConst.CD00130_02.equals(svcCd))
			{
				putMapWithNoContains(PRIOR_KEY_SVC_TEL, sysidSvcMap, priorMap);
			}
			// サービスコードがテレビサービス
			else if (JKKStrConst.CD00130_03.equals(svcCd))
			{
				putMapWithNoContains(PRIOR_KEY_SVC_TV, sysidSvcMap, priorMap);
			}
			// サービスコードがMVNOサービス
			else if (JKKStrConst.CD00130_51.equals(svcCd))
			{
				putMapWithNoContains(PRIOR_KEY_SVC_MVNO, sysidSvcMap, priorMap);
			}
			// 「ANK-2480-00-00_新電力対応」【STEP1-2】2015/09/08 原田 ADD START
			else if (JKKStrConst.CD00130_05.equals(svcCd))
			{
				putMapWithNoContains(PRIOR_KEY_SVC_ELECTORIC, sysidSvcMap, priorMap);
			}
			// 「ANK-2480-00-00_新電力対応」【STEP1-2】2015/09/08 原田 ADD END
		}
		
		// 優先順で抽出データを決定
		// 「eo光ネット＞eo光テレビ＞eo光電話＞eoモバイル＞mineo＞eo電気」
		
		// eo光ネット
		if (priorMap.containsKey(PRIOR_KEY_SVC_NET))
		{
			return priorMap.get(PRIOR_KEY_SVC_NET);
		}
		// eo光テレビ
		if (priorMap.containsKey(PRIOR_KEY_SVC_TV))
		{
			return priorMap.get(PRIOR_KEY_SVC_TV);
		}
		// eo光電話
		if (priorMap.containsKey(PRIOR_KEY_SVC_TEL))
		{
			return priorMap.get(PRIOR_KEY_SVC_TEL);
		}
		// eoモバイル
		if (priorMap.containsKey(PRIOR_KEY_SVC_MOBILE))
		{
			return priorMap.get(PRIOR_KEY_SVC_MOBILE);
		}
		// MVNO
		if (priorMap.containsKey(PRIOR_KEY_SVC_MVNO))
		{
			return priorMap.get(PRIOR_KEY_SVC_MVNO);
		}
		// 「ANK-2480-00-00_新電力対応」【STEP1-2】2015/09/08 原田 ADD START
		// eo電気
		if (priorMap.containsKey(PRIOR_KEY_SVC_ELECTORIC))
		{
			return priorMap.get(PRIOR_KEY_SVC_ELECTORIC);
		}
		// 「ANK-2480-00-00_新電力対応」【STEP1-2】2015/09/08 原田 ADD END
		
		// 不明
		// ANK-2407-00-00 EC向けスマリン情報連携の仕変対応 2014/11/25 藤田 MOD START
//		return null;
		return sysidSvcList.size()>0?sysidSvcList.get(0):null;
		// ANK-2407-00-00 EC向けスマリン情報連携の仕変対応 2014/11/25 藤田 MOD START
	}
	
	/**
	 * 連携項目パターン判定処理
	 * @param targetRecord
	 * @return
	 */
	private String judgeRnkiKmkSettePtn(HashMap<String, Object> targetRecord)
	{
		String svcCd = (String)targetRecord.get("SVC_CD");
		String prcGrpCd = (String)targetRecord.get("PRC_GRP_CD");
		
		// サービスコードがインターネットサービス
		if (JKKStrConst.CD00130_01.equals(svcCd))
		{
			// 料金グループコードが"02":eo光ネットホームタイプ、"03":eo光ネットメゾンタイプ、
			// "04":eo光ネットマンションタイプ、"05":eoADSL(eAccess)、"06":eoADSL(フレッツ)
			if (JKKStrConst.CD00133_02.equals(prcGrpCd)) return "100";
			if (JKKStrConst.CD00133_03.equals(prcGrpCd)) return "100";
			if (JKKStrConst.CD00133_04.equals(prcGrpCd)) return "100";
			if (JKKStrConst.CD00133_05.equals(prcGrpCd)) return "100";
			if (JKKStrConst.CD00133_06.equals(prcGrpCd)) return "100";
			
			// 料金グループコードが"07":ｅｏモバイル（Ｗｉ−Ｆｉ）、"16":ｅｏメールアドレス
			if (JKKStrConst.CD00133_07.equals(prcGrpCd)) return "110";
			if (JKKStrConst.CD00133_16.equals(prcGrpCd)) return "110";
			
			// 料金グループコードが"08":ｅｏモバイル（３Ｇ）
			if (JKKStrConst.CD00133_08.equals(prcGrpCd)) return "111";

			// 料金グループコードが"09":ｅｏモバイル（ＵＱ−ＷｉＭＡＸ）
			if (JKKStrConst.CD00133_09.equals(prcGrpCd)) return "112";
		}
		// サービスコードが電話サービス
		else if (JKKStrConst.CD00130_02.equals(svcCd))
		{
			return "200";
		}
		// サービスコードがテレビサービス
		else if (JKKStrConst.CD00130_03.equals(svcCd))
		{
			return "300";
		}
		// サービスコードがMVNOサービス
		else if (JKKStrConst.CD00130_51.equals(svcCd))
		{
			return "400";
		}
		// 「ANK-2480-00-00_新電力対応」【STEP1-2】2015/09/08 原田 ADD START
		// サービスコードが電気サービス
		else if (JKKStrConst.CD00130_05.equals(svcCd))
		{
			return "500";
		}
		// 「ANK-2480-00-00_新電力対応」【STEP1-2】2015/09/08 原田 ADD END
		return "";
	}
	
	/**
	 * マップに含まれていない場合にマップに格納
	 * @param priorKey
	 * @param sysidSvcMap
	 * @param priorMap
	 */
	private void putMapWithNoContains(String priorKey, HashMap<String, Object> sysidSvcMap, Map<String, HashMap<String, Object>> priorMap)
	{
		if (!priorMap.containsKey(priorKey))
		{
			priorMap.put(priorKey, sysidSvcMap);
		}
	}

	/**
	 * オプションサービス契約ステータスからスマートリンクプレミアムオプションが有効かを判定
	 * @param opSvcKeiStat
	 * @return
	 */
	private boolean existsSmartLinkContract(String opSvcKeiStat)
	{
		if (opSvcKeiStat == null)
		{
			return false;
		}
		
		// オプションサービス契約ステータスが
		// "照査済"、"締結済"、"サービス提供中"、"休止・中断中"、"停止中" の場合
		if ("020".equals(opSvcKeiStat) || "030".equals(opSvcKeiStat) || "100".equals(opSvcKeiStat)
		 || "210".equals(opSvcKeiStat) || "220".equals(opSvcKeiStat))
		{
			// スマートリンクプレミアムオプションが有効
			return true;
		}
		
		return false;
	}
	
	/**
	 * 出力データをセット
	 * @param outmap
	 * @param inputMap
	 * @throws Exception
	 */
	private void setOutMap(JBSbatServiceInterfaceMap outmap, HashMap<String, Object> inputMap)
		throws Exception
	{
		// ＳＹＳＩＤ
		outmap.setString(JBSbatKKIFE246.SYSID, inputMap.get("SYSID"));
		// eo会員種別
		outmap.setString(JBSbatKKIFE246.MEMBER_SBT_CD, inputMap.get("MEMBER_SBT_CD"));
		// サービス契約番号
		outmap.setString(JBSbatKKIFE246.SVC_KEI_NO, inputMap.get("SVC_KEI_NO"));
		// サービスコード
		outmap.setString(JBSbatKKIFE246.SVC_CD, inputMap.get("SVC_CD"));
		// サービス名
		outmap.setString(JBSbatKKIFE246.SVC_NM, svcCdNmMap.get(inputMap.get("SVC_CD")));
		// 料金プランコード
		outmap.setString(JBSbatKKIFE246.PPLAN_CD, inputMap.get("PPLAN_CD"));
		// 料金プラン名
		outmap.setString(JBSbatKKIFE246.PPLAN_NM, pplanCdNmMap.get(inputMap.get("PPLAN_CD")));
		// 連携項目設定パターン
		outmap.setString(JBSbatKKIFE246.RNKI_KMK_SETTE_PTN, inputMap.get(JBSbatKKIFE246.RNKI_KMK_SETTE_PTN));
		// スマートリンクプレミアム契約有無フラグ
		outmap.setString(JBSbatKKIFE246.SMLN_KEI_UM_FLG, inputMap.get(JBSbatKKIFE246.SMLN_KEI_UM_FLG));
	}
	
	/* ++++++++++ v23.00.00 DEL START ++++++++++ */
//	/**
//	 * SQLKEY(KK_SELECT_305)でDBアクセスを行います。<br>
//	 * <p>
//	 * <b>処理フロー</b><br>
//	 * <pre>
//	 * 1.引数でバイント変数を設定します。<br>
//	 *
//	 * 2.DBアクセスを実行します。<br>
//	 * 
//	 * 3.メソッドの呼び出し方です。<br>
//	 *		引数:
//	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
//	 *		 	SYSID
//	 *		 	運用日
//	 *		 	運用日
//	 *		 	SYSID
//	 *		 	運用日
//	 *		 	運用日
//	 * </pre>
//	 * <p>
//	 * @param param バイント変数の値配列。
//	 * @throws Exception 業務サービス内で発生した例外全般。
//	 */
//	private void executeKK_T_SVC_KEI_KK_SELECT_305(Object[] param) throws Exception
//	{
//		// IN句にリスト指定ができないため、苦肉の策
//		//------------------------------------------------//
//		// ->JBSbatZMTrnKnriChshtDataDel.javaを参考に実装しました
//		// 以下のparam[2]がSYSIDの配列であることが前提
//// ANK-2407-00-00 EC向けスマリン情報連携の仕変対応 2014/11/25 藤田 MOD START
////		String[] sysidList = (String[])param[1];
//		String[] sysidList = (String[])param[0];
//// ANK-2407-00-00 EC向けスマリン情報連携の仕変対応 2014/11/25 藤田 MOD END
//		// 元のＳＱＬを一時退避
//		String srcSQL = db_KK_T_SVC_KEI.getSql(KK_T_SVC_KEI_KK_SELECT_305);
//		// 対象となるSYSIDのリストから置換文字列を作成
//		// SYSID IN (?, ?, ?,...?) を作成します
//		StringBuffer sb = new StringBuffer("SYSID IN (");
//		for (int i=0; i < sysidList.length; i++)
//		{
//			if (i > 0)
//			{
//				sb.append(",");
//			}
//			sb.append("?");
//		}
//		sb.append(")");
//		
//		// 対象の文字列を置換
//		String wkSQL = srcSQL;
//		wkSQL = wkSQL.replace("SYSID IN (?)", sb.toString());
//		wkSQL = wkSQL.replace("SYSID IN (?)", sb.toString());
//		db_KK_T_SVC_KEI.setSqlMap(KK_T_SVC_KEI_KK_SELECT_305, wkSQL);
//		//------------------------------------------------//
//
//		// バイント変数のリストを生成します
//		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
//		// SYSIDリスト →上記で作った'?'の分（一括処理件数分）だけバインド
//		// 処理年月日
//		// 処理年月日
//		// SYSIDリスト →上記で作った'?'の分（一括処理件数分）だけバインド
//		// 処理年月日
//		// 処理年月日
//// ANK-2407-00-00 EC向けスマリン情報連携の仕変対応 2014/11/21 藤田 ADD START
//		for (int i=0; i < sysidList.length; i++)
//		{
//			paramList.setValue(sysidList[i]);
//		}
//		paramList.setValue(param[1].toString());
//		paramList.setValue(param[2].toString());
//		for (int i=0; i < sysidList.length; i++)
//		{
//			paramList.setValue(sysidList[i]);
//		}
//		paramList.setValue(param[4].toString());
//		paramList.setValue(param[5].toString());
//// ANK-2407-00-00 EC向けスマリン情報連携の仕変対応 2014/11/21 藤田 ADD END
//// ANK-2407-00-00 EC向けスマリン情報連携の仕変対応 2014/11/21 藤田 DEL START
////		paramList.setValue(param[0].toString());
////		for (int i=0; i < sysidList.length; i++)
////		{
////			paramList.setValue(sysidList[i]);
////		}
////		paramList.setValue(param[2].toString());
////		paramList.setValue(param[3].toString());
////		for (int i=0; i < sysidList.length; i++)
////		{
////			paramList.setValue(sysidList[i]);
////		}
////		paramList.setValue(param[5].toString());
////		paramList.setValue(param[6].toString());
//// ANK-2407-00-00 EC向けスマリン情報連携の仕変対応 2014/11/21 藤田 DEL END
//
//		// DBアクセスを実行します
//		db_KK_T_SVC_KEI.selectBySqlDefine(paramList, KK_T_SVC_KEI_KK_SELECT_305);
//
//		//------------------------------------------------//
//		// 次処理のためにSQLを元に戻しておきます
//		db_KK_T_SVC_KEI.setSqlMap(KK_T_SVC_KEI_KK_SELECT_305, srcSQL);
//		//------------------------------------------------//
//	}
	/* ++++++++++ v23.00.00 DEL END   ++++++++++ */

	/**
	 * SQLKEY(KK_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	SYSID
	 *		 	運用日
	 *		 	運用日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_M_SVC_KK_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		// 処理年月日
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_KK_M_SVC.selectBySqlDefine(paramList, KK_M_SVC_KK_SELECT_002);
	}

	/**
	 * SQLKEY(AK_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	SYSID
	 *		 	運用日
	 *		 	運用日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_M_PPLAN_AK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		// 処理年月日
		// 処理年月日
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_M_PPLAN.selectBySqlDefine(paramList, KK_M_PPLAN_AK_SELECT_001);
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 *入力情報（ＥＣ＿ＳＹＳＩＤ）の単項目チェックを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.単項目チェックを行います。<br>
	 * 
	 * 2.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		rsMap:(項目、値)を(key、value)として、データをrsMapに入れます
	 *		itemvalueMap:埋め込み文字の値をitemvalueMapに入れます。キーの値は、以下に説明します。
	 *			 TXT-KKIFE245-INF1.SYSID			ＥＣ＿ＳＹＳＩＤ.ＳＹＳＩＤ
	 *			 TXT-KKIFE245-INF1.SYSID			ＥＣ＿ＳＹＳＩＤ.ＳＹＳＩＤ
	 *			 TXT-KKIFE245-INF1.SYSID			ＥＣ＿ＳＹＳＩＤ.ＳＹＳＩＤ
	 * </pre>
	 * <p>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @param itemvalueMap エラーメッセージに関する項目値を格納されたHashMap。
	 * @return  boolean trueである場合、エラーがありません。falseである場合、エラーを発生しました。
	 */
	private boolean isSingleCheckKKIFE245_INF1(HashMap rsMap, HashMap itemvalueMap)
	{
		// 単項目チェックを行います
		String strValue = null;

		// ＳＹＳＩＤ項目チェック
		strValue = (String)rsMap.get("SYSID");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0060TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFE245-INF1.SYSID")});
			return false;
		}
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "10", "10"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0070TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFE245-INF1.SYSID")});
			return false;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0080TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFE245-INF1.SYSID")});
			return false;
		}

		return true;
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * エラーメッセージに関する項目値を格納されたHashMap<String, String>を生成します。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.エラーメッセージに関する項目値を格納されたHashMapを生成する。<br>
	 *
	 * 2.エラーメッセージに関する項目値を格納されたHashMapに値を設定する。<br>
	 * </pre>
	 * <p>
	 * @return itemvalueMap エラーメッセージに関する項目値を格納されたHashMap
	 */
	private HashMap<String, String> getItemvalueMap(String sysid)
	{
		if (sysid == null)
		{
			sysid = "";
		}
		
		// エラーメッセージに関する項目値が格納されたHashMapを設定
		HashMap<String, String> itemvalueMap = new HashMap<String, String>();
		itemvalueMap.put("TXT-KKIFE245-INF1.SYSID", "ＳＹＳＩＤ：" + sysid);

		return itemvalueMap;
	}

	/**
//	 * CSV形式に文字列編集を行います。<br>
//	 * <p>
//	 * <b>処理フロー</b><br>
//	 * <pre>
//	 * 1.引数で連結文字列、""括り有無を設定します。<br>
//	 *
//	 * 2.引数を元に文字列を連結します。
//	 *   連結文字列最後尾には改行コードを設定します。<br>
//	 *   返却文字列内のnullは""へ置換します。
//	 * </pre>
//	 * <p>
//	 * @param strData       出力対象データ。
//	 * @param bDqFlg        ""括りあり(true),括りなし(false)。
//	 * @return strRec       文字列連結結果を返却します。
//	 * @throws Exception    業務サービス内で発生した例外全般。
//	 */
//	public static String createCSV(String[] strData, boolean bDqFlg) throws Exception
//	{
//
//		StringBuffer sBufRec = new StringBuffer();
//
//		for (int i = 0; i < strData.length; i++)
//		{
//			if(!bDqFlg)
//			{
//				sBufRec.append(strData[i]);
//			}
//			else
//			{
//				sBufRec.append(JCNStrConst.S_SEP_DQ);
//				sBufRec.append(strData[i]);
//				sBufRec.append(JCNStrConst.S_SEP_DQ);
//			}
//				
//			if(i < strData.length - 1)
//			{
//					sBufRec.append(JCNStrConst.S_SEP_CAM);
//			}
//		}
//		
//		return sBufRec.toString().replace(JCNStrConst.S_IS_NULL, "");
//	}
}
