wuxw %!s(int64=3) %!d(string=hai) anos
pai
achega
eff9634e34

+ 16 - 0
java110-core/src/main/java/com/java110/core/smo/IComputeFeeSMO.java

@@ -163,4 +163,20 @@ public interface IComputeFeeSMO {
      * @param carInoutDtos
      */
     List<CarInoutDetailDto> computeTempCarInoutDetailStopTimeAndFee(List<CarInoutDetailDto> carInoutDtos);
+
+    /**
+     * 租金处理
+     *
+     * @param feeDto
+     */
+    void dealRentRate(FeeDto feeDto);
+
+    /**
+     * 租金处理
+     *
+     * @param feeDto
+     */
+    void dealRentRateCycle(FeeDto feeDto,double cycle);
+
+
 }

+ 108 - 0
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java

@@ -20,6 +20,7 @@ import com.java110.dto.report.ReportRoomDto;
 import com.java110.intf.community.ICommunityInnerServiceSMO;
 import com.java110.intf.community.IParkingSpaceInnerServiceSMO;
 import com.java110.intf.community.IRoomInnerServiceSMO;
+import com.java110.intf.fee.IFeeAttrInnerServiceSMO;
 import com.java110.intf.fee.IFeeInnerServiceSMO;
 import com.java110.intf.fee.ITempCarFeeConfigAttrInnerServiceSMO;
 import com.java110.intf.fee.ITempCarFeeConfigInnerServiceSMO;
@@ -65,6 +66,9 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
     @Autowired(required = false)
     private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
 
+    @Autowired(required = false)
+    private IFeeAttrInnerServiceSMO feeAttrInnerServiceSMOImpl;
+
     @Autowired(required = false)
     private IRoomInnerServiceSMO roomInnerServiceSMOImpl;
 
@@ -1862,4 +1866,108 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
         c.set(year, month, 0); //输入类型为int类型
         return c.get(Calendar.DAY_OF_MONTH);
     }
+
+    /**
+     *
+     * @param feeDto
+     * @param cycle
+     */
+    public void dealRentRateCycle(FeeDto feeDto,double cycle){
+        Date endTime = feeDto.getEndTime();
+        Date date = getTargetEndTime(cycle,endTime);
+        feeDto.setDeadlineTime(date);
+        dealRentRate(feeDto);
+        feeDto.setFeeTotalPrice(Double.parseDouble(feeDto.getAmountOwed()));
+    }
+
+    /**
+     * 租金处理
+     *
+     * @param feeDto
+     */
+    public void dealRentRate(FeeDto feeDto) {
+        if (!FeeConfigDto.COMPUTING_FORMULA_RANT_RATE.equals(feeDto.getComputingFormula())) {
+            return;
+        }
+
+        if (!FeeDto.STATE_DOING.equals(feeDto.getState())) {
+            return;
+        }
+
+        //查询递增信息
+        FeeAttrDto feeAttrDto = new FeeAttrDto();
+        feeAttrDto.setFeeId(feeDto.getFeeId());
+        feeAttrDto.setCommunityId(feeDto.getCommunityId());
+        List<FeeAttrDto> feeAttrDtos = feeAttrInnerServiceSMOImpl.queryFeeAttrs(feeAttrDto);
+
+        if (feeAttrDtos == null || feeAttrDtos.size() < 1) {
+            return;
+        }
+        int rateCycle = 0;
+        double rate = 0.0;
+        Date rateStartTime = null;
+        try {
+            for (FeeAttrDto tmpFeeAttrDto : feeAttrDtos) {
+                if (FeeAttrDto.SPEC_CD_RATE.equals(tmpFeeAttrDto.getSpecCd())) {
+                    feeDto.setRate(tmpFeeAttrDto.getValue());
+                    rate = Double.parseDouble(tmpFeeAttrDto.getValue());
+                }
+                if (FeeAttrDto.SPEC_CD_RATE_CYCLE.equals(tmpFeeAttrDto.getSpecCd())) {
+                    feeDto.setRateCycle(tmpFeeAttrDto.getValue());
+                    rateCycle = Integer.parseInt(tmpFeeAttrDto.getValue());
+                }
+                if (FeeAttrDto.SPEC_CD_RATE_START_TIME.equals(tmpFeeAttrDto.getSpecCd())) {
+                    rateStartTime = DateUtil.getDateFromString(tmpFeeAttrDto.getValue(), DateUtil.DATE_FORMATE_STRING_B);
+                }
+            }
+        } catch (Exception e) {
+            logger.error("租金递增异常", e);
+            return;
+        }
+
+        if (rateCycle == 0 || rate == 0) {
+            return;
+        }
+
+        if (feeDto.getDeadlineTime().getTime() <= rateStartTime.getTime()) {
+            return;
+        }
+
+        BigDecimal oweAmountDec = new BigDecimal(0);
+        //计算 计费起始时间 到 rateStartTime 时的费用
+        double curOweMonth = 0;
+        BigDecimal curFeePrice = new BigDecimal(feeDto.getFeePrice());
+        if (feeDto.getEndTime().getTime() < rateStartTime.getTime()) {
+            curOweMonth = dayCompare(feeDto.getEndTime(), rateStartTime);
+            oweAmountDec = curFeePrice.multiply(new BigDecimal(curOweMonth)).setScale(2, BigDecimal.ROUND_HALF_UP);
+        }
+
+        curOweMonth = dayCompare(rateStartTime, feeDto.getDeadlineTime());
+
+        double maxCycle = Math.floor(curOweMonth / rateCycle);
+
+        //基准
+        BigDecimal firstAmount = curFeePrice.multiply(new BigDecimal(rateCycle));
+        BigDecimal preCycleAmount = firstAmount;
+        BigDecimal rateDec = null; //递增周期所收费用
+        BigDecimal lastRateAmountDec = null;
+        double curCycle = 0;
+        for (int cycleIndex = 0; cycleIndex < maxCycle; maxCycle++) {
+            rateDec = preCycleAmount.multiply(new BigDecimal(rate)).setScale(2, BigDecimal.ROUND_HALF_UP);
+            //增长周期的倍数
+            curCycle = (cycleIndex + 1) * rateCycle;
+            if (curCycle > curOweMonth) {
+                rateDec = new BigDecimal(curOweMonth / rateCycle - Math.ceil(curOweMonth / rateCycle)).multiply(rateDec).setScale(2, BigDecimal.ROUND_HALF_UP);
+                lastRateAmountDec = new BigDecimal(curOweMonth / rateCycle - Math.ceil(curOweMonth / rateCycle)).multiply(preCycleAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
+                firstAmount = firstAmount.add(rateDec).add(lastRateAmountDec);
+                continue;
+            }
+            firstAmount = firstAmount.add(rateDec).add(preCycleAmount);
+            preCycleAmount = preCycleAmount.add(rateDec);
+        }
+
+        firstAmount = firstAmount.add(oweAmountDec);
+        feeDto.setAmountOwed(firstAmount.doubleValue() + "");
+    }
 }
