/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKCutToolGuideShoHassoSzFileSksi
*	ソースファイル名	：JBSbatKKCutToolGuideShoHassoSzFileSksi.java
*	作成者				：富士通
*	作成日				：2020年01月16日
*＜機能概要＞
*	切断ツール案内書類発送指示ファイル作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v48.00.00   2020/01/16  FJ)中原   ANK-3734-00-00_光ケーブル切断ツール対応
*   v66.00.00   2023/04/20  GDC)ml.alcantara   ANK-4372-00-00_【eo】切断ツール型番号変更対応
*********************************************************************/
package eo.business.service;


import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatKKConst;
import eo.business.common.JKKBatConst;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.application.JBSbatBusinessError;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatOutputFileUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKCutToolGuideShoHassoSzFileSksi extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	

	/** 切断ツール案内書類発送指示ファイルオブジェクト(出力ファイル) */
	private JBSbatOutputFileUtil kkife429FileObjOut = null;
	/** レコード種別(基本情報):01 */
	private static final String RECORD_SBT_01  = "01";
	/** レコード種別(端末情報):02 */
	private static final String RECORD_SBT_02  = "02";
	/** レコード種別(トレーラ部):09 */
	private static final String RECORD_SBT_09  = "09";
	/** トレーラ部出力ファイル件数 */
	private long kkife429FileOutCount = 0;
	/** 文字コード */
	private static final String MS932  = "MS932";
	/** 改行コード */
	private static final String CRLF  = "CR+LF";
	/** レコードキー サービス契約番号 **/
	private static String SVC_KEI_NO = "SVC_KEI_NO";
	/** レコードキー サービス契約回線内訳番号 **/
	private static String SVC_KEI_KAISEN_UCWK_NO = "SVC_KEI_KAISEN_UCWK_NO";
	/** レコードキー 工事案件番号 **/
	private static String KOJIAK_NO = "KOJIAK_NO";
	/** レコードキー SYSID **/
	private static String SYSID = "SYSID";
	/** レコードキー 契約者名 **/
	private static String CUST_NM = "CUST_NM";
	/** レコードキー 郵便番号 **/
	private static String CUT_TOOL_SHS_PCD = "CUT_TOOL_SHS_PCD";
	/** レコードキー 都道府県名 **/
	private static String CUT_TOOL_SHS_STATE_NM = "CUT_TOOL_SHS_STATE_NM";
	/** レコードキー 市区町村名 **/
	private static String CUT_TOOL_SHS_CITY_NM = "CUT_TOOL_SHS_CITY_NM";
	/** レコードキー 大字通称名 **/
	private static String CUT_TOOL_SHS_OAZTSU_NM = "CUT_TOOL_SHS_OAZTSU_NM";
	/** レコードキー 字丁目名 **/
	private static String CUT_TOOL_SHS_AZCHO_NM = "CUT_TOOL_SHS_AZCHO_NM";
	/** レコードキー 番地号 **/
	private static String CUT_TOOL_SHS_AD_BNCHIGO = "CUT_TOOL_SHS_AD_BNCHIGO";
	/** レコードキー 建物名 **/
	private static String CUT_TOOL_SHS_ADRTTM = "CUT_TOOL_SHS_ADRTTM";
	/** レコードキー 部屋番号 **/
	private static String CUT_TOOL_SHS_ADRRM = "CUT_TOOL_SHS_ADRRM";
	/** レコードキー 電話番号 **/
	private static String CUT_TOOL_SHS_TELNO = "CUT_TOOL_SHS_TELNO";
	/** レコードキー 送付先名 **/
	private static String CUT_TOOL_SHS_NM = "CUT_TOOL_SHS_NM";
	/** レコードキー 送付先カナ名 **/
	private static String CUT_TOOL_SHS_KANA = "CUT_TOOL_SHS_KANA";
	/** レコードキー 宅内機器型式コード **/
	private static String TAKNKIKI_MODEL_CD = "TAKNKIKI_MODEL_CD";
	/** レコードキー 宅内機器型式名 **/
	private static String TAKNKIKI_MODEL_NM = "TAKNKIKI_MODEL_NM";
	/** レコードキー 機器製造番号 **/
	private static String KIKI_SEIZO_NO = "KIKI_SEIZO_NO";
	/** レコードキー 世代登録年月日時分秒 **/
	private static String GENE_ADD_DTM = "GENE_ADD_DTM";
	/** レコードキー 送信済フラグ **/
	private static String SEND_ZUMI_FLG = "SEND_ZUMI_FLG";
	//ANK-4372-00-00 ADD START
	/** レコードキー 型番号 **/
	private static String KATA_NO = "KATA_NO";
	//ANK-4372-00-00 ADD END

