/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatDKHaisoMikomiListSakusei
*	ソースファイル名	：JBSbatDKHaisoMikomiListSakusei.java
*	作成者				：富士通　
*	作成日				：2011年10月12日
*＜機能概要＞
*　配送見込み件数リスト作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/10/12   富士通		新規作成
*	v7.00.00	2013/11/13   FJ)鄭		「ANK-1578-00-00」多機能ルーター対応
*	v25.00.00	2016/03/15   FJ)黒田	【ANK-2530-00-00】TV新コースおよびVOD導入
*	v39.00.00	2018/10/05   FJ)御崎	【ANK-3488-00-00】４KSTB（ACASチップ）導入対応
*	v62.00.00	2022/10/20   FJ) 永江	【ANK-4335-00-00】ACAS対応新STB導入対応
*********************************************************************/
package eo.business.service;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JDKBatOutputFileUtil;
import eo.business.util.file.JBSbatDKIFM011;
import eo.business.util.file.JBSbatDKIFM012;
import eo.common.constant.JDKStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JPCUtilCommon;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatAplConst;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatDKHaisoMikomiListSakusei extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/* ++++++++++ v1.00.00 追加開始 ++++++++++ */
	/** 配送見込み件数リスト作成マップ */
	private Map<String, Map<String, String>> haisoMikomiListMap = new TreeMap<String, Map<String, String>>();

	/** 配送見込み件数リスト作成マップ項目(宅内機器種別名)*/
	private static final String HSLST_TAKNKIKI_SBT = "TAKNKIKI_SBT";
	/** 配送見込み件数リスト作成マップ項目(型番号(ダミー型番号))*/
	private static final String HSLST_KATA_NO = "KATA_NO";
	/** 配送見込み件数リスト作成マップ項目(配送見込み件数)*/
	private static final String HSLST_HAISO_MIKOMI_CNT = "HAISO_MIKOMI_CNT";

	/** 宅内機器種別コード(STB機器)*/
	private static final String	TAKNKIKI_SBT_CD_STB = "A0";
	/** 宅内機器種別コード(B-CASカード機器)*/
	private static final String	TAKNKIKI_SBT_CD_BCAS = "B0";
	/** 宅内機器種別コード(C-CASカード機器)*/
	private static final String	TAKNKIKI_SBT_CD_CCAS = "C0";
	/** 宅内機器種別コード(ONU機器)*/
	private static final String	TAKNKIKI_SBT_CD_ONU = "D0";
	/** 宅内機器種別コード(多機能ルーター)*/
	private static final String	TAKNKIKI_SBT_CD_MTR = "R0";
	/** 宅内機器種別コード(V-ONU機器)*/
	private static final String	TAKNKIKI_SBT_CD_VONU = "E0";

	/** 工事案件種別コード(新設)*/
	private static final String KOJIAK_SBT_CD_NEW = "001";
	/** 工事案件種別コード(面開発)*/
	private static final String KOJIAK_SBT_CD_MEN = "012";
	/** 工事案件種別コード(eoTV変更)*/
	private static final String KOJIAK_SBT_CD_EOTV = "013";

	/** 工事範囲コード(V-ONU変更)*/
	private static final String KOJI_SCOPE_CD_VONU = "220";
	/** 工事範囲コード(V-ONU・STB変更)*/
	private static final String KOJI_SCOPE_CD_WITH_STB = "230";

	/** 型番号(ダミー型番号)(B-CAS)*/
	private static final String DUMMY_KATA_NO_BCAS = "B-CAS";
	/** 型番号(ダミー型番号)(C-CAS)*/
	private static final String DUMMY_KATA_NO_CCAS = "C-CAS";
	/** 型番号(ダミー型番号)(ONU)*/
	private static final String DUMMY_KATA_NO_ONU = "ONU";
	/** 型番号(ダミー型番号)(多機能ルーター)*/
	private static final String DUMMY_KATA_NO_MTR = "MTR";
	/** 型番号(ダミー型番号)(V-ONU(2.6))*/
	private static final String DUMMY_KATA_NO_VONU_26 = "V-ONU(2.6)";
	/** 型番号(ダミー型番号)(V-ONU(770))*/
	private static final String DUMMY_KATA_NO_VONU_770 = "V-ONU(770)";
	/** 型番号(ダミー型番号)(STB(標準))*/
	private static final String DUMMY_KATA_NO_STB_NMR = "STB(標準)";
// ANK-2530-00-00 MOD START
//	/** 型番号(ダミー型番号)(STB(250G))*/
//	private static final String DUMMY_KATA_NO_STB_250 = "STB(250G)";
//	/** 型番号(ダミー型番号)(STB(500G))*/
//	private static final String DUMMY_KATA_NO_STB_500 = "STB(500G)";
	/** 型番号(ダミー型番号)(STB(250GB))*/
	private static final String DUMMY_KATA_NO_STB_250 = "STB(250GB)";
	/** 型番号(ダミー型番号)(STB(500GB(DVD)))*/
	private static final String DUMMY_KATA_NO_STB_500_DVD = "STB(500GB(DVD))";
	/** 型番号(ダミー型番号)(STB(500GB(BD)))*/
	private static final String DUMMY_KATA_NO_STB_500_BD = "STB(500GB(BD))";
	/** 型番号(ダミー型番号)(STB(1000GB))*/
	private static final String DUMMY_KATA_NO_STB_1000 = "STB(1000GB)";
	/** 型番号(ダミー型番号)(STB(500GB(HDD)))*/
	private static final String DUMMY_KATA_NO_STB_500_HDD = "STB(500GB(HDD))";
	/** 型番号(ダミー型番号)(STB(1TB(BD)))*/
	private static final String DUMMY_KATA_NO_STB_1000_BD = "STB(1TB(BD))";
	/** 型番号(ダミー型番号)(STB(標準 VOD))*/
	private static final String DUMMY_KATA_NO_STB_NO_VOD = "STB(標準 VOD)";
	/** 型番号(ダミー型番号)(STB(2TB(HDD) VOD))*/
	private static final String DUMMY_KATA_NO_STB_2000_HDD_VOD = "STB(2TB(HDD) VOD)";
	/** 型番号(ダミー型番号)(STB(500GB(HDD) VOD))*/
	private static final String DUMMY_KATA_NO_STB_500_HDD_VOD = "STB(500GB(HDD) VOD)";

