/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*    システム名        ：eo顧客基幹システム
*    モジュール名    ：JCHDslAfTnkysIfCC
*    ソースファイル名：JCHDslAfTnkysIfCC.java
*    作成者            ：FJ
*    日付            ：2020年04月06日
*＜機能概要＞
*    解約後転居先情報の共通コンポーネント
*＜修正履歴＞
*    バージョン      修正日      修正者      修正内容
*    v49.00.00       2020/04/06  FJ)西川     ANK-3785-00-00_解約後転居先情報の管理
**********************************************************************/
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.common.constant.JACStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0081B529CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B529CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3231A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3231A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3231D010CBSMsg;

/**
 * 解約後転居先情報の共通コンポーネントの共通コンポーネントクラスです。
 * <br>
 * @author 富士通
 *
 */
public class JCHDslAfTnkysIfCC extends AbstractCommonComponent
{

	/** テンプレートID(EKK3231A010) 解約後転居先情報一意照会 */
	private static final String TEMPLATE_ID_EKK3231A010 = "EKK3231A010";

	/** テンプレートID(EKK3231D010) 解約後転居先情報登録 */
	private static final String TEMPLATE_ID_EKK3231D010 = "EKK3231D010";

	/** テンプレートID(EKK0081B529) 同一請求契約サービス契約一覧照会 */
	private static final String TEMPLATE_ID_EKK0081B529 = "EKK0081B529";

	/** テンプレートID(EKK1091D010) 進捗登録 */
	private static final String TEMPLATE_ID_EKK1091D010 = "EKK1091D010";

	/** BP連携（I/O）の各項目 */
	private static final String FUNC_CODE = "func_code";

	/** KK3231 解約転居先情報の照会登録時の項目名 */
	private static final String SEIKY_KEI_NO = "seiky_kei_no";
	private static final String GENE_ADD_DTM = "gene_add_dtm";
	private static final String CUST_NM = "cust_nm";
	private static final String CUST_KANA = "cust_kana";
	private static final String TELNO = "telno";
	private static final String TELNO_SBT = "telno_sbt";
	private static final String PCD = "pcd";
	private static final String AD = "ad";
	private static final String MITCK_FLG = "mitck_flg";
	private static final String YK_KDNSK_NON_FLG = "yk_kdnsk_non_flg";
	private static final String KIJI = "kiji";
	private static final String UPD_DTM = "upd_dtm";
	private static final String UPD_DTM_BF = "upd_dtm_bf";
	private static final String SVC_KEY_JCHDSLAFTNKYSIFCC = "JCHDslAfTnkysIfCC";
	private static final String SVC_LIST_KEY_EKK3231A010 = "EKK3231A010CBSMsg1List";

	/** KK3231 解約転居先情報の照会登録時の項目和名 */
	private static final String JP_CUST_NM = "氏名";
	private static final String JP_CUST_KANA = "氏名(カナ)";
	private static final String JP_TELNO = "電話番号";
	private static final String JP_TELNO_SBT = "電話番号(種別)";
	private static final String JP_PCD = "郵便番号";
	private static final String JP_AD = "住所";
	private static final String JP_MITCK_FLG = "未着フラグ";
	private static final String JP_YK_KDNSK_NON_FLG = "有効架電先なしフラグ";
	private static final String JP_KIJI = "記事";

	/** KK3231 解約転居先情報登録　排他エラー判断項目 */
	private static final String ERR_SIF = "err_sif";
	private static final String ERR_COL = "err_col";

	/** 進捗／異動理由情報登録時の項目 */
	private static final String IDO_RSN_MEMO = "ido_rsn_memo";
	private static final String IDO_RSN_CD = "ido_rsn_cd";
	private static final String LIST_KEY_EKK1091D010 = "EKK1091D010CBSMsg1List";

	private static final String PRJ_TKJK_BF = "：(変更前)";
	private static final String PRJ_TKJK_AF = " (変更後)";

