/********************************************************************* * All Rights reserved,Copyright (c) K-Opticom * ********************************************************************** *<プログラム内容> * システム名 :eo顧客基幹システム * モジュール名 :JBSbatACWribAmntCalc * ソースファイル名 :JBSbatACWribAmntCalc.java * 作成者 :富士通  * 作成日 :2011年06月22日 *<機能概要> * 割引額計算部品です。 *<修正履歴> * バージョン 修正日 修正者 修正内容 * v1.00.00 2011/06/22 富士通 新規作成 * v4.00.00 2013/03/11 FJ)浜口 マンション違約金対応 割引率の計算式を修正 * v5.00.00 2013/07/09 FJ) 桑島 【TG1-2013-0000662】請求年月対応 * v8.00.00 2014/03/07 FJ) 後藤 【TG1-2014-0000002】料金項目コード上1桁での判定追加 * v45.00.00 2019/08/09 FJ) 星野 【ANK-3636-14-00】100ML 即割の金額変更対応 * v59.00.00 2022/06/08 FJ) 麻生 【IT2-2022-0000003】割引値置き換え処理の適用期間判定不備対応 *********************************************************************/ package eo.business.service; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; 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.common.JBSbatInterface; import eo.business.common.JCCBatCommon; import eo.business.util.file.JBSbatACIFM058; import eo.business.util.file.JBSbatACIFM061; import eo.business.util.table.JBSbatAC_M_WRIB_PRC; import eo.common.constant.JACStrConst; 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; /** * (クラスの機能概要)

*
* @author 富士通 */ public class JBSbatACWribAmntCalc extends JBSbatBusinessService { /**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/ /** テーブル(割引料金)*/ private static final String D_TBL_NAME_AC_M_WRIB_PRC = "AC_M_WRIB_PRC"; /** SQL定義キー(AC_SELECT_001)*/ private static final String AC_M_WRIB_PRC_AC_SELECT_001 = "AC_SELECT_001"; /** テーブルアクセスクラス(割引料金)*/ private JBSbatSQLAccess db_AC_M_WRIB_PRC = null; /**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/ /**▼▼▼▼▼▼クラス変数追加 開始▼▼▼▼▼▼*/ /** 割引料金マスタ 検索結果 */ private HashMap> waribPrcInfoMap = new HashMap>(); // ANK-3636-14-00対応 20190809 星野 ADD START /** 業務パラメータ 検索結果(割引料金マスタ置き換え用) */ private HashMap workParamWaribPrcInfoMap = new HashMap(); // ANK-3636-14-00対応 20190809 星野 ADD END private static final BigDecimal hundred = new BigDecimal("100"); private static final BigDecimal minone = new BigDecimal("-1"); // ANK-3636-14-00対応 20190809 星野 ADD START /** 集計先料金サービスコード(100Mライト) */ private List SHUK_PRC_SVC_CD_100ML = Arrays.asList(new String[]{ "PA0311 " // 100Mライトコース , "PA0811 " // メゾンタイプ100Mライトコース }); /** 料金サービスコード(即割) */ private List PRC_SVC_CD_SOKUWARI = Arrays.asList(new String[]{ "WST000000014", // 即割(HT) "WST000000024" // 即割(MZ) }); // ANK-3636-14-00対応 20190809 星野 ADD END /**▲▲▲▲▲▲クラス変数追加 終了▲▲▲▲▲▲*/ /** * 初期処理 * @param JBSbatCommonItem commonItem バッチ共通パラメータ電文 * @throws Exception */ public void initial(JBSbatCommonItem commonItem) throws Exception { /**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/ /**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/ // 共通パラメータを設定します super.setCommonInfo(commonItem); // DBアクセスクラスを生成します db_AC_M_WRIB_PRC = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_M_WRIB_PRC); /**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/ // 請求年月取得 JACbatSchdlUtil schdUtil = new JACbatSchdlUtil(commonItem); // 群締め日 String wk_GunEnd = ""; try { // 料金スケジュール定義アクセス部品を使用する。 String wk_SkyuYM = schdUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD); // 群月初日、群締め日 ← JACbatSchdlUtil.getUseStrEnd(請求年月, イベントコード("01"(利用開始日)), イベントコード("02"(利用終了日))) String[] rtn = schdUtil.getUseStrEnd(wk_SkyuYM, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD); // 群締め日 wk_GunEnd = rtn[1]; } finally { // クローズ schdUtil.close(); } // DBアクセス用のパラメータ定義 JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface(); // パラメータ設定 dbList.setValue(super.systemCode); // システムコード dbList.setValue(wk_GunEnd); // 群締め日 // SELECT文発行 executeAC_M_WRIB_PRC_AC_SELECT_001(dbList.getList().toArray()); // 結果を取得 JBSbatCommonDBInterface dbMap = db_AC_M_WRIB_PRC.selectNext(); // 検索結果がなくなるまで繰り返す while (dbMap != null) { StringBuilder key = new StringBuilder(); key.append(dbMap.getString(JBSbatAC_M_WRIB_PRC.PCRS_CD)) .append(dbMap.getString(JBSbatAC_M_WRIB_PRC.PRC_SVC_CD)) .append(dbMap.getString(JBSbatAC_M_WRIB_PRC.AITAI_NO)) .append(dbMap.getString(JBSbatAC_M_WRIB_PRC.WRIB_FLR_CD)); ArrayList mstList = waribPrcInfoMap.get(key.toString()); if(mstList == null) { mstList = new ArrayList(); } mstList.add(dbMap); waribPrcInfoMap.put(key.toString(), mstList); // 次レコード取得 dbMap = db_AC_M_WRIB_PRC.selectNext(); } // アクセスクラスをクローズする db_AC_M_WRIB_PRC.close(); // ANK-3636-14-00対応 20190809 星野 ADD START // 業務パラメータ取得 HashMap paramMap = new HashMap(); JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem); try { paramMap = paramUtil.getGyoumuParameterMap2(JACStrConst.WKPRA_AC_WRIVAL_REPLACE_, super.opeDate); } finally { paramUtil.close(); } // 割引料金マスタ置き換え用に加工して保持 for(String value : paramMap.values()){ if(!JCCBatCommon.isNotNull(value)){ continue; } String[] values = value.split(":"); if(values.length != 4){ continue; } String key = values[0]; String tstaYmd = values[1]; String tendYmd = values[2]; BigDecimal wribValue = new BigDecimal(values[3]); // 群締め日が適用開始日以降であることを確認 // IT2-2022-0000003 MOD START // if(wk_GunEnd.compareTo(tstaYmd) <= 0 || wk_GunEnd.compareTo(tendYmd) >= 0 ){ if(wk_GunEnd.compareTo(tstaYmd) < 0 || wk_GunEnd.compareTo(tendYmd) > 0 ){ // IT2-2022-0000003 MOD END // 適用期間が合わなければノーヒット扱い continue; } // 割引料金マスタ置き換え用にマップ格納 JBSbatCommonDBInterface workParamWaribPrcInfo = new JBSbatCommonDBInterface(); workParamWaribPrcInfo.setValue(JBSbatAC_M_WRIB_PRC.WRIB_PRC_TSTAYMD, tstaYmd); workParamWaribPrcInfo.setValue(JBSbatAC_M_WRIB_PRC.WRIB_PRC_TENDYMD, tendYmd); workParamWaribPrcInfo.setValue(JBSbatAC_M_WRIB_PRC.WRIB_VALUE, wribValue); workParamWaribPrcInfoMap.put(key, workParamWaribPrcInfo); } // ANK-3636-14-00対応 20190809 星野 ADD END /**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/ } /** * 主処理 * @param inMap 入力電文 * @return JBSbatOutputItem 出力情報 * @throws Exception */ public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception { /**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/ JBSbatOutputItem outputBean = new JBSbatOutputItem(); // 出力共通電文 // 入力情報終了判定 if (inMap == null) { return outputBean; } // マスタ検索用の相対番号の設定をする String aitiNo = null; // 相対識別(請求先相対契約)の場合 if (JACStrConst.AITAIKBN_SEIKYU.equals(inMap.getString(JBSbatACIFM061.AIT_DIV))) { assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "相対識別(請求先相対契約)"); aitiNo = inMap.getString(JBSbatACIFM061.SEIKY_KEI_NO); // 請求先番号 // ログ出力 assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "相対番号に請求番号が設定されました。(" + aitiNo + ")"); } // 相対識別(サービス相対契約) else if(JACStrConst.AITAIKBN_SVC.equals(inMap.getString(JBSbatACIFM061.AIT_DIV))) { assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "相対識別(サービス相対契約)"); aitiNo = inMap.getString(JBSbatACIFM061.SVC_NO); // サービス番号 // ログ出力 assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "相対番号にサービス番号が設定されました。(" + aitiNo + ")" ); } else { aitiNo = JACStrConst.AITAINO_SPACE; // 相対番号(ALLスペース) // ログ出力 assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "相対番号にALLスペースが設定されました。"); } // 割引料金情報を検索する ArrayList mstList = this.getBYWbryokinMstBean(inMap, aitiNo); // 相対識別(請求先相対契約)または相対識別(サービス相対契約)の場合で、該当データなしの場合、相対番号をスペースでパディングして再検索 if (JBSbatInterface.isNull(mstList) && (JACStrConst.AITAIKBN_SEIKYU.equals(inMap.getString(JBSbatACIFM061.AIT_DIV)) || JACStrConst.AITAIKBN_SVC.equals(inMap.getString(JBSbatACIFM061.AIT_DIV)))) { // 対象キー:相対番号の設定 aitiNo = JACStrConst.AITAINO_SPACE; // 相対番号(ALLスペース) // ログ出力 assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "相対番号にALLスペースが設定されました。"); // 割引料金情報を取得する mstList = this.getBYWbryokinMstBean(inMap, aitiNo); } // 割引料金情報が存在しない場合 if (mstList == null) { assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "割引料金情報なし"); return outputBean; } String prcKmkCd = inMap.getString(JBSbatACIFM061.SHUK_PRC_KMK_CD); if(prcKmkCd != JACStrConst.KARA_MOJI) { // マスタ件数分ループ for(JBSbatCommonDBInterface mstMap : mstList) { JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap(); // 料金項目コード上1桁が異なる場合出力対象外 if(!prcKmkCd.substring(0, 1).equals(mstMap.getString(JBSbatAC_M_WRIB_PRC.WRIBPRC_KMK_CD).substring(0, 1))) { continue; } outMap.getMap().putAll(inMap.getMap()); // 出力情報設定処理 this.setOutputCmnData(outMap, mstMap); // 割引料金の算出と設定 this.setWribPrc(outMap, mstMap); // レコード出力判定フラグの設定 outMap.setOutFlg(true); // 出力レコード情報を設定する outputBean.addOutMapList(outMap); } } return outputBean; /**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/ } /** * 業務サービス終了処理 * @throws Exception */ public void terminal() throws Exception { /**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/ /**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/ // DBアクセスクラスをクローズします db_AC_M_WRIB_PRC.close(); /**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/ /**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/ } /**▼▼▼▼▼▼メソッド追加 開始▼▼▼▼▼▼*/ /** * 割引料金を算出し、算出した割引料金を出力情報に設定します。 * * @param returnMap 出力情報 * @param inMap 入力電文 * @param mstMap 割引料金情報 * @throws Exception 業務サービス内で発生した例外全般 */ private void setWribPrc(JBSbatServiceInterfaceMap inMap, JBSbatCommonDBInterface mstMap) throws Exception { // ANK-3636-14-00対応 20190809 星野 MOD START // BigDecimal wribValue = mstMap.getBigDecimal(JBSbatAC_M_WRIB_PRC.WRIB_VALUE); // 割引値 // 入力電文から集計料金サービスコードを取得 String shukPrcSvcCd = inMap.getString(JBSbatACIFM061.SHUK_PRC_SVC_CD); // 割引料金マスタから料金サービスコードを取得 String prcSvcCd = mstMap.getString(JBSbatAC_M_WRIB_PRC.PRC_SVC_CD); BigDecimal wribValue; // 割引値 // 集計料金サービスコードが100Mライト かつ 料金サービスコードが即割の場合 if( SHUK_PRC_SVC_CD_100ML.contains(shukPrcSvcCd) && PRC_SVC_CD_SOKUWARI.contains(prcSvcCd)){ // 100Mライト即割に対応するため、割引額の置き換えを考慮する wribValue = getReplacedWribValue(mstMap, shukPrcSvcCd); // 上記以外はこれまでどおり割引料金マスタから取得 }else{ wribValue = mstMap.getBigDecimal(JBSbatAC_M_WRIB_PRC.WRIB_VALUE); } // ANK-3636-14-00対応 20190809 星野 MOD END String wribCalcWay = mstMap.getString(JBSbatAC_M_WRIB_PRC.WRIB_CALC_WAY_CD); // 割引計算方法コード BigDecimal prc = inMap.getBigDecimal(JBSbatACIFM061.PRC); // 料金 assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "割引値:" + wribValue ); assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "割引計算方法コード:" + wribCalcWay ); assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "料金:" + prc ); // 割引計算方法コード = "1"(置換割引_置換型)または"2"(置換割引_値引型)の場合 if (JACStrConst.WRIB_CALC_CD_CW_CKN.equals(wribCalcWay) || JACStrConst.WRIB_CALC_CD_CW_NBK.equals(wribCalcWay)) { assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "置換割引"); // 割引後料金が対象料金以上だった場合 if (wribValue.compareTo(prc) >= 0) { assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "割引後料金が対象料金以上 割引額<- 0"); inMap.setBigDecimal(JBSbatACIFM058.PRC, BigDecimal.ZERO); // 割引額 } else { assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "料金(" + prc + ") - 割引額(" + wribValue + ") * -1" ); inMap.setBigDecimal(JBSbatACIFM058.PRC, prc.subtract(wribValue).negate()); // 対象料金と割引後料金の差異を料金(割引額)に設定 // prc - wribValue * -1 } } // 割引計算方法コード = "3"(金額割引_置換型)または"4"(金額割引_値引型)の場合 else if (JACStrConst.WRIB_CALC_CD_PW_CKN.equals(wribCalcWay) || JACStrConst.WRIB_CALC_CD_PW_NBK.equals(wribCalcWay)) { assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "金額割引"); assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "金額割引適用 (" + wribValue + ")"); inMap.setBigDecimal(JBSbatACIFM058.PRC, wribValue); // 料金(割引額) } // 割引計算方法コード = "5"(率割引_置換型)または"6"(率割引_値引型)の場合 else { // 割引額算出(小数点第一位切上げ) BigDecimal wribAmnt = JACbatRknBusinessUtil.round(JACStrConst.ROUND_UP, (prc.multiply(wribValue).divide(hundred)).multiply(minone), 0); assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "率割引からの割引額:" + wribAmnt ); // 割引額の設定 inMap.setBigDecimal(JBSbatACIFM058.PRC, wribAmnt); // 料金(割引額) } } // ANK-3636-14-00対応 20190809 星野 ADD START /** * 割引料金マスタに対応する業務パラメータの設定を確認し、設定があれば業務パラメータから取得した割引値を返却します。 * @param mstMap 割引料金マスタ * @param shukPrcSvcCd 集計料金サービスコード * @return 業務パラメータから取得した割引値 設定がなければ割引料金マスタから取得した割引値 * @throws Exception */ private BigDecimal getReplacedWribValue(JBSbatCommonDBInterface mstMap, String shukPrcSvcCd) throws Exception{ BigDecimal wribValue = mstMap.getBigDecimal(JBSbatAC_M_WRIB_PRC.WRIB_VALUE); // 割引値 // 割引料金マスタのキー項目と集計料金サービスコードを結合してキーとする StringBuilder key = new StringBuilder(); key.append(mstMap.getString(JBSbatAC_M_WRIB_PRC.PCRS_CD)) .append(mstMap.getString(JBSbatAC_M_WRIB_PRC.PRC_SVC_CD)) .append(mstMap.getString(JBSbatAC_M_WRIB_PRC.WRIB_SHUK_CD)) .append(mstMap.getString(JBSbatAC_M_WRIB_PRC.WRIB_FLR_CD)) .append(shukPrcSvcCd) ; // 業務パラメータから対応するレコードを取得 JBSbatCommonDBInterface workParamMap = workParamWaribPrcInfoMap.get(key.toString()); if(workParamMap != null){ // 該当があれば、割引料金マスタから取得した割引値を業務パラメータ取得値で置き換える wribValue = workParamMap.getBigDecimal(JBSbatAC_M_WRIB_PRC.WRIB_VALUE); } return wribValue; } /** * 出力情報を設定します。
* * @param returnMap 出力情報 * @param inMap 入力電文 * @param mstMap 割引料金情報 * @throws Exception 業務サービス内で発生した例外全般 */ private void setOutputCmnData(JBSbatServiceInterfaceMap inMap, JBSbatCommonDBInterface mstMap) throws Exception { // 割引料金情報の設定 inMap.setString(JBSbatACIFM058.SVC_CD, inMap.getString(JBSbatACIFM061.WRIB_SVC_SKBT)); // サービス識別 inMap.setString(JBSbatACIFM058.PRC_GRP_CD, inMap.getString(JBSbatACIFM061.SHUK_PRC_GRP_CD)); // 料金グループコード inMap.setString(JBSbatACIFM058.PCRS_CD, inMap.getString(JBSbatACIFM061.WRIB_PCRS_CD)); // 料金コースコード inMap.setString(JBSbatACIFM058.PRC_SVC_CD, inMap.getString(JBSbatACIFM061.WRIB_PRC_SVC_CD)); // 料金サービスコード inMap.setString(JBSbatACIFM058.PRC_KMK_CD, mstMap.getString(JBSbatAC_M_WRIB_PRC.WRIBPRC_KMK_CD)); // 料金項目コード inMap.setString(JBSbatACIFM058.COLLECT_PATTERN_CD, mstMap.getString(JBSbatAC_M_WRIB_PRC.COLLECT_PATTERN_CD)); // 徴収パターンコード inMap.setString(JBSbatACIFM058.USE_FAIL_APLY_KH, mstMap.getString(JBSbatAC_M_WRIB_PRC.USE_FAIL_APLY_WAY_CD)); // 利用不可適用可否 inMap.setString(JBSbatACIFM058.MAEUKE_SOSAI_YUSEN_JUN, "0"); // 前受相殺優先順位 inMap.setString(JBSbatACIFM058.WRIB_KKSHI_KH, mstMap.getString(JBSbatAC_M_WRIB_PRC.WRIB_KKSHI_KH)); // 割引繰越可否 inMap.setString(JBSbatACIFM058.WRIB_CALC_WAY_CD, mstMap.getString(JBSbatAC_M_WRIB_PRC.WRIB_CALC_WAY_CD)); // 割引計算方法コード inMap.setString(JBSbatACIFM058.UPPL_JUDGE_YUSEN_JUN, mstMap.getString(JBSbatAC_M_WRIB_PRC.UPPL_JUDGE_YUSEN_JUN)); // 上限判定優先順位 } /** * 割引料金情報を取得します。
* * @param inMap 割引対象情報 * @param aitiNo 相対番号 * @return ArrayList 割引料金情報 * @throws Exception 業務サービス内で発生した例外全般 */ private ArrayList getBYWbryokinMstBean(JBSbatServiceInterfaceMap inMap, String aitiNo) throws Exception { assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S] getBYWbryokinMstBean"); StringBuilder key = new StringBuilder(); key.append(inMap.getString(JBSbatACIFM061.WRIB_PCRS_CD)) .append(inMap.getString(JBSbatACIFM061.WRIB_PRC_SVC_CD)) .append(aitiNo) .append(inMap.getString(JBSbatACIFM061.WRIB_FLR_CD)); return waribPrcInfoMap.get(key.toString()); } /**▲▲▲▲▲▲メソッド追加 終了▲▲▲▲▲▲*/ /**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/ /** * SQLKEY(AC_SELECT_001)でDBアクセスを行います。
*

* 処理フロー
*

	 * 1.引数でバイント変数を設定します。
* * 2.DBアクセスを実行します。
* * 3.メソッドの呼び出し方です。
* 引数: * param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。 * システムコード * バッチ運用日 *
*

* @param param バイント変数の値配列。 * @throws Exception 業務サービス内で発生した例外全般。 */ private void executeAC_M_WRIB_PRC_AC_SELECT_001(Object[] param) throws Exception { // バイント変数のリストを生成します JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface(); paramList.setValue(param[0].toString()); paramList.setValue(param[1].toString()); // DBアクセスを実行します db_AC_M_WRIB_PRC.selectBySqlDefine(paramList, AC_M_WRIB_PRC_AC_SELECT_001); } /**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/ }