/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：物流管理システム
*   ソースファイル名：JDKCommon19CC.java
*   作成者          ：富士通
*   日付            ：2011年08月09日
*＜機能概要＞
*   棚移動取消CCクラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/08/09   FJ          新規作成
*
**********************************************************************/
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.DKSV0042_DKSV0042OP_EDK0111B030BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0042_DKSV0042OP_EDK0111C030BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0042_DKSV0042OP_EDK0211C010BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0042_DKSV0042OP_EDK0211D010BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0042_DKSV0042OP_EDKA0010004BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0042_DKSV0042OP_EDKA0010008BSMapper;
import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
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.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;

import eo.common.constant.JDKStrConst;


/**
 * 棚移動出荷CCクラスです。
 * @author 富士通
 */
public class JDKCommon38CC extends AbstractCommonComponent
{
	/** SC名 */
	private static final String DKSV004207SC = "DKSV004207SC";
	/** マッパー */
	private static final DKSV0042_DKSV0042OP_EDK0111C030BSMapper SOKO_MAPPER = new DKSV0042_DKSV0042OP_EDK0111C030BSMapper();
	private static final DKSV0042_DKSV0042OP_EDK0211D010BSMapper SURYO_MAPPER = new DKSV0042_DKSV0042OP_EDK0211D010BSMapper();
	private static final DKSV0042_DKSV0042OP_EDK0211C010BSMapper SEIBAN_MAPPER = new DKSV0042_DKSV0042OP_EDK0211C010BSMapper();
	/** 棚移動機器取得マッパー */
	private static final DKSV0042_DKSV0042OP_EDK0111B030BSMapper TANAKIKI_MAPPER = new DKSV0042_DKSV0042OP_EDK0111B030BSMapper();
	/** 宅内機器情報取得マッパー */
	private static final DKSV0042_DKSV0042OP_EDKA0010008BSMapper KIKI_MAPPER = new DKSV0042_DKSV0042OP_EDKA0010008BSMapper();
	/** 宅内情報更新マッパー */
	private static final DKSV0042_DKSV0042OP_EDKA0010004BSMapper TKNI_MAPPER = new DKSV0042_DKSV0042OP_EDKA0010004BSMapper();

