/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatDKShkaFinReqAdd
*	ソースファイル名	：JBSbatDKShkaFinReqAdd.java
*	作成者				：富士通　
*	作成日				：2011年05月18日
*＜機能概要＞
*　出荷完了依頼登録部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/05/18   富士通		新規作成
*********************************************************************/
package eo.business.service;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JDKBatOutputFileUtil;
import eo.business.util.file.JBSbatDKIFM005;
import eo.business.util.file.JBSbatDKIFM006;
import eo.common.constant.JDKStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.file.JBSbatOutputFileUtil;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatAplConst;
import eo.framework.util.JBSbatDateUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatDKShkaFinReqAdd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(コード名称管理)*/
	private static final String D_TBL_NAME_ZM_M_CD_NM_KANRI = "ZM_M_CD_NM_KANRI";

	/** テーブル(出荷完了依頼)*/
	private static final String D_TBL_NAME_DK_T_SHKA_FIN_REQ = "DK_T_SHKA_FIN_REQ";

	/** テーブル(出荷完了明細)*/
	private static final String D_TBL_NAME_DK_T_SHKA_FIN_DTL = "DK_T_SHKA_FIN_DTL";

	/** テーブル(ダウンロードファイル管理)*/
	private static final String D_TBL_NAME_ZM_T_DL_FILE_KANRI = "ZM_T_DL_FILE_KANRI";

	/** SQL定義キー(DK_SELECT_01)*/
	private static final String ZM_M_CD_NM_KANRI_DK_SELECT_01 = "DK_SELECT_001";

	/** SQL定義キー(DK_INSERT_001)*/
	private static final String ZM_T_DL_FILE_KANRI_DK_INSERT_001 = "DK_INSERT_001";

	/** テーブルアクセスクラス(コード名称管理)*/
	private JBSbatSQLAccess db_ZM_M_CD_NM_KANRI = null;

	/** テーブルアクセスクラス(出荷完了依頼)*/
	private JBSbatSQLAccess db_DK_T_SHKA_FIN_REQ = null;

	/** テーブルアクセスクラス(出荷完了明細)*/
	private JBSbatSQLAccess db_DK_T_SHKA_FIN_DTL = null;

	/** テーブルアクセスクラス(ダウンロードファイル管理)*/
	private JBSbatSQLAccess db_ZM_T_DL_FILE_KANRI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 出荷完了情報ファイル：項目数（データ部）*/
	private static final int REC_COL_CNT_DATA = 11;
	
	/** 出荷完了情報ファイル：項目数（トレーラー部）*/
	private static final int REC_COL_CNT_TL = 2;
	
	/** 出荷完了依頼エラーコード：チェックエラー：CD00030 */
	private static final String SHKA_FIN_REQ_ERR_CD_CHECK_ERR = "W";
	
	/** 出荷完了情報ファイル読み込み時/CSV出力用デリミタ */
	private static final String CSV_DELIMITER = ",";
	
	/** 項目エラー出力メッセージ用 */
	private static final String COL_ERR_MSG = "が不正です。";
	
	/** 項目エラー出力メッセージ用(フォーマットエラー) */
	private static final String COL_ERR_FORMAT = "フォーマット";
	
	/** 項目エラー出力メッセージ用(トレーラ部件数異常) */
	private static final String COL_ERR_ALL_FILE_CNT = "ファイルの全体件数";
	
	/** 項目エラー出力メッセージ用(トレーラ部件数異常) */
	private static final String COL_ERR_TL_FILE_CNT = "トレーラ部に設定されている件数";
	
	/** 項目エラー出力メッセージ用(トレーラ部件数異常) */
	private static final String COL_ERR_ALL_TL_FILE_CNT = 
		"ファイルの全体件数とトレーラ部に設定されている件数が一致しません。";
	
	/** 出荷完了番号シーケンス名 */
	private static final String SEQ_SHKA_FIN_NO = "SEQ_SHUKKA_FIN_NO";
	
	/** 出荷完了依頼エラーファイル名 */
	private static final String SHKA_FIN_REQ_ERR_FILENM = "DKPRC00701_err_";
	
	/** 出荷完了情報受信ファイル移動リストファイル名 */
	private static final String SHKA_FIN_INFO_MOVE_LIST_FILENM = "DKPRC00701_move_list.csv";
	
	/** 出荷完了情報受信ファイル検索用　文字列 */
	private static final String EO_SOUTPUT = "eo_soutput";
	
	/** 出荷完了情報受信ファイル名の長さ */
	private static final int FILE_NAME_LENGTH = (EO_SOUTPUT + "yyyymmddhhmmss_nnn.csv").length();
	
	/** インターフェースディレクトリ */
	private static final String IF_DIR = "DKIFE011";
	
	/** マイナーエラー発生フラグ マイナーエラーが発生した場合はTrueにする */
	private boolean minorErrFlg = false;
	
	/** 出荷完了情報受信：レコード種別 */
	public static final String REC_SBT_COLNM = "レコード種別";

	/** 出荷完了情報受信：出荷ロット番号 */
	public static final String SHUKKA_LOT_NO_COLNM = "出荷ロット番号";

	/** 出荷完了情報受信：枝番号 */
	public static final String SEQ_NO_COLNM = "枝番号";

	/** 出荷完了情報受信：宅内機器型式コード */
	public static final String TAKNKIKI_MODEL_CD_COLNM = "宅内機器型式コード";

	/** 出荷完了情報受信：機器製造番号 */
	public static final String KIKI_SEIZO_NO_COLNM = "機器製造番号";

	/** 出荷完了情報受信：数量 */
	public static final String CNT_COLNM = "数量";

	/** 出荷完了情報受信：伝票Ｎｏ */
	public static final String DENPYO_NO_COLNM = "伝票Ｎｏ";

	/** 出荷完了情報受信：出荷指図日 */
	public static final String SHUKKA_SASHIZU_YMD_COLNM = "出荷指図日";

	/** 出荷完了情報受信：トムソンケースＮｏ */
	public static final String TCASE_NO_COLNM = "トムソンケースＮｏ";

	/** 出荷完了情報受信：総トムソンケース数 */
	public static final String TTL_TCASE_CNT_COLNM = "総トムソンケース数";

	/** 出荷完了情報受信：ＴＶコース */
	public static final String TV_COURSE_COLNM = "ＴＶコース";

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_ZM_M_CD_NM_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_CD_NM_KANRI);
		db_DK_T_SHKA_FIN_REQ = new JBSbatSQLAccess(commonItem, D_TBL_NAME_DK_T_SHKA_FIN_REQ);
		db_DK_T_SHKA_FIN_DTL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_DK_T_SHKA_FIN_DTL);
		db_ZM_T_DL_FILE_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_T_DL_FILE_KANRI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		ArrayList<String> normalFileNameList = new ArrayList<String>(); 		// 正常ファイルデータ格納用
		ArrayList<String> errFileNameList = new ArrayList<String>(); 			// エラーデータ格納用
		ArrayList<String[]> errDataList = new ArrayList<String[]>();			// 異常データ格納用
		
		// パラメータの取得（Freeパラメータ）
		// 出荷完了情報ファイルが格納されているフォルダの環境変数名を取得する
		String[] freeParam = commonItem.getFreeItem().split(",");
		
		// 環境変数から実際ファイル格納フォルダの値を取得します
		String recvDir = JBSbatAplConst.getAplConstValue(freeParam[0]);
		if (recvDir == null)
		{
			// 環境変数未設定エラー
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EDKB0020KE, new String[] {"環境変数",
			"環境変数名＝" + freeParam[0]});
		}
		recvDir = recvDir + "/" + IF_DIR;
		
		// 指定フォルダよりファイルの有無確認を行う
		File file = new File(inspection(recvDir));
		// ファイルの一覧を取得する(ファイル名で絞り込み)
		String[] fileList = getTargetFile(file.list());
		if (fileList == null || fileList.length < 1)
		{
			return null;
		}
		// ファイル名ソート
		Arrays.sort(fileList);

		// ディレクトリ区切り文字の付加
		recvDir = rnktPath(recvDir, "");
		
		JBSbatInputFileUtil inputFile = null;
		// ファイル数文処理を行う
		for (int i = 0; i < fileList.length; i++)
		{
			inputFile = new JBSbatInputFileUtil(recvDir + fileList[i]);
			try
			{
				// 1.2.2.3 テキストファイルの読み込み
				inputFile.setEncode("US-ASCII");
				inputFile.createReader();
				
				// フォーマットチェック（カンマの数をチェック）
				
				String[] rec = null;			// レコード
				String recLine = null;			// 行レコード
				boolean frmErr = false;		// フォーマットエラー有
				int recCnt = 0;					// レコード件数
				int cnmCnt = 0;					// カンマ数
				boolean existDataFlg = false;	// データ部存在フラグ
				boolean existTLFlg = false;	// トレーラ部存在フラグ
				ArrayList<String> recData = new ArrayList<String>();
				while(inputFile.ready())
				{
					// 1行読み込み
					recLine = inputFile.readLine();
					recCnt++;
					// カンマで分割
					cnmCnt = getCnt(recLine, CSV_DELIMITER) + 1;
					rec = getCsvStrArray(recLine, CSV_DELIMITER, "\"");
					
					// レコード種別がデータ部か？
					if (JDKStrConst.RECORD_SBT_DKIFE01101_DATA.equals(rec[0]))
					{
						// データ部が存在していたので存在フラグON
						existDataFlg = true;
						// データ部の場合は11項目なのでそれ以外の場合はエラーとする
						if (REC_COL_CNT_DATA != cnmCnt)
						{
							// エラーリストへデータ追加
							errFileNameList.add(fileList[i]);
							errDataList.add(makeErrData(fileList[i], String.valueOf(recCnt), 
									SHKA_FIN_REQ_ERR_CD_CHECK_ERR, COL_ERR_FORMAT + COL_ERR_MSG, recLine));
							commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0080KW, 
									new String[]{COL_ERR_FORMAT, getColErrMsg(recvDir + fileList[i], String.valueOf(recCnt), recLine)});
							frmErr = true;
							break;
						}
					}
					else if(JDKStrConst.RECORD_SBT_DKIFE01102_TRAILER.equals(rec[0]))
					{
						// トレーラ部が存在していたので存在フラグON
						existTLFlg = true;

						// トレーラ部の場合は2項目なのでそれ以外の場合はエラーとする
						if (REC_COL_CNT_TL != cnmCnt)
						{
							// エラーリストへデータ追加
							errDataList.add(makeErrData(fileList[i], String.valueOf(recCnt), 
									SHKA_FIN_REQ_ERR_CD_CHECK_ERR, COL_ERR_FORMAT + COL_ERR_MSG, recLine));
							commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0080KW, 
									new String[]{COL_ERR_FORMAT, getColErrMsg(recvDir + fileList[i], String.valueOf(recCnt), recLine)});
							frmErr = true;
							break;
						}
						else
						{
							// トレーラ部のデータ件数とデータ部＋トレーラ部合計件数が一致しているか確認
							if (recCnt != toNum(rec[1]))
							{
								// エラーリストへデータ追加
								errFileNameList.add(fileList[i]);
								errDataList.add(makeErrData(fileList[i], String.valueOf(recCnt), 
										SHKA_FIN_REQ_ERR_CD_CHECK_ERR, COL_ERR_ALL_TL_FILE_CNT, recLine));
								commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0100KW, 
										new String[]{COL_ERR_ALL_FILE_CNT, COL_ERR_TL_FILE_CNT, 
										getColErrMsg(recvDir + fileList[i], String.valueOf(recCnt), recLine)});
								frmErr = true;
								break;
							}
						}
					}
					else
					{
						// エラーリストへデータ追加
						errDataList.add(makeErrData(fileList[i], String.valueOf(recCnt), 
								SHKA_FIN_REQ_ERR_CD_CHECK_ERR, COL_ERR_FORMAT + COL_ERR_MSG, recLine));
						commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0080KW, 
								new String[]{COL_ERR_FORMAT, getColErrMsg(recvDir + fileList[i], String.valueOf(recCnt), recLine)});
						frmErr = true;
						break;
					}
					
					// データ種別がデータ部か？
					if (JDKStrConst.RECORD_SBT_DKIFE01101_DATA.equals(rec[0]))
					{
						// 正常レコードをリストに追加
						recData.add(recLine);
					}
				}
				
				// データ部とトレーラ部がどちらかが存在しなかった場合はエラーとみなす
				if (!frmErr && (!existDataFlg || !existTLFlg))
				{
					// エラーリストへデータ追加
					errDataList.add(makeErrData(fileList[i], String.valueOf(recCnt), 
							SHKA_FIN_REQ_ERR_CD_CHECK_ERR, COL_ERR_FORMAT + COL_ERR_MSG, recLine));
					commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0080KW, 
							new String[]{COL_ERR_FORMAT, getColErrMsg(recvDir + fileList[i], String.valueOf(recCnt), recLine)});
					frmErr = true;
				}
				
				
				// フォーマットエラーがなかった場合は正常リストに登録
				if (!frmErr)
				{
					normalFileNameList.add(fileList[i]);
				}
				else
				{
					// マイナーエラーがあったということでマイナーエラーフラグをONにする
					minorErrFlg = true;
				}
			}
			catch (IOException ex)
			{
				super.logPrint.printDebugLog("出荷完了情報受信ファイル読み込み失敗:" + recvDir + fileList[i]);
				commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0660CE,
						new String[] {recvDir + fileList[i]});
				throw ex;
			}
			finally
			{
				// 読み込んだファイルを閉じる
				try
				{
					inputFile.close();
				}
				catch (NullPointerException ex)
				{
					super.logPrint.printDebugLog("ファイルクローズはインスタンスがNull:" + recvDir + fileList[i]);
				}
			}
		}
		
		
		// フォーマットチェックが正常なファイルの読み込み
		ArrayList<String> recData = null;
		for (int i = 0; i < normalFileNameList.size(); i++)
		{
			// 1.2.2.5 ファイル入力制御クラスを生成する
			inputFile = new JBSbatInputFileUtil(recvDir + normalFileNameList.get(i));
			recData = new ArrayList<String>();
			try
			{
				// テキストファイルの読み込み
				inputFile.setEncode(JDKStrConst.ENCODE_SJIS2);
				inputFile.createReader();
				String recLine = null;		// 行レコード
				while(inputFile.ready())
				{
					// 1行読み込み
					recLine = inputFile.readLine();
					// データ部を読み込む
					if (getCsvStrArray(recLine, CSV_DELIMITER, "\"")[0].equals(JDKStrConst.RECORD_SBT_DKIFE01101_DATA))
					{
						// 正常レコードをリストに追加
						recData.add(recLine);
					}
				}
			}
			catch (IOException ex)
			{
				commonItem.getConnection().rollback();
				super.logPrint.printDebugLog("出荷完了情報受信ファイル読み込み失敗:" + recvDir + normalFileNameList.get(i));
				commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0660CE,
						new String[] {recvDir + normalFileNameList.get(i)});
				throw ex;
			}
			finally
			{
				// 1.2.2.6 ファイルのクローズ
				// 読み込んだファイルを閉じる
				try
				{
					inputFile.close();
				}
				catch (NullPointerException ex)
				{
					super.logPrint.printDebugLog("ファイルクローズはインスタンスがNull:" + recvDir + fileList[i]);
				}
			}
			
			ArrayList<String> insertList = new ArrayList<String>();
			ArrayList<String> lotGrpList = null;
			String[] checkRec = null;
			String bLotKey = "bLotKey";
			int colErrFlg = 0;
			// 1.2.2.7 リストより読み込んだファイルデータへの項目チェック
			for (int j = 0; j < recData.size(); j++)
			{
				checkRec = getCsvStrArray(recData.get(j), CSV_DELIMITER, "\"");
				// 出荷ロット番号のブレイク判定
				if (!bLotKey.equals(checkRec[1]))
				{
					// エラーが無い場合は正常データにバッファリングしたデータを移す
					if (colErrFlg == 0 && lotGrpList != null && lotGrpList.size() != 0)
					{
						for (int k = 0; k < lotGrpList.size(); k++)
						{
							insertList.add(lotGrpList.get(k));
						}
					}
					colErrFlg = 0;
					lotGrpList = new ArrayList<String>();
					bLotKey = checkRec[1];
				}
				
				// エラーが存在してる状況で同一の出荷ロット番号の場合は項目チェック処理はしない
				if (colErrFlg == 0)
				{
					// 1.2.2.7-(2)
					colErrFlg = checkCol(errDataList, recData.get(j), String.valueOf(j + 1), SHKA_FIN_REQ_ERR_CD_CHECK_ERR, 
							normalFileNameList.get(i), lotGrpList, recvDir);
					// 項目チェックでエラーが存在している場合はマイナーエラーフラグをONにする
					if (colErrFlg != 0)
					{
						minorErrFlg = true;
					}
				}
				lotGrpList.add(recData.get(j));
			}
			
			// グループリスト残分をエラーがなければ正常データリストへ移す
			if (colErrFlg == 0 && lotGrpList != null)
			{
				for (int k = 0; k < lotGrpList.size(); k++)
				{
					insertList.add(lotGrpList.get(k));
				}
			}
			
			// 1.2.2.8 出荷完了明細データの登録を行う
			String seqNoWhenErr = "";	// エラー時の登録連番保持用
			String recDataWhenErr = "";	// エラー時のレコード内容保持用
			String shkaFinNo = "";		// 出荷完了番号の採番値
			try
			{
				for (int m = 0; m < insertList.size(); m++)
				{
					// 初回のみ出荷完了番号の採番を行う
					if (m == 0)
					{
						shkaFinNo = getShkaFinNo();
					}
					seqNoWhenErr = String.valueOf(m + 1);
					recDataWhenErr = insertList.get(m);
					executeDK_T_SHKA_FIN_DTL_PKINSERT(getShkaFinDtlData(shkaFinNo, insertList.get(m), String.valueOf(m + 1)));
				}
			}
			catch (Exception ex)
			{
				// 出荷完了明細登録失敗
				commonItem.getConnection().rollback();
				commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0070CE,
						new String[] {"出荷完了明細",
						"出荷完了情報受信ファイル＝" + recvDir + normalFileNameList.get(i)
						+ "；行番号＝" + seqNoWhenErr
						+ "；レコード内容＝" + recDataWhenErr});
				throw ex;
			}

			// 1.2.2.9 出荷完了依頼データの登録を行う
			if (insertList.size() > 0)
			{
				try
				{
					executeDK_T_SHKA_FIN_REQ_PKINSERT(getShkaFinReqData(shkaFinNo, String.valueOf(insertList.size()), normalFileNameList.get(i)));
				}
				catch (Exception ex)
				{
					// 出荷完了依頼登録失敗
					commonItem.getConnection().rollback();
					commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0070CE,
							new String[] {"出荷完了依頼",
							"出荷完了情報受信ファイル＝" + recvDir + normalFileNameList.get(i)});
					throw ex;
				}
			}
		}
		
		// 1.2.2.10 エラーリストがある場合は出荷完了依頼エラーファイルを出力する
		if (errDataList.size() > 0)
		{
			// 出荷完了依頼エラーファイルを作成
			// 中間ファイルパス（パス + ファイル名）の取得
			String midFilePath = null;
			// 外部出力ファイルパス（パス + ファイル名）
			JBSbatOutputFileUtil outFile = null;

			try
			{
				// 出荷完了依頼エラーファイルを作成
				// 中間ファイルパス（パス + ファイル名）の取得
				midFilePath = rnktPath(JBSbatAplConst.getAplConstValue(JDKStrConst.ENV_MID_DIR), "") + SHKA_FIN_REQ_ERR_FILENM 
					+ JCCBatCommon.getSysDateTime() + ".csv";

				// 外部出力ファイルパス（パス + ファイル名）
				outFile = new JBSbatOutputFileUtil(midFilePath);
				outFile.setEncode(JDKStrConst.ENCODE_SJIS);		// 文字コード
				outFile.setLine(JDKStrConst.LINE_LF);			// 改行コード

				// 1.2.2.11 出荷完了依頼エラーファイルを作成する
				outFile.createWriter();
				String defFile = rnktPath(JBSbatAplConst.getAplConstValue(JDKStrConst.DK_DIR_IND), "")
				+ JDKStrConst.DEF_SHKA_FIN_REQ_ERR;
				JBSbatDefFileUtil defDataUtil = new JBSbatDefFileUtil(defFile, outFile);
				// データ部生成
				JBSbatServiceInterfaceMap outDataMap = null;
				for (int n = 0; n < errDataList.size(); n++)
				{
					// データ部生成
					outDataMap = new JBSbatServiceInterfaceMap();
					// ファイル名
					outDataMap.set(JBSbatDKIFM005.FILE_NM, 
									JDKBatOutputFileUtil.encloseDQuot(errDataList.get(n)[0]));
					// 行番号
					outDataMap.set(JBSbatDKIFM005.ROW_NO, 
									JDKBatOutputFileUtil.encloseDQuot(errDataList.get(n)[1]));
					// 出荷完了依頼エラーコード
					outDataMap.set(JBSbatDKIFM005.SHKA_FIN_REQ_ERR_CD, 
									JDKBatOutputFileUtil.encloseDQuot(errDataList.get(n)[2]));
					// エラー内容
					outDataMap.set(JBSbatDKIFM005.ERR_NAIYO, 
									JDKBatOutputFileUtil.encloseDQuot(errDataList.get(n)[3]));
					// レコード内容
					outDataMap.set(JBSbatDKIFM005.REC_NAIYO, 
									errDataList.get(n)[4]);
					// 1.2.2.12 異常データの出力
					outFile.print(outDataMap, defDataUtil);
				}
			}
			catch (IOException ex)
			{
				// 出荷完了依頼エラーファイル作成失敗
				commonItem.getConnection().rollback();
				commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0030CE,
						new String[] {midFilePath});
				throw ex;
			}
			catch (Exception ex)
			{
				// 出荷完了依頼エラーファイル書き込み失敗
				commonItem.getConnection().rollback();
				commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0050CE,
						new String[] {midFilePath});
				throw ex;
			}
			finally
			{
				// 1.2.2.13 ファイルのクローズ
				// 読み込んだファイルを閉じる
				try
				{
					if (outFile != null)
					{
						outFile.close();
					}
				}
				catch (NullPointerException ex)
				{
					super.logPrint.printDebugLog("ファイルクローズはインスタンスがNull:" + midFilePath);
				}
			}

			String[] resultKey = null;		// 電子ファイル管理テーブルに登録された場合に返却されるPKEY
			// 1.2.2.14 エラーリストが正常に出力された場合は電子ファイル管理テーブルに
			try
			{
				resultKey = JCCBatCommon.createDenshiFile(commonItem, null, midFilePath, JBSbatDateUtil.adjustMonth(commonItem.getOpeDate(), 3));
			}
			catch (Exception ex)
			{
				// 電子ファイル管理テーブル登録失敗
				commonItem.getConnection().rollback();
				commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0070CE,
						new String[] {"電子ファイル管理", "出荷完了依頼エラーファイル名＝" + midFilePath});
				throw ex;
			}

			// 1.2.2.15 電子ファイル管理テーブルに正常登録された場合ダウンロードファイル管理の登録を行う
			try
			{
				String[] insertData = new String[8];
				insertData[0] = "出荷完了依頼エラー";
				insertData[1] = JCCBatCommon.getSysDateTimeStamp();
				insertData[2] = JCCBatCommon.getSysDateTimeStamp();
				insertData[3] = commonItem.getBatchUserId();
				insertData[4] = JCCBatCommon.getSysDateTimeStamp();
				insertData[5] = commonItem.getBatchUserId();
				insertData[6] = resultKey[0];
				insertData[7] = resultKey[1];
				
				executeZM_T_DL_FILE_KANRI_DK_INSERT_001(insertData);
			}
			catch (Exception ex)
			{
				// ダウンロードファイル管理テーブル登録失敗
				commonItem.getConnection().rollback();
				commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0070CE,
						new String[] {"ダウンロードファイル管理", "出荷完了依頼エラーファイル名＝" + midFilePath});
				throw ex;
			}
		}

		// 処理対象になった全出荷完了情報受信ファイルの出荷完了情報受信ファイル移動リストファイルを作成する
		// 中間ファイルパス（パス + ファイル名）の取得
		String movedFilePath = 
			rnktPath(JBSbatAplConst.getAplConstValue(JDKStrConst.ENV_MID_DIR), "") + SHKA_FIN_INFO_MOVE_LIST_FILENM;

		// 外部出力ファイルパス（パス + ファイル名）
		JBSbatOutputFileUtil moveFile = new JBSbatOutputFileUtil(movedFilePath);
		moveFile.setEncode(JDKStrConst.ENCODE_SJIS);		// 文字コード
		moveFile.setLine(JDKStrConst.LINE_LF);				// 改行コード

		try
		{
			// 1.2.2.16 出荷完了情報受信ファイル移動リストファイルを作成する
			moveFile.createWriter();
			String moveDefFile = rnktPath(JBSbatAplConst.getAplConstValue(JDKStrConst.DK_DIR_IND), "")
			+ JDKStrConst.DEF_SHKA_FIN_REQ_MOVE_LIST;
			JBSbatDefFileUtil defDataUtil = new JBSbatDefFileUtil(moveDefFile, moveFile);
			// データ部生成
			JBSbatServiceInterfaceMap outDataMap = null;
			for (int k = 0; k < fileList.length; k++)
			{
				// データ部生成
				outDataMap = new JBSbatServiceInterfaceMap();
				// ファイル名
				outDataMap.set(JBSbatDKIFM006.FILE_NM, recvDir + fileList[k]);
				// 1.2.2.17 移動リストデータの出力
				moveFile.print(outDataMap, defDataUtil);
			}
		}
		catch (IOException ex)
		{
			// 出荷完了情報受信ファイル移動リストファイル作成失敗
			commonItem.getConnection().rollback();
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0030CE,
					new String[] {movedFilePath});
			throw ex;
		}
		catch (Exception ex)
		{
			// 出荷完了情報受信ファイル移動リストファイル書き込み失敗
			commonItem.getConnection().rollback();
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0050CE,
					new String[] {movedFilePath});
			throw ex;
		}
		finally
		{
			// 1.2.2.18 ファイルのクローズ
			try
			{
				if (moveFile != null)
				{
					moveFile.close();
				}
			}
			catch (NullPointerException ex)
			{
				super.logPrint.printDebugLog("ファイルクローズはインスタンスがNull:" + movedFilePath);
			}
		}
		
		
		// マイナーエラーが存在している場合は共通メッセージのエラーコードに設定を行う
		if (minorErrFlg)
		{
			commonItem.addErrorCount(1);
		}
		
		// 1.2.2.19 実行結果反映
		super.commit();
		
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_ZM_M_CD_NM_KANRI.close();
		db_DK_T_SHKA_FIN_REQ.close();
		db_DK_T_SHKA_FIN_DTL.close();
		db_ZM_T_DL_FILE_KANRI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}


	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/

	/**
	 * SQLKEY(DK_SELECT_01)で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_DK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_ZM_M_CD_NM_KANRI.selectBySqlDefine(paramList, ZM_M_CD_NM_KANRI_DK_SELECT_01);
	}

	/**
	 * PK(全項目登録)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	出荷完了番号				SHUKKA_FIN_NO
	 *		 	ファイル名				FILE_NM
	 *		 	出荷依頼年月日時分秒				SHUKKA_REQ_DTM
	 *		 	出荷完了年月日時分秒				SHUKKA_FIN_DTM
	 *		 	出荷完了依頼処理ステータス				SHUKKA_REQ_STAT
	 *		 	依頼件数				REQ_CNT
	 *		 	正常件数				NORMAL_CNT
	 *		 	エラー件数				ERR_CNT
	 *		 	登録年月日時分秒				ADD_DTM
	 *		 	登録オペレータアカウント				ADD_OPEACNT
	 *		 	更新年月日時分秒				UPD_DTM
	 *		 	更新オペレータアカウント				UPD_OPEACNT
	 *		 	削除年月日時分秒				DEL_DTM
	 *		 	削除オペレータアカウント				DEL_OPEACNT
	 *		 	無効フラグ				MK_FLG
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeDK_T_SHKA_FIN_REQ_PKINSERT(Object[] setParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("SHUKKA_FIN_NO", setParam[0]);
		setMap.setValue("FILE_NM", setParam[1]);
		setMap.setValue("SHUKKA_REQ_DTM", setParam[2]);
		setMap.setValue("SHUKKA_FIN_DTM", setParam[3]);
		setMap.setValue("SHUKKA_REQ_STAT", setParam[4]);
		setMap.setValue("REQ_CNT", setParam[5]);
		setMap.setValue("NORMAL_CNT", setParam[6]);
		setMap.setValue("ERR_CNT", setParam[7]);
		setMap.setValue("ADD_DTM", setParam[8]);
		setMap.setValue("ADD_OPEACNT", setParam[9]);
		setMap.setValue("UPD_DTM", setParam[10]);
		setMap.setValue("UPD_OPEACNT", setParam[11]);
		setMap.setValue("DEL_DTM", setParam[12]);
		setMap.setValue("DEL_OPEACNT", setParam[13]);
		setMap.setValue("MK_FLG", setParam[14]);
	
		// DBアクセスを実行します
		db_DK_T_SHKA_FIN_REQ.insertByPrimaryKeys(setMap);
	}

	/**
	 * PK(全項目登録)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	出荷完了番号				SHUKKA_FIN_NO
	 *		 	出荷ロット番号				SHUKKA_LOT_NO
	 *		 	出荷ロット番号機器通番				SHUKKA_LOT_KIKI_SEQ
	 *		 	出荷完了明細処理結果コード				SHUKKA_DTL_RSLT_CD
	 *		 	サービス契約番号				SVC_KEI_NO
	 *		 	宅内機器型式コード				TAKNKIKI_MODEL_CD
	 *		 	機器製造番号				KIKI_SEIZO_NO
	 *		 	配送指示年月日				HAISO_SJI_YMD
	 *		 	出荷完了年月日				SHUKKA_FIN_YMD
	 *		 	数量				CNT
	 *		 	伝票Ｎｏ				DENPYO_NO
	 *		 	トムソンケース番号				TCASE_NO
	 *		 	総トムソンケース数				TTL_TCASE_CNT
	 *		 	料金コースコード				PCRS_CD
	 *		 	処理通番				TRN_SEQ
	 *		 	登録年月日時分秒				ADD_DTM
	 *		 	登録オペレータアカウント				ADD_OPEACNT
	 *		 	更新年月日時分秒				UPD_DTM
	 *		 	更新オペレータアカウント				UPD_OPEACNT
	 *		 	削除年月日時分秒				DEL_DTM
	 *		 	削除オペレータアカウント				DEL_OPEACNT
	 *		 	無効フラグ				MK_FLG
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeDK_T_SHKA_FIN_DTL_PKINSERT(Object[] setParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("SHUKKA_FIN_NO", setParam[0]);
		setMap.setValue("SHUKKA_LOT_NO", setParam[1]);
		setMap.setValue("SHUKKA_LOT_KIKI_SEQ", setParam[2]);
		setMap.setValue("SHUKKA_DTL_RSLT_CD", setParam[3]);
		setMap.setValue("SVC_KEI_NO", setParam[4]);
		setMap.setValue("TAKNKIKI_MODEL_CD", setParam[5]);
		setMap.setValue("KIKI_SEIZO_NO", setParam[6]);
		setMap.setValue("HAISO_SJI_YMD", setParam[7]);
		setMap.setValue("SHUKKA_FIN_YMD", setParam[8]);
		setMap.setValue("CNT", setParam[9]);
		setMap.setValue("DENPYO_NO", setParam[10]);
		setMap.setValue("TCASE_NO", setParam[11]);
		setMap.setValue("TTL_TCASE_CNT", setParam[12]);
		setMap.setValue("PCRS_CD", setParam[13]);
		setMap.setValue("TRN_SEQ", setParam[14]);
		setMap.setValue("ADD_DTM", setParam[15]);
		setMap.setValue("ADD_OPEACNT", setParam[16]);
		setMap.setValue("UPD_DTM", setParam[17]);
		setMap.setValue("UPD_OPEACNT", setParam[18]);
		setMap.setValue("DEL_DTM", setParam[19]);
		setMap.setValue("DEL_OPEACNT", setParam[20]);
		setMap.setValue("MK_FLG", setParam[21]);
	
		// DBアクセスを実行します
		db_DK_T_SHKA_FIN_DTL.insertByPrimaryKeys(setMap);
	}

	/**
	 * SQLKEY(DK_INSERT_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_T_DL_FILE_KANRI_DK_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());

		// DBアクセスを実行します
		db_ZM_T_DL_FILE_KANRI.executeBySqlDefine(paramList, ZM_T_DL_FILE_KANRI_DK_INSERT_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * ファイル一覧より出荷完了情報受信ファイルだけを返却します。<br>
	 * <br>
	 * @param argFileList ディレクトリより取得したファイル一覧
	 * @return  String[] 出荷完了情報受信ファイルのみ返却。
	 */
	private String[] getTargetFile(String[] argFileList)
	{
		String[] result = null;
		String flgFile = "";
		String recvDir = JCCBatCommon.getApplicationConst(JDKStrConst.ENV_GAIBU_RECEIVE_DIR);
		recvDir = this.rnktPath(recvDir, IF_DIR + "/");
		
		if (argFileList != null && argFileList.length > 0)
		{
			ArrayList<String> tmpList = new ArrayList<String>();
			for (int i = 0; i < argFileList.length; i++)
			{
				// 出荷完了情報受信ファイルかどうかチェックする
				if (!(argFileList[i].startsWith(EO_SOUTPUT) && argFileList[i].endsWith("csv")))
				{
					continue;
				}

				// ファイル名の長さを調べる
				if (argFileList[i].length() != FILE_NAME_LENGTH)
				{
					continue;
				}

				// 受信フラグの存在チェック
				flgFile = recvDir + argFileList[i].replaceAll("csv", "flg");
				File objFile = new File(inspection(flgFile));
				if (!objFile.exists())
				{
					continue;
				}

				tmpList.add(argFileList[i]);

			}
			if (tmpList.size() > 0)
			{
				result = new String[tmpList.size()];
				
				for (int i = 0; i < tmpList.size(); i++)
				{
					result[i] = (String)tmpList.get(i);
				}
			}
		}
		
		return result;
	}
	

	/**
	 * 数値変換可能かどうかのチェックを行います。<br>
	 * <br>
	 * @param argStr チェック対象文字列
	 * @return  boolean trueである場合、変換可能。falseである場合、変換不可能。
	 */
	private boolean isNumeric(String argStr)
	{
		boolean result = true;
		try
		{
			Integer.parseInt(argStr);
			result = true;
		}
		catch (NumberFormatException ex)
		{
			result = false;
		}
		
		return result;
	}
	
	/**
	 * データが有効値（Null、空文字以外）かどうかのチェックを行います。<br>
	 * <br>
	 * @param argStr チェック対象文字列
	 * @return  boolean trueである場合、Null or 空文字。falseである場合、Null or 空文字以外。
	 */
	private boolean isEmpty(String argStr)
	{
		boolean result = false;
		if (argStr == null ||  "".equals(argStr))
		{
			result = true;
		}
		
		return result;
	}
	
	
	/**
	 * コード管理名称より 出荷完了番号のプレフィックスを取得します。<br>
	 * <br>
	 * @return String出荷完了番号のプレフィックスを返却します。
	 * @throws Exception
	 */
	private String getShkaFinNoPrefix() throws Exception
	{
		String result = "";
		try
		{
			executeZM_M_CD_NM_KANRI_DK_SELECT_001(new String[] {"CD00692", "05"});
			JBSbatCommonDBInterface  resultMap = db_ZM_M_CD_NM_KANRI.selectNext();
			result = (String)resultMap.getString("CD_DIV_NM");
		}
		catch (Exception ex)
		{
			// コード管理名称テーブル読み込み失敗
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0020KE,
					new String[] {"コード管理名称",
					"コード種別コード＝CD00692；コード区分＝05"});
			throw ex;
		}
		
		return result;
	}
	

	/**
	 * 文字列を数値に変換して返却します。<br>
	 * <br>
	 * @param argStr 数値変換対象文字列
	 * @return  変換された数値。変換エラー時は0を返却。
	 */
	private int toNum(String argStr)
	{
		int result = 0;
		try
		{
			result = Integer.parseInt(argStr);
		}
		catch (NumberFormatException ex)
		{
			result = 0;
		}
		
		return result;
	}
	

	/**
	 * 出荷完了情報受信ファイルの１レコード分の項目チェックを行います。<br>
	 * <br>
	 * @param argErrDataList 異常データ格納リスト
	 * @param argRec 出荷完了情報受信ファイルレコード
	 * @param argRowNo 処理行番号
	 * @param argErrCd エラーコード
	 * @param argFileNm チェックレコードが所属するファイル名
	 * @param argLotGrpList 出荷ロット番号単位のグループリスト
	 * @param argRecvDir 入力ファイルディレクトリ
	 * @return  int 0である場合、エラー無。
	 *               1である場合、エラー有り：出荷ロット番号必須エラー以外。
	 *               2である場合、エラー有り：出荷ロット番号必須エラー。
	 */
	private int checkCol(List<String[]> argErrDataList, String argRec, String argRowNo, 
			String argErrCd, String argFileNm, List<String> argLotGrpList, String argRecvDir)
	{
		int result = 0;

		String[] recData = getCsvStrArray(argRec, CSV_DELIMITER, "\"");
		
		// 必須チェック
		
		// 出荷ロット番号
		if (isEmpty(recData[1]))
		{
			argErrDataList.add(makeErrData(argFileNm, argRowNo, argErrCd, SHUKKA_LOT_NO_COLNM + COL_ERR_MSG, argRec));
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0090TW, 
					new String[]{SHUKKA_LOT_NO_COLNM, getColErrMsg(argRecvDir + argFileNm, argRowNo, argRec)});
			return 2;
		}
		
		
		// 枝番号
		if (isEmpty(recData[2]))
		{
			argErrDataList.add(makeErrData(argFileNm, argRowNo, argErrCd, SEQ_NO_COLNM + COL_ERR_MSG, argRec));
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0090TW, 
					new String[]{SEQ_NO_COLNM, getColErrMsg(argRecvDir + argFileNm, argRowNo, argRec)});
			return 1;
		}
		
		// 宅内機器型式コード
		if (isEmpty(recData[3]))
		{
			argErrDataList.add(makeErrData(argFileNm, argRowNo, argErrCd, TAKNKIKI_MODEL_CD_COLNM + COL_ERR_MSG, argRec));
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0090TW, 
					new String[]{TAKNKIKI_MODEL_CD_COLNM, getColErrMsg(argRecvDir + argFileNm, argRowNo, argRec)});
			return 1;
		}
		
		// 数量
		if (isEmpty(recData[5]))
		{
			argErrDataList.add(makeErrData(argFileNm, argRowNo, argErrCd, CNT_COLNM + COL_ERR_MSG, argRec));
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0090TW, 
					new String[]{CNT_COLNM, getColErrMsg(argRecvDir + argFileNm, argRowNo, argRec)});
			return 1;
		}
		
		// 出荷指図日
		if (isEmpty(recData[7]))
		{
			argErrDataList.add(makeErrData(argFileNm, argRowNo, argErrCd, SHUKKA_SASHIZU_YMD_COLNM + COL_ERR_MSG, argRec));
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0090TW, 
					new String[]{SHUKKA_SASHIZU_YMD_COLNM, getColErrMsg(argRecvDir + argFileNm, argRowNo, argRec)});
			return 1;
		}
		
		
		// タイプチェック（数値）
		// 枝番号
		if (!isNumeric(recData[2]))
		{
			argErrDataList.add(makeErrData(argFileNm, argRowNo, argErrCd, SEQ_NO_COLNM + COL_ERR_MSG, argRec));
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0090TW, 
					new String[]{SEQ_NO_COLNM, getColErrMsg(argRecvDir + argFileNm, argRowNo, argRec)});
			return 1;
		}
		
		// 数量
		if (!isNumeric(recData[5]))
		{
			argErrDataList.add(makeErrData(argFileNm, argRowNo, argErrCd, CNT_COLNM + COL_ERR_MSG, argRec));
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0090TW, 
					new String[]{CNT_COLNM, getColErrMsg(argRecvDir + argFileNm, argRowNo, argRec)});
			return 1;
		}
		
		// トムソンケースＮｏ
		if (!isEmpty(recData[8]) && !isNumeric(recData[8]))
		{
			argErrDataList.add(makeErrData(argFileNm, argRowNo, argErrCd, TCASE_NO_COLNM + COL_ERR_MSG, argRec));
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0090TW, 
					new String[]{TCASE_NO_COLNM, getColErrMsg(argRecvDir + argFileNm, argRowNo, argRec)});
			return 1;
		}
		
		// 総トムソンケース数
		if (!isEmpty(recData[9]) && !isNumeric(recData[9]))
		{
			argErrDataList.add(makeErrData(argFileNm, argRowNo, argErrCd, TTL_TCASE_CNT_COLNM + COL_ERR_MSG, argRec));
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0090TW, 
					new String[]{TTL_TCASE_CNT_COLNM, getColErrMsg(argRecvDir + argFileNm, argRowNo, argRec)});
			return 1;
		}
		
		// 出荷指図日 暦日チェック
		if (!JBSbatDateUtil.checkDate(recData[7], 8))
		{
			argErrDataList.add(makeErrData(argFileNm, argRowNo, argErrCd, SHUKKA_SASHIZU_YMD_COLNM + COL_ERR_MSG, argRec));
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0090TW, 
					new String[]{SHUKKA_SASHIZU_YMD_COLNM, getColErrMsg(argRecvDir + argFileNm, argRowNo, argRec)});
			return 1;
		}
		
		// 出荷ロット番号がブレイク時の時、枝番号が1から始まっているかチェック
		if (argLotGrpList.size() == 0 && toNum(recData[2]) != 1)
		{
			argErrDataList.add(makeErrData(argFileNm, argRowNo, argErrCd, SEQ_NO_COLNM + COL_ERR_MSG, argRec));
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0090TW, 
					new String[]{SEQ_NO_COLNM, getColErrMsg(argRecvDir + argFileNm, argRowNo, argRec)});
			return 1;
		}
		
		return result;
	}
	
	/**
	 * エラーデータの項目をまとめて文字列配列で返却します。<br>
	 * <br>
	 * @param argFileNm:エラーが存在したレコードのファイル名
	 * @param argRowNo:行番号
	 * @param argErrCd:出荷完了依頼エラーコード
	 * @param argErrNaiyo エラー内容
	 * @param argRec:エラーレコード
	 * @return String[] エラーレコード
	 */
	private String[] makeErrData(String argFileNm, String argRowNo, String argErrCd, String argErrNaiyo, String argRec)
	{
		String[] result = new String[5];

		// エラーが存在したレコードのファイル名
		result[0] = argFileNm;
		// 行番号
		result[1] = argRowNo;
		// 出荷完了依頼エラーコード
		result[2] = argErrCd;
		// エラー内容
		result[3] = argErrNaiyo;
		// エラーレコード
		result[4] = argRec;
		
		return result;
	}

	/**
	 * メッセージコードに付加する関連情報の文字列を作成し返却します。<br>
	 * <br>
	 * @param argFileNm:エラーが存在したレコードのファイル名
	 * @param argRowNo:行番号
	 * @param argRec:エラーレコード
	 * @return String メッセージ内容
	 */
	private String getColErrMsg(String argFileNm, String argRowNo, String argRec)
	{
		StringBuffer result = new StringBuffer();

		result.append("出荷完了情報受信ファイル名＝");
		result.append(argFileNm);
		result.append("；行番号＝");
		result.append(argRowNo);
		result.append("；レコード内容＝");
		result.append(argRec);
		
		return result.toString();
	}

	/**
	 * 出荷完了番号を採番して返却します。<br>
	 * <br>
	 * @return String 採番された出荷完了番号
	 * @throws Exception
	 */
	private String getShkaFinNo() throws Exception
	{
		// 出荷完了番号のプレフィックスをコード名称管理より取得します。
		StringBuffer prefix = new StringBuffer();
		try
		{
			prefix.append(getShkaFinNoPrefix());
			prefix.append(commonItem.getOpeDate().substring(2, 4));
			return JCCBatCommon.getFormatedNextSeq(commonItem, SEQ_SHKA_FIN_NO, prefix.toString(), 7);
		}
		catch (Exception ex)
		{
			// 出荷完了番号シーケンス採番に失敗
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0020KE,
					new String[] {"出荷完了番号シーケンス",
					"シーケンス＝" + SEQ_SHKA_FIN_NO
					+ "；接頭語＝" + prefix.toString()
					+ "；桁数＝7"});
			throw ex;
		}
	}

	/**
	 * 出荷完了明細データ登録用パラメータを生成して返却します。<br>
	 * <br>
	 * @param argShkaFinNo:出荷完了番号
	 * @param argRecData:明細登録データ
	 * @param argDataSeq:データ連番
	 * @return String[] 採番された出荷完了番号
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private String[] getShkaFinDtlData(String argShkaFinNo, String argRecData, String argDataSeq) throws Exception
	{
		String[] result = new String[22];
		String[] paramData = getCsvStrArray(argRecData, CSV_DELIMITER, "\"");
		
		// 出荷完了番号
		result[0] = argShkaFinNo;
		// 出荷ロット番号
		result[1] = paramData[1];
		// 出荷ロット番号機器通番
		result[2] = paramData[2];
		// 出荷完了明細処理結果コード
		result[3] = "1";
		// サービス契約番号
		result[4] = null;
		// 宅内機器型式コード
		result[5] = paramData[3];
		// 機器製造番号
		result[6] = paramData[4];
		// 配送指示年月日
		result[7] = paramData[7];
		// 出荷完了年月日
		result[8] = null;
		// 数量
		result[9] = paramData[5];
		// 伝票番号
		result[10] = paramData[6];
		// トムソンケース番号
		result[11] = paramData[8];
		// 総トムソンケース数
		result[12] = paramData[9];
		// 料金コースコード
		result[13] = paramData[10];
		// 処理通番
		result[14] = argDataSeq;

		// 登録年月日時分秒
		result[15] =  null;
		// 登録オペレータアカウント
		result[16] = null;
		// 更新年月日時分秒
		result[17] =  null;
		// 更新オペレータアカウント
		result[18] =  null;
		// 削除年月日時分秒
		result[19] =  null;
		// 削除オペレータアカウント
		result[20] =  null;
		// 無効フラグ
		result[21] =  null;
		
		return result;
	}

	/**
	 * 出荷完了依頼データ登録用パラメータを生成して返却します。<br>
	 * <br>
	 * @param argShkaFinNo:出荷完了番号
	 * @param argDtlCnt:明細登録データ件数
	 * @param argFileNm:登録データ元ファイル名
	 * @return String[] 採番された出荷完了番号
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private String[] getShkaFinReqData(String argShkaFinNo, String argDtlCnt, String argFileNm) throws Exception
	{
		String[] result = new String[15];
		
		// 出荷完了番号
		result[0] = argShkaFinNo;
		// ファイル名
		result[1] = argFileNm;
		// 出荷依頼年月日時分秒
		result[2] = commonItem.getOpeDate() + JCCBatCommon.getSysDateTimeStamp().substring(8);
		// 出荷完了年月日時分秒
		result[3] = null;
		// 出荷完了依頼処理ステータス
		result[4] = "1";
		// 依頼件数
		result[5] = argDtlCnt;
		// 正常件数
		result[6] = "0";
		// エラー件数
		result[7] = "0";
		// 登録年月日時分秒
		result[8] = null;
		// 登録オペレータアカウント
		result[9] = null;
		// 更新年月日時分秒
		result[10] = null;
		// 更新オペレータアカウント
		result[11] = null;
		// 削除年月日時分秒
		result[12] = null;
		// 削除オペレータアカウント
		result[13] = null;
		// 無効フラグ
		result[14] = null;
		
		return result;
	}
	
	/**
	 * 環境変数ディレクトリ検査用メソッド（ファイルインジェクション対策）<br>
	 * 半角アルファベットと数字のみで構成されていることを検査します。
	 * <br>
	 * @param argDirNm:検査する文字列
	 * @return String 検査した文字列
	 * @throws IllegalArgumentException 業務サービス内で発生した例外全般。
	 */
	private String inspection(String argDirNm) throws IllegalArgumentException
	{
		
		if (argDirNm.matches("\\p{InBasicLatin}+"))
		{
			return argDirNm;
		}
		throw new IllegalArgumentException(argDirNm); // 誤ったファイル名を指定
	}
	
	/**
	 * 指定文字列内に検索文字列がいくつ含まれるかを返却します。<br>
	 * <br>
	 * @param argStr 対象文字列
	 * @param argSearchStr 検索文字列
	 * @return  int 対象文字列内に検索文字列が存在する個数を返却。
	 */
	private int getCnt(String argStr, String argSearchStr)
	{
		int result = 0;
		
		if (isEmpty(argStr) || isEmpty(argSearchStr) || argStr.indexOf(argSearchStr) < 0)
		{
			return result;
		}
		
		result++;
		int i = argStr.indexOf(argSearchStr) + 1;
		while(i < argStr.length())
		{
			if (argStr.indexOf(argSearchStr, i) > i - 1)
			{
				i = argStr.indexOf(argSearchStr, i);
				result++;
			}
			i++;
		}
		
		return result;
	}

	/**
	 * CSV分割用メソッド。指定された区切り文字で文字列配列に分割した値を返却します。<br>
	 * <br>
	 * @param argRec 対象文字列
	 * @param argDelimiter デリミタ文字
	 * @param argDel 消去文字列
	 * @return  String[] 対象文字列を分割して文字列配列にて返却。
	 */
	private String[] getCsvStrArray(String argRec, String argDelimiter, String argDel)
	{
		// 対象の文字列が有効文字列かどうかのチェック
		if (isEmpty(argRec))
		{
			return null;
		}
		
		String[] result = null;
		String[] buff = argRec.replace(argDel, "").split(argDelimiter);
		
		// splitで区切った文字列数を判定
		if (getCnt(argRec, argDelimiter) + 1 != buff.length)
		{
			
			// 本来あるべき配列数
			result = new String[getCnt(argRec, argDelimiter) + 1];
			
			System.arraycopy(buff, 0, result, 0, buff.length);
		}
		else
		{
			result = buff;
		}
		
		// null値を空文字に変換
		for (int j = 0; j < result.length; j++)
		{
			if (result[j] == null)
			{
				result[j] = "";
			}
		}

		// 結果の返却
		return result;
	}
	
	/**
	 * パス文字列の連結
	 * 連結するパス文字列にパス区切り文字の設定を制御する。
	 * @param path1 パス文字列
	 * @param path2 パス文字列
	 * @return 連結したパス文字列
	 */
	private String rnktPath(String path1, String path2)
	{
		String pathDlmt = "/";
		if (path1.indexOf("\\") > -1 || path2.indexOf("\\") > -1)
		{
			pathDlmt = "\\";
		}
		if (!path1.endsWith(pathDlmt))
		{
			return path1 + pathDlmt + path2;
		}
		return path1 + path2;
	}	
}
