From b173d31976fc4731b7c247d4038de92134eba317 Mon Sep 17 00:00:00 2001
From: java110 <928255095@qq.com>
Date: 星期四, 29 六月 2023 11:42:17 +0800
Subject: [PATCH] Merge branch 'master' of http://git.homecommunity.cn/supervip/MicroCommunity

---
 service-report/src/main/java/com/java110/report/bmo/reportFeeMonthStatistics/impl/GetReportFeeMonthStatisticsBMOImpl.java |  834 +++++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 584 insertions(+), 250 deletions(-)

diff --git a/service-report/src/main/java/com/java110/report/bmo/reportFeeMonthStatistics/impl/GetReportFeeMonthStatisticsBMOImpl.java b/service-report/src/main/java/com/java110/report/bmo/reportFeeMonthStatistics/impl/GetReportFeeMonthStatisticsBMOImpl.java
index e4866c6..89baa81 100755
--- a/service-report/src/main/java/com/java110/report/bmo/reportFeeMonthStatistics/impl/GetReportFeeMonthStatisticsBMOImpl.java
+++ b/service-report/src/main/java/com/java110/report/bmo/reportFeeMonthStatistics/impl/GetReportFeeMonthStatisticsBMOImpl.java
@@ -1,43 +1,75 @@
 package com.java110.report.bmo.reportFeeMonthStatistics.impl;
 
 import com.alibaba.fastjson.JSONObject;
-import com.java110.dto.RoomDto;
+import com.java110.core.smo.IComputeFeeSMO;
+import com.java110.dto.PageDto;
+import com.java110.dto.room.RoomDto;
 import com.java110.dto.fee.FeeConfigDto;
 import com.java110.dto.fee.FeeDto;
+import com.java110.dto.owner.OwnerDto;
 import com.java110.dto.repair.RepairUserDto;
-import com.java110.dto.reportFeeMonthStatistics.ReportFeeMonthStatisticsDto;
-import com.java110.dto.reportFeeMonthStatistics.ReportFeeMonthStatisticsTotalDto;
+import com.java110.dto.report.ReportDeposit;
+import com.java110.dto.reportFee.ReportFeeMonthStatisticsDto;
+import com.java110.intf.community.IRepairInnerServiceSMO;
+import com.java110.intf.fee.IFeeConfigInnerServiceSMO;
+import com.java110.intf.fee.IFeeDetailInnerServiceSMO;
+import com.java110.intf.report.IQueryPayFeeDetailInnerServiceSMO;
 import com.java110.intf.report.IReportFeeMonthStatisticsInnerServiceSMO;
