/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：物流管理システム
*   ソースファイル名：JDKCommon08CC.java
*   作成者          ：富士通
*   日付            ：2011年07月20日
*＜機能概要＞
*   返品機器承認CCクラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/07/20   FJ          新規作成
*   v5.00.00    2013/11/13   FJ          場所コード棚コードチェック追加(OM-2013-0004282)
*   v8.00.00    2014/07/02   FJ)窪田     OM-2014-0002103対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.mapping.DKSV0034_DKSV0034OP_EDK0061D010BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0034_DKSV0034OP_EDK0071D010BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0034_DKSV0034OP_EDK0111D010BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0034_DKSV0034OP_EDK0211D020BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0034_DKSV0034OP_EDKA0010004BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0034_DKSV0034OP_EDKA0010008BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0034_DKSV0034OP_EKKA0020005BSMapper;
import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;


/**
 * 棚移動指示登録CCクラスです。
 * @author 富士通
 */
public class JDKCommon40CC extends AbstractCommonComponent
{
	/** SC名 */
	private static final String DKSV003401SC = "DKSV003401SC";
	private static final String DKSV003402SC = "DKSV003402SC";
	private static final String DKSV003403SC = "DKSV003403SC";
	private static final String DKSV003404SC = "DKSV003404SC";
	/** 在庫チェックマッパー */
	private static final DKSV0034_DKSV0034OP_EKKA0020005BSMapper ZAIKO_MAPPER = new DKSV0034_DKSV0034OP_EKKA0020005BSMapper();
	/** 宅内機器情報取得マッパー */
	private static final DKSV0034_DKSV0034OP_EDKA0010008BSMapper KIKI_MAPPER = new DKSV0034_DKSV0034OP_EDKA0010008BSMapper();
	/** 宅内情報更新マッパー */
	private static final DKSV0034_DKSV0034OP_EDKA0010004BSMapper TKNI_MAPPER = new DKSV0034_DKSV0034OP_EDKA0010004BSMapper();

