/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名			：eo顧客基幹システム
 *	モジュール名		：JBSbatKKTonaiAkijkInfAdd
 *	ソースファイル名	：JBSbatKKTonaiAkijkInfAdd.java
 *	作成者				：GDC）ニール　
 *	作成日				：2020年08月25日
 *＜機能概要＞
 *　入力ファイルの内容を、KK_T_TONAI_AKIJK_INFにINSERTします。
 *＜修正履歴＞
 *	バージョン		修正日		修正者		修正内容
 *	v51.00.00		2020/08/25  GDC）ニール	【ANK-3885-00-00】光化マンションの自動設計対応
 *********************************************************************/
package eo.business.service;

import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JKUBatCommon;
import eo.common.constant.JKUStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessError;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.util.JBSbatAplConst;
import eo.framework.util.JBSbatCheckUtil;

/**
 * @author GDC）ニール
 */
public class JBSbatKKTonaiAkijkInfAdd extends JBSbatBusinessService {
	/** ▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼ */
	/** テーブル(工事作業項目ワーク) */
	private static final String D_TBL_NAME_KK_T_TONAI_AKIJK_INF = "KK_T_TONAI_AKIJK_INF";

	/** SQL定義キー(KU_DELETE_001) */
	private static final String KK_T_TONAI_AKIJK_INF_KK_DELETE_001 = "KK_DELETE_001";

	/** テーブルアクセスクラス(工事作業項目ワーク) */
	private JBSbatSQLAccess db_KK_T_TONAI_AKIJK_INF = null;
	/** ▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲ */

	/** ▼▼▼▼▼▼業務が作成した宣言です 開始▼▼▼▼▼▼ */

	/** 棟内空き状況情報ファイルオブジェクト */
	private JBSbatInputFileUtil tonaiAkijkInfFileObj = null;

	/** 棟内空き状況情報定義ファイルオブジェクト */
	private JBSbatDefFileUtil tonaiAkijkInfFileDefObj = null;

	/** 登録件数 */
	private static int trnCnt = 0;

	/** ファイル読込件数 */
	private int fileRecordCnt = 0;

	/** ファイルレコード */
	private String line = null;

	/** ログ出力用項目名設定Map */
	private HashMap<String, String> messageMap = new HashMap<String, String>();

	/** ファイル定義項目数 */
	private int fileColCnt = 0;

	/** ファイル配置先 */
	private String filePath = null;

	/** ▲▲▲▲▲▲業務が作成した宣言です 終了▲▲▲▲▲▲ */

	/**
	 * 初期処理
	 * 
	 * @param JBSbatCommonItem
	 *            commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception {
		/** ▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼ */

