/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCRToiawaseRkTrkm
*	ソースファイル名	：JBSbatCRToiawaseRkTrkm.java
*	作成者				：富士通　
*	作成日				：2011年04月21日
*＜機能概要＞
*　問合せ履歴取込処理
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/04/21   富士通		新規作成
*	v6.00.00	2013/09/05  FJ斉藤諭	QA-2013-0002633対応
*	v6.00.00	2013/09/06  FJ斉藤諭	OM-2013-0001745対応
*	v6.00.01	2013/11/26  FJ斉藤諭	ANK-1637-00-00対応
*	v42.00.00	2019/04/01  FJ) 前田	ANK-3593-00-00_オペレータ支援対応に伴うeo顧客機能改修（お客さまカルテ）
*	v48.00.00	2019/12/27  FJ) 張本	ANK-3795-00-00_見込顧客システム構築対応
*********************************************************************/
package eo.business.service;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCRBatCommon;
import eo.business.util.table.JBSbatCR_T_TAIO_KIROK;
import eo.common.constant.JCRStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.constant.JZM0171Constant;
import eo.common.util.JCRUtilCommon;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.log.JBSbatLogPrintControl;

/**
* 問合せ履歴取込処理<p>
*<BR>
* @author 富士通
*/
public class JBSbatCRToiawaseRkTrkm extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(サービス契約)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";

	/** テーブル(お客様)*/
	private static final String D_TBL_NAME_CK_T_CUST = "CK_T_CUST";

	/** テーブル(問合せ客)*/
	private static final String D_TBL_NAME_CK_T_PROSCST = "CK_T_PROSCST";

	/** テーブル(キューＢＯＸ)*/
	private static final String D_TBL_NAME_CR_T_QUE_BOX = "CR_T_QUE_BOX";

	/** テーブル(ＭＹＢＯＸ)*/
	private static final String D_TBL_NAME_CR_T_MYBOX = "CR_T_MYBOX";

	/** テーブル(カテゴリー)*/
	private static final String D_TBL_NAME_CR_M_CTGR = "CR_M_CTGR";

	/** テーブル(コード名称管理)*/
	private static final String D_TBL_NAME_ZM_M_CD_NM_KANRI = "ZM_M_CD_NM_KANRI";

	/** テーブル(対応記録)*/
	private static final String D_TBL_NAME_CR_T_TAIO_KIROK = "CR_T_TAIO_KIROK";

	/** SQL定義キー(CR_SELECT_001)*/
//	private static final String KK_T_SVC_KEI_CR_SELECT_001 = "CR_SELECT_001";

	/** SQL定義キー(CR_SELECT_002)*/
//	private static final String CK_T_CUST_CR_SELECT_002 = "CR_SELECT_002";

	/** SQL定義キー(CR_SELECT_001)*/
//	private static final String CK_T_PROSCST_CR_SELECT_001 = "CR_SELECT_001";

	/** SQL定義キー(CR_SELECT_004)*/
//	private static final String CR_T_QUE_BOX_CR_SELECT_004 = "CR_SELECT_004";

	/** SQL定義キー(CR_SELECT_001)*/
//	private static final String CR_T_MYBOX_CR_SELECT_001 = "CR_SELECT_001";

	/** SQL定義キー(CR_SELECT_003)*/
//	private static final String CR_M_CTGR_CR_SELECT_003 = "CR_SELECT_003";

	/** SQL定義キー(CR_SELECT_004)*/
//	private static final String CR_M_CTGR_CR_SELECT_004 = "CR_SELECT_004";

	/** SQL定義キー(CR_SELECT_001)*/
//	private static final String ZM_M_CD_NM_KANRI_CR_SELECT_001 = "CR_SELECT_001";

	/** SQL定義キー(CR_SELECT_002)*/
//	private static final String KK_T_SVC_KEI_CR_SELECT_002 = "CR_SELECT_002";

	/** テーブルアクセスクラス(サービス契約)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;

	/** テーブルアクセスクラス(お客様)*/
	private JBSbatSQLAccess db_CK_T_CUST = null;

	/** テーブルアクセスクラス(問合せ客)*/
	private JBSbatSQLAccess db_CK_T_PROSCST = null;

	/** テーブルアクセスクラス(キューＢＯＸ)*/
	private JBSbatSQLAccess db_CR_T_QUE_BOX = null;

	/** テーブルアクセスクラス(ＭＹＢＯＸ)*/
	private JBSbatSQLAccess db_CR_T_MYBOX = null;

	/** テーブルアクセスクラス(カテゴリー)*/
	private JBSbatSQLAccess db_CR_M_CTGR = null;

	/** テーブルアクセスクラス(コード名称管理)*/
	private JBSbatSQLAccess db_ZM_M_CD_NM_KANRI = null;

	/** テーブルアクセスクラス(対応記録)*/
	private JBSbatSQLAccess db_CR_T_TAIO_KIROK = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** CASEファイル名の先頭文字 */
	private static final String CASE_PRE_FIX = "CASE_";
	/** CASEエラーファイル名の先頭文字 */
	private static final String CASE_ERR_PRE_FIX = "CASE_NG_";
	/** 件数ファイル名の後部文字列 */

	/** インデックス:顧客タイプ */
	private static final int IDX_KOKYAKU_TYPE = 0;
	/** インデックス:サービス契約番号 */
	private static final int IDX_SVC_KEI_NO = 1;
	/** インデックス:顧客氏名 */
//	private static final int IDX_SHIMEI = 2;
	/** インデックス:顧客氏名(カナ) */
//	private static final int IDX_SHIMEI_KANA = 3;
	/** インデックス:電話番号 */
//	private static final int IDX_TEL1 = 4;
	/** インデックス:電話番号2 */
//	private static final int IDX_TEL2 = 5;
	/** インデックス:郵便番号 */
//	private static final int IDX_YUBIN_NO = 6;
	/** インデックス:住所1 */
//	private static final int IDX_JUSHO1 = 7;
	/** インデックス:住所2 */
//	private static final int IDX_JUSHO2 = 8;
	/** インデックス:住所3 */
//	private static final int IDX_JUSHO3 = 9;
	/** インデックス:性別 */
//	private static final int IDX_SEIBETSU = 10;
	/** インデックス:生年月日 */
//	private static final int IDX_SEINENGAPPI = 11;
	/** インデックス:状態 */
	private static final int IDX_JOTAI = 12;
	/** インデックス:ステータス */
//	private static final int IDX_STATUS = 13;
	/** インデックス:作成日時 */
	private static final int IDX_SAKUSEI_DATE = 14;
	/** インデックス:受付者 */
