/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
*   モジュール名    ：物流管理システム
 *   ソースファイル名：DKW02201SFLogic.java
 *   作成者          ：富士通
 *   日付            ：2011年09月30日
 *＜機能概要＞
 * 修理受付一覧画面を処理するロジッククラスです。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/09/30   FJ）        新規作成
 *
 **********************************************************************/
package eo.web.webview.DKW02201SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;
import static eo.common.constant.JPCModelConstant.*;
import static eo.common.util.JDKCommonUtil.join;
import static eo.web.webview.DKW02201SF.DKW02201SFConst.*;
import static eo.web.webview.common.JDKScreenConst.*;
import static eo.web.webview.common.JDKWebCommon.*;
import static eo.common.constant.JDKStrConst.*;

import java.util.HashMap;

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.JPCModelConstant;
import eo.common.util.JDKCommonUtil;
import eo.common.util.JPCDateUtil;
import eo.common.util.JPCEditString;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JDKScreenConst;
import eo.web.webview.mapping.DKSV0006_DKSV0006OPDBMapper;
import eo.web.webview.mapping.DKSV0008_DKSV0008OPDBMapper;

/**
 * 修理受付一覧画面を処理するロジッククラスです。
 * @author 909139
 */
public class DKW02201SFLogic extends JCCWebBusinessLogic
{
	/** シリアル番号 */
	private static final long serialVersionUID = 1L;
	
	/** ファイル名 */
	private static final String CSV_FILE_NAME = "修理依頼状況リスト.csv";
	
	/** セッションに保管する文字列データのキー */
	private static final String [] SEARCH_CONDITION_STRING_KEIES = {SEARCH_SHURI_UK_STA
																	, SEARCH_SHURI_UK_END
																	, SEARCH_SVKEI_NO
																	, SEARCH_SYSID
																	, SEARCH_MSKM_NO
																	, SEARCH_MAKER_CD
																	, SEARCH_MDL_NO
																	, SEARCH_SHURI_JOKYO_CD
																	, SEARCH_SEIZO_NO
																	, SEARCH_TRAN_DIV_CD
																	, SEARCH_DOSA_KKNIN_DIV_CD
																	};
	
