/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKU0091C010TPMA
*	ソースファイル名：JEKU0091C010TPMA.java
*	作成者			：富士通
*	日付			：2011年10月04日
*＜機能概要＞
*	工事案件取消の独自処理を呼び出す部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00	2011/10/04	FJ)			新規作成
*	ｖ10.00.00	2014/08/04	FJ)松田		【ANK-1918-00-00】ＵＳ管理Ｓ向けｅｏ顧客ＳのＩ／Ｆ改修
*	ｖ61.00.00	2023/10/30	FJ)謝		【ANK-4315-00-00】【eo定期】 eoホームゲートウェイ導入対応
*
********************************************************************************/
package eo.ejb.cbs.mainproc;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANFinderException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import eo.common.constant.JKUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbm.entity.KU0011ETMsg;
import eo.ejb.cbm.entity.KU0081ETMsg;
import eo.ejb.cbm.entity.KU0101ETMsg;
import eo.ejb.cbm.entity.KU0111ETMsg;
import eo.ejb.cbs.cbsmsg.EKU0091C010CBSMsg;
import eo.ejb.common.JKUModelCommon;
import eo.ejb.common.JPCModelCommon;
import eo.ejb.common.db.JKUejbKU0011SecProc;
import eo.ejb.common.db.JKUejbKU0081SecProc;
import eo.ejb.common.db.JKUejbKU0101SecProc;
import eo.ejb.common.db.JKUejbKU0111SecProc;

/**
 * <p>
 * 工事案件取消の独自処理を呼び出す部品です。
 * </p>
 * @author 富士通
 */
public class JEKU0091C010TPMA implements TemplateMainHandler
{
	
	/** 対象、対象外 */
	/** 対象 */
	private static final String TG_MATCH = "001";
	/** 対象外 */
	private static final String TG_EXT = "000";
	
	/**  可否、要否、有無 */
	/**  無 */
	private static final String KHN_NON = "000";
	/**  可、要 */
	private static final String KHN_PSG = "001";
	/**  否1 */
	private static final String KHN_FAIL_1 = "002";
	/**  否2 */
	private static final String KHN_FAIL_2 = "003";
	
	/**
	 * コンストラクタです
	 */
	public JEKU0091C010TPMA()
	{
		super();
	}
	