	/**
	 * マッパー
	 * DKSV0034_DKSV0034OP_EDK0111D010BSMapper
	 * DKSV0034_DKSV0034OP_EDK0211D020BSMapper
	 * DKSV0034_DKSV0034OP_EDK0061D010BSMapper
	 * DKSV0034_DKSV0034OP_EDK0071D010BSMapper
	 */
	
	
	/**
	 * 棚移動指示登録処理を行います。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param fixedText 定型文字
	 * @return パラメータ
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite insert(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		String funcCd = "";
		HashMap<String, Object> contractsParamMap = new HashMap<String, Object>();
		HashMap<String, Object> dataMap = new HashMap<String, Object>();
		param.setData("DKSV003400CC", dataMap);
		Map dksv003401sc = (Map)param.getData(DKSV003401SC);
		dataMap.put("func_code", "1");
		List<HashMap> sokoList = null;
		List<HashMap> ucwkList = null;
		List<HashMap> ybkikiList = null;
		List<HashMap> ybkikiUcwkList = null;
		
		String shiteWayCd =null;
		
		if (null != dksv003401sc && dksv003401sc.containsKey("soko_list"))
		{
			sokoList = (ArrayList<HashMap>)dksv003401sc.get("soko_list");
			funcCd = (String)dksv003401sc.get(JCMConstants.FUNC_CODE_KEY);
			shiteWayCd = (String) sokoList.get(0).get("shitei_way_cd");
		}
		Map dksv003402sc = (Map)param.getData(DKSV003402SC);
		if (null != dksv003402sc && dksv003402sc.containsKey("ucwk_list"))
		{
			ucwkList = (ArrayList<HashMap>)dksv003402sc.get("ucwk_list");
			setShelfMoveLotNoKikiSeq(ucwkList, shiteWayCd, true);
		}
		Map dksv003403sc = (Map)param.getData(DKSV003403SC);
		if (null != dksv003403sc && dksv003403sc.containsKey("ybkiki_list"))
		{
			ybkikiList = (ArrayList<HashMap>)dksv003403sc.get("ybkiki_list");
			funcCd = (String)dksv003403sc.get(JCMConstants.FUNC_CODE_KEY);
			shiteWayCd = (String) ybkikiList.get(0).get("shitei_way_cd");
		}
		Map dksv003404sc = (Map)param.getData(DKSV003404SC);
		if (null != dksv003404sc && dksv003404sc.containsKey("ucwk_list"))
		{
			ybkikiUcwkList = (ArrayList<HashMap>)dksv003404sc.get("ucwk_list");
			setShelfMoveLotNoKikiSeq(ybkikiUcwkList, shiteWayCd, false);
		}
		String mv_sbt = "";
		String key_shelf_move_lot_no = "";
		// 倉庫リストが存在する場合、倉庫棚移動登録、倉庫棚移動内訳登録を行う
		if (sokoList != null && sokoList.size() > 0)
		{
			mv_sbt = "1";	// 館内
			for (int i = 0; i < sokoList.size(); i++)
			{
				DKSV0034_DKSV0034OP_EDK0111D010BSMapper SOKO_CONTRACT_MAPPER = new DKSV0034_DKSV0034OP_EDK0111D010BSMapper(); 
				SOKO_CONTRACT_MAPPER.setParamInMap(sokoList.get(i));
				contractsParamMap = SOKO_CONTRACT_MAPPER.editInMsg(param);
				JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "倉庫棚移動登録処理の実行");
				Map contractResult = scCall.run(contractsParamMap, handle);
				SOKO_CONTRACT_MAPPER.editResultRP(contractResult, param);
				
				if (JDKBPCommon.hasError(param))
				{
					throw new SCCallException("倉庫棚移動登録処理失敗", "0", 
												Integer.parseInt(param.getControlMapData("returnCode").toString()));
				}
				
				// エラー判定
				Map sokoData = (Map)param.getData("DKSV003401SC");
				// 倉庫コード
				if (sokoData.containsKey("soko_cd_err"))
				{
					String errCd = sokoData.get("soko_cd_err").toString();
					String statCd = param.getControlMapData(SCControlMapKeys.RETURN_CODE).toString();

					if ("1100".equals(statCd) && "EA".equals(errCd))
					{
						// 存在チェックエラー
						JDKBPCommon.addError(param, 
											"soko_cd_err", 
											"EA", "EDK0111D010", 1100, 0);
						throw new SCCallException("倉庫棚移動登録処理失敗", "0", 1100);
					}
					else if ("1100".equals(statCd) && "ED".equals(errCd))
					{
						// 存在チェックエラー
						JDKBPCommon.addError(param, 
											"soko_cd_err", 
											"ED", "EDK0111D010", 1100, 0);
						throw new SCCallException("倉庫棚移動登録処理失敗", "0", 1100);
					}
					else if ("1100".equals(statCd) && "EE".equals(errCd))
					{
						// 存在チェックエラー
						JDKBPCommon.addError(param, 
											"soko_cd_err", 
											"EE", "EDK0111D010", 1100, 0);
						throw new SCCallException("倉庫棚移動登録処理失敗", "0", 1100);
					}
				}

				// 採番された棚移動ロット番号を保持
				if (sokoData.containsKey("shelf_move_lot_no"))
				{
					key_shelf_move_lot_no = (String)sokoData.get("shelf_move_lot_no");
					if (i + 1 < sokoList.size())
					{
						sokoList.get(i + 1).put("key_shelf_move_lot_no", key_shelf_move_lot_no);
					}
				}

				if (ucwkList != null && ucwkList.size() > 0)
				{
					// 倉庫棚移動登録で採番された棚移動番号を渡す
					ucwkList.get(i).put("sokodna_move_no", sokoData.get("sokodna_move_no").toString());

					DKSV0034_DKSV0034OP_EDK0211D020BSMapper SOKO_APPROVE_MAPPER = new DKSV0034_DKSV0034OP_EDK0211D020BSMapper();
					SOKO_APPROVE_MAPPER.setParamInMap(ucwkList.get(i));
					contractsParamMap = SOKO_APPROVE_MAPPER.editInMsg(param);
					JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "倉庫棚移動内訳登録処理の実行");
					contractResult = scCall.run(contractsParamMap, handle);
					SOKO_APPROVE_MAPPER.editResultRP(contractResult, param);
					
					if (JDKBPCommon.hasError(param))
					{
						throw new SCCallException("倉庫棚移動内訳登録処理失敗", "0", 
													Integer.parseInt(param.getControlMapData("returnCode").toString()));
					}
					
					// エラー判定
					Map sokoUcwkData = (Map)param.getData("DKSV003402SC");
					// 倉庫棚移動番号
					if (sokoUcwkData.containsKey("sokodna_move_no_err"))
					{
						String errCd = sokoUcwkData.get("sokodna_move_no_err").toString();
						String statCd = param.getControlMapData(SCControlMapKeys.RETURN_CODE).toString();

						if ("1100".equals(statCd) && "EA".equals(errCd))
						{
							// 存在チェックエラー
							JDKBPCommon.addError(param, 
												"sokodna_move_no_err", 
												"EA", "EDK0211D020", 1100, 0);
							throw new SCCallException("倉庫棚移動内訳登録処理失敗", "0", 1100);
						}
					}
					else if (sokoUcwkData.containsKey("taknkiki_sethin_no_err"))
					{
						// 宅内機器セット品番号
						String errCd = sokoUcwkData.get("taknkiki_sethin_no_err").toString();
						String statCd = param.getControlMapData(SCControlMapKeys.RETURN_CODE).toString();

						if ("1100".equals(statCd) && "EB".equals(errCd))
						{
							// 存在チェックエラー
							JDKBPCommon.addError(param, 
												"taknkiki_sethin_no_err", 
												"EB", "EDK0211D020", 1100, 0);
							throw new SCCallException("倉庫棚移動内訳登録処理失敗", "0", 1100);
						}
					}
					this.setKikiList(dataMap, ucwkList, mv_sbt);
				}
			}
		}
		// 予備機器リストが存在する場合、予備機器配送受付、予備機器配送内訳登録を行う
		else if (ybkikiList != null && ybkikiList.size() > 0)
		{
			mv_sbt = "2";	// 館外
			for (int i = 0; i < ybkikiList.size(); i++)
			{
				DKSV0034_DKSV0034OP_EDK0061D010BSMapper YOBI_CONTRACT_MAPPER = new DKSV0034_DKSV0034OP_EDK0061D010BSMapper();
				YOBI_CONTRACT_MAPPER.setParamInMap(ybkikiList.get(i));
				contractsParamMap = YOBI_CONTRACT_MAPPER.editInMsg(param);
				JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "予備機器配送受付処理の実行");
				Map contractResult = scCall.run(contractsParamMap, handle);
				YOBI_CONTRACT_MAPPER.editResultRP(contractResult, param);
				
				if (JDKBPCommon.hasError(param))
				{
					throw new SCCallException("予備機器配送受付処理失敗", "0", 
												Integer.parseInt(param.getControlMapData("returnCode").toString()));
				}
				
				// エラー判定
				Map ybkData = (Map)param.getData("DKSV003403SC");
				// 配送元倉庫コード
				if (ybkData.containsKey("haiso_moto_soko_cd_err"))
				{
					String errCd = ybkData.get("haiso_moto_soko_cd_err").toString();
					String statCd = param.getControlMapData(SCControlMapKeys.RETURN_CODE).toString();

					if ("1100".equals(statCd) && "EA".equals(errCd))
					{
						// 存在チェックエラー
						JDKBPCommon.addError(param, 
											"haiso_moto_soko_cd_err", 
											"EA", "EDK0061D010", 1100, 0);
						throw new SCCallException("予備機器配送受付処理失敗", "0", 1100);
					}
					else if ("1100".equals(statCd) && "ED".equals(errCd))
					{
						// 存在チェックエラー
						JDKBPCommon.addError(param, 
											"haiso_moto_soko_cd_err", 
											"ED", "EDK0061D010", 1100, 0);
						throw new SCCallException("予備機器配送受付処理失敗", "0", 1100);
					}
				}
				else if (ybkData.containsKey("hisos_soko_cd_err"))
				{
					// 配送先倉庫コード
					String errCd = ybkData.get("hisos_soko_cd_err").toString();
					String statCd = param.getControlMapData(SCControlMapKeys.RETURN_CODE).toString();

					if ("1100".equals(statCd) && "EG".equals(errCd))
					{
						// 存在チェックエラー
						JDKBPCommon.addError(param, 
											"hisos_soko_cd_err", 
											"EG", "EDK0061D010", 1100, 0);
						throw new SCCallException("予備機器配送受付処理失敗", "0", 1100);
					}
					else if ("1100".equals(statCd) && "EJ".equals(errCd))
					{
						// 存在チェックエラー
						JDKBPCommon.addError(param, 
											"hisos_soko_cd_err", 
											"EJ", "EDK0061D010", 1100, 0);
						throw new SCCallException("予備機器配送受付処理失敗", "0", 1100);
					}
				}

				// 採番された棚移動ロット番号を保持
				if (ybkData.containsKey("shelf_move_lot_no"))
				{
					key_shelf_move_lot_no = (String)ybkData.get("shelf_move_lot_no");
					if (i + 1 < ybkikiList.size())
					{
						ybkikiList.get(i + 1).put("key_shelf_move_lot_no", key_shelf_move_lot_no);
					}
				}

				if (ybkikiUcwkList != null && ybkikiUcwkList.size() > 0)
				{
					// 予備機器配送受付で採番された予備機器配送番号を渡す
					ybkikiUcwkList.get(i).put("ybkiki_haiso_no", ybkData.get("ybkiki_haiso_no").toString());

					DKSV0034_DKSV0034OP_EDK0071D010BSMapper YOBI_APPROVE_MAPPER = new DKSV0034_DKSV0034OP_EDK0071D010BSMapper();
					YOBI_APPROVE_MAPPER.setParamInMap(ybkikiUcwkList.get(i));
					contractsParamMap = YOBI_APPROVE_MAPPER.editInMsg(param);
					JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "予備機器配送内訳登録処理の実行");
					contractResult = scCall.run(contractsParamMap, handle);
					YOBI_APPROVE_MAPPER.editResultRP(contractResult, param);
					
					if (JDKBPCommon.hasError(param))
					{
						throw new SCCallException("予備機器配送内訳登録処理失敗", "0", 
													Integer.parseInt(param.getControlMapData("returnCode").toString()));
					}
					
					// エラー判定
					Map ybkUcwkData = (Map)param.getData("DKSV003404SC");
					// 予備機器配送番号
					if (ybkUcwkData.containsKey("ybkiki_haiso_no_err"))
					{
						String errCd = ybkUcwkData.get("ybkiki_haiso_no_err").toString();
						String statCd = param.getControlMapData(SCControlMapKeys.RETURN_CODE).toString();

						if ("1100".equals(statCd) && "EA".equals(errCd))
						{
							// 存在チェックエラー
							JDKBPCommon.addError(param, 
												"ybkiki_haiso_no_err", 
												"EA", "EDK0071D010", 1100, 0);
							throw new SCCallException("予備機器配送内訳登録処理失敗", "0", 1100);
						}
					}
					else if (ybkUcwkData.containsKey("taknkiki_sethin_no_err"))
					{
						// 宅内機器セット品番号
						String errCd = ybkUcwkData.get("taknkiki_sethin_no_err").toString();
						String statCd = param.getControlMapData(SCControlMapKeys.RETURN_CODE).toString();

						if ("1100".equals(statCd) && "EB".equals(errCd))
						{
							// 存在チェックエラー
							JDKBPCommon.addError(param, 
												"taknkiki_sethin_no_err", 
												"EB", "EDK0071D010", 1100, 0);
							throw new SCCallException("予備機器配送内訳登録処理失敗", "0", 1100);
						}
					}
					this.setKikiList(dataMap, ybkikiUcwkList, mv_sbt);
				}
			}
		}
		

		
		// 機能コードが「１」の場合のみ宅内情報更新実行
		if(funcCd.equals("1")){
			
			ArrayList dataList = null;
			String mt_soko_cd = "";			// 移動元倉庫コード
			String mt_koji_cd = "";			// 移動元工事会社コード
			String mt_yotaku_cd = "";		// 移動元預託先コード
			String mt_knri_plc_slf_cd = "";	// 移動元棚コード
			String key_gds_stat_cd = "";	// 商品状態コード
			String shitei_way = "";

			HashMap<String, String> modelNoMap = new HashMap<String, String>();
			if(mv_sbt.equals("1"))
			{
				dataList = (ArrayList)dksv003401sc.get("soko_list");
				mt_soko_cd = (String)((HashMap)dataList.get(0)).get("soko_cd");						// 移動元倉庫コード
				mt_koji_cd = (String)((HashMap)dataList.get(0)).get("koji_comp_cd");				// 移動元工事会社コード
				mt_yotaku_cd = (String)((HashMap)dataList.get(0)).get("yotaku_saki_offc_cd");		// 移動元預託先コード
				mt_knri_plc_slf_cd = (String)((HashMap)dataList.get(0)).get("move_moto_shelf_cd");
				key_gds_stat_cd = (String)((HashMap)dataList.get(0)).get("gds_stat_cd");
				shitei_way = (String)((HashMap)dataList.get(0)).get("shitei_way_cd");

			}
			else
			{
				dataList = (ArrayList)dksv003403sc.get("ybkiki_list");
				mt_soko_cd = (String)((HashMap)dataList.get(0)).get("haiso_moto_soko_cd");			// 移動元倉庫コード
				mt_koji_cd = (String)((HashMap)dataList.get(0)).get("hisom_kocomp_cd");				// 移動元工事会社コード
				mt_yotaku_cd = (String)((HashMap)dataList.get(0)).get("hisom_yotaku_sk_offc_cd");	// 移動元預託先コード
				mt_knri_plc_slf_cd = (String)((HashMap)dataList.get(0)).get("hisom_shelf_cd");
				key_gds_stat_cd = (String)((HashMap)dataList.get(0)).get("gds_stat_cd");
				shitei_way = (String)((HashMap)dataList.get(0)).get("shitei_way_cd");
			}

			// 管理場所識別コードと管理場所コードの設定
			// 移動元建物
			String mt_knri_plc_skbt_cd = "";
			String mt_knri_plc_cd = "";
			if(mt_soko_cd != null && !mt_soko_cd.equals("")){
				mt_knri_plc_skbt_cd = "1";
				mt_knri_plc_cd = mt_soko_cd;
			}else if(mt_koji_cd != null && !mt_koji_cd.equals("")){
				mt_knri_plc_skbt_cd = "2";
				mt_knri_plc_cd = mt_koji_cd;
			}else if(mt_yotaku_cd != null && !mt_yotaku_cd.equals("")){
				mt_knri_plc_skbt_cd = "3";
				mt_knri_plc_cd = mt_yotaku_cd;
			}

			// 商品状態コードが設定されていない場合、「-」返品棚以外を設定
			if(key_gds_stat_cd == null || key_gds_stat_cd.equals("")){
				key_gds_stat_cd = "-";
			}
			
			// 在庫情報更新のための型番号ごとの指示数量を算出
			for (int i = 0; i < dataList.size(); i++) {
				HashMap childMap = (HashMap)dataList.get(i);
				String tkkiki_mdl_cd = (String)childMap.get("taknkiki_model_cd");
				String cnt = (String)childMap.get("sji_cnt");
				String ttlCnt = modelNoMap.get(tkkiki_mdl_cd);
				if(ttlCnt == null)
				{
					modelNoMap.put(tkkiki_mdl_cd, cnt);
				}
				else
				{
					int total = Integer.parseInt(ttlCnt) + Integer.parseInt(cnt);
					modelNoMap.put(tkkiki_mdl_cd, Integer.toString(total));
				}
			}
			
			ArrayList ekka0020005CBSMsg1List = new ArrayList();
			
			for(Iterator ite = modelNoMap.keySet().iterator(); ite.hasNext();){
				Object key = ite.next();
				String mdl_no = key.toString();
				
				HashMap childMap = new HashMap();
				
				// ＫＥＹ＿管理場所識別コード
				childMap.put("key_knri_plc_skbt_cd", mt_knri_plc_skbt_cd);
				// ＫＥＹ＿管理場所コード
				childMap.put("key_knri_plc_cd", mt_knri_plc_cd);
				// ＫＥＹ＿管理場所棚コード
				childMap.put("key_knri_plc_slf_cd", mt_knri_plc_slf_cd);
				// ＫＥＹ＿宅内機器型式コード
				childMap.put("key_tk_mdl_cd", mdl_no);
				// ＫＥＹ＿商品状態コード				
				childMap.put("key_gds_stat_cd", key_gds_stat_cd);
				
				ekka0020005CBSMsg1List.add(childMap);
			}
			
			dataMap.put("EKKA0020005CBSMsg1List", ekka0020005CBSMsg1List);
			
			// 棚移動する機器の情報を取得
			HashMap<String, Object> zaikoParamMap = new HashMap<String, Object>();
			zaikoParamMap = ZAIKO_MAPPER.editInMsg(param);
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "宅内機器物流在庫一意照会処理の実行");
			Map zaikoResult = scCall.run(zaikoParamMap, handle);
			ZAIKO_MAPPER.editResultRP(zaikoResult, param);
			
			if (JDKBPCommon.hasError(param))
			{
				throw new SCCallException("宅内機器物流在庫一意照会処理失敗", "0", 
											Integer.parseInt(param.getControlMapData("returnCode").toString()));
			}
			
			JDKBPCommon.throwScExceptionIfHasError("宅内機器物流在庫一意照会処理リターンコード不正", param);
			
			boolean zaikoErr = false;
			ArrayList zaikoList = (ArrayList)dataMap.get("EKKA0020005CBSMsg2List");
			
			// 在庫情報が取得できた場合
			if(zaikoList != null && zaikoList.size() > 0)
			{
				for(Iterator ite = modelNoMap.keySet().iterator(); ite.hasNext();){
					Object key = ite.next();
					Object cnt = modelNoMap.get(key);
					String mdl_no = key.toString();
					
					for(int j=0;j < zaikoList.size();j++){
						HashMap zaikoMap = (HashMap)zaikoList.get(j);
						String mdl_no_zai = (String)zaikoMap.get("tk_mdl_cd");
						if(mdl_no.equals(mdl_no_zai)){
							long cnt_l = Long.parseLong(cnt.toString());
							long zaiko_l = this.getZaikoCnt(zaikoMap);
							if(cnt_l > zaiko_l){
								// 在庫不足
								zaikoErr = true;
							}
						}
					}
				}
			}
			else{
				// 該当データなし
				zaikoErr = true;
			}
			
			// 在庫不足もくしは該当データなしの場合
			if(zaikoErr)
			{
				// 「在庫が不足している為、登録できません。」のメッセージを設定
				JDKBPCommon.addError(param, 
						"tk_mdl_cd_err", 
						"EA", "EKKA0020005", 1100, 0);
				throw new SCCallException("宅内機器物流在庫一意照会（在庫チェックエラー）", "0", StatusCodes.RELATION_ERR);
			}
			
			ArrayList edka0010004CbsMsg2List = new ArrayList();
			// 在庫情報の設定
			// 移動元在庫更新
			for(Iterator ite = modelNoMap.keySet().iterator(); ite.hasNext();){
				Object key = ite.next();
				Object cnt = modelNoMap.get(key);
				String mdl_no = key.toString();
	
				HashMap childMap = new HashMap();
	
				// ＫＥＹ＿レコード区分
				childMap.put("key_record_div", "2");
				// ＫＥＹ＿管理場所識別コード
				childMap.put("key_knri_plc_skbt_cd", mt_knri_plc_skbt_cd);
				// ＫＥＹ＿管理場所コード
				childMap.put("key_knri_plc_cd", mt_knri_plc_cd);
				// ＫＥＹ＿管理場所棚コード
				childMap.put("key_knri_plc_slf_cd", mt_knri_plc_slf_cd);
				// ＫＥＹ＿宅内機器型式コード
				childMap.put("key_taknkiki_model_cd", mdl_no);
				// ＫＥＹ＿商品状態コード				
				childMap.put("key_gds_stat_cd", key_gds_stat_cd);
				// 実在庫数
				childMap.put("jzaiko_num", "0");
				// 館内移動の場合
				if(mv_sbt.equals("1"))
				{
					// 予備機器配送指示数
					childMap.put("ybkiki_haiso_sji_num", "0");
					// 棚移動指示数
					childMap.put("shelf_mv_sji_num", cnt);
				}
				// 館外移動の場合
				else if(mv_sbt.equals("2"))
				{
					// 予備機器配送指示数
					childMap.put("ybkiki_haiso_sji_num", cnt);
					// 棚移動指示数
					childMap.put("shelf_mv_sji_num", "0");
				}
				// 予備機器配送中数
				childMap.put("ybkiki_haiso_chu_num", "0");
				// 棚移動入荷完了数
				childMap.put("shelf_mv_nyka_fin_num", "0");
				// 棚移動出荷完了数
				childMap.put("shelf_mv_shka_fin_num", "0");
				// 予備機器出荷完了数
				childMap.put("ybkiki_shka_fin_num", "0");
				
				edka0010004CbsMsg2List.add(childMap);
	
			}

			// 在庫更新情報を設定
			dataMap.put("EDKA0010004CBSMsg2List", edka0010004CbsMsg2List);
			
			// 指定方法が「２」：製造番号指定の場合のみ宅内機器更新を実施
			if(shitei_way.equals("2")){
				
				// 宅内管理システムより機器の情報を取得
				HashMap<String, Object> kikiParamMap = new HashMap<String, Object>();
				kikiParamMap = KIKI_MAPPER.editInMsg(param);
				JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "宅内機器一覧照会(5)処理の実行");
				Map kikiResult = scCall.run(kikiParamMap, handle);
				KIKI_MAPPER.editResultRP(kikiResult, param);
				
				if (JDKBPCommon.hasError(param))
				{
					throw new SCCallException("宅内機器一覧照会(5)処理失敗", "0", 
												Integer.parseInt(param.getControlMapData("returnCode").toString()));
				}
				
				JDKBPCommon.throwScExceptionIfHasError("宅内機器一覧照会(5)処理リターンコード不正", param);
				
				ArrayList edka0010004CbsMsg1List = new ArrayList();
				
				ArrayList tkniKikiList = (ArrayList)dataMap.get("tkniKikiList");
				
				// 問い合わせ件数
				int requestCnt = tkniKikiList.size();
				
				// 問い合わせ結果の件数
				int resultCnt = 0;
				
				for (int i = 0; i < tkniKikiList.size(); i++)
				{
					// 宅内から結果が返って来た場合は型番が設定されている
				    HashMap paramInMap = (HashMap) tkniKikiList.get(i);
				    String modelCd = (String) paramInMap.get("tk_mdl_cd");
				    if (!"".equals(modelCd))
				    {
				    	resultCnt = resultCnt + 1;
				    }
				}
				
			    // 問い合わせ件数と問い合わせ結果件数が異なる場合
				if(requestCnt != resultCnt)
				{
					// 「宅内機器に該当の製造番号が存在しません。」のメッセージを設定
					JDKBPCommon.addError(param, 
							"kiki_seizo_no_err", 
							"EA", "EDKA0010008", 1100, 0);
					throw new SCCallException("宅内機器一覧照会(5)処理（データ存在チェックエラー）", "0", StatusCodes.RELATION_ERR);
				}
				
				HashMap paramInMap = null;
				String knriPlcCd = ""; // 建物コード(宅内からの戻り値)
				String knriPlcSlfCd = "";	//棚コード(宅内からの戻り値)
				String gdsStatCd = "";	// 商品状態コード(宅内からの戻り値)
				// 場所と棚と商品状態コードのチェック追加
				
				List<Map<String, Object>> errors = new ArrayList<Map<String, Object>>();
				for (int i = 0; i < tkniKikiList.size(); i++)
				{
				    paramInMap = (HashMap) tkniKikiList.get(i);
				    knriPlcCd = (String) paramInMap.get("knri_plc_cd");
				    knriPlcSlfCd = (String) paramInMap.get("knri_plc_slf_cd");
				    gdsStatCd = (String) paramInMap.get("gds_stat_cd");
				    if (!mt_knri_plc_cd.equals(knriPlcCd) || !mt_knri_plc_slf_cd.equals(knriPlcSlfCd) || !key_gds_stat_cd.equals(gdsStatCd))
				    {
						JDKBPCommon.addError(param, "kiki_seizo_no_err", "EA", "EDKA0010008", StatusCodes.RELATION_ERR, 0);

						Map<String, Object> seizoNo = new HashMap<String, Object>();
						seizoNo.put("seizoNo", paramInMap.get("kk_seizo_no"));
						errors.add(seizoNo);
				    }
				}
				if (!errors.isEmpty())
				{
					// ロジック側で「宅内機器に該当の製造番号の機器が存在しません。（?行目）」のメッセージを設定する
					dataMap.put("seizoNo_err_list", errors);
					throw new SCCallException("宅内機器一覧照会(5)処理（場所チェックエラー）", "0", StatusCodes.RELATION_ERR);
				}
				
				// 宅内機器情報を設定
				for(int i=0;i<tkniKikiList.size();i++){
					
					HashMap tkniMap = (HashMap)tkniKikiList.get(i);
					
					HashMap childMap = new HashMap();
					// ＫＥＹ＿レコード区分
					childMap.put("key_record_div", "1");
					// ＫＥＹ＿処理区分
					childMap.put("key_trn_div", "1");
					// ＫＥＹ＿処理パターン
					childMap.put("key_trn_ptn", "1");
					// ＫＥＹ＿移動区分
					childMap.put("key_ido_kbn", mv_sbt);
					// ＫＥＹ＿取消区分
					childMap.put("key_trks_kbn", "0");
					// ＫＥＹ＿宅内機器型式コード
					childMap.put("key_tk_mdl_cd", (String)tkniMap.get("tk_mdl_cd"));
					// ＫＥＹ＿機器製造番号
					childMap.put("key_kk_seizo_no", (String)tkniMap.get("kk_seizo_no"));
					// ＫＥＹ＿管理場所識別コード
					childMap.put("key_knri_plc_skbt_cd", "");
					// ＫＥＹ＿管理場所コード
					childMap.put("key_knri_plc_cd", "");
					// ＫＥＹ＿管理場所棚コード
					childMap.put("key_knri_plc_slf_cd","");
					// ＫＥＹ＿商品状態コード
					childMap.put("key_gds_stat_cd", "");
					// ＫＥＹ＿数量
					childMap.put("key_num", "");
					// ＫＥＹ＿棚移動ロット番号
					childMap.put("key_slf_mv_lot_no", "");
					// ＫＥＹ＿宅内機器基本Ｔ更新日付
					childMap.put("key_kihon_upd_dttm", (String)tkniMap.get("khn_mod_dttm"));
					// 棚移動予約フラグ
					childMap.put("slf_mv_rsv_flg", "1");
					// 棚移動ロット番号
					childMap.put("slf_mv_lot_no", key_shelf_move_lot_no);
					// 管理場所識別コード
					childMap.put("knri_plc_skbt_cd", (String)tkniMap.get("knri_plc_skbt_cd"));
					// 管理場所コード
					childMap.put("knri_plc_cd", (String)tkniMap.get("knri_plc_cd"));
					// 管理場所棚コード
					childMap.put("knri_plc_slf_cd", (String)tkniMap.get("knri_plc_slf_cd"));
					// 予備品フラグ
					childMap.put("yobih_flg",  (String)tkniMap.get("yobi_gds_flg"));
					// 倉庫出荷日
					childMap.put("soko_syukka_ymd", (String)tkniMap.get("soko_shka_ymd"));
					// 商品状態コード
					childMap.put("gds_stat_cd", (String)tkniMap.get("gds_stat_cd"));
					
					edka0010004CbsMsg1List.add(childMap);
				}
				// 宅内機器更新情報を設定
				dataMap.put("EDKA0010004CBSMsg1List", edka0010004CbsMsg1List);
			
			}
			
			// 宅内情報更新
			HashMap<String, Object> tkniMap = new HashMap<String, Object>();
			tkniMap = TKNI_MAPPER.editInMsg(param);
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "宅内機器棚移動情報更新処理の実行");
			scCall.run(tkniMap, handle);
			param = TKNI_MAPPER.editResultRP(tkniMap, param);
			
			if (JDKBPCommon.hasError(param)) {
				throw new SCCallException("宅内機器棚移動情報更新処理失敗", "0", 
						Integer.parseInt(param.getControlMapData("returnCode").toString()));
			}
			
			JDKBPCommon.throwScExceptionIfHasError("宅内機器棚移動情報更新処理リターンコード不正", param);
		}
		
		return param;
	}
	
	/**
	 * 宅内機器情報の取得を行うための条件設定を行います。
	 * @param param パラメータ
	 * @param  utwkList 棚移動内訳情報リスト
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void setKikiList(HashMap<String, Object> dataMap, List<HashMap> utwkList,String mv_sbt) throws Exception
	{

		ArrayList kikiList = new ArrayList();
		// 予備機器配送内訳データ件数分ループ
		for (int i = 0; i < utwkList.size(); i++)
		{
			Map utwkMap = (Map)utwkList.get(i);	
			ArrayList list = null;
			if(mv_sbt.equals("1"))
			{
				list = (ArrayList)utwkMap.get("EDK0211D010CBSMsg1List");
			}
			else if(mv_sbt.equals("2"))
			{
				list = (ArrayList)utwkMap.get("EDK0071D010CBSMsg1List");				
			}
			for(int j = 0; j < list.size(); j++)
			{
				Map childMap = (Map)list.get(j);
				Map kikiMap = new HashMap<String, String>();
				kikiMap.put("tkkiki_mdl_cd", childMap.get("taknkiki_model_cd"));
				kikiMap.put("kiki_seizo_no", childMap.get("kiki_seizo_no"));
				kikiList.add(kikiMap);
			}
		}
		dataMap.put("kiki_List", kikiList);

	}
	
	/**
	 * 「在庫数」(引当可能数)を算出します。
	 * <br>
	 * @param bean 移動在庫情報
	 * @return 「在庫数」(引当可能数)
	 */
	@SuppressWarnings("unchecked")
	private long getZaikoCnt(HashMap zaikoMap)
	{
		long zikCnt = this.getStringToLong( (String)zaikoMap.get("jzaiko_cnt"));
		long hsUkCnt = this.getStringToLong( (String)zaikoMap.get("haiso_uk_juchu_cnt"));
		long hsShkCnt = this.getStringToLong( (String)zaikoMap.get("haiso_shka_sji_cnt"));
		long ybkkSjCnt = this.getStringToLong( (String)zaikoMap.get("ybkiki_haiso_sji_cnt"));
		long tnSjCnt = this.getStringToLong( (String)zaikoMap.get("shelf_mv_sji_cnt"));
		long ybkkChCnt = this.getStringToLong( (String)zaikoMap.get("ybkiki_haiso_chu_cnt"));
		long ybkkShkCnt = this.getStringToLong( (String)zaikoMap.get("ybkiki_shka_fin_cnt"));
		long zaikoCnt = zikCnt - hsUkCnt - hsShkCnt - ybkkSjCnt - tnSjCnt - ybkkChCnt - ybkkShkCnt;
		
		return zaikoCnt;
	}
	
