소스 검색

优化报表

java110 4 년 전
부모
커밋
f47fdbe821

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

@@ -139,6 +139,11 @@ public interface IComputeFeeSMO {
      */
     double dayCompare(Date fromDate, Date toDate);
 
+    /**
+        *字符串的日期格式的计算
+        */
+    long daysBetween(Date smdate,Date bdate) ;
+
     double getReportFeePrice(ReportFeeDto tmpReportFeeDto, ReportRoomDto reportRoomDto, ReportCarDto reportCarDto);
 
     void computeEveryOweFee(FeeDto tmpFeeDto);

+ 20 - 14
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java

@@ -5,11 +5,7 @@ import com.java110.dto.RoomDto;
 import com.java110.dto.community.CommunityDto;
 import com.java110.dto.contract.ContractDto;
 import com.java110.dto.contractRoom.ContractRoomDto;
-import com.java110.dto.fee.BillDto;
-import com.java110.dto.fee.BillOweFeeDto;
-import com.java110.dto.fee.FeeAttrDto;
-import com.java110.dto.fee.FeeConfigDto;
-import com.java110.dto.fee.FeeDto;
+import com.java110.dto.fee.*;
 import com.java110.dto.machine.CarInoutDetailDto;
 import com.java110.dto.machine.CarInoutDto;
 import com.java110.dto.owner.OwnerCarDto;
@@ -44,12 +40,7 @@ import javax.script.ScriptEngine;
 import javax.script.ScriptEngineManager;
 import java.math.BigDecimal;
 import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 费用计算 服务类
@@ -1531,6 +1522,21 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
         return resMonth;
     }
 