// ANK-3488-00-00 ADD START
	/** 型番号(ダミー型番号)(4K-STB 標準)*/
	private static final String DUMMY_KATA_NO_STB_4K_NO = "STB(4K-STB 標準)";
	/** 型番号(ダミー型番号)(4K-STB 2TB(HDD))*/
	private static final String DUMMY_KATA_NO_STB_4K_2000_HDD = "STB(4K-STB 2TB(HDD))";
// ANK-3488-00-00 ADD END
	
// ANK-4335-00-00 ADD START
	/** 型番号(ダミー型番号)(STB(4K-STB 標準(旧)))*/
	private static final String DUMMY_KATA_NO_STB_4K_NO_OLD = "STB(4K-STB 標準(旧))";	
// ANK-4335-00-00 ADD END
	/** HDD容量コード(標準STB)*/
	private static final String HDD_CAPA_CD_NO = "00";
	/** HDD容量コード(250GB)*/
	private static final String HDD_CAPA_CD_250 = "01";
	/** HDD容量コード(500GB(DVD))*/
	private static final String HDD_CAPA_CD_500_DVD = "02";
	/** HDD容量コード(500GB(BD))*/
	private static final String HDD_CAPA_CD_500_BD = "03";
	/** HDD容量コード(1000GB)*/
	private static final String HDD_CAPA_CD_1000 = "04";
	/** HDD容量コード(500GB(HDD))*/
	private static final String HDD_CAPA_CD_500_HDD = "05";
	/** HDD容量コード(1TB(BD))*/
	private static final String HDD_CAPA_CD_1000_BD = "06";
	/** HDD容量コード(なし VOD)*/
	private static final String HDD_CAPA_CD_NO_VOD = "07";
	/** HDD容量コード(2TB(HDD) VOD)*/
	private static final String HDD_CAPA_CD_2000_HDD_VOD = "08";
	/** HDD容量コード(500GB(HDD) VOD)*/
	private static final String HDD_CAPA_CD_500_HDD_VOD = "09";
// ANK-2530-00-00 MOD END

// ANK-3488-00-00 ADD START
	/** HDD容量コード(4K-STB 標準)*/
	private static final String HDD_CAPA_CD_4K_NO = "10";
	/** HDD容量コード(4K-STB 2TB(HDD))*/
	private static final String HDD_CAPA_CD_4K_2000_HDD = "11";
// ANK-3488-00-00 ADD END

// ANK-4335-00-00 ADD START
	/** HDD容量コード(STB(4K-STB 標準(旧)))*/
	private static final String HDD_CAPA_CD_4K_NO_OLD = "12";
// ANK-4335-00-00 ADD END

	/** TVコースグループコード(SD)*/
	private static final String TV_COURSE_GRP_CD_SD = "0";
	/** TVコースグループコード(HD)*/
	private static final String TV_COURSE_GRP_CD_HD = "1";
	/** TVコースグループコード(HD(地デジ・BS))*/
	private static final String TV_COURSE_GRP_CD_HD_BS = "2";
	
	/** 宅内機器異動コード(STB追加)*/
	private static final String TAKNKIKI_IDO_CD_STB_ADD = "01";
	/** 宅内機器異動コード(STB交換)*/
	private static final String TAKNKIKI_IDO_CD_STB_CHG = "02";
	/** 宅内機器異動コード(一部撤去)*/
	private static final String TAKNKIKI_IDO_CD_ICHIBU_TK = "03";
	/** 宅内機器異動コード(移動)*/
	private static final String TAKNKIKI_IDO_CD_IDO = "04";
	/** 宅内機器異動コード(移動キャンセル)*/
	private static final String TAKNKIKI_IDO_CD_IDO_CANCEL = "05";
	/** 宅内機器異動コード(追加キャンセル)*/
	private static final String TAKNKIKI_IDO_CD_ADD_CANCEL = "06";
	/** 宅内機器異動コード(異動なし)*/
	private static final String TAKNKIKI_IDO_CD_NONE = "09";

	/** 設置撤去フラグ(設置)*/
	private static final String STC_TEKKYO_FLG_STC = "1";