//ANK-4372-00-00 DEL START
//	テーブル(業務パラメータ管理)
//	private static final String D_TBL_NAME_ZM_M_WORK_PARAM_KNRI = "ZM_M_WORK_PARAM_KNRI";
//	テーブルアクセスクラス(業務パラメータ管理)
//	private JBSbatSQLAccess db_ZM_M_WORK_PARAM_KNRI = null;
//	SQL定義キー(KK_SELECT_016)
//	private static final String ZM_M_WORK_PARAM_KNRI_KK_SELECT_016 = "KK_SELECT_016";
//	業務パラメータID 
//	private static final String KK_CUT_TOOL_KTBN  = "KK_CUT_TOOL_KTBN";
//ANK-4372-00-00 DEL END

	/** テーブル(返品機器)*/
	private static final String D_TBL_NAME_DK_T_HMPIN_KIKI = "DK_T_HMPIN_KIKI";
	/** テーブルアクセスクラス(返品機器)*/
	private JBSbatSQLAccess db_DK_T_HMPIN_KIKI = null;
	/** SQL定義キー(KK_SELECT_014)*/
	private static final String DK_T_HMPIN_KIKI_KK_SELECT_014 = "KK_SELECT_014";

	/** テーブル(切断ツール送付先)*/
	private static final String D_TBL_NAME_KU_T_CUT_TOOL_SOHUS = "KU_T_CUT_TOOL_SOHUS";
	/** テーブルアクセスクラス(切断ツール送付先)*/
	private JBSbatSQLAccess db_KU_T_CUT_TOOL_SOHUS = null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		String[] freeItems = commonItem.getFreeItem().split(JKKBatConst.S_PARAM_DELIM);

		// DBアクセスクラスを生成します
//ANK-4372-00-00 DEL START
//		db_ZM_M_WORK_PARAM_KNRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_WORK_PARAM_KNRI);
//ANK-4372-00-00 DEL END
		db_DK_T_HMPIN_KIKI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_DK_T_HMPIN_KIKI);
		db_KU_T_CUT_TOOL_SOHUS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KU_T_CUT_TOOL_SOHUS);

		// KKIFE429ファイル作成
		this.kkife429FileObjOut = new JBSbatOutputFileUtil(freeItems[0]);
		this.kkife429FileObjOut.setEncode(JKKBatConst.SJIS);
		this.kkife429FileObjOut.setLine(CRLF);
		this.kkife429FileObjOut.createWriter();
		/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{


		try
		{

			// バッチ運用日付の取得
			String batOpeDate = super.opeDate;
			
			// 型番号を取得
//	ANK-4372-00-00 DEL START
//			String modelNo = executeZM_M_WORK_PARAM_KNRI_KK_SELECT_016(new String[]{ batOpeDate });
//			// 業務パラメータ管理が取得できない場合業務エラー
//			if ( modelNo == null )
//			{
//				super.commonItem.setErrFlg(true);
//				throw new JBSbatBusinessError();
//			}
//	ANK-4372-00-00 DEL END
			// 基本情報を書き込む
//	ANK-4372-00-00 MOD START
//			writeDataBasic(inMap, batOpeDate, modelNo);
			writeDataBasic(inMap, batOpeDate);
//	ANK-4372-00-00 MOD END
			kkife429FileOutCount++;
			
			// 入力パラメータで取得した工事案件を元にサービス契約の解約時に同時に解約された機器(レンタル機器で未返却)の情報を取得
			JBSbatCommonDBInterface resultMap = executeDK_T_HMPIN_KIKI_KK_SELECT_014(inMap, new String[]{ batOpeDate });
			if ( resultMap != null )
			{
				long lCount = 1;
				while ( resultMap != null )
				{
					// 端末情報を書き込む
					writeDataTanmt(inMap, resultMap, batOpeDate, lCount);
					resultMap = db_DK_T_HMPIN_KIKI.selectNext();
					lCount++;
					kkife429FileOutCount++;
				}
			}
			
			// 切断ツール送付先の送信済フラグを更新（同一工事案件内でサービス契約が複数件いる場合はネット優先で更新）
			executeKU_T_CUT_TOOL_SOHUS_UPDATE(inMap);

		}
		catch(Exception e)
		{
			super.commonItem.setErrFlg(true);
			throw new JBSbatBusinessError();
		}

		return null;
	}
	
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
		// kkife429のトレーラ部の書き込み
		// トレーラ部書き込み処理
		writeTaraler();
		
		// DBクローズ処理
// ANK-4372-00-00 DEL START
//		db_ZM_M_WORK_PARAM_KNRI.close();
// ANK-4372-00-00 DEL END
		db_DK_T_HMPIN_KIKI.close();
		db_KU_T_CUT_TOOL_SOHUS.close();
	
	}

	/**
	 * KKIFE429のトレーラ部書き込み処理
	 * @throws Exception
	 */
	private void writeTaraler() throws Exception {
		StringBuilder str = new StringBuilder();
		// トレーラ部の設定
		// レコード種別
		appendStr(str, RECORD_SBT_09, 2, true, true);
		// データ件数
		appendStr(str, new StringBuilder().append(kkife429FileOutCount + 1).toString(), 6, false, true);

		this.kkife429FileObjOut.write(str.toString());
		this.kkife429FileObjOut.close();
	}

