/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatDKHaisoDivAdd
*	ソースファイル名	：JBSbatDKHaisoDivAdd.java
*	作成者				：富士通　
*	作成日				：2013年01月16日
*＜機能概要＞
*　配送分割登録部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2013/01/16   富士通		新規作成
*	v26.00.00	2016/07/26	 FJ)佐々木 【ANK-2756-00-00】日中帯に連携する出荷指図数の増加対応
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JDKBatCommon;
import eo.common.constant.JDKStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.constant.JZM0171Constant;
import eo.common.util.JDKCommonUtil;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatDKHaisoDivAdd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(配送)*/
	private static final String D_TBL_NAME_DK_T_HAISO = "DK_T_HAISO";

	/** テーブル(バッチ用宅内機器物流在庫ワーク)*/
	private static final String D_TBL_NAME_DK_T_BAT_TKKBRZK_WK = "DK_T_BAT_TKKBRZK_WK";

	/** テーブル(コード名称管理)*/
	private static final String D_TBL_NAME_ZM_M_CD_NM_KANRI = "ZM_M_CD_NM_KANRI";

	/** テーブル(配送対象物品)*/
	private static final String D_TBL_NAME_DK_T_HAISO_TG_BPIN = "DK_T_HAISO_TG_BPIN";

	/** SQL定義キー(DK_SELECT_012)*/
	private static final String DK_T_HAISO_DK_SELECT_012 = "DK_SELECT_012";

	/** SQL定義キー(DK_SELECT_013)*/
	private static final String DK_T_HAISO_DK_SELECT_013 = "DK_SELECT_013";

	/** SQL定義キー(DK_SELECT_001)*/
	private static final String DK_T_BAT_TKKBRZK_WK_DK_SELECT_001 = "DK_SELECT_001";

	/** SQL定義キー(DK_SELECT_002)*/
	private static final String DK_T_HAISO_DK_SELECT_002 = "DK_SELECT_002";

	/** SQL定義キー(DK_SELECT_001)*/
	private static final String ZM_M_CD_NM_KANRI_DK_SELECT_001 = "DK_SELECT_001";

	/** テーブルアクセスクラス(配送)*/
	private JBSbatSQLAccess db_DK_T_HAISO = null;

	/** テーブルアクセスクラス(バッチ用宅内機器物流在庫ワーク)*/
	private JBSbatSQLAccess db_DK_T_BAT_TKKBRZK_WK = null;

	/** テーブルアクセスクラス(コード名称管理)*/
	private JBSbatSQLAccess db_ZM_M_CD_NM_KANRI = null;

	/** テーブルアクセスクラス(配送対象物品)*/
	private JBSbatSQLAccess db_DK_T_HAISO_TG_BPIN = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/* ++++++++++ v1.00.00 追加開始 ++++++++++ */

	/**
	 * 処理タイミング．日次（夜間）
	 */
	private static final String SHORI_TIMING_NIGHT = "1";

	/**
	 * 処理タイミング．画面（随時）
	 */
	private static final String SHORI_TIMING_NOW = "2";

	/**
	 * 出荷指図情報登録ジョブＩＤ．夜間（通常）
	 */
	private static final String JOB_ID_NIGHT = "EO5050110J2";

	/**
	 * 出荷指図情報登録ジョブＩＤ．画面（随時）
	 */
	private static final String JOB_ID_NOW = "EO5050110J3";

	/**
	 * 管理場所識別コード．倉庫
	 */
	private static final String KANRI_PLACE_SKCD_SOKO = "1";

	/**
	 * 分割対象機器
	 */
	private static final String DIV_TG_KIKI = "1";

	/**
	 * 配送番号のシーケンス名
	 */
	private static final String SEQ_HAISO_NO = "SEQ_HAISO_NO";

	/**
	 * ジョブID
	 */
	private String batchJobId = "";

	/**
	 * 配送分割対象マップ<配送番号, 配送対象物品番号リスト>
	 */
	private Map<String, List<String>> haisoDivTgMap = new HashMap<String, List<String>>();

	/**
	 * バッチ用宅内機器物流在庫情報．分割対象機器
	 * <管理場所識別コード＋管理場所コード＋管理場所棚コード＋宅内機器型式コード, 使用数>
	 */
	private HashMap<String, String> zaikoSuCheckMap1 = new HashMap<String, String>();

	/**
	 * バッチ用宅内機器物流在庫情報．分割対象外機器
	 * <管理場所識別コード＋管理場所コード＋管理場所棚コード＋宅内機器型式コード, 使用数>
	 */
	private HashMap<String, String> zaikoSuCheckMap2 = new HashMap<String, String>();

	/**
	 * バッチ用宅内機器物流在庫情報バックアップ用．分割対象機器
	 * <管理場所識別コード＋管理場所コード＋管理場所棚コード＋宅内機器型式コード, 使用数>
	 */
	private HashMap<String, String> zaikoSuCheckMapBk1 = new HashMap<String, String>();

	/**
	 * バッチ用宅内機器物流在庫情報バックアップ用．分割対象外機器
	 * <管理場所識別コード＋管理場所コード＋管理場所棚コード＋宅内機器型式コード, 使用数>
	 */
	private HashMap<String, String> zaikoSuCheckMapBk2 = new HashMap<String, String>();

	/**
	 * 配送番号の採番識別子管理コード
	 */
	private String HaisoNoKanriCd = "";

	/* ++++++++++ v1.00.00 追加終了 ++++++++++ */

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_DK_T_HAISO = new JBSbatSQLAccess(commonItem, D_TBL_NAME_DK_T_HAISO);
		db_DK_T_BAT_TKKBRZK_WK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_DK_T_BAT_TKKBRZK_WK);
		db_ZM_M_CD_NM_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_CD_NM_KANRI);
		db_DK_T_HAISO_TG_BPIN = new JBSbatSQLAccess(commonItem, D_TBL_NAME_DK_T_HAISO_TG_BPIN);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		/* ++++++++++ v1.00.00 追加開始 ++++++++++ */

		super.commonItem.getLogPrint().printDebugLog("配送分割登録処理開始");

		// メインカーソルとなる情報の取得処理
		executeMainCursor();

		// チェック処理
		executeCheck();

		try
		{
			// 更新処理
			executeUpdate();
			super.commonItem.getConnection().commit();
		}
		catch (Exception ex)
		{
			super.commonItem.getConnection().rollback();
			throw ex;
		}

		super.commonItem.getLogPrint().printDebugLog("配送分割登録処理終了");

		/* ++++++++++ v1.00.00 追加終了 ++++++++++ */

		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_DK_T_HAISO.close();
		db_DK_T_BAT_TKKBRZK_WK.close();
		db_ZM_M_CD_NM_KANRI.close();
		db_DK_T_HAISO_TG_BPIN.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(DK_SELECT_012)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	運用日付
	 *		 	運用日付
	 *		 	運用日付
	 *		 	運用日付
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeDK_T_HAISO_DK_SELECT_012(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());

		// DBアクセスを実行します
		db_DK_T_HAISO.selectBySqlDefine(paramList, DK_T_HAISO_DK_SELECT_012);
	}

	/**
	 * SQLKEY(DK_SELECT_013)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	運用日付
	 *		 	運用日付
	 *		 	運用日付
	 *		 	運用日付
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeDK_T_HAISO_DK_SELECT_013(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
//ANK-2756-00-00 DEL START
//		paramList.setValue(param[4].toString());
//ANK-2756-00-00 DEL END
		// DBアクセスを実行します
		db_DK_T_HAISO.selectBySqlDefine(paramList, DK_T_HAISO_DK_SELECT_013);
	}

	/**
	 * SQLKEY(DK_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	ジョブＩＤ
	 *		 	管理場所識別コード
	 *		 	管理場所コード
	 *		 	管理場所棚コード
	 *		 	宅内機器型式コード
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeDK_T_BAT_TKKBRZK_WK_DK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
		paramList.setValue(param[4].toString());

		// DBアクセスを実行します
		db_DK_T_BAT_TKKBRZK_WK.selectBySqlDefine(paramList, DK_T_BAT_TKKBRZK_WK_DK_SELECT_001);
	}

	/**
	 * SQLKEY(DK_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	配送番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeDK_T_HAISO_DK_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_DK_T_HAISO.selectBySqlDefine(paramList, DK_T_HAISO_DK_SELECT_002);
	}

	/**
	 * SQLKEY(DK_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	コード種別コード
	 *		 	コード区分
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_M_CD_NM_KANRI_DK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_ZM_M_CD_NM_KANRI.selectBySqlDefine(paramList, ZM_M_CD_NM_KANRI_DK_SELECT_001);
	}

	/**
	 * PK(ＰＫ　更新)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.引数で条件マップを作ります。<br>
	 *
	 * 3.DBアクセスを実行します。<br>
	 * 
	 * 4.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	配送番号				HAISO_NO
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	HAISO_TAIBPIN_NO
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @param whereParam 条件項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeDK_T_HAISO_TG_BPIN_PKUPDATE(Object[] setParam, Object[] whereParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("HAISO_NO", setParam[0]);
	
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("HAISO_TAIBPIN_NO", whereParam[0]);

		// DBアクセスを実行します
		db_DK_T_HAISO_TG_BPIN.updateByPrimaryKeys(whereMap, setMap);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/* ++++++++++ v1.00.00 追加開始 ++++++++++ */

	/**
	 * メインカーソルとなる情報の取得処理を行います。
	 * 
	 * <div>
	 * 以下の項目に値を設定します。
	 * <ul>
	 * <li>db_DK_T_HAISO（テーブルアクセスクラス(配送)）</li>
	 * <li>batchJobId（ジョブID）</li>
	 * </ul>
	 * </div>
	 * 
	 * @throws Exception
	 */
	private void executeMainCursor() throws Exception
	{
		// パラメータ取得
		String[] freeItem = super.freeItem.split(JDKStrConst.FREE_DLMT);
		String shoriTiming = freeItem[0];

		// データ取得用パラメータ
		Object[] params = null;

		// 処理タイミングが日次（夜間）の場合
		if (SHORI_TIMING_NIGHT.equals(shoriTiming))
		{
			// 運用日付でパラメータ作成
			params = new Object[] {
					super.commonItem.getOpeDate(),
					super.commonItem.getOpeDate(),
					super.commonItem.getOpeDate(),
					super.commonItem.getOpeDate()
			};

			try
			{
				// データ取得（夜間）
				executeDK_T_HAISO_DK_SELECT_012(params);
			}
			catch (Exception ex)
			{
				super.commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0020KE,
						new String[] {"配送", "配送分割対象データ取得失敗（夜間）"});
				throw ex;
			}

			// ジョブID設定
			batchJobId = JOB_ID_NIGHT;

			super.commonItem.getLogPrint().printDebugLog("配送分割対象データ取得処理終了（夜間）");
		}

		// 処理タイミングが画面（随時）の場合
		else if (SHORI_TIMING_NOW.equals(shoriTiming))
		{
			// 運用日付でパラメータ作成
			params = new Object[] {
					super.commonItem.getOpeDate(),
					super.commonItem.getOpeDate(),
					super.commonItem.getOpeDate(),
					super.commonItem.getOpeDate(),
//ANK-2756-00-00 DEL START
//					freeItem[1]
//ANK-2756-00-00 DEL END
			};

			try
			{
				// データ取得（随時）
				executeDK_T_HAISO_DK_SELECT_013(params);
			}
			catch (Exception ex)
			{
//ANK-2756-00-00 MOD START
//				super.commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0020KE,
//						new String[] {"配送",
//						"配送分割対象データ取得失敗（随時）"
//						+ "；配送指示依頼番号＝" + freeItem[1]});
				super.commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0020KE,
						new String[] {"配送",
						"配送分割対象データ取得失敗（随時）"
						+ "；配送指示依頼種別識別コード＝002（処理中）" });
//ANK-2756-00-00 MOD END
				throw ex;
			}

			// ジョブID設定
			batchJobId = JOB_ID_NOW;

			super.commonItem.getLogPrint().printDebugLog("配送分割対象データ取得処理終了（随時）");
		}
	}

	/**
	 * チェック処理を行います。
	 * 
	 * <div>
	 * 以下のチェック処理を行います。
	 * <ul>
	 * <li>在庫チェック</li>
	 * </ul>
	 * </div>
	 * 
	 * <div>
	 * 以下の項目に値を設定します。
	 * <ul>
	 * <li>haisoDivTgMap（配送分割対象マップ）</li>
	 * </ul>
	 * </div>
	 * 
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void executeCheck() throws Exception
	{
		/* ****************************************
		 *   在庫数チェック
		 *      分割対象機器の在庫数が不足している
		 *      且つ分割対象外機器の在庫数が不足していない場合、
		 *      配送分割対象とする
		 * ****************************************/
		// 配送番号
		String haisoNo = null;
		// 配送情報
		JBSbatCommonDBInterface haisoInfo = db_DK_T_HAISO.selectNext();
		// 分割対象機器の在庫チェック結果リスト
		List<Boolean> resultList1 = new ArrayList<Boolean>();
		// 分割対象外機器の在庫チェック結果リスト
		List<Boolean> resultList2 = new ArrayList<Boolean>();
		// 配送対象物品番号リスト（分割対象機器のみ）
		List<String> haisoTaibpinNoList = new ArrayList<String>();

		if (!JDKCommonUtil.isNull(haisoInfo))
		{
			haisoNo = haisoInfo.getString("HAISO_NO");

			while (!JDKCommonUtil.isNull(haisoInfo))
			{
				// 配送番号が同じでない場合
				if (!haisoNo.equals(haisoInfo.getString("HAISO_NO")))
				{
					// 配送分割対象判定
					// 分割対象機器の在庫数が不足している且つ分割対象外機器の在庫数が不足していない場合
					if (resultList1.contains(false) && 0 < resultList2.size() && !resultList2.contains(false))
					{
						// 配送分割対象マップに追加
						haisoDivTgMap.put(haisoNo, haisoTaibpinNoList);
					}

					// 分割対象機器の在庫数確定
					// 全ての機器の在庫数が不足している場合
					if (resultList1.contains(false))
					{
						// 引当分の在庫数を解放
						zaikoSuCheckMap1 = null;
						zaikoSuCheckMap1 = (HashMap<String, String>) zaikoSuCheckMapBk1.clone();
					}
					else
					{
						// 使用分を確定
						zaikoSuCheckMapBk1 = null;
						zaikoSuCheckMapBk1 = (HashMap<String, String>) zaikoSuCheckMap1.clone();
					}

					// 分割対象外機器の在庫数確定
					if (0 < resultList2.size())
					{
						// 分割対象外機器の在庫数が不足している場合
						if (resultList2.contains(false))
						{
							// 分割対象外機器の引当分の在庫数を解放
							zaikoSuCheckMap2 = null;
							zaikoSuCheckMap2 = (HashMap<String, String>) zaikoSuCheckMapBk2.clone();
						}
						else
						{
							// 分割対象外機器の使用分を確定
							zaikoSuCheckMapBk2 = null;
							zaikoSuCheckMapBk2 = (HashMap<String, String>) zaikoSuCheckMap2.clone();
						}
					}

					// 配送番号を再設定
					haisoNo = haisoInfo.getString("HAISO_NO");
					// 分割対象機器の在庫チェック結果リストを初期化
					resultList1 = new ArrayList<Boolean>();
					// 分割対象外機器の在庫チェック結果リストを初期化
					resultList2 = new ArrayList<Boolean>();
					// 配送対象物品番号リストを初期化
					haisoTaibpinNoList = new ArrayList<String>();
				}

				// 在庫チェック
				if (DIV_TG_KIKI.equals(haisoInfo.getString("DIV_TG_KIKI_FLG")))
				{
					resultList1.add(isInStock(haisoInfo));
					haisoTaibpinNoList.add(haisoInfo.getString("HAISO_TAIBPIN_NO"));
				}
				else
				{
					resultList2.add(isInStock(haisoInfo));
				}

				haisoInfo = db_DK_T_HAISO.selectNext();
			}

			// 配送分割対象判定
			// 分割対象機器の在庫数が不足している且つ分割対象外機器の在庫数が不足していない場合
			if (resultList1.contains(false) && 0 < resultList2.size() && !resultList2.contains(false))
			{
				// 配送分割対象マップに追加
				haisoDivTgMap.put(haisoNo, haisoTaibpinNoList);
			}
		}

		super.commonItem.getLogPrint().printDebugLog("チェック処理終了");
	}

	/**
	 * 在庫チェック処理を行います。
	 * 
	 * @param haisoInfo 配送情報
	 * @return チェック結果 true：在庫あり false：在庫なし
	 * @throws Exception
	 */
	private boolean isInStock(JBSbatCommonDBInterface haisoInfo) throws Exception
	{
		// 倉庫コード
		String sokoCd = haisoInfo.getString("HAISO_MOTO_SOKO_CD");
		// 棚コード
		String shelfCd = haisoInfo.getString("HAISO_MOTO_SKDN_CD");
		// 宅内機器型式コード
		String tnkikiModelCd = haisoInfo.getString("TAKNKIKI_MODEL_CD");
		// 分割対象機器フラグ
		boolean divTgKikiFlg = DIV_TG_KIKI.equals(haisoInfo.getString("DIV_TG_KIKI_FLG"));

		// パラメータ作成
		Object[] params = new Object[] {
				batchJobId,
				KANRI_PLACE_SKCD_SOKO,
				sokoCd,
				shelfCd,
				tnkikiModelCd
		};

		try
		{
			// バッチ用宅内機器物流在庫ワーク情報を取得
			executeDK_T_BAT_TKKBRZK_WK_DK_SELECT_001(params);
		}
		catch (Exception ex)
		{
			super.commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0020KE,
					new String[] {"バッチ用宅内機器物流在庫ワーク",
					"在庫情報取得失敗"
					+ "；ジョブID＝" + batchJobId
					+ "；管理場所識別コード＝" + KANRI_PLACE_SKCD_SOKO
					+ "；管理場所コード＝" + sokoCd
					+ "；管理場所棚コード＝" + shelfCd
					+ "；宅内機器型式コード＝" + tnkikiModelCd});
			throw ex;
		}

		// バッチ用宅内機器物流在庫ワーク情報が存在しない場合
		JBSbatCommonDBInterface zaikoInfo = db_DK_T_BAT_TKKBRZK_WK.selectNext();
		if (JDKCommonUtil.isNull(zaikoInfo))
		{
			return false;
		}

		// 実在庫数−（配送出荷指示数＋棚移動指示数＋予備機器配送指示数＋予備機器配送中＋予備機器出荷完了数）の結果が０以下の場合、
		// 在庫数不足とする（既に計上している分もマイナス要素として計算する）
		int jzaikoCnt = Integer.parseInt(zaikoInfo.getString("JZAIKO_CNT"));					// 実在庫数
		int haisoShukkaSjiCnt = Integer.parseInt(zaikoInfo.getString("HAISO_SHUKKA_SJI_CNT"));	// 配送出荷指示数
		int shelfMoveSjiCnt = Integer.parseInt(zaikoInfo.getString("SHELF_MOVE_SJI_CNT"));		// 棚移動指示数
		int ybkkhaiSjiCnt = Integer.parseInt(zaikoInfo.getString("YBKKHAI_SJI_CNT"));			// 予備機器配送指示数
		int ybkkhaiChuCnt = Integer.parseInt(zaikoInfo.getString("YBKKHAI_CHU_CNT"));			// 予備機器配送中
		int yobiKkshkaFinCnt = Integer.parseInt(zaikoInfo.getString("YOBI_KKSHKA_FIN_CNT"));	// 予備機器出荷完了数
		int siyoCnt = 0;

		StringBuffer zaikoKey = new StringBuffer();
		zaikoKey.append(KANRI_PLACE_SKCD_SOKO);
		zaikoKey.append(sokoCd);
		zaikoKey.append(shelfCd);
		zaikoKey.append(tnkikiModelCd);

		HashMap<String, String> zaikoSuCheckMap = null;
		if (divTgKikiFlg)
		{
			zaikoSuCheckMap = zaikoSuCheckMap1;
		}
		else
		{
			zaikoSuCheckMap = zaikoSuCheckMap2;
		}

		// 宅内機器型式コードが登録されている場合
		if (zaikoSuCheckMap.containsKey(zaikoKey.toString()))
		{
			siyoCnt = Integer.parseInt(zaikoSuCheckMap.get(zaikoKey.toString()));
		}

		// 在庫チェック
		int checkCnt = jzaikoCnt - (haisoShukkaSjiCnt + shelfMoveSjiCnt + ybkkhaiSjiCnt + ybkkhaiChuCnt + yobiKkshkaFinCnt) - siyoCnt;
		if (checkCnt <= 0)
		{
			return false;
		}

		// 使用数を登録
		siyoCnt++;
		zaikoSuCheckMap.put(zaikoKey.toString(), Integer.toString(siyoCnt));

		return true;
	}

	/**
	 * データを更新します。
	 * 
	 * <div>
	 * 以下の更新処理を行います。
	 * <ul>
	 * <li>配送情報登録</li>
	 * <li>配送対象物品情報更新</li>
	 * </ul>
	 * </div>
	 * 
	 * @throws Exception
	 */
	private void executeUpdate() throws Exception
	{
		Object[] params = null;
		Object[] setParams = null;
		Object[] whereParams = null;

		super.commonItem.getLogPrint().printDebugLog("配送分割登録件数：" + haisoDivTgMap.size());

		for (Entry<String, List<String>> entry : haisoDivTgMap.entrySet())
		{
			// 配送情報ロック用パラメータ
			params = new Object[] {
					entry.getKey()
			};

			try
			{
				// 配送情報をロック
				executeDK_T_HAISO_DK_SELECT_002(params);
			}
			catch (Exception ex)
			{
				super.commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0020KE,
						new String[] {"配送",
						"配送情報ロック失敗"
						+ "；配送番号＝" + entry.getKey()});
				throw ex;
			}

			// 配送情報登録
			// 配送番号を採番
			String newHaisoNo = getHaisoNo();

			// PKマップを作成
			Map<String, Object> pkMap = new HashMap<String, Object>();
			pkMap.put("HAISO_NO", entry.getKey());

			// VALUEマップを作成
			Map<String, Object> valueMap = new HashMap<String, Object>();
			valueMap.put("HAISO_NO", newHaisoNo);

			try
			{
				// PKで検索した値にVALUEマップの情報を上書きしたデータを登録
				JDKBatCommon.insertByPrimaryKeys(super.commonItem, db_DK_T_HAISO, pkMap, valueMap);
			}
			catch (Exception ex)
			{
				super.commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0070CE,
						new String[] {"配送",
						"配送情報登録失敗"
						+ "；分割元の配送番号＝" + entry.getKey()
						+ "；分割先の配送番号＝" + newHaisoNo});
				throw ex;
			}

			// 配送対象物品更新
			// 配送対象物品情報更新用パラメータ
			setParams = new Object[] {
					newHaisoNo
			};

			for (String haisoTaibpinNo : entry.getValue())
			{
				// 配送対象物品情報更新条件用パラメータ
				whereParams = new Object[] {
						haisoTaibpinNo
				};

				try
				{
					// 配送対象物品情報を更新
					executeDK_T_HAISO_TG_BPIN_PKUPDATE(setParams, whereParams);
				}
				catch (Exception ex)
				{
					super.commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0040CE,
							new String[] {"配送対象物品",
							"配送対象物品情報更新失敗"
							+ "；配送対象物品番号＝" + haisoTaibpinNo
							+ "；分割元の配送番号＝" + entry.getKey()
							+ "；分割先の配送番号＝" + newHaisoNo});
					throw ex;
				}
			}
		}

		super.commonItem.getLogPrint().printDebugLog("更新処理終了");
	}

	/**
	 * 配送番号を採番して返却します。
	 * 
	 * <div>
	 * 以下の項目に値を設定します。
	 * <ul>
	 * <li>HaisoNoKanriCd（配送番号の採番識別子管理コード）</li>
	 * </ul>
	 * </div>
	 * 
	 * @return 採番された配送番号
	 * @throws Exception
	 */
	private String getHaisoNo() throws Exception
	{
		StringBuffer prefix = new StringBuffer();

		if (JDKCommonUtil.isNull(HaisoNoKanriCd))
		{
			// 配送番号の採番識別子管理コード取得用パラメータ
			Object[] params = new Object[] {
					JZM0171Constant.CD00692,
					"01"
			};

			try
			{
				// 配送番号の採番識別子管理コードを取得
				executeZM_M_CD_NM_KANRI_DK_SELECT_001(params);
			}
			catch (Exception ex)
			{
				super.commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0020KE,
						new String[] {"コード名称管理", "配送番号のプリフィックス取得エラー"});
				throw ex;
			}

			JBSbatCommonDBInterface cdNmKanriInfo = db_ZM_M_CD_NM_KANRI.selectNext();
			HaisoNoKanriCd = cdNmKanriInfo.getString("CD_DIV_NM");
		}

		// 配送番号のプレフィックス
		prefix.append(HaisoNoKanriCd);
		prefix.append(super.commonItem.getOpeDate().substring(2, 4));

		try
		{
			// 配送番号を採番
			return JCCBatCommon.getFormatedNextSeq(super.commonItem, SEQ_HAISO_NO, prefix.toString(), 7);
		}
		catch (Exception ex)
		{
			super.commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0020KE,
					new String[] {"配送番号シーケンス",
					"配送番号シーケンス採番失敗"
					+ "；シーケンス＝" + SEQ_HAISO_NO
					+ "；接頭語＝" + prefix.toString()
					+ "；桁数＝7"});
			throw ex;
		}
	}

	/* ++++++++++ v1.00.00 追加終了 ++++++++++ */
}
