/*********************************************************************
 * All Right reserved,Copyright (c) Fujitsu, 2011
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：工事受付管理
 *   モジュール名    ：工事情報照会連携ビューロジック
 *   ソースファイル名：KUA10101SFLogic.java
 *   作成者          ：富士通
 *   日付            ：2015年08月12日
 *＜機能概要＞
 *   工事情報照会連携を行います。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v18.00.00	 2015/08/12	  FJ)河邊	 【ANK-2639-00-00】オーダリング案件（ＳＴＥＰ１）新規作成
 **********************************************************************/

package eo.web.webview.KUA10101SF;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;

import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.KUA10101SF.KUA10101SFConst;
import java.util.List;
import java.util.Map;
import com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
import com.fujitsu.futurity.web.x31.X31CMessageResult;
import eo.common.constant.JPCModelConstant;
import eo.web.webview.common.JKKOneStopApiCommonUtil;
import eo.web.webview.common.JKKOneStopDataConverter;

import eo.web.webview.mapping.KUSV0002_KUSV0002OPDBMapper;

/**
 * <dd>クラス名：KUA10101SFLogic <dd>クラス説明：工事情報照会連携を行う。 <dd>備考：なし。
 * 
 * 2015/08/13
 * @author 富士通
 */
@SuppressWarnings("serial")
public class KUA10101SFLogic extends JCCWebBusinessLogic
{
	/** ワンストップ用受信パラメタ格納Map */
	private Map<String, Object> requestMap = null;
	
	/** インターフェイスID */
	private static final String IF_ID = "KUIFE071";
	
	/** 検索ユースケースID */
	private static final String SEARCH_USECASE_ID = "KUSV0002";
	
	/** 検索SCタイトル */
	private static final String SEARCH_SC_TITLE = "KUSV000201SC";
	
	/** 検索エラーフラグ */
	private static final String SEARCH_ERR_FLG = "search_err_flg";
	
	/** 工事一覧照会照会明細キー値 **/
	private static final String EKU0011B010CBSMSG1LIST = "EKU0011B010CBSMsg1List";
	
	/** サービス契約番号 **/
	private static final String SVC_KEI_NO = "svc_kei_no";
	
	/** 工事案件番号 **/
	private static final String KOJIAK_NO = "kojiak_no";
	
	/** 工事案件種別コード **/
	private static final String KOJIAK_SBT_CD = "kojiak_sbt_cd";
	
	/** 工事案件種別名称 **/
	private static final String KOJIAK_SBT_NM = "kojiak_sbt_nm";
	
	/** 工事案件ステータス **/
	private static final String KOJIAK_STAT = "kojiak_stat";
	
	/** 工事案件ステータス名称 **/
	private static final String KOJIAK_STAT_NM = "kojiak_stat_nm";
	
	/** 工事案件依頼年月日 **/
	private static final String KOJIAK_REQYMD = "kojiak_reqymd";
	
	/** 工事案件実施年月日 **/
	private static final String KOJIAK_JSSI_YMD = "kojiak_jssi_ymd";
	
	/** リターンコード **/
	private static final String RETURN_CD = "return_code";
	
	/** 工事情報リスト **/
	private static final String KOJI_INF_LIST = "koji_inf_list";
	
	/** 工事情報 **/
	private static final String KOJI_INF = "koji_inf";
	
