/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom  					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACTeizoPrcCalc
*	ソースファイル名	：JBSbatACTeizoPrcCalc.java
*	作成者				：富士通　
*	作成日				：2011年05月11日
*＜機能概要＞
*　逓増料金計算部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/05/11   富士通		新規作成
*	v3.00.00	2012/08/06   FJ) 岡田	【TAI-2012-0000054】性能改善
*	v5.00.00	2013/07/09   FJ) 桑島	【TG1-2013-0000662】請求年月対応
*	v55.00.00	2021/10/01   FJ) 吉田	【ANK-4146-00-00】【eo定期】多機能ルーター枯渇対応 STEP2
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JACbatRknBusinessUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFI016;
import eo.business.util.file.JBSbatACIFM221;
import eo.business.util.table.JBSbatAC_M_TEIZO_PRC;
import eo.common.constant.JACStrConst;
import eo.common.util.JPCUtilCommon;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACTeizoPrcCalc extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(逓増料金)*/
	private static final String D_TBL_NAME_AC_M_TEIZO_PRC = "AC_M_TEIZO_PRC";

	/** SQL定義キー(AC_SELECT_001)*/
	private static final String AC_M_TEIZO_PRC_AC_SELECT_001 = "AC_SELECT_001";

	/** テーブルアクセスクラス(逓増料金)*/
	private JBSbatSQLAccess db_AC_M_TEIZO_PRC = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/**▼▼▼▼▼▼クラス変数追加 開始▼▼▼▼▼▼*/	

	/** 逓増料金マスタマップ */
	private HashMap<ArrayList<String>, List<JBSbatCommonDBInterface>> teizouMap = null;

	/**  利用月翌月月初日 */
	private String nextCycTukiSt	= null;

	/**  休止料金 */
	private String[] pausePrc	= null;

	/**  休止料金プランマップ */
	private HashMap<String, String[]> pausePplanMap	= null;
	
	/** 出力フラグ */
	boolean outputFlg = false;
	
	/** 群締め日 */
	private String wk_GunEnd 	= null;
	
	/**▲▲▲▲▲▲クラス変数追加 終了▲▲▲▲▲▲*/

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_AC_M_TEIZO_PRC = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_M_TEIZO_PRC);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		
		// 料金スケジュール定義アクセス部品初期処理
		JACbatSchdlUtil schdlUtil = new JACbatSchdlUtil(commonItem);
		
		try
		{		
		
			// 請求年月を取得する
			String seikyYm = schdlUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);
			
			// 請求年月から、終了日取得
			String[] startEndYmd = schdlUtil.getUseStrEnd(seikyYm, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);
			
			wk_GunEnd = startEndYmd[1];
			
			// ＋1日して翌月月初日をもとめる
			nextCycTukiSt = JPCUtilCommon.addDay(startEndYmd[1], 1);
		
		}
		finally
		{
			// 料金スケジュール定義アクセス部品クローズ
			schdlUtil.close();
		}
		
		// 逓増マスタより段階情報を取得しメモリに保持する（TAI-2012-0000054）
		teizouMap =getBYTeizouMst();
		
		//休止料金プラン取得
		getPausePplan();
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "利用月翌月月初日：" + nextCycTukiSt);
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		JBSbatOutputItem outputItem = new JBSbatOutputItem(); // 出力共通電文
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "入力：" + JPCUtilCommon.convMapToString(inMap.getMap()));
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "請求契約番号      ：" + inMap.getString(JBSbatACIFM221.SEIKY_KEI_NO));
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "料金コースコード  ：" + inMap.getString(JBSbatACIFM221.PCRS_CD));
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "料金サービスコード：" + inMap.getString(JBSbatACIFM221.PRC_SVC_CD));
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "料金項目コード    ：" + inMap.getString(JBSbatACIFM221.PRC_KMK_CD));
		
		// 逓増マップ入れ替え処理を削除（TAI-2012-0000054）
		
		// 対象の逓増料金情報を取得する
		List<JBSbatCommonDBInterface> outRetList = getTeizoMstList(inMap);

		if (outRetList == null)
		{
			assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] 逓増料金段階情報 なし");
			return outputItem;
		}
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] 逓増料金段階情報 あり");
		
		// 出力レコード情報を設定する
		getOutput(inMap, outRetList, outputItem);
		
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_AC_M_TEIZO_PRC.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(AC_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 executeAC_M_TEIZO_PRC_AC_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_AC_M_TEIZO_PRC.selectBySqlDefine(paramList, AC_M_TEIZO_PRC_AC_SELECT_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**▼▼▼▼▼▼メソッド追加 開始▼▼▼▼▼▼*/
	
	/**
	 * 逓増料金マスタデータ取得します。
	 * 
	 * 以下の項目単位で逓増料金のリストを作成しマップに格納します。
	 * ・料金コースコード
	 * ・料金サービスコード
	 * ・相対番号
	 * ・対象料金項目コード
	 * 
	 * @param inMap 入力電文
	 * @return JBSbatSQLAccessBean 逓増料金マスタデータ
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private HashMap<ArrayList<String>, List<JBSbatCommonDBInterface>> getBYTeizouMst() throws Exception
	{
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getBYTeizouMst]");
		
		// 逓増料金マスタのデータを格納したマップ
		HashMap<ArrayList<String>, List<JBSbatCommonDBInterface>> createMap = new HashMap<ArrayList<String>, List<JBSbatCommonDBInterface>>(101);
		
		// DBアクセス用のパラメータ定義
		JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();
		dbList.setValue(super.systemCode); // システムコード（AC）
		dbList.setValue(JACStrConst.SYS_CD_AZ); // システムコード（AZ）
		dbList.setValue(this.wk_GunEnd); 	// 群締め日

		// 逓増料金マスタデータ取得
		executeAC_M_TEIZO_PRC_AC_SELECT_001(dbList.getList().toArray());

		// 結果取得の定義
		JBSbatCommonDBInterface dbMap = db_AC_M_TEIZO_PRC.selectNext();
		
		// 検索結果がなくなるまで繰り返す
		while (dbMap != null)
		{
			// マップキーの再構築
			// 逓増マップのキー構成を変更（TAI-2012-0000054）
			ArrayList<String> mapKey = new ArrayList<String>(4);
			mapKey.add(dbMap.getString(JBSbatAC_M_TEIZO_PRC.PCRS_CD));		// 料金コースコード
			mapKey.add(dbMap.getString(JBSbatAC_M_TEIZO_PRC.PRC_SVC_CD));	// 料金サービスコード
			mapKey.add(dbMap.getString(JBSbatAC_M_TEIZO_PRC.AITAI_NO));		// 相対番号
			mapKey.add(dbMap.getString(JBSbatAC_M_TEIZO_PRC.TG_PRC_KMK_CD));// 対象料金項目コード
			
			// メモリからデータを格納したリストを抽出
			List<JBSbatCommonDBInterface> teizouList = createMap.get(mapKey);
			
			if (teizouList == null)
			{
				// 存在しない場合はリストを生成
				teizouList = new ArrayList<JBSbatCommonDBInterface>();
			}
			
			// リストにデータを格納
			teizouList.add(dbMap);
			
			// 逓増マスタマップにデータを格納
			createMap.put(mapKey, teizouList);
			
			// 次レコード取得
			dbMap = db_AC_M_TEIZO_PRC.selectNext();
		}
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getBYTeizouMst] 逓増マップ格納件数：" + createMap.size());
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getBYTeizouMst]");
		
		// 逓増料金マスタデータの返却
		return createMap;
	}
	
	/**
	 * 休止料金プラン取得
	 * 
	 * @throws Exception
	 */
	private void getPausePplan() throws Exception
	{
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getPausePplan]");
		
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		
		// ANK-4146-00-00 2021/10/11 ADD START 
		pausePplanMap = new HashMap<String, String[]>();
		
		HashMap<String, String> wkParaPausePplanMap = paramUtil.getGyoumuParameterMap(JACStrConst.WKPARA_AC_WKS_TEIZO_PAUSE, super.opeDate);
		Object[] keySet = wkParaPausePplanMap.keySet().toArray();
		
		for (int j = 0; j < keySet.length; j++)
		{
			// ANK-4146-00-00 2021/10/11 ADD END
			// 業パラから、休止料金プランコードを取得し、カンマ・セミコロンで分割する。
			// ANK-4146-00-00 2021/10/11 MOD START
			// String wkParaPausePplan = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_WKS_TEIZO_PAUSE);
			String wkParaPausePplan = wkParaPausePplanMap.get(keySet[j].toString());
			// ANK-4146-00-00 2021/10/11 MOD END
			
			assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getPausePplan][wkParaPausePplan:" + wkParaPausePplan +"]");
			
			String[] wkParaList = wkParaPausePplan.split(JACStrConst.COMMA, -1);
			
			// ANK-4146-00-00 2021/10/11 DEL START 初期化位置を↑に移動
			// pausePplanMap = new HashMap<String, String[]>();
			// ANK-4146-00-00 2021/10/11 DEL END
			
			// 休止料金プランマップ作成
			for(int i = 0 ; i < wkParaList.length ; i++ )
			{
				String[] pauseList = wkParaList[i].split(JACStrConst.COLON, -1);
				String[] pausePrc = {pauseList[1], pauseList[2]};
				pausePplanMap.put(pauseList[0], pausePrc);
			}
		}
		
		paramUtil.close();
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getPausePplan]");
	}
	
	/**
	 * 相対区分を判断し、逓増料金マスタのリストを取得します。
	 * 
	 * @param inMap 入力電文
	 * @return List<JBSbatCommonDBInterface> 逓増料金マスタのリスト
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private List<JBSbatCommonDBInterface> getTeizoMstList(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getTeizoMstList]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getTeizoMstList] 相対区分：" + inMap.getString(JBSbatACIFM221.AIT_DIV));
		
		// テーブルアクセスクラス格納領域
		List<JBSbatCommonDBInterface> outRetList = null;
		// 対象キー：相対番号の設定
		String aitaiNo = null;
		if (JACStrConst.AITAIKBN_SEIKYU.equals(inMap.getString(JBSbatACIFM221.AIT_DIV)))
		{ // 相対区分="2"（請求先番号）の場合
			aitaiNo = inMap.getString(JBSbatACIFM221.SEIKY_KEI_NO); // 請求先番号
		}
		else if (JACStrConst.AITAIKBN_SVC.equals(inMap.getString(JBSbatACIFM221.AIT_DIV)))
		{ // 相対区分="3"（サービス番号）の場合
			aitaiNo = inMap.getString(JBSbatACIFM221.SVC_NO); // サービス番号
		}
		else
		{
			aitaiNo = JACStrConst.AITAINO_SPACE; // 相対番号（ALLスペース）
		}
		
		// 逓増マップアクセスキー
		// キー構成を変更（TAI-2012-0000054）
		ArrayList<String> mapKey = new ArrayList<String>(4);
		mapKey.add(inMap.getString(JBSbatACIFM221.PCRS_CD));	// 0.料金コースコード
		mapKey.add(inMap.getString(JBSbatACIFM221.PRC_SVC_CD));	// 1.料金サービスコード
		mapKey.add(aitaiNo);									// 2.相対番号
		mapKey.add(inMap.getString(JBSbatACIFM221.PRC_KMK_CD));	// 3.料金項目コード
		
		// 逓増料金マスタデータ取得
		outRetList = teizouMap.get(mapKey);

		// 相対区分="1"（無）以外の場合で、該当データなしの場合、相対番号をスペースでパディングして再検索
		if (outRetList == null && !JACStrConst.AITAIKBN_NON.equals(inMap.getString(JBSbatACIFM221.AIT_DIV)))
		{
			// 対象キー：相対番号の設定
			aitaiNo = JACStrConst.AITAINO_SPACE; // 相対番号（ALLスペース）
			mapKey.set(2, aitaiNo);				 // 2.相対番号
			
			// 逓増料金マスタデータ再取得
			outRetList = teizouMap.get(mapKey);
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getTeizoMstList] 検索キー：" + JPCUtilCommon.convListToString(mapKey));
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getTeizoMstList]");
		
		// 取得した逓増料金リストを返却する
		return outRetList;
	}
	
	/**
	 * 出力内容を取得します。
	 * 
	 * @param inMap 入力電文
	 * @param outRetList 逓増料金マスタのリスト
	 * @return JBSbatServiceInterfaceMap 入出力データを格納するマップ
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void getOutput(JBSbatServiceInterfaceMap inMap, List<JBSbatCommonDBInterface> outRetList, JBSbatOutputItem outputItem) throws Exception
	{
		// 出力フラグ初期化
		outputFlg = false;
		
		// 取得データの一件目を参照する
		JBSbatCommonDBInterface dbRetMap = outRetList.get(0);

		inMap.setString(JBSbatACIFI016.PRC_KMK_CD,				dbRetMap.getString(JBSbatAC_M_TEIZO_PRC.PRC_KMK_CD)); 			// 料金項目コード
		inMap.setString(JBSbatACIFI016.COLLECT_PATTERN_CD,		dbRetMap.getString(JBSbatAC_M_TEIZO_PRC.COLLECT_PATTERN_CD)); 	// 徴収パターンコード
		inMap.setString(JBSbatACIFI016.USE_APLY_KH_CD,			dbRetMap.getString(JBSbatAC_M_TEIZO_PRC.USE_FAIL_APLY_WAY_CD));	// 利用不可適用可否
		inMap.setString(JBSbatACIFI016.MAE_YUSEN_JUN,			JACStrConst.MAE_YUSEN_JUN_0); 									// 前受相殺優先順位
		inMap.setString(JBSbatACIFI016.WRIB_YUSEN_JUN,			JACStrConst.WRIB_YUSEN_JUN_0);									// 割引優先順位
		inMap.setString(JBSbatACIFI016.UPPL_JUDGE_YUSEN_JUN,	JACStrConst.KARA_MOJI); 										// 上限判定優先順位
		inMap.setString(JBSbatACIFI016.WRIB_KKSHI_KH,			JACStrConst.WRIB_KKS_H); 										// 割引繰越可否
		
		// システムコード　＝　AZ以外　の場合
		if(!JACStrConst.SYS_CD_AZ.equals(dbRetMap.getString(JBSbatAC_M_TEIZO_PRC.SYS_CD)))
		{
			teizoPrc(inMap, outRetList, outputItem);
		}
		// システムコード　＝　AZ　の場合
		else
		{
			makeOutMapAz(inMap, outRetList, outputItem);
		}
	}
	
	/**
	 * 休止判定します。
	 * 
	 * @param inMap 入力電文
	 * @param dbMap 逓増料金マスタ
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void pauseJudge(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "休止判定");
		
		pausePrc = null;
		String prcSvcCd = inMap.getString(JBSbatACIFM221.PRC_SVC_CD).trim();
		
		if(!pausePplanMap.containsKey(prcSvcCd))
		{
			return;
		}
		
		String svcPauseDay		= inMap.getString(JBSbatACIFM221.SVC_PAUSE_DAY);	// サービス休止日
		String svcPauseRlsDay 	= inMap.getString(JBSbatACIFM221.SVC_PAUSE_RLS_YMD);// サービス休止解除日
		
		// サービス休止日、サービス休止解除日ともに未設定の場合
		if(svcPauseDay.equals(JACStrConst.KARA_MOJI) && svcPauseRlsDay.equals(JACStrConst.KARA_MOJI))
		{
			// 休止なし
		}
		// サービス休止日のみ設定されている場合
		else if(!svcPauseDay.equals(JACStrConst.KARA_MOJI) && svcPauseRlsDay.equals(JACStrConst.KARA_MOJI))
		{
			// 課金対象サービス契約情報．サービス休止日 ≧ 初期処理で求めた利用月翌月月初日 の場合
			if(svcPauseDay.compareTo(nextCycTukiSt) >= 0)
			{
				// 休止なし
			}
			else
			{
				pausePrc = pausePplanMap.get(prcSvcCd);
			}
		}
		// サービス休止日、サービス休止解除日ともに設定されている場合
		else if(!svcPauseDay.equals(JACStrConst.KARA_MOJI) && !svcPauseRlsDay.equals(JACStrConst.KARA_MOJI))
		{
			// 課金対象サービス契約情報．サービス休止日 ≧ 初期処理で求めた利用月翌月月初日 の場合
			if(svcPauseDay.compareTo(nextCycTukiSt) >= 0)
			{
				// 休止なし
			}
			// サービス休止解除日  ≧  初期処理で求めた利用月翌月月初日の場合
			else if(svcPauseRlsDay.compareTo(nextCycTukiSt) >= 0)
			{
				pausePrc = pausePplanMap.get(prcSvcCd);
			}
			else
			{
				// 休止なし
			}
		}
	}
	
	/**
	 * 逓増料金を取得します。
	 * 
	 * @param inMap 入力電文
	 * @param outRetList 逓増料金マスタのリスト
	 * @return long 逓増料金計算結果
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void teizoPrc(JBSbatServiceInterfaceMap inMap, List<JBSbatCommonDBInterface> outRetList, JBSbatOutputItem outputItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "逓増料金算出");
		/** 逓増料金算出 * */
		BigDecimal teizouRyokin = BigDecimal.ZERO; // 逓増料金
		
		for (JBSbatCommonDBInterface outRet : outRetList) 
		{
			
			// 段階利用数計算
			BigDecimal ryokin 		= inMap.getBigDecimal(JBSbatACIFM221.PRC); 							// 料金（数量）
			BigDecimal wRyokin 		= inMap.getBigDecimal(JBSbatACIFM221.PRC); 							// ワーク料金（数量）
			BigDecimal upper 		= new BigDecimal(outRet.getString(JBSbatAC_M_TEIZO_PRC.UPPL_VALUE)); 	// 上限値
			BigDecimal lower 		= new BigDecimal(outRet.getString(JBSbatAC_M_TEIZO_PRC.LOWL_VALUE)); 	// 下限値
			BigDecimal riyoCount 	= BigDecimal.ZERO; 												// 利用数
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "上限値:" + upper + "、下限値:" + lower);
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "ワーク料金（数量）:" + wRyokin);
			// 料金（数量）≧上限値
			if (ryokin.compareTo(upper) >= 0)
			{
				wRyokin = upper.subtract(BigDecimal.ONE);
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "料金（数量）≧上限値　のため、ワーク料金（数量）←上限値 - 1");
			}
			// 下限値≦ワーク料金＜上限値
			if (lower.compareTo(wRyokin) <= 0 && wRyokin.compareTo(upper) < 0)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "下限値≦ワーク料金（数量）＜上限値");
				// 下限値＝０
				if (lower.compareTo(BigDecimal.ZERO) == 0)
				{
					riyoCount = wRyokin.subtract(lower);
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "下限値＝０　のため、利用数←ワーク料金（数量）- 下限値  ＝" + riyoCount);
				}
				// 下限値≠０
				else
				{
					riyoCount = wRyokin.subtract(lower).add(BigDecimal.ONE);
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "下限値≠０　のため、利用数←ワーク料金（数量）- 下限値＋1  ＝" + riyoCount);
				}
				
				// 逓増料金計算
				// 利用単位数（有効桁数小数点第4位まで）
				BigDecimal unitCount = riyoCount.divide(new BigDecimal(outRet.getString(JBSbatAC_M_TEIZO_PRC.TANI)), 4, BigDecimal.ROUND_HALF_EVEN);
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "利用単位数←利用数／単位  ＝" + unitCount);
				
				// 単価
				BigDecimal price = outRet.getBigDecimal(JBSbatAC_M_TEIZO_PRC.TANKA);
				
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "単価:" + price);
				
				// 利用単位数（切り上げ）＊単価
				teizouRyokin = teizouRyokin.add(JACbatRknBusinessUtil.round(JACStrConst.ROUND_UP, unitCount, 0).multiply(price));
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "ワーク逓増料金←ワーク逓増料金＋（利用単位数（切り上げ）＊単価）  ＝" + teizouRyokin);
				
				outputFlg = true;
			}
		}
		
		inMap.setBigDecimal(JBSbatACIFI016.PRC, teizouRyokin);		// 料金
		
		// レコード出力判定フラグの設定
		inMap.setOutFlg(true);
		
		if(outputFlg)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "出力");
			outputItem.addOutMapList(inMap);
		}
	}
	
	/**
	 * 逓増料金マスタ．システムコード＝AZの場合の出力情報を作成する
	 * 
	 * @param inMap 入力情報
	 * @param outRetList 逓増料金マスタ
	 * @param outputItem 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void makeOutMapAz(JBSbatServiceInterfaceMap inMap, List<JBSbatCommonDBInterface> outRetList, JBSbatOutputItem outputItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[makeOutMapAz][S]");
		
		// 休止判定
		pauseJudge(inMap);
		
		// 休止ありの場合
		if(pausePrc != null)
		{
			// 休止料金＝0　の場合、出力対象外
			if(pausePrc[0].equals("0"))
			{
				return;
			}
			inMap.setString(JBSbatACIFI016.PRC_KMK_CD, pausePrc[1]);	// 休止料金項目コード
		}
		
		BigDecimal ryokin 		= inMap.getBigDecimal(JBSbatACIFM221.PRC); 							// 料金（数量）
		BigDecimal wRyokin 		= inMap.getBigDecimal(JBSbatACIFM221.PRC); 							// ワーク料金（数量）
		
		for (JBSbatCommonDBInterface outRet : outRetList) 
		{
			// 段階利用数計算
			BigDecimal upper 		= new BigDecimal(outRet.getString(JBSbatAC_M_TEIZO_PRC.UPPL_VALUE)); 	// 上限値
			BigDecimal lower 		= new BigDecimal(outRet.getString(JBSbatAC_M_TEIZO_PRC.LOWL_VALUE)); 	// 下限値
			BigDecimal riyoCount 	= BigDecimal.ZERO; 														// 利用数
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "上限値:" + upper + "、下限値:" + lower);
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "ワーク料金（数量）:" + wRyokin);
			// 料金（数量）≧上限値
			if (ryokin.compareTo(upper) >= 0)
			{
				wRyokin = upper.subtract(BigDecimal.ONE);
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "料金（数量）≧上限値　のため、ワーク料金（数量）←上限値 - 1");
			}
			// 下限値≦ワーク料金＜上限値
			if (lower.compareTo(wRyokin) <= 0 && wRyokin.compareTo(upper) < 0)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "下限値≦ワーク料金（数量）＜上限値");
				// 下限値＝０
				if (lower.compareTo(BigDecimal.ZERO) == 0)
				{
					riyoCount = wRyokin.subtract(lower);
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "下限値＝０　のため、利用数←ワーク料金（数量）- 下限値  ＝" + riyoCount);
				}
				// 下限値≠０
				else
				{
					riyoCount = wRyokin.subtract(lower).add(BigDecimal.ONE);
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "下限値≠０　のため、利用数←ワーク料金（数量）- 下限値＋1  ＝" + riyoCount);
				}
				
				// 逓増料金計算
				// 利用単位数（有効桁数小数点第4位まで）
				BigDecimal unitCount = riyoCount.divide(new BigDecimal(outRet.getString(JBSbatAC_M_TEIZO_PRC.TANI)), 4, BigDecimal.ROUND_HALF_EVEN);
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "利用単位数←利用数／単位  ＝" + unitCount);
				
				BigDecimal price = null;
				
				if(pausePrc != null)
				{
					// 単価
					price = new BigDecimal(pausePrc[0]);
				}
				else
				{
					price = outRet.getBigDecimal(JBSbatAC_M_TEIZO_PRC.TANKA);
				}
				
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "単価:" + price);
				
				for(int i = 0; i < unitCount.intValue(); i++)
				{
					JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
					outMap.getMap().putAll(inMap.getMap());
					
					outMap.setBigDecimal(JBSbatACIFI016.PRC, price);		// 料金
					
					outMap.setOutFlg(true);
					outputItem.addOutMapList(outMap);
				}
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[makeOutMapAz][E]");
	}
	/**▲▲▲▲▲▲メソッド追加 終了▲▲▲▲▲▲*/

}
