/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *  システム名      ：eo顧客基幹システム
 *  モジュール名    ：JKKejbKK0161DBABase
 *  ソースファイル名：JKKejbKK0161DBABase.java
 *  作成者          ：富士通
 *  日付            ：2011年04月21日
 *＜機能概要＞
 *  サービス契約内訳の制約部品クラス
 *＜修正履歴＞
 *  バージョン  修正日      修正者      修正内容
 *  v1.00.00    2011/04/21  富士通      新規作成
 *  v5.00.02    2013/08/22  FJ）竹内    OM-2013-0000577
 *  v5.00.03    2013/09/19  FJ）寺本    OM-2013-0002238
 *  v10.00.00   2014/10/01  FJ）星野    OM-2014-0003013
 **********************************************************************/

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.HashMap;

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 eo.ejb.cbm.entity.KK0161ETMsg;
import eo.ejb.cbm.entity.KK0161LE;
import eo.ejb.common.JKKModelConst;

/**
 * <p>
 * サービス契約内訳の制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0161DBABase extends JKKejbDBABase
{

	/**
	 * <p>
	 * 新しいJKKejbKK0161DBABaseを作成します。
	 * </p>
	 */
	public JKKejbKK0161DBABase()
	{
		super(KK0161ETMsg.class.getName());
	}

	/**
	 * <p>
	 * 世代を管理するカラム名を取得します。
	 * </p>
	 * @return 世代を管理するカラム名
	 */
	protected String getGenerationColumn()
	{
		return KK0161ETMsg.GENE_ADD_DTM;
	}

	/**
	 * <p>
	 * 無効状態を管理するカラム名を取得します。
	 * </p>
	 * @return 無効状態を管理するカラム名
	 */
	protected String getInvalidColumn()
	{
		return KK0161ETMsg.MK_FLG;
	}

	/**
	 * <p>
	 * 予約管理エンティティか判定します。
	 * </p>
	 * @return 予約管理エンティティの場合はtrue
	 */
	protected boolean isReserveMgr()
	{
		return true;
	}

	/**
	 * <p>
	 * 予約適用基準日となるカラム名を取得します。
	 * </p>
	 * @return 予約適用基準日となるカラム名
	 */
	protected String getCurrentColumn()
	{
		return KK0161ETMsg.RSV_APLY_YMD;
	}

	/**
	 * <p>
	 * 予約の状態を管理するエンティティか判定します。
	 * </p>
	 * @return 予約の状態を管理するエンティティの場合はtrue
	 */
	protected boolean isReserveStateMgr()
	{
		return true;
	}

	/**
	 * <p>
	 * 予約の状態を管理するカラム名を取得します。
	 * </p>
	 * @return 予約の状態を管理するカラム名
	 */
	protected String getReserveStateColumn()
	{
		return KK0161ETMsg.RSV_APLY_CD;
	}

	/**
	 * <p>
	 * サービス契約内訳のカレントレコードを取得します
	 * </p>
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @param stdYmd 基準年月日
	 * @return サービス契約内訳番号に紐付くサービス契約内訳のカレントレコード
	 */
	public CAANMsg getKK0161Current(String svcKeiUcwkNo, String stdYmd)
	{
		// 検索条件の設定
		CAANMsg searchKey = new CAANMsg(KK0161ETMsg.class.getName());
		searchKey.set(KK0161ETMsg.SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		searchKey.set(KK0161ETMsg.RSV_APLY_YMD, stdYmd);
		
		CAANMsg outMsg1 = findByCurrent(searchKey);
		if (outMsg1 == null)
		{
			throw new CAANRuntimeException("該当のサービス契約内訳が存在しません。サービス契約内訳番号:" + svcKeiUcwkNo);
		}
		
		return outMsg1;
	}

	/**
	 * <p>
	 * サービス契約内訳のプライマリレコードを取得を行います。
	 * </p>
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @param geneAddDtm 世代登録年月日時分秒
	 * @return サービス契約内訳番号、世代登録年月日時分秒に紐付くサービス契約内訳のプライマリレコード
	 */
	public CAANMsg getKK0161Primary(String svcKeiUcwkNo, String geneAddDtm)
	{
		CAANMsg searchKey = new CAANMsg(KK0161ETMsg.class.getName());
		searchKey.set(KK0161ETMsg.SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		searchKey.set(KK0161ETMsg.GENE_ADD_DTM, geneAddDtm);
		
		CAANMsg outMsg1 = new KK0161LE().findByPrimaryKey(searchKey);
		
		// 検索結果が未設定または無効フラグが"無効"の場合
		if (outMsg1 == null 
				|| JKKModelConst.MK_FLG_MK.equals(outMsg1.getString(KK0161ETMsg.MK_FLG)))
		{
			throw new CAANRuntimeException("該当のサービス契約内訳が存在しません。サービス契約内訳番号:" + svcKeiUcwkNo);
		}
		
		return outMsg1;
	}

	/**
	 * <p>
	 * 解約済、キャンセル済を除外する
	 * </p>
	 * @param inList サービス契約リスト
	 * @return 解約済、キャンセル済を除外したリスト
	 */
	public CAANMsg[] getKK0161OutDsLCl(CAANMsg[] inList)
	{
		ArrayList<CAANMsg> outList = new ArrayList<CAANMsg>();
		for (CAANMsg inMsg:inList)
		{
			if (!JKKModelConst.SVC_KEI_STAT_DSL_ZM.equals(inMsg.getString(KK0161ETMsg.SVC_KEI_UCWK_STAT))
					&& !JKKModelConst.SVC_KEI_STAT_CNCL_ZM.equals(inMsg.getString(KK0161ETMsg.SVC_KEI_UCWK_STAT)))
			{
				outList.add(inMsg);
			}
		}
		
		return outList.toArray(new CAANMsg[0]);
	}

	/**
	 * <p>
	 * サービス契約番号に紐づくサービス契約内訳明細を取得します。
	 * </p>
	 * @param svcKeiNo サービス契約番号
	 * @param searchJknMap 検索条件マップ(key：項目名、value：項目値リスト)<br>
	 *         サービス契約内訳.項目名 IN (項目値リスト)を検索条件とします。個別検索条件がない場合はNULLを設定すること。
	 * @param stdYmd 基準年月日
	 * @return サービス契約内訳明細
	 */
	public CAANMsg[] getKK0161bySvcKei(String svcKeiNo, HashMap<String, String[]> searchJknMap, String stdYmd)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0161ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ").append(getSelectColumnListString(getSelectDBColumnList()));
			sql_Buff.append(" FROM   KK_T_SVC_KEI_UCWK KK0161 ");
			sql_Buff.append(" WHERE  KK0161.SVC_KEI_NO = ? ");
			sql_Buff.append(" AND   (KK0161.SVC_KEI_UCWK_NO, KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM) = ");
			sql_Buff.append("    (SELECT KK0161_GENE.SVC_KEI_UCWK_NO, MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) AS KK0161_MAX ");
			sql_Buff.append("     FROM   KK_T_SVC_KEI_UCWK KK0161_GENE ");
			sql_Buff.append("     WHERE  KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO ");
			sql_Buff.append("     AND    KK0161_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("     AND    KK0161_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("     AND    KK0161_GENE.MK_FLG = '0' ");
			sql_Buff.append("     GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO) ");
			arraylist.add(svcKeiNo);
			arraylist.add(stdYmd);
			
			// 検索条件マップが設定されている場合、IN句で検索条件を設定する。
			sql_Buff = addSearchJknSql(sql_Buff, "KK0161", searchJknMap, true);
			arraylist = addSearchJknParam(arraylist, searchJknMap);

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// バインド変数設定
			for (int iCnt = 0; iCnt < arraylist.size(); iCnt++)
			{
				// バインド変数に設定
				CAANJDBCUtil.setParam(pstmt, ++iPCnt, arraylist.get(iCnt));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 検索データの設定
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery, getSelectMsgColumnList(), 0);

			return outMsg1;
		}
		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);
			}
		}
	}

	/**
	 * <p>
	 * 継続元サービス契約内訳番号に紐づくサービス契約内訳明細を取得します。
	 * </p>
	 * @param keizkMtSvcKeiUcwkNo 継続元サービス契約内訳番号
	 * @param keizkAfKeiChgechuFlg 継続後契約変更手続中フラグ("0":変更手続中でない/"1":変更手続中である、指定なしの場合はNULLを設定すること。)
	 * @param searchJknMap 検索条件マップ(key：項目名、value：項目値リスト)<br>
	 *         サービス契約内訳.項目名 IN (項目値リスト)を検索条件とします。個別検索条件がない場合はNULLを設定すること。
	 * @param stdYmd 基準年月日
	 * @return サービス契約内訳明細
	 */
	public CAANMsg[] getKK0161byKeizkMtSvcKeiUcwk(String keizkMtSvcKeiUcwkNo, String keizkAfKeiChgechuFlg,
			HashMap<String, String[]> searchJknMap, String stdYmd)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0161ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ").append(getSelectColumnListString(getSelectDBColumnList()));
			sql_Buff.append(" FROM   KK_T_SVC_KEI_UCWK KK0161 ");
			sql_Buff.append(" WHERE  KK0161.KEIZK_MT_SVC_KEI_UCWK_NO = ? ");
			arraylist.add(keizkMtSvcKeiUcwkNo);
			
			// 継続後契約変更手続中フラグが設定されている場合
			if (keizkAfKeiChgechuFlg != null && !"".equals(keizkAfKeiChgechuFlg))
			{
				sql_Buff.append(" AND    KK0161.KEIZK_AF_KEI_CHGECHU_FLG = ? ");
				arraylist.add(keizkAfKeiChgechuFlg);
			}
			sql_Buff.append(" AND   (KK0161.SVC_KEI_UCWK_NO, KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM) = ");
			sql_Buff.append("    (SELECT KK0161_GENE.SVC_KEI_UCWK_NO, MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) AS KK0161_MAX ");
			sql_Buff.append("     FROM   KK_T_SVC_KEI_UCWK KK0161_GENE ");
			sql_Buff.append("     WHERE  KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO ");
			sql_Buff.append("     AND    KK0161_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("     AND    KK0161_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("     AND    KK0161_GENE.MK_FLG = '0' ");
			sql_Buff.append("     GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO) ");
			arraylist.add(stdYmd);
			
			// 検索条件マップが設定されている場合、IN句で検索条件を設定する。
			sql_Buff = addSearchJknSql(sql_Buff, "KK0161", searchJknMap, true);
			arraylist = addSearchJknParam(arraylist, searchJknMap);

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// バインド変数設定
			for (int iCnt = 0; iCnt < arraylist.size(); iCnt++)
			{
				// バインド変数に設定
				CAANJDBCUtil.setParam(pstmt, ++iPCnt, arraylist.get(iCnt));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 検索データの設定
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery, getSelectMsgColumnList(), 0);

			return outMsg1;
		}
		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);
			}
		}
	}
	
	/**
	 * <p>
	 * 電話番号２重登録チェック
	 * パラメータの電話番号が他の契約で既に登録されているかを検索する。
	 * </p>
	 * @param svcKeiNo サービス契約番号
	 * @param telNo    電話番号
	 * @param stdYmd   基準年月日
	 * @return 既契約数
	 */
	public long getDubbleTelNoCnt(String svcKeiNo, String telNo, String stdYmd)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;
		
		long retCnt = 0l;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0161ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT COUNT(*) AS CNT ");
			sql_Buff.append(" FROM   KK_T_SVC_KEI KK0081, ");
			sql_Buff.append("        (SELECT KK0081_01.SYSID ");
			sql_Buff.append("                FROM   KK_T_SVC_KEI KK0081_01 ");
			sql_Buff.append("                WHERE  KK0081_01.SVC_KEI_NO = ? ");
			arraylist.add(svcKeiNo);
			sql_Buff.append("                AND   (KK0081_01.SVC_KEI_NO, KK0081_01.RSV_APLY_YMD || KK0081_01.GENE_ADD_DTM) =  ");
			sql_Buff.append("                        (SELECT   KK0081_01_GENE.SVC_KEI_NO, MAX(KK0081_01_GENE.RSV_APLY_YMD || KK0081_01_GENE.GENE_ADD_DTM) AS KK0081_01_MAX  ");
			sql_Buff.append("                         FROM     KK_T_SVC_KEI KK0081_01_GENE  ");
			sql_Buff.append("                         WHERE    KK0081_01_GENE.SVC_KEI_NO = KK0081_01.SVC_KEI_NO  ");
			sql_Buff.append("                         AND      KK0081_01_GENE.RSV_APLY_YMD <= ?  ");
			arraylist.add(stdYmd);
			sql_Buff.append("                         AND      KK0081_01_GENE.RSV_APLY_CD = '2'  ");
			sql_Buff.append("                         AND      KK0081_01_GENE.MK_FLG = '0'  ");
			sql_Buff.append("                         GROUP BY KK0081_01_GENE.SVC_KEI_NO)) KK0081_01 ");
			sql_Buff.append(" WHERE KK0081.SYSID <> KK0081_01.SYSID ");
			sql_Buff.append(" AND   EXISTS (SELECT 1  ");
			sql_Buff.append("               FROM KK_T_SVC_KEI_UCWK KK0161 ");
			sql_Buff.append("               INNER JOIN KK_T_SVKEIUW_EOH_TEL KK0191 ");
			sql_Buff.append("               ON KK0161.SVC_KEI_UCWK_NO = KK0191.SVC_KEI_UCWK_NO ");
			sql_Buff.append("               AND KK0161.GENE_ADD_DTM = KK0191.GENE_ADD_DTM ");
			sql_Buff.append("               WHERE KK0081.SVC_KEI_NO = KK0161.SVC_KEI_NO ");
			sql_Buff.append("               AND   KK0191.TELNO = ? ");
			arraylist.add(telNo);
			sql_Buff.append("               AND   KK0161.SVC_KEI_UCWK_STAT NOT IN ('910', '920') ");
			sql_Buff.append("               AND  (KK0161.SVC_KEI_UCWK_NO, KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM) =  ");
			sql_Buff.append("                      (SELECT   KK0161_GENE.SVC_KEI_UCWK_NO, MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) AS KK0161_MAX  ");
			sql_Buff.append("                       FROM     KK_T_SVC_KEI_UCWK KK0161_GENE  ");
			sql_Buff.append("                       WHERE    KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO  ");
			sql_Buff.append("                       AND      KK0161_GENE.RSV_APLY_YMD <= ?  ");
			arraylist.add(stdYmd);
			sql_Buff.append("                       AND      KK0161_GENE.RSV_APLY_CD = '2'  ");
			sql_Buff.append("                       AND      KK0161_GENE.MK_FLG = '0'  ");
			sql_Buff.append("                       GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO)) ");
			sql_Buff.append(" AND   (KK0081.SVC_KEI_NO, KK0081.RSV_APLY_YMD || KK0081.GENE_ADD_DTM) =  ");
			sql_Buff.append("         (SELECT   KK0081_GENE.SVC_KEI_NO, MAX(KK0081_GENE.RSV_APLY_YMD || KK0081_GENE.GENE_ADD_DTM) AS KK0081_MAX  ");
			sql_Buff.append("          FROM     KK_T_SVC_KEI KK0081_GENE  ");
			sql_Buff.append("          WHERE    KK0081_GENE.SVC_KEI_NO = KK0081.SVC_KEI_NO  ");
			sql_Buff.append("          AND      KK0081_GENE.RSV_APLY_YMD <= ?  ");
			arraylist.add(stdYmd);
			sql_Buff.append("          AND      KK0081_GENE.RSV_APLY_CD = '2'  ");
			sql_Buff.append("          AND      KK0081_GENE.MK_FLG = '0'  ");
			sql_Buff.append("          GROUP BY KK0081_GENE.SVC_KEI_NO) ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// バインド変数設定
			for (int iCnt = 0; iCnt < arraylist.size(); iCnt++)
			{
				// バインド変数に設定
				CAANJDBCUtil.setParam(pstmt, ++iPCnt, arraylist.get(iCnt));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 検索結果が存在する場合
			if (rsltQuery.next())
			{
				retCnt = rsltQuery.getLong("CNT");
			}

			return retCnt;
		}
		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);
			}
		}
	}
	