	/**
	 * 主処理
	 * @param inCBSMsg	CBSメッセージ
	 * @param inContext	ディスパッチコンテキスト
	 * @throws CAANException
	 */
	public void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws CAANException
	{
		// 工事案件番号
		String cbsKojiakNo = inCBSMsg.getString(EKU0091C010CBSMsg.KOJIAK_NO);
		// 工事案件種別
		String kojiakSbt = null;
		// 工事案件ステータス
		String kojiakState = null;
		// 工事案件更新可否
		String kojiakKh = null;
		// 取消対象スキーママップ
		HashMap<String, String> targetSchemaMap = new HashMap<String, String>();
		// 先行設計データ空フラグ
		boolean senkouFlg = true;
		// 設定工事データ空フラグ
		boolean setteiFlg = true;
		// 工事案件対象スキーマ判定結果
		String kojiakTarget = null;
		// 先行設計対象スキーマ判定結果
		String senkouTarget = null;
		// 設定工事対象スキーマ判定結果
		String setteiTarget = null;
		// 先行設計ステータスチェック結果
		ArrayList<HashMap<String, CAANMsg>> senkouStatList = new ArrayList<HashMap<String, CAANMsg>>();
		// 設定工事ステータスチェック結果
		ArrayList<HashMap<String, CAANMsg>> setteiStatList = new ArrayList<HashMap<String, CAANMsg>>();
		
		// 工事案件番号に紐づく工事案件データを取得する
		CAANMsg ku0011Msg = getKojiakItem(cbsKojiakNo);
		if (null == ku0011Msg)
		{
			// エラーを登録
			inCBSMsg.set(EKU0091C010CBSMsg.KOJIAK_NO_ERR, "EA");
			// ステータス
			inCBSMsg.set(EKU0091C010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			
			return;
		}
		
		// 排他処理
		if (false == JPCModelCommon.succeededExclusiveLock(ku0011Msg, inContext, JKUStrConst.SCHEMA_KU0011))
		{
			// エラーを登録
			inCBSMsg.set(EKU0091C010CBSMsg.KOJIAK_NO_ERR, "ED");
			// ステータス
			inCBSMsg.set(EKU0091C010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			return;
		}
		
		// 工事案件番号に紐づく同時代表工事案件データを取得する
		CAANMsg[] ku0011MsgDojiList = getDojiKojiakItem(cbsKojiakNo);
		
		// 工事案件番号に紐づくサービス契約工事案件データを取得する
		CAANMsg[] ku0081MsgList = getSvckeiKojiakItem(cbsKojiakNo);
		if (null == ku0081MsgList || ku0081MsgList.length == 0)
		{
			// エラーを登録
			inCBSMsg.set(EKU0091C010CBSMsg.KOJIAK_NO_ERR, "EE");
			// ステータス
			inCBSMsg.set(EKU0091C010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			
			return;
		}
		
		// 工事案件番号に紐づく先行設計データを取得する
		CAANMsg[] ku0101Msg = getSenkouItem(cbsKojiakNo);
		if (null == ku0101Msg)
		{
			// 先行設計は空である
			senkouFlg = false;
		}
		
		// 工事案件番号に紐づく同時代表工事案件データを取得する
		CAANMsg[] ku0101MsgDojiList = getDojiSenkouItem(cbsKojiakNo);
		
		
		// 工事案件番号に紐づく設定工事データを取得する
		CAANMsg[] ku0111Msg = getSetteiItem(cbsKojiakNo);
		if (null == ku0111Msg)
		{
			// 設定工事は空である
			setteiFlg = false;
		}
		
		// 工事案件種別取得
		kojiakSbt = ku0011Msg.getString(KU0011ETMsg.KOJIAK_SBT_CD);
		// 工事案件ステータス取得
		kojiakState = JKUModelCommon.getYkKojiakStat(ku0011Msg.getString(KU0011ETMsg.KOJIAK_STAT), ku0011Msg.getString(KU0011ETMsg.MANS_KOJIAK_STAT_CD));
		
		// -------------------------------
		// --- 取消対象スキーマチェック
		// -------------------------------
		targetSchemaMap = cancelTarget(kojiakSbt);
		
		// 取消対象結果取得
		
		kojiakTarget = targetSchemaMap.get(JKUStrConst.SCHEMA_KUJAK);
		
		senkouTarget = targetSchemaMap.get(JKUStrConst.SCHEMA_SENKO_DSGN);
		
		setteiTarget = targetSchemaMap.get(JKUStrConst.SCHEMA_SETTE_KOJI);
		
		// -------------------------------
		// --- 工事案件ステータスチェック
		// -------------------------------
		kojiakKh = stateCheck(kojiakState);
		
		if (KHN_FAIL_1.equals(kojiakKh))
		{
			// エラーを登録
			inCBSMsg.set(EKU0091C010CBSMsg.KOJIAK_NO_ERR, "EB");
			// ステータス
			inCBSMsg.set(EKU0091C010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			
			return;
		}
		else if (KHN_FAIL_2.equals(kojiakKh))
		{
			// エラーを登録
			inCBSMsg.set(EKU0091C010CBSMsg.KOJIAK_NO_ERR, "EC");
			// ステータス
			inCBSMsg.set(EKU0091C010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			
			return;
		}
		
		if (TG_MATCH.equals(senkouTarget) && 
				senkouFlg)
		{
			// 先行設計が取消対象でかつ先行設計取得情報が空でないなら
			
			// -------------------------------
			// --- 先行設計ステータスチェック
			// -------------------------------
			senkouStatList = multipleStateCheck(JKUStrConst.SCHEMA_SENKO_DSGN, ku0101Msg);
		}
		
		if (TG_MATCH.equals(setteiTarget) &&
				setteiFlg)
		{
			// 設定工事が取消対象でかつ設定工事取得情報が空でないなら
			
			// -------------------------------
			// --- 設定工事ステータスチェック
			// -------------------------------
			setteiStatList = multipleStateCheck(JKUStrConst.SCHEMA_SETTE_KOJI, ku0111Msg);
			
		}
		
		// -------------------------------
		// --- 更新実行
		// -------------------------------
		
		// 工事案件
		if (kojiakTarget.equals(TG_MATCH) &&
				KHN_PSG.equals(kojiakKh))
		{
			//機能コードの確認（機能コードが「1」の場合のみ、更新処理を行う。）
			if(JPCModelConstant.FUNC_CD_1.equals(inCBSMsg.getString(EKU0091C010CBSMsg.FUNC_CODE)))
			{
				// 取消対象であり、かつステータスが取消処理可能なら
				
				if (false == updateKojiak(inCBSMsg, ku0011Msg))
				{
					// エラーを登録
					inCBSMsg.set(EKU0091C010CBSMsg.KOJIAK_NO_ERR, "EA");
					// ステータス
					inCBSMsg.set(EKU0091C010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
					
					return;
				}
				
				// 同時代表工事案件が存在する場合
				if(ku0011MsgDojiList != null && ku0011MsgDojiList.length > 0)
				{
					for(CAANMsg ku0011DojiMsg : ku0011MsgDojiList)
					{
						String dojiDaihyoKojiakNo = ku0011DojiMsg.getString(KU0011ETMsg.KOJIAK_NO);
						
						// 同時代表工事案件の工事案件番号と取消した工事案件の同時代表工事案件番号が等しいときのみ
						// 同時代表工事案件の更新を行う
						if(ku0011Msg.getString(KU0011ETMsg.DOJI_DAIHYO_KOJIAK_NO).equals(dojiDaihyoKojiakNo))
						{
							// 同時代表工事案件の更新処理
							if(!JKUModelCommon.updateDojiDaihyoKojiak("", dojiDaihyoKojiakNo, 
									inCBSMsg.getString(EKU0091C010CBSMsg.OPERATEDATETIME), 
									inCBSMsg.getString(EKU0091C010CBSMsg.OPERATORID), inContext, false))
							{
								// エラーを登録
								inCBSMsg.set(EKU0091C010CBSMsg.KOJIAK_NO_ERR, "ED");
								// ステータス
								inCBSMsg.set(EKU0091C010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
								return;
							}
						}
					}
				}
			}
		}
		
		// サービス契約工事案件
		for(CAANMsg ku0081Msg : ku0081MsgList)
		{
			//機能コードの確認（機能コードが「1」の場合のみ、更新処理を行う。）
			if(JPCModelConstant.FUNC_CD_1.equals(inCBSMsg.getString(EKU0091C010CBSMsg.FUNC_CODE)))
			{
				if (false == updateSvckeiKojiak(inCBSMsg, ku0081Msg))
				{
					// エラーを登録
					inCBSMsg.set(EKU0091C010CBSMsg.KOJIAK_NO_ERR, "EA");
					// ステータス
					inCBSMsg.set(EKU0091C010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
					
					return;
				}
			}
		}
		
		// 先行設計
		
		if (null != senkouStatList &&
				0 != senkouStatList.size()) 
		{
			// 件数分繰り返し
			for (int i = 0 ; i < senkouStatList.size() ; i++)
			{
				// ステータスチェック結果が「可」のみ
				HashMap<String, CAANMsg> itemCheck = senkouStatList.get(i);
				
				if (null != itemCheck.get(KHN_PSG))
				{
					//機能コードの確認（機能コードが「1」の場合のみ、更新処理を行う。）
					if(JPCModelConstant.FUNC_CD_1.equals(inCBSMsg.getString(EKU0091C010CBSMsg.FUNC_CODE)))
					{
						if (false == updateSenkou(inCBSMsg, itemCheck.get(KHN_PSG), ku0101MsgDojiList))
						{
							// エラーを登録
							inCBSMsg.set(EKU0091C010CBSMsg.KOJIAK_NO_ERR, "EA");
							// ステータス
							inCBSMsg.set(EKU0091C010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
							
							return;
						}
					}
				}
				else if (null != itemCheck.get(KHN_FAIL_1))
				{
					// エラーを登録
					inCBSMsg.set(EKU0091C010CBSMsg.KOJIAK_NO_ERR, "EB");
					// ステータス
					inCBSMsg.set(EKU0091C010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
					
					return;
				}
				else if (null != itemCheck.get(KHN_FAIL_2))
				{
					// エラーを登録
					inCBSMsg.set(EKU0091C010CBSMsg.KOJIAK_NO_ERR, "EC");
					// ステータス
					inCBSMsg.set(EKU0091C010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
					
					return;
				}
				else if (null != itemCheck.get(KHN_NON))
				{
					// 「無」の場合なにも行わない
				}
			}
		}
		
		// 設定工事
		
		if (null != setteiStatList &&
				0 != setteiStatList.size())
		{
			// 件数分繰り返し
			for (int i = 0 ; i < setteiStatList.size() ; i++)
			{
				// ステータスチェック結果が「可」のみ
				HashMap<String, CAANMsg> itemCheck = setteiStatList.get(i);
				
				if (null != itemCheck.get(KHN_PSG))
				{
					//機能コードの確認（機能コードが「1」の場合のみ、更新処理を行う。）
					if(JPCModelConstant.FUNC_CD_1.equals(inCBSMsg.getString(EKU0091C010CBSMsg.FUNC_CODE)))
					{
						if (false == updateSettei(inCBSMsg, itemCheck.get(KHN_PSG)))
						{
							// エラーを登録
							inCBSMsg.set(EKU0091C010CBSMsg.KOJIAK_NO_ERR, "EA");
							// ステータス
							inCBSMsg.set(EKU0091C010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
							
							return;
						}
					}
				}
				else if (null != itemCheck.get(KHN_FAIL_1))
				{
					// エラーを登録
					inCBSMsg.set(EKU0091C010CBSMsg.KOJIAK_NO_ERR, "EB");
					// ステータス
					inCBSMsg.set(EKU0091C010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
					
					return;
				}
				else if (null != itemCheck.get(KHN_FAIL_2))
				{
					// エラーを登録
					inCBSMsg.set(EKU0091C010CBSMsg.KOJIAK_NO_ERR, "EC");
					// ステータス
					inCBSMsg.set(EKU0091C010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
					
					return;
				}
				else if (null != itemCheck.get(KHN_NON))
				{
					// 「無」の場合なにも行わない
				}
			}
		}
		
		
		
		
	}
	
	
	/**
	 * 設定工事の更新処理を行う。
	 * @param inCBSMsg
	 * @param updInf
	 * @return 更新処理結果を返す。 正常：true 以上:false
	 * @throws CAANException
	 */
	private boolean updateSettei(CAANMsg inCBSMsg, CAANMsg updInf) throws CAANException
	{
		
		// 更新項目の設定
		// 設定工事ステータス(900：中止)
		updInf.set(KU0111ETMsg.SETTE_KOJI_STAT, JKUStrConst.CD00477_CHUSHI);
		// オンライン運用日付
		updInf.set(KU0111ETMsg.SETTE_KOJI_CANCEL_DTM, JKUModelCommon.getOpeDateTime(inCBSMsg, null));
		// 設定工事中止年月日
		updInf.set(KU0111ETMsg.SETTE_KOJI_STP_YMD, JKUModelCommon.getOpeDate(inCBSMsg, null));
		
		// 更新年月日時分秒(システム日付)
		updInf.set(KU0111ETMsg.UPD_DTM, inCBSMsg.getString(EKU0091C010CBSMsg.OPERATEDATETIME));
		// 更新オペレータアカウント(共通部：オペレータＩＤ)
		updInf.set(KU0111ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKU0091C010CBSMsg.OPERATORID));
		
		// 更新実行
		try
		{
			new JKUejbKU0111SecProc().update(updInf);
		}
		catch (CAANFinderException cfe)
		{
			inCBSMsg.set(EKU0091C010CBSMsg.STATUS, StatusCodes.UPDATE_DB_ERR);
			throw cfe;
		}
		
		return true;
	}
	
	/**
	 * 先行設計の更新処理を行う。
	 * @param inCBSMsg
	 * @param updInf
	 * @param ku0101MsgDojiList
	 * @return 更新処理結果を返す。 正常：true 以上:false
	 * @throws CAANException
	 */
	private boolean updateSenkou(CAANMsg inCBSMsg, CAANMsg updInf, CAANMsg[] ku0101MsgDojiList) throws CAANException
	{
		// 同時代表工事が存在するなら更新をする
		if(ku0101MsgDojiList != null && ku0101MsgDojiList.length > 0)
		{
			for(CAANMsg ku0011DojiMsg : ku0101MsgDojiList)
			{
				String dojiDaihyoKojiakNo = ku0011DojiMsg.getString(KU0101ETMsg.KOJIAK_NO);
				
				if(updInf.getString(KU0101ETMsg.DOJI_DAIHYO_KOJIAK_NO).equals(dojiDaihyoKojiakNo))
				{
					// 同時代表先行設計の更新処理
					JKUModelCommon.updateDojiDaihyoSenkoDsgn("", dojiDaihyoKojiakNo, 
							inCBSMsg.getString(EKU0091C010CBSMsg.OPERATEDATETIME), 
							inCBSMsg.getString(EKU0091C010CBSMsg.OPERATORID), false);
				}
			}
		}
		
		// 更新項目の設定
		// 先行設計ステータス(150：中止)
		updInf.set(KU0101ETMsg.SNKSKI_STAT, JKUStrConst.SNKSKI_STAT_CHUSHI);
		// 先行設計中止年月日
		updInf.set(KU0101ETMsg.SNKSKI_STP_YMD, JKUModelCommon.getOpeDate(inCBSMsg, null));
		
		
		// 更新年月日時分秒(システム日付)
		updInf.set(KU0101ETMsg.UPD_DTM, inCBSMsg.getString(EKU0091C010CBSMsg.OPERATEDATETIME));
		// 更新オペレータアカウント(共通部：オペレータＩＤ)
		updInf.set(KU0101ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKU0091C010CBSMsg.OPERATORID));
		
		// 更新実行
		try
		{
			new JKUejbKU0101SecProc().update(updInf);
		}
		catch (CAANFinderException cfe)
		{
			inCBSMsg.set(EKU0091C010CBSMsg.STATUS, StatusCodes.UPDATE_DB_ERR);
			throw cfe;
		}
		
		return true;
	}
	
	/**
	 * 工事案件の更新処理を行う。
	 * @param inCBSMsg
	 * @param updInf
	 * @return 更新処理結果を返す。 正常：true 以上:false
	 * @throws CAANException
	 */
	private boolean updateKojiak(CAANMsg inCBSMsg, CAANMsg updInf) throws CAANException
	{
		
		// 更新項目の設定
		
		// 工事案件ステータスが「130:受付済」の場合は工事案件ステータスを「900:中止」に更新
		if(JKUStrConst.CD00474_UK_ZM.equals(updInf.getString(KU0011ETMsg.KOJIAK_STAT)))
		{
			updInf.set(KU0011ETMsg.KOJIAK_STAT, JKUStrConst.CD00474_CHUSHI);
		}
		// マンション工事案件状態コードが「130:受付済」の場合はマンション工事案件状態コードを「900:中止」に更新
		else if(JKUStrConst.MANS_KOJIAK_STAT_CD_UK_ZM.equals(updInf.getString(KU0011ETMsg.MANS_KOJIAK_STAT_CD)))
		{
			updInf.set(KU0011ETMsg.MANS_KOJIAK_STAT_CD, JKUStrConst.MANS_KOJIAK_STAT_CD_CHUSHI);
		}
		
		// 工事案件中止担当ユーザーID
		updInf.set(KU0011ETMsg.KOJIAK_STP_TNT_USER_ID, inCBSMsg.getString(EKU0091C010CBSMsg.OPERATORID));
		
		
		// 更新年月日時分秒(システム日付) システム日付はinCBSMsg.getString(EKU0091C010CBSMsg.OPERATEDATETIME)で取得した値
		updInf.set(KU0011ETMsg.UPD_DTM, inCBSMsg.getString(EKU0091C010CBSMsg.OPERATEDATETIME));
		// 更新オペレータアカウント(共通部：オペレータＩＤ)
		updInf.set(KU0011ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKU0091C010CBSMsg.OPERATORID));
		
		// 更新実行
		try
		{
			new JKUejbKU0011SecProc().update(updInf);
		}
		catch (CAANFinderException cfe)
		{
			inCBSMsg.set(EKU0091C010CBSMsg.STATUS, StatusCodes.UPDATE_DB_ERR);
			throw cfe;
		}
		
		return true;
	}
	
	/**
	 * サービス契約工事案件の更新処理を行う。
	 * @param inCBSMsg
	 * @param updInf
	 * @return 更新処理結果を返す。 正常：true 以上:false
	 * @throws CAANException
	 */
	private boolean updateSvckeiKojiak(CAANMsg inCBSMsg, CAANMsg updInf) throws CAANException
	{
		
		// 更新項目の設定
		// サービス契約＿工事案件適用終了年月日
		updInf.set(KU0081ETMsg.SVKEI_KOJIAK_TENDYMD, JKUModelCommon.getOpeDate(inCBSMsg, null));
		
		
		// 更新年月日時分秒(システム日付) システム日付はinCBSMsg.getString(EKU0091C010CBSMsg.OPERATEDATETIME)で取得した値
		updInf.set(KU0081ETMsg.UPD_DTM, inCBSMsg.getString(EKU0091C010CBSMsg.OPERATEDATETIME));
		// 更新オペレータアカウント(共通部：オペレータＩＤ)
		updInf.set(KU0081ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKU0091C010CBSMsg.OPERATORID));
		
		// 更新実行
		try
		{
			new JKUejbKU0081SecProc().update(updInf);
		}
		catch (CAANFinderException cfe)
		{
			inCBSMsg.set(EKU0091C010CBSMsg.STATUS, StatusCodes.UPDATE_DB_ERR);
			throw cfe;
		}
		
		return true;
	}
	
	/**
	 * ステータスから取消処理を行えるか判定する。
	 * @param schemaNm   対象スキーマ名
	 * @param targetItem 対象レコード
	 * @return 判定結果リスト
	 */
	private static ArrayList<HashMap<String, CAANMsg>> multipleStateCheck(String schemaNm, CAANMsg[] targetItem)
	{
		
		// ステータス判定結果格納リスト
		ArrayList<HashMap<String, CAANMsg>> resultList = new ArrayList<HashMap<String, CAANMsg>>();
		// 対象ステータス
		String targetStat = null;
		
		// 対象スキーマチェック
		if (JKUStrConst.SCHEMA_SENKO_DSGN.equals(schemaNm))
		{
			// 先行設計の場合
			
			// 繰り返し
			for (CAANMsg senkouInf : targetItem)
			{
				// ステータス判定結果
				HashMap<String, CAANMsg> resultMap = new HashMap<String, CAANMsg>();
				
				// ステータス取得
				targetStat = senkouInf.getString(KU0101ETMsg.SNKSKI_STAT);
				
				if (JKUStrConst.CD00474_NASHI.equals(targetStat))
				{
					// なし
					resultMap.put(KHN_NON, senkouInf);
				}
				else if (JKUStrConst.CD00474_TOROKU_ZM.equals(targetStat))
				{
					// 登録済
					resultMap.put(KHN_NON, senkouInf);
				}
				else if (JKUStrConst.SNKSKI_STAT_UK_ZM.equals(targetStat))
				{
					// 受付済
					resultMap.put(KHN_PSG, senkouInf);
				}
				else if (JKUStrConst.SNKSKI_STAT_IRI_ZM.equals(targetStat))
				{
					// 依頼済
					resultMap.put(KHN_FAIL_1, senkouInf);
				}
				else if (JKUStrConst.SNKSKI_STAT_CHUSHI.equals(targetStat))
				{
					// 中止
					resultMap.put(KHN_FAIL_2, senkouInf);
				}
				
				resultList.add(resultMap);
			}
			
		}
		else if (JKUStrConst.SCHEMA_SETTE_KOJI.equals(schemaNm))
		{
			// 設定工事の場合
			
			// 繰り返し
			for (CAANMsg senkouInf : targetItem)
			{
				// ステータス判定結果
				HashMap<String, CAANMsg> resultMap = new HashMap<String, CAANMsg>();
				
				// ステータス取得
				targetStat = senkouInf.getString(KU0111ETMsg.SETTE_KOJI_STAT);
				
				if (JKUStrConst.CD00477_NASHI.equals(targetStat))
				{
					// なし
					resultMap.put(KHN_NON, senkouInf);
				}
				else if (JKUStrConst.CD00477_TOROKU_ZM.equals(targetStat))
				{
					// 登録済
					resultMap.put(KHN_NON, senkouInf);
				}
				else if (JKUStrConst.CD00477_UK_ZM.equals(targetStat))
				{
					// 受付済
					resultMap.put(KHN_PSG, senkouInf);
				}
				else if (JKUStrConst.CD00477_IRI_ZM.equals(targetStat))
				{
					// 依頼済
					resultMap.put(KHN_FAIL_1, senkouInf);
				}
				else if (JKUStrConst.CD00477_FIN_ZM.equals(targetStat))
				{
					// 完了済
					resultMap.put(KHN_FAIL_1, senkouInf);
				}
				else if (JKUStrConst.CD00477_CHUSHI.equals(targetStat))
				{
					// 中止
					resultMap.put(KHN_FAIL_2, senkouInf);
				}
				
				resultList.add(resultMap);
			}
		}
		
		return resultList;
	}
	
	/**
	 * 工事案件のステータスをチェックし、取消更新が行えるかチェックする。
	 * @param kojiakState 工事案件ステータス
	 * @return 取消更新の可否
	 */
	private static String stateCheck(String kojiakState)
	{
		String result = null;
		
		if (JKUStrConst.CD00474_NASHI.equals(kojiakState))
		{
			// なし
			
			result = KHN_NON;
		}
		else if (JKUStrConst.CD00474_TOROKU_ZM.equals(kojiakState))
		{
			// 登録済
			
			result = KHN_NON;
		}
		else if (JKUStrConst.CD00474_UK_ZM.equals(kojiakState))
		{
			// 受付済
			
			result = KHN_PSG;
		}
		else if (JKUStrConst.CD00474_IRI_ZM.equals(kojiakState))
		{
			// 依頼済
			
			result = KHN_FAIL_1;
		}
		else if (JKUStrConst.CD00474_TAKNI_CHOSA_FIN_ZM.equals(kojiakState))
		{
			// 宅内調査完了済
			
			result = KHN_FAIL_1;
		}
		else if (JKUStrConst.CD00474_KOCOMP_KETTEI_ZM.equals(kojiakState))
		{
			// 工事会社決定済
			
			result = KHN_FAIL_1;
		}
		else if (JKUStrConst.CD00474_TAKNI_CHOSA_RSV_ZM.equals(kojiakState))
		{
			// 宅内機器予定登録済
			
			result = KHN_FAIL_1;
		}
		else if (JKUStrConst.CD00474_KR_KAGI_KAIHAT_IRI_ZM.equals(kojiakState))
		{
			// 仮鍵開発行依頼済
			
			result = KHN_FAIL_1;
		}
		else if (JKUStrConst.CD00474_GEMBA_SAGYO_FIN_ZM.equals(kojiakState))
		{
			// 現場作業完了済
			
			result = KHN_FAIL_1;
		}
		else if (JKUStrConst.CD00474_KOJI_FIN_ZM.equals(kojiakState))
		{
			// 工事完了済
			
			result = KHN_FAIL_1;
		}
		else if (JKUStrConst.CD00474_CHUSHI.equals(kojiakState))
		{
			// 中止
			
			result = KHN_FAIL_2;
		}
		
		return result;
	}
	
	/**
	 * 取消対象スキーマのパターン取得
	 * @param kojiakSbt 工事案件種別
	 * @return 取消対象パターンマップ
	 */
	private static HashMap<String, String> cancelTarget(String kojiakSbt)
	{
		HashMap<String, String> resultMap = new HashMap<String, String>();
		
		if (JKUStrConst.CD00577_KYOSEI_DSL.equals(kojiakSbt))
		{
			// 強制解約
			
			// 工事案件
			resultMap.put(JKUStrConst.SCHEMA_KUJAK, TG_MATCH);
			// 先行設計
			resultMap.put(JKUStrConst.SCHEMA_SENKO_DSGN, TG_EXT);
			// 設定工事
			resultMap.put(JKUStrConst.SCHEMA_SETTE_KOJI, TG_MATCH);
		}
		else if (JKUStrConst.CD00577_NEWESTA.equals(kojiakSbt))
		{
			// 新設
			
			// 工事案件
			resultMap.put(JKUStrConst.SCHEMA_KUJAK, TG_MATCH);
			// 先行設計
			resultMap.put(JKUStrConst.SCHEMA_SENKO_DSGN, TG_MATCH);
			// 設定工事
			resultMap.put(JKUStrConst.SCHEMA_SETTE_KOJI, TG_MATCH);
		}
		else if (JKUStrConst.CD00577_TEKKYO_DSL.equals(kojiakSbt))
		{
			// 撤去(解約)
			
			// 工事案件
			resultMap.put(JKUStrConst.SCHEMA_KUJAK, TG_MATCH);
			// 先行設計
			resultMap.put(JKUStrConst.SCHEMA_SENKO_DSGN, TG_EXT);
			// 設定工事
			resultMap.put(JKUStrConst.SCHEMA_SETTE_KOJI, TG_MATCH);
		}
		else if (JKUStrConst.CD00577_AD_CHG_NEWESTA.equals(kojiakSbt))
		{
			// 住変(新設)
			
			// 工事案件
			resultMap.put(JKUStrConst.SCHEMA_KUJAK, TG_MATCH);
			// 先行設計
			resultMap.put(JKUStrConst.SCHEMA_SENKO_DSGN, TG_MATCH);
			// 設定工事
			resultMap.put(JKUStrConst.SCHEMA_SETTE_KOJI, TG_MATCH);
		}
		else if (JKUStrConst.CD00577_AD_CHG_TEKKYO.equals(kojiakSbt))
		{
			// 住変(撤去)
			
			// 工事案件
			resultMap.put(JKUStrConst.SCHEMA_KUJAK, TG_MATCH);
			// 先行設計
			resultMap.put(JKUStrConst.SCHEMA_SENKO_DSGN, TG_EXT);
			// 設定工事
			resultMap.put(JKUStrConst.SCHEMA_SETTE_KOJI, TG_MATCH);
		}
		else if (JKUStrConst.CD00577_EOH_TEL_TNKJ.equals(kojiakSbt))
		{
			// eo光電話宅内工事
			
			// 工事案件
			resultMap.put(JKUStrConst.SCHEMA_KUJAK, TG_MATCH);
			// 先行設計
			resultMap.put(JKUStrConst.SCHEMA_SENKO_DSGN, TG_EXT);
			// 設定工事
			resultMap.put(JKUStrConst.SCHEMA_SETTE_KOJI, TG_EXT);
		}
		else if (JKUStrConst.CD00577_ISETSU.equals(kojiakSbt))
		{
			// 移設
			
			// 工事案件
			resultMap.put(JKUStrConst.SCHEMA_KUJAK, TG_MATCH);
			// 先行設計
			resultMap.put(JKUStrConst.SCHEMA_SENKO_DSGN, TG_EXT);
			// 設定工事
			resultMap.put(JKUStrConst.SCHEMA_SETTE_KOJI, TG_EXT);
		}
		else if (JKUStrConst.CD00577_LINK_STB.equals(kojiakSbt))
		{
			// リンクSTB
			
			// 工事案件
			resultMap.put(JKUStrConst.SCHEMA_KUJAK, TG_MATCH);
			// 先行設計
			resultMap.put(JKUStrConst.SCHEMA_SENKO_DSGN, TG_MATCH);
			// 設定工事
			resultMap.put(JKUStrConst.SCHEMA_SETTE_KOJI, TG_EXT);
		}
		else if (JKUStrConst.CD00577_PLAN_CHG_SHUYO.equals(kojiakSbt))
		{
			// プラン変更（収容替）
			
			// 工事案件
			resultMap.put(JKUStrConst.SCHEMA_KUJAK, TG_MATCH);
			// 先行設計
			resultMap.put(JKUStrConst.SCHEMA_SENKO_DSGN, TG_MATCH);
			// 設定工事
			resultMap.put(JKUStrConst.SCHEMA_SETTE_KOJI, TG_EXT);
		}
		else if (JKUStrConst.CD00577_PLAN_CHG_KOJI_NON.equals(kojiakSbt))
		{
			// プラン変更（工事なし）
			
			// 工事案件
			resultMap.put(JKUStrConst.SCHEMA_KUJAK, TG_EXT);
			// 先行設計
			resultMap.put(JKUStrConst.SCHEMA_SENKO_DSGN, TG_EXT);
			// 設定工事
			resultMap.put(JKUStrConst.SCHEMA_SETTE_KOJI, TG_MATCH);
		}
		else if (JKUStrConst.CD00577_SVC_ADD_KOJI_NON.equals(kojiakSbt))
		{
			// サービス追加（工事なし）
			
			// 工事案件
			resultMap.put(JKUStrConst.SCHEMA_KUJAK, TG_EXT);
			// 先行設計
			resultMap.put(JKUStrConst.SCHEMA_SENKO_DSGN, TG_EXT);
			// 設定工事
			resultMap.put(JKUStrConst.SCHEMA_SETTE_KOJI, TG_EXT);
		}
		else if (JKUStrConst.CD00577_MNKHT.equals(kojiakSbt))
		{
			// 面開発
			
			// 工事案件
			resultMap.put(JKUStrConst.SCHEMA_KUJAK, TG_MATCH);
			// 先行設計
			resultMap.put(JKUStrConst.SCHEMA_SENKO_DSGN, TG_MATCH);
			// 設定工事
			resultMap.put(JKUStrConst.SCHEMA_SETTE_KOJI, TG_EXT);
		}
		else if (JKUStrConst.CD00577_EOTV_CHG.equals(kojiakSbt))
		{
			// eoテレビ変更
			
			// 工事案件
			resultMap.put(JKUStrConst.SCHEMA_KUJAK, TG_MATCH);
			// 先行設計
			resultMap.put(JKUStrConst.SCHEMA_SENKO_DSGN, TG_EXT);
			// 設定工事
			resultMap.put(JKUStrConst.SCHEMA_SETTE_KOJI, TG_EXT);
		}
		else if (JKUStrConst.CD00577_GG_NORIKAE.equals(kojiakSbt))
		{
			// GG乗換
			
			// 工事案件
			resultMap.put(JKUStrConst.SCHEMA_KUJAK, TG_MATCH);
			// 先行設計
			resultMap.put(JKUStrConst.SCHEMA_SENKO_DSGN, TG_EXT);
			// 設定工事
			resultMap.put(JKUStrConst.SCHEMA_SETTE_KOJI, TG_EXT);
		}
// ANK-4315-00-00 ADD START
		else if (JKUStrConst.CD00577_ONU_KOKAN_KOJI.equals(kojiakSbt))
		{
			// ONU交換工事
			
			// 工事案件
			resultMap.put(JKUStrConst.SCHEMA_KUJAK, TG_MATCH);
			// 先行設計
			resultMap.put(JKUStrConst.SCHEMA_SENKO_DSGN, TG_MATCH);
			// 設定工事
			resultMap.put(JKUStrConst.SCHEMA_SETTE_KOJI, TG_MATCH);
		}
// ANK-4315-00-00 ADD END
		
		
		return resultMap;
	}
	
	
	
	/**
	 * 工事案件レコード取得
	 * @param kojiakNo
	 * @return 工事案件データ
	 * @throws CAANException
	 */
	private static CAANMsg getKojiakItem(String kojiakNo) throws CAANException
	{
		JKUejbKU0011SecProc ku0011SecProc = new JKUejbKU0011SecProc();
		
		// 工事案件番号をキーに工事案件を取得する
		CAANMsg ku0011Msg = new CAANMsg(KU0011ETMsg.class.getName());
		
		// 工事案件番号
		ku0011Msg.set(KU0011ETMsg.KOJIAK_NO, kojiakNo);
		
		return ku0011SecProc.findByPrimaryKey(ku0011Msg, true);
	}
	
	
	/**
	 * サービス契約工事案件レコード取得
	 * @param kojiakNo
	 * @return サービス契約工事案件データ
	 * @throws CAANException
	 */
	private static CAANMsg[] getSvckeiKojiakItem(String kojiakNo) throws CAANException
	{
		JKUejbKU0081SecProc ku0081SecProc = new JKUejbKU0081SecProc();
		
		// 工事案件番号をキーにサービス契約工事案件を取得する
		CAANMsg ku0081Msg = new CAANMsg(KU0081ETMsg.class.getName());
		
		// 工事案件番号
		ku0081Msg.set(KU0081ETMsg.KOJIAK_NO, kojiakNo);
		// 無効フラグ
		ku0081Msg.set(KU0081ETMsg.MK_FLG, JKUStrConst.MK_FLG_YUKO);
		
		return ku0081SecProc.findByCondition(ku0081Msg);
	}
	
	
	/**
	 * 先行設計レコード取得
	 * @param kojiakNo
	 * @return 先行設計データ
	 * @throws CAANException
	 */
	private static CAANMsg[] getSenkouItem(String kojiakNo) throws CAANException
	{
		JKUejbKU0101SecProc ku0101SecProc = new JKUejbKU0101SecProc();
		
		// 工事案件番号をキーに先行設計を取得する
		CAANMsg ku0101Msg = new CAANMsg(KU0101ETMsg.class.getName());
		
		// 工事案件番号
		ku0101Msg.set(KU0101ETMsg.KOJIAK_NO, kojiakNo);
		// 無効フラグ
		ku0101Msg.set(KU0101ETMsg.MK_FLG, JKUStrConst.MK_FLG_YUKO);
		
		return ku0101SecProc.findByCondition(ku0101Msg);
	}
	
	
	/**
	 * 設定工事レコード取得
	 * @param kojiakNo
	 * @return 設定工事データ
	 * @throws CAANException
	 */
	private static CAANMsg[] getSetteiItem(String kojiakNo) throws CAANException
	{
		JKUejbKU0111SecProc ku0111SecProc = new JKUejbKU0111SecProc();
		
		// 工事案件番号をキーに設定工事を取得する
		CAANMsg ku0111Msg = new CAANMsg(KU0111ETMsg.class.getName());
		
		// 工事案件番号
		ku0111Msg.set(KU0111ETMsg.KOJIAK_NO, kojiakNo);
		// 無効フラグ
		ku0111Msg.set(KU0111ETMsg.MK_FLG, JKUStrConst.MK_FLG_YUKO);
		
		return ku0111SecProc.findByCondition(ku0111Msg);
	}
	
	/**
	 * 工事案件レコードリスト取得
	 * @param kojiakNo
	 * @return 工事案件データリスト
	 * @throws CAANException
	 */
	private static CAANMsg[] getDojiKojiakItem(String kojiakNo) throws CAANException
	{
		JKUejbKU0011SecProc ku0011SecProc = new JKUejbKU0011SecProc();
		
		// 工事案件番号をキーに工事案件を取得する
		CAANMsg ku0011Msg = new CAANMsg(KU0011ETMsg.class.getName());
		
		// 同時代表工事案件番号
		ku0011Msg.set(KU0011ETMsg.DOJI_DAIHYO_KOJIAK_NO, kojiakNo);
		// 工事案件ステータス
		ku0011Msg.set(KU0011ETMsg.KOJIAK_STAT, JKUStrConst.CD00474_UK_ZM);
		// 無効フラグ
		ku0011Msg.set(KU0011ETMsg.MK_FLG, JKUStrConst.MK_FLG_YUKO);
		
		return ku0011SecProc.findByCondition(ku0011Msg);
	}
	
	/**
	 * 先行設計レコードリスト取得
	 * @param kojiakNo
	 * @return 先行設計データリスト
	 * @throws CAANException
	 */
	private static CAANMsg[] getDojiSenkouItem(String kojiakNo) throws CAANException
	{
		JKUejbKU0101SecProc ku0101SecProc = new JKUejbKU0101SecProc();
		
		// 工事案件番号をキーに先行設計を取得する
		CAANMsg ku0101Msg = new CAANMsg(KU0101ETMsg.class.getName());
		
		// 同時代表工事案件番号
		ku0101Msg.set(KU0101ETMsg.DOJI_DAIHYO_KOJIAK_NO, kojiakNo);
		// 工事案件ステータス
		ku0101Msg.set(KU0101ETMsg.SNKSKI_STAT, JKUStrConst.SNKSKI_STAT_UK_ZM);
		// 無効フラグ
		ku0101Msg.set(KU0101ETMsg.MK_FLG, JKUStrConst.MK_FLG_YUKO);
		
		return ku0101SecProc.findByCondition(ku0101Msg);
	}
}