/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKVhMskmDataExtrctn
*	ソースファイル名	：JBSbatKKVhMskmDataExtrctn.java
*	作成者				：FJ)柳
*	作成日				：2017年08月24日
*＜機能概要＞
*　訪販申込データ抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v33.00.00	2017/08/24	FJ)柳		【ANK-3278-00-00】訪販申込情報検索APIの条件変更
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatKKConst;
import eo.business.util.file.JBSbatKKIFM738;
import eo.business.util.table.JBSbatCK_T_CUST;
import eo.business.util.table.JBSbatKK_T_MSKM_AGNT;
import eo.business.util.table.JBSbatKK_T_MSKM_DTL;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.util.JBSbatAplConst;
import eo.framework.db.JBSbatSQLAccess;

/**
* 申込_代理店から訪販申込情報閲覧システムが参照する代理店コードで登録されているデータを抽出する。
* 併せて必要な情報は申込明細、サービス契約、お客様、連絡先より抽出する。
* 抽出した結果は「訪販申込データ抽出ファイル」に出力する。
*<BR>
* @author FJ)柳
*/
public class JBSbatKKVhMskmDataExtrctn extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** テーブル(連携ファイル制御) */
	private static final String TBL_KK_T_RNKI_FILE_CTRL = "KK_T_RNKI_FILE_CTRL";
	/** テーブル(申込明細) */
	private static final String TBL_KK_T_MSKM_DTL = "KK_T_MSKM_DTL";
	
	/** SQL定義キー(申込明細　SELECT_040) */
	private static final String KK_T_MSKM_DTL_KK_SELECT_040 = "KK_SELECT_040";
	
	/** DB項目名(同時申込eo光申込書番号) */
	private static final String DOJI_MSKM_EOH_MSKMSHO_NO = "DOJI_MSKM_EOH_MSKMSHO_NO";
	/** DB項目名(申込＿代理店番号) */
	private static final String MSKM_AGNT_NO = "MSKM_AGNT_NO";
	
	/** DBアクセスクラス(連携ファイル制御) */
	private JBSbatSQLAccess db_access_rnki_file_ctrl = null;
	/** DBアクセスクラス(申込明細) */
	private JBSbatSQLAccess db_access_mskm_dtl = null;
	
	/** 物理バッチID */
	private static final String BTRI_BAT_ID = "KKPRC58601";
	/** 修正前SQL */
	private static final String EDIT_BF_SQL_AGNT_CD = "AGNT_CD IN \\(\\?\\)";
	/** 修正後SQL */
	private static final String EDIT_AF_SQL_AGNT_CD = "AGNT_CD IN ";
	/** 特定代理店コード */
	private static final String TOKUT_AGNT_CD = "TOKUT_AGNT_CD";
	
	/** 現在日時(年月日時分秒17桁) */
	private String current = "";
	/** 特定代理店コード */
	private String tokutAgntCd = "";
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// フリー項目より取得
		String[] freeParam = commonItem.getFreeItem().split(";");
		current = freeParam[0];			// 現在日時(年月日時分秒17桁)
		
		// DBアクセスクラス生成
		db_access_rnki_file_ctrl = new JBSbatSQLAccess(commonItem, TBL_KK_T_RNKI_FILE_CTRL);
		db_access_mskm_dtl = new JBSbatSQLAccess(commonItem, TBL_KK_T_MSKM_DTL);
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// -------------------------
		// 特定代理店コード取得
		// -------------------------
		// アプリケーションプロパティファイルより特定代理店コードを取得する
		tokutAgntCd = JBSbatAplConst.getAplConstValue(TOKUT_AGNT_CD);
		// 特定代理店コードに"'"を付与する
		String[] tokutAgntCdList = tokutAgntCd.split(",");
		
		StringBuffer sb = new StringBuffer();
		
		for (String val : tokutAgntCdList)
		{
			// 空文は削除
			if (val != null && val.length() > 0)
			{
				if (sb.length() > 0)
				{
					sb.append(",");
				}
				sb.append("'").append(val).append("'");
			}
		}
		
		tokutAgntCd = sb.toString();
		
		// ------------------------------
		// 訪販申込データ(同時申込)抽出
		// ------------------------------
		// 運用日取得
		String opeDate = commonItem.getOpeDate();
		
		// ファイル出力用オブジェクト生成
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		// 同時申込eo光申込書番号を取得
		String dojiMskmEohMskmshoNo = inMap.getString(DOJI_MSKM_EOH_MSKMSHO_NO);
		
		// SQLの編集
		editSQL(tokutAgntCd);
		
		// パラメータリスト
		ArrayList<String> setParamList = new ArrayList<String>();
		
		// 同時申込eo光申込書番号を設定
		setParamList.add(dojiMskmEohMskmshoNo);
		
		// 運用日を設定
		setParamList.add(opeDate);
		
		// パラメータの設定
		Object[] whereParam040 = setParamList.toArray();
		
		// 申込明細を検索(同時申込が行われたeo光の契約情報)
		executeKK_T_MSKM_DTL_KK_SELECT_040(whereParam040);
		
		// 結果を取得
		JBSbatCommonDBInterface dojiMskmEohMap = new JBSbatCommonDBInterface();
		
		if ((dojiMskmEohMap = db_access_mskm_dtl.selectNext()) != null)
		{
			// ファイル出力用インスタンス生成
			JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
			
			// 出力ファイル設定
			outMap.setString(JBSbatKKIFM738.MSKM_NO, dojiMskmEohMap.getString(JBSbatKK_T_MSKM_AGNT.MSKM_NO));					// 申込番号
			outMap.setString(JBSbatKKIFM738.AGNT_CD, dojiMskmEohMap.getString(JBSbatKK_T_MSKM_AGNT.AGNT_CD));					// 代理店コード
			outMap.setString(JBSbatKKIFM738.MSKM_AGNT_NO, dojiMskmEohMap.getString(MSKM_AGNT_NO));								// 申込＿代理店番号
			outMap.setString(JBSbatKKIFM738.MSKM_DTL_NO, inMap.getString(JBSbatKK_T_MSKM_DTL.MSKM_DTL_NO));						// 申込明細番号
			outMap.setString(JBSbatKKIFM738.MSKM_YMD, inMap.getString(JBSbatKK_T_MSKM_DTL.MSKM_YMD));							// 申込年月日
			outMap.setString(JBSbatKKIFM738.MSKMSHO_NO, dojiMskmEohMap.getString(JBSbatKK_T_MSKM_DTL.MSKMSHO_NO));				// 申込書番号
			outMap.setString(JBSbatKKIFM738.MSKMSHO_SBT_CD, dojiMskmEohMap.getString(JBSbatKK_T_MSKM_DTL.MSKMSHO_SBT_CD));		// 申込書種別コード
			outMap.setString(JBSbatKKIFM738.MANSION_ID, dojiMskmEohMap.getString(JBSbatKK_T_MSKM_DTL.MANSION_ID));				// マンションＩＤ
			outMap.setString(JBSbatKKIFM738.SVC_KEI_NO, inMap.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_NO));						// サービス契約番号
			outMap.setString(JBSbatKKIFM738.PRC_GRP_CD, inMap.getString(JBSbatKK_T_SVC_KEI.PRC_GRP_CD));						// 料金グループコード
			outMap.setString(JBSbatKKIFM738.SYSID, dojiMskmEohMap.getString(JBSbatCK_T_CUST.SYSID));							// ＳＹＳＩＤ
			outMap.setString(JBSbatKKIFM738.CUST_KANA, dojiMskmEohMap.getString(JBSbatCK_T_CUST.CUST_KANA));					// お客様カナ名
			outMap.setString(JBSbatKKIFM738.KEISHA_TELNO, dojiMskmEohMap.getString(JBSbatCK_T_CUST.KEISHA_TELNO));				// 契約者電話番号
			
			// 出力フラグの設定
			outMap.setOutFlg(true);
			
			// 出力ファイルリストに設定
			outputBean.addOutMapList(outMap);
		}
		
		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		// ------------------------------
		// 連携ファイル制御スキーマ更新
		// ------------------------------
		// パラメータの設定(設定値)
		String[] setParamUpdPK = {
				current
		};
		
		// パラメータの設定(条件)
		String[] whereParamUpdPK = {
				BTRI_BAT_ID,
				BTRI_BAT_ID
		};
		
		try
		{
			// 連携ファイル制御を更新
			executeKK_T_RNKI_FILE_CTRL_PKUPDATE(setParamUpdPK, whereParamUpdPK);
		}
		catch(Exception e)
		{
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0040CE,
					new String[] {
							"連携ファイル制御",
							"物理バッチID：" + whereParamUpdPK[0] + " ファイルID：" + whereParamUpdPK[1] + " 前回処理実行年月日時分秒：" + setParamUpdPK[0] });
			throw e;
		}
		finally
		{
			// DBアクセスクラス解放
			db_access_rnki_file_ctrl.close();
			db_access_mskm_dtl.close();
		}
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * SQLKEY(KK_SELECT_040)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *			DOJI_MSKM_EOH_MSKMSHO_NO
	 *			TOKUT_AGNT_CD(n件)
	 *			OPE_DATE
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_MSKM_DTL_KK_SELECT_040(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
		// 件数分設定
		for (int i = 0; i < param.length; i++)
		{
			paramList.setValue(param[i]);
		}
		
		// DBアクセスを実行します
		db_access_mskm_dtl.selectBySqlDefine(paramList, KK_T_MSKM_DTL_KK_SELECT_040);
	}
	
	/**
	 * PK(ＰＫ　更新)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.引数で条件マップを作ります。<br>
	 *
	 * 3.DBアクセスを実行します。<br>
	 * 
	 * 4.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *			ZNKI_TRAN_RUN_DTM
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *			BUTSURI_BAT_ID
	 *			FILE_ID
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @param whereParam 条件項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_RNKI_FILE_CTRL_PKUPDATE(Object[] setParam, Object[] whereParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("ZNKI_TRAN_RUN_DTM", setParam[0]);
		
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("BUTSURI_BAT_ID", whereParam[0]);
		whereMap.setValue("FILE_ID", whereParam[1]);
		
		// DBアクセスを実行します
		db_access_rnki_file_ctrl.updateByPrimaryKeys(whereMap, setMap);
	}
	
	/** 
	 * SQLを編集する。
	 * (バインド変数"?"を特定代理店コードに置き換える)
	 * 
	 * @param tokutAgntCd　特定代理店コード
	 * @throws Exception
	 */
	private void editSQL(String tokutAgntCd) throws Exception
	{
		// 変更前SQL
		String bfSql =  db_access_mskm_dtl.getSql(KK_T_MSKM_DTL_KK_SELECT_040);
		
		// SQLの編集
		// SQL置換用文字列の生成
		StringBuilder sb = new StringBuilder();
		
		// 前括弧"("を設定
		sb.append(JBSbatKKConst.STR_STA_KAKKO);
		
		// 特定代理店コードを設定
		sb.append(tokutAgntCd);
		
		// 後括弧")"を設定
		sb.append(JBSbatKKConst.STR_END_KAKKO);
		
		// SQLファイルに定義されたSQLを置き換える
		String afSql = bfSql.replaceAll(EDIT_BF_SQL_AGNT_CD, EDIT_AF_SQL_AGNT_CD + sb.toString());
		
		// 編集したSQLを設定
		db_access_mskm_dtl.setSqlMap(KK_T_MSKM_DTL_KK_SELECT_040, afSql);
	}
}
