/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCKRrksInfoAdd
*	ソースファイル名	：JBSbatCKRrksInfoAdd.java
*	作成者				：富士通　
*	作成日				：2011年10月14日
*＜機能概要＞
*　連絡先情報登録部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/10/14  富士通		新規作成
*	v2.00.00	2012/04/09  FJ)藤本		【TAI-2012-0000027】排他制御対応
*	v3.00.00	2012/05/02	FJ)藤本		【巻@登録テーブル項目同期】対応
*********************************************************************/
package eo.business.service;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatCKConst;
import eo.business.common.JCCBatCommon;
import eo.business.util.table.JBSbatCK_T_CUST;
import eo.business.util.table.JBSbatCK_T_RRKS;
import eo.business.util.table.JBSbatKK_T_OPSVKEI_ISP;
import eo.business.util.table.JBSbatKK_T_OP_SVC_KEI;
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.JBSbatDateUtil;
import eo.framework.util.JBSbatStringUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCKRrksInfoAdd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(連絡先)*/
	private static final String D_TBL_NAME_CK_T_RRKS = "CK_T_RRKS";

	/** テーブル(お客様)*/
	private static final String D_TBL_NAME_CK_T_CUST = "CK_T_CUST";

	/** テーブル(オプトインメール受信設定)*/
	private static final String D_TBL_NAME_CK_T_OPTINM_RCV_SET = "CK_T_OPTINM_RCV_SET";

	/** テーブル(オプションサービス契約)*/
	private static final String D_TBL_NAME_KK_T_OP_SVC_KEI = "KK_T_OP_SVC_KEI";
	
	/** SQL定義キー(CK_SELECT_001)*/
	private static final String KK_T_OP_SVC_KEI_CK_SELECT_001 = "CK_SELECT_001";

	/** SQL定義キー(CK_SELECT_002)*/
	private static final String CK_T_RRKS_CK_SELECT_002 = "CK_SELECT_002";

	/** SQL定義キー(CK_SELECT_014)*/
	private static final String CK_T_CUST_CK_SELECT_014 = "CK_SELECT_014";

	/** テーブルアクセスクラス(連絡先)*/
	private JBSbatSQLAccess db_CK_T_RRKS = null;

	/** テーブルアクセスクラス(お客様)*/
	private JBSbatSQLAccess db_CK_T_CUST = null;

	/** テーブルアクセスクラス(オプトインメール受信設定)*/
	private JBSbatSQLAccess db_CK_T_OPTINM_RCV_SET = null;
	
	/** テーブルアクセスクラス(オプションサービス契約)*/
	private JBSbatSQLAccess db_KK_T_OP_SVC_KEI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CK_T_RRKS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CK_T_RRKS);
		db_CK_T_CUST = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CK_T_CUST);
		db_CK_T_OPTINM_RCV_SET = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CK_T_OPTINM_RCV_SET);
		db_KK_T_OP_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_OP_SVC_KEI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		super.logPrint.printDebugLog("execute_START");
		
		// オプトインメール番号の取得
		String optinmNo = JBSbatStringUtil.Rtrim(inMap.getString("OPTINM_NO"));
		
		// 連絡先情報の抽出
		// SQL実行結果取得用mapを生成（連絡先）
		JBSbatCommonDBInterface rrksMap = new JBSbatCommonDBInterface(); 
		
		// SQL定義キー(CK_SELECT_002)を実行する
		String [] selectParamRr = {super.opeDate, super.opeDate, optinmNo};
		super.logPrint.printDebugLog("selectParam(予約適用年月日)：：：：" +  selectParamRr[0]);
		super.logPrint.printDebugLog("selectParam(予約適用年月日)：：：：" +  selectParamRr[1]);
		super.logPrint.printDebugLog("selectParam(オプトインメール番号)：" +  selectParamRr[2]);
		executeCK_T_RRKS_CK_SELECT_002(selectParamRr);
		
		// 検索結果を取得する
		for(rrksMap = db_CK_T_RRKS.selectNext(); null != rrksMap ; rrksMap = db_CK_T_RRKS.selectNext())
		{
			// 検索結果の連絡先情報を変数に設定する。
			String sysid = JBSbatStringUtil.Rtrim(rrksMap.getString(JBSbatCK_T_RRKS.SYSID));
			String mlad = JBSbatStringUtil.Rtrim(rrksMap.getString(JBSbatCK_T_RRKS.MLAD));
			String upd_dtm = JBSbatStringUtil.Rtrim(rrksMap.getString(JBSbatCK_T_CUST.UPD_DTM));
			String gene_add_dtm = JBSbatStringUtil.Rtrim(rrksMap.getString(JBSbatCK_T_CUST.GENE_ADD_DTM));
			
			// メールアドレスが設定されていない場合はオプトインメール受信設定情報の登録は行いません。
			if("".equals(mlad))
			{
				super.logPrint.printDebugLog("メールアドレス未設定のためスキップ：" + sysid);
				continue;
			}
			
			// お客様の排他チェックを行います。
			if(!this.isTimeStampCheckCust(sysid, upd_dtm, gene_add_dtm))
			{
				super.logPrint.printBusinessErrorLog("EKKB0360KE", new String[]{"お客様", sysid});
				super.logPrint.printDebugLog("排他エラーが発生しました。{SYSID:" + sysid + "}");
				continue;
			}
			
			// オプトインメール受信設定情報の登録
			insertOptinmRcvSet(optinmNo, sysid, mlad);
			
			// お客様の更新日時を更新します。
			updateCust(sysid, gene_add_dtm);
		}
		
		// オプションサービス契約情報の抽出
		// SQL実行結果取得用mapを生成（オプションサービス契約）
		JBSbatCommonDBInterface opSvcKeiMap = new JBSbatCommonDBInterface(); 
		
		// SQL定義キー(CK_SELECT_001)を実行する
		String [] selectParamOp = {super.opeDate, super.opeDate, optinmNo};
		super.logPrint.printDebugLog("selectParam(予約適用年月日)：：：：" +  selectParamOp[0]);
		super.logPrint.printDebugLog("selectParam(オプトインメール番号)：" +  selectParamOp[1]);
		executeKK_T_OP_SVC_KEI_CK_SELECT_001(selectParamOp);
		
		// 検索結果を取得する
		for(opSvcKeiMap = db_KK_T_OP_SVC_KEI.selectNext(); null != opSvcKeiMap ; opSvcKeiMap = db_KK_T_OP_SVC_KEI.selectNext())
		{
			// 検索結果の連絡先情報を変数に設定する。
			String sysid = JBSbatStringUtil.Rtrim(opSvcKeiMap.getString(JBSbatKK_T_OP_SVC_KEI.SYSID));
			String mlad = JBSbatStringUtil.Rtrim(opSvcKeiMap.getString(JBSbatKK_T_OPSVKEI_ISP.MLAD));
			String upd_dtm = JBSbatStringUtil.Rtrim(opSvcKeiMap.getString(JBSbatCK_T_CUST.UPD_DTM));
			String gene_add_dtm = JBSbatStringUtil.Rtrim(opSvcKeiMap.getString(JBSbatCK_T_CUST.GENE_ADD_DTM));
			
			// メールアドレスが設定されていない場合はオプトインメール受信設定情報の登録は行いません。
			if("".equals(mlad))
			{
				super.logPrint.printDebugLog("メールアドレス未設定のためスキップ：" + sysid);
				continue;
			}
			
			// お客様の排他チェックを行います。
			if(!this.isTimeStampCheckCust(sysid, upd_dtm, gene_add_dtm))
			{
				super.logPrint.printBusinessErrorLog("EKKB0360KE", new String[]{"お客様", sysid});
				super.logPrint.printDebugLog("排他エラーが発生しました。{SYSID:" + sysid + "}");
				continue;
			}
			
			// オプトインメール受信設定情報の登録
			insertOptinmRcvSet(optinmNo, sysid, mlad);
			
			// お客様の更新日時を更新します。
			updateCust(sysid, gene_add_dtm);
		}
		super.logPrint.printDebugLog("execute_END");
		
		//出力共通電文を返却
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CK_T_RRKS.close();
		db_CK_T_OPTINM_RCV_SET.close();
		db_CK_T_CUST.close();
		db_KK_T_OP_SVC_KEI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * SQLKEY(CK_SELECT_002)で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_RRKS_CK_SELECT_002(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_CK_T_RRKS.selectBySqlDefine(paramList, CK_T_RRKS_CK_SELECT_002);
	}

	/**
	 * SQLKEY(CK_SELECT_001)で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_OP_SVC_KEI_CK_SELECT_001(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_OP_SVC_KEI.selectBySqlDefine(paramList, KK_T_OP_SVC_KEI_CK_SELECT_001);
	}

	/**
	 * SQLKEY(CK_SELECT_014)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	SYSID
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCK_T_CUST_CK_SELECT_014(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CK_T_CUST.selectBySqlDefine(paramList, CK_T_CUST_CK_SELECT_014);
	}

	/**
	 * 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
	 *		 	登録年月日時分秒				ADD_DTM
	 *		 	登録オペレータアカウント				ADD_OPEACNT
	 *		 	更新年月日時分秒				UPD_DTM
	 *		 	更新オペレータアカウント				UPD_OPEACNT
	 *		 	削除年月日時分秒				DEL_DTM
	 *		 	削除オペレータアカウント				DEL_OPEACNT
	 *		 	無効フラグ				MK_FLG
	 *		 	登録運用年月日				ADD_UNYO_YMD
	 *		 	登録処理ＩＤ				ADD_TRN_ID
	 *		 	更新運用年月日				UPD_UNYO_YMD
	 *		 	更新処理ＩＤ				UPD_TRN_ID
	 *		 	削除運用年月日				DEL_UNYO_YMD
	 *		 	削除処理ＩＤ				DEL_TRN_ID
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCK_T_OPTINM_RCV_SET_PKINSERT(Object[] setParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("OPTINM_NO", setParam[0]);
		setMap.setValue("SYSID", setParam[1]);
		setMap.setValue("MLAD", setParam[2]);
		setMap.setValue("GENE_ADD_DTM", setParam[3]);
		setMap.setValue("OPTINM_RCV_SETTE_STAT", setParam[4]);
		setMap.setValue("RCV_DIV", setParam[5]);
		setMap.setValue("RCV_SETTE_YMD", setParam[6]);
		setMap.setValue("RCV_RLS_YMD", setParam[7]);
		setMap.setValue("OPTINM_RCV_SETTE_MK_YMD", setParam[8]);
		setMap.setValue("OPTINM_RCV_SETTE_KAIHK_YMD", setParam[9]);
		setMap.setValue("ADD_DTM", setParam[10]);
		setMap.setValue("ADD_OPEACNT", setParam[11]);
		setMap.setValue("UPD_DTM", setParam[12]);
		setMap.setValue("UPD_OPEACNT", setParam[13]);
		setMap.setValue("DEL_DTM", setParam[14]);
		setMap.setValue("DEL_OPEACNT", setParam[15]);
		setMap.setValue("MK_FLG", setParam[16]);
		setMap.setValue("ADD_UNYO_YMD", setParam[17]);
		setMap.setValue("ADD_TRN_ID", setParam[18]);
		setMap.setValue("UPD_UNYO_YMD", setParam[19]);
		setMap.setValue("UPD_TRN_ID", setParam[20]);
		setMap.setValue("DEL_UNYO_YMD", setParam[21]);
		setMap.setValue("DEL_TRN_ID", setParam[22]);
	
		// DBアクセスを実行します
		db_CK_T_OPTINM_RCV_SET.insertByPrimaryKeys(setMap);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 
	 * オプトインメール受信設定情報の登録を行います。
	 * <br>
	 * @param optinmNo オプトインメール番号
	 * @param sysid SYSID
	 * @param mlad メールアドレス
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	private void insertOptinmRcvSet(String optinmNo, String sysid, String mlad) throws Exception 
	{
		// システム日付を取得
		String sysDate = JCCBatCommon.getSysDateTimeStamp();
		
		// 登録するオプトインメール受信設定のパラメータを設定します
		
		String [] setParam = {
				optinmNo,										// オプトインメール番号 → オプトインメール．オプトインメール番号
				sysid,											// ＳＹＳＩＤ →連絡先．ＳＹＳＩＤ
				mlad,											// メールアドレス → 連絡先．メールアドレス
				JBSbatDateUtil.getSystemDateTimeStamp(),		// 世代登録年月日時分秒 → システム日付(yyyyMMddHHmmssSSS)
				JBSbatCKConst.OPTINM_RCV_SETTE_STAT_TRZM,		// オプトインメール受信設定ステータス → '010'（有効）
				JBSbatCKConst.RCV_DIV_NSI,						// 受信区分 → '0'（受信しない）
				"",												// 受信設定年月日 → NULL
				"",												// 受信解除年月日 → NULL
				"",												// オプトインメール受信設定無効年月日 → NULL
				"",												// オプトインメール受信設定回復年月日 → NULL
				sysDate,										// 登録年月日時分秒 → システム日時
				super.batchUserId,								// 登録オペレータアカウント → バッチ更新者ID
				sysDate,										// 更新年月日時分秒 → システム日時
				super.batchUserId,								// 更新オペレータアカウント → バッチ更新者ID
				"",												// 削除年月日時分秒 → NULL
				"",												// 削除オペレータアカウント → NULL
				JBSbatCKConst.MK_FLG_YUKO,						// 無効フラグ → "0"（有効）
				"",												// 登録運用年月日 → NULL
				"",												// 登録処理ID → NULL
				"",												// 更新運用年月日 → NULL
				"",												// 更新処理ID → NULL
				"",												// 削除運用年月日 → NULL
				""};											// 削除処理ID → NULL
		
		executeCK_T_OPTINM_RCV_SET_PKINSERT(setParam);
	}
	
	/**
	 * お客様の排他チェックを行います。
	 * <br>
	 * @param sysid SYSID
	 * @param upd_dtm 更新日時
	 * @param gene_add_dtm 世代登録年月日時分秒
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	private boolean isTimeStampCheckCust(String sysid, String upd_dtm, String gene_add_dtm) throws Exception
	{
		// 指定されたSYSIDでお客様検索を行います。
		String[] param = {sysid};
		this.executeCK_T_CUST_CK_SELECT_014(param);
		
		JBSbatCommonDBInterface custMap = db_CK_T_CUST.selectNext();
		if(null != custMap)
		{
			// 更新タイムスタンプが同じ場合
			if(upd_dtm.equals(JBSbatStringUtil.Rtrim(custMap.getString(JBSbatCK_T_CUST.UPD_DTM))))
			{
				// お客様の排他検索処理を行う。
				JBSbatCommonDBInterface where_map = new JBSbatCommonDBInterface();
				where_map.setValue(JBSbatCK_T_CUST.SYSID, sysid);
				where_map.setValue(JBSbatCK_T_CUST.GENE_ADD_DTM, gene_add_dtm);
				JBSbatCommonDBInterface custMapHaita = db_CK_T_CUST.selectByPrimaryKeysForUpdateWait(where_map);
				if(null != custMapHaita)
				{
					return true;
				}
			}
		}
		return false;
	}
	
	/**
	 * お客様の更新日時の更新を行います。
	 * <br>
	 * @param sysid SYSID
	 * @param gene_add_dtm 世代登録年月日時分秒
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	private void updateCust(String sysid, String gene_add_dtm) throws Exception
	{
		JBSbatCommonDBInterface paramMap = new JBSbatCommonDBInterface();
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		
		// SYSID、世代登録年月日時分秒を設定
		whereMap.setValue(JBSbatCK_T_CUST.SYSID, sysid);
		whereMap.setValue(JBSbatCK_T_CUST.GENE_ADD_DTM, gene_add_dtm);
		
		// 更新年月日時分秒を更新。
		paramMap.setValue(JBSbatCK_T_CUST.UPD_DTM, JBSbatDateUtil.getSystemDateTimeStamp());
		paramMap.setValue(JBSbatCK_T_CUST.UPD_OPEACNT, super.batchUserId);
		db_CK_T_CUST.updateByPrimaryKeys(whereMap, paramMap);
	}
}
