/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbKK0481SecProc
*	ソースファイル名：JKKejbKK0481SecProc.java
*	作成者			：FJ
*	日付			：2012年12月25日
*＜機能概要＞
*	割引サービス対象契約に対する副次処理を行う部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2012/12/25	FJ			新規作成
*	v7.00.00	2013/11/20	FJ)大山		ANK-1578-00-00
*
********************************************************************************/

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 java.util.Map;

import com.fujitsu.futurity.common.JCMConstants;
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.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK0161ETMsg;
import eo.ejb.cbm.entity.KK0341ETMsg;
import eo.ejb.cbm.entity.KK0351ETMsg;
import eo.ejb.cbm.entity.KK0401ETMsg;
import eo.ejb.cbm.entity.KK0441ETMsg;
import eo.ejb.cbm.entity.KK0481ETMsg;
import eo.ejb.cbm.entity.KK0851ETMsg;
import eo.ejb.cbm.entity.KK2811ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0451D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451D010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0451D010CBSMsg4List;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JSYejbSysDate;

/**
 * <p>
 * 割引サービス対象契約に対する副次処理部品クラスです。
 * </p>
 * @author 富士通
 *
 */
public class JKKejbKK0481SecProc extends JKKejbKK0481DBABase
{

	/** データなし(0件) */
	private static final int NODATA = 0;

	/** IN句上限(1000件) */
	private static final int MAXIN = 1000;

	/** 親契約識別コード（サービス契約） */
	private static final String OYA_KEI_CD_SVC = "01";

	/** 親契約識別コード（サービス契約内訳） */
	private static final String OYA_KEI_CD_UCWK = "03";

	/** 親契約識別コード（オプションサービス契約） */
	private static final String OYA_KEI_CD_OP = "04";

	/** 親契約識別コード（サブオプションサービス契約） */
	private static final String OYA_KEI_CD_SBOP = "05";

	/** 親契約識別コード（機器提供サービス契約） */
	private static final String OYA_KEI_CD_KKTK = "06";

	/** 親契約識別コード（請求オプションサービス契約） */
	private static final String OYA_KEI_CD_SEIOP = "07";

	/** 親契約識別コード（機器オプションサービス契約） */
	private static final String OYA_KEI_CD_KKOP = "10";

	/** 無期限年月日 */
	private static final String LAST_YMD = "20991231";

	/** セパレート文字列 */
	private static final String COL_SEP = ",";

	/** フラグ有効 */
	private static final String FLG_YUKO = "0";

	/**
	 * コンストラクタです。
	 */
	public JKKejbKK0481SecProc()
	{
		super();
	}
	