+    /**
+     *    *字符串的日期格式的计算
+     */
+    public long daysBetween(Date smdate, Date bdate) {
+        long between_days = 0;
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(smdate);
+        long time1 = cal.getTimeInMillis();
+        cal.setTime(bdate);
+        long time2 = cal.getTimeInMillis();
+        between_days = (time2 - time1) / (1000 * 3600 * 24);
+
+        return between_days;
+    }
+
     @Override
     public Date getTargetEndTime(double month, Date startDate) {
         Calendar endDate = Calendar.getInstance();
@@ -1580,10 +1586,10 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
         ComputeFeeSMOImpl computeFeeSMO = new ComputeFeeSMOImpl();
         try {
             double month = computeFeeSMO.dayCompare(
-                    DateUtil.getDateFromString("2021-6-1 00:00:00", DateUtil.DATE_FORMATE_STRING_A),
-                    DateUtil.getDateFromString("2021-8-5 18:00:00", DateUtil.DATE_FORMATE_STRING_A)
+                    DateUtil.getDateFromString("2021-09-30 14:20:02", DateUtil.DATE_FORMATE_STRING_A),
+                    DateUtil.getDateFromString("2021-11-03 14:20:02", DateUtil.DATE_FORMATE_STRING_A)
             );
-            System.out.println(month);
+            System.out.println(Math.ceil(month));
         } catch (ParseException e) {
             e.printStackTrace();
         }

+ 5 - 0
java110-utils/src/main/java/com/java110/utils/util/DateUtil.java

@@ -369,6 +369,7 @@ public class DateUtil {
         return curDate;
     }
 
+
     public static String getNextMonthFirstDay(String fmt) {
         String returndate = "";
         Date date = getNextMonthFirstDate();
@@ -414,6 +415,10 @@ public class DateUtil {
         return maxDate;
     }
 
+    public static void main(String[] args) {
+        System.out.println(getCurrentMonthDay());
+    }
+
 
     /**
      * 在给定的日期加上或减去指定月份后的日期

+ 37 - 23
service-report/src/main/java/com/java110/report/smo/impl/GeneratorFeeMonthStatisticsInnerServiceSMOImpl.java

@@ -17,11 +17,7 @@ import com.java110.po.reportFeeMonthStatistics.ReportFeeMonthStatisticsPo;
 import com.java110.report.dao.IReportCommunityServiceDao;
 import com.java110.report.dao.IReportFeeMonthStatisticsServiceDao;
 import com.java110.report.dao.IReportFeeServiceDao;
-import com.java110.utils.util.Assert;
-import com.java110.utils.util.BeanConvertUtil;
-import com.java110.utils.util.DateUtil;
-import com.java110.utils.util.ListUtil;
-import com.java110.utils.util.StringUtil;
+import com.java110.utils.util.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -30,11 +26,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.math.BigDecimal;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * @ClassName GeneratorFeeMonthStatisticsInnerServiceSMOImpl
@@ -529,16 +521,34 @@ public class GeneratorFeeMonthStatisticsInnerServiceSMOImpl implements IGenerato
                 || curDate.getTime() < tmpReportFeeDto.getEndTime().getTime()) {
             return 0.0;
         }
+
+        //这里需要判断 结束时间 是否 大于了当月最后一天,当月天数 * 每天金额
+        Calendar nextDateC = Calendar.getInstance();
+        nextDateC.setTime(curDate);
+        nextDateC.add(Calendar.MONTH, 1);
+        Date nextDate = nextDateC.getTime();
+
         if (FeeDto.FEE_FLAG_ONCE.equals(tmpReportFeeDto.getFeeFlag())) {
-            month = computeFeeSMOImpl.dayCompare(tmpReportFeeDto.getEndTime(), tmpReportFeeDto.getDeadlineTime());
-            month = Math.ceil(month);
-            if (month == 0) {
-                return 0.0;
+            double allDays = computeFeeSMOImpl.daysBetween(tmpReportFeeDto.getEndTime(), tmpReportFeeDto.getDeadlineTime());
+            allDays = Math.ceil(allDays);
+            if (allDays == 0) { // 防止除数为0
+                return 0;
+            }
+            BigDecimal moneyPreDay = feePriceDec.divide(new BigDecimal(allDays), 2, BigDecimal.ROUND_HALF_EVEN);
+            if (tmpReportFeeDto.getDeadlineTime().getTime() > nextDate.getTime()) {
+                int day = DateUtil.getCurrentMonthDay();
+                return moneyPreDay.multiply(new BigDecimal(day)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
             }
-            double money = feePriceDec.divide(new BigDecimal(month), 2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
-            return money;
+            // 结束时间 在当月内
+            double hisDays = computeFeeSMOImpl.daysBetween(tmpReportFeeDto.getEndTime(), curDate);
+            BigDecimal hisDayDec = moneyPreDay.multiply(new BigDecimal(hisDays)).setScale(2, BigDecimal.ROUND_HALF_UP);
+            return feePriceDec.subtract(hisDayDec).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+        }
+
+        month = computeFeeSMOImpl.dayCompare(curDate, tmpReportFeeDto.getDeadlineTime());
+        if (month < 0) {
+            return 0;
         }
-        month = computeFeeSMOImpl.dayCompare(tmpReportFeeDto.getEndTime(), curDate);
         if (month < 1) {
             return feePriceDec.multiply(new BigDecimal(month)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
         }
@@ -556,7 +566,7 @@ public class GeneratorFeeMonthStatisticsInnerServiceSMOImpl implements IGenerato
     private double getHisOweAmount(ReportFeeDto tmpReportFeeDto) {
 
         BigDecimal feePriceDec = new BigDecimal(tmpReportFeeDto.getFeePrice());
-        Date curDate = DateUtil.getFirstDate();
+        Date curDate = DateUtil.getFirstDate();//11月1日
         //说明没有历史欠费
         if (curDate.getTime() < tmpReportFeeDto.getEndTime().getTime()) {
             return 0.0;
@@ -567,13 +577,17 @@ public class GeneratorFeeMonthStatisticsInnerServiceSMOImpl implements IGenerato
             if (tmpReportFeeDto.getDeadlineTime().getTime() < curDate.getTime()) {
                 return tmpReportFeeDto.getFeePrice();
             }
-            double month = computeFeeSMOImpl.dayCompare(tmpReportFeeDto.getDeadlineTime(), tmpReportFeeDto.getEndTime());
-            month = Math.ceil(month);
-            if(month == 0){ // 防止除数为0
+            double allDays = computeFeeSMOImpl.daysBetween(tmpReportFeeDto.getEndTime(), tmpReportFeeDto.getDeadlineTime());
+            allDays = Math.ceil(allDays);
+            if (allDays == 0) { // 防止除数为0
                 return 0;
             }
-            double money = feePriceDec.divide(new BigDecimal(month), 2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
-            return money;
+            //这是每天的钱
+            BigDecimal moneyPreDay = feePriceDec.divide(new BigDecimal(allDays), 2, BigDecimal.ROUND_HALF_EVEN);
+
+            double hisDays = computeFeeSMOImpl.daysBetween(tmpReportFeeDto.getEndTime(), curDate);
+
+            return moneyPreDay.multiply(new BigDecimal(hisDays)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
         }
 
         double month = 0.0;