/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：物流管理システム
*   ソースファイル名：JDKCommon60CC.java
*   作成者          ：富士通
*   日付            ：2013年02月28日
*＜機能概要＞
*   棚移動指示一覧照会CCクラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2013/02/28   FJ          新規作成
*   v7.00.00    2014/03/04   FJ          OM-2014-0000392対応 進捗更新処理追加
*   v8.00.00    2014/06/11   FJ          OM-2014-0002064対応
*   v44.00.00   2019/07/02   FJ)河邊     【OM-2019-0000656】在庫出荷登録時エラー
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.DKSV0076_DKSV0076OP_DKSV007601CC_EDK0011C080CBSMsg1List;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0076_DKSV0076OP_EDKA0010003BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0076_DKSV0076OP_EKK1091C020BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0076_DKSV0076OP_EKK1091D010BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0076_DKSV0076OP_EKK1131B001BSMapper;
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.model.ejb.common.JSYejbLog;

import eo.common.util.JDKCommonUtil;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1131B001CBSMsg;


/**
 * 機器出荷情報更新CCクラスです。
 * @author 富士通
 */
public class JDKCommon60CC extends AbstractCommonComponent
{
	/** 進捗更新マッパー */
	private static final DKSV0076_DKSV0076OP_EKK1091C020BSMapper PRG_MAPPER = new DKSV0076_DKSV0076OP_EKK1091C020BSMapper();
	/** 機器出荷情報更新マッパー */
	private static final DKSV0076_DKSV0076OP_EDKA0010003BSMapper TK_MAPPER = new DKSV0076_DKSV0076OP_EDKA0010003BSMapper();

	/**
	 * 機器出荷情報更新処理を行います。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param fixedText 定型文字
	 * @return パラメータ
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite updateTk(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		Map work =  (Map) param.getMappingWorkArea().get("work");
		List<Map> prglist = (List<Map>) work.get("prgList");

		/* ++++++++++ v8.00.00 追加開始 ++++++++++ */
		List<Map> worklist = (List<Map>)work.get("workList");
		Map<String, String> ekk1131b001Map = new HashMap<String, String> ();
		param.setData("DKSV007609CC", ekk1131b001Map);
		List<Map<String, String>> ekk1091D0101List = new ArrayList<Map<String, String>> ();
		param.setData("DKSV007610CC", ekk1091D0101List);
		/* ++++++++++ v8.00.00 追加終了 ++++++++++ */

