/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKOrsjgsUseStpInfRcvAdd
*	ソースファイル名	：JBSbatKKOrsjgsUseStpInfRcvAdd.java
*	作成者				：FJ)麻生
*	作成日				：2018年04月06日
*＜機能概要＞
*  そとれんより受信した利用停止情報の卸先事業者契約異動通知スキーマへの登録部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v37.00.00	2018/04/06	FJ)麻生		新規作成
*********************************************************************/
package eo.business.service;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatKKConst;
import eo.business.common.JKKBatCommon;
import eo.business.common.JKKBatConst;
import eo.business.common.JKKBatOneTimeLogWriter;
import eo.business.util.file.JBSbatKKIFE381;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JKKStringUtil;
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.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatAplConst;
import eo.framework.util.JBSbatCheckUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 945604
*/
public class JBSbatKKOrsjgsUseStpInfRcvAdd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(サービス契約)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";

	/** テーブル(回線対象サービス契約)*/
	private static final String D_TBL_NAME_KK_T_KAISEN_TG_SVKEI = "KK_T_KAISEN_TG_SVKEI";

	/** テーブル(卸先事業者契約異動通知)*/
	private static final String D_TBL_NAME_KK_T_ORSJGS_KEI_IDT = "KK_T_ORSJGS_KEI_IDT";

	/** SQL定義キー(KK_SELECT_353)*/
	private static final String KK_T_SVC_KEI_KK_SELECT_353 = "KK_SELECT_353";

	/** SQL定義キー(KK_SELECT_039)*/
	private static final String KK_T_KAISEN_TG_SVKEI_KK_SELECT_039 = "KK_SELECT_039";

	/** テーブルアクセスクラス(サービス契約)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;

	/** テーブルアクセスクラス(回線対象サービス契約)*/
	private JBSbatSQLAccess db_KK_T_KAISEN_TG_SVKEI = null;

	/** テーブルアクセスクラス(卸先事業者契約異動通知)*/
	private JBSbatSQLAccess db_KK_T_ORSJGS_KEI_IDT = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** インターフェースID */
	private static final String IF_ID = "KKIFE381";

	/** サービス種別ネット */
	private static final String SVC_SBT_NET = "1";

	/** サービス種別電話 */
	private static final String SVC_SBT_TEL = "2";

	/** サービス種別テレビ */
	private static final String SVC_SBT_TV = "3";

	/** ログ */
	protected JKKBatOneTimeLogWriter logWriter = null;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		db_KK_T_KAISEN_TG_SVKEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KAISEN_TG_SVKEI);
		db_KK_T_ORSJGS_KEI_IDT = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_ORSJGS_KEI_IDT);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap 入力電文
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception 文字列を取り出す際の型キャスト例外時、ファイル、ＤＢへの入出力エラー発生時等にスローされる例外
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		// 卸先事業者コード取得
		String orsjgsCd = JKKStringUtil.nullToBlank(inMap.getString("ORSJGS_CD"));

		// 格納先のファイルの一覧を取得
		String[] freeParam = commonItem.getFreeItem().split(JKKBatConst.S_PARAM_DELIM);
		String recvDirPath = freeParam[0];
		File recvDir = new File(inspection(freeParam[0]));
		String[] fileList = recvDir.list();

		boolean isFound = false;
		if (fileList != null && fileList.length > 0)
		{
			// ファイル数分処理を行う
			for (int i = 0; i < fileList.length; i++)
			{
				String inputFileName = fileList[i];
				// 処理対象の卸先事業者のIFファイルであるかを判定
				if (inputFileName.matches("^" + IF_ID + "_" + orsjgsCd + "_.*.csv$"))
				{
					isFound = true;
					super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1630AI, new String[]{inputFileName + "の受信登録処理"});
					int okCount = 0;

					// IFファイルの内容を取得
					List<String> lines = new ArrayList<String>();
					String inputFilePath = rnktPath(recvDirPath, inputFileName);
					JBSbatInputFileUtil inputFileUtil = null;
					try
					{
						// ファイルユーティリティのインスタンスを取得
						inputFileUtil = new JBSbatInputFileUtil(inputFilePath);
						String defFilePath = rnktPath(JBSbatAplConst.getAplConstValue("IND"), IF_ID + ".def");
						JBSbatDefFileUtil defFileUtil = new JBSbatDefFileUtil(defFilePath, inputFileUtil);
						inputFileUtil.createReader();
						while (inputFileUtil.ready())
						{
							lines.add(inputFileUtil.readLine());
						}

						// ファイル全体に対してのフォーマットチェック（※ログはチェックメソッドで出力）
						if (!checkFileFormat(lines, inputFileName))
						{
							super.commonItem.setErrFlg(true);
							// 卸先事業者契約異動通知登録はしない
							continue;
						}

						// データ部（１行目と最終行以外）をループ処理
						for (int j = 1; j < lines.size() - 1; j++)
						{
							int row = j + 1;
							JBSbatServiceInterfaceMap recordMap = null;
							recordMap = defFileUtil.lineToObject(lines.get(j), inputFileUtil, row);
							// 行単位のフォーマットチェック（※ログはチェックメソッドで出力）
							if (!singleCheck(recordMap, row))
							{
								super.commonItem.setErrFlg(true);
								// 卸先事業者契約異動通知登録はしない
								continue;
							}

							// チェック結果依存のDB設定項目を格納するマップ
							Map<String, String> registMap = new HashMap<String, String>();
							// DB登録対象のサービス契約を格納するリスト
							List<Map<String, String>> svcKeiList = new ArrayList<Map<String, String>>();
							Map<String, String> netMap = new HashMap<String, String>();
							netMap.put(JKKBatConst.SVC_KEI_NO, recordMap.getString(JBSbatKKIFE381.COMMON_KEY));
							netMap.put(JKKBatConst.SVC_CD, JKKBatConst.SVC_CD_NET);
							svcKeiList.add(netMap);

							// 関連チェック（※ログはチェックメソッドで出力）
							if (relationCheck(recordMap, row, registMap, svcKeiList.get(0)))
							{
								// 正常の場合は同一回線内の電話、テレビも取得
								addSvcKei(svcKeiList, recordMap);
								okCount++;
							}
							else
							{
								super.commonItem.setErrFlg(true);
							}

							for (int k = 0; k < svcKeiList.size(); k++)
							{
								try
								{
									// 卸先事業者契約異動通知登録
									insertOrsjgsKeiIdt(recordMap, svcKeiList.get(k), registMap);
								}
								catch (Exception ex)
								{
									String msgParam = "行数=" + String.valueOf(row) + " 卸先事業者コード="
											+ recordMap.getString(JBSbatKKIFE381.REC_KBN)
											+ " 共通キー=" + recordMap.getString(JBSbatKKIFE381.COMMON_KEY);
									super.logPrint.printErrMsg(JPCBatchMessageConstant.EKKB0510CE, ex,
											new String[]{"卸先事業者契約異動通知", msgParam});
									throw ex;
								}
							}
						}
						super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1650AI,
								new String[]{inputFileName, String.valueOf(okCount)});
						super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1660AI,
								new String[]{inputFileName, String.valueOf(lines.size() - 2 - okCount)});
					}
					catch (IOException ex)
					{
						super.logPrint.printErrMsg(JPCBatchMessageConstant.EKKB1610CE, ex, new String[]{inputFilePath});
						throw ex;
					}
					finally
					{
						if (inputFileUtil != null)
						{
							inputFileUtil.close();
						}
					}

					super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1640AI, new String[]{inputFileName + "の受信登録処理"});
				}
			}
		}

		if (!isFound)
		{
			// 処理対象の卸先事業者のIFファイルが見つからなかった場合
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1540KW, new String[]{orsjgsCd});
			throw new JBSbatBusinessError();
		}

		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_KAISEN_TG_SVKEI.close();
		db_KK_T_SVC_KEI.close();
		db_KK_T_ORSJGS_KEI_IDT.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/

	/**
	 * SQLKEY(KK_SELECT_353)で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_SVC_KEI_KK_SELECT_353(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());

		// DBアクセスを実行します
		db_KK_T_SVC_KEI.selectBySqlDefine(paramList, KK_T_SVC_KEI_KK_SELECT_353);
	}

	/**
	 * SQLKEY(KK_SELECT_039)で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_KAISEN_TG_SVKEI_KK_SELECT_039(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
		paramList.setValue(param[4].toString());
		paramList.setValue(param[5].toString());

		// DBアクセスを実行します
		db_KK_T_KAISEN_TG_SVKEI.selectBySqlDefine(paramList, KK_T_KAISEN_TG_SVKEI_KK_SELECT_039);
	}

	/**
	 * PK(全項目登録)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	卸先事業者契約異動通知番号				ORSJGS_KEI_IDT_NO
	 *		 	卸先事業者連携対象サービス契約番号				ORSJGS_RNK_TG_SVC_KEI_NO
	 *		 	卸先事業者コード				ORSJGS_CD
	 *		 	卸先事業者連携識別コード				ORSJGS_RNKI_SKCD
	 *		 	サービス契約番号				SVC_KEI_NO
	 *		 	サービス種別				SVC_SBT
	 *		 	認証IDパスワード変更区分				NINSHO_ID_PWD_CHG_DIV
	 *		 	認証ID				NINSHO_ID
	 *		 	認証IDパスワード				NINSHO_ID_PWD
	 *		 	サービス開始年月日				SVC_STAYMD
	 *		 	課金開始年月日				CHRG_STAYMD
	 *		 	課金終了年月日				CHRG_ENDYMD
	 *		 	卸先事業者キャンセル理由コード				ORSJGS_CNCL_RSN_CD
	 *		 	卸先事業者キャンセル理由詳細コード				ORSJGS_CNCL_RSN_DTL_CD
	 *		 	卸先事業者キャンセル理由				ORSJGS_CNCL_RSN
	 *		 	工事案件番号				KOJIAK_NO
	 *		 	工事予定年月日				KOJI_RSV_YMD
	 *		 	卸先事業者連携工事予定区分				ORSJGS_RNKI_KOJI_RSV_DIV
	 *		 	卸先事業者解約種別コード				ORSJGS_DSL_SBT_CD
	 *		 	電話解約フラグ				TEL_DSL_FLG
	 *		 	撤去方法種別コード				TK_WAY_SBT_CD
	 *		 	解約問合せ客名				DSL_PROSCST_NM
	 *		 	撤去工事連絡先電話番号				TK_KOJI_RRKS_TLN
	 *		 	工事アポ対応者名				KOJI_APO_TAIOSHA_NM
	 *		 	工事立会者名				KOJI_TACHIAISHA_NM
	 *		 	工事会社連携情報メモ				KOCOMP_RNKI_INF_MEMO
	 *		 	送付先郵便番号				SOHUS_PCD
	 *		 	送付先住所情報				SOHUS_AD_INF
	 *		 	卸先事業者契約異動通知状態コード				ORSJGS_KEI_IDT_STAT_CD
	 *		 	卸先事業者契約異動発生年月日				ORSJGS_KEI_IDO_HASSEI_YMD
	 *		 	卸先事業者契約異動予約年月日				ORSJGS_KEI_IDO_RSV_YMD
	 *		 	卸先事業者契約異動処理年月日				ORSJGS_KEI_IDO_TRN_YMD
	 *		 	卸先事業者契約異動通知年月日時分秒				ORSJGS_KEI_IDT_DTM
	 *		 	卸先事業者契約異動通知結果コード				ORSJGS_KEI_IDT_RSLT_CD
	 *		 	卸先事業者契約異動通知NG理由				ORSJGS_KEI_IDT_NG_RSN
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_ORSJGS_KEI_IDT_PKINSERT(Object[] setParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("ORSJGS_KEI_IDT_NO", setParam[0]);
		setMap.setValue("ORSJGS_RNK_TG_SVC_KEI_NO", setParam[1]);
		setMap.setValue("ORSJGS_CD", setParam[2]);
		setMap.setValue("ORSJGS_RNKI_SKCD", setParam[3]);
		setMap.setValue("SVC_KEI_NO", setParam[4]);
		setMap.setValue("SVC_SBT", setParam[5]);
		setMap.setValue("NINSHO_ID_PWD_CHG_DIV", setParam[6]);
		setMap.setValue("NINSHO_ID", setParam[7]);
		setMap.setValue("NINSHO_ID_PWD", setParam[8]);
		setMap.setValue("SVC_STAYMD", setParam[9]);
		setMap.setValue("CHRG_STAYMD", setParam[10]);
		setMap.setValue("CHRG_ENDYMD", setParam[11]);
		setMap.setValue("ORSJGS_CNCL_RSN_CD", setParam[12]);
		setMap.setValue("ORSJGS_CNCL_RSN_DTL_CD", setParam[13]);
		setMap.setValue("ORSJGS_CNCL_RSN", setParam[14]);
		setMap.setValue("KOJIAK_NO", setParam[15]);
		setMap.setValue("KOJI_RSV_YMD", setParam[16]);
		setMap.setValue("ORSJGS_RNKI_KOJI_RSV_DIV", setParam[17]);
		setMap.setValue("ORSJGS_DSL_SBT_CD", setParam[18]);
		setMap.setValue("TEL_DSL_FLG", setParam[19]);
		setMap.setValue("TK_WAY_SBT_CD", setParam[20]);
		setMap.setValue("DSL_PROSCST_NM", setParam[21]);
		setMap.setValue("TK_KOJI_RRKS_TLN", setParam[22]);
		setMap.setValue("KOJI_APO_TAIOSHA_NM", setParam[23]);
		setMap.setValue("KOJI_TACHIAISHA_NM", setParam[24]);
		setMap.setValue("KOCOMP_RNKI_INF_MEMO", setParam[25]);
		setMap.setValue("SOHUS_PCD", setParam[26]);
		setMap.setValue("SOHUS_AD_INF", setParam[27]);
		setMap.setValue("ORSJGS_KEI_IDT_STAT_CD", setParam[28]);
		setMap.setValue("ORSJGS_KEI_IDO_HASSEI_YMD", setParam[29]);
		setMap.setValue("ORSJGS_KEI_IDO_RSV_YMD", setParam[30]);
		setMap.setValue("ORSJGS_KEI_IDO_TRN_YMD", setParam[31]);
		setMap.setValue("ORSJGS_KEI_IDT_DTM", setParam[32]);
		setMap.setValue("ORSJGS_KEI_IDT_RSLT_CD", setParam[33]);
		setMap.setValue("ORSJGS_KEI_IDT_NG_RSN", setParam[34]);
	
		// DBアクセスを実行します
		db_KK_T_ORSJGS_KEI_IDT.insertByPrimaryKeys(setMap);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * パス文字列を連結します。<br>
	 * <br>
	 * @param path1 パス文字列
	 * @param path2 パス文字列
	 * @return 連結したパス文字列
	 */
	private String rnktPath(String path1, String path2)
	{
		String pathDlmt = "/";
		if (path1.indexOf("\\") > -1 || path2.indexOf("\\") > -1)
		{
			pathDlmt = "\\";
		}
		if (!path1.endsWith(pathDlmt))
		{
			return path1 + pathDlmt + path2;
		}
		return path1 + path2;
	}	

	/**
	 * 環境変数ディレクトリ検査用メソッドです。（ファイルインジェクション対策）<br>
	 * 半角アルファベットと数字のみで構成されていることを検査します。<br>
	 * <br>
	 * @param argDirNm 検査する文字列
	 * @return String 検査した文字列
	 * @throws IllegalArgumentException 不正なパスが指定された際の例外
	 */
	private String inspection(String argDirNm) throws IllegalArgumentException
	{
		
		if (argDirNm.matches("\\p{InBasicLatin}+"))
		{
			return argDirNm;
		}
		throw new IllegalArgumentException(argDirNm); // 誤ったファイル名を指定
	}

	/**
	 * ファイル全体に対してのフォーマットチェックを行います。<br>
	 * <br>
	 * @param lines 各行の文字列を格納したリスト
	 * @param inputFileName 入力ファイル名
	 * @return チェック結果
	 */
	private boolean checkFileFormat(List<String> lines, String inputFileName)
	{
		boolean isValidHeader = false;
		boolean isValidTrailer = false;
		boolean isValidCount = false;
		boolean isValidAll = false;

		String readCount = "0";

		if (lines != null && lines.size() > 0)
		{
			if (lines.get(0) != null)
			{
				// ヘッダのフォーマットチェック
				isValidHeader = lines.get(0).matches("^\"00\"$");
			}
			if (lines.get(lines.size() - 1) != null)
			{
				// トレーラのフォーマットチェック
				isValidTrailer = lines.get(lines.size() - 1).matches("^\"99\",\"\\d{1,10}\"$");
			}
			if (isValidTrailer)
			{
				// ヘッダとトレーラのチェック結果が正常の場合、データ部の件数をチェック
				String trailer = JKKStringUtil.nullToBlank(lines.get(lines.size() - 1));
				String trailerCount = trailer.replaceFirst("^\"99\",\"(\\d{1,10})\"$", "$1");
				// 期待する件数
				int expectedCount = Integer.valueOf(trailerCount);
				// 実際に渡された件数（データ部の件数）
				int actualCount = 0;
				if (isValidHeader)
				{
					actualCount = lines.size() - 2;
				}
				else
				{
					actualCount = lines.size() - 1;
				}
				isValidCount = (actualCount == expectedCount);
				if (isValidCount)
				{
					readCount = trailerCount;
				}
			}
		}

		if (!isValidHeader)
		{
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1550KW, new String[]{inputFileName});
		}
		if (!isValidTrailer)
		{
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1560KW, new String[]{inputFileName});
		}
		if (isValidTrailer && !isValidCount)
		{
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB0550AW, new String[]{inputFileName});
		}
		if (isValidTrailer && isValidCount)
		{
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB0750AI, new String[]{inputFileName, readCount});
		}
		isValidAll = isValidHeader && isValidTrailer && isValidCount;
		if (!isValidAll)
		{
			if (isValidTrailer && isValidCount)
			{
				super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1650AI, new String[]{inputFileName, "0"});
				super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1660AI, new String[]{inputFileName, readCount});
			}
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1640AI, new String[]{inputFileName + "の受信登録処理"});
		}

		return isValidAll;
	}

	/**
	 * 単項目エラー時のメッセージパラメータを返却します。<br>
	 * <br>
	 * @param recordMap 入力データを格納されたMap
	 * @return メッセージパラメータ
	 * @throws Exception 文字列を取り出す際の型キャスト時の例外
	 */
	private String getMsgParam(JBSbatServiceInterfaceMap recordMap) throws Exception
	{
		String recKbn = recordMap.getString("REC_KBN");
		String commonKey = recordMap.getString("COMMON_KEY");

		StringBuffer sb = new StringBuffer();
		sb.append("卸先事業者コード=");
		sb.append(recKbn);
		sb.append("、");
		sb.append("共通キー=");
		sb.append(commonKey);

		return sb.toString();
	}

	/**
	 * 項目の基本的なチェックを行います。<br>
	 * <br>
	 * @param recordMap 入力データを格納されたMap
	 * @param itemKey 項目値を取得するためのキー
	 * @param checkNull 必須チェックの有無
	 * @param lengthSta 開始項目長
	 * @param lengthEnd 終了項目長
	 * @param type 項目の属性
	 * @param row 行数（エラーログの出力に使用）
	 * @return チェック結果
	 * @throws Exception 文字列を取り出す際の型キャスト時の例外
	 */
	private boolean singleCheckBase(JBSbatServiceInterfaceMap recordMap, String itemKey, boolean checkNull, int lengthSta, int lengthEnd, String type,
			int row) throws Exception
	{
		// 項目値の取得
		String strValue = recordMap.getString(itemKey);

		if (checkNull)
		{
			// 必須チェック
			if(JKKStringUtil.isNullBlank(strValue))
			{
				super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1570TW, new String[]{String.valueOf(row), getMsgParam(recordMap)});
				return false;
			}
		}
		//必須ではなく、空文字以外はチェックを行う
		if (!(!checkNull && JKKStringUtil.isNullBlank(strValue)))
		{
			// 桁数チェック
			if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", String.valueOf(lengthSta), String.valueOf(lengthEnd)}))
			{
				super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1580TW, new String[]{String.valueOf(row), getMsgParam(recordMap)});
				return false;
			}
		}

		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{type}))
		{
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1590TW, new String[]{String.valueOf(row), getMsgParam(recordMap)});
			return false;
		}

		return true;
	}

	/**
	 * 単項目チェックを行います。<br>
	 * <br>
	 * @param recordMap 入力データを格納されたMap
	 * @param row 行数（エラーログの出力に使用）
	 * @return チェック結果
	 * @throws Exception 文字列を取り出す際の型キャスト時の例外（下位メソッド）
	 */
	private boolean singleCheck(JBSbatServiceInterfaceMap recordMap, int row) throws Exception
	{
		// 卸先事業者コードの単項目チェック
		boolean isValidRecKbn = singleCheckBase(recordMap, "REC_KBN", true, 2, 2, "hannkakuesuuji1", row);
		// 共通キーの単項目チェック
		boolean isValidCommonKey = singleCheckBase(recordMap, "COMMON_KEY", true, 10, 10, "hannkakuesuuji1", row);

		return isValidRecKbn && isValidCommonKey;
	}

	/**
	 * 関連チェックを行います。<br>
	 * <br>
	 * @param recordMap 入力データを格納されたMap
	 * @param row 行数（エラーログの出力に使用）
	 * @param registMap チェック結果に依存するDB登録項目を設定するマップ
	 * @param svcKeiMap サービス契約情報を格納したマップ
	 * @return チェック結果
	 * @throws Exception 文字列を取り出す際の型キャスト時、DBアクセス時の例外
	 */
	private boolean relationCheck(JBSbatServiceInterfaceMap recordMap, int row, Map<String, String> registMap,
			Map<String, String> svcKeiMap) throws Exception
	{
		// 卸先事業者コード
		String recKbn = recordMap.getString("REC_KBN");
		// 共通キー
		String commonKey = recordMap.getString("COMMON_KEY");

		// SQLパラメータを設定
		Object[] param = new Object[]{
				super.opeDate,
				super.opeDate,
				recKbn,
				commonKey,
		};

		executeKK_T_SVC_KEI_KK_SELECT_353(param);

		// 実行結果を取得
		JBSbatCommonDBInterface dbMap = db_KK_T_SVC_KEI.selectNext();

		if (dbMap == null || !JKKBatConst.SVC_CD_NET.equals(dbMap.getString(JBSbatKK_T_SVC_KEI.SVC_CD)))
		{
			// レコードが取得できないかネットではない場合はチェックエラー
			// 卸先事業者契約異動処理年月日
			registMap.put("ORSJGS_KEI_IDO_TRN_YMD", super.opeDate);
			// 卸先事業者契約異動通知結果コード
			registMap.put("ORSJGS_KEI_IDT_RSLT_CD", "2");
			// 卸先事業者契約異動通知NG理由
			registMap.put("ORSJGS_KEI_IDT_NG_RSN", "契約者情報が存在しませんでした。");
			if (dbMap != null)
			{
				String svcCd = dbMap.getString(JBSbatKK_T_SVC_KEI.SVC_CD);
				// 電話、テレビの場合のみサービスコードを置き換える
				if (JKKBatConst.SVC_CD_TEL.equals(svcCd) || JKKBatConst.SVC_CD_TV.equals(svcCd))
				{
					svcKeiMap.put(JKKBatConst.SVC_CD, svcCd);
				}
			}

			String msgParam = "サービス契約に共通キー=" + commonKey;
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1600KW, new String[]{msgParam});

			return false;
		}

		// 卸先事業者契約異動処理年月日
		registMap.put("ORSJGS_KEI_IDO_TRN_YMD", "");
		// 卸先事業者契約異動通知結果コード
		registMap.put("ORSJGS_KEI_IDT_RSLT_CD", "");
		// 卸先事業者契約異動通知NG理由
		registMap.put("ORSJGS_KEI_IDT_NG_RSN", "");

		return true;
	}

	/**
	 * 同一回線の処理対象となるサービス契約を追加します。<br>
	 * <br>
	 * @param svcKeiList 登録対象のサービス契約を格納するリスト
	 * @param recordMap 入力データを格納されたMap
	 * @throws Exception 文字列を取り出す際の型キャスト時、DBアクセス時の例外
	 */
	private void addSvcKei(List<Map<String, String>> svcKeiList, JBSbatServiceInterfaceMap recordMap) throws Exception
	{
		// 電話、テレビのサービス契約番号を取得
		// SQLパラメータを設定
		Object[] param = new Object[]{
				svcKeiList.get(0).get(JKKBatConst.SVC_KEI_NO), // IFファイルのサービス契約番号（ネット）
				super.opeDate,
				super.opeDate,
				super.opeDate,
				super.opeDate,
				super.opeDate,
		};
		executeKK_T_KAISEN_TG_SVKEI_KK_SELECT_039(param);

		// 実行結果を取得
		JBSbatCommonDBInterface dbMap = db_KK_T_KAISEN_TG_SVKEI.selectNext();

		while (dbMap != null)
		{
			if (JBSbatKKConst.SVC_KEI_STAT_SVCTK_CHU.equals(dbMap.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_STAT)))
			{
				Map<String, String> svcKeiMap = new HashMap<String, String>();
				svcKeiMap.put(JKKBatConst.SVC_KEI_NO, dbMap.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_NO));
				svcKeiMap.put(JKKBatConst.SVC_CD, dbMap.getString(JBSbatKK_T_SVC_KEI.SVC_CD));
				svcKeiList.add(svcKeiMap);
			}
			dbMap = db_KK_T_KAISEN_TG_SVKEI.selectNext();
		}
	}

	/**
	 * 卸先事業者契約異動通知に登録します。<br>
	 * <br>
	 * @param inMap 入力電文
	 * @param svcKeiMap サービス契約情報を格納したマップ
	 * @param registItemMap チェック結果に依存する項目を設定したマップ
	 * @throws Exception 文字列を取り出す際の型キャスト時、DBアクセス時の例外
	 */
	private void insertOrsjgsKeiIdt(JBSbatServiceInterfaceMap inMap, Map<String, String> svcKeiMap,
			Map<String, String> registItemMap) throws Exception
	{
		String svcKeiNo = svcKeiMap.get(JKKBatConst.SVC_KEI_NO);
		String svcCd = svcKeiMap.get(JKKBatConst.SVC_CD);
		String svcSbt = "";
		if (JKKBatConst.SVC_CD_NET.equals(svcCd))
		{
			svcSbt = SVC_SBT_NET;
		}
		else if (JKKBatConst.SVC_CD_TEL.equals(svcCd))
		{
			svcSbt = SVC_SBT_TEL;
		}
		else if (JKKBatConst.SVC_CD_TV.equals(svcCd))
		{
			svcSbt = SVC_SBT_TV;
		}
		// 登録項目
		String[] setParam = new String[]{
				JKKBatCommon.getFormatedNextSeq(commonItem, "SEQ_ORSJGS_KEI_IDT_NO", "", 15),		// 卸先事業者契約異動通知番号
				inMap.getString(JBSbatKKIFE381.COMMON_KEY),		// 卸先事業者連携対象サービス契約番号
				inMap.getString(JBSbatKKIFE381.REC_KBN),		// 卸先事業者コード
				"07",		// 卸先事業者連携識別コード
				svcKeiNo,		// サービス契約番号
				svcSbt,		// サービス種別
				"",		// 認証IDパスワード変更区分
				"",		// 認証ID
				"",		// 認証IDパスワード
				"",		// サービス開始年月日
				"",		// 課金開始年月日
				"",		// 課金終了年月日
				"",		// 卸先事業者キャンセル理由コード
				"",		// 卸先事業者キャンセル理由詳細コード
				"",		// 卸先事業者キャンセル理由
				"",		// 工事案件番号
				"",		// 工事予定年月日
				"",		// 卸先事業者連携工事予定区分
				"",		// 卸先事業者解約種別コード
				"",		// 電話解約フラグ
				"",		// 撤去方法種別コード
				"",		// 解約問合せ客名
				"",		// 撤去工事連絡先電話番号
				"",		// 工事アポ対応者名
				"",		// 工事立会者名
				"",		// 工事会社連携情報メモ
				"",		// 送付先郵便番号
				"",		// 送付先住所情報
				"0",		// 卸先事業者契約異動通知状態コード
				super.opeDate,		// 卸先事業者契約異動発生年月日
				"",		// 卸先事業者契約異動予約年月日
				registItemMap.get("ORSJGS_KEI_IDO_TRN_YMD"),		// 卸先事業者契約異動処理年月日
				"",		// 卸先事業者契約異動通知年月日時分秒
				registItemMap.get("ORSJGS_KEI_IDT_RSLT_CD"),		// 卸先事業者契約異動通知結果コード
				registItemMap.get("ORSJGS_KEI_IDT_NG_RSN"),		// 卸先事業者契約異動通知NG理由
		};
		executeKK_T_ORSJGS_KEI_IDT_PKINSERT(setParam);
	}
}
