/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：物流管理システム
*   ソースファイル名：DKW00508SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年10月11日
*＜機能概要＞
*   指示データ読込画面を処理しするロジッククラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/10/11   FJ          新規作成
*
**********************************************************************/
package eo.web.webview.DKW00508SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

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

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 static eo.common.constant.JPCOnlineMessageConstant.*;
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.DKW00501SF.DKW00501SFConst;
import eo.web.webview.DKW01105SF.DKW01105SFConst;
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.DKSV0001_DKSV0001OPDBMapper;

/**
 * 指示データ読込画面を処理しするロジッククラスです。
 * @author 富士通
 */
public class DKW00508SFLogic extends JCCWebBusinessLogic
{

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

	/**
	 * シリアルバージョン
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * 指定方法コード
	 */
	private String shiteiWayCd = "";

	/**
	 * エラー件数
	 */
	private int errCount = 0;
	
	/**
	 * 初期表示を処理します。
	 * @author 富士通
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean init() throws Exception
	{

		// 画面情報を取得し、サービスフォームBeanに設定
		JCCWebCommon.getScreenInfo(this);

		return true;
	}

	/**
	 * 読込ボタンを処理します。
	 * @author 富士通
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean upload() throws Exception
	{
		ArrayList<HashMap<String, Object>>  fileInfoList  = JCCWebCommon.getFileInfoArray(this);

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

		if (fileInfoList.size() == 0)
		{
			setMessage(EKB4590_KW, "ファイル");
			return false;
		}
		
		// 共通のチェック処理の呼び出し
		if (!JDKWebCommon.isCommonFileUploaded(fileInfoList, this))
		{
			return false;
		}

		String file = this.getFileAsString(fileInfoList);

		// 指定方法コード取得
		shiteiWayCd = bean.sendMessageString(DKW00508SFConst.SHITEI_WAY_CD, X31CWebConst.DATABEAN_GET_VALUE);
		
		if (!this.isValidColumns(file))
		{
			return false;
		}
		
		if(!this.checkDataByService(bean, file)){
			return false;
		}

		this.setNextScreen(JCCScreenConst.SCREEN_ID_CCW00105, JCCScreenConst.SCREEN_NAME_CCW00105);
		return true;
	}

	/**
	 * ファイルの内容を文字列で取得します。
	 * @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)
	{

		errCount = 0;

		// ファイルから取得したデータを改行コードで分割する
		String[] lines = file.split(JDKStrConst.LINE_SEPARATOR);

		// 上記で分割したレコード件数分以下の処理を繰り返し行う
		for (int i = 0; i < lines.length; i++)
		{

			// 処理回数(0始まり)＋１がレコード件数と一致しない場合
			if (i + 1 != lines.length)
			{

				// データ部のチェック処理を行う
				isValidColumnData(lines[i], i, lines);

				// エラー件数が２０件以上になった場合、チェック処理を終了する
				if (errCount >= 20)
				{
					return false;
				}
			}

			// 処理回数(0始まり)＋１がレコード件数と一致する場合
			else
			{

				// トレーラ部のチェック処理を行う
				this.isValidColumnTrailer(lines[i], i, lines);

				// エラー件数が２０件以上になった場合、チェック処理を終了する
				if (errCount >= 20)
				{
					return false;
				}
			}
		}

		// エラー件数が１件以上あった場合、チェック処理エラーで終了する
		if (errCount > 0)
		{
			return false;
		}

		// チェック処理を正常で終了する
		return true;
	}

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

		line = line.replaceAll("\"", "");
		String [] columns = JDKCommonUtil.splitAnycase(line, ',');

		// レコードの項目数
		// データのレコードの項目数が4以外の場合エラー
		if (columns.length != 4)
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1)
					, "データ部項目数", "項目数4以外");
			errCount += 1;
			subbean.sendMessageString(DKW00508SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_SET_VALUE, "9");
			return;
		}
		subbean.sendMessageString(DKW00508SFConst.RCD_SYBT_05, X31CWebConst.DATABEAN_SET_VALUE, columns[0]);
		subbean.sendMessageString(DKW00508SFConst.MDL_NO_05, X31CWebConst.DATABEAN_SET_VALUE, columns[1]);
		subbean.sendMessageString(DKW00508SFConst.SEIZO_NO_05, X31CWebConst.DATABEAN_SET_VALUE, columns[2]);
		subbean.sendMessageString(DKW00508SFConst.CNT_05, X31CWebConst.DATABEAN_SET_VALUE, columns[3]);
		
		DEBUG_LOG.debug("index:" + index + " RCD_SYBT:" + columns[0] + " MDL_NO:" + columns[1] + " SEIZO_NO:" + columns[2] + " CNT:" + columns[3]);

		// レコード種別
		// "72"以外の場合エラー
		if (!"72".equals(columns[0]))
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1)
					, "レコード種別", "&quot;72&quot;以外");
			errCount += 1;
			subbean.sendMessageString(DKW00508SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_SET_VALUE, "9");
			return;
		}

		// 型番号のチェックを行う
		if (!this.checkMdlNo(columns, index, lines))
		{

			// 型番号で１件でもエラーが存在する場合、エラー件数をカウントアップする
			errCount += 1;
			subbean.sendMessageString(DKW00508SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_SET_VALUE, "1");
			return;
		}

		// 製造番号のチェックを行う
		if (!this.checkSeizoNo(columns, index, lines))
		{

			// 製造番号で１件でもエラーが存在する場合、エラー件数をカウントアップする
			errCount += 1;
			subbean.sendMessageString(DKW00508SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_SET_VALUE, "1");
			return;
		}

		// 数量のチェックを行う
		if (!this.checkSuryo(columns, index))
		{

			// 数量で１件でもエラーが存在する場合、エラー件数をカウントアップする
			errCount += 1;
			subbean.sendMessageString(DKW00508SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_SET_VALUE, "1");
			return;
		}
	}

	/**
	 * 型番号チェック処理を行います。
	 * @param columns データ項目
	 * @param index 処理行番号
	 * @param lines データレコード
	 * @return true:エラーなし false:エラーあり
	 */
	private boolean checkMdlNo(String[] columns, int index, String[] lines)
	{

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

		// 設定されていない場合エラー
		if (JDKCommonUtil.isNull(columns[1]))
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1)
					, "型番号", "未設定");
			return false;
		}

		// 指定方法が数量指定の場合
		if ("1".equals(shiteiWayCd))
		{
			// 同一ファイル内で重複する型番号がある場合エラー
			for (int i = 0; i < lines.length; i++)
			{
				String lineTemp = lines[i].replaceAll("\"", "");
				String [] columnsTemp = JDKCommonUtil.splitAnycase(lineTemp, ',');

				// 自行以外と比較
				if (i != index && columnsTemp.length > 1 && columns[1].equals(columnsTemp[1]))
				{
					this.setMessage(EKB0830_TW, Integer.toString(index + 1)
							, "型番号", "ファイル内の型番号重複");
					return false;
				}
			}

			// 画面から入力された明細と重複する型番号がある場合エラー
			X31SDataBeanAccessArray dbaaAddList = bean.getDataBeanArray(DKW00508SFConst.ADD_LIST);
			for (int i = 0; i < dbaaAddList.getCount(); i++)
			{
				X31SDataBeanAccess dbaAddList = dbaaAddList.getDataBean(i);
				if (columns[1].equals(
						dbaAddList.sendMessageString(DKW00508SFConst.L_MDL_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 checkSeizoNo(String[] columns, int index, String[] lines)
	{

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

		// 指定方法が数量指定の場合
		if ("1".equals(shiteiWayCd))
		{

			// 設定されている場合エラー
			if (!JDKCommonUtil.isNull(columns[2]))
			{
				this.setMessage(EKB0830_TW, Integer.toString(index + 1)
						, "製造番号", "設定不要");
				return false;
			}

			// 画面から入力された明細と重複する型番号・製造番号がある場合エラー
			X31SDataBeanAccessArray dbaaAddList = bean.getDataBeanArray(DKW00508SFConst.ADD_LIST);
			for (int i = 0; i < dbaaAddList.getCount(); i++)
			{
				X31SDataBeanAccess dbaAddList = dbaaAddList.getDataBean(i);
				if (columns[1].equals(
						dbaAddList.sendMessageString(DKW00508SFConst.L_MDL_NO_01, X31CWebConst.DATABEAN_GET_VALUE))
					&& JDKCommonUtil.isNull(
						dbaAddList.sendMessageString(DKW00508SFConst.L_SEIZO_NO_01, X31CWebConst.DATABEAN_GET_VALUE)))
				{
					this.setMessage(EKB0830_TW, Integer.toString(index + 1)
							, "製造番号", "画面の明細と型番号・製造番号重複");
					return false;
				}
			}
		}

		// 指定方法が製番指定の場合
		if ("2".equals(shiteiWayCd))
		{

			// 設定されていない場合エラー
			if (JDKCommonUtil.isNull(columns[2]))
			{
				this.setMessage(EKB0830_TW, Integer.toString(index + 1)
						, "製造番号", "未設定");
				return false;
			}

			if (!JDKCommonUtil.isNull(columns[1]))
			{

				// 同一のファイル内で重複する型番号・製造番号がある場合エラー
				for (int i = 0; i < lines.length; i++)
				{
					String lineTemp = lines[i].replaceAll("\"", "");
					String [] columnsTemp = JDKCommonUtil.splitAnycase(lineTemp, ',');
	
					// 自行以外と比較
					if (i != index && columns[1].equals(columnsTemp[1]) && columns[2].equals(columnsTemp[2]))
					{
						this.setMessage(EKB0830_TW, Integer.toString(index + 1)
								, "製造番号", "ファイル内重複");
						return false;
					}
				}

				// 画面から入力された明細と重複する型番号・製造番号がある場合エラー
				X31SDataBeanAccessArray dbaaAddList = bean.getDataBeanArray(DKW00508SFConst.ADD_LIST);
				for (int i = 0; i < dbaaAddList.getCount(); i++)
				{
					X31SDataBeanAccess dbaAddList = dbaaAddList.getDataBean(i);
					if (columns[1].equals(
							dbaAddList.sendMessageString(DKW00508SFConst.L_MDL_NO_01, X31CWebConst.DATABEAN_GET_VALUE))
						&& columns[2].equals(
							dbaAddList.sendMessageString(DKW00508SFConst.L_SEIZO_NO_01, X31CWebConst.DATABEAN_GET_VALUE)))
					{
						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[3].length() > 12)
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1)
					, "数量", "12桁以内の数値");
			return false;
		}
		// 数値であるかチェック
		try{
			Long.parseLong(columns[3]);
		}catch(Exception e){
			this.setMessage(EKB0830_TW, Integer.toString(index + 1)
					, "数量", "12桁以内の数値");
			return false;
		}
		// 指定方法が製番指定の場合
		if ("2".equals(shiteiWayCd))
		{
			// 1以外の場合エラー
			if (!"1".equals(columns[3]))
			{
				this.setMessage(EKB0830_TW, Integer.toString(index + 1)
						, "数量", "製番指定の場合、&quot;1&quot;以外エラー");
				return false;
			}
		}

		return true;
	}

	/**
	 * ファイル内容のチェック(トレーラ部チェック)
	 * @author 富士通
	 * @param line 精査する文字列
	 * @param index lineの行数
	 * @return true:エラーなし false:エラーあり
	 */
	private void isValidColumnTrailer(String line, int index, String[] lines)
	{

		line = line.replaceAll("\"", "");
		String [] columns = JDKCommonUtil.splitAnycase(line, ',');

		// レコードの項目数
		// トレーラーのレコードの項目数が2以外の場合エラー
		if (columns.length != 2)
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1)
					, "トレーラー部項目数", "項目数2以外");

			errCount += 1;
			return;
		}

		// レコード種別
		// "73"以外の場合エラー
		if (!"73".equals(columns[0]))
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1)
					, "レコード種別", "&quot;73&quot;以外");

			errCount += 1;
			return;
		}

		// レコード件数
		// データのレコード件数+1でない場合エラー
		if (!JDKCommonUtil.isNull(columns[1]) && Integer.parseInt(columns[1]) != lines.length)
		{
			this.setMessage(EKB0830_TW, Integer.toString(index + 1)
					, "レコード件数", "レコード件数不整合");

			errCount += 1;
			return;
		}
	}

	/**
	 * メッセージを設定します。
	 * @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 sjData = bean.getDataBeanArray(DKW00508SFConst.SJ_DATA);

		// 在庫チェック用の情報を設定
		X31SDataBeanAccessArray mdlZaiko = bean.getDataBeanArray(DKW00508SFConst.MDL_ZAIKO);
		mdlZaiko.clearArray();
		HashMap<String, String> modelNoMap = new HashMap<String, String>();
		for(int i=0;i<sjData.getCount();i++)
		{
			X31SDataBeanAccess subbean = sjData.getDataBean(i);
			String err_kbn = subbean.sendMessageString(DKW00508SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_GET_VALUE);
			if(JDKCommonUtil.isNull(err_kbn))
			{
				String mdl_no = subbean.sendMessageString(DKW00508SFConst.MDL_NO_05, X31CWebConst.DATABEAN_GET_VALUE);
				String cnt = subbean.sendMessageString(DKW00508SFConst.CNT_05, X31CWebConst.DATABEAN_GET_VALUE);
				String ttlCnt = modelNoMap.get(mdl_no);
				if(ttlCnt == null)
				{
					modelNoMap.put(mdl_no, cnt);
				}
				else
				{
					int total = Integer.parseInt(ttlCnt) + Integer.parseInt(cnt);
					modelNoMap.put(mdl_no, Integer.toString(total));
				}
			}
		}

		// 宅内在庫確認のための情報を設定
		for(Iterator ite = modelNoMap.keySet().iterator(); ite.hasNext();){
			Object key = ite.next();
			String mdl_no = key.toString();

			X31SDataBeanAccess zikbean = mdlZaiko.addDataBean();
			String plcSkbtCd = bean.sendMessageString(DKW00508SFConst.KNRI_PLC_SKBT_CD, X31CWebConst.DATABEAN_GET_VALUE);
			String plcCd = bean.sendMessageString(DKW00508SFConst.KNRI_PLC_CD, X31CWebConst.DATABEAN_GET_VALUE);
			String plcSlfCd = bean.sendMessageString(DKW00508SFConst.KNRI_PLC_SLF_CD, X31CWebConst.DATABEAN_GET_VALUE);
			String gdsStatCd = bean.sendMessageString(DKW00508SFConst.GDS_STAT_CD, X31CWebConst.DATABEAN_GET_VALUE);
			if(JDKCommonUtil.isNull(gdsStatCd))
			{
				gdsStatCd = "-";
			}
			zikbean.sendMessageString(DKW00508SFConst.KNRI_PLC_SKBT_CD_02, X31CWebConst.DATABEAN_SET_VALUE, plcSkbtCd);
			zikbean.sendMessageString(DKW00508SFConst.KNRI_PLC_CD_02, X31CWebConst.DATABEAN_SET_VALUE, plcCd);
			zikbean.sendMessageString(DKW00508SFConst.KNRI_PLC_SLF_CD_02, X31CWebConst.DATABEAN_SET_VALUE, plcSlfCd);
			zikbean.sendMessageString(DKW00508SFConst.TK_MDL_CD_02, X31CWebConst.DATABEAN_SET_VALUE, mdl_no);
			zikbean.sendMessageString(DKW00508SFConst.GDS_STAT_CD_02, X31CWebConst.DATABEAN_SET_VALUE, gdsStatCd);
		}
		
		// 機器が棚移動指示可能かの判定用の情報を設定
		X31SDataBeanAccessArray mvKiki = bean.getDataBeanArray(DKW00508SFConst.MV_KIKI);
		X31SDataBeanAccessArray keyMvKiki = bean.getDataBeanArray(DKW00508SFConst.KIKI_SRCH_KEY);
		mvKiki.clearArray();
		keyMvKiki.clearArray();
		
		for(int i=0;i<sjData.getCount();i++)
		{
			X31SDataBeanAccess subbean = sjData.getDataBean(i);
			X31SDataBeanAccess mvkkbean = keyMvKiki.addDataBean();
			String err_kbn = subbean.sendMessageString(DKW00508SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_GET_VALUE);
			if(JDKCommonUtil.isNull(err_kbn))
			{
				String mdl_no = subbean.sendMessageString(DKW00508SFConst.MDL_NO_05, X31CWebConst.DATABEAN_GET_VALUE);
				String seizo_no = subbean.sendMessageString(DKW00508SFConst.SEIZO_NO_05, X31CWebConst.DATABEAN_GET_VALUE);
				mvkkbean.sendMessageString(DKW00508SFConst.KEY_TAKNKIKI_MODEL_CD_06, X31CWebConst.DATABEAN_SET_VALUE, mdl_no);
				mvkkbean.sendMessageString(DKW00508SFConst.KEY_KK_SEIZO_NO_06, X31CWebConst.DATABEAN_SET_VALUE, seizo_no);
			}
		}
		
		// 型式情報の取得用の情報を設定
		X31SDataBeanAccessArray mvMdl = bean.getDataBeanArray(DKW00508SFConst.MV_MDL);
		mvMdl.clearArray();
		
		for(Iterator ite = modelNoMap.keySet().iterator(); ite.hasNext();)
		{
			Object key = ite.next();
			String mdl_no = key.toString();
			X31SDataBeanAccess mvmdlbean = mvMdl.addDataBean();
			mvmdlbean.sendMessageString(DKW00508SFConst.TAKNKIKI_MODEL_CD_03, 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, "DKSV0001");

		// DataBean⇔BPの上りマッピングを行う
		DKSV0001_DKSV0001OPDBMapper mapper = new DKSV0001_DKSV0001OPDBMapper();
		mapper.setDKSV000101SC(paramBean, inputMap, "1");
		// 製造番号指定の場合のみ、棚移動指示一意一覧照会を呼び出す
		if(shiteiWayCd.equals("2"))
		{
			mapper.setDKSV000102SC(paramBean, inputMap, "1");
		}
		mapper.setDKSV000103SC(paramBean, inputMap, "1");

		// 検索結果格納用マップを生成。
		// サービス呼出
		X31CMessageResult msgResult = invokeService(paramMap, inputMap, outputMap);
		
		// エラー処理
		if (msgResult != null)
		{
			JCCWebCommon.setMessageInfo(this, msgResult);
			return false;
		}

		// DataBean⇔BPの下りマッピングを行う
		mapper.getDKSV000101SC(paramBean, outputMap);
		// 製造番号指定の場合のみ、棚移動指示一意一覧照会を呼び出す
		if(shiteiWayCd.equals("2"))
		{
			mapper.getDKSV000102SC(paramBean, outputMap);
		}
		mapper.getDKSV000103SC(paramBean, outputMap);
		
		// 宅内在庫情報
		mdlZaiko = bean.getDataBeanArray(DKW00508SFConst.MDL_ZAIKO);
		// 宅内機器情報
		mvKiki = bean.getDataBeanArray(DKW01105SFConst.MV_KIKI);
		// 型式情報
		mvMdl = bean.getDataBeanArray(DKW01105SFConst.MV_MDL);
		
		// 在庫チェック
		for(int i=0;i<mdlZaiko.getCount();i++)
		{
			X31SDataBeanAccess subbean = mdlZaiko.getDataBean(i);
			String mdl_no = subbean.sendMessageString(DKW00508SFConst.TK_MDL_CD_02, X31CWebConst.DATABEAN_GET_VALUE);
			String jZaikoCnt = subbean.sendMessageString(DKW00508SFConst.JZAIKO_CNT_02, X31CWebConst.DATABEAN_GET_VALUE);
			if(JDKCommonUtil.isNull(jZaikoCnt)){
				jZaikoCnt = "0";
			}
			String cntStr = modelNoMap.get(mdl_no);
			long cnt = 0;
			if(!JDKCommonUtil.isNull(cntStr)){
				cnt = Long.parseLong(cntStr);
			}
			
			long zaiko = Long.parseLong(jZaikoCnt);
			if(cnt > zaiko)
			{
				for(int j=0;j<sjData.getCount();j++)
				{
					X31SDataBeanAccess sjbean = sjData.getDataBean(j);
					String err_kbn = sjbean.sendMessageString(DKW00508SFConst.ERR_KBN_05, X31CWebConst.DATABEAN_GET_VALUE);
					if(JDKCommonUtil.isNull(err_kbn))
					{
						String sj_mdl_no = sjbean.sendMessageString(DKW00508SFConst.MDL_NO_05, X31CWebConst.DATABEAN_GET_VALUE);
						if(mdl_no.equals(sj_mdl_no))
						{
							this.setMessage(EKB0830_TW, Integer.toString(j + 1)
									, "型番号", "在庫なし");
							errCount += 1;
							if(errCount >= 20){
								return false;
							}
							ret = false;
						}
					}
				}
				
			}
		}

		// 画面情報を設定
		JCCWebCommon.setScreenInfo(this, JDKScreenConst.SCREEN_ID_DKW00508 + "0PJP", paramMap);

		// 棚移動指示登録一覧（棚移動指示登録画面に渡す情報）を設定
		ArrayList<HashMap> moveShelfAddList = new ArrayList<HashMap>();
		
		for(int i=0;i<sjData.getCount();i++)
		{
			X31SDataBeanAccess subbean = sjData.getDataBean(i);
			String mdl_no_sj = subbean.sendMessageString(DKW00508SFConst.MDL_NO_05, X31CWebConst.DATABEAN_GET_VALUE);
			String seizo_no_sj = subbean.sendMessageString(DKW00508SFConst.SEIZO_NO_05, X31CWebConst.DATABEAN_GET_VALUE);
			String cnt_sj = subbean.sendMessageString(DKW00508SFConst.CNT_05, X31CWebConst.DATABEAN_GET_VALUE);
			HashMap<String, String> moveShelf = new HashMap<String, String>();
			moveShelf.put(DKW00501SFConst.TAKNKIKI_MODEL_CD_20, mdl_no_sj);
			moveShelf.put(DKW00501SFConst.KK_SEIZO_NO_20, seizo_no_sj);
			moveShelf.put(DKW00501SFConst.CNT_20, cnt_sj);
			
			
			for(int j=0;j<mvMdl.getCount();j++)
			{
				X31SDataBeanAccess mdlbean = mvMdl.getDataBean(j);
				String mdl_no = mdlbean.sendMessageString(DKW00508SFConst.TAKNKIKI_MODEL_CD_04, X31CWebConst.DATABEAN_GET_VALUE);
				String mdl_nm = mdlbean.sendMessageString(DKW00508SFConst.TAKNKIKI_MODEL_NM_04, X31CWebConst.DATABEAN_GET_VALUE);
				String seizo_no_um = mdlbean.sendMessageString(DKW00508SFConst.SEIZO_NO_UM_04, X31CWebConst.DATABEAN_GET_VALUE);
				if(mdl_no_sj.equals(mdl_no))
				{
					moveShelf.put(DKW00501SFConst.GDS_NM_20, mdl_nm);
					moveShelf.put(DKW00501SFConst.SEIZO_NO_UM_20, seizo_no_um);
				}
				
			}
			if(shiteiWayCd.equals("2"))
			{
				// 棚移動出荷可能チェック
				boolean existKiki = false;
				for(int k=0;k<mvKiki.getCount();k++)
				{
					X31SDataBeanAccess kkbean = mvKiki.getDataBean(k);
					String mdl_no = kkbean.sendMessageString(DKW00508SFConst.TAKNKIKI_MODEL_CD_03, X31CWebConst.DATABEAN_GET_VALUE);
					String seizo_no = kkbean.sendMessageString(DKW00508SFConst.KK_SEIZO_NO_03, X31CWebConst.DATABEAN_GET_VALUE);
					String khn_upd_dttm = kkbean.sendMessageString(DKW00508SFConst.KIHON_UPD_DTTM_03, X31CWebConst.DATABEAN_GET_VALUE);

					if(mdl_no_sj.equals(mdl_no) && seizo_no_sj.equals(seizo_no)){
						moveShelf.put(DKW00501SFConst.KIHON_UPD_DTTM_20, khn_upd_dttm);
						existKiki = true;
						break;
					}
				}
				if(!existKiki)
				{
					this.setMessage(EKB0830_TW, Integer.toString(i + 1)
							, "型番号", "製番管理なし、または移動不可");
					errCount += 1;
					if(errCount >= 20){
						return false;
					}
					ret = false;
				}
			}

			moveShelfAddList.add(moveShelf);
		}

		HashMap paramMap1 = new HashMap();
		paramMap1.put(DKW00501SFConst.SJ_DATA_FILE, moveShelfAddList);
		JCCWebCommon.setScreenInfo(this, JDKScreenConst.SCREEN_ID_DKW00502 + "0PJP", paramMap1);

		return ret;

	}
}