		if (prglist != null && 0 < prglist.size())
		{
			if (!JDKCommonUtil.isNull(prglist.get(0).get("prg_no"))) 
			{
				/* ++++++++++ v8.00.00 変更開始 ++++++++++ */
//				// 進捗年月日時分秒を設定(配送完了実績登録処理のプラン開始年月日＋進捗登録処理の進捗年月日時分秒の時分秒)
//				Map dksv007601Cc = (Map) param.getData("DKSV007601CC");
//				List<Map> haisotBpnList = (List<Map>)dksv007601Cc.get("EDK0011C080CBSMsg1List");
//
//				Map btryRnkiPrgDataMap = (Map) param.getData("BTRY_RNKI_PRG_DATA");
//				if (btryRnkiPrgDataMap != null && !btryRnkiPrgDataMap.isEmpty())
//				{
//					List<Map> btryRnkiPrgList = (List<Map>) btryRnkiPrgDataMap.get("BTRY_RNKI_PRG_LIST");
//					if (btryRnkiPrgList != null && !btryRnkiPrgList.isEmpty())
//					{
//						for (int i = 0; i < prglist.size(); i++)
//						{
//							Map prgMap = prglist.get(i);
//							Map haisoBpnMap = haisotBpnList.get(i);
//							// 機器提供サービス契約番号
//							String kktkSvcKeiNo = (String) haisoBpnMap.get("kktk_svc_kei_no");
//							// 機器変更番号
//							String kikiChgNo = (String) haisoBpnMap.get("kiki_chg_no");
//							for (Map btryRnkiPrgMap : btryRnkiPrgList)
//							{
//								if (kktkSvcKeiNo.equals(btryRnkiPrgMap.get("kktk_svc_kei_no")) && kikiChgNo.equals(btryRnkiPrgMap.get("kiki_chg_no")))
//								{
//									// 進捗年月日時分秒を設定
//									prgMap.put("prg_dtm",  (String) btryRnkiPrgMap.get("plan_staymd") + ((String) prgMap.get("prg_dtm")).substring(8));
//									break;
//								}
//							}
//						}
//					}
//				}
//				// 進捗年月日時分秒変更処理を実行
//				HashMap<String, Object> prgParamMap = new HashMap<String, Object>();
//				prgParamMap = PRG_MAPPER.editInMsg(param);
//				JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "進捗更新処理の実行");
//				Map prgResult = scCall.run(prgParamMap, handle);
//				PRG_MAPPER.editResultRP(prgResult, param);
//
//				if (JDKBPCommon.hasError(param))
//				{
//					throw new SCCallException("進捗更新処理失敗", "0", 
//							Integer.parseInt(param.getControlMapData("returnCode").toString()));
//				}
				
				String prgStat = "";
				Map dksv007601Cc = (Map) param.getData("DKSV007601CC");
				List<Map> haisotBpnList = (List<Map>)dksv007601Cc.get("EDK0011C080CBSMsg1List");

				Map btryRnkiPrgDataMap = (Map) param.getData("BTRY_RNKI_PRG_DATA");
				if (btryRnkiPrgDataMap != null && !btryRnkiPrgDataMap.isEmpty())
				{
					List<Map> btryRnkiPrgList = (List<Map>) btryRnkiPrgDataMap.get("BTRY_RNKI_PRG_LIST");
					if (btryRnkiPrgList != null && !btryRnkiPrgList.isEmpty())
					{
						for (int i = 0; i < prglist.size(); i++)
						{
							Map haisoBpnMap = haisotBpnList.get(i);
							// 機器提供サービス契約番号
							String kktkSvcKeiNo = (String) haisoBpnMap.get("kktk_svc_kei_no");
							// 機器変更番号
							String kikiChgNo = (String) haisoBpnMap.get("kiki_chg_no");
							for (Map btryRnkiPrgMap : btryRnkiPrgList)
							{
								if (kktkSvcKeiNo.equals(btryRnkiPrgMap.get("kktk_svc_kei_no")) && kikiChgNo.equals(btryRnkiPrgMap.get("kiki_chg_no")))
								{
									// 進捗情報異動理由一覧照会サービスインターフェイスの呼び出し
									callShinchokuJohoIdoRiyuItiran(haisoBpnMap, worklist, param, handle);
									// 進捗ステータスの設定
									prgStat = (String) btryRnkiPrgMap.get("prg_stat");
// OM-2019-0000656 2019/07/02 ADD START
									// 進捗ステータスに値が設定されている場合
									if (prgStat != null && !"".equals(prgStat))
									{
// OM-2019-0000656 2019/07/02 ADD END
										// 進捗登録への入力作成
										makeEKK1091D010Input(ekk1091D0101List, haisoBpnMap, (HashMap)param.getData("DKSV007609CC"), 
												(String) btryRnkiPrgMap.get("plan_staymd"), (String) btryRnkiPrgMap.get("prg_stat"));

										break;
// OM-2019-0000656 2019/07/02 ADD START
									}
// OM-2019-0000656 2019/07/02 ADD END
								}
							}
						}
					}
				}

// OM-2019-0000656 2019/07/02 MOD START
//				// 進捗ステータスに値が設定されている場合
//				if (prgStat != null && !"".equals(prgStat))
				// 進捗に登録するデータが存在する場合
				if (ekk1091D0101List.size() > 0)
// OM-2019-0000656 2019/07/02 MOD END
				{
					// 進捗登録実行
					doEKK1091D0101(ekk1091D0101List, handle, param);
				}
				/* ++++++++++ v8.00.00 変更終了 ++++++++++ */
				
			}
		}

		ArrayList dataList = (ArrayList)work.get("buppin_list");

		if (dataList != null && !dataList.isEmpty())
		{
			HashMap<String, Object> tkParamMap = new HashMap<String, Object>();
			tkParamMap = TK_MAPPER.editInMsg(param);
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "機器出荷情報更新処理の実行");
			Map tkResult = scCall.run(tkParamMap, handle);
			TK_MAPPER.editResultRP(tkResult, param);