+

+ 2 - 0
service-fee/src/main/java/com/java110/fee/bmo/impl/QueryOweFeeImpl.java

@@ -180,6 +180,8 @@ public class QueryOweFeeImpl implements IQueryOweFee {
         Map feePriceAll = computeFeeSMOImpl.getFeePrice(feeDto);
         feeDto.setFeePrice(Double.parseDouble(feePriceAll.get("feePrice").toString()));
         feeDto.setFeeTotalPrice(Double.parseDouble(feePriceAll.get("feeTotalPrice").toString()));
+
+        computeFeeSMOImpl.dealRentRateCycle(feeDto,Double.parseDouble(feeDto.getCycle()));
         //应收款取值
         //先取单小区的如果没有配置 取 全局的
         String val = CommunitySettingFactory.getValue(feeDto.getCommunityId(), TOTAL_FEE_PRICE);

+ 7 - 98
service-fee/src/main/java/com/java110/fee/cmd/fee/ListFeeCmd.java

@@ -206,6 +206,9 @@ public class ListFeeCmd extends Cmd {
             feeDto.setAmountOwed(df.format(curFeePrice));
             feeDto.setDeadlineTime(DateUtil.getCurrentDate());
         }
+
+        //考虑租金递增
+        computeFeeSMOImpl.dealRentRate(feeDto, oweMonth);
     }
 
     /**
@@ -231,108 +234,11 @@ public class ListFeeCmd extends Cmd {
         }
 
         //考虑租金递增
-        dealRentRate(feeDto, oweMonth);
+        computeFeeSMOImpl.dealRentRate(feeDto, oweMonth);
 
     }
 
-    /**
-     * 租金处理
-     *
-     * @param feeDto
-     * @param oweMonth
-     */
-    private void dealRentRate(FeeDto feeDto, double oweMonth) {
-        if (!FeeConfigDto.COMPUTING_FORMULA_RANT_RATE.equals(feeDto.getComputingFormula())) {
-            return;
-        }
-
-        if (!FeeDto.STATE_DOING.equals(feeDto.getState())) {
-            return;
-        }
-
-        //查询递增信息
-        FeeAttrDto feeAttrDto = new FeeAttrDto();
-        feeAttrDto.setFeeId(feeDto.getFeeId());
-        feeAttrDto.setCommunityId(feeDto.getCommunityId());
-        List<FeeAttrDto> feeAttrDtos = feeAttrInnerServiceSMOImpl.queryFeeAttrs(feeAttrDto);
-
-        if (feeAttrDtos == null || feeAttrDtos.size() < 1) {
-            return;
-        }
-        int rateCycle = 0;
-        double rate = 0.0;
-        Date rateStartTime = null;
-        try {
-            for (FeeAttrDto tmpFeeAttrDto : feeAttrDtos) {
-                if (FeeAttrDto.SPEC_CD_RATE.equals(tmpFeeAttrDto.getSpecCd())) {
-                    feeDto.setRate(tmpFeeAttrDto.getValue());
-                    rate = Double.parseDouble(tmpFeeAttrDto.getValue());
-                }
-                if (FeeAttrDto.SPEC_CD_RATE_CYCLE.equals(tmpFeeAttrDto.getSpecCd())) {
-                    feeDto.setRateCycle(tmpFeeAttrDto.getValue());
-                    rateCycle = Integer.parseInt(tmpFeeAttrDto.getValue());
-                }
-                if (FeeAttrDto.SPEC_CD_RATE_START_TIME.equals(tmpFeeAttrDto.getSpecCd())) {
-                    rateStartTime = DateUtil.getDateFromString(tmpFeeAttrDto.getValue(), DateUtil.DATE_FORMATE_STRING_B);
-                }
-            }
-        } catch (Exception e) {
-            logger.error("租金递增异常", e);
-            return;
-        }
-
-        if (rateCycle == 0 || rate == 0) {
-            return;
-        }
-
-        if (feeDto.getDeadlineTime().getTime() <= rateStartTime.getTime()) {
-            return;
-        }
 
-        BigDecimal oweAmountDec = new BigDecimal(0);
-        //计算 计费起始时间 到 rateStartTime 时的费用
-        double curOweMonth = 0;
-        BigDecimal curFeePrice = new BigDecimal(feeDto.getFeePrice());
-        if(feeDto.getEndTime().getTime() < rateStartTime.getTime()){
-            curOweMonth = computeFeeSMOImpl.dayCompare(feeDto.getEndTime(),rateStartTime);
-            oweAmountDec = curFeePrice.multiply(new BigDecimal(curOweMonth));
-        }
-
-         curOweMonth = computeFeeSMOImpl.dayCompare(rateStartTime,feeDto.getDeadlineTime());
-
-        double maxCycle = Math.floor(curOweMonth/rateCycle);
-
-        //基准
-        BigDecimal firstAmount = curFeePrice.multiply(new BigDecimal(rateCycle));
-        BigDecimal preCycleAmount = firstAmount;
-        BigDecimal rateDec = null;
-        BigDecimal lastRateAmountDec = null;
-        double curCycle = 0;
-        for(int cycleIndex = 0; cycleIndex < maxCycle; maxCycle ++){
-            rateDec = preCycleAmount.multiply(new BigDecimal(rate));
-            //增长周期的倍数
-            curCycle = (cycleIndex +1) * rateCycle;
-            if(curCycle > curOweMonth){
-                rateDec = new BigDecimal(curOweMonth/rateCycle -Math.ceil(curOweMonth/rateCycle)).multiply(rateDec);
-                lastRateAmountDec = new BigDecimal(curOweMonth/rateCycle -Math.ceil(curOweMonth/rateCycle)).multiply(rateDec);
-                firstAmount = firstAmount.add(rateDec).add(preCycleAmount);
-                continue;
-            }
-            firstAmount = firstAmount.add(rateDec).add(preCycleAmount);
-            preCycleAmount = preCycleAmount.add(rateDec);
-        }
-        // 1.0 还没有到 递增开始时间
-        //2.0 5.3 个月 24个月 一个递增周期
-        // 200 * 5.3 + 0.03 * (24 * 200) * (5.3/24)
-
-        // 200* 24
-
-
-
-
-
-
-    }
 
     /**
      * 根据合同来算单价
@@ -355,5 +261,8 @@ public class ListFeeCmd extends Cmd {
             feeDto.setAmountOwed(df.format(curFeePrice) + "");
             feeDto.setDeadlineTime(DateUtil.getCurrentDate());
         }
+
+        //考虑租金递增
+        computeFeeSMOImpl.dealRentRate(feeDto, oweMonth);
     }
 }