// v10.00.00 OM-2014-0003013対応 20141001 ADD START
	/**
	 * <p>
	 * 電話番号休止・解約トーキ利用中チェック
	 * パラメータの電話番号が他の契約で休止・解約トーキ中となっているかを検索する。
	 * </p>
	 * @param telNo           電話番号
	 * @param svcKeiUcwkNo    サービス契約内訳番号（null可）
	 * @param stdYmd          基準年月日
	 * @return トーキ中既契約数
	 */
	public long getTelnoDslPauseTokiChuCnt(String telNo, String svcKeiUcwkNo, String stdYmd)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;
		
		long retCnt = 0l;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0161ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT COUNT(1) CNT   ");
			sql_Buff.append(" FROM KK_T_SVC_KEI_UCWK KK0161  ");
			sql_Buff.append(" INNER JOIN KK_T_SVKEIUW_EOH_TEL KK0191  ");
			sql_Buff.append(" ON KK0161.SVC_KEI_UCWK_NO = KK0191.SVC_KEI_UCWK_NO  ");
			sql_Buff.append(" AND KK0161.GENE_ADD_DTM = KK0191.GENE_ADD_DTM  ");
			sql_Buff.append(" WHERE KK0191.TELNO = ?  ");
			arraylist.add(telNo);
			sql_Buff.append(" AND   KK0191.DSL_PAUSE_TOKI_SBT_CD IS NOT NULL ");
			sql_Buff.append(" AND   ( KK0191.DSL_PAUSE_TOKI_END_YMD IS NULL OR KK0191.DSL_PAUSE_TOKI_END_YMD > ? ) ");
			arraylist.add(stdYmd);
			if(svcKeiUcwkNo != null && !svcKeiUcwkNo.trim().isEmpty()){
				sql_Buff.append(" AND   KK0161.SVC_KEI_UCWK_NO <> ? ");
				arraylist.add(svcKeiUcwkNo);
			}
			sql_Buff.append(" AND  (KK0161.SVC_KEI_UCWK_NO, KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM) =   ");
			sql_Buff.append("       (SELECT   KK0161_GENE.SVC_KEI_UCWK_NO, MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) AS KK0161_MAX   ");
			sql_Buff.append("        FROM     KK_T_SVC_KEI_UCWK KK0161_GENE   ");
			sql_Buff.append("        WHERE    KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO   ");
			sql_Buff.append("        AND      KK0161_GENE.RSV_APLY_YMD <= ?   ");
			arraylist.add(stdYmd);
			sql_Buff.append("        AND      KK0161_GENE.RSV_APLY_CD = '2'   ");
			sql_Buff.append("        AND      KK0161_GENE.MK_FLG = '0'   ");
			sql_Buff.append("        GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO) ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// バインド変数設定
			for (int iCnt = 0; iCnt < arraylist.size(); iCnt++)
			{
				// バインド変数に設定
				CAANJDBCUtil.setParam(pstmt, ++iPCnt, arraylist.get(iCnt));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 検索結果が存在する場合
			if (rsltQuery.next())
			{
				retCnt = rsltQuery.getLong("CNT");
			}

			return retCnt;
		}
		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);
			}
		}
	}
	
	/**
	 * <p>
	 * 電話番号移転先開通後トーキ利用中チェック
	 * パラメータの電話番号が他の契約で移転先開通後トーキ中となっているかを検索する。
	 * </p>
	 * @param telNo           電話番号
	 * @param svcKeiUcwkNo    サービス契約内訳番号（null可）
	 * @param stdYmd          基準年月日
	 * @return トーキ中既契約数
	 */
	public long getTelnoItnsOpafTokiChuCnt(String telNo, String svcKeiUcwkNo, String stdYmd)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;
		
		long retCnt = 0l;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0161ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT COUNT(1) CNT   ");
			sql_Buff.append(" FROM KK_T_SVC_KEI_UCWK KK0161  ");
			sql_Buff.append(" INNER JOIN KK_T_SVKEIUW_EOH_TEL KK0191  ");
			sql_Buff.append(" ON KK0161.SVC_KEI_UCWK_NO = KK0191.SVC_KEI_UCWK_NO  ");
			sql_Buff.append(" AND KK0161.GENE_ADD_DTM = KK0191.GENE_ADD_DTM  ");
			sql_Buff.append(" WHERE KK0191.TELNO = ?  ");
			arraylist.add(telNo);
			sql_Buff.append(" AND   KK0191.ITENS_OPAF_TOKI_SBT_CD IS NOT NULL ");
			sql_Buff.append(" AND   ( KK0191.ITENS_OPAF_TOKI_END_YMD IS NULL OR KK0191.ITENS_OPAF_TOKI_END_YMD > ? ) ");
			arraylist.add(stdYmd);
			if(svcKeiUcwkNo != null && !svcKeiUcwkNo.trim().isEmpty()){
				sql_Buff.append(" AND   KK0161.SVC_KEI_UCWK_NO <> ? ");
				arraylist.add(svcKeiUcwkNo);
			}
			sql_Buff.append(" AND  (KK0161.SVC_KEI_UCWK_NO, KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM) =   ");
			sql_Buff.append("       (SELECT   KK0161_GENE.SVC_KEI_UCWK_NO, MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) AS KK0161_MAX   ");
			sql_Buff.append("        FROM     KK_T_SVC_KEI_UCWK KK0161_GENE   ");
			sql_Buff.append("        WHERE    KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO   ");
			sql_Buff.append("        AND      KK0161_GENE.RSV_APLY_YMD <= ?   ");
			arraylist.add(stdYmd);
			sql_Buff.append("        AND      KK0161_GENE.RSV_APLY_CD = '2'   ");
			sql_Buff.append("        AND      KK0161_GENE.MK_FLG = '0'   ");
			sql_Buff.append("        GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO) ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// バインド変数設定
			for (int iCnt = 0; iCnt < arraylist.size(); iCnt++)
			{
				// バインド変数に設定
				CAANJDBCUtil.setParam(pstmt, ++iPCnt, arraylist.get(iCnt));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 検索結果が存在する場合
			if (rsltQuery.next())
			{
				retCnt = rsltQuery.getLong("CNT");
			}

			return retCnt;
		}
		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);
			}
		}
	}
// v10.00.00 OM-2014-0003013対応 20141001 ADD END
}
