/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：物流管理システム
*   ソースファイル名：DKW01105SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年10月31日
*＜機能概要＞
*   出荷完了データ読込画面を処理しするロジッククラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/10/31   FJ          新規作成
*   v6.00.00    2013/12/16   FJ          宅内エラーチェック用の情報設定を追加(OM-2013-0005003)
*
**********************************************************************/
package eo.web.webview.DKW01105SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;
import static eo.common.constant.JPCOnlineMessageConstant.EKB0830_TW;
import static eo.common.constant.JPCOnlineMessageConstant.EKB4590_KW;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.constant.JDKStrConst;
import eo.common.util.JDKCommonUtil;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.DKW01102SF.DKW01102SFConst;
import eo.web.webview.common.JCCScreenConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JDKScreenConst;
import eo.web.webview.common.JDKWebCommon;
import eo.web.webview.mapping.DKSV0013_DKSV0013OPDBMapper;
import static eo.web.webview.common.JDKWebCommon.*;

/**
 * 出荷完了データ読込画面を処理しするロジッククラスです。
 * @author 富士通
 */
public class DKW01105SFLogic extends JCCWebBusinessLogic
{
	/**
	 * シリアルバージョン
	 */
	private static final long serialVersionUID = 1L;
	
	/**
	 * エラー件数
	 */
	private int errCount = 0;

	/**
	 * ファイルキー
	 */
	private static final String SESSION_KEY_FILE = "fileKey";

	private static final int ORDER_DATE = 1;
	private static final int TYPE = 6;
	private static final int QUANTITY = 9;
	private static final int ORDER_NO = 3;
	private static final int SEIZO_NO = 7;

	/** 宅内チェック用のセッションキー */
	private static final String SESSION_KEY_TK_CHECK = "SESSION_KEY_TK_CHECK";
	
	/**
	 * 初期表示を処理します。
	 * @author 富士通
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean init() throws Exception
	{
		// 画面情報を取得し、サービスフォームBeanに設定
		JCCWebCommon.getScreenInfo(this);
		
		return true;
	}

	/**
	 * 読込ボタンを処理します。
	 * @author 富士通
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean upload() throws Exception
	{
		//セッション情報のクリア
		JCCWebCommon.removeScreenInfo(this, SESSION_KEY_TK_CHECK);
		
		// エラー件数を初期化
		errCount = 0;

		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess bean = super.getServiceFormBean();
		X31SDataBeanAccessArray finData = bean.getDataBeanArray(DKW01105SFConst.SYK_FIN_DATA);
		finData.clearArray();

		ArrayList<HashMap<String, Object>>  fileInfoList  = JCCWebCommon.getFileInfoArray(this);
		
		if (fileInfoList.size() == 0)
		{
			setMessage(EKB4590_KW, "ファイル");
			return false;
		}
		
		// 共通のチェック処理の呼び出し
		if (!JDKWebCommon.isCommonFileUploaded(fileInfoList, this))
		{
			return false;
		}
		
		String file = this.getFileAsString(fileInfoList);
		
		if (!this.isValidColumns(file))
		{
			return false;
		}
		
		if(!this.checkDataByService(bean, file)){
			return false;
		}
		
		this.saveFileToSession(file);
		
		this.setNextScreen(JCCScreenConst.SCREEN_ID_CCW00105, JCCScreenConst.SCREEN_NAME_CCW00105);
		return true;
	}
	
	
	/**
	 * 指定方法コードを返します。
	 * @return 指定方法コード
	 */
	private String getShiteiWayCd () 
	{
		return getData(this, DKW01105SFConst.SHITEI_WAY_CD);
	}

	/**
	 * ファイルの内容を文字列で取得します。
	 * @author 富士通
	 * @return ファイル内容
	 */
	@SuppressWarnings("unchecked")
	private String getFileAsString(ArrayList<HashMap<String, Object>>  fileInfoList)
	{
		HashMap fileInfoMap = fileInfoList.get(0);
		String renbanKey = fileInfoMap.get(SESSION_KEY_FILE).toString();
		
		byte[] fileByte = JCCWebCommon.getFile(this, renbanKey);
		
		return new String(fileByte);
	}

