/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JCKejbCK0151NumberParts
*	ソースファイル名：JCKejbCK0151NumberParts.java
*	作成者			：富士通
*	日付			：2011年04月04日
*＜機能概要＞
*	指示書採番部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/04/22	富士通		新規作成
*
**********************************************************************/

package eo.ejb.common.edit;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.fujitsu.futurity.model.base.CAANConnectionMgr;
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.JSYejbSucceedDataAccess;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.CK0151ETMsg;
import eo.ejb.common.JCCModelCommon;
import eo.ejb.common.JCKModelCommon;

/**
 * <p>
 * 指示書採番部品クラスです。
 * </p>
 * @author 富士通
 */
public class JCKejbCK0151NumberParts extends JKKejbNumberPartsBase
{
	/** 引継データアクセスキー(指示書番号) */
	private static final String KEY_SJISHONO = "SJISHONO";

	/** 指示書内容枝番用初期採番値 */
	private static final String NAIYO_DEFAULT_SEQ = "1";

	/** 指示書内容枝番用採番限界値 */
	private static final String NAIYO_LIMIT_OVER = "99999";

	/**
	 * コンストラクタです。
	 */
	public JCKejbCK0151NumberParts()
	{
	}

	/**
	 * <p>
	 * 指示書番号の採番を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番された指示書番号
	 */
	public Object getSjishoNo(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 機能コードのチェック（チェックモードの場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// 採番処理

		// シーケンス名
		String sequenceName = "SEQ_SJISHO_NO";
		// 接頭語(作成年月日)
		String prefix = "";
		// シーケンス補正桁数
		int sequenceLength = 7;

		String value = null;

		// Oracleシーケンスによる採番
		value = JCCModelCommon.getFormatedNextSeq(sequenceName, prefix, sequenceLength);
		value = JCKModelCommon.getOpeDate(inMsg) + value;

		// 引継データの設定（指示書番号）
		JSYejbSucceedDataAccess.setSucceedData(KEY_SJISHONO, value);

		return value;
	}

	/**
	 * <p>
	 * 指示書内容枝番の採番を行います（登録時用）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番された指示書内容枝番
	 */
	public Object getSjishoNaiyoSeq(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 機能コードのチェック（チェックモードの場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// 引継データの取得（指示書番号）
		Object sjishoNo = JSYejbSucceedDataAccess.getSucceedData(KEY_SJISHONO);

		// 指示書内容枝番の採番を行う
		return getSjishoNaiyoSeqForUpdate(inMsg, inContext, sjishoNo);
	}

	/**
	 * <p>
	 * 指示書内容枝番の採番を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param sjishoNo 指示書番号
	 * @return 採番された指示書内容枝番
	 */
	private Object getSjishoNaiyoSeqForUpdate(CAANMsg inMsg, AgentDispatchContext inContext, Object sjishoNo)
	{
		// 引継データの取得（指示書内容枝番）
		String value = (String)JSYejbSucceedDataAccess.getSucceedData((String)sjishoNo);

		String sjishoNaiyoSeq = null;

		if (value != null)
		{
			// 指示書内容枝番が設定されている場合は1を加算
			sjishoNaiyoSeq = String.valueOf(Integer.parseInt(value) + 1);

			// 引継データの設定（指示書内容枝番）
			JSYejbSucceedDataAccess.setSucceedData((String)sjishoNo, sjishoNaiyoSeq);

			return sjishoNaiyoSeq;
		}

		// 指示書番号に紐付く最大の指示書内容枝番を取得する
		String maxSjishoNaiyoSeq = getMaxSjishoNaiyoSeq(inMsg, inContext, sjishoNo.toString());

		if (null == maxSjishoNaiyoSeq)
		{
			// 指示書内容枝番が取得できなかった場合は、デフォルト値とする
			sjishoNaiyoSeq = NAIYO_DEFAULT_SEQ;
		}
		else if (NAIYO_LIMIT_OVER.equals(maxSjishoNaiyoSeq))
		{
			// 限界値だった場合は採番しない
			return null;
		}
		else
		{
			// それ以外の場合は取得値に1を加算する
			sjishoNaiyoSeq = String.valueOf(Integer.parseInt(maxSjishoNaiyoSeq) + 1);
		}

		// 引継データの設定（指示書内容枝番）
		JSYejbSucceedDataAccess.setSucceedData((String)sjishoNo, sjishoNaiyoSeq);

		return sjishoNaiyoSeq;
	}

	/**
	 * <p>
	 * 指定された指示書番号に紐付く最大の指示書内容枝番を取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param sjishoNo 指示書番号
	 * @return 指示書番号単位で最大の指示書内容枝番
	 */
	private String getMaxSjishoNaiyoSeq(CAANMsg inMsg, AgentDispatchContext inContext, String sjishoNo)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		// 返却用変数
		String maxMskmshoNo = null;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CK0151ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append("SELECT  ")
					.append("    MAX(CK0151.SJISHO_NAIYO_SEQ) AS MAX_SJISHO_NAIYO_SEQ  ")
					.append("FROM  ")
					.append("    CK_T_SJISHO CK0151  ")
					.append("WHERE  ")
					.append("    CK0151.SJISHO_NO = ?  ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定(指示書番号)
			CAANJDBCUtil.setParam(pstmt, 1, sjishoNo);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 件数を返却する
			if (rsltQuery.next())
			{
				maxMskmshoNo = rsltQuery.getString("MAX_SJISHO_NAIYO_SEQ");
			}

		}
		catch(SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if(rsltQuery != null)
				{
					rsltQuery.close();
				}
				if(pstmt != null)
				{
					pstmt.close();
				}
				if(con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}

		return maxMskmshoNo;
	}

}