//	private static final int IDX_UKETSUKE = 15;
	/** インデックス:担当者 */
	private static final int IDX_TANTO = 16;
	/** インデックス:キューBOX名 */
	private static final int IDX_QUE_NM = 17;
	/** インデックス:受付種別 */
	private static final int IDX_UKETSUKE_SBT = 18;
	/** インデックス:タイトル */
	private static final int IDX_TITLE = 19;
	/** インデックス:カテゴリー1 */
	private static final int IDX_CTGR_01 = 20;
	/** インデックス:カテゴリー2 */
//	private static final int IDX_CTGR_02 = 21;
	/** インデックス:カテゴリー3 */
//	private static final int IDX_CTGR_03 = 22;
	/** インデックス:カテゴリー4 */
//	private static final int IDX_CTGR_04 = 23;
	/** インデックス:カテゴリー5 */
//	private static final int IDX_CTGR_05 = 24;
	/** インデックス:カテゴリー6 */
//	private static final int IDX_CTGR_06 = 25;
	/** インデックス:カテゴリー7 */
//	private static final int IDX_CTGR_07 = 26;
	/** インデックス:カテゴリー8 */
//	private static final int IDX_CTGR_08 = 27;
	/** インデックス:カテゴリー9 */
//	private static final int IDX_CTGR_09 = 28;
	/** インデックス:カテゴリー10 */
//	private static final int IDX_CTGR_10 = 29;
	/** インデックス:カテゴリー11 */
//	private static final int IDX_CTGR_11 = 30;
	/** インデックス:問合せ履歴 */
	private static final int IDX_RIREKI = 31;
	/** インデックス:問合せ客番号 */
	private static final int IDX_TIAWS_KYAKU_NO = 32;
	/** インデックス:eoID */
//	private static final int IDX_EOID = 33;
	/** インデックス:申込書番号 */
//	private static final int IDX_MUSKM_SHO_NO = 34;
	/** インデックス:コールバック日時 */
	private static final int IDX_CALLBACK_DATE = 35;
	/** インデックス:コールバック時間指定タイプ */
	private static final int IDX_CALLBACK_TYPE = 36;
	/** インデックス:業務個別設定組織コード */
	private static final int IDX_WKKBT_ORG_CD = 37;
	// ANK-3593-00-00 ADD START
	/** インデックス:反響可能性フラグ */
	private static final int IDX_HANKYO_PSB_FLG = 38;
	/** インデックス:対応部署名 */
	private static final int IDX_TAIO_BUSHO_NM = 39;
	// ANK-3593-00-00 ADD END
// v48.00.00 ANK-3795-00-00 ADD START
	/** インデックス:見込顧客番号 */	
	private static final int IDX_MIKMCST_NO = 40;
// v48.00.00 ANK-3795-00-00 ADD END

	/** 1行の項目数 開始 */
	private static final int KOUMOKU_SU_START = 37;

	/**
	 * 1行の項目数 終了
	 * （反響可能性フラグ、対応部署名、見込顧客番号の追加により39,40,41とも許容する）
	 */
// v48.00.00 ANK-3795-00-00 MOD START
//	// ANK-3593-00-00 MOD START
//	//private static final int KOUMOKU_SU_END = 38;
//	private static final int KOUMOKU_SU_END = 40;
//	// ANK-3593-00-00 MOD END
	private static final int KOUMOKU_SU_END = 41;