	/**
	 * ワンストップ用APIコントロールメソッドです。
	 * <BR>
	 * @return boolean
	 * @throws Exception 
	 */
	public boolean apiControl() throws Exception
	{
		try
		{
			try
			{
				// 工事案件一覧照会マップ
				HashMap<String, Object> kojiakIcrnShokaiMap  = null;
				
				// API用初期処理
				if (!this.apiInit())
				{
					// 異常な為処理終了
					return true;
				}
				
				// ワンストップ独自単項目チェック
				if (!this.singleChkForOneStop())
				{
					// エラー発生の為処理終了
					return true;
				}
				
				// 工事情報リスト取得処理
				kojiakIcrnShokaiMap = getKojiInfList();
				
				// ワンストップ独自関連チェック
				if (!this.knrnChkForOneStop(kojiakIcrnShokaiMap))
				{
					// エラー発生の為処理終了
					return true;
				}
				
				// API用終了処理(リターンコード00(正常終了))
				this.apiTerminal(kojiakIcrnShokaiMap);
			}
			catch (JCCWebServiceException wse)
			{
				// サービスIFエラー処理
				X31CMessageResult msgResult = wse.getMessageList();
				JKKOneStopApiCommonUtil.sifErrChk(this, msgResult, new HashMap<String, String[]>(), new ArrayList<Map<String, String>>(), IF_ID);
			}
		}
		catch (Exception e)
		{
			// 例外発生時はリターンコード99(システムエラー)
			JKKOneStopApiCommonUtil.printErrorLog(getSessionId(), "KUIFE071_工事情報照会（ワンストップ）にて例外が発生しました。", e);
			String xml = JKKOneStopApiCommonUtil.createRetuenXml(IF_ID, "99");
			
			// サービスフォームBeanのデータBeanアクセスクラスを取得。
			X31SDataBeanAccess bean = super.getServiceFormBean();
			
			// 返却データを設定
			bean.sendMessageString(KUA10101SFConst.RETURNDATA, X31CWebConst.DATABEAN_SET_VALUE, xml);
		}
		return true;
	}
	
	/**
	 * ワンストップ用API初期処理メソッドです。
     * <BR>
	 * @return boolean
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private boolean apiInit() throws Exception
	{
		// 受信データXML⇒Map変換
		requestMap = (Map<String, Object>)JKKOneStopApiCommonUtil.getReceiveXml(getSessionId()).get(IF_ID + "_RECEIVE");
		
		return true;
	}
	
	/**
	 * ワンストップ用単項目チェックメソッドです。
     * <BR>
	 * @return boolean
	 * @throws Exception 
	 */
	private boolean singleChkForOneStop() throws Exception
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		String itemName = null;
		String itemValue = null;
		
		// サービス契約番号
		itemName = SVC_KEI_NO;
		if (!JKKOneStopApiCommonUtil.checkRequireNotNull(requestMap, itemName))
		{
			// 必須チェックエラー
			errList.add(JKKOneStopApiCommonUtil.getReqErrInfMap(itemName));
		}
		else
		{
			itemValue = (String)requestMap.get(itemName);
			if (!HalfCharCheck.isEnNumber1Check(itemValue))
			{
				// 形式チェックエラー
				errList.add(JKKOneStopApiCommonUtil.getFormErrInfMap(itemName));
			}
			if (!LengthCheck.isLength1Check(itemValue, 10))
			{
				// 桁数チェックエラー
				errList.add(JKKOneStopApiCommonUtil.getLenErrInfMap(itemName));
			}
		}
		
		// エラーが存在する場合
		if (errList.size() > 0)
		{
			this.setReturnDataForErr(errList);
			return false;
		}
		