	/**
	 * ファイルの行毎に期待される項目内容をチェックします。
	 * @author 富士通
	 * @param file 精査するファイル
	 * @return true:エラーなし false:エラーあり
	 */
	private boolean isValidColumns(String file)
	{
		
		// ファイルから取得したデータを改行コードで分割する
		String[] lines = file.split(JDKStrConst.LINE_SEPARATOR);
		
		for (int i = 0; i < lines.length && errCount < 20; i++)
		{
			// データレコード
			if (i + 1 < lines.length)
			{
				errCount = this.isValidColumnData(lines[i], i, lines, errCount);
			}
			// 最終レコードはトレーラーレコードチェック
			else
			{
				errCount = this.isValidColumnTrailer(lines[i], i, lines, errCount);
			}
		}
		
		errCount = isValidLineAmount(lines, errCount);
		
		return errCount == 0;
	}

	/**
	 * ファイル内容のチェック(データ部チェック)
	 * @author 富士通
	 * @param line 精査する文字列
	 * @param index lineの行数
	 */
	private int isValidColumnData(String line, int index, String[] lines, int currentErrorCount)
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess bean = super.getServiceFormBean();
		X31SDataBeanAccessArray finData = bean.getDataBeanArray(DKW01105SFConst.SYK_FIN_DATA);
		X31SDataBeanAccess subbean = finData.addDataBean();

		
		int errCount = currentErrorCount;
		line = line.replaceAll("\"", "");
		String [] columns = JDKCommonUtil.splitAnycase(line, ',');
		