	/**
	 * 解約後転居先情報の共通コンポーネントを実行します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable 例外が発生した場合
	 */
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{

		// 解約後転居先情報CCマップ
		Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		/* 業務データ取得 */
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(SVC_KEY_JCHDSLAFTNKYSIFCC);

		/* 排他エラー情報のクリア */
		dataMap.put(ERR_SIF, JACStrConst.KARA_MOJI);
		dataMap.put(ERR_COL, JACStrConst.KARA_MOJI);

		// 機能コード
		String funcCode = (String)ccMsg.get(FUNC_CODE);
		// 請求契約番号
		String seikyKeiNo = (String)ccMsg.get(SEIKY_KEI_NO);
		if (funcCode == null || JACStrConst.KARA_MOJI.equals(funcCode) || seikyKeiNo == null || JACStrConst.KARA_MOJI.equals(seikyKeiNo))
		{
			return param;
		}

		if (JPCModelConstant.FUNC_CD_1.equals(funcCode))
		{

			// 機能コード1：解約後転居先情報一意照会
			CAANMsg[] ekk3231A010Msg1List = executeEKK3231A010(handle, param, fixedText, scCall);

			if (ekk3231A010Msg1List == null || ekk3231A010Msg1List.length == 0)
			{
				return param;
			}
			return editOutMsgEKK3231A010(ekk3231A010Msg1List, param);
		}
		else if (JPCModelConstant.FUNC_CD_2.equals(funcCode))
		{
			// 機能コード2：解約後転居先情報登録／解約後転居先情報更新

			String[] prgTkjk = { JACStrConst.KARA_MOJI, JACStrConst.KARA_MOJI };

			// 解約後転居先情報一意照会
			CAANMsg[] ekk3231A010Msg1List = executeEKK3231A010(handle, param, fixedText, scCall);
			if (ekk3231A010Msg1List != null && ekk3231A010Msg1List.length != 0)
			{
				// 登録データが1件以上の存在する場合

				// 更新年月日時分秒
				String updDtmNow = getUpdDtmEKK3231A010(ekk3231A010Msg1List);

				// 更新年月日時分秒(更新前)
				String updDtmBf = (String)ccMsg.get(UPD_DTM_BF);
				if (updDtmBf == null || JACStrConst.KARA_MOJI.equals(updDtmBf) || !updDtmBf.equals(updDtmNow))
				{
					// 登録データが1件以上の存在する場合で更新年月日時分秒(更新前)が未設定の場合、排他エラー
					// 又は更新年月日時分秒(更新前)とカレントの更新年月日時分秒が異なっている場合も排他エラー
					dataMap.put(ERR_SIF, TEMPLATE_ID_EKK3231A010);
					dataMap.put(ERR_COL, UPD_DTM_BF);
					return param;
				}

				// 解約後転居先情報の変更前後の内容を「進捗特記事項1(128桁(256byte))」に設定する。
				// 但し文字するが溢れる場合は、「進捗特記事項2(128桁(256byte))」も使用し登録する。
				// 「進捗特記事項2」からも溢れる場合は、文字を削除する。
				//『＜項目名＞：(変更前)X *1(変更後)X *2 』
				prgTkjk = editPrgTkjk(param, ekk3231A010Msg1List);
			}

			// 解約後転居先情報登録の上りマッピング
			Object[][] ekk3231D010In =
					{ { EKK3231D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3231D010 }, { EKK3231D010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
							{ EKK3231D010CBSMsg.SEIKY_KEI_NO, ccMsg.get(SEIKY_KEI_NO) }, { EKK3231D010CBSMsg.CUST_NM, ccMsg.get(CUST_NM) },
							{ EKK3231D010CBSMsg.CUST_KANA, ccMsg.get(CUST_KANA) }, { EKK3231D010CBSMsg.TELNO, ccMsg.get(TELNO) }, { EKK3231D010CBSMsg.TELNO_SBT, ccMsg.get(TELNO_SBT) },
							{ EKK3231D010CBSMsg.PCD, ccMsg.get(PCD) }, { EKK3231D010CBSMsg.AD, ccMsg.get(AD) }, { EKK3231D010CBSMsg.MITCK_FLG, ccMsg.get(MITCK_FLG) },
							{ EKK3231D010CBSMsg.YK_KDNSK_NON_FLG, ccMsg.get(YK_KDNSK_NON_FLG) }, { EKK3231D010CBSMsg.KIJI, ccMsg.get(KIJI) } };

			// サービスIF実行
			callSC(handle, scCall, param, fixedText, ekk3231D010In, new EKK3231D010CBSMsg().getContents());

			// 同一請求契約サービス契約一覧照会の上りマッピング
			Object[][] ekk0081B529In =
					{ { EKK0081B529CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081B529 }, { EKK0081B529CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
							{ EKK0081B529CBSMsg.KEY_SEIKY_KEI_NO, ccMsg.get(SEIKY_KEI_NO) } };

			// サービスIF実行
			CAANMsg ekk0081B529Msg = callSC(handle, scCall, param, fixedText, ekk0081B529In, new EKK0081B529CBSMsg().getContents());

			// 同一請求契約サービス契約一覧照会明細
			CAANMsg[] ekk0081B529Msg1List = ekk0081B529Msg.getCAANMsgList(EKK0081B529CBSMsg.EKK0081B529CBSMSG1LIST);

			if (ekk0081B529Msg1List == null || ekk0081B529Msg1List.length == 0)
			{
				return param;
			}

			HashMap<String, String> childMap = new HashMap<String, String>();
			// 異動理由コード
			childMap.put(EKK1091D010CBSMsg1List.IDO_RSN_CD, JKKStrConst.CD00846_DSL_AF_MV_TKSK);
			// 異動理由メモ
			childMap.put(EKK1091D010CBSMsg1List.IDO_RSN_MEMO, null);
			ArrayList<HashMap<String, String>> inList = new ArrayList<HashMap<String, String>>();
			inList.add(childMap);
			HashMap<String, ArrayList<HashMap<String, String>>> eKK1091D010Map = new HashMap<String, ArrayList<HashMap<String, String>>>();
			eKK1091D010Map.put(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST, inList);

			for (int i = 0; i < ekk0081B529Msg1List.length; i++)
			{
				CAANMsg childTemplate = ekk0081B529Msg1List[i];

				if (!childTemplate.isNull(EKK0081B529CBSMsg1List.SVC_KEI_STAT) && !"920".equals(childTemplate.getString(EKK0081B529CBSMsg1List.SVC_KEI_STAT))
						&& !childTemplate.isNull(EKK0081B529CBSMsg1List.SVC_CD) && !"04".equals(childTemplate.getString(EKK0081B529CBSMsg1List.SVC_CD)))
				{
					// 請求契約番号に紐づくサービス契約番号のうち
					// サービス契約ステータスが「920:キャンセル済」以外で且つサービスコード「04:ホスティング」以外のサービス契約番号を取得
					String svcKeiNo = toStrVal(childTemplate.getString(EKK0081B529CBSMsg1List.SVC_KEI_NO));

					Object[][] ekk1091d010In =
							{ { EKK1091D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1091D010 }, { EKK1091D010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 }, { EKK1091D010CBSMsg.MSKM_DTL_NO, JACStrConst.KARA_MOJI },
									{ EKK1091D010CBSMsg.SEIKY_KEI_NO, JACStrConst.KARA_MOJI }, { EKK1091D010CBSMsg.SVC_KEI_NO, svcKeiNo }, { EKK1091D010CBSMsg.IDO_DIV, JKKStrConst.CD00576_CUST_INFO_CHG },
									{ EKK1091D010CBSMsg.IDO_DTM, JCCBPCommon.getSysDateTimeStamp() }, { EKK1091D010CBSMsg.PRG_STAT, JKKStrConst.CD00647_PRG_STAT_NAIYO_CHG_FIN },
									{ EKK1091D010CBSMsg.PRG_TKJK_1, prgTkjk[0] }, { EKK1091D010CBSMsg.PRG_TKJK_2, prgTkjk[1] }, { EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST, eKK1091D010Map } };

					// 請求契約番号に紐づくサービス契約番号に対して進捗登録する
					// 但しサービス契約ステータスが「920:キャンセル済」とサービスコード「04:ホスティング」のサービス契約番号は除く。
					callSC(handle, scCall, param, fixedText, ekk1091d010In);
				}
			}
		}

		return param;
	}

	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 *
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @param contents CAANMsgのコンテンツ
	 * @return CAANMsg
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg callSC(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param, String dataMapKey, Object[][] mappingData, Object[][] contents)
			throws Throwable
	{
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);

		Map<?, ?> result = scCall.run(paramMap, handle);

		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);

		CAANMsg msg = templates[0];

		// リターンコード取得
		int return_code = (Integer)result.get(JCMConstants.RET_CD_INT_KEY);
		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);

