/*******************************************************************************
All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************************
 *＜プログラム内容＞
 * システム名        ：eo顧客基幹システム
 * モジュール名      ：CRW10301SFLogic
 * ソースファイル名  ：CRW10301SFLogic.java
 * 作成者            ：富士通
 * 日付              ：2011年08月06日
 *＜機能概要＞
 * メール簡易送信ビューロジック
 *＜修正履歴＞
 * バージョン   修正日      修正者      修正内容
 * ｖ1.00.00
 * ｖ6.00.00	2013/09/16	FJ)伊藤		OM-2013-0002356 メッセージ出力処理追加。
 *
 ********************************************************************************/

package eo.web.webview.CRW10301SF;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EventObject;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

import com.fujitsu.futurity.web.x31.X31CID;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;
import com.fujitsu.futurity.web.x33.X33SException;

import eo.common.constant.JCRStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.constant.JPCOnlineMessageConstant;
import eo.common.util.JCRUtilCommon;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CRW00701SF.CRW00701SFConst;
import eo.web.webview.CRW00801SF.CRW00801SFConst;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCScreenConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JCRScreenConst;
import eo.web.webview.common.JCRWebCommon;
import eo.web.webview.mapping.CRSV0163_CRSV0163OPDBMapper;
import eo.web.webview.mapping.CRSV0164_CRSV0164OPDBMapper;
import eo.web.webview.mapping.CRSV0165_CRSV0165OPDBMapper;
import eo.web.webview.mapping.CRSV0174_CRSV0174OPDBMapper;
import eo.web.webview.mapping.CRSV0175_CRSV0175OPDBMapper;
import eo.web.webview.mapping.CRSV0176_CRSV0176OPDBMapper;
import eo.web.webview.mapping.CRSV0230_CRSV0230OPDBMapper;

