/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKNowSvcInfoCC
*	ソースファイル名：JKKNowSvcInfoCC.java
*	作成者			：FJ
*	日付			：2011年12月19日
*＜機能概要＞
*	現サービス情報照会の共通コンポーネント
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/12/19	FJ			新規作成
*	v3.00.00	2012/08/18	FJ) 団		ANK-0046-01-00対応
*	v4.00.00	2012/09/07	FJ) 団		ANK-0546-02-00対応
*	v4.00.01	2013/04/15	FJ)強矢		SGY-2013-0000042 メーリングリストドメインの業パラ取得対応
*
**********************************************************************/

package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;

import eo.ejb.cbs.cbsmsg.EKK0161B004CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161B004CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0171A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0171A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0351B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0361A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0361A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0401B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0401B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0411A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0411A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg1List;

/**
 * 現サービス情報照会の共通コンポーネントです。<p>
 * <br>
 * @author 富士通
 *
 */
public class JKKNowSvcInfoCC extends AbstractCommonComponent
{

	/** CBSMsgのテンプレートID項目 */
	private static final String TEMPLATEID = "templateID";
	
	/** CBSMsgの機能コード項目 */
	private static final String FUNC_CODE = "func_code";
	
	/** CBSMsgのステータス項目 */
	private static final String STATUS = "status";
	
	/** 機能コード：1 */
	static final String FUNC_CD_1 = "1";

	/** 機能コード：2 */
	static final String FUNC_CD_2 = "2";
	
	/** テンプレートID（EKK0161B004：サービス契約内訳一覧照会） */
	private static final String TEMPLATE_ID_EKK0161B004 = "EKK0161B004";
	
	/** テンプレートID（EKK0171A010：サービス契約内訳＜eo光ネット＞一意照会） */
	private static final String TEMPLATE_ID_EKK0171A010 = "EKK0171A010";
	
	/** テンプレートID（EKK0351B002：オプションサービス契約一覧照会（サービス契約番号）） */
	private static final String TEMPLATE_ID_EKK0351B002 = "EKK0351B002";

	/** テンプレートID（EKK0361A010：オプションサービス契約＜ISP＞一意照会） */
	private static final String TEMPLATE_ID_EKK0361A010 = "EKK0361A010";

	/** テンプレートID（EKK0401B001：サブオプションサービス契約一覧照会） */
	private static final String TEMPLATE_ID_EKK0401B001 = "EKK0401B001";

	/** テンプレートID（EKK0411A010：サブオプションサービス契約＜ISP＞一意照会） */
	private static final String TEMPLATE_ID_EKK0411A010 = "EKK0411A010";
	
	/** テンプレートID(EZM0321A010) */
	private static final String TEMPLATE_ID_EZM0321A010 = "EZM0321A010";
	