+import com.java110.intf.user.IOwnerInnerServiceSMO;
+import com.java110.intf.user.IOwnerRoomRelInnerServiceSMO;
 import com.java110.report.bmo.reportFeeMonthStatistics.IGetReportFeeMonthStatisticsBMO;
 import com.java110.utils.util.DateUtil;
 import com.java110.utils.util.StringUtil;
 import com.java110.vo.ResultVo;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import com.java110.core.log.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
 import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 @Service("getReportFeeMonthStatisticsBMOImpl")
 public class GetReportFeeMonthStatisticsBMOImpl implements IGetReportFeeMonthStatisticsBMO {
 
     private static final Logger logger = LoggerFactory.getLogger(GetReportFeeMonthStatisticsBMOImpl.class);
 
+    private int MAX_ROWS = 500;  // 鏈�澶ц鏁�
+
     @Autowired
     private IReportFeeMonthStatisticsInnerServiceSMO reportFeeMonthStatisticsInnerServiceSMOImpl;
+
+    @Autowired
+    private IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl;
+
+    @Autowired
+    private IRepairInnerServiceSMO repairInnerServiceSMOImpl;
+
+    @Autowired
+    private IOwnerRoomRelInnerServiceSMO ownerRoomRelInnerServiceSMOImpl;
+
+    @Autowired
+    private IOwnerInnerServiceSMO ownerInnerServiceSMOImpl;
+
+    @Autowired
+    private IComputeFeeSMO computeFeeSMOImpl;
+
+    @Autowired
+    private IFeeDetailInnerServiceSMO feeDetailInnerServiceSMOImpl;
+
+    @Autowired
+    private IQueryPayFeeDetailInnerServiceSMO queryPayFeeDetailInnerServiceSMOImpl;
 
     /**
      * @param reportFeeMonthStatisticsDto
      * @return 璁㈠崟鏈嶅姟鑳藉鎺ュ彈鐨勬姤鏂�
      */
     public ResponseEntity<String> get(ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto) {
-
 
         int count = reportFeeMonthStatisticsInnerServiceSMOImpl.queryReportFeeMonthStatisticssCount(reportFeeMonthStatisticsDto);
 
@@ -57,11 +89,38 @@
 
     @Override
     public ResponseEntity<String> queryReportFeeSummary(ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto) {
+
         int count = reportFeeMonthStatisticsInnerServiceSMOImpl.queryReportFeeSummaryCount(reportFeeMonthStatisticsDto);
 
-        List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsDtos = null;
+        List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsDtos = new ArrayList<>();
         if (count > 0) {
-            reportFeeMonthStatisticsDtos = reportFeeMonthStatisticsInnerServiceSMOImpl.queryReportFeeSummary(reportFeeMonthStatisticsDto);
+            List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsList = reportFeeMonthStatisticsInnerServiceSMOImpl.queryReportFeeSummary(reportFeeMonthStatisticsDto);
+            if (reportFeeMonthStatisticsDto.getConfigIds() != null) {
+                reportFeeMonthStatisticsList = dealConfigReportFeeMonthStatisticsList(reportFeeMonthStatisticsList, "FeeSummary");
+            }
+            for (ReportFeeMonthStatisticsDto reportFeeMonthStatistics : reportFeeMonthStatisticsList) {
+                //鑾峰彇搴旀敹閲戦
+                double receivableAmount = Double.parseDouble(reportFeeMonthStatistics.getReceivableAmount());
+                //鑾峰彇瀹炴敹閲戦
+                double receivedAmount = Double.parseDouble(reportFeeMonthStatistics.getReceivedAmount());
+                if (receivableAmount != 0) {
+                    double chargeRate = (receivedAmount / receivableAmount) * 100.0;
+                    reportFeeMonthStatistics.setChargeRate(String.format("%.2f", chargeRate) + "%");
+                } else {
+                    reportFeeMonthStatistics.setChargeRate("0%");
+
+                }
+                reportFeeMonthStatisticsDtos.add(reportFeeMonthStatistics);
+
+            }
+            ReportFeeMonthStatisticsDto tmpReportFeeMonthStatisticsDto = reportFeeMonthStatisticsInnerServiceSMOImpl.queryReportFeeSummaryMajor(reportFeeMonthStatisticsDto);
+            if (reportFeeMonthStatisticsList != null && reportFeeMonthStatisticsList.size() > 0) {
+                for (ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto1 : reportFeeMonthStatisticsList) {
+                    reportFeeMonthStatisticsDto1.setAllReceivableAmount(tmpReportFeeMonthStatisticsDto.getAllReceivableAmount());
+                    reportFeeMonthStatisticsDto1.setAllReceivedAmount(tmpReportFeeMonthStatisticsDto.getAllReceivedAmount());
+                    reportFeeMonthStatisticsDto1.setAllHisOweReceivedAmount(tmpReportFeeMonthStatisticsDto.getAllHisOweReceivedAmount());
+                }
+            }
         } else {
             reportFeeMonthStatisticsDtos = new ArrayList<>();
         }
@@ -73,13 +132,128 @@
         return responseEntity;
     }
 
+    /**
+     * 灏哻onfigId group by 鍚庢暟鎹� 鍚堝苟澶勭悊
+     *
+     * @param reportFeeMonthStatisticsList
+     * @return
+     */
+    private List<ReportFeeMonthStatisticsDto> dealConfigReportFeeMonthStatisticsList(List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsList, String flag) {
+        List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsDtos = new ArrayList<>();
+        BigDecimal hisOweAmountDec = null;
+        BigDecimal curReceivableAmountDec = null;
+        BigDecimal curReceivedAmountDec = null;
+        BigDecimal hisOweReceivedAmountDec = null;
+        BigDecimal preReceivedAmountDec = null;
+        BigDecimal receivableAmountDec = null;
+        BigDecimal receivedAmountDec = null;
+        List<FeeConfigDto> feeConfigDtos = null;
+        FeeConfigDto feeConfigDto = null;
+        for (ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto : reportFeeMonthStatisticsList) {
+            ReportFeeMonthStatisticsDto tmpReportFeeMonthStatisticsDto = hasReportFeeMonthStatisticsDto(reportFeeMonthStatisticsDtos, reportFeeMonthStatisticsDto, flag);
+            if (tmpReportFeeMonthStatisticsDto == null) {
+                feeConfigDtos = new ArrayList<>();
+                feeConfigDto = new FeeConfigDto();
+                feeConfigDto.setConfigId(reportFeeMonthStatisticsDto.getConfigId());
+                feeConfigDto.setAmount(Double.parseDouble(reportFeeMonthStatisticsDto.getReceivedAmount()));
+                feeConfigDtos.add(feeConfigDto);
+                reportFeeMonthStatisticsDto.setFeeConfigDtos(feeConfigDtos);
+                reportFeeMonthStatisticsDtos.add(reportFeeMonthStatisticsDto);
+                continue;
+            }
+            feeConfigDtos = tmpReportFeeMonthStatisticsDto.getFeeConfigDtos();
+            feeConfigDto = new FeeConfigDto();
+            feeConfigDto.setConfigId(reportFeeMonthStatisticsDto.getConfigId());
+            feeConfigDto.setAmount(Double.parseDouble(reportFeeMonthStatisticsDto.getReceivedAmount()));
+            feeConfigDtos.add(feeConfigDto);
+            tmpReportFeeMonthStatisticsDto.setFeeConfigDtos(feeConfigDtos);
+
+            //鍘嗗彶娆犺垂
+            hisOweAmountDec = new BigDecimal(tmpReportFeeMonthStatisticsDto.getHisOweAmount());
+            hisOweAmountDec = hisOweAmountDec.add(new BigDecimal(reportFeeMonthStatisticsDto.getHisOweAmount()))
+                    .setScale(2, BigDecimal.ROUND_HALF_UP);
+            tmpReportFeeMonthStatisticsDto.setHisOweAmount(hisOweAmountDec.doubleValue());
+
+
+            //褰撴湀搴旀敹
+            curReceivableAmountDec = new BigDecimal(tmpReportFeeMonthStatisticsDto.getCurReceivableAmount());
+            curReceivableAmountDec = curReceivableAmountDec.add(new BigDecimal(reportFeeMonthStatisticsDto.getCurReceivableAmount()))
+                    .setScale(2, BigDecimal.ROUND_HALF_UP);
+            tmpReportFeeMonthStatisticsDto.setCurReceivableAmount(curReceivableAmountDec.doubleValue());
+
+            //褰撴湀瀹炴敹
+            curReceivedAmountDec = new BigDecimal(tmpReportFeeMonthStatisticsDto.getCurReceivedAmount());
+            curReceivedAmountDec = curReceivedAmountDec.add(new BigDecimal(reportFeeMonthStatisticsDto.getCurReceivedAmount()))
+                    .setScale(2, BigDecimal.ROUND_HALF_UP);
+            tmpReportFeeMonthStatisticsDto.setCurReceivedAmount(curReceivedAmountDec.doubleValue());
+
+            //娆犺垂杩藉洖
+            hisOweReceivedAmountDec = new BigDecimal(tmpReportFeeMonthStatisticsDto.getHisOweReceivedAmount());
+            hisOweReceivedAmountDec = hisOweReceivedAmountDec.add(new BigDecimal(reportFeeMonthStatisticsDto.getHisOweReceivedAmount()))
+                    .setScale(2, BigDecimal.ROUND_HALF_UP);
+            tmpReportFeeMonthStatisticsDto.setHisOweReceivedAmount(hisOweReceivedAmountDec.doubleValue());
+
+            //棰勪氦璐�
+            preReceivedAmountDec = new BigDecimal(tmpReportFeeMonthStatisticsDto.getPreReceivedAmount());
+            preReceivedAmountDec = preReceivedAmountDec.add(new BigDecimal(reportFeeMonthStatisticsDto.getPreReceivedAmount()))
+                    .setScale(2, BigDecimal.ROUND_HALF_UP);
+            tmpReportFeeMonthStatisticsDto.setPreReceivedAmount(preReceivedAmountDec.doubleValue());
+
+            //鎬昏垂鐢�
+            receivableAmountDec = new BigDecimal(Double.parseDouble(tmpReportFeeMonthStatisticsDto.getReceivableAmount()));
+            receivableAmountDec = receivableAmountDec.add(new BigDecimal(Double.parseDouble(reportFeeMonthStatisticsDto.getReceivableAmount())))
+                    .setScale(2, BigDecimal.ROUND_HALF_UP);
+            tmpReportFeeMonthStatisticsDto.setReceivableAmount(receivableAmountDec.doubleValue() + "");
+
+            //瀹炴敹
+            receivedAmountDec = new BigDecimal(Double.parseDouble(tmpReportFeeMonthStatisticsDto.getReceivedAmount()));
+            receivedAmountDec = receivedAmountDec.add(new BigDecimal(Double.parseDouble(reportFeeMonthStatisticsDto.getReceivedAmount())))
+                    .setScale(2, BigDecimal.ROUND_HALF_UP);
+            tmpReportFeeMonthStatisticsDto.setReceivedAmount(receivedAmountDec.doubleValue() + "");
+        }
+
+        return reportFeeMonthStatisticsDtos;
+    }
+
+    private ReportFeeMonthStatisticsDto hasReportFeeMonthStatisticsDto(List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsDtos, ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto, String flag) {
+        for (ReportFeeMonthStatisticsDto tmpReportFeeMonthStatisticsDto : reportFeeMonthStatisticsDtos) {
+            if ("FeeSummary".equals(flag) && tmpReportFeeMonthStatisticsDto.getFeeYear().equals(reportFeeMonthStatisticsDto.getFeeYear())
+                    && tmpReportFeeMonthStatisticsDto.getFeeMonth().equals(reportFeeMonthStatisticsDto.getFeeMonth())) {
+                return tmpReportFeeMonthStatisticsDto;
+            }
+            if ("FloorUnitFeeSummary".equals(flag) && tmpReportFeeMonthStatisticsDto.getFeeYear().equals(reportFeeMonthStatisticsDto.getFeeYear())
+                    && tmpReportFeeMonthStatisticsDto.getFeeMonth().equals(reportFeeMonthStatisticsDto.getFeeMonth())
+                    && tmpReportFeeMonthStatisticsDto.getFloorNum().equals(reportFeeMonthStatisticsDto.getFloorNum())
+                    && tmpReportFeeMonthStatisticsDto.getUnitNum().equals(reportFeeMonthStatisticsDto.getUnitNum())
+            ) {
+                return tmpReportFeeMonthStatisticsDto;
+            }
+        }
+
+        return null;
+    }
+
     @Override
     public ResponseEntity<String> queryReportFloorUnitFeeSummary(ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto) {
+        reportFeeMonthStatisticsDto.setFeeYear(DateUtil.getYear() + "");
+        reportFeeMonthStatisticsDto.setFeeMonth(DateUtil.getMonth() + "");
         int count = reportFeeMonthStatisticsInnerServiceSMOImpl.queryReportFloorUnitFeeSummaryCount(reportFeeMonthStatisticsDto);
 
         List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsDtos = null;
         if (count > 0) {
             reportFeeMonthStatisticsDtos = reportFeeMonthStatisticsInnerServiceSMOImpl.queryReportFloorUnitFeeSummary(reportFeeMonthStatisticsDto);
+            if (reportFeeMonthStatisticsDto.getConfigIds() != null) {
+                reportFeeMonthStatisticsDtos = dealConfigReportFeeMonthStatisticsList(reportFeeMonthStatisticsDtos, "FloorUnitFeeSummary");
+            }
+            ReportFeeMonthStatisticsDto tmpReportFeeMonthStatisticsDto = reportFeeMonthStatisticsInnerServiceSMOImpl.queryReportFloorUnitFeeSummaryMajor(reportFeeMonthStatisticsDto);
+            if (reportFeeMonthStatisticsDtos != null && reportFeeMonthStatisticsDtos.size() > 0) {
+                for (ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto1 : reportFeeMonthStatisticsDtos) {
+                    reportFeeMonthStatisticsDto1.setAllReceivableAmount(tmpReportFeeMonthStatisticsDto.getAllReceivableAmount());
+                    reportFeeMonthStatisticsDto1.setAllReceivedAmount(tmpReportFeeMonthStatisticsDto.getAllReceivedAmount());
+                    reportFeeMonthStatisticsDto1.setAllOweAmount(tmpReportFeeMonthStatisticsDto.getAllOweAmount());
+                    reportFeeMonthStatisticsDto1.setAllHisOweReceivedAmount(tmpReportFeeMonthStatisticsDto.getAllHisOweReceivedAmount());
+                }
+            }
         } else {
             reportFeeMonthStatisticsDtos = new ArrayList<>();
         }
@@ -93,27 +267,53 @@
 
     @Override
     public ResponseEntity<String> queryFeeBreakdown(ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto) {
+
+        if (StringUtil.isEmpty(reportFeeMonthStatisticsDto.getYearMonth())) {
+            reportFeeMonthStatisticsDto.setFeeYear(DateUtil.getYear() + "");
+            reportFeeMonthStatisticsDto.setFeeMonth(DateUtil.getMonth() + "");
+        }
+
         int count = reportFeeMonthStatisticsInnerServiceSMOImpl.queryFeeBreakdownCount(reportFeeMonthStatisticsDto);
 
         List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsDtos = null;
         if (count > 0) {
             reportFeeMonthStatisticsDtos = reportFeeMonthStatisticsInnerServiceSMOImpl.queryFeeBreakdown(reportFeeMonthStatisticsDto);
+            ReportFeeMonthStatisticsDto tmpReportFeeMonthStatisticsDto = reportFeeMonthStatisticsInnerServiceSMOImpl.queryFeeBreakdownMajor(reportFeeMonthStatisticsDto);
+            reportFeeMonthStatisticsDto.setPage(PageDto.DEFAULT_PAGE);
+            List<ReportFeeMonthStatisticsDto> reportFeeMonthStatistics = reportFeeMonthStatisticsInnerServiceSMOImpl.queryFeeBreakdown(reportFeeMonthStatisticsDto);
+            BigDecimal allOweAmount = new BigDecimal(0.0);
+            BigDecimal allHisOweReceivedAmount = new BigDecimal(0.0);
+            for (ReportFeeMonthStatisticsDto reportFeeMonthStatistic : reportFeeMonthStatistics) {
+                //鑾峰彇鍘嗗彶娆犺垂
+                BigDecimal hisOweAmount = new BigDecimal(reportFeeMonthStatistic.getHisOweAmount());
+                //鑾峰彇褰撴湀搴旀敹
+                BigDecimal curReceivableAmount = new BigDecimal(reportFeeMonthStatistic.getCurReceivableAmount());
+                //鑾峰彇褰撴湀瀹炴敹
+                BigDecimal curReceivedAmount = new BigDecimal(reportFeeMonthStatistic.getCurReceivedAmount());
+                //鑾峰彇娆犲�鸿拷鍥�
+                BigDecimal hisOweReceivedAmount = new BigDecimal(reportFeeMonthStatistic.getHisOweReceivedAmount());
+                //璁$畻娆犺垂閲戦
+                BigDecimal oweAmount = hisOweAmount.add(curReceivableAmount).subtract(curReceivedAmount).subtract(hisOweReceivedAmount);
+                if (oweAmount.compareTo(BigDecimal.ZERO) == 1) { //娆犺垂閲戦澶т簬0
+                    allOweAmount = allOweAmount.add(oweAmount);
+                }
+                if (hisOweReceivedAmount.compareTo(BigDecimal.ZERO) == 1) { //娆犺垂杩藉洖澶т簬0
+                    allHisOweReceivedAmount = allHisOweReceivedAmount.add(hisOweReceivedAmount);
+                }
+            }
+            if (reportFeeMonthStatisticsDtos != null && reportFeeMonthStatisticsDtos.size() > 0) {
+                for (ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto1 : reportFeeMonthStatisticsDtos) {
+                    reportFeeMonthStatisticsDto1.setAllReceivableAmount(tmpReportFeeMonthStatisticsDto.getAllReceivableAmount());
+                    reportFeeMonthStatisticsDto1.setAllReceivedAmount(tmpReportFeeMonthStatisticsDto.getAllReceivedAmount());
+                    reportFeeMonthStatisticsDto1.setAllOweAmount(allOweAmount.setScale(2, BigDecimal.ROUND_HALF_UP).toString());
+                    reportFeeMonthStatisticsDto1.setAllHisOweReceivedAmount(allHisOweReceivedAmount.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
+                }
+            }
         } else {
             reportFeeMonthStatisticsDtos = new ArrayList<>();
         }
 
-        //鏌ヨ璇ュ皬鍖轰笅鐨勮垂鐢ㄩ」鐩�
-        FeeConfigDto feeConfigDto = new FeeConfigDto();
-        feeConfigDto.setCommunityId(reportFeeMonthStatisticsDto.getCommunityId());
-        List<FeeConfigDto> feeConfigDtos = reportFeeMonthStatisticsInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
-
-        List<ReportFeeMonthStatisticsDto> reportList = new ArrayList<>();
-        for (ReportFeeMonthStatisticsDto reportFeeMonthStatistics : reportFeeMonthStatisticsDtos) {
-            reportFeeMonthStatistics.setFeeConfigDtos(feeConfigDtos);
-            reportList.add(reportFeeMonthStatistics);
-        }
-
-        ResultVo resultVo = new ResultVo((int) Math.ceil((double) count / (double) reportFeeMonthStatisticsDto.getRow()), count, reportList);
+        ResultVo resultVo = new ResultVo((int) Math.ceil((double) count / (double) reportFeeMonthStatisticsDto.getRow()), count, reportFeeMonthStatisticsDtos);
 
         ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
 
@@ -122,51 +322,51 @@
 
     @Override
     public ResponseEntity<String> queryFeeDetail(ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto) {
+
+
+        reportFeeMonthStatisticsDto.setFeeYear(DateUtil.getYear() + "");
+        reportFeeMonthStatisticsDto.setFeeMonth(DateUtil.getMonth() + "");
+
         int count = reportFeeMonthStatisticsInnerServiceSMOImpl.queryFeeDetailCount(reportFeeMonthStatisticsDto);
 
         List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsDtos = null;
-        //搴旀敹鎬婚噾棰�(澶ц)
-        Double allReceivableAmount = 0.0;
-        //瀹炴敹閲戦(澶ц)
-        Double allReceivedAmount = 0.0;
         if (count > 0) {
             reportFeeMonthStatisticsDtos = reportFeeMonthStatisticsInnerServiceSMOImpl.queryFeeDetail(reportFeeMonthStatisticsDto);
             List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsList = reportFeeMonthStatisticsInnerServiceSMOImpl.queryAllFeeDetail(reportFeeMonthStatisticsDto);
-            allReceivableAmount = Double.valueOf(reportFeeMonthStatisticsList.get(0).getAllReceivableAmount());
-            allReceivedAmount = Double.valueOf(reportFeeMonthStatisticsList.get(0).getAllReceivedAmount());
+            reportFeeMonthStatisticsDto.setPage(PageDto.DEFAULT_PAGE);
+            List<ReportFeeMonthStatisticsDto> reportFeeMonthStatistics = reportFeeMonthStatisticsInnerServiceSMOImpl.queryFeeDetail(reportFeeMonthStatisticsDto);
+            BigDecimal allOweAmount = new BigDecimal(0.0);
+            BigDecimal allHisOweReceivedAmount = new BigDecimal(0.0);
+            for (ReportFeeMonthStatisticsDto reportFeeMonthStatistic : reportFeeMonthStatistics) {
+                //鑾峰彇鍘嗗彶娆犺垂
+                BigDecimal hisOweAmount = new BigDecimal(reportFeeMonthStatistic.getHisOweAmount());
+                //鑾峰彇褰撴湀搴旀敹
+                BigDecimal curReceivableAmount = new BigDecimal(reportFeeMonthStatistic.getCurReceivableAmount());
+                //鑾峰彇褰撴湀瀹炴敹
+                BigDecimal curReceivedAmount = new BigDecimal(reportFeeMonthStatistic.getCurReceivedAmount());
+                //鑾峰彇娆犺垂杩藉洖
+                BigDecimal hisOweReceivedAmount = new BigDecimal(reportFeeMonthStatistic.getHisOweReceivedAmount());
+                //璁$畻娆犺垂閲戦
+                BigDecimal oweAmount = hisOweAmount.add(curReceivableAmount).subtract(curReceivedAmount).subtract(hisOweReceivedAmount);
+                if (oweAmount.compareTo(BigDecimal.ZERO) == 1) { //娆犺垂閲戦澶т簬0
+                    allOweAmount = allOweAmount.add(oweAmount);
+                }
+                if (hisOweReceivedAmount.compareTo(BigDecimal.ZERO) == 1) { //娆犺垂杩藉洖澶т簬0
+                    allHisOweReceivedAmount = allHisOweReceivedAmount.add(hisOweReceivedAmount);
+                }
+            }
+            if (reportFeeMonthStatisticsDtos != null && reportFeeMonthStatisticsDtos.size() > 0) {
+                for (ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto1 : reportFeeMonthStatisticsDtos) {
+                    reportFeeMonthStatisticsDto1.setAllReceivableAmount(reportFeeMonthStatisticsList.get(0).getAllReceivableAmount());
+                    reportFeeMonthStatisticsDto1.setAllReceivedAmount(reportFeeMonthStatisticsList.get(0).getAllReceivedAmount());
+                    reportFeeMonthStatisticsDto1.setAllOweAmount(allOweAmount.setScale(2, BigDecimal.ROUND_HALF_UP).toString());
+                    reportFeeMonthStatisticsDto1.setAllHisOweReceivedAmount(allHisOweReceivedAmount.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
+                }
+            }
         } else {
             reportFeeMonthStatisticsDtos = new ArrayList<>();
         }
-
-        //搴旀敹鎬婚噾棰�(灏忚)
-        Double totalReceivableAmount = 0.0;
-        //瀹炴敹鎬婚噾棰�(灏忚)
-        Double totalReceivedAmount = 0.0;
-        List<ReportFeeMonthStatisticsDto> reportList = new ArrayList<>();
-        for (ReportFeeMonthStatisticsDto reportFeeMonthStatistics : reportFeeMonthStatisticsDtos) {
-            //搴旀敹閲戦
-            Double receivableAmount = Double.valueOf(reportFeeMonthStatistics.getReceivableAmount());
-            //瀹炴敹閲戦
-            Double receivedAmount = Double.valueOf(reportFeeMonthStatistics.getReceivedAmount());
-            totalReceivableAmount = totalReceivableAmount + receivableAmount;
-            totalReceivedAmount = totalReceivedAmount + receivedAmount;
-        }
-
-        //鏌ヨ璇ュ皬鍖轰笅鐨勮垂鐢ㄩ」鐩�
-        FeeConfigDto feeConfigDto = new FeeConfigDto();
-        feeConfigDto.setCommunityId(reportFeeMonthStatisticsDto.getCommunityId());
-        List<FeeConfigDto> feeConfigDtos = reportFeeMonthStatisticsInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
-
-        for (ReportFeeMonthStatisticsDto reportFeeMonthStatistics : reportFeeMonthStatisticsDtos) {
-            reportFeeMonthStatistics.setTotalReceivableAmount(String.format("%.2f", totalReceivableAmount));
-            reportFeeMonthStatistics.setTotalReceivedAmount(String.format("%.2f", totalReceivedAmount));
-            reportFeeMonthStatistics.setAllReceivableAmount(String.format("%.2f", allReceivableAmount));
-            reportFeeMonthStatistics.setAllReceivedAmount(String.format("%.2f", allReceivedAmount));
-            reportFeeMonthStatistics.setFeeConfigDtos(feeConfigDtos);
-            reportList.add(reportFeeMonthStatistics);
-        }
-
-        ResultVo resultVo = new ResultVo((int) Math.ceil((double) count / (double) reportFeeMonthStatisticsDto.getRow()), count, reportList);
+        ResultVo resultVo = new ResultVo((int) Math.ceil((double) count / (double) reportFeeMonthStatisticsDto.getRow()), count, reportFeeMonthStatisticsDtos);
 
         ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
 
@@ -180,7 +380,14 @@
         List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsDtos = null;
         if (count > 0) {
             reportFeeMonthStatisticsDtos = reportFeeMonthStatisticsInnerServiceSMOImpl.queryOweFeeDetail(reportFeeMonthStatisticsDto);
-
+            ReportFeeMonthStatisticsDto tmpReportFeeMonthStatisticsDto = reportFeeMonthStatisticsInnerServiceSMOImpl.queryOweFeeDetailMajor(reportFeeMonthStatisticsDto);
+            if (reportFeeMonthStatisticsDtos != null && reportFeeMonthStatisticsDtos.size() > 0) {
+                for (ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto1 : reportFeeMonthStatisticsDtos) {
+//                    reportFeeMonthStatisticsDto1.setAllReceivableAmount(tmpReportFeeMonthStatisticsDto.getAllReceivableAmount());
+//                    reportFeeMonthStatisticsDto1.setAllReceivedAmount(tmpReportFeeMonthStatisticsDto.getAllReceivedAmount());
+                    reportFeeMonthStatisticsDto1.setAllOweAmount(tmpReportFeeMonthStatisticsDto.getOweAmount());
+                }
+            }
             freshReportOweDay(reportFeeMonthStatisticsDtos);
         } else {
             reportFeeMonthStatisticsDtos = new ArrayList<>();
@@ -193,197 +400,78 @@
         return responseEntity;
     }
 
+    /**
+     * 鍓嶅彴鏌ヨ鍒嗛〉鏌ヨ
+     *
+     * @param reportFeeMonthStatisticsDto
+     * @return
+     */
     @Override
     public ResponseEntity<String> queryPayFeeDetail(ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto) {
-        JSONObject countInfo = reportFeeMonthStatisticsInnerServiceSMOImpl.queryPayFeeDetailCount(reportFeeMonthStatisticsDto);
-
-        int count = Integer.parseInt(countInfo.get("count").toString());
-
-        List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsDtos = null;
-        ReportFeeMonthStatisticsTotalDto reportFeeMonthStatisticsTotalDto = new ReportFeeMonthStatisticsTotalDto();
-        List<ReportFeeMonthStatisticsDto> reportList = new ArrayList<>();
-        //鏌ヨ璇ュ皬鍖轰笅鐨勮垂鐢ㄩ」鐩�
-        FeeConfigDto feeConfigDto = new FeeConfigDto();
-        feeConfigDto.setCommunityId(reportFeeMonthStatisticsDto.getCommunityId());
-        List<FeeConfigDto> feeConfigDtos = reportFeeMonthStatisticsInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
-        //搴旀敹鎬婚噾棰�(澶ц)
-        Double allReceivableAmount = 0.0;
-        //瀹炴敹閲戦(澶ц)
-        Double allReceivedAmount = 0.0;
-        //浼樻儬閲戦(澶ц)
-        Double allPreferentialAmount = 0.0;
-        //鍑忓厤閲戦(澶ц)
-        Double allDeductionAmount = 0.0;
-        //婊炵撼閲�(澶ц)
-        Double allLateFee = 0.0;
-        //绌虹疆鎴挎墦鎶�(澶ц)
-        Double allVacantHousingDiscount = 0.0;
-        //绌虹疆鎴垮噺鍏�(澶ц)
-        Double allVacantHousingReduction = 0.0;
-        if (count > 0) {
-            //鏌ヨ缂磋垂鏄庣粏
-            reportFeeMonthStatisticsDtos = reportFeeMonthStatisticsInnerServiceSMOImpl.queryPayFeeDetail(reportFeeMonthStatisticsDto);
-            //鏌ヨ搴旀敹銆佸疄鏀舵�婚噾棰�(澶ц)
-            List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsList = reportFeeMonthStatisticsInnerServiceSMOImpl.queryAllPayFeeDetail(reportFeeMonthStatisticsDto);
-            //鏌ヨ(浼樻儬銆佸噺鍏嶃�佹粸绾抽噾銆佺┖缃埧鎵撴姌銆佺┖缃埧鍑忓厤閲戦绛�)澶ц鎬婚噾棰�
-            List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsSum = reportFeeMonthStatisticsInnerServiceSMOImpl.queryPayFeeDetailSum(reportFeeMonthStatisticsDto);
-            allReceivableAmount = Double.valueOf(reportFeeMonthStatisticsList.get(0).getAllReceivableAmount());
-            allReceivedAmount = Double.valueOf(reportFeeMonthStatisticsList.get(0).getAllReceivedAmount());
-            for (ReportFeeMonthStatisticsDto reportFeeMonthStatistics : reportFeeMonthStatisticsSum) {
-                //杩欓噷鏄煡璇㈠嚭鐨勯噾棰濇�诲拰
-                String discountPrice = reportFeeMonthStatistics.getDiscountPrice();
-                //浼樻儬閲戦(澶ц)
-                if (!StringUtil.isEmpty(reportFeeMonthStatistics.getDiscountSmallType()) && reportFeeMonthStatistics.getDiscountSmallType().equals("1")) {
-                    allPreferentialAmount = Double.valueOf(discountPrice);
-                }
-                //鍑忓厤閲戦(澶ц)
-                if (!StringUtil.isEmpty(reportFeeMonthStatistics.getDiscountSmallType()) && reportFeeMonthStatistics.getDiscountSmallType().equals("2")) {
-                    allDeductionAmount = Double.valueOf(discountPrice);
-                }
-                //婊炵撼閲�(澶ц)
-                if (!StringUtil.isEmpty(reportFeeMonthStatistics.getDiscountSmallType()) && reportFeeMonthStatistics.getDiscountSmallType().equals("3")) {
-                    allLateFee = Double.valueOf(discountPrice);
-                }
-                //绌虹疆鎴挎墦鎶橀噾棰�(澶ц)
-                if (!StringUtil.isEmpty(reportFeeMonthStatistics.getDiscountSmallType()) && reportFeeMonthStatistics.getDiscountSmallType().equals("4")) {
-                    allVacantHousingDiscount = Double.valueOf(discountPrice);
-                }
-                //绌虹疆鎴垮噺鍏嶉噾棰�(澶ц)
-                if (!StringUtil.isEmpty(reportFeeMonthStatistics.getDiscountSmallType()) && reportFeeMonthStatistics.getDiscountSmallType().equals("5")) {
-                    allVacantHousingReduction = Double.valueOf(discountPrice);
-                }
-            }
-            //搴旀敹鎬婚噾棰�(灏忚)
-            Double totalReceivableAmount = 0.0;
-            //瀹炴敹鎬婚噾棰�(灏忚)
-            Double totalReceivedAmount = 0.0;
-            //浼樻儬閲戦(灏忚)
-            Double totalPreferentialAmount = 0.0;
-            //鍑忓厤閲戦(灏忚)
-            Double totalDeductionAmount = 0.0;
-            //绌虹疆鎴挎墦鎶橀噾棰�(灏忚)
-            Double totalVacantHousingDiscount = 0.0;
-            //绌虹疆鎴垮噺鍏嶉噾棰�(灏忚)
-            Double totalVacantHousingReduction = 0.0;
-            //婊炵撼閲�(灏忚)
-            Double totalLateFee = 0.0;
-            for (ReportFeeMonthStatisticsDto reportFeeMonthStatistics : reportFeeMonthStatisticsDtos) {
-                //搴旀敹閲戦
-                Double receivableAmount = Double.valueOf(reportFeeMonthStatistics.getReceivableAmount());
-                //瀹炴敹閲戦
-                Double receivedAmount = Double.valueOf(reportFeeMonthStatistics.getReceivedAmount());
-                totalReceivableAmount = totalReceivableAmount + receivableAmount;
-                totalReceivedAmount = totalReceivedAmount + receivedAmount;
-                //浼樻儬閲戦
-                if (!StringUtil.isEmpty(reportFeeMonthStatistics.getDiscountSmallType()) && reportFeeMonthStatistics.getDiscountSmallType().equals("1")) {
-                    //鑾峰彇浼樻儬閲戦
-                    Double discountPrice = Double.valueOf(reportFeeMonthStatistics.getDiscountPrice());
-                    totalPreferentialAmount = totalPreferentialAmount + discountPrice;
-                    //浼樻儬閲戦
-                    reportFeeMonthStatistics.setPreferentialAmount(reportFeeMonthStatistics.getDiscountPrice());
-                } else {
-                    reportFeeMonthStatistics.setPreferentialAmount("0");
-
-                }
-                //鍑忓厤閲戦
-                if (!StringUtil.isEmpty(reportFeeMonthStatistics.getDiscountSmallType()) && reportFeeMonthStatistics.getDiscountSmallType().equals("2")) {
-                    //鑾峰彇鍑忓厤閲戦
-                    Double discountPrice = Double.valueOf(reportFeeMonthStatistics.getDiscountPrice());
-                    totalDeductionAmount = totalDeductionAmount + discountPrice;
-                    //鍑忓厤閲戦
-                    reportFeeMonthStatistics.setDeductionAmount(reportFeeMonthStatistics.getDiscountPrice());
-                } else {
-                    reportFeeMonthStatistics.setDeductionAmount("0");
-                }
-                //婊炵撼閲�
-                if (!StringUtil.isEmpty(reportFeeMonthStatistics.getDiscountSmallType()) && reportFeeMonthStatistics.getDiscountSmallType().equals("3")) {
-                    //鑾峰彇婊炵撼閲戦噾棰�
-                    Double discountPrice = (Double.valueOf(reportFeeMonthStatistics.getDiscountPrice())) * (-1);
-                    totalLateFee = totalLateFee + discountPrice;
-                    //婊炵撼閲�
-                    reportFeeMonthStatistics.setLateFee(reportFeeMonthStatistics.getDiscountPrice());
-                } else {
-                    reportFeeMonthStatistics.setLateFee("0");
-                }
-                //绌虹疆鎴挎墦鎶�
-                if (!StringUtil.isEmpty(reportFeeMonthStatistics.getDiscountSmallType()) && reportFeeMonthStatistics.getDiscountSmallType().equals("4")) {
-                    //绌虹疆鎴挎墦鎶橀噾棰�
-                    Double discountPrice = Double.valueOf(reportFeeMonthStatistics.getDiscountPrice());
-                    totalVacantHousingDiscount = totalVacantHousingDiscount + discountPrice;
-                    //绌虹疆鎴挎墦鎶�
-                    reportFeeMonthStatistics.setVacantHousingDiscount(reportFeeMonthStatistics.getDiscountPrice());
-                } else {
-                    reportFeeMonthStatistics.setVacantHousingDiscount("0");
-                }
-                //绌虹疆鎴垮噺鍏�
-                if (!StringUtil.isEmpty(reportFeeMonthStatistics.getDiscountSmallType()) && reportFeeMonthStatistics.getDiscountSmallType().equals("5")) {
-                    //绌虹疆鎴垮噺鍏嶉噾棰�
-                    Double discountPrice = Double.valueOf(reportFeeMonthStatistics.getDiscountPrice());
-                    totalVacantHousingReduction = totalVacantHousingReduction + discountPrice;
-                    //绌虹疆鎴垮噺鍏�
-                    reportFeeMonthStatistics.setVacantHousingReduction(reportFeeMonthStatistics.getDiscountPrice());
-                } else {
-                    reportFeeMonthStatistics.setVacantHousingReduction("0");
-                }
-
-                if (FeeDto.PAYER_OBJ_TYPE_ROOM.equals(reportFeeMonthStatistics.getPayerObjType())) {
-                    reportFeeMonthStatistics.setObjName(reportFeeMonthStatistics.getFloorNum()
-                            + "鏍�" + reportFeeMonthStatistics.getUnitNum()
-                            + "鍗曞厓" + reportFeeMonthStatistics.getRoomNum() + "瀹�");
-                } else if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(reportFeeMonthStatistics.getPayerObjType())) {
-                    reportFeeMonthStatistics.setObjName(reportFeeMonthStatistics.getCarNum());
-                }else{
-                    reportFeeMonthStatistics.setObjName(reportFeeMonthStatistics.getContractCode());
-
-                }
-
-                if (!StringUtil.isEmpty(reportFeeMonthStatistics.getImportFeeName())) {
-                    reportFeeMonthStatistics.setFeeName(reportFeeMonthStatistics.getImportFeeName());
-                }
-
-                //璐圭敤椤圭洰
-                reportFeeMonthStatistics.setFeeConfigDtos(feeConfigDtos);
-                reportList.add(reportFeeMonthStatistics);
-            }
-            //搴旀敹鎬婚噾棰�(灏忚)
-            reportFeeMonthStatisticsTotalDto.setTotalReceivableAmount(String.format("%.2f", totalReceivableAmount));
-            //瀹炴敹閲戦(灏忚)
-            reportFeeMonthStatisticsTotalDto.setTotalReceivedAmount(String.format("%.2f", totalReceivedAmount));
-            //浼樻儬閲戦(灏忚)
-            reportFeeMonthStatisticsTotalDto.setTotalPreferentialAmount(String.valueOf(totalPreferentialAmount));
-            //鍑忓厤閲戦(灏忚)
-            reportFeeMonthStatisticsTotalDto.setTotalDeductionAmount(String.valueOf(totalDeductionAmount));
-            //婊炵撼閲�(灏忚)
-            reportFeeMonthStatisticsTotalDto.setTotalLateFee(String.valueOf(totalLateFee));
-            //绌虹疆鎴挎墦鎶�(灏忚)
-            reportFeeMonthStatisticsTotalDto.setTotalVacantHousingDiscount(String.valueOf(totalVacantHousingDiscount));
-            //绌虹疆鎴垮噺鍏�(灏忚)
-            reportFeeMonthStatisticsTotalDto.setTotalVacantHousingReduction(String.valueOf(totalVacantHousingReduction));
-            //搴旀敹閲戦(澶ц)
-            reportFeeMonthStatisticsTotalDto.setAllReceivableAmount(String.format("%.2f", allReceivableAmount));
-            //瀹炴敹閲戦(澶ц)
-            reportFeeMonthStatisticsTotalDto.setAllReceivedAmount(String.format("%.2f", allReceivedAmount));
-            //浼樻儬閲戦(澶ц)
-            reportFeeMonthStatisticsTotalDto.setAllPreferentialAmount(String.valueOf(allPreferentialAmount));
-            //鍑忓厤閲戦(澶ц)
-            reportFeeMonthStatisticsTotalDto.setAllDeductionAmount(String.valueOf(allDeductionAmount));
-            //婊炵撼閲�(澶ц)
-            reportFeeMonthStatisticsTotalDto.setAllLateFee(String.valueOf(allLateFee));
-            //绌虹疆鎴挎墦鎶橀噾棰�(澶ц)
-            reportFeeMonthStatisticsTotalDto.setAllVacantHousingDiscount(String.valueOf(allVacantHousingDiscount));
-            //绌虹疆鎴垮噺鍏嶉噾棰�(澶ц)
-            reportFeeMonthStatisticsTotalDto.setAllVacantHousingReduction(String.valueOf(allVacantHousingReduction));
-        } else {
-            reportFeeMonthStatisticsDtos = new ArrayList<>();
-            reportList.addAll(reportFeeMonthStatisticsDtos);
-            reportFeeMonthStatisticsTotalDto = new ReportFeeMonthStatisticsTotalDto();
-        }
-
-        ResultVo resultVo = new ResultVo((int) Math.ceil((double) count / (double) reportFeeMonthStatisticsDto.getRow()), count, reportList, reportFeeMonthStatisticsTotalDto);
-
+        ResultVo resultVo = queryPayFeeDetailInnerServiceSMOImpl.query(reportFeeMonthStatisticsDto);
         ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
 
         return responseEntity;
+    }
+
+    /**
+     * @param ownerIds
+     * @param reportFeeMonthStatisticsDtos
+     */
+    private void refreshReportFeeMonthStatistics(List<String> ownerIds, List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsDtos) {
+
+        if (ownerIds == null || ownerIds.size() < 1) {
+            return;
+        }
+
+        OwnerDto ownerDto = new OwnerDto();
+        ownerDto.setOwnerIds(ownerIds.toArray(new String[ownerIds.size()]));
+        List<OwnerDto> ownerDtos = reportFeeMonthStatisticsInnerServiceSMOImpl.queryRoomAndParkingSpace(ownerDto);
+        String objName = "";
+        for (ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto : reportFeeMonthStatisticsDtos) {
+            if (!FeeDto.PAYER_OBJ_TYPE_CAR.equals(reportFeeMonthStatisticsDto.getPayerObjType())) {
+                continue;
+            }
+            for (OwnerDto ownerDto1 : ownerDtos) {
+                if (!StringUtil.isEmpty(reportFeeMonthStatisticsDto.getOwnerId()) && !reportFeeMonthStatisticsDto.getOwnerId().equals(ownerDto1.getOwnerId())) {
+                    continue;
+                }
+                objName = reportFeeMonthStatisticsDto.getObjName() + "(" + ownerDto1.getFloorNum() + "鏍�" + ownerDto1.getUnitNum() + "鍗曞厓" + ownerDto1.getRoomNum() + "瀹�)";
+                reportFeeMonthStatisticsDto.setObjName(objName);
+            }
+        }
+    }
+
+    private boolean hasInReportListAndMerge(List<ReportFeeMonthStatisticsDto> reportList, ReportFeeMonthStatisticsDto reportFeeMonthStatistics) {
+        for (ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto : reportList) {
+            if (reportFeeMonthStatisticsDto.getDetailId().equals(reportFeeMonthStatistics.getDetailId())) {
+                combineSydwCore(reportFeeMonthStatistics, reportFeeMonthStatisticsDto);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    //閽堝鎵�鐢ㄥ璞�
+    private static ReportFeeMonthStatisticsDto combineSydwCore(ReportFeeMonthStatisticsDto sourceBean, ReportFeeMonthStatisticsDto targetBean) {
+        Class sourceBeanClass = sourceBean.getClass();
+        Class targetBeanClass = targetBean.getClass();
+        Field[] sourceFields = sourceBeanClass.getDeclaredFields();
+        Field[] targetFields = sourceBeanClass.getDeclaredFields();
+        for (int i = 0; i < sourceFields.length; i++) {
+            Field sourceField = sourceFields[i];
+            Field targetField = targetFields[i];
+            sourceField.setAccessible(true);
+            targetField.setAccessible(true);
+            try {
+                if (!(sourceField.get(sourceBean) == null)) {
+                    targetField.set(targetBean, sourceField.get(sourceBean));
+                }
+            } catch (IllegalArgumentException | IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return targetBean;
     }
 
     @Override
@@ -465,11 +553,14 @@
 
     /**
      * 鏌ヨ鎶ヨ〃涓撳 缁熻淇℃伅
+     *
      * @param reportFeeMonthStatisticsDto
      * @return
      */
     @Override
     public ResponseEntity<String> queryReportProficientCount(ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto) {
+        reportFeeMonthStatisticsDto.setFeeYear(DateUtil.getYear() + "");
+        reportFeeMonthStatisticsDto.setFeeMonth(DateUtil.getMonth() + "");
         JSONObject result = reportFeeMonthStatisticsInnerServiceSMOImpl.queryReportProficientCount(reportFeeMonthStatisticsDto);
         ResponseEntity<String> responseEntity = new ResponseEntity<String>(result.toString(), HttpStatus.OK);
 
@@ -508,6 +599,8 @@
         int transferOrderNumber = 0;
         //娲惧崟鎬绘暟閲�
         int dispatchNumber = 0;
+        //宸插洖璁挎�绘暟閲�
+        int returnNumber = 0;
         if (count > 0) {
             for (RepairUserDto repairUser : repairUsers) {
                 RepairUserDto repairUserInfo = new RepairUserDto();
@@ -525,6 +618,10 @@
                     int transferOrderAmount = 0;
                     //娲惧崟鏁伴噺
                     int dispatchAmount = 0;
+                    //鍥炶鏁伴噺
+                    int returnAmount = 0;
+                    //璇勫垎
+                    String score = "";
                     for (RepairUserDto repair : repairUserDtoList) {
                         //澶勭悊涓姸鎬�
                         if (repair.getState().equals("10001")) {
@@ -546,6 +643,12 @@
                         } else if (repair.getState().equals("10006")) {  //娲惧崟鐘舵��
                             int amount = Integer.parseInt(repair.getAmount());
                             dispatchAmount = dispatchAmount + amount;
+                        } else if (repair.getState().equals("10008")) {  //宸插洖璁跨姸鎬�
+                            int amount = Integer.parseInt(repair.getAmount());
+                            returnAmount = returnAmount + amount;
+                        }
+                        if (!StringUtil.isEmpty(repair.getScore())) {
+                            score = repair.getScore();
                         }
                     }
                     //鍛樺伐id
@@ -572,8 +675,14 @@
                     repairUserInfo.setDispatchAmount(Integer.toString(dispatchAmount));
                     //娲惧崟鎶ヤ慨鎬绘暟閲�
                     repairUserInfo.setDispatchNumber(Integer.toString(dispatchNumber));
+                    //鍥炶鏁伴噺
+                    repairUserInfo.setReturnAmount(Integer.toString(returnAmount));
+                    //鍥炶鎬绘暟閲�
+                    repairUserInfo.setReturnNumber(Integer.toString(returnNumber));
                     //鍛樺伐id鍜屽鍚嶄俊鎭泦鍚�
                     repairUserInfo.setRepairList(staffs);
+                    //鍛樺伐璇勫垎
+                    repairUserInfo.setScore(score);
                     repairUserList.add(repairUserInfo);
                 } else {
                     continue;
@@ -583,6 +692,7 @@
                 chargebackNumber = Integer.parseInt(repairUserInfo.getChargebackAmount()) + chargebackNumber;
                 transferOrderNumber = Integer.parseInt(repairUserInfo.getTransferOrderAmount()) + transferOrderNumber;
                 dispatchNumber = Integer.parseInt(repairUserInfo.getDispatchAmount()) + dispatchNumber;
+                returnNumber = Integer.parseInt(repairUserInfo.getReturnAmount()) + returnNumber;
             }
         } else {
             repairUserList = new ArrayList<>();
@@ -594,6 +704,7 @@
         repairUser.setChargebackNumber(Integer.toString(chargebackNumber));
         repairUser.setTransferOrderNumber(Integer.toString(transferOrderNumber));
         repairUser.setDispatchNumber(Integer.toString(dispatchNumber));
+        repairUser.setReturnNumber(Integer.toString(returnNumber));
 
         //鑾峰彇鎬绘潯鏁�
         int size = staffs.size();
@@ -621,6 +732,230 @@
         ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
 
         return responseEntity;
+    }
+
+    @Override
+    public ResponseEntity<String> queryPayFeeDeposit(ReportDeposit reportDeposit) {
+        //鏌ヨ鎶奸噾
+        List<ReportDeposit> reportDeposits = reportFeeMonthStatisticsInnerServiceSMOImpl.queryPayFeeDeposit(reportDeposit);
+        //鏌ヨ鎶奸噾閫�璐规�婚噾棰�
+        List<ReportDeposit> reportDepositAmounts = reportFeeMonthStatisticsInnerServiceSMOImpl.queryFeeDepositAmount(reportDeposit);
+
+        //鏌ヨ鎶奸噾璐圭敤椤�
+        FeeConfigDto feeConfigDto = new FeeConfigDto();
+        feeConfigDto.setCommunityId(reportDeposit.getCommunityId());
+        feeConfigDto.setFeeTypeCd("888800010006");
+        List<FeeConfigDto> feeConfigDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
+
+        List<ReportDeposit> newReportDeposits = new ArrayList<>();
+        BigDecimal unpaidfeeAmount = new BigDecimal(0);//鏈氦璐�
+        BigDecimal unpaidfeeAmounts = new BigDecimal(0);//鏈即璐规�婚噾棰�
+        BigDecimal paidfeeAmount = new BigDecimal(0);//宸茬即璐�
+        BigDecimal paidfeeAmounts = new BigDecimal(0);//宸茬即璐规�婚噾棰�
+        BigDecimal refundedAmount = new BigDecimal(0);//宸查��璐�
+        BigDecimal refundedAmounts = new BigDecimal(0);//宸查��璐规�婚噾棰�
+        BigDecimal refundInProgressAmount = new BigDecimal(0); //閫�璐逛腑
+        BigDecimal refundInProgressAmounts = new BigDecimal(0);//閫�璐逛腑鎬婚噾棰�
+        BigDecimal refundFailedAmount = new BigDecimal(0); //閫�璐瑰け璐�
+        BigDecimal refundFailedAmounts = new BigDecimal(0);//閫�璐瑰け璐ユ�婚噾棰�
+        for (ReportDeposit deposit : reportDeposits) {
+            deposit.setFeeConfigDtos(feeConfigDtos);
+            newReportDeposits.add(deposit);
+            if (FeeDto.PAYER_OBJ_TYPE_ROOM.equals(deposit.getPayerObjType())) {
+                deposit.setObjName(deposit.getFloorNum()
+                        + "鏍�" + deposit.getUnitNum()
+                        + "鍗曞厓" + deposit.getRoomNum() + "瀹�");
+            } else if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(deposit.getPayerObjType())) {
+                deposit.setObjName(deposit.getCarNum());
+            }
+            //鏀惰垂涓紙鏈氦璐癸級
+            if ("2008001".equals(deposit.getState())) {
+                unpaidfeeAmount = unpaidfeeAmount.add(new BigDecimal(deposit.getAdditionalAmount()));
+            }
+            //鏀惰垂缁撴潫锛堝凡鏀惰垂锛�
+            if ("2009001".equals(deposit.getState()) && !StringUtil.isEmpty(deposit.getDetailState()) && "1400".equals(deposit.getDetailState())) {
+                paidfeeAmount = paidfeeAmount.add(new BigDecimal(deposit.getAdditionalAmount()));
+            }
+            if (!StringUtil.isEmpty(deposit.getDetailState()) && "1100".equals(deposit.getDetailState())) {//宸查��璐�
+                refundedAmount = refundedAmount.add(new BigDecimal(deposit.getAdditionalAmount()));
+            }
+            if (!StringUtil.isEmpty(deposit.getDetailState()) && "1000".equals(deposit.getDetailState())) {//閫�璐逛腑
+                refundInProgressAmount = refundInProgressAmount.add(new BigDecimal(deposit.getAdditionalAmount()));
+            }
+            if (!StringUtil.isEmpty(deposit.getDetailState()) && "1200".equals(deposit.getDetailState())) {//閫�璐瑰け璐�
+                refundFailedAmount = refundFailedAmount.add(new BigDecimal(deposit.getAdditionalAmount()));
+            }
+        }
+        for (ReportDeposit reportDeposit1 : reportDepositAmounts) {
+            if (StringUtil.isEmpty(reportDeposit1.getAllAmount())) {
+                throw new IllegalArgumentException("鏌ヨ鎬婚噾棰濋敊璇紒");
+            }
+            //鑾峰彇鎬婚噾棰�
+            BigDecimal bd = new BigDecimal(reportDeposit1.getAllAmount());
+            if (StringUtil.isEmpty(reportDeposit1.getDetailState())) { //鑾峰彇鏈即璐规�婚噾棰�
+                unpaidfeeAmounts = bd;
+            } else if (reportDeposit1.getDetailState().equals("1000")) { //鑾峰彇閫�璐逛腑鎬婚噾棰�
+                refundInProgressAmounts = bd;
+            } else if (reportDeposit1.getDetailState().equals("1100")) { //鑾峰彇宸查��璐规�婚噾棰�
+                refundedAmounts = bd;
+            } else if (reportDeposit1.getDetailState().equals("1200")) { //鑾峰彇閫�璐瑰け璐ユ�婚噾棰�
+                refundFailedAmounts = bd;
+            } else if (reportDeposit1.getDetailState().equals("1400")) { //鑾峰彇宸茬即璐规�婚噾棰�
+                paidfeeAmounts = bd;
+            }
+        }
+        HashMap<String, String> mp = new HashMap<>();
+        mp.put("unpaidfeeAmount", unpaidfeeAmount.toString());
+        mp.put("paidfeeAmount", paidfeeAmount.toString());
+        mp.put("refundedAmount", refundedAmount.toString());
+        mp.put("refundInProgressAmount", refundInProgressAmount.toString());
+        mp.put("refundFailedAmount", refundFailedAmount.toString());
+        mp.put("unpaidfeeAmounts", unpaidfeeAmounts.toString());
+        mp.put("paidfeeAmounts", paidfeeAmounts.toString());
+        mp.put("refundedAmounts", refundedAmounts.toString());
+        mp.put("refundInProgressAmounts", refundInProgressAmounts.toString());
+        mp.put("refundFailedAmounts", refundFailedAmounts.toString());
+        int size = 0;
+        if (newReportDeposits != null && newReportDeposits.size() > 0) {
+            //鏌ヨ鎵�鏈夋潯鏁�
+            reportDeposit.setPage(PageDto.DEFAULT_PAGE);
+            List<ReportDeposit> reportDeposits1 = reportFeeMonthStatisticsInnerServiceSMOImpl.queryPayFeeDeposit(reportDeposit);
+            size = reportDeposits1.size();
+        }
+
+        ResultVo resultVo = new ResultVo((int) Math.ceil((double) size / (double) reportDeposit.getRow()), size, newReportDeposits, mp);
+
+        ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
+
+        return responseEntity;
+    }
+
+    @Override
+    public ResponseEntity<String> queryHuaningOweFee(ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto) {
+        int count = reportFeeMonthStatisticsInnerServiceSMOImpl.queryHuaningOweFeeCount(reportFeeMonthStatisticsDto);
+
+        List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsDtos = null;
+        if (count > 0) {
+            reportFeeMonthStatisticsDtos = reportFeeMonthStatisticsInnerServiceSMOImpl.queryHuaningOweFee(reportFeeMonthStatisticsDto);
+        } else {
+            reportFeeMonthStatisticsDtos = new ArrayList<>();
+        }
+
+        ResultVo resultVo = new ResultVo((int) Math.ceil((double) count / (double) reportFeeMonthStatisticsDto.getRow()), count, reportFeeMonthStatisticsDtos);
+
+        ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
+
+        return responseEntity;
+    }
+
+    @Override
+    public ResponseEntity<String> queryHuaningPayFee(Map paramInfo) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.YEAR, (int) paramInfo.get("year"));
+        calendar.set(Calendar.MONTH, (int) paramInfo.get("month") - 1);
+        paramInfo.put("yearMonth", DateUtil.getFormatTimeString(calendar.getTime(), "YYYY-MM"));
+        calendar.add(Calendar.MONTH, 1);
+        paramInfo.put("nextYear", calendar.get(Calendar.YEAR));
+        paramInfo.put("nextMonth", calendar.get(Calendar.MONTH) + 1);
+        int count = reportFeeMonthStatisticsInnerServiceSMOImpl.queryHuaningPayFeeCount(paramInfo);
+
+        List<Map> reportFeeMonthStatisticsDtos = null;
+        if (count > 0) {
+            reportFeeMonthStatisticsDtos = reportFeeMonthStatisticsInnerServiceSMOImpl.queryHuaningPayFee(paramInfo);
+        } else {
+            reportFeeMonthStatisticsDtos = new ArrayList<>();
+        }
+
+        ResultVo resultVo = new ResultVo((int) Math.ceil((double) count / (int) paramInfo.get("row")), count, reportFeeMonthStatisticsDtos);
+
+        ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
+
+        return responseEntity;
+    }
+
+    @Override
+    public ResponseEntity<String> queryHuaningPayFeeTwo(Map paramInfo) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.YEAR, (int) paramInfo.get("year"));
+        calendar.set(Calendar.MONTH, (int) paramInfo.get("month") - 1);
+        paramInfo.put("yearMonth", DateUtil.getFormatTimeString(calendar.getTime(), "YYYY-MM"));
+        calendar.add(Calendar.MONTH, 1);
+        paramInfo.put("nextYear", calendar.get(Calendar.YEAR));
+        paramInfo.put("nextMonth", calendar.get(Calendar.MONTH) + 1);
+        int count = reportFeeMonthStatisticsInnerServiceSMOImpl.queryHuaningPayFeeTwoCount(paramInfo);
+
+        List<Map> reportFeeMonthStatisticsDtos = null;
+        if (count > 0) {
+            reportFeeMonthStatisticsDtos = reportFeeMonthStatisticsInnerServiceSMOImpl.queryHuaningPayFeeTwo(paramInfo);
+        } else {
+            reportFeeMonthStatisticsDtos = new ArrayList<>();
+        }
+
+        ResultVo resultVo = new ResultVo((int) Math.ceil((double) count / (int) paramInfo.get("row")), count, reportFeeMonthStatisticsDtos);
+
+        ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
+
+        return responseEntity;
+    }
+
+    @Override
+    public ResponseEntity<String> queryHuaningOweFeeDetail(Map paramInfo) {
+        Calendar calendar = Calendar.getInstance();
+        int count = reportFeeMonthStatisticsInnerServiceSMOImpl.queryHuaningOweFeeDetailCount(paramInfo);
+        List<Map> reportFeeMonthStatisticsDtos = null;
+        if (count > 0) {
+            reportFeeMonthStatisticsDtos = reportFeeMonthStatisticsInnerServiceSMOImpl.queryHuaningOweFeeDetail(paramInfo);
+            refreshOweFee(reportFeeMonthStatisticsDtos, paramInfo);
+        } else {
+            reportFeeMonthStatisticsDtos = new ArrayList<>();
+        }
+
+        ResultVo resultVo = new ResultVo((int) Math.ceil((double) count / (int) paramInfo.get("row")), count, reportFeeMonthStatisticsDtos);
+
+        ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
+
+        return responseEntity;
+    }
+
+    private void refreshOweFee(List<Map> reportFeeMonthStatisticsDtos, Map paramInfo) {
+        Date startTime = null;
+        Date endTime = null;
+        Calendar calendar = Calendar.getInstance();
+        int curMonth = calendar.get(Calendar.MONTH) + 1;
+        calendar.set(Calendar.MONTH, 0);
+        Date curStart = calendar.getTime();
+
+
+        for (Map paramIn : reportFeeMonthStatisticsDtos) {
+
+            startTime = (Date) paramIn.get("startTime");
+            endTime = (Date) paramIn.get("endTime");
+            BigDecimal money = (BigDecimal) paramIn.get("oweAmount");
+            double month = Math.ceil(computeFeeSMOImpl.dayCompare(startTime, endTime));
+            if (month < 1) {
+                paramIn.put("btAmount", 0);
+                paramIn.put("bfAmount", 0);
+                continue;
+            }
+
+            //姣忔湀閲戦
+            BigDecimal monthAmount = money.divide(new BigDecimal(month), 2, BigDecimal.ROUND_HALF_EVEN);
+
+            if (startTime.getTime() < curStart.getTime()) {
+                BigDecimal btAmountDec = monthAmount.multiply(new BigDecimal(curMonth)).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+                paramIn.put("btAmount", btAmountDec.doubleValue());
+                double preMonth = Math.ceil(computeFeeSMOImpl.dayCompare(startTime, curStart));
+                BigDecimal bfAmountDec = monthAmount.multiply(new BigDecimal(preMonth)).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+                paramIn.put("bfAmount", bfAmountDec.doubleValue());
+                continue;
+            }
+
+            if (startTime.getTime() >= curStart.getTime()) {
+                paramIn.put("btAmount", money.doubleValue());
+                paramIn.put("bfAmount", 0);
+            }
+        }
+
     }
 
     @Override
@@ -659,20 +994,19 @@
 
     private void freshReportOweDay(List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsDtos) {
 
-        Date nowDate = DateUtil.getCurrentDate();
-
+        int day = 0;
         for (ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto : reportFeeMonthStatisticsDtos) {
             try {
-                int day = DateUtil.daysBetween(nowDate, DateUtil.getDateFromString(reportFeeMonthStatisticsDto.getFeeCreateTime(),
-                        DateUtil.DATE_FORMATE_STRING_A));
+                day = DateUtil.daysBetween(DateUtil.getDateFromStringA(reportFeeMonthStatisticsDto.getDeadlineTime()),
+                        DateUtil.getDateFromStringA(reportFeeMonthStatisticsDto.getFeeCreateTime()));
                 reportFeeMonthStatisticsDto.setOweDay(day);
             } catch (Exception e) {
                 logger.error("璁$畻娆犺垂澶╂暟澶辫触", e);
             }
-
         }
     }
 
+
     private void freshReportDeadlineDay(List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsDtos) {
 
         Date nowDate = DateUtil.getCurrentDate();

--
Gitblit v1.8.0