Sfoglia il codice sorgente

优化 枣庄需求 滞纳金 计算方式修改

java110 4 anni fa
parent
commit
bd09ba3723

+ 142 - 0
service-fee/src/main/java/com/java110/fee/discount/impl/LateFeeZaoZhuangPropertyByDayRule.java

@@ -0,0 +1,142 @@
+/*
+ * Copyright 2017-2020 吴学文 and java110 team.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.java110.fee.discount.impl;
+
+import com.java110.core.smo.IComputeFeeSMO;
+import com.java110.dto.fee.FeeDto;
+import com.java110.dto.feeDiscount.ComputeDiscountDto;
+import com.java110.dto.feeDiscount.FeeDiscountDto;
+import com.java110.dto.feeDiscount.FeeDiscountSpecDto;
+import com.java110.fee.discount.IComputeDiscount;
+import com.java110.intf.fee.IFeeInnerServiceSMO;
+import com.java110.utils.util.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @desc add by 吴学文 12:43
+ */
+@Component(value = "lateFeeByDayRule")
+public class LateFeeZaoZhuangPropertyByDayRule implements IComputeDiscount {
+    /**
+     * 89002020980001	102020001	月份
+     * 89002020980002	102020001	打折率
+     */
+    private static final String SPEC_RATE = "89002020980005"; // 打折率
+
+
+    @Autowired
+    private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
+
+    @Autowired
+    private IComputeFeeSMO computeFeeSMOImpl;
+
+    @Override
+    public ComputeDiscountDto compute(FeeDiscountDto feeDiscountDto) {
+        List<FeeDiscountSpecDto> feeDiscountSpecDtos = feeDiscountDto.getFeeDiscountSpecs();
+        if (feeDiscountSpecDtos.size() < 1) {
+            return null;
+        }
+        double rate = 0.0;
+        for (FeeDiscountSpecDto feeDiscountSpecDto : feeDiscountSpecDtos) {
+            if (SPEC_RATE.equals(feeDiscountSpecDto.getSpecId())) {
+                rate = Double.parseDouble(feeDiscountSpecDto.getSpecValue());
+            }
+        }
+
+        FeeDto feeDto = new FeeDto();
+        feeDto.setCommunityId(feeDiscountDto.getCommunityId());
+        feeDto.setFeeId(feeDiscountDto.getFeeId());
+        List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
+
+        Date curTime = DateUtil.getCurrentDate();
+
+        Date endTime = feeDtos.get(0).getEndTime();
+
+        if (endTime.getTime() > curTime.getTime()) {
+            ComputeDiscountDto computeDiscountDto = new ComputeDiscountDto();
+            computeDiscountDto.setDiscountId(feeDiscountDto.getDiscountId());
+            computeDiscountDto.setDiscountType(FeeDiscountDto.DISCOUNT_TYPE_V);
+            computeDiscountDto.setRuleId(feeDiscountDto.getRuleId());
+            computeDiscountDto.setRuleName(feeDiscountDto.getRuleName());
+            computeDiscountDto.setDiscountName(feeDiscountDto.getDiscountName());
+            computeDiscountDto.setDiscountPrice(0.0);
+            computeDiscountDto.setFeeDiscountSpecs(feeDiscountSpecDtos);
+            return computeDiscountDto;
+        }
+        //查询费用
+        int day = DateUtil.daysBetween(curTime, endTime);
+
+        if (day < 1) {
+            ComputeDiscountDto computeDiscountDto = new ComputeDiscountDto();
+            computeDiscountDto.setDiscountId(feeDiscountDto.getDiscountId());
+            computeDiscountDto.setDiscountType(FeeDiscountDto.DISCOUNT_TYPE_V);
+            computeDiscountDto.setRuleId(feeDiscountDto.getRuleId());
+            computeDiscountDto.setRuleName(feeDiscountDto.getRuleName());
+            computeDiscountDto.setDiscountName(feeDiscountDto.getDiscountName());
+            computeDiscountDto.setDiscountPrice(0.0);
+            computeDiscountDto.setFeeDiscountSpecs(feeDiscountSpecDtos);
+            return computeDiscountDto;
+        }
+
+        Map feePriceAll = computeFeeSMOImpl.getFeePrice(feeDtos.get(0));
+
+        BigDecimal priceDec = new BigDecimal(feePriceAll.get("feePrice").toString());
+
+        BigDecimal dayDec = new BigDecimal(day);
+
+        // double discountPrice = priceDec.divide(new BigDecimal(30), 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(rate)).multiply(dayDec).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+        BigDecimal money = new BigDecimal(0);
+        BigDecimal yearFee = null;
+        BigDecimal monthFee = null;
+        BigDecimal dayMoney = null;
+        for (int i = 1; i < day + 1; i++) {
+            yearFee = priceDec.multiply(new BigDecimal(12));
+            monthFee = yearFee.divide(new BigDecimal(365), 2, BigDecimal.ROUND_HALF_UP);
+            dayMoney = monthFee.multiply(new BigDecimal(i - 1));
+            dayMoney = dayMoney.multiply(new BigDecimal(rate));
+            money = money.add(dayMoney).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+        }
+        double discountPrice = money.doubleValue();
+       // System.out.println(money);
+
+        ComputeDiscountDto computeDiscountDto = new ComputeDiscountDto();
+        computeDiscountDto.setDiscountId(feeDiscountDto.getDiscountId());
+        computeDiscountDto.setDiscountType(FeeDiscountDto.DISCOUNT_TYPE_V);
+        computeDiscountDto.setRuleId(feeDiscountDto.getRuleId());
+        computeDiscountDto.setRuleName(feeDiscountDto.getRuleName());
+        computeDiscountDto.setDiscountName(feeDiscountDto.getDiscountName());
+        computeDiscountDto.setDiscountPrice(discountPrice * -1);
+        computeDiscountDto.setFeeDiscountSpecs(feeDiscountSpecDtos);
+        return computeDiscountDto;
+    }
+
+    public static void main(String[] args) throws Exception {
+        int day = 316;
+        double money = 0.0;
+        for (int i = 1; i < day + 1; i++) {
+            money += ((124.51 / 30 * (i - 1) + money) * 0.003);
+            System.out.println("第" + i + "天 违约金 = " + money + ",计算公式为:(124.51/30 * (" + i + "-1) + " + money + ") * 0.003");
+        }
+
+        System.out.println(money);
+    }
+}