		// FreeItem取得（FREE項目には「定義ファイル名@入力ファイル（フルパス）」が設定されている）
		String[] freeItem = commonItem.getFreeItem().split(JKUStrConst.FREE_DIV);
		// ファイル配置先
		filePath = freeItem[1];
		// 棟内空き状況情報ファイルオブジェクトを生成する
		tonaiAkijkInfFileObj = new JBSbatInputFileUtil(filePath);
		// 棟内空き状況情報定義ファイル名を取得する
		String tonaiAkijkInfFileDefNamee = JBSbatAplConst.getAplConstValue("IND") + freeItem[0];
		// 棟内空き状況情報定義ファイルオブジェクトを生成する
		tonaiAkijkInfFileDefObj = new JBSbatDefFileUtil(tonaiAkijkInfFileDefNamee, tonaiAkijkInfFileObj);
		// Readerオブジェクトを生成する。
		tonaiAkijkInfFileObj.createReader();
		// ファイル定義より項目数を取得
		fileColCnt = tonaiAkijkInfFileDefObj.getOutDef().size();
		// ログ出力用項目名設定Mapを設定
		messageMap = createMessageMap();
		/** ▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼ */
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_TONAI_AKIJK_INF = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_TONAI_AKIJK_INF);
		/** ▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲ */
		/** ▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * 主処理
	 * 
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception {
		/** ▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼ */
		// (1) 削除処理実行
		this.executeKK_T_TONAI_AKIJK_INF_KK_DELETE_001();

		while (tonaiAkijkInfFileObj.ready()) {
			// (2)ファイルレコード件数カウントアップ
			fileRecordCnt++;

			// ファイルレコード取得
			line = tonaiAkijkInfFileObj.readLine();

			int lineLength = line.length();

			// 定義ファイルに設定された区切り文字がCSV_DOUBLE_QUOTEの場合、前後のダブルクォートを取り除く
			if (tonaiAkijkInfFileDefObj.getDelimiter().equals(JKUStrConst.CSV_DOUBLE_QUOTE)) {
				// 前後のダブルクォートを取り除く
				if (0 == line.indexOf(JKUStrConst.DOUBLE_QUOTE) && lineLength - 1 == line.lastIndexOf(JKUStrConst.DOUBLE_QUOTE)) {
					line = line.substring(1, lineLength - 1);
				} else {
					// エラーログを出力し続行する。
					super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKUB0620CE, new String[] { String.valueOf(fileRecordCnt), filePath });
					super.commonItem.setErrFlg(true);
					continue;
				}
			}

			// 定義ファイルに設定された区切り文字で分割
			String[] cols = line.split(tonaiAkijkInfFileDefObj.getDelimiter(), -1);

			// (3) ファイル定義と項目数が異なる場合のエラー処理
			if (fileColCnt != cols.length) {
				// エラーログを出力し続行する。
				super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1460KW, new String[] { String.valueOf(fileRecordCnt) });
				super.commonItem.setErrFlg(true);
				continue;
			}

			// 単項目チェック
			if (!this.isSingleCheckKKIFE443(cols, messageMap)) {
				super.commonItem.setErrFlg(true);
				continue;
			}

			// 登録処理に渡すパラメタを作成
			Object[] setParam = new Object[19];

			// 処理件数を取得
			trnCnt = trnCnt + 1;
			// 処理件数をゼロ埋め編集し、格納
			String koban = JKUBatCommon.padNumFormString(String.valueOf(trnCnt), 10);

			// 項番
			setParam[0] = koban;
			// Ｐ−ＩＤ
			System.arraycopy(cols, 0, setParam, 1, 1);
			// 棟情報
			System.arraycopy(cols, 1, setParam, 2, 1);
			// 部屋番号
			System.arraycopy(cols, 2, setParam, 3, 1);
			// 確認結果コード
			System.arraycopy(cols, 3, setParam, 4, 1);
			// 施工不可フラグ
			System.arraycopy(cols, 6, setParam, 5, 1);

			this.executeKK_T_TONAI_AKIJK_INF_PKINSERT(setParam);
		}

		// エラー判定
		if (super.commonItem.isErrFlg()) {
			throw new JBSbatBusinessError();
		}

		return null;
		/** ▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * 業務サービス終了処理
	 * 
	 * @throws Exception
	 */
	public void terminal() throws Exception {
		/** ▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼ */
		// DBアクセスクラスをクローズします
		if (db_KK_T_TONAI_AKIJK_INF != null) {
			db_KK_T_TONAI_AKIJK_INF.close();
		}

		/** ▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲ */
		/** ▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * SQLKEY(KU_DELETE_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * 
	 * <pre>
	 * 1.引数でバイント変数を設定します。&lt;br&gt;
	 * 
	 * 2.DBアクセスを実行します。&lt;br&gt;
	 * 
	 * 3.メソッドの呼び出し方です。&lt;br&gt;
	 * 	引数:
	 * 	param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 * </pre>
	 * <p>
	 * 
	 * @param param
	 *            バイント変数の値配列。
	 * @throws Exception
	 *             業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_TONAI_AKIJK_INF_KK_DELETE_001() throws Exception {
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		// DBアクセスを実行します
		db_KK_T_TONAI_AKIJK_INF.executeBySqlDefine(paramList, KK_T_TONAI_AKIJK_INF_KK_DELETE_001);
	}

	/**
	 * 
	 * @param setParam
	 *            設定項目の値。
	 * @throws Exception
	 *             業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_TONAI_AKIJK_INF_PKINSERT(Object[] setParam) throws Exception {
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("TONAI_AKIJK_INF_NO", setParam[0]);
		setMap.setValue("PID", setParam[1]);
		setMap.setValue("TOU_INFO", setParam[2]);
		setMap.setValue("RM_NO", setParam[3]);
		setMap.setValue("PORT_AKI_JOKYO_CD", setParam[4]);
		setMap.setValue("SEKOU_FFG", setParam[5]);
		setMap.setValue("ADD_DTM", setParam[6]);
		setMap.setValue("ADD_OPEACNT", setParam[7]);
		setMap.setValue("UPD_DTM", setParam[8]);
		setMap.setValue("UPD_OPEACNT", setParam[9]);
		setMap.setValue("DEL_DTM", setParam[10]);
		setMap.setValue("DEL_OPEACNT", setParam[11]);
		setMap.setValue("MK_FLG", setParam[12]);
		setMap.setValue("ADD_UNYO_YMD", setParam[13]);
		setMap.setValue("ADD_TRN_ID", setParam[14]);
		setMap.setValue("UPD_UNYO_YMD", setParam[15]);
		setMap.setValue("UPD_TRN_ID", setParam[16]);
		setMap.setValue("DEL_UNYO_YMD", setParam[17]);
		setMap.setValue("DEL_TRN_ID", setParam[18]);

		// DBアクセスを実行します
		db_KK_T_TONAI_AKIJK_INF.insertByPrimaryKeys(setMap);
	}

	/** ▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲ */

	/** ▼▼▼▼▼▼業務チームで作成したメソッドです 開始▼▼▼▼▼▼ */

	/**
	 * 項目チェックで使用するmessageMapを生成します。 HashMap<String, String> 項目名が格納されたHashMap。
	 * 
	 * @return messageMap 埋め込み文字の値。
	 */
	private HashMap<String, String> createMessageMap() {
		messageMap.put("TXT-KKIFE443-.PID", "棟内空き状況情報.Ｐ−ＩＤ");
		messageMap.put("TXT-KKIFE443-.TOU_INFO", "棟内空き状況情報.棟情報");
		messageMap.put("TXT-KKIFE443-.RM_NO", "棟内空き状況情報.部屋番号");
		messageMap.put("TXT-KKIFE443-.CFM_RSLT_CD", "棟内空き状況情報.確認結果コード");
		messageMap.put("TXT-KKIFE443-.COUPLER_PORT_UPPL_CNT", "棟内空き状況情報.カプラポート上限数");
		messageMap.put("TXT-KKIFE443-.COUPLER_PORT_USE_CNT", "棟内空き状況情報.カプラポート使用数");
		messageMap.put("TXT-KKIFE443-.SEKOU_FFG", "施工不可フラグ");

		return messageMap;
	}

	/**
	 *入力情報（棟内空き状況情報）の単項目チェックを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * 
	 * <pre>
	 * 1.単項目チェックを行います。&lt;br&gt;
	 * 
	 * 2.メソッドの呼び出し方です。&lt;br&gt;
	 * 	引数:
	 * 	rsMap:(項目、値)を(key、value)として、データをrsMapに入れます
	 * 	itemvalueMap:埋め込み文字の値をitemvalueMapに入れます。キーの値は、以下に説明します。
	 * 		 TXT-KKIFE443-.PID			棟内空き状況情報.Ｐ−ＩＤ
	 * 		 TXT-KKIFE443-.TOU_INFO			棟内空き状況情報.棟情報
	 * 		 TXT-KKIFE443-.RM_NO			棟内空き状況情報.部屋番号
	 * 		 TXT-KKIFE443-.CFM_RSLT_CD			棟内空き状況情報.確認結果コード
	 * 		 TXT-KKIFE443-.COUPLER_PORT_UPPL_CNT			棟内空き状況情報.カプラポート上限数
	 * 		 TXT-KKIFE443-.COUPLER_PORT_USE_CNT			棟内空き状況情報.カプラポート使用数
	 * </pre>
	 * <p>
	 * 
	 * @param cols
	 *            入力データを格納した配列
	 * @param itemvalueMap
	 *            エラーメッセージに関する項目値を格納されたHashMap。
	 * @return boolean trueである場合、エラーがありません。falseである場合、エラーを発生しました。
	 */
	private boolean isSingleCheckKKIFE443(String[] cols, HashMap itemvalueMap) {
		// 単項目チェックを行います
		String strValue = null;

		// Ｐ−ＩＤチェック
		strValue = cols[0];
		// 必須チェック
		if (strValue == null || strValue.trim().isEmpty()) {
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB1570TW,
									new String[] { String.valueOf(fileRecordCnt), (String) itemvalueMap.get("TXT-KKIFE443-.PID") });
			return false;
		}

		// 桁数チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "ketasuu2", "10", "10" })) {
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB1580TW,
									new String[] { String.valueOf(fileRecordCnt), (String) itemvalueMap.get("TXT-KKIFE443-.PID") });
			return false;
		}

		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakuesuuji1" })) {
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB1590TW,
									new String[] { String.valueOf(fileRecordCnt), (String) itemvalueMap.get("TXT-KKIFE443-.PID") });
			return false;
		}

		// 棟情報チェック
		strValue = cols[1];
		// 必須チェック
		if (strValue == null || strValue.trim().isEmpty()) {
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB1570TW,
									new String[] { String.valueOf(fileRecordCnt), (String) itemvalueMap.get("TXT-KKIFE443-.TOU_INFO") });
			return false;
		}

		// 桁数チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "ketasuu2", "1", "45" })) {
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB1580TW,
									new String[] { String.valueOf(fileRecordCnt), (String) itemvalueMap.get("TXT-KKIFE443-.TOU_INFO") });
			return false;
		}

		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "zenkaku" })) {
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB1590TW,
									new String[] { String.valueOf(fileRecordCnt), (String) itemvalueMap.get("TXT-KKIFE443-.TOU_INFO") });
			return false;
		}

		// 部屋番号チェック
		strValue = cols[2];
	
		// 必須チェック
		if (strValue == null || strValue.trim().isEmpty()) {
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB1570TW,
									new String[] { String.valueOf(fileRecordCnt), (String) itemvalueMap.get("TXT-KKIFE443-.RM_NO") });
			return false;
		}

		// 桁数チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "ketasuu2", "1", "15" })) {
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB1580TW,
									new String[] { String.valueOf(fileRecordCnt), (String) itemvalueMap.get("TXT-KKIFE443-.RM_NO") });
			return false;
		}

		// 属性チェック
		if (JKUBatCommon.isNotNull(strValue) && !JBSbatCheckUtil.invoke(strValue, new String[] { "zenkaku" })) {
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB1590TW,
									new String[] { String.valueOf(fileRecordCnt), (String) itemvalueMap.get("TXT-KKIFE443-.RM_NO") });
			return false;
		}

		// 確認結果コードチェック
		strValue = cols[3];

		// 必須チェック
		if (strValue == null || strValue.trim().isEmpty()) {
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB1570TW,
									new String[] { String.valueOf(fileRecordCnt), (String) itemvalueMap.get("TXT-KKIFE443-.CFM_RSLT_CD") });
			return false;
		}

		// 桁数チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "ketasuu2", "2", "2" })) {
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB1580TW,
									new String[] { String.valueOf(fileRecordCnt), (String) itemvalueMap.get("TXT-KKIFE443-.CFM_RSLT_CD") });
			return false;
		}

		// 属性チェック
		if (JKUBatCommon.isNotNull(strValue) && !JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakuesuuji1" })) {
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB1590TW,
									new String[] { String.valueOf(fileRecordCnt), (String) itemvalueMap.get("TXT-KKIFE443-.CFM_RSLT_CD") });
			return false;
		}

		// 施工不可フラグチェック
		strValue = cols[6];

		if (strValue != null && !strValue.trim().isEmpty()) {
			
			// 桁数チェック
			if (!JBSbatCheckUtil.invoke(strValue, new String[] { "ketasuu2", "1", "1" })) {
				commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB1580TW,
										new String[] { String.valueOf(fileRecordCnt), (String) itemvalueMap.get("TXT-KKIFE443-.SEKOU_FFG") });
				return false;
			}

			// 属性チェック
			if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakuesuuji1" })) {
				commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB1590TW,
										new String[] { String.valueOf(fileRecordCnt), (String) itemvalueMap.get("TXT-KKIFE443-.SEKOU_FFG"),
										strValue,
										 });
				return false;
			}
			
		}
		

		return true;
	}
	/** ▲▲▲▲▲▲業務チームで作成したメソッドです 終了▲▲▲▲▲▲ */
}