//	/** 機器提供サービス契約ステータス(照査済)*/
//	private static final String KKTK_SVC_KEI_STAT_SHOSA = "020";
	/** 機器提供サービス契約ステータス(解約済)*/
	private static final String KKTK_SVC_KEI_STAT_KAIYAKU = "910";
	/** 機器提供サービス契約ステータス(キャンセル済)*/
	private static final String KKTK_SVC_KEI_STAT_CANCEL = "920";

	/** 機器提供サービス契約ステータス(照査済)*/
	private static final String MAPKEY_KUGIRI = ":";
	/* ++++++++++ v1.00.00 追加終了 ++++++++++ */	
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// 格納されているフォルダの環境変数名を取得
		String[] freeItem = commonItem.getFreeItem().split(JDKStrConst.FREE_DLMT);

		// 環境変数から実際ファイル格納フォルダの値を取得
		String dirNm = JBSbatAplConst.getAplConstValue(freeItem[0]);
		if (dirNm == null)
		{
			// 環境変数未設定エラー
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EDKB0020KE, new String[] {"環境変数",
			"環境変数名＝" + freeItem[0]});
		}

		String fileNm = rnktPath(dirNm, "") + "EO5020110J0.csv";

		// ファイル存在チェック
		File file = new File(inspection(fileNm));
		if (!file.exists())
		{
			return null;
		}

		JBSbatInputFileUtil inputFile = new JBSbatInputFileUtil(fileNm);
		try
		{
			String line = null;
			int itemCnt = 0;
			String[] itemArray = null;
			int rownum = 0;

			inputFile.setEncode(JDKStrConst.ENCODE_SJIS2);
			inputFile.createReader();
			while (inputFile.ready())
			{
				// ファイルの読み込み
				line = inputFile.readLine();

				rownum++;
				itemCnt = getCnt(line, JDKStrConst.COMMA) + 1;
				itemArray = getCsvStrArray(line, JDKStrConst.COMMA, JDKStrConst.DOUBLE_QUAT);

				if (itemCnt == 1 || itemArray == null)
				{
					continue;
				}

				// 配送見込み件数リスト作成マップの作成
				setHaisoMikomiList(itemArray);
			}
		}
		catch (IOException ex)
		{
			super.logPrint.printDebugLog("ファイル読み込み失敗:" + fileNm);
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0660CE,
					new String[] {fileNm});
			throw ex;
		}
		finally
		{
			try
			{
				inputFile.close();
			}
			catch (NullPointerException ex)
			{
				super.logPrint.printDebugLog("ファイルクローズはインスタンスがNull:" + fileNm);
			}
		}

		// 配送見込み件数リスト作成マップが0件の場合
		if (haisoMikomiListMap.size() == 0)
		{
			// 出力オブジェクト格納リスト(該当データなし)を作成
			return setOutputListNoData();
		}

		// 配送見込み件数リスト作成マップが1件以上の場合
		// 出力オブジェクト格納リスト(該当データあり)を作成
		return setOutputList();
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/* ++++++++++ v1.00.00 追加開始 ++++++++++ */
	
	/**
	 * 入力電文から配送見込み件数リスト作成マップを作成。
	 * @param itemArray　項目配列
	 * @throws Exception 
	 */
	public void setHaisoMikomiList(String[] itemArray) throws Exception
	{
		String kataNo = "";

		// 機器提供サービス契約ステータスが「910：解約済」もしくは、「920：キャンセル済」の場合
		if (KKTK_SVC_KEI_STAT_KAIYAKU.equals(chgNulltoString(itemArray[12]))
				|| KKTK_SVC_KEI_STAT_CANCEL.equals(chgNulltoString(itemArray[12])))
		{
			return;
		}

		// 配送情報が存在する場合
		if (!"0".equals(chgNulltoString(itemArray[14])))
		{
			return;
		}

		// 工事案件種別コードが「012：面開発」の場合、かつ仮工事依頼年月日がnullであった場合
		if (KOJIAK_SBT_CD_MEN.equals(chgNulltoString(itemArray[0])) && isEmpty(itemArray[1]))
		{
			// 現レコード情報は集計対象外
			return;
		}

		// 宅内機器異動コードが「03：一部撤去」、「04：移動」、「05：移動キャンセル」、「06：追加キャンセル」、「09：異動なし」の場合
		if (TAKNKIKI_IDO_CD_ICHIBU_TK.equals(chgNulltoString(itemArray[3]))
				|| TAKNKIKI_IDO_CD_IDO.equals(chgNulltoString(itemArray[3]))
				|| TAKNKIKI_IDO_CD_IDO_CANCEL.equals(chgNulltoString(itemArray[3]))
				|| TAKNKIKI_IDO_CD_ADD_CANCEL.equals(chgNulltoString(itemArray[3]))
				|| TAKNKIKI_IDO_CD_NONE.equals(chgNulltoString(itemArray[3])))
		{
			return;
		}

		// 宅内機器種別コードが「D0：ONU機器」の場合
		if (TAKNKIKI_SBT_CD_ONU.equals(chgNulltoString(itemArray[9])))
		{
			// 配送見込み件数リスト作成マップを追加
			setHaisoMikomiListMap(TAKNKIKI_SBT_CD_ONU, DUMMY_KATA_NO_ONU, chgNulltoString(itemArray[10]), DUMMY_KATA_NO_ONU);
		}

		// 宅内機器種別コードが「R0：多機能ルーター」の場合
		if (TAKNKIKI_SBT_CD_MTR.equals(chgNulltoString(itemArray[9])))
		{
			// 配送見込み件数リスト作成マップを追加
			setHaisoMikomiListMap(TAKNKIKI_SBT_CD_MTR, DUMMY_KATA_NO_MTR, chgNulltoString(itemArray[10]), DUMMY_KATA_NO_MTR);
		}

		// 宅内機器種別コードが「E0：V-ONU機器」の場合
		if (TAKNKIKI_SBT_CD_VONU.equals(chgNulltoString(itemArray[9])))
		{
			// 工事案件種別コードが「001：新設」または「012：面開発」の場合
			// 工事案件種別コードが「013：eoTV変更」の場合、かつ工事範囲コードが「220：V-ONU変更」または「230：V-ONU・STB変更」の場合
			if (KOJIAK_SBT_CD_NEW.equals(chgNulltoString(itemArray[0])) ||
				KOJIAK_SBT_CD_MEN.equals(chgNulltoString(itemArray[0])) ||
				(KOJIAK_SBT_CD_EOTV.equals(chgNulltoString(itemArray[0])) &&
				(KOJI_SCOPE_CD_VONU.equals(chgNulltoString(itemArray[2])) ||
				KOJI_SCOPE_CD_WITH_STB.equals(chgNulltoString(itemArray[2])))))
			{
				// 型番号を判定する
				if (TV_COURSE_GRP_CD_SD.equals(chgNulltoString(itemArray[13])))
				{
					// TVコースグループコードが「0：SD」
					kataNo = DUMMY_KATA_NO_VONU_770;
				}
				else if (TV_COURSE_GRP_CD_HD.equals(chgNulltoString(itemArray[13]))
						|| TV_COURSE_GRP_CD_HD_BS.equals(chgNulltoString(itemArray[13])))
				{
					// TVコースグループコードが「1：HD」または「2：HD(地デジ・BS)」
					kataNo = DUMMY_KATA_NO_VONU_26;
				}
				// 配送見込み件数リスト作成マップを追加
				setHaisoMikomiListMap(TAKNKIKI_SBT_CD_VONU, kataNo, chgNulltoString(itemArray[10]), kataNo);
			}
			// 上記以外の場合
			else
			{
				// 現レコード情報は集計対象外
				return;
			}
		}
		
		// 宅内機器種別コードが「A0：STB機器」の場合、かつ宅内機器異動コードが「01：STB追加」または「02：STB交換」の場合、
		// かつ設置撤去フラグが「1：設置」の場合
		if (TAKNKIKI_SBT_CD_STB.equals(chgNulltoString(itemArray[9])) &&
			(TAKNKIKI_IDO_CD_STB_ADD.equals(chgNulltoString(itemArray[3])) ||
			TAKNKIKI_IDO_CD_STB_CHG.equals(chgNulltoString(itemArray[3]))) &&
			STC_TEKKYO_FLG_STC.equals(chgNulltoString(itemArray[4])))
		{

			// 型番号を判定する
			// 変更宅内機器型式コードがnull以外
			if (!isEmpty(itemArray[7]))
			{
				// 変更宅内機器型式コード
				kataNo = itemArray[7];
			}
// ANK-2530-00-00 MOD START
			// 変更HDD容量コードが「00：標準STB」
			else if (HDD_CAPA_CD_NO.equals(chgNulltoString(itemArray[8])))
			{
				// STB(標準)
				kataNo = DUMMY_KATA_NO_STB_NMR;
			}
			// 変更HDD容量コードが「01：250GB」
			else if (HDD_CAPA_CD_250.equals(chgNulltoString(itemArray[8])))
			{
				// STB(250GB)
				kataNo = DUMMY_KATA_NO_STB_250;
			}
			// 変更HDD容量コードが「02：500GB(DVD)」
			else if (HDD_CAPA_CD_500_DVD.equals(chgNulltoString(itemArray[8])))
			{
//				// STB(500G)
//				kataNo = DUMMY_KATA_NO_STB_500;
				// STB(500GB(DVD))
				kataNo = DUMMY_KATA_NO_STB_500_DVD;
			}
			// 変更HDD容量コードが「03：500GB(BD)」
			else if (HDD_CAPA_CD_500_BD.equals(chgNulltoString(itemArray[8])))
			{
//				// STB(500G)
//				kataNo = DUMMY_KATA_NO_STB_500;
				// STB(500GB(BD))
				kataNo = DUMMY_KATA_NO_STB_500_BD;
			}
//			// 変更HDD容量コードがnull以外で上記以外
//			else if (!isEmpty(itemArray[8]))
//			{
//				// STB(標準)
//				kataNo = DUMMY_KATA_NO_STB_NMR;
//			}
			// 変更HDD容量コードが「04：1000GB」
			else if (HDD_CAPA_CD_1000.equals(chgNulltoString(itemArray[8])))
			{
				// STB(1000GB)
				kataNo = DUMMY_KATA_NO_STB_1000;
			}
			// 変更HDD容量コードが「05：500GB(HDD)」
			else if (HDD_CAPA_CD_500_HDD.equals(chgNulltoString(itemArray[8])))
			{
				// STB(500GB(HDD))
				kataNo = DUMMY_KATA_NO_STB_500_HDD;
			}
			// 変更HDD容量コードが「06：1TB(BD)」
			else if (HDD_CAPA_CD_1000_BD.equals(chgNulltoString(itemArray[8])))
			{
				// STB(1TB(BD))
				kataNo = DUMMY_KATA_NO_STB_1000_BD;
			}
			// 変更HDD容量コードが「07：なし VOD」
			else if (HDD_CAPA_CD_NO_VOD.equals(chgNulltoString(itemArray[8])))
			{
				// STB(標準 VOD)
				kataNo = DUMMY_KATA_NO_STB_NO_VOD;
			}
			// 変更HDD容量コードが「08：2TB(HDD) VOD」
			else if (HDD_CAPA_CD_2000_HDD_VOD.equals(chgNulltoString(itemArray[8])))
			{
				// STB(2TB(HDD) VOD)
				kataNo = DUMMY_KATA_NO_STB_2000_HDD_VOD;
			}
			// 変更HDD容量コードが「09：500GB(HDD) VOD」
			else if (HDD_CAPA_CD_500_HDD_VOD.equals(chgNulltoString(itemArray[8])))
			{
				// STB(500GB(HDD) VOD)
				kataNo = DUMMY_KATA_NO_STB_500_HDD_VOD;
			}
// ANK-2530-00-00 MOD END

// ANK-3488-00-00 ADD START
			// 変更HDD容量コードが「10：STB(4K-STB 標準)」
			else if (HDD_CAPA_CD_4K_NO.equals(chgNulltoString(itemArray[8])))
			{
				// STB(4K-STB 標準)
				kataNo = DUMMY_KATA_NO_STB_4K_NO;
			}
			// 変更HDD容量コードが「11：STB(4K-STB 2TB(HDD))」
			else if (HDD_CAPA_CD_4K_2000_HDD.equals(chgNulltoString(itemArray[8])))
			{
				// STB(4K-STB 2TB(HDD))
				kataNo = DUMMY_KATA_NO_STB_4K_2000_HDD;
			}
// ANK-3488-00-00 ADD END
			
// ANK-4335-00-00 ADD START
			// 変更HDD容量コードが「12：STB(4K-STB 標準(旧))」」
			else if (HDD_CAPA_CD_4K_NO_OLD.equals(chgNulltoString(itemArray[8])))
			{
				//STB(4K-STB 標準(旧))
				kataNo = DUMMY_KATA_NO_STB_4K_NO_OLD ;
			}
// ANK-4335-00-00 ADD END

			// 予定宅内機器型式コードがnull以外
			else if (!isEmpty(itemArray[5]))
			{
				// 予定宅内機器型式コード
				kataNo = itemArray[5];
			}
// ANK-2530-00-00 MOD START
			// 予定HDD容量コードが「00：標準STB」
			else if (HDD_CAPA_CD_NO.equals(chgNulltoString(itemArray[6])))
			{
				// STB(標準)
				kataNo = DUMMY_KATA_NO_STB_NMR;
			}
			// 予定HDD容量コードが「01：250GB」
			else if (HDD_CAPA_CD_250.equals(chgNulltoString(itemArray[6])))
			{
				// STB(250GB)
				kataNo = DUMMY_KATA_NO_STB_250;
			}
			// 予定HDD容量コードが「02：500GB(DVD)」
			else if (HDD_CAPA_CD_500_DVD.equals(chgNulltoString(itemArray[6])))
			{
//				// STB(500G)
//				kataNo = DUMMY_KATA_NO_STB_500;
				// STB(500GB(DVD))
				kataNo = DUMMY_KATA_NO_STB_500_DVD;
			}
			// 予定HDD容量コードが「03：500GB(BD)」
			else if (HDD_CAPA_CD_500_BD.equals(chgNulltoString(itemArray[6])))
			{
//				// STB(500G)
//				kataNo = DUMMY_KATA_NO_STB_500;
				// STB(500GB(BD))
				kataNo = DUMMY_KATA_NO_STB_500_BD;
			}
//			// 予定HDD容量コードがnull以外で上記以外
//			else if (!isEmpty(itemArray[6]))
//			{
//				// STB(標準)
//				kataNo = DUMMY_KATA_NO_STB_NMR;
//			}
			// 予定HDD容量コードが「04：1000GB」
			else if (HDD_CAPA_CD_1000.equals(chgNulltoString(itemArray[6])))
			{
				// STB(1000GB)
				kataNo = DUMMY_KATA_NO_STB_1000;
			}
			// 予定HDD容量コードが「05：500GB(HDD)」
			else if (HDD_CAPA_CD_500_HDD.equals(chgNulltoString(itemArray[6])))
			{
				// STB(500GB(HDD))
				kataNo = DUMMY_KATA_NO_STB_500_HDD;
			}
			// 予定HDD容量コードが「06：1TB(BD)」
			else if (HDD_CAPA_CD_1000_BD.equals(chgNulltoString(itemArray[6])))
			{
				// STB(1TB(BD))
				kataNo = DUMMY_KATA_NO_STB_1000_BD;
			}
			// 予定HDD容量コードが「07：なし VOD」
			else if (HDD_CAPA_CD_NO_VOD.equals(chgNulltoString(itemArray[6])))
			{
				// STB(標準 VOD)
				kataNo = DUMMY_KATA_NO_STB_NO_VOD;
			}
			// 予定HDD容量コードが「08：2TB(HDD) VOD」
			else if (HDD_CAPA_CD_2000_HDD_VOD.equals(chgNulltoString(itemArray[6])))
			{
				// STB(2TB(HDD) VOD)
				kataNo = DUMMY_KATA_NO_STB_2000_HDD_VOD;
			}
			// 予定HDD容量コードが「09：500GB(HDD) VOD」
			else if (HDD_CAPA_CD_500_HDD_VOD.equals(chgNulltoString(itemArray[6])))
			{
				// STB(500GB(HDD) VOD)
				kataNo = DUMMY_KATA_NO_STB_500_HDD_VOD;
			}
// ANK-2530-00-00 MOD END
			
// ANK-3488-00-00 ADD START
			// 予定HDD容量コードが「10：STB(4K-STB 標準)」
			else if (HDD_CAPA_CD_4K_NO.equals(chgNulltoString(itemArray[6])))
			{
				// STB(4K-STB 標準)
				kataNo = DUMMY_KATA_NO_STB_4K_NO;
			}
			// 予定HDD容量コードが「11：STB(4K-STB 2TB(HDD))」
			else if (HDD_CAPA_CD_4K_2000_HDD.equals(chgNulltoString(itemArray[6])))
			{
				// STB(4K-STB 2TB(HDD))
				kataNo = DUMMY_KATA_NO_STB_4K_2000_HDD;
			}
// ANK-3488-00-00 ADD END

// ANK-4335-00-00 ADD START
			// 予定HDD容量コードが「12：STB(4K-STB 標準(旧))」」
			else if (HDD_CAPA_CD_4K_NO_OLD.equals(chgNulltoString(itemArray[6])))
			{
				//STB(4K-STB 標準(旧))
				kataNo = DUMMY_KATA_NO_STB_4K_NO_OLD ;
			}
// ANK-4335-00-00 ADD END
			
			// 配送見込み件数リスト作成マップを追加
			setHaisoMikomiListMap(TAKNKIKI_SBT_CD_STB, kataNo, chgNulltoString(itemArray[10]), kataNo);
		}
		
		// 入力データベースの宅内機器種別コードが「B0：B-CASカード機器」の場合、かつ宅内機器異動コードが「01：STB追加」の場合、
		// かつ設置撤去フラグが「1：設置」の場合
		if (TAKNKIKI_SBT_CD_BCAS.equals(chgNulltoString(itemArray[9])) &&
			TAKNKIKI_IDO_CD_STB_ADD.equals(chgNulltoString(itemArray[3])) &&
			STC_TEKKYO_FLG_STC.equals(chgNulltoString(itemArray[4])))
		{
			// 配送見込み件数リスト作成マップを追加
			setHaisoMikomiListMap(TAKNKIKI_SBT_CD_BCAS, DUMMY_KATA_NO_BCAS, chgNulltoString(itemArray[10]), DUMMY_KATA_NO_BCAS);
		}
		
		// 入力データベースの宅内機器種別コードが「C0：C-CASカード機器」の場合、かつ宅内機器異動コードが「01：STB追加」
		// または「02：STB交換」の場合、かつ設置撤去フラグが「1：設置」の場合
		if (TAKNKIKI_SBT_CD_CCAS.equals(chgNulltoString(itemArray[9])) &&
			(TAKNKIKI_IDO_CD_STB_ADD.equals(chgNulltoString(itemArray[3])) ||
			TAKNKIKI_IDO_CD_STB_CHG.equals(chgNulltoString(itemArray[3]))) &&
			STC_TEKKYO_FLG_STC.equals(chgNulltoString(itemArray[4])))
		{
			// 配送見込み件数リスト作成マップを追加
			setHaisoMikomiListMap(TAKNKIKI_SBT_CD_CCAS, DUMMY_KATA_NO_CCAS, chgNulltoString(itemArray[10]), DUMMY_KATA_NO_CCAS);
		}

		// 入力データベースの宅内機器種別コードが「D0：ONU機器」、「E0：V-ONU機器」、「A0：STB機器」、「B0：B-CASカード機器」、
		// 「C0：C-CASカード機器」、「C0：多機能ルーター」以外の場合、かつ機器提供サービス契約ステータスが「020：照査済」の場合
		if (!TAKNKIKI_SBT_CD_STB.equals(chgNulltoString(itemArray[9])) &&
			!TAKNKIKI_SBT_CD_BCAS.equals(chgNulltoString(itemArray[9])) &&
			!TAKNKIKI_SBT_CD_CCAS.equals(chgNulltoString(itemArray[9])) &&
			!TAKNKIKI_SBT_CD_ONU.equals(chgNulltoString(itemArray[9])) &&
			!TAKNKIKI_SBT_CD_VONU.equals(chgNulltoString(itemArray[9])) &&
			!TAKNKIKI_SBT_CD_MTR.equals(chgNulltoString(itemArray[9])))
//			chgNulltoString(itemArray[12]).equals(KKTK_SVC_KEI_STAT_SHOSA))
		{
			// 配送見込み件数リスト作成マップを追加
			setHaisoMikomiListMap(chgNulltoString(itemArray[9]), chgNulltoString(itemArray[11]), 
									chgNulltoString(itemArray[10]), chgNulltoString(itemArray[11]));
		}
	}

	/**
	 * 配送見込み件数リスト作成マップを追加。
	 * @param mapKeyTaknkikiSbtCd　マップキー宅内機器種別コード
	 * @param mapKeyKataNo　マップキー型番号
	 * @param hslstTaknkikiSbtNm　配送見込み件数マップ宅内機器種別名称
	 * @param hslstKataNo　配送見込み件数マップ型番号
	 * @throws Exception 
	 */
	public void setHaisoMikomiListMap(String mapKeyTaknkikiSbtCd, String mapKeyKataNo, String hslstTaknkikiSbtNm, String hslstKataNo) throws Exception
	{
		StringBuffer mapKey = new StringBuffer();
		Map<String, String> haisoMikomiMap = new HashMap<String, String>();
		int haisoMikomiCnt = 0;
		
		// マップキー作成
		mapKey.append(mapKeyTaknkikiSbtCd);	// 宅内機器種別コード
		mapKey.append(MAPKEY_KUGIRI);		// 区切文字
		mapKey.append(mapKeyKataNo);		// 型番号
		
		// 配送見込み件数設定
		if (haisoMikomiListMap.containsKey(mapKey.toString()))
		{
			// 既に同一のマップキーのデータが存在する場合
			haisoMikomiMap = haisoMikomiListMap.get(mapKey.toString());
			// 配送見込み件数を１件加算
			haisoMikomiCnt = Integer.parseInt(haisoMikomiMap.get(HSLST_HAISO_MIKOMI_CNT)) + 1;
			haisoMikomiMap.put(HSLST_HAISO_MIKOMI_CNT, Integer.toString(haisoMikomiCnt));
		}
		else
		{
			// 同一のマップキーのデータが存在しない場合は固定で１件
			haisoMikomiCnt = 1;

			// 配送見込みデータ作成
			haisoMikomiMap.put(HSLST_TAKNKIKI_SBT, hslstTaknkikiSbtNm);
			haisoMikomiMap.put(HSLST_KATA_NO, hslstKataNo);
			haisoMikomiMap.put(HSLST_HAISO_MIKOMI_CNT, Integer.toString(haisoMikomiCnt));
			
			// 配送見込み件数リスト作成マップを追加
			haisoMikomiListMap.put(mapKey.toString(), haisoMikomiMap);
		}
	}	

	/**
	 * 出力オブジェクト格納リスト(該当データなし)を作成。
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem setOutputListNoData() throws Exception
	{
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		// 入出力データ格納マップを作成する
		JBSbatServiceInterfaceMap outmapData = new JBSbatServiceInterfaceMap();
		outmapData.setString(JBSbatDKIFM011.TAKNKIKI_SBT, JDKBatOutputFileUtil.encloseDQuot("該当データなし"));
		outmapData.setString(JBSbatDKIFM011.KATA_NO, JDKBatOutputFileUtil.encloseDQuot(""));
		outmapData.setString(JBSbatDKIFM011.HAISO_MIKOMI_CNT, JDKBatOutputFileUtil.encloseDQuot(""));

		// 出力フラグを設定。
		outmapData.setOutFlg(true);

		// 出力オブジェクト格納リスト(データファイル用)に入出力データ格納マップを追加
		outputBean.addOutMapList(outmapData);
		
		// 入出力データ格納マップを作成する
		JBSbatServiceInterfaceMap outmapCnt = new JBSbatServiceInterfaceMap();
		outmapCnt.setString(JBSbatDKIFM012.DATA_CNT, JDKBatOutputFileUtil.encloseDQuot("1"));

		// 出力フラグを設定。
		outmapCnt.setOutFlg(true);

		// 出力オブジェクト格納リスト(件数ファイル用)に入出力データ格納マップを追加
		outputBean.addOutMapList_2(outmapCnt);

		return outputBean;
	}		
	
	/**
	 * 出力オブジェクト格納リスト(該当データあり)を作成。
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem setOutputList() throws Exception
	{
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		Map<String, String> haisoMikomiMap = new HashMap<String, String>();
		String breakKey = "";
		int haisoMikomiShokeiCnt = 0;
		int shokeiOutputCnt = 0;
		int outRecordCnt = 0;
		boolean initFlg = false;
		
		for (String key : haisoMikomiListMap.keySet())
		{
			haisoMikomiMap = haisoMikomiListMap.get(key);

			// 初回のみ(a)で取得したリストの宅内機器種別名をBreakKeyとして退避
			if (!initFlg)
			{
				breakKey = haisoMikomiMap.get(HSLST_TAKNKIKI_SBT);
				initFlg = true;
			}

			// リストの宅内機器種別名とBreakKeyが一致しない場合
			if (!breakKey.equals(haisoMikomiMap.get(HSLST_TAKNKIKI_SBT)))
			{
				// 入出力データ格納マップを作成する
				JBSbatServiceInterfaceMap outmapData = new JBSbatServiceInterfaceMap();
				StringBuffer taknkikiSbt = new StringBuffer();
				taknkikiSbt.append("（計）");
				taknkikiSbt.append(breakKey);
				outmapData.setString(JBSbatDKIFM011.TAKNKIKI_SBT, JDKBatOutputFileUtil.encloseDQuot(taknkikiSbt.toString()));
				outmapData.setString(JBSbatDKIFM011.KATA_NO, JDKBatOutputFileUtil.encloseDQuot(""));
				outmapData.setString(JBSbatDKIFM011.HAISO_MIKOMI_CNT, JDKBatOutputFileUtil.encloseDQuot(JPCUtilCommon.fillHalfSpace(
																JPCUtilCommon.formatNumber(Integer.toString(haisoMikomiShokeiCnt)), 10, false)));

				// 出力フラグを設定。
				outmapData.setOutFlg(true);

				// 出力オブジェクト格納リスト(データファイル用)に入出力データ格納マップを追加
				outputBean.addOutMapList(outmapData);
				
				// 配送見込み小計件数を0で初期化
				haisoMikomiShokeiCnt = 0;
				
				// リストの宅内機器種別名をBreakKeyとして退避
				breakKey = haisoMikomiMap.get(HSLST_TAKNKIKI_SBT);
				
				// 小計出力件数を加算する
				shokeiOutputCnt++;
			}
			
			// 入出力データ格納マップを作成する
			JBSbatServiceInterfaceMap outmapData = new JBSbatServiceInterfaceMap();
			outmapData.setString(JBSbatDKIFM011.TAKNKIKI_SBT, JDKBatOutputFileUtil.encloseDQuot(haisoMikomiMap.get(HSLST_TAKNKIKI_SBT)));
			outmapData.setString(JBSbatDKIFM011.KATA_NO, JDKBatOutputFileUtil.encloseDQuot(haisoMikomiMap.get(HSLST_KATA_NO)));
			outmapData.setString(JBSbatDKIFM011.HAISO_MIKOMI_CNT, JDKBatOutputFileUtil.encloseDQuot(JPCUtilCommon.fillHalfSpace(
															JPCUtilCommon.formatNumber(haisoMikomiMap.get(HSLST_HAISO_MIKOMI_CNT)), 10, false)));
			
			// 出力フラグを設定。
			outmapData.setOutFlg(true);

			// 出力オブジェクト格納リスト(データファイル用)に入出力データ格納マップを追加
			outputBean.addOutMapList(outmapData);
			
			// 配送見込み小計件数に(a)で取得したリストの配送見込み件数を加算
			haisoMikomiShokeiCnt = haisoMikomiShokeiCnt + Integer.parseInt(haisoMikomiMap.get(HSLST_HAISO_MIKOMI_CNT));
			
			outRecordCnt++;
		}

		// 最終の宅内機器種別名の小計を追加
		// 入出力データ格納マップを作成する
		JBSbatServiceInterfaceMap outmapData = new JBSbatServiceInterfaceMap();
		StringBuffer taknkikiSbt = new StringBuffer();
		taknkikiSbt.append("（計）");
		taknkikiSbt.append(haisoMikomiMap.get(HSLST_TAKNKIKI_SBT));
		outmapData.setString(JBSbatDKIFM011.TAKNKIKI_SBT, JDKBatOutputFileUtil.encloseDQuot(taknkikiSbt.toString()));
		outmapData.setString(JBSbatDKIFM011.KATA_NO, JDKBatOutputFileUtil.encloseDQuot(""));
		outmapData.setString(JBSbatDKIFM011.HAISO_MIKOMI_CNT, JDKBatOutputFileUtil.encloseDQuot(JPCUtilCommon.fillHalfSpace(
																JPCUtilCommon.formatNumber(Integer.toString(haisoMikomiShokeiCnt)), 10, false)));

		// 出力フラグを設定。
		outmapData.setOutFlg(true);

		// 出力オブジェクト格納リスト(データファイル用)に入出力データ格納マップを追加
		outputBean.addOutMapList(outmapData);
		
		// 小計出力件数を加算する
		shokeiOutputCnt++;
		
		// 入出力データ格納マップを作成する
		JBSbatServiceInterfaceMap outmapCnt = new JBSbatServiceInterfaceMap();
		outmapCnt.setString(JBSbatDKIFM012.DATA_CNT, JDKBatOutputFileUtil.encloseDQuot(Integer.toString(outRecordCnt + shokeiOutputCnt)));
		
		// 出力フラグを設定。
		outmapCnt.setOutFlg(true);

		// 出力オブジェクト格納リスト(件数ファイル用)に入出力データ格納マップを追加
		outputBean.addOutMapList_2(outmapCnt);
		
		return outputBean;
	}

	/**
	 * 環境変数ディレクトリ検査用メソッド（ファイルインジェクション対策）<br>
	 * 半角アルファベットと数字のみで構成されていることを検査します。
	 * <br>
	 * @param argDirNm:検査する文字列
	 * @return String 検査した文字列
	 * @throws IllegalArgumentException 業務サービス内で発生した例外全般。
	 */
	private String inspection(String argDirNm) throws IllegalArgumentException
	{
		if (argDirNm.matches("\\p{InBasicLatin}+"))
		{
			return argDirNm;
		}
		throw new IllegalArgumentException(argDirNm); // 誤ったファイル名を指定
	}

	/**
	 * パス文字列の連結
	 * 連結するパス文字列にパス区切り文字の設定を制御する。
	 * @param path1 パス文字列
	 * @param path2 パス文字列
	 * @return 連結したパス文字列
	 */
	private String rnktPath(String path1, String path2)
	{
		String pathDlmt = "/";
		if (path1.indexOf("\\") > -1 || path2.indexOf("\\") > -1)
		{
			pathDlmt = "\\";
		}
		if (!path1.endsWith(pathDlmt))
		{
			return path1 + pathDlmt + path2;
		}
		return path1 + path2;
	}

	/**
	 * 指定文字列内に検索文字列がいくつ含まれるかを返却します。<br>
	 * <br>
	 * @param argStr 対象文字列
	 * @param argSearchStr 検索文字列
	 * @return  int 対象文字列内に検索文字列が存在する個数を返却。
	 */
	private int getCnt(String argStr, String argSearchStr)
	{
		int result = 0;

		if (isEmpty(argStr) || isEmpty(argSearchStr) || argStr.indexOf(argSearchStr) < 0)
		{
			return result;
		}

		result++;
		int i = argStr.indexOf(argSearchStr) + 1;
		while (i < argStr.length())
		{
			if (argStr.indexOf(argSearchStr, i) > i - 1)
			{
				i = argStr.indexOf(argSearchStr, i);
				result++;
			}
			i++;
		}

		return result;
	}

	/**
	 * CSV分割用メソッド。指定された区切り文字で文字列配列に分割した値を返却します。<br>
	 * <br>
	 * @param argRec 対象文字列
	 * @param argDelimiter デリミタ文字
	 * @param argDel 消去文字列
	 * @return  String[] 対象文字列を分割して文字列配列にて返却。
	 */
	private String[] getCsvStrArray(String argRec, String argDelimiter, String argDel)
	{
		// 対象の文字列が有効文字列かどうかのチェック
		if (isEmpty(argRec))
		{
			return null;
		}

		String[] result = null;
		String[] buff = argRec.replace(argDel, "").split(argDelimiter);

		// splitで区切った文字列数を判定
		if (getCnt(argRec, argDelimiter) + 1 != buff.length)
		{

			// 本来あるべき配列数
			result = new String[getCnt(argRec, argDelimiter) + 1];
			
			System.arraycopy(buff, 0, result, 0, buff.length);
		}
		else
		{
			result = buff;
		}

		// null値を空文字に変換
		for (int j = 0; j < result.length; j++)
		{
			if (result[j] == null)
			{
				result[j] = "";
			}
		}

		// 結果の返却
		return result;
	}

	/**
	 * chgNulltoString<br>
	 * nullを空文字で返却する。
	 * @param value 変換する文字列
	 * @return 変換後の文字列
	 */
	private String chgNulltoString(String value)
	{
		if (value == null)
		{
			return "";
		}
		return value;
	}

	/**
	 * 空値チェック<br>
	 * 半角空白はトリムしてチェックする。
	 * @param value チェックする文字列
	 * @return true:空値 false:空値でない
	 */
	private boolean isEmpty(String value)
	{
		if (value == null)
		{
			return true;
		}
		String checkValue = value.replaceAll(" ", "");
		if (checkValue.length() == 0)
		{
			return true;
		}
		return false;
	}
	/* ++++++++++ v1.00.00 追加終了 ++++++++++ */	
	
}
