/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCRCallBackTorokuIkt
*	ソースファイル名	：JBSbatCRCallBackTorokuIkt.java
*	作成者				：富士通　
*	作成日				：2017年02月10日
*＜機能概要＞
*　コールバック日時一括登録処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*********************************************************************/
package eo.business.service;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
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.JCRBatCommon;
import eo.business.util.table.JBSbatCC_T_DLYD_TRN_REQ;
import eo.business.util.table.JBSbatCR_T_TAIO_KIROK;
import eo.common.constant.JCRStrConst;
import eo.common.constant.JPCBatchMessageConstant;
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;
import eo.framework.util.JBSbatStringUtil;

/**
* コールバック日時一括登録処理 <p>
*<BR>
* @author 富士通
*/
public class JBSbatCRCallBackTorokuIkt extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(対応記録)*/
	private static final String D_TBL_NAME_CR_T_TAIO_KIROK = "CR_T_TAIO_KIROK";
	
	/** テーブル(コード名称管理)*/
	private static final String D_TBL_NAME_ZM_M_CD_NM_KANRI = "ZM_M_CD_NM_KANRI";

	/** SQL定義キー(CR_SELECT_016)*/
	private static final String CR_T_TAIO_KIROK_CR_SELECT_016 = "CR_SELECT_016";
	
	/** SQL定義キー(KK_SELECT_001)*/
	private static final String ZM_M_CD_NM_KANRI_KK_SELECT_001 = "KK_SELECT_001";

	/** テーブルアクセスクラス(対応記録)*/
	private JBSbatSQLAccess db_CR_T_TAIO_KIROK = null;
	
	/** テーブルアクセスクラス(コード名称管理)*/
	private JBSbatSQLAccess db_ZM_M_CD_NM_KANRI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 対応履歴一時ファイル保存先パス */
	private String tmpFileDir = null;

	/** システム日時　17桁 */
	private String sysDtms = null;

	/** システム日時　14桁 */
	private String sysDtm = null;

	/** 初期処理エラーメッセージ */
	private String initErrMessage = null;

	/** 1行目の項目数 */
	private static final int KOMOKUSU_1GYOME = 7;

	/** 項目数 */
	private static final int KOMOKUSU = 2;

	/** YYYYMMDDHHmmの桁数 */
	private static final int KETA_YYYYMMDDHHMM = 12;

	/** エラーメッセージ 取得キー */
	private static final String ERR_MESSAGE = "ERR_MESSAGE";
	
	/** コールバック希望年月日 取得キー */
	private static final String CALLBK_KIBO_YMD = "CALLBK_KIBO_YMD";
	
	/** コールバック希望時間 取得キー */
	private static final String CALLBK_KIBO_TIME = "CALLBK_KIBO_TIME";
	
	/** コールバック時間指定タイプコード 取得キー */
	private static final String CALLBK_SHITEI_TYPE_CD = "CALLBK_SHITEI_TYPE_CD";
	
	/** コールバック時間指定タイプコード名称 取得キー */
	private static final String CALLBK_SHITEI_TYPE_NM = "CALLBK_SHITEI_TYPE_NM";

	/** ログインユーザーID 取得キー */
	private static final String LOGIN_USER_ID = "LOGIN_USER_ID";

	/** ログインユーザー名 取得キー */
	private static final String LOGIN_USER_NM = "LOGIN_USER_NM";

	/** ログインユーザーのMYBOX番号 取得キー */
	private static final String LOGIN_USER_MYBOX_NO = "LOGIN_USER_MYBOX_NO";

	/** ログインユーザーの業務個別設定組織コード 取得キー */
	private static final String LOGIN_USER_WKKBT_ORG_CD = "LOGIN_USER_WKKBT_ORG_CD";

	/** ログインユーザーの業務個別設定組織名 取得キー */
	private static final String LOGIN_USER_WKKBT_ORG_NM = "LOGIN_USER_WKKBT_ORG_NM";

	/** 対応記録番号 取得キー */
	private static final String TAIO_KRK_NO = "TAIO_KRK_NO";

	/** 対応記録履歴 取得キー */
	private static final String TAIO_KIROK_RIREKI = "TAIO_KIROK_RIREKI";

	/** 対応開始年月日時分秒 取得キー */
	private static final String TAIO_STA_DTM = "TAIO_STA_DTM";
	
	/** コード名称 取得キー */
	private static final String CD_DIV_NM = "CD_DIV_NM";
	
	/**	コールバック時間指定タイプコード	*/
	private static final  String CD00457 = "CD00457";
	
	/**	対応記録ステータス 処理中　201	*/
	private static final  String TAIO_KIROK_STAT_201 = "201";
	
	/**	対応記録ステータス コールバック待ち　206	*/
	private static final  String TAIO_KIROK_STAT_206 = "206";

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CR_T_TAIO_KIROK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CR_T_TAIO_KIROK);
		db_ZM_M_CD_NM_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_CD_NM_KANRI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		// プロパティーチェック
		initErrMessage = checkProperty();

	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * プロパティーチェック
	 * @return エラーメッセージ
	 */
	private String checkProperty()
	{
		// プロパティーチェック
		String errMessage = null;

		try
		{
			// 対応履歴一時ファイル保存先パス
			tmpFileDir = JCRBatCommon.getApplicationConst("CR_TEMP_FILE_DIR");
			if (tmpFileDir == null || "".equals(tmpFileDir.trim()))
			{
				// ECRB0010KW:プロパティーファイルの設定が正しくありません。(項目名:%1%)
				errMessage = JBSbatLogPrintControl.getMessage(JPCBatchMessageConstant.ECRB0010KW, new String[] {"CR_TEMP_FILE_DIR"});
				super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECRB0010KW, new String[] {"CR_TEMP_FILE_DIR"});
			}
			else if (JCRUtilCommon.checkDirExist(tmpFileDir) == null)
			{
				// 存在しない場合
				// ECRB0160KW:指定されたパスが存在しません。(%1%)
				errMessage = JBSbatLogPrintControl.getMessage(JPCBatchMessageConstant.ECRB0160KW, new String[] {tmpFileDir});
				super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECRB0160KW, new String[] {tmpFileDir});
			}
			super.logPrint.printDebugLog("対応履歴一時ファイル保存先パス:" + tmpFileDir);
		}
		catch (Exception e)
		{
			// ECRB0260KW:%1%処理中に予期せぬエラーが発生しました。　%2%
			errMessage = JBSbatLogPrintControl.getMessage(JPCBatchMessageConstant.ECRB0260KW, new String[] {"コールバック日時一括登録", e.toString()});
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECRB0260KW, new String[] {"コールバック日時一括登録", e.toString()});
			super.logPrint.printDebugLog("例外発生:" + e.toString());
			super.logPrint.printDebugLog("　　　　:" + e.getMessage());
		}

		return errMessage;
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		// 2-(1) ディレイド処理依頼情報取得
		ArrayList<HashMap<String, Object>> shoriIraiInfoList = JCRBatCommon.getShoriIraiInfo(commonItem, super.jobid);

		if (shoriIraiInfoList != null)
		{
			// 処理件数ログ出力
			JCRBatCommon.printShoriCountLog(commonItem, "ディレイド処理依頼件数", shoriIraiInfoList.size());

			for (int i = 0; i < shoriIraiInfoList.size(); i++)
			{
				// ディレイド処理結果コード
				String shoriKekkaCd = JCRStrConst.DLYD_SYSTEM_ERR;		// 一旦システムエラーのコードを設定

				String shoriIraiNo = null;			// ディレイド処理依頼番号
				List<String> errInfoList = null;	// エラー情報List

				try
				{
					// 2-(2) ディレイド処理依頼情報1件読込
					HashMap<String, Object> shoriIraiInfoMap = shoriIraiInfoList.get(i);

					// ディレイド処理依頼番号
					shoriIraiNo = shoriIraiInfoMap.get(JBSbatCC_T_DLYD_TRN_REQ.DLYD_TRN_REQ_NO).toString();

					if (initErrMessage == null)
					{
						// 初期処理チェックでエラーがない場合

						// システム日時 17桁
						sysDtms = JCRBatCommon.getSysDateTimeStamp();
						// システム日時 14桁
						sysDtm = sysDtms.substring(0, 14);

						// 2-(3) 画面入力情報ファイル取得
						byte[] gamenData = (byte[])shoriIraiInfoMap.get("INPUT_EFILE");

						// コールバック日時登録処理実行
						errInfoList = executeCallBack(gamenData);

						// 処理結果コード設定
						if (errInfoList.isEmpty())
						{
							shoriKekkaCd = JCRStrConst.DLYD_OK;
						}
						else
						{
							shoriKekkaCd = JCRStrConst.DLYD_GYOMU_ERR;
						}
					}
				}
				catch (JBSbatBusinessException ex)
				{
					// システムエラーフラグを設定する
					shoriKekkaCd = JCRStrConst.DLYD_SYSTEM_ERR;
					super.logPrint.printDebugLog("システムエラー発生:" + ex.toString());
					super.logPrint.printDebugLog("　　　　　　　　　:" + ex.getMessage());
				}
				finally
				{
					// 2-(8) 終了処理
					end(shoriIraiNo, shoriKekkaCd, errInfoList);
				}
			}
		}
		else
		{
			// 処理件数ログ出力
			JCRBatCommon.printShoriCountLog(commonItem, "ディレイド処理依頼件数", 0);
		}
		return null;

	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * コールバック日時登録一括処理実行
	 * @param gamenData 画面入力情報ファイルデータ
	 * @return エラー情報List
	 * @throws Exception 例外
	 */
	private List<String> executeCallBack(byte[] gamenData) throws Exception
	{
		List<String> errInfoList = new ArrayList<String>();		// エラー情報
		BufferedReader gamenDataFile = null;
		int rowNum = 0;											// 行番号

		try
		{
			// 2-(3) 画面入力情報ファイル取得

			// (b) 処理対象情報取得
			//gamenDataFile = new BufferedReader(new StringReader(gamenDataString.substring(0, memoIndex)));
			gamenDataFile = new BufferedReader(new StringReader(new String(gamenData, JCRStrConst.DEFAULT_ENCODE)));

			// 2-(4) 行読込
			String gamenData1Gyo = gamenDataFile.readLine();

			// 1行目の情報
			String loginUserId = 			null;		// 画面のログインユーザーID
			String loginUserNm = 			null;		// 画面のログインユーザー名
			String loginUserWkKbtOrgCd = 	null;		// 画面の業務個別設定組織コード
			String loginUserWkKbtOrgNm = 	null;		// 画面の業務個別設定組織名
			String loginUserMyboxNo = 		null;		// 画面のログインユーザーのMYBOX番号
			String rireki = 				null;		// 対応記録履歴
			String callBkKiboYmd = 			null;		// コールバック年月日
			String callBkkibotime = 		null;		// コールバック時間
			String callBkShiteiTypeCd = 	null;		// コールバック時間指定タイプ
			String callBkShiteiTypeNm = 	null;		// コールバック時間指定タイプ名称

			// 2行目以降の情報
			String taioKrkNo = 				null;		// 対応記録番号
			String updateDtm = 				null;		// 対応記録．更新年月日時分秒

			while (gamenData1Gyo != null)
			{
				++rowNum;

				// 2-(5) 画面入力情報取得

				// (a) 画面入力項目取得
				List<String> oneLineKomokuList = JCRUtilCommon.convStringToList(gamenData1Gyo);

				// (b) 項目数チェック
				String errMessage = checkKomokuSu(rowNum, oneLineKomokuList.size());
				if (errMessage != null)
				{
					errInfoList.add(errMessage);
					return errInfoList;
				}

				if (rowNum == 1)
				{
					// 1行目の場合
					loginUserId = 			oneLineKomokuList.get(0);	// 画面のログインユーザーID
					loginUserNm = 			oneLineKomokuList.get(1);	// 画面のログインユーザー名
					loginUserWkKbtOrgCd = 	oneLineKomokuList.get(2);	// 画面の業務個別設定組織コード
					loginUserWkKbtOrgNm = 	oneLineKomokuList.get(3);	// 画面の業務個別設定組織名
					callBkKiboYmd = 		oneLineKomokuList.get(4);	// コールバック年月日
					callBkkibotime = 		oneLineKomokuList.get(5);	// コールバック時間
					callBkShiteiTypeCd = 	oneLineKomokuList.get(6);	// コールバック時間指定タイプコード
					callBkShiteiTypeNm = 	cdValid(CD00457, callBkShiteiTypeCd, super.opeDate);// コールバック時間指定タイプコード名称

				}
				else
				{
					// 2行目以降の場合

					// (d) 対応記録情報取得
					taioKrkNo = oneLineKomokuList.get(0);				// 対応記録番号
					updateDtm = oneLineKomokuList.get(1);				// 対応記録．更新年月日時分秒
					Map<String, String> taioKrkDataMap = getTaioKrkInfo(taioKrkNo, updateDtm);
					errMessage = taioKrkDataMap.get(ERR_MESSAGE);
					if (errMessage != null)
					{
						errInfoList.add(errMessage);
						return errInfoList;
					}
					else
					{
						rireki = taioKrkDataMap.get(JBSbatCR_T_TAIO_KIROK.TAIO_KIROK_RIREKI);	// 対応記録履歴
					}
				}

				// 2-(7) データ更新・登録処理
				if (rowNum >= 2)
				{
					// 2行目以降の場合

					Map<String, String> paramMap = new HashMap<String, String>();
					paramMap.put(LOGIN_USER_ID, 			loginUserId);			// 画面のログインユーザーID
					paramMap.put(LOGIN_USER_NM, 			loginUserNm);			// 画面のログインユーザー名
					paramMap.put(LOGIN_USER_WKKBT_ORG_CD, 	loginUserWkKbtOrgCd);	// 画面ログインユーザーの業務個別設定組織コード
					paramMap.put(LOGIN_USER_WKKBT_ORG_NM, 	loginUserWkKbtOrgNm);	// 画面ログインユーザーの業務個別設定組織名
					paramMap.put(TAIO_KRK_NO, 				taioKrkNo);				// 対応記録番号
					paramMap.put(TAIO_KIROK_RIREKI, 		rireki);				// 対応記録履歴
					paramMap.put(CALLBK_KIBO_YMD, 			callBkKiboYmd);			// コールバック希望年月日
					paramMap.put(CALLBK_KIBO_TIME, 			callBkkibotime);		// コールバック希望時間
					paramMap.put(CALLBK_SHITEI_TYPE_CD, 	callBkShiteiTypeCd);	// コールバック時間指定タイプコード
					paramMap.put(CALLBK_SHITEI_TYPE_NM, 	callBkShiteiTypeNm);	// コールバック時間指定タイプコード名称

					// 登録更新処理
					entry(paramMap);
				}
				gamenData1Gyo = gamenDataFile.readLine();
			}
		}
		finally
		{
			// 処理件数ログ出力
			JCRBatCommon.printShoriCountLog(commonItem, "コールバック日時一括登録処理行数", rowNum);

			if (gamenDataFile != null)
			{
				try
				{
					gamenDataFile.close();
				}
				catch (IOException ioe)
				{
					// ECRB0260KW %1%処理中に予期せぬエラーが発生しました。　%2%
					super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECRB0260KW, new String[]{"画面入力情報ファイルクローズ", "(処理は続行します)"});
				}
			}
		}
		return errInfoList;
	}

	/**
	 * 項目数チェック
	 * @param rowNum 行番号
	 * @param komokuSu 項目数
	 * @return エラーメッセージ
	 */
	private String checkKomokuSu(int rowNum, int komokuSu)
	{
		String errMessage = null;
		if (rowNum == 1)
		{
			// 1行目の場合
			if (komokuSu != KOMOKUSU_1GYOME)
			{
				// コールバック日時一括登録確認画面のメッセージ出力
				String messageId = JPCBatchMessageConstant.ECRB0180KW;
				String[] logParam = new String[]{"1行目"};
				errMessage = "システムエラーが発生しました。";
				super.logPrint.printBusinessErrorLog(messageId, logParam);
			}
		}
		else
		{
			// 2行目以降の場合
			if (komokuSu != KOMOKUSU)
			{
				// ECRB0180KW:項目数が正しくありません。（%1%）
				String messageId = JPCBatchMessageConstant.ECRB0180KW;
				String[] logParam = new String[]{rowNum + "行目"};
				errMessage = "システムエラーが発生しました。";
				super.logPrint.printBusinessErrorLog(messageId, logParam);
			}
		}
		return errMessage;
	}

	/**
	 * 対応記録情報取得
	 * @param taioKrkNo 対応記録番号
	 * @param updateDtm 対応記録．更新年月日時分秒
	 * @return 対応記録情報Map
	 * 			キー				値
	 * 			KEY_ERR_MESSAGE		エラーメッセージ
	 * 			TAIO_KIROK_RIREKI	対応記録履歴
	 * @throws Exception 例外
	 */
	private Map<String, String> getTaioKrkInfo(String taioKrkNo, String updateDtm) throws Exception
	{
		Map<String, String> resultMap = new HashMap<String, String>();
		String errMessage = null;

		executeCR_T_TAIO_KIROK_CR_SELECT_016(new String[]{taioKrkNo, updateDtm});
		JBSbatCommonDBInterface taioKrkData = db_CR_T_TAIO_KIROK.selectNext();
		if (taioKrkData != null)
		{
			resultMap.put(JBSbatCR_T_TAIO_KIROK.TAIO_KIROK_RIREKI, 	taioKrkData.getString(JBSbatCR_T_TAIO_KIROK.TAIO_KIROK_RIREKI));	// 対応記録履歴
		}
		else
		{
			// ECRB0460KW:データが他の人に更新されています。（%1%）
			String messageId = JPCBatchMessageConstant.ECRB0460KW;
			String[] logParam = new String[]{"[対応記録テーブル] 対応記録番号:" + taioKrkNo + " 更新年月日時分秒:" + updateDtm};
			errMessage = JBSbatLogPrintControl.getMessage(messageId, logParam);
			super.logPrint.printBusinessErrorLog(messageId, logParam);
		}

		resultMap.put(ERR_MESSAGE, errMessage);

		return resultMap;
	}

	/**
	 * 登録更新処理
	 * @param paramMap 引数格納Map
	 * @throws Exception 例外
	 */
	private void entry(Map<String, String> paramMap) throws Exception
	{
		// 2-(6) データ更新・登録処理
		// (a) 対応記録更新
		updateTaioKrk(paramMap);

	}

	/**
	 * 対応記録更新
	 * @param paramMap 引数格納Map
	 * @throws Exception 例外
	 */
	private void updateTaioKrk(Map<String, String> paramMap) throws Exception
	{
		String callBkKiboYmd = 		paramMap.get(CALLBK_KIBO_YMD);				// コールバック希望年月日
		String callBkkibotime = 		paramMap.get(CALLBK_KIBO_TIME);				// コールバック希望時間
		String callBkShiteiTypeCd = 		paramMap.get(CALLBK_SHITEI_TYPE_CD);				// コールバック時間指定タイプコード
		String callBkShiteiTypeNm = 		paramMap.get(CALLBK_SHITEI_TYPE_NM);				// コールバック時間指定タイプコード名称
		String loginUserId = 			paramMap.get(LOGIN_USER_ID);						// 画面のログインユーザーID
		String loginUserNm = 			paramMap.get(LOGIN_USER_NM);						// 画面のログインユーザー名
		String loginUserWkKbtOrgNm = 	paramMap.get(LOGIN_USER_WKKBT_ORG_NM);				// 画面の業務個別設定組織名
		String taioKrkNo = 				paramMap.get(TAIO_KRK_NO);							// 対応記録番号
		String rireki = 				paramMap.get(TAIO_KIROK_RIREKI);					// 対応記録履歴

		// 設定値マップ
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();

		// 対応記録履歴の終端改行コード付加処理
		rireki = JCRUtilCommon.addCRLF(rireki);

		// 対応記録履歴
		rireki = rireki + makeRireki(callBkKiboYmd, callBkkibotime, callBkShiteiTypeCd, callBkShiteiTypeNm, loginUserNm, loginUserWkKbtOrgNm);
		if (callBkKiboYmd != null && !("".equals(callBkKiboYmd))){
			// 対応記録履歴
			setMap.setValue(JBSbatCR_T_TAIO_KIROK.TAIO_KIROK_RIREKI, rireki);
			//対応記録ステータス コールバック待ち　206
			setMap.setValue(JBSbatCR_T_TAIO_KIROK.TAIO_KIROK_STAT, TAIO_KIROK_STAT_206);
			// コールバック希望年月日
			setMap.setValue(JBSbatCR_T_TAIO_KIROK.CALLBK_KIBO_YMD, callBkKiboYmd);
			// コールバック希望時間
			setMap.setValue(JBSbatCR_T_TAIO_KIROK.CALLBK_KIBO_TIME, callBkkibotime);
			// コールバック時間指定タイプコード
			setMap.setValue(JBSbatCR_T_TAIO_KIROK.CALLBK_SHITEI_TYPE_CD, callBkShiteiTypeCd);
		} else {
			//対応記録ステータス 処理中　201
			setMap.setValue(JBSbatCR_T_TAIO_KIROK.TAIO_KIROK_STAT, TAIO_KIROK_STAT_201);
			// コールバック希望年月日
			setMap.setValue(JBSbatCR_T_TAIO_KIROK.CALLBK_KIBO_YMD, "");
			// コールバック希望時間
			setMap.setValue(JBSbatCR_T_TAIO_KIROK.CALLBK_KIBO_TIME, "");
			// コールバック時間指定タイプコード
			setMap.setValue(JBSbatCR_T_TAIO_KIROK.CALLBK_SHITEI_TYPE_CD, "");
		}

		setMap.setValue(JBSbatCR_T_TAIO_KIROK.UPD_DTM, sysDtms);				// 更新年月日時分秒
		setMap.setValue(JBSbatCR_T_TAIO_KIROK.UPD_OPEACNT, batchUserId);		// 更新オペレータアカウント

		// 条件
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue(JBSbatCR_T_TAIO_KIROK.TAIO_KIROK_NO, taioKrkNo);		// 対応記録番号

		db_CR_T_TAIO_KIROK.updateByPrimaryKeys(whereMap, setMap);
		
	}

	/**
	 * 対応記録履歴生成
	 * @param loginUserNm ログインユーザー名
	 * @param loginUserWkKbtOrgNm ログインユーザーの業務個別設定組織名
	 * @return 生成された対応記録履歴
	 * @throws Exception 例外
	 */
	private String makeRireki(String callBkKiboYmd,String callBkkibotime,String callBkShiteiTypeCd,String callBkShiteiTypeNm,
							String loginUserNm,
							String loginUserWkKbtOrgNm) throws Exception
	{
		StringBuilder sb = new StringBuilder();

		// コール分の対応記録履歴を編集する
		String callbkKiboDtm = "";
		
		// フォーマット変換(yyyyMMddHHmmss)→(yyyy/MM/dd HH:mm:ss)
		// コールバック希望年月日、コールバック希望時間が共に設定されている場合
		if (!JCRUtilCommon.isNull(callBkKiboYmd)
			&& !JCRUtilCommon.isNull(callBkkibotime))
		{
			callbkKiboDtm = JCRUtilCommon.formatDate(callBkKiboYmd.concat(callBkkibotime),
					JCRStrConst.FMT_YMDHM, JCRStrConst.FMT_EDIT_YMDHM);
		}
		// コールバック希望年月日のみが設定されている場合
		else if (!JCRUtilCommon.isNull(callBkKiboYmd))
		{
			callbkKiboDtm = JCRUtilCommon.formatDate(callBkKiboYmd,
					JCRStrConst.FMT_YMD, JCRStrConst.FMT_EDIT_YMD);	
		}
		// 上記以外の場合
		else
		{
			callbkKiboDtm = "";
		}
		
		if (callBkKiboYmd != null && !("".equals(callBkKiboYmd))){
			sb.append("☆一括コールバック登録：").append(loginUserWkKbtOrgNm).append("(").append(loginUserNm == null ? "" : loginUserNm).append(")").append(JCRStrConst.KAIGYO_CD);
			sb.append("　一括コールバック希望時間：").append(callbkKiboDtm).append(" ").append(callBkShiteiTypeNm).append(JCRStrConst.KAIGYO_CD);
		}
		

		if (sb.length() > 0)
		{
			sb.append("------------------------------------------------------------").append(JCRStrConst.KAIGYO_CD);
		}

		commonItem.getLogPrint().printDebugLog("コールバック日時一括登録情報：" + JCRStrConst.KAIGYO_CD + sb);

		return sb.toString();
	}

	/**
	 * (8) 終了処理
	 * @param shoriiraiNo ディレイド処理依頼番号
	 * @param shoriKekkaCd ディレイド処理結果コード
	 * @param errList エラー情報List
	 * @throws Exception 例外
	 */
	private void end(String shoriiraiNo, String shoriKekkaCd, List<String> errList) throws Exception
	{
		// (8) 終了処理

		// (a) 更新処理コミット
		commitOrRollback(shoriKekkaCd);

		// (b) エラー情報ファイル出力
		String errFilePath = null;
		if (errList != null && (errList.isEmpty() == false))
		{
			errFilePath = entryErrFile(errList);
		}

		// (c) ディレイド処理依頼結果更新処理
		entryShoriKekka(shoriiraiNo, shoriKekkaCd, errFilePath);

		// (d) 一時ファイル削除
		JCRUtilCommon.deleteTempFile(errFilePath);
	}

	/**
	 * エラーファイル作成
	 * @param errList	エラーリスト
	 * @return エラーファイル名
	 * @throws Exception 例外
	 */
	private String entryErrFile(List<String> errList) throws Exception
	{
		String errFilePath = tmpFileDir + File.separator + super.jobid + "_" + sysDtms + ".TXT";
		JCRBatCommon.entryErrFileData(commonItem, errFilePath, errList);

		return errFilePath;
	}

	/**
	 * 更新処理コミット(またはロールバック)
	 * @param shoriKekkaCd ディレイド処理結果コード
	 * @throws Exception 例外
	 */
	private void commitOrRollback(String shoriKekkaCd) throws Exception
	{
		if (JCRStrConst.DLYD_OK.equals(shoriKekkaCd))
		{
			// 正常終了の場合
			// 更新処理コミット
			super.commit();
		}
		else
		{
			// ロールバック
			commonItem.getConnection().rollback();
		}
	}

	/**
	 * (8)-(c) 処理依頼結果登録
	 * @param shoriIraiNo ディレイド処理依頼番号
	 * @param shoriKekkaCd ディレイド処理結果コード
	 * @param errFilePath エラーファイルパス(エラーが無い場合はnull)
	 * @throws Exception 例外
	 */
	private void entryShoriKekka(String shoriIraiNo, String shoriKekkaCd, String errFilePath) throws Exception
	{
		// (8)-(c) 処理依頼結果登録

		// 1 ディレイド処理依頼結果更新処理
		JCRBatCommon.updateShoriIraiResult(commonItem, shoriIraiNo, shoriKekkaCd, errFilePath);

		// 2 ディレイド処理結果登録コミット
		super.commit();
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CR_T_TAIO_KIROK.close();
		db_ZM_M_CD_NM_KANRI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/

		// データアクセスオブジェクトクローズ
		JCRBatCommon.closeDataAccessObj(commonItem);

	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * SQLKEY(CR_SELECT_016)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	対応記録番号
	 *		 	更新年月日時分秒
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCR_T_TAIO_KIROK_CR_SELECT_016(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_CR_T_TAIO_KIROK.selectBySqlDefine(paramList, CR_T_TAIO_KIROK_CR_SELECT_016);
	}
	
	/**
	 * コード値のコード名称を取得を行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * コード種別コード、コード区分、運用日をもとに検索し、結果を取得できた場合、コード名称を取得。<br>
	 * </pre>
	 * <p>
	 * @param cdSbtCd コード種別コード
	 * @param cdDiv   コード区分
	 * @return String コード名称を取得
	 * @throws Exception
	 */
	private String cdValid(String cdSbtCd, String cdDiv, String unyoYmd) throws Exception 
	{
		Object[] prm = new Object[]{
				cdSbtCd,			// コード種別コード
				cdDiv,				// コード区分
				unyoYmd,			// コード適用開始年月日
				unyoYmd				// コード適用終了年月日
		};
		String Val = "";

		// DBアクセスを実行します
		executeZM_M_CD_NM_KANRI_KK_SELECT_001(prm);
		
		JBSbatCommonDBInterface retObj = db_ZM_M_CD_NM_KANRI.selectNext();
		if (retObj == null)
		{
			Val = "";
		} else {
			// サービス契約内訳．プラン開始年月日取得
			Val = JBSbatStringUtil.Rtrim(retObj.getString(CD_DIV_NM));
		}
		return Val;
	}
	
	/**
	 * SQLKEY(KK_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	コード種別コード
	 *		 	コード区分
	 *		 	コード適用開始年月日
	 *		 	コード適用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_M_CD_NM_KANRI_KK_SELECT_001(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_ZM_M_CD_NM_KANRI.selectBySqlDefine(paramList, ZM_M_CD_NM_KANRI_KK_SELECT_001);
	}
}