		editErrorInfoCom(param, templates, return_code, dataMapKey, mappingData, contents);

		// エラー情報のマップを取得
		ArrayList<Object> errorList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);

		if (null == errorList)
		{
			errorList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errorList));

		// 異常の場合、SCCallExceptionを生成してスローする
		if (JPCModelConstant.NORMAL_END < return_code || JPCModelConstant.WARNING < status)
		{
			throw new SCCallException("戻り値不正", String.valueOf(return_code), status);
		}

		return msg;
	}

	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 *
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Exception
	 */
	private CAANMsg callSC(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param, String dataMapKey, Object[][] mappingData) throws Exception
	{
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);

		Map<?, ?> result = scCall.run(paramMap, handle);

		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];

		// リターンコード取得
		int returnCode = (Integer)result.get(JCMConstants.RET_CD_INT_KEY);

		int templateStatus = msg.getInt(EKK1091D010CBSMsg.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);
		}

		setErrorInf(msg, (HashMap<String, Object>)param.getData(dataMapKey));

		String svcIf = (String)mappingData[0][1];

		if (TEMPLATE_ID_EKK1091D010.equals(svcIf))
		{
			HashMap eKK1091D010Map = (HashMap)mappingData[mappingData.length - 1][1];
			ArrayList<HashMap<String, String>> inList = (ArrayList)eKK1091D010Map.get(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST);
			CAANMsg[] templateArray = msg.getCAANMsgList(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST);

			if (templateArray != null)
			{
				for (int i = 0; i < templateArray.length; i++)
				{
					setErrorInf(templateArray[i], (HashMap)inList.get(i));
				}
			}
		}

		//エラー情報のマップを取得
		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));

		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		Integer status = msg.getInt(JCMConstants.STATUS_INT_KEY);

		// 異常の場合、SCCallExceptionを生成してスローする
		if (!("0".equals(rtnCode) && 0 == status.intValue()))
		{
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		return msg;
	}

	/**
	 * エラー情報を設定します。
	 *
	 * @param msg
	 * @param map
	 *
	 */
	private void setErrorInf(CAANMsg msg, HashMap<String, Object> map)
	{
		Iterator<String> msgKey = msg.getSchema().getSchemaKeySet().iterator();

		while (msgKey.hasNext())
		{
			String key = msgKey.next();

			if (key.endsWith("_err"))
			{
				if (!msg.isNull(key))
				{
					if (!map.containsKey(key))
					{
						map.put(key, toStrVal(msg.getString(key)));
					}
				}
			}
		}
	}

	/**
	 * 共通項目のメッセージを作成します。
	 *
	 * @param param リクエストパラメータ
	 * @param mappingData マッピングデータ
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param, Object[][] mappingData) 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));

		String svcIf = (String)mappingData[0][1];

		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));

		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));

		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));

		if (TEMPLATE_ID_EKK1091D010.equals(mappingData[0][1]))
		{
			for (int i = 0; i < mappingData.length - 1; i++)
			{
				if (JACStrConst.KARA_MOJI.equals(mappingData[i][1]))
				{
					template.setNull((String)mappingData[i][0]);
				}
				else
				{
					template.set((String)mappingData[i][0], mappingData[i][1]);
				}
			}

			template = setEKK1091D010CBSMsg1List(template, (HashMap)mappingData[mappingData.length - 1][1]);
		}
		else
		{
			for (int i = 0; i < mappingData.length; i++)
			{
				if (JACStrConst.KARA_MOJI.equals(mappingData[i][1]))
				{
					template.setNull((String)mappingData[i][0]);
				}
				else
				{
					template.set((String)mappingData[i][0], mappingData[i][1]);
				}
			}
		}

		CAANMsg[] templates = new CAANMsg[1];

		templates[0] = template;

		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 *
	 * @param template
	 * @param ccMsg
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	private CAANMsg setEKK1091D010CBSMsg1List(CAANMsg template, HashMap ccMsg) throws RequestParameterException
	{
		ArrayList inList = (ArrayList)ccMsg.get(LIST_KEY_EKK1091D010);
		CAANMsg[] templateArray = template.getCAANMsgList(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST);
		if (templateArray == null)
		{
			templateArray = new CAANMsg[inList.size()];
		}

		if (inList != null)
		{
			for (int i = 0; i < inList.size(); i++)
			{
				HashMap childMap = (HashMap)inList.get(i);

				CAANMsg childTemplate = templateArray[i];
				if (childTemplate == null)
				{
					childTemplate = new CAANMsg(EKK1091D010CBSMsg1List.class.getName());
				}
				// 進捗登録マップ.異動理由明細.異動理由コード → 異動理由明細.異動理由コード
				if (JACStrConst.KARA_MOJI.equals(childMap.get(IDO_RSN_CD)))
				{
					childTemplate.setNull(EKK1091D010CBSMsg1List.IDO_RSN_CD);
				}
				else
				{
					childTemplate.set(EKK1091D010CBSMsg1List.IDO_RSN_CD, (String)childMap.get(IDO_RSN_CD));
				}

				// 異動理由明細.異動理由メモ
				if (JACStrConst.KARA_MOJI.equals(childMap.get(IDO_RSN_MEMO)))
				{
					childTemplate.setNull(EKK1091D010CBSMsg1List.IDO_RSN_MEMO);
				}
				else
				{
					childTemplate.set(EKK1091D010CBSMsg1List.IDO_RSN_MEMO, (String)childMap.get(IDO_RSN_MEMO));
				}

				templateArray[i] = childTemplate;
			}
		}
		template.set(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST, templateArray);
		return template;
	}

	/**
	 * エラー情報を取得します。
	 *
	 * @param param リクエストパラメータ
	 * @param templates CAANMsgクラス
	 * @param returnCode リターンコード
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @param contents CAANMsgのコンテンツ
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, String dataMapKey, Object[][] mappingData, Object[][] contents)
			throws RequestParameterException
	{
		CAANMsg template = templates[0];

		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if (0 != returnCode)
		{
			templateStatus = 9000;
		}

		if (null == JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)))
		{
			templateStatus = 0;
		}

		int bpStatus = 0;

		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);

		if (null == obj)
		{
			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);
		}

		Map<String, String> inMap = null;

		// ユーザデータ情報
		inMap = (Map<String, String>)param.getData(dataMapKey);

		for (int i = 0; null != contents && i < contents.length; i++)
		{
			String itemNm = (String)contents[i][0];
			if (itemNm.endsWith("_err"))
			{
				String errCd = toStrVal(template.getString(itemNm));
				if (errCd != null && !JACStrConst.KARA_MOJI.equals(errCd))
				{
					inMap.put(itemNm, errCd);
				}
			}
		}
		return param;
	}

	/**
	 * EKK3231A010_解約後転居先情報一意照会実行処理
	 *
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param scCall
	 * @return
	 * @throws Throwable
	 */
	private CAANMsg[] executeEKK3231A010(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, ServiceComponentRequestInvoker scCall) throws Throwable
	{
		// 解約後転居先情報CCマップ
		Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);

		// 請求契約番号
		String seikyKeiNo = (String)ccMsg.get(SEIKY_KEI_NO);

		// 機能コード1：解約後転居先情報一意照会

		// 解約後転居先情報一意照会の上りマッピング
		Object[][] ekk3231A010In =
				{ { EKK3231A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3231A010 }, { EKK3231A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 }, { EKK3231A010CBSMsg.KEY_SEIKY_KEI_NO, seikyKeiNo } };

		// サービスIF実行
		CAANMsg ekk3231A010Msg = callSC(handle, scCall, param, fixedText, ekk3231A010In, new EKK3231A010CBSMsg().getContents());

		// 解約後転居先情報一意照会明細
		CAANMsg[] ekk3231A010Msg1List = ekk3231A010Msg.getCAANMsgList(EKK3231A010CBSMsg.EKK3231A010CBSMSG1LIST);

		return ekk3231A010Msg1List;
	}

	/**
	 * 解約後転居先情報一意照会結果取得処理.<br>
	 *
	 * @param templates 解約後転居先情報一意照会結果取得処理リスト
	 * @param param リクエストパラメータ
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	private IRequestParameterReadWrite editOutMsgEKK3231A010(CAANMsg[] templates, IRequestParameterReadWrite param) throws Exception
	{

		/* 業務データ設定 */
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(SVC_KEY_JCHDSLAFTNKYSIFCC);
		if (dataMap == null)
		{
			dataMap = new HashMap<String, Object>();
			param.setData(SVC_KEY_JCHDSLAFTNKYSIFCC, dataMap);
		}

		ArrayList<HashMap<String, Object>> ekk3231A010List = new ArrayList<HashMap<String, Object>>();

		for (int i = 0; i < templates.length; i++)
		{
			HashMap<String, Object> ekk3231A010ListDataMap = new HashMap<String, Object>();

			CAANMsg childTemplate = templates[i];

			// 解約後転居先情報一意照会.解約後転居先情報一意照会明細.請求契約番号 ← 解約後転居先情報一意照会明細.請求契約番号
			if (childTemplate.isNull(EKK3231A010CBSMsg1List.SEIKY_KEI_NO))
			{
				ekk3231A010ListDataMap.put(SEIKY_KEI_NO, JACStrConst.KARA_MOJI);
			}
			else
			{
				ekk3231A010ListDataMap.put(SEIKY_KEI_NO, childTemplate.getString(EKK3231A010CBSMsg1List.SEIKY_KEI_NO));
			}

			// 解約後転居先情報一意照会.解約後転居先情報一意照会明細.世代登録年月日時分秒 ← 解約後転居先情報一意照会明細.世代登録年月日時分秒
			if (childTemplate.isNull(EKK3231A010CBSMsg1List.GENE_ADD_DTM))
			{
				ekk3231A010ListDataMap.put(GENE_ADD_DTM, JACStrConst.KARA_MOJI);
			}
			else
			{
				ekk3231A010ListDataMap.put(GENE_ADD_DTM, childTemplate.getString(EKK3231A010CBSMsg1List.GENE_ADD_DTM));
			}

			// 解約後転居先情報一意照会.解約後転居先情報一意照会明細.お客様名 ← 解約後転居先情報一意照会明細.お客様名
			if (childTemplate.isNull(EKK3231A010CBSMsg1List.CUST_NM))
			{
				ekk3231A010ListDataMap.put(CUST_NM, JACStrConst.KARA_MOJI);
			}
			else
			{
				ekk3231A010ListDataMap.put(CUST_NM, childTemplate.getString(EKK3231A010CBSMsg1List.CUST_NM));
			}

			// 解約後転居先情報一意照会.解約後転居先情報一意照会明細.お客様カナ名 ← 解約後転居先情報一意照会明細.お客様カナ名
			if (childTemplate.isNull(EKK3231A010CBSMsg1List.CUST_KANA))
			{
				ekk3231A010ListDataMap.put(CUST_KANA, JACStrConst.KARA_MOJI);
			}
			else
			{
				ekk3231A010ListDataMap.put(CUST_KANA, childTemplate.getString(EKK3231A010CBSMsg1List.CUST_KANA));
			}

			// 解約後転居先情報一意照会.解約後転居先情報一意照会明細.電話番号 ← 解約後転居先情報一意照会明細.電話番号
			if (childTemplate.isNull(EKK3231A010CBSMsg1List.TELNO))
			{
				ekk3231A010ListDataMap.put(TELNO, JACStrConst.KARA_MOJI);
			}
			else
			{
				ekk3231A010ListDataMap.put(TELNO, childTemplate.getString(EKK3231A010CBSMsg1List.TELNO));
			}

			// 解約後転居先情報一意照会.解約後転居先情報一意照会明細.電話番号（種別） ← 解約後転居先情報一意照会明細.電話番号（種別）
			if (childTemplate.isNull(EKK3231A010CBSMsg1List.TELNO_SBT))
			{
				ekk3231A010ListDataMap.put(TELNO_SBT, JACStrConst.KARA_MOJI);
			}
			else
			{
				ekk3231A010ListDataMap.put(TELNO_SBT, childTemplate.getString(EKK3231A010CBSMsg1List.TELNO_SBT));
			}

			// 解約後転居先情報一意照会.解約後転居先情報一意照会明細.郵便番号 ← 解約後転居先情報一意照会明細.郵便番号
			if (childTemplate.isNull(EKK3231A010CBSMsg1List.PCD))
			{
				ekk3231A010ListDataMap.put(PCD, JACStrConst.KARA_MOJI);
			}
			else
			{
				ekk3231A010ListDataMap.put(PCD, childTemplate.getString(EKK3231A010CBSMsg1List.PCD));
			}

			// 解約後転居先情報一意照会.解約後転居先情報一意照会明細.住所 ← 解約後転居先情報一意照会明細.住所
			if (childTemplate.isNull(EKK3231A010CBSMsg1List.AD))
			{
				ekk3231A010ListDataMap.put(AD, JACStrConst.KARA_MOJI);
			}
			else
			{
				ekk3231A010ListDataMap.put(AD, childTemplate.getString(EKK3231A010CBSMsg1List.AD));
			}

			// 解約後転居先情報一意照会.解約後転居先情報一意照会明細.未着フラグ ← 解約後転居先情報一意照会明細.未着フラグ
			if (childTemplate.isNull(EKK3231A010CBSMsg1List.MITCK_FLG))
			{
				ekk3231A010ListDataMap.put(MITCK_FLG, JACStrConst.KARA_MOJI);
			}
			else
			{
				ekk3231A010ListDataMap.put(MITCK_FLG, childTemplate.getString(EKK3231A010CBSMsg1List.MITCK_FLG));
			}

			// 解約後転居先情報一意照会.解約後転居先情報一意照会明細.有効架電先無しフラグ ← 解約後転居先情報一意照会明細.有効架電先無しフラグ
			if (childTemplate.isNull(EKK3231A010CBSMsg1List.YK_KDNSK_NON_FLG))
			{
				ekk3231A010ListDataMap.put(YK_KDNSK_NON_FLG, JACStrConst.KARA_MOJI);
			}
			else
			{
				ekk3231A010ListDataMap.put(YK_KDNSK_NON_FLG, childTemplate.getString(EKK3231A010CBSMsg1List.YK_KDNSK_NON_FLG));
			}

			// 解約後転居先情報一意照会.解約後転居先情報一意照会明細.記事 ← 解約後転居先情報一意照会明細.記事
			if (childTemplate.isNull(EKK3231A010CBSMsg1List.KIJI))
			{
				ekk3231A010ListDataMap.put(KIJI, JACStrConst.KARA_MOJI);
			}
			else
			{
				ekk3231A010ListDataMap.put(KIJI, childTemplate.getString(EKK3231A010CBSMsg1List.KIJI));
			}

			// 解約後転居先情報一意照会.解約後転居先情報一意照会明細.更新年月日時分秒 ← 解約後転居先情報一意照会明細.更新年月日時分秒
			if (childTemplate.isNull(EKK3231A010CBSMsg1List.UPD_DTM))
			{
				ekk3231A010ListDataMap.put(UPD_DTM, JACStrConst.KARA_MOJI);
			}
			else
			{
				ekk3231A010ListDataMap.put(UPD_DTM, childTemplate.getString(EKK3231A010CBSMsg1List.UPD_DTM));
			}
			ekk3231A010List.add(ekk3231A010ListDataMap);
		}

		dataMap.put(SVC_LIST_KEY_EKK3231A010, ekk3231A010List);

		return param;
	}

	/**
	 * 進捗特記事項1、2編集処理.<br>
	 *
	 * @param param リクエストパラメータ
	 * @param templates 解約後転居先情報一意照会結果取得処理リスト
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	private String[] editPrgTkjk(IRequestParameterReadWrite param, CAANMsg[] templates) throws Exception
	{
		String[][] keyAndNmArray =
				{ { EKK3231A010CBSMsg1List.CUST_NM, JP_CUST_NM }, { EKK3231A010CBSMsg1List.CUST_KANA, JP_CUST_KANA }, { EKK3231A010CBSMsg1List.TELNO, JP_TELNO },
						{ EKK3231A010CBSMsg1List.TELNO_SBT, JP_TELNO_SBT }, { EKK3231A010CBSMsg1List.PCD, JP_PCD }, { EKK3231A010CBSMsg1List.AD, JP_AD },
						{ EKK3231A010CBSMsg1List.MITCK_FLG, JP_MITCK_FLG }, { EKK3231A010CBSMsg1List.YK_KDNSK_NON_FLG, JP_YK_KDNSK_NON_FLG }, { EKK3231A010CBSMsg1List.KIJI, JP_KIJI } };

		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(SVC_KEY_JCHDSLAFTNKYSIFCC);
		StringBuffer prgTkjkSb = new StringBuffer();

		for (int i = 0; i < keyAndNmArray.length; i++)
		{
			String key = keyAndNmArray[i][0];
			String afVal = toStrVal(dataMap.get(key));

			for (int j = 0; j < templates.length; j++)
			{
				CAANMsg childTemplate = templates[j];
				String value = toStrVal(childTemplate.getString(key));

				if (afVal.equals(value))
				{
					continue;
				}
				else
				{
					//『＜項目名＞：(変更前)X (変更後)X 』
					prgTkjkSb.append(keyAndNmArray[i][1]).append(PRJ_TKJK_BF).append(value).append(PRJ_TKJK_AF).append(afVal).append(JACStrConst.SPACE_1);
				}
			}
		}

		String prgTkjk = prgTkjkSb.toString();
		String prgTkjk1 = JACStrConst.KARA_MOJI;
		String prgTkjk2 = JACStrConst.KARA_MOJI;

		if (prgTkjk.length() > 128)
		{
			prgTkjk1 = prgTkjk.substring(0, 128);
			prgTkjk2 = prgTkjk.substring(128);
			if (prgTkjk2.length() > 128)
			{
				prgTkjk2 = prgTkjk2.substring(0, 128);
			}
		}
		else
		{
			prgTkjk1 = prgTkjk;
		}

		return new String[] { prgTkjk1, prgTkjk2 };
	}

	/**
	 * 解約後転居先情報一意照会明細.更新年月日時分秒取得処理.<br>
	 *
	 * @param templates 解約後転居先情報一意照会結果取得処理リスト
	 * @return IRequestParameterReadWrite
	 * @throws Exception 解約後転居先情報一意照会明細.更新年月日時分秒
	 */
	private String getUpdDtmEKK3231A010(CAANMsg[] templates) throws Exception
	{

		String updDtm = null;
		for (int i = 0; i < templates.length; i++)
		{
			CAANMsg parentTemplate = templates[i];

			if (parentTemplate != null)
			{

				// 解約後転居先情報一意照会明細.更新年月日時分秒
				updDtm = toStrVal(parentTemplate.getString(EKK3231A010CBSMsg1List.UPD_DTM));
				break;
			}
		}
		return updDtm;
	}

	/**
	 * NULLの場合空文字に変換する。
	 *
	 * @param obj 値
	 * @return 空文字又は値
	 */
	private static String toStrVal(Object obj)
	{
		if (obj == null)
		{
			return JACStrConst.KARA_MOJI;
		}
		return (String)obj;
	}
	
}