	/**
	 * Stringからlongへ変換し数値でない場合は0を返します。
	 * <br>
	 * @param str Stringの数値
	 * @return intの数値
	 */
	private long getStringToLong(String str)
	{
		long retLong = 0;
		if(str != null && !str.equals(""))
		{
			retLong = Long.parseLong(str);
		}
		
		return retLong;
	}

	
	/**
	 * 内訳リストに対して棚移動ロット番号機器通番を採番・設定する。
	 * @param ucwkList 内訳リスト
	 * @param shiteWayCd 指定方法コード
	 * @param inFlg 館内フラグ(true:館内、false:館外)
	 */
	@SuppressWarnings("unchecked")
	private void setShelfMoveLotNoKikiSeq(List<HashMap> ucwkList, String shiteWayCd, boolean inFlg)
	{
		int no = 1;
		
		for (int i = 0; i < ucwkList.size(); i++)
		{
			Map utwkMap = (Map)ucwkList.get(i);	
			ArrayList list = null;
			if(inFlg)
			{
				list = (ArrayList)utwkMap.get("EDK0211D010CBSMsg1List");
			}
			else
			{
				list = (ArrayList)utwkMap.get("EDK0071D010CBSMsg1List");
			}
			for(int j = 0; j < list.size(); j++)
			{
				// 棚移動ロット番号機器通番を設定する
				HashMap<String, String> childMap = new HashMap<String, String>();
				childMap = (HashMap<String, String>) list.get(j);
				childMap.put("shelf_move_lot_no_kiki_seq", String.valueOf(no));
				
				if ("2".equals(shiteWayCd))
				{
					// 製番指定の場合は連番を設定する為、カウントアップする
					no = no + 1;
				}
			}
		}
	}
	
	
}