// ANK-4372-00-00 MOD START
//	  KKIFE429の基本情報書き込み処理
//	  @param  inMap
//	  @param  batOpeDate
//	  @param  modelNo
//	  @throws Exception
//	 
//	private void writeDataBasic(JBSbatServiceInterfaceMap inMap, String batOpeDate, String modelNo) throws Exception
	/**
	 * KKIFE429の基本情報書き込み処理
	 * @param  inMap
	 * @param  batOpeDate
	 * @throws Exception
	 */
	private void writeDataBasic(JBSbatServiceInterfaceMap inMap, String batOpeDate) throws Exception
// ANK-4372-00-00 MOD END
	{
		StringBuilder str = new StringBuilder();
		// 基本情報の設定
		// レコード種別
		appendStr(str, RECORD_SBT_01, 2, true, true);
		// 指図日
		appendStr(str, batOpeDate, 8, true, true);
		// SYSID
		appendStr(str, inMap.getString(SYSID), 10, true, true);
		// サービス契約回線内訳番号
		appendStr(str, inMap.getString(SVC_KEI_KAISEN_UCWK_NO), 12, true, true);
		// サービス契約番号
		appendStr(str, inMap.getString(SVC_KEI_NO), 10, true, true);
		// 契約者名
		appendStr(str, inMap.getString(CUST_NM), 121, true, true);
		// 案件番号
		appendStr(str, inMap.getString(KOJIAK_NO), 10, true, true);
		// 郵便番号
		appendStr(str, inMap.getString(CUT_TOOL_SHS_PCD), 7, true, true);
		// 都道府県名
		appendStr(str, inMap.getString(CUT_TOOL_SHS_STATE_NM), 4, true, true);
		// 市区町村名
		appendStr(str, inMap.getString(CUT_TOOL_SHS_CITY_NM), 12, true, true);
		// 大字通称名
		appendStr(str, inMap.getString(CUT_TOOL_SHS_OAZTSU_NM), 18, true, true);
		// 字丁目名
		appendStr(str, inMap.getString(CUT_TOOL_SHS_AZCHO_NM), 12, true, true);
		// 番地号
		appendStr(str, inMap.getString(CUT_TOOL_SHS_AD_BNCHIGO), 61, true, true);
		// 建物名
		appendStr(str, inMap.getString(CUT_TOOL_SHS_ADRTTM), 45, true, true);
		// 部屋番号
		appendStr(str, inMap.getString(CUT_TOOL_SHS_ADRRM), 15, true, true);
		// 電話番号
		appendStr(str, inMap.getString(CUT_TOOL_SHS_TELNO), 11, true, true);
		// 送付先名
		appendStr(str, inMap.getString(CUT_TOOL_SHS_NM), 121, true, true);
		// 送付先カナ名
		appendStr(str, inMap.getString(CUT_TOOL_SHS_KANA), 121, true, true);
		// 型番号
// ANK-4372-00-00 MOD START
//		appendStr(str, modelNo, 20, false, true);
		appendStr(str, inMap.getString(KATA_NO), 20, false, true);
// ANK-4372-00-00 MOD END

		this.kkife429FileObjOut.write(str.toString());
		
	}
	

	/**
	 * KKIFE429の端末情報書き込み処理
	 * @param  recordData0
	 * @param  recordData0
	 * @throws Exception
	 */
	private void writeDataTanmt(JBSbatServiceInterfaceMap inMap, JBSbatCommonDBInterface resultMap, String batOpeDate, long lCount) throws Exception
	{
		StringBuilder str = new StringBuilder();
		// 端末情報の設定
		// レコード種別
		appendStr(str, RECORD_SBT_02, 2, true, true);
		// 指図日
		appendStr(str, batOpeDate, 8, true, true);
		// 案件番号
		appendStr(str, inMap.getString(KOJIAK_NO), 10, true, true);
		// 連番
		appendStr(str, new StringBuilder().append(lCount).toString(), 6, true, true);
		// 宅内機器型式コード
		appendStr(str, resultMap.getString(TAKNKIKI_MODEL_CD), 20, true, true);
		// 宅内機器型式名
		appendStr(str, resultMap.getString(TAKNKIKI_MODEL_NM), 121, true, true);
		// 機器製造番号
		appendStr(str, resultMap.getString(KIKI_SEIZO_NO), 20, false, true);

		this.kkife429FileObjOut.write(str.toString());
	}


	/**
	 * 文字列を連結します。
	 * 
	 * @param str
	 *            文字列
	 * @param value
	 *            連結対象の文字列
	 * @param len
	 *            桁数
	 * @param continueFlg
	 *            継続フラグ
	 * @throws Exception 
	 */
	private void appendStr(StringBuilder str, String value, int len, boolean continueFlg, boolean doubleQuoteFlg) throws Exception
	{
		String preValue = value;

		if (null == value)
		{
			preValue = "";
		}
		
		if (doubleQuoteFlg)
		{
			str.append("\"");
		}
		
		str.append(adjustCharSize(preValue, len));
		
		if (doubleQuoteFlg)
		{
			str.append("\"");
		}

		if (continueFlg)
		{
			str.append(JBSbatKKConst.STR_COMMA);
		}
	}

	/**
	 * 文字列を指定された桁数に調整する。<BR>
	 * 指定サイズが文字列の桁数より小さい場合は、文字列の語尾を切り捨てる。
	 * <BR>
	 * @param para 調整前の文字列
	 * @param len 指定桁数（桁数）
	 * @param encode 文字コード（ＯＳ準拠の場合は""（空）を指定）
	 * @return String 調整後の文字列
	 * @throws Exception
	 */
	public String adjustCharSize(String para, int len)
			throws Exception
	{
		String retStr = "";
		if (null == para)
		{
			return retStr;
		}
		if (0 >= len)
		{
			return retStr;
		}

		// 入力文字列の桁数を取得する
		int paralen = para.length();

		// 入力文字列を返却文字列に設定
		retStr = para;
		
		// 入力文字列の桁数 ＞ 指定桁数の場合
		if ( paralen > len )
		{ 
			// 指定桁数分の文字列を生成する
			retStr = para.substring(0, len);
		}

		return retStr;
	}
