/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKCashPostAddMail
*	ソースファイル名	：JBSbatKKCashPostAddMail.java
*	作成者				：富士通　
*	作成日				：2022年04月06日
*＜機能概要＞
*　CASHPOST契約から、CASHPOSTマスタで設定されているメール送信対象のデータを取得する。
*　メール関連DBに登録を行い、対応履歴連携用のCASEファイルの出力を行う。
*＜修正履歴＞
*	バージョン	修正日		修正者		 修正内容
*	v59.00.00	2022/04/06  FJ)美濃原	【ANK-4229-00-00】CASHPOST登録結果のメール送付
*********************************************************************/
package eo.business.service;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JKKBatCommon;
import eo.business.common.JKKBatConst;
import eo.business.util.file.JBSbatKKIFM893;
import eo.business.util.table.JBSbatCC_M_MAIL;
import eo.business.util.table.JBSbatCC_T_MLAD;
import eo.business.util.table.JBSbatCK_T_RRKS;
import eo.business.util.table.JBSbatKK_M_CASHPOST;
import eo.business.util.table.JBSbatKK_T_CASHPOST_KEI;
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.common.constant.JKKStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JKKCommonUtil;
import eo.common.util.JKKStringUtil;
import eo.common.util.JPCDateUtil;
import eo.framework.application.JBSbatBusinessException;
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;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKCashPostAddMail extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブルアクセスクラス(CASHPOSTマスタ)*/
	private JBSbatSQLAccess db_KK_M_CASHPOST = null;
	/** テーブルアクセスクラス(CASHPOST契約)*/
	private JBSbatSQLAccess db_KK_T_CASHPOST_KEI_MAIN = null;
	/** テーブルアクセスクラス(CASHPOST契約)*/
	private JBSbatSQLAccess db_KK_T_CASHPOST_KEI_SUB = null;
	/** テーブルアクセスクラス(オプションサービス契約<ISP>)*/
	private JBSbatSQLAccess db_KK_T_OPSVKEI_ISP = null;
	/** テーブルアクセスクラス(連絡先)*/
	private JBSbatSQLAccess db_CK_T_RRKS = null;

	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	// 起動パラメータ
	/** 起動パラメータ FREE項目 */
	private String[] freeItems = null;

	/** FREE項目：全項目数 */
	private static final int FREE_ITEM_COUNT = 1;
	/** FREE項目：対応履歴ファイル出力先フォルダ */
	private static final int FREE_IDX_TAIORIREKI = 0;

	// テーブル
	/** テーブル(CASHPOSTマスタ)*/
	private static final String D_TBL_NAME_KK_M_CASHPOST = "KK_M_CASHPOST";
	/** SQL定義キー(CASHPOSTマスタ：KK_M_CASHPOST_KK_SELECT_021)  */
	private static final String KK_M_CASHPOST_KK_SELECT_001 = "KK_SELECT_001";
	/** SQL定義キー(CASHPOSTマスタ：KK_M_CASHPOST_KK_SELECT_002)  */
	private static final String KK_M_CASHPOST_KK_SELECT_002 = "KK_SELECT_002";

	/** テーブル(CASHPOST契約)*/
	private static final String D_TBL_NAME_KK_T_CASHPOST_KEI = "KK_T_CASHPOST_KEI";
	/** SQL定義キー(CASHPOST契約：KK_T_CASHPOST-KK_SELECT_005) メイン処理 */
	private static final String KK_T_CASHPOST_KK_SELECT_005 = "KK_SELECT_005";
	/** SQL定義キー(CASHPOST契約：KK_T_CASHPOST-KK_SELECT_006) 親番チェック、送信済チェック処理 */
	private static final String KK_T_CASHPOST_KK_SELECT_006 = "KK_SELECT_006";

	/** SQL定義キー(CASHPOST契約：KK_T_CASHPOST-KK_SELECT_003) 更新前検索 */
	private static final String KK_T_CASHPOST_KK_SELECT_003 = "KK_SELECT_003";
	/** SQL定義キー(CASHPOST契約：KK_T_CASHPOST-KK_INSERT_003)*/
	private static final String KK_T_CASHPOST_KEI_KK_INSERT_003 = "KK_INSERT_003";

	/** テーブル(オプションサービス契約<ISP>)*/
	private static final String D_TBL_NAME_KK_T_OPSVKEI_ISP = "KK_T_OPSVKEI_ISP";
	/** SQL定義キー(オプションサービス契約<ISP>：KK_T_OPSVKEI-ISP_KK_SELECT_034)*/
	private static final String KK_T_OPSVKEI_ISP_KK_SELECT_034 = "KK_SELECT_034";

	/** テーブル(連絡先)*/
	private static final String D_TBL_NAME_CK_T_RRKS = "CK_T_RRKS";
	/** SQL定義キー(連絡先：CK_T_RRKS_KK_SELECT_011)*/
	private static final String CK_T_RRKS_KK_SELECT_011 = "KK_SELECT_011";

	// メール抽出条件
	/** メール抽出条件リスト */
	private List<String[]> mailInfoList = null;
	/** [0:メール送信対象CP]：キャンペーンコード（CASHPOSTコード） */
	private static int MAIL_INFO_CP = 0;
	/** [1:メール（CC_M_MAIL）のメールコード] */
	private static int MAIL_INFO_MAIL_CD = 1;
	/** [2:登録後経過日数]：キャンペーンの登録後経過日数 ※運用日から減算し抽出対象となる登録日を算出する */
	private static int MAIL_INFO_DD = 2;
	/** [3:対応履歴用のキャンペーン名] */
	private static int MAIL_INFO_CASE_CPNM = 3;
	/** [4:算出基準日]：運用日付 − 登録後経過日数 (計算値) */
	private static int MAIL_INFO_TO_YMD = 4;
	/** メール抽出条件リストの設定項目数（CASHPOSTマスタで取得する項目数） */
	private static int mailInfoCol = 4;

	// 同一分類（親番）
	/** 同一分類（親番）リスト */
	private List<HashMap<String, String>> groupInfoList = null;

	// 項目名
	/** CASHPOST_GRP：親番 */
	private static final String CASHPOST_GRP = "CASHPOST_GRP";
	/** CHK_STATUS：メール送信済チェック状態 */
	private static final String CHK_STATUS = "CHK_STATUS";
	/** CHK_STATUS：メール送信済チェック状態＝"SENDZM"(送信済／送信対象外) */
	private static final String CHK_STATUS_SENDZM = "SENDZM";
	/** CASE_CPNM：対応履歴用キャンペーン名 */
	private static final String CASE_CPNM = "CASE_CPNM";
	/** MAIL_CD：メールコード */
	private static final String MAIL_CD = "MAIL_CD";
	/** NET_SVC_KEI_NO：ネットのサービス契約番号 */
	private static final String NET_SVC_KEI_NO = "NET_SVC_KEI_NO";

	// ファイル情報
	/** ファイルエンコード(SJIS) */
	private static final String ENCODE_SHIFT_JIS = "Shift-JIS";

	/** CASEファイルのプレフィックス "CASE_CASH_MAIL_" */
	private static final String KKIFM945_CASE_CASE_PREFIX = "CASE_CASH_MAIL_";

	/** CASEファイルの拡張子 ".CSV" </br>命名ルール：「CASE_CASH_MAIL_yyyymmddhhmmss.CSV」*/
	private static final String KKIFM945_CASE_EXT = ".CSV";
	/** CASE件数ファイルのサフィックス "_CNT"命名ルール：「CASE_CASH_MAIL_yyyymmddhhmmss_CNT.TXT」*/
	private static final String KKIFM945_CASE_CNT_SUFFIX = "_CNT";
	/** CASEフラグファイルの拡張子 */
	private static final String KKIFM945_CASE_CNT_EXT = ".TXT";

	/** CASEフラグファイルのサフィックス "_FTP" </br>命名ルール：「CASE_CASH_MAIL_yyyymmddhhmmss_FTP.FLG」*/
	private static final String KKIFM945_CASE_FLG_SUFFIX = "_FTP";
	/** CASEフラグファイルの拡張子 */
	private static final String KKIFM945_CASE_FLG_EXT = ".FLG";

	/** CASEファイル パス */
	private String KKIFM945FilePath1 = null;
	/** CASE件数ファイル パス */
	private String KKIFM945FilePath2 = null;
	/** CASEフラグ パス */
	private String KKIFM945FilePath3 = null;

	/** CASEファイル オブジェクト */
	private JBSbatBusinessFileUtil KKIFM945CaseFileObj = null;
	/** CASE件数ファイル オブジェクト */
	private JBSbatBusinessFileUtil KKIFM945CntFileObj = null;
	/** CASEフラグ オブジェクト */
	private JBSbatBusinessFileUtil KKIFM945FlgFileObj = null;

	/** 空文字 */
	private static final String STR_EMPTY = "";

	// CASEファイル
	/** ファイル出力文字列(加入者) */
	public static final String FILE_KNYSHA = "加入者";
	/** ファイル出力文字列(クローズ) */
	public static final String FILE_CLOSE = "クローズ";
	/** ファイル出力文字列(処理中) */
	public static final String FILE_TRN = "処理中";
	/** ファイル出力文字列(他システム) */
	public static final String OTHER_SYSTEM = "OTHER_SYSTEM";
	/** ファイル出力文字列(他システム) */
	public static final String FILE_TSYS = "他システム";
	/** ファイル出力文字列(タイトル) */
	public static final String FILE_TITLE = "【%1%】申請書受領メール送信情報";
	/** ファイル出力フォーマット(日付) */
	public static final String FILE_DATE_FORMAT = "yyyy/MM/dd HH:mm:ss";
	/** ファイル入力フォーマット(日付) */
	public static final String FILE_DATE_IN = "yyyyMMddHHmmss";
	/** ファイル固定文言 */
	public static final String FILE_BNMEN = "下記メールアドレス宛に、%1%の申請書を\r\n受領した旨メールで案内しています。\r\n";
	/** 置換文字列  */
	public static final String REP_WORD = "%1%";

	// メール編集用
	/** 送信予定年月日時分秒設定キー */
	private static final String MAIL_SEND_RSV_DTM = "MAIL_SEND_RSV_DTM";
	/** メールの送信パターン(02：ディレイド) */
	private static final String MAIL_SEND_PATTERN_CD_02 = "02";
	/** メールの送信パターンコード設定キー */
	private static final String MAIL_SEND_PATTERN_CD = "MAIL_SEND_PATTERN_CD";
	/** メールの送信先アドレス設定キー */
	private static final String MLAD_TO = "MLAD_TO";
	/** メールの送信先アドレス表示名設定キー */
	private static final String MLAD_TO_NM = "MLAD_TO_NM";
	/** 本文に埋め込む非定型な置換文字列設定キー*/
	private static final String TEXT_HTK_CKAN_MOJI = "TEXT_HTK_CKAN_MOJI";

	// 件数
	/** CASHPOST契約 入力レコード件数 */
	private int cashpostCnt = 0;
	/** CASHPOST契約 ＳＫＩＰレコード件数 */
	private int skipCnt = 0;
	/** CASHPOST登録完了メール 出力レコード件数 */
	private int mailSendCnt = 0;
	/** CASHPOST登録完了メール 対象外レコード件数 */
	private int mailTgCnt = 0;
	/** CASEファイル 出力レコード件数 */
	private int KKIFM945OutputCnt = 0;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		db_KK_M_CASHPOST = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_M_CASHPOST);
		db_KK_T_CASHPOST_KEI_MAIN = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_CASHPOST_KEI);
		db_KK_T_CASHPOST_KEI_SUB = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_CASHPOST_KEI);
		db_KK_T_OPSVKEI_ISP = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_OPSVKEI_ISP);
		db_CK_T_RRKS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CK_T_RRKS);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		// Free項目からパラメータを取得
		freeItems = freeItem.split(JKKBatConst.S_PARAM_DELIM);
		if (freeItems.length < FREE_ITEM_COUNT)
		{
			// パラメータが不正です。(%1%)	
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0130CE, new String[] { "FREE項目の項目数不正" });
		}
		printInfoLog("[初期処理]対応履歴ファイルフォルダ：" + freeItems[FREE_IDX_TAIORIREKI]);

		File dir = new File(freeItems[FREE_IDX_TAIORIREKI]);
		if (!dir.exists() || !dir.isDirectory())
		{
			//『ファイル制御に失敗しました。%1%』
			throw new JBSbatBusinessException("EKKB2060AW", new String[] { "対応履歴ファイルフォルダが存在しません。" });
		}
		printInfoLog("[初期処理]運用日付：" + this.opeDate);

		/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		String oldKey = STR_EMPTY;
		String newKey = STR_EMPTY;
		ArrayList<HashMap<String, String>> saveMainList = new ArrayList<HashMap<String, String>>();

		try
		{

			//■CASHPOSTマスタからメール抽出条件を取得する
			mailInfoList = getMstMailInfo(super.opeDate);
			if (mailInfoList == null || mailInfoList.size() == 0)
			{
				// メール抽出条件なしは正常終了
				printInfoLog("CASHPOSTマスタに有効なメール抽出条件の登録がないため、処理を終了します。");
				return null;
			}

			//■CASHPOSTマスタから同一分類（親番）のキャンペーン情報を取得する
			groupInfoList = getMstGrpInfo();
			if (groupInfoList == null || groupInfoList.size() == 0)
			{
				// EKKB0290AW『%1%が存在しませんでした。』（ありえない前提）
				throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0290AW, new String[] { "CASHPOSTマスタに同一分類（親番）の情報" });
			}

			//■出力ファイルOPEN
			String timeStamp = JKKBatCommon.getSysDateTime();
			outputFileOpen(timeStamp);

			String opeDateZenkaku = getOpeDateZenkaku(this.opeDate);

			//■CASHPOST契約から送信対象のデータの情報取得（CASHPOST契約メイン）
			executeKK_T_CASHPOST_KEI_MAIN(new Object[] { this.opeDate, this.opeDate, this.opeDate });
			//■取得できた件数分while文で処理を行う。
			JBSbatCommonDBInterface sqlMainMap = db_KK_T_CASHPOST_KEI_MAIN.selectNext();
			while (sqlMainMap != null)
			{
				// ＫＥＹ情報取得
				newKey = keySet(sqlMainMap);
				if (!JKKStringUtil.isNullEmpty(oldKey) && !oldKey.equals(newKey))
				{
					// ＫＥＹブレイク（サービス契約番号単位に処理）
					keyBreak(saveMainList, opeDateZenkaku);
					// 退避リストの初期化
					saveMainList = new ArrayList<HashMap<String, String>>();
				}
				oldKey = newKey;

				// 入力レコード件数カウント
				cashpostCnt++;

				// □抽出対象となっているメールか判定し、情報を退避しておく
				String[] mailInfo = checkMailChsht(mailInfoList, sqlMainMap, this.opeDate);
				if (mailInfo == null)
				{
					skipCnt++;
				}
				else
				{
					HashMap<String, String> recMap = new HashMap<String, String>();
					recMap.put(JBSbatKK_T_CASHPOST_KEI.CASHPOST_KEI_NO, sqlMainMap.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_KEI_NO)); // CASHPOST契約番号
					recMap.put(JBSbatKK_T_CASHPOST_KEI.SVC_KEI_NO, sqlMainMap.getString(JBSbatKK_T_CASHPOST_KEI.SVC_KEI_NO)); // サービス契約番号
					recMap.put(JBSbatKK_T_SVC_KEI.SYSID, sqlMainMap.getString(JBSbatKK_T_SVC_KEI.SYSID)); // SYSID
					recMap.put(JBSbatKK_T_KAISEN_TG_SVKEI.SVC_KEI_KAISEN_UCWK_NO, sqlMainMap
							.getString(JBSbatKK_T_KAISEN_TG_SVKEI.SVC_KEI_KAISEN_UCWK_NO)); // サービス契約回線内訳番号
					recMap.put(JBSbatKK_T_SVC_KEI.SVC_CD, sqlMainMap.getString(JBSbatKK_T_SVC_KEI.SVC_CD)); // SVC_CD
					recMap.put(NET_SVC_KEI_NO, sqlMainMap.getString(NET_SVC_KEI_NO)); // ネットのサービス契約番号
					recMap.put(CASHPOST_GRP, sqlMainMap.getString(CASHPOST_GRP)); // CASHPOST親番
					recMap.put(JBSbatKK_T_CASHPOST_KEI.CASHPOST_CD, sqlMainMap.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_CD)); // CASHPOSTコード
					recMap.put(MAIL_CD, mailInfo[MAIL_INFO_MAIL_CD]); // メールコード
					recMap.put(CASE_CPNM, mailInfo[MAIL_INFO_CASE_CPNM]); // 対応履歴用のキャンペーン名
					saveMainList.add(recMap);

					printDebugLog("CASHPOST契約 未送信データ <退避> " + editKeyLog(recMap) + " CASHPOST登録年月日["
							+ sqlMainMap.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_ADD_YMD) + "]");
				}

				// 次のレコード処理へ
				sqlMainMap = db_KK_T_CASHPOST_KEI_MAIN.selectNext();
			}

			if (saveMainList != null && saveMainList.size() > 0)
			{
				// ＫＥＹブレイク（サービス契約番号単位に処理）
				keyBreak(saveMainList, opeDateZenkaku);
			}

			try
			{
				//■ファイルCLOSE
				outputFileClose();
				//■対応履歴ファイル制御
				fileControl(timeStamp);
			}
			catch (Exception fex)
			{
				//『ファイル制御に失敗しました。%1%』
				printBusinessError("EKKB2060AW", new String[] { fex.getMessage() });
			}
		}
		catch (Exception e)
		{
			printInfoLog("＊＊＊＊＊ Exception Rollback ＊＊＊＊＊");
			//■ファイルCLOSE
			outputFileClose();
			outputFileCloseCntFlg();
			deleteTmpFile(KKIFM945FilePath1);
			deleteTmpFile(KKIFM945FilePath2);
			deleteTmpFile(KKIFM945FilePath3);
			throw e;
		}

		return null;
		/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		db_KK_M_CASHPOST.close();
		db_KK_T_CASHPOST_KEI_MAIN.close();
		db_KK_T_CASHPOST_KEI_SUB.close();
		db_KK_T_OPSVKEI_ISP.close();
		db_CK_T_RRKS.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		printInfoLog("[終了処理]CASHPOST契約 入力件数：" + String.valueOf(cashpostCnt) + " (うち 抽出対象外件数：" + String.valueOf(skipCnt) + ")");
		printInfoLog("[終了処理]CASHPOST登録完了メール 出力件数：" + String.valueOf(mailSendCnt));
		printInfoLog("[終了処理]CASHPOST登録完了メール 対象外更新件数：" + String.valueOf(mailTgCnt));
		printInfoLog("[終了処理]CASEファイル 出力件数：" + String.valueOf(KKIFM945OutputCnt));
		/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 出力ファイルOPEN。
	 * 
	 * <br>
	 * @param timeStamp タイムスタンプ
	 * @throws Exception 
	 */
	private void outputFileOpen(String timeStamp) throws Exception
	{

		// ■CASEファイル
		KKIFM945FilePath1 = getFullPathName(freeItems[FREE_IDX_TAIORIREKI], KKIFM945_CASE_CASE_PREFIX, timeStamp, null, KKIFM945_CASE_EXT);
		// ファイルオブジェクトを生成する
		KKIFM945CaseFileObj = JKKBatCommon.createBusinessFileUtil(KKIFM945FilePath1, ENCODE_SHIFT_JIS, JKKStrConst.LINE_SEPARATOR, JKKStrConst.COMMA);
		printInfoLog("[メイン処理]対応履歴ファイル ファイル作成：" + KKIFM945FilePath1);
	}

	/**
	 * ファイルのフルパスを生成する。<br>
	 * （システム日付付加）
	 * <br>
	 * @param dirName ディレクトリ名
	 * @param defaultFileName ファイル名
	 * @param timeStamp タイムスタンプ
	 * @param endFix ファイルの終端名
	 * @param extKind 拡張子
	 * @return
	 */
	private String getFullPathName(String dirName, String defaultFileName, String timeStamp, String endFix, String extKind)
	{
		StringBuffer sb = new StringBuffer();
		sb.append(dirName);
		sb.append(getFileName(defaultFileName, timeStamp, endFix, extKind));
		return sb.toString();
	}

	/**
	 * ファイル名を生成する。<br>
	 * （システム日付付加）
	 * <br>
	 * @param defaultFileName ファイル名
	 * @param timeStamp タイムスタンプ
	 * @param endFix ファイルの終端名
	 * @param extKind 拡張子
	 * @return
	 */
	private String getFileName(String defaultFileName, String timeStamp, String endFix, String extKind)
	{
		StringBuffer sb = new StringBuffer();
		sb.append(defaultFileName);
		sb.append(timeStamp);
		sb.append(JKKStringUtil.nullToBlank(endFix));
		sb.append(extKind);
		return sb.toString();
	}

	/**
	 * CASHPOSTマスタの情報を取得する。
	 * 
	 * <br>
	 * @param opeDate 運用日付
	 * @return 取得した情報リスト
	 * @throws Exception
	 */
	private List<String[]> getMstMailInfo(String opeDate) throws Exception
	{
		List<String[]> resultList = new ArrayList<String[]>();
		executeKK_M_CASHPOST_KK_SELECT_001();
		JBSbatCommonDBInterface workParamKnriMap = db_KK_M_CASHPOST.selectNext();
		while (workParamKnriMap != null)
		{
			String cashpost_cd = workParamKnriMap.getString(JBSbatKK_M_CASHPOST.CASHPOST_CD);
			String add_mail_cd = workParamKnriMap.getString(JBSbatKK_M_CASHPOST.ADD_MAIL_CD);
			String add_mail_keika_nisu = workParamKnriMap.getString(JBSbatKK_M_CASHPOST.ADD_MAIL_KEIKA_NISU);
			String add_mail_campaign_nm = workParamKnriMap.getString(JBSbatKK_M_CASHPOST.ADD_MAIL_CAMPAIGN_NM);

			if (JKKCommonUtil.isNull(add_mail_cd) || JKKCommonUtil.isNull(add_mail_keika_nisu) || JKKCommonUtil.isNull(add_mail_campaign_nm))
			{
				// メール送信対象で、必須項目が設定されていない場合
				// EKKB0230TW『必須エラーの項目があります。(%1%)』（ありえない前提）
				throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0230TW, new String[] { "CASHPOSTマスタの登録メール情報が設定されていません（CASHPOSTコード[" + cashpost_cd
						+ "]）" });
			}
			// 登録後経過日数を元に基準となる日を取得する。
			int nissu = Integer.parseInt(add_mail_keika_nisu) * -1;
			String kijunYmd = JPCDateUtil.addDay(opeDate, nissu);
			String[] strOut = new String[mailInfoCol + 1];
			strOut[MAIL_INFO_CP] = cashpost_cd;
			strOut[MAIL_INFO_MAIL_CD] = add_mail_cd;
			strOut[MAIL_INFO_DD] = add_mail_keika_nisu;
			strOut[MAIL_INFO_CASE_CPNM] = add_mail_campaign_nm;
			strOut[MAIL_INFO_TO_YMD] = kijunYmd;

			resultList.add(strOut);
			printInfoLog("<CASHPOSTマスタ> CASHPOSTコード[" + cashpost_cd + "]"
					+ " 登録メールコード[" + add_mail_cd + "]"
					+ " 登録メール経過日数[" + add_mail_keika_nisu + "]"
					+ " 登録メールキャンペーン名[" + add_mail_campaign_nm + "]"
					+ " 基準日[" + kijunYmd + "] "
					);

			// 次のデータを読む
			workParamKnriMap = db_KK_M_CASHPOST.selectNext();
		}

		return resultList;
	}

	/**
	 * CASHPOSTマスタの情報を取得する。
	 * 
	 * <br>
	 * @return 取得した情報リスト
	 * @throws Exception
	 */
	private List<HashMap<String, String>> getMstGrpInfo() throws Exception
	{
		List<HashMap<String, String>> resultList = new ArrayList<HashMap<String, String>>();
		executeKK_M_CASHPOST_KK_SELECT_002();
		JBSbatCommonDBInterface workParamKnriMap = db_KK_M_CASHPOST.selectNext();
		String oldKey = "";
		StringBuffer sb = new StringBuffer();
		HashMap<String, String> workMap = new HashMap<String, String>();
		HashMap<String, String> checkMap = new HashMap<String, String>();
		while (workParamKnriMap != null)
		{
			String add_mail_grp = workParamKnriMap.getString(JBSbatKK_M_CASHPOST.ADD_MAIL_GRP);
			String cashpost_grp = workParamKnriMap.getString(CASHPOST_GRP);
			if (checkMap.containsKey(cashpost_grp)) {
				// 重複設定エラー
				// EKKB0220KW『重複するデータが存在します。(%1%)』（ありえない前提）
				throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0220KW, new String[] { "CASHPOSTマスタに親番[" + cashpost_grp
						+ "]が複数の登録メールグループに設定されています" });
			}
			checkMap.put(cashpost_grp, cashpost_grp);
			if (JKKCommonUtil.isNull(oldKey))
			{
				sb.append("<CASHPOSTマスタ> 同一分類（親番）：登録メールグループ [" + add_mail_grp + "] 親番");
			}
			else if (!oldKey.equals(add_mail_grp))
			{
				resultList.add(workMap);
				printInfoLog(sb.toString());
				workMap = new HashMap<String, String>();
				sb = new StringBuffer();
				sb.append("<CASHPOSTマスタ> 同一分類（親番）：登録メールグループ [" + add_mail_grp + "] 親番");
			}
			workMap.put(cashpost_grp, cashpost_grp);
			sb.append("[" + cashpost_grp + "]");
			oldKey = add_mail_grp;
			// 次のデータを読む
			workParamKnriMap = db_KK_M_CASHPOST.selectNext();
		}

		if (!JKKCommonUtil.isNull(oldKey))
		{
			resultList.add(workMap);
			printInfoLog(sb.toString());
		}
		
		return resultList;
	}

	/**
	 * キー項目を取得する（サービス契約番号）。
	 * @param sqlMainMap 処理中のCASHPOSTの情報
	 * @return キー情報
	 * @throws Exception 
	 */
	private String keySet(JBSbatCommonDBInterface sqlMainMap) throws Exception
	{
		String svcKeiNo = sqlMainMap.getString(JBSbatKK_T_CASHPOST_KEI.SVC_KEI_NO);
		return svcKeiNo;
	}

	/**
	 * キーブレイク処理
	 * 
	 * <br>
	 * @param saveMainList CASHPOSTの情報のリスト（サービス契約番号単位）
	 * @param opeDateZenkaku 運用日付（全角）
	 * @throws Exception 
	 */
	private void keyBreak(ArrayList<HashMap<String, String>> saveMainList, String opeDateZenkaku) throws Exception
	{
		if (saveMainList == null || saveMainList.size() == 0)
		{
			return;
		}

		// ■同一分類（親番）定義チェックを行い、登録結果メールの送信情報を取得する。
		//   注）同一分類（親番）定義チェックは、サービス契約番号に紐づく全てをチェック（処理中のCASHPOSTコードを含む）
		ArrayList<HashMap<String, String>> sendCheckList = chkSvcKeiCashPost(saveMainList.get(0));
		// ■CASHPOST契約のフラグを更新した親番
		HashMap<String, String> shoriCashGrp = new HashMap<String, String>();

		// ■未送信のCASHPOST契約のリスト（サービス契約番号単位）で処理を行う。
		String tgMsgStr = "";
		for (HashMap<String, String> sqlMainMap : saveMainList)
		{
			String svcKeiNo = sqlMainMap.get(JBSbatKKIFM893.SVC_KEI_NO);

			// □メール送信済チェック
			String resultSend = isAleadySend(sendCheckList, shoriCashGrp, sqlMainMap);
			if (resultSend == null)
			{
				// チェック済のためありえないはず−次のサービス契約番号の処理へ
				break;
			}
			// メールアドレス取得
			String mlad = getMailAddress(sqlMainMap);
			sqlMainMap.put(JBSbatCC_T_MLAD.MLAD, mlad);
			tgMsgStr = " ※メール送信済／不要のため";
			if (JKKCommonUtil.isNull(mlad))
			{
				// 「メールアドレスが取得出来ない(ありえない想定)」場合
				// EKKB1600KW『%1%が存在しませんでした。』
				printBusinessError("EKKB1600KW", new String[] { "サービス契約番号:" + svcKeiNo + "に紐づくメールアドレス" });
				tgMsgStr = " ※メールアドレス取得不可のため";
			}
			if ((!JKKCommonUtil.isNull(mlad)) && JKKStrConst.CD01335_SENDMI.equals(resultSend))
			{
				printInfoLog("CASHPOST契約 <メール登録処理> " + editKeyLog(sqlMainMap) + " メールコード[" + sqlMainMap.get(MAIL_CD) + "] メールアドレス[" + mlad + "]");
				//■ メール送信
				mailSendInfoKakno(sqlMainMap, opeDateZenkaku);
				//■ CASHPOST契約のフラグ更新（世代追加）
				cashpostInsert(sqlMainMap, JKKStrConst.CD01335_SENDZM, this.opeDate);
				//■ CASEファイルを出力する。（サービス契約番号単位）
				// 日付フォーマット
				SimpleDateFormat sdf = new SimpleDateFormat(FILE_DATE_FORMAT);
				SimpleDateFormat instance = new SimpleDateFormat(FILE_DATE_IN);
				// 連携時のシステム日付 yyyy/mm/dd hh:mm:ss
				String renkeiSysDate = sdf.format(instance.parse(JKKBatCommon.getSysDateTime()));
				createKKIFM945(renkeiSysDate, sqlMainMap, opeDateZenkaku);
				mailSendCnt++;
			}
			else
			{
				printInfoLog("CASHPOST契約 <メール送信対象外処理> " + editKeyLog(sqlMainMap) + tgMsgStr);
				// 「メール送信対象外」又は「メールアドレスが取得出来ない(ありえない想定)」の場合
				// 次回以降も処理対象外とするため、CASHPOST契約のフラグを更新する。対応履歴出力も行わない。
				//■ CASHPOST契約のフラグ更新（世代追加）
				cashpostInsert(sqlMainMap, JKKStrConst.CD01335_SENDTG, null);
				mailTgCnt++;
			}
			shoriCashGrp.put(sqlMainMap.get(CASHPOST_GRP), sqlMainMap.get(CASHPOST_GRP));
		}

	}

	/**
	 * メール抽出条件を取得する。
	 * 
	 * <br>
	 * @param mailInfoList メール抽出条件
	 * @param sqlMainMap 処理中のCASHPOSTの情報
	 * @param opeDate 運用日付
	 * @return メール抽出条件
	 * @throws Exception
	 */
	private String[] checkMailChsht(List<String[]> mailInfoList, JBSbatCommonDBInterface sqlMainMap, String opeDate) throws Exception
	{

		//■メール送信対象のキャンペーンか判定を行う
		for (String[] wkStr : mailInfoList)
		{
			//      『CASHPOST契約メイン.CASHPOSTコード ＝ [メール送信対象CP]』
			// かつ 『CASHPOST契約メイン.CASHPOST登録日 ≦  オンライン運用日付 - [登録後経過日数](*1)』
			//      (*1)は算出済の値を使用
			if ((wkStr[MAIL_INFO_CP].equals(sqlMainMap.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_CD))))
			{
				if (Integer.parseInt(sqlMainMap.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_ADD_YMD)) <= Integer.parseInt(wkStr[MAIL_INFO_TO_YMD]))
				{
					printDebugLog("抽出対象(基準日[" + wkStr[MAIL_INFO_TO_YMD] + "] CASHPOST登録日["
							+ sqlMainMap.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_ADD_YMD) + "]) " + editKeyLog(sqlMainMap));
					return wkStr;
				}
				else
				{
					// メール抽出条件対象外 又は 登録後経過日数未満
					printInfoLog("抽出対象外(登録後経過日数未満：基準日[" + wkStr[MAIL_INFO_TO_YMD] + "] CASHPOST登録日["
							+ sqlMainMap.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_ADD_YMD) + "]) " + editKeyLog(sqlMainMap));
					return null;
				}
			}
		}

		// メール抽出条件対象外
		printInfoLog("抽出対象外(メール抽出条件定義なし) " + editKeyLog(sqlMainMap));

		return null;
	}

	/**
	 * 同一分類（親番）の情報を取得する。
	 * 
	 * <br>
	 * @param sqlRecMap CASHPOST契約
	 * @return 同一分類（親番）の情報
	 * @throws Exception
	 */
	private HashMap<String, String> chkOyaban(HashMap<String, String> sqlRecMap) throws Exception
	{

		//   【groupInfoList】
		//		※CASHPOSTマスタから取得するため、取得出来ないことはない前提

		//■CASHPOSTマスタから、同一分類の親番情報を取得する。
		for (HashMap<String, String> group : groupInfoList)
		{
			if (group.containsKey(sqlRecMap.get(CASHPOST_GRP)))
			{
				return group;
			}
		}

		printInfoLog("!!!!! Error !!!!! " + editKeyLog(sqlRecMap));
		// EKKB0290AW『%1%が存在しませんでした。』（ありえない前提）
		throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0290AW, new String[] { "CASHPOSTマスタ"+
				"[" + sqlRecMap.get(CASHPOST_GRP) + "]の同一分類（親番）" });
	}

	/**
	 * サービス契約番号に紐づくCASHPOST情報を取得する。
	 * 
	 * <br>
	 * @param sqlMainMap 処理中のCASHPOSTの情報
	 * @return CASHPOST情報リスト
	 * @throws Exception
	 */
	private ArrayList<HashMap<String, String>> chkSvcKeiCashPost(HashMap<String, String> sqlMainMap) throws Exception
	{
		ArrayList<HashMap<String, String>> resultList = new ArrayList<HashMap<String, String>>();

		//■CASHPOST契約の情報を取得（CASHPOST契約サブ）
		executeKK_T_CASHPOST_KEI_KK_SELECT_006(new Object[] { sqlMainMap.get(JBSbatKK_T_CASHPOST_KEI.SVC_KEI_NO) });
		JBSbatCommonDBInterface sqlResultMap = null;

		// 取得できた件数分while文で処理を行う。
		while ((sqlResultMap = db_KK_T_CASHPOST_KEI_SUB.selectNext()) != null)
		{
			HashMap<String, String> sqlSubMap = new HashMap<String, String>();

			sqlSubMap.put(JBSbatKK_T_CASHPOST_KEI.SVC_KEI_NO, sqlMainMap.get(JBSbatKK_T_CASHPOST_KEI.SVC_KEI_NO)); // サービス契約番号
			sqlSubMap.put(JBSbatKK_T_SVC_KEI.SYSID, sqlMainMap.get(JBSbatKK_T_SVC_KEI.SYSID)); // SYSID
			sqlSubMap.put(JBSbatKK_T_CASHPOST_KEI.CASHPOST_KEI_NO, sqlResultMap.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_KEI_NO)); // CASHPOST契約番号
			sqlSubMap.put(JBSbatKK_T_CASHPOST_KEI.CASHPOST_CD, sqlResultMap.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_CD)); // CASHPOSTコード
			sqlSubMap.put(CASHPOST_GRP, sqlResultMap.getString(CASHPOST_GRP)); // 親番
			sqlSubMap.put(CHK_STATUS, sqlResultMap.getString(CHK_STATUS)); // チェック用ステータス
			chkOyaban(sqlSubMap);

			resultList.add(sqlSubMap);
		}
		return resultList;

	}

	/**
	 * 登録結果メールが送信済か判定を行う。
	 * 
	 * <br>
	 * @param sendCheckList サービス契約番号に紐づくCASHPOST情報
	 * @param shoriCashGrp CASHPOST契約のフラグを更新した親番
	 * @param sqlMainMap 処理中のCASHPOSTの情報
	 * @return "0"：未送信、"1"：送信済（送信済／送信不要）
	 * @throws Exception
	 */
	private String isAleadySend(ArrayList<HashMap<String, String>> sendCheckList, HashMap<String, String> shoriCashGrp,
			HashMap<String, String> sqlMainMap) throws Exception
	{

		//■CASHPOSTマスタから、同一分類の親番情報を取得する。
		HashMap<String, String> checkGroup = chkOyaban(sqlMainMap);

		// 取得できた件数分while文で処理を行う。
		for (HashMap<String, String> sendChkMap : sendCheckList)
		{

			// 処理中のCASHPOST契約以外
			if (sqlMainMap.get(JBSbatKK_T_CASHPOST_KEI.CASHPOST_KEI_NO).equals(sendChkMap.get(JBSbatKK_T_CASHPOST_KEI.CASHPOST_KEI_NO)))
			{
				continue;
			}
			// □CASHPOST契約サブのメール送信済チェック
			for(Iterator<String> ite = checkGroup.keySet().iterator(); ite.hasNext();) {
				// 格納されているキーを取得
				String wkStr = (String)ite.next();
				if (sendChkMap.get(CASHPOST_GRP).equals(wkStr) && CHK_STATUS_SENDZM.equals(sendChkMap.get(CHK_STATUS)))
				{
					// メール送信済
					printDebugLog("メール送信済のため送信対象外 " + editKeyLog(sqlMainMap) + " ■判定基準となった親番[" + wkStr + "]" + "] CASHPOST契約番号["
							+ sendChkMap.get(JBSbatKK_T_CASHPOST_KEI.CASHPOST_KEI_NO) + "]");
					return JKKStrConst.CD01335_SENDZM;
				}
				else if (shoriCashGrp.containsKey(wkStr))
				{
					// メール送信済
					printDebugLog("メール送信済のため送信対象外(今回送信対象) " + editKeyLog(sqlMainMap) + " ■判定基準となった親番[" + wkStr + "] CASHPOST契約番号["
							+ sendChkMap.get(JBSbatKK_T_CASHPOST_KEI.CASHPOST_KEI_NO) + "]");
					return JKKStrConst.CD01335_SENDZM;
				}
			}
		}

		return JKKStrConst.CD01335_SENDMI;
	}

	/**
	 * 送信先メールアドレスを取得する。
	 * 
	 * <br>
	 * @param sqlMainMap 処理中のCASHPOSTの情報
	 * @return メールアドレス
	 * @throws Exception
	 */
	private String getMailAddress(HashMap<String, String> sqlMainMap) throws Exception
	{

		//■ 契約先メールアドレス
		JBSbatCommonDBInterface opsvkeiInfo = geKeiyakuMailAdr(sqlMainMap);
		if (null == opsvkeiInfo)
		{
			//■ 連絡先メールアドレス
			executeCK_T_RRKS_KK_SELECT_011(new String[] { sqlMainMap.get(JBSbatKK_T_SVC_KEI.SYSID), this.opeDate });
			JBSbatCommonDBInterface rrksInfo = db_CK_T_RRKS.selectNext();
			if (null == rrksInfo)
			{
				return STR_EMPTY;
			}
			else
			{
				return rrksInfo.getString(JBSbatCK_T_RRKS.MLAD);
			}
		}
		else
		{
			return opsvkeiInfo.getString(JBSbatKK_T_OPSVKEI_ISP.MLAD);
		}
	}

	/**
	 * 契約先メールアドレスを取得する。（サービス契約番号）
	 * 
	 * <br>
	 * @param sqlMainMap 処理中のCASHPOSTの情報
	 * @throws Exception 
	 */
	private JBSbatCommonDBInterface geKeiyakuMailAdr(HashMap<String, String> sqlMainMap) throws Exception
	{
		JBSbatCommonDBInterface opsvkeiInfo = null;
		String svcCd = sqlMainMap.get(JBSbatKK_T_SVC_KEI.SVC_CD);
		String svcKeiNo = sqlMainMap.get(JBSbatKK_T_CASHPOST_KEI.SVC_KEI_NO);
		if (!JKKStrConst.CD00130_01.equals(svcCd))
		{
			// CASHPOST契約のレコードがeo光ネットでない場合
			svcKeiNo = sqlMainMap.get(NET_SVC_KEI_NO);
			printDebugLog("同一回線のネットでメールアドレス検索を実行 " + editKeyLog(sqlMainMap) + " ネットのサービス契約番号[" + svcKeiNo + "]");
		}
		executeKK_T_OPSVKEI_ISP_KK_SELECT_034(new String[] { svcKeiNo, this.opeDate });
		opsvkeiInfo = db_KK_T_OPSVKEI_ISP.selectNext();
		if (null != opsvkeiInfo)
		{
			return opsvkeiInfo;
		}
		return opsvkeiInfo;

	}

	/**
	 * 出力ファイルCLOSE。
	 * 
	 * <br>
	 * @throws Exception 
	 */
	private void outputFileClose() throws Exception
	{
		if (null != KKIFM945CaseFileObj)
		{
			JKKBatCommon.closeBusinessFileUtil(KKIFM945CaseFileObj);
		}
	}

	/**
	 * 出力ファイルCLOSE。
	 * 
	 * <br>
	 * @throws Exception 
	 */
	private void outputFileCloseCntFlg() throws Exception
	{
		if (null != KKIFM945CntFileObj)
		{
			JKKBatCommon.closeBusinessFileUtil(KKIFM945CntFileObj);
		}
		if (null != KKIFM945FlgFileObj)
		{
			JKKBatCommon.closeBusinessFileUtil(KKIFM945FlgFileObj);
		}
	}

	/**
	 * 対応履歴ファイル制御。
	 * 
	 * <br>
	 * @param timeStamp タイムスタンプ
	 * @throws Exception
	 */
	private void fileControl(String timeStamp) throws Exception
	{
		//■対応履歴CASEファイルを移動し、CASE件数ファイル、CASEフラグを作成
		if (0 == KKIFM945OutputCnt)
		{
			// 対応履歴レコードが０件の場合、作業ファイル削除。
			printInfoLog("[メイン処理]メール送信がないため、不要となった対応履歴ファイルを削除。" + KKIFM945FilePath1);
			deleteTmpFile(KKIFM945FilePath1);
		}
		else if (0 < KKIFM945OutputCnt)
		{
			printInfoLog("[メイン処理]対応履歴件数ファイル、フラグファイル作成 フォルダ：" + freeItems[FREE_IDX_TAIORIREKI]);
			createCaseFlgCnt(timeStamp, KKIFM945OutputCnt);
		}

	}

	/**
	 * CASEファイルを出力する。
	 * 
	 * <br>
	 * @param renkeiSysDate 作成日時
	 * @param inputRecMap 処理中レコード
	 * @param opeDateZenkaku 運用日付の全角編集文字
	 * @throws Exception
	 */
	private void createKKIFM945(String renkeiSysDate, HashMap<String, String> inputRecMap, String opeDateZenkaku) throws Exception
	{

		ArrayList<String> outputInfo = new ArrayList<String>();
		outputInfo.add(FILE_KNYSHA); //顧客タイプ
		outputInfo.add(inputRecMap.get(JBSbatKK_T_CASHPOST_KEI.SVC_KEI_NO)); //お客様ID
		outputInfo.add(STR_EMPTY); //顧客氏名
		outputInfo.add(STR_EMPTY); //顧客氏名（カナ）
		outputInfo.add(STR_EMPTY); //電話番号
		outputInfo.add(STR_EMPTY); //電話番号2
		outputInfo.add(STR_EMPTY); //郵便番号
		outputInfo.add(STR_EMPTY); //住所1
		outputInfo.add(STR_EMPTY); //住所2
		outputInfo.add(STR_EMPTY); //住所3
		outputInfo.add(STR_EMPTY); //性別
		outputInfo.add(STR_EMPTY); //生年月日
		outputInfo.add(FILE_CLOSE); //状態
		outputInfo.add(FILE_TRN); //ステータス
		outputInfo.add(renkeiSysDate); //作成日時
		outputInfo.add(OTHER_SYSTEM); //受付者
		outputInfo.add(OTHER_SYSTEM); //担当者
		outputInfo.add(STR_EMPTY); //キュー名
		outputInfo.add(FILE_TSYS); //受付種別

		//タイトル
		String title = FILE_TITLE.replace(REP_WORD, inputRecMap.get(CASE_CPNM));
		outputInfo.add(title); //タイトル
		outputInfo.add(STR_EMPTY); //カテゴリ１
		outputInfo.add(STR_EMPTY); //カテゴリ２
		outputInfo.add(STR_EMPTY); //カテゴリ３
		outputInfo.add(STR_EMPTY); //カテゴリ４
		outputInfo.add(STR_EMPTY); //カテゴリ５
		outputInfo.add(STR_EMPTY); //カテゴリ６
		outputInfo.add(STR_EMPTY); //カテゴリ７
		outputInfo.add(STR_EMPTY); //カテゴリ８
		outputInfo.add(STR_EMPTY); //カテゴリ９
		outputInfo.add(STR_EMPTY); //カテゴリ１０
		outputInfo.add(STR_EMPTY); //カテゴリ１１

		String toiawaseRireki = getToiawaseRireki(inputRecMap, opeDateZenkaku);
		outputInfo.add(toiawaseRireki); //問合せ履歴
		outputInfo.add(STR_EMPTY); //問合せ客番号
		outputInfo.add(STR_EMPTY); //eoID
		outputInfo.add(STR_EMPTY); //受付番号
		outputInfo.add(STR_EMPTY); //コールバック日時
		outputInfo.add(STR_EMPTY); //コールバック時間指定タイプ

		outputInfo.add(STR_EMPTY); //業務個別設定組織コード
		outputInfo.add(STR_EMPTY); //反響可能性フラグ
		outputInfo.add(STR_EMPTY); //対応部署

		JKKBatCommon.printDoubleQuoteBusinessFileUtil(KKIFM945CaseFileObj, outputInfo);

		KKIFM945OutputCnt++;

	}

	/**
	 * 問合せ履歴の編集を行う。
	 * 
	 * <br>
	 * @param inputRecMap 処理中レコード
	 * @param opeDateZenkaku 運用日付の全角編集文字
	 * @return 問合せ履歴
	 * @throws Exception
	 */
	private String getToiawaseRireki(HashMap<String, String> inputRecMap, String opeDateZenkaku) throws Exception
	{
		StringBuffer sb = new StringBuffer();

		String bnmen = FILE_BNMEN.replace(REP_WORD, inputRecMap.get(CASE_CPNM));
		sb.append(bnmen);
		sb.append(JKKStrConst.KAIGYO_CD);
		sb.append("メール送信日：");
		sb.append(opeDateZenkaku);
		sb.append(JKKStrConst.KAIGYO_CD);
		sb.append("送信先メールアドレス：");
		sb.append(inputRecMap.get(JBSbatCC_T_MLAD.MLAD));
		return sb.toString();
	}

	/**
	 * CASE件数ファイル、CASEフラグを作成する。
	 * 
	 * <br>
	 * @param timeStamp タイムスタンプ
	 * @param recordCount レコード件数
	 * @throws Exception
	 */
	private void createCaseFlgCnt(String timeStamp, int recordCount) throws Exception
	{
		// ■CASE件数ファイル
		KKIFM945FilePath2 =
				getFullPathName(freeItems[FREE_IDX_TAIORIREKI], KKIFM945_CASE_CASE_PREFIX, timeStamp, KKIFM945_CASE_CNT_SUFFIX, KKIFM945_CASE_CNT_EXT);
		// ファイルオブジェクトを生成する
		KKIFM945CntFileObj = JKKBatCommon.createBusinessFileUtil(KKIFM945FilePath2, ENCODE_SHIFT_JIS, JKKStrConst.LINE_SEPARATOR, JKKStrConst.COMMA);
		// CASE件数ファイルへ出力する。
		JCCBatCommon.printBusinessFileUtil(KKIFM945CntFileObj, String.valueOf(recordCount));
		JKKBatCommon.closeBusinessFileUtil(KKIFM945CntFileObj);

		printInfoLog("[メイン処理]対応履歴ファイル 件数ファイル作成：" + KKIFM945FilePath2);

		// ■CASEフラグ
		KKIFM945FilePath3 =
				getFullPathName(freeItems[FREE_IDX_TAIORIREKI], KKIFM945_CASE_CASE_PREFIX, timeStamp, KKIFM945_CASE_FLG_SUFFIX, KKIFM945_CASE_FLG_EXT);
		// ファイルオブジェクトを生成する
		KKIFM945FlgFileObj = JKKBatCommon.createBusinessFileUtil(KKIFM945FilePath3, ENCODE_SHIFT_JIS, JKKStrConst.LINE_SEPARATOR, JKKStrConst.COMMA);
		JKKBatCommon.closeBusinessFileUtil(KKIFM945FlgFileObj);
		printInfoLog("[メイン処理]対応履歴ファイル フラグファイル作成：" + KKIFM945FilePath3);

	}

	/**
	 * CASHPOST契約の登録、CASEファイル出力処理。
	 * 
	 * <br>
	 * @param inputRecMap 処理中レコード
	 * @param resultSend 登録メール送信フラグ設定値
	 * @param opeDate 登録メール作成年月日の設定値（null有り）
	 * @throws Exception
	 */
	private void cashpostInsert(HashMap<String, String> inputRecMap, String add_mail_send_flg, String add_mail_saksei_ymd) throws Exception
	{
		String cashPostKeiNo = inputRecMap.get(JBSbatKKIFM893.CASHPOST_KEI_NO);

		//■CASHPOST契約の更新
		//  全項目取得
		executeKK_T_CASHPOST_KEI_KK_SELECT_003(new String[] { cashPostKeiNo });
		JBSbatCommonDBInterface cashPost = db_KK_T_CASHPOST_KEI_SUB.selectNext();
		if (null == cashPost)
		{
			// EKKB0290AW『%1%が存在しませんでした。』（ありえない前提）
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0290AW,
					new String[] { "CASHPOST契約（CASHPOST契約番号[" + cashPostKeiNo + "]）" });
		}

		cashPost.setValue(JBSbatKK_T_CASHPOST_KEI.ADD_MAIL_SEND_FLG, add_mail_send_flg); // 登録メール送信フラグ
		cashPost.setValue(JBSbatKK_T_CASHPOST_KEI.ADD_MAIL_SAKSEI_YMD, add_mail_saksei_ymd); // 登録メール作成年月日
		executeKK_T_CASHPOST_KEI_KK_INSERT_003(cashPost);

	}

	/**
	 * CASHPOSTマスタ SQLKEY(KK_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:なし
	 * </pre>
	 * <p>
	 * @param sql ＳＱＬ
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_M_CASHPOST_KK_SELECT_001() throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		// DBアクセスを実行します
		db_KK_M_CASHPOST.selectBySqlDefine(paramList, KK_M_CASHPOST_KK_SELECT_001);
	}

	/**
	 * CASHPOSTマスタ SQLKEY(KK_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:なし
	 * </pre>
	 * <p>
	 * @param sql ＳＱＬ
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_M_CASHPOST_KK_SELECT_002() throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		// DBアクセスを実行します
		db_KK_M_CASHPOST.selectBySqlDefine(paramList, KK_M_CASHPOST_KK_SELECT_002);
	}

	/**
	 * CASHPOST契約 SQLKEY(KK_SELECT_006)でDBアクセスを行います。[メイン]<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 * 			運用日付
	 * 
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_CASHPOST_KEI_MAIN(Object[] setParam) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		for (int i = 0; i < setParam.length; i++)
		{
			paramList.setValue(setParam[i]);
		}

		// DBアクセスを実行します
		db_KK_T_CASHPOST_KEI_MAIN.selectBySqlDefine(paramList, KK_T_CASHPOST_KK_SELECT_005);
	}

	/**
	 * CASHPOST契約 SQLKEY(KK_SELECT_006)でDBアクセスを行います。[親番、送信済チェック]<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	サービス契約番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_CASHPOST_KEI_KK_SELECT_006(Object[] setParam) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		for (int i = 0; i < setParam.length; i++)
		{
			paramList.setValue(setParam[i]);
		}

		// DBアクセスを実行します
		db_KK_T_CASHPOST_KEI_SUB.selectBySqlDefine(paramList, KK_T_CASHPOST_KK_SELECT_006);
	}

	/**
	 * CASHPOST契約 SQLKEY(KK_SELECT_003)でDBアクセスを行います。[全項目取得]<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	サービス契約番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_CASHPOST_KEI_KK_SELECT_003(Object[] setParam) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		for (int i = 0; i < setParam.length; i++)
		{
			paramList.setValue(setParam[i]);
		}

		// DBアクセスを実行します
		db_KK_T_CASHPOST_KEI_SUB.selectBySqlDefine(paramList, KK_T_CASHPOST_KK_SELECT_003);
	}

	/**
	 * オプションサービス契約<ISP>をSQLKEY(KK_SELECT_034)で<br>
	 * DBアクセスを行います。<br>
	 * <p>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	サービス契約番号
	 *			運用日付
	 * </pre>
	 * <p>
	 * @param setParam バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_OPSVKEI_ISP_KK_SELECT_034(String[] setParam) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		for (int i = 0; i < setParam.length; i++)
		{
			paramList.setValue(setParam[i]);
		}

		db_KK_T_OPSVKEI_ISP.selectBySqlDefine(paramList, KK_T_OPSVKEI_ISP_KK_SELECT_034);
	}

	/**
	 * 連絡先をSQLKEY(KK_SELECT_008)で<br>
	 * DBアクセスを行います。<br>
	 * <p>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	SYSID
	 *			運用日付
	 * </pre>
	 * <p>
	 * @param setParam バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCK_T_RRKS_KK_SELECT_011(String[] setParam) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		for (int i = 0; i < setParam.length; i++)
		{
			paramList.setValue(setParam[i]);
		}

		db_CK_T_RRKS.selectBySqlDefine(paramList, CK_T_RRKS_KK_SELECT_011);
	}

	/**
	 * CASHPOST契約 SQLKEY(KK_INSERT_003)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数: CASHPOST契約
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_CASHPOST_KEI_KK_INSERT_003(JBSbatCommonDBInterface cashPost) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_KEI_NO)); // CASHPOST契約番号
		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_KEI_STAT)); // CASHPOST契約ステータス
		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.SVC_KEI_NO)); // サービス契約番号
		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_CD)); // CASHPOSTコード
		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.SOHU_AMNT)); // 送付金額
		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_RNKI_YMD)); // CASHPOST連携年月日
		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.MLAD)); // メールアドレス
		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.UKETORI_NINSHO_KEY)); // 受取認証キー
		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.ADD_DTM)); // 登録年月日時分秒
		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.ADD_OPEACNT)); // 登録オペレータアカウント
		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.ADD_UNYO_YMD)); // 登録運用年月日
		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.ADD_TRN_ID)); // 登録処理ID
		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_UK_NO)); // CASHPOST受付番号
		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_ENDTIME)); // CASHPOST応答日時
		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.SITE_KANRI_NO)); // サイト管理番号
		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_ADD_YMD)); // CASHPOST登録年月日
		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.ADD_MAIL_SEND_FLG)); // 登録メール送信フラグ
		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.ADD_MAIL_SAKSEI_YMD)); // 登録メール作成年月日
		paramList.setValue(cashPost.getString(JBSbatKK_T_CASHPOST_KEI.RPSRC_CASHPOST_KEI_NO)); // 付け替え元CASHPOST契約番号

		// DBアクセスを実行します
		db_KK_T_CASHPOST_KEI_SUB.executeBySqlDefine(paramList, KK_T_CASHPOST_KEI_KK_INSERT_003);
	}

	/**
	 * ファイル削除。
	 * 
	 * <br>
	 * @param tmpFilePath 削除するファイルのフルパス
	 * @return 
	 */
	private boolean deleteTmpFile(String tmpFilePath)
	{
		if (!JKKStringUtil.isNullBlank(tmpFilePath))
		{
			File tmpFile = new File(tmpFilePath);
			if (tmpFile != null && tmpFile.exists())
			{
				return tmpFile.delete();
			}
		}
		return true;
	}

	/**
	 * 運用日付の全角編集を行う。
	 * 
	 * <br>
	 * @param inDate 運用日付
	 * @return 運用日付の全角編集文字
	 */
	private String getOpeDateZenkaku(String inDate)
	{

		StringBuffer sb = new StringBuffer();
		sb.append(convertFull(inDate.substring(0, 4)));
		sb.append("年");
		sb.append(convertFull(inDate.substring(4, 6)));
		sb.append("月");
		sb.append(convertFull(inDate.substring(6, 8)));
		sb.append("日");
		return sb.toString();

	}

	/**
	 * メール送信情報格納処理です。<br>
	 * <p>
	 * @param sqlMainMap 処理中のCASHPOSTの情報
	 * @param opeDateZenkaku 運用日付の全角編集文字
	 * @throws Exception 業務サービス内で発生した例外全般。
	 * @throws IOException 
	 */
	private void mailSendInfoKakno(HashMap<String, String> sqlMainMap, String opeDateZenkaku) throws Exception
	{

		// メール送信情報格納Map
		HashMap<String, Object> infoMap = new HashMap<String, Object>();

		// 変数初期化
		String sysDateTime = null; // 処理日時分秒を取得
		String[] mail_to = new String[1]; // メール送信先アドレス

		// 処理日時分秒を取得
		sysDateTime = JCCBatCommon.getSysDateTimeStamp();

		// 送信予定年月日時分秒の設定
		infoMap.put(MAIL_SEND_RSV_DTM, sysDateTime);

		// メール送信パターンの設定（ディレイド）
		infoMap.put(MAIL_SEND_PATTERN_CD, MAIL_SEND_PATTERN_CD_02);

		// メールコードの設定
		infoMap.put(JBSbatCC_M_MAIL.MAIL_CD, sqlMainMap.get(MAIL_CD));

		// メール送信先アドレス（TO）の設定。
		mail_to[0] = sqlMainMap.get(JBSbatCC_T_MLAD.MLAD);
		infoMap.put(MLAD_TO, mail_to);

		// メール送信先アドレス表示名（TO）の設定。＜お客様名＞
		infoMap.put(MLAD_TO_NM, null);

		// 置換文字列_メール本文非定型部１の設定。
		infoMap.put(TEXT_HTK_CKAN_MOJI, new String[] {});

		mailSendExecute(commonItem, infoMap);

	}

	/**
	 * メール送信情報格納処理です。<br>
	 * <p>
	 * @param commonItem バッチ共通電文
	 * @param map パラメータ情報格納
	 * @return HashMap map 採番部品で発行した採番値をセットしたHashMap。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 * @throws IOException 
	 */
	private HashMap<String, Object> mailSendExecute(JBSbatCommonItem commonItem, HashMap<String, Object> map) throws Exception
	{
		// メール送信情報格納処理を呼び出します。
		HashMap<String, Object> result_map = JCCBatCommon.insertTMailSend(commonItem, map);

		return result_map;
	}

	/**
	 * 数値を全角文字に変更
	 * <br>
	 * @param inStr 数値
	 * @return 編集結果
	 */
	private String convertFull(String inStr)
	{
		String result = inStr;

		try
		{
			// 全角変換

			// 半角 → 全角
			StringBuilder sb = new StringBuilder(result);
			for (int i = 0; i < result.length(); i++)
			{
				char c = result.charAt(i);

				// 変換対象：0〜9
				if ((0x30 <= c && c <= 0x39))
				{
					sb.setCharAt(i, (char)(c + 0xFEE0));
				}
			}

			// 変換後の値を設定
			result = sb.toString();

		}
		catch (Exception e)
		{
			// 変換時にエラーの場合は変換しない
			result = inStr;
		}

		return result;
	}

	/**
	 * ログ出力ＫＥＹ情報
	 * 
	 * <br>
	 * @param inMap 処理中レコード
	 * @return 編集結果
	 */
	private String editKeyLog(JBSbatCommonDBInterface inMap)
	{
		return editKeyLog((HashMap<String, String>)inMap.getMap());
	}

	/**
	 * ログ出力ＫＥＹ情報
	 * 
	 * <br>
	 * @param inMap 処理中レコード
	 * @return 編集結果
	 */
	private String editKeyLog(HashMap<String, String> inMap)
	{
		return editKeyLog(inMap.get(JBSbatKK_T_SVC_KEI.SYSID), inMap.get(JBSbatKK_T_CASHPOST_KEI.SVC_KEI_NO), inMap
				.get(JBSbatKK_T_CASHPOST_KEI.CASHPOST_KEI_NO), inMap.get(JBSbatKK_T_CASHPOST_KEI.CASHPOST_CD));
	}

	/**
	 * ログ出力ＫＥＹ情報
	 * 
	 * <br>
	 * @param svcKeiNo サービス契約番号
	 * @param cashpostKeiNo CASHPOST契約番号
	 * @param cashpostCd CASHPOSTコード
	 * @return
	 */
	private String editKeyLog(String sysid, String svcKeiNo, String cashpostKeiNo, String cashpostCd)
	{
		StringBuffer msgStr = new StringBuffer();
		msgStr.append("ＳＹＳＩＤ[");
		msgStr.append(sysid);
		msgStr.append("] サービス契約番号[");
		msgStr.append(svcKeiNo);
		msgStr.append("] CASHPOST契約番号[");
		msgStr.append(cashpostKeiNo);
		msgStr.append("] CASHPOSTコード[");
		msgStr.append(cashpostCd);
		msgStr.append("]");
		return msgStr.toString();
	}

	/**
	 * 警告メッセージ出力。
	 * 
	 * <br>
	 * @param msgId メッセージID
	 * @param chngMsgStr メッセージ置換文字列
	 */
	private void printBusinessError(String msgId, String[] chngMsgStr)
	{
		if (chngMsgStr == null)
		{
			super.logPrint.printBusinessErrorLog(msgId);
		}
		else
		{
			super.logPrint.printBusinessErrorLog(msgId, chngMsgStr);
		}
	}

	/**
	 * 情報メッセージ出力
	 * 
	 * <br>
	 * @param msg メッセージ
	 */
	private void printInfoLog(String msg)
	{
		super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1200AI, new String[] { msg });
	}

	/**
	 * デバッグメッセージ出力
	 * 
	 * <br>
	 * @param msg メッセージ
	 */
	private void printDebugLog(String msg)
	{
		super.logPrint.printDebugLog("***** " + msg);
	}

}