	/**
	 * <p>
	 * 割引サービス対象契約（値引対象）登録処理を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void createNbWribSvcTgKei(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// サービス契約番号マップ
		HashMap<String, String> svcKeiMap = new HashMap<String, String>();

		// 割引サービス対象契約明細からマップ情報を設定する
		for (CAANMsg srWribSvctgMsg: inCBSMsg.getCAANMsgList(EKK0451D010CBSMsg.EKK0451D010CBSMSG1LIST))
		{
			// 対象契約識別コードを取得
			String tgKeiSkbtCd = srWribSvctgMsg.getString(EKK0451D010CBSMsg1List.TG_KEI_SKBT_CD);

			if (OYA_KEI_CD_SVC.equals(tgKeiSkbtCd))
			{
				// 対象契約識別コードが"01"（サービス契約）の場合、サービス契約番号マップに追加
				svcKeiMap.put(srWribSvctgMsg.getString(EKK0451D010CBSMsg1List.SVC_KEI_NO), null);
			}
		}

		// サービス契約件数判定
		if (NODATA == svcKeiMap.size())
		{
			// 0件の場合、処理終了
			return;
		}

		//-------------------------------------------------------------------------------------------------------------------------
		// 運用日付取得
		//-------------------------------------------------------------------------------------------------------------------------
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		//-------------------------------------------------------------------------------------------------------------------------
		// サービス契約内訳明細取得
		//-------------------------------------------------------------------------------------------------------------------------
		CAANMsg[] chkUcwkMsgList = getKK0161(inContext, svcKeiMap, opeDate);

		// サービス契約内訳番号マップ
		HashMap<String, String> svcKeiUcwkMap = new HashMap<String, String>();

		// サービス契約内訳明細からサービス契約内訳番号マップ情報を設定する
		for (CAANMsg chkUcwkMsg: chkUcwkMsgList)
		{
			// サービス契約内訳番号マップに追加
			svcKeiUcwkMap.put(chkUcwkMsg.getString(KK0161ETMsg.SVC_KEI_UCWK_NO), null);
		}

		//-------------------------------------------------------------------------------------------------------------------------
		// オプションサービス契約明細取得
		//-------------------------------------------------------------------------------------------------------------------------
		CAANMsg[] chkOpMsgList1 = getKK0351bySvcKei(inContext, svcKeiMap, opeDate);
		CAANMsg[] chkOpMsgList2 = getKK0351bySvcKeiUcwk(inContext, svcKeiUcwkMap, opeDate);

		// オプションサービス契約明細集約
		ArrayList<CAANMsg> chkOpMsgArray = new ArrayList<CAANMsg>();
		for (CAANMsg chkOpMsg: chkOpMsgList1)
		{
			chkOpMsgArray.add(chkOpMsg);
		}
		for (CAANMsg chkOpMsg: chkOpMsgList2)
		{
			chkOpMsgArray.add(chkOpMsg);
		}
		CAANMsg[] chkOpMsgList = chkOpMsgArray.toArray(new CAANMsg[0]);

		// オプションサービス契約番号マップ
		HashMap<String, String> opSvcKeiMap = new HashMap<String, String>();

		// オプションサービス契約明細からオプションサービス契約番号マップ情報を設定する
		for (CAANMsg chkOpMsg: chkOpMsgList)
		{
			// オプションサービス契約番号マップに追加
			opSvcKeiMap.put(chkOpMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO), null);
		}

		//-------------------------------------------------------------------------------------------------------------------------
		// サブオプションサービス契約明細取得
		//-------------------------------------------------------------------------------------------------------------------------
		CAANMsg[] chkSbOpMsgList = getKK0401(inContext, opSvcKeiMap, opeDate);

		// サブオプションサービス契約番号マップ
		HashMap<String, String> sbOpSvcKeiMap = new HashMap<String, String>();

		// サブオプションサービス契約明細からサブオプションサービス契約番号マップ情報を設定する
		for (CAANMsg chkSbOpMsg: chkSbOpMsgList)
		{
			// サブオプションサービス契約番号マップに追加
			sbOpSvcKeiMap.put(chkSbOpMsg.getString(KK0401ETMsg.OP_SVC_KEI_NO) + COL_SEP + chkSbOpMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO), null);
		}

		//-------------------------------------------------------------------------------------------------------------------------
		// 機器提供サービス契約明細取得
		//-------------------------------------------------------------------------------------------------------------------------
		CAANMsg[] chkKktkMsgList1 = getKK0341bySvcKei(inContext, svcKeiMap, opeDate);
		CAANMsg[] chkKktkMsgList2 = getKK0341bySvcKeiKaisenUcwk(inContext, svcKeiMap, opeDate);
		CAANMsg[] chkKktkMsgList3 = getKK0341bySvcKeiUcwk(inContext, svcKeiUcwkMap, opeDate);
		CAANMsg[] chkKktkMsgList4 = getKK0341byOpSvcKei(inContext, opSvcKeiMap, opeDate);

		// 機器提供サービス契約明細集約
		ArrayList<CAANMsg> chkKktkMsgArray = new ArrayList<CAANMsg>();
		for (CAANMsg chkKktkMsg: chkKktkMsgList1)
		{
			chkKktkMsgArray.add(chkKktkMsg);
		}
		for (CAANMsg chkKktkMsg: chkKktkMsgList2)
		{
			chkKktkMsgArray.add(chkKktkMsg);
		}
		for (CAANMsg chkKktkMsg: chkKktkMsgList3)
		{
			chkKktkMsgArray.add(chkKktkMsg);
		}
		for (CAANMsg chkKktkMsg: chkKktkMsgList4)
		{
			chkKktkMsgArray.add(chkKktkMsg);
		}
		CAANMsg[] chkKktkMsgList = chkKktkMsgArray.toArray(new CAANMsg[0]);

		// 機器提供サービス契約番号マップ
		HashMap<String, String> kktkSvcKeiMap = new HashMap<String, String>();

		// 機器提供サービス契約明細から機器提供サービス契約番号マップ情報を設定する
		for (CAANMsg chkKktkMsg: chkKktkMsgList)
		{
			// 機器提供サービス契約番号マップに追加
			kktkSvcKeiMap.put(chkKktkMsg.getString(KK0341ETMsg.KKTK_SVC_KEI_NO), null);
		}

		//-------------------------------------------------------------------------------------------------------------------------
		// 請求オプションサービス契約明細取得
		//-------------------------------------------------------------------------------------------------------------------------
		CAANMsg[] chkSeiOpMsgList = getKK0441bySvcKei(inContext, svcKeiMap, opeDate);

		// 請求オプションサービス契約番号マップ
		HashMap<String, String> seiOpSvcMap = new HashMap<String, String>();

		// 請求オプションサービス契約明細から請求オプションサービス契約番号マップ情報を設定する
		for (CAANMsg chkSeiOpMsg: chkSeiOpMsgList)
		{
			// 請求オプションサービス契約番号マップに追加
			seiOpSvcMap.put(chkSeiOpMsg.getString(KK0441ETMsg.SEIOPSVC_KEI_NO), null);
		}

		//-------------------------------------------------------------------------------------------------------------------------
		// 機器オプションサービス契約明細取得
		//-------------------------------------------------------------------------------------------------------------------------
		CAANMsg[] chkKKOpMsgList = getKK2811bySvcKei(inContext, svcKeiMap, opeDate);

		// 機器オプションサービス契約番号マップ
		HashMap<String, String> kkOpSvcMap = new HashMap<String, String>();

		// 機器オプションサービス契約明細から機器オプションサービス契約番号マップ情報を設定する
		for (CAANMsg chkKKOpMsg: chkKKOpMsgList)
		{
			// 機器オプションサービス契約番号マップに追加
			kkOpSvcMap.put(chkKKOpMsg.getString(KK2811ETMsg.KKOP_SVC_KEI_NO), null);
		}

		//-------------------------------------------------------------------------------------------------------------------------
		// 割引サービス対象サービス明細取得（値引対象）
		//-------------------------------------------------------------------------------------------------------------------------
		CAANMsg[] nbMsgList = getKK0851(inContext, inCBSMsg.getString(EKK0451D010CBSMsg.WRIB_SVC_CD), opeDate);

		// 割引サービス対象サービス（値引対象）件数判定
		if (NODATA == nbMsgList.length)
		{
			// 0件の場合、処理終了
			return;
		}

		//-------------------------------------------------------------------------------------------------------------------------
		// 値引対象突合
		//-------------------------------------------------------------------------------------------------------------------------
		ArrayList<CAANMsg> nbWribSvctgArray = new ArrayList<CAANMsg>();

		// サービス契約内訳明細と突合
		for (CAANMsg chkUcwkMsg: chkUcwkMsgList)
		{
			String key = chkUcwkMsg.getString(KK0161ETMsg.SVC_KEI_UCWK_NO);
			if ( key.equals(svcKeiUcwkMap.get(key)) )
			{
				// KeyとValueが一致している場合、突合済のため、スキップ
				continue;
			}
			svcKeiUcwkMap.put(key, key);

			for (CAANMsg nbMsg: nbMsgList)
			{
				if ( false == isMatchUcwk(chkUcwkMsg, nbMsg) )
				{
					// 突合結果がアンマッチの場合、スキップ
					continue;
				}

				// 割引サービス対象契約（値引対象）情報を設定（上り）
				nbWribSvctgArray.add(setEKK0451D010CBSMsg4List(OYA_KEI_CD_UCWK, key, nbMsg.getString(KK0851ETMsg.WRIB_SVC_TRGT_SVC_CD)));
			}
		}

		// オプションサービス契約明細と突合
		for (CAANMsg chkOpMsg: chkOpMsgList)
		{
			String key = chkOpMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO);
			if ( key.equals(opSvcKeiMap.get(key)) )
			{
				// KeyとValueが一致している場合、突合済のため、スキップ
				continue;
			}
			opSvcKeiMap.put(key, key);

			for (CAANMsg nbMsg: nbMsgList)
			{
				if ( false == isMatchOp(chkOpMsg, nbMsg) )
				{
					// 突合結果がアンマッチの場合、スキップ
					continue;
				}

				// 割引サービス対象契約（値引対象）情報を設定（上り）
				nbWribSvctgArray.add(setEKK0451D010CBSMsg4List(OYA_KEI_CD_OP, key, nbMsg.getString(KK0851ETMsg.WRIB_SVC_TRGT_SVC_CD)));
			}
		}

		// サブオプションサービス契約明細と突合
		for (CAANMsg chkSbOpMsg: chkSbOpMsgList)
		{
			String key = chkSbOpMsg.getString(KK0401ETMsg.OP_SVC_KEI_NO) + COL_SEP + chkSbOpMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO);
			if ( key.equals(sbOpSvcKeiMap.get(key)) )
			{
				// KeyとValueが一致している場合、突合済のため、スキップ
				continue;
			}
			sbOpSvcKeiMap.put(key, key);

			for (CAANMsg nbMsg: nbMsgList)
			{
				if ( false == isMatchSbOp(chkSbOpMsg, nbMsg) )
				{
					// 突合結果がアンマッチの場合、スキップ
					continue;
				}

				// 割引サービス対象契約（値引対象）情報を設定（上り）
				nbWribSvctgArray.add(setEKK0451D010CBSMsg4List(OYA_KEI_CD_SBOP, key, nbMsg.getString(KK0851ETMsg.WRIB_SVC_TRGT_SVC_CD)));
			}
		}

		// 機器提供サービス契約明細と突合
		for (CAANMsg chkKktkMsg: chkKktkMsgList)
		{
			String key = chkKktkMsg.getString(KK0341ETMsg.KKTK_SVC_KEI_NO);
			if ( key.equals(kktkSvcKeiMap.get(key)) )
			{
				// KeyとValueが一致している場合、突合済のため、スキップ
				continue;
			}
			kktkSvcKeiMap.put(key, key);

			for (CAANMsg nbMsg: nbMsgList)
			{
				if ( false == isMatchKktk(chkKktkMsg, nbMsg) )
				{
					// 突合結果がアンマッチの場合、スキップ
					continue;
				}

				// 割引サービス対象契約（値引対象）情報を設定（上り）
				nbWribSvctgArray.add(setEKK0451D010CBSMsg4List(OYA_KEI_CD_KKTK, key, nbMsg.getString(KK0851ETMsg.WRIB_SVC_TRGT_SVC_CD)));
				// レコードロックを入れたい
			}
		}

		// 請求オプションサービス契約明細と突合
		for (CAANMsg chkSeiOpMsg: chkSeiOpMsgList)
		{
			String key = chkSeiOpMsg.getString(KK0441ETMsg.SEIOPSVC_KEI_NO);
			if ( key.equals(seiOpSvcMap.get(key)) )
			{
				// KeyとValueが一致している場合、突合済のため、スキップ
				continue;
			}
			seiOpSvcMap.put(key, key);

			for (CAANMsg nbMsg: nbMsgList)
			{
				if ( false == isMatchSeiOp(chkSeiOpMsg, nbMsg) )
				{
					// 突合結果がアンマッチの場合、スキップ
					continue;
				}

				// 割引サービス対象契約（値引対象）情報を設定（上り）
				nbWribSvctgArray.add(setEKK0451D010CBSMsg4List(OYA_KEI_CD_SEIOP, key, nbMsg.getString(KK0851ETMsg.WRIB_SVC_TRGT_SVC_CD)));
				// レコードロックを入れたい
			}
		}

		// 機器オプションサービス契約明細と突合
		for (CAANMsg chkKKOpMsg: chkKKOpMsgList)
		{
			String key = chkKKOpMsg.getString(KK2811ETMsg.KKOP_SVC_KEI_NO);
			if ( key.equals(kkOpSvcMap.get(key)) )
			{
				// KeyとValueが一致している場合、突合済のため、スキップ
				continue;
			}
			kkOpSvcMap.put(key, key);

			for (CAANMsg nbMsg: nbMsgList)
			{
				if ( false == isMatcKKOp(chkKKOpMsg, nbMsg) )
				{
					// 突合結果がアンマッチの場合、スキップ
					continue;
				}

				// 割引サービス対象契約（値引対象）情報を設定（上り）
				nbWribSvctgArray.add(setEKK0451D010CBSMsg4List(OYA_KEI_CD_KKOP, key, nbMsg.getString(KK0851ETMsg.WRIB_SVC_TRGT_SVC_CD)));
				// レコードロックを入れたい
			}
		}

		//-------------------------------------------------------------------------------------------------------------------------
		// 割引サービス対象契約（値引対象）登録
		//-------------------------------------------------------------------------------------------------------------------------
		CAANMsg[] nbWribSvctgMsgList = nbWribSvctgArray.toArray(new CAANMsg[0]);
		for (CAANMsg nbWribSvctgMsg: nbWribSvctgMsgList)
		{
			// 割引サービス対象契約（値引対象）作成
			CAANMsg msgKK0481 = new CAANMsg(KK0481ETMsg.class.getName());

			// EKK0451D010CBSMsgの情報を元に設定
			msgKK0481.set(KK0481ETMsg.WRIB_SVC_KEI_NO, inCBSMsg.getString(EKK0451D010CBSMsg.WRIB_SVC_KEI_NO));

			// 採番値を設定
			msgKK0481.set(KK0481ETMsg.WRIB_SVC_TRGT_KEI_NO, JKKModelCommon.getWribSvcTrgtKeiNoKK0481(inCBSMsg, inContext));
			msgKK0481.set(KK0481ETMsg.GENE_ADD_DTM, JSYejbSysDate.getDate("YYYYMMDDHHMMSSSSS"));

			// EKK0451D010CBSMsg4Listの情報を元に設定
			msgKK0481.set(KK0481ETMsg.TG_KEI_SKBT_CD, nbWribSvctgMsg.getString(EKK0451D010CBSMsg4List.NB_TG_KEI_SKBT_CD));
			msgKK0481.set(KK0481ETMsg.SVC_KEI_NO, nbWribSvctgMsg.getString(EKK0451D010CBSMsg4List.NB_SVC_KEI_NO));
			msgKK0481.set(KK0481ETMsg.SVC_KEI_UCWK_NO, nbWribSvctgMsg.getString(EKK0451D010CBSMsg4List.NB_SVC_KEI_UCWK_NO));
			msgKK0481.set(KK0481ETMsg.OP_SVC_KEI_NO, nbWribSvctgMsg.getString(EKK0451D010CBSMsg4List.NB_OP_SVC_KEI_NO));
			msgKK0481.set(KK0481ETMsg.SBOP_SVC_KEI_NO, nbWribSvctgMsg.getString(EKK0451D010CBSMsg4List.NB_SBOP_SVC_KEI_NO));
			msgKK0481.set(KK0481ETMsg.KKTK_SVC_KEI_NO, nbWribSvctgMsg.getString(EKK0451D010CBSMsg4List.NB_KKTK_SVC_KEI_NO));
			msgKK0481.set(KK0481ETMsg.SEIOPSVC_KEI_NO, nbWribSvctgMsg.getString(EKK0451D010CBSMsg4List.NB_SEIOPSVC_KEI_NO));
			msgKK0481.set(KK0481ETMsg.WRIB_SVC_TRGT_SVC_CD, nbWribSvctgMsg.getString(EKK0451D010CBSMsg4List.NB_WRIB_SVC_TRGT_SVC_CD));
			msgKK0481.set(KK0481ETMsg.KKOP_SVC_KEI_NO, nbWribSvctgMsg.getString(EKK0451D010CBSMsg4List.NB_KKOP_SVC_KEI_NO));

			// nullを設定
			msgKK0481.setNull(KK0481ETMsg.RLS_YMD);

			// 固定値を設定 : EKK0451D010CBSMsg1ListではINPUT項目だが、画面で渡している情報と一致するため、整合する
			msgKK0481.set(KK0481ETMsg.SET_ADD_YMD, opeDate);
			msgKK0481.set(KK0481ETMsg.WRISVC_TG_KEI_TSTAYMD, opeDate);
			msgKK0481.set(KK0481ETMsg.WRISVC_TG_KEI_TENDYMD, LAST_YMD);

			// 共通部を設定
			msgKK0481.set(KK0481ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
			msgKK0481.set(KK0481ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
			msgKK0481.set(KK0481ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
			msgKK0481.set(KK0481ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
			msgKK0481.set(KK0481ETMsg.MK_FLG, FLG_YUKO);

			// 作成処理
			JKKejbDBAUtil dba = new JKKejbDBAUtil(inCBSMsg);
			dba.create(msgKK0481);

			// 割引サービス対象契約（値引対象）情報を設定（下り）
			nbWribSvctgMsg.set(EKK0451D010CBSMsg4List.NB_WRIB_SVC_TRGT_KEI_NO, msgKK0481.getString(KK0481ETMsg.WRIB_SVC_TRGT_KEI_NO));
			nbWribSvctgMsg.set(EKK0451D010CBSMsg4List.NB_KK0481_GENE_ADD_DTM, msgKK0481.getString(KK0481ETMsg.GENE_ADD_DTM));
			nbWribSvctgMsg.set(EKK0451D010CBSMsg4List.NB_SET_ADD_YMD, msgKK0481.getString(KK0481ETMsg.SET_ADD_YMD));
			nbWribSvctgMsg.set(EKK0451D010CBSMsg4List.NB_WRISVC_TG_KEI_TSTAYMD, msgKK0481.getString(KK0481ETMsg.WRISVC_TG_KEI_TSTAYMD));
			nbWribSvctgMsg.set(EKK0451D010CBSMsg4List.NB_WRISVC_TG_KEI_TENDYMD, msgKK0481.getString(KK0481ETMsg.WRISVC_TG_KEI_TENDYMD));
		}

		//-------------------------------------------------------------------------------------------------------------------------
		// 割引サービス対象契約明細（値引対象）を設定
		//-------------------------------------------------------------------------------------------------------------------------
		inCBSMsg.set(EKK0451D010CBSMsg.EKK0451D010CBSMSG4LIST, nbWribSvctgMsgList);
	}

	/**
	 * <p>
	 * 割引サービス対象契約（値引対象）情報を設定します（上り）。
	 * </p>
	 * @param tgKeiSkbtCd 対象契約識別コード
	 * @param keiNo 契約番号
	 * @param wribSvcTrgtSvcCd 割引サービス対象サービスコード
	 * @return 割引サービス対象契約（値引対象）情報
	 */
	private CAANMsg setEKK0451D010CBSMsg4List(String tgKeiSkbtCd, String keiNo, String wribSvcTrgtSvcCd)
	{
		CAANMsg outMsg = new CAANMsg(EKK0451D010CBSMsg4List.class.getName());

		// 対象契約識別コードを設定
		outMsg.set(EKK0451D010CBSMsg4List.NB_TG_KEI_SKBT_CD, tgKeiSkbtCd);

		// 各種契約番号にNullを設定
		outMsg.setNull(EKK0451D010CBSMsg4List.NB_SVC_KEI_NO);
		outMsg.setNull(EKK0451D010CBSMsg4List.NB_SVC_KEI_UCWK_NO);
		outMsg.setNull(EKK0451D010CBSMsg4List.NB_OP_SVC_KEI_NO);
		outMsg.setNull(EKK0451D010CBSMsg4List.NB_SBOP_SVC_KEI_NO);
		outMsg.setNull(EKK0451D010CBSMsg4List.NB_KKTK_SVC_KEI_NO);
		outMsg.setNull(EKK0451D010CBSMsg4List.NB_SEIOPSVC_KEI_NO);

		// 対象契約識別コードごとに適切な契約番号を設定
		if ( OYA_KEI_CD_SVC.equals(tgKeiSkbtCd) )
		{
			// 対象契約識別コードがサービス契約の場合
			outMsg.set(EKK0451D010CBSMsg4List.NB_SVC_KEI_NO, keiNo);
		}
		else if ( OYA_KEI_CD_UCWK.equals(tgKeiSkbtCd) )
		{
			// 対象契約識別コードがサービス契約内訳の場合
			outMsg.set(EKK0451D010CBSMsg4List.NB_SVC_KEI_UCWK_NO, keiNo);
		}
		else if ( OYA_KEI_CD_OP.equals(tgKeiSkbtCd) )
		{
			// 対象契約識別コードがオプションサービス契約の場合
			outMsg.set(EKK0451D010CBSMsg4List.NB_OP_SVC_KEI_NO, keiNo);
		}
		else if ( OYA_KEI_CD_SBOP.equals(tgKeiSkbtCd) )
		{
			// 対象契約識別コードがサブオプションサービス契約の場合
			outMsg.set(EKK0451D010CBSMsg4List.NB_OP_SVC_KEI_NO, keiNo.split(COL_SEP)[0]);
			outMsg.set(EKK0451D010CBSMsg4List.NB_SBOP_SVC_KEI_NO, keiNo.split(COL_SEP)[1]);
		}
		else if ( OYA_KEI_CD_KKTK.equals(tgKeiSkbtCd) )
		{
			// 対象契約識別コードが機器提供サービス契約の場合
			outMsg.set(EKK0451D010CBSMsg4List.NB_KKTK_SVC_KEI_NO, keiNo);
		}
		else if ( OYA_KEI_CD_SEIOP.equals(tgKeiSkbtCd) )
		{
			// 対象契約識別コードが請求オプションサービス契約の場合
			outMsg.set(EKK0451D010CBSMsg4List.NB_SEIOPSVC_KEI_NO, keiNo);
		}
		else if ( OYA_KEI_CD_KKOP.equals(tgKeiSkbtCd) )
		{
			// 対象契約識別コードが請求オプションサービス契約の場合
			outMsg.set(EKK0451D010CBSMsg4List.NB_KKOP_SVC_KEI_NO, keiNo);
		}

		// 割引サービス対象サービスコードを設定
		outMsg.set(EKK0451D010CBSMsg4List.NB_WRIB_SVC_TRGT_SVC_CD, wribSvcTrgtSvcCd);

		// 割引サービス対象契約（値引対象）情報返却
		return outMsg;
	}

