/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：物流管理システム
*   ソースファイル名：JDKCommon20CC.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.DKSV0041_DKSV0041OP_EDK0061C050BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0041_DKSV0041OP_EDK0111B030BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0041_DKSV0041OP_EDKA0010004BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0041_DKSV0041OP_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.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;


/**
 * 予備機器配送却下CCクラスです。
 * @author 富士通
 */
public class JDKCommon20CC extends AbstractCommonComponent
{
	/** マッパー */
	private static final DKSV0041_DKSV0041OP_EDK0061C050BSMapper YBK_MAPPER = new DKSV0041_DKSV0041OP_EDK0061C050BSMapper();
	/** 棚移動機器取得マッパー */
	private static final DKSV0041_DKSV0041OP_EDK0111B030BSMapper TANAKIKI_MAPPER = new DKSV0041_DKSV0041OP_EDK0111B030BSMapper();
	/** 宅内機器情報取得マッパー */
	private static final DKSV0041_DKSV0041OP_EDKA0010008BSMapper KIKI_MAPPER = new DKSV0041_DKSV0041OP_EDKA0010008BSMapper();
	/** 宅内情報更新マッパー */
	private static final DKSV0041_DKSV0041OP_EDKA0010004BSMapper TKNI_MAPPER = new DKSV0041_DKSV0041OP_EDKA0010004BSMapper();

	/**
	 * 却下処理を行います。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param fixedText 定型文字
	 * @return パラメータ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite rejection(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		HashMap<String, Object> contractsParamMap = new HashMap<String, Object>();
		contractsParamMap = YBK_MAPPER.editInMsg(param);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "予備機器配送中止処理の実行");
		Map contractResult = scCall.run(contractsParamMap, handle);
		YBK_MAPPER.editResultRP(contractResult, param);
		
		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("予備機器配送中止処理失敗", "0", 
										Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
		
		// エラー判定
		Map ybkMap = (Map)param.getData("DKSV004102CC");
		List<Map> ybkList = (ArrayList<Map>)ybkMap.get("ybkiki_haiso_list");
		for (Map data : ybkList)
		{
			// ＫＥＹ＿予備機器配送番号
			if (data.containsKey("key_ybkiki_haiso_no_err"))
			{
				String errCd = data.get("key_ybkiki_haiso_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_ybkiki_haiso_no_err", 
										"EA", "EDK0061C050", 1100, 0);
					throw new SCCallException("却下処理失敗（予備機器配送）", "0", 1100);
				}
				else if ("1150".equals(statCd) && "EA".equals(errCd))
				{
					// 遷移チェックエラー
					JDKBPCommon.addError(param, 
										"key_ybkiki_haiso_no_err", 
										"EA", "EDK0061C050", 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", "EDK0061C050", 1100, 0);
					throw new SCCallException("却下処理失敗（予備機器配送）", "0", 1100);
				}
			}
		}
		Map dataMap = (Map)param.getData("DKSV004103CC");
		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(), "棚移動結果情報一覧照会処理の実行");
			scCall.run(tanakikiParamMap, handle);
			TANAKIKI_MAPPER.editResultRP(tanakikiParamMap, 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 key_knri_plc_skbt_cd = "";
			String key_knri_plc_cd = "";
			String mv_sbt =  (String)((HashMap)dataList.get(0)).get("mv_sbt");
			if(mt_soko_cd != null && !mt_soko_cd.equals("")){
				key_knri_plc_skbt_cd = "1";
				key_knri_plc_cd = mt_soko_cd;
			}else if(mt_koji_cd != null && !mt_koji_cd.equals("")){
				key_knri_plc_skbt_cd = "2";
				key_knri_plc_cd = mt_koji_cd;
			}else if(mt_yotaku_cd != null && !mt_yotaku_cd.equals("")){
				key_knri_plc_skbt_cd = "3";
				key_knri_plc_cd = mt_yotaku_cd;
			}
			String key_knri_plc_slf_cd = (String)((HashMap)dataList.get(0)).get("mv_mt_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 = "-";
			}
			String shitei_way = (String)((HashMap)dataList.get(0)).get("shitei_way");
			
			// 在庫情報更新のための型番号ごとの指示数量を算出（同じ棚移動番号のものは加算しない）
			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", key_knri_plc_skbt_cd);
				// ＫＥＹ＿管理場所コード
				childMap.put("key_knri_plc_cd", key_knri_plc_cd);
				// ＫＥＹ＿管理場所棚コード
				childMap.put("key_knri_plc_slf_cd", key_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");
				// 予備機器配送指示数
				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)処理の実行");
				scCall.run(kikiParamMap, handle);
				KIKI_MAPPER.editResultRP(kikiParamMap, 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;
				
				// 問い合わせ件数
				int requestCnt = tkniKikiList.size();
				
				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);
				}
				
				// 宅内機器情報を設定
				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", "2");
					// ＫＥＹ＿移動区分
					childMap.put("key_ido_kbn", mv_sbt);
					// ＫＥＹ＿取消区分
					childMap.put("key_trks_kbn", "1");
					// ＫＥＹ＿宅内機器型式コード
					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", "0");
					// 棚移動ロット番号
					childMap.put("slf_mv_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;
	}
}
