/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatDKTkkikiGetReqHmpin
*	ソースファイル名	：JBSbatDKTkkikiGetReqHmpin.java
*	作成者				：富士通　
*	作成日				：2012年12月04日
*＜機能概要＞
*　宅内機器取得依頼ファイル作成（返品）部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/12/04   富士通		新規作成
*********************************************************************/
package eo.business.service;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCbatDenshiFileUtil;
import eo.business.common.JDKBatOutputFileUtil;
import eo.business.util.file.JBSbatDKIFM028;
import eo.business.util.file.JBSbatDKIFM029;
import eo.business.util.file.JBSbatDKIFM079;
import eo.common.constant.JDKStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JCCFileUtil;
import eo.common.util.JDKCommonUtil;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
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;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatDKTkkikiGetReqHmpin extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(ディレイド処理依頼)*/
	private static final String D_TBL_NAME_CC_T_DLYD_TRN_REQ = "CC_T_DLYD_TRN_REQ";

	/** テーブル(宅内機器型式)*/
	private static final String D_TBL_NAME_ZM_M_TAKNKIKI_MODEL = "ZM_M_TAKNKIKI_MODEL";

	/** SQL定義キー(DK_SELECT_001)*/
	private static final String CC_T_DLYD_TRN_REQ_DK_SELECT_001 = "DK_SELECT_001";

	/** SQL定義キー(DK_SELECT_004)*/
	private static final String ZM_M_TAKNKIKI_MODEL_DK_SELECT_004 = "DK_SELECT_004";

	/** テーブルアクセスクラス(ディレイド処理依頼)*/
	private JBSbatSQLAccess db_CC_T_DLYD_TRN_REQ = null;

	/** テーブルアクセスクラス(宅内機器型式)*/
	private JBSbatSQLAccess db_ZM_M_TAKNKIKI_MODEL = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/* ++++++++++ v1.00.00 追加開始 ++++++++++ */
	/** 使用不可文字配列（「/」） */
	private static final String[] USE_FAIL_MOJI_ARRAY = { "/" };
	/** 返品情報受信ファイル（レコード種別） */
	private static final int HMPIN_FILE_COL_REC_SBT = 0;
	/** 返品情報受信ファイル（宅内機器型式コード） */
	private static final int HMPIN_FILE_COL_TKKIKI_MDL_CD = 7;
	/** 返品情報受信ファイル（機器製造番号） */
	private static final int HMPIN_FILE_COL_KIKI_SEIZO_NO = 8;
	/** 処理区分 */
	private static final String SHORI_DIV = "1";
	/** ファイル定義（宅内機器取得依頼送信中間（返品情報登録）） */
	private static final String DEF_DKIFM028 = "DKIFM028.def";
	/** ファイル定義（宅内機器取得依頼受信中間（返品情報登録）） */
	private static final String DEF_DKIFM029 = "DKIFM029.def";
	/** ファイル定義（宅内機器情報抽出バッチ（３）送信） */
	private static final String DEF_DKIFM079 = "DKIFM079.def";
	/* ++++++++++ v1.00.00 追加終了 ++++++++++ */

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CC_T_DLYD_TRN_REQ = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CC_T_DLYD_TRN_REQ);
		db_ZM_M_TAKNKIKI_MODEL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_TAKNKIKI_MODEL);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		// パラメータ取得
		String[] freeItem = commonItem.getFreeItem().split(JDKStrConst.FREE_DLMT);
		// ディレイド処理依頼番号
		String reqNo = freeItem[0];
		// 送信中間ファイル名
		String sendMidFileNm = freeItem[1];
		// 宅内機器取得依頼送信中間（返品情報登録）ファイル名
		String sendFileNm = freeItem[2];
		// 受信中間ファイル名
		String reciveMidFileNm = freeItem[3];
		// 宅内機器取得依頼受信中間（返品情報登録）ファイル名
		String reciveFileNm = freeItem[4];

		// ディレイド処理依頼と電子ファイル管理より返品情報受信ファイルを取得
		String[] hmpinFileInfo = getHmpinFileInfo(reqNo);

		ArrayList<String[]> outList = new ArrayList<String[]>();
		boolean isFormatErr = false;

		// 返品情報受信ファイルの情報を読込
		for (int i = 0; i < hmpinFileInfo.length; i++)
		{
			// フォーマットエラーが発生している場合はスキップ
			if (isFormatErr)
			{
				continue;
			}

			// レコード内容をカンマ区切りで配列化する
			String[] hmpinJoho = this.split(hmpinFileInfo[i]);

			// フォーマットチェック(項目数チェック)
			// @返品情報レコードが最終レコードではない、かつ、返品配列の要素数が30ではない場合
			if (i != hmpinFileInfo.length - 1 && hmpinJoho.length != 30)
			{
				isFormatErr = true;
			}
			// A返品情報レコードが最終レコード、かつ、返品配列の要素数が2ではない場合
			else if (i == hmpinFileInfo.length - 1 && hmpinJoho.length != 2)
			{
				isFormatErr = true;
			}

			if (!isFormatErr)
			{
				// レコード種別が81の場合のみ処理
				if (JDKStrConst.REC_SBT_DATA.equals(hmpinJoho[HMPIN_FILE_COL_REC_SBT]))
				{
					// データチェック
					boolean errFlg = this.executeCheckData(hmpinJoho);
					if (!errFlg)
					{
						// 出力対象データ追加
						String[] strParam = new String[3];
						strParam[0] = SHORI_DIV;
						strParam[1] = hmpinJoho[HMPIN_FILE_COL_TKKIKI_MDL_CD];
						strParam[2] = hmpinJoho[HMPIN_FILE_COL_KIKI_SEIZO_NO];
						outList.add(strParam);
					}
				}
			}
		}

		// 出力対象データ０件またはフォーマットチェックエラーの場合
		if (outList.size() == 0 || isFormatErr)
		{
			// 処理なし
		}
		else
		{
			// 宅内機器取得依頼送信中間（返品情報登録）ファイル作成
			this.createSendMidFile(sendMidFileNm, sendFileNm);

			// 宅内機器取得依頼受信中間（返品情報登録）ファイル作成
			this.createReciveMidFile(reciveMidFileNm, reciveFileNm);
			
			// 宅内機器情報抽出バッチ（３）送信ファイル作成
			this.createSendFileNm(sendFileNm, outList);
		}

		// 終了
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CC_T_DLYD_TRN_REQ.close();
		db_ZM_M_TAKNKIKI_MODEL.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(DK_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	ディレイド処理依頼番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCC_T_DLYD_TRN_REQ_DK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CC_T_DLYD_TRN_REQ.selectBySqlDefine(paramList, CC_T_DLYD_TRN_REQ_DK_SELECT_001);
	}

	/**
	 * SQLKEY(DK_SELECT_004)で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_TAKNKIKI_MODEL_DK_SELECT_004(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_ZM_M_TAKNKIKI_MODEL.selectBySqlDefine(paramList, ZM_M_TAKNKIKI_MODEL_DK_SELECT_004);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * ディレイド処理依頼と電子ファイル管理より返品情報受信ファイルを取得する処理
	 * 
	 * @param reqNo ディレイド処理依頼番号
	 * @return String[] 返品情報受信ファイル<BR>
	 * @throws Exception 返品情報受信ファイルの取得に失敗した場合
	 */
	private String[] getHmpinFileInfo(String reqNo) throws Exception
	{

		JBSbatCommonDBInterface resultMap = null;

		// ディレイド処理依頼、電子ファイルより、返品受信ファイルの情報を取得
		try
		{
			String[] param = new String[]{reqNo};
			this.executeCC_T_DLYD_TRN_REQ_DK_SELECT_001(param);
			resultMap = db_CC_T_DLYD_TRN_REQ.selectNext();
			if (resultMap == null)
			{
				throw new Exception("ディレイド処理依頼情報なし");
			}
		}
		catch (Exception ex)
		{
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0020KE,
					new String[] {"ディレイド処理依頼", "ディレイド処理依頼番号＝" + reqNo});
			throw ex;
		}

		byte[] denshiFileByte = getDenshiFileByte((String)resultMap.getValue("INPUT_EFILE_KANRI_NO"));

		if (denshiFileByte == null)
		{
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EDKB0020KE, 
					new String[] {"電子ファイル管理", "電子ファイル管理番号＝" + (String)resultMap.getValue("INPUT_EFILE_KANRI_NO")});
		}

		// ファイルの中身を取得する
		String dlydString = new String(denshiFileByte, JDKStrConst.CHAR_SET_WIN31J);

		// 文字列から改行コードで分割
		String[] strDlydList = dlydString.split(JDKStrConst.LINE_SEPARATOR);

		// 配列の第１要素が空の場合、
		if (JDKCommonUtil.isNull(strDlydList[0]))
		{
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EDKB0020KE, 
					new String[] {"電子ファイル管理", "電子ファイル管理番号＝" + (String)resultMap.getValue("INPUT_EFILE_KANRI_NO")});
		}

		return strDlydList;
	}

	/**
	 * 電子ファイルをbyteの配列に変換します。
	 * 
	 * @param cmnItem 業務共通電文クラス
	 * @param eFileKanriNo 電子ファイル管理番号
	 * @return 変換後のbyteの配列
	 * @throws Exception 
	 * @throws SQLException 
	 */
	private byte[] getDenshiFileByte(String eFileKanriNo) throws Exception
	{
		BufferedInputStream in = null;
		ByteArrayOutputStream baos = null;
		byte reb[] = null; 
		String path = null;

		try
		{
			// 電子ファイル解凍処理
			path = JCCbatDenshiFileUtil.searchDenshiFile(commonItem, eFileKanriNo);

			if(null == path){
				return null;
			}

			in = new BufferedInputStream(new FileInputStream( path ));
			baos = new ByteArrayOutputStream();
			byte btmp[] = new byte[1024]; 
			int j;
			while((j = in.read(btmp))!=-1){
				baos.write(btmp, 0, j);
			}

			reb = baos.toByteArray();

			if(null != in){
				in.close();
			}
			if(null != baos){
				baos.close();
			}
		}
		catch (Exception e)
		{
			return null;
		}
		finally
		{
			//作業用ファイルの削除
			if(null != path){
				String parentPath = path.substring(0, path.lastIndexOf(File.separator));
				JCCFileUtil.removeDir(parentPath);
			}

			if (null != in)
			{
				try {
					in.close();
				} catch (Exception e) {
					;//なにもしない
				}
			}
			if (null != baos)
			{
				try {
					baos.close();
				} catch (Exception e) {
					;//なにもしない
				}
			}
		}

		return reb;
	}

	/***
	 * 返品配列を生成する。
	 * @param value 元ネタとなる受信ファイルデータ
	 * @return 入荷配列
	 */
	private String[] split(String value)
	{
		String[] hmpinJoho = value.split(",");

		for (int i = 0; i < hmpinJoho.length; i++)
		{
			hmpinJoho[i] = hmpinJoho[i].replace("\"", "");
		}

		return hmpinJoho;
	}

	/**
	 * データチェックを行います。
	 * @param nyukaJoho 返品配列
	 * @param index 返品情報の処理レコードインデックス
	 * @return true:チェックエラー false:正常
	 * @exception Exception
	 */
	private boolean executeCheckData(String[] hmpinJoho) throws Exception
	{
		// ********************************************************************
		// 型番号
		// ********************************************************************
		// 必須入力チェック
		if (this.checkNull(hmpinJoho[HMPIN_FILE_COL_TKKIKI_MDL_CD]))
		{
			return true;
		}
		// 桁数オーバーチェック
		if (this.checkLengthOver(20, hmpinJoho[HMPIN_FILE_COL_TKKIKI_MDL_CD]))
		{
			return true;
		}
		// マスタ存在チェック
		String[] param = new String[]{hmpinJoho[HMPIN_FILE_COL_TKKIKI_MDL_CD]};
		this.executeZM_M_TAKNKIKI_MODEL_DK_SELECT_004(param);
		JBSbatCommonDBInterface tnMTaknkikiModelMap = db_ZM_M_TAKNKIKI_MODEL.selectNext();
		if (tnMTaknkikiModelMap == null)
		{
			return true;
		}
		// 製造番号管理有無チェック
		if (JDKStrConst.UM_FLG_M.equals(tnMTaknkikiModelMap.getString("SEIZO_NO_UM")))
		{
			return true;
		}

		// ********************************************************************
		// 製造番号
		// ********************************************************************
		// 必須入力チェック
		if (this.checkNull(hmpinJoho[HMPIN_FILE_COL_KIKI_SEIZO_NO]))
		{
			return true;
		}
		// 桁数オーバーチェック
		if (this.checkLengthOver(20, hmpinJoho[HMPIN_FILE_COL_KIKI_SEIZO_NO]))
		{
			return true;
		}
		// 使用不可文字チェック
		if (this.checkUseFailMoji(USE_FAIL_MOJI_ARRAY, hmpinJoho[HMPIN_FILE_COL_KIKI_SEIZO_NO]))
		{
			return true;
		}

		return false;
	}

	/**
	 * 必須入力チェックを行います。<br>
	 * @param value チェック対象データ
	 * @return true:チェックエラー false:正常
	 */
	private boolean checkNull(String value)
	{
		if (JDKCommonUtil.isNull(JDKCommonUtil.trim(value)))
		{
			return true;
		}
		return false;
	}

	/**
	 * 指定桁数を超えているかのチェックを行います。<br>
	 * @param checkLength 桁数
	 * @param value チェック対象データ
	 * @return true:チェックエラー false:正常
	 * @throws UnsupportedEncodingException
	 */
	private boolean checkLengthOver(int checkLength, String value) throws UnsupportedEncodingException
	{
		if (checkLength < value.getBytes("SJIS").length)
		{
			return true;
		}
		return false;
	}

	/**
	 * 使用不可文字チェックを行います。<br>
	 * @param checkValues チェック内容
	 * @param value チェック対象データ
	 * @return true:チェックエラー false:正常
	 */
	private boolean checkUseFailMoji(String[] checkValues, String value)
	{
		boolean checkFlg = false;
		StringBuffer chkVal = new StringBuffer();

		// どれか１つでも該当する場合はTrue
		for (String checkValue : checkValues)
		{
			if (chkVal.length() > 0)
			{
				chkVal.append(" or ");
			}
			chkVal.append(checkValue);
			if (value != null && value.indexOf(checkValue) >= 0)
			{
				checkFlg = true;
				break;
			}
		}

		// 使用不可文字が存在する場合、以下の処理を行う。
		if (checkFlg)
		{
			return true;
		}
		return false;
	}

	/**
	 * 宅内機器取得依頼送信中間（返品情報登録）ファイル作成<br>
	 * @param sendMidFileNm 宅内機器取得依頼送信中間（返品情報登録）ファイルフルパス
	 * @param sendFileNm 宅内機器取得依頼送信中間（返品情報登録）ファイルフルパス
	 */
	private void createSendMidFile(String sendMidFileNm, String sendFileNm) throws Exception
	{
		// ファイル形式の設定
		JBSbatOutputFileUtil outFile = new JBSbatOutputFileUtil(sendMidFileNm);
		outFile.setEncode(JDKStrConst.ENCODE_SJIS);		// 文字コード
		outFile.setLine(JDKStrConst.LINE_LF);			// 改行コード
		// ファイル作成
		try
		{
			outFile.createWriter();
		}
		catch (Exception ex)
		{
			// 宅内機器取得依頼送信中間（返品情報登録）ファイル作成失敗
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0030CE,
					new String[] {sendMidFileNm});
			throw ex;
		}

		try
		{
			// ファイル定義の取得
			String defFile = rnktPath(JBSbatAplConst.getAplConstValue(JDKStrConst.DK_DIR_IND), DEF_DKIFM028);
			JBSbatDefFileUtil defDataUtil = new JBSbatDefFileUtil(defFile, outFile);

			// データ部生成
			JBSbatServiceInterfaceMap outDataMap = null;

			// データ部生成
			outDataMap = new JBSbatServiceInterfaceMap();

			// ファイル名
			outDataMap.set(JBSbatDKIFM028.FILE_NM, sendFileNm);

			// データの出力
			outFile.print(outDataMap, defDataUtil);
		}
		catch (Exception ex)
		{
			// 宅内機器情報抽出バッチ（３）送信中間ファイル書き込み失敗
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0050CE,
					new String[] {sendMidFileNm});
			throw ex;
		}
		finally
		{
			// ファイルのクローズ
			try
			{
				outFile.close();
			}
			catch (Exception ex2)
			{
				super.logPrint.printDebugLog("ファイル書込みオブジェクトのクローズ失敗:" + sendMidFileNm);
			}
		}
	}

	/**
	 * 宅内機器取得依頼受信中間（返品情報登録）ファイル作成<br>
	 * @param reciveMidFileNm 宅内機器取得依頼受信中間（返品情報登録）ファイルフルパス
	 * @param reciveFileNm 宅内機器取得依頼受信中間（返品情報登録）ファイルフルパス
	 */
	private void createReciveMidFile(String reciveMidFileNm, String reciveFileNm) throws Exception
	{
		// ファイル形式の設定
		JBSbatOutputFileUtil outFile = new JBSbatOutputFileUtil(reciveMidFileNm);
		outFile.setEncode(JDKStrConst.ENCODE_SJIS);		// 文字コード
		outFile.setLine(JDKStrConst.LINE_LF);			// 改行コード
		// ファイル作成
		try
		{
			outFile.createWriter();
		}
		catch (Exception ex)
		{
			// 宅内機器取得依頼受信中間（返品情報登録）ファイル作成失敗
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0030CE,
					new String[] {reciveMidFileNm});
			throw ex;
		}

		try
		{
			// ファイル定義の取得
			String defFile = rnktPath(JBSbatAplConst.getAplConstValue(JDKStrConst.DK_DIR_IND), DEF_DKIFM029);
			JBSbatDefFileUtil defDataUtil = new JBSbatDefFileUtil(defFile, outFile);

			// データ部生成
			JBSbatServiceInterfaceMap outDataMap = null;

			// データ部生成
			outDataMap = new JBSbatServiceInterfaceMap();

			// ファイル名
			outDataMap.set(JBSbatDKIFM029.FILE_NM, reciveFileNm);

			// データの出力
			outFile.print(outDataMap, defDataUtil);
		}
		catch (Exception ex)
		{
			// 宅内機器取得依頼受信中間（返品情報登録）ファイル書き込み失敗
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0050CE,
					new String[] {reciveMidFileNm});
			throw ex;
		}
		finally
		{
			// ファイルのクローズ
			try
			{
				outFile.close();
			}
			catch (Exception ex2)
			{
				super.logPrint.printDebugLog("ファイル書込みオブジェクトのクローズ失敗:" + reciveMidFileNm);
			}
		}
	}

	/**
	 * 宅内機器情報抽出バッチ（３）送信ファイル作成<br>
	 * @param sendFileNm 宅内機器情報抽出バッチ（３）送信ファイルフルパス
	 * @param outList 宅内機器情報抽出バッチ（３）送信ファイル出力内容
	 */
	private void createSendFileNm(String sendFileNm, ArrayList<String[]> outList) throws Exception
	{
		// ファイル形式の設定
		JBSbatOutputFileUtil outFile = new JBSbatOutputFileUtil(sendFileNm);
		outFile.setEncode(JDKStrConst.ENCODE_SJIS);		// 文字コード
		outFile.setLine(JDKStrConst.LINE_LF);			// 改行コード
		// ファイル作成
		try
		{
			outFile.createWriter();
		}
		catch (Exception ex)
		{
			// 宅内機器情報抽出バッチ（３）送信ファイル作成失敗
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0030CE,
					new String[] {sendFileNm});
			throw ex;
		}

		try
		{
			// ファイル定義の取得
			String defFile = rnktPath(JBSbatAplConst.getAplConstValue(JDKStrConst.DK_DIR_IND), DEF_DKIFM079);
			JBSbatDefFileUtil defDataUtil = new JBSbatDefFileUtil(defFile, outFile);

			for (String[] outData : outList)
			{
				// データ部生成
				JBSbatServiceInterfaceMap outDataMap = new JBSbatServiceInterfaceMap();
				outDataMap.set(JBSbatDKIFM079.SHORI_KBN, JDKBatOutputFileUtil.encloseDQuot(outData[0]));
				outDataMap.set(JBSbatDKIFM079.TAKNKIKI_MODEL_CD, JDKBatOutputFileUtil.encloseDQuot(outData[1]));
				outDataMap.set(JBSbatDKIFM079.KIKI_SEIZO_NO, JDKBatOutputFileUtil.encloseDQuot(outData[2]));
				outDataMap.set(JBSbatDKIFM079.KKTK_SBT_CD, JDKBatOutputFileUtil.encloseDQuot(""));

				// データの出力
				outFile.print(outDataMap, defDataUtil);
			}
		}
		catch (Exception ex)
		{
			// 宅内機器情報抽出バッチ（３）送信ファイル書き込み失敗
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0050CE,
					new String[] {sendFileNm});
			throw ex;
		}
		finally
		{
			// ファイルのクローズ
			try
			{
				outFile.close();
			}
			catch (Exception ex2)
			{
				super.logPrint.printDebugLog("ファイル書込みオブジェクトのクローズ失敗:" + sendFileNm);
			}
		}		
	}

	/**
	 * パス文字列の連結
	 * 連結するパス文字列にパス区切り文字の設定を制御する。
	 * @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;
	}
}