	/**
	 * <p>
	 * サービス契約内訳情報と割引サービス対象サービス情報（値引対象）を突合します。
	 * </p>
	 * @param chkUcwkMsg サービス契約内訳情報
	 * @param nbMsgList 割引サービス対象サービス情報（値引対象）
	 * @return 突合結果(true:マッチ, false:アンマッチ)
	 */
	private boolean isMatchUcwk(CAANMsg chkUcwkMsg, CAANMsg nbMsg)
	{
		if ( null != nbMsg.getString(KK0851ETMsg.PPLAN_CD) )
		{
			// 料金プランコードがnull以外の場合
			if ( nbMsg.getString(KK0851ETMsg.PPLAN_CD).equals(chkUcwkMsg.getString(KK0161ETMsg.PPLAN_CD)) )
			{
				// 料金プランコードが一致
				return true;
			}
			else
			{
				// 料金プランコードが不一致
				return false;
			}
		}

		if ( null != nbMsg.getString(KK0851ETMsg.PCRS_CD) )
		{
			// 料金コースコードがnull以外の場合
			if ( nbMsg.getString(KK0851ETMsg.PCRS_CD).equals(chkUcwkMsg.getString(KK0161ETMsg.PCRS_CD)) )
			{
				// 料金コースコードが一致
				return true;
			}
			else
			{
				// 料金コースコードが不一致
				return false;
			}
		}

		// 全項目nullの場合
		return false;
	}

	/**
	 * <p>
	 * オプションサービス契約情報と割引サービス対象サービス情報（値引対象）を突合します。
	 * </p>
	 * @param chkOpMsg オプションサービス契約情報
	 * @param nbMsgList 割引サービス対象サービス情報（値引対象）
	 * @return 突合結果(true:マッチ, false:アンマッチ)
	 */
	private boolean isMatchOp(CAANMsg chkOpMsg, CAANMsg nbMsg)
	{
		if ( null != nbMsg.getString(KK0851ETMsg.PPLAN_CD) )
		{
			// 料金プランコードがnull以外の場合
			if ( nbMsg.getString(KK0851ETMsg.PPLAN_CD).equals(chkOpMsg.getString(KK0351ETMsg.PPLAN_CD)) )
			{
				// 料金プランコードが一致
				return true;
			}
			else
			{
				// 料金プランコードが不一致
				return false;
			}
		}

		if ( null != nbMsg.getString(KK0851ETMsg.PCRS_CD) )
		{
			// 料金コースコードがnull以外の場合
			if ( nbMsg.getString(KK0851ETMsg.PCRS_CD).equals(chkOpMsg.getString(KK0351ETMsg.PCRS_CD)) )
			{
				// 料金コースコードが一致
				return true;
			}
			else
			{
				// 料金コースコードが不一致
				return false;
			}
		}

		if ( null != nbMsg.getString(KK0851ETMsg.OP_SVC_CD) )
		{
			// オプションサービスコードがnull以外の場合
			if ( nbMsg.getString(KK0851ETMsg.OP_SVC_CD).equals(chkOpMsg.getString(KK0351ETMsg.OP_SVC_CD)) )
			{
				// オプションサービスコードが一致
				return true;
			}
			else
			{
				// オプションサービスコードが不一致
				return false;
			}
		}

		// 全項目nullの場合
		return false;
	}

	/**
	 * <p>
	 * サブオプションサービス契約情報と割引サービス対象サービス情報（値引対象）を突合します。
	 * </p>
	 * @param chkSbOpMsg サブオプションサービス契約情報
	 * @param nbMsgList 割引サービス対象サービス情報（値引対象）
	 * @return 突合結果(true:マッチ, false:アンマッチ)
	 */
	private boolean isMatchSbOp(CAANMsg chkSbOpMsg, CAANMsg nbMsg)
	{
		if ( null != nbMsg.getString(KK0851ETMsg.PPLAN_CD) )
		{
			// 料金プランコードがnull以外の場合
			if ( nbMsg.getString(KK0851ETMsg.PPLAN_CD).equals(chkSbOpMsg.getString(KK0401ETMsg.PPLAN_CD)) )
			{
				// 料金プランコードが一致
				return true;
			}
			else
			{
				// 料金プランコードが不一致
				return false;
			}
		}

		if ( null != nbMsg.getString(KK0851ETMsg.PCRS_CD) )
		{
			// 料金コースコードがnull以外の場合
			if ( nbMsg.getString(KK0851ETMsg.PCRS_CD).equals(chkSbOpMsg.getString(KK0401ETMsg.PCRS_CD)) )
			{
				// 料金コースコードが一致
				return true;
			}
			else
			{
				// 料金コースコードが不一致
				return false;
			}
		}

		if ( null != nbMsg.getString(KK0851ETMsg.SBOP_SVC_CD) )
		{
			// サブオプションサービスコードがnull以外の場合
			if ( nbMsg.getString(KK0851ETMsg.SBOP_SVC_CD).equals(chkSbOpMsg.getString(KK0401ETMsg.SBOP_SVC_CD)) )
			{
				// サブオプションサービスコードが一致
				return true;
			}
			else
			{
				// サブオプションサービスコードが不一致
				return false;
			}
		}

		// 全項目nullの場合
		return false;
	}

	/**
	 * <p>
	 * 機器提供サービス契約情報と割引サービス対象サービス情報（値引対象）を突合します。
	 * </p>
	 * @param chkKktkMsg 機器提供サービス契約情報
	 * @param nbMsgList 割引サービス対象サービス情報（値引対象）
	 * @return 突合結果(true:マッチ, false:アンマッチ)
	 */
	private boolean isMatchKktk(CAANMsg chkKktkMsg, CAANMsg nbMsg)
	{
		if ( null != nbMsg.getString(KK0851ETMsg.PPLAN_CD) )
		{
			// 料金プランコードがnull以外の場合
			if ( nbMsg.getString(KK0851ETMsg.PPLAN_CD).equals(chkKktkMsg.getString(KK0341ETMsg.PPLAN_CD)) )
			{
				// 料金プランコードが一致
				return true;
			}
			else
			{
				// 料金プランコードが不一致
				return false;
			}
		}

		if ( null != nbMsg.getString(KK0851ETMsg.PCRS_CD) )
		{
			// 料金コースコードがnull以外の場合
			if ( nbMsg.getString(KK0851ETMsg.PCRS_CD).equals(chkKktkMsg.getString(KK0341ETMsg.PCRS_CD)) )
			{
				// 料金コースコードが一致
				return true;
			}
			else
			{
				// 料金コースコードが不一致
				return false;
			}
		}

		if ( null != nbMsg.getString(KK0851ETMsg.KKTK_SVC_CD) )
		{
			// 機器提供サービスコードがnull以外の場合
			if ( nbMsg.getString(KK0851ETMsg.KKTK_SVC_CD).equals(chkKktkMsg.getString(KK0341ETMsg.KKTK_SVC_CD)) )
			{
				// 機器提供サービスコードが一致
				return true;
			}
			else
			{
				// 機器提供サービスコードが不一致
				return false;
			}
		}

		// 全項目nullの場合
		return false;
	}

	/**
	 * <p>
	 * 請求オプションサービス契約情報と割引サービス対象サービス情報（値引対象）を突合します。
	 * </p>
	 * @param chkSeiOpMsg 請求オプションサービス契約情報
	 * @param nbMsgList 割引サービス対象サービス情報（値引対象）
	 * @return 突合結果(true:マッチ, false:アンマッチ)
	 */
	private boolean isMatchSeiOp(CAANMsg chkSeiOpMsg, CAANMsg nbMsg)
	{
		if ( null != nbMsg.getString(KK0851ETMsg.PPLAN_CD) )
		{
			// 料金プランコードがnull以外の場合
			if ( nbMsg.getString(KK0851ETMsg.PPLAN_CD).equals(chkSeiOpMsg.getString(KK0441ETMsg.PPLAN_CD)) )
			{
				// 料金プランコードが一致
				return true;
			}
			else
			{
				// 料金プランコードが不一致
				return false;
			}
		}

		if ( null != nbMsg.getString(KK0851ETMsg.PCRS_CD) )
		{
			// 料金コースコードがnull以外の場合
			if ( nbMsg.getString(KK0851ETMsg.PCRS_CD).equals(chkSeiOpMsg.getString(KK0441ETMsg.PCRS_CD)) )
			{
				// 料金コースコードが一致
				return true;
			}
			else
			{
				// 料金コースコードが不一致
				return false;
			}
		}

		if ( null != nbMsg.getString(KK0851ETMsg.SEIOPSVC_CD) )
		{
			// 請求オプションサービスコードがnull以外の場合
			if ( nbMsg.getString(KK0851ETMsg.SEIOPSVC_CD).equals(chkSeiOpMsg.getString(KK0441ETMsg.SEIOPSVC_CD)) )
			{
				// 請求オプションサービスコードが一致
				return true;
			}
			else
			{
				// 請求オプションサービスコードが不一致
				return false;
			}
		}

		// 全項目nullの場合
		return false;
	}

	/**
	 * <p>
	 * 機器オプションサービス契約情報と割引サービス対象サービス情報（値引対象）を突合します。
	 * </p>
	 * @param chkSeiOpMsg 請求オプションサービス契約情報
	 * @param nbMsgList 割引サービス対象サービス情報（値引対象）
	 * @return 突合結果(true:マッチ, false:アンマッチ)
	 */
	private boolean isMatcKKOp(CAANMsg chkKKOpMsg, CAANMsg nbMsg)
	{
		if ( null != nbMsg.getString(KK0851ETMsg.PPLAN_CD) )
		{
			// 料金プランコードがnull以外の場合
			if ( nbMsg.getString(KK0851ETMsg.PPLAN_CD).equals(chkKKOpMsg.getString(KK2811ETMsg.PPLAN_CD)) )
			{
				// 料金プランコードが一致
				return true;
			}
			else
			{
				// 料金プランコードが不一致
				return false;
			}
		}

		if ( null != nbMsg.getString(KK0851ETMsg.PCRS_CD) )
		{
			// 料金コースコードがnull以外の場合
			if ( nbMsg.getString(KK0851ETMsg.PCRS_CD).equals(chkKKOpMsg.getString(KK2811ETMsg.PCRS_CD)) )
			{
				// 料金コースコードが一致
				return true;
			}
			else
			{
				// 料金コースコードが不一致
				return false;
			}
		}

		if ( null != nbMsg.getString(KK0851ETMsg.KKOP_SVC_CD) )
		{
			// 機器オプションサービスコードがnull以外の場合
			if ( nbMsg.getString(KK0851ETMsg.KKOP_SVC_CD).equals(chkKKOpMsg.getString(KK2811ETMsg.KKOP_SVC_CD)) )
			{
				// 機器オプションサービスコードが一致
				return true;
			}
			else
			{
				// 機器オプションサービスコードが不一致
				return false;
			}
		}

		// 全項目nullの場合
		return false;
	}

