Bladeren bron

优化代码

java110 5 jaren geleden
bovenliggende
commit
edca4324a5

+ 27 - 0
java110-bean/src/main/java/com/java110/dto/fee/TargetEndDateAndOweMonthDto.java

@@ -0,0 +1,27 @@
+package com.java110.dto.fee;
+
+import java.util.Date;
+
+public class TargetEndDateAndOweMonthDto {
+
+    private Date targetEndDate;
+
+    double oweMonth;
+
+
+    public Date getTargetEndDate() {
+        return targetEndDate;
+    }
+
+    public void setTargetEndDate(Date targetEndDate) {
+        this.targetEndDate = targetEndDate;
+    }
+
+    public double getOweMonth() {
+        return oweMonth;
+    }
+
+    public void setOweMonth(double oweMonth) {
+        this.oweMonth = oweMonth;
+    }
+}

+ 54 - 34
java110-bean/src/main/java/com/java110/po/feeReceiptDetail/FeeReceiptDetailPo.java

@@ -1,88 +1,108 @@
 package com.java110.po.feeReceiptDetail;
 
 import java.io.Serializable;
-import java.util.Date;
 
 public class FeeReceiptDetailPo implements Serializable {
 
     private String area;
-private String amount;
-private String feeName;
-private String detailId;
-private String startTime;
-private String statusCd = "0";
-private String endTime;
-private String communityId;
-private String receiptId;
-private String feeId;
-private String cycle;
-public String getArea() {
+    private String amount;
+    private String feeName;
+    private String detailId;
+    private String startTime;
+    private String statusCd = "0";
+    private String endTime;
+    private String communityId;
+    private String receiptId;
+    private String feeId;
+    private String cycle;
+
+    public String getArea() {
         return area;
     }
-public void setArea(String area) {
+
+    public void setArea(String area) {
         this.area = area;
     }
-public String getAmount() {
+
+    public String getAmount() {
         return amount;
     }
-public void setAmount(String amount) {
+
+    public void setAmount(String amount) {
         this.amount = amount;
     }
-public String getFeeName() {
+
+    public String getFeeName() {
         return feeName;
     }
-public void setFeeName(String feeName) {
+
+    public void setFeeName(String feeName) {
         this.feeName = feeName;
     }
-public String getDetailId() {
+
+    public String getDetailId() {
         return detailId;
     }
-public void setDetailId(String detailId) {
+
+    public void setDetailId(String detailId) {
         this.detailId = detailId;
     }
-public String getStartTime() {
+
+    public String getStartTime() {
         return startTime;
     }
-public void setStartTime(String startTime) {
+
+    public void setStartTime(String startTime) {
         this.startTime = startTime;
     }
-public String getStatusCd() {
+
+    public String getStatusCd() {
         return statusCd;
     }
-public void setStatusCd(String statusCd) {
+
+    public void setStatusCd(String statusCd) {
         this.statusCd = statusCd;
     }
-public String getEndTime() {
+
+    public String getEndTime() {
         return endTime;
     }
-public void setEndTime(String endTime) {
+
+    public void setEndTime(String endTime) {
         this.endTime = endTime;
     }
-public String getCommunityId() {
+
+    public String getCommunityId() {
         return communityId;
     }
-public void setCommunityId(String communityId) {
+
+    public void setCommunityId(String communityId) {
         this.communityId = communityId;
     }
-public String getReceiptId() {
+
+    public String getReceiptId() {
         return receiptId;
     }
-public void setReceiptId(String receiptId) {
+
+    public void setReceiptId(String receiptId) {
         this.receiptId = receiptId;
     }
-public String getFeeId() {
+
+    public String getFeeId() {
         return feeId;
     }
-public void setFeeId(String feeId) {
+
+    public void setFeeId(String feeId) {
         this.feeId = feeId;
     }
-public String getCycle() {
+
+    public String getCycle() {
         return cycle;
     }
-public void setCycle(String cycle) {
+
+    public void setCycle(String cycle) {
         this.cycle = cycle;
     }
 
 
-
 }

+ 1 - 1
java110-interface/src/main/java/com/java110/intf/fee/IFeeReceiptDetailInnerServiceSMO.java

@@ -18,7 +18,7 @@ import java.util.List;
  * @Version 1.0
  * add by wuxw 2019/4/24
  **/
-@FeignClient(name = "user-service", configuration = {FeignConfiguration.class})
+@FeignClient(name = "fee-service", configuration = {FeignConfiguration.class})
 @RequestMapping("/feeReceiptDetailApi")
 public interface IFeeReceiptDetailInnerServiceSMO {
 

+ 1 - 1
java110-interface/src/main/java/com/java110/intf/fee/IFeeReceiptInnerServiceSMO.java

@@ -18,7 +18,7 @@ import java.util.List;
  * @Version 1.0
  * add by wuxw 2019/4/24
  **/
-@FeignClient(name = "user-service", configuration = {FeignConfiguration.class})
+@FeignClient(name = "fee-service", configuration = {FeignConfiguration.class})
 @RequestMapping("/feeReceiptApi")
 public interface IFeeReceiptInnerServiceSMO {
 

+ 93 - 0
java110-service/src/main/java/com/java110/service/smo/IComputeFeeSMO.java

@@ -0,0 +1,93 @@
+package com.java110.service.smo;
+
+import com.java110.dto.fee.FeeDto;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 费用计算 服务类
+ * <p>
+ * add by wuxw 2020-09-23
+ *
+ * @openSource https://gitee.com/wuxw7/MicroCommunity.git
+ */
+public interface IComputeFeeSMO {
+
+
+    /**
+     * 计算费用结束时间
+     *
+     * @return
+     */
+    Date getFeeEndTime();
+
+    /**
+     * 根据周期 计算费用状态
+     * @param feeDto
+     * @param cycles
+     * @return
+     */
+    public String getFeeStateByCycles(FeeDto feeDto, String cycles);
+
+    /**
+     * 查询费用对象名称
+     * @param feeDto
+     * @return
+     */
+    public String getFeeObjName(FeeDto feeDto);
+    /**
+     * 根据缴费周期计算 结束时间
+     * @param feeDto
+     * @param cycles 缴费周期
+     * @return
+     */
+    public Date getFeeEndTimeByCycles(FeeDto feeDto, String cycles);
+
+
+    /**
+     * 获取目标结束时间
+     *
+     * @param month     月份
+     * @param startDate 开始时间
+     * @return 新的日期
+     */
+    Date getTargetEndTime(double month, Date startDate);
+
+
+    /**
+     * 计算周期
+     *
+     * @return
+     */
+    double getCycle();
+
+    /**
+     * 获取目标结束时间和欠费月份
+     *
+     * @param feeDto
+     * @return {
+     * targetEndDate:2020-09-09 11:11:11
+     * oweMonth:1.0
+     * }
+     */
+    public Map getTargetEndDateAndOweMonth(FeeDto feeDto);
+
+
+    /**
+     * 计算费用单价
+     *
+     * @return
+     */
+    double getFeePrice(FeeDto feeDto);
+
+    /**
+     * 时间差 按天折算
+     *
+     * @param fromDate 开始时间
+     * @param toDate   结束时间
+     * @return 相差月数
+     */
+    double dayCompare(Date fromDate, Date toDate);
+
+}

+ 356 - 0
java110-service/src/main/java/com/java110/service/smo/impl/ComputeFeeSMOImpl.java

@@ -0,0 +1,356 @@
+package com.java110.service.smo.impl;
+
+import com.java110.dto.RoomDto;
+import com.java110.dto.fee.FeeDto;
+import com.java110.dto.owner.OwnerCarDto;
+import com.java110.dto.parking.ParkingSpaceDto;
+import com.java110.intf.community.IParkingSpaceInnerServiceSMO;
+import com.java110.intf.community.IRoomInnerServiceSMO;
+import com.java110.intf.fee.IFeeInnerServiceSMO;
+import com.java110.intf.user.IOwnerCarInnerServiceSMO;
+import com.java110.service.smo.IComputeFeeSMO;
+import com.java110.utils.constant.ResponseConstant;
+import com.java110.utils.exception.ListenerExecuteException;
+import com.java110.utils.util.Assert;
+import com.java110.utils.util.DateUtil;
+import com.java110.utils.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+
+/**
+ * 费用计算 服务类
+ * <p>
+ * add by wuxw 2020-09-23
+ *
+ * @openSource https://gitee.com/wuxw7/MicroCommunity.git
+ */
+
+@Service
+public class ComputeFeeSMOImpl implements IComputeFeeSMO {
+    @Autowired
+    private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
+
+    @Autowired
+    private IRoomInnerServiceSMO roomInnerServiceSMOImpl;
+
+    @Autowired
+    private IOwnerCarInnerServiceSMO ownerCarInnerServiceSMOImpl;
+
+    @Autowired
+    private IParkingSpaceInnerServiceSMO parkingSpaceInnerServiceSMOImpl;
+
+    @Override
+    public Date getFeeEndTime() {
+        return null;
+    }
+
+    /**
+     * 查询费用对象名称
+     * @param feeDto
+     * @return
+     */
+    @Override
+    public String getFeeObjName(FeeDto feeDto) {
+        String objName = "";
+        if (FeeDto.PAYER_OBJ_TYPE_ROOM.equals(feeDto.getPayerObjType())) { //房屋相关
+            RoomDto roomDto = new RoomDto();
+            roomDto.setRoomId(feeDto.getPayerObjId());
+            roomDto.setCommunityId(feeDto.getCommunityId());
+            List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
+            if (roomDtos == null || roomDtos.size() != 1) {
+                return objName;
+            }
+            roomDto = roomDtos.get(0);
+            objName = roomDto.getFloorNum() + "栋" + roomDto.getUnitNum() + "单元" + roomDto.getRoomNum() + "室";
+        } else if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeDto.getPayerObjType())) {//车位相关
+
+            OwnerCarDto ownerCarDto = new OwnerCarDto();
+            ownerCarDto.setCommunityId(feeDto.getCommunityId());
+            ownerCarDto.setCarId(feeDto.getPayerObjId());
+            List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
+            if (ownerCarDtos == null || ownerCarDtos.size() < 1) {
+                return objName;
+            }
+
+            objName = ownerCarDtos.get(0).getCarNum();
+            ParkingSpaceDto parkingSpaceDto = new ParkingSpaceDto();
+            parkingSpaceDto.setCommunityId(feeDto.getCommunityId());
+            parkingSpaceDto.setPsId(ownerCarDtos.get(0).getPsId());
+            List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
+            if (parkingSpaceDtos == null || parkingSpaceDtos.size() < 1) { //数据有问题
+                return objName;
+            }
+            objName = objName + "(" + parkingSpaceDtos.get(0).getAreaNum() + "停车场" + parkingSpaceDtos.get(0).getNum() + "车位)";
+        }
+        return objName;
+    }
+
+    /**
+     * 根据周期 计算费用状态
+     *
+     * @param feeDto
+     * @param cycles
+     * @return
+     */
+    public String getFeeStateByCycles(FeeDto feeDto, String cycles) {
+        double cycle = Double.parseDouble(cycles);
+        Date endTime = feeDto.getEndTime();
+        Calendar endCalender = Calendar.getInstance();
+        endCalender.setTime(endTime);
+        endCalender.add(Calendar.MONTH, Integer.parseInt(Math.floor(cycle) + ""));
+        int hours = new Double((cycle - Math.floor(cycle)) * DateUtil.getCurrentMonthDay() * 24).intValue();
+        endCalender.add(Calendar.HOUR, hours);
+        if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
+            return FeeDto.STATE_FINISH;
+        } else {
+            if ((endCalender.getTime()).after(feeDto.getConfigEndTime())) {
+                return FeeDto.STATE_FINISH;
+            }
+        }
+        return FeeDto.STATE_DOING;
+    }
+
+    public Date getFeeEndTimeByCycles(FeeDto feeDto, String cycles) {
+        double cycle = Double.parseDouble(cycles);
+
+        Date endTime = feeDto.getEndTime();
+        Calendar endCalender = Calendar.getInstance();
+        endCalender.setTime(endTime);
+        endCalender.add(Calendar.MONTH, Integer.parseInt(Math.floor(cycle) + ""));
+        int hours = new Double((cycle - Math.floor(cycle)) * DateUtil.getCurrentMonthDay() * 24).intValue();
+        endCalender.add(Calendar.HOUR, hours);
+        if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
+            if (!StringUtil.isEmpty(feeDto.getCurDegrees())) {
+                endCalender.setTime(feeDto.getCurReadingTime());
+            } else if (feeDto.getImportFeeEndTime() == null) {
+                endCalender.setTime(feeDto.getConfigEndTime());
+            } else {
+                endCalender.setTime(feeDto.getImportFeeEndTime());
+            }
+        } else {
+            if ((endCalender.getTime()).after(feeDto.getConfigEndTime())) {
+                endCalender.setTime(feeDto.getConfigEndTime());
+            }
+        }
+
+        return endCalender.getTime();
+    }
+
+
+    @Override
+    public double getCycle() {
+        return 0;
+    }
+
+    @Override
+    public double getFeePrice(FeeDto feeDto) {
+        BigDecimal feePrice = new BigDecimal(0.0);
+        if (FeeDto.PAYER_OBJ_TYPE_ROOM.equals(feeDto.getPayerObjType())) { //房屋相关
+            String computingFormula = feeDto.getComputingFormula();
+            RoomDto roomDto = new RoomDto();
+            roomDto.setRoomId(feeDto.getPayerObjId());
+            roomDto.setCommunityId(feeDto.getCommunityId());
+            List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
+            if (roomDtos == null || roomDtos.size() != 1) {
+                throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "未查到房屋信息,查询多条数据");
+            }
+            roomDto = roomDtos.get(0);
+            if ("1001".equals(computingFormula)) { //面积*单价+附加费
+                //feePrice = Double.parseDouble(feeDto.getSquarePrice()) * Double.parseDouble(roomDtos.get(0).getBuiltUpArea()) + Double.parseDouble(feeDto.getAdditionalAmount());
+                BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
+                BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(roomDtos.get(0).getBuiltUpArea()));
+                BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
+                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+            } else if ("2002".equals(computingFormula)) { // 固定费用
+                //feePrice = Double.parseDouble(feeDto.getAdditionalAmount());
+                BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
+                feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN);
+            } else if ("4004".equals(computingFormula)) {
+                feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
+            } else if ("5005".equals(computingFormula)) {
+                if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
+                    throw new IllegalArgumentException("抄表数据异常");
+                } else {
+                    BigDecimal curDegree = new BigDecimal(Double.parseDouble(feeDto.getCurDegrees()));
+                    BigDecimal preDegree = new BigDecimal(Double.parseDouble(feeDto.getPreDegrees()));
+                    BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
+                    BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
+                    BigDecimal sub = curDegree.subtract(preDegree);
+                    feePrice = sub.multiply(squarePrice)
+                            .add(additionalAmount)
+                            .setScale(2, BigDecimal.ROUND_HALF_EVEN);
+                }
+            } else {
+                throw new IllegalArgumentException("暂不支持该类公式");
+            }
+        } else if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeDto.getPayerObjType())) {//车位相关
+            String computingFormula = feeDto.getComputingFormula();
+
+            OwnerCarDto ownerCarDto = new OwnerCarDto();
+            ownerCarDto.setCommunityId(feeDto.getCommunityId());
+            ownerCarDto.setCarId(feeDto.getPayerObjId());
+            List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
+            Assert.listOnlyOne(ownerCarDtos, "未找到车辆信息");
+            if ("1001".equals(computingFormula)) { //面积*单价+附加费
+                ParkingSpaceDto parkingSpaceDto = new ParkingSpaceDto();
+                parkingSpaceDto.setCommunityId(feeDto.getCommunityId());
+                parkingSpaceDto.setPsId(ownerCarDtos.get(0).getPsId());
+                List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
+                if (parkingSpaceDtos == null || parkingSpaceDtos.size() < 1) { //数据有问题
+                    throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "未查到停车位信息,查询多条数据");
+                }
+                BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
+                BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(parkingSpaceDtos.get(0).getArea()));
+                BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
+                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+            } else if ("2002".equals(computingFormula)) { // 固定费用
+                //feePrice = Double.parseDouble(feeDto.getAdditionalAmount());
+                BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
+                feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN);
+            } else if ("4004".equals(computingFormula)) {
+                feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
+            } else if ("5005".equals(computingFormula)) {
+                if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
+                    throw new IllegalArgumentException("抄表数据异常");
+                } else {
+                    BigDecimal curDegree = new BigDecimal(Double.parseDouble(feeDto.getCurDegrees()));
+                    BigDecimal preDegree = new BigDecimal(Double.parseDouble(feeDto.getPreDegrees()));
+                    BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
+                    BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
+                    BigDecimal sub = curDegree.subtract(preDegree);
+                    feePrice = sub.multiply(squarePrice)
+                            .add(additionalAmount)
+                            .setScale(2, BigDecimal.ROUND_HALF_EVEN);
+                }
+            } else {
+                throw new IllegalArgumentException("暂不支持该类公式");
+            }
+        }
+        return feePrice.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+    }
+
+
+    public Map getTargetEndDateAndOweMonth(FeeDto feeDto) {
+        Date targetEndDate = null;
+        double oweMonth = 0.0;
+
+        Map<String, Object> targetEndDateAndOweMonth = new HashMap<>();
+
+        if (FeeDto.STATE_FINISH.equals(feeDto.getState())) {
+            targetEndDate = feeDto.getEndTime();
+            targetEndDateAndOweMonth.put("oweMonth", oweMonth);
+            targetEndDateAndOweMonth.put("targetEndDate", targetEndDate);
+            return targetEndDateAndOweMonth;
+        }
+        if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
+            if (!StringUtil.isEmpty(feeDto.getCurDegrees())) {
+                targetEndDate = feeDto.getCurReadingTime();
+            } else if (feeDto.getImportFeeEndTime() == null) {
+                targetEndDate = feeDto.getConfigEndTime();
+            } else {
+                targetEndDate = feeDto.getImportFeeEndTime();
+            }
+            //判断当前费用是不是导入费用
+            oweMonth = 1.0;
+
+        } else {
+            //当前时间
+            Date billEndTime = DateUtil.getCurrentDate();
+            //开始时间
+            Date startDate = feeDto.getStartTime();
+            //到期时间
+            Date endDate = feeDto.getEndTime();
+            if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeDto.getPayerObjType())) {
+                OwnerCarDto ownerCarDto = new OwnerCarDto();
+                ownerCarDto.setCommunityId(feeDto.getCommunityId());
+                ownerCarDto.setCarId(feeDto.getPayerObjId());
+                List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
+
+                if (ownerCarDtos == null || ownerCarDtos.size() != 1) {
+                    targetEndDateAndOweMonth.put("oweMonth", 0);
+                    targetEndDateAndOweMonth.put("targetEndDate", "");
+                    return targetEndDateAndOweMonth;
+                }
+
+                targetEndDate = ownerCarDtos.get(0).getEndTime();
+                //说明没有欠费
+                if (endDate.getTime() >= targetEndDate.getTime()) {
+                    // 目标到期时间 - 到期时间 = 欠费月份
+                    oweMonth = 0;
+                    targetEndDateAndOweMonth.put("oweMonth", oweMonth);
+                    targetEndDateAndOweMonth.put("targetEndDate", targetEndDate);
+                    return targetEndDateAndOweMonth;
+                }
+            }
+
+            //缴费周期
+            long paymentCycle = Long.parseLong(feeDto.getPaymentCycle());
+            // 当前时间 - 开始时间  = 月份
+            double mulMonth = 0.0;
+            mulMonth = dayCompare(startDate, billEndTime);
+
+            // 月份/ 周期 = 轮数(向上取整)
+            double round = 0.0;
+            if ("1200".equals(feeDto.getPaymentCd())) { // 预付费
+                round = Math.floor(mulMonth / paymentCycle) + 1;
+            } else { //后付费
+                round = Math.floor(mulMonth / paymentCycle);
+            }
+            // 轮数 * 周期 * 30 + 开始时间 = 目标 到期时间
+            targetEndDate = getTargetEndTime(round * paymentCycle, startDate);
+            //费用 快结束了
+            if (feeDto.getConfigEndTime().getTime() < targetEndDate.getTime()) {
+                targetEndDate = feeDto.getConfigEndTime();
+            }
+            //说明没有欠费
+            if (endDate.getTime() < targetEndDate.getTime()) {
+                // 目标到期时间 - 到期时间 = 欠费月份
+                oweMonth = dayCompare(endDate, targetEndDate);
+            }
+
+            if (feeDto.getEndTime().getTime() > targetEndDate.getTime()) {
+                targetEndDate = feeDto.getEndTime();
+            }
+        }
+
+        targetEndDateAndOweMonth.put("oweMonth", oweMonth);
+        targetEndDateAndOweMonth.put("targetEndDate", targetEndDate);
+        return targetEndDateAndOweMonth;
+    }
+
+    @Override
+    public double dayCompare(Date fromDate, Date toDate) {
+        Calendar from = Calendar.getInstance();
+        from.setTime(fromDate);
+        Calendar to = Calendar.getInstance();
+        to.setTime(toDate);
+        int result = to.get(Calendar.MONTH) - from.get(Calendar.MONTH);
+        int month = (to.get(Calendar.YEAR) - from.get(Calendar.YEAR)) * 12;
+
+        result = result + month;
+        Calendar newFrom = Calendar.getInstance();
+        newFrom.setTime(fromDate);
+        newFrom.add(Calendar.MONTH, result);
+
+        long t1 = newFrom.getTimeInMillis();
+        long t2 = to.getTimeInMillis();
+        long days = (t2 - t1) / (24 * 60 * 60 * 1000);
+
+        BigDecimal tmpDays = new BigDecimal(days);
+        BigDecimal monthDay = new BigDecimal(30);
+
+        return tmpDays.divide(monthDay, 2, RoundingMode.HALF_UP).doubleValue() + result;
+    }
+
+    @Override
+    public Date getTargetEndTime(double month, Date startDate) {
+        Calendar endDate = Calendar.getInstance();
+        endDate.setTime(startDate);
+        endDate.add(Calendar.MONTH, (int) month);
+        return endDate.getTime();
+    }
+}

+ 14 - 110
service-api/src/main/java/com/java110/api/bmo/fee/impl/FeeBMOImpl.java

@@ -24,6 +24,7 @@ import com.java110.po.fee.PayFeeDetailPo;
 import com.java110.po.fee.PayFeePo;
 import com.java110.po.feeReceipt.FeeReceiptPo;
 import com.java110.po.feeReceiptDetail.FeeReceiptDetailPo;
+import com.java110.service.smo.IComputeFeeSMO;
 import com.java110.utils.constant.BusinessTypeConstant;
 import com.java110.utils.constant.CommonConstant;
 import com.java110.utils.constant.ResponseConstant;
@@ -71,6 +72,10 @@ public class FeeBMOImpl extends ApiBaseBMO implements IFeeBMO {
     @Autowired
     private IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl;
 
+
+    @Autowired
+    private IComputeFeeSMO computeFeeSMOImpl;
+
     /**
      * 添加小区信息
      *
@@ -132,127 +137,25 @@ public class FeeBMOImpl extends ApiBaseBMO implements IFeeBMO {
             throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "查询费用信息失败,未查到数据或查到多条数据");
         }
 
-
         feeDto = feeDtos.get(0);
         businessFeeDetail.put("startTime", DateUtil.getFormatTimeString(feeDto.getEndTime(), DateUtil.DATE_FORMATE_STRING_A));
-        Date endTime = feeDto.getEndTime();
-        Calendar endCalender = Calendar.getInstance();
-        endCalender.setTime(endTime);
         int hours = 0;
+        Date targetEndTime = null;
         if ("-101".equals(paramInJson.getString("cycles"))) {
+            Date endTime = feeDto.getEndTime();
+            Calendar endCalender = Calendar.getInstance();
+            endCalender.setTime(endTime);
             hours = new Double(Double.parseDouble(paramInJson.getString("tmpCycles")) * DateUtil.getCurrentMonthDay() * 24).intValue();
             endCalender.add(Calendar.HOUR, hours);
+            targetEndTime = endCalender.getTime();
         } else {
-            endCalender.add(Calendar.MONTH, Integer.parseInt(paramInJson.getString("cycles")));
-            if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
-                if (!StringUtil.isEmpty(feeDto.getCurDegrees())) {
-                    endCalender.setTime(feeDto.getCurReadingTime());
-                } else if (feeDto.getImportFeeEndTime() == null) {
-                    endCalender.setTime(feeDto.getConfigEndTime());
-                } else {
-                    endCalender.setTime(feeDto.getImportFeeEndTime());
-                }
-            }
+            targetEndTime = computeFeeSMOImpl.getFeeEndTimeByCycles(feeDto, paramInJson.getString("cycles"));
         }
-        businessFeeDetail.put("endTime", DateUtil.getFormatTimeString(endCalender.getTime(), DateUtil.DATE_FORMATE_STRING_A));
+        businessFeeDetail.put("endTime", DateUtil.getFormatTimeString(targetEndTime, DateUtil.DATE_FORMATE_STRING_A));
         paramInJson.put("feeInfo", feeDto);
 
-        BigDecimal feePrice = new BigDecimal("0.00");
-
-        if ("3333".equals(feeDto.getPayerObjType())) { //房屋相关
-            String computingFormula = feeDto.getComputingFormula();
-            RoomDto roomDto = new RoomDto();
-            roomDto.setRoomId(feeDto.getPayerObjId());
-            roomDto.setCommunityId(feeDto.getCommunityId());
-            List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
-            if (roomDtos == null || roomDtos.size() != 1) {
-                throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "未查到房屋信息,查询多条数据");
-            }
-            roomDto = roomDtos.get(0);
-            feeReceiptPo.setObjName(roomDto.getFloorNum() + "栋" + roomDto.getUnitNum() + "单元" + roomDto.getRoomNum());
-
-            if ("1001".equals(computingFormula)) { //面积*单价+附加费
-                //feePrice = Double.parseDouble(feeDto.getSquarePrice()) * Double.parseDouble(roomDtos.get(0).getBuiltUpArea()) + Double.parseDouble(feeDto.getAdditionalAmount());
-                BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
-                BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(roomDtos.get(0).getBuiltUpArea()));
-                BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
-                feeReceiptDetailPo.setArea(roomDtos.get(0).getBuiltUpArea());
-            } else if ("2002".equals(computingFormula)) { // 固定费用
-                //feePrice = Double.parseDouble(feeDto.getAdditionalAmount());
-                BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN);
-            } else if ("4004".equals(computingFormula)) {
-                feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
-            } else if ("5005".equals(computingFormula)) {
-                if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
-                    throw new IllegalArgumentException("抄表数据异常");
-                } else {
-                    BigDecimal curDegree = new BigDecimal(Double.parseDouble(feeDto.getCurDegrees()));
-                    BigDecimal preDegree = new BigDecimal(Double.parseDouble(feeDto.getPreDegrees()));
-                    BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
-                    BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                    BigDecimal sub = curDegree.subtract(preDegree);
-                    feePrice = sub.multiply(squarePrice)
-                            .add(additionalAmount)
-                            .setScale(2, BigDecimal.ROUND_HALF_EVEN);
-                    feeReceiptDetailPo.setArea(sub.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue() + "");
-
-                }
-            } else {
-                throw new IllegalArgumentException("暂不支持该类公式");
-            }
-        } else if ("6666".equals(feeDto.getPayerObjType())) {//车位相关
-            String computingFormula = feeDto.getComputingFormula();
-
-            OwnerCarDto ownerCarDto = new OwnerCarDto();
-            ownerCarDto.setCommunityId(feeDto.getCommunityId());
-            ownerCarDto.setCarId(feeDto.getPayerObjId());
-            List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
-
-            if (ownerCarDtos != null && ownerCarDtos.size() > 0) {
-                feeReceiptPo.setObjName(ownerCarDtos.get(0).getCarNum());
-            }
-            if ("1001".equals(computingFormula)) { //面积*单价+附加费
-                ParkingSpaceDto parkingSpaceDto = new ParkingSpaceDto();
-                parkingSpaceDto.setCommunityId(feeDto.getCommunityId());
-                parkingSpaceDto.setPsId(ownerCarDtos.get(0).getPsId());
-                List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
-
-                if (parkingSpaceDtos == null || parkingSpaceDtos.size() < 1) { //数据有问题
-                    throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "未查到停车位信息,查询多条数据");
-                }
-                //feePrice = Double.parseDouble(feeDto.getSquarePrice()) * Double.parseDouble(parkingSpaceDtos.get(0).getArea()) + Double.parseDouble(feeDto.getAdditionalAmount());
-                BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
-                BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(parkingSpaceDtos.get(0).getArea()));
-                BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
-                feeReceiptDetailPo.setArea(parkingSpaceDtos.get(0).getArea());
+        BigDecimal feePrice = new BigDecimal(computeFeeSMOImpl.getFeePrice(feeDto));
 
-            } else if ("2002".equals(computingFormula)) { // 固定费用
-                //feePrice = Double.parseDouble(feeDto.getAdditionalAmount());
-                BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN);
-            } else if ("4004".equals(computingFormula)) {
-                feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
-            } else if ("5005".equals(computingFormula)) {
-                if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
-                    throw new IllegalArgumentException("抄表数据异常");
-                } else {
-                    BigDecimal curDegree = new BigDecimal(Double.parseDouble(feeDto.getCurDegrees()));
-                    BigDecimal preDegree = new BigDecimal(Double.parseDouble(feeDto.getPreDegrees()));
-                    BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
-                    BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                    BigDecimal sub = curDegree.subtract(preDegree);
-                    feePrice = sub.multiply(squarePrice)
-                            .add(additionalAmount)
-                            .setScale(2, BigDecimal.ROUND_HALF_EVEN);
-                    feeReceiptDetailPo.setArea(sub.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue() + "");
-                }
-            } else {
-                throw new IllegalArgumentException("暂不支持该类公式");
-            }
-        }
         BigDecimal cycles = null;
         //BigDecimal receivableAmount = feePrice;
         if ("-101".equals(paramInJson.getString("cycles"))) {//自定义缴费
@@ -283,6 +186,7 @@ public class FeeBMOImpl extends ApiBaseBMO implements IFeeBMO {
         feeReceiptPo.setReceiptId(feeReceiptDetailPo.getReceiptId());
         feeReceiptPo.setObjType(feeDto.getPayerObjType());
         feeReceiptPo.setObjId(feeDto.getPayerObjId());
+        feeReceiptPo.setObjName(computeFeeSMOImpl.getFeeObjName(feeDto));
         return business;
     }
 

+ 12 - 199
service-api/src/main/java/com/java110/api/listener/fee/ListFeeListener.java

@@ -5,7 +5,6 @@ import com.java110.api.listener.AbstractServiceApiListener;
 import com.java110.core.annotation.Java110Listener;
 import com.java110.core.context.DataFlowContext;
 import com.java110.core.event.service.api.ServiceDataFlowEvent;
-import com.java110.dto.RoomDto;
 import com.java110.dto.fee.FeeDto;
 import com.java110.dto.owner.OwnerCarDto;
 import com.java110.dto.parking.ParkingSpaceDto;
@@ -14,11 +13,11 @@ import com.java110.intf.community.IRoomInnerServiceSMO;
 import com.java110.intf.fee.IFeeConfigInnerServiceSMO;
 import com.java110.intf.fee.IFeeInnerServiceSMO;
 import com.java110.intf.user.IOwnerCarInnerServiceSMO;
+import com.java110.service.smo.IComputeFeeSMO;
 import com.java110.utils.constant.ServiceCodeFeeConfigConstant;
 import com.java110.utils.util.Assert;
 import com.java110.utils.util.BeanConvertUtil;
 import com.java110.utils.util.DateUtil;
-import com.java110.utils.util.StringUtil;
 import com.java110.vo.api.fee.ApiFeeDataVo;
 import com.java110.vo.api.fee.ApiFeeVo;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,8 +26,10 @@ import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 
 import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 
 /**
@@ -52,6 +53,9 @@ public class ListFeeListener extends AbstractServiceApiListener {
     @Autowired
     private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
 
+    @Autowired
+    private IComputeFeeSMO computeFeeSMOImpl;
+
 
     @Override
     public String getServiceCode() {
@@ -133,11 +137,11 @@ public class ListFeeListener extends AbstractServiceApiListener {
         for (FeeDto feeDto : feeDtos) {
 
             // 轮数 * 周期 * 30 + 开始时间 = 目标 到期时间
-            Map<String, Object> targetEndDateAndOweMonth = getTargetEndDateAndOweMonth(feeDto);
+            Map<String, Object> targetEndDateAndOweMonth = computeFeeSMOImpl.getTargetEndDateAndOweMonth(feeDto);
             Date targetEndDate = (Date) targetEndDateAndOweMonth.get("targetEndDate");
             double oweMonth = (double) targetEndDateAndOweMonth.get("oweMonth");
             //一次性费用
-            if ("3333".equals(feeDto.getPayerObjType())) { //房屋相关
+            if (FeeDto.PAYER_OBJ_TYPE_ROOM.equals(feeDto.getPayerObjType())) { //房屋相关
                 computeFeePriceByRoom(feeDto, oweMonth);
             } else if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeDto.getPayerObjType())) {//车位相关
                 computeFeePriceByCar(feeDto, oweMonth);
@@ -147,93 +151,6 @@ public class ListFeeListener extends AbstractServiceApiListener {
         }
     }
 
-    private Map getTargetEndDateAndOweMonth(FeeDto feeDto) {
-        Date targetEndDate = null;
-        double oweMonth = 0.0;
-
-        Map<String, Object> targetEndDateAndOweMonth = new HashMap<>();
-
-        if (FeeDto.STATE_FINISH.equals(feeDto.getState())) {
-            targetEndDate = feeDto.getEndTime();
-            targetEndDateAndOweMonth.put("oweMonth", oweMonth);
-            targetEndDateAndOweMonth.put("targetEndDate", targetEndDate);
-            return targetEndDateAndOweMonth;
-        }
-        if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
-            if (!StringUtil.isEmpty(feeDto.getCurDegrees())) {
-                targetEndDate = feeDto.getCurReadingTime();
-            } else if (feeDto.getImportFeeEndTime() == null) {
-                targetEndDate = feeDto.getConfigEndTime();
-            } else {
-                targetEndDate = feeDto.getImportFeeEndTime();
-            }
-            //判断当前费用是不是导入费用
-            oweMonth = 1.0;
-
-        } else {
-            //当前时间
-            Date billEndTime = DateUtil.getCurrentDate();
-            //开始时间
-            Date startDate = feeDto.getStartTime();
-            //到期时间
-            Date endDate = feeDto.getEndTime();
-            if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeDto.getPayerObjType())) {
-                OwnerCarDto ownerCarDto = new OwnerCarDto();
-                ownerCarDto.setCommunityId(feeDto.getCommunityId());
-                ownerCarDto.setCarId(feeDto.getPayerObjId());
-                List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
-
-                if (ownerCarDtos == null || ownerCarDtos.size() != 1) {
-                    targetEndDateAndOweMonth.put("oweMonth", 0);
-                    targetEndDateAndOweMonth.put("targetEndDate", "");
-                    return targetEndDateAndOweMonth;
-                }
-
-                targetEndDate = ownerCarDtos.get(0).getEndTime();
-                //说明没有欠费
-                if (endDate.getTime() >= targetEndDate.getTime()) {
-                    // 目标到期时间 - 到期时间 = 欠费月份
-                    oweMonth = 0;
-                    targetEndDateAndOweMonth.put("oweMonth", oweMonth);
-                    targetEndDateAndOweMonth.put("targetEndDate", targetEndDate);
-                    return targetEndDateAndOweMonth;
-                }
-            }
-
-            //缴费周期
-            long paymentCycle = Long.parseLong(feeDto.getPaymentCycle());
-            // 当前时间 - 开始时间  = 月份
-            double mulMonth = 0.0;
-            mulMonth = dayCompare(startDate, billEndTime);
-
-            // 月份/ 周期 = 轮数(向上取整)
-            double round = 0.0;
-            if ("1200".equals(feeDto.getPaymentCd())) { // 预付费
-                round = Math.floor(mulMonth / paymentCycle) + 1;
-            } else { //后付费
-                round = Math.floor(mulMonth / paymentCycle);
-            }
-            // 轮数 * 周期 * 30 + 开始时间 = 目标 到期时间
-            targetEndDate = getTargetEndTime(round * paymentCycle, startDate);
-            //费用 快结束了
-            if (feeDto.getConfigEndTime().getTime() < targetEndDate.getTime()) {
-                targetEndDate = feeDto.getConfigEndTime();
-            }
-            //说明没有欠费
-            if (endDate.getTime() < targetEndDate.getTime()) {
-                // 目标到期时间 - 到期时间 = 欠费月份
-                oweMonth = dayCompare(endDate, targetEndDate);
-            }
-
-            if (feeDto.getEndTime().getTime() > targetEndDate.getTime()) {
-                targetEndDate = feeDto.getEndTime();
-            }
-        }
-
-        targetEndDateAndOweMonth.put("oweMonth", oweMonth);
-        targetEndDateAndOweMonth.put("targetEndDate", targetEndDate);
-        return targetEndDateAndOweMonth;
-    }
 
     private void computeFeePriceByCar(FeeDto feeDto, double oweMonth) {
         OwnerCarDto ownerCarDto = new OwnerCarDto();
@@ -247,40 +164,12 @@ public class ListFeeListener extends AbstractServiceApiListener {
         parkingSpaceDto.setCommunityId(feeDto.getCommunityId());
         parkingSpaceDto.setPsId(ownerCarDtos.get(0).getPsId());
         List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
-
         if (parkingSpaceDtos == null || parkingSpaceDtos.size() < 1) { //数据有问题
             return;
         }
-
         String computingFormula = feeDto.getComputingFormula();
         double feePrice = 0.00;
-        if ("1001".equals(computingFormula)) { //面积*单价+附加费
-            BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
-            BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(parkingSpaceDtos.get(0).getArea()));
-            BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-            feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
-        } else if ("2002".equals(computingFormula)) { // 固定费用
-
-            BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-            feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
-        } else if ("4004".equals(computingFormula)) {
-            feePrice = Double.parseDouble(feeDto.getAmount());
-        } else if ("5005".equals(computingFormula)) {
-            if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
-                feePrice = -1.00;
-            } else {
-                BigDecimal curDegree = new BigDecimal(Double.parseDouble(feeDto.getCurDegrees()));
-                BigDecimal preDegree = new BigDecimal(Double.parseDouble(feeDto.getPreDegrees()));
-                BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
-                BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                BigDecimal sub = curDegree.subtract(preDegree);
-                feePrice = sub.multiply(squarePrice)
-                        .add(additionalAmount)
-                        .setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
-            }
-        } else {
-            feePrice = -1.00;
-        }
+        feePrice = computeFeeSMOImpl.getFeePrice(feeDto);
         feeDto.setFeePrice(feePrice);
         BigDecimal curFeePrice = new BigDecimal(feeDto.getFeePrice());
         curFeePrice = curFeePrice.multiply(new BigDecimal(oweMonth));
@@ -298,49 +187,13 @@ public class ListFeeListener extends AbstractServiceApiListener {
      * @param feeDto
      */
     private void computeFeePriceByRoom(FeeDto feeDto, double oweMonth) {
-        RoomDto roomDto = new RoomDto();
-        roomDto.setCommunityId(feeDto.getCommunityId());
-        roomDto.setRoomId(feeDto.getPayerObjId());
-        List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
-
-        if (roomDtos == null || roomDtos.size() < 1) { //数据有问题
-            return;
-        }
         String computingFormula = feeDto.getComputingFormula();
         double feePrice = 0.00;
-        if ("1001".equals(computingFormula)) { //面积*单价+附加费
-            BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
-            BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(roomDtos.get(0).getBuiltUpArea()));
-            BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-            feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
-        } else if ("2002".equals(computingFormula)) { // 固定费用
-            BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-            feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
-        } else if ("4004".equals(computingFormula)) {
-            feePrice = Double.parseDouble(feeDto.getAmount());
-        } else if ("5005".equals(computingFormula)) {
-
-            if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
-                feePrice = -1.00;
-            } else {
-                BigDecimal curDegree = new BigDecimal(Double.parseDouble(feeDto.getCurDegrees()));
-                BigDecimal preDegree = new BigDecimal(Double.parseDouble(feeDto.getPreDegrees()));
-                BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
-                BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                BigDecimal sub = curDegree.subtract(preDegree);
-                feePrice = sub.multiply(squarePrice)
-                        .add(additionalAmount)
-                        .setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
-            }
-        } else {
-            feePrice = -1.00;
-        }
-
+        feePrice = computeFeeSMOImpl.getFeePrice(feeDto);
         feeDto.setFeePrice(feePrice);
         BigDecimal curFeePrice = new BigDecimal(feeDto.getFeePrice());
         curFeePrice = curFeePrice.multiply(new BigDecimal(oweMonth));
         feeDto.setAmountOwed(curFeePrice.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue() + "");
-
         //动态费用
         if ("4004".equals(computingFormula)) {
             feeDto.setAmountOwed(feeDto.getFeePrice() + "");
@@ -348,44 +201,4 @@ public class ListFeeListener extends AbstractServiceApiListener {
         }
     }
 
-    /**
-     * 计算2个日期之间相差的  以年、月、日为单位,各自计算结果是多少
-     * 比如:2011-02-02 到  2017-03-02
-     * 以年为单位相差为:6年
-     * 以月为单位相差为:73个月
-     * 以日为单位相差为:2220天
-     *
-     * @param fromDate
-     * @param toDate
-     * @return
-     */
-    public static double dayCompare(Date fromDate, Date toDate) {
-        Calendar from = Calendar.getInstance();
-        from.setTime(fromDate);
-        Calendar to = Calendar.getInstance();
-        to.setTime(toDate);
-        int result = to.get(Calendar.MONTH) - from.get(Calendar.MONTH);
-        int month = (to.get(Calendar.YEAR) - from.get(Calendar.YEAR)) * 12;
-
-        result = result + month;
-        Calendar newFrom = Calendar.getInstance();
-        newFrom.setTime(fromDate);
-        newFrom.add(Calendar.MONTH, result);
-
-        long t1 = newFrom.getTimeInMillis();
-        long t2 = to.getTimeInMillis();
-        long days = (t2 - t1) / (24 * 60 * 60 * 1000);
-
-        BigDecimal tmpDays = new BigDecimal(days);
-        BigDecimal monthDay = new BigDecimal(30);
-
-        return tmpDays.divide(monthDay, 2, RoundingMode.HALF_UP).doubleValue() + result;
-    }
-
-    private Date getTargetEndTime(double v, Date startDate) {
-        Calendar endDate = Calendar.getInstance();
-        endDate.setTime(startDate);
-        endDate.add(Calendar.MONTH, (int) v);
-        return endDate.getTime();
-    }
 }

+ 14 - 94
service-fee/src/main/java/com/java110/fee/bmo/impl/PayOweFeeImpl.java

@@ -4,10 +4,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.java110.core.annotation.Java110Transactional;
 import com.java110.core.factory.GenerateCodeFactory;
-import com.java110.dto.RoomDto;
 import com.java110.dto.fee.*;
-import com.java110.dto.owner.OwnerCarDto;
-import com.java110.dto.parking.ParkingSpaceDto;
 import com.java110.dto.repair.RepairDto;
 import com.java110.fee.bmo.IPayOweFee;
 import com.java110.fee.listener.fee.UpdateFeeInfoListener;
@@ -22,8 +19,7 @@ import com.java110.po.fee.PayFeePo;
 import com.java110.po.feeReceipt.FeeReceiptPo;
 import com.java110.po.feeReceiptDetail.FeeReceiptDetailPo;
 import com.java110.po.owner.RepairPoolPo;
-import com.java110.utils.constant.FeeFlagTypeConstant;
-import com.java110.utils.constant.FeeStateConstant;
+import com.java110.service.smo.IComputeFeeSMO;
 import com.java110.utils.constant.ResponseConstant;
 import com.java110.utils.exception.ListenerExecuteException;
 import com.java110.utils.lock.DistributedLock;
@@ -39,7 +35,6 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.text.ParseException;
-import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 
@@ -82,6 +77,9 @@ public class PayOweFeeImpl implements IPayOweFee {
     @Autowired
     private IOwnerCarInnerServiceSMO ownerCarInnerServiceSMOImpl;
 
+    @Autowired
+    private IComputeFeeSMO computeFeeSMOImpl;
+
     /**
      * 欠费缴费
      *
@@ -186,35 +184,18 @@ public class PayOweFeeImpl implements IPayOweFee {
 
         PayFeePo payFeePo = new PayFeePo();
         FeeDto feeInfo = (FeeDto) feeObj.get("feeInfo");
-        Date endTime = feeInfo.getEndTime();
-        Calendar endCalender = Calendar.getInstance();
-        endCalender.setTime(endTime);
-        int hours = 0;
-        hours = new Double(Double.parseDouble(feeObj.getString("tmpCycles")) * DateUtil.getCurrentMonthDay() * 24).intValue();
-        endCalender.add(Calendar.HOUR, hours);
         FeeConfigDto feeConfigDto = new FeeConfigDto();
         feeConfigDto.setConfigId(feeInfo.getConfigId());
         feeConfigDto.setCommunityId(feeInfo.getCommunityId());
         List<FeeConfigDto> feeConfigDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
-
         Assert.listOnlyOne(feeConfigDtos, "未找到费用配置");
-        payFeePo.setEndTime(DateUtil.getFormatTimeString(endCalender.getTime(), DateUtil.DATE_FORMATE_STRING_A));
         feeObj.put("billType", feeConfigDtos.get(0).getBillType());
         feeObj.put("configId", feeConfigDtos.get(0).getConfigId());
-        // 一次性收费类型,缴费后,则设置费用状态为收费结束、设置结束日期为费用 项终止日期
-        if (FeeFlagTypeConstant.ONETIME.equals(feeConfigDtos.get(0).getFeeFlag())) {
-            payFeePo.setState(FeeStateConstant.END);
-            payFeePo.setEndTime(feeConfigDtos.get(0).getEndTime());
-        }
-        // 周期性收费、缴费后,到期日期在费用项终止日期后,则设置缴费状态结束,设置结束日期为费用项终止日期
-        if (FeeFlagTypeConstant.CYCLE.equals(feeConfigDtos.get(0).getFeeFlag())) {
-            if ((feeInfo.getEndTime()).after(DateUtil.getDateFromString(feeConfigDtos.get(0).getEndTime(), DateUtil.DATE_FORMATE_STRING_A))) {
-                payFeePo.setState(FeeStateConstant.END);
-                payFeePo.setEndTime(feeConfigDtos.get(0).getEndTime());
-            }
-        }
+        Date targetEndTime = computeFeeSMOImpl.getFeeEndTimeByCycles(feeInfo, feeObj.getString("tmpCycles"));
+        String state = computeFeeSMOImpl.getFeeStateByCycles(feeInfo, feeObj.getString("tmpCycles"));
         payFeePo.setFeeId(feeObj.getString("feeId"));
-        //payFeePo.setEndTime(DateUtil.getFormatTimeString(feeInfo.getEndTime(), DateUtil.DATE_FORMATE_STRING_A));
+        payFeePo.setEndTime(DateUtil.getFormatTimeString(targetEndTime, DateUtil.DATE_FORMATE_STRING_A));
+        payFeePo.setState(state);
         payFeePo.setCommunityId(feeObj.getString("communityId"));
         payFeePo.setStatusCd("0");
         int saveFlag = feeInnerServiceSMOImpl.updateFee(payFeePo);
@@ -232,88 +213,24 @@ public class PayOweFeeImpl implements IPayOweFee {
 
         PayFeeDetailPo payFeeDetailPo = new PayFeeDetailPo();
         payFeeDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId));
-
         payFeeDetailPo.setPrimeRate("1.00");
         //计算 应收金额
         FeeDto feeDto = new FeeDto();
         feeDto.setFeeId(paramInJson.getString("feeId"));
         feeDto.setCommunityId(paramInJson.getString("communityId"));
         List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
-
         if (feeDtos == null || feeDtos.size() != 1) {
             throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "查询费用信息失败,未查到数据或查到多条数据");
         }
-
         feeDto = feeDtos.get(0);
         paramInJson.put("feeInfo", feeDto);
-
-        BigDecimal feePrice = new BigDecimal("0.00");
-
-        if ("3333".equals(feeDto.getPayerObjType())) { //房屋相关
-            String computingFormula = feeDto.getComputingFormula();
-            RoomDto roomDto = new RoomDto();
-            roomDto.setRoomId(feeDto.getPayerObjId());
-            roomDto.setCommunityId(feeDto.getCommunityId());
-            List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
-            if (roomDtos == null || roomDtos.size() != 1) {
-                throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "未查到房屋信息,查询多条数据");
-            }
-            roomDto = roomDtos.get(0);
-            feeReceiptPo.setObjName(roomDto.getFloorNum() + "栋" + roomDto.getUnitNum() + "单元" + roomDto.getRoomNum());
-            if ("1001".equals(computingFormula)) { //面积*单价+附加费
-
-                //feePrice = Double.parseDouble(feeDto.getSquarePrice()) * Double.parseDouble(roomDtos.get(0).getBuiltUpArea()) + Double.parseDouble(feeDto.getAdditionalAmount());
-                BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
-                BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(roomDtos.get(0).getBuiltUpArea()));
-                BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
-            } else if ("2002".equals(computingFormula)) { // 固定费用
-                //feePrice = Double.parseDouble(feeDto.getAdditionalAmount());
-                BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN);
-            } else if ("4004".equals(computingFormula)) {
-                feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
-            } else {
-                throw new IllegalArgumentException("暂不支持该类公式");
-            }
-        } else if ("6666".equals(feeDto.getPayerObjType())) {//车位相关
-            String computingFormula = feeDto.getComputingFormula();
-            OwnerCarDto ownerCarDto = new OwnerCarDto();
-            ownerCarDto.setCommunityId(feeDto.getCommunityId());
-            ownerCarDto.setCarId(feeDto.getPayerObjId());
-            List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
-
-            if (ownerCarDtos != null && ownerCarDtos.size() > 0) {
-                feeReceiptPo.setObjName(ownerCarDtos.get(0).getCarNum());
-            }
-            if ("1001".equals(computingFormula)) { //面积*单价+附加费
-                ParkingSpaceDto parkingSpaceDto = new ParkingSpaceDto();
-                parkingSpaceDto.setCommunityId(feeDto.getCommunityId());
-                parkingSpaceDto.setPsId(feeDto.getPayerObjId());
-                List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
-
-                if (parkingSpaceDtos == null || parkingSpaceDtos.size() < 1) { //数据有问题
-                    throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "未查到停车位信息,查询多条数据");
-                }
-                //feePrice = Double.parseDouble(feeDto.getSquarePrice()) * Double.parseDouble(parkingSpaceDtos.get(0).getArea()) + Double.parseDouble(feeDto.getAdditionalAmount());
-                BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
-                BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(parkingSpaceDtos.get(0).getArea()));
-                BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
-            } else if ("2002".equals(computingFormula)) { // 固定费用
-                //feePrice = Double.parseDouble(feeDto.getAdditionalAmount());
-                BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN);
-            } else if ("4004".equals(computingFormula)) {
-                feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
-            } else {
-                throw new IllegalArgumentException("暂不支持该类公式");
-            }
-        }
+        payFeeDetailPo.setStartTime(DateUtil.getFormatTimeString(feeDto.getEndTime(), DateUtil.DATE_FORMATE_STRING_A));
+        BigDecimal feePrice = new BigDecimal(computeFeeSMOImpl.getFeePrice(feeDto));
 
         BigDecimal receivedAmount = new BigDecimal(Double.parseDouble(paramInJson.getString("feePrice")));
         BigDecimal cycles = receivedAmount.divide(feePrice, 2, BigDecimal.ROUND_HALF_EVEN);
         paramInJson.put("tmpCycles", cycles);
+        payFeeDetailPo.setEndTime(computeFeeSMOImpl.getFeeStateByCycles(feeDto, cycles.doubleValue() + ""));
         payFeeDetailPo.setCommunityId(paramInJson.getString("communityId"));
         payFeeDetailPo.setCycles(cycles.doubleValue() + "");
         payFeeDetailPo.setReceivableAmount(receivedAmount.doubleValue() + "");
@@ -343,5 +260,8 @@ public class PayOweFeeImpl implements IPayOweFee {
         feeReceiptPo.setCommunityId(feeReceiptDetailPo.getCommunityId());
         feeReceiptPo.setObjType(feeDto.getPayerObjType());
         feeReceiptPo.setObjId(feeDto.getPayerObjId());
+        if (StringUtil.isEmpty(feeReceiptPo.getObjName())) {
+            feeReceiptPo.setObjName(computeFeeSMOImpl.getFeeObjName(feeDto));
+        }
     }
 }

+ 13 - 243
service-job/src/main/java/com/java110/job/task/fee/GenerateBillProTemplate.java

@@ -6,7 +6,6 @@ import com.java110.dto.community.CommunityDto;
 import com.java110.dto.fee.*;
 import com.java110.dto.owner.OwnerCarDto;
 import com.java110.dto.owner.OwnerRoomRelDto;
-import com.java110.dto.parking.ParkingSpaceDto;
 import com.java110.dto.task.TaskDto;
 import com.java110.intf.community.IParkingSpaceInnerServiceSMO;
 import com.java110.intf.community.IRoomInnerServiceSMO;
@@ -16,6 +15,7 @@ import com.java110.intf.fee.IFeeInnerServiceSMO;
 import com.java110.intf.user.IOwnerCarInnerServiceSMO;
 import com.java110.intf.user.IOwnerRoomRelInnerServiceSMO;
 import com.java110.job.quartz.TaskSystemQuartz;
+import com.java110.service.smo.IComputeFeeSMO;
 import com.java110.utils.constant.ResponseConstant;
 import com.java110.utils.exception.TaskTemplateException;
 import com.java110.utils.util.DateUtil;
@@ -24,8 +24,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.*;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 /**
  * @ClassName GenerateOwnerBillTemplate
@@ -68,6 +70,9 @@ public class GenerateBillProTemplate extends TaskSystemQuartz {
     @Autowired
     private IOwnerCarInnerServiceSMO ownerCarInnerServiceSMOImpl;
 
+    @Autowired
+    private IComputeFeeSMO computeFeeSMOImpl;
+
 
     @Override
     protected void process(TaskDto taskDto) throws Exception {
@@ -185,7 +190,7 @@ public class GenerateBillProTemplate extends TaskSystemQuartz {
      */
     private void generateFee(Date startTime, FeeDto feeDto, BillDto billDto, FeeConfigDto feeConfigDto) {
 
-        if ("2009001".equals(feeDto.getState())) { //判断是否缴费结束
+        if (FeeDto.STATE_FINISH.equals(feeDto.getState())) { //判断是否缴费结束
             return;
         }
 
@@ -196,7 +201,7 @@ public class GenerateBillProTemplate extends TaskSystemQuartz {
         // 目标到期时间 - 到期时间 = 欠费月份
         // 月份 * 每月单价 = 欠费金额
 
-        Map<String, Object> targetEndDateAndOweMonth = getTargetEndDateAndOweMonth(feeDto);
+        Map<String, Object> targetEndDateAndOweMonth = computeFeeSMOImpl.getTargetEndDateAndOweMonth(feeDto);
         Date targetEndDate = (Date) targetEndDateAndOweMonth.get("targetEndDate");
         double oweMonth = (double) targetEndDateAndOweMonth.get("oweMonth");
 
@@ -211,16 +216,8 @@ public class GenerateBillProTemplate extends TaskSystemQuartz {
         if (oweMonth <= 0.0) {
             return;
         }
-
-        if (FeeDto.PAYER_OBJ_TYPE_ROOM.equals(feeDto.getPayerObjType())) {
-            computeFeePriceByRoom(feeDto);
-        } else if (FeeDto.PAYER_OBJ_TYPE_PARKING_SPACE.equals(feeDto.getPayerObjType())) {
-            computeFeePriceByParkingSpace(feeDto);
-        } else {
-            return;//这个没有欠费可算
-            //throw new IllegalArgumentException("暂不支持该类型出账" + feeDto.getFeeId());
-        }
-
+        double tmpFeePrice = computeFeeSMOImpl.getFeePrice(feeDto);
+        feeDto.setFeePrice(tmpFeePrice);
         if (feeDto.getFeePrice() <= 0) {
             return;//这个没有欠费可算
         }
@@ -241,7 +238,7 @@ public class GenerateBillProTemplate extends TaskSystemQuartz {
         billOweFeeDto.setPayerObjType(feeDto.getPayerObjType());
         billOweFeeDto.setState("1000");
         billOweFeeDto.setDeadlineTime(DateUtil.getFormatTimeString(targetEndDate, DateUtil.DATE_FORMATE_STRING_A));
-        if ("3333".equals(feeDto.getPayerObjType())) {
+        if (FeeDto.PAYER_OBJ_TYPE_ROOM.equals(feeDto.getPayerObjType())) {
             getRoomInfo(billOweFeeDto, feeDto);
         } else {
             getParkingSpaceInfo(billOweFeeDto, feeDto);
@@ -281,97 +278,6 @@ public class GenerateBillProTemplate extends TaskSystemQuartz {
         billDto.setReceipts(curReceipts.doubleValue() + "");
     }
 
-    private Map getTargetEndDateAndOweMonth(FeeDto feeDto) {
-        Date targetEndDate = null;
-        double oweMonth = 0.0;
-
-        Map<String, Object> targetEndDateAndOweMonth = new HashMap<>();
-
-        if (FeeDto.STATE_FINISH.equals(feeDto.getState())) {
-            targetEndDate = feeDto.getEndTime();
-            targetEndDateAndOweMonth.put("oweMonth", oweMonth);
-            targetEndDateAndOweMonth.put("targetEndDate", targetEndDate);
-            return targetEndDateAndOweMonth;
-        }
-        if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
-            if (feeDto.getImportFeeEndTime() == null) {
-                targetEndDate = feeDto.getConfigEndTime();
-            } else {
-                targetEndDate = feeDto.getImportFeeEndTime();
-            }
-            //判断当前费用是不是导入费用
-            oweMonth = 1.0;
-
-        } else {
-            //当前时间
-            Date billEndTime = DateUtil.getCurrentDate();
-            //开始时间
-            Date startDate = feeDto.getStartTime();
-            //到期时间
-            Date endDate = feeDto.getEndTime();
-            if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeDto.getPayerObjType())) {
-                OwnerCarDto ownerCarDto = new OwnerCarDto();
-                ownerCarDto.setCommunityId(feeDto.getCommunityId());
-                ownerCarDto.setCarId(feeDto.getPayerObjId());
-                List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
-
-                if (ownerCarDtos == null || ownerCarDtos.size() != 1) {
-                    targetEndDateAndOweMonth.put("oweMonth", 0);
-                    targetEndDateAndOweMonth.put("targetEndDate", "");
-                    return targetEndDateAndOweMonth;
-                }
-
-                targetEndDate = ownerCarDtos.get(0).getEndTime();
-                //说明没有欠费
-                if (endDate.getTime() < targetEndDate.getTime()) {
-                    // 目标到期时间 - 到期时间 = 欠费月份
-                    oweMonth = dayCompare(endDate, targetEndDate);
-                }
-                targetEndDateAndOweMonth.put("oweMonth", oweMonth);
-                targetEndDateAndOweMonth.put("targetEndDate", targetEndDate);
-                return targetEndDateAndOweMonth;
-            }
-            //缴费周期
-            long paymentCycle = Long.parseLong(feeDto.getPaymentCycle());
-            // 当前时间 - 开始时间  = 月份
-            double mulMonth = dayCompare(startDate, billEndTime);
-            // 月份/ 周期 = 轮数(向上取整)
-            double round = 0.0;
-            if ("1200".equals(feeDto.getPaymentCd())) { // 预付费
-                round = Math.floor(mulMonth / paymentCycle) + 1;
-            } else { //后付费
-                round = Math.floor(mulMonth / paymentCycle);
-            }
-            // 轮数 * 周期 * 30 + 开始时间 = 目标 到期时间
-            targetEndDate = getTargetEndTime(round * paymentCycle, startDate);
-            //费用 快结束了
-            if (feeDto.getConfigEndTime().getTime() < targetEndDate.getTime()) {
-                targetEndDate = feeDto.getConfigEndTime();
-            }
-            //说明没有欠费
-            if (endDate.getTime() < targetEndDate.getTime()) {
-                // 目标到期时间 - 到期时间 = 欠费月份
-                oweMonth = dayCompare(endDate, targetEndDate);
-            }
-
-            if (feeDto.getEndTime().getTime() > targetEndDate.getTime()) {
-                targetEndDate = feeDto.getEndTime();
-            }
-        }
-
-        targetEndDateAndOweMonth.put("oweMonth", oweMonth);
-        targetEndDateAndOweMonth.put("targetEndDate", targetEndDate);
-        return targetEndDateAndOweMonth;
-    }
-
-    private Date getTargetEndTime(double v, Date startDate) {
-        Calendar endDate = Calendar.getInstance();
-        endDate.setTime(startDate);
-        endDate.add(Calendar.MONTH, (int) v);
-        return endDate.getTime();
-    }
-
-
     /**
      * 查询车位信息
      *
@@ -474,141 +380,5 @@ public class GenerateBillProTemplate extends TaskSystemQuartz {
 
     }
 
-    /**
-     * 根据房屋来算单价
-     *
-     * @param feeDto
-     */
-    private void computeFeePriceByRoom(FeeDto feeDto) {
-        RoomDto roomDto = new RoomDto();
-        roomDto.setCommunityId(feeDto.getCommunityId());
-        roomDto.setRoomId(feeDto.getPayerObjId());
-        List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
-
-        if (roomDtos == null || roomDtos.size() < 1) { //数据有问题
-            return;
-        }
-
-        String computingFormula = feeDto.getComputingFormula();
-        double feePrice = 0.00;
-        if ("1001".equals(computingFormula)) { //面积*单价+附加费
-            BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
-            BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(roomDtos.get(0).getBuiltUpArea()));
-            BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-            feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
-        } else if ("2002".equals(computingFormula)) { // 固定费用
-            BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-            feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
-        } else {
-            feePrice = -1.00;
-        }
-
-        feeDto.setFeePrice(feePrice);
-
-        //查询业主信息
-
-
-    }
-
-    /**
-     * 根据车位来算单价
-     *
-     * @param feeDto
-     */
-    private void computeFeePriceByParkingSpace(FeeDto feeDto) {
-
-        OwnerCarDto ownerCarDto = new OwnerCarDto();
-        ownerCarDto.setCommunityId(feeDto.getCommunityId());
-        ownerCarDto.setCarId(feeDto.getPayerObjId());
-        List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
-        if (ownerCarDtos == null || ownerCarDtos.size() < 1) { //数据有问题
-            return;
-        }
-
-        ParkingSpaceDto parkingSpaceDto = new ParkingSpaceDto();
-        parkingSpaceDto.setCommunityId(feeDto.getCommunityId());
-        parkingSpaceDto.setPsId(ownerCarDtos.get(0).getPsId());
-        List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
-
-        if (parkingSpaceDtos == null || parkingSpaceDtos.size() < 1) { //数据有问题
-            return;
-        }
-
-        String computingFormula = feeDto.getComputingFormula();
-        double feePrice = 0.00;
-        if ("1001".equals(computingFormula)) { //面积*单价+附加费
-            BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
-            BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(parkingSpaceDtos.get(0).getArea()));
-            BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-            feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
-        } else if ("2002".equals(computingFormula)) { // 固定费用
-            BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-            feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
-        } else {
-            feePrice = -1.00;
-        }
-
-        feeDto.setFeePrice(feePrice);
-    }
-
-    /**
-     * 计算2个日期之间相差的  以年、月、日为单位,各自计算结果是多少
-     * 比如:2011-02-02 到  2017-03-02
-     * 以年为单位相差为:6年
-     * 以月为单位相差为:73个月
-     * 以日为单位相差为:2220天
-     *
-     * @param fromDate
-     * @param toDate
-     * @return
-     */
-    public static int monthCompare(Date fromDate, Date toDate) {
-        Calendar from = Calendar.getInstance();
-        from.setTime(fromDate);
-        Calendar to = Calendar.getInstance();
-        to.setTime(toDate);
-        //只要年月
-        int fromYear = from.get(Calendar.YEAR);
-        int fromMonth = from.get(Calendar.MONTH);
-        int toYear = to.get(Calendar.YEAR);
-        int toMonth = to.get(Calendar.MONTH);
-        int month = toYear * 12 + toMonth - (fromYear * 12 + fromMonth);
-        return month;
-    }
-
-    /**
-     * 计算2个日期之间相差的  以年、月、日为单位,各自计算结果是多少
-     * 比如:2011-02-02 到  2017-03-02
-     * 以年为单位相差为:6年
-     * 以月为单位相差为:73个月
-     * 以日为单位相差为:2220天
-     *
-     * @param fromDate
-     * @param toDate
-     * @return
-     */
-    public static double dayCompare(Date fromDate, Date toDate) {
-        Calendar from = Calendar.getInstance();
-        from.setTime(fromDate);
-        Calendar to = Calendar.getInstance();
-        to.setTime(toDate);
-        int result = to.get(Calendar.MONTH) - from.get(Calendar.MONTH);
-        int month = (to.get(Calendar.YEAR) - from.get(Calendar.YEAR)) * 12;
-
-        result = result + month;
-        Calendar newFrom = Calendar.getInstance();
-        newFrom.setTime(fromDate);
-        newFrom.add(Calendar.MONTH, result);
-
-        long t1 = newFrom.getTimeInMillis();
-        long t2 = to.getTimeInMillis();
-        long days = (t2 - t1) / (24 * 60 * 60 * 1000);
-
-        BigDecimal tmpDays = new BigDecimal(days);
-        BigDecimal monthDay = new BigDecimal(30);
-
-        return tmpDays.divide(monthDay, 2, RoundingMode.HALF_UP).doubleValue() + result;
-    }
-
 
 }