	/** サービスID */
	private static final String SERVICE_ID = "KKSV033901CC";
	
	
	/**
	 * 現サービス情報の照会を行う。<BR>
	 * サービス契約内訳一覧照会サービスインターフェイスを呼出し、
	 * サービス契約内訳一覧照会明細の件数分、
	 * サービス契約内訳＜eo光ネット＞一意照会サービスインターフェイスを呼出す。<BR>
	 * オプションサービス契約一覧照会（サービス契約番号）サービスインターフェイスを呼出し、
	 * オプションサービス契約一覧照会（サービス契約番号）明細の件数分、
	 * オプションサービス契約＜ISP＞一意照会、サブオプションサービス契約一覧照会、サブオプションサービス契約＜ISP＞一意照会の
	 * サービスインターフェイスを呼出し、現サービス情報の照会を行う。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return パラメータマップ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite searchNowSvcInfo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		
		HashMap<String, Object> work02Map = new HashMap<String, Object>();
		param.setData("KKSV0339WORK02", work02Map);
		
		HashMap<String, Object> work01Map = (HashMap<String, Object>)param.getData("KKSV0339WORK01");
		String op_sbt = (String)work01Map.get("opshon_shubt");
		String search_flg = (String)work01Map.get("search_flg");
		String out_flg = (String)work01Map.get("out_flg");
		
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(SERVICE_ID);
		
		// 処理対象外のオプション種別の場合
		if (!judgeOpSbt(op_sbt))
		{
			// 結果コードを格納せずに処理を終了する
			return param;
		}
		
		// ■オプション種別が"0010"（認証ＩＤ）の場合
		if ("0010".equals(op_sbt))
		{
			// サービス契約内訳番号に紐づく認証ＩＤ等の取得処理
			searchSvcKeiUcwkInfo(handle, param, scCall);
		}
		// ■オプション種別が"0010"（認証ＩＤ）以外の場合
		else
		{
			ArrayList<HashMap<String, Object>> opSvcKeiList = new ArrayList<HashMap<String, Object>>();
			
			// *** EKK0351B002(オプションサービス契約一覧照会（サービス契約番号）) の実行 ***
			// ◇ 上りマッピング処理
			Object[][] ekk0351b002IN = {
					// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
					{EKK0351B002CBSMsg.KEY_SVC_KEI_NO, (String)ccMsg.get("key_svc_kei_no")},
					// "" => ＫＥＹ＿サービス契約内訳番号
					{EKK0351B002CBSMsg.KEY_SVC_KEI_UCWK_NO, ""},
					// ＫＥＹ＿オプションサービスコード => ＫＥＹ＿オプションサービスコード
					{EKK0351B002CBSMsg.KEY_OP_SVC_CD, getOpSvcCd(op_sbt)},
					// "" => ＫＥＹ＿基準年月日
					{EKK0351B002CBSMsg.KEY_BASE_YMD, ""}
			};
			
			// ◇ SC呼出実行
			CAANMsg ekk0351b002Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0351B002, FUNC_CD_1, ekk0351b002IN);
			
			// 処理結果判定
			CAANMsg[] ekk0351b002MsgList = ekk0351b002Msg.getCAANMsgList(EKK0351B002CBSMsg.EKK0351B002CBSMSG1LIST);
			
			for (int i = 0; i < ekk0351b002MsgList.length; i++)
			{
				// 情報検索条件フラグが"0"の場合、
				// サービスが適用されている情報（サービス開始年月日 <= 運用日 <= サービス終了年月日）を対象データとする。
				if("0".equals(search_flg))
				{
					String op_svc_kei_stat = ekk0351b002MsgList[i].getString(EKK0351B002CBSMsg1List.OP_SVC_KEI_STAT);
					// "020"(照査済)"030"(締結済)"100"(サービス提供中)"210"(休止・中断中)"220"(停止中)以外は対象データとしない。
					if (!("020".equals(op_svc_kei_stat) 
							|| "030".equals(op_svc_kei_stat) 
							|| "100".equals(op_svc_kei_stat) 
							|| "210".equals(op_svc_kei_stat)
							|| "220".equals(op_svc_kei_stat)))
					{
						continue;
					}
				}
				
				// ◇ 下りデータの作成
				HashMap<String, Object> opSvcKeiMap = new HashMap<String, Object>();
				
				opSvcKeiMap.put("op_svc_kei_no", ekk0351b002MsgList[i].getString(EKK0351B002CBSMsg1List.OP_SVC_KEI_NO));
				opSvcKeiMap.put("svc_kei_no", ekk0351b002MsgList[i].getString(EKK0351B002CBSMsg1List.SVC_KEI_NO));
				opSvcKeiMap.put("plan_staymd", ekk0351b002MsgList[i].getString(EKK0351B002CBSMsg1List.PLAN_STAYMD));
				
				opSvcKeiList.add(opSvcKeiMap);
			}
			
			ArrayList<HashMap<String, Object>> opSvcKeiIspList = new ArrayList<HashMap<String, Object>>();
			
			// ■オプション種別が"0060"（ＳＯＨＯパック１０）"0170"（有害サイトブロック）"0350"（IPv6オプション）"360"（フェムトセル）"370"（スマートリンクプレミアム）以外の場合
			if (!("0060".equals(op_sbt) || "0170".equals(op_sbt) || "0350".equals(op_sbt) || "0360".equals(op_sbt) || "0370".equals(op_sbt)))
			{
				for (int i = 0; i < opSvcKeiList.size(); i++)
				{
					HashMap<String, Object> opSvcKeiMap = opSvcKeiList.get(i);
					String op_svc_kei_no = (String)opSvcKeiMap.get("op_svc_kei_no");
					
					HashMap<String, Object> opSvcKeiIspMap = null;
					int session_cnt = 0;
					
					// *** EKK0361A010(オプションサービス契約<ISP>一意照会) の実行 ***
					// ◇ 上りマッピング処理
					Object[][] ekk0361a010IN = {
							// EKK0351B002.オプションサービス契約番号 => ＫＥＹ＿オプションサービス契約番号
							{EKK0361A010CBSMsg.KEY_OP_SVC_KEI_NO, op_svc_kei_no},
							// "" => ＫＥＹ＿世代登録年月日時分秒
							{EKK0361A010CBSMsg.KEY_GENE_ADD_DTM, ""}
					};
					
					// ◇ SC呼出実行
					CAANMsg ekk0361a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0361A010, FUNC_CD_2, ekk0361a010IN);
					
					// 処理結果判定
					CAANMsg[] ekk0361a010MsgList = ekk0361a010Msg.getCAANMsgList(EKK0361A010CBSMsg.EKK0361A010CBSMSG1LIST);
					
					if (ekk0361a010MsgList != null && 0 < ekk0361a010MsgList.length)
					{
						// 対象データ判定
						if (judgeData(out_flg, op_sbt, ekk0361a010MsgList[0]))
						{
							// ◇ 下りデータの作成
							opSvcKeiIspMap = new HashMap<String, Object>();
							session_cnt++;
							
							opSvcKeiIspMap.put("mltise_shk_ninsho_id_pwd",
									ekk0361a010MsgList[0].getString(EKK0361A010CBSMsg1List.MLTISE_SHK_NINSHO_ID_PWD));
							opSvcKeiIspMap.put("mltise_ninsho_id", ekk0361a010MsgList[0].getString(EKK0361A010CBSMsg1List.MLTISE_NINSHO_ID));
							opSvcKeiIspMap.put("mltise_ninsho_id_pwd",
									ekk0361a010MsgList[0].getString(EKK0361A010CBSMsg1List.MLTISE_NINSHO_ID_PWD));
							opSvcKeiIspMap.put("kotei_ip_ad", ekk0361a010MsgList[0].getString(EKK0361A010CBSMsg1List.KOTEI_IP_AD));
							opSvcKeiIspMap.put("pop_id", ekk0361a010MsgList[0].getString(EKK0361A010CBSMsg1List.POP_ID));
							opSvcKeiIspMap.put("mlad", ekk0361a010MsgList[0].getString(EKK0361A010CBSMsg1List.MLAD));
							opSvcKeiIspMap.put("mlad_chge_ymd", ekk0361a010MsgList[0].getString(EKK0361A010CBSMsg1List.MLAD_CHGE_YMD));
							opSvcKeiIspMap.put("capa", ekk0361a010MsgList[0].getString(EKK0361A010CBSMsg1List.CAPA));
							opSvcKeiIspMap.put("web_id", ekk0361a010MsgList[0].getString(EKK0361A010CBSMsg1List.WEB_ID));
							opSvcKeiIspMap.put("url_domain", ekk0361a010MsgList[0].getString(EKK0361A010CBSMsg1List.URL_DOMAIN));
							opSvcKeiIspMap.put("url_account", ekk0361a010MsgList[0].getString(EKK0361A010CBSMsg1List.URL_ACCOUNT));
							opSvcKeiIspMap.put("mllist_nm", ekk0361a010MsgList[0].getString(EKK0361A010CBSMsg1List.MLLIST_NM));
							opSvcKeiIspMap.put("dpad_id", ekk0361a010MsgList[0].getString(EKK0361A010CBSMsg1List.DPAD_ID));
							opSvcKeiIspMap.put("dpad_isp_id", ekk0361a010MsgList[0].getString(EKK0361A010CBSMsg1List.DPAD_ISP_ID));
							opSvcKeiIspMap.put("dpad_mapid", ekk0361a010MsgList[0].getString(EKK0361A010CBSMsg1List.DPAD_MAPID));
							opSvcKeiIspMap.put("wish_ownr_id", ekk0361a010MsgList[0].getString(EKK0361A010CBSMsg1List.WISH_OWNR_ID));
							
							// ダイヤルアップ接続用認証ID は opSvcKeiMap に格納する
							opSvcKeiMap.put("dupcon_ninsho_id", ekk0361a010MsgList[0].getString(EKK0361A010CBSMsg1List.DUPCON_NINSHO_ID));
						}
						
					}
					
					// ■オプション種別が"0020"（Ｅメール）の場合
					if ("0020".equals(op_sbt))
					{
						// ウイルスチェックを出力させるため生成
						if (opSvcKeiIspMap == null)
						{
							opSvcKeiIspMap = new HashMap<String, Object>();
						}
						
						// *** EKK0401B001(サブオプションサービス契約一覧照会) の実行 ***
						// サブオプションサービスコードが"D01"（メールエイリアス）
						ArrayList<CAANMsg> sbopSvcKeiInfoList = searchSbopSvcKeiInfo(handle, param, scCall, op_svc_kei_no, op_sbt, "D01");
						
						if (0 < sbopSvcKeiInfoList.size())
						{
							// オプションサービス契約番号とサブオプションサービスコードを条件にしているため
							// サブオプションサービス契約は１レコードのみ取得される
							CAANMsg ekk0401b001Msg = sbopSvcKeiInfoList.get(0);
							
							// *** EKK0411A010(サブオプションサービス契約<ISP>一意照会) の実行 ***
							// ◇ 上りマッピング処理
							Object[][] ekk0411a010IN = {
									// EKK0351B002.オプションサービス契約番号 => ＫＥＹ＿オプションサービス契約番号
									{EKK0411A010CBSMsg.KEY_OP_SVC_KEI_NO, op_svc_kei_no},
									// EKK0401B001.サブオプションサービス契約番号 => ＫＥＹ＿サブオプションサービス契約番号
									{EKK0411A010CBSMsg.KEY_SBOP_SVC_KEI_NO, ekk0401b001Msg.getString(EKK0401B001CBSMsg1List.SBOP_SVC_KEI_NO)},
									// "" => ＫＥＹ＿世代登録年月日時分秒
									{EKK0411A010CBSMsg.KEY_GENE_ADD_DTM, ""}
							};
							
							// ◇ SC呼出実行
							CAANMsg ekk0411a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0411A010, FUNC_CD_2, ekk0411a010IN);
							
							// 処理結果判定
							CAANMsg[] ekk0411a010MsgList = ekk0411a010Msg.getCAANMsgList(EKK0411A010CBSMsg.EKK0411A010CBSMSG1LIST);
							
							if (ekk0411a010MsgList != null && 0 < ekk0411a010MsgList.length)
							{
								// ◇ 下りデータの作成
								opSvcKeiIspMap.put("alias", ekk0411a010MsgList[0].getString(EKK0411A010CBSMsg1List.ALIAS));
								opSvcKeiIspMap.put("alias_chge_ymd", ekk0411a010MsgList[0].getString(EKK0411A010CBSMsg1List.ALIAS_CHGE_YMD));
							}
						}
						
						// *** EKK0401B001(サブオプションサービス契約一覧照会) の実行 ***
						// サブオプションサービスコードが"D03"（メールウイルスチェック）
						ArrayList<CAANMsg> mlVirusMsgList = searchSbopSvcKeiInfo(handle, param, scCall, op_svc_kei_no, op_sbt, "D03");
						
						// ◇ 下りデータの作成
						// ウイルスチェック
						// サブオプションサービス契約一覧照会明細の件数が存在する場合、"1"(チェックする)を設定。存在しない場合、"0"(チェックしない)を設定
						opSvcKeiIspMap.put("mr_uirschek", 0 < mlVirusMsgList.size() ? "1" : "0");
						
					}
					// ■オプション種別が"0030"（Ｍｙホームページ）の場合
					else if ("0030".equals(op_sbt))
					{
						// アクセス分析を出力させるため生成
						if (opSvcKeiIspMap == null)
						{
							opSvcKeiIspMap = new HashMap<String, Object>();
						}
						
						// *** EKK0401B001(サブオプションサービス契約一覧照会) の実行 ***
						// サブオプションサービスコードが"D05"（ホームページアクセス分析）
						ArrayList<CAANMsg> hpAccsMsgList = searchSbopSvcKeiInfo(handle, param, scCall, op_svc_kei_no, op_sbt, "D05");
						
						// ◇ 下りデータの作成
						// アクセス分析
						// サブオプションサービス契約一覧照会明細の件数が存在する場合、"1"(利用有り)を設定。存在しない場合、"0"(利用なし)を設定
						opSvcKeiIspMap.put("web_accs_bnsk", 0 < hpAccsMsgList.size() ? "1" : "0");
						
					}
					// ■オプション種別が"0160"（マルチセッション）の場合
					else if ("0160".equals(op_sbt))
					{
						// セッション数を出力させるため生成
						if (opSvcKeiIspMap == null)
						{
							opSvcKeiIspMap = new HashMap<String, Object>();
						}
						
						// ◇ 下りデータの作成
						// セッション数
						// オプションサービス契約<ISP>一意照会明細の件数を設定
						opSvcKeiIspMap.put("session_cnt", String.valueOf(session_cnt));
					}
					// ■オプション種別が"0320"（ダイヤルアップ接続）の場合
					else if ("0320".equals(op_sbt))
					{
						ArrayList<HashMap<String, Object>> sbopSvcKeiList = new ArrayList<HashMap<String, Object>>();
						
						// *** EKK0401B001(サブオプションサービス契約一覧照会) の実行 ***
						ArrayList<CAANMsg> sbopSvcKeiInfoList = searchSbopSvcKeiInfo(handle, param, scCall, op_svc_kei_no, op_sbt, "");
						
						for (int j = 0; j < sbopSvcKeiInfoList.size(); j++)
						{
							CAANMsg ekk0401b001Msg = sbopSvcKeiInfoList.get(j);
							
							// ◇ 下りデータの作成
							HashMap<String, Object> sbopSvcKeiMap = new HashMap<String, Object>();
							
							// サブオプションサービスコード
							sbopSvcKeiMap.put("sbop_svc_cd", ekk0401b001Msg.getString(EKK0401B001CBSMsg1List.SBOP_SVC_CD));
							sbopSvcKeiList.add(sbopSvcKeiMap);
						}
						// サブオプションサービス契約リスト
						opSvcKeiMap.put("sbop_svc_kei_list", sbopSvcKeiList);
					}

					
					// 下りデータの作成されている場合
					if (opSvcKeiIspMap != null)
					{
						opSvcKeiIspList.add(opSvcKeiIspMap);
					}
				}
			}
			
			// オプションサービス契約リストの設定
			if ("0060".equals(op_sbt) 
					|| "0170".equals(op_sbt) 
					|| "0320".equals(op_sbt) 
					|| "0350".equals(op_sbt) 
					|| "0360".equals(op_sbt)
					|| "0370".equals(op_sbt))
			{
				// オプション種別が"0060"（ＳＯＨＯパック１０）または "0170"（有害サイトブロック）または "0320"（ダイヤルアップ接続）または
				//  "0350"（ＩＰｖ６オプション）または"0360"（フェムトセル）の場合は、
				// EKK0351B002(オプションサービス契約一覧照会（サービス契約番号）)で絞り込んだ対象データのリストを設定
				ccMsg.put("op_svc_kei_list", opSvcKeiList);
			}
			else
			{
				// オプションサービス契約＜ISP＞リスト
				ccMsg.put("op_svc_kei_isp_list", opSvcKeiIspList);
			}
		}
		
		// ■オプション種別が"0040"（メーリングリスト）の場合
		if ("0040".equals(op_sbt))
		{
			// *** EZM0321A010(業務パラメータ管理一意照会) の実行 ***
			// メーリングリストドメイン
			String mllistDomainNm = getBusinessParameter(handle, param, scCall, "KK_MLLIST_DOMAIN_NM");
			ccMsg.put("mllist_domain_nm", mllistDomainNm);
		}
		
		// 実行結果格納処理
		work02Map.put("return_result_cd", "000000");
		
		return param;
	}

	/**
	 * サービス契約内訳番号に紐づく認証ID等の取得処理
	 * 
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param scCall scオブジェクト
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void searchSvcKeiUcwkInfo(SessionHandle handle, IRequestParameterReadWrite param, ServiceComponentRequestInvoker scCall) throws Exception
	{
		HashMap<String, Object> work01Map = (HashMap<String, Object>)param.getData("KKSV0339WORK01");
		String op_sbt = (String)work01Map.get("opshon_shubt");
		String search_flg = (String)work01Map.get("search_flg");
		String out_flg = (String)work01Map.get("out_flg");
		
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(SERVICE_ID);
		
		// *** EKK0161B004(サービス契約内訳一覧照会) の実行 ***
		// ◇ 上りマッピング処理
		Object[][] ekk0161b004IN = {
				// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
				{EKK0161B004CBSMsg.KEY_SVC_KEI_NO, (String)ccMsg.get("key_svc_kei_no")},
				// "" => ＫＥＹ＿料金コースコード
				{EKK0161B004CBSMsg.KEY_PCRS_CD, ""},
				// "" => ＫＥＹ＿サービス期間中フラグ
				{EKK0161B004CBSMsg.KEY_SVC_PRD_FLG, ""}
		};
		
		// ◇ SC呼出実行
		CAANMsg ekk0161b004Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0161B004, FUNC_CD_1, ekk0161b004IN);
		
		// 処理結果判定
		CAANMsg[] ekk0161b004MsgList = ekk0161b004Msg.getCAANMsgList(EKK0161B004CBSMsg.EKK0161B004CBSMSG1LIST);
		
		if (ekk0161b004MsgList != null && 0 < ekk0161b004MsgList.length)
		{
			for (int i = 0; i < ekk0161b004MsgList.length; i++)
			{
				// 情報検索条件フラグが"0"の場合、
				// サービスが適用されている情報（サービス開始年月日 <= 運用日 <= サービス終了年月日）を対象データとする。
				if ("0".equals(search_flg))
				{
					String svc_kei_ucwk_stat = ekk0161b004MsgList[i].getString(EKK0161B004CBSMsg1List.SVC_KEI_UCWK_STAT);
					// "020"(照査済)"030"(締結済)"100"(サービス提供中)"210"(休止・中断中)"220"(停止中)以外は対象データとしない。
					if (!("020".equals(svc_kei_ucwk_stat) 
							|| "030".equals(svc_kei_ucwk_stat) 
							|| "100".equals(svc_kei_ucwk_stat) 
							|| "210".equals(svc_kei_ucwk_stat)
							|| "220".equals(svc_kei_ucwk_stat)))
					{
						continue;
					}
				}
				
				// *** EKK0171A010(サービス契約内訳＜eo光ネット＞一意照会) の実行 ***
				// ◇ 上りマッピング処理
				Object[][] ekk0171a010IN = {
						// EKK0161B004.サービス契約内訳番号 => ＫＥＹ＿サービス契約内訳番号
						{EKK0171A010CBSMsg.KEY_SVC_KEI_UCWK_NO, ekk0161b004MsgList[i].getString(EKK0161B004CBSMsg1List.SVC_KEI_UCWK_NO)},
						// "" => ＫＥＹ＿世代登録年月日時分秒
						{EKK0171A010CBSMsg.KEY_GENE_ADD_DTM, ""}
				};
				
				// ◇ SC呼出実行
				CAANMsg ekk0171a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0171A010, FUNC_CD_2, ekk0171a010IN);
				
				// 処理結果判定
				CAANMsg[] ekk0171a010MsgList = ekk0171a010Msg.getCAANMsgList(EKK0171A010CBSMsg.EKK0171A010CBSMSG1LIST);
				
				if (ekk0171a010MsgList != null && 0 < ekk0171a010MsgList.length)
				{
					String isp_ninsho_id = ekk0171a010MsgList[0].getString(EKK0171A010CBSMsg1List.ISP_NINSHO_ID);
					
					// 処理要求電文より取得したオプション種別が"0010"（認証ＩＤ）の場合、かつ、出力項目フラグが"0"の場合
					if ("0010".equals(op_sbt) && "0".equals(out_flg))
					{
						// ISP認証IDがNULLの場合は対象データとしない。
						if (isp_ninsho_id == null)
						{
							continue;
						}
					}
					
					// ◇ 下りデータの作成
					HashMap<String, Object> svcKeiUcwkMap = new HashMap<String, Object>();
					
					svcKeiUcwkMap.put("isp_ninsho_id", isp_ninsho_id);
					svcKeiUcwkMap.put("isp_ninsho_id_pwd", ekk0171a010MsgList[0].getString(EKK0171A010CBSMsg1List.ISP_NINSHO_ID_PWD));
					
					// サービス契約内訳リスト
					if (!ccMsg.containsKey("svc_kei_ucwk_list"))
					{
						ccMsg.put("svc_kei_ucwk_list", new ArrayList<HashMap<String, Object>>());
					}
					((ArrayList<HashMap<String, Object>>)ccMsg.get("svc_kei_ucwk_list")).add(svcKeiUcwkMap);
				}
			}
		}
	}
	
	/**
	 * サブオプションサービス契約一覧照会を実行し検索結果を返します。
	 * 
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param scCall scオブジェクト
	 * @param op_svc_kei_no オプションサービス契約番号
	 * @param op_sbt （対象データ判定用）オプション種別
	 * @param sbop_svc_cd （対象データ判定用）サブオプションサービスコード
	 * @return サブオプションサービス契約一覧照会の検索結果
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<CAANMsg> searchSbopSvcKeiInfo(SessionHandle handle,
													IRequestParameterReadWrite param,
													ServiceComponentRequestInvoker scCall,
													String op_svc_kei_no,
													String op_sbt,
													String sbop_svc_cd) throws Exception
	{
		HashMap<String, Object> work01Map = (HashMap<String, Object>)param.getData("KKSV0339WORK01");
		String search_flg = (String)work01Map.get("search_flg");
		
		ArrayList<CAANMsg> sbopSvcKeiList = new ArrayList<CAANMsg>();
		
		// *** EKK0401B001(サブオプションサービス契約一覧照会) の実行 ***
		// ◇ 上りマッピング処理
		Object[][] ekk0401b001IN = {
				// EKK0351B002.オプションサービス契約番号 => ＫＥＹ＿オプションサービス契約番号
				{EKK0401B001CBSMsg.KEY_OP_SVC_KEI_NO, op_svc_kei_no}
		};
		
		// ◇ SC呼出実行
		CAANMsg ekk0401b001Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0401B001, FUNC_CD_1, ekk0401b001IN);
		
		// 処理結果判定
		CAANMsg[] ekk0401b001MsgList = ekk0401b001Msg.getCAANMsgList(EKK0401B001CBSMsg.EKK0401B001CBSMSG1LIST);
		
		for (int i = 0; i < ekk0401b001MsgList.length; i++)
		{
			// 対象データ判定
			if ("0020".equals(op_sbt) || "0030".equals(op_sbt))
			{
				if (!sbop_svc_cd.equals(ekk0401b001MsgList[i].getString(EKK0401B001CBSMsg1List.SBOP_SVC_CD)))
				{
					continue;
				}
			}
			
			// 情報検索条件フラグが"0"の場合、
			// サービスが適用されている情報（サービス開始年月日 <= 運用日 <= サービス終了年月日）を対象データとする。
			if("0".equals(search_flg))
			{
				String sbop_svc_kei_stat = ekk0401b001MsgList[i].getString(EKK0401B001CBSMsg1List.SBOP_SVC_KEI_STAT);
				// "020"(照査済)"030"(締結済)"100"(サービス提供中)"210"(休止・中断中)"220"(停止中)以外は対象データとしない。
				if (!("020".equals(sbop_svc_kei_stat) 
						|| "030".equals(sbop_svc_kei_stat) 
						|| "100".equals(sbop_svc_kei_stat) 
						|| "210".equals(sbop_svc_kei_stat)
						|| "220".equals(sbop_svc_kei_stat)))
				{
					continue;
				}
			}
			
			sbopSvcKeiList.add(ekk0401b001MsgList[i]);
		}
		
		return sbopSvcKeiList;
	}
	
	/**
	 * 処理対象のオプション種別かどうかの判定を行う。<BR>
	 * <BR>"0010"（認証ＩＤ）
	 * <BR>"0020"（Ｅメール）
	 * <BR>"0030"（Ｍｙホームページ）
	 * <BR>"0040"（メーリングリスト）
	 * <BR>"0050"（固定グローバルＩＰアドレス）
	 * <BR>"0060"（ＳＯＨＯパック１０）
	 * <BR>"0110"（ダイヤルパッド）
	 * <BR>"0160"（マルチセッション）
	 * <BR>"0170"（有害サイトブロック）
	 * <BR>"0190"（グループコミュニティ）
	 * <BR>"0320"（ダイヤルアップ接続）
	 * 
	 * @param op_sbt オプション種別
	 * @return true:処理対象のオプション種別、false:処理対象外のオプション種別
	 */
	private boolean judgeOpSbt(String op_sbt)
	{
		if ("0010".equals(op_sbt))
		{
			return true;
		}
		else if ("0020".equals(op_sbt))
		{
			return true;
		}
		else if ("0030".equals(op_sbt))
		{
			return true;
		}
		else if ("0040".equals(op_sbt))
		{
			return true;
		}
		else if ("0050".equals(op_sbt))
		{
			return true;
		}
		else if ("0060".equals(op_sbt))
		{
			return true;
		}
		else if ("0110".equals(op_sbt))
		{
			return true;
		}
		else if ("0160".equals(op_sbt))
		{
			return true;
		}
		else if ("0170".equals(op_sbt))
		{
			return true;
		}
		else if ("0190".equals(op_sbt))
		{
			return true;
		}
		else if ("0320".equals(op_sbt))
		{
			return true;
		}
		else if ("0350".equals(op_sbt))
		{
			return true;
		}
		else if ("0360".equals(op_sbt))
		{
			return true;
		}
		else if ("0370".equals(op_sbt))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * オプション種別の値により、オプションサービスコードを返却する。
	 * <BR>"0020"の場合、"B001"（Ｅメール）
	 * <BR>"0030"の場合、"B002"（Ｍｙホームページ）
	 * <BR>"0040"の場合、"B003"（メーリングリスト）
	 * <BR>"0050"の場合、"B004"（固定グローバルＩＰアドレス）
	 * <BR>"0060"の場合、"B005"（ＳＯＨＯパック１０）
	 * <BR>"0110"の場合、"B010"（ダイヤルパッド）
	 * <BR>"0160"の場合、"B015"（マルチセッション）
	 * <BR>"0170"の場合、"B016"（有害サイトブロック）
	 * <BR>"0190"の場合、"B018"（グループコミュニティ）
	 * <BR>"0320"の場合、"B020"（ダイヤルアップ接続）
	 * <BR>"0350"の場合、"B070"（ＩＰｖ６）
	 * <BR>"0360"の場合、"B075"（フェムトセル）
	 * <BR>"0370"の場合、"B077"（スマートリンクプレミアム）
	 * 
	 * @param op_sbt オプション種別
	 * @return オプションサービスコード
	 */
	private String getOpSvcCd(String op_sbt)
	{
		if ("0020".equals(op_sbt))
		{
			return "B001";
		}
		else if ("0030".equals(op_sbt))
		{
			return "B002";
		}
		else if ("0040".equals(op_sbt))
		{
			return "B003";
		}
		else if ("0050".equals(op_sbt))
		{
			return "B004";
		}
		else if ("0060".equals(op_sbt))
		{
			return "B005";
		}
		else if ("0110".equals(op_sbt))
		{
			return "B010";
		}
		else if ("0160".equals(op_sbt))
		{
			return "B015";
		}
		else if ("0170".equals(op_sbt))
		{
			return "B016";
		}
		else if ("0190".equals(op_sbt))
		{
			return "B018";
		}
		else if ("0320".equals(op_sbt))
		{
			return "B020";
		}
		else if ("0350".equals(op_sbt))
		{
			return "B070";
		}
		else if ("0360".equals(op_sbt))
		{
			return "B075";
		}
		else if ("0370".equals(op_sbt))
		{
			return "B077";
		}
		return "";
	}
	
	/**
	 * オプションサービス契約＜ISP＞一意照会の検索結果から対象データかどうかの判定を行う。
	 * 
	 * @param out_flg 出力項目フラグ
	 * @param op_sbt オプション種別
	 * @param msg オプションサービス契約＜ISP＞一意照会の検索結果
	 * @return true:対象データ、false:対象外データ
	 */
	private boolean judgeData(String out_flg, String op_sbt, CAANMsg msg)
	{
		// 出力項目フラグが"0"の場合
		if ("0".equals(out_flg))
		{
			// オプション種別が"0020"（Eメール）の場合、POPIDがNULLであれば、対象データとしない。
			if ("0020".equals(op_sbt) && msg.isNull(EKK0361A010CBSMsg1List.POP_ID))
			{
				return false;
			}
			// オプション種別が"0030"（Mｙホームページ）の場合、WEBIDがNULLであれば、対象データとしない。
			if ("0030".equals(op_sbt) && msg.isNull(EKK0361A010CBSMsg1List.WEB_ID))
			{
				return false;
			}
			// オプション種別が"0040"（メーリングリスト）の場合、メーリングリスト名がNULLであれば、対象データとしない。
			if ("0040".equals(op_sbt) && msg.isNull(EKK0361A010CBSMsg1List.MLLIST_NM))
			{
				return false;
			}
			// オプション種別が"0050"（固定グローバルIPアドレス）の場合、固定IPアドレスがNULLであれば、対象データとしない。
			if ("0050".equals(op_sbt) && msg.isNull(EKK0361A010CBSMsg1List.KOTEI_IP_AD))
			{
				return false;
			}
			// オプション種別が"0110"（ダイヤルパッド）の場合、ダイヤルパッドIDがNULLであれば、対象データとしない。
			if ("0110".equals(op_sbt) && msg.isNull(EKK0361A010CBSMsg1List.DPAD_ID))
			{
				return false;
			}
			// オプション種別が"0190"（グループコミュニティ）の場合、WISHオーナーIDがNULLであれば、対象データとしない。
			if ("0190".equals(op_sbt) && msg.isNull(EKK0361A010CBSMsg1List.WISH_OWNR_ID))
			{
				return false;
			}
		}
		// 対象データとする
		return true;
	}
	
	/**
	 * チェック処理用のサービスインターフェイスを作成し返却する。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return サービスインターフェイスマップ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		
		ArrayList<CAANMsg> templateList = new ArrayList<CAANMsg>();
		HashMap<String, Object> paramMap = null;
		
		HashMap<String, Object> work01Map = (HashMap<String, Object>)param.getData("KKSV0339WORK01");
		String op_sbt = (String)work01Map.get("opshon_shubt");
		
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(SERVICE_ID);
		
		// ■オプション種別が"0010"（認証ＩＤ）または "0320"（ダイヤルアップ接続）の場合
		if ("0010".equals(op_sbt) || "0320".equals(op_sbt))
		{
			// *** EKK0161B004(サービス契約内訳一覧照会) の実行 ***
			// ◇ 上りマッピング処理
			Object[][] ekk0161b004IN = {
					// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
					{EKK0161B004CBSMsg.KEY_SVC_KEI_NO, (String)ccMsg.get("key_svc_kei_no")},
					// "" => ＫＥＹ＿料金コースコード
					{EKK0161B004CBSMsg.KEY_PCRS_CD, ""},
					// "" => ＫＥＹ＿サービス期間中フラグ
					{EKK0161B004CBSMsg.KEY_SVC_PRD_FLG, ""}
			};
			
			// 上りマッピングの処理結果を取得するためのマップを生成
			paramMap = editInMsg(param, TEMPLATE_ID_EKK0161B004, FUNC_CD_1, ekk0161b004IN);
			templateList.add(((CAANMsg[])paramMap.get(JCMConstants.TEMPLATE_LIST_KEY))[0]);
		}
		
		// ■オプション種別が"0010"（認証ＩＤ）以外の場合
		if (!"0010".equals(op_sbt))
		{
			// *** EKK0351B002(オプションサービス契約一覧照会（サービス契約番号）) の実行 ***
			// ◇ 上りマッピング処理
			Object[][] ekk0351b002IN = {
					// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
					{EKK0351B002CBSMsg.KEY_SVC_KEI_NO, (String)ccMsg.get("key_svc_kei_no")},
					// "" => ＫＥＹ＿サービス契約内訳番号
					{EKK0351B002CBSMsg.KEY_SVC_KEI_UCWK_NO, ""},
					// ＫＥＹ＿オプションサービスコード => ＫＥＹ＿オプションサービスコード
					{EKK0351B002CBSMsg.KEY_OP_SVC_CD, getOpSvcCd(op_sbt)},
					// "" => ＫＥＹ＿基準年月日
					{EKK0351B002CBSMsg.KEY_BASE_YMD, ""}
			};
			
			// 上りマッピングの処理結果を取得するためのマップを生成
			paramMap = editInMsg(param, TEMPLATE_ID_EKK0351B002, FUNC_CD_1, ekk0351b002IN);
			templateList.add(((CAANMsg[])paramMap.get(JCMConstants.TEMPLATE_LIST_KEY))[0]);
		}
		
		return paramMap;
	}
	
	/**
	 * SC呼出
	 * 
	 * @param handle
	 * @param param
	 * @param scCall
	 * @param svcIfId
	 * @param funcCode
	 * @param svcIfMapData
	 * @return CAANMsg
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, 
							IRequestParameterReadWrite param, 
							ServiceComponentRequestInvoker scCall,
							String svcIfId,
							String funcCode,
							Object[][] svcIfMapData) throws Exception
	{
		
		// ◇ 上りマッピング処理
		// 上りマッピングの処理結果を取得するためのマップを生成
		HashMap<String, Object> paramMap = editInMsg(param, svcIfId, funcCode, svcIfMapData);
		
		// SC呼出実行
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		// 処理結果の判定
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		
		// エラー情報の転記
		editErrorInfo(param, templates, (Integer)result.get(JCMConstants.RET_CD_INT_KEY));
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
		int status = templates[0].getInt(STATUS);
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status))
		{
			throw new SCCallException("戻り値不正", rtnCode, status);
		}
		
		return ((CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY))[0];
	}
	
	/**
	 * 上りマッピング処理
	 * 
	 * @param param
	 * @param svcIfId
	 * @param funcCode
	 * @param mapData
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param, 
												String svcIfId, 
												String funcCode,
												Object[][] mapData) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		CAANMsg template = new CAANMsg("eo.ejb.cbs.cbsmsg." + svcIfId + "CBSMsg");

		// テンプレートID
		template.set(TEMPLATEID, svcIfId);

		template.set(FUNC_CODE, funcCode);

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);
		
		for (int i = 0; i < mapData.length; i++)
		{
			Object[] mapVal = mapData[i];
			if ("".equals(mapVal[1]))
			{
				template.setNull((String)mapVal[0]);
			}
			else
			{
				template.set((String)mapVal[0], (String)mapVal[1]);
			}
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * サービスインターフェイスのエラー情報をマッピングする。
	 * <br>
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param templates サービスインターフェイスリスト
	 * @param returnCode サービスインターフェイスリストのリターンコード
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode)
			throws RequestParameterException
	{
		
		for (int i = 0; i < templates.length; i++)
		{
			CAANMsg template = templates[i];
			int templateStatus = template.getInt(STATUS);
			if (returnCode != 0)
			{
				templateStatus = 9000;
			}
			if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
			{
				templateStatus = 0;
			}

			int bpStatus = 0;
			Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
			if (obj == null)
			{
				bpStatus = -1;
			}
			else
			{
				bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
			}

			if (templateStatus > bpStatus)
			{
				// BPにサービスコンポーネントのステータスを設定する。
				String formatStatus = String.format("%1$04d", templateStatus);
				String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
			}
			
			HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(SERVICE_ID);
			
			HashMap<?, ?> mp = template.getHashMap();
			
			Iterator it = mp.keySet().iterator();
			while (it.hasNext())
			{
				String key = (String)it.next();
				if (key.endsWith("_err"))
				{
					int keyIdx = key.lastIndexOf("_err");
					if (inMap.containsKey(key.substring(0, keyIdx)))
					{
						inMap.put(key, mp.get(key));
					}
				}
			}
			
		}
		
		return param;
	}
	
	/**
	 * 指定されたKeyを元に業務パラメータ管理一意照会（EZM0321A010）を呼び出し、
	 * 業務パラメータを取得する。
	 * 
	 * @param handle
	 * @param param
	 * @param scCall
	 * @param key
	 * @return 業務パラメータ設定値（業務パラメータ未定義時は「""（空）」
	 * @throws Exception
	 */
	private String getBusinessParameter(SessionHandle handle, 
										IRequestParameterReadWrite param, 
										ServiceComponentRequestInvoker scCall,
										String key) throws Exception 
	{
		// *** EZM0321A010(業務パラメータ管理一意照会) の実行 ***
		Object[][] ezm0321a010IN = {
			// args(key) => ＫＥＹ＿業務パラメータID
			{EZM0321A010CBSMsg.KEY_WORK_PARAM_ID, key}
		};
		
		// ◇ SC呼出実行
		CAANMsg ezm0321a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EZM0321A010, "1", ezm0321a010IN);
		
		// 処理結果判定
		CAANMsg[] ezm0321a010MsgList = ezm0321a010Msg.getCAANMsgList(EZM0321A010CBSMsg.EZM0321A010CBSMSG1LIST);
		
		if (ezm0321a010MsgList == null || ezm0321a010MsgList.length == 0)
		{
			return "";
		}
		return ezm0321a010MsgList[0].getString(EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE);
	}
}