	/**
	 * <p>
	 * サービス契約番号に紐づくサービス契約内訳明細を取得します。
	 * </p>
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiMap サービス契約番号マップ
	 * @param opeDate 運用日付
	 * @return サービス契約内訳明細
	 */
	private CAANMsg[] getKK0161(AgentDispatchContext inContext, HashMap<String, String> svcKeiMap, String opeDate)
	{
		// 結果返却用変数
		ArrayList<CAANMsg> outArray = new ArrayList<CAANMsg>();

		// 契約件数判定
		if (NODATA == svcKeiMap.size())
		{
			// 0件の場合、処理終了
			return outArray.toArray(new CAANMsg[0]);
		}
		else if (MAXIN < svcKeiMap.size())
		{
			// 1000件より多い場合、エラー
			throw new IllegalArgumentException("サービス契約件数が最大値を超えています。");
		}

		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			// コネクション取得
			con1 = JSYejbConnection.getConnection(KK0161ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK0161.SVC_KEI_UCWK_NO ");
			sql_Buff.append("        , KK0161.GENE_ADD_DTM ");
			sql_Buff.append("        , KK0161.SVC_KEI_UCWK_STAT ");
			sql_Buff.append("        , KK0161.SVC_KEI_NO ");
			sql_Buff.append("        , KK0161.PCRS_CD ");
			sql_Buff.append("        , KK0161.PPLAN_CD ");
			sql_Buff.append(" FROM   KK_T_SVC_KEI_UCWK KK0161 ");
			sql_Buff.append(" WHERE  ( 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 ");
			sql_Buff.append("        ) ");
			sql_Buff.append(" AND    KK0161.SVC_KEI_UCWK_STAT NOT IN ('910', '920') ");
			sql_Buff.append(" AND    KK0161.SVC_KEI_NO IN ( ");
			for (int i = 0; i < svcKeiMap.size(); i++)
			{
				if ( i > 0 )
				{
					sql_Buff.append(" , ");
				}
				sql_Buff.append(" ? ");
			}
			sql_Buff.append(" ) ");

			// prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			// ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータ設定用変数
			int iParam = 0;

			// パラメータの設定
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			for (Map.Entry<String, String> svcKeiNo: svcKeiMap.entrySet())
			{
				CAANJDBCUtil.setParam(pstmt, ++iParam, svcKeiNo.getKey());
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 結果を返却する
			while (rsltQuery.next())
			{
				CAANMsg outMsg = new CAANMsg(KK0161ETMsg.class.getName());
				outMsg.set(KK0161ETMsg.SVC_KEI_UCWK_NO, rsltQuery.getString(KK0161ETMsg.SVC_KEI_UCWK_NO));
				outMsg.set(KK0161ETMsg.GENE_ADD_DTM, rsltQuery.getString(KK0161ETMsg.GENE_ADD_DTM));
				outMsg.set(KK0161ETMsg.SVC_KEI_UCWK_STAT, rsltQuery.getString(KK0161ETMsg.SVC_KEI_UCWK_STAT));
				outMsg.set(KK0161ETMsg.SVC_KEI_NO, rsltQuery.getString(KK0161ETMsg.SVC_KEI_NO));
				outMsg.set(KK0161ETMsg.PCRS_CD, rsltQuery.getString(KK0161ETMsg.PCRS_CD));
				outMsg.set(KK0161ETMsg.PPLAN_CD, rsltQuery.getString(KK0161ETMsg.PPLAN_CD));
				outArray.add(outMsg);
			}
			return outArray.toArray(new CAANMsg[0]);
		}
		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 inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiMap サービス契約番号マップ
	 * @param opeDate 運用日付
	 * @return オプションサービス契約明細
	 */
	private CAANMsg[] getKK0351bySvcKei(AgentDispatchContext inContext, HashMap<String, String> svcKeiMap, String opeDate)
	{
		// 結果返却用変数
		ArrayList<CAANMsg> outArray = new ArrayList<CAANMsg>();

		// 契約件数判定
		if (NODATA == svcKeiMap.size())
		{
			// 0件の場合、処理終了
			return outArray.toArray(new CAANMsg[0]);
		}
		else if (MAXIN < svcKeiMap.size())
		{
			// 1000件より多い場合、エラー
			throw new IllegalArgumentException("サービス契約件数が最大値を超えています。");
		}

		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			// コネクション取得
			con1 = JSYejbConnection.getConnection(KK0351ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK0351.OP_SVC_KEI_NO ");
			sql_Buff.append("      , KK0351.GENE_ADD_DTM ");
			sql_Buff.append("      , KK0351.OP_SVC_KEI_STAT ");
			sql_Buff.append("      , KK0351.OP_SVC_CD ");
			sql_Buff.append("      , KK0351.PCRS_CD ");
			sql_Buff.append("      , KK0351.PPLAN_CD ");
			sql_Buff.append("      , KK0351.OYA_KEI_SKBT_CD ");
			sql_Buff.append("      , KK0351.SVC_KEI_NO ");
			sql_Buff.append("      , KK0351.SVC_KEI_UCWK_NO ");
			sql_Buff.append(" FROM   KK_T_OP_SVC_KEI KK0351 ");
			sql_Buff.append(" WHERE  ( KK0351.OP_SVC_KEI_NO, KK0351.RSV_APLY_YMD || KK0351.GENE_ADD_DTM ) = ");
			sql_Buff.append("        ( SELECT KK0351_GENE.OP_SVC_KEI_NO, MAX( KK0351_GENE.RSV_APLY_YMD || KK0351_GENE.GENE_ADD_DTM ) AS KK0351_MAX ");
			sql_Buff.append("          FROM  KK_T_OP_SVC_KEI KK0351_GENE ");
			sql_Buff.append("          WHERE KK0351_GENE.OP_SVC_KEI_NO = KK0351.OP_SVC_KEI_NO ");
			sql_Buff.append("          AND   KK0351_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("          AND   KK0351_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("          AND   KK0351_GENE.MK_FLG = '0' ");
			sql_Buff.append("          GROUP BY KK0351_GENE.OP_SVC_KEI_NO ");
			sql_Buff.append("        ) ");
			sql_Buff.append(" AND    KK0351.OP_SVC_KEI_STAT NOT IN ('910', '920') ");
			sql_Buff.append(" AND    KK0351.OYA_KEI_SKBT_CD = '01' ");
			sql_Buff.append(" AND    KK0351.SVC_KEI_NO IN ( ");
			for (int i = 0; i < svcKeiMap.size(); i++)
			{
				if ( i > 0 )
				{
					sql_Buff.append(" , ");
				}
				sql_Buff.append(" ? ");
			}
			sql_Buff.append(" ) ");

			// prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			// ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータ設定用変数
			int iParam = 0;

			// パラメータの設定
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			for (Map.Entry<String, String> svcKeiNo: svcKeiMap.entrySet())
			{
				CAANJDBCUtil.setParam(pstmt, ++iParam, svcKeiNo.getKey());
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 結果を返却する
			while (rsltQuery.next())
			{
				CAANMsg outMsg = new CAANMsg(KK0351ETMsg.class.getName());
				outMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, rsltQuery.getString(KK0351ETMsg.OP_SVC_KEI_NO));
				outMsg.set(KK0351ETMsg.GENE_ADD_DTM, rsltQuery.getString(KK0351ETMsg.GENE_ADD_DTM));
				outMsg.set(KK0351ETMsg.OP_SVC_KEI_STAT, rsltQuery.getString(KK0351ETMsg.OP_SVC_KEI_STAT));
				outMsg.set(KK0351ETMsg.OP_SVC_CD, rsltQuery.getString(KK0351ETMsg.OP_SVC_CD));
				outMsg.set(KK0351ETMsg.PCRS_CD, rsltQuery.getString(KK0351ETMsg.PCRS_CD));
				outMsg.set(KK0351ETMsg.PPLAN_CD, rsltQuery.getString(KK0351ETMsg.PPLAN_CD));
				outMsg.set(KK0351ETMsg.OYA_KEI_SKBT_CD, rsltQuery.getString(KK0351ETMsg.OYA_KEI_SKBT_CD));
				outMsg.set(KK0351ETMsg.SVC_KEI_NO, rsltQuery.getString(KK0351ETMsg.SVC_KEI_NO));
				outMsg.set(KK0351ETMsg.SVC_KEI_UCWK_NO, rsltQuery.getString(KK0351ETMsg.SVC_KEI_UCWK_NO));
				outArray.add(outMsg);
			}
			return outArray.toArray(new CAANMsg[0]);
		}
		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 inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiUcwkMap サービス契約内訳番号マップ
	 * @param opeDate 運用日付
	 * @return オプションサービス契約明細
	 */
	private CAANMsg[] getKK0351bySvcKeiUcwk(AgentDispatchContext inContext, HashMap<String, String> svcKeiUcwkMap, String opeDate)
	{
		// 結果返却用変数
		ArrayList<CAANMsg> outArray = new ArrayList<CAANMsg>();

		// 契約件数判定
		if (NODATA == svcKeiUcwkMap.size())
		{
			// 0件の場合、処理終了
			return outArray.toArray(new CAANMsg[0]);
		}
		else if (MAXIN < svcKeiUcwkMap.size())
		{
			// 1000件より多い場合、エラー
			throw new IllegalArgumentException("サービス契約内訳件数が最大値を超えています。");
		}

		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			// コネクション取得
			con1 = JSYejbConnection.getConnection(KK0351ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK0351.OP_SVC_KEI_NO ");
			sql_Buff.append("      , KK0351.GENE_ADD_DTM ");
			sql_Buff.append("      , KK0351.OP_SVC_KEI_STAT ");
			sql_Buff.append("      , KK0351.OP_SVC_CD ");
			sql_Buff.append("      , KK0351.PCRS_CD ");
			sql_Buff.append("      , KK0351.PPLAN_CD ");
			sql_Buff.append("      , KK0351.OYA_KEI_SKBT_CD ");
			sql_Buff.append("      , KK0351.SVC_KEI_NO ");
			sql_Buff.append("      , KK0351.SVC_KEI_UCWK_NO ");
			sql_Buff.append(" FROM   KK_T_OP_SVC_KEI KK0351 ");
			sql_Buff.append(" WHERE  ( KK0351.OP_SVC_KEI_NO, KK0351.RSV_APLY_YMD || KK0351.GENE_ADD_DTM ) = ");
			sql_Buff.append("        ( SELECT KK0351_GENE.OP_SVC_KEI_NO, MAX( KK0351_GENE.RSV_APLY_YMD || KK0351_GENE.GENE_ADD_DTM ) AS KK0351_MAX ");
			sql_Buff.append("          FROM  KK_T_OP_SVC_KEI KK0351_GENE ");
			sql_Buff.append("          WHERE KK0351_GENE.OP_SVC_KEI_NO = KK0351.OP_SVC_KEI_NO ");
			sql_Buff.append("          AND   KK0351_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("          AND   KK0351_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("          AND   KK0351_GENE.MK_FLG = '0' ");
			sql_Buff.append("          GROUP BY KK0351_GENE.OP_SVC_KEI_NO ");
			sql_Buff.append("        ) ");
			sql_Buff.append(" AND    KK0351.OP_SVC_KEI_STAT NOT IN ('910', '920') ");
			sql_Buff.append(" AND    KK0351.OYA_KEI_SKBT_CD = '03' ");
			sql_Buff.append(" AND    KK0351.SVC_KEI_UCWK_NO IN ( ");
			for (int i = 0; i < svcKeiUcwkMap.size(); i++)
			{
				if ( i > 0 )
				{
					sql_Buff.append(" , ");
				}
				sql_Buff.append(" ? ");
			}
			sql_Buff.append(" ) ");

			// prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			// ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータ設定用変数
			int iParam = 0;

			// パラメータの設定
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			for (Map.Entry<String, String> svcKeiUcwkNo: svcKeiUcwkMap.entrySet())
			{
				CAANJDBCUtil.setParam(pstmt, ++iParam, svcKeiUcwkNo.getKey());
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 結果を返却する
			while (rsltQuery.next())
			{
				CAANMsg outMsg = new CAANMsg(KK0351ETMsg.class.getName());
				outMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, rsltQuery.getString(KK0351ETMsg.OP_SVC_KEI_NO));
				outMsg.set(KK0351ETMsg.GENE_ADD_DTM, rsltQuery.getString(KK0351ETMsg.GENE_ADD_DTM));
				outMsg.set(KK0351ETMsg.OP_SVC_KEI_STAT, rsltQuery.getString(KK0351ETMsg.OP_SVC_KEI_STAT));
				outMsg.set(KK0351ETMsg.OP_SVC_CD, rsltQuery.getString(KK0351ETMsg.OP_SVC_CD));
				outMsg.set(KK0351ETMsg.PCRS_CD, rsltQuery.getString(KK0351ETMsg.PCRS_CD));
				outMsg.set(KK0351ETMsg.PPLAN_CD, rsltQuery.getString(KK0351ETMsg.PPLAN_CD));
				outMsg.set(KK0351ETMsg.OYA_KEI_SKBT_CD, rsltQuery.getString(KK0351ETMsg.OYA_KEI_SKBT_CD));
				outMsg.set(KK0351ETMsg.SVC_KEI_NO, rsltQuery.getString(KK0351ETMsg.SVC_KEI_NO));
				outMsg.set(KK0351ETMsg.SVC_KEI_UCWK_NO, rsltQuery.getString(KK0351ETMsg.SVC_KEI_UCWK_NO));
				outArray.add(outMsg);
			}
			return outArray.toArray(new CAANMsg[0]);
		}
		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 inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiMap オプションサービス契約番号マップ
	 * @param opeDate 運用日付
	 * @return サブオプションサービス契約明細
	 */
	private CAANMsg[] getKK0401(AgentDispatchContext inContext, HashMap<String, String> opSvcKeiMap, String opeDate)
	{
		// 結果返却用変数
		ArrayList<CAANMsg> outArray = new ArrayList<CAANMsg>();

		// 契約件数判定
		if (NODATA == opSvcKeiMap.size())
		{
			// 0件の場合、処理終了
			return outArray.toArray(new CAANMsg[0]);
		}
		else if (MAXIN < opSvcKeiMap.size())
		{
			// 1000件より多い場合、エラー
			throw new IllegalArgumentException("オプションサービス契約件数が最大値を超えています。");
		}

		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			// コネクション取得
			con1 = JSYejbConnection.getConnection(KK0401ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK0401.OP_SVC_KEI_NO ");
			sql_Buff.append("        , KK0401.SBOP_SVC_KEI_NO ");
			sql_Buff.append("        , KK0401.GENE_ADD_DTM ");
			sql_Buff.append("        , KK0401.SBOP_SVC_KEI_STAT ");
			sql_Buff.append("        , KK0401.SBOP_SVC_CD ");
			sql_Buff.append("        , KK0401.PCRS_CD ");
			sql_Buff.append("        , KK0401.PPLAN_CD ");
			sql_Buff.append(" FROM   KK_T_SBOP_SVC_KEI KK0401 ");
			sql_Buff.append(" WHERE  ( KK0401.OP_SVC_KEI_NO, KK0401.SBOP_SVC_KEI_NO, KK0401.RSV_APLY_YMD || KK0401.GENE_ADD_DTM ) = ");
			sql_Buff.append("        ( SELECT KK0401_GENE.OP_SVC_KEI_NO, KK0401_GENE.SBOP_SVC_KEI_NO, MAX( KK0401_GENE.RSV_APLY_YMD || KK0401_GENE.GENE_ADD_DTM ) AS KK0401_MAX ");
			sql_Buff.append("          FROM  KK_T_SBOP_SVC_KEI KK0401_GENE ");
			sql_Buff.append("          WHERE KK0401_GENE.OP_SVC_KEI_NO = KK0401.OP_SVC_KEI_NO ");
			sql_Buff.append("          AND   KK0401_GENE.SBOP_SVC_KEI_NO = KK0401.SBOP_SVC_KEI_NO ");
			sql_Buff.append("          AND   KK0401_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("          AND   KK0401_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("          AND   KK0401_GENE.MK_FLG = '0' ");
			sql_Buff.append("          GROUP BY KK0401_GENE.OP_SVC_KEI_NO, KK0401_GENE.SBOP_SVC_KEI_NO ");
			sql_Buff.append("        ) ");
			sql_Buff.append(" AND    KK0401.SBOP_SVC_KEI_STAT NOT IN ('910', '920') ");
			sql_Buff.append(" AND    KK0401.OP_SVC_KEI_NO IN ( ");
			for (int i = 0; i < opSvcKeiMap.size(); i++)
			{
				if ( i > 0 )
				{
					sql_Buff.append(" , ");
				}
				sql_Buff.append(" ? ");
			}
			sql_Buff.append(" ) ");

			// prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			// ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータ設定用変数
			int iParam = 0;

			// パラメータの設定
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			for (Map.Entry<String, String> opSvcKeiNo: opSvcKeiMap.entrySet())
			{
				CAANJDBCUtil.setParam(pstmt, ++iParam, opSvcKeiNo.getKey());
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 結果を返却する
			while (rsltQuery.next())
			{
				CAANMsg outMsg = new CAANMsg(KK0401ETMsg.class.getName());
				outMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, rsltQuery.getString(KK0401ETMsg.OP_SVC_KEI_NO));
				outMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, rsltQuery.getString(KK0401ETMsg.SBOP_SVC_KEI_NO));
				outMsg.set(KK0401ETMsg.GENE_ADD_DTM, rsltQuery.getString(KK0401ETMsg.GENE_ADD_DTM));
				outMsg.set(KK0401ETMsg.SBOP_SVC_KEI_STAT, rsltQuery.getString(KK0401ETMsg.SBOP_SVC_KEI_STAT));
				outMsg.set(KK0401ETMsg.SBOP_SVC_CD, rsltQuery.getString(KK0401ETMsg.SBOP_SVC_CD));
				outMsg.set(KK0401ETMsg.PCRS_CD, rsltQuery.getString(KK0401ETMsg.PCRS_CD));
				outMsg.set(KK0401ETMsg.PPLAN_CD, rsltQuery.getString(KK0401ETMsg.PPLAN_CD));
				outArray.add(outMsg);
			}
			return outArray.toArray(new CAANMsg[0]);
		}
		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 inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiMap サービス契約番号マップ
	 * @param opeDate 運用日付
	 * @return 機器提供サービス契約明細
	 */
	private CAANMsg[] getKK0341bySvcKei(AgentDispatchContext inContext, HashMap<String, String> svcKeiMap, String opeDate)
	{
		// 結果返却用変数
		ArrayList<CAANMsg> outArray = new ArrayList<CAANMsg>();

		// 契約件数判定
		if (NODATA == svcKeiMap.size())
		{
			// 0件の場合、処理終了
			return outArray.toArray(new CAANMsg[0]);
		}
		else if (MAXIN < svcKeiMap.size())
		{
			// 1000件より多い場合、エラー
			throw new IllegalArgumentException("サービス契約件数が最大値を超えています。");
		}

		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			// コネクション取得
			con1 = JSYejbConnection.getConnection(KK0341ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append("        , KK0341.GENE_ADD_DTM ");
			sql_Buff.append("        , KK0341.KKTK_SVC_KEI_STAT ");
			sql_Buff.append("        , KK0341.KKTK_SVC_CD ");
			sql_Buff.append("        , KK0341.PCRS_CD ");
			sql_Buff.append("        , KK0341.PPLAN_CD ");
			sql_Buff.append("        , KK0341.KKTK_SBT_CD ");
			sql_Buff.append("        , KK0341.OYA_KEI_SKBT_CD ");
			sql_Buff.append("        , KK0341.SVC_KEI_NO ");
			sql_Buff.append("        , KK0341.SVC_KEI_UCWK_NO ");
			sql_Buff.append("        , KK0341.SVC_KEI_KAISEN_UCWK_NO ");
			sql_Buff.append("        , KK0341.OP_SVC_KEI_NO ");
			sql_Buff.append(" FROM   KK_T_KKTK_SVC_KEI KK0341 ");
			sql_Buff.append(" WHERE  ( KK0341.KKTK_SVC_KEI_NO, KK0341.RSV_APLY_YMD || KK0341.GENE_ADD_DTM ) = ");
			sql_Buff.append("        ( SELECT KK0341_GENE.KKTK_SVC_KEI_NO, MAX( KK0341_GENE.RSV_APLY_YMD || KK0341_GENE.GENE_ADD_DTM ) AS KK0341_MAX ");
			sql_Buff.append("          FROM  KK_T_KKTK_SVC_KEI KK0341_GENE ");
			sql_Buff.append("          WHERE KK0341_GENE.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append("          AND   KK0341_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("          AND   KK0341_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("          AND   KK0341_GENE.MK_FLG = '0' ");
			sql_Buff.append("          GROUP BY KK0341_GENE.KKTK_SVC_KEI_NO ");
			sql_Buff.append("        ) ");
			sql_Buff.append(" AND    KK0341.KKTK_SVC_KEI_STAT NOT IN ('910', '920') ");
			sql_Buff.append(" AND    KK0341.OYA_KEI_SKBT_CD = '01' ");
			sql_Buff.append(" AND    KK0341.SVC_KEI_NO IN ( ");
			for (int i = 0; i < svcKeiMap.size(); i++)
			{
				if ( i > 0 )
				{
					sql_Buff.append(" , ");
				}
				sql_Buff.append(" ? ");
			}
			sql_Buff.append(" ) ");

			// prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			// ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータ設定用変数
			int iParam = 0;

			// パラメータの設定
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			for (Map.Entry<String, String> svcKeiNo: svcKeiMap.entrySet())
			{
				CAANJDBCUtil.setParam(pstmt, ++iParam, svcKeiNo.getKey());
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 結果を返却する
			while (rsltQuery.next())
			{
				CAANMsg outMsg = new CAANMsg(KK0341ETMsg.class.getName());
				outMsg.set(KK0341ETMsg.KKTK_SVC_KEI_NO, rsltQuery.getString(KK0341ETMsg.KKTK_SVC_KEI_NO));
				outMsg.set(KK0341ETMsg.GENE_ADD_DTM, rsltQuery.getString(KK0341ETMsg.GENE_ADD_DTM));
				outMsg.set(KK0341ETMsg.KKTK_SVC_KEI_STAT, rsltQuery.getString(KK0341ETMsg.KKTK_SVC_KEI_STAT));
				outMsg.set(KK0341ETMsg.KKTK_SVC_CD, rsltQuery.getString(KK0341ETMsg.KKTK_SVC_CD));
				outMsg.set(KK0341ETMsg.PCRS_CD, rsltQuery.getString(KK0341ETMsg.PCRS_CD));
				outMsg.set(KK0341ETMsg.PPLAN_CD, rsltQuery.getString(KK0341ETMsg.PPLAN_CD));
				outMsg.set(KK0341ETMsg.KKTK_SBT_CD, rsltQuery.getString(KK0341ETMsg.KKTK_SBT_CD));
				outMsg.set(KK0341ETMsg.OYA_KEI_SKBT_CD, rsltQuery.getString(KK0341ETMsg.OYA_KEI_SKBT_CD));
				outMsg.set(KK0341ETMsg.SVC_KEI_NO, rsltQuery.getString(KK0341ETMsg.SVC_KEI_NO));
				outMsg.set(KK0341ETMsg.SVC_KEI_UCWK_NO, rsltQuery.getString(KK0341ETMsg.SVC_KEI_UCWK_NO));
				outMsg.set(KK0341ETMsg.SVC_KEI_KAISEN_UCWK_NO, rsltQuery.getString(KK0341ETMsg.SVC_KEI_KAISEN_UCWK_NO));
				outMsg.set(KK0341ETMsg.OP_SVC_KEI_NO, rsltQuery.getString(KK0341ETMsg.OP_SVC_KEI_NO));
				outArray.add(outMsg);
			}
			return outArray.toArray(new CAANMsg[0]);
		}
		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 inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiMap サービス契約番号マップ
	 * @param opeDate 運用日付
	 * @return 機器提供サービス契約明細
	 */
	private CAANMsg[] getKK0341bySvcKeiKaisenUcwk(AgentDispatchContext inContext, HashMap<String, String> svcKeiMap, String opeDate)
	{
		// 結果返却用変数
		ArrayList<CAANMsg> outArray = new ArrayList<CAANMsg>();

		// 契約件数判定
		if (NODATA == svcKeiMap.size())
		{
			// 0件の場合、処理終了
			return outArray.toArray(new CAANMsg[0]);
		}
		else if (MAXIN < svcKeiMap.size())
		{
			// 1000件より多い場合、エラー
			throw new IllegalArgumentException("サービス契約件数が最大値を超えています。");
		}

		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			// コネクション取得
			con1 = JSYejbConnection.getConnection(KK0341ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append("        , KK0341.GENE_ADD_DTM ");
			sql_Buff.append("        , KK0341.KKTK_SVC_KEI_STAT ");
			sql_Buff.append("        , KK0341.KKTK_SVC_CD ");
			sql_Buff.append("        , KK0341.PCRS_CD ");
			sql_Buff.append("        , KK0341.PPLAN_CD ");
			sql_Buff.append("        , KK0341.KKTK_SBT_CD ");
			sql_Buff.append("        , KK0341.OYA_KEI_SKBT_CD ");
			sql_Buff.append("        , KK0341.SVC_KEI_NO ");
			sql_Buff.append("        , KK0341.SVC_KEI_UCWK_NO ");
			sql_Buff.append("        , KK0341.SVC_KEI_KAISEN_UCWK_NO ");
			sql_Buff.append("        , KK0341.OP_SVC_KEI_NO ");
			sql_Buff.append(" FROM   KK_T_KAISEN_TG_SVKEI KK0241 ");
			sql_Buff.append(" INNER JOIN ");
			sql_Buff.append("        KK_T_SVKEI_KAISEN_UW KK0251 ");
			sql_Buff.append(" ON     KK0241.SVC_KEI_KAISEN_UCWK_NO = KK0251.SVC_KEI_KAISEN_UCWK_NO ");
			sql_Buff.append(" INNER JOIN ");
			sql_Buff.append("        KK_T_KKTK_SVC_KEI KK0341 ");
			sql_Buff.append(" ON     KK0251.SVC_KEI_KAISEN_UCWK_NO = KK0341.SVC_KEI_KAISEN_UCWK_NO ");
			sql_Buff.append(" WHERE  KK0241.KAISEN_UCWK_USE_STAYMD <= ? ");
			sql_Buff.append(" AND    KK0241.KAISEN_UCWK_USE_ENDYMD >= ? ");
			sql_Buff.append(" AND    KK0241.MK_FLG = '0' ");
			sql_Buff.append(" AND    ( KK0251.SVC_KEI_KAISEN_UCWK_NO, KK0251.GENE_ADD_DTM ) = ");
			sql_Buff.append("        ( SELECT KK0251_GENE.SVC_KEI_KAISEN_UCWK_NO, MAX( KK0251_GENE.GENE_ADD_DTM ) AS KK0251_MAX ");
			sql_Buff.append("          FROM  KK_T_SVKEI_KAISEN_UW KK0251_GENE ");
			sql_Buff.append("          WHERE KK0251_GENE.SVC_KEI_KAISEN_UCWK_NO = KK0251.SVC_KEI_KAISEN_UCWK_NO ");
			sql_Buff.append("          AND   KK0251_GENE.MK_FLG = '0' ");
			sql_Buff.append("          GROUP BY KK0251_GENE.SVC_KEI_KAISEN_UCWK_NO ");
			sql_Buff.append("        ) ");
			sql_Buff.append(" AND    ( KK0341.KKTK_SVC_KEI_NO, KK0341.RSV_APLY_YMD || KK0341.GENE_ADD_DTM ) = ");
			sql_Buff.append("        ( SELECT KK0341_GENE.KKTK_SVC_KEI_NO, MAX( KK0341_GENE.RSV_APLY_YMD || KK0341_GENE.GENE_ADD_DTM ) AS KK0341_MAX ");
			sql_Buff.append("          FROM  KK_T_KKTK_SVC_KEI KK0341_GENE ");
			sql_Buff.append("          WHERE KK0341_GENE.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append("          AND   KK0341_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("          AND   KK0341_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("          AND   KK0341_GENE.MK_FLG = '0' ");
			sql_Buff.append("          GROUP BY KK0341_GENE.KKTK_SVC_KEI_NO ");
			sql_Buff.append("        ) ");
			sql_Buff.append(" AND    KK0341.KKTK_SVC_KEI_STAT NOT IN ('910', '920') ");
			sql_Buff.append(" AND    KK0341.OYA_KEI_SKBT_CD = '02' ");
			sql_Buff.append(" AND    KK0241.SVC_KEI_NO IN ( ");
			for (int i = 0; i < svcKeiMap.size(); i++)
			{
				if ( i > 0 )
				{
					sql_Buff.append(" , ");
				}
				sql_Buff.append(" ? ");
			}
			sql_Buff.append(" ) ");

			// prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			// ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータ設定用変数
			int iParam = 0;

			// パラメータの設定
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			for (Map.Entry<String, String> svcKeiNo: svcKeiMap.entrySet())
			{
				CAANJDBCUtil.setParam(pstmt, ++iParam, svcKeiNo.getKey());
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 結果を返却する
			while (rsltQuery.next())
			{
				CAANMsg outMsg = new CAANMsg(KK0341ETMsg.class.getName());
				outMsg.set(KK0341ETMsg.KKTK_SVC_KEI_NO, rsltQuery.getString(KK0341ETMsg.KKTK_SVC_KEI_NO));
				outMsg.set(KK0341ETMsg.GENE_ADD_DTM, rsltQuery.getString(KK0341ETMsg.GENE_ADD_DTM));
				outMsg.set(KK0341ETMsg.KKTK_SVC_KEI_STAT, rsltQuery.getString(KK0341ETMsg.KKTK_SVC_KEI_STAT));
				outMsg.set(KK0341ETMsg.KKTK_SVC_CD, rsltQuery.getString(KK0341ETMsg.KKTK_SVC_CD));
				outMsg.set(KK0341ETMsg.PCRS_CD, rsltQuery.getString(KK0341ETMsg.PCRS_CD));
				outMsg.set(KK0341ETMsg.PPLAN_CD, rsltQuery.getString(KK0341ETMsg.PPLAN_CD));
				outMsg.set(KK0341ETMsg.KKTK_SBT_CD, rsltQuery.getString(KK0341ETMsg.KKTK_SBT_CD));
				outMsg.set(KK0341ETMsg.OYA_KEI_SKBT_CD, rsltQuery.getString(KK0341ETMsg.OYA_KEI_SKBT_CD));
				outMsg.set(KK0341ETMsg.SVC_KEI_NO, rsltQuery.getString(KK0341ETMsg.SVC_KEI_NO));
				outMsg.set(KK0341ETMsg.SVC_KEI_UCWK_NO, rsltQuery.getString(KK0341ETMsg.SVC_KEI_UCWK_NO));
				outMsg.set(KK0341ETMsg.SVC_KEI_KAISEN_UCWK_NO, rsltQuery.getString(KK0341ETMsg.SVC_KEI_KAISEN_UCWK_NO));
				outMsg.set(KK0341ETMsg.OP_SVC_KEI_NO, rsltQuery.getString(KK0341ETMsg.OP_SVC_KEI_NO));
				outArray.add(outMsg);
			}
			return outArray.toArray(new CAANMsg[0]);
		}
		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 inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiUcwkMap サービス契約内訳番号マップ
	 * @param opeDate 運用日付
	 * @return 機器提供サービス契約明細
	 */
	private CAANMsg[] getKK0341bySvcKeiUcwk(AgentDispatchContext inContext, HashMap<String, String> svcKeiUcwkMap, String opeDate)
	{
		// 結果返却用変数
		ArrayList<CAANMsg> outArray = new ArrayList<CAANMsg>();

		// 契約件数判定
		if (NODATA == svcKeiUcwkMap.size())
		{
			// 0件の場合、処理終了
			return outArray.toArray(new CAANMsg[0]);
		}
		else if (MAXIN < svcKeiUcwkMap.size())
		{
			// 1000件より多い場合、エラー
			throw new IllegalArgumentException("サービス契約内訳件数が最大値を超えています。");
		}

		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			// コネクション取得
			con1 = JSYejbConnection.getConnection(KK0341ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append("        , KK0341.GENE_ADD_DTM ");
			sql_Buff.append("        , KK0341.KKTK_SVC_KEI_STAT ");
			sql_Buff.append("        , KK0341.KKTK_SVC_CD ");
			sql_Buff.append("        , KK0341.PCRS_CD ");
			sql_Buff.append("        , KK0341.PPLAN_CD ");
			sql_Buff.append("        , KK0341.KKTK_SBT_CD ");
			sql_Buff.append("        , KK0341.OYA_KEI_SKBT_CD ");
			sql_Buff.append("        , KK0341.SVC_KEI_NO ");
			sql_Buff.append("        , KK0341.SVC_KEI_UCWK_NO ");
			sql_Buff.append("        , KK0341.SVC_KEI_KAISEN_UCWK_NO ");
			sql_Buff.append("        , KK0341.OP_SVC_KEI_NO ");
			sql_Buff.append(" FROM   KK_T_KKTK_SVC_KEI KK0341 ");
			sql_Buff.append(" WHERE  ( KK0341.KKTK_SVC_KEI_NO, KK0341.RSV_APLY_YMD || KK0341.GENE_ADD_DTM ) = ");
			sql_Buff.append("        ( SELECT KK0341_GENE.KKTK_SVC_KEI_NO, MAX( KK0341_GENE.RSV_APLY_YMD || KK0341_GENE.GENE_ADD_DTM ) AS KK0341_MAX ");
			sql_Buff.append("          FROM  KK_T_KKTK_SVC_KEI KK0341_GENE ");
			sql_Buff.append("          WHERE KK0341_GENE.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append("          AND   KK0341_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("          AND   KK0341_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("          AND   KK0341_GENE.MK_FLG = '0' ");
			sql_Buff.append("          GROUP BY KK0341_GENE.KKTK_SVC_KEI_NO ");
			sql_Buff.append("        ) ");
			sql_Buff.append(" AND    KK0341.KKTK_SVC_KEI_STAT NOT IN ('910', '920') ");
			sql_Buff.append(" AND    KK0341.OYA_KEI_SKBT_CD = '03' ");
			sql_Buff.append(" AND    KK0341.SVC_KEI_UCWK_NO IN ( ");
			for (int i = 0; i < svcKeiUcwkMap.size(); i++)
			{
				if ( i > 0 )
				{
					sql_Buff.append(" , ");
				}
				sql_Buff.append(" ? ");
			}
			sql_Buff.append(" ) ");

			// prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			// ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータ設定用変数
			int iParam = 0;

			// パラメータの設定
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			for (Map.Entry<String, String> svcKeiUcwkNo: svcKeiUcwkMap.entrySet())
			{
				CAANJDBCUtil.setParam(pstmt, ++iParam, svcKeiUcwkNo.getKey());
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 結果を返却する
			while (rsltQuery.next())
			{
				CAANMsg outMsg = new CAANMsg(KK0341ETMsg.class.getName());
				outMsg.set(KK0341ETMsg.KKTK_SVC_KEI_NO, rsltQuery.getString(KK0341ETMsg.KKTK_SVC_KEI_NO));
				outMsg.set(KK0341ETMsg.GENE_ADD_DTM, rsltQuery.getString(KK0341ETMsg.GENE_ADD_DTM));
				outMsg.set(KK0341ETMsg.KKTK_SVC_KEI_STAT, rsltQuery.getString(KK0341ETMsg.KKTK_SVC_KEI_STAT));
				outMsg.set(KK0341ETMsg.KKTK_SVC_CD, rsltQuery.getString(KK0341ETMsg.KKTK_SVC_CD));
				outMsg.set(KK0341ETMsg.PCRS_CD, rsltQuery.getString(KK0341ETMsg.PCRS_CD));
				outMsg.set(KK0341ETMsg.PPLAN_CD, rsltQuery.getString(KK0341ETMsg.PPLAN_CD));
				outMsg.set(KK0341ETMsg.KKTK_SBT_CD, rsltQuery.getString(KK0341ETMsg.KKTK_SBT_CD));
				outMsg.set(KK0341ETMsg.OYA_KEI_SKBT_CD, rsltQuery.getString(KK0341ETMsg.OYA_KEI_SKBT_CD));
				outMsg.set(KK0341ETMsg.SVC_KEI_NO, rsltQuery.getString(KK0341ETMsg.SVC_KEI_NO));
				outMsg.set(KK0341ETMsg.SVC_KEI_UCWK_NO, rsltQuery.getString(KK0341ETMsg.SVC_KEI_UCWK_NO));
				outMsg.set(KK0341ETMsg.SVC_KEI_KAISEN_UCWK_NO, rsltQuery.getString(KK0341ETMsg.SVC_KEI_KAISEN_UCWK_NO));
				outMsg.set(KK0341ETMsg.OP_SVC_KEI_NO, rsltQuery.getString(KK0341ETMsg.OP_SVC_KEI_NO));
				outArray.add(outMsg);
			}
			return outArray.toArray(new CAANMsg[0]);
		}
		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 inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiMap オプションサービス契約番号マップ
	 * @param opeDate 運用日付
	 * @return 機器提供サービス契約明細
	 */
	private CAANMsg[] getKK0341byOpSvcKei(AgentDispatchContext inContext, HashMap<String, String> opSvcKeiMap, String opeDate)
	{
		// 結果返却用変数
		ArrayList<CAANMsg> outArray = new ArrayList<CAANMsg>();

		// 契約件数判定
		if (NODATA == opSvcKeiMap.size())
		{
			// 0件の場合、処理終了
			return outArray.toArray(new CAANMsg[0]);
		}
		else if (MAXIN < opSvcKeiMap.size())
		{
			// 1000件より多い場合、エラー
			throw new IllegalArgumentException("オプションサービス契約件数が最大値を超えています。");
		}

		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			// コネクション取得
			con1 = JSYejbConnection.getConnection(KK0341ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append("        , KK0341.GENE_ADD_DTM ");
			sql_Buff.append("        , KK0341.KKTK_SVC_KEI_STAT ");
			sql_Buff.append("        , KK0341.KKTK_SVC_CD ");
			sql_Buff.append("        , KK0341.PCRS_CD ");
			sql_Buff.append("        , KK0341.PPLAN_CD ");
			sql_Buff.append("        , KK0341.KKTK_SBT_CD ");
			sql_Buff.append("        , KK0341.OYA_KEI_SKBT_CD ");
			sql_Buff.append("        , KK0341.SVC_KEI_NO ");
			sql_Buff.append("        , KK0341.SVC_KEI_UCWK_NO ");
			sql_Buff.append("        , KK0341.SVC_KEI_KAISEN_UCWK_NO ");
			sql_Buff.append("        , KK0341.OP_SVC_KEI_NO ");
			sql_Buff.append(" FROM   KK_T_KKTK_SVC_KEI KK0341 ");
			sql_Buff.append(" WHERE  ( KK0341.KKTK_SVC_KEI_NO, KK0341.RSV_APLY_YMD || KK0341.GENE_ADD_DTM ) = ");
			sql_Buff.append("        ( SELECT KK0341_GENE.KKTK_SVC_KEI_NO, MAX( KK0341_GENE.RSV_APLY_YMD || KK0341_GENE.GENE_ADD_DTM ) AS KK0341_MAX ");
			sql_Buff.append("          FROM  KK_T_KKTK_SVC_KEI KK0341_GENE ");
			sql_Buff.append("          WHERE KK0341_GENE.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append("          AND   KK0341_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("          AND   KK0341_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("          AND   KK0341_GENE.MK_FLG = '0' ");
			sql_Buff.append("          GROUP BY KK0341_GENE.KKTK_SVC_KEI_NO ");
			sql_Buff.append("        ) ");
			sql_Buff.append(" AND    KK0341.KKTK_SVC_KEI_STAT NOT IN ('910', '920') ");
			sql_Buff.append(" AND    KK0341.OYA_KEI_SKBT_CD = '04' ");
			sql_Buff.append(" AND    KK0341.OP_SVC_KEI_NO IN ( ");
			for (int i = 0; i < opSvcKeiMap.size(); i++)
			{
				if ( i > 0 )
				{
					sql_Buff.append(" , ");
				}
				sql_Buff.append(" ? ");
			}
			sql_Buff.append(" ) ");

			// prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			// ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータ設定用変数
			int iParam = 0;

			// パラメータの設定
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			for (Map.Entry<String, String> opSvcKeiNo: opSvcKeiMap.entrySet())
			{
				CAANJDBCUtil.setParam(pstmt, ++iParam, opSvcKeiNo.getKey());
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 結果を返却する
			while (rsltQuery.next())
			{
				CAANMsg outMsg = new CAANMsg(KK0341ETMsg.class.getName());
				outMsg.set(KK0341ETMsg.KKTK_SVC_KEI_NO, rsltQuery.getString(KK0341ETMsg.KKTK_SVC_KEI_NO));
				outMsg.set(KK0341ETMsg.GENE_ADD_DTM, rsltQuery.getString(KK0341ETMsg.GENE_ADD_DTM));
				outMsg.set(KK0341ETMsg.KKTK_SVC_KEI_STAT, rsltQuery.getString(KK0341ETMsg.KKTK_SVC_KEI_STAT));
				outMsg.set(KK0341ETMsg.KKTK_SVC_CD, rsltQuery.getString(KK0341ETMsg.KKTK_SVC_CD));
				outMsg.set(KK0341ETMsg.PCRS_CD, rsltQuery.getString(KK0341ETMsg.PCRS_CD));
				outMsg.set(KK0341ETMsg.PPLAN_CD, rsltQuery.getString(KK0341ETMsg.PPLAN_CD));
				outMsg.set(KK0341ETMsg.KKTK_SBT_CD, rsltQuery.getString(KK0341ETMsg.KKTK_SBT_CD));
				outMsg.set(KK0341ETMsg.OYA_KEI_SKBT_CD, rsltQuery.getString(KK0341ETMsg.OYA_KEI_SKBT_CD));
				outMsg.set(KK0341ETMsg.SVC_KEI_NO, rsltQuery.getString(KK0341ETMsg.SVC_KEI_NO));
				outMsg.set(KK0341ETMsg.SVC_KEI_UCWK_NO, rsltQuery.getString(KK0341ETMsg.SVC_KEI_UCWK_NO));
				outMsg.set(KK0341ETMsg.SVC_KEI_KAISEN_UCWK_NO, rsltQuery.getString(KK0341ETMsg.SVC_KEI_KAISEN_UCWK_NO));
				outMsg.set(KK0341ETMsg.OP_SVC_KEI_NO, rsltQuery.getString(KK0341ETMsg.OP_SVC_KEI_NO));
				outArray.add(outMsg);
			}
			return outArray.toArray(new CAANMsg[0]);
		}
		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 inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiMap サービス契約番号マップ
	 * @param opeDate 運用日付
	 * @return 請求オプションサービス契約明細
	 */
	private CAANMsg[] getKK0441bySvcKei(AgentDispatchContext inContext, HashMap<String, String> svcKeiMap, String opeDate)
	{
		// 結果返却用変数
		ArrayList<CAANMsg> outArray = new ArrayList<CAANMsg>();

		// 契約件数判定
		if (NODATA == svcKeiMap.size())
		{
			// 0件の場合、処理終了
			return outArray.toArray(new CAANMsg[0]);
		}
		else if (MAXIN < svcKeiMap.size())
		{
			// 1000件より多い場合、エラー
			throw new IllegalArgumentException("サービス契約件数が最大値を超えています。");
		}

		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			// コネクション取得
			con1 = JSYejbConnection.getConnection(KK0441ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK0441.SEIOPSVC_KEI_NO ");
			sql_Buff.append("      , KK0441.GENE_ADD_DTM ");
			sql_Buff.append("      , KK0441.SEIOPSVC_KEI_STAT ");
			sql_Buff.append("      , KK0441.SEIKY_KEI_NO ");
			sql_Buff.append("      , KK0441.SEIOPSVC_CD ");
			sql_Buff.append("      , KK0441.PCRS_CD ");
			sql_Buff.append("      , KK0441.PPLAN_CD ");
			sql_Buff.append("      , KK0441.SVC_KEI_NO ");
			sql_Buff.append(" FROM   KK_T_KAKINS KK0321 ");
			sql_Buff.append(" INNER JOIN ");
			sql_Buff.append("        KK_T_SEIKY_KEI KK0491 ");
			sql_Buff.append(" ON     KK0321.SEIKY_KEI_NO = KK0491.SEIKY_KEI_NO ");
			sql_Buff.append(" INNER JOIN ");
			sql_Buff.append("        KK_T_SEIOPSVC_KEI KK0441 ");
			sql_Buff.append(" ON     KK0491.SEIKY_KEI_NO = KK0441.SEIKY_KEI_NO ");
			sql_Buff.append(" WHERE  KK0321.KAKINS_TSTAYMD <= ? ");
			sql_Buff.append(" AND    KK0321.KAKINS_TENDYMD >= ? ");
			sql_Buff.append(" AND    KK0321.MK_FLG = '0' ");
			sql_Buff.append(" AND    ( KK0491.SEIKY_KEI_NO, KK0491.RSV_APLY_YMD || KK0491.GENE_ADD_DTM ) = ");
			sql_Buff.append("        ( SELECT KK0491_GENE.SEIKY_KEI_NO, MAX( KK0491_GENE.RSV_APLY_YMD || KK0491_GENE.GENE_ADD_DTM ) AS KK0491_MAX ");
			sql_Buff.append("          FROM  KK_T_SEIKY_KEI KK0491_GENE ");
			sql_Buff.append("          WHERE KK0491_GENE.SEIKY_KEI_NO = KK0491.SEIKY_KEI_NO ");
			sql_Buff.append("          AND   KK0491_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("          AND   KK0491_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("          AND   KK0491_GENE.MK_FLG = '0' ");
			sql_Buff.append("          GROUP BY KK0491_GENE.SEIKY_KEI_NO ");
			sql_Buff.append("        ) ");
			sql_Buff.append(" AND    ( KK0441.SEIOPSVC_KEI_NO, KK0441.RSV_APLY_YMD || KK0441.GENE_ADD_DTM ) = ");
			sql_Buff.append("        ( SELECT KK0441_GENE.SEIOPSVC_KEI_NO, MAX( KK0441_GENE.RSV_APLY_YMD || KK0441_GENE.GENE_ADD_DTM ) AS KK0441_MAX ");
			sql_Buff.append("          FROM  KK_T_SEIOPSVC_KEI KK0441_GENE ");
			sql_Buff.append("          WHERE KK0441_GENE.SEIOPSVC_KEI_NO = KK0441.SEIOPSVC_KEI_NO ");
			sql_Buff.append("          AND   KK0441_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("          AND   KK0441_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("          AND   KK0441_GENE.MK_FLG = '0' ");
			sql_Buff.append("          GROUP BY KK0441_GENE.SEIOPSVC_KEI_NO ");
			sql_Buff.append("        ) ");
			sql_Buff.append(" AND    KK0441.SEIOPSVC_KEI_STAT NOT IN ('910', '920') ");
			sql_Buff.append(" AND    KK0321.SVC_KEI_NO IN ( ");
			for (int i = 0; i < svcKeiMap.size(); i++)
			{
				if ( i > 0 )
				{
					sql_Buff.append(" , ");
				}
				sql_Buff.append(" ? ");
			}
			sql_Buff.append(" ) ");

			// prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			// ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータ設定用変数
			int iParam = 0;

			// パラメータの設定
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			for (Map.Entry<String, String> svcKeiNo: svcKeiMap.entrySet())
			{
				CAANJDBCUtil.setParam(pstmt, ++iParam, svcKeiNo.getKey());
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 結果を返却する
			while (rsltQuery.next())
			{
				CAANMsg outMsg = new CAANMsg(KK0441ETMsg.class.getName());
				outMsg.set(KK0441ETMsg.SEIOPSVC_KEI_NO, rsltQuery.getString(KK0441ETMsg.SEIOPSVC_KEI_NO));
				outMsg.set(KK0441ETMsg.GENE_ADD_DTM, rsltQuery.getString(KK0441ETMsg.GENE_ADD_DTM));
				outMsg.set(KK0441ETMsg.SEIOPSVC_KEI_STAT, rsltQuery.getString(KK0441ETMsg.SEIOPSVC_KEI_STAT));
				outMsg.set(KK0441ETMsg.SEIKY_KEI_NO, rsltQuery.getString(KK0441ETMsg.SEIKY_KEI_NO));
				outMsg.set(KK0441ETMsg.SEIOPSVC_CD, rsltQuery.getString(KK0441ETMsg.SEIOPSVC_CD));
				outMsg.set(KK0441ETMsg.PCRS_CD, rsltQuery.getString(KK0441ETMsg.PCRS_CD));
				outMsg.set(KK0441ETMsg.PPLAN_CD, rsltQuery.getString(KK0441ETMsg.PPLAN_CD));
				outMsg.set(KK0441ETMsg.SVC_KEI_NO, rsltQuery.getString(KK0441ETMsg.SVC_KEI_NO));
				outArray.add(outMsg);
			}
			return outArray.toArray(new CAANMsg[0]);
		}
		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 inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiMap サービス契約番号マップ
	 * @param opeDate 運用日付
	 * @return 請求オプションサービス契約明細
	 */
	private CAANMsg[] getKK2811bySvcKei(AgentDispatchContext inContext, HashMap<String, String> svcKeiMap, String opeDate)
	{
		// 結果返却用変数
		ArrayList<CAANMsg> outArray = new ArrayList<CAANMsg>();

		// 契約件数判定
		if (NODATA == svcKeiMap.size())
		{
			// 0件の場合、処理終了
			return outArray.toArray(new CAANMsg[0]);
		}
		else if (MAXIN < svcKeiMap.size())
		{
			// 1000件より多い場合、エラー
			throw new IllegalArgumentException("サービス契約件数が最大値を超えています。");
		}

		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			// コネクション取得
			con1 = JSYejbConnection.getConnection(KK0441ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ");
			sql_Buff.append(" 	 KK2811.KKOP_SVC_KEI_NO ");
			sql_Buff.append(" 	,KK2811.GENE_ADD_DTM ");
			sql_Buff.append(" 	,KK2811.KKOP_SVC_KEI_STAT ");
			sql_Buff.append(" 	,KK2811.KKOP_SVC_CD ");
			sql_Buff.append(" 	,KK2811.PCRS_CD ");
			sql_Buff.append(" 	,KK2811.PPLAN_CD ");
			sql_Buff.append(" 	,KK2811.KKTK_SVC_KEI_NO ");
			sql_Buff.append(" FROM ");
			sql_Buff.append(" 	KK_T_SVC_KEI KK0081 ");
			sql_Buff.append(" 	INNER JOIN KK_T_KAISEN_TG_SVKEI KK0241 ");
			sql_Buff.append(" 	ON KK0081.SVC_KEI_NO = KK0241.SVC_KEI_NO ");
			sql_Buff.append(" 	INNER JOIN KK_T_SVKEI_KAISEN_UW KK0251 ");
			sql_Buff.append(" 	ON KK0241.SVC_KEI_KAISEN_UCWK_NO = KK0251.SVC_KEI_KAISEN_UCWK_NO ");
			sql_Buff.append(" 	INNER JOIN KK_T_KKTK_SVC_KEI KK0341 ");
			sql_Buff.append(" 	ON KK0251.SVC_KEI_KAISEN_UCWK_NO = KK0341.SVC_KEI_KAISEN_UCWK_NO ");
			sql_Buff.append(" 	INNER JOIN KK_T_KKOP_SVC_KEI KK2811 ");
			sql_Buff.append(" 	ON KK2811.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append(" 	INNER JOIN KK_M_EO_BRAND_KKOSV KK2851 ");
			sql_Buff.append(" 	ON KK2811.KKOP_SVC_CD = KK2851.KKOP_SVC_CD ");	
			sql_Buff.append(" WHERE KK2851.EO_BRAND_CD = KK0081.SVC_CD ");
			sql_Buff.append(" 		AND    (KK2811.KKOP_SVC_KEI_NO, KK2811.RSV_APLY_YMD || KK2811.GENE_ADD_DTM) = ");
			sql_Buff.append(" 	(SELECT KK2811_GENE.KKOP_SVC_KEI_NO, MAX(KK2811_GENE.RSV_APLY_YMD || KK2811_GENE.GENE_ADD_DTM) AS KK2811_MAX ");
			sql_Buff.append(" 	FROM   KK_T_KKOP_SVC_KEI KK2811_GENE ");
			sql_Buff.append(" 	WHERE  KK2811_GENE.KKOP_SVC_KEI_NO = KK2811.KKOP_SVC_KEI_NO ");
			sql_Buff.append(" 		AND    KK2811_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append(" 		AND    KK2811_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append(" 		AND    KK2811_GENE.MK_FLG = '0' ");
			sql_Buff.append(" 		GROUP BY KK2811_GENE.KKOP_SVC_KEI_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 <= ? ");
			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) ");
			sql_Buff.append(" 		AND    (KK0341.KKTK_SVC_KEI_NO, KK0341.RSV_APLY_YMD || KK0341.GENE_ADD_DTM) = ");
			sql_Buff.append(" 	(SELECT KK0341_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_GENE.RSV_APLY_YMD || KK0341_GENE.GENE_ADD_DTM) AS KK0341_MAX ");
			sql_Buff.append(" 	FROM   KK_T_KKTK_SVC_KEI KK0341_GENE ");
			sql_Buff.append(" 	WHERE  KK0341_GENE.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append(" 		AND    KK0341_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append(" 		AND    KK0341_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append(" 		AND    KK0341_GENE.MK_FLG = '0' ");
			sql_Buff.append(" 		GROUP BY KK0341_GENE.KKTK_SVC_KEI_NO) ");
			sql_Buff.append(" 	AND    (KK0251.SVC_KEI_KAISEN_UCWK_NO, KK0251.GENE_ADD_DTM) = ");
			sql_Buff.append(" 		(SELECT KK0251_GENE.SVC_KEI_KAISEN_UCWK_NO, MAX(KK0251_GENE.GENE_ADD_DTM) AS KK0251_MAX ");
			sql_Buff.append(" 		FROM   KK_T_SVKEI_KAISEN_UW KK0251_GENE ");
			sql_Buff.append(" 		WHERE  KK0251_GENE.SVC_KEI_KAISEN_UCWK_NO = KK0251.SVC_KEI_KAISEN_UCWK_NO ");
			sql_Buff.append(" 		AND    KK0251_GENE.MK_FLG = '0' ");
			sql_Buff.append(" 		GROUP BY KK0251_GENE.SVC_KEI_KAISEN_UCWK_NO) ");
			sql_Buff.append(" 	AND    KK2851.EO_BRAND_KKOP_SVC_TSTAYMD <=  ? ");
			sql_Buff.append(" 	AND    KK2851.EO_BRAND_KKOP_SVC_TENDYMD >=  ? ");
			sql_Buff.append(" 	AND    KK2811.MK_FLG = '0' ");
			sql_Buff.append(" 	AND    KK2851.MK_FLG = '0' ");
			sql_Buff.append("   AND    KK0081.SVC_KEI_NO in (  ");
			for (int i = 0; i < svcKeiMap.size(); i++)
			{
				if ( i > 0 )
				{
					sql_Buff.append(" , ");
				}
				sql_Buff.append(" ? ");
			}
			sql_Buff.append(" ) ");

			// prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			// ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータ設定用変数
			int iParam = 0;

			// パラメータの設定
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			for (Map.Entry<String, String> svcKeiNo: svcKeiMap.entrySet())
			{
				CAANJDBCUtil.setParam(pstmt, ++iParam, svcKeiNo.getKey());
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 結果を返却する
			while (rsltQuery.next())
			{
				CAANMsg outMsg = new CAANMsg(KK2811ETMsg.class.getName());
				outMsg.set(KK2811ETMsg.KKOP_SVC_KEI_NO, rsltQuery.getString(KK2811ETMsg.KKOP_SVC_KEI_NO));
				outMsg.set(KK2811ETMsg.GENE_ADD_DTM, rsltQuery.getString(KK2811ETMsg.GENE_ADD_DTM));
				outMsg.set(KK2811ETMsg.KKOP_SVC_KEI_STAT, rsltQuery.getString(KK2811ETMsg.KKOP_SVC_KEI_STAT));
				outMsg.set(KK2811ETMsg.KKOP_SVC_CD, rsltQuery.getString(KK2811ETMsg.KKOP_SVC_CD));
				outMsg.set(KK2811ETMsg.PCRS_CD, rsltQuery.getString(KK2811ETMsg.PCRS_CD));
				outMsg.set(KK2811ETMsg.PPLAN_CD, rsltQuery.getString(KK2811ETMsg.PPLAN_CD));
				outMsg.set(KK2811ETMsg.KKTK_SVC_KEI_NO, rsltQuery.getString(KK2811ETMsg.KKTK_SVC_KEI_NO));
				outArray.add(outMsg);
			}
			return outArray.toArray(new CAANMsg[0]);
		}
		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 inContext Agentから渡されたAgentDispatchContext
	 * @param wribSvcCd 割引サービスコード
	 * @param opeDate 運用日付
	 * @return 割引サービス対象サービス明細（値引対象）
	 */
	private CAANMsg[] getKK0851(AgentDispatchContext inContext, String wribSvcCd, String opeDate)
	{
		// 結果返却用変数
		ArrayList<CAANMsg> outArray = new ArrayList<CAANMsg>();

		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			// コネクション取得
			con1 = JSYejbConnection.getConnection(KK0851ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK0851.WRIB_SVC_TRGT_SVC_CD ");
			sql_Buff.append("        , KK0851.GENE_ADD_DTM ");
			sql_Buff.append("        , KK0851.WRIB_SVC_CD ");
			sql_Buff.append("        , KK0851.WRIB_SVC_TRGT_SVC_SBT_CD ");
			sql_Buff.append("        , KK0851.SVC_CD ");
			sql_Buff.append("        , KK0851.PRC_GRP_CD ");
			sql_Buff.append("        , KK0851.PCRS_CD ");
			sql_Buff.append("        , KK0851.PPLAN_CD ");
			sql_Buff.append("        , KK0851.OP_SVC_CD ");
			sql_Buff.append("        , KK0851.SBOP_SVC_CD ");
			sql_Buff.append("        , KK0851.KKTK_SVC_CD ");
			sql_Buff.append("        , KK0851.KKTK_SBT_CD ");
			sql_Buff.append("        , KK0851.SEIOPSVC_CD ");
			sql_Buff.append("        , KK0851.KKOP_SVC_CD ");
			sql_Buff.append(" FROM   KK_M_WRISVC_TG_SVC KK0851 ");
			sql_Buff.append(" WHERE  KK0851.WRIB_SVC_TRGT_SVC_TSTAYMD <= ? ");
			sql_Buff.append(" AND    KK0851.WRIB_SVC_TRGT_SVC_TENDYMD >= ? ");
			sql_Buff.append(" AND    ( KK0851.WRIB_SVC_TRGT_SVC_CD, KK0851.RSV_APLY_YMD || KK0851.GENE_ADD_DTM ) = ");
			sql_Buff.append("        ( SELECT KK0851_GENE.WRIB_SVC_TRGT_SVC_CD, MAX( KK0851_GENE.RSV_APLY_YMD || KK0851_GENE.GENE_ADD_DTM ) AS KK0851_MAX ");
			sql_Buff.append("          FROM  KK_M_WRISVC_TG_SVC KK0851_GENE ");
			sql_Buff.append("          WHERE KK0851_GENE.WRIB_SVC_TRGT_SVC_CD = KK0851.WRIB_SVC_TRGT_SVC_CD ");
			sql_Buff.append("          AND   KK0851_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("          AND   KK0851_GENE.MK_FLG = '0' ");
			sql_Buff.append("          GROUP BY KK0851_GENE.WRIB_SVC_TRGT_SVC_CD ");
			sql_Buff.append("        ) ");
			sql_Buff.append(" AND    KK0851.WRIB_SVC_TRGT_SVC_SBT_CD = '3' ");
			sql_Buff.append(" AND    KK0851.WRIB_SVC_CD = ? ");

			// prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			// ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータ設定用変数
			int iParam = 0;

			// パラメータの設定
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			CAANJDBCUtil.setParam(pstmt, ++iParam, opeDate);
			CAANJDBCUtil.setParam(pstmt, ++iParam, wribSvcCd);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 結果を返却する
			while (rsltQuery.next())
			{
				CAANMsg outMsg = new CAANMsg(KK0851ETMsg.class.getName());
				outMsg.set(KK0851ETMsg.WRIB_SVC_TRGT_SVC_CD, rsltQuery.getString(KK0851ETMsg.WRIB_SVC_TRGT_SVC_CD));
				outMsg.set(KK0851ETMsg.GENE_ADD_DTM, rsltQuery.getString(KK0851ETMsg.GENE_ADD_DTM));
				outMsg.set(KK0851ETMsg.WRIB_SVC_CD, rsltQuery.getString(KK0851ETMsg.WRIB_SVC_CD));
				outMsg.set(KK0851ETMsg.WRIB_SVC_TRGT_SVC_SBT_CD, rsltQuery.getString(KK0851ETMsg.WRIB_SVC_TRGT_SVC_SBT_CD));
				outMsg.set(KK0851ETMsg.SVC_CD, rsltQuery.getString(KK0851ETMsg.SVC_CD));
				outMsg.set(KK0851ETMsg.PRC_GRP_CD, rsltQuery.getString(KK0851ETMsg.PRC_GRP_CD));
				outMsg.set(KK0851ETMsg.PCRS_CD, rsltQuery.getString(KK0851ETMsg.PCRS_CD));
				outMsg.set(KK0851ETMsg.PPLAN_CD, rsltQuery.getString(KK0851ETMsg.PPLAN_CD));
				outMsg.set(KK0851ETMsg.OP_SVC_CD, rsltQuery.getString(KK0851ETMsg.OP_SVC_CD));
				outMsg.set(KK0851ETMsg.SBOP_SVC_CD, rsltQuery.getString(KK0851ETMsg.SBOP_SVC_CD));
				outMsg.set(KK0851ETMsg.KKTK_SVC_CD, rsltQuery.getString(KK0851ETMsg.KKTK_SVC_CD));
				outMsg.set(KK0851ETMsg.KKTK_SBT_CD, rsltQuery.getString(KK0851ETMsg.KKTK_SBT_CD));
				outMsg.set(KK0851ETMsg.SEIOPSVC_CD, rsltQuery.getString(KK0851ETMsg.SEIOPSVC_CD));
				outMsg.set(KK0851ETMsg.KKOP_SVC_CD, rsltQuery.getString(KK0851ETMsg.KKOP_SVC_CD));
				outArray.add(outMsg);
			}
			return outArray.toArray(new CAANMsg[0]);
		}
		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);
			}
		}
	}
}