		return true;
	}
	
	/**
	 * 工事情報リスト取得処理
	 * <BR>
	 * @return kojiAKIcrnShokaiList 工事案件一覧照会マップ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> getKojiInfList() throws Exception
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();
		
		// パラメータ作成
		X31SDataBeanAccess[] paramBean = {bean};
		
		// ■KUSV0002
		HashMap<String, Object> paramMap  = new HashMap<String, Object>();
		HashMap<String, Object> inputMap  = new HashMap<String, Object>();
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		// パラメタ設定
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, SEARCH_USECASE_ID);
		
		// 上りマッピング
		KUSV0002_KUSV0002OPDBMapper kusv0002Mapper = new KUSV0002_KUSV0002OPDBMapper();
		kusv0002Mapper.setKUSV000201SC(paramBean, (String)requestMap.get(SVC_KEI_NO), inputMap, JPCModelConstant.FUNC_CD_3);
		
		// サービスの呼び出し
		invokeService(paramMap, inputMap, outputMap);
		
		// 工事案件一覧照会マップを取得
		HashMap<String, Object> kojiakIcrnShokaiMap = (HashMap<String, Object>)outputMap.get(SEARCH_SC_TITLE);
		
		// 取得した工事案件一覧照会マップを返却する
		return kojiakIcrnShokaiMap;
	}
	

	/**
	 * ワンストップ独自関連チェック処理です。
	 * <BR>
	 * @param kojiakIcrnShokaiMap 工事情報一覧照会マップ
	 * @return boolean
	 * @throws Exception
	 */
	private boolean knrnChkForOneStop(HashMap<String, Object> kojiakIcrnShokaiMap) throws Exception
	{
		// 工事案件一覧照会マップ.検索エラーフラグが最大検索件数超えているか確認
		if (JPCModelConstant.SEARCH_ERR_FLG_OVERMAX.equals(kojiakIcrnShokaiMap.get(SEARCH_ERR_FLG)))
		{
			// 返却データ設定処理（エラー用）を呼び出す
			this.setReturnDataForErr("E5001");
			return false;
		}
		return true;
	}
	
	/**
	 * 返却データ設定処理（エラー用）
	 * <BR>
	 * @param errListt エラー情報リスト
	 * @throws Exception
	 */
	private void setReturnDataForErr(List<Map<String, String>> errList) throws Exception
	{
		// 返却データ設定処理（エラー用）を呼び出す
		this.setReturnDataForErr("10", errList);
	}
	
	/**
	 * 返却データ設定処理（エラー用）
	 * <BR>
	 * @param returnCd エラーコード
	 * @param errList エラー情報リスト
	 * @throws Exception
	 */
	private void setReturnDataForErr(String returnCd, List<Map<String, String>> errList) throws Exception
	{
		// ワンストップ共通処理.返却用XMLデータ作成（単項目・単関連・関連チェックエラー用)
		String xml = JKKOneStopApiCommonUtil.createRetuenXml(IF_ID, returnCd, errList);
		
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();
		
		// 返却データを設定
		bean.sendMessageString(KUA10101SFConst.RETURNDATA, X31CWebConst.DATABEAN_SET_VALUE, xml);
	}
	
	/**
	 * 返却データ設定処理（エラー用）
	 * <BR>
	 * @param errCd エラーコード
	 * @throws Exception
	 */
	private void setReturnDataForErr(String errCd) throws Exception
	{
		// ワンストップ共通処理.API独自関連チェック用エラー・ワーニングマップ作成処理を呼び出す
		Map<String, String> resultMap = JKKOneStopApiCommonUtil.getkrckErrInfMap(errCd);
		
		// エラー情報リストを作成
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		errList.add(resultMap);
		
		// 返却データ設定処理
		this.setReturnDataForErr("10", errList);
		
	}

	/**
	 * ワンストップ用API終了メソッドです。
     * <BR>
     * @param kojiakIcrnShokaiMap 工事案件一覧照会マップ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private void apiTerminal(HashMap<String, Object> kojiakIcrnShokaiMap) throws Exception
	{
		// リターンコード
		String returnCd = null;
		
		// 工事情報リスト
		ArrayList<Map<String, String>> kojiInfoList = new ArrayList <Map<String, String>>();
		
		// 工事案件一覧照会マップ.検索エラーフラグが0件の場合、以下の値を設定
		if (JPCModelConstant.SEARCH_ERR_FLG_ZERO.equals(kojiakIcrnShokaiMap.get(SEARCH_ERR_FLG)))
		{
			returnCd = "01";
			kojiInfoList = null;
		}
		else 
		{
			// リターンコードを設定する
			returnCd = "00";
			
			// 工事案件番号
			String kojiAkNo = null;
			
			// 工事案件一覧照会明細のi番目にある工事情報保持用Map
			HashMap<String, String> childMap = null;
			
			// 工事情報取得用Map
			LinkedHashMap<String, String> kojiInfoMap = null;
			
			// 退避用工事案件番号Map
			HashMap<String, String> taihiKojiAKNoMap = new HashMap<String, String>();
			
			// 工事案件一覧照会マップ.工事案件一覧照会明細の件数分、以下を行う
			ArrayList<HashMap<String, String>> kojiAKIcrnShokaiList = (ArrayList<HashMap<String, String>>)kojiakIcrnShokaiMap.get(EKU0011B010CBSMSG1LIST);
			for (int i = 0; i < kojiAKIcrnShokaiList.size(); i++)
			{
				// 工事案件一覧照会明細のi番目にある工事案件番号を取得
				childMap = (HashMap<String, String>)kojiAKIcrnShokaiList.get(i);
				kojiAkNo = (String)childMap.get(KOJIAK_NO);
				
				// 工事情報取得用Mapを初期化
				kojiInfoMap = new LinkedHashMap<String, String>();
				
				// 工事案件番号退避マップに工事案件番号が存在する場合、次の要素を処理する
				if (taihiKojiAKNoMap.containsKey(kojiAkNo))
				{
					continue;
				}
				
				// 工事情報マップに値を設定(工事案件番号、工事案件種別コード、工事案件種別名称、工事案件ステータス、工事案件ステータス名称
				// 工事案件依頼年月日、工事案件実施年月日)
				kojiInfoMap.put(KOJIAK_NO, kojiAkNo);
				kojiInfoMap.put(KOJIAK_SBT_CD, (String)childMap.get(KOJIAK_SBT_CD));
				kojiInfoMap.put(KOJIAK_SBT_NM, (String)childMap.get(KOJIAK_SBT_NM));
				kojiInfoMap.put(KOJIAK_STAT, (String)childMap.get(KOJIAK_STAT));
				kojiInfoMap.put(KOJIAK_STAT_NM, (String)childMap.get(KOJIAK_STAT_NM));
				kojiInfoMap.put(KOJIAK_REQYMD, (String)childMap.get(KOJIAK_REQYMD));
				kojiInfoMap.put(KOJIAK_JSSI_YMD, (String)childMap.get(KOJIAK_JSSI_YMD));
				
				// 工事情報リストで作成した工事情報マップを追加
				kojiInfoList.add(kojiInfoMap);
				
				// 工事案件番号を退避用工事案件番号Mapに代入
				taihiKojiAKNoMap.put(kojiAkNo, null);
			}
		}
		// XML変換対象マップを作成
		HashMap<String, LinkedHashMap<String, Object>> xmlChangeMap = new HashMap<String, LinkedHashMap<String, Object>>();
		LinkedHashMap<String, Object> kuife071SendMap = new LinkedHashMap<String, Object>();
		
		// 工事情報リストがnullであるか確認
		if (kojiInfoList != null)
		{
			
			// 工事情報Map
			HashMap<String, ArrayList<Map<String, String>>> kojiInfMap = new HashMap<String, ArrayList<Map<String, String>>>();
			
			// 工事情報Mapに工事情報リストを代入
			kojiInfMap.put(KOJI_INF, kojiInfoList);
			
			// 送信データマップに工事情報リストを追加
			kuife071SendMap.put(KOJI_INF_LIST, kojiInfMap);
		}
		
		// 送信データマップにリターンコードを追加
		kuife071SendMap.put(RETURN_CD, returnCd);
		
		// XML変換対象マップに送信データマップを追加
		xmlChangeMap.put(IF_ID + "_SEND", kuife071SendMap);
		
		// ワンストップデータ変換部品MapをXML変換
		String xml = JKKOneStopDataConverter.parseMapToXml(xmlChangeMap);
		
		// 返却データを設定
		X31SDataBeanAccess bean = super.getServiceFormBean();
		bean.sendMessageString(KUA10101SFConst.RETURNDATA, X31CWebConst.DATABEAN_SET_VALUE, xml);
	}
}