	/**
	 * 初期表示を処理します。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean init() throws Exception
	{
		X31SDataBeanAccess bean = super.getServiceFormBean();
		X31SDataBeanAccess[] paramBean = {bean};
		
		HashMap<String, String> paramMap = new HashMap<String, String>();
		HashMap<String, String> inputMap = new HashMap<String, String>();
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "DKSV0006");
		
		DKSV0006_DKSV0006OPDBMapper mapper = new DKSV0006_DKSV0006OPDBMapper();
		mapper.setDKSV000601SC(paramBean, inputMap, FUNC_CD_1);
		mapper.setDKSV000602SC(paramBean, inputMap, FUNC_CD_1);
		mapper.setDKSV000603SC(paramBean, inputMap, FUNC_CD_1);
		mapper.setDKSV000604SC(paramBean, inputMap, FUNC_CD_1);
		mapper.setDKSV000605SC(paramBean, inputMap, FUNC_CD_1);

		invokeService(paramMap, inputMap, outputMap);

		mapper.getDKSV000601SC(paramBean, outputMap);
		mapper.getDKSV000602SC(paramBean, outputMap);
		mapper.getDKSV000603SC(paramBean, outputMap);
		mapper.getDKSV000604SC(paramBean, outputMap);
		mapper.getDKSV000605SC(paramBean, outputMap);
		
		pushEmptyToTopOfPulldown(MAKER_INFO, CD_LIST_02, NM_LIST_02, "");
		pushEmptyToTopOfPulldown(MODEL_INFO, CD_LIST_02, NM_LIST_02, "");
		pushEmptyToTopOfPulldown(SHURI_JOKYO_INFO, CD_LIST_02, NM_LIST_02, "");
		pushEmptyToTopOfPulldown(TRAN_DIV_INFO, CD_LIST_02, NM_LIST_02, "");
		pushEmptyToTopOfPulldown(DOSA_CFM_INFO, CD_LIST_02, NM_LIST_02, "");
		
		setScreenMode(0);
		setNextScreen(SCREEN_ID_DKW02201, SCREEN_NAME_DKW02201);
		
		if (!restoreConditionFromSession())
		{
			// 運用日付を取得
			String opeDate = JCCWebCommon.getOpeDate(this, null);

			// 運用日付−３を取得
			String shuriUkYmdFrom = JPCDateUtil.addDay(opeDate, -30);

			// 修理受付日（ＦＲＯＭ）に日付を設定する
			X31SDataBeanAccessArray shuriUkStaArray
							= bean.getDataBeanArray(SHURI_UK_STA);
			X31SDataBeanAccess shuriUkSta = shuriUkStaArray.getDataBean(0);

			// 年に運用日付−３の年月日変換処理（年月日→年）を設定
			shuriUkSta.sendMessageString(YEAR_01
					, X31CWebConst.DATABEAN_SET_VALUE, JPCEditString.toYearFromYmd(shuriUkYmdFrom));

			// 月に運用日付−３の年月日変換処理（年月日→月）を設定
			shuriUkSta.sendMessageString(MON_01
					, X31CWebConst.DATABEAN_SET_VALUE, JPCEditString.toMonthFromYmd(shuriUkYmdFrom));

			// 日に運用日付−３の年月日変換処理（年月日→日）を設定
			shuriUkSta.sendMessageString(DAY_01
					, X31CWebConst.DATABEAN_SET_VALUE, JPCEditString.toDayFromYmd(shuriUkYmdFrom));

			// 修理受付日（ＴＯ）に日付を設定する
			X31SDataBeanAccessArray shuriUkEndArray
							= bean.getDataBeanArray(SHURI_UK_END);
			X31SDataBeanAccess shuriUkEnd = shuriUkEndArray.getDataBean(0);

			// 年に運用日付−３の年月日変換処理（年月日→年）を設定
			shuriUkEnd.sendMessageString(YEAR_01
					, X31CWebConst.DATABEAN_SET_VALUE, JPCEditString.toYearFromYmd(opeDate));

			// 月に運用日付−３の年月日変換処理（年月日→月）を設定
			shuriUkEnd.sendMessageString(MON_01
					, X31CWebConst.DATABEAN_SET_VALUE, JPCEditString.toMonthFromYmd(opeDate));

			// 日に運用日付−３の年月日変換処理（年月日→日）を設定
			shuriUkEnd.sendMessageString(DAY_01
					, X31CWebConst.DATABEAN_SET_VALUE, JPCEditString.toDayFromYmd(opeDate));

			return true;
		}
		
		restoreSearchCondition();
		if (!innerSearch(FUNC_CD_1))
		{
			return true;
		}
		
		setScreenMode(1);
		
		String selectedNo = getData(this, SHURI_UK_SEL_BTRYHOZN_NO);
		X31SDataBeanAccessArray list = getServiceFormBean().getDataBeanArray(SHURI_UK_LIST);
		int length = list.getCount();
		for (int i = 0; i < length; i++)
		{
			String noOnLine = getData(list.getDataBean(i), BTRYHOZN_NO_03);
			if (noOnLine.equals(selectedNo))
			{
				setData(this, (long)i, SHURI_UK_SEL);
				break;
			}
		}
		
		return true;
	}
	

	/**
	 * 修理受付一覧画面の検索ボタンを処理します。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean search() throws Exception
	{
		storeSearchCondition();
		JCCWebCommon.clearPageLinkInfo(this, SCREEN_ID_DKW02201);
		boolean gotResults = innerSearch(FUNC_CD_1);
		setScreenMode(gotResults ? 1 : 0);
		setNextScreen(SCREEN_ID_DKW02201, SCREEN_NAME_DKW02201);
		return true;
	}

	/**
	 * 修理受付一覧画面のページングを処理します。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean paging() throws Exception
	{
		innerSearch(FUNC_CD_1);
		setNextScreen(SCREEN_ID_DKW02201, SCREEN_NAME_DKW02201);
		return true;
	}

	
	/**
	 * 交換機引渡ボタン押下イベントを処理します。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean showKokan() throws Exception
	{
		toNextScreenWithButsuryHozenNo(SCREEN_ID_DKW01601, SCREEN_NAME_DKW01601, getSelectedButsuryuHozenNo());
		return true;
	}
	

	/**
	 * 新品SODボタン押下イベントを処理します。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean showNewSod() throws Exception
	{
		toNextScreenWithButsuryHozenNo(SCREEN_ID_DKW03701, SCREEN_NAME_DKW03701, getSelectedButsuryuHozenNo());
		return true;
	}
	

	/**
	 * 完了登録ボタン押下イベントを処理します。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean showShuriFin() throws Exception
	{
		toNextScreenWithButsuryHozenNo(SCREEN_ID_DKW02101, SCREEN_NAME_DKW02101, getSelectedButsuryuHozenNo());
		return true;
	}
	

	/**
	 * 修理品受取ボタン押下イベントを処理します。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean showShuriUketori() throws Exception
	{
		toNextScreenWithButsuryHozenNo(SCREEN_ID_DKW01701, SCREEN_NAME_DKW01701, getSelectedButsuryuHozenNo());
		return true;
	}
	

	/**
	 * ﾒｰｶｰ完了ボタン押下イベントを処理します。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean showMakerFin() throws Exception
	{
		toNextScreenWithButsuryHozenNo(SCREEN_ID_DKW01901, SCREEN_NAME_DKW01901, getSelectedButsuryuHozenNo());
		return true;
	}
	

	/**
	 * 依頼者引渡ボタン押下イベントを処理します。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean showReqHikiwatashi() throws Exception
	{
		toNextScreenWithButsuryHozenNo(SCREEN_ID_DKW02001, SCREEN_NAME_DKW02001, getSelectedButsuryuHozenNo());
		return true;
	}
	

	/**
	 * CSV出力ボタン押下イベントを処理します。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean outputCsv() throws Exception
	{
		innerSearch(FUNC_CD_2, SHURI_UK_LIST_CSV);
		JCCWebCommon.setTempDownloadFile(this, buildFile().getBytes(CHAR_SET_WIN31J), CSV_FILE_NAME);
		getServiceFormBean().getDataBeanArray(SHURI_UK_LIST_CSV).clearArray();
		return true;
	}
	

	/**
	 * クリアボタン押下イベントを処理します。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean clear() throws Exception
	{
		setData(this, "", SHURI_UK_STA, YEAR_01);
		setData(this, "", SHURI_UK_STA, MON_01);
		setData(this, "", SHURI_UK_STA, DAY_01);
		setData(this, "", SHURI_UK_STA, YMD_01);
		setData(this, "", SHURI_UK_END, YEAR_01);
		setData(this, "", SHURI_UK_END, MON_01);
		setData(this, "", SHURI_UK_END, DAY_01);
		setData(this, "", SHURI_UK_END, YMD_01);

		setData(this, "", SVKEI_NO);
		setData(this, "", SYSID);
		setData(this, "", MSKM_NO);
		setData(this, "", SEIZO_NO);

		setData(this, 0L, MAKER_INFO, INDEX_02);
		setData(this, 0L, MODEL_INFO, INDEX_02);
		setData(this, 0L, SHURI_JOKYO_INFO, INDEX_02);
		setData(this, 0L, TRAN_DIV_INFO, INDEX_02);
		setData(this, 0L, DOSA_CFM_INFO, INDEX_02);
		
		getServiceFormBean().getDataBeanArray(SHURI_UK_LIST).clearArray();
		
		storeSearchCondition();
		return init();
	}
	
	
	/**
	 * 物流保全番号と共に次画面へ遷移します。
	 * @param nextId 次画面ＩＤ
	 * @param nextName 次画面名
	 * @param buturyuHozenNo 物流保全番号
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	private void toNextScreenWithButsuryHozenNo(String nextId, String nextName, String buturyuHozenNo) throws Exception
	{
		JCCWebCommon.setScreenId(this, nextId, SCREEN_ID_DKW02201);
		
		HashMap detailMap = new HashMap();
		detailMap.put(BUTSURYUHOZEN_NO, buturyuHozenNo);
		JCCWebCommon.setScreenInfo(this, nextId, detailMap);
		
		HashMap myMap = new HashMap();
		for (String key : SEARCH_CONDITION_STRING_KEIES)
		{
			myMap.put(key, getData(this, key));
		}
		myMap.put(SHURI_UK_SEL_BTRYHOZN_NO, getSelectedButsuryuHozenNo());
		JCCWebCommon.setScreenInfo(this, JDKScreenConst.SCREEN_ID_DKW02201, myMap);

		setNextScreen(nextId, nextName);
	}
	
	/**
	 * 選択された物流保全番号を取得します。
	 * @return 物流保全番号
	 */
	private String getSelectedButsuryuHozenNo()
	{
		Long index = getDataL(this, SHURI_UK_SEL);
		X31SDataBeanAccess bean = getServiceFormBean().getDataBeanArray(SHURI_UK_LIST).getDataBean(index.intValue());
		
		return getData(bean, BTRYHOZN_NO_03);
	}

