/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKCasNotRegUsrMlSend
*	ソースファイル名	：JBSbatKKCasNotRegUsrMlSend.java
*	作成者				：富士通　
*	作成日				：2025年04月25日
*＜機能概要＞
*CSコースが開通済みかつ、有効なCASカード情報の登録が未登録のデータを抽出し、メール送信用のファイルを作成する。
*また、抽出した情報をダウンロードリストに登録し、対応記録に登録するCASEファイルを作成する。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v75.00.00   2025/04/25  GDC)v.auditor     【ANK-4673-00-00】テレビ新コース（スカパー用）導入対応　2025年6月フォロー案件
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JKKBatCommon;
import eo.business.common.JKKBatConst;
import eo.business.util.table.JBSbatCC_M_MAIL;
import eo.business.util.table.JBSbatKK_M_PPLAN;
import eo.business.util.table.JBSbatKK_T_KAISEN_TG_SVKEI;
import eo.business.util.table.JBSbatKK_T_OPSVKEI_ISP;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.business.util.table.JBSbatCK_T_RRKS;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.util.JBSbatBusinessFileUtil;
import eo.framework.util.JBSbatDateUtil;

/**
* スカパーオプションチャンネル鍵開け閉め登録ファイル作成 <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKCasNotRegUsrMlSend extends JBSbatBusinessService
{
	/** テーブル(ダウンロードファイル管理)*/
	private static final String D_TBL_NAME_ZM_T_DL_FILE_KANRI = "ZM_T_DL_FILE_KANRI";
	/** テーブル(サービス契約)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";
	/** テーブル(回線対象サービス契約)*/
	private static final String D_TBL_NAME_KK_T_KAISEN_TG_SVKEI = "KK_T_KAISEN_TG_SVKEI";
	/** テーブル(オプションサービス契約)*/
	private static final String D_TBL_NAME_KK_T_OP_SVC_KEI = "KK_T_OP_SVC_KEI";
	/** テーブル(メール)*/
	private static final String D_TBL_NAME_CC_M_MAIL = "CC_M_MAIL";
	
	/** SQL定義キー(KK_SELECT_402)*/
	private static final String KK_T_SVC_KEI_KK_SELECT_402 = "KK_SELECT_402";
	/** SQL定義キー(KK_SELECT_403)*/
	private static final String KK_T_SVC_KEI_KK_SELECT_403 = "KK_SELECT_403";
	/** SQL定義キー(KK_SELECT_055)*/
	private static final String KK_T_KAISEN_TG_SVKEI_KK_SELECT_055 = "KK_SELECT_055";
	/** SQL定義キー(KK_SELECT_056)*/
	private static final String KK_T_KAISEN_TG_SVKEI_KK_SELECT_056 = "KK_SELECT_056";
	/** SQL定義キー(KK_SELECT_153)*/
	private static final String KK_T_OP_SVC_KEI_KK_SELECT_153 = "KK_SELECT_153";
	/** SQL定義キー(KK_SELECT_153)*/
	private static final String CC_M_MAIL_KK_SELECT_010 = "KK_SELECT_010";
	
	/** テーブルアクセスクラス(サービス契約 KK_SELECT_402)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI_SEL_402 = null;
	/** テーブルアクセスクラス(サービス契約 KK_SELECT_403)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI_SEL_403 = null;
	/** テーブルアクセスクラス(回線対象サービス契約 KK_SELECT_055)*/
	private JBSbatSQLAccess db_KK_T_KAISEN_TG_SVKEI_SEL_055 = null;
	/** テーブルアクセスクラス(回線対象サービス契約 KK_SELECT_056)*/
	private JBSbatSQLAccess db_KK_T_KAISEN_TG_SVKEI_SEL_056 = null;
	/** テーブルアクセスクラス(オプションサービス契約 KK_SELECT_153)*/
	private JBSbatSQLAccess db_KK_T_OP_SVC_KEI_SEL_153 = null;
	/** テーブルアクセスクラス(メール KK_SELECT_010)*/
	private JBSbatSQLAccess db_CC_M_MAIL_SEL_010 = null;
	/** テーブルアクセスクラス(ダウンロードファイル管理)*/
	private JBSbatSQLAccess db_ZM_T_DL_FILE_KANRI = null;
	
	/** CAS未登録ユーザ送信結果リスト 結果メッセージ設定値 */
	private static final String mailCD = "KKM1000060";
	
	private static final String recTitle = "CSプレミアム、CSベーシック　CAS未登録者への登録慫慂メール";
	
	/** ファイル名(共通部) */
	private static final String SEND_FILE_NAME = "MAILCSMAUM_";
	/** ファイル名(共通部) */
	private static final String CASE_FILE_NAME = "CASE_CASMIADD_";
	/** サービス契約番号 */
	private static final String SVC_KEI_NO = "SVC_KEI_NO";
	/** 料金プラン名 */
	private static final String PPLAN = "PPLAN";
	/** メール */
	private static final String MLAD = "MLAD";
	/** タイトル1 */
	private static final String TITLE1 = "CSプレミアム、CSベーシック　CAS未登録者への登録慫慂メール";
	/** タイトル2 */
	private static final String TITLE2 = "CSプレミアム、CSベーシック　CAS未登録者への登録慫慂メール未送信";
	/** 顧客タイプ */
	private static final String KOKYAKU_TYPE = "加入者";
	/** 状態 */
	private static final String JYOUTAI = "クローズ";
	/** ステータス */
	private static final String STATUS = "処理中";
	/** 受付者 */
	private static final String UKETSUKE = "OTHER_SYST";
	/** 担当者 */
	private static final String TANTOU = "OTHER_SYST";
	/** 受付種別 */
	private static final String UKETSUKE_SBT = "他システム";
	/** 送信先メールリスト */
	private ArrayList<HashMap<String, Object>> mailDataList = new ArrayList<HashMap<String, Object>>();
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		// DBアクセスクラスを生成します
		db_ZM_T_DL_FILE_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_T_DL_FILE_KANRI);
		db_KK_T_SVC_KEI_SEL_402 = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		db_KK_T_SVC_KEI_SEL_403 = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		db_KK_T_KAISEN_TG_SVKEI_SEL_055 = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KAISEN_TG_SVKEI);
		db_KK_T_KAISEN_TG_SVKEI_SEL_056 = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KAISEN_TG_SVKEI);
		db_KK_T_OP_SVC_KEI_SEL_153 = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_OP_SVC_KEI);
		db_CC_M_MAIL_SEL_010 = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CC_M_MAIL);
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		//運用年月日-９０日
		String batOpeDate = JBSbatDateUtil.adjustDate(super.opeDate, -90);

		//(1) CAS未登録ユーザメール作成
		// (a)ＣＳコースが開通済み、かつ有効なCASカード情報の登録が未登録のデータを抽出
		String[] selectParam = new String[]{batOpeDate, super.opeDate};
		JBSbatCommonDBInterface csNotRegDataMap = executeKK_T_SVC_KEI_KK_SELECT_402(selectParam);
		
		if(null == csNotRegDataMap){
			return null;
		}
		
		while (csNotRegDataMap != null)
		{
			//(b) CAS未登録ユーザメールの送信先メールアドレスを抽出
			getMailAddData(csNotRegDataMap);
			
			csNotRegDataMap = db_KK_T_SVC_KEI_SEL_402.selectNext();
		}
		//(c) CAS未登録ユーザメール送信ファイル出力
		outputSendFile(mailDataList);
		
		//(d) CASEファイル出力
		outputCaseFile(mailDataList);

		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_ZM_T_DL_FILE_KANRI.close();
		db_KK_T_SVC_KEI_SEL_402.close();
		db_KK_T_SVC_KEI_SEL_403.close();
		db_KK_T_KAISEN_TG_SVKEI_SEL_055.close();
		db_KK_T_KAISEN_TG_SVKEI_SEL_056.close();
		db_KK_T_OP_SVC_KEI_SEL_153.close();
		db_CC_M_MAIL_SEL_010.close();
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * SQLKEY(KK_SELECT_402)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:バッチ運用日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeKK_T_SVC_KEI_KK_SELECT_402(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		
		// DBアクセスを実行します
		db_KK_T_SVC_KEI_SEL_402.selectBySqlDefine(paramList, KK_T_SVC_KEI_KK_SELECT_402);
		
		return db_KK_T_SVC_KEI_SEL_402.selectNext();
	}
	
	/**
	 * SQLKEY(KK_SELECT_403)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:
	 *			SYSID
	 *		 	バッチ運用日
	 *		 	バッチ運用日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeKK_T_SVC_KEI_KK_SELECT_403(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		
		// DBアクセスを実行します
		db_KK_T_SVC_KEI_SEL_403.selectBySqlDefine(paramList, KK_T_SVC_KEI_KK_SELECT_403);
		
		return db_KK_T_SVC_KEI_SEL_403.selectNext();
	}
	
	/**
	 * SQLKEY(KK_SELECT_055)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:
	 *			サービス契約番号
	 *			回線内訳使用開始年月日
	 *			回線内訳使用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeKK_T_KAISEN_TG_SVKEI_KK_SELECT_055(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		
		// DBアクセスを実行します
		db_KK_T_KAISEN_TG_SVKEI_SEL_055.selectBySqlDefine(paramList, KK_T_KAISEN_TG_SVKEI_KK_SELECT_055);
		
		return db_KK_T_KAISEN_TG_SVKEI_SEL_055.selectNext();
	}
	
	/**
	 * SQLKEY(KK_SELECT_056)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:
	 *			サービス契約回線内訳番号
	 *			バッチ運用日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeKK_T_KAISEN_TG_SVKEI_KK_SELECT_056(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		
		// DBアクセスを実行します
		db_KK_T_KAISEN_TG_SVKEI_SEL_056.selectBySqlDefine(paramList, KK_T_KAISEN_TG_SVKEI_KK_SELECT_056);
		
		return db_KK_T_KAISEN_TG_SVKEI_SEL_056.selectNext();
	}
	
	/**
	 * SQLKEY(KK_SELECT_153)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で条件マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:
	 *		 	サービス契約番号
	 *			バッチ運用日
	 * </pre>
	 * <p>
	 * @param whereParam 条件項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_OP_SVC_KEI_KK_SELECT_153(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		
		// DBアクセスを実行します
		db_KK_T_OP_SVC_KEI_SEL_153.selectBySqlDefine(paramList, KK_T_OP_SVC_KEI_KK_SELECT_153);
	}
	
	/**
	 * SQLKEY(KK_SELECT_010)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で条件マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:
	 *		 	メールコード
	 *			バッチ運用日
	 *			バッチ運用日
	 *			バッチ運用日
	 * </pre>
	 * <p>
	 * @param whereParam 条件項目の値。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeCC_M_MAIL_KK_SELECT_010(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
		
		// DBアクセスを実行します
		db_CC_M_MAIL_SEL_010.selectBySqlDefine(paramList, CC_M_MAIL_KK_SELECT_010);
		
		return db_CC_M_MAIL_SEL_010.selectNext();
	}
	
	/**
	 *  CAS未登録ユーザメールの送信先メールアドレスを抽出
	 * <br>
	 * @param rsMap ＣＳコースが開通済み、かつ有効なCASカード情報検索結果
	 * @throws Exception 
	 */
	private void getMailAddData(JBSbatCommonDBInterface rsMap) throws Exception
	{
		ArrayList<String> subsMailAddList = new ArrayList<String>();
		ArrayList<String> contMailAddList = new ArrayList<String>();
		
		//@ (a)で取得したサービス契約に紐づく、有効なコンテンツメールアドレスを以下の条件で取得する。
		JBSbatCommonDBInterface svcKeiMap = executeKK_T_SVC_KEI_KK_SELECT_403(new String[]{ rsMap.getString(JBSbatKK_T_SVC_KEI.SYSID), super.opeDate, super.opeDate });
		if(svcKeiMap != null){
			contMailAddList.add(svcKeiMap.getString(JBSbatCK_T_RRKS.MLAD));
		}else {
			contMailAddList = null;
		}
		
		//A (a)で取得したサービス契約と同一回線の契約メールアドレスを以下の条件で取得する。
		//A-1 (a)で取得したサービス契約と紐づく、回線対象サービス契約.サービス契約回線内訳番号を以下の条件で取得する。
		JBSbatCommonDBInterface kaisenTgSvkeiMap = executeKK_T_KAISEN_TG_SVKEI_KK_SELECT_055(new String[]{ rsMap.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_NO), super.opeDate, super.opeDate });
		
		if(kaisenTgSvkeiMap == null){
			subsMailAddList = null;
		}
		else {
			//A-2　A-1で取得した回線対象サービス契約.サービス契約回線内訳番号と紐づく、サービス契約がネットのサービス契約番号を以下の条件で取得する。
			JBSbatCommonDBInterface kaisenTgSvkeiMap1 = executeKK_T_KAISEN_TG_SVKEI_KK_SELECT_056(new String[]{ kaisenTgSvkeiMap.getString(JBSbatKK_T_KAISEN_TG_SVKEI.SVC_KEI_KAISEN_UCWK_NO), super.opeDate});
			
			if(kaisenTgSvkeiMap1 == null){
				subsMailAddList = null;
			}
			else {
				// A-3　A-2で取得したサービス契約に紐づく、オプションサービス契約からオプションサービス契約＜ISP＞.メールアドレスを以下の条件で取得する。
				executeKK_T_OP_SVC_KEI_KK_SELECT_153(new String[]{ kaisenTgSvkeiMap1.getString(JBSbatKK_T_KAISEN_TG_SVKEI.SVC_KEI_NO), super.opeDate});
				JBSbatCommonDBInterface opSvcKeiMap = null;
				while ((opSvcKeiMap = db_KK_T_OP_SVC_KEI_SEL_153.selectNext()) != null) {
					subsMailAddList.add(opSvcKeiMap.getString(JBSbatKK_T_OPSVKEI_ISP.MLAD));
				}
				if (subsMailAddList.isEmpty()) {
					subsMailAddList = null;
				}
			}
		}
		
		//取得したメールアドレスの確認
		if(contMailAddList == null && subsMailAddList == null){
			mailDataList.add(setMailAddData(rsMap, null));
		}
		else if (contMailAddList == null) {
			for (int dataCnt = 0; dataCnt < subsMailAddList.size(); dataCnt++) {
				mailDataList.add(setMailAddData(rsMap, subsMailAddList.get(dataCnt)));
			}
		}
		else if (subsMailAddList == null) {
			mailDataList.add(setMailAddData(rsMap, contMailAddList.get(0)));
		}
		//C @,Aで取得したメールアドレスが同一の場合、@で取得したコンテンツメールアドレスを送信先メールアドレスとする。
		else {
			for (int dataCnt = 0; dataCnt < subsMailAddList.size(); dataCnt++) {
				if(contMailAddList.get(0).equals(subsMailAddList.get(dataCnt))){
					mailDataList.add(setMailAddData(rsMap, contMailAddList.get(0)));
				}
				//B @,Aで取得したメールアドレスが異なる場合、どちらも送信先メールアドレスとする。
				else {
					mailDataList.add(setMailAddData(rsMap, contMailAddList.get(0)));
					mailDataList.add(setMailAddData(rsMap, subsMailAddList.get(dataCnt)));
				}
			}
		}
	}
	
	/**
	 * SENDファイル作成です。
	 * 
	 * @param arrayList 出力パラメータ情報
	 * @throws Exception 例外が発生した場合
	 */
	private void outputSendFile(ArrayList<HashMap<String, Object>> arrayList) throws Exception
	{
		// フリー項目を取得する
		String[] freeItems = freeItem.split(JKKBatConst.S_PARAM_DELIM);
		// システム日時を取得する
		String sysDateTime = JKKBatCommon.getSysDateTime();
		//格納先ディレクトリ情報を取得する
		String sFileDir = freeItems[0];
		// SENDCSVファイル
		String sendCvsFile = sFileDir + SEND_FILE_NAME + "DAT_" + sysDateTime + ".csv";
		
		// SENDCSVファイル
		JBSbatBusinessFileUtil sendCvsFileObj = null;
		// SEND件数
		JBSbatBusinessFileUtil sendCntFileObj = null;
		// SENDフラグファイル
		JBSbatBusinessFileUtil sendFlgFileObj = null;
		
		int sendFileCount = 0;
		
		try
		{
			// 作成するデータがない場合はファイルを作成せずに終了する
			if (arrayList == null || arrayList.size() <= 0) {
				return;
			}
			
			// SENDCSVファイルを生成する。
			sendCvsFileObj = JCCBatCommon.createBusinessFileUtil(sendCvsFile, JKKBatConst.SJIS, JKKBatConst.S_LINE_SEPARAOR_CRLF, JKKBatConst.CONMA);
			
			//(a)で抽出対象のデータが有件の場合
			//@以下の条件を満たすメール情報を取得する。メール.メールコード = "KKM1000060"
			JBSbatCommonDBInterface mailInfoDataMap = executeCC_M_MAIL_KK_SELECT_010(new String[]{ mailCD, super.opeDate, super.opeDate, super.opeDate });
			
			for (int i = 0; i < arrayList.size(); i++)
			{
				HashMap<String, Object> outMap = arrayList.get(i);
				
				// サービス契約番号
				String svcKeiNo = (String) outMap.get(SVC_KEI_NO);
				// 料金プラン名
				String pplan = (String) outMap.get(PPLAN);
				// メール
				String mlad = (String) outMap.get(MLAD);
				
				if(mlad == null){
					continue;
				}
				
				String mailTxt = mailInfoDataMap.getString(JBSbatCC_M_MAIL.MAIL_TEXT).replaceAll("\r\n|\n", "\\\\n");
				
				// SENDファイル出力リスト
				ArrayList<String> sendFileDataList = new ArrayList<String>();
				sendFileDataList.add(svcKeiNo); // お客さまID
				sendFileDataList.add(mlad); // メール宛先
				sendFileDataList.add(mailInfoDataMap.getString(JBSbatCC_M_MAIL.SENDM_MLAD_DSP_NM)); // メール送信者名
				sendFileDataList.add(mailInfoDataMap.getString(JBSbatCC_M_MAIL.SENDM_MLAD)); // メール送信者
				sendFileDataList.add(mailInfoDataMap.getString(JBSbatCC_M_MAIL.HNSIN_MLAD)); // メール返信先
				sendFileDataList.add(mailInfoDataMap.getString(JBSbatCC_M_MAIL.ERR_MLAD)); // エラーメール返信先
				sendFileDataList.add(JKKBatConst.SPACE); // BCC
				sendFileDataList.add(mailInfoDataMap.getString(JBSbatCC_M_MAIL.MAIL_TITLE)); // メール題名
				sendFileDataList.add(mailTxt.replaceAll("%", pplan)); // メール本文
				sendFileDataList.add(recTitle); // 対応記録タイトル
				
				// SENDCSVファイルへ出力する。
				JKKBatCommon.printDoubleQuoteBusinessFileUtil(sendCvsFileObj, sendFileDataList);
				
				//出力件数カウントアップ
				sendFileCount++;
			}
		}
		catch (Exception e)
		{
			// 生成ファイルのクローズ処理
			if (null != sendCvsFileObj)
			{
				JKKBatCommon.closeBusinessFileUtil(sendCvsFileObj);
			}
			if (null != sendCntFileObj)
			{
				JKKBatCommon.closeBusinessFileUtil(sendCntFileObj);
			}
			if (null != sendFlgFileObj)
			{
				JKKBatCommon.closeBusinessFileUtil(sendFlgFileObj);
			}
			
			throw e;
		}
		if (null != sendCvsFileObj)
		{
			JKKBatCommon.closeBusinessFileUtil(sendCvsFileObj);
		}
		if (null != sendCntFileObj)
		{
			JKKBatCommon.closeBusinessFileUtil(sendCntFileObj);
		}
		if (null != sendFlgFileObj)
		{
			JKKBatCommon.closeBusinessFileUtil(sendFlgFileObj);
		}
	}
	
	/**
	 * CASEファイル作成です。
	 * 
	 * @param arrayList 出力パラメータ情報
	 * @throws Exception 例外が発生した場合
	 */
	private void outputCaseFile(ArrayList<HashMap<String, Object>> arrayList) throws Exception
	{
		// フリー項目を取得する
		String[] freeItems = freeItem.split(JKKBatConst.S_PARAM_DELIM);
		// システム日時を取得する
		String sysDateTime = JKKBatCommon.getSysDateTime();
		//格納先ディレクトリ情報を取得する
		String sFileDir = freeItems[0];
		// CASECSVファイル
		String caseCvsFile = sFileDir + CASE_FILE_NAME + sysDateTime + ".csv";
		
		// CASECSVファイル
		JBSbatBusinessFileUtil caseCvsFileObj = null;
		// CASE件数
		JBSbatBusinessFileUtil caseCntFileObj = null;
		// CASEフラグファイル
		JBSbatBusinessFileUtil caseFlgFileObj = null;
		
		int caseFileCount = 0;
		
		try
		{
			// 作成するデータがない場合はファイルを作成せずに終了する
			if (arrayList == null || arrayList.size() <= 0) {
				return;
			}
			
			// CASECSVファイルを生成する。
			caseCvsFileObj = JCCBatCommon.createBusinessFileUtil(caseCvsFile, JKKBatConst.SJIS, JKKBatConst.S_LINE_SEPARAOR_CRLF, JKKBatConst.CONMA);
			
			String curSvcKeiNo = "";
			
			for (int i = 0; i < arrayList.size(); i++)
			{
				HashMap<String, Object> outMap = arrayList.get(i);
				
				// サービス契約番号
				String svcKeiNo = (String) outMap.get(SVC_KEI_NO);
				//サービス契約番号毎に１件出力
				if(curSvcKeiNo != "" & curSvcKeiNo.equals(svcKeiNo)){
					continue;
				} else {
					curSvcKeiNo = svcKeiNo;
				}
				// メール
				String mlad = (String) outMap.get(MLAD);
				// タイトル
				String title = "";
				
				if(mlad != null){
					title = TITLE1;
				}
				else{
					title = TITLE2;
				}
				
				// CASEファイル出力リスト
				ArrayList<String> caseFileDataList = new ArrayList<String>();
				caseFileDataList.add(KOKYAKU_TYPE); // 顧客タイプ
				caseFileDataList.add(svcKeiNo); // お客様ID
				caseFileDataList.add(JKKBatConst.SPACE); // 顧客氏名
				caseFileDataList.add(JKKBatConst.SPACE); // 顧客氏名（カナ）
				caseFileDataList.add(JKKBatConst.SPACE); // 電話番号
				caseFileDataList.add(JKKBatConst.SPACE); // 電話番号2
				caseFileDataList.add(JKKBatConst.SPACE); // 郵便番号
				caseFileDataList.add(JKKBatConst.SPACE); // 住所1
				caseFileDataList.add(JKKBatConst.SPACE); // 住所2
				caseFileDataList.add(JKKBatConst.SPACE); // 住所3
				caseFileDataList.add(JKKBatConst.SPACE); // 性別
				caseFileDataList.add(JKKBatConst.SPACE); // 生年月日
				caseFileDataList.add(JYOUTAI); // 状態
				caseFileDataList.add(STATUS); // ステータス
				caseFileDataList.add(JKKBatCommon.formatDatetimeSS(JKKBatCommon.getSysDateTime())); // 作成日時
				caseFileDataList.add(UKETSUKE); // 受付者
				caseFileDataList.add(TANTOU); // 担当者
				caseFileDataList.add(JKKBatConst.SPACE); // キュー名
				caseFileDataList.add(UKETSUKE_SBT);// 受付種別
				caseFileDataList.add(title); // タイトル
				caseFileDataList.add(JKKBatConst.SPACE); // カテゴリ１
				caseFileDataList.add(JKKBatConst.SPACE); // カテゴリ２
				caseFileDataList.add(JKKBatConst.SPACE); // カテゴリ３
				caseFileDataList.add(JKKBatConst.SPACE); // カテゴリ４
				caseFileDataList.add(JKKBatConst.SPACE); // カテゴリ５
				caseFileDataList.add(JKKBatConst.SPACE); // カテゴリ６
				caseFileDataList.add(JKKBatConst.SPACE); // カテゴリ７
				caseFileDataList.add(JKKBatConst.SPACE); // カテゴリ８
				caseFileDataList.add(JKKBatConst.SPACE); // カテゴリ９
				caseFileDataList.add(JKKBatConst.SPACE); // カテゴリ１０
				caseFileDataList.add(JKKBatConst.SPACE); // カテゴリ１１
				caseFileDataList.add(JKKBatConst.SPACE); // 問い合わせ履歴
				caseFileDataList.add(JKKBatConst.SPACE); // 問合せ客ID
				caseFileDataList.add(JKKBatConst.SPACE); // eoID
				caseFileDataList.add(JKKBatConst.SPACE); // 受付番号
				caseFileDataList.add(JKKBatConst.SPACE); // エスカレーション日時
				caseFileDataList.add(JKKBatConst.SPACE); // コールバック時間指定タイプ
				caseFileDataList.add(JKKBatConst.SPACE); // 業務個別組織コード
				
				// CASECSVファイルへ出力する。
				JKKBatCommon.printDoubleQuoteBusinessFileUtil(caseCvsFileObj, caseFileDataList);
				
				//出力件数カウントアップ
				caseFileCount++;
			}
		}
		catch (Exception e)
		{
			// 生成ファイルのクローズ処理
			if (null != caseCvsFileObj)
			{
				JKKBatCommon.closeBusinessFileUtil(caseCvsFileObj);
			}
			if (null != caseCntFileObj)
			{
				JKKBatCommon.closeBusinessFileUtil(caseCntFileObj);
			}
			if (null != caseFlgFileObj)
			{
				JKKBatCommon.closeBusinessFileUtil(caseFlgFileObj);
			}
			
			throw e;
		}
		if (null != caseCvsFileObj)
		{
			JKKBatCommon.closeBusinessFileUtil(caseCvsFileObj);
		}
		if (null != caseCntFileObj)
		{
			JKKBatCommon.closeBusinessFileUtil(caseCntFileObj);
		}
		if (null != caseFlgFileObj)
		{
			JKKBatCommon.closeBusinessFileUtil(caseFlgFileObj);
		}
	}
	
	/**
	 * 送信先メールリストに出力するデータを設定する。
	 * <br>
	 * @param  inMap 入力ファイルの１レコード分を格納したHashMap
	 * @return JBSbatServiceInterfaceMap 送信先メールリスト記載内容１件分
	 * @throws Exception
	 */
	private HashMap<String, Object> setMailAddData(JBSbatCommonDBInterface rsMap, String mlad) throws Exception
	{
		HashMap<String, Object> result = new HashMap<String, Object>();
		
		// サービス契約番号
		result.put(SVC_KEI_NO, rsMap.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_NO));
		//料金プラン名
		result.put(PPLAN, rsMap.getString(JBSbatKK_M_PPLAN.PPLAN_NM));
		// メール
		result.put(MLAD, mlad);
		
		return result;
	}
}
