/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom, 2015
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JKKSvcKeiElecChgCC
 *   ソースファイル名：JKKSvcKeiElecChgCC.java
 *   作成者          ：富士通
 *   日付            ：2015年06月16日
 *＜機能概要＞
 *   eo電気契約照査受付・キャンセル受付・解約受付部品
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v16.00.00   2015/06/16   FJ）野々下  ANK-2480-00-00 新電力対応
 *   v16.00.00   2015/09/07   FJ）野々下  ANK-2480-00-00 新電力対応STEP1-2
 *   v16.01.00   2015/09/30   FJ）野々下  IT1-2015-0000101
 *   v67.00.00   2023/07/07   FJ）寺田  ANK-4471-00-00 #81151 （CCMG　有効性連携対象抽出にて、請求先番号スライド判定時に電気契約が対象外となる）
 **********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKAddSjishoConst;
import com.fujitsu.futurity.bp.custom.constant.JKKSvcConst;
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.ErrorLevel;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.bpm.parameter.StatusArea;
import com.fujitsu.futurity.bp.x21.bpm.parameter.StatusInfo;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.bp.x21.values.OUTBREAK_AREA;
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.base.jcc.util.JCCDateUtil;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.common.util.JPCDateUtil;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0011D020CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0011D020CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0021A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0021A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B526CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B526CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081C160CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081C180CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081C260CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0321B005CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0441A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0441A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0441B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0441B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0441C210CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0441C230CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2981C010CBSMsg;

/**
 * サービス契約＜eo電気＞変更CC
 * <p>
 * <br>
 * サービス契約＜eo電気＞の契約状態を変更する。 <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JKKSvcKeiElecChgCC extends AbstractCommonComponent {

	/** エラーメッセージ */
	public static final String ERR_MSG = "INVALID_RETURN_MESSAGE";
	
	/** 照査受付　識別コード、サービスID **/
	private static final String SKBT_CD_KKSV080301CC = "KKSV080301CC";
	private static final String SERVICE_ID_KKSV0803 = "KKSV0803";

	/** キャンセル受付　識別コード、サービスID **/
	private static final String SKBT_CD_KKSV080601CC = "KKSV080601CC";
	private static final String SERVICE_ID_KKSV0806 = "KKSV0806";

	/** 解約受付　識別コード、サービスID **/
	private static final String SKBT_CD_KKSV080701CC = "KKSV080701CC";
	private static final String SERVICE_ID_KKSV0807 = "KKSV0807";

// ANK-2480-00-00 ADD START
	/** 照査取消受付　識別コード、サービスID **/
	private static final String SKBT_CD_KKSV082101CC = "KKSV082101CC";
	private static final String SERVICE_ID_KKSV0821 = "KKSV0821";