	/**
	 * 出荷処理を行います。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param fixedText 定型文字
	 * @return パラメータ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite ship(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		updateTanaIdo(handle, param);

		
		if (!isByProductNumber(param))
		{
			// 数量指定の場合
			
			// 棚移動ロット番号機器通番の採番処理を実施
			setShelfMoveLotNoKikiSeq(param);
			
			doToMoveByQuantity(handle, param);
		}
		else if (isByProductNumber(param))
		{
			// 製番指定の場合
			doToMoveByProductNo(handle, param);
		}
		else
		{
			throw new SCCallException("指定コードが不正", "0", 1100);
		}
		Map dataMap = (Map)param.getData("DKSV004207SC");
		String funcCd = (String)dataMap.get(JCMConstants.FUNC_CODE_KEY);
		
		// 機能コードが「１」の場合のみ宅内情報更新実行
		if(funcCd.equals("1")){

			// 棚移動する機器の情報を取得
			HashMap<String, Object> tanakikiParamMap = new HashMap<String, Object>();
			tanakikiParamMap = TANAKIKI_MAPPER.editInMsg(param);
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "棚移動結果情報一覧照会処理の実行");
			Map tanakikiResult = scCall.run(tanakikiParamMap, handle);
			TANAKIKI_MAPPER.editResultRP(tanakikiResult, param);
			
			if (JDKBPCommon.hasError(param))
			{
				throw new SCCallException("棚移動結果情報一覧照会処理失敗", "0", 
											Integer.parseInt(param.getControlMapData("returnCode").toString()));
			}
			
			ArrayList dataList = (ArrayList)dataMap.get("EDK0111B030CBSMsg1List");
			HashMap<String, String> modelNoMap = new HashMap<String, String>();
			HashMap<String, String> moveNoMap = new HashMap<String, String>();
			String mt_soko_cd = (String)((HashMap)dataList.get(0)).get("mv_mt_soko_cd");		// 移動元倉庫コード
			String mt_koji_cd = (String)((HashMap)dataList.get(0)).get("mv_mt_koji_cd");		// 移動元工事会社コード
			String mt_yotaku_cd = (String)((HashMap)dataList.get(0)).get("mv_mt_office_cd");	// 移動元預託先コード
			String sk_soko_cd = (String)((HashMap)dataList.get(0)).get("mv_sk_soko_cd");		// 移動先倉庫コード
			String sk_koji_cd = (String)((HashMap)dataList.get(0)).get("mv_sk_koji_cd");		// 移動先工事会社コード
			String sk_yotaku_cd = (String)((HashMap)dataList.get(0)).get("mv_sk_office_cd");	// 移動先預託先コード
			String shitei_way = (String)((HashMap)dataList.get(0)).get("shitei_way");
			// 管理場所識別コードと管理場所コードの設定
			// 移動元建物
			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;
			}
			// 移動先建物
			String sk_knri_plc_skbt_cd = "";
			String sk_knri_plc_cd = "";
			if(sk_soko_cd != null && !sk_soko_cd.equals("")){
				sk_knri_plc_skbt_cd = "1";
				sk_knri_plc_cd = sk_soko_cd;
			}else if(sk_koji_cd != null && !sk_koji_cd.equals("")){
				sk_knri_plc_skbt_cd = "2";
				sk_knri_plc_cd = sk_koji_cd;
			}else if(sk_yotaku_cd != null && !sk_yotaku_cd.equals("")){
				sk_knri_plc_skbt_cd = "3";
				sk_knri_plc_cd = sk_yotaku_cd;
			}
			// 移動元棚コード
			String mt_knri_plc_slf_cd = (String)((HashMap)dataList.get(0)).get("mv_mt_shelf_cd");
			// 移動先棚コード
			String sk_knri_plc_slf_cd = (String)((HashMap)dataList.get(0)).get("mv_sk_shelf_cd");
			// 商品状態コード（移動元）
			String key_gds_stat_cd = (String)((HashMap)dataList.get(0)).get("gds_stat_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 move_no = (String)childMap.get("move_no");
				String tkkiki_mdl_cd = (String)childMap.get("tkkiki_mdl_cd");
				String cnt = (String)childMap.get("sji_cnt");
				String ttlCnt = modelNoMap.get(tkkiki_mdl_cd);
				if(moveNoMap.get(move_no) == null){
					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));
					}
					moveNoMap.put(move_no, tkkiki_mdl_cd);
				}
			}
			
			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", "-" + cnt);
				// 予備機器配送指示数
				childMap.put("ybkiki_haiso_sji_num", "0");
				// 棚移動指示数
				childMap.put("shelf_mv_sji_num", "-" + cnt);
				// 予備機器配送中数
				childMap.put("ybkiki_haiso_chu_num", "0");
				// 棚移動入荷完了数
				childMap.put("shelf_mv_nyka_fin_num", "0");
				// 棚移動出荷完了数
				childMap.put("shelf_mv_shka_fin_num", cnt);
				// 予備機器出荷完了数
				childMap.put("ybkiki_shka_fin_num", "0");
				
				edka0010004CbsMsg2List.add(childMap);
	
			}
			// 移動先在庫更新
			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", sk_knri_plc_skbt_cd);
				// ＫＥＹ＿管理場所コード
				childMap.put("key_knri_plc_cd", sk_knri_plc_cd);
				// ＫＥＹ＿管理場所棚コード
				childMap.put("key_knri_plc_slf_cd", sk_knri_plc_slf_cd);
				// ＫＥＹ＿宅内機器型式コード
				childMap.put("key_taknkiki_model_cd", mdl_no);
				// ＫＥＹ＿商品状態コード
				if (JDKStrConst.HENPIN_TANA.equals(mt_knri_plc_slf_cd)
						&& !JDKStrConst.HENPIN_TANA.equals(sk_knri_plc_slf_cd))
				{
					// 移動元が返品棚で移動先が返品棚以外の場合
					childMap.put("key_gds_stat_cd", JDKStrConst.GDS_STAT_HMPINDNA_OTHER);
				}
				else if (!JDKStrConst.HENPIN_TANA.equals(mt_knri_plc_slf_cd)
						&& JDKStrConst.HENPIN_TANA.equals(sk_knri_plc_slf_cd))
				{
					// 移動元が返品棚以外で移動先が返品棚の場合
					childMap.put("key_gds_stat_cd", JDKStrConst.GDS_STAT_UNKNOWN);
				}
				else
				{
					childMap.put("key_gds_stat_cd", key_gds_stat_cd);
				}
				// 実在庫数
				childMap.put("jzaiko_num", cnt);
				// 予備機器配送指示数
				childMap.put("ybkiki_haiso_sji_num", "0");
				// 棚移動指示数
				childMap.put("shelf_mv_sji_num", "0");
				// 予備機器配送中数
				childMap.put("ybkiki_haiso_chu_num", "0");
				// 棚移動入荷完了数
				childMap.put("shelf_mv_nyka_fin_num", cnt);
				// 棚移動出荷完了数
				childMap.put("shelf_mv_shka_fin_num", "0");
				// 予備機器出荷完了数
				childMap.put("ybkiki_shka_fin_num", "0");
				
				edka0010004CbsMsg2List.add(childMap);
	
			}
			// 在庫更新情報を設定
			dataMap.put("EDKA0010004CBSMsg2List", edka0010004CbsMsg2List);
			
			// 宅内機器情報を更新すべきものがあれば機器情報を設定
			HashMap inMap = (HashMap)param.getData(DKSV004207SC);
			List<Map> list = (List)inMap.get("kiki_list");
			if(list.size() > 0)
			{
				
				// 宅内管理システムより機器の情報を取得
				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 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(list.size() != resultCnt)
				{
					// 「宅内機器に該当の製造番号が存在しません。」のメッセージを設定
					JDKBPCommon.addError(param, 
							"kiki_seizo_no_err", 
							"EA", "EDKA0010008", 1100, 0);
					throw new SCCallException("宅内機器一覧照会(5)処理（データ存在チェックエラー）", "0", StatusCodes.RELATION_ERR);
				}
				
				// 宅内機器情報を設定
				for(int i=0;i<tkniKikiList.size();i++){
					
					HashMap tkniMap = (HashMap)tkniKikiList.get(i);
					String kk_seizo_no = (String)tkniMap.get("kk_seizo_no");
					
					if(kk_seizo_no != null && !kk_seizo_no.equals(""))
					{
					
						HashMap childMap = new HashMap();
						// ＫＥＹ＿レコード区分
						childMap.put("key_record_div", "1");
						// ＫＥＹ＿処理区分
						childMap.put("key_trn_div", "1");
						// ＫＥＹ＿処理パターン
						childMap.put("key_trn_ptn", "3");
						// ＫＥＹ＿移動区分
						childMap.put("key_ido_kbn", "1");
						// ＫＥＹ＿取消区分
						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"));
						if(shitei_way.equals("1"))
						{
							// 数量指定の場合
							// 棚移動予約フラグ
							childMap.put("slf_mv_rsv_flg", (String)tkniMap.get("slf_mv_rsv_flg"));
							// 棚移動ロット番号
							childMap.put("slf_mv_lot_no", (String)tkniMap.get("slf_mv_lot_no"));
						}
						else
						{
							// 製番指定の場合
							// 棚移動予約フラグ
							childMap.put("slf_mv_rsv_flg", "0");
							// 棚移動ロット番号
							childMap.put("slf_mv_lot_no", "");
						}
						// 管理場所識別コード
						childMap.put("knri_plc_skbt_cd", sk_knri_plc_skbt_cd);
						// 管理場所コード
						childMap.put("knri_plc_cd", sk_knri_plc_cd);
						// 管理場所棚コード
						childMap.put("knri_plc_slf_cd", sk_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"));
						// 商品状態コード
						if (JDKStrConst.HENPIN_TANA.equals(mt_knri_plc_slf_cd)
								&& !JDKStrConst.HENPIN_TANA.equals(sk_knri_plc_slf_cd))
						{
							// 移動元が返品棚で移動先が返品棚以外の場合
							childMap.put("gds_stat_cd", JDKStrConst.GDS_STAT_HMPINDNA_OTHER);
						}
						else if (!JDKStrConst.HENPIN_TANA.equals(mt_knri_plc_slf_cd)
								&& JDKStrConst.HENPIN_TANA.equals(sk_knri_plc_slf_cd))
						{
							// 移動元が返品棚以外で移動先が返品棚の場合
							childMap.put("gds_stat_cd", JDKStrConst.GDS_STAT_UNKNOWN);
						}
						else
						{
							childMap.put("gds_stat_cd", key_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;
	}
	
	
	/**
	 * 棚移動を更新します。
	 */
	@SuppressWarnings("unchecked")
	private void updateTanaIdo (SessionHandle handle, IRequestParameterReadWrite param) throws Exception
	{
		HashMap<String, Object> contractsParamMap1 = new HashMap<String, Object>();
		contractsParamMap1 = SOKO_MAPPER.editInMsg(param);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "倉庫棚機器移動処理の実行");
		Map contractResult1 = new ServiceComponentRequestInvoker().run(contractsParamMap1, handle);
		SOKO_MAPPER.editResultRP(contractResult1, param);
		
		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("倉庫棚機器移動処理失敗", "0", 
										Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
		
		// エラー判定
		Map sokoData1 = (Map)param.getData("DKSV004201CC");
		List<Map> sokoList1 = (ArrayList<Map>)sokoData1.get("sokodna_move_list");
		for (Map data : sokoList1)
		{
			// ＫＥＹ＿倉庫棚移動番号
			if (data.containsKey("key_sokodna_move_no_err"))
			{
				String errCd = data.get("key_sokodna_move_no_err").toString();

				String statCd = "";
				if (data.containsKey("returnCode"))
				{
					statCd = data.get("returnCode").toString();
				}

				if ("1100".equals(statCd) && "EA".equals(errCd))
				{
					// 存在チェックエラー
					JDKBPCommon.addError(param, 
										"key_sokodna_move_no_err", 
										"EA", "EDK0111C030", 1100, 0);
					throw new SCCallException("倉庫棚機器移動処理の失敗", "0", 1100);
				}
				else if ("1150".equals(statCd) && "EA".equals(errCd))
				{
					// 遷移チェックエラー
					JDKBPCommon.addError(param, 
										"key_sokodna_move_no_err", 
										"EA", "EDK0111C030", 1150, 0);
					throw new SCCallException("倉庫棚機器移動処理の失敗", "0", 1150);
				}
			}
			// 更新年月日時分秒（更新前）
			if (data.containsKey("upd_dtm_bf_err"))
			{
				String errCd = data.get("upd_dtm_bf_err").toString();

				if ("EB".equals(errCd))
				{
					// 排他チェックエラー
					JDKBPCommon.addError(param, 
										"upd_dtm_bf_err", 
										"EB", "EDK0111C030", 1100, 0);
					throw new SCCallException("倉庫棚機器移動処理の失敗", "0", 1100);
				}
			}
		}
	}
	
	
	/**
	 * 数量指定を処理します。
	 */
	@SuppressWarnings("unchecked")
	private void doToMoveByQuantity(SessionHandle handle, IRequestParameterReadWrite param) throws Exception
	{
		HashMap<String, Object> contractsParamMap2 = SURYO_MAPPER.editInMsg(param);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "倉庫棚移動内訳棚移動完了処理の実行");
		Map contractResult2 = new ServiceComponentRequestInvoker().run(contractsParamMap2, handle);
		SURYO_MAPPER.editResultRP(contractResult2, param);
		if (JDKBPCommon.hasError(param)) {
			throw new SCCallException("倉庫棚移動内訳棚移動完了処理失敗", "0", 
					Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
		
		// エラー判定
		Map sokoData2 = (Map)param.getData("DKSV004202CC");
		List<Map> sokoList2 = (ArrayList<Map>)sokoData2.get("sokodna_move_list");
		for (Map data : sokoList2)
		{
			// ＫＥＹ＿倉庫棚移動番号
			if (data.containsKey("sokodna_move_no_err"))
			{
				String errCd = data.get("sokodna_move_no_err").toString();

				if ("EA".equals(errCd))
				{
					// 存在チェックエラー
					JDKBPCommon.addError(param, 
										"sokodna_move_no_err", 
										"EA", "EDK0211D010", 1100, 0);
					throw new SCCallException("倉庫棚移動内訳棚移動完了処理の失敗", "0", 1100);
				}
			}

			if (data.containsKey("taknkiki_sethin_no_err"))
			{
				String errCd = data.get("taknkiki_sethin_no_err").toString();

				if ("EB".equals(errCd))
				{
					// 存在チェックエラー
					JDKBPCommon.addError(param, 
										"taknkiki_sethin_no_err", 
										"EB", "EDK0211D010", 1100, 0);
					throw new SCCallException("倉庫棚移動内訳棚移動完了処理の失敗", "0", 1100);
				}
			}
		}
	}
	
	
	
	/**
	 * 製番指定を処理します。
	 */
	@SuppressWarnings("unchecked")
	private void doToMoveByProductNo(SessionHandle handle, IRequestParameterReadWrite param) throws Exception
	{
		HashMap<String, Object> contractsParamMap2 = SEIBAN_MAPPER.editInMsg(param);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "製番指定棚移動完了処理の実行");
		Map contractResult2 = new ServiceComponentRequestInvoker().run(contractsParamMap2, handle);
		SEIBAN_MAPPER.editResultRP(contractResult2, param);
		if (JDKBPCommon.hasError(param)) {
			throw new SCCallException("製番指定棚移動完了処理失敗", "0", 
					Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
		
		// エラー判定
		Map sokoData2 = (Map)param.getData("DKSV004203CC");
		List<Map> sokoList2 = (ArrayList<Map>)sokoData2.get("sokodna_move_list");
		for (Map data : sokoList2)
		{
			// ＫＥＹ＿倉庫棚移動番号
			if (data.containsKey("key_sokodna_move_no_err"))
			{
				String errCd = data.get("key_sokodna_move_no_err").toString();

				if ("EA".equals(errCd))
				{
					// 存在チェックエラー
					JDKBPCommon.addError(param, 
										"key_sokodna_move_no_err", 
										"EA", "EDK0211C010", 1100, 0);
					throw new SCCallException("製番指定棚移動完了処理の失敗", "0", 1100);
				}
			}
			// 更新年月日時分秒（更新前）
			if (data.containsKey("upd_dtm_bf_err"))
			{
				String errCd = data.get("upd_dtm_bf_err").toString();

				if ("EB".equals(errCd))
				{
					// 排他チェックエラー
					JDKBPCommon.addError(param, 
										"upd_dtm_bf_err", 
										"EB", "EDK0211C010", 1100, 0);
					throw new SCCallException("製番指定棚移動完了処理の失敗", "0", 1100);
				}
			}
		}
	}
	
	
	/**
	 * 製番指定である
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	private boolean isByProductNumber(IRequestParameterReadWrite param) throws RequestParameterException
	{
		Map<String, List<Map<String, Object>>> sokoData1 = (Map<String, List<Map<String, Object>>>)param.getData("DKSV004201CC");
		List<Map<String, Object>> sokoList1 = sokoData1.get("sokodna_move_list");
		return "2".equals(sokoList1.get(0).get("shitei_way_cd"));
	}
	
	
	/**
	 * 棚移動ロット番号機器通番を採番・設定する。
	 *（ 一意の値になるように1から連番を採番する）
	 * @param param パラメータ
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	private void setShelfMoveLotNoKikiSeq(IRequestParameterReadWrite param) throws RequestParameterException
	{

		HashMap inMap = (HashMap)param.getData("DKSV004202CC");
		List<Map> ucwkList = (List)inMap.get("sokodna_move_list");
		
		int no = 1;
		
		for (int i = 0; i < ucwkList.size(); i++)
		{
			Map utwkMap = (Map)ucwkList.get(i);	
			ArrayList list = null;
			list = (ArrayList)utwkMap.get("EDK0211D010CBSMsg1List");

			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));
				no = no + 1;
			}
		}
	}
}