		// レコードの項目数
		// データのレコードの項目数が10以外の場合エラー
		if (columns.length != 10)
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1)	, "データ部項目数", "項目数10以外");
			subbean.sendMessageString(DKW01105SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_SET_VALUE, "9");
			return ++errCount;
		}

		// 出荷完了ファイルのデータ部をBeanに格納
		subbean.sendMessageString(DKW01105SFConst.RCD_SYBT_05, X31CWebConst.DATABEAN_SET_VALUE, columns[0]);
		subbean.sendMessageString(DKW01105SFConst.SLF_MV_SJ_D_05, X31CWebConst.DATABEAN_SET_VALUE, columns[1]);
		subbean.sendMessageString(DKW01105SFConst.SLF_LOT_NO_05, X31CWebConst.DATABEAN_SET_VALUE, columns[2]);
		subbean.sendMessageString(DKW01105SFConst.SLF_MV_NO_05, X31CWebConst.DATABEAN_SET_VALUE, columns[3]);
		subbean.sendMessageString(DKW01105SFConst.MV_MT_TTM_CD_05, X31CWebConst.DATABEAN_SET_VALUE, columns[4]);
		subbean.sendMessageString(DKW01105SFConst.MV_MT_SLF_CD_05, X31CWebConst.DATABEAN_SET_VALUE, columns[5]);
		subbean.sendMessageString(DKW01105SFConst.MDL_NO_05, X31CWebConst.DATABEAN_SET_VALUE, columns[6]);
		subbean.sendMessageString(DKW01105SFConst.SEIZO_NO_05, X31CWebConst.DATABEAN_SET_VALUE, columns[7]);
		subbean.sendMessageString(DKW01105SFConst.GDS_STAT_CD_05, X31CWebConst.DATABEAN_SET_VALUE, columns[8]);
		subbean.sendMessageString(DKW01105SFConst.CNT_05, X31CWebConst.DATABEAN_SET_VALUE, columns[9]);
		
		// レコード種別
		// "77"以外の場合エラー
		if ((errCount < 20) && !"77".equals(columns[0]))
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1)	, "レコード種別", "&quot;77&quot;以外");
			subbean.sendMessageString(DKW01105SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_SET_VALUE, "9");
			return ++errCount;
		}
		
		// 棚移動指示日のチェックを行う
		if ((errCount < 20) && !this.checkSjiYMD(columns, index, lines))
		{
			subbean.sendMessageString(DKW01105SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_SET_VALUE, "1");
			return ++errCount;
		}
		
		// 棚移動ロット番号のチェックを行う
		if ((errCount < 20) && !this.checkShelfLotNo(columns, index, lines))
		{
			subbean.sendMessageString(DKW01105SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_SET_VALUE, "1");
			return ++errCount;
		}
		
		// 移動元倉庫コードのチェックを行う
		if ((errCount < 20) && !this.checkmvMtSokoCd(columns, index, lines))
		{
			subbean.sendMessageString(DKW01105SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_SET_VALUE, "1");
			return ++errCount;
		}
		
		// 型番号のチェックを行う
		if ((errCount < 20) && !this.checkMdlNo(columns, index, lines))
		{
			subbean.sendMessageString(DKW01105SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_SET_VALUE, "1");
			return ++errCount;
		}
		
		// 数量のチェックを行う
		if ((errCount < 20) && !this.checkSuryo(columns, index))
		{
			subbean.sendMessageString(DKW01105SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_SET_VALUE, "1");
			return ++errCount;
		}
		
		// レコードの重複チェックを行う
		if ((errCount < 20) && !this.checkRepetition(columns, index, lines))
		{
			subbean.sendMessageString(DKW01105SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_SET_VALUE, "1");
			return ++errCount;
		}
		
		// レコードの存在チェックを行う
		if ((errCount < 20) && !this.checkExistence(columns, index, lines))
		{
			subbean.sendMessageString(DKW01105SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_SET_VALUE, "1");
			return ++errCount;
		}

		return errCount;
	}

	/**
	 * 棚移動指示日チェック処理を行います。
	 * @param columns データ項目
	 * @param index 処理行番号
	 * @param lines データレコード
	 * @return true:エラーなし false:エラーあり
	 */
	private boolean checkSjiYMD(String[] columns, int index, String[] lines)
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess bean = super.getServiceFormBean();
		
		// 設定されていない場合エラー
		if (JDKCommonUtil.isNull(columns[ORDER_DATE]))
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1), "棚移動指示日", "未設定");
			return false;
		}
		
		// 画面の登録内容の棚移動指示日と一致しない場合エラー
		X31SDataBeanAccessArray dbaaAddList = bean.getDataBeanArray(DKW01105SFConst.KIHON_LIST);
		X31SDataBeanAccess dbaAddList = dbaaAddList.getDataBean(0);
		if (!(columns[1].equals(
				dbaAddList.sendMessageString(DKW01105SFConst.SJI_YMD_01, X31CWebConst.DATABEAN_GET_VALUE))))
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1), "棚移動指示日", "登録内容と不一致");
			return false;
		}
		return true;
	}

	/**
	 * 棚移動ロット番号チェック処理を行います。
	 * @param columns データ項目
	 * @param index 処理行番号
	 * @param lines データレコード
	 * @return true:エラーなし false:エラーあり
	 */
	private boolean checkShelfLotNo(String[] columns, int index, String[] lines)
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess bean = super.getServiceFormBean();
		
		// 設定されていない場合エラー
		if (JDKCommonUtil.isNull(columns[2]))
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1), "棚移動ロット番号", "未設定");
			return false;
		}
		
		// 画面の登録内容の棚移動ロット番号と一致しない場合エラー
		X31SDataBeanAccessArray dbaaAddList = bean.getDataBeanArray(DKW01105SFConst.KIHON_LIST);
		X31SDataBeanAccess dbaAddList = dbaaAddList.getDataBean(0);
		if (!(columns[2].equals(
				dbaAddList.sendMessageString(DKW01105SFConst.SHELF_MOVE_LOT_NO_01, X31CWebConst.DATABEAN_GET_VALUE))))
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1), "棚移動ロット番号", "登録内容と不一致");
			return false;
		}
		return true;
	}

	/**
	 * 移動元倉庫コードチェック処理を行います。
	 * @param columns データ項目
	 * @param index 処理行番号
	 * @param lines データレコード
	 * @return true:エラーなし false:エラーあり
	 */
	private boolean checkmvMtSokoCd(String[] columns, int index, String[] lines)
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess bean = super.getServiceFormBean();
		
		// 設定されていない場合エラー
		if (JDKCommonUtil.isNull(columns[4]))
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1), "移動元倉庫コード", "未設定");
			return false;
		}
		
		// 画面の登録内容の移動元倉庫コードと一致しない場合エラー
		X31SDataBeanAccessArray dbaaAddList = bean.getDataBeanArray(DKW01105SFConst.KIHON_LIST);
		X31SDataBeanAccess dbaAddList = dbaaAddList.getDataBean(0);
		if (!(columns[4].equals(
				dbaAddList.sendMessageString(DKW01105SFConst.MV_MT_CD_01, X31CWebConst.DATABEAN_GET_VALUE))))
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1), "移動元倉庫コード", "登録内容と不一致");
			return false;
		}
		return true;
	}

	/**
	 * 型番号チェック処理を行います。
	 * @param columns データ項目
	 * @param index 処理行番号
	 * @param lines データレコード
	 * @return true:エラーなし false:エラーあり
	 */
	private boolean checkMdlNo(String[] columns, int index, String[] lines)
	{
		// 設定されていない場合エラー
		if (JDKCommonUtil.isNull(columns[TYPE]))
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1), "型番号", "未設定");
			return false;
		}

		return true;
	}

	/**
	 * 数量チェック処理を行います。
	 * @param columns データ項目
	 * @param index 処理行番号
	 * @return true:エラーなし false:エラーあり
	 */
	private boolean checkSuryo(String[] columns, int index)
	{
		// 12桁以内の数値でない場合エラー
		if (columns[QUANTITY].length() > 12)
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1), "数量", "12桁以内の数値");
			return false;
		}
		// 数値であるかチェック
		try{
			Long.parseLong(columns[QUANTITY]);
		}catch(Exception e){
			this.setMessage(EKB0830_TW, Integer.toString(index + 1), "数量", "12桁以内の数値");
			return false;
		}

		return true;
	}

	/**
	 * レコードの重複チェック処理を行います。
	 * @param columns データ項目
	 * @param index 処理行番号
	 * @param lines データレコード
	 * @return true:エラーなし false:エラーあり
	 */
	private boolean checkRepetition(String[] columns, int index, String[] lines)
	{
		// 同一のファイル内で重複する棚移動番号・型番号・製造番号がある場合エラー
		for (int i = 0; i < lines.length - 1; i++)
		{
			String lineTemp = lines[i].replaceAll("\"", "");
			String [] columnsTemp = JDKCommonUtil.splitAnycase(lineTemp, ',');

			// 自行以外と比較
			if (i != index && columnsTemp.length > ORDER_NO && columns[ORDER_NO].equals(columnsTemp[ORDER_NO]) && columns[TYPE].equals(columnsTemp[TYPE])
					&& columns[SEIZO_NO].equals(columnsTemp[SEIZO_NO]))
			{
				this.setMessage(EKB0830_TW, Integer.toString(index + 1)	, "レコード", "重複レコード有り");
				return false;
			}
		}
		return true;
	}

	/**
	 * レコードの存在チェック処理を行います。
	 * @param columns データ項目
	 * @param index 処理行番号
	 * @param lines データレコード
	 * @return true:エラーなし false:エラーあり
	 */
	private boolean checkExistence(String[] columns, int index, String[] lines)
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess bean = super.getServiceFormBean();
		
		X31SDataBeanAccessArray dbaaAddList = bean.getDataBeanArray(DKW01105SFConst.SHOSAI_LIST);
		for (int i = 0; i < dbaaAddList.getCount(); i++)
		{
			X31SDataBeanAccess dbaAddList = dbaaAddList.getDataBean(i);

			// 数量指定の場合
			String shiteiWayCd = getShiteiWayCd();
			if ("1".equals(shiteiWayCd))
			{
				if (columns[TYPE].equals(
						dbaAddList.sendMessageString(DKW01105SFConst.L_MDL_NO_02, X31CWebConst.DATABEAN_GET_VALUE)))
				{
					return true;
				}
			}
			// 製番指定の場合
			else if ("2".equals(shiteiWayCd))
			{
				if (columns[TYPE].equals(getData(dbaAddList, DKW01105SFConst.L_MDL_NO_02))
				&& columns[SEIZO_NO].equals(getData(dbaAddList, DKW01105SFConst.L_SEIZO_NO_02)))
				{
					return true;
				}
			}
		}
		// 画面の登録内容に該当のデータが存在しない場合エラー
		this.setMessage(EKB0830_TW, Integer.toString(index + 1), "レコード", "画面の登録内容に存在しない");
		return false;
	}

	/**
	 * ファイル内容のチェック(トレーラ部チェック)
	 * @author 富士通
	 * @param line 精査する文字列
	 * @param index lineの行数
	 * @return true:エラーなし false:エラーあり
	 */
	private int isValidColumnTrailer(String line, int index, String[] lines, int currentErrorCount)
	{
		int errCount = currentErrorCount;
		line = line.replaceAll("\"", "");
		String [] columns = JDKCommonUtil.splitAnycase(line, ',');
		
		// レコードの項目数
		// トレーラーのレコードの項目数が2以外の場合エラー
		if (columns.length != 2)
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1), "トレーラー部項目数", "項目数2以外");
			errCount ++;
			return errCount;
		}
		
		// レコード種別
		// "78"以外の場合エラー
		if ((errCount < 20) && !"78".equals(columns[0]))
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1), "レコード種別", "&quot;78&quot;以外");
			errCount ++;
		}

		return errCount;
	}
	

	/**
	 * トレーラーレコードの件数を検証します。
	 * @param lines 全行
	 * @param errCount エラー数
	 * @return エラー数
	 */
	private int isValidLineAmount(String[] lines, int errCount)
	{
		if (errCount >= 20)
		{
			return errCount;
		}

		String [] columns = JDKCommonUtil.splitAnycase(lines[lines.length-1].replace("\"", ""), ',');
		if (columns.length != 2)
		{
			return errCount;
		}
		
		if (lines.length != Integer.parseInt(columns[1]))
		{
			this.setMessage(EKB0830_TW, Integer.toString(lines.length), "レコード件数", "レコード件数不整合");
			errCount++;
		}
		
		return errCount;
	}

	/**
	 * ファイル情報をセッションに保存します。
	 * @author 富士通
	 * @param file ファイル内容
	 * @throws Exception 例外発生時
	 */
	@SuppressWarnings("unchecked")
	private void saveFileToSession(String file) throws Exception
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess bean = super.getServiceFormBean();
		// 出荷完了データ情報を取得
		X31SDataBeanAccessArray finData = bean.getDataBeanArray(DKW01105SFConst.SYK_FIN_DATA);
		// 出荷完了データファイル情報を設定
		ArrayList<HashMap> shkFinDataList = new ArrayList<HashMap>();

		// 出荷完了ファイル情報を設定
		for(int i=0;i<finData.getCount();i++)
		{
			X31SDataBeanAccess subbean = finData.getDataBean(i);
			HashMap<String, String> shkFin = new HashMap<String, String>();
			shkFin.put(DKW01102SFConst.MV_SJI_YMD_06, subbean.sendMessageString(DKW01105SFConst.SLF_MV_SJ_D_05, X31CWebConst.DATABEAN_GET_VALUE));
			shkFin.put(DKW01102SFConst.SLF_MV_LOT_NO_06, subbean.sendMessageString(DKW01105SFConst.SLF_LOT_NO_05, X31CWebConst.DATABEAN_GET_VALUE));
			shkFin.put(DKW01102SFConst.SLF_MV_NO_06, subbean.sendMessageString(DKW01105SFConst.SLF_MV_NO_05, X31CWebConst.DATABEAN_GET_VALUE));
			shkFin.put(DKW01102SFConst.MV_MT_TTM_CD_06, subbean.sendMessageString(DKW01105SFConst.MV_MT_TTM_CD_05, X31CWebConst.DATABEAN_GET_VALUE));
			shkFin.put(DKW01102SFConst.MV_MT_SLF_CD_06, subbean.sendMessageString(DKW01105SFConst.MV_MT_SLF_CD_05, X31CWebConst.DATABEAN_GET_VALUE));
			shkFin.put(DKW01102SFConst.MDL_NO_06, subbean.sendMessageString(DKW01105SFConst.MDL_NO_05, X31CWebConst.DATABEAN_GET_VALUE));
			shkFin.put(DKW01102SFConst.SEIZO_NO_06, subbean.sendMessageString(DKW01105SFConst.SEIZO_NO_05, X31CWebConst.DATABEAN_GET_VALUE));
			shkFin.put(DKW01102SFConst.GDS_STAT_CD_06, subbean.sendMessageString(DKW01105SFConst.GDS_STAT_CD_05, X31CWebConst.DATABEAN_GET_VALUE));
			shkFin.put(DKW01102SFConst.CNT_06, subbean.sendMessageString(DKW01105SFConst.CNT_05, X31CWebConst.DATABEAN_GET_VALUE));
			shkFin.put(DKW01102SFConst.SETHIN_KBN_06, subbean.sendMessageString(DKW01105SFConst.SETHIN_KBN_05, X31CWebConst.DATABEAN_GET_VALUE));
			shkFin.put(DKW01102SFConst.SEIZO_NO_UM_06, subbean.sendMessageString(DKW01105SFConst.SEIZO_NO_UM_05, X31CWebConst.DATABEAN_GET_VALUE));
			shkFin.put(DKW01102SFConst.KIHON_UPD_DTTM_06, subbean.sendMessageString(DKW01105SFConst.KIHON_UPD_DTTM_05, X31CWebConst.DATABEAN_GET_VALUE));
			
			shkFinDataList.add(shkFin);
		}

		// 棚移動出荷詳細画面に引き渡す情報を設定
		HashMap paramMap = new HashMap();
		paramMap.put(DKW01102SFConst.EFILE, file);
		paramMap.put(DKW01102SFConst.SHK_FIN_DATA_FILE, shkFinDataList);
		JCCWebCommon.setScreenInfo(this, JDKScreenConst.SCREEN_ID_DKW01102 + "0PJP", paramMap);
	}

	/**
	 * メッセージを設定します。
	 * @author 富士通
	 * @param messageId メッセージＩＤ
	 * @param replacements 置換文字列
	 */
	private void setMessage(String messageId, String...replacements)
	{
		JCCWebCommon.setMessageInfo(this, messageId, replacements);
	}

	/**
	 * 画面遷移先を設定します。
	 * @author 富士通
	 * @param nextScreenId 遷移先画面ＩＤ
	 * @param nextScreenName 遷移先画面名
	 */
	private void setNextScreen(String nextScreenId, String nextScreenName)
	{
		X31SDataBeanAccess  commoninfoBean = super.getCommonInfoBean();
		
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, nextScreenId);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, nextScreenName);
		
		DEBUG_LOG.debug(String.format("遷移先 CD：%s NM：%s", nextScreenId, nextScreenName));
	}
	
	/**
	 * 画面遷移先を設定します。
	 * @author 富士通
	 * @param nextScreenId 遷移先画面ＩＤ
	 * @param nextScreenName 遷移先画面名
	 */
	@SuppressWarnings("unchecked")
	private boolean checkDataByService(X31SDataBeanAccess bean, String file)
	{
		boolean ret = true;
		
		// 出荷完了データ情報を取得
		X31SDataBeanAccessArray finData = bean.getDataBeanArray(DKW01105SFConst.SYK_FIN_DATA);

		// 機器が棚移動指示可能かの判定用の情報を設定
		X31SDataBeanAccessArray mvKiki = bean.getDataBeanArray(DKW01105SFConst.MV_KIKI);
		X31SDataBeanAccessArray keyMvKiki = bean.getDataBeanArray(DKW01105SFConst.KIKI_SRCH_KEY);
		mvKiki.clearArray();
		keyMvKiki.clearArray();
		for(int i=0;i<finData.getCount();i++)
		{
			X31SDataBeanAccess subbean = finData.getDataBean(i);
			X31SDataBeanAccess mvkkbean = keyMvKiki.addDataBean();
			String mdl_no = subbean.sendMessageString(DKW01105SFConst.MDL_NO_05, X31CWebConst.DATABEAN_GET_VALUE);
			String seizo_no = subbean.sendMessageString(DKW01105SFConst.SEIZO_NO_05, X31CWebConst.DATABEAN_GET_VALUE);
			mvkkbean.sendMessageString(DKW01105SFConst.KEY_TAKNKIKI_MODEL_CD_06, X31CWebConst.DATABEAN_SET_VALUE, mdl_no);
			mvkkbean.sendMessageString(DKW01105SFConst.KEY_KK_SEIZO_NO_06, X31CWebConst.DATABEAN_SET_VALUE, seizo_no);
		}

		// 型式コードを集約
		HashMap<String, String> modelNoMap = new HashMap<String, String>();
		for(int i=0;i<finData.getCount();i++)
		{
			X31SDataBeanAccess subbean = finData.getDataBean(i);
			String err_kbn = subbean.sendMessageString(DKW01105SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_GET_VALUE);
			String mdl_no = subbean.sendMessageString(DKW01105SFConst.MDL_NO_05, X31CWebConst.DATABEAN_GET_VALUE);
			if(JDKCommonUtil.isNull(err_kbn) && !JDKCommonUtil.isNull(mdl_no))
			{
				String cnt = subbean.sendMessageString(DKW01105SFConst.CNT_05, X31CWebConst.DATABEAN_GET_VALUE);
				String ttlCnt = modelNoMap.get(mdl_no);
				if(ttlCnt == null)
				{
					modelNoMap.put(mdl_no, cnt);
				}
				else
				{
					long total = Long.parseLong(ttlCnt) + Long.parseLong(cnt);
					modelNoMap.put(mdl_no, Long.toString(total));
				}
			}
		}
		
		// 型式情報の取得用の情報を設定
		X31SDataBeanAccessArray mvMdl = bean.getDataBeanArray(DKW01105SFConst.MV_MDL);
		X31SDataBeanAccessArray keyMvMdl = bean.getDataBeanArray(DKW01105SFConst.MDL_SRCH_KEY);
		mvMdl.clearArray();
		keyMvMdl.clearArray();
		for(Iterator ite = modelNoMap.keySet().iterator(); ite.hasNext();)
		{
			Object key = ite.next();
			String mdl_no = key.toString();
			X31SDataBeanAccess mvmdlbean = keyMvMdl.addDataBean();
			mvmdlbean.sendMessageString(DKW01105SFConst.KEY_TAKNKIKI_MODEL_CD_06, X31CWebConst.DATABEAN_SET_VALUE, mdl_no);
		}
		
		
		// ************************************************************************
		//  サービスの呼び出し
		// ************************************************************************

		// パラメータ作成
		X31SDataBeanAccess[] paramBean = {bean};

		// ◇ 業務ロジックの記述
		// ユースケースID格納用マップを生成。
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		HashMap<String, Object> inputMap = new HashMap<String, Object>();
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// ユースケースＩＤを設定
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "DKSV0013");

		// DataBean⇔BPの上りマッピングを行う
		DKSV0013_DKSV0013OPDBMapper mapper = new DKSV0013_DKSV0013OPDBMapper();
		mapper.setDKSV001301SC(paramBean, inputMap, "1");
		mapper.setDKSV001302SC(paramBean, inputMap, "1");

		// 検索結果格納用マップを生成。
		// サービス呼出
		X31CMessageResult msgResult = invokeService(paramMap, inputMap, outputMap);
		
		// エラー処理
		if (msgResult != null)
		{
			JCCWebCommon.setMessageInfo(this, msgResult);
			return false;
		}
		
		// DataBean⇔BPの下りマッピングを行う
		mapper.getDKSV001301SC(paramBean, outputMap);
		mapper.getDKSV001302SC(paramBean, outputMap);
		
		// 宅内機器情報
		mvKiki = bean.getDataBeanArray(DKW01105SFConst.MV_KIKI);
		// 型式情報
		mvMdl = bean.getDataBeanArray(DKW01105SFConst.MV_MDL);
		
		// 出荷完了ファイルデータ関連チェック
		for(int i=0;i<finData.getCount();i++)
		{
			// 出荷完了データの取得
			X31SDataBeanAccess finbean = finData.getDataBean(i);
			String err_kbn = finbean.sendMessageString(DKW01105SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_GET_VALUE);
			String seizo_no_um = "";
			if(JDKCommonUtil.isNull(err_kbn))
				{
				String mdl_no_fin = finbean.sendMessageString(DKW01105SFConst.MDL_NO_05, X31CWebConst.DATABEAN_GET_VALUE);
				String seizo_no_fin = finbean.sendMessageString(DKW01105SFConst.SEIZO_NO_05, X31CWebConst.DATABEAN_GET_VALUE);
				
				// 型番号存在チェック
				boolean existMdl = false;
				for(int j=0;j<mvMdl.getCount();j++)
				{
					X31SDataBeanAccess mdlbean = mvMdl.getDataBean(j);
					String mdl_no_m = mdlbean.sendMessageString(DKW01105SFConst.TAKNKIKI_MODEL_CD_04, X31CWebConst.DATABEAN_GET_VALUE);
					if(mdl_no_fin.equals(mdl_no_m))
					{
						seizo_no_um = mdlbean.sendMessageString(DKW01105SFConst.SEIZO_NO_UM_04, X31CWebConst.DATABEAN_GET_VALUE);
						finbean.sendMessageString(DKW01105SFConst.SEIZO_NO_UM_05, X31CWebConst.DATABEAN_SET_VALUE, seizo_no_um);
						existMdl = true;
						break;
					}
				}
				// 型式マスタに存在しない場合、エラー
				if(!existMdl)
				{
					this.setMessage(EKB0830_TW, Integer.toString(i + 1)
							, "型番号", "存在しない型番号");
					++errCount;
					if(errCount >= 20){
						return false;
					}
					ret = false;
				}
				else
				{
					// 製造番号あり
					if(!JDKCommonUtil.isNull(seizo_no_um) && seizo_no_um.equals("1"))
					{
						String sji_cnt = finbean.sendMessageString(DKW01105SFConst.CNT_05, X31CWebConst.DATABEAN_GET_VALUE);
						if(JDKCommonUtil.isNull(sji_cnt) && !sji_cnt.equals("1"))
						{
							this.setMessage(EKB0830_TW, Integer.toString(i + 1), "数量", "製番指定の場合、\"1\"以外エラー");
							++errCount;
							if(errCount >= 20){
								return false;
							}
							ret = false;
						}
						if(JDKCommonUtil.isNull(seizo_no_fin))
						{
							this.setMessage(EKB0830_TW, Integer.toString(i + 1), "製造番号", "未設定");
							++errCount;
							if(errCount >= 20){
								return false;
							}
							ret = false;
						}
						else
						{
							// 棚移動出荷可能チェック
							boolean existKiki = false;
							for(int j=0;j<mvKiki.getCount();j++)
							{
								X31SDataBeanAccess kkbean = mvKiki.getDataBean(j);
								String mdl_no_k = kkbean.sendMessageString(DKW01105SFConst.TAKNKIKI_MODEL_CD_03, X31CWebConst.DATABEAN_GET_VALUE);
								String seizo_no_k = kkbean.sendMessageString(DKW01105SFConst.KK_SEIZO_NO_03, X31CWebConst.DATABEAN_GET_VALUE);
								String khn_upd_dttm_k = kkbean.sendMessageString(DKW01105SFConst.KIHON_UPD_DTTM_03, X31CWebConst.DATABEAN_GET_VALUE);
								if(mdl_no_fin.equals(mdl_no_k) && seizo_no_fin.equals(seizo_no_k))
								{
									finbean.sendMessageString(DKW01105SFConst.KIHON_UPD_DTTM_05, X31CWebConst.DATABEAN_SET_VALUE, khn_upd_dttm_k);
									existKiki = true;
									break;
								}
							}
							if(!existKiki)
							{
								this.setMessage(EKB0830_TW, Integer.toString(i + 1)
										, "製造番号", "存在しない型番号と製造番号の組み合わせ");
								++errCount;
								if(errCount >= 20){
									return false;
								}
								ret = false;
							}
						}

					}
					// 製造番号なし
					else
					{
						// 製造番号が設定されている場合、エラー
						if(!JDKCommonUtil.isNull(seizo_no_fin))
						{
							this.setMessage(EKB0830_TW, Integer.toString(i + 1), "製造番号", "設定不要");
							++errCount;
							if(errCount >= 20){
								return false;
							}
							ret = false;
						}
					}
				}
			}
		}
		
		if (ret)
		{
			// エラーがなかった場合は、エラーチェックの為、製造番号有無が"1"(製番あり)の宅内機器型式コードを集める
			HashMap sessionMap = new HashMap();
			List<String> modelList = new ArrayList<String>();
			
			for(int j=0;j<mvMdl.getCount();j++)
			{
				X31SDataBeanAccess mdlbean = mvMdl.getDataBean(j);
				
				String seizo_no_um = mdlbean.sendMessageString(DKW01105SFConst.SEIZO_NO_UM_04, X31CWebConst.DATABEAN_GET_VALUE);
				
				if("1".equals(seizo_no_um))
				{
					// 宅内機器型式コード
					modelList.add(mdlbean.sendMessageString(DKW01105SFConst.TAKNKIKI_MODEL_CD_04, X31CWebConst.DATABEAN_GET_VALUE));
				}
			}
			sessionMap.put("宅内機器型式コードリスト", modelList);
			JCCWebCommon.setScreenInfo(this, SESSION_KEY_TK_CHECK, sessionMap);
		}
		
		return ret;

	}
	
}
