/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatFUEfoLogShuk
*	ソースファイル名	：JBSbatFUEfoLogShuk.java
*	作成者				：富士通
*	作成日				：2012年04月05日
*＜機能概要＞
*　ＥＦＯログ集計部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00		2012/04/05	味岡 載晃	新規作成
*	v4.00		2012/12/11	FJ)大塚		IT2-2012-0002009対応
*	v4.01		2013/03/19	FJ)八坂		ST7-2013-0000004 障害対応
*********************************************************************/
package eo.business.service;

import eo.business.common.JBSbatBusinessService;
import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatFUEfoLogShuk extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(ＥＦＯログワーク)*/
	private static final String D_TBL_NAME_FU_T_EFO_LOG_WK = "FU_T_EFO_LOG_WK";

	/** テーブル(ＥＦＯ利用者別集計結果)*/
	private static final String D_TBL_NAME_FU_T_EFO_RYSBT_SRLT = "FU_T_EFO_RYSBT_SRLT";

	/** テーブル(ＥＦＯ項目別集計結果)*/
	private static final String D_TBL_NAME_FU_T_EFO_KMKBT_SRLT = "FU_T_EFO_KMKBT_SRLT";

	/** SQL定義キー(FU_SELECT_001)*/
	private static final String FU_T_EFO_LOG_WK_FU_SELECT_001 = "FU_SELECT_001";

	/** SQL定義キー(FU_SELECT_002)*/
	private static final String FU_T_EFO_LOG_WK_FU_SELECT_002 = "FU_SELECT_002";

	/** SQL定義キー(FU_INSERT_001)*/
	private static final String FU_T_EFO_RYSBT_SRLT_FU_INSERT_001 = "FU_INSERT_001";

	/** SQL定義キー(FU_INSERT_001)*/
	private static final String FU_T_EFO_KMKBT_SRLT_FU_INSERT_001 = "FU_INSERT_001";

	/** テーブルアクセスクラス(ＥＦＯログワーク)*/
	private JBSbatSQLAccess db_FU_T_EFO_LOG_WK = null;

	/** テーブルアクセスクラス(ＥＦＯ利用者別集計結果)*/
	private JBSbatSQLAccess db_FU_T_EFO_RYSBT_SRLT = null;

	/** テーブルアクセスクラス(ＥＦＯ項目別集計結果)*/
	private JBSbatSQLAccess db_FU_T_EFO_KMKBT_SRLT = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 準直帰フラグ(0:読込完了)*/
	private static final String STR_JTYKI_FLG_0 = "0";

	/** 準直帰フラグ(1:項目にアクセスしたが何も入力せず離脱した)*/
	private static final String STR_JTYKI_FLG_1 = "1";

	/** 必須エラー*/
	private static final String STR_NULL_ERR = "null";

	/** 半角数字エラー*/
	private static final String STR_NUM_ERR = "num";

	/** 正規表現エラー*/
	private static final String STR_REGEX_ERR = "regex";

	/** 半角エラー*/
	private static final String STR_HANKAKU_ERR = "hankaku";

	/** 比較エラー*/
	private static final String STR_EQUAL_ERR = "equal";

	/** メッセージキー*/
	private static final String EFUB0060AI = JPCBatchMessageConstant.EFUB0060AI;

	/** メッセージキー*/
	private static final String EFUB0070AI = JPCBatchMessageConstant.EFUB0070AI;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_FU_T_EFO_LOG_WK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_FU_T_EFO_LOG_WK);
		db_FU_T_EFO_RYSBT_SRLT = new JBSbatSQLAccess(commonItem, D_TBL_NAME_FU_T_EFO_RYSBT_SRLT);
		db_FU_T_EFO_KMKBT_SRLT = new JBSbatSQLAccess(commonItem, D_TBL_NAME_FU_T_EFO_KMKBT_SRLT);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		//******************************************************//
		//***************** 利用者別集計の実施 *****************//
		//******************************************************//
		String strRiyoTaiCkid = ""; // 利用者別集計用集約キー格納変数(利用者(クッキーID):退避用)
		String strRiyoTaiSycd = ""; // 利用者別集計用集約キー格納変数(システムコード:退避用)
		String strRiyoTaiGmcd = ""; // 利用者別集計用集約キー格納変数(画面ID:退避用)
		String strRiyoTaiAymd = ""; // 利用者別集計用集約キー格納変数(アクセス年月日:退避用)

		String strRiyoInsTykiFlg = ""; // 利用者別集計用データ格納変数(直帰フラグ:登録用)
		String strRiyoInsJTykiFlg = ""; // 利用者別集計用データ格納変数(準直帰フラグ:登録用)
		String strRiyoInsMustUm = ""; // 利用者別集計用データ格納変数(必須入力項目有無:登録用)
		String strRiyoInsRidatFlg = ""; // 利用者別集計用データ格納変数(途中離脱フラグ:登録用)
		String strRiyoInsCmpFlg = "0"; // 利用者別集計用データ格納変数(CMPフラグ:登録用)
		String strRiyoInsCvFlg = "0"; // 利用者別集計用データ格納変数(CVフラグ:登録用)
		String strRiyoInsNextFlg = "0"; // 利用者別集計用データ格納変数(Nextフラグ:登録用)
		String strRiyoInsAcStaDtm = ""; // 利用者別集計用データ格納変数(アクセス開始年月日時分秒:登録用)
		String strRiyoInsAcEndDtm = ""; // 利用者別集計用データ格納変数(アクセス終了年月日時分秒:登録用)
		String strRiyoInsBrowNm = ""; // 利用者別集計用データ格納変数(ブラウザ名:登録用)
		String strRiyoInsOsNm = ""; // 利用者別集計用データ格納変数(OS名:登録用)
		int iRiyoInsPReadNum = 0; // 利用者別集計用データ格納変数(ページ読込数:登録用)
		int iRiyoAllMojiNum = 0; // 利用者別集計用データ格納変数(文字数合計:カウント用)
		int iRiyoReadCnt = 0; // 利用者別集計用データ読込件数
		int iRiyoInsCnt = 0; // 利用者別集計用データ登録件数

		// EFOログワーク取得結果(利用者別集計用)格納領域を生成します
		JBSbatCommonDBInterface efolog_work_map = null;
		JBSbatCommonDBInterface efolog_work_dbList = new JBSbatCommonDBInterface();

		// EFOログワークデータ(利用者別集計用)取得
		executeFU_T_EFO_LOG_WK_FU_SELECT_001(efolog_work_dbList.getList().toArray());
		// 取得したレコードを1件づつ読込む
		for (efolog_work_map = db_FU_T_EFO_LOG_WK.selectNext(); null != efolog_work_map; efolog_work_map = db_FU_T_EFO_LOG_WK.selectNext())
		{
			iRiyoReadCnt++; // 読み込み件数を+1

			// SQL取得項目を取得用変数へ格納
			String strRiyoGetCkid = efolog_work_map.getString("COOKIE_ID"); // 利用者別集計用集約キー格納変数(利用者(クッキーID):取得用)
			String strRiyoGetSycd = efolog_work_map.getString("SYS_CD"); // 利用者別集計用集約キー格納変数(システムコード:取得用)
			String strRiyoGetGmcd = efolog_work_map.getString("SCREEN_ID"); // 利用者別集計用集約キー格納変数(画面ID:取得用)
			String strRiyoGetAymd = efolog_work_map.getString("EFO_SAKSEI_DTM"); // 利用者別集計用集約キー格納変数(アクセス年月日:取得用)
			String strRiyoGetPlFinFlg = efolog_work_map.getString("PAGE_LOAD_FIN_FLG"); // 利用者別集計用データ格納変数(ページ読込完了フラグ:取得用)
			String strRiyoGetMustUm = efolog_work_map.getString("HISSU_INPUT_KMK_UM"); // 利用者別集計用データ格納変数(必須入力項目有無:取得用)
			String strRiyoGetMojiNum = efolog_work_map.getString("MOJI_NUM"); // 利用者別集計用データ格納変数(文字数:取得用)
			String strRiyoGetMsFinFlg = efolog_work_map.getString("MSKM_FIN_FLG"); // 利用者別集計用データ格納変数(申込完了フラグ:取得用)
			String strRiyoGetPaFinFlg = efolog_work_map.getString("PAGE_INPUT_FIN_FLG"); // 利用者別集計用データ格納変数(ページ完了フラグ:取得用)
			String strRiyoGetBrowNm = efolog_work_map.getString("BROWSER_NM"); // 利用者別集計用データ格納変数(ブラウザ名:取得用)
			String strRiyoGetOsNm = efolog_work_map.getString("OS_NM"); // 利用者別集計用データ格納変数(OS名:取得用)

			// 読込みデータが1件目の場合はデータ登録とキーの比較は行なわない。
			if (iRiyoReadCnt != 1)
			{
				// 取得用キーと退避用キーを比較し、キーが異なる場合はEFO利用者別集計結果テーブルにデータ登録し、登録用の格納変数をリセットする。
				if (strRiyoTaiCkid.equals(strRiyoGetCkid) && strRiyoTaiSycd.equals(strRiyoGetSycd) && strRiyoTaiGmcd.equals(strRiyoGetGmcd)
						&& strRiyoTaiAymd.equals(strRiyoGetAymd.substring(0, 8)))
				{
					//iRiyoReadCnt++;
				}
				else
				{
					if ("".equals(strRiyoInsTykiFlg))
					{
						// ページ読込み完了フラグがNULLの場合は直帰離脱と判定し、1を設定する
						strRiyoInsTykiFlg = STR_JTYKI_FLG_1;
					}

					JBSbatCommonDBInterface eforiyoList = new JBSbatCommonDBInterface();

					// EFO利用者別集計結果テーブルへレコード登録
					eforiyoList.setValue(strRiyoTaiSycd); // システムコード
					eforiyoList.setValue(strRiyoTaiGmcd); // 画面ID
					eforiyoList.setValue(strRiyoTaiCkid); // クッキーID
					eforiyoList.setValue(strRiyoInsAcStaDtm); // アクセス開始年月日時分秒
					eforiyoList.setValue(strRiyoInsAcEndDtm); // アクセス終了年月日時分秒
					eforiyoList.setValue(iRiyoInsPReadNum); // ページ読込数
					eforiyoList.setValue(strRiyoInsTykiFlg); // 直帰フラグ
					eforiyoList.setValue(strRiyoInsJTykiFlg); // 準直帰フラグ
					eforiyoList.setValue(strRiyoInsRidatFlg); // 途中離脱フラグ
					eforiyoList.setValue(strRiyoInsCmpFlg); // CMPフラグ
					eforiyoList.setValue(strRiyoInsCvFlg); // CVフラグ
					eforiyoList.setValue(strRiyoInsNextFlg); // NEXTフラグ
					eforiyoList.setValue(strRiyoInsBrowNm); // ブラウザ名
					eforiyoList.setValue(strRiyoInsOsNm); // OS名
					executeFU_T_EFO_RYSBT_SRLT_FU_INSERT_001(eforiyoList.getList().toArray());

					iRiyoInsCnt++;

					// 登録用変数のリセット
					strRiyoInsTykiFlg = ""; // 利用者別集計用データ格納変数(直帰フラグ:登録用)
					strRiyoInsJTykiFlg = ""; // 利用者別集計用データ格納変数(準直帰フラグ:登録用)
					strRiyoInsMustUm = ""; // 利用者別集計用データ格納変数(必須入力項目有無:登録用)
					strRiyoInsRidatFlg = ""; // 利用者別集計用データ格納変数(途中離脱フラグ:登録用)
					strRiyoInsCmpFlg = "0"; // 利用者別集計用データ格納変数(CMPフラグ:登録用)
					strRiyoInsCvFlg = "0"; // 利用者別集計用データ格納変数(CVフラグ:登録用)
					strRiyoInsNextFlg = "0"; // 利用者別集計用データ格納変数(Nextフラグ:登録用)
					strRiyoInsAcStaDtm = ""; // 利用者別集計用データ格納変数(アクセス開始年月日時分秒:登録用)
					strRiyoInsAcEndDtm = ""; // 利用者別集計用データ格納変数(アクセス終了年月日時分秒:登録用)
					strRiyoInsBrowNm = ""; // 利用者別集計用データ格納変数(ブラウザ名:登録用)
					strRiyoInsOsNm = ""; // 利用者別集計用データ格納変数(OS名:登録用)
					iRiyoInsPReadNum = 0; // 利用者別集計用データ格納変数(ページ読込数:登録用)
					iRiyoAllMojiNum = 0; // 利用者別集計用データ格納変数(文字数合計:カウント用)
				}
			}

			//** 1.アクセス開始年月日時分秒の判定 **//
			// アクセス開始年月日時分秒がnullの場合、取得アクセス開始年月日をセット
			if ("".equals(strRiyoInsAcStaDtm))
			{
				strRiyoInsAcStaDtm = strRiyoGetAymd;
			}
			// 登録用のアクセス開始年月日 ＞ 取得済のアクセス開始年月日の場合は登録用のアクセス開始年月日を更新する
			if (Long.parseLong(strRiyoInsAcStaDtm) >= Long.parseLong(strRiyoGetAymd))
			{
				strRiyoInsAcStaDtm = strRiyoGetAymd;
				strRiyoInsBrowNm = strRiyoGetBrowNm; // 紐づくブラウザ名を設定
				strRiyoInsOsNm = strRiyoGetOsNm; // 紐づくOS名を設定
			}

			//** 2.アクセス終了年月日時分秒の判定 **//
			// アクセス終了年月日時分秒がnullの場合、取得アクセス終了年月日をセット
			if ("".equals(strRiyoInsAcEndDtm))
			{
				strRiyoInsAcEndDtm = strRiyoGetAymd;
			}
			// 登録用のアクセス終了年月日 ＜ 取得済のアクセス終了年月日の場合は登録用のアクセス終了年月日を更新する
			if (Long.parseLong(strRiyoInsAcEndDtm) <= Long.parseLong(strRiyoGetAymd))
			{
				strRiyoInsAcEndDtm = strRiyoGetAymd;
			}

			//** 3.直帰フラグの判定 **//
			// SQLより取得したページ読込み完了フラグ(直帰フラグ集計用データ)がnull以外に処理を実施
			if (strRiyoGetPlFinFlg != null)
			{
				// ページ読込数の集計
				iRiyoInsPReadNum = iRiyoInsPReadNum + Integer.parseInt(strRiyoGetPlFinFlg);

				// 登録用の直帰フラグがnullの場合、取得したページ読込み完了フラグをセット
				if ("".equals(strRiyoInsTykiFlg))
				{
					strRiyoInsTykiFlg = strRiyoGetPlFinFlg;
				}
				// 登録用の直帰フラグ ＞＝ 取得済のページ読込み完了フラグの場合は登録用の直帰フラグを更新する
				if (Integer.parseInt(strRiyoInsTykiFlg) >= Integer.parseInt(strRiyoGetPlFinFlg))
				{
					strRiyoInsTykiFlg = strRiyoGetPlFinFlg;
				}
			}
			if (strRiyoGetMojiNum != null) // 文字数はSQL取得時にNULLの可能性があるためチェック実施
			{
				// 文字数の合計を算出(準直帰・途中離脱フラグ判定用)
				iRiyoAllMojiNum = Integer.parseInt(strRiyoGetMojiNum) + iRiyoAllMojiNum;
			}

			///** 4.準直帰フラグの判定 **//
			if ("0".equals(strRiyoInsTykiFlg) && iRiyoAllMojiNum == 0)
			{
				strRiyoInsJTykiFlg = STR_JTYKI_FLG_1;
			}
			else
			{
				strRiyoInsJTykiFlg = STR_JTYKI_FLG_0;
			}

			//** 5.途中離脱フラグの判定 **//

			// 5-1.必須入力項目有無の最大値の判定
			if (strRiyoGetMustUm != null)
			{
				// 登録用の必須項目入力有無がnullの場合、取得した必須項目入力有無をセット
				if ("".equals(strRiyoInsMustUm))
				{
					strRiyoInsMustUm = strRiyoGetMustUm;
				}
				// 登録用の必須項目入力有無 ＜ 取得済の必須項目入力有無の場合は登録用の直帰フラグを更新する
				if (Integer.parseInt(strRiyoInsMustUm) <= Integer.parseInt(strRiyoGetMustUm))
				{
					strRiyoInsMustUm = strRiyoGetMustUm;
				}
			}

			// 5-2.途中離脱フラグの判定
			if ("0".equals(strRiyoInsTykiFlg) && "0".equals(strRiyoInsMustUm) && iRiyoAllMojiNum >= 1)
			{
				strRiyoInsRidatFlg = "1";
			}
			else
			{
				strRiyoInsRidatFlg = "0";
			}

			//** 6.CMPフラグの判定 **//
			if ("1".equals(strRiyoGetMustUm))
			{
				// 集約キーに紐づく必須入力項目有無に1つでも[1]が存在すれば、1を設定
				strRiyoInsCmpFlg = "1";
			}

			//** 7.CVフラグの判定 **//
			if ("1".equals(strRiyoGetMsFinFlg))
			{
				// 集約キーに紐づく申込完了フラグに1つでも[1]が存在すれば、1を設定
				strRiyoInsCvFlg = "1";
			}

			//** 8.NEXTフラグの判定 **//
			if ("1".equals(strRiyoGetPaFinFlg))
			{
				// 集約キーに紐づくページ完了フラグに1つでも[1]が存在すれば、1を設定
				strRiyoInsNextFlg = "1";
			}

			// キー項目の退避
			strRiyoTaiCkid = strRiyoGetCkid;
			strRiyoTaiSycd = strRiyoGetSycd;
			strRiyoTaiGmcd = strRiyoGetGmcd;
			strRiyoTaiAymd = strRiyoGetAymd.substring(0, 8);
		}

		// 読込みレコード最終レコードの場合はデータを登録する。読込みレコード0件の場合は処理をスルーする
		if (iRiyoReadCnt != 0)
		{
			if ("".equals(strRiyoInsTykiFlg))
			{
				// ページ読込み完了フラグがNULLの場合は直帰離脱と判定し、1を設定する
				strRiyoInsTykiFlg = STR_JTYKI_FLG_1;
			}

			JBSbatCommonDBInterface eforiyoList = new JBSbatCommonDBInterface();

			// EFO利用者別集計結果テーブルへレコード登録
			eforiyoList.setValue(strRiyoTaiSycd); // システムコード
			eforiyoList.setValue(strRiyoTaiGmcd); // 画面ID
			eforiyoList.setValue(strRiyoTaiCkid); // クッキーID
			eforiyoList.setValue(strRiyoInsAcStaDtm); // アクセス開始年月日時分秒
			eforiyoList.setValue(strRiyoInsAcEndDtm); // アクセス終了年月日時分秒
			eforiyoList.setValue(iRiyoInsPReadNum); // ページ読込数
			eforiyoList.setValue(strRiyoInsTykiFlg); // 直帰フラグ
			eforiyoList.setValue(strRiyoInsJTykiFlg); // 準直帰フラグ
			eforiyoList.setValue(strRiyoInsRidatFlg); // 途中離脱フラグ
			eforiyoList.setValue(strRiyoInsCmpFlg); // CMPフラグ
			eforiyoList.setValue(strRiyoInsCvFlg); // CVフラグ
			eforiyoList.setValue(strRiyoInsNextFlg); // NEXTフラグ
			eforiyoList.setValue(strRiyoInsBrowNm); // ブラウザ名
			eforiyoList.setValue(strRiyoInsOsNm); // OS名
			executeFU_T_EFO_RYSBT_SRLT_FU_INSERT_001(eforiyoList.getList().toArray());

			iRiyoInsCnt++;
		}

		//******************************************************//
		//****************** 項目別集計の実施 ******************//
		//******************************************************//

		String strKmkTaiCkid = ""; // 利用者別集計用集約キー格納変数(利用者(クッキーID):退避用)
		String strKmkTaiSycd = ""; // 利用者別集計用集約キー格納変数(システムコード:退避用)
		String strKmkTaiGmcd = ""; // 利用者別集計用集約キー格納変数(画面ID:退避用)
		String strKmkTaiAymd = ""; // 利用者別集計用集約キー格納変数(アクセス年月日:退避用)
		String strKmkTaiSeid = ""; // 利用者別集計用集約キー格納変数(セッションID):退避用
		String strKmkTaiFiErRuNm = ""; // 利用者別集計用格納変数(エラールール理由名)
		String strKmkTaiPlFinFlg = ""; // 利用者別集計用格納変数(ページ読込完了フラグ)
		String strKmkTaiInTime = ""; // 利用者別集計用格納変数(入力時間)
		String strKmkTaiInErrUm = ""; // 利用者別集計用格納変数(エラー有無)

		String strKmkTaiFiNm = ""; // 項目別集計用データ格納変数(フィールド名:登録用)
		int iKmkInsAcsCnt = 0; // 項目別集計用データ格納変数(アクセス回数:登録用)
		int iKmkInsAcsNum = 0; // 項目別集計用データ格納変数(アクセス人数:登録用)
		int iKmkInsNoEntCnt = 0; // 項目別集計用データ格納変数(未入力数:登録用)
		int iKmkInsNoFix = 0; // 項目別集計用データ格納変数(未修正数:登録用)
		int iKmkInsErrCnt = 0; // 項目別集計用データ格納変数(未入力数:登録用)
		int iKmkInsCmpFlg = 0; // 項目別集計用データ格納変数(CMPフラグ:登録用)
		int iKmkInsMoveCnt = 0; // 項目別集計用データ格納変数(離脱数:登録用)
		int ikmkInsInkmkUm = 0; // 項目別集計用データ格納変数(必須入力項目有無:カウント用)
		int iKmkInsInTimAll = 0; // 項目別集計用データ格納変数(入力時間合計:登録用)
		int ikmkInsNullNum = 0; // 項目別集計用データ格納変数(必須入力エラー数:登録用)
		int ikmkInsNumNum = 0; // 項目別集計用データ格納変数(半角数字エラー数:登録用)
		int ikmkInsRegexNum = 0; // 項目別集計用データ格納変数(正規表現エラー数:登録用)
		int ikmkInsHanNum = 0; // 項目別集計用データ格納変数(半角エラー数:登録用)
		int ikmkInsEqualNum = 0; // 項目別集計用データ格納変数(比較エラー数:登録用)
		int iKmkReadCnt = 0; // 項目別集計用データ読込件数
		int iKmkInsCnt = 0; // 項目別集計用データ登録件数
		int fieldNmCnt = -1;
		// EFOログワーク取得結果(項目別集計用)格納領域を生成します
		JBSbatCommonDBInterface efolog_work_kmk_map = null;
		JBSbatCommonDBInterface efolog_work_kmk_dbList = new JBSbatCommonDBInterface();

		// EFOログワークデータ(項目別集計用)取得
		executeFU_T_EFO_LOG_WK_FU_SELECT_002(efolog_work_kmk_dbList.getList().toArray());
		// 取得したレコードを1件づつ読込む
		for (efolog_work_kmk_map = db_FU_T_EFO_LOG_WK.selectNext(); null != efolog_work_kmk_map; efolog_work_kmk_map =
				db_FU_T_EFO_LOG_WK.selectNext())
		{
			String strKmkGetFiNm = efolog_work_kmk_map.getString("FIELD_NM"); // 項目別集計用集約キー格納変数(フィールド名:取得用)

			// IT2-2012-0002009 Otsuka 2012/12/11 start1
			// 画面項目名が設定されていない場合は登録を行わない。
			if (!this.isNullorEmpty(strKmkGetFiNm))
			{

				// IT2-2012-0002009 Otsuka 2012/12/11 start2
				fieldNmCnt = -1; //初期化

				// "/"の位置を取得 存在しない場合は-1を返す
				fieldNmCnt = strKmkGetFiNm.lastIndexOf(JFUStrConst.SLASH);

				if (fieldNmCnt != -1)
				{
					// "/"以降を抜き出す
					strKmkGetFiNm = strKmkGetFiNm.substring(fieldNmCnt + 1);
				}
				// IT2-2012-0002009 Otsuka 2012/12/11 end2

				iKmkReadCnt++; // 項目別集計用データ読込件数 +1
				String strKmkGetCkid = efolog_work_kmk_map.getString("COOKIE_ID"); // 項目別集計用データ格納変数(COOKIEID:取得用)
				String strKmkGetSesId = efolog_work_kmk_map.getString("SESSION_ID"); // 項目別集計用データ格納変数(セッションID:取得用)

				if (iKmkReadCnt != 1)
				{
					//** 5.離脱数のカウント **//
					// クッキーIDの最後のアクセスであるか判定する
					if (!strKmkGetCkid.equals(strKmkTaiCkid) && strKmkTaiFiErRuNm == null)
					{
						// ページ入力完了フラグと必須入力項目有無の合計が0
						if ("0".equals(strKmkTaiPlFinFlg) && ikmkInsInkmkUm == 0)
						{
							iKmkInsMoveCnt++;
						}
					}

					//** 7.未修正数のカウント **//
					if (!strKmkTaiSeid.equals(strKmkGetSesId) && strKmkTaiFiErRuNm == null)
					{
						// 2013/03/19 ST7-2013-0000004 障害対応
						if ("0".equals(strKmkTaiPlFinFlg) && ikmkInsInkmkUm == 0 && efolog_work_kmk_map.getString("INPUT_TIME") != null && "1".equals(efolog_work_kmk_map.getString("INPUT_ERR_UM")))
						{
							iKmkInsNoFix++;
						}
					}
				}

				//			String strKmkGetFiNm = efolog_work_kmk_map.getString("FIELD_NM"); // 項目別集計用集約キー格納変数(フィールド名:取得用) 上に移動
				String strKmkGetSycd = efolog_work_kmk_map.getString("SYS_CD"); // 項目別集計用集約キー格納変数(システムコード:取得用)
				String strKmkGetGmcd = efolog_work_kmk_map.getString("SCREEN_ID"); // 項目別集計用集約キー格納変数(画面ID:取得用)
				String strKmkGetAymd = efolog_work_kmk_map.getString("EFO_SAKSEI_DTM"); // 項目別集計用集約キー格納変数(アクセス年月日:取得用)
				String strKmkGetErRuNm = efolog_work_kmk_map.getString("ERR_RSN_RULE_NM"); // 項目別集計用データ格納変数(エラールール理由名:取得用)
				String strKmkGetInErrUm = efolog_work_kmk_map.getString("INPUT_ERR_UM"); // 項目別集計用データ格納変数(入力エラー有無:取得用)
				String strKmkGetMojiNum = efolog_work_kmk_map.getString("MOJI_NUM"); // 項目別集計用データ格納変数(文字数:取得用)
				String strKmkGetPlFinFlg = efolog_work_kmk_map.getString("PAGE_LOAD_FIN_FLG"); // 項目別集計用データ格納変数(ページ読込完了フラグ:取得用)
				String strKmkGetHiInKmUm = efolog_work_kmk_map.getString("HISSU_INPUT_KMK_UM"); // 項目別集計用データ格納変数(必須入力項目有無:取得用)
				String strKmkGetInTime = efolog_work_kmk_map.getString("INPUT_TIME"); // 項目別集計用データ格納変数(ページ読込完了フラグ:取得用)

				// 読込みデータが1件目の場合は登録、キーの比較を行なわない。
				if (iKmkReadCnt != 1)
				{
					// 取得用キーと退避用キーを比較し、キーが異なる場合はEFO利用者別集計結果テーブルにデータ登録し、登録用の格納変数をリセットする。
					if (strKmkTaiFiNm.equals(strKmkGetFiNm) && strKmkTaiSycd.equals(strKmkGetSycd) && strKmkTaiGmcd.equals(strKmkGetGmcd)
							&& strKmkTaiAymd.equals(strKmkGetAymd.substring(0, 8)))
					{
						// iKmkReadCnt++;
					}
					else
					{
						JBSbatCommonDBInterface efokmkList = new JBSbatCommonDBInterface();

						// EFO項目別集計結果テーブルへレコード登録
						efokmkList.setValue(strKmkTaiSycd); // システムコード
						efokmkList.setValue(strKmkTaiGmcd); // 画面ID
						efokmkList.setValue(strKmkTaiAymd); // 集計対象年月日
						efokmkList.setValue(strKmkTaiFiNm); // フィールド名
						efokmkList.setValue(iKmkInsCmpFlg); // CMPフラグ
						efokmkList.setValue(iKmkInsAcsCnt); // アクセス回数
						efokmkList.setValue(iKmkInsAcsNum); // アクセス人数
						efokmkList.setValue(iKmkInsNoEntCnt); // 未入力数
						efokmkList.setValue(iKmkInsErrCnt); // エラー数
						efokmkList.setValue(iKmkInsMoveCnt); // 離脱数
						efokmkList.setValue(iKmkInsNoFix); // 未修正数
						efokmkList.setValue(iKmkInsInTimAll); // 入力時間合計
						efokmkList.setValue(ikmkInsNullNum); // 必須エラー数
						efokmkList.setValue(ikmkInsNumNum); // 半角数字エラー数
						efokmkList.setValue(ikmkInsRegexNum); // 正規表現エラー数
						efokmkList.setValue(ikmkInsHanNum); // 半角エラー数
						efokmkList.setValue(ikmkInsEqualNum); // 比較エラー数
						executeFU_T_EFO_KMKBT_SRLT_FU_INSERT_001(efokmkList.getList().toArray());

						iKmkInsCnt++;

						// 登録用変数のリセット
						strKmkTaiFiNm = ""; // 項目別集計用データ格納変数(フィールド名:登録用)
						iKmkInsAcsCnt = 0; // 項目別集計用データ格納変数(アクセス回数:登録用)
						iKmkInsAcsNum = 0; // 項目別集計用データ格納変数(アクセス人数:登録用)
						iKmkInsNoEntCnt = 0; // 項目別集計用データ格納変数(未入力数:登録用)
						iKmkInsNoFix = 0; // 項目別集計用データ格納変数(未修正数:登録用)
						iKmkInsErrCnt = 0; // 項目別集計用データ格納変数(未入力数:登録用)
						iKmkInsCmpFlg = 0; // 項目別集計用データ格納変数(CMPフラグ:登録用)
						iKmkInsMoveCnt = 0; // 項目別集計用データ格納変数(離脱数:登録用)
						ikmkInsInkmkUm = 0; // 項目別集計用データ格納変数(必須入力項目有無:カウント用)
						iKmkInsInTimAll = 0; // 項目別集計用データ格納変数(入力時間合計:登録用)
						ikmkInsNullNum = 0; // 項目別集計用データ格納変数(必須入力エラー数:登録用)
						ikmkInsNumNum = 0; // 項目別集計用データ格納変数(半角数字エラー数:登録用)
						ikmkInsRegexNum = 0; // 項目別集計用データ格納変数(正規表現エラー数:登録用)
						ikmkInsHanNum = 0; // 項目別集計用データ格納変数(半角エラー数:登録用)
						ikmkInsEqualNum = 0; // 項目別集計用データ格納変数(比較エラー数:登録用)
					}
				}

				strKmkTaiFiNm = strKmkGetFiNm; //フィールド名を登録用の変数に格納

				//** 1.アクセス回数のカウント **//
				if (strKmkGetErRuNm == null)
				{
					iKmkInsAcsCnt++;
				}

				//** 2.アクセス人数のカウント **//
				if (!strKmkGetCkid.equals(strKmkTaiCkid))
				{
					iKmkInsAcsNum++;
				}

				if (strKmkGetMojiNum != null)
				{
					//** 3.未入力数のカウント **//
					if (Integer.parseInt(strKmkGetMojiNum) == 0)
					{
						iKmkInsNoEntCnt++;
					}

					//** 4.エラー数のカウント **//
					if (Integer.parseInt(strKmkGetMojiNum) >= 1 && "1".equals(strKmkGetInErrUm))
					{
						iKmkInsErrCnt++;
					}
				}

				if (strKmkGetCkid.equals(strKmkTaiCkid))
				{
					ikmkInsInkmkUm = Integer.parseInt(strKmkGetHiInKmUm) + ikmkInsInkmkUm;
				}

				//** 6.CMPフラグの判定 **//
				if (iKmkInsMoveCnt == 0)
				{
					iKmkInsCmpFlg = 0;
				}
				else
				{
					iKmkInsCmpFlg = 1;
				}

				//** 8.入力時間合計のカウント **//
				if (strKmkGetInTime != null)
				{
					iKmkInsInTimAll = iKmkInsInTimAll + Integer.parseInt(strKmkGetInTime);

					if (iKmkInsInTimAll >= 3600000)
					{
						iKmkInsInTimAll = 3600000;
					}
				}

				//** 10.入力エラーのカウント **//
				if (STR_NULL_ERR.equals(strKmkGetErRuNm))
				{
					ikmkInsNullNum++;
				}

				//** 11.半角数字エラーのカウント **//
				if (STR_NUM_ERR.equals(strKmkGetErRuNm))
				{
					ikmkInsNumNum++;
				}

				//** 12.正規表現エラーのカウント **//
				if (STR_REGEX_ERR.equals(strKmkGetErRuNm))
				{
					ikmkInsRegexNum++;
				}

				//** 13.半角エラーのカウント **//
				if (STR_HANKAKU_ERR.equals(strKmkGetErRuNm))
				{
					ikmkInsHanNum++;
				}

				//** 14.比較エラーのカウント **//
				if (STR_EQUAL_ERR.equals(strKmkGetErRuNm))
				{
					ikmkInsEqualNum++;
				}

				// キー項目の退避
				strKmkTaiSeid = strKmkGetSesId;
				strKmkTaiCkid = strKmkGetCkid;
				strKmkTaiSycd = strKmkGetSycd;
				strKmkTaiGmcd = strKmkGetGmcd;
				strKmkTaiAymd = strKmkGetAymd.substring(0, 8);
				strKmkTaiFiNm = strKmkGetFiNm;

				// 項目の退避(離脱数、未修正数用)
				strKmkTaiFiErRuNm = strKmkGetErRuNm;
				strKmkTaiPlFinFlg = strKmkGetPlFinFlg;
				strKmkTaiInTime = strKmkGetInTime;
				strKmkTaiInErrUm = strKmkGetInErrUm;
			}
		} // IT2-2012-0002009 Otsuka 2012/12/11 end1

		// 読込みレコード最終レコードの場合はデータを登録する。読込みレコード0件の場合は処理をスルーする
		if (iKmkReadCnt != 0)
		{
			//** 5.離脱数のカウント **//
			// クッキーIDの最後のアクセスであるため判定を実施
			if (strKmkTaiFiErRuNm == null)
			{
				// ページ入力完了フラグと必須入力項目有無の合計が0
				if ("0".equals(strKmkTaiPlFinFlg) && ikmkInsInkmkUm == 0)
				{
					iKmkInsMoveCnt++;
				}
			}

			//** 7.未修正数のカウント **//
			if (strKmkTaiFiErRuNm == null)
			{
				if ("0".equals(strKmkTaiPlFinFlg) && ikmkInsInkmkUm == 0 && strKmkTaiInTime != null && "1".equals(strKmkTaiInErrUm))
				{
					iKmkInsNoFix++;
				}
			}

			JBSbatCommonDBInterface efokmkList = new JBSbatCommonDBInterface();

			// EFO項目別集計結果テーブルへレコード登録
			efokmkList.setValue(strKmkTaiSycd); // システムコード
			efokmkList.setValue(strKmkTaiGmcd); // 画面ID
			efokmkList.setValue(strKmkTaiAymd); // 集計対象年月日
			efokmkList.setValue(strKmkTaiFiNm); // フィールド名
			efokmkList.setValue(iKmkInsCmpFlg); // CMPフラグ
			efokmkList.setValue(iKmkInsAcsCnt); // アクセス回数
			efokmkList.setValue(iKmkInsAcsNum); // アクセス人数
			efokmkList.setValue(iKmkInsNoEntCnt); // 未入力数
			efokmkList.setValue(iKmkInsErrCnt); // エラー数
			efokmkList.setValue(iKmkInsMoveCnt); // 離脱数
			efokmkList.setValue(iKmkInsNoFix); // 未修正数
			efokmkList.setValue(iKmkInsInTimAll); // 入力時間合計
			efokmkList.setValue(ikmkInsNullNum); // 必須エラー数
			efokmkList.setValue(ikmkInsNumNum); // 半角数字エラー数
			efokmkList.setValue(ikmkInsRegexNum); // 正規表現エラー数
			efokmkList.setValue(ikmkInsHanNum); // 半角エラー数
			efokmkList.setValue(ikmkInsEqualNum); // 比較エラー数
			executeFU_T_EFO_KMKBT_SRLT_FU_INSERT_001(efokmkList.getList().toArray());

			iKmkInsCnt++;
		}
		super.logPrint.printBusinessErrorLog(EFUB0070AI, new String[] { D_TBL_NAME_FU_T_EFO_LOG_WK, String.valueOf(iRiyoReadCnt) });
		super.logPrint.printBusinessErrorLog(EFUB0060AI, new String[] { D_TBL_NAME_FU_T_EFO_RYSBT_SRLT, String.valueOf(iRiyoInsCnt) });
		super.logPrint.printBusinessErrorLog(EFUB0060AI, new String[] { D_TBL_NAME_FU_T_EFO_KMKBT_SRLT, String.valueOf(iKmkInsCnt) });

		return null;
		/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_FU_T_EFO_LOG_WK.close();
		db_FU_T_EFO_RYSBT_SRLT.close();
		db_FU_T_EFO_KMKBT_SRLT.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(FU_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 executeFU_T_EFO_LOG_WK_FU_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		// DBアクセスを実行します
		db_FU_T_EFO_LOG_WK.selectBySqlDefine(paramList, FU_T_EFO_LOG_WK_FU_SELECT_001);
	}

	/**
	 * SQLKEY(FU_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 *
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeFU_T_EFO_LOG_WK_FU_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		// DBアクセスを実行します
		db_FU_T_EFO_LOG_WK.selectBySqlDefine(paramList, FU_T_EFO_LOG_WK_FU_SELECT_002);
	}

	/**
	 * SQLKEY(FU_INSERT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 *
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	システムコード
	 *		 	画面ID
	 *		 	クッキーID
	 *		 	アクセス開始年月日時分秒
	 *		 	アクセス終了年月日時分秒
	 *		 	ページ読込数
	 *		 	直帰フラグ
	 *		 	準直帰フラグ
	 *		 	途中離脱フラグ
	 *		 	CMPフラグ
	 *		 	CVフラグ
	 *		 	NEXTフラグ
	 *		 	ブラウザ名
	 *		 	OS名
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeFU_T_EFO_RYSBT_SRLT_FU_INSERT_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());
		paramList.setValue(param[4].toString());
		paramList.setValue(param[5].toString());
		paramList.setValue(param[6].toString());
		paramList.setValue(param[7].toString());
		paramList.setValue(param[8].toString());
		paramList.setValue(param[9].toString());
		paramList.setValue(param[10].toString());
		paramList.setValue(param[11].toString());
		paramList.setValue(param[12].toString());
		paramList.setValue(param[13].toString());

		// DBアクセスを実行します
		db_FU_T_EFO_RYSBT_SRLT.executeBySqlDefine(paramList, FU_T_EFO_RYSBT_SRLT_FU_INSERT_001);
	}

	/**
	 * SQLKEY(FU_INSERT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 *
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	システムコード
	 *		 	画面ID
	 *		 	集計対象年月日
	 *		 	フィールド名
	 *		 	CMPフラグ
	 *		 	アクセス回数
	 *		 	アクセス人数
	 *		 	未入力数
	 *		 	エラー数
	 *		 	離脱数
	 *		 	未修正数
	 *		 	入力時間合計
	 *		 	必須エラー数
	 *		 	半角数字エラー数
	 *		 	正規表現エラー数
	 *		 	半角エラー数
	 *		 	比較エラー数
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeFU_T_EFO_KMKBT_SRLT_FU_INSERT_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());
		paramList.setValue(param[4].toString());
		paramList.setValue(param[5].toString());
		paramList.setValue(param[6].toString());
		paramList.setValue(param[7].toString());
		paramList.setValue(param[8].toString());
		paramList.setValue(param[9].toString());
		paramList.setValue(param[10].toString());
		paramList.setValue(param[11].toString());
		paramList.setValue(param[12].toString());
		paramList.setValue(param[13].toString());
		paramList.setValue(param[14].toString());
		paramList.setValue(param[15].toString());
		paramList.setValue(param[16].toString());

		// DBアクセスを実行します
		db_FU_T_EFO_KMKBT_SRLT.executeBySqlDefine(paramList, FU_T_EFO_KMKBT_SRLT_FU_INSERT_001);
	}

	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	// IT2-2012-0002009 Otsuka 2012/12/11 start
	/**
	 * Beanがnullまたは空文字かどうかを判定する。 <BR>
	 *
	 * @param value
	 * @return （true:null、false:null以外）
	 */
	private boolean isNullorEmpty(String value)
	{
		if ("".equals(value) || value == null)
		{
			return true;
		}

		return false;
	}
	// IT2-2012-0002009 Otsuka 2012/12/11 end
}