// ANK-2480-00-00 ADD END

	/** 識別コード **/
	private String skbtCd;

	/** サービスID **/
	private String serviceID;

	/** リターンコード **/
	public static final String RETURN_CODE = "return_code";

	/** サービス契約番号 **/
	private static final String SVC_KEI_NO = "svc_kei_no";

	/** お客様ID **/
	private static final String SYSID = "sysid";

	private static final String MEMBER_SBT_CD = "member_sbt_cd";

	/** サービス契約照査BPサービスでのお客様会員種別変更CCマップのキー **/
	public static final String CUSTMEMBERSBTCHG = "JKKCustMemberSbtChgCC";

	/** サービス契約照査BPサービスでの指示書CCマップのキー **/
	public static final String SJISHO_MAP = "JKKAddSjishoCC";

	/** サービス契約照査BPサービスでの整理番号発番付替CCマップのキー **/
	public static final String SEIRIBANGO_MAP = "JKKSeiriNoHtbChgCC";

	/** 会員種別コード　10：マスター会員（個人） */
	public static final String MBTYPE_CD_MST_KOJIN = "10";

	/** 会員種別コード　20：マスター会員（法人） */
	public static final String MBTYPE_CD_MST_HOJIN = "20";

	/** 会員種別コード　00：非ｅｏ会員 */
	public static final String MBTYPE_CD_NOT_EO = "00";

	/** 会員種別コード　11：ファミリー会員（個人） */
	public static final String MBTYPE_CD_FAMILY_KOJIN = "11";

	/** 会員種別コード　21：ファミリー会員（法人） */
	public static final String MBTYPE_CD_FAMILY_HOJIN = "21";

	/** 会員種別コード　30：オープン会員 */
	public static final String MBTYPE_CD_OPEN = "30";

	/** 契約者タイプコード　1：個人 */
	public static final String KSH_TYPE_CO_KOJIN = "1";

	/** 契約者タイプコード　2：法人 */
	public static final String KSH_TYPE_CO_HOJIN = "2";

	/** 契約者タイプコード　3：保守用 */
	public static final String KSH_TYPE_CO_MNT = "3";

	/** 契約者タイプコード　4：自社利用 */
	public static final String KSH_TYPE_CO_JISHA_USE = "4";

	public static final String IDO_RSN_CD_SONOTA = "56";

	/** 申込明細ステータス  CD00061　受付済 */
	public static final String MSKM_DTL_STAT_UKETSUKEZUMI = "010";

	/** SOAP連携データ格納マップ **/
	private Map<String, Object> soapRenkeiMap;

	/** サービス契約一意照会結果格納マップ **/
	private Map<String, Object> svcKeiMap;

	/** 申込承認登録結果格納マップ **/
	private Map<String, Object> mskmAddMap;

	/** 運用日付 **/
	private String oPE_DATE;

	/** 運用日時 **/
	private String oPE_DATE_TIME;

	/** 現在処理中のSYSID **/
	private String currentSysid = null;

	/** 入力パラメータ：ＳＹＳＩＤ */
	static final String IN_FUNC_CODE = "func_code";

	/** 入力パラメータ：申込書番号 */
	static final String IN_SVC_CL_YMD = "svc_cancel_ymd";

	/** 入力パラメータ：申込書明細番号 */
	static final String IN_CL_RSN_CD = "svc_cancel_rsn_cd";

	/** 入力パラメータ：サービス終了年月日 */
	static final String IN_SVC_ENDYMD			= "svc_endymd";

	/** 入力パラメータ：サービス課金終了年月日 */
	static final String IN_SVC_CHRG_ENDYMD		= "svc_chrg_endymd";

	/** 入力パラメータ：サービス解約年月日 */
	static final String IN_SVC_DSL_YMD			= "svc_dsl_ymd";

	/** 入力パラメータ：サービス解約理由コード */
	static final String IN_SVC_DLRE_CD			= "svc_dlre_cd";

	/** 入力パラメータ：サービス解約理由メモ */
	static final String IN_SVC_DLRE_MEMO		= "svc_dlre_memo";

	/** 制御パラメータ：異動区分 */
	static final String IDO_DIV = "ido_div";

	/** 制御パラメータ：異動日時 */
	static final String IDO_DTM = "ido_dtm";

	/** 制御パラメータ：申込番号 */
	static final String MSKM_NO = "mskm_no";

	/** 制御パラメータ：申込明細番号 */
	static final String MSKM_DTL_NO = "new_mskm_dtl_no";

	/** 制御パラメータ：更新日時（お客様） */
	static final String CK0011_UPD_DTM = "ck0011_upd_dtm";

	/** 制御パラメータ：更新日時（申込） */
	static final String KK0011_UPD_DTM = "kk0011_upd_dtm";

	/** 入力パラメータ： */
	static final String KK0081_UPD_DTM = "kk0081_upd_dtm";

	/** お客様退会ＣＣ連携用マップのキー */
	static final String MAP_KEY_JCKCUSTTAIKAI = "okyakusama_taikai_map";

	/**
	 * 作業領域のキー
	 */
	private static final String MAP_KEY_WORK = "work_area";

	// 内部で取得するリスト用のマップキー サービス契約番号
	private static final String SVCKEILIST1_SVC_KEI_NO = "svc_kei_no";
	// 内部で取得するリスト用のマップキー サービス契約ステータス
	private static final String SVCKEILIST1_SVC_KEI_STAT = "svc_kei_stat";
	/** 請求オプションサービスコード：請求書発行手数料 */
	private static final String SEIOPSVC_CD_SEIKYSH_HAKKO = "E001";

	/**
	 * CAANMsgに必要なデータのマッピング処理を行います。
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return パラメータマップ
	 * @throws RequestParameterException
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
			throws RequestParameterException
	{
		//BPチェックは行わない

		HashMap<String, Object> paramMap = setSCInputCommonData(param, new HashMap<String, Object>());
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{});

		return paramMap;
	}

	/**
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteにエラー情報をマッピングする
	 * @param param リクエストパラメータ
	 * @param templates テンプレート
	 * @param returnCode リターンコード
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException RequestParameterException
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, String fixedText)
			throws RequestParameterException
	{
		//BPチェックは行わない

		return param;
	}

	/**
	 * SCインプット共通データ設定処理を行います。
	 * <br>
	 * @param param
	 * @param paramMap
	 * @return パラメータマップ
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> setSCInputCommonData(IRequestParameterReadWrite param, HashMap<String, Object> paramMap)
			throws RequestParameterException
	{
		/* SCインプット共通データ */
		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文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));

		return paramMap;
	}

	/**
	 * サービス契約＜eo電気＞の状態を更新します
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite changeStatus(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
			throws Throwable
	{
		//リクエストパラメータの取得
		soapRenkeiMap = analyzeRequestParam(param);

		mskmAddMap = null;

		// サービスIDの取得
		serviceID = param.getUsecaseID();
		// 運用日付設定
		String oPE_DATE = JCCBPCommon.getOpeDate(null);
		// 運用日時設定
		String oPE_DATE_TIME = JCCBPCommon.getOpeDateTimeStamp(null);
		this.oPE_DATE = oPE_DATE;
		this.oPE_DATE_TIME = oPE_DATE_TIME;

		try {
			// サービスIDによって処理を分岐する。
			if (SERVICE_ID_KKSV0803.equals(serviceID)) {
				// 照査処理
				svcShosa(handle, param);
			}
			else if (SERVICE_ID_KKSV0806.equals(serviceID)) {
				// キャンセル処理
				svcCancel(handle, param, fixedText);
			}
			else if (SERVICE_ID_KKSV0807.equals(serviceID)) {
				// 解約処理
				svcKaiyaku(handle, param, fixedText);
			}
// ANK-2480-00-00 ADD START
			else if (SERVICE_ID_KKSV0821.equals(serviceID)) {
				// 照査取消処理
				svcShosaCl(handle, param, fixedText);
			}
// ANK-2480-00-00 ADD END
		}
		catch (Exception e) {
			// 予期せぬエラーの場合、システムエラーで復帰させる
			String returnCode = (String)param.getControlMapData(SCControlMapKeys.RETURN_CODE);
			if ("0000".equals(returnCode)) {
				JSYejbLog.printStackTrace(JSYejbLog.ERROR, this.getClass(), e, null, null);
				StatusInfo info = new StatusInfo(ErrorLevel.EL988, OUTBREAK_AREA.CC);
				info.setErrorLogOutput(true);
				param.getStatusArea().add(info);
				param.getStatusArea().setCurrent(info);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, "9000");
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, "システムエラー");
				throw new Exception(serviceID + "実行中に予期せぬエラーが発生しました");
			}
			else {
				throw e;
			}
		}

		//処理終了
		return param;
	}

	/**
	 * リクエストパラメータの取得
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @return リクエストパラメータのHash
	 * @throws RequestParameterException 例外時にスローされます
	 */
	private HashMap<String, Object> analyzeRequestParam(IRequestParameterReadWrite param) 
			throws RequestParameterException
	{
		HashMap<String, Object> paramData = null;

		//データの受け取り
		paramData = (HashMap<String, Object>)param.getData(SKBT_CD_KKSV080301CC);
		skbtCd = SKBT_CD_KKSV080301CC;	// 照査
		if (paramData == null) {
			paramData = (HashMap<String, Object>)param.getData(SKBT_CD_KKSV080601CC);
			skbtCd = SKBT_CD_KKSV080601CC;	// キャンセル
			if (paramData == null) {
				paramData = (HashMap<String, Object>)param.getData(SKBT_CD_KKSV080701CC);
				skbtCd = SKBT_CD_KKSV080701CC;	// 解約
// ANK-2480-00-00 ADD START
				if (paramData == null) {
					paramData = (HashMap<String, Object>)param.getData(SKBT_CD_KKSV082101CC);
					skbtCd = SKBT_CD_KKSV082101CC;	// 照査取消
				}
// ANK-2480-00-00 ADD END
			}
		}

		return paramData;
	}

	/**
	 * 照査処理
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @throws Throwable 任意の例外
	 */
	private void svcShosa(SessionHandle handle, IRequestParameterReadWrite param)
			throws Throwable
	{
		// サービス契約一意照会
		this.svcKeiMap = callEKK0081A010SC(param, handle);

		// サービス契約＜eo電気＞照査
		Map<String, Object> shosaRsltMap = callEKK2981C010SC(param, handle);

		// sysidを取得
		this.currentSysid = (String) svcKeiMap.get(EKK0081A010CBSMsg1List.SYSID);

		// お客様一意照会
		Map<String, Object> custMap = callECK0011A010SC(param, handle, currentSysid);

		// soap_renkei_mapよりサービス契約番号取得
		String svcKeiNo = (String)soapRenkeiMap.get(SVC_KEI_NO);

		// お客様会員種別を更新
		custMap.put(JKKCustMemberSbtChgCC.SYSID, this.currentSysid);
		custMap.put(JKKCustMemberSbtChgCC.SVC_KEI_NO, svcKeiNo);
		param.setData(CUSTMEMBERSBTCHG, custMap);
		(new JKKCustMemberSbtChgCC()).execute(handle, param, CUSTMEMBERSBTCHG);

		// 申込みの照査を実施
		shosaMskm(param, handle);

		// 指示書用マップ作成
		// 連携データ区分06 請求契約番号(#T)の情報
		JKKBpCommon.putAxMRenkeiDataKbn(
			param, SJISHO_MAP, JKKAddSjishoConst.RENKEI_DATA_KBN_SEIKY_KEI, JKKAddSjishoConst.TRN_KBN_ADD, 
			new String[]{svcKeiNo}, currentSysid);
		JKKAddSjishoCC addSjishoCC = new JKKAddSjishoCC();
		addSjishoCC.addSjisho(handle, param, SJISHO_MAP);

		// お客様一意照会（更新後の情報を取得する）
		Map<String, Object> custMapAfter = callECK0011A010SC(param, handle, currentSysid);

		// 進捗登録処理
		String seikyKeiNo = getSeikyKeiNoBySvcKeiNo(handle, param, svcKeiNo);
		addPrg(handle, param, seikyKeiNo);

		// 整理番号発番付替CC
// ANK-2480-00-00 MOD START
//		HashMap<String, Object> seiriNoHtbChgCCMap = new HashMap<String, Object>();
//		seiriNoHtbChgCCMap.put(SVC_KEI_NO, svcKeiNo);		//サービス契約番号
//		seiriNoHtbChgCCMap.put(SYSID,      currentSysid);	//SYSID
//		param.setData(SEIRIBANGO_MAP, seiriNoHtbChgCCMap);
//		JKKSeiriNoHtbChgCC seiriNoHtbChgCC = new JKKSeiriNoHtbChgCC();
//		seiriNoHtbChgCC.seiriNoHtbChg(handle, param, SEIRIBANGO_MAP);
		String seiriNo = "";
		seiriNo = (String) svcKeiMap.get(EKK0081A010CBSMsg1List.SEIRI_NO);
		if (seiriNo == null || "".equals(seiriNo)) {
			HashMap<String, Object> seiriNoHtbChgCCMap = new HashMap<String, Object>();
			seiriNoHtbChgCCMap.put(SVC_KEI_NO, svcKeiNo);		//サービス契約番号
			seiriNoHtbChgCCMap.put(SYSID,      currentSysid);	//SYSID
			param.setData(SEIRIBANGO_MAP, seiriNoHtbChgCCMap);
			JKKSeiriNoHtbChgCC seiriNoHtbChgCC = new JKKSeiriNoHtbChgCC();
			seiriNoHtbChgCC.seiriNoHtbChg(handle, param, SEIRIBANGO_MAP);
		}
// ANK-2480-00-00 MOD END

		// レスポンス作成処理
		createResponse(param, custMap, custMapAfter);
	}

	/**
	 * キャンセル処理
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @throws Throwable 
	 */
	private void svcCancel(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
			throws Throwable
	{
		Map<Object, Object> workAreaMap = param.getMappingWorkArea();
		if (null == workAreaMap) {
			workAreaMap = new HashMap<Object, Object>();
			param.setMappingWorkArea(workAreaMap);
		}

		Map<String, Object> workMap = (Map<String, Object>) workAreaMap.get(MAP_KEY_WORK);
		if (null == workMap) {
			workMap = new HashMap<String, Object>();
			workAreaMap.put(MAP_KEY_WORK, workMap);
		}

		// サービス契約一意照会
		this.svcKeiMap = callEKK0081A010SC(param, handle);

		if (null != this.svcKeiMap && this.svcKeiMap.containsKey(EKK0081A010CBSMsg1List.SYSID)) {
			// sysidを格納
			this.currentSysid = (String) this.svcKeiMap.get(EKK0081A010CBSMsg1List.SYSID);
			// 更新日時（サービス契約）
			workMap.put(KK0081_UPD_DTM, this.svcKeiMap.get(EKK0081A010CBSMsg1List.LAST_UPD_DTM));
		}
		else {
			// 無いお客様IDを連携された際にEKK0081C160がsvc_kei_no_err=EBを返せるよう更新日時を誤魔化す
			workMap.put(KK0081_UPD_DTM, this.oPE_DATE_TIME);
		}
		// 異動日時を設定
		workMap.put(IDO_DTM, new String(this.oPE_DATE_TIME));
		// 異動区分を設定
		workMap.put(IDO_DIV, JKKStrConst.CD00576_CNCL);

		// お客様一意照会
		Map<String, Object> custMap = callECK0011A010SC(param, handle, this.currentSysid);

		// 申込内容承認登録：申込種別 == キャンセル申込
		callEKK0011D020SC(handle, param, workMap, "00006");

		// サービス契約キャンセル
		callEKK0081C160SC(handle, param, workMap);

		// お客様退会処理
		callCusTaikaiCmnKino(handle, param, workMap);

		// 申込明細照査・後続業務依頼
		callEKK0021C060SC(handle, param, workMap);

		String svcKeiNo = (String)soapRenkeiMap.get(SVC_KEI_NO);
		String seikyKeiNo = getSeikyKeiNoBySvcKeiNo(handle, param, svcKeiNo);

		// 進捗
		addPrg(handle, param, seikyKeiNo);

		// お客様一意照会
		Map<String, Object> custMapAfter = callECK0011A010SC(param, handle, this.currentSysid);

		// レスポンス作成処理
		createResponse(param, custMap, custMapAfter);
	}

	/**
	 * 解約処理
	 * @param handle
	 * @param param
	 * @throws Throwable 
	 */
	private void svcKaiyaku(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
			throws Throwable
	{
		Map<Object, Object> workAreaMap = param.getMappingWorkArea();
		if (null == workAreaMap) {
			workAreaMap = new HashMap<Object, Object>();
			param.setMappingWorkArea(workAreaMap);
		}

		Map<String, Object> workMap = (Map<String, Object>) workAreaMap.get(MAP_KEY_WORK);
		if (null == workMap) {
			workMap = new HashMap<String, Object>();
			workAreaMap.put(MAP_KEY_WORK, workMap);
		}

		// サービス契約一意照会
		this.svcKeiMap = callEKK0081A010SC(param, handle);

		if (null != this.svcKeiMap && this.svcKeiMap.containsKey(EKK0081A010CBSMsg1List.SYSID)) {
			// sysidを格納
			this.currentSysid = (String) this.svcKeiMap.get(EKK0081A010CBSMsg1List.SYSID);
			// 更新日時（サービス契約）
			workMap.put(KK0081_UPD_DTM, this.svcKeiMap.get(EKK0081A010CBSMsg1List.LAST_UPD_DTM));
		}
		else {
			// 無いお客様IDを連携された際にEKK0081C180がsvc_kei_no_err=EBを返せるよう更新日時を誤魔化す
			workMap.put(KK0081_UPD_DTM, this.oPE_DATE_TIME);
		}
		// 異動日時を設定
		workMap.put(IDO_DTM, new String(this.oPE_DATE_TIME));
		// 異動区分を設定
		workMap.put(IDO_DIV, JKKStrConst.CD00576_DSL);

		// お客様一意照会
		Map<String, Object> custMap = callECK0011A010SC(param, handle, this.currentSysid);

		// 申込内容承認登録：申込種別 == 解約申込
		callEKK0011D020SC(handle, param, workMap, JKKDslRun.MSKM_SBT_CD_DSL);

		// サービス契約解約
		callEKK0081C180SC(handle, param, workMap);

		// サービス契約解約確定
		callEKK0081C260SC(handle, param, workMap);

		// お客様退会処理
		callCusTaikaiCmnKino(handle, param, workMap);

		// 申込明細照査・後続業務依頼
		callEKK0021C060SC(handle, param, workMap);

		String svcKeiNo = (String)soapRenkeiMap.get(SVC_KEI_NO);
		String seikyKeiNo = getSeikyKeiNoBySvcKeiNo(handle, param, svcKeiNo);

		// 進捗
		addPrg(handle, param, seikyKeiNo);

		// お客様一意照会
		Map<String, Object> custMapAfter = callECK0011A010SC(param, handle, this.currentSysid);

		// レスポンス作成処理
		createResponse(param, custMap, custMapAfter);
	}

// ANK-2480-00-00 ADD START
	/**
	 * 照査取消処理
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @throws Throwable 
	 */
	private void svcShosaCl(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
			throws Throwable
	{
		Map<Object, Object> workAreaMap = param.getMappingWorkArea();
		if (null == workAreaMap) {
			workAreaMap = new HashMap<Object, Object>();
			param.setMappingWorkArea(workAreaMap);
		}

		Map<String, Object> workMap = (Map<String, Object>) workAreaMap.get(MAP_KEY_WORK);
		if (null == workMap) {
			workMap = new HashMap<String, Object>();
			workAreaMap.put(MAP_KEY_WORK, workMap);
		}

		// サービス契約一意照会
		this.svcKeiMap = callEKK0081A010SC(param, handle);

		if (null != this.svcKeiMap && this.svcKeiMap.containsKey(EKK0081A010CBSMsg1List.SYSID)) {
			// sysidを格納
			this.currentSysid = (String) this.svcKeiMap.get(EKK0081A010CBSMsg1List.SYSID);
		}

		// サービス契約＜eo電気＞照査取消
		callEKK2981C050SC(param, handle);

		// お客様一意照会
		Map<String, Object> custMap = callECK0011A010SC(param, handle, this.currentSysid);

		// 申込明細一意照会
		Map<String, Object> mapEKK0021A010 = callEKK0021A010SC(param, handle);
		// 申込明細.最終更新年月日時分秒を取得
		String upd_dtm = (String)mapEKK0021A010.get(EKK0021A010CBSMsg1List.LAST_UPD_DTM);

		// 申込明細照査取消
		callEKK0021C110SC(param, handle, upd_dtm);

		// お客様退会処理
		callCusTaikaiCmnKino(handle, param, workMap);

		String svcKeiNo = (String)soapRenkeiMap.get(SVC_KEI_NO);
		String seikyKeiNo = getSeikyKeiNoBySvcKeiNo(handle, param, svcKeiNo);

		// 進捗
		addPrg(handle, param, seikyKeiNo);

		// お客様一意照会
		Map<String, Object> custMapAfter = callECK0011A010SC(param, handle, this.currentSysid);

		// レスポンス作成処理
		createResponse(param, custMap, custMapAfter);
	}
// ANK-2480-00-00 ADD END

	/**
	 * サービス契約＜eo電気＞の新規申込時に生成された申込明細の照査を行う
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @throws Throwable 任意の例外
	 */
	private void shosaMskm(IRequestParameterReadWrite param, SessionHandle handle)
			throws Throwable
	{
		// 申込一意照会
		JKKSIFEKK0021Mapper mapper = new JKKSIFEKK0021Mapper();
		String mskmDtlNo = (String)svcKeiMap.get(EKK0081A010CBSMsg1List.MSKM_DTL_NO);
		CAANMsg templateEKK0021A010 = mapper.getMappedTemplateEKK0021A010(mskmDtlNo, null);
		// SIF実行
		CAANMsg[] resultEKK0021A010 = callScCmn(param, handle, templateEKK0021A010, mapper);
		// 結果を設定
		Map<String, Object> resultMap = mappingCAANOutMsgOne(EKK0021A010CBSMsg.EKK0021A010CBSMSG1LIST, resultEKK0021A010);
		String updDtm = (String)resultMap.get(EKK0021A010CBSMsg1List.LAST_UPD_DTM);

		// 該当申込の申込明細ステータスを取得
		String mskmDtlStat = (String)resultMap.get(EKK0021A010CBSMsg1List.MSKM_DTL_STAT);

		// 申込明細ステータスが受付済の場合のみ申込照査・後続業務依頼を実施
		if (MSKM_DTL_STAT_UKETSUKEZUMI.equals(mskmDtlStat)) {
			// 申込明細照査・後続業務依頼
			Map<String, Object> workMap = new HashMap<String, Object>();
			// 申込明細番号
			workMap.put(MSKM_DTL_NO, svcKeiMap.get(EKK0081A010CBSMsg1List.MSKM_DTL_NO));
			// 更新年月日時分秒
			workMap.put(KK0011_UPD_DTM, updDtm);
			// 異動区分 ※受付の状態から引継ぎ
			workMap.put(IDO_DIV, svcKeiMap.get(EKK0081A010CBSMsg1List.IDO_DIV));
			// 申込明細照査・後続業務依頼
			callEKK0021C060SC(handle, param, workMap);
		}
	}

	/**
	 * 進捗登録
	 * @param handle
	 * @param param
	 * @param seiky_kei_no
	 */
	private void addPrg(SessionHandle handle, IRequestParameterReadWrite param, String seiky_kei_no)
			throws Throwable
	{
		String svcKeiNo = (String)soapRenkeiMap.get("svc_kei_no");
		String mskm_dtl_no;

		if (mskmAddMap == null) {
			// 照査時の進捗登録処理
			mskm_dtl_no = (String)svcKeiMap.get("mskm_dtl_no");
		}
		else {
			// キャンセル、解約、照査取消時の進捗登録処理
			mskm_dtl_no = (String)this.svcKeiMap.get(MSKM_DTL_NO);
		}

		// 進捗登録SIFを実行
		JKKSIFEKK1091Mapper mapper = new JKKSIFEKK1091Mapper();
		String[] idoRsnCdList = {IDO_RSN_CD_SONOTA};
		Map<String,Object> prgAddMap = new HashMap<String,Object>();
		// 申込明細番号
		prgAddMap.put("mskm_dtl_no", mskm_dtl_no);
		// 請求契約番号
		prgAddMap.put("seiky_kei_no", seiky_kei_no);
		// サービス契約番号
		prgAddMap.put("svc_kei_no", svcKeiNo);
		// 照査処理
		if (SERVICE_ID_KKSV0803.equals(serviceID)) {
			// 異動区分:新規契約
			prgAddMap.put("ido_div", (String)svcKeiMap.get("ido_div"));
			// 進捗ステータス:照査ＯＫ
			prgAddMap.put("prg_stat", "0900");
		}
		// キャンセル処理
		else if (SERVICE_ID_KKSV0806.equals(serviceID)) {
			// 異動区分:キャンセル
			prgAddMap.put("ido_div", JKKStrConst.CD00576_CNCL);
			// 進捗ステータス:キャンセル完了
			prgAddMap.put("prg_stat", "1201");
		}
		// 解約処理
		else if (SERVICE_ID_KKSV0807.equals(serviceID)) {
			// 異動区分:解約
			prgAddMap.put("ido_div",JKKStrConst.CD00576_DSL);
			// 進捗ステータス:解約完了
			prgAddMap.put("prg_stat", "1304");
		}
// ANK-2480-00-00 ADD START
		// 照査取消処理
		else if (SERVICE_ID_KKSV0821.equals(serviceID)) {
// IT1-2015-0000101 MOD START
//			// 異動区分:新規契約
//			prgAddMap.put("ido_div", JKKStrConst.CD00576_00001);
			// 異動区分:新規契約 or サービス追加
			prgAddMap.put("ido_div", (String)svcKeiMap.get("ido_div"));
// IT1-2015-0000101 MOD END
			// 進捗ステータス:照査取消
			prgAddMap.put("prg_stat", JKKStrConst.CD00647_SHOSA_CL);
		}
// ANK-2480-00-00 ADD END
		//異動日時
		prgAddMap.put("ido_dtm", new String(this.oPE_DATE_TIME));

		CAANMsg templateEKK1091D010 = mapper.getMappedTemplateEKK1091D010(prgAddMap, idoRsnCdList);

		// SIF実行
		CAANMsg[] resultMsgsEKK1091D010 = callScCmn(param, handle, templateEKK1091D010, mapper);
	}

	/**
	 * お客様退会CCを呼び出します
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param workMap 作業領域
	 * @throws Throwable 任意の例外
	 */
	private void callCusTaikaiCmnKino(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> workMap)
			throws Throwable
	{
		String funcCode	= (String) this.soapRenkeiMap.get(IN_FUNC_CODE);
		String sysid	= (String) this.svcKeiMap.get(EKK0081A010CBSMsg1List.SYSID);
		String svcKeiNo	= (String) this.soapRenkeiMap.get(SVC_KEI_NO);

		// マップ生成
		HashMap<String, Object> taikaiCCMap = new HashMap<String, Object>();

		// マップ編集
		taikaiCCMap.put("sysid", sysid);
		taikaiCCMap.put("svc_kei_no", svcKeiNo);
		taikaiCCMap.put(JCMConstants.FUNC_CODE_KEY, funcCode);
		param.setData(MAP_KEY_JCKCUSTTAIKAI, taikaiCCMap);

		//お客様退会CC呼出（指示書も内部で出されている）
		JCKCustTaikaiCmnCC executor = new JCKCustTaikaiCmnCC();
		executor.execute(handle, param, MAP_KEY_JCKCUSTTAIKAI);

		//下り電文に載らないよう、連携マップを消す
		param.removeData(MAP_KEY_JCKCUSTTAIKAI);
	}

	/**
	 * レスポンス作成処理
	 * @param param
	 * @param custMapBefore
	 * @param custMapAfter
	 */
	private void createResponse(IRequestParameterReadWrite param, Map<String, Object> custMapBefore, Map<String, Object> custMapAfter)
			throws Exception
	{
		String returnCode = (String)param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (returnCode != null && "0000".equals(returnCode))
		{
			if (custMapBefore == null || custMapAfter == null) {
				throw new Exception("処理が正常終了していません");
			}

			// 処理が正常終了した場合
			String memberSbtCd1 = (String)custMapBefore.get(MEMBER_SBT_CD);
			String memberSbtCd2 = (String)custMapAfter.get(MEMBER_SBT_CD);

			// 照査処理時
			if (SERVICE_ID_KKSV0803.equals(serviceID)) {
				// マスター会員に変更・昇格
				if (MBTYPE_CD_NOT_EO.equals(memberSbtCd1)		// 非ｅｏ会員
				||	MBTYPE_CD_FAMILY_KOJIN.equals(memberSbtCd1)	// ファミリー会員（個人）
				||	MBTYPE_CD_FAMILY_HOJIN.equals(memberSbtCd1)	// ファミリー会員（法人）
				||	MBTYPE_CD_OPEN.equals(memberSbtCd1))		// オープン会員
				{
					if (MBTYPE_CD_MST_KOJIN.equals(memberSbtCd2) || MBTYPE_CD_MST_HOJIN.equals(memberSbtCd2)) {
						soapRenkeiMap.put("sysid", custMapAfter.get("sysid"));
						soapRenkeiMap.put("eoid", custMapAfter.get("eoid"));
						soapRenkeiMap.put("member_sbt_cd", custMapAfter.get("member_sbt_cd"));
						soapRenkeiMap.put("shk_eoid", custMapAfter.get("shk_eoid"));
						soapRenkeiMap.put("shk_eoid_pwd", custMapAfter.get("shk_eoid_pwd"));
					}
				}
				// マスター会員に変更
				if (MBTYPE_CD_NOT_EO.equals(memberSbtCd1)) {	// 非ｅｏ会員
					if (MBTYPE_CD_MST_KOJIN.equals(memberSbtCd2) || MBTYPE_CD_MST_HOJIN.equals(memberSbtCd2)) {
						soapRenkeiMap.put("cust_ntaikai_cd", custMapAfter.get("cust_ntaikai_cd"));
						soapRenkeiMap.put("join_ymd", custMapAfter.get("join_ymd"));
					}
				}
			}
// ANK-2480-00-00 MOD START
//			// キャンセル処理時 または 解約処理時
//			else if (SERVICE_ID_KKSV0806.equals(serviceID) || SERVICE_ID_KKSV0807.equals(serviceID)) {
			// キャンセル処理時 または 解約処理時 または 照査取消処理時
			else if (SERVICE_ID_KKSV0806.equals(serviceID) || SERVICE_ID_KKSV0807.equals(serviceID) || SERVICE_ID_KKSV0821.equals(serviceID)) {
// ANK-2480-00-00 MOD END
				String custTaikaiYmd = (String) custMapAfter.get(ECK0011A010CBSMsg1List.CUST_TAIKAI_YMD);	//退会日
				boolean isNotEoMember = (MBTYPE_CD_NOT_EO.equals(memberSbtCd2) || !JKKBpCommon.isNull(custTaikaiYmd));

				// マスター会員
				if (MBTYPE_CD_MST_KOJIN.equals(memberSbtCd1)
				||	MBTYPE_CD_MST_HOJIN.equals(memberSbtCd1)
				||	MBTYPE_CD_NOT_EO.equals(memberSbtCd1))		//受付済でキャンセルされた場合を考慮し、非ｅｏ会員も含める
				{
					// 非eo会員へ変更(退会)または、オープン会員へ変更(降格)
					if (isNotEoMember							// 非ｅｏ会員か退会済
					||	MBTYPE_CD_OPEN.equals(memberSbtCd2))	// オープン会員
					{
						soapRenkeiMap.put("sysid", custMapAfter.get("sysid"));
						soapRenkeiMap.put("eoid", custMapAfter.get("eoid"));
						soapRenkeiMap.put("member_sbt_cd", custMapAfter.get("member_sbt_cd"));
					}
					// マスター会員から非eo会員へ変更(降格)に降格
					if (isNotEoMember) {
						soapRenkeiMap.put("cust_ntaikai_cd", custMapAfter.get("cust_ntaikai_cd"));
						soapRenkeiMap.put("cust_taikai_ymd", custMapAfter.get("cust_taikai_ymd"));
					}
				}
			}
		}
	}

	/**
	 * 請求契約番号取得処理
	 * @param handle
	 * @param param
	 * @param svcKeiNo
	 * @return 請求契約番号を返します
	 */
	private String getSeikyKeiNoBySvcKeiNo(SessionHandle handle, IRequestParameterReadWrite param, String svcKeiNo)
			throws Throwable
	{
		// 課金先一覧照会（サービス契約番号）を実行
		String seiky_kei_no = null;
		{
			JKKSIFEKK0321Mapper mapper = new JKKSIFEKK0321Mapper();
			CAANMsg templateEKK0321B005 = mapper.getMappedTemplateEKK0321B005(svcKeiNo);

			// SIF実行
			CAANMsg[] resultMsgsEKK0321B005 = callScCmn(param, handle, templateEKK0321B005, mapper);

			if (resultMsgsEKK0321B005.length > 0) {
				List<CAANMsg> data = new ArrayList();
				for (int i=0; i < resultMsgsEKK0321B005.length; i++) {
					CAANMsg r = resultMsgsEKK0321B005[i];
					CAANMsg[] kakinsList = r.getCAANMsgList(EKK0321B005CBSMsg.EKK0321B005CBSMSG1LIST);
					for (int j=0; j < kakinsList.length; j++) {
						data.add(kakinsList[j]);
					}
				}

				// 課金先番号 - 降順ソート
				Collections.sort(data, new Comparator<CAANMsg>() {
					public int compare(CAANMsg map1, CAANMsg map2) {
						String key1 = (String)map1.getString("kakins_no");
						String key2 = (String)map2.getString("kakins_no");
						return key2.compareTo(key1);
					}
				});
				// 最新の請求契約番号を取得
				if (data.size() > 0) {
					seiky_kei_no = data.get(0).getString("seiky_kei_no");
				}
			}
		}

		return seiky_kei_no;
	}

	/**
	 * サービス契約一意照会SIFを呼び出し
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @param inHash 条件用Hash
	 * @param resultHash 結果のハッシュ
	 * @param index 処理順番
	 * @return サービスインターフェースのリターンコード
	 * @throws Throwable 
	 */
	private HashMap<String, Object> callEKK0081A010SC(IRequestParameterReadWrite param, SessionHandle handle)
			throws Throwable
	{
		// SIFの実行結果から取得したCAANMsg[]
		CAANMsg[] resultMsgs = null;
		CAANMsg template = null;

		String svcKeiNo = (String)this.soapRenkeiMap.get(SVC_KEI_NO);

		//EKK0081A010への呼び出しパラメータ設定
		JKKSIFEKK0081Mapper mapper = new JKKSIFEKK0081Mapper();
		template = mapper.getMappedTemplateEKK0081A010(svcKeiNo, this.oPE_DATE);

		// SIF実行
		resultMsgs = callScCmn(param, handle, template, mapper);

		// 結果を設定
		HashMap<String, Object> resultHash = mappingCAANOutMsgOne(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST, resultMsgs);

		return resultHash;
	}

	/**
	 * ECK0011A010 お客様一意照会を実行します（カレントを取得）
	 * <br/>
	 * 
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @param sysid sysid
	 * @param resultHash 照会結果
	 * @throws Throwable 任意の例外
	 */
	private Map<String, Object> callECK0011A010SC(IRequestParameterReadWrite param, SessionHandle handle, String sysid)
			throws Throwable
	{
		if (null == sysid || 1 > sysid.length()) {
			return null;
		}

		// SIFの実行結果から取得したCAANMsg[]
		CAANMsg[] resultMsgs = null;
		// テンプレート情報部（入力時の情報）
		CAANMsg template = null;

		// ECK0011A010への呼び出しパラメータ設定
		JKKSIFECK0011Mapper mapper = new JKKSIFECK0011Mapper();
		template = mapper.getMappedTemplateECK0011A010(sysid, this.oPE_DATE);

		// SIF実行
		resultMsgs = callScCmn(param, handle, template, mapper);

		// 結果を設定
		HashMap<String, Object> resultHash = mappingCAANOutMsgOne(ECK0011A010CBSMsg.ECK0011A010CBSMSG1LIST, resultMsgs);

		return resultHash;
	}

	/**
	 * サービス契約＜eo電気＞照査を実行します
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @return resultHash 実行結果
	 * @throws Throwable
	 */
	private Map<String, Object> callEKK2981C010SC(IRequestParameterReadWrite param, SessionHandle handle)
			throws Throwable
	{
		Map<String, Object> resultHash = new HashMap<String, Object>();

		// サービス契約番号
		String svc_kei_no = (String)soapRenkeiMap.get(SVC_KEI_NO);
		// 整理番号
		String seiri_no = null;
		if (svcKeiMap != null) {
			seiri_no = (String)svcKeiMap.get("seiri_no");
		}
		// 異動区分
		String ido_div = null;
		if (svcKeiMap != null) {
			ido_div = (String)svcKeiMap.get("ido_div");
		} else {
			ido_div = JKKStrConst.CD00576_00001;	// 00001：新規受付
		}
		// 照査年月日
		String shosa_ymd = (String)soapRenkeiMap.get("shosa_ymd");
		// 照査解約完了コード
		String shosa_dsl_fin_cd = (String)soapRenkeiMap.get("shosa_dsl_fin_cd");
		// 自動照査処理状態コード
		String auto_shosa_tran_stat_cd = "1";	// 処理済

		// EKK2981C010への呼び出しパラメータ設定
		JKKSIFEKK2981Mapper mapper = new JKKSIFEKK2981Mapper();
		CAANMsg template = mapper.getMappedTemplateEKK2981C010(
				svc_kei_no, seiri_no, ido_div, shosa_ymd, shosa_dsl_fin_cd, auto_shosa_tran_stat_cd);

		// SIF実行
		CAANMsg[] resultMsgs = callScCmn(param, handle, template, mapper);

		return resultHash;
	}

	/**
	 * EKK0021C060 申込明細照査・後続業務取消S-IFを呼び出します
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param workMap 作業領域
	 * @throws Throwable 任意の例外
	 */
	private void callEKK0021C060SC(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> workMap)
			throws Throwable
	{
		//入力データ
		String mskmDtlNo = (String) workMap.get(MSKM_DTL_NO);
		String idoDiv    = (String) workMap.get(IDO_DIV);
		String updDtmBf  = (String) workMap.get(KK0011_UPD_DTM);

		if (!JKKStringUtil.isNullBlank(mskmDtlNo))
		{
			// EKK0021C060呼び出し用マップ設定
			JKKSIFEKK0021Mapper mapper = new JKKSIFEKK0021Mapper();
			CAANMsg template = mapper.getMappedTemplateEKK0021C060(idoDiv, mskmDtlNo, null, updDtmBf);

			// SIF実行
			CAANMsg[] resultMsgs = callScCmn(param, handle, template, mapper);

			//出力結果を取得
			CAANMsg ekk0021c060OutMsg = resultMsgs[0];
		}
	}

	/**
	 * EKK0081C160 サービス契約キャンセルS-IFを呼び出します
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param workMap 作業領域
	 * @throws Throwable 任意の例外
	 */
	private void callEKK0081C160SC(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> workMap)
			throws Throwable
	{
		//入力データ
		String funcCode		= (String) this.soapRenkeiMap.get(IN_FUNC_CODE);
		String svcKeiNo		= (String) this.soapRenkeiMap.get(SVC_KEI_NO);
		String mskmDtlNo	= (String) workMap.get(MSKM_DTL_NO);
		String svcClYmd		= (String) this.soapRenkeiMap.get(IN_SVC_CL_YMD);
		String dlreCd		= (String) this.soapRenkeiMap.get(IN_CL_RSN_CD);
		String idoDiv		= JKKStrConst.CD00576_CNCL;
		String updDtmBf		= (String) workMap.get(KK0081_UPD_DTM);

		// EKK0081C160呼び出し用マップ設定
		JKKSIFEKK0081Mapper mapper = new JKKSIFEKK0081Mapper();
		CAANMsg template = mapper.getMappedTemplateEKK0081C160(funcCode, svcKeiNo, mskmDtlNo, svcClYmd, dlreCd, idoDiv, updDtmBf);

		// SIF実行
		CAANMsg[] resultMsgs = callScCmn(param, handle, template, mapper);

		//出力結果を取得
		CAANMsg ekk0081c160OutMsg = resultMsgs[0];

		//更新日時
		String updDtm = ekk0081c160OutMsg.getString(EKK0081C160CBSMsg.UPD_DTM);
		workMap.put(KK0081_UPD_DTM, updDtm);
	}

	/**
	 * EKK0011D020 申込内容承認登録S-IFを実行します
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText I/Oマップのキー
	 * @param mskmSbtCd 申込種別コード
	 * @throws Throwable 任意の例外
	 */
	private void callEKK0011D020SC(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> workMap, String mskmSbtCd)
			throws Throwable
	{
		//入力データ
		String funcCode		= (String) this.soapRenkeiMap.get(IN_FUNC_CODE);
		String sysid		= this.currentSysid;
		String mskmUkDtm	= (String) workMap.get(IDO_DTM);

		if (null != sysid && 0 < sysid.length()) {
			// EKK0011D020への呼び出しパラメータ設定
			JKKSIFEKK0011Mapper mapper = new JKKSIFEKK0011Mapper();
			CAANMsg template = mapper.getMappedTemplateEKK0011D020(param, funcCode, mskmSbtCd, sysid, null, null, mskmUkDtm);

			// SIF実行
			CAANMsg[] resultMsgs = callScCmn(param, handle, template, mapper);

			//出力結果を取得
			CAANMsg ekk0011d020OutMsg = resultMsgs[0];
			CAANMsg[] kk0021Msg = ekk0011d020OutMsg.getCAANMsgList(EKK0011D020CBSMsg.EKK0011D020CBSMSG1LIST);

			//申込番号
			String mskmNo = ekk0011d020OutMsg.getString(EKK0011D020CBSMsg.MSKM_NO);
			workMap.put(MSKM_NO, mskmNo);

			//更新日時（申込）
			String kk0011UpdDtm = ekk0011d020OutMsg.getString(EKK0011D020CBSMsg.UPD_DTM);
			workMap.put(KK0011_UPD_DTM, kk0011UpdDtm);

			//申込明細番号
			String mskmDtlNo = kk0021Msg[0].getString(EKK0011D020CBSMsg1List.MSKM_DTL_NO);
			workMap.put(MSKM_DTL_NO, mskmDtlNo);
			this.svcKeiMap.put("mskm_dtl_no", mskmDtlNo);
		}
	}

	/**
	 * EKK0081C180 サービス契約解約S-IFを呼び出します
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param workMap 作業領域
	 * @throws Throwable 任意の例外
	 */
	private void callEKK0081C180SC(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> workMap)
			throws Throwable
	{
		//入力データ
		String funcCode  = (String) this.soapRenkeiMap.get(IN_FUNC_CODE);
		String svcKeiNo  = (String) this.soapRenkeiMap.get(SVC_KEI_NO);
		String mskmDtlNo = (String) workMap.get(MSKM_DTL_NO);
		String svcEndYmd = (String) this.soapRenkeiMap.get(IN_SVC_ENDYMD);
		String svcChrgEndYmd = (String) this.soapRenkeiMap.get(IN_SVC_CHRG_ENDYMD);
		String dlreCd    = (String) this.soapRenkeiMap.get(IN_SVC_DLRE_CD);
		String dlreMemo  = (String) this.soapRenkeiMap.get(IN_SVC_DLRE_MEMO);
		String idoDiv    = JKKStrConst.CD00576_DSL;
		String updDtmBf  = (String) workMap.get(KK0081_UPD_DTM);
		String rsvAplyKiboYmd = svcEndYmd;
		// ANK-4471-00-00 #81151 MOD START
		//String svcDslYmd = (String) this.soapRenkeiMap.get(IN_SVC_DSL_YMD);
		String svcDslYmd = this.oPE_DATE;
		// ANK-4471-00-00 #81151 MOD END
		// 請求オプション対応と合わせて修正。違約金発生コードは例外のお客様を除いて基本的には"1"を指定するのが正。
		// 実際の違約金発生に関しては料金側の計算に委ねる。
		String pnltyHasseiCd = "1";

		// EKK0081C180呼び出し用マップ設定
		JKKSIFEKK0081Mapper mapper = new JKKSIFEKK0081Mapper();
		CAANMsg template = mapper.getMappedTemplateEKK0081C180(
				  funcCode, svcKeiNo, mskmDtlNo, rsvAplyKiboYmd
				, svcEndYmd, svcChrgEndYmd, dlreCd, dlreMemo
				, pnltyHasseiCd, idoDiv, updDtmBf, svcDslYmd
			);

		// SIF実行
		CAANMsg[] resultMsgs = callScCmn(param, handle, template, mapper);

		//出力結果を取得
		CAANMsg ekk0081c180OutMsg = resultMsgs[0];

		//更新日時
		String updDtm = ekk0081c180OutMsg.getString(EKK0081C180CBSMsg.UPD_DTM);
		workMap.put(KK0081_UPD_DTM, updDtm);
	}

	/**
	 * EKK0081C260 サービス契約解約確定S-IFを呼び出します
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param workMap 作業領域
	 * @throws Throwable 任意の例外
	 */
	private void callEKK0081C260SC(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> workMap)
			throws Throwable
	{
		//入力データ
		String funcCode  = (String) this.soapRenkeiMap.get(IN_FUNC_CODE);
		String svcKeiNo  = (String) this.soapRenkeiMap.get(SVC_KEI_NO);
		String svcEndYmd = (String) this.soapRenkeiMap.get(IN_SVC_ENDYMD);
		String svcChrgEndYmd = (String) this.soapRenkeiMap.get(IN_SVC_CHRG_ENDYMD);
		String dlreCd    = (String) this.soapRenkeiMap.get(IN_SVC_DLRE_CD);
		String dlreMemo  = (String) this.soapRenkeiMap.get(IN_SVC_DLRE_MEMO);
		String updDtmBf  = (String) workMap.get(KK0081_UPD_DTM);
		// ANK-4471-00-00 #81151 MOD START
		//String svcDslYmd = (String) this.soapRenkeiMap.get(IN_SVC_DSL_YMD);		//2014/01/17追加
		String svcDslYmd = this.oPE_DATE;
		// ANK-4471-00-00 #81151 MOD END
		
		//解約起算日＝サービス課金終了日＋１
		String dslKisanYmd = JCCDateUtil.addDay(svcChrgEndYmd, 1);
		
		// EKK0081C160呼び出し用マップ設定
		JKKSIFEKK0081Mapper mapper = new JKKSIFEKK0081Mapper();
		CAANMsg template = mapper.getMappedTemplateEKK0081C260(funcCode, svcKeiNo, svcEndYmd, svcChrgEndYmd, dslKisanYmd, dlreCd, dlreMemo, updDtmBf, svcDslYmd);

		// SIF実行
		CAANMsg[] resultMsgs = callScCmn(param, handle, template, mapper);

		//出力結果を取得
		CAANMsg ekk0081c260OutMsg = resultMsgs[0];

		//更新日時
		String updDtm = ekk0081c260OutMsg.getString(EKK0081C260CBSMsg.UPD_DTM);
		workMap.put(KK0081_UPD_DTM, updDtm);
	}

// ANK-2480-00-00 ADD START
	/**
	 * サービス契約＜eo電気＞照査取消を実行します
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @return resultHash 実行結果
	 * @throws Throwable
	 */
	private Map<String, Object> callEKK2981C050SC(
			IRequestParameterReadWrite	param
		,	SessionHandle				handle
	) throws Throwable
	{
		Map<String, Object> resultHash = new HashMap<String, Object>();

		// サービス契約番号
		String svc_kei_no = (String)soapRenkeiMap.get(SVC_KEI_NO);
		// 照査取消年月日
		String shosa_cl_ymd = (String)soapRenkeiMap.get("shosa_cl_ymd");

		// EKK2981C050への呼び出しパラメータ設定
		JKKSIFEKK2981Mapper mapper = new JKKSIFEKK2981Mapper();
		CAANMsg template = mapper.getMappedTemplateEKK2981C050(svc_kei_no, shosa_cl_ymd);

		// SIF実行
		CAANMsg[] resultMsgs = callScCmn(param, handle, template, mapper);

		return resultHash;
	}

	/**
	 * 申込明細一意照会を実行します
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @return resultHash 実行結果
	 * @throws Throwable
	 */
	private Map<String, Object> callEKK0021A010SC(
			IRequestParameterReadWrite	param
		,	SessionHandle				handle
	) throws Throwable
	{
		Map<String, Object> resultHash = new HashMap<String, Object>();

		// 申込一意照会
		JKKSIFEKK0021Mapper mapper = new JKKSIFEKK0021Mapper();
		String mskmDtlNo = (String)svcKeiMap.get(EKK0081A010CBSMsg1List.MSKM_DTL_NO);
		CAANMsg templateEKK0021A010 = mapper.getMappedTemplateEKK0021A010(mskmDtlNo, null);

		// SIF実行
		CAANMsg[] resultEKK0021A010 = callScCmn(param, handle, templateEKK0021A010, mapper);

		// 結果を設定
		resultHash = mappingCAANOutMsgOne(EKK0021A010CBSMsg.EKK0021A010CBSMSG1LIST, resultEKK0021A010);

		return resultHash;
	}

	/**
	 * 申込明細照査取消を実行します
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @return resultHash 実行結果
	 * @throws Throwable
	 */
	private Map<String, Object> callEKK0021C110SC(
			IRequestParameterReadWrite	param
		,	SessionHandle				handle
		,	String						upd_dtm
	) throws Throwable
	{
		Map<String, Object> resultHash = new HashMap<String, Object>();

		// 申込明細番号
		String mskm_dtl_no = (String) this.svcKeiMap.get(EKK0081A010CBSMsg1List.MSKM_DTL_NO);

		// EKK0021C110への呼び出しパラメータ設定
		JKKSIFEKK0021Mapper mapper = new JKKSIFEKK0021Mapper();
		CAANMsg template = mapper.getMappedTemplateEKK0021C110(mskm_dtl_no, upd_dtm);

		// SIF実行
		CAANMsg[] resultMsgs = callScCmn(param, handle, template, mapper);

		return resultHash;
	}
// ANK-2480-00-00 ADD END

	/**
	 * SIFを呼び出します
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @param template テンプレート
	 * @param mapper マッパー
	 * @return
	 * @throws Throwable
	 */
	private CAANMsg[] callScCmn(IRequestParameterReadWrite param, SessionHandle handle, CAANMsg template, JKKSIFMapperBase mapper)
			throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		Map<?, ?> sIFResult = null;

		//テンプレート共通情報を設定
		mapper.editTemplateCommon(param, template);
		
		// サービスIF共通の情報を設定
		sIFRequest = mapper.editInMsgCmn(param);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

		// SIFの呼び出し
		sIFResult = (new ServiceComponentRequestInvoker()).run(sIFRequest, handle);

		// 結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);

		// エラー情報のマッピング
		editResultRP(sIFResult, param);

		errChk(sIFResult);

		// リターンコード取得
		int returnCode = (Integer)sIFResult.get(JCMConstants.RET_CD_INT_KEY);
		if (returnCode != 0) {
			throw new Exception();
		}

		return resultMsgs;
	}

	/**
	 * CAANMsg[]の結果をHashとして抽出する（一意照会用）
	 * @param workMapKey テンプレートリストのマップキー
	 * @param resultMsgs テンプレートリスト
	 * @return EKK0081A010SCの結果部分
	 */
	private HashMap<String, Object> mappingCAANOutMsgOne(String workMapKey,CAANMsg[] resultMsgs)
	{
		HashMap<String, Object> retHash = null;
		CAANMsg msg = null;

		// 結果の抽出
		CAANMsg[] msgs = resultMsgs[0].getCAANMsgList(workMapKey);
		if (null != msgs && 0 < msgs.length) {
			msg = msgs[0];
		}

		if (msg != null) {
			retHash = msg.getMsgData();
		}

		return retHash;
	}

	/**
	 * <pre>
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteに必要なデータをマッピングする
	 * 
	 * </pre>
	 * @param msgList CAANMsgクラス
	 * @param param 業務データ取得・書込用I/F
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	private IRequestParameterReadWrite editResultRP(Map<?, ?> msgList, IRequestParameterReadWrite param)
			throws Throwable 
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);

		// テンプレートID、ステータス取得
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if (returnCode.intValue() != 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);
			// 外部IFの仕様上、単項目関連チェック(1050)は返さないことになっているため、単項目チェック(1000)エラーとして返す
			if ("1050".equals(formatStatus)) {
				formatStatus = "1000";
				JSYejbLog.println(JSYejbLog.DEBUG,this.getClass(),"MVNO対応：リターンコード置換え(単項目関連チェック：1050 -> 単項目チェック：1000)");
			}
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null) {
			errList = new ArrayList<Object>();
		}

		String tName = template.getString("templateID");		//S-IF名

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		// ユーザデータ情報にエラー情報をマッピング
		Map<String, Object> contentsMap = template.getMsgData();
		Object[] contents = contentsMap.keySet().toArray();
		for(int i = 0 ; contents != null && i < contents.length ; i++) {
			String element = null;
			element = (String)contents[i];
			if (element.indexOf("_err") > 0) {
				if (!template.isNull(element)) {
					//‘key_’を除く
					String e = element.replaceFirst("key_", "");
					if ("EKK2981C010".equals(tName) && e.equals(EKK2981C010CBSMsg.SHOSA_YMD_I_ERR)) {
						e = EKK2981C010CBSMsg.SHOSA_YMD + "_err";
					}
					if ("EKK0081C160".equals(tName) && e.equals(EKK0081C160CBSMsg.SVC_CANCEL_YMD_I_ERR)) {
						e = IN_SVC_CL_YMD + "_err";
					}
					if ("EKK0081C260".equals(tName) && e.equals(EKK0081C260CBSMsg.SVC_DSL_YMD_I_ERR)) {
						e = IN_SVC_DSL_YMD + "_err";
					}
					// エラーフラグのセット
					soapRenkeiMap.put(e, template.getString(element));
				}
			}
		}

		return param;
	}

	/**
	 * エラーチェック処理です。
	 * <br>
	 * @param msgList サービスインタフェース実行結果
	 * @return void
	 * @throws Exception 
	 */
	private void errChk(Map<?, ?> msgList) throws Exception
	{
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// ステータス取得
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if ((0 != returnCode.intValue()) || (0 != templateStatus)) {
			String errMsg = ERR_MSG;
			throw new SCCallException(errMsg, String.valueOf(returnCode), templateStatus);
		}
	}
}