// v48.00.00 ANK-3795-00-00 MOD START

	/** 未加入者 */
	private static final String MI_KANYUSHA = "未加入者";

	/** 最大カテゴリーレベル */
	private static final int MAX_TGR_LVL = 11;
	/** 対応記録番号の桁数 */
	private static final int KETA_TAIO_KIROK_NO = 10;
	/** 業務個別設定組織コードの桁数 */
	private static final int KETA_WKKBT_ORG_CD = 10;

	/** コールバック希望年月日の終了桁数 */
	private static final int KETA_CALLBACK_YYYYMMDD_END = 8;
	/** コールバック希望時分の開始桁数 */
	private static final int KETA_CALLBACK_HHMI_START = 8;
	/** コールバック希望時分の開始桁数 */
	private static final int KETA_CALLBACK_HHMI_END = 12;
	/** ユーザーIDのバイト数 */
	private static final int USERID_BYTE_SU = 10;
	/** 問合せ客番号のバイト数 */
	private static final int TIAWS_KYAKU_NO_BYTE_SU = 10;

	/** エラー有無を取得するキー */
	private static final String KEY_EXIST_ERROR = "KEY_EXIST_ERROR";
	/** 項目数エラー有無を取得するキー */
	private static final String KEY_EXIST_KOUMOKUSU_ERROR = "KEY_EXIST_KOUMOKUSU_ERROR";
	/** エラー行データを取得するキー */
	private static final String KEY_ERR_DATA = "KEY_ERR_DATA";
	/** ログデータを取得するキー */
	private static final String KEY_LOG_DATA = "KEY_LOG_DATA";
	/** サービス契約番号を取得するキー */
	private static final String KEY_SVC_KEY_NO = "KEY_SVC_KEY_NO";
	/** キューBOX番号を取得するキー */
	private static final String KEY_QUE_BOX_NO = "KEY_QUE_BOX_NO";
	/** MYBOX番号を取得するキー */
	private static final String KEY_MYBOX_NO = "KEY_MYBOX_NO";

	/** 取込元のCSVファイルが配置されるディレクトリーパス */
	private File csvPath = null;

	/** 取込元のCSVファイルを処理用に変換したファイルを配置するディレクトリーパス */
	private File tmpPath = null;

	/** 正常終了したデータを格納したファイルを配置するディレクトリーパス */
	private File normalDataPath = null;

	/** 異常終了したデータを格納したファイルを配置するディレクトリーパス */
	private File abnormalDataPath = null;

	/** 問合せタイトルタイトル */
	private String toiawaseTitle = null;

	/** NGワードチェック条件のList */
	private String[] ngWordChkJokenList = null;

	/** YYYYMMDDHHmmの桁数 */
	private static final int KETA_YYYYMMDDHHMM = 12;

	/**
	 * 初期処理
	 * @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_CK_T_CUST = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CK_T_CUST);
		db_CK_T_PROSCST = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CK_T_PROSCST);
		db_CR_T_QUE_BOX = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CR_T_QUE_BOX);
		db_CR_T_MYBOX = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CR_T_MYBOX);
		db_CR_M_CTGR = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CR_M_CTGR);
		db_ZM_M_CD_NM_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_CD_NM_KANRI);
		db_CR_T_TAIO_KIROK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CR_T_TAIO_KIROK);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		// プロパティーチェック
		checkProperty();

	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * プロパティーチェック
	 * @throws Exception 例外
	 */
	private void checkProperty() throws Exception
	{

		// プロパティーチェック

		// 取込元のCSVファイルが配置されるディレクトリーパス
		String path = JCRBatCommon.getApplicationConst("CR_TWS_RK_FILE_DIR");
		if (path == null)
		{
			// ECRB0010KW:プロパティーファイルの設定が正しくありません。(項目名:%1%)
			throw new JBSbatBusinessException(JPCBatchMessageConstant.ECRB0010KW, new String[]{"CR_TWS_RK_FILE_DIR"});
		}
		else
		{
			csvPath = JCRUtilCommon.checkDirExist(path);
			if (csvPath == null)
			{
				// 存在しない場合
				// ECRB0160KW:指定されたパスが存在しません。(%1%)
				throw new JBSbatBusinessException(JPCBatchMessageConstant.ECRB0160KW, new String[]{path});
			}
			super.logPrint.printDebugLog("取込元のCSVファイルが配置されるディレクトリーパス:" + csvPath);
		}

		// 取込元のCSVファイルを処理用に変換したファイルを配置するディレクトリーパス
		path = JCRBatCommon.getApplicationConst("CR_TWS_RK_TMP_FILE_DIR");
		if (path == null)
		{
			// ECRB0010KW:プロパティーファイルの設定が正しくありません。(項目名:%1%)
			throw new JBSbatBusinessException(JPCBatchMessageConstant.ECRB0010KW, new String[]{"CR_TWS_RK_TMP_FILE_DIR"});
		}
		else
		{
			tmpPath = JCRUtilCommon.checkDirExist(path);
			if (tmpPath == null)
			{
				// 存在しない場合
				// ECRB0160KW:指定されたパスが存在しません。(%1%)
				throw new JBSbatBusinessException(JPCBatchMessageConstant.ECRB0160KW, new String[]{path});
			}
			super.logPrint.printDebugLog("取込元のCSVファイルを処理用に変換したファイルを配置するディレクトリーパス:" + tmpPath);
		}

		// 正常終了したデータを格納したファイルを配置するディレクトリーパス
		path = JCRBatCommon.getApplicationConst("CR_TWS_RK_NML_DATA_DIR");
		if (path == null)
		{
			// ECRB0010KW:プロパティーファイルの設定が正しくありません。(項目名:%1%)
			throw new JBSbatBusinessException(JPCBatchMessageConstant.ECRB0010KW, new String[]{"CR_TWS_RK_NML_DATA_DIR"});
		}
		else
		{
			normalDataPath = JCRUtilCommon.checkDirExist(path);
			if (normalDataPath == null)
			{
				// 存在しない場合
				// ECRB0160KW:指定されたパスが存在しません。(%1%)
				throw new JBSbatBusinessException(JPCBatchMessageConstant.ECRB0160KW, new String[]{path});
			}
			super.logPrint.printDebugLog("正常終了したデータを格納したファイルを配置するディレクトリーパス:" + normalDataPath);
		}

		// 異常終了したデータを格納したファイルを配置するディレクトリーパス
		path = JCRBatCommon.getApplicationConst("CR_TWS_RK_ABNML_DATA_DIR");
		if (path == null)
		{
			// ECRB0010KW:プロパティーファイルの設定が正しくありません。(項目名:%1%)
			throw new JBSbatBusinessException(JPCBatchMessageConstant.ECRB0010KW, new String[]{"CR_TWS_RK_ABNML_DATA_DIR"});
		}
		else
		{
			abnormalDataPath = JCRUtilCommon.checkDirExist(path);
			if (abnormalDataPath == null)
			{
				// 存在しない場合
				// ECRB0160KW:指定されたパスが存在しません。(%1%)
				throw new JBSbatBusinessException(JPCBatchMessageConstant.ECRB0160KW, new String[]{path});
			}
			super.logPrint.printDebugLog("異常終了したデータを格納したファイルを配置するディレクトリーパス:" + abnormalDataPath);
		}

		// 「読込ファイル」の「タイトル」が空白の場合に設定するタイトル
		toiawaseTitle = JCRBatCommon.getApplicationConst("CR_TWS_RK_TITLE");
		if (toiawaseTitle == null || "".equals(toiawaseTitle.trim()))
		{
			// ECRB0010KW:プロパティーファイルの設定が正しくありません。(項目名:%1%)
			throw new JBSbatBusinessException(JPCBatchMessageConstant.ECRB0010KW, new String[]{"CR_TWS_RK_TITLE"});
		}
		super.logPrint.printDebugLog("問合せタイトル:" + toiawaseTitle);

		// NGワードチェック条件
		String ngWordChkJoken = JCRBatCommon.getApplicationConst("CR_NGWD_CHK_JOKEN");
		if (ngWordChkJoken != null)
		{
			ngWordChkJokenList = ngWordChkJoken.split(",");
			if (ngWordChkJokenList != null)
			{
				if ((ngWordChkJokenList.length % 2) != 0)
				{
					// 設定項目数が偶数でない場合
					// ECRB0010KW:プロパティーファイルの設定が正しくありません。(項目名:%1%)
					throw new JBSbatBusinessException(JPCBatchMessageConstant.ECRB0010KW, new String[]{"CR_NGWD_CHK_JOKEN"});
				}

				// NGワードチェックを行うかどうかの条件チェック
				for (int i = 0; i < ngWordChkJokenList.length; i++)
				{
					String index = "";
					if ((i % 2) == 0)
					{
						index = ngWordChkJokenList[i].trim();
						if (!(JCRBatCommon.isHannkakuSuuji1(index)))
						{
							// 項目インデックス(Listの添字)が偶数の場合
							// 内容が数字でない場合はエラー
							// ECRB0010KW:プロパティーファイルの設定が正しくありません。(項目名:%1%)
							throw new JBSbatBusinessException(JPCBatchMessageConstant.ECRB0010KW, new String[]{"CR_NGWD_CHK_JOKEN"});
						}
					}
				}
			}
			super.logPrint.printDebugLog("NGワードチェック条件:" + ngWordChkJoken);
		}
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		// 対象ディレクトリー内の全ファイル取得
		File[] csvFiles = csvPath.listFiles();

		int tgtFileCount = 0;

		for (int i = 0; i < csvFiles.length; i++)
		{
			File csvFile = csvFiles[i];
			String csvFileName = csvFile.getName().toUpperCase();

			if (csvFileName.startsWith(CASE_PRE_FIX) && csvFileName.endsWith(JCRStrConst.EXT_CSV))
			{
				// ファイル名が、「CASE_」で始まり「.CSV」で終わっているものが対象
				super.logPrint.printDebugLog("対象ファイル名:" + csvFile.getName());

				// 付属ファイル確認(件数ファイル、フラグファイルの存在確認)
				Map<String, File> huzokuFileMap = JCRBatCommon.getHuzokuFile(commonItem, csvFile, csvPath);
				File countFile = null;		// 件数ファイル
				File flgFile = null;		// フラグファイル

				// 権限ファイル(1行目に業務個別設定組織コードが設定される)
				// 対応履歴ファイル取込画面を使用した場合のみ存在
				File athFile = null;

				if (huzokuFileMap.size() < 2)
				{
					continue;
				}
				else
				{
					countFile = huzokuFileMap.get(JCRBatCommon.KEY_KENSU_FILE);
					flgFile = huzokuFileMap.get(JCRBatCommon.KEY_FLAG_FILE);
					if (huzokuFileMap.size() > 2)
					{
						athFile = huzokuFileMap.get(JCRBatCommon.KEY_AUTHORITY_FILE);
					}
					++tgtFileCount;
				}

				// CSV一般化処理(1レコード1行に変換)
				Map<String, Object> tmpFileMap = JCRBatCommon.chgToOneRowForCsv(commonItem, csvFile, tmpPath);

				String chgCRWord = (String)tmpFileMap.get(JCRBatCommon.KEY_KAIGYO_CD_HENKAN_MOJI);	// 改行コード変換文字
				File tmpFile = (File)tmpFileMap.get(JCRBatCommon.KEY_HENKANGO_FILE);				// 変換後一時ファイル
				int dataCount = ((Integer)tmpFileMap.get(JCRBatCommon.KEY_COUNT)).intValue();		// レコード件数

				commonItem.getLogPrint().printDebugLog("改行コード変換文字:" + chgCRWord);
				commonItem.getLogPrint().printDebugLog("一時ファイル名:" + tmpFile.getName());
				commonItem.getLogPrint().printDebugLog("データ件数:" + dataCount);
				// 処理件数ログ出力
				JCRBatCommon.printShoriCountLog(commonItem, "データ件数(CASE) ファイル名:" + csvFile.getName(), dataCount);

				boolean isErrorFile = false;
				String errData = null;
				String logData = null;
				Map<String, Object> errInfoMap = null;

				// 件数ファイルチェック
				if (JCRBatCommon.isCountFileCheckOK(commonItem, csvFile, dataCount, countFile))
				{
					// 変換後ファイル読込処理
					errInfoMap = executeTmpFile(commonItem, tmpFile, chgCRWord);
					isErrorFile = (Boolean)errInfoMap.get(KEY_EXIST_ERROR);
				}
				else
				{
					// ログ出力
					isErrorFile = true;
					// ECRB0170KW:データ件数が件数ファイルの件数と一致しません。（%1%）
					logData = (JBSbatLogPrintControl.getMessage(JPCBatchMessageConstant.ECRB0170KW, new String[] {csvFileName})) + JCRStrConst.KAIGYO_CD;
					errInfoMap = new HashMap<String, Object>();
					errInfoMap.put(KEY_LOG_DATA, logData);
				}

				if (isErrorFile)
				{
					// エラーが存在する場合
					String wkkbtOrgCd = null;
					if (athFile != null)
					{
						// 権限ファイルがあれば業務個別設定組織コードを取り出す
						List<List<String>> athData = JCRUtilCommon.convCsvFiletoList(athFile.getAbsolutePath());
						if (athData != null && athData.size() > 0)
						{
							List<String> athList = athData.get(0);
							if (athList != null && athList.size() > 0)
							{
								String ath = athList.get(0);
								if (ath != null && ath.length() == KETA_WKKBT_ORG_CD)
								{
									wkkbtOrgCd = ath;
								}
							}
						}
					}

					// 処理結果ファイル登録(エラー行ファイル、ログファイルの登録)
					errData = (String)errInfoMap.get(KEY_ERR_DATA);
					logData = (String)errInfoMap.get(KEY_LOG_DATA);
					// エラーデータ登録処理
					JCRBatCommon.entryErrorFile(commonItem,
												wkkbtOrgCd,
												abnormalDataPath,
												errData,
												logData,
												csvFile,
												CASE_PRE_FIX,
												CASE_ERR_PRE_FIX,
												chgCRWord);
				}

				// コミット
				super.commit();

				// ファイル移動・削除
				File[] moveFiles = null;	// 移動するファイル
				if (athFile != null)
				{
					moveFiles = new File[] {csvFile, countFile, flgFile, athFile};
				}
				else
				{
					moveFiles = new File[] {csvFile, countFile, flgFile};
				}

				File[] deleteFiles = new File[] {tmpFile};						// 削除するファイル
				File outputPath = normalDataPath;								// 出力先パス
				if (isErrorFile)
				{
					// エラーが存在した場合
					outputPath = abnormalDataPath;
				}
				// ファイル移動・削除処理
				JCRUtilCommon.moveAndDeleteFile(moveFiles, deleteFiles, outputPath);
			}
		}

		// 処理件数ログ出力
		JCRBatCommon.printShoriCountLog(commonItem, "対象ファイル数", tgtFileCount);

		return null;

	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 変換後ファイル読込処理
	 * @param commonItem 共通情報
	 * @param tmpFile 一時ファイル
	 * @param chgCRWord 改行コード変換文字
	 * @return 処理結果のMap
	 * 			キー
	 * 			KEY_EXIST_ERROR		エラーが有る場合はtrue
	 * 			KEY_ERR_DATA		エラー行データ
	 * 			KEY_LOG_DATA		ログ情報
	 * @throws Exception 例外
	 */
	private Map<String, Object> executeTmpFile(JBSbatCommonItem commonItem, File tmpFile, String chgCRWord) throws Exception
	{

		Map<String, Object> resMap = new HashMap<String, Object>();

		boolean isErrorFile = false;		// エラー有無判定用(1件でもエラーがあればtrue)

		StringBuilder logData = new StringBuilder();	// 取込処理ログファイル出力内容格納
		StringBuilder errData = new StringBuilder();	// エラー行格納

		// 一時ファイル読込み処理
		BufferedReader br = null;
		try
		{
			// 一時ファイル(変換後)
			br = new BufferedReader(new InputStreamReader(new FileInputStream(tmpFile), JCRStrConst.DEFAULT_ENCODE));

			int errorRecordCount = 1;

			Map<String, List<Map<String, String>>> ngWordData = new HashMap<String, List<Map<String, String>>>();
			Map<String, Integer> queBoxMap = new HashMap<String, Integer>();
			Map<String, Integer> myboxMap = new HashMap<String, Integer>();

			String data = br.readLine();		// 1行読込み

			while (data != null)
			{

				// 読込みデータList化
				List<String> dataList = JCRUtilCommon.convStringToList(data);
				if (dataList == null)
				{
					dataList = new ArrayList<String>();
				}

				String svcKeiNo = null;		// サービス契約番号
				String queBoxNo = null;		// キューBOX番号
				String myboxNo = null;		// MYBOX番号

				// チェック処理
				Map<String, Object> checkInfoMap = check(commonItem, dataList, errorRecordCount, chgCRWord);
				boolean existError = (Boolean)checkInfoMap.get(KEY_EXIST_ERROR);	// 1行中のエラー有無
				if (!(existError))
				{
					svcKeiNo = dataList.get(IDX_SVC_KEI_NO);		// サービス契約番号

					String wkSvcKeiNo = (String)checkInfoMap.get(KEY_SVC_KEY_NO);
					if (wkSvcKeiNo != null && !("".equals(wkSvcKeiNo.trim())))
					{
						// eoIDからサービス契約番号が取得できた場合
						svcKeiNo = wkSvcKeiNo;
					}
					queBoxNo = (String)checkInfoMap.get(KEY_QUE_BOX_NO);
					myboxNo = (String)checkInfoMap.get(KEY_MYBOX_NO);
				}
				else
				{
					// エラー行を退避
					errData.append(data);
					errData.append(JCRStrConst.KAIGYO_CD);
					logData.append(checkInfoMap.get(KEY_LOG_DATA));

					isErrorFile = true;
					errorRecordCount++;

				}

				if (!(existError))
				{
					// データ登録処理
					Map<String, Map<String, String>> ngwdMap = entry(dataList, svcKeiNo, myboxNo, queBoxNo, chgCRWord);

					if (ngwdMap != null && ngwdMap.size() > 0)
					{
						// NGワードがある場合、NGワード検知メール送信用にデータを退避

						Set<String> keySet = ngwdMap.keySet();
						Iterator<String> it = keySet.iterator();
						while (it.hasNext())
						{
							String ngWord = it.next();
							Map<String, String> ngwdDtlMap = ngwdMap.get(ngWord);

							// 既登録NGワードデータを検索
							List<Map<String, String>> ngwdList = ngWordData.get(ngWord);

							if (ngwdList == null)
							{
								// 登録済みデータがない場合
								ngwdList = new ArrayList<Map<String, String>>();
								ngwdList.add(ngwdDtlMap);
								ngWordData.put(ngWord, ngwdList);
							}
							else
							{
								// 同じNGワードで既に登録がある場合
								ngwdList.add(ngwdDtlMap);
							}
						}
					}

					if (queBoxNo != null && !("".equals(queBoxNo.trim())))
					{
						// キューBOX更新用データ退避
						Integer nowCountQueBox = queBoxMap.get(queBoxNo);
						if (nowCountQueBox == null)
						{
							queBoxMap.put(queBoxNo, 1);
						}
						else
						{
							queBoxMap.put(queBoxNo, nowCountQueBox.intValue() + 1);
						}
					}

					if (myboxNo != null && !("".equals(myboxNo.trim())))
					{
						// MYBOX更新用データ退避
						Integer nowCountMybox = myboxMap.get(myboxNo);
						if (nowCountMybox == null)
						{
							myboxMap.put(myboxNo, 1);
						}
						else
						{
							myboxMap.put(myboxNo, nowCountMybox.intValue() + 1);
						}
					}
				}

				data = br.readLine();		// 1行読込み

			}

			// 問合せ格納数更新

			// キューBOX更新
			JCRBatCommon.updateQueBox(commonItem, queBoxMap);

			// MYBOX更新
			JCRBatCommon.updateMybox(commonItem, myboxMap);

			if (ngWordData != null && ngWordData.size() > 0)
			{
				// 問合せNGワード検知メール送信
				JCRBatCommon.sendNGWordMail(commonItem, ngWordData, commonItem.getBatchUserId());
			}

			resMap.put(KEY_EXIST_ERROR, isErrorFile);
			resMap.put(KEY_ERR_DATA, errData.toString());
			resMap.put(KEY_LOG_DATA, logData.toString());

			return resMap;

		}
		finally
		{
			if (br != null)
			{
				try
				{
					br.close();
				}
				catch (IOException ioe)
				{
					commonItem.getLogPrint().printDebugLog("br close error");
				}
			}
		}
	}

	/**
	 * チェック処理
	 * @param commonItem 共通情報
	 * @param dataList 1行分のデータ
	 * @param errorRecordCount エラーが存在したレコードの件数番号
	 * @param chgCRWord 改行コード変換文字
	 * @return チェック結果のMap
	 * 			キー
	 * 			KEY_EXIST_ERROR		エラーが有る場合はtrue
	 * 			KEY_SVC_KEY_NO		サービス契約番号
	 * 			KEY_QUE_BOX_NO		キューBOX番号(取得できた場合)
	 * 			KEY_MYBOX_NO		MYBOX番号(取得できた場合)
	 * 			KEY_LOG_DATA		ログ情報
	 * @throws Exception 例外
	 */
	private Map<String, Object> check(JBSbatCommonItem commonItem,
									List<String> dataList,
									int errorRecordCount,
									String chgCRWord) throws Exception
	{

		Map<String, Object> resMap = new HashMap<String, Object>();

		boolean existError = false;

		Map<String, Object> errInfoMap = null;			// エラー情報
		StringBuilder logData = new StringBuilder();	// 取込処理ログファイル出力内容格納

		// 読込データチェック
		errInfoMap = checkData(dataList, errorRecordCount, chgCRWord);
		boolean error = (Boolean)errInfoMap.get(KEY_EXIST_ERROR);
		if (error)
		{
			logData.append(errInfoMap.get(KEY_LOG_DATA));
			existError = true;
		}
		boolean koumokusuError = (Boolean)errInfoMap.get(KEY_EXIST_KOUMOKUSU_ERROR);
		if (!(koumokusuError))
		{
			// 項目数エラーが無かった場合
			// テーブルチェック
			errInfoMap = JCRBatCommon.checkTableData(commonItem, dataList, errorRecordCount, chgCRWord);
			error = (Boolean)errInfoMap.get(KEY_EXIST_ERROR);
			if (error)
			{
				logData.append(errInfoMap.get(KEY_LOG_DATA));
				existError = true;
			}
			else
			{
				String svcKeiNo = (String)errInfoMap.get(KEY_SVC_KEY_NO);
				String queBoxNo = (String)errInfoMap.get(KEY_QUE_BOX_NO);
				String myBoxNo = (String)errInfoMap.get(KEY_MYBOX_NO);
				if (svcKeiNo != null && !("".equals(svcKeiNo)))
				{
					resMap.put(KEY_SVC_KEY_NO, svcKeiNo);				// サービス契約番号
				}
				if (queBoxNo != null && !("".equals(queBoxNo)))
				{
					resMap.put(KEY_QUE_BOX_NO, queBoxNo);				// キューBOX番号
				}
				if (myBoxNo != null && !("".equals(myBoxNo)))
				{
					resMap.put(KEY_MYBOX_NO, myBoxNo);					// MYBOX番号
				}
			}
		}

		resMap.put(KEY_EXIST_ERROR, existError);
		resMap.put(KEY_LOG_DATA, logData.toString());

		return resMap;
	}

	/**
	 * データチェック
	 * @param dataList 1行分のデータ
	 * @param errorRecordCount エラーが存在したレコードの件数番号
	 * @param chgCRWord 改行コード変換文字
	 * @return エラー情報
	 * @throws Exception 例外
	 */
	private Map<String, Object> checkData(List<String> dataList,
										int errorRecordCount,
										String chgCRWord) throws Exception
	{

		Map<String, Object> resMap = new HashMap<String, Object>();

		boolean existError = false;
		boolean existKoumokusuError = false;
		StringBuilder logData = new StringBuilder();	// 取込処理ログファイル出力内容格納

		if (dataList.size() < KOUMOKU_SU_START || dataList.size() > KOUMOKU_SU_END)
		{
			// エラーログ 項目数が正しくありません。(%1%)
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.ECRB0180KW, new String[] {String.valueOf(errorRecordCount) + "レコード目"});
			logData.append(String.valueOf(errorRecordCount) + "レコード目:");
			logData.append(JBSbatLogPrintControl.getMessage(JPCBatchMessageConstant.ECRB0180KW, new String[] {"CASEファイル"}));
			logData.append(JCRStrConst.KAIGYO_CD);
			existError = true;
			existKoumokusuError = true;
		}

		if (!(existError))
		{
			// 項目数が正しい場合

			// 項目チェック
			Map<String, Object> errInfoMap = JCRBatCommon.checkTrkmData(commonItem, dataList, errorRecordCount, chgCRWord);
			existError = (Boolean)errInfoMap.get(KEY_EXIST_ERROR);
			if (existError)
			{
				logData.append(errInfoMap.get(KEY_LOG_DATA));
			}
		}

		resMap.put(KEY_EXIST_ERROR, existError);						// エラー有無
		resMap.put(KEY_EXIST_KOUMOKUSU_ERROR, existKoumokusuError);		// 項目数エラー有無
		resMap.put(KEY_LOG_DATA, logData.toString());					// ログ用データ

		return resMap;
	}

	/**
	 * 登録処理
	 * @param dataList 対象データ(1行分)
	 * @param svcKeiNo サービス契約番号
	 * @param myboxNo MYBOX番号
	 * @param queBoxNo キューBOX番号
	 * @param chgCRWord 改行コード変換文字
	 * @return NGワード情報
	 * @throws Exception 例外
	 */
	private Map<String, Map<String, String>> entry(List<String> dataList,
													String svcKeiNo,
													String myboxNo,
													String queBoxNo,
													String chgCRWord) throws Exception
	{

		String kokyakuTp = dataList.get(IDX_KOKYAKU_TYPE);			// 顧客タイプ
		String tiawsKyakuNo = dataList.get(IDX_TIAWS_KYAKU_NO);		// 問合せ客番号
		String jotai = dataList.get(IDX_JOTAI);						// 状態
		Map<String, Map<String, String>> ngwdMap = null;			// NGワード情報

		// 問合せ客登録
		if (MI_KANYUSHA.equals(kokyakuTp))
		{
			if (tiawsKyakuNo == null || "".equals(tiawsKyakuNo.trim()))
			{
				// 問合せ客登録
				tiawsKyakuNo = JCRBatCommon.entryTiawsKyaku(commonItem, dataList);
			}
		}

		// 問合せ状態コード
		String jotaiCd = JCRBatCommon.getCodeKbn(commonItem, JZM0171Constant.CD00229, jotai);

		List<String> ngWordInfo = null;
		boolean existNGWord = false;
		if (!(JCRStrConst.CD_DIV_TOIAWASE_STAT_CD_CLOSE.equals(jotaiCd)))
		{
			 // 状態がクローズでない場合

			// NGワードチェック
			ngWordInfo = JCRBatCommon.checkRrkInfoInportNGWord(commonItem, ngWordChkJokenList, dataList);
			if (ngWordInfo != null && ngWordInfo.size() > 0)
			{
				existNGWord = true;
			}
		}

		// 対応記録登録
		String taioKirkNo = entryTaioKirok(dataList,
										svcKeiNo,
										tiawsKyakuNo,
										myboxNo,
										queBoxNo,
										jotaiCd,
										chgCRWord,
										existNGWord);

		// NGワード情報生成
		if (ngWordInfo != null && ngWordInfo.size() > 0)
		{
			String title = dataList.get(IDX_TITLE);				// タイトル
			ngwdMap = new HashMap<String, Map<String, String>>();
			for (int i = 0; i < ngWordInfo.size(); i++)
			{
				String ngwd = ngWordInfo.get(i);
				Map<String, String> map = new HashMap<String, String>();
				map.put(taioKirkNo, title);
				ngwdMap.put(ngwd, map);
			}
		}

		// 対応記録明細登録
		JCRBatCommon.entryTaiokirkDtl(commonItem, dataList, taioKirkNo, jotaiCd, false);

		// カテゴリー存在確認
		boolean existCtgr = false;
		String[] ctgrs = new String[MAX_TGR_LVL];
		for (int i = 0; i < ctgrs.length; i++)
		{
			ctgrs[i] = dataList.get(IDX_CTGR_01 + i);
			if (ctgrs[i] != null && !("".equals(ctgrs[i].trim())))
			{
				existCtgr = true;
			}
		}
		if (existCtgr)
		{
			// 対応記録内訳登録
			JCRBatCommon.entryTaiokirkUcwk(commonItem, taioKirkNo);
			// 対応記録内訳カテゴリー登録
			JCRBatCommon.entryTaiokirkUwCtgr(commonItem, ctgrs, taioKirkNo);
			// 対応記録内訳抽出ワーク登録
			JCRBatCommon.entryTiokrUwCstWkForNew(commonItem, taioKirkNo);
		}

		String tanto = dataList.get(IDX_TANTO);			// 担当者

		// ワークグループ取得
		String workGroupCd = null;
		if (dataList.size() > IDX_WKKBT_ORG_CD)
		{
			workGroupCd = dataList.get(IDX_WKKBT_ORG_CD);
		}
		if (workGroupCd == null || "".equals(workGroupCd.trim()))
		{
			workGroupCd = JCRBatCommon.getWorkGroupCd(commonItem, JCRUtilCommon.adjustCharSize(tanto, USERID_BYTE_SU, "").trim(), queBoxNo);
		}
		// 問合せモニター集計用データ登録
		JCRBatCommon.entryRrkInfoInportTiawsMntData(commonItem,
													queBoxNo,
													jotaiCd,
													taioKirkNo,
													JCRUtilCommon.adjustCharSize(tanto, USERID_BYTE_SU, "").trim(),
													workGroupCd,
													existNGWord);

		return ngwdMap;
	}

	/**
	 * 対応記録登録
	 * @param dataList 対象データ(1行分)
	 * @param svcKeiNo サービス契約番号
	 * @param tiawsKyakuNo 問合せ客番号
	 * @param myboxNo MYBOX番号
	 * @param queBoxNo キューBOX番号
	 * @param jotaiCd 問合せ状態コード
	 * @param chgCRWord 改行コード変換文字
	 * @param existNG NGワードが存在する場合true
	 * @return 対応記録番号
	 * @throws Exception 例外
	 */
	private String entryTaioKirok(List<String> dataList,
								String svcKeiNo,
								String tiawsKyakuNo,
								String myboxNo,
								String queBoxNo,
								String jotaiCd,
								String chgCRWord,
								boolean existNG) throws Exception
	{
		JBSbatCommonDBInterface inMap = new JBSbatCommonDBInterface();

		// 対応記録番号
		String key = JCRBatCommon.getFormatedNextSeq(commonItem, JCRStrConst.SEQ_TAIO_KIROK_NO, "", KETA_TAIO_KIROK_NO);
		inMap.setValue(JBSbatCR_T_TAIO_KIROK.TAIO_KIROK_NO, key);

		// 対応記録ステータス
		String status = null;
		if (JCRStrConst.CD_DIV_TOIAWASE_STAT_CD_OPEN.equals(jotaiCd))
		{
			status = JCRStrConst.CD_DIV_TAIO_KIROK_STAT_SHORICHU;	// 処理中
		}
		else if (JCRStrConst.CD_DIV_TOIAWASE_STAT_CD_CLOSE.equals(jotaiCd))
		{
			status = JCRStrConst.CD_DIV_TAIO_KIROK_STAT_CLOSE;		// クローズ
		}
		else if (JCRStrConst.CD_DIV_TOIAWASE_STAT_CD_ESCL.equals(jotaiCd))
		{
			status = JCRStrConst.CD_DIV_TAIO_KIROK_STAT_ESCL;		// エスカレーション中
		}
		inMap.setValue(JBSbatCR_T_TAIO_KIROK.TAIO_KIROK_STAT, status);

		String tanto = dataList.get(IDX_TANTO);			// 担当者

		// 対応ユーザーID
		inMap.setValue(JBSbatCR_T_TAIO_KIROK.TAIO_USER_ID, JCRUtilCommon.adjustCharSize(tanto, USERID_BYTE_SU, "").trim());

		String kokyakuTp = dataList.get(IDX_KOKYAKU_TYPE);			// 顧客タイプ

		if (MI_KANYUSHA.equals(kokyakuTp))
		{
			// 「未加入者」の場合

			// 問合せ客番号
			if (tiawsKyakuNo != null && !("".equals(tiawsKyakuNo)))
			{
				inMap.setValue(JBSbatCR_T_TAIO_KIROK.PROSCST_NO, JCRBatCommon.fillZero(tiawsKyakuNo, TIAWS_KYAKU_NO_BYTE_SU, false));
			}
		}
		else
		{
			// 「加入者」の場合

			// サービス契約番号
			if (svcKeiNo != null && !("".equals(svcKeiNo)))
			{
				inMap.setValue(JBSbatCR_T_TAIO_KIROK.SVC_KEI_NO, svcKeiNo);
			}
		}

		// 状態が「オープン」の場合はMYBOX登録
		// 状態が「エスカレーション」の場合はQBOX登録
		// 状態が「クローズ」の場合はQBOX、MYBOX登録無し

		if (JCRStrConst.CD_DIV_TOIAWASE_STAT_CD_OPEN.equals(jotaiCd))
		{
			// MYBOX番号
			if (myboxNo != null && !("".equals(myboxNo)))
			{
				inMap.setValue(JBSbatCR_T_TAIO_KIROK.MYBOX_NO, myboxNo);
				inMap.setValue(JBSbatCR_T_TAIO_KIROK.MYBOX_KAKNO_DTM, JCRBatCommon.getSysDateTime());
			}
		}

		if (JCRStrConst.CD_DIV_TOIAWASE_STAT_CD_ESCL.equals(jotaiCd))
		{
			// キューBOX番号
			if (queBoxNo != null && !("".equals(queBoxNo)))
			{
				inMap.setValue(JBSbatCR_T_TAIO_KIROK.QUE_BOX_NO, queBoxNo);
				inMap.setValue(JBSbatCR_T_TAIO_KIROK.QUE_BOX_KAKNO_DTM, JCRBatCommon.getSysDateTime());
			}
		}

		// 対応開始年月日時分秒
		String sakuseiDate = getNoDateSignString(dataList.get(IDX_SAKUSEI_DATE));
		inMap.setValue(JBSbatCR_T_TAIO_KIROK.TAIO_STA_DTM, sakuseiDate);

		if (JCRStrConst.CD_DIV_TOIAWASE_STAT_CD_CLOSE.equals(jotaiCd))
		{
			// 対応完了年月日時分秒
			inMap.setValue(JBSbatCR_T_TAIO_KIROK.TAIO_FIN_DTM, sakuseiDate);
			// 対応クローズ年月日時分秒
			inMap.setValue(JBSbatCR_T_TAIO_KIROK.LAST_END_DTM, sakuseiDate);
		}

		// トータル処理時間
		inMap.setValue(JBSbatCR_T_TAIO_KIROK.TOTAL_TRAN_TIME, 0);

		// 問合せ状態コード
		inMap.setValue(JBSbatCR_T_TAIO_KIROK.TOIAWASE_STAT_CD, jotaiCd);

		// クローズ不可コード
		String flg = JCRStrConst.CD_DIV_CLOSE_FAIL_CD_KANOU;
		if (existNG)
		{
			flg = JCRStrConst.CD_DIV_CLOSE_FAIL_CD_HUKANOU;
		}
		inMap.setValue(JBSbatCR_T_TAIO_KIROK.CLOSE_FAIL_CD, flg);

		// 問合せ受付種別コード
		String uketsuke = dataList.get(IDX_UKETSUKE_SBT);
		// コード名称管理検索
		String uketsukeCd = JCRBatCommon.getCodeKbn(commonItem, JZM0171Constant.CD00233, uketsuke);
		if (uketsukeCd != null)
		{
			inMap.setValue(JBSbatCR_T_TAIO_KIROK.TOIAWASE_UK_SBT_CD, uketsukeCd);
		}

		// タイトル
		String title = dataList.get(IDX_TITLE);
		if (title == null || "".equals(title.trim()))
		{
			title = JCRBatCommon.getApplicationConst("CR_TWS_RK_TITLE");
		}
		else
		{
			title = title.replaceAll("\"\"", "\"");
		}
		inMap.setValue(JBSbatCR_T_TAIO_KIROK.TITLE, title);

		String rireki = dataList.get(IDX_RIREKI);	// 対応記録履歴
		String queNm = dataList.get(IDX_QUE_NM);	// キューBOX名

		// 対応記録履歴生成
		rireki = makeRireki(rireki, chgCRWord, jotaiCd, queNm);

		inMap.setValue(JBSbatCR_T_TAIO_KIROK.TAIO_KIROK_RIREKI, rireki);

		// 受付年月日時分秒
		inMap.setValue(JBSbatCR_T_TAIO_KIROK.UK_DTM, sakuseiDate);

		// 一時保存有無
		inMap.setValue(JBSbatCR_T_TAIO_KIROK.TMP_SAVE_UM, "0");

		// コールバック希望日時
		String callbackDate = getNoDateSignString(dataList.get(IDX_CALLBACK_DATE));

		if (callbackDate != null && !("".equals(callbackDate.trim())))
		{
			// コールバック希望年月日
			String callbackYYYYMMDD = callbackDate.substring(0, KETA_CALLBACK_YYYYMMDD_END);
			inMap.setValue(JBSbatCR_T_TAIO_KIROK.CALLBK_KIBO_YMD, callbackYYYYMMDD);

			// コールバック希望時間
			String callbackHHMM = callbackDate.substring(KETA_CALLBACK_HHMI_START, KETA_CALLBACK_HHMI_END);
			callbackHHMM = getNoDateSignString(callbackHHMM);
			inMap.setValue(JBSbatCR_T_TAIO_KIROK.CALLBK_KIBO_TIME, callbackHHMM);

			// コールバック時間指定タイプコード
			String callbackType = dataList.get(IDX_CALLBACK_TYPE);

			if (callbackType != null && !("".equals(callbackType.trim())))
			{
				String callbackTypeCd = JCRBatCommon.getCodeKbn(commonItem, JZM0171Constant.CD00457, callbackType);
				inMap.setValue(JBSbatCR_T_TAIO_KIROK.CALLBK_SHITEI_TYPE_CD, callbackTypeCd);
			}
		}
		// ANK-3593-00-00 ADD START
		// 反響可能性フラグ
		int hankyoPsbHlgIdx = IDX_HANKYO_PSB_FLG;
		if(dataList.size() > hankyoPsbHlgIdx)
		{
			String hankyoPsbFlg = dataList.get(IDX_HANKYO_PSB_FLG);
			inMap.setValue(JBSbatCR_T_TAIO_KIROK.HANKYO_PSB_FLG, hankyoPsbFlg);
		}
		// 対応部署名
		int taioBushoNmIdx = IDX_TAIO_BUSHO_NM;
		if(dataList.size() > taioBushoNmIdx)
		{
			String taioBusho = dataList.get(IDX_TAIO_BUSHO_NM);
			inMap.setValue(JBSbatCR_T_TAIO_KIROK.TAIO_BUSHO_NM, taioBusho);
		}
		// ANK-3593-00-00 ADD END
// v48.00.00 ANK-3795-00-00 ADD START
		// 見込顧客番号
		int mikmcustNoIdx = IDX_MIKMCST_NO;
		if(dataList.size() > mikmcustNoIdx)
		{
			String mikmcustNo = dataList.get(IDX_MIKMCST_NO);
			inMap.setValue(JBSbatCR_T_TAIO_KIROK.MIKMCST_NO, mikmcustNo);
		}
// v48.00.00 ANK-3795-00-00 ADD END
		// ◆ 登録
		int count = db_CR_T_TAIO_KIROK.insertByPrimaryKeys(inMap);
		commonItem.getLogPrint().printDebugLog("[対応記録登録] 登録件数:" + count);

		return key;
	}

	/**
	 * 対応記録履歴生成
	 * @param rireki CSVに書かれた履歴情報
	 * @param chgCRWord 改行コード変換文字
	 * @param jotaiCd 問合せ状態コード
	 * @param queNm キューBOX名
	 * @return 生成された対応記録履歴
	 * @throws Exception 例外
	 */
	private String makeRireki(String rireki, String chgCRWord, String jotaiCd, String queNm) throws Exception
	{
		StringBuilder sb = new StringBuilder();

		// システム日時　14桁
		String sysDtm = JCRBatCommon.getSysDateTime();

		String sysYYYYMMDDHHMM = JCRBatCommon.formatDatetimeMM(sysDtm.substring(0, KETA_YYYYMMDDHHMM));
		String separateLine = "------------------------------------------------------------";

		sb.append(separateLine).append(JCRStrConst.KAIGYO_CD);
		sb.append("◇新規作成：　（CASE取込） ").append(sysYYYYMMDDHHMM).append(JCRStrConst.KAIGYO_CD);
		sb.append(separateLine).append(JCRStrConst.KAIGYO_CD);

		if (rireki != null && !("".equals(rireki)))
		{
			String tempRireki = rireki.replaceAll(chgCRWord, JCRStrConst.KAIGYO_CD);
			tempRireki = tempRireki.replaceAll("\"\"", "\"");
			sb.append(tempRireki).append(JCRStrConst.KAIGYO_CD);
			sb.append(separateLine).append(JCRStrConst.KAIGYO_CD);
		}

		if (JCRStrConst.CD_DIV_TOIAWASE_STAT_CD_CLOSE.equals(jotaiCd))
		{
			// 問合せ状態が「クローズ」の場合
			sb.append("◇クローズ：　（CASE取込） ").append(sysYYYYMMDDHHMM).append(JCRStrConst.KAIGYO_CD);
			sb.append(separateLine).append(JCRStrConst.KAIGYO_CD);
		}

		if (JCRStrConst.CD_DIV_TOIAWASE_STAT_CD_ESCL.equals(jotaiCd))
		{
			// 問合せ状態が「エスカレーション」の場合
			sb.append("□エスカレーション：　（CASE取込） ").append(sysYYYYMMDDHHMM).append(JCRStrConst.KAIGYO_CD);
			sb.append("　エスカレーション先：　「").append(queNm).append("」キュー").append(JCRStrConst.KAIGYO_CD);
			sb.append(separateLine).append(JCRStrConst.KAIGYO_CD);
		}

		return sb.toString();
	}

	/**
	 * 日付記号を除去した文字列を取得する。
	 * @param target 対象文字列
	 * @return 日付記号を除去した文字列
	 */
	private static String getNoDateSignString(String target)
	{
		String res = target;
		res = res.replaceAll("/", "");
		res = res.replaceAll(":", "");
		res = res.replaceAll("\\.", "");
		res = res.replaceAll(" ", "");
		return res;
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_SVC_KEI.close();
		db_CK_T_CUST.close();
		db_CK_T_PROSCST.close();
		db_CR_T_QUE_BOX.close();
		db_CR_T_MYBOX.close();
		db_CR_M_CTGR.close();
		db_ZM_M_CD_NM_KANRI.close();
		db_CR_T_TAIO_KIROK.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/

		// データアクセスオブジェクトクローズ
		JCRBatCommon.closeDataAccessObj(commonItem);

	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

}

