/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCKOptinMailRsvSetChg
*	ソースファイル名	：JBSbatCKOptinMailRsvSetChg.java
*	作成者				：富士通　
*	作成日				：2024年05月29日
*＜機能概要＞
*　オプトインメール受信設定変更処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v71.00.00	2024/05/29   GDC)J.Zabala		【ANK-4584-00-00】Gmail迷惑メール対策強化に伴うワンクリック購読解除実現　新規作成
*********************************************************************/
package eo.business.service;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import eo.business.common.JACbatRknBusinessUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JCKBatCommon;
import eo.business.common.JKKBatCommon;
import eo.business.common.JKKBatConst;
import eo.business.util.table.JBSbatCK_T_CUST;
import eo.business.util.table.JBSbatCK_T_OPTINM_RCV_SET;
import eo.business.util.table.JBSbatZM_M_WORK_PARAM_KNRI;
import eo.common.constant.JACStrConst;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatBusinessFileUtil;
import eo.framework.util.JBSbatCheckUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCKOptinMailRsvSetChg extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(オプトインメール受信設定)*/
	private static final String D_TBL_NAME_CK_T_OPTINM_RCV_SET = "CK_T_OPTINM_RCV_SET";

	/** テーブル(お客様)*/
	private static final String D_TBL_NAME_CK_T_CUST = "CK_T_CUST";

	/** テーブル(業務パラメータ管理)*/
	private static final String D_TBL_NAME_ZM_M_WORK_PARAM_KNRI = "ZM_M_WORK_PARAM_KNRI";

	/** SQL定義キー(CK_SELECT_903)*/
	private static final String CK_T_OPTINM_RCV_SET_CK_SELECT_903 = "CK_SELECT_903";

	/** SQL定義キー(CK_SELECT_021)*/
	private static final String CK_T_CUST_CK_SELECT_021 = "CK_SELECT_021";

	/** SQL定義キー(KK_SELECT_016)*/
	private static final String ZM_M_WORK_PARAM_KNRI_KK_SELECT_016 = "KK_SELECT_016";

	/** テーブルアクセスクラス(オプトインメール受信設定)*/
	private JBSbatSQLAccess db_CK_T_OPTINM_RCV_SET = null;

	/** テーブルアクセスクラス(お客様)*/
	private JBSbatSQLAccess db_CK_T_CUST = null;
	
	/** テーブルアクセスクラス(業務パラメータ管理)*/
	private JBSbatSQLAccess db_ZM_M_WORK_PARAM_KNRI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 業務パラメータID:オプトインメール番号 */
	private static final String WORK_PARAM_ID_CK_ONE_C_R_OPTINM_NO = "CK_ONE_C_R_OPTINM_NO"; 
	
	/** オプトインメール番号 */
	private String optInEmailNo = null;
	
	/** スキップされる電子メール ドメイン */
	private static final String MLAD_DOMAIN_MINEO_JP = "@mineo.jp";
	
	/** オプトインメール番号(-) */
	private static final String OPTIN_EMAIL_NO_DASH = "-";
		
	/** ファイル連携先ディレクトリ定義キー */
	private static final String CR_FILE_DIR_KEY = "CR_TWS_RK_FILE_DIR";
	
	/** 改行コード */
	private static final String RETURN_CODE  = "\r\n";
	
	/** ダブルクォーテーション*/
	private static final String S_DUBLLEQ = "\"";
	
	/** CASEファイルオブジェクト*/
	private JBSbatBusinessFileUtil caseCvsFileObj = null;
	
	/** CASE件数ファイルオブジェクト*/
	private JBSbatBusinessFileUtil caseCntFileObj = null;
	
	/** CASEフラグファイルオブジェクト*/
	private JBSbatBusinessFileUtil caseFlgFileObj = null;
	
	/** CASEファイル出力件数 */
	private long caseFileCount = 0;
	
	/** 格納先ディレクトリ */
	private String crFileDir = null;
	
	/** 日時情報 */
	private String sSysData = null;
	
	/** メール用件区分: 104 */
	private static final String MAIL_YOKEN_KBN_CD_104 = "104";
	/** メール用件区分: 105 */
	private static final String MAIL_YOKEN_KBN_CD_105 = "105";
	/** メール用件区分: 106 */
	private static final String MAIL_YOKEN_KBN_CD_106 = "106";
	/** メール用件区分: 107 */
	private static final String MAIL_YOKEN_KBN_CD_107 = "107";
	
	/** メール用件区分: セキュリティーに関するお知らせ */
	private static final String MAIL_YOKEN_KBN_NM_104 = "セキュリティーに関するお知らせ";
	/** メール用件区分: プロバイダサービスに関するお知らせ */
	private static final String MAIL_YOKEN_KBN_NM_105 = "プロバイダサービスに関するお知らせ";
	/** メール用件区分: 新サービスのご案内 */
	private static final String MAIL_YOKEN_KBN_NM_106 = "新サービスのご案内";
	/** メール用件区分: お得な情報、サービス、キャンペーンに関するお知らせ */
	private static final String MAIL_YOKEN_KBN_NM_107 = "お得な情報、サービス、キャンペーンに関するお知らせ";
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CK_T_OPTINM_RCV_SET = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CK_T_OPTINM_RCV_SET);
		db_CK_T_CUST = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CK_T_CUST);
		db_ZM_M_WORK_PARAM_KNRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_WORK_PARAM_KNRI);
		
		// 業務パラメータ管理から更新対象となるオプトインメール番号を取得する。
		String[] setWorkParamKnriParam = 
		{
			WORK_PARAM_ID_CK_ONE_C_R_OPTINM_NO,				// 業務パラメータID
			super.opeDate,				// 運用日
			super.opeDate,				// 運用日
		};
		executeZM_M_WORK_PARAM_KNRI_KK_SELECT_016(setWorkParamKnriParam);
		JBSbatCommonDBInterface dbInfoWorkParamKnri = new JBSbatCommonDBInterface();
		if(null != (dbInfoWorkParamKnri = db_ZM_M_WORK_PARAM_KNRI.selectNext()))
		{
			optInEmailNo = dbInfoWorkParamKnri.getString(JBSbatZM_M_WORK_PARAM_KNRI.WORK_PARAM_SETTE_VALUE);
		}
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// 格納先ディレクトリ情報を取得する
		crFileDir = JKKBatCommon.getApplicationConst(CR_FILE_DIR_KEY) + "/";
		// ファイル名に使用する日時情報(yyyymmddhhmmss)を取得する
		sSysData = JKKBatCommon.getSysDateTime().substring(0, 14);
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{	
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		try 
		{
			// (1) チェック処理
			// (1)-1 オプトインメール受信設定変更要求情報を読込む。
			
			// 1レコード目はヘッダ行のため読み飛ばし
			if (commonItem.getInputCount() == 1) {
				return null;
			}
			
			// (1)-2 必須、形式、桁数チェックを行う。
			boolean rtn = isSingleCheck(inMap.getMap());
			if (!rtn) 
			{
				commonItem.setErrorCount(1);
				return null;
			}
			
			// 配信解除要求メールアドレス
			String mlad = (String)inMap.get("HAISIN_RLS_YOKYU_MLAD");
			// メール用件区分
			String mailYokenKbn = (String)inMap.get("MAIL_YOKEN_KBN");
			// 配信解除要求日時
			String haisinRlsYokyuDtm = (String)inMap.get("HAISIN_RLS_YOKYU_DATE");
			
			// (1)-3 配信解除要求メールアドレスのmineoチェックを行う。
			
			// 連携された配信解除要求メールアドレスのドメイン部が「@mineo.jp」の場合、以下の処理を全てスキップし、
			// INFOログにmineoメールアドレスであるため処理をスキップした旨を出力し、次レコードの処理に進む。
			if (mlad.endsWith(MLAD_DOMAIN_MINEO_JP)) 
			{
				commonItem.getLogPrint().printBusinessErrorLog("ECKB0070KI", new String[]{ 
						commonItem.getInputCount() + "", "連携された配信解除要求メールアドレスがmineoメールアドレス", ""});
				return null;
			}
			
			// (1)-4 オプトインメール番号チェックを行う。
			
			// 連携されたオプトインメール番号が"-(ハイフン)"、もしくは取得した業務パラメータの値以外の場合、以下の処理を全てスキップし、
			// INFOログに受信設定変更対象外のオプトインメール番号であったため処理スキップした旨を出力し、次レコードの処理に進む。
			if (!(JBSbatCKOptinMailRsvSetChg.OPTIN_EMAIL_NO_DASH.equals(mailYokenKbn) || this.optInEmailNo.contains(mailYokenKbn))) 
			{
				commonItem.getLogPrint().printBusinessErrorLog("ECKB0070KI", new String[]{ 
						commonItem.getInputCount() + "", "連携されたオプトインメール番号が受信設定対象外のオプトインメール番号", ""});
				return null;
			}
			
			// (1)-5 有効なメールアドレスの存在チェックを行う。
			
			// 連携されたメールアドレスとオプトインメール番号をKEYとして、オプトインメール受信設定テーブル、連絡先テーブル、オプションサービス契約テーブルを
			// 検索し、検索結果が取得できなかった場合、INFOログに有効メールアドレスが存在しない旨を出力し、次レコードの処理に進む。
			
			String optInEmailNoParam = mailYokenKbn;
			// 連携されたオプトインメール番号が"-(ハイフン)"の場合、検索のKEYとなるオプトインメール番号は取得した業務パラメータの値を使用する。
			if (OPTIN_EMAIL_NO_DASH.equals(optInEmailNoParam)) 
			{
				optInEmailNoParam = this.optInEmailNo;
			}
			
			// SQL定義キー(CK_SELECT_903)を実行する
			String [] selectParamRr = { mlad, optInEmailNoParam };
			executeCK_T_OPTINM_RCV_SET_CK_SELECT_903(selectParamRr);
			
			// オプトインメール受信設定データ一覧
			List<HashMap<String, Object>> optinmRcvSetMapList = new ArrayList<HashMap<String, Object>>();
			
			// (1)-6 配信解除要求日時チェックを行う。
			JBSbatCommonDBInterface optinmRcvSetMapTemp = new JBSbatCommonDBInterface();
			while ((optinmRcvSetMapTemp = db_CK_T_OPTINM_RCV_SET.selectNext()) != null) 
			{
				optinmRcvSetMapList.add(optinmRcvSetMapTemp.getMap());
			}
			
			// 検索し、検索結果が取得できなかった場合、INFOログに有効メールアドレスが存在しない旨を出力し、次レコードの処理に進む。
			if (optinmRcvSetMapList.isEmpty()) {
				commonItem.getLogPrint().printBusinessErrorLog("ECKB0070KI", new String[]{ 
						commonItem.getInputCount() + "", "有効メールアドレスが未存在", ""});
				return null;
			}
			
			// ケースファイル作成のために処理されたSYSIDのリスト
			List<String> sysIds = new ArrayList<String>();
			
			for (HashMap<String, Object> optinmRcvSetMap : optinmRcvSetMapList)
			{
				// 配信解除要求日時チェックフラグ
				String dtmChkFlg = "0";
				
				// 世代登録年月日
				String geneAddDtm = (String) optinmRcvSetMap.get(JBSbatCK_T_OPTINM_RCV_SET.GENE_ADD_DTM);
				
				// (1)-5で取得した検索結果の世代登録年月日が、連携された配信解除要求日時よりも後になっている場合、チェック結果NGとして
				// (2)の処理を実行せず、INFOログに排他制御により更新スキップした旨を出力する。その後CASEファイル出力処理に進む。
				if (geneAddDtm.compareTo(haisinRlsYokyuDtm) > 0) {
					commonItem.getLogPrint().printBusinessErrorLog("ECKB0070KI", new String[]{ 
							commonItem.getInputCount() + "", "オプトインメール番号：" + optinmRcvSetMap.get(JBSbatCK_T_OPTINM_RCV_SET.OPTINM_NO) 
									+ " 連携された配信解除要求日時が最新の受信設定よりも過去", ""});
					
					// 配信解除要求日時チェックフラグに'1'を設定する。
					dtmChkFlg = "1";
				}
				
				// (2) DB更新処理
				if (!dtmChkFlg.equals("1")) 
				{
					// (2)-1 オプトインメール受信設定の登録
					registerOptinMailRsvSetChg(optinmRcvSetMap);
				}
				
				// (1)-5の検索によって複数のSYSIDが取得されていた場合、取得された全てのSYSIDに対応するCASEファイルをそれぞれ出力する。
				String sysId = (String) optinmRcvSetMap.get(JBSbatCK_T_OPTINM_RCV_SET.SYSID);
				if (!sysIds.contains(sysId)) 
				{
					// CASEファイル出力処理
					createOptinMailRsvSetChgCaseFile(sysId, dtmChkFlg, inMap.getMap());
					
					sysIds.add(sysId);
				}
			}
			
			return null;
		}
		catch (Exception ex)
		{
			commonItem.getLogPrint().printBusinessErrorLog("ECKB0070KI", new String[]{ 
					commonItem.getInputCount() + "", "発生した例外内容",  ex.getMessage() });
			commonItem.setErrorCount(1);
			return null;
		}
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CK_T_OPTINM_RCV_SET.close();
		db_CK_T_CUST.close();
		db_ZM_M_WORK_PARAM_KNRI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		if (caseCvsFileObj != null)
		{
			// CASE件数
			String caseCntFile = crFileDir + "CASE_OPTINMAIL_" + sSysData + "_CNT.TXT";
			// CASEフラグファイル
			String caseFlgFile = crFileDir + "CASE_OPTINMAIL_" + sSysData + "_FTP.FLG";
			
			// CASE件数ファイルを生成する。
			caseCntFileObj = JCCBatCommon.createBusinessFileUtil(caseCntFile, JKKBatConst.SJIS, JKKBatConst.S_LINE_SEPARAOR_CRLF, JKKBatConst.SPACE);
			
			// CASE件数ファイルへ出力する。
			JCCBatCommon.printBusinessFileUtil(caseCntFileObj, JKKBatConst.S_DBL_QUOT + String.valueOf(caseFileCount) + JKKBatConst.S_DBL_QUOT);
			
			// CASEフラグファイルを生成する。
			caseFlgFileObj = JCCBatCommon.createBusinessFileUtil(caseFlgFile, JKKBatConst.SJIS, JKKBatConst.SPACE, JKKBatConst.SPACE);
		}
		
		// ファイルを閉じる
		closeFileObj();
		
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	private void executeCK_T_OPTINM_RCV_SET_CK_SELECT_903(Object[] param) throws Exception
	{
		// SQL定義キーを指定してSQL文を取得
		String sqlBf = db_CK_T_OPTINM_RCV_SET.getSql(CK_T_OPTINM_RCV_SET_CK_SELECT_903);
		
		// IN句の対象数を変更（OPTINM_NO）
		String[] optinmNoList = param[1].toString().split(",");
		String placeHolder = "?";
		StringBuffer placeHolderSb = new StringBuffer();
		for (int a = 0; a < optinmNoList.length; a++)
		{
			if (a > 0)
			{
				placeHolderSb.append(JACStrConst.COMMA);
			}
			placeHolderSb.append(placeHolder);
		}
		// 加工対象の文字列
		String sqlConBf = "OPTINM_NO IN (?)";
		String sqlConAf = sqlConBf.replace(placeHolder, placeHolderSb.toString());
		
		// SQLを置き換える
		HashMap<String, String> tgt = new HashMap<String, String>();
		tgt.put(sqlConBf, sqlConAf);
		
		String sqlAf = JACbatRknBusinessUtil.ckanUmeMojiHanyo(sqlBf, tgt);
		
		// SQL定義キーを指定し、加工したSQLをセット
		db_CK_T_OPTINM_RCV_SET.setSqlMap(CK_T_OPTINM_RCV_SET_CK_SELECT_903, sqlAf);
		
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[0].toString());
		for (int a = 0; a < optinmNoList.length; a++)
		{
			paramList.setValue(optinmNoList[a]);
		}
		paramList.setValue(super.opeDate);
		paramList.setValue(param[0].toString());
		paramList.setValue(param[0].toString());
		for (int a = 0; a < optinmNoList.length; a++)
		{
			paramList.setValue(optinmNoList[a]);
		}
		paramList.setValue(super.opeDate);
		paramList.setValue(param[0].toString());
		
		// DBアクセスを実行します
		db_CK_T_OPTINM_RCV_SET.selectBySqlDefine(paramList, CK_T_OPTINM_RCV_SET_CK_SELECT_903);
		
		// SQL文のIN句の対象数を元の状態に戻す
		db_CK_T_OPTINM_RCV_SET.setSqlMap(CK_T_OPTINM_RCV_SET_CK_SELECT_903, sqlBf);
	}
	
	/**
	 * SQLKEY(KK_SELECT_016)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	業務パラメータID
	 *		 	バッチ運用日付
	 *		 	バッチ運用日付
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_M_WORK_PARAM_KNRI_KK_SELECT_016(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_ZM_M_WORK_PARAM_KNRI.selectBySqlDefine(paramList, ZM_M_WORK_PARAM_KNRI_KK_SELECT_016);
	}
	
	/**
	 * SQLKEY(CK_SELECT_021)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCK_T_CUST_CK_SELECT_021(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(super.opeDate);

		// DBアクセスを実行します
		db_CK_T_CUST.selectBySqlDefine(paramList, CK_T_CUST_CK_SELECT_021);
	}

	/**
	 * PK(全項目登録)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	オプトインメール番号				OPTINM_NO
	 *		 	ＳＹＳＩＤ				SYSID
	 *		 	メールアドレス				MLAD
	 *		 	世代登録年月日時分秒				GENE_ADD_DTM
	 *		 	オプトインメール受信設定ステータス				OPTINM_RCV_SETTE_STAT
	 *		 	受信区分				RCV_DIV
	 *		 	受信設定年月日				RCV_SETTE_YMD
	 *		 	受信解除年月日				RCV_RLS_YMD
	 *		 	オプトインメール受信設定無効年月日				OPTINM_RCV_SETTE_MK_YMD
	 *		 	オプトインメール受信設定回復年月日				OPTINM_RCV_SETTE_KAIHK_YMD
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCK_T_OPTINM_RCV_SET_PKINSERT(Object[] setParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue(JBSbatCK_T_OPTINM_RCV_SET.OPTINM_NO, setParam[0]);
		setMap.setValue(JBSbatCK_T_OPTINM_RCV_SET.SYSID, setParam[1]);
		setMap.setValue(JBSbatCK_T_OPTINM_RCV_SET.MLAD, setParam[2]);
		setMap.setValue(JBSbatCK_T_OPTINM_RCV_SET.GENE_ADD_DTM, setParam[3]);
		setMap.setValue(JBSbatCK_T_OPTINM_RCV_SET.OPTINM_RCV_SETTE_STAT, setParam[4]);
		setMap.setValue(JBSbatCK_T_OPTINM_RCV_SET.RCV_DIV, setParam[5]);
		setMap.setValue(JBSbatCK_T_OPTINM_RCV_SET.RCV_SETTE_YMD, setParam[6]);
		setMap.setValue(JBSbatCK_T_OPTINM_RCV_SET.RCV_RLS_YMD, setParam[7]);
		setMap.setValue(JBSbatCK_T_OPTINM_RCV_SET.OPTINM_RCV_SETTE_MK_YMD, setParam[8]);
		setMap.setValue(JBSbatCK_T_OPTINM_RCV_SET.OPTINM_RCV_SETTE_KAIHK_YMD, setParam[9]);
	
		// DBアクセスを実行します
		db_CK_T_OPTINM_RCV_SET.insertByPrimaryKeys(setMap);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲
	 * @throws Exception */
	
	/**
	 * オプトインメール受信設定の登録について
	 */
	private void registerOptinMailRsvSetChg(HashMap<String, Object> optinmRcvSetMap) throws Exception
	{
		Object[] insertParam = new Object[]{
			optinmRcvSetMap.get(JBSbatCK_T_OPTINM_RCV_SET.OPTINM_NO),
			optinmRcvSetMap.get(JBSbatCK_T_OPTINM_RCV_SET.SYSID),
			optinmRcvSetMap.get(JBSbatCK_T_OPTINM_RCV_SET.MLAD),
			JCKBatCommon.getSysDateTimeStamp(),
			optinmRcvSetMap.get(JBSbatCK_T_OPTINM_RCV_SET.OPTINM_RCV_SETTE_STAT),
			"0",
			optinmRcvSetMap.get(JBSbatCK_T_OPTINM_RCV_SET.RCV_SETTE_YMD),
			"",
			optinmRcvSetMap.get(JBSbatCK_T_OPTINM_RCV_SET.OPTINM_RCV_SETTE_MK_YMD),
			optinmRcvSetMap.get(JBSbatCK_T_OPTINM_RCV_SET.OPTINM_RCV_SETTE_KAIHK_YMD)
		};
		executeCK_T_OPTINM_RCV_SET_PKINSERT(insertParam);
	}
	
	/**
	 * 入力情報（オプトインメール受信設定変更要求情報）の単項目チェックを行います。
	 * @param inMap オプトインメール受信設定変更要求情報を格納されたHashMap。
	 * @return  boolean trueである場合、エラーはありません。falseである場合、エラーが発生しました。
	 */
	private boolean isSingleCheck(HashMap<String, Object> inMap) 
	{
		// 単項目チェックを行います
		String strValue = null;
		
		// ファイル内行数
		String lineNumber = commonItem.getInputCount() + "";
		
		// 配信解除要求メールアドレスチェック
		strValue = (String)inMap.get("HAISIN_RLS_YOKYU_MLAD");
		
		// 必須チェック
		if(strValue == null || "".equals(strValue)) 
		{
			commonItem.getLogPrint().printBusinessErrorLog("ECKB0060TW", new String[]{ lineNumber });
			return false;
		}
		// 形式チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[]{ "e-mail" })) 
		{
			commonItem.getLogPrint().printBusinessErrorLog("ECKB0060TW", new String[]{ lineNumber });
			return false;
		}
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "3", "256"})) 
		{
			commonItem.getLogPrint().printBusinessErrorLog("ECKB0060TW", new String[]{ lineNumber });
			return false;
		}
		
		// 配信解除要求日時チェック
		strValue = (String)inMap.get("MAIL_YOKEN_KBN");
		
		// 必須チェック
		if(strValue == null || "".equals(strValue)) 
		{
			commonItem.getLogPrint().printBusinessErrorLog("ECKB0060TW", new String[]{ lineNumber });
			return false;
		}
		
		// 形式チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[]{ "hannkakuesuuji3" }) && !OPTIN_EMAIL_NO_DASH.equals(strValue)) 
		{
			commonItem.getLogPrint().printBusinessErrorLog("ECKB0060TW", new String[]{ lineNumber });
			return false;
		}
		
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "1", "3"})) 
		{
			commonItem.getLogPrint().printBusinessErrorLog("ECKB0060TW", new String[]{ lineNumber });
			return false;
		}
		
		// メール用件区分チェック
		strValue = (String)inMap.get("HAISIN_RLS_YOKYU_DATE");
		
		// 必須チェック
		if(strValue == null || "".equals(strValue)) 
		{
			commonItem.getLogPrint().printBusinessErrorLog("ECKB0060TW", new String[]{ lineNumber });
			return false;
		}
		
		// 形式チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[]{ "day_hour4" })) 
		{
			commonItem.getLogPrint().printBusinessErrorLog("ECKB0060TW", new String[]{ lineNumber });
			return false;
		}
		
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu1", "14"})) 
		{
			commonItem.getLogPrint().printBusinessErrorLog("ECKB0060TW", new String[]{ lineNumber });
			return false;
		}
		
		return true;
	}
	
	/**
	 * CASEファイルを生成する
	 * 
	 * @param sysId
	 * @param dtmChkFlg
	 * @param inMap
	 * @throws Exception
	 */
	private void createOptinMailRsvSetChgCaseFile(String sysId, String dtmChkFlg, HashMap<String, Object> inMap) throws Exception
	{
		if(caseCvsFileObj == null)
		{
			// CASECSVファイル
			String caseCvsFile = crFileDir + "CASE_OPTINMAIL_" + sSysData + ".CSV";
			// CASECSVファイルを生成する。
			caseCvsFileObj = JCCBatCommon.createBusinessFileUtil(caseCvsFile, 
				JKKBatConst.SJIS, RETURN_CODE, JKKBatConst.CONMA);
		}
		
		// 状態
		String status = "クローズ";
		// タイトル
		String title = "お知らせメールワンクリック配信解除実施に伴うメール受信設定変更";
		// 問合せ履歴
		String queryHist = getQueryHistory(dtmChkFlg, inMap);
		
		// CASEファイル出力リスト
		ArrayList<String> outputDataList = new ArrayList<String>();
		outputVal("加入者", outputDataList); // 顧客タイプ
		outputVal("ZZZZZZZZZZ", outputDataList); // お客様ID
		outputVal("", outputDataList); // 顧客氏名
		outputVal("", outputDataList); // 顧客氏名（カナ）
		outputVal("", outputDataList); // 電話番号
		outputVal("", outputDataList); // 電話番号２
		outputVal("", outputDataList); // 郵便番号 
		outputVal("", outputDataList); // 住所
		outputVal("", outputDataList); // 住所２
		outputVal("", outputDataList); // 住所３
		outputVal("", outputDataList); // 性別
		outputVal("", outputDataList); // 生年月日
		outputVal(status, outputDataList); // 状態
		outputVal("処理中", outputDataList); // ステータス 
		
		// 作成日時
		StringBuffer dateBuffer = new StringBuffer();
		
		// システム日時
		String sysDateTime = JCKBatCommon.getSysDateTime();
		dateBuffer.append(sysDateTime.substring(0, 4));
		dateBuffer.append("/");
		dateBuffer.append(sysDateTime.substring(4, 6));
		dateBuffer.append("/");
		dateBuffer.append(sysDateTime.substring(6, 8));
		dateBuffer.append(" ");
		dateBuffer.append(sysDateTime.substring(8, 10));
		dateBuffer.append(":");
		dateBuffer.append(sysDateTime.substring(10, 12));
		dateBuffer.append(":");
		dateBuffer.append(sysDateTime.substring(12, 14));
		
		outputVal(dateBuffer.toString(), outputDataList); //作成日時
		outputVal(super.batchUserId, outputDataList); // 受付者
		outputVal(super.batchUserId, outputDataList); // 担当者
		outputVal("", outputDataList); // キュー名
		outputVal("他システム", outputDataList); // 受付種別
		outputVal(title, outputDataList); // タイトル
		outputVal("", outputDataList); // カテゴリ１
		outputVal("", outputDataList); // カテゴリ２
		outputVal("", outputDataList); // カテゴリ３
		outputVal("", outputDataList); // カテゴリ４
		outputVal("", outputDataList); // カテゴリ５
		outputVal("", outputDataList); // カテゴリ６
		outputVal("", outputDataList); // カテゴリ７
		outputVal("", outputDataList); // カテゴリ８
		outputVal("", outputDataList); // カテゴリ９
		outputVal("", outputDataList); // カテゴリ１０
		outputVal("", outputDataList); // カテゴリ１１
		outputVal(queryHist, outputDataList); // 問合せ履歴
		outputVal("", outputDataList); // 問合せ客ID
		outputVal(this.getEoId(sysId), outputDataList); // eoID
		outputVal("", outputDataList); // 申込書番号
		outputVal("", outputDataList); // エスカレーション日時
		outputVal("", outputDataList); // コールバック時間指定タイプ
		outputVal("", outputDataList); // 業務個別設定組織コード
		
		// 出力件数カウントアップ
		caseFileCount++;
		
		// CASECSVファイルへ出力する。
		JCCBatCommon.printBusinessFileUtil(caseCvsFileObj, outputDataList);
		
	}
	
	/**
	 * SYSIDをキーとして、お客様.eoIDを取得する (CK_SELECT_021)
	 * @param sysId ＳＹＳＩＤ 
	 * @return ｅｏＩＤ 
	 * @throws Exception
	 */
	private String getEoId(String sysId) throws Exception
	{
		this.executeCK_T_CUST_CK_SELECT_021(new Object[]{ sysId });
		JBSbatCommonDBInterface record = db_CK_T_CUST.selectNext();
		return record.getString(JBSbatCK_T_CUST.EOID);
	}
	
	/**
	 * 出力用文字列の作成処理です。
	 *
	 * @param value 対象文字列
	 * @param list 出力対象リスト
	 * @return 対象文字列の結合情報
	 */
	private static List<String> outputVal(String value, List<String> list)
	{
		list.add(S_DUBLLEQ + value + S_DUBLLEQ);
		return list;
	}
	/**
	 * 問合せ履歴を生成する
	 * 
	 * @param dtmChkFlg 配信解除要求日時チェックフラグ
	 * @param inMap 入力電文
	 * @return
	 * @throws ParseException 
	 */
	private String getQueryHistory(String dtmChkFlg, HashMap<String, Object> inMap) throws ParseException
	{
		// 配信解除要求メールアドレス
		String mlad = (String)inMap.get("HAISIN_RLS_YOKYU_MLAD");
		// メール用件区分
		String mailYokenKbn = (String)inMap.get("MAIL_YOKEN_KBN");
		// 配信解除要求日時
		String haisinRlsYokyuDtm = (String)inMap.get("HAISIN_RLS_YOKYU_DATE");
		
		DateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
		Date dtm1 = sdf.parse(haisinRlsYokyuDtm);
		
		DateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		String formattedHaisinRlsYokyuDtm = sdf1.format(dtm1);
		
		StringBuffer sb = new StringBuffer();
		sb.append("下記メールアドレスへ配信したお知らせメールにてワンクリック配信解除要求が実施されたため、メール受信設定について以下の通り処理しています。");
		sb.append(JBSbatCKOptinMailRsvSetChg.RETURN_CODE);
		sb.append(JBSbatCKOptinMailRsvSetChg.RETURN_CODE);
		sb.append("[メールアドレス]");
		sb.append(JBSbatCKOptinMailRsvSetChg.RETURN_CODE);
		sb.append(mlad);
		sb.append(JBSbatCKOptinMailRsvSetChg.RETURN_CODE);
		sb.append(JBSbatCKOptinMailRsvSetChg.RETURN_CODE);
		sb.append("[配信解除要求受付日時]");
		sb.append(JBSbatCKOptinMailRsvSetChg.RETURN_CODE);
		sb.append(formattedHaisinRlsYokyuDtm);
		sb.append(JBSbatCKOptinMailRsvSetChg.RETURN_CODE);
		sb.append("※上記はeo顧客にて要求を受け付けた日時となり、お客様による実施時間とは最大5分程度の差が生じている場合があります。");
		sb.append("　詳細時間の確認が必要な場合、システム管理者までお問合せ下さい。");
		sb.append(JBSbatCKOptinMailRsvSetChg.RETURN_CODE);
		sb.append(JBSbatCKOptinMailRsvSetChg.RETURN_CODE);
		sb.append("[メール受信設定変更内容]");
		sb.append(JBSbatCKOptinMailRsvSetChg.RETURN_CODE);
		
		if (dtmChkFlg.equals("1")) 
		{
			sb.append("要求受付後、お客様によるメール受信設定変更を確認したため、配信解除を未実施としました。");
			if (!JBSbatCKOptinMailRsvSetChg.OPTIN_EMAIL_NO_DASH.equals(mailYokenKbn))
			{
				sb.append(JBSbatCKOptinMailRsvSetChg.RETURN_CODE);
				sb.append(JBSbatCKOptinMailRsvSetChg.RETURN_CODE);
				sb.append(this.getMailItemCategory(mailYokenKbn));
			}
		}
		else 
		{
			sb.append("下記のメール受信設定について、設定解除を実施しました。");
			sb.append(JBSbatCKOptinMailRsvSetChg.RETURN_CODE);
			sb.append(JBSbatCKOptinMailRsvSetChg.RETURN_CODE);
			if (JBSbatCKOptinMailRsvSetChg.OPTIN_EMAIL_NO_DASH.equals(mailYokenKbn))
			{
				sb.append("セキュリティーに関するお知らせ");
				sb.append(JBSbatCKOptinMailRsvSetChg.RETURN_CODE);
				sb.append("プロバイダサービスに関するお知らせ");
				sb.append(JBSbatCKOptinMailRsvSetChg.RETURN_CODE);
				sb.append("新サービスのご案内");
				sb.append(JBSbatCKOptinMailRsvSetChg.RETURN_CODE);
				sb.append("お得な情報、サービス、キャンペーンに関するお知らせ");
			}
			else
			{
				sb.append(this.getMailItemCategory(mailYokenKbn));
			}
		}
		return sb.toString();
	}

	
	/**
	 * OMS/XDPから受信した「メール用件区分」に紐づく名称
	 * 
	 * @param mailYokenKbn メール用件区分
	 * @return メール用件区分に紐づく名称
	 */
	private String getMailItemCategory(String mailYokenKbn) 
	{
		String mailItemCategoryNm = null;
		
		// メール用件区分: 104 
		if (mailYokenKbn.equals(JBSbatCKOptinMailRsvSetChg.MAIL_YOKEN_KBN_CD_104))
		{
			mailItemCategoryNm = JBSbatCKOptinMailRsvSetChg.MAIL_YOKEN_KBN_NM_104;
		}
		// メール用件区分: 105 
		else if (mailYokenKbn.equals(JBSbatCKOptinMailRsvSetChg.MAIL_YOKEN_KBN_CD_105))
		{
			mailItemCategoryNm = JBSbatCKOptinMailRsvSetChg.MAIL_YOKEN_KBN_NM_105;
		}
		// メール用件区分: 106
		else if (mailYokenKbn.equals(JBSbatCKOptinMailRsvSetChg.MAIL_YOKEN_KBN_CD_106))
		{
			mailItemCategoryNm = JBSbatCKOptinMailRsvSetChg.MAIL_YOKEN_KBN_NM_106;
		}
		// メール用件区分: 107
		else if (mailYokenKbn.equals(JBSbatCKOptinMailRsvSetChg.MAIL_YOKEN_KBN_CD_107))
		{
			mailItemCategoryNm = JBSbatCKOptinMailRsvSetChg.MAIL_YOKEN_KBN_NM_107;
		}
		
		return mailItemCategoryNm;
	}
	
	/**
	 * ファイルを閉じる
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void closeFileObj() throws Exception
	{
		// CASEファイルが存在する場合
		if (caseCvsFileObj != null)
		{
			// ファイルを閉じる
			caseCvsFileObj.close();
		}
		
		// CASE件数ファイルが存在する場合
		if (caseCntFileObj != null)
		{
			// ファイルを閉じる
			caseCntFileObj.close();
		}
		
		// CASEフラグファイルが存在する場合
		if (caseFlgFileObj != null)
		{
			// ファイルを閉じる
			caseFlgFileObj.close();
		}
	}
}
