/*******************************************************************************
 *	 All Rights reserved,Copyright (c) K-Opticom 
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム構築
 *	モジュール名	：JCRejbCR0111SecProc
 *	ソースファイル名：JCRejbCR0111SecProc.java
 *	作成者			：富士通
 *	日付			：2011年03月14日
 *＜機能概要＞
 *	キューBOX副次処理部品
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	ｖ1.00.00
 *	ｖ6.00.00	2013/09/25	FJ）伊藤	OM-2013-0002549 現在格納数を集計するよう修正。
 *	ｖ6.00.01	2013/11/27	FJ）伊藤	OM-2013-0003036 性能改善(現在格納数を集計をSELECTカウントに変更)
 *
 ********************************************************************************/

package eo.ejb.common.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
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.TemplateSQLEntity;

import eo.common.constant.JCRStrConst;
import eo.ejb.cbm.entity.CR0011ETMsg;
import eo.ejb.cbm.entity.CR0111ETMsg;
import eo.ejb.cbm.entity.CR0111LE;
import eo.ejb.common.JCRModelCommon;

/**
 * キューBOX副次処理部品<p>
 * <BR>
 * @author 富士通
 */
public class JCRejbCR0111SecProc extends TemplateSQLEntity
{

	/**
	 * コンストラクタです。
	 */
	public JCRejbCR0111SecProc()
	{
		super();
	}

	/**
	 * キューBOX現在格納数編集処理です。<br>
	 * <br>
	 * キューBOXの現在格納数をパラメータの増減値に従い計算し、更新する。
	 * 更新に失敗した場合、CAANFinderExceptionをthrowする。
	 * @param inCBSMsg 外部スキーマのメッセージ
	 * @param inContext エージェントディスパッチコンテキスト
	 * @param cr0111ETMsg CR0111ETMsgスキーマクラス
	 * @param queboxNo 検索条件となるキューBOX番号
	 * @param difference 増減値
	 * 
	 * @return キューBOXのETメッセージ(更新用)
	 * @throws CAANException 
	 */
	public CAANMsg calculateQueboxKakunosu(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg cr0111ETMsg, String queboxNo, int difference) throws CAANException
	{
		// キューBOXのETメッセージ(検索用)を生成
		CAANMsg searchMsg = new CAANMsg(CR0111ETMsg.class.getName());

		// 検索条件を設定
		// キューBOX番号
		searchMsg.set(CR0111ETMsg.QUE_BOX_NO, queboxNo);
		// 無効フラグ
		searchMsg.set(CR0111ETMsg.MK_FLG, JCRStrConst.CD_DIV_MK_FLG_YUKO);

		// キューBOXを検索する
		CAANMsg[] retMsg = new CR0111LE().findByCondition(searchMsg);

		// 検索結果が1件以上の場合、検索結果のキューBOXをETメッセージ(更新用)に移送
		if (retMsg.length == 0)
		{
			// 検索結果が存在しない場合、データ更新がされないという内容のExceptionをthrow
			//throw new CAANFinderException("MSG00130", "Data is not updated");
			return null;
		}

		// 現在格納数の取得
		int nowKakunoCnt = getNowKaknoCnt(inCBSMsg, inContext, queboxNo);

		// キューBOXのETメッセージ(更新用)
		CAANMsg updETMsg = retMsg[0];

		// 更新値システム日付17桁
		String sysDateTimeStamp = JCRModelCommon.getSysDateTimeStamp();

		// 引き継いだ更新項目の値をETメッセージ(更新用)に設定する
		updETMsg.set(CR0111ETMsg.NOW_KAKNO_CNT, String.valueOf(nowKakunoCnt));
		updETMsg.set(CR0111ETMsg.LAST_KAKNO_DTM, sysDateTimeStamp);
		updETMsg.set(CR0111ETMsg.UPD_DTM, sysDateTimeStamp);
		updETMsg.set(CR0111ETMsg.UPD_OPEACNT, cr0111ETMsg.getString(CR0111ETMsg.UPD_OPEACNT));

		// キューBOXを更新する
		update(updETMsg);

		return updETMsg;

	}

	/**
	 * このエンティティのスキーマの内容を取得します。<br>
	 * @return スキーマのContents
	 */
	@Override
	protected Object[][] getSchemaContents()
	{
		return CR0111ETMsg.getSchemaContents();
	}

	/**
	 * このエンティティのスキーマの名を取得します。<br>
	 * @return スキーマ名
	 */
	@Override
	protected String getSchemaName()
	{
		return CR0111ETMsg.class.getName();
	}

	/**
	 * このエンティティの参照するテーブル名を取得します。<br>
	 * @return テーブル名
	 */
	@Override
	protected String getTableName()
	{
		return CR0111ETMsg.getTableName();
	}

	/**
	 * <p>
	 * 現在格納数取得処理。<br>
	 * 渡されたキューBOX番号にエスカレーションされている対応記録の数を取得します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param queboxNo キューBOX番号
	 * @return 現在格納数
	 */
	private static int getNowKaknoCnt(CAANMsg inCBSMsg, AgentDispatchContext inContext, String queboxNo)
	{
		// コネクション
		Connection con1 = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;

		// リザルトセット
		ResultSet rsltQuery = null;

		/******************** 
		 * SQL文の作成
		 ********************/
		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CR0011ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("     COUNT(CR0011.TAIO_KIROK_NO) AS CNT ")
					.append(" FROM ")
					.append("     CR_T_TAIO_KIROK CR0011 ")
					.append(" WHERE ")
					.append("     CR0011.QUE_BOX_NO = ? ")
					.append(" AND CR0011.TOIAWASE_STAT_CD = '102' ")
					.append(" AND CR0011.MK_FLG = '0' ");

			// パラメータ設定リスト
			List<Object> replaceListCnt = new ArrayList<Object>();
			replaceListCnt.add(queboxNo);

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, JCRejbCR0011SecProc.class, sql_Buff);

			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			for (int idx = 0; idx < replaceListCnt.size(); idx++)
			{
				CAANJDBCUtil.setParam(pstmt, idx + 1, replaceListCnt.get(idx));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			int cnt = 0;

			if (rsltQuery.next())
			{
				cnt = rsltQuery.getInt("CNT");
			}

			return cnt;
		}
		catch (SQLException e)
		{
			throw new CAANRuntimeException(e);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (null != rsltQuery) 
				{
					rsltQuery.close();
				}
				if (null != pstmt) 
				{
					pstmt.close();
				}
				if (null != con1) 
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException e)
			{
				inCBSMsg.set(CR0011ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
}