/**
 * メール簡易送信ビューロジック.<p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class CRW10301SFLogic extends JCCWebBusinessLogic
{

	/**
	 * Boolean項目リスト
	 */
	private static final Set<String> BOOLEAN_ITEM_SET = new HashSet<String>();

	/**
	 * Array項目リスト
	 */
	private static final Set<String> ARRAY_ITEM_SET = new HashSet<String>();

	/**
	 * メール情報項目リスト
	 */
	private static final String[] MAIL_INFO_ITEM_NAME_LIST = {
		CRW10301SFConst.TITLE
		, CRW10301SFConst.SLCT_TAIO_KIROK_NO
		, CRW10301SFConst.SLCT_TAIO_KIROK_DTL_NO
		, CRW10301SFConst.SLCT_SEND_MAIL_TYPE_CD
		, CRW10301SFConst.TOIAWASE_NAIYO
		, CRW10301SFConst.MAIL_TITLE
		, CRW10301SFConst.MAIL_FOOTER
		, CRW10301SFConst.MAIL_TEXT
		, CRW10301SFConst.SENDS_MLAD_TXT
		, CRW10301SFConst.SEND_MOTO_MLAD
		, CRW10301SFConst.CC_MLAD
		, CRW10301SFConst.HNSIN_TENSO_SYNBOL_CD
		, CRW10301SFConst.HNSIN_TENSO_SYNBOL_CD_NM
		, CRW10301SFConst.BUNSHOLIST
		, CRW10301SFConst.CLOSE_FAIL_CD
	};

	static {
		// Boolean項目リスト
		Collections.addAll(BOOLEAN_ITEM_SET
				, CRW10301SFConst.SEND_CLOSE_DOJI_FLG);

		// Array項目リスト
		Collections.addAll(ARRAY_ITEM_SET
				, CRW10301SFConst.MAIL_INFO_LIST
				, CRW10301SFConst.BUNSHOLIST);
	}

	/**
	 * ダブルクォーテーション
	 */
	private static final String DOUBLE_QUOT = "\"";

	/**
	 * 親クラスX31BWebBusinessLogicのreceiveMessageWebを
	 * オーバーライドして自動生成されたメソッドです。
	 * @param arg0 (I) イベント情報
	 * @param arg1 (I) WebFWでは使用しません
	 * @param arg2 (I) WebFWでは使用しません
	 * @return 処理結果（true:正常終了、false:エラー）
	 * @throws X33SException X33SException
	 */
	@Override
	protected boolean receiveMessageWeb(X31CID arg0, Object arg1,
			EventObject arg2) throws X33SException
	{
		return false;
	}

	/**
	 * 初期表示処理.<br>
	 * 初期表示を行う。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean init() throws Exception
	{

		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// 共通フォームBeanの内容を取得
		X31SDataBeanAccess commoninfoBean = getCommonInfoBean();

		// ユースケースID格納用マップ
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// マッピング用Map
		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// サービス実行結果データ用Map
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// (1) 引継情報の取得
		// なし

		// (2)サービスフォームBeanの設定
		// (a)サービスフォームBeanの全項目をクリアする。
		clearBean(bean, bean.getItemNameList());

		// (b)サービスフォームBean項目の設定
		// 基準日
		bean.sendMessageString(CRW10301SFConst.STDARDYMD
				, X31CWebConst.DATABEAN_SET_VALUE, JCRWebCommon.getSysDate());
		// ＳＯＲＴ指定項目名
		bean.sendMessageString(CRW10301SFConst.SORT_SHITEI_KMK_NM, X31CWebConst.DATABEAN_SET_VALUE, "TAIO_KIROK_NO");
		// ＳＯＲＴタイプ
		bean.sendMessageString(CRW10301SFConst.SORT_TYPE, X31CWebConst.DATABEAN_SET_VALUE, JPCModelConstant.FUNC_CD_1);
		// 最大送信可能件数
		bean.sendMessageString(CRW10301SFConst.MAX_SEND_PSBSU, X31CWebConst.DATABEAN_SET_VALUE, JCRWebCommon.getApplicationConst("CR_MAX_EASY_SEND_PSBSU"));

		// (3)サービス呼出処理
		// マッピングクラスを使用する為、配列化
		X31SDataBeanAccess[] paramBean = {bean, commoninfoBean};

		// ユースケースID格納
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "CRSV0163");

		// マッピングクラス
		CRSV0163_CRSV0163OPDBMapper mapper = new CRSV0163_CRSV0163OPDBMapper();

		// マッピング処理（上り）
		mapper.setGETTAIOKRKDTLEASYML1RCC(paramBean, dataMap, bean.sendMessageString(CRW10301SFConst.SORT_TYPE, X31CWebConst.DATABEAN_GET_VALUE));
		mapper.setGETTAIOKRKDTLEASYML1ICC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		mapper.setJUDGENGWORDEASYMLCC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		
		// サービス実行
		invokeService(paramMap, dataMap, outputMap);

		// (4)サービス処理結果の設定
		// (a) DataBean⇔サービスのマッピングに関しては、「4.サービス項目-DataBean項目マッピング」参照
		// マッピング処理（下り）
		mapper.getGETTAIOKRKDTLEASYML1RCC(paramBean, outputMap);
		mapper.getGETTAIOKRKDTLEASYML1ICC(paramBean, outputMap);
		mapper.getJUDGENGWORDEASYMLCC(paramBean, outputMap);

		// (b) サービスフォームBean編集処理を行う。
		// (ｱ) 下記の項目の設定を行う。
		// 表示選択明細インデックス
		bean.sendMessageString(CRW10301SFConst.SLCT_DSP_DETAIL_INDEX, X31CWebConst.DATABEAN_SET_VALUE, "0");
		// ディレイド開始フラグ
		bean.sendMessageBoolean(CRW10301SFConst.DLYD_STA_FLG, X31CWebConst.DATABEAN_SET_VALUE, Boolean.FALSE);

		// (ｲ) サービスフォームBean編集処理(editServiceFormBean)を呼び出す。
		editServiceFormBean(bean);

		// (c) 画面項目のプロテクトを行う。
		if (!"0".equals(bean.sendMessageString(CRW10301SFConst.TOTAL_NUM, X31CWebConst.DATABEAN_GET_VALUE)))
		{	
			// (ｱ) 対象データが存在する場合、プロテクト処理（setProtect）を呼び出す。
			setUnProtect(bean);
		}
		else
		{
			// (ｲ) 対象データが存在しない場合、プロテクト解除処理（setUnProtect）を呼び出す。
			setProtect(bean);
		}

		// (d) サービスフォームBean.クローズ不可コードが"0"でない(NGワードが含まれている)場合、メッセージを表示する。
		if (!"0".equals(bean.sendMessageString(CRW10301SFConst.TOTAL_NUM, X31CWebConst.DATABEAN_GET_VALUE))
				&& !JCRStrConst.CD_DIV_CLOSE_FAIL_CD_KANOU.equals(bean.sendMessageString(CRW10301SFConst.CLOSE_FAIL_CD, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			JCRWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB2310__I);
		}

		// 検索結果が0件の場合
		if (JCRStrConst.TOTAL_SEARCH_NUM_ZERO.equals(bean.sendMessageString(CRW10301SFConst.TOTAL_NUM, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			//検索結果:指定されたデータが存在しません。
			JCRWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0330__I, new String[]{""});
		}

		// (5)引継情報の設定
		// なし。

		// (6)共有フォームビーンの設定
		// 遷移先画面ID、名称の設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID
				, X31CWebConst.DATABEAN_SET_VALUE, JCRScreenConst.SCREEN_ID_CRW10301);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME
				, X31CWebConst.DATABEAN_SET_VALUE, JCRScreenConst.SCREEN_NAME_CRW10301);

		return true;
	}

	/**
	 * 表示ラジオボタン押下.<br>
	 * 表示ラジオボタン押下時処理を行う。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean displayMail() throws Exception
	{

		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// 共通フォームBeanの内容を取得
		X31SDataBeanAccess commoninfoBean = getCommonInfoBean();

		// ユースケースID格納用マップ
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// マッピング用Map
		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// サービス実行結果データ用Map
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// (1) 引継情報の取得
		// なし
		
		// (2)サービスフォームBeanの設定
		int selectedIndex = Integer.parseInt(bean.sendMessageString(
				CRW10301SFConst.SLCT_DSP_DETAIL_INDEX, X31CWebConst.DATABEAN_GET_VALUE), 10);

		// メール情報一覧
		X31SDataBeanAccessArray mailInfoList = bean.getDataBeanArray(CRW10301SFConst.MAIL_INFO_LIST);
		X31SDataBeanAccess mailInfoBean = mailInfoList.getDataBean(selectedIndex);
		
		// 選択対応記録番号
		bean.sendMessageString(CRW10301SFConst.SLCT_TAIO_KIROK_NO, X31CWebConst.DATABEAN_SET_VALUE
				, mailInfoBean.sendMessageString(CRW10301SFConst.L0_TAIO_KIROK_NO_01, X31CWebConst.DATABEAN_GET_VALUE));
		// 選択対応記録明細番号
		bean.sendMessageString(CRW10301SFConst.SLCT_TAIO_KIROK_DTL_NO, X31CWebConst.DATABEAN_SET_VALUE
				, mailInfoBean.sendMessageString(CRW10301SFConst.L0_TAIO_KIROK_DTL_NO_01, X31CWebConst.DATABEAN_GET_VALUE));
		// 選択送信メールタイプコード
		bean.sendMessageString(CRW10301SFConst.SLCT_SEND_MAIL_TYPE_CD, X31CWebConst.DATABEAN_SET_VALUE
				, mailInfoBean.sendMessageString(CRW10301SFConst.L0_SEND_MAIL_TYPE_CD_01, X31CWebConst.DATABEAN_GET_VALUE));
		
		// (3)サービス呼出処理
		// マッピングクラスを使用する為、配列化
		X31SDataBeanAccess[] paramBean = {bean, commoninfoBean};

		// ユースケースID格納
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "CRSV0164");

		// マッピングクラス
		CRSV0164_CRSV0164OPDBMapper mapper = new CRSV0164_CRSV0164OPDBMapper();

		// マッピング処理（上り）
		mapper.setGETTAIOKRKDTLEASYML1ICC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		mapper.setJUDGENGWORDEASYMLCC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		
		// サービス実行
		invokeService(paramMap, dataMap, outputMap);

		// (4)サービス処理結果の設定
		// (a) 値のクリアを行う。
		clearBean(bean, MAIL_INFO_ITEM_NAME_LIST);

		// (b) DataBean⇔サービスのマッピングに関しては、「4.サービス項目-DataBean項目マッピング」参照
		// マッピング処理（下り）
		mapper.getGETTAIOKRKDTLEASYML1ICC(paramBean, outputMap);
		mapper.getJUDGENGWORDEASYMLCC(paramBean, outputMap);

		// (c) サービスフォームBean編集処理を行う。
		editServiceFormBean(bean);

		// (5)引継情報の設定
		// なし。

		// (6)共有フォームビーンの設定
		// 遷移先画面ID、名称の設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID
				, X31CWebConst.DATABEAN_SET_VALUE, JCRScreenConst.SCREEN_ID_CRW10301);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME
				, X31CWebConst.DATABEAN_SET_VALUE, JCRScreenConst.SCREEN_NAME_CRW10301);

		return true;
	}

	/**
	 * 送信区分ソート▼押下.<br>
	 * 送信区分ソート▼押下。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean sortDescSendKbn() throws Exception
	{
		// (1) ソート結果データの取得を行う。
		// ソート処理(sortProc)を呼び出す。
		return sortProc("SEND_MAIL_TYPE_CD", JPCModelConstant.FUNC_CD_2);

	}

	/**
	 * 送信区分ソート▲押下.<br>
	 * 送信区分ソート▲押下。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean sortAscSendKbn() throws Exception
	{
		// (1) ソート結果データの取得を行う。
		// ソート処理(sortProc)を呼び出す。
		return sortProc("SEND_MAIL_TYPE_CD", JPCModelConstant.FUNC_CD_1);
	}

	/**
	 * 問合せIDソート▼押下.<br>
	 * 問合せIDソート▼押下。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean sortDescTaioKirokNo() throws Exception
	{
		// (1) ソート結果データの取得を行う。
		// ソート処理(sortProc)を呼び出す。
		return sortProc("TAIO_KIROK_NO", JPCModelConstant.FUNC_CD_2);
	}

	/**
	 * 問合せIDソート▲押下.<br>
	 * 問合せIDソート▲押下。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean sortAscTaioKirokNo() throws Exception
	{
		// (1) ソート結果データの取得を行う。
		// ソート処理(sortProc)を呼び出す。
		return sortProc("TAIO_KIROK_NO", JPCModelConstant.FUNC_CD_1);
	}

	/**
	 * タイトルソート▼押下.<br>
	 * タイトルソート▼押下。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean sortDescTitle() throws Exception
	{
		// (1) ソート結果データの取得を行う。
		// ソート処理(sortProc)を呼び出す。
		return sortProc("TITLE", JPCModelConstant.FUNC_CD_2);
	}

	/**
	 * タイトルソート▲押下.<br>
	 * タイトルソート▲押下。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean sortAscTitle() throws Exception
	{
		// (1) ソート結果データの取得を行う。
		// ソート処理(sortProc)を呼び出す。
		return sortProc("TITLE", JPCModelConstant.FUNC_CD_1);
	}

	/**
	 * メール件名ソート▼押下.<br>
	 * メール件名ソート▼押下。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean sortDescMailTitle() throws Exception
	{
		// (1) ソート結果データの取得を行う。
		// ソート処理(sortProc)を呼び出す。
		return sortProc("MAIL_TITLE", JPCModelConstant.FUNC_CD_2);
	}

	/**
	 * メール件名ソート▲押下.<br>
	 * メール件名ソート▲押下。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean sortAscMailTitle() throws Exception
	{
		// (1) ソート結果データの取得を行う。
		// ソート処理(sortProc)を呼び出す。
		return sortProc("MAIL_TITLE", JPCModelConstant.FUNC_CD_1);
	}

	/**
	 * 問合せIDリンク押下.<br>
	 * 問合せIDリンク押下。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean clickLinkToiawaseId() throws Exception
	{
		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// 共通フォームBeanの内容を取得
		X31SDataBeanAccess commoninfoBean = getCommonInfoBean();

		// (1) 引継情報の取得
		// なし
		
		// (2)サービスフォームBeanの設定
		int selectedIndex = Integer.parseInt(bean.sendMessageString(
				CRW10301SFConst.SLCT_DETAIL_INDEX, X31CWebConst.DATABEAN_GET_VALUE), 10);
		
		X31SDataBeanAccessArray mailInfoList = bean.getDataBeanArray(CRW10301SFConst.MAIL_INFO_LIST);
		X31SDataBeanAccess mailInfoBean = mailInfoList.getDataBean(selectedIndex);

		// 対応記録番号
		String taioKirokNo = mailInfoBean.sendMessageString(CRW10301SFConst.L0_TAIO_KIROK_NO_01, X31CWebConst.DATABEAN_GET_VALUE);

		// 対応記録明細番号
		String taioKirokDtlNo = mailInfoBean.sendMessageString(CRW10301SFConst.L0_TAIO_KIROK_DTL_NO_01, X31CWebConst.DATABEAN_GET_VALUE);

		// (3)サービス呼出処理
		// なし

		// (4)サービス処理結果の設定
		// なし

		// (5)引継情報の設定
		// (a)次画面への引継情報(dataMap)を作成する。
		// 子画面に渡す情報用HashMap
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// 遷移先画面ID
		String nextScreenID = null;
		// 遷移先画面名
		String nextScreenName = null;

		// 子画面に渡す情報をHashMapに設定する
		// (ｱ) サービスフォームBean.メール情報リスト.送信メールタイプコードが"1"(返信)の場合
		if (JCRStrConst.SEND_MAIL_TYPE_CD_REPLY.equals(mailInfoBean.sendMessageString(CRW10301SFConst.L0_SEND_MAIL_TYPE_CD_01, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			paramMap.put(CRW00701SFConst.TRAN_DIV, JCRStrConst.CRW00701_TRAN_DIV_MAIL_KANI_SEND);
			paramMap.put(CRW00701SFConst.SVC_KEI_NO, mailInfoBean.sendMessageString(CRW10301SFConst.L0_SVC_KEI_NO_01, X31CWebConst.DATABEAN_GET_VALUE));
			paramMap.put(CRW00701SFConst.PROSCST_NO, mailInfoBean.sendMessageString(CRW10301SFConst.L0_PROSCST_NO_01, X31CWebConst.DATABEAN_GET_VALUE));
			paramMap.put(CRW00701SFConst.HKTGI_TAIO_KIROK_NO, taioKirokNo);
			paramMap.put(CRW00701SFConst.HKTGI_TAIO_KIROK_DTL_NO, taioKirokDtlNo);
			paramMap.put(CRW00701SFConst.UPD_DTM_BF, mailInfoBean.sendMessageString(CRW10301SFConst.L0_UPD_DTM_BF_01, X31CWebConst.DATABEAN_GET_VALUE));

			nextScreenID = JCRScreenConst.SCREEN_ID_CRW00701;
			nextScreenName = JCRScreenConst.SCREEN_NAME_CRW00701;

		}
		// (ｲ) サービスフォームBean.メール情報リスト.送信メールタイプコードが"2"(転送)の場合
		else
		{
			paramMap.put(CRW00701SFConst.TRAN_DIV, JCRStrConst.CRW00801_TRAN_DIV_MAIL_KANI_SEND);
			paramMap.put(CRW00801SFConst.SVC_KEI_NO, mailInfoBean.sendMessageString(CRW10301SFConst.L0_SVC_KEI_NO_01, X31CWebConst.DATABEAN_GET_VALUE));
			paramMap.put(CRW00801SFConst.PROSCST_NO, mailInfoBean.sendMessageString(CRW10301SFConst.L0_PROSCST_NO_01, X31CWebConst.DATABEAN_GET_VALUE));
			paramMap.put(CRW00801SFConst.HKTGI_TAIO_KIROK_NO, taioKirokNo);
			paramMap.put(CRW00801SFConst.HKTGI_TAIO_KIROK_DTL_NO, taioKirokDtlNo);
			paramMap.put(CRW00801SFConst.UPD_DTM_BF, mailInfoBean.sendMessageString(CRW10301SFConst.L0_UPD_DTM_BF_01, X31CWebConst.DATABEAN_GET_VALUE));

			nextScreenID = JCRScreenConst.SCREEN_ID_CRW00801;
			nextScreenName = JCRScreenConst.SCREEN_NAME_CRW00801;

		}

		// (b) 画面情報設定部品(JCCWebCommon.setScreenInfo)を使用し、次画面への引継情報を設定する。
		// 子画面に渡す情報を設定
		JCRWebCommon.setScreenInfo(this, nextScreenID, paramMap);

		// (6)共有フォームビーンの設定
		// 遷移先画面ID、名称の設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID
				, X31CWebConst.DATABEAN_SET_VALUE, nextScreenID);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME
				, X31CWebConst.DATABEAN_SET_VALUE, nextScreenName);

		return true;
		
	}

	/**
	 * 送信ボタン押下.<br>
	 * 送信ボタン押下時処理。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean send() throws Exception
	{
		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// 共通フォームBeanの内容を取得
		X31SDataBeanAccess commoninfoBean = getCommonInfoBean();

		// ユースケースID格納用マップ
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// マッピング用Map
		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// サービス実行結果データ用Map
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// (1)引継情報の取得
		// なし。
	
		// (2)サービスフォームBeanの設定
		// なし。
	
		// (3)サービス呼出処理
		// (a) 電子ファイルデータMap作成処理(makeEfileMap)を呼び出し、ディレイド処理依頼登録サービスインターフェースに引き渡す情報を設定する。
		// 電子ファイル用のMap
		HashMap<String, Object> attachMap = makeEfileMap();
	
		// ユースケースID格納
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "CRSV0165");
	
		// マッピングクラスを使用する為、配列化
		X31SDataBeanAccess[] paramBean = {bean, commoninfoBean};
	
		// マッピングクラス
		CRSV0165_CRSV0165OPDBMapper mapper = new CRSV0165_CRSV0165OPDBMapper();
	
		// マッピング処理（上り）
		mapper.setCRSV016501SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
	
		invokeService(paramMap, dataMap, outputMap, attachMap);	
	
		// (4)サービス処理結果の設定
		// (a) DataBean⇔サービスのマッピングを行う
		// マッピング処理（下り）
		mapper.getCRSV016501SC(paramBean, outputMap);
	
		// (b) 下記項目についての設定を行う。
		//    サービスが正常終了した場合
		//      （異常終了した場合はexceptionが発生するため処理がここまで来ない）
		bean.sendMessageBoolean(CRW10301SFConst.DLYD_STA_FLG, X31CWebConst.DATABEAN_SET_VALUE, true);

		// (c) 共通部品/メッセージエリア設定処理(JCRWebCommon.setMessageInfo)を使用し、メッセージを設定する。
		JCCWebCommon.setMessageAreaBackColor(this, "1");
		JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB7660__I);

		// (d) プロテクト処理を行う。
		setProtect(bean);

		// (5)引継情報の設定
		// なし。
	
		// (6)共有フォームBeanの設定
		// 遷移先画面IDを共有フォームBeanに設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
				JCRScreenConst.SCREEN_ID_CRW10301);
	
		// 遷移先画面名を共有フォームBeanに設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JCRScreenConst.SCREEN_NAME_CRW10301);
	
		return true;
	}

	/**
	 * アンロード処理.<br>
	 * 自画面がクローズした時、呼び元に引継情報を渡す。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean close() throws Exception
	{

		// 共通フォームBeanの内容を取得
		X31SDataBeanAccess commoninfoBean = getCommonInfoBean();

		// (1)引継情報の取得
		// なし。

		// (2)サービスフォームBeanの設定
		// なし。

		// (3)サービス呼出処理
		// なし。

		// (4)サービス処理結果の設定
		// なし。

		// (5)引継情報の設定
		// なし。

		// (6)遷移先画面の設定
		// 遷移先画面IDを共有フォームBeanに設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID
				, X31CWebConst.DATABEAN_SET_VALUE, JCCScreenConst.SCREEN_ID_CCW00104);

		// 遷移先画面名を共有フォームBeanに設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, 
				X31CWebConst.DATABEAN_SET_VALUE, JCCScreenConst.SCREEN_NAME_CCW00104);

		return true;
	}

	/**
	 * ディレイド処理依頼結果チェック。
	 * <br>
	 * Ajaxによるポーリングを実行し、一定時間間隔でディレイド処理依頼結果参照を行う。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean fixKeepAlive() throws Exception
	{
		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// 共通フォームBeanの内容を取得
		X31SDataBeanAccess commoninfoBean = getCommonInfoBean();

		// ユースケースID格納用マップ
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// マッピング用Map
		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// サービス実行結果データ用Map
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// (1)引継情報の取得
		// なし。
	
		// (2)サービスフォームBeanの設定
		// なし。
	
		// (3)サービス呼出処理
		// ユースケースID格納
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "CRSV0175");
	
		// マッピングクラスを使用する為、配列化
		X31SDataBeanAccess[] paramBean = {bean, commoninfoBean};
	
		// マッピングクラス
		CRSV0175_CRSV0175OPDBMapper mapper = new CRSV0175_CRSV0175OPDBMapper();
	
		// マッピング処理（上り）
		mapper.setGETDLYDTRNREQCC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
	
		// サービス実行
		invokeService(paramMap, dataMap, outputMap);
		
		// (4)サービス処理結果の設定
		// マッピング処理（下り）
		mapper.getGETDLYDTRNREQCC(paramBean, outputMap);
	
		// (5)引継情報の設定
		// なし。
	
		// (6)共有フォームBeanの設定
		// 遷移先画面IDを共有フォームBeanに設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
				JCRScreenConst.SCREEN_ID_CRW10301);
	
		// 遷移先画面名を共有フォームBeanに設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JCRScreenConst.SCREEN_NAME_CRW10301);
	
		return true;
	}

	/**
	 * ディレイド処理正常終了。
	 * <br>
	 * ディレイド処理依頼結果参照の結果が正常終了した場合、エラーメッセージを表示する。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean fixResultOk() throws Exception
	{
		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();
		
		// (1)引継情報の取得	
		// なし。
	
		// (2)サービスフォームBeanの設定
		// (a) ディレイド開始フラグをfalseにし、ポーリングを停止させる
		bean.sendMessageBoolean(CRW10301SFConst.DLYD_STA_FLG, X31CWebConst.DATABEAN_SET_VALUE, false);
	
		// (b) プロテクト解除処理を行う。
		setUnProtect(bean);

		// (3)サービス呼出処理
		// なし。
	
		// (4)サービス処理結果の設定
		// なし。
	
		// (5)引継情報の設定
		// なし。
	
		// (6)共有フォームBeanの設定
		// なし。
		
		// (7)その他
		// (a) 初期表示処理(init())を呼び出す。
		init();

		// (a) ディレイド処理の正常終了を示すメッセージ設定を共通部品/メッセージエリア設定処理（JCRWebCommon.setMessageInfo）を使用して行う。
		// ディレイド正常終了メッセージ出力
		// "%1%が完了しました。
		JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB4390__I, new String[] {"メール送信"});
	
		return true;
	}

	/**
	 * ディレイド処理異常終了。
	 * <br>
	 * ディレイド処理依頼結果参照の結果が異常終了した場合、エラーメッセージを表示する。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean fixResultErr() throws Exception
	{
		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// 共通フォームBeanの内容を取得
		X31SDataBeanAccess commoninfoBean = getCommonInfoBean();

		// ユースケースID格納用マップ
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// マッピング用Map
		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// サービス実行結果データ用Map
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// (1)引継情報の取得
		// なし。
	
		// (2)サービスフォームBeanの設定
		// (a) ディレイド開始フラグをfalseにし、ポーリングを停止させる
		bean.sendMessageBoolean(CRW10301SFConst.DLYD_STA_FLG, X31CWebConst.DATABEAN_SET_VALUE, false);
	
		// (b) プロテクト解除処理を行う。
		setUnProtect(bean);
	
		// (3)サービス呼出処理
		// ユースケースID格納
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "CRSV0176");
	
		// マッピングクラスを使用する為、配列化
		X31SDataBeanAccess[] paramBean = {bean, commoninfoBean};
	
		// マッピングクラス
		CRSV0176_CRSV0176OPDBMapper mapper = new CRSV0176_CRSV0176OPDBMapper();
	
		// マッピング処理（上り）
		mapper.setGETDENSHIFILECTL1ICC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
	
		// サービス実行
		invokeService(paramMap, dataMap, outputMap);
	
		// (4)サービス処理結果の設定
		// マッピング処理（下り）
		mapper.getGETDENSHIFILECTL1ICC(paramBean, outputMap);

		// エラーメッセージ表示
		String errFileData = bean.sendMessageString(CRW10301SFConst.ERR_EFILE, X31CWebConst.DATABEAN_GET_VALUE);
	
		// 初期表示処理(init())を呼び出す。
		init();

		if (!JCRUtilCommon.isNull(errFileData))
		{
			// エラーメッセージ表示処理
			dispErrMessage(errFileData);
		}
	
		// (5)引継情報の設定
		// なし。
	
		// (6)共有フォームBeanの設定
		// 遷移先画面IDを共有フォームBeanに設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
				JCRScreenConst.SCREEN_ID_CRW10301);
	
		// 遷移先画面名を共有フォームBeanに設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JCRScreenConst.SCREEN_NAME_CRW10301);
	
		return true;
	}

	/**
	 * ディレイド処理システムエラー。
	 * <br>
	 * ディレイド処理依頼結果参照の結果がシステムエラーである場合、エラーメッセージを表示する。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean fixResultSysErr() throws Exception
	{
		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();
	
		// 共有フォームBeanの内容を取得
		X31SDataBeanAccess commoninfoBean = getCommonInfoBean();
	
		// (1)引継情報の取得	
		// なし。
	
		// (2)サービスフォームBeanの設定
		// (a) ディレイド開始フラグをfalseにし、ポーリングを停止させる
		bean.sendMessageBoolean(CRW10301SFConst.DLYD_STA_FLG, X31CWebConst.DATABEAN_SET_VALUE, false);
	
		// (b) プロテクト解除処理を行う。
		setUnProtect(bean);

		// (3)サービス呼出処理
		// なし。
	
		// (4)サービス処理結果の設定
		// なし。
	
		// (5)引継情報の設定
		// 初期表示処理(init())を呼び出す。
		init();

		// ディレイド処理システムエラーメッセージ出力
		JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB7700_KW, new String[] {"システムエラーが発生しました。"});

		// (6)共有フォームBeanの設定
		// 遷移先画面IDを共有フォームBeanに設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
				JCRScreenConst.SCREEN_ID_CRW10301);
	
		// 遷移先画面名を共有フォームBeanに設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JCRScreenConst.SCREEN_NAME_CRW10301);
	
		return true;
	}

	/**
	 * 画面再描画処理.<br>
	 * メール返信画面のリフレッシュを行う。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean refresh() throws Exception
	{
		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// 共通フォームBeanの内容を取得
		X31SDataBeanAccess commoninfoBean = getCommonInfoBean();

		// ユースケースID格納用マップ
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// マッピング用Map
		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// サービス実行結果データ用Map
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// チェックボックス内容保持用Map
		HashMap<String, Object> slctDataMap = new HashMap<String, Object>();

		// (1) 引継情報の取得
		// なし
		
		// (2)サービスフォームBeanの設定
		int selectedIndex = Integer.parseInt(bean.sendMessageString(
				CRW10301SFConst.SLCT_DSP_DETAIL_INDEX, X31CWebConst.DATABEAN_GET_VALUE), 10);

		X31SDataBeanAccessArray mailInfoList = bean.getDataBeanArray(CRW10301SFConst.MAIL_INFO_LIST);
		X31SDataBeanAccess mailInfoBean = mailInfoList.getDataBean(selectedIndex);
		
		// (a) 下記の項目の設定を行う。
		// 対応記録番号
		bean.sendMessageString(CRW10301SFConst.SLCT_TAIO_KIROK_NO, X31CWebConst.DATABEAN_SET_VALUE
				, mailInfoBean.sendMessageString(CRW10301SFConst.L0_TAIO_KIROK_NO_01, X31CWebConst.DATABEAN_GET_VALUE));
		// 対応記録明細番号
		bean.sendMessageString(CRW10301SFConst.SLCT_TAIO_KIROK_DTL_NO, X31CWebConst.DATABEAN_SET_VALUE
				, mailInfoBean.sendMessageString(CRW10301SFConst.L0_TAIO_KIROK_DTL_NO_01, X31CWebConst.DATABEAN_GET_VALUE));
		// 選択送信メールタイプコード
		bean.sendMessageString(CRW10301SFConst.SLCT_SEND_MAIL_TYPE_CD, X31CWebConst.DATABEAN_SET_VALUE
				, mailInfoBean.sendMessageString(CRW10301SFConst.L0_SEND_MAIL_TYPE_CD_01, X31CWebConst.DATABEAN_GET_VALUE));

		// (b) チェックボックス内容保持処理（saveCheckBoxData）を呼び出す。
		saveCheckBoxData(bean, slctDataMap);

		// (3)サービス呼出処理
		// マッピングクラスを使用する為、配列化
		X31SDataBeanAccess[] paramBean = {bean, commoninfoBean};

		// ユースケースID格納
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "CRSV0230");

		// マッピングクラス
		CRSV0230_CRSV0230OPDBMapper mapper = new CRSV0230_CRSV0230OPDBMapper();

		// マッピング処理（上り）
		mapper.setGETTAIOKRKDTLEASYML1RCC(paramBean, dataMap, bean.sendMessageString(CRW10301SFConst.SORT_TYPE, X31CWebConst.DATABEAN_GET_VALUE));
		mapper.setGETTAIOKRKDTLEASYML1ICC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		mapper.setJUDGENGWORDEASYMLCC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		
		// サービス実行
		invokeService(paramMap, dataMap, outputMap);

		// (4)サービス処理結果の設定
		// (a) 値のクリアを行う。
		bean.getDataBeanArray(CRW10301SFConst.MAIL_INFO_LIST).clearArray();
		clearBean(bean, MAIL_INFO_ITEM_NAME_LIST);

		// (b) DataBean⇔サービスのマッピングに関しては、「4.サービス項目-DataBean項目マッピング」参照
		// マッピング処理（下り）
		mapper.getGETTAIOKRKDTLEASYML1RCC(paramBean, outputMap);
		mapper.getGETTAIOKRKDTLEASYML1ICC(paramBean, outputMap);
		mapper.getJUDGENGWORDEASYMLCC(paramBean, outputMap);

		// (c) チェックボックス内容復元処理（loadCheckBoxData）を呼び出す。
		loadCheckBoxData(bean, slctDataMap);

		// (d) サービスフォームBean編集処理(editServiceFormBean)を呼び出す。
		editServiceFormBean(bean);

		// (e) データが存在しない場合、プロテクトを行う。
		if ("0".equals(bean.sendMessageString(CRW10301SFConst.TOTAL_NUM, X31CWebConst.DATABEAN_GET_VALUE)))
		{	
			// プロテクト処理を行う。
			setProtect(bean);
		}
		else
		{
			// プロテクト解除処理を行う。
			setUnProtect(bean);
		}

		// (f) サービスフォームBean.クローズ不可コードが"0"でない(NGワードが含まれている)場合、メッセージを表示する。
		if (!"0".equals(bean.sendMessageString(CRW10301SFConst.TOTAL_NUM, X31CWebConst.DATABEAN_GET_VALUE))
				&& !JCRStrConst.CD_DIV_CLOSE_FAIL_CD_KANOU.equals(bean.sendMessageString(CRW10301SFConst.CLOSE_FAIL_CD, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			JCRWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB2310__I);
		}

		// (5)引継情報の設定
		// なし。

		// (6)共有フォームビーンの設定
		// 遷移先画面ID、名称の設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID
				, X31CWebConst.DATABEAN_SET_VALUE, JCRScreenConst.SCREEN_ID_CRW10301);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME
				, X31CWebConst.DATABEAN_SET_VALUE, JCRScreenConst.SCREEN_NAME_CRW10301);

		return true;
	}

	/**
	 * サービスフォームBean編集処理.<br>
	 * 
	 * @param bean サービスフォームBean
	 */
	private void editServiceFormBean(X31SDataBeanAccess bean)
	{
		// (1) サービスフォームBeanの設定
		// メールタイトル（表示用）
		String mailTitle = bean.sendMessageString(CRW10301SFConst.MAIL_TITLE, X31CWebConst.DATABEAN_GET_VALUE);
		
		// 返信転送記号コードが"0"（未選択）の場合
		if (!JCRStrConst.CD_DIV_HNSIN_SYMBOL_CD_MICHOICE.equals(bean.sendMessageString(
				CRW10301SFConst.HNSIN_TENSO_SYNBOL_CD, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			mailTitle = bean.sendMessageString(CRW10301SFConst.HNSIN_TENSO_SYNBOL_CD_NM, X31CWebConst.DATABEAN_GET_VALUE) + mailTitle;
		}

		bean.sendMessageString(CRW10301SFConst.MAIL_TITLE_DSP, X31CWebConst.DATABEAN_SET_VALUE, mailTitle);

		// メール本文
		String mailText = bean.sendMessageString(CRW10301SFConst.MAIL_TEXT, X31CWebConst.DATABEAN_GET_VALUE);
		bean.sendMessageString(CRW10301SFConst.MAIL_TEXT, X31CWebConst.DATABEAN_SET_VALUE
				, mailText.replace(JCRStrConst.KAIGYO_CD, JCRStrConst.TAG_BR));
		// メールフッター
		String mailFooter = bean.sendMessageString(CRW10301SFConst.MAIL_FOOTER, X31CWebConst.DATABEAN_GET_VALUE);
		bean.sendMessageString(CRW10301SFConst.MAIL_FOOTER, X31CWebConst.DATABEAN_SET_VALUE
				, mailFooter.replace(JCRStrConst.KAIGYO_CD, JCRStrConst.TAG_BR));
		// 問合せ内容
		String toiawaseNaiyo = bean.sendMessageString(CRW10301SFConst.TOIAWASE_NAIYO, X31CWebConst.DATABEAN_GET_VALUE);
		bean.sendMessageString(CRW10301SFConst.TOIAWASE_NAIYO, X31CWebConst.DATABEAN_SET_VALUE
				, toiawaseNaiyo.replace(JCRStrConst.KAIGYO_CD, JCRStrConst.TAG_BR));

	}

	/**
	 * ソート処理.<br>
	 * 
	 * @param sortShiteiKmk ソート指定項目
	 * @param sortType ソートタイプ
	 * @return boolean 
	 * @throws Exception Exception
	 */
	private boolean sortProc(String sortShiteiKmk, String sortType) throws Exception
	{
		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();
	
		// 共通フォームBeanの内容を取得
		X31SDataBeanAccess commoninfoBean = getCommonInfoBean();
	
		// ユースケースID格納用マップ
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
	
		// マッピング用Map
		HashMap<String, Object> dataMap = new HashMap<String, Object>();
	
		// サービス実行結果データ用Map
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
	
		// チェックボックス内容保持用Map
		HashMap<String, Object> slctDataMap = new HashMap<String, Object>();
		
		// (1) 引継情報の取得
		// なし
	
		// (2)サービスフォームBeanの設定
		// (a) 下記の項目の設定を行う。
		// ＳＯＲＴ指定項目名
		bean.sendMessageString(CRW10301SFConst.SORT_SHITEI_KMK_NM, X31CWebConst.DATABEAN_SET_VALUE, sortShiteiKmk);
		// ＳＯＲＴタイプ
		bean.sendMessageString(CRW10301SFConst.SORT_TYPE, X31CWebConst.DATABEAN_SET_VALUE, sortType);
	
		// (b) チェックボックス内容保持処理（saveCheckBoxData）を呼び出す。
		saveCheckBoxData(bean, slctDataMap);
	
		// (3)サービス呼出処理
		// マッピングクラスを使用する為、配列化
		X31SDataBeanAccess[] paramBean = {bean, commoninfoBean};
	
		// ユースケースID格納
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "CRSV0174");
	
		// マッピングクラス
		CRSV0174_CRSV0174OPDBMapper mapper = new CRSV0174_CRSV0174OPDBMapper();
	
		// マッピング処理（上り）
		mapper.setGETTAIOKRKDTLEASYML1RCC(paramBean, dataMap, bean.sendMessageString(CRW10301SFConst.SORT_TYPE, X31CWebConst.DATABEAN_GET_VALUE));
		mapper.setGETTAIOKRKDTLEASYML1ICC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		mapper.setJUDGENGWORDEASYMLCC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		
		// サービス実行
		invokeService(paramMap, dataMap, outputMap);
	
		// (4)サービス処理結果の設定
		// (a) 値のクリアを行う。
		bean.getDataBeanArray(CRW10301SFConst.MAIL_INFO_LIST).clearArray();
		clearBean(bean, MAIL_INFO_ITEM_NAME_LIST);

		// (b) DataBean⇔サービスのマッピングに関しては、「4.サービス項目-DataBean項目マッピング」参照
		// マッピング処理（下り）
		mapper.getGETTAIOKRKDTLEASYML1RCC(paramBean, outputMap);
		mapper.getGETTAIOKRKDTLEASYML1ICC(paramBean, outputMap);
		mapper.getJUDGENGWORDEASYMLCC(paramBean, outputMap);

		// (c) チェックボックス内容復元処理（loadCheckBoxData）を呼び出す。
		loadCheckBoxData(bean, slctDataMap);

		// (d) サービスフォームBean編集処理(editServiceFormBean)を呼び出す。
		editServiceFormBean(bean);

		// (e) データが存在しない場合、プロテクトを行う。
		if ("0".equals(bean.sendMessageString(CRW10301SFConst.TOTAL_NUM, X31CWebConst.DATABEAN_GET_VALUE)))
		{	
			// プロテクト処理を行う。
			setProtect(bean);
		}
		else
		{
			// プロテクト解除処理を行う。
			setUnProtect(bean);
		}

		// (f) サービスフォームBean.クローズ不可コードが"0"でない(NGワードが含まれている)場合、メッセージを表示する。
		if (!"0".equals(bean.sendMessageString(CRW10301SFConst.TOTAL_NUM, X31CWebConst.DATABEAN_GET_VALUE))
				&& !JCRStrConst.CD_DIV_CLOSE_FAIL_CD_KANOU.equals(bean.sendMessageString(CRW10301SFConst.CLOSE_FAIL_CD, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			JCRWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB2310__I);
		}

		// 検索結果が0件の場合
		if (JCRStrConst.TOTAL_SEARCH_NUM_ZERO.equals(bean.sendMessageString(CRW10301SFConst.TOTAL_NUM, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			//検索結果:指定されたデータが存在しません。
			JCRWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0330__I, new String[]{""});
		}

		// (5)引継情報の設定
		// なし
	
		// (6)共有フォームビーンの設定
		// 遷移先画面ID、名称の設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID
				, X31CWebConst.DATABEAN_SET_VALUE, JCRScreenConst.SCREEN_ID_CRW10301);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME
				, X31CWebConst.DATABEAN_SET_VALUE, JCRScreenConst.SCREEN_NAME_CRW10301);
	
		return true;
	}

	/**
	 * チェックボックス内容保持処理.<br>
	 * 
	 * @param bean
	 * @param slctDataMap
	 */
	private void saveCheckBoxData(X31SDataBeanAccess bean, HashMap<String, Object> slctDataMap)
	{
	
		// (1) 選択されたチェックボックスの情報の保持を行う。
		// メール情報一覧
		X31SDataBeanAccessArray mailInfoList = bean.getDataBeanArray(CRW10301SFConst.MAIL_INFO_LIST);

		for (int i = 0; i < mailInfoList.getCount(); i++)
		{
			X31SDataBeanAccess mailInfoBean = mailInfoList.getDataBean(i);
			// 対応記録番号
			String taioKirokNo = JCRUtilCommon.fillZero(mailInfoBean.sendMessageString(
					CRW10301SFConst.L0_TAIO_KIROK_NO_01, X31CWebConst.DATABEAN_GET_VALUE), 10, false);
			// 送信メールタイプコード
			String sendMailTypeCd = mailInfoBean.sendMessageString(
					CRW10301SFConst.L0_SEND_MAIL_TYPE_CD_01, X31CWebConst.DATABEAN_GET_VALUE);
			// 選択状態
			Boolean selStat = mailInfoBean.sendMessageBoolean(CRW10301SFConst.L0_SEL_STAT_01, X31CWebConst.DATABEAN_GET_VALUE);

			String key = taioKirokNo + sendMailTypeCd;
			slctDataMap.put(key, selStat);
		}
	}

	/**
	 * チェックボックス内容復元処理.<br>
	 * 
	 * @param bean
	 * @param slctDataMap
	 */
	private void loadCheckBoxData(X31SDataBeanAccess bean, HashMap<String, Object> slctDataMap)
	{

		// (1) チェックボックス内容保持処理にて保持された内容から、チェックボックスのチェック状態の復元を行う。
		// メール情報一覧
		X31SDataBeanAccessArray mailInfoList = bean.getDataBeanArray(CRW10301SFConst.MAIL_INFO_LIST);
		
		// 選択された対応記録番号
		String slctTaioKirokNo = JCRUtilCommon.fillZero(bean.sendMessageString(CRW10301SFConst.SLCT_TAIO_KIROK_NO, X31CWebConst.DATABEAN_GET_VALUE), 10, false)
							+ bean.sendMessageString(CRW10301SFConst.SLCT_SEND_MAIL_TYPE_CD, X31CWebConst.DATABEAN_GET_VALUE);

		int selectedIndex = 0;
		
		for (int i = 0; i < mailInfoList.getCount(); i++)
		{
			X31SDataBeanAccess mailInfoBean = mailInfoList.getDataBean(i);
			// 対応記録番号
			String taioKirokNo = JCRUtilCommon.fillZero(mailInfoBean.sendMessageString(
					CRW10301SFConst.L0_TAIO_KIROK_NO_01, X31CWebConst.DATABEAN_GET_VALUE), 10, false);
			// 送信メールタイプコード
			String sendMailTypeCd = mailInfoBean.sendMessageString(
					CRW10301SFConst.L0_SEND_MAIL_TYPE_CD_01, X31CWebConst.DATABEAN_GET_VALUE);
			String key = taioKirokNo + sendMailTypeCd;

			if (slctDataMap.containsKey(key))
			{
				mailInfoBean.sendMessageBoolean(CRW10301SFConst.L0_SEL_STAT_01
						, X31CWebConst.DATABEAN_SET_VALUE, (Boolean) slctDataMap.get(key));
			}
	
			// 表示対象としていた、メール情報の場合
			if (slctTaioKirokNo.equals(key))
			{
				selectedIndex = i;
			}
		}
		bean.sendMessageString(CRW10301SFConst.SLCT_DSP_DETAIL_INDEX
				, X31CWebConst.DATABEAN_SET_VALUE, String.valueOf(selectedIndex));
	}

	/**
	 * 電子ファイルデータMap作成処理。
	 * <br>
	 * 電子ファイルデータMapを作成する。
	 * 
	 * @return attachMap アップロードファイル格納マップ
	 * @throws UnsupportedEncodingException 
	 */
	private HashMap<String, Object> makeEfileMap() throws UnsupportedEncodingException
	{
		HashMap<String, Object> attachMap = new HashMap<String, Object>();

		// (1) ファイル情報生成処理（makeFileString）を呼び出す。
		String eFileData = makeFileString();

		// ファイルリスト
		ArrayList<HashMap<Object, Object>> fileList = new ArrayList<HashMap<Object, Object>>();

		// (2) 電子ファイルデータMapの生成を行う。
		if(!JCRUtilCommon.isNull(eFileData))
		{
			HashMap<Object, Object> fileMap = new HashMap<Object, Object>();

			fileMap.put(X31CWebConst.TELEGRAM_INFO_ATTACH_IDENTIFUCD, "identifyCD");
			fileMap.put(X31CWebConst.TELEGRAM_INFO_ATTACH_LIST_NAMAE, "list_name");
			fileMap.put(X31CWebConst.TELEGRAM_INFO_ATTACH_ITEM_NAMAE, "item_name");
			fileMap.put(X31CWebConst.TELEGRAM_INFO_ATTACH_INDEX, "index");
			fileMap.put(X31CWebConst.TELEGRAM_INFO_ATTACH_FILE, eFileData.getBytes(JCRStrConst.MOJI_CD_MS932));

			fileList.add(fileMap);
		}
		
		attachMap.put(X31CWebConst.TELEGRAM_INFO_ATTACH_FILE_LIST, fileList);
		
		return attachMap;
	}

	/**
	 * ファイル情報生成処理。
	 * 画面情報から、ディレイドで使用するファイルの生成を行う。
	 * 
	 * @return 
	 */
	private String makeFileString()
	{
		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// 共有フォームBeanの内容を取得
		X31SDataBeanAccess commoninfoBean = getCommonInfoBean();

		// クローズ有無
		String closeUm = "";
		if (bean.sendMessageBoolean(CRW10301SFConst.SEND_CLOSE_DOJI_FLG, X31CWebConst.DATABEAN_GET_VALUE))
		{
			closeUm = "1";
		}
		else
		{
			closeUm = "0";
		}
				
		// 1行目の内容を作成
		StringBuilder sbFileData = new StringBuilder();

		// クローズ有無
		sbFileData.append(DOUBLE_QUOT).append(closeUm).append(DOUBLE_QUOT).append(JCRStrConst.STR_HALF_COMMA);

		// ログインユーザID
		sbFileData.append(DOUBLE_QUOT).append(commoninfoBean.sendMessageString(
				CommonInfoCFConst.USER_ID, X31CWebConst.DATABEAN_GET_VALUE)).append(DOUBLE_QUOT).append(JCRStrConst.STR_HALF_COMMA);

		// ログインユーザ名
		sbFileData.append(DOUBLE_QUOT).append(commoninfoBean.sendMessageString(
				CommonInfoCFConst.USER_NM, X31CWebConst.DATABEAN_GET_VALUE)).append(DOUBLE_QUOT).append(JCRStrConst.STR_HALF_COMMA);

		// ログインユーザの業務個別設定組織コード
		sbFileData.append(DOUBLE_QUOT).append(JCRWebCommon.getWkkbtOrgCd(commoninfoBean)).append(DOUBLE_QUOT).append(JCRStrConst.STR_HALF_COMMA);

		// ログインユーザの業務個別設定組織名
		sbFileData.append(DOUBLE_QUOT).append(JCRWebCommon.getWkkbtOrgNm(commoninfoBean)).append(DOUBLE_QUOT);

		sbFileData.append(JCRStrConst.KAIGYO_CD);

		// メール情報一覧
		X31SDataBeanAccessArray mailInfoList = bean.getDataBeanArray(CRW10301SFConst.MAIL_INFO_LIST);

		// メール情報一覧からチェックがついたものを取得し、文字列に追加
		for (int i = 0; i < mailInfoList.getCount(); i++)
		{
			X31SDataBeanAccess mailInfoBean = mailInfoList.getDataBean(i);
			boolean checked = mailInfoBean.sendMessageBoolean(CRW10301SFConst.L0_SEL_STAT_01, X31CWebConst.DATABEAN_GET_VALUE);

			// チェックされている場合
			if (checked)
			{
				// 対応記録番号
				sbFileData.append(DOUBLE_QUOT).append(mailInfoBean.sendMessageString(
						CRW10301SFConst.L0_TAIO_KIROK_NO_01, X31CWebConst.DATABEAN_GET_VALUE)).append(DOUBLE_QUOT).append(JCRStrConst.STR_HALF_COMMA);

				// 対応記録明細番号
				sbFileData.append(DOUBLE_QUOT).append(mailInfoBean.sendMessageString(
						CRW10301SFConst.L0_TAIO_KIROK_DTL_NO_01, X31CWebConst.DATABEAN_GET_VALUE)).append(DOUBLE_QUOT).append(JCRStrConst.STR_HALF_COMMA);

				// 対応記録 更新年月日時分秒
				sbFileData.append(DOUBLE_QUOT).append(mailInfoBean.sendMessageString(
						CRW10301SFConst.L0_UPD_DTM_BF_01, X31CWebConst.DATABEAN_GET_VALUE)).append(DOUBLE_QUOT);

				sbFileData.append(JCRStrConst.KAIGYO_CD);
			}
		}

		return sbFileData.toString();
	}

	/**
	 * エラーメッセージ出力処理。
	 * <br>
	 * ディレイド処理依頼で発生したエラー内容を出力。
	 * 
	 * @param errMeg エラーファイル文字列
	 */
	private void dispErrMessage(String errMeg)
	{
		String[] dispMsg = errMeg.split(JCRStrConst.KAIGYO_CD);
		for(int i = 0; i < dispMsg.length; i++)
		{
			// ディレイド処理エラーメッセージ出力
			// メール送信一括処理エラー(%1%)
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB7700_KW, new String[] {dispMsg[i]});
		}
	}

	/**
	 * プロテクト処理.<br>
	 * 画面のプロテクトを行う。<br>
	 * 
	 * @param bean サービスフォームBean
	 */
	private void setProtect(X31SDataBeanAccess bean)
	{
		bean.sendMessageString(CRW10301SFConst.SELECT_ALL_DISABLED, X31CWebConst.DATABEAN_SET_VALUE, JCRStrConst.DISABLED_STRING);
		bean.sendMessageString(CRW10301SFConst.CLEAR_ALL_DISABLED, X31CWebConst.DATABEAN_SET_VALUE, JCRStrConst.DISABLED_STRING);
		bean.sendMessageString(CRW10301SFConst.SEND_DISABLED, X31CWebConst.DATABEAN_SET_VALUE, JCRStrConst.DISABLED_DEACTIVE);
		bean.sendMessageString(CRW10301SFConst.SEND_CLOSE_DOJI_FLG_DISABLED, X31CWebConst.DATABEAN_SET_VALUE, JCRStrConst.DISABLED_DEACTIVE);
		
		// メール情報一覧
		X31SDataBeanAccessArray mailInfoList = bean.getDataBeanArray(CRW10301SFConst.MAIL_INFO_LIST);
		for (int i = 0; i < mailInfoList.getCount(); i++)
		{
			X31SDataBeanAccess mailInfoBean = mailInfoList.getDataBean(i);
			mailInfoBean.sendMessageString(CRW10301SFConst.L0_SEL_INDEX_DISABLED_01, X31CWebConst.DATABEAN_SET_VALUE, JCRStrConst.DISABLED_STRING);
			mailInfoBean.sendMessageString(CRW10301SFConst.L0_SEL_STAT_DISABLED_01, X31CWebConst.DATABEAN_SET_VALUE, JCRStrConst.DISABLED_STRING);
			mailInfoBean.sendMessageString(CRW10301SFConst.L0_TAIO_KIROK_NO_DISABLED_01, X31CWebConst.DATABEAN_SET_VALUE, JCRStrConst.DISABLED_DEACTIVE);
		}
	}

	/**
	 * プロテクト解除処理.<br>
	 * 画面のプロテクトの解除を行う。<br>
	 * 
	 * @param bean サービスフォームBean
	 */
	private void setUnProtect(X31SDataBeanAccess bean)
	{
		bean.sendMessageString(CRW10301SFConst.SELECT_ALL_DISABLED, X31CWebConst.DATABEAN_SET_VALUE, "");
		bean.sendMessageString(CRW10301SFConst.CLEAR_ALL_DISABLED, X31CWebConst.DATABEAN_SET_VALUE, "");
		bean.sendMessageString(CRW10301SFConst.SEND_DISABLED, X31CWebConst.DATABEAN_SET_VALUE, JCRStrConst.DISABLED_ACTIVE);
		bean.sendMessageString(CRW10301SFConst.SEND_CLOSE_DOJI_FLG_DISABLED, X31CWebConst.DATABEAN_SET_VALUE, JCRStrConst.DISABLED_ACTIVE);
		// メール情報一覧
		X31SDataBeanAccessArray mailInfoList = bean.getDataBeanArray(CRW10301SFConst.MAIL_INFO_LIST);
		for (int i = 0; i < mailInfoList.getCount(); i++)
		{
			X31SDataBeanAccess mailInfoBean = mailInfoList.getDataBean(i);
			mailInfoBean.sendMessageString(CRW10301SFConst.L0_SEL_INDEX_DISABLED_01, X31CWebConst.DATABEAN_SET_VALUE, "");
			mailInfoBean.sendMessageString(CRW10301SFConst.L0_SEL_STAT_DISABLED_01, X31CWebConst.DATABEAN_SET_VALUE, "");
			mailInfoBean.sendMessageString(CRW10301SFConst.L0_TAIO_KIROK_NO_DISABLED_01, X31CWebConst.DATABEAN_SET_VALUE, JCRStrConst.DISABLED_ACTIVE);
		}
	}

	/**
	 * サービスフォームBeanクリア処理.<br>
	 * サービスフォームBeanのクリアを行う。
	 * 
	 * @param bean サービスフォームBean
	 * @param itemNameList 項目名リスト
	 */
	private void clearBean(X31SDataBeanAccess bean, String[] itemNameList)
	{

		// (1) サービスフォームBeanの設定
		
		// (a) 値のクリアを行う。
		for (int i = 0; i < itemNameList.length; i++)
		{
			// (ｱ) Boolean型の場合、初期値の設定を行う。
			if (isBooleanItem(itemNameList[i]))
			{
				bean.sendMessageBoolean(itemNameList[i], X31CWebConst.DATABEAN_SET_VALUE, Boolean.TRUE);
			}
			// (ｲ) Array項目の場合、リストのクリアを行う。
			else if (isArrayItem(itemNameList[i]))
			{
				bean.getDataBeanArray(itemNameList[i]).clearArray();
			}
			// (ｳ) 上記以外の場合、値のクリアを行う。
			else
			{
				bean.sendMessage(itemNameList[i], X31CWebConst.DATABEAN_CLEAR);
			}
		}
		return;
	}

	/**
	 * Boolean項目判定処理.<br>
	 * Boolean項目の判定を行う。
	 * 
	 * @param itemName 項目ID
	 * @return true:Boolean項目、false：Boolean項目以外
	 */
	private boolean isBooleanItem(String itemName)
	{
		// (1) 項目名の判定を行い、Boolean項目の場合は、trueを返却し、Boolean項目以外の場合は、falseを返却する。
		return BOOLEAN_ITEM_SET.contains(itemName);
	}

	/**
	 * Array項目判定処理.<br>
	 * Array項目の判定を行う。
	 * 
	 * @param itemName 項目ID
	 * @return true:Array項目、false：Array項目以外
	 */
	private boolean isArrayItem(String itemName)
	{
		// (1) 項目名の判定を行い、Array項目の場合は、trueを返却し、Array項目以外の場合は、falseを返却する。
		return ARRAY_ITEM_SET.contains(itemName);
	}

}