// ANK-4372-00-00 DEL START	
//	 SQLKEY(ZM_M_WORK_PARAM_KNRI_KK_SELECT_016)でDBアクセスを行います。<br>
//	 @param param バイント変数の値配列。
//	 @throws Exception 業務サービス内で発生した例外全般。
//	 
//	private String executeZM_M_WORK_PARAM_KNRI_KK_SELECT_016(Object[] param) throws Exception
//	{
//		
//		// バイント変数のリストを生成します
//		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
//		JBSbatCommonDBInterface dbInterface = null;
//		paramList.setValue(KK_CUT_TOOL_KTBN);
//		paramList.setValue(param[0].toString());
//		paramList.setValue(param[0].toString());
//
//		// DBアクセスを実行します
//		db_ZM_M_WORK_PARAM_KNRI.selectBySqlDefine(paramList, ZM_M_WORK_PARAM_KNRI_KK_SELECT_016);
//		
//		// レコード取得
//		dbInterface = db_ZM_M_WORK_PARAM_KNRI.selectNext();
//		
//		// 業務パラメータ設定値の取得
//		if(dbInterface == null)
//		{
//			return null;
//		}
//		 
//		
//		return dbInterface.getString(JBSbatZM_M_WORK_PARAM_KNRI.WORK_PARAM_SETTE_VALUE);
//		
//	}
// ANK-4372-00-00 DEL END

	/**
	 * SQLKEY(DK_T_HMPIN_KIKI_KK_SELECT_014)でDBアクセスを行います。<br>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeDK_T_HMPIN_KIKI_KK_SELECT_014(JBSbatServiceInterfaceMap inMap, Object[] param) throws Exception
	{
		
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(inMap.getString(SVC_KEI_KAISEN_UCWK_NO));
		paramList.setValue(inMap.getString(SVC_KEI_KAISEN_UCWK_NO));
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_DK_T_HMPIN_KIKI.selectBySqlDefine(paramList, DK_T_HMPIN_KIKI_KK_SELECT_014);
		
		
		return db_DK_T_HMPIN_KIKI.selectNext();
		
	}

	/**
	 * SQLKEY(主キーで切断ツール送付先）でDB更新を行います。<br>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKU_T_CUT_TOOL_SOHUS_UPDATE(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		
		JBSbatCommonDBInterface whereMap = null;
		JBSbatCommonDBInterface setMap = null;
		
		//WHERE句(主キー)
		whereMap = new JBSbatCommonDBInterface();
		//工事案件番号
		whereMap.setValue(KOJIAK_NO, inMap.getString(KOJIAK_NO));
		//世代登録年月日時分秒
		whereMap.setValue(GENE_ADD_DTM, inMap.getString(GENE_ADD_DTM));

		//SET句（更新値）
		setMap = new JBSbatCommonDBInterface();
		//送信済フラグ
		setMap.setValue(SEND_ZUMI_FLG, "1");
		//更新実行
		db_KU_T_CUT_TOOL_SOHUS.updateByPrimaryKeys(whereMap, setMap);
		
	}	
}