/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JECC0041ED010TPMA
*	ソースファイル名：JECC0041ED010TPMA.java
*	作成者			：EKek0069
*	日付			：2011年04月17日
*＜機能概要＞
*	電子ファイル管理番号に紐づく電子ファイル管理情報の論理削除を行う。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*
********************************************************************************/

package eo.ejb.cbs.mainproc;

import com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;

import eo.ejb.cbs.cbsmsg.ECC0041E010CBSMsg;
import eo.ejb.cbm.entity.CC0041ETMsg;
import eo.common.util.JCCFrameworkException;
import eo.ejb.common.JCCModelCommon;

import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
 * 主処理部品（共通）.
 * <p>
 * 電子ファイル管理登録独自処理部品です。
 * </p>
 * @author 富士通
 */
public class JECC0041E010TPMA implements TemplateMainHandler{

	/**
	 * コンストラクタ
	 */
	public JECC0041E010TPMA()	{
	}
	
	/**
	*   DT044A001_SQLF<br>
	*   @param inCBSMsg    入力値の格納処理対象のCBSMsgCBSMsg <br>
	*   @param inContext   エージェントディスパッチコンテキスト <br>
	*   @return void
	*/
	public void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext)  throws Throwable
	{
		
		// コネクション
		Connection con = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		/******************** 
		 * SQL文の作成
		 ********************/

		try
		{
			
			//コネクション取得
			
			con = JSYejbConnection.getConnection(CC0041ETMsg.getTableName());
			
			// SQLの作成
			// 存在チェックを行う
			StringBuffer sql = new StringBuffer();
			sql.append("SELECT CC0041.EFILE_KANRI_NO, ");
			sql.append("       CC0041.GENE_ADD_DTM ");
			sql.append("  FROM CC_T_EFILE_KANRI CC0041 ");
			sql.append(" WHERE CC0041.EFILE_KANRI_NO = ? ");
			sql.append("   AND CC0041.GENE_ADD_DTM = ? ");
			sql.append("   AND CC0041.MK_FLG = '0' ");
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql);
			//prepareStatementにSQL文をセット
			pstmt = con.prepareStatement(sql.toString());
			CAANJDBCUtil.setParam(pstmt, 1, inCBSMsg.getString(ECC0041E010CBSMsg.EFILE_KANRI_NO));
			CAANJDBCUtil.setParam(pstmt, 2, inCBSMsg.getString(ECC0041E010CBSMsg.GENE_ADD_DTM_BF));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			if(!rsltQuery.next()) 
			{
				inCBSMsg.set(ECC0041E010CBSMsg.EFILE_KANRI_NO_ERR, "EA");
				inCBSMsg.set(ECC0041E010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
				return;
			}
			
			boolean lockCheckFLG = false;
			SQLException ex = null;
			
			// SQLの作成
			//カレントコードタイムスタンプチェックを行う
			sql = new StringBuffer();
			sql.append("SELECT CC0041.UPD_DTM UPD_DTM ");
			sql.append("  FROM  CC_T_EFILE_KANRI CC0041 ");
			sql.append(" WHERE CC0041.EFILE_KANRI_NO = ? ");
			sql.append("   AND CC0041.GENE_ADD_DTM = (SELECT MAX(CC0041_GENE.GENE_ADD_DTM) ");
// 2012/08/16 FST)arata 単体製造品質チェック対応 start
			sql.append("              FROM CC_T_EFILE_KANRI CC0041_GENE WHERE CC0041_GENE.EFILE_KANRI_NO = CC0041.EFILE_KANRI_NO AND CC0041_GENE.MK_FLG = '0') ");
// 2012/08/16 FST)arata 単体製造品質チェック対応 end
			sql.append("   AND CC0041.MK_FLG = '0' ");
			sql.append("   FOR UPDATE NOWAIT ");
			
			
			//2012/03/21 prepareStatementをクローズする start
			if(null != pstmt)
			{
				pstmt.close();
			}
			//2012/03/21 prepareStatementをクローズする end
			//prepareStatementにSQL文をセット
			pstmt = con.prepareStatement(sql.toString());
			
			CAANJDBCUtil.setParam(pstmt, 1, inCBSMsg.getString(ECC0041E010CBSMsg.EFILE_KANRI_NO));
			
			for(int i = 0; i < 3; i++)
			{
				lockCheckFLG = false;
				try
				{
					//ログ出力(SQL文の出力)
					JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql);

					//2012/03/21 ResultSetをクローズする start
					if(null != rsltQuery)
					{
						rsltQuery.close();
					}
					//2012/03/21 ResultSetをクローズする start
					
					// ResultSetの取得
					rsltQuery = pstmt.executeQuery();
				}
				catch(SQLException e)
				{
					//2012/03/21 ResultSetをクローズする start
					if(null != rsltQuery)
					{
						rsltQuery.close();
					}
					//2012/03/21 ResultSetをクローズする start
					ex = e;
					lockCheckFLG = true;
				}
				if(!lockCheckFLG)
				{
					break;
				}
			}
			
			if(lockCheckFLG)
			{
				throw ex;
			}
			
			rsltQuery.next();
			if(!rsltQuery.getString("UPD_DTM").equals(inCBSMsg.getString(ECC0041E010CBSMsg.UPD_DTM_BF))) 
			{
				inCBSMsg.set(ECC0041E010CBSMsg.UPD_DTM_BF_ERR, "EB");
				inCBSMsg.set(ECC0041E010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
				return;
			}
			//(2) 電子ファイル情報の論理削除(機能コードが"2"の場合は呼び出しは行わない。)
			if(!inCBSMsg.getString(ECC0041E010CBSMsg.FUNC_CODE).equals("2"))
			{
				// SQLの作成
				//電子ファイル情報の論理削除
				
				sql = new StringBuffer();
				sql.append("UPDATE CC_T_EFILE_KANRI ");
				sql.append("SET ");
				sql.append(JCCModelCommon.getCommonColumnDelete(inCBSMsg));
//				sql.append("   SET UPD_DTM = ?, ");
//				sql.append("       UPD_OPEACNT = ?, ");
//				sql.append("       DEL_DTM = ?, ");
//				sql.append("       DEL_OPEACNT = ?, ");
//				sql.append("       MK_FLG = '1' ");
				sql.append(" WHERE EFILE_KANRI_NO = ?");
				
				
				//2012/03/21 prepareStatementをクローズする start
				if(null != pstmt)
				{
					pstmt.close();
				}
				//2012/03/21 prepareStatementをクローズする end

				//prepareStatementにSQL文をセット
				pstmt = con.prepareStatement(sql.toString());
				
				//CAANJDBCUtil.setParam(pstmt, 1, JCCModelCommon.getSysDateTimeStamp());
				//CAANJDBCUtil.setParam(pstmt, 2, inCBSMsg.getString(ECC0041E010CBSMsg.OPERATORID));
				//CAANJDBCUtil.setParam(pstmt, 3, JCCModelCommon.getSysDateTimeStamp());
				//CAANJDBCUtil.setParam(pstmt, 4, inCBSMsg.getString(ECC0041E010CBSMsg.OPERATORID));
				//CAANJDBCUtil.setParam(pstmt, 5, inCBSMsg.getString(ECC0041E010CBSMsg.EFILE_KANRI_NO));
				CAANJDBCUtil.setParam(pstmt, 1, inCBSMsg.getString(ECC0041E010CBSMsg.EFILE_KANRI_NO));
				
				pstmt.executeUpdate();
			}
		}
		catch(SQLException e)
		{
			inCBSMsg.set(ECC0041E010CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new JCCFrameworkException("関連チェックでエラーが発生しました。",e);
		}
		finally
		{
			// 資源の解放
			try
			{
				if(rsltQuery != null)
				{
					rsltQuery.close();
				}
				if(pstmt != null)
				{
					pstmt.close();
				}
				
			}
			catch(SQLException e)
			{
				inCBSMsg.set(ECC0041E010CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new JCCFrameworkException("電子ファイル情報の論理削除でエラーが発生しました。",e);
			}
		}
	}
}