			if (JDKBPCommon.hasError(param))
			{
				throw new SCCallException("機器出荷情報更新処理失敗", "0", 
						Integer.parseInt(param.getControlMapData("returnCode").toString()));
			}
		}

		JDKBPCommon.throwScExceptionIfHasError("機器出荷情報更新処理リターンコード不正", param);

		return param;
	}

	/* ++++++++++ v8.00.00 追加開始 ++++++++++ */
	/**
	 * 進捗情報異動理由一覧照会サービスインターフェイスの呼び出し
	 */
	@SuppressWarnings("unchecked")
	private void callShinchokuJohoIdoRiyuItiran(Map haisoBpnMap, List<Map> worklist, IRequestParameterReadWrite param, SessionHandle handle) throws Throwable
	{
		DKSV0076_DKSV0076OP_EKK1131B001BSMapper shinchokuMapper = new DKSV0076_DKSV0076OP_EKK1131B001BSMapper();
		Map<String, String> inMap = new HashMap<String, String>();
		inMap.put(EKK1131B001CBSMsg.KEY_SVC_KEI_NO, (String)haisoBpnMap.get(DKSV0076_DKSV0076OP_DKSV007601CC_EDK0011C080CBSMsg1List.SVC_KEI_NO));
		inMap.put(EKK1131B001CBSMsg.KEY_IDO_DIV, (String)haisoBpnMap.get(DKSV0076_DKSV0076OP_DKSV007601CC_EDK0011C080CBSMsg1List.ADD_OPTNTY_KEI_IDO_DIV));
		inMap.put(EKK1131B001CBSMsg.KEY_IDO_DTM, (String)haisoBpnMap.get(DKSV0076_DKSV0076OP_DKSV007601CC_EDK0011C080CBSMsg1List.ADD_OPTNTY_KEI_IDO_DTM));
		HashMap shinchokukCondition = shinchokuMapper.editInMsg(param, inMap);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "進捗情報異動理由一覧照会処理の実行");
		Map shinchokuMap = new ServiceComponentRequestInvoker().run(shinchokukCondition, handle);
		shinchokuMapper.editResultRP(shinchokuMap, param);
		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("進捗情報異動理由一覧照会処理失敗", "0", 
										Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
	}

	/**
	 * 進捗登録情報を作成する
	 */
	@SuppressWarnings("unchecked")
	private void makeEKK1091D010Input(List<Map<String, String>> ekk1091D0101List, Map haisoBpnMap, HashMap inMap, String plan_staymd, String prg_stat)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "進捗登録情報の作成");
		
		ArrayList<Map<String, String>> dataList = new ArrayList<Map<String, String>> ();
		
		dataList = (ArrayList)inMap.get("EKK1131B001CBSMSG1LIST");
		
		Map<String, String> arg = new HashMap<String, String>();
		ekk1091D0101List.add(arg);
		arg.put(EKK1091D010CBSMsg.SVC_KEI_NO, (String)haisoBpnMap.get(DKSV0076_DKSV0076OP_DKSV007601CC_EDK0011C080CBSMsg1List.SVC_KEI_NO));
		arg.put(EKK1091D010CBSMsg.IDO_DIV, (String)haisoBpnMap.get(DKSV0076_DKSV0076OP_DKSV007601CC_EDK0011C080CBSMsg1List.ADD_OPTNTY_KEI_IDO_DIV));
		arg.put(EKK1091D010CBSMsg.IDO_DTM, (String)haisoBpnMap.get(DKSV0076_DKSV0076OP_DKSV007601CC_EDK0011C080CBSMsg1List.ADD_OPTNTY_KEI_IDO_DTM));
		// 進捗ステータスを設定
		arg.put(EKK1091D010CBSMsg.PRG_STAT, prg_stat);
		arg.put(EKK1091D010CBSMsg.PRG_TKJK_2, "型番号：" + (String)haisoBpnMap.get(DKSV0076_DKSV0076OP_DKSV007601CC_EDK0011C080CBSMsg1List.TAKNKIKI_MODEL_CD));
		
		// 進捗年月日時分秒を設定
		// システム日時の時間部分を取得する。
		SimpleDateFormat sdf = new SimpleDateFormat("HHmmssSSS");
		
		// (プラン開始年月日＋システム日時の時間部分を結合してセットする。)
		arg.put(EKK1091D010CBSMsg.PRG_DTM_I,  plan_staymd + sdf.format(System.currentTimeMillis()));
		
		if (dataList.size() != 0)
		{
			// 異動理由が取得できていた場合のみ設定する
			arg.put(EKK1091D010CBSMsg1List.IDO_RSN_CD, dataList.get(0).get(EKK1091D010CBSMsg1List.IDO_RSN_CD));
			arg.put(EKK1091D010CBSMsg1List.IDO_RSN_MEMO, dataList.get(0).get(EKK1091D010CBSMsg1List.IDO_RSN_MEMO));
		}
	}

	/**
	 * 進捗登録を実行する
	 * @throws Exception 
	 */
	private void doEKK1091D0101(List<Map<String, String>> inputDatas, SessionHandle handle, IRequestParameterReadWrite param)
	throws Exception
	{
		DKSV0076_DKSV0076OP_EKK1091D010BSMapper mapper = new DKSV0076_DKSV0076OP_EKK1091D010BSMapper();
		HashMap<String, Object> inMap = mapper.editInMsg(param);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "進捗登録処理の実行");
		Map<?, ?> result = new ServiceComponentRequestInvoker().run(inMap, handle);
		mapper.editResultRP(result, param);
		
		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("進捗登録処理失敗", "0", 
				Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
	}
	/* ++++++++++ v8.00.00 追加終了 ++++++++++ */

}
