java110 před 5 roky
rodič
revize
44a8df5c81

+ 9 - 0
java110-bean/src/main/java/com/java110/dto/fee/BillOweFeeDto.java

@@ -32,6 +32,7 @@ public class BillOweFeeDto extends PageDto implements Serializable {
     private String state;
     private String createTime;
     private String[] ownerIds;
+    private String deadlineTime;
 
 
     public String getOweId() {
@@ -153,4 +154,12 @@ public class BillOweFeeDto extends PageDto implements Serializable {
     public void setOwnerIds(String[] ownerIds) {
         this.ownerIds = ownerIds;
     }
+
+    public String getDeadlineTime() {
+        return deadlineTime;
+    }
+
+    public void setDeadlineTime(String deadlineTime) {
+        this.deadlineTime = deadlineTime;
+    }
 }

+ 23 - 0
java110-bean/src/main/java/com/java110/dto/fee/FeeDto.java

@@ -75,6 +75,7 @@ public class FeeDto extends PageDto implements Serializable {
 
     private Date createTime;
 
+
     private String statusCd = "0";
 
     /**
@@ -86,6 +87,12 @@ public class FeeDto extends PageDto implements Serializable {
      */
     private Date configEndTime;
 
+    private Date deadlineTime;
+
+    private Date importFeeEndTime;
+
+
+
 
     public String getAmount() {
         return amount;
@@ -424,4 +431,20 @@ public class FeeDto extends PageDto implements Serializable {
     public void setOwnerTel(String ownerTel) {
         this.ownerTel = ownerTel;
     }
+
+    public Date getDeadlineTime() {
+        return deadlineTime;
+    }
+
+    public void setDeadlineTime(Date deadlineTime) {
+        this.deadlineTime = deadlineTime;
+    }
+
+    public Date getImportFeeEndTime() {
+        return importFeeEndTime;
+    }
+
+    public void setImportFeeEndTime(Date importFeeEndTime) {
+        this.importFeeEndTime = importFeeEndTime;
+    }
 }

+ 27 - 0
java110-bean/src/main/java/com/java110/vo/api/fee/ApiFeeDataVo.java

@@ -39,6 +39,9 @@ public class ApiFeeDataVo implements Serializable {
     private String paymentCd;
 
     private String paymentCycle;
+    private String computingFormula;
+    private String deadlineTime;
+    private String amountOwed;
     public String getAmount() {
         return amount;
     }
@@ -214,4 +217,28 @@ public class ApiFeeDataVo implements Serializable {
     public void setAdditionalAmount(String additionalAmount) {
         this.additionalAmount = additionalAmount;
     }
+
+    public String getComputingFormula() {
+        return computingFormula;
+    }
+
+    public void setComputingFormula(String computingFormula) {
+        this.computingFormula = computingFormula;
+    }
+
+    public String getDeadlineTime() {
+        return deadlineTime;
+    }
+
+    public void setDeadlineTime(String deadlineTime) {
+        this.deadlineTime = deadlineTime;
+    }
+
+    public String getAmountOwed() {
+        return amountOwed;
+    }
+
+    public void setAmountOwed(String amountOwed) {
+        this.amountOwed = amountOwed;
+    }
 }

+ 2 - 1
java110-db/src/main/resources/mapper/fee/FeeServiceDaoImplMapper.xml

@@ -140,7 +140,7 @@
         computingFormula,
         pfc.bill_type billType,t.payer_obj_type,t.payer_obj_type payerObjType,pfc.is_default isDefault,pfc.start_time
         configStartTime,pfc.end_time configEndTime,pfc.payment_cd paymentCd,pfc.payment_cycle paymentCycle,td4.name
-        billTypeName,pfa.value importFeeName
+        billTypeName,pfa.value importFeeName,ifd.end_time importFeeEndTime
         from pay_fee t
         INNER join pay_fee_config pfc on t.fee_type_cd = pfc.fee_type_cd and t.config_id = pfc.config_id and
         pfc.status_cd = '0'
@@ -152,6 +152,7 @@
         left join t_dict td4 on pfc.bill_type = td4.status_cd and td4.table_name = 'pay_fee_config' and
         td4.table_columns = 'bill_type'
         LEFT JOIN pay_fee_attrs pfa on t.fee_id = pfa.fee_id and pfa.spec_cd = '390002' and pfa.status_cd = '0'
+        left join import_fee_detail ifd on t.fee_id = ifd.fee_id and ifd.status_cd = '0' and t.fee_flag = '2006012'
         where 1 =1
         <if test="amount !=null and amount != ''">
             and t.amount= #{amount}

+ 120 - 9
service-api/src/main/java/com/java110/api/listener/fee/ListFeeListener.java

@@ -5,16 +5,18 @@ 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.parking.ParkingSpaceDto;
+import com.java110.intf.IImportFeeDetailInnerServiceSMO;
 import com.java110.intf.community.IParkingSpaceInnerServiceSMO;
 import com.java110.intf.community.IRoomInnerServiceSMO;
 import com.java110.intf.fee.IFeeConfigInnerServiceSMO;
 import com.java110.intf.fee.IFeeInnerServiceSMO;
-import com.java110.dto.RoomDto;
-import com.java110.dto.fee.FeeDto;
-import com.java110.dto.parking.ParkingSpaceDto;
 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.vo.api.fee.ApiFeeDataVo;
 import com.java110.vo.api.fee.ApiFeeVo;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -23,8 +25,8 @@ import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
+import java.math.RoundingMode;
+import java.util.*;
 
 
 /**
@@ -45,6 +47,8 @@ public class ListFeeListener extends AbstractServiceApiListener {
     @Autowired
     private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
 
+    private IImportFeeDetailInnerServiceSMO importFeeDetailInnerServiceSMOImpl;
+
     @Override
     public String getServiceCode() {
         return ServiceCodeFeeConfigConstant.LIST_FEE;
@@ -111,15 +115,80 @@ public class ListFeeListener extends AbstractServiceApiListener {
     private void computeFeePrice(List<FeeDto> feeDtos) {
 
         for (FeeDto feeDto : feeDtos) {
+
+            // 轮数 * 周期 * 30 + 开始时间 = 目标 到期时间
+            Map<String, Object> targetEndDateAndOweMonth = getTargetEndDateAndOweMonth(feeDto);
+            Date targetEndDate = (Date) targetEndDateAndOweMonth.get("targetEndDate");
+            double oweMonth = (double) targetEndDateAndOweMonth.get("oweMonth");
+            //一次性费用
             if ("3333".equals(feeDto.getPayerObjType())) { //房屋相关
-                computeFeePriceByRoom(feeDto);
+                computeFeePriceByRoom(feeDto, oweMonth);
             } else if ("6666".equals(feeDto.getPayerObjType())) {//车位相关
-                computeFeePriceByParkingSpace(feeDto);
+                computeFeePriceByParkingSpace(feeDto, oweMonth);
+            }
+
+            feeDto.setDeadlineTime(targetEndDate);
+        }
+    }
+
+    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();
+            //缴费周期
+            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 * 30, startDate);
+            //费用 快结束了
+            if (feeDto.getConfigEndTime().getTime() < targetEndDate.getTime()) {
+                targetEndDate = feeDto.getConfigEndTime();
+            }
+            //说明没有欠费
+            if (endDate.getTime() < targetEndDate.getTime()) {
+                // 目标到期时间 - 到期时间 = 欠费月份
+                oweMonth = dayCompare(endDate, targetEndDate);
             }
         }
+
+        targetEndDateAndOweMonth.put("oweMonth", oweMonth);
+        targetEndDateAndOweMonth.put("targetEndDate", targetEndDate);
+        return targetEndDateAndOweMonth;
     }
 
-    private void computeFeePriceByParkingSpace(FeeDto feeDto) {
+    private void computeFeePriceByParkingSpace(FeeDto feeDto, double oweMonth) {
 
         ParkingSpaceDto parkingSpaceDto = new ParkingSpaceDto();
         parkingSpaceDto.setCommunityId(feeDto.getCommunityId());
@@ -149,6 +218,10 @@ public class ListFeeListener extends AbstractServiceApiListener {
 
         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() + "");
+
 
     }
 
@@ -157,7 +230,7 @@ public class ListFeeListener extends AbstractServiceApiListener {
      *
      * @param feeDto
      */
-    private void computeFeePriceByRoom(FeeDto feeDto) {
+    private void computeFeePriceByRoom(FeeDto feeDto, double oweMonth) {
         RoomDto roomDto = new RoomDto();
         roomDto.setCommunityId(feeDto.getCommunityId());
         roomDto.setRoomId(feeDto.getPayerObjId());
@@ -184,5 +257,43 @@ public class ListFeeListener extends AbstractServiceApiListener {
         }
 
         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() + "");
+    }
+
+    /**
+     * 计算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);
+
+        long t1 = from.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();
+    }
+
+
+    private Date getTargetEndTime(double v, Date startDate) {
+        Calendar endDate = Calendar.getInstance();
+        endDate.setTime(startDate);
+        endDate.add(Calendar.DATE, (int) v);
+        return endDate.getTime();
     }
 }

+ 64 - 25
service-job/src/main/java/com/java110/job/task/fee/GenerateBillProTemplate.java

@@ -25,9 +25,7 @@ import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 /**
  * @ClassName GenerateOwnerBillTemplate
@@ -198,35 +196,22 @@ public class GenerateBillProTemplate extends TaskSystemQuartz {
         // 目标到期时间 - 到期时间 = 欠费月份
         // 月份 * 每月单价 = 欠费金额
 
+        Map<String, Object> targetEndDateAndOweMonth = getTargetEndDateAndOweMonth(feeDto);
+        Date targetEndDate = (Date) targetEndDateAndOweMonth.get("targetEndDate");
+        double oweMonth = (double) targetEndDateAndOweMonth.get("oweMonth");
+
         //当前时间
         Date billEndTime = DateUtil.getCurrentDate();
-        //开始时间
-        Date startDate = feeDto.getStartTime();
-        //到期时间
-        Date endDate = feeDto.getEndTime();
+
         //缴费周期
         long paymentCycle = Long.parseLong(feeConfigDto.getPaymentCycle());
-        // 当前时间 - 开始时间  = 月份
-        double mulMonth = dayCompare(startDate, billEndTime);
-        // 月份/ 周期 = 轮数(向上取整)
-        double round = 0.0;
-        if ("1200".equals(feeConfigDto.getPaymentCd())) { // 预付费
-            round = Math.floor(mulMonth / paymentCycle) + 1;
-        } else { //后付费
-            round = Math.floor(mulMonth / paymentCycle);
-        }
-        // 轮数 * 周期 * 30 + 开始时间 = 目标 到期时间
-        Date targetEndDate = getTargetEndTime(round * paymentCycle * 30, startDate);
+
 
         //说明没有欠费
-        if (endDate.getTime() > targetEndDate.getTime()) {
+        if (oweMonth <= 0.0) {
             return;
         }
 
-        // 目标到期时间 - 到期时间 = 欠费月份
-        double oweMonth = dayCompare(endDate, targetEndDate);
-
-
         if (FeeDto.PAYER_OBJ_TYPE_ROOM.equals(feeDto.getPayerObjType())) {
             computeFeePriceByRoom(feeDto);
         } else if (FeeDto.PAYER_OBJ_TYPE_PARKING_SPACE.equals(feeDto.getPayerObjType())) {
@@ -255,7 +240,7 @@ public class GenerateBillProTemplate extends TaskSystemQuartz {
         billOweFeeDto.setCommunityId(feeDto.getCommunityId());
         billOweFeeDto.setPayerObjType(feeDto.getPayerObjType());
         billOweFeeDto.setState("1000");
-
+        billOweFeeDto.setDeadlineTime(DateUtil.getFormatTimeString(targetEndDate, DateUtil.DATE_FORMATE_STRING_A));
         if ("3333".equals(feeDto.getPayerObjType())) {
             getRoomInfo(billOweFeeDto, feeDto);
         } else {
@@ -293,10 +278,64 @@ public class GenerateBillProTemplate extends TaskSystemQuartz {
                 curReceipts = recAmount.add(curReceipts);
             }
         }
-
         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();
+            //缴费周期
+            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 * 30, startDate);
+            //费用 快结束了
+            if (feeDto.getConfigEndTime().getTime() < targetEndDate.getTime()) {
+                targetEndDate = feeDto.getConfigEndTime();
+            }
+            //说明没有欠费
+            if (endDate.getTime() < targetEndDate.getTime()) {
+                // 目标到期时间 - 到期时间 = 欠费月份
+                oweMonth = dayCompare(endDate, targetEndDate);
+            }
+        }
 
+        targetEndDateAndOweMonth.put("oweMonth", oweMonth);
+        targetEndDateAndOweMonth.put("targetEndDate", targetEndDate);
+        return targetEndDateAndOweMonth;
     }
 
     private Date getTargetEndTime(double v, Date startDate) {