	/**
	 * 検索処理を実行します。
	 * @param functionCode 機能コード
	 * @return 検索処理が成功:true 失敗:false
	 * @throws Exception 例外
	 */
	private boolean innerSearch(String functionCode) throws Exception
	{
		return innerSearch(functionCode, SHURI_UK_LIST); 
	}

	/**
	 * 検索処理を実行します。
	 * @param functionCode 機能コード
	 * @param listName 検索結果を受け取る項目名
	 * @return 検索処理が成功:true 失敗:false
	 * @throws Exception 例外
	 */
	private boolean innerSearch(String functionCode, String listName) throws Exception 
	{
		X31SDataBeanAccess bean = super.getServiceFormBean();
		X31SDataBeanAccess[] paramBean = {bean};
		
		HashMap<String, String> paramMap = new HashMap<String, String>();
		HashMap<String, String> inputMap = new HashMap<String, String>();
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "DKSV0008");

		DKSV0008_DKSV0008OPDBMapper mapper = new DKSV0008_DKSV0008OPDBMapper();
		mapper.setDKSV000801SC(paramBean, inputMap, functionCode);

		JCCWebCommon.upmapperPageLinkInfo(this, "DKSV000801CC", inputMap, SCREEN_ID_DKW02201);
		invokeService(paramMap, inputMap, outputMap);
		JCCWebCommon.downmapperPageLinkInfo(this, "DKSV000801CC", outputMap, SCREEN_ID_DKW02201);
		
		mapper.getDKSV000801SC(paramBean, outputMap, listName);


		String searchErrFlg = JCCWebCommon.getSearchErrFlg("DKSV000801CC", outputMap);
		if (JPCModelConstant.SEARCH_ERR_FLG_ZERO.equals(searchErrFlg))
		{
			DEBUG_LOG.debug("検索結果0件");
			JCCWebCommon.setMessageInfo(this, "EKB0330--I");
			return false;
		}
		else if (JPCModelConstant.SEARCH_ERR_FLG_OVERMAX.equals(searchErrFlg))
		{
			DEBUG_LOG.debug(String.format("検索結果%s件以上", JCCWebCommon.getSearchConst("DKW00301_MAX_SHOW_CNT")));
			JCCWebCommon.setMessageInfo(this, "EKB0340--I", new String [] {JCCWebCommon.getSearchConst("DKW02201_MAX_SHOW_CNT")});
			return false;
		}
		else if (JPCModelConstant.SEARCH_ERR_FLG_NODATA.equals(searchErrFlg))
		{
			DEBUG_LOG.debug(String.format("データが見つからない"));
			if (getCommonInfoBean().getDataBeanArray(CommonInfoCFConst.MESSAGES_LIST).getCount() == 0)
			{
				JCCWebCommon.setMessageInfo(this, "EKB0350--I");
			}
		}
		
		JCCWebCommon.setSearchCommand(this, "L_PAG");
		setData(this, 0L, SHURI_UK_SEL);
		adjustList();
		
		return true;
	}

	
	/**
	 * 検索結果の一覧の表示調整をします。
	 */
	private void adjustList()
	{
		X31SDataBeanAccessArray list = getServiceFormBean().getDataBeanArray(SHURI_UK_LIST);
		int size = list.getCount();
		for (int i = 0 ; i < size ; i++) 
		{
			X31SDataBeanAccess data = list.getDataBean(i);

			setData(data, ((i + 1) % 2 == 0) ? "even" : "odd", COLOR_03);
			setData(data, substr(getData(data, SHURI_JOKYO_NM_03), 0, 8), DISP_SHURI_JOKYO_NM_03);
		}
	}
	
	
	/**
	 * 画面入力値を検索条件に設定します。
	 */
	private void storeSearchCondition()
	{
		for (String pulldown : new String [] {MAKER_INFO, MODEL_INFO, SHURI_JOKYO_INFO, TRAN_DIV_INFO, DOSA_CFM_INFO})
		{
			storePullDown(this, pulldown, INDEX_02, CD_02, NM_02, CD_LIST_02, NM_LIST_02);
		}

		setData(this,	getData(this, SHURI_UK_STA, YEAR_01) + 
						getData(this, SHURI_UK_STA, MON_01) + 
						getData(this, SHURI_UK_STA, DAY_01), SHURI_UK_STA, YMD_01);
		setData(this, 	getData(this, SHURI_UK_END, YEAR_01) + 
						getData(this, SHURI_UK_END, MON_01) + 
						getData(this, SHURI_UK_END, DAY_01), SHURI_UK_END, YMD_01);

		setData(this, getData(this, DOSA_CFM_INFO, CD_02), SEARCH_DOSA_KKNIN_DIV_CD);
		setData(this, getData(this, MAKER_INFO, CD_02), SEARCH_MAKER_CD);
		setData(this, getData(this, MODEL_INFO, CD_02), SEARCH_MDL_NO);
		setData(this, getData(this, MSKM_NO), SEARCH_MSKM_NO);
		setData(this, getData(this, SEIZO_NO), SEARCH_SEIZO_NO);
		setData(this, getData(this, SHURI_JOKYO_INFO, CD_02), SEARCH_SHURI_JOKYO_CD);
		setData(this, getData(this, SHURI_UK_END, YMD_01), SEARCH_SHURI_UK_END);
		setData(this, getData(this, SHURI_UK_STA, YMD_01), SEARCH_SHURI_UK_STA);
		setData(this, getData(this, SVKEI_NO), SEARCH_SVKEI_NO);
		setData(this, getData(this, SYSID), SEARCH_SYSID);
		setData(this, getData(this, TRAN_DIV_INFO, CD_02), SEARCH_TRAN_DIV_CD);
	}
	

	/**
	 * セッションに格納した検索条件を復元します。
	 * @return 成否
	 */
	@SuppressWarnings("unchecked")
	private boolean restoreConditionFromSession()
	{
		HashMap map = JCCWebCommon.getScreenInfo(this);
		if (map == null)
		{
			return false;
		}

		for (String key : SEARCH_CONDITION_STRING_KEIES)
		{
			setData(this, (String)map.get(key), key);
		}
		if (map.containsKey(SHURI_UK_SEL_BTRYHOZN_NO))
		{
			setData(this, map.get(SHURI_UK_SEL_BTRYHOZN_NO).toString(), SHURI_UK_SEL_BTRYHOZN_NO);
		}
		
		return true;
	}
	
	/**
	 * 前回検索時の検索条件を復元します。
	 */
	private void restoreSearchCondition()
	{
		for (String[] ymdLabelPair : new String [][] {new String [] {SEARCH_SHURI_UK_STA, SHURI_UK_STA}
													 , new String [] {SEARCH_SHURI_UK_END, SHURI_UK_END}})
		{
			String fromYmd = getData(this, ymdLabelPair[0]);
			if (!JDKCommonUtil.isNull(fromYmd))
			{
				setData(this, substr(fromYmd, 0, 4), ymdLabelPair[1], YEAR_01);
				setData(this, substr(fromYmd, 4, 6), ymdLabelPair[1], MON_01);
				setData(this, substr(fromYmd, 6, 8), ymdLabelPair[1], DAY_01);
			}
		}

		setData(this, getData(this, SEARCH_SVKEI_NO), SVKEI_NO);
		setData(this, getData(this, SEARCH_SYSID), SYSID);
		setData(this, getData(this, SEARCH_MSKM_NO), MSKM_NO);
		setData(this, getData(this, SEARCH_SEIZO_NO), SEIZO_NO);

		initPulldownIndexByCode(MODEL_INFO, getData(this, SEARCH_MDL_NO));
		initPulldownIndexByCode(TRAN_DIV_INFO, getData(this, SEARCH_TRAN_DIV_CD));
		initPulldownIndexByCode(DOSA_CFM_INFO, getData(this, SEARCH_DOSA_KKNIN_DIV_CD));
		initPulldownIndexByCode(MAKER_INFO, getData(this, SEARCH_MAKER_CD));
		initPulldownIndexByCode(SHURI_JOKYO_INFO, getData(this, SEARCH_SHURI_JOKYO_CD));
	}
	
	
	/**
	 * 検索条件からプルダウンの初期値を設定します。
	 * @param pulldownLabel プルダウンの項目名
	 * @param code プルダウンを初期化するコード値
	 */
	private void initPulldownIndexByCode(String pulldownLabel, String code)
	{
		if (JDKCommonUtil.isNull(code))
		{
			return;
		}
		
		X31SDataBeanAccess pulldown = getServiceFormBean().getDataBeanArray(pulldownLabel).getDataBean(0);
		int length = (Integer)pulldown.sendMessage(CD_LIST_02, X31CWebConst.DATABEAN_GET_COUNT);
		for (int i = 0; i < length; i++)
		{
			String test = pulldown.sendMessageString(CD_LIST_02, X31CWebConst.DATABEAN_GET_VALUE, i);
			if (test.equals(code))
			{
				setData(this, (long)i, pulldownLabel, INDEX_02);
				return;
			}
		}
	}
	

	/**
	 * 画面遷移先を設定します。
	 * @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));
	}
	

	/**
	 * プルダウンの０番目の項目に空白を挿入します。
	 * @param pulldown プルダウンを指す項目ID
	 * @param cdList プルダウン中でコード一覧をさす項目ID
	 * @param nmList プルダウン中で名称一覧をさす項目ID
	 * @param pushString 追加する文字列
	 */
	private void pushEmptyToTopOfPulldown(String pulldown, String cdList, String nmList, String pushString)
	{
		X31SDataBeanAccess pulldownBean = super.getServiceFormBean().getDataBeanArray(pulldown).getDataBean(0);

		appendPrefix(getBean(this, pulldown), nmList);
		
		slideArrayOnDatabean(pulldownBean, cdList, "");
		slideArrayOnDatabean(pulldownBean, nmList, pushString);
	}
	
	/**
	 * データビーンの配列要素をインデックスが増加する方向に１つずらす
	 * @param bean データビーン
	 * @param listName 対象項目ID
	 * @param pushString 追加する文字列
	 */
	private void slideArrayOnDatabean(X31SDataBeanAccess bean, String listName, String pushString)
	{
		int size = (Integer)(bean.sendMessage(listName, X31CWebConst.DATABEAN_GET_COUNT));
		
		bean.sendMessageString(listName, X31CWebConst.DATABEAN_ADD_VALUE, "");
		
		for (int i = size ; i > 0 ; i--)
		{
			String target = bean.sendMessageString(listName, X31CWebConst.DATABEAN_GET_VALUE, i - 1);
			bean.sendMessageString(listName, X31CWebConst.DATABEAN_SET_VALUE, i, target);
		}
		
		bean.sendMessageString(listName, X31CWebConst.DATABEAN_SET_VALUE, 0, pushString);
	}
	

	/**
	 * スクリーンモードを設定します。
	 * @param mode スクリーンモード
	 */
	private void setScreenMode(long mode)
	{
		X31SDataBeanAccess bean = super.getServiceFormBean();
		bean.sendMessageLong(SCREEN_MODE, X31CWebConst.DATABEAN_SET_VALUE, mode);
		
		DEBUG_LOG.debug(String.format("画面モードを %d に設定します", mode));
	}
	
	
	
	/**
	 * 返品データファイルを生成します。
	 * @return 返品データファイル
	 * @throws Exception 例外
	 */
	public String buildFile() throws Exception
	{
		X31SDataBeanAccessArray datas = getServiceFormBean().getDataBeanArray(SHURI_UK_LIST_CSV);
		
		StringBuffer bodyRecords = new StringBuffer();
		int size = datas.getCount();
		for (int i = 0 ; i < size ; i++)
		{
			if (bodyRecords.length() > 0)
			{
				bodyRecords.append(LINE_SEPARATOR);
			}
			bodyRecords.append(buildDataRecord(datas.getDataBean(i), i + 1));
		}
		
		String file = join(LINE_SEPARATOR,
							buildHeaderRecord(),
							bodyRecords.toString());

		DEBUG_LOG.debug(String.format("ファイル内容：%s", file));
		
		return file;
	}
	
	/**
	 * 返品データ.csvのヘッダ行を生成します。
	 * @return ヘッダ文字列
	 */
	private String buildHeaderRecord()
	{
		return join(",",
					dqot("修理受付番号"),
					dqot("修理依頼票NO"),
					dqot("修理受付日"),
					dqot("機器製造番号"),
					dqot("修理状況"),
					dqot("最新履歴登録日"),
					dqot("SYSID"),
					dqot("契約者名"),
					dqot("型番号"),
					dqot("処置区分"));
	}
	
	/**
	 * 返品データファイルのデータレコードを生成します。
	 * @param data 行データ
	 * @param index 行番号
	 * @return 返品データファイルのデータレコード
	 */
	private String buildDataRecord(X31SDataBeanAccess data, int index) 
	{
		return join(",",
					dqot(getData(data, BTRYHOZN_NO_03)),
					dqot(getData(data, CUST_SHURI_REQ_HYO_NO_03)),
					dqot(getData(data, SHURI_UK_DAY_03)),
					dqot(getData(data, SEIZO_NO_03)),
					dqot(getData(data, SHURI_JOKYO_NM_03)),
					dqot(getData(data, LAST_TAIO_DTM_03)),
					dqot(getData(data, SYSID_03)),
					dqot(getData(data, KEISHA_NM_03)),
					dqot(getData(data, MDL_NO_03)),
					dqot(getData(data, BTRYHOZN_CD_NM_03)));
	}
	
	
	
	/**
	 * 文字列をダブルクォーテッドする
	 * @param src 囲まれる文字列
	 * @return \"囲まれる文字列\"
	 */
	private String dqot(String src)
	{
		return String.format("\"%s\"", src);
	}
}
