ソースを参照

导出支持异步队里方式

wuxw 3 年 前
コミット
ad7623b1e8

+ 38 - 0
java110-bean/src/main/java/com/java110/dto/data/ExportDataDto.java

@@ -0,0 +1,38 @@
+package com.java110.dto.data;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.io.Serializable;
+
+public class ExportDataDto implements Serializable{
+
+    private String businessAdapt;
+
+    private JSONObject reqJson;
+
+    private String fileName;
+
+    public String getBusinessAdapt() {
+        return businessAdapt;
+    }
+
+    public void setBusinessAdapt(String businessAdapt) {
+        this.businessAdapt = businessAdapt;
+    }
+
+    public JSONObject getReqJson() {
+        return reqJson;
+    }
+
+    public void setReqJson(JSONObject reqJson) {
+        this.reqJson = reqJson;
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+}

+ 16 - 0
java110-core/src/main/java/com/java110/core/client/CosUploadTemplate.java

@@ -110,6 +110,22 @@ public class CosUploadTemplate {
         }
         return fileName;
     }
+    /*
+     *文件上传工具方法
+     */
+    public String upload(InputStream inputStream,  String ftpPath) {
+        COSClient cosClient = null;
+        try {
+            cosClient = COSUtil.getCOSClient();
+            COSUtil.uploadByInputStream(cosClient, inputStream, ftpPath );
+        } catch (Exception e) {
+            // logger.error("上传文件失败", e);
+            throw new IllegalArgumentException("上传文件失败");
+        } finally {
+
+        }
+        return ftpPath;
+    }
 
     /*
      *文件下载工具方法

+ 48 - 0
java110-core/src/main/java/com/java110/core/client/FileUploadTemplate.java

@@ -0,0 +1,48 @@
+package com.java110.core.client;
+
+import com.java110.utils.cache.MappingCache;
+import com.java110.utils.util.COSUtil;
+import com.java110.utils.util.OSSUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.InputStream;
+
+@Component
+public class FileUploadTemplate {
+
+
+    @Autowired
+    private FtpUploadTemplate ftpUploadTemplate;
+
+    @Autowired
+    private JSchFtpUploadTemplate jSchFtpUploadTemplate;
+
+    @Autowired
+    private OssUploadTemplate ossUploadTemplate;
+
+    @Autowired
+    private CosUploadTemplate cosUploadTemplate;
+
+
+    public String saveFile(InputStream inputStream,String fileName){
+
+        String ossSwitch = MappingCache.getValue(OSSUtil.DOMAIN, OSSUtil.OSS_SWITCH);
+
+        if (OSSUtil.OSS_SWITCH_OSS.equals(ossSwitch)) {
+            fileName = ossUploadTemplate.upload(inputStream, fileName);
+        } else if (COSUtil.COS_SWITCH_COS.equals(ossSwitch)) {
+            fileName = cosUploadTemplate.upload(inputStream, fileName);
+        } else {
+            String ftpServer = MappingCache.getValue(FtpUploadTemplate.FTP_DOMAIN, FtpUploadTemplate.FTP_SERVER);
+            int ftpPort = Integer.parseInt(MappingCache.getValue(FtpUploadTemplate.FTP_DOMAIN, FtpUploadTemplate.FTP_PORT));
+            String ftpUserName = MappingCache.getValue(FtpUploadTemplate.FTP_DOMAIN, FtpUploadTemplate.FTP_USERNAME);
+            String ftpUserPassword = MappingCache.getValue(FtpUploadTemplate.FTP_DOMAIN, FtpUploadTemplate.FTP_USERPASSWORD);
+
+            fileName = ftpUploadTemplate.upload(inputStream, ftpServer,
+                    ftpPort, ftpUserName,
+                    ftpUserPassword, fileName);
+        }
+        return fileName;
+    }
+}

+ 53 - 0
java110-core/src/main/java/com/java110/core/client/FtpUploadTemplate.java

@@ -166,6 +166,59 @@ public class FtpUploadTemplate {
         return fileName;
     }
 
+    /*
+     *文件上传工具方法
+     */
+    public String upload(InputStream inputStream, String server, int port,
+                         String userName, String userPassword, String fileName) {
+        FTPClient ftpClient = null;
+        String ftpPath = "/";
+
+        if(fileName.contains("/")){
+            ftpPath = fileName.substring(0,fileName.lastIndexOf("/"));
+        }
+
+        try {
+            // request.setCharacterEncoding("utf-8");
+
+            ftpClient = new FTPClient();
+            if (!ftpClient.isConnected()) {
+                ftpClient.connect(server, port);
+            }
+            ftpClient.login(userName, userPassword);
+            ftpClient.enterLocalPassiveMode();
+            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
+            mkDir(ftpClient, ftpPath);// 创建目录
+            // 设置上传目录 must
+            ftpClient.changeWorkingDirectory(ftpPath);
+            if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
+                LOCAL_CHARSET = "UTF-8";
+            }
+            //fileName = new String(uploadFile.getOriginalFilename().getBytes(LOCAL_CHARSET), SERVER_CHARSET);
+            /*fileName = id + "-" + fileName;// 构建上传到服务器上的文件名 20-文件名.后缀*/
+            FTPFile[] fs = ftpClient.listFiles(fileName);
+            if (fs.length == 0) {
+                System.out.println("this file not exist ftp");
+            } else if (fs.length == 1) {
+                System.out.println("this file exist ftp");
+                ftpClient.deleteFile(fs[0].getName());
+            }
+            boolean saveFlag = ftpClient.storeFile(fileName, inputStream);
+            if (!saveFlag) {
+                throw new IllegalArgumentException("存储文件失败");
+            }
+        } catch (Exception e) {
+            logger.error("上传文件失败", e);
+            throw new IllegalArgumentException("上传文件失败");
+        } finally {
+            try {
+                ftpClient.disconnect();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return fileName;
+    }
     /*
      *文件下载工具方法
      */

+ 14 - 0
java110-core/src/main/java/com/java110/core/client/OssUploadTemplate.java

@@ -111,6 +111,20 @@ public class OssUploadTemplate {
         return fileName;
     }
 
+    public String upload(InputStream inputStream,  String ftpPath) {
+        String fileName = "";
+        OSSClient ossClient = null;
+        try {
+            ossClient = OSSUtil.getOSSClient();
+            OSSUtil.uploadByInputStream(ossClient, inputStream, ftpPath);
+        } catch (Exception e) {
+            // logger.error("上传文件失败", e);
+            throw new IllegalArgumentException("上传文件失败");
+        } finally {
+        }
+        return fileName;
+    }
+
     /*
      *文件下载工具方法
      */

+ 17 - 0
java110-interface/src/main/java/com/java110/intf/report/IQueryPayFeeDetailInnerServiceSMO.java

@@ -0,0 +1,17 @@
+package com.java110.intf.report;
+
+import com.java110.config.feign.FeignConfiguration;
+import com.java110.dto.reportFeeMonthStatistics.ReportFeeMonthStatisticsDto;
+import com.java110.vo.ResultVo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@FeignClient(name = "${java110.report-service}", configuration = {FeignConfiguration.class})
+@RequestMapping("/queryPayFeeDetailInnerServiceSMOApi")
+public interface IQueryPayFeeDetailInnerServiceSMO {
+
+    @RequestMapping(value = "/query", method = RequestMethod.POST)
+    ResultVo query(@RequestBody ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto);
+}

+ 5 - 0
service-job/src/main/java/com/java110/job/JobServiceApplication.java

@@ -4,6 +4,7 @@ import com.java110.core.annotation.Java110ListenerDiscovery;
 import com.java110.core.trace.Java110RestTemplateInterceptor;
 import com.java110.core.client.RestTemplate;
 import com.java110.core.event.service.BusinessServiceDataFlowEventPublishing;
+import com.java110.job.export.ExportDataExecutor;
 import com.java110.service.init.ServiceStartInit;
 import org.slf4j.Logger;
 import com.java110.core.log.LoggerFactory;
@@ -91,5 +92,9 @@ public class JobServiceApplication {
         ServiceStartInit.initSystemConfig(context);
         //加载业务侦听
         // SystemStartLoadBusinessConfigure.initSystemConfig(LISTENER_PATH);
+
+        //启动导出数据线程处理器
+
+        ExportDataExecutor.startExportDataExecutor();
     }
 }

+ 100 - 0
service-job/src/main/java/com/java110/job/export/ExportDataExecutor.java

@@ -0,0 +1,100 @@
+package com.java110.job.export;
+
+import com.java110.core.client.*;
+import com.java110.core.log.LoggerFactory;
+import com.java110.dto.data.ExportDataDto;
+import com.java110.utils.cache.MappingCache;
+import com.java110.utils.factory.ApplicationContextFactory;
+import com.java110.utils.util.COSUtil;
+import com.java110.utils.util.OSSUtil;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * 导出数据执行器
+ */
+public class ExportDataExecutor implements Runnable{
+    private static final Logger log = LoggerFactory.getLogger(ExportDataQueue.class);
+
+
+    //默认线程大小
+    private static final int DEFAULT_EXPORT_POOL = 4;
+
+    @Override
+    public void run() {
+
+        try {
+            doExportData();
+        }catch (Exception e){
+            log.error("处理消息异常",e);
+            e.printStackTrace();
+        }
+
+    }
+
+    private void doExportData() throws Exception {
+
+        ExportDataDto exportDataDto =  ExportDataQueue.getData();
+
+        if(exportDataDto == null){
+            return;
+        }
+
+        String businessAdapt = exportDataDto.getBusinessAdapt();
+
+        IExportDataAdapt exportDataAdaptImpl = ApplicationContextFactory.getBean(businessAdapt, IExportDataAdapt.class);
+
+        if(exportDataAdaptImpl == null){
+            return ;
+        }
+        SXSSFWorkbook workbook= exportDataAdaptImpl.exportData(exportDataDto);
+
+        //保存文件路径到 文件下载表
+        FileUploadTemplate fileUploadTemplate = ApplicationContextFactory.getBean("fileUploadTemplate", FileUploadTemplate.class);
+
+
+        ByteArrayInputStream inputStream = null;
+        ByteArrayOutputStream os = null;
+        try {
+
+            os = new ByteArrayOutputStream();
+            workbook.write(os);
+            inputStream = new ByteArrayInputStream(os.toByteArray());
+
+            fileUploadTemplate.saveFile(inputStream,exportDataDto.getFileName());
+
+        }finally {
+            try {
+                workbook.close();
+            }catch (Exception e){
+
+            }
+            try {
+                inputStream.close();
+            }catch (Exception e){
+
+            }
+            try {
+                os.close();
+            }catch (Exception e){
+
+            }
+
+        }
+    }
+
+    /**
+     * 线程启动器
+     */
+    public static void startExportDataExecutor(){
+        ExecutorService executorService = Executors.newFixedThreadPool(DEFAULT_EXPORT_POOL);
+        executorService.execute(new ExportDataExecutor());
+    }
+}

+ 40 - 0
service-job/src/main/java/com/java110/job/export/ExportDataQueue.java

@@ -0,0 +1,40 @@
+package com.java110.job.export;
+
+import com.java110.core.log.LoggerFactory;
+import com.java110.dto.data.ExportDataDto;
+import org.slf4j.Logger;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+public class ExportDataQueue {
+    private static final Logger log = LoggerFactory.getLogger(ExportDataQueue.class);
+
+    private static final BlockingQueue<ExportDataDto> msgs = new LinkedBlockingQueue<ExportDataDto>(100);
+
+    /**
+     * 添加导出数据消息
+     *
+     * @param exportDataDto
+     */
+    public static void addMsg(ExportDataDto exportDataDto) {
+        try {
+
+            msgs.offer(exportDataDto,3, TimeUnit.MILLISECONDS);
+        } catch (Exception e) {
+            log.error("写入队列失败", e);
+            e.printStackTrace();
+        }
+    }
+
+    public static ExportDataDto getData() {
+        try {
+            return msgs.take();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+}

+ 16 - 0
service-job/src/main/java/com/java110/job/export/IExportDataAdapt.java

@@ -0,0 +1,16 @@
+package com.java110.job.export;
+
+import com.java110.dto.data.ExportDataDto;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+
+/**
+ * 导出数据适配器
+ */
+public interface IExportDataAdapt {
+
+    /**
+     * 导出数据 excel
+     * @param exportDataDto
+     */
+    SXSSFWorkbook exportData(ExportDataDto exportDataDto);
+}

+ 134 - 0
service-job/src/main/java/com/java110/job/export/adapt/ReportPayFeeDetailAdapt.java

@@ -0,0 +1,134 @@
+package com.java110.job.export.adapt;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.dto.data.ExportDataDto;
+import com.java110.dto.reportFeeMonthStatistics.ReportFeeMonthStatisticsDto;
+import com.java110.intf.report.IQueryPayFeeDetailInnerServiceSMO;
+import com.java110.job.export.IExportDataAdapt;
+import com.java110.utils.util.BeanConvertUtil;
+import com.java110.utils.util.StringUtil;
+import com.java110.vo.ResultVo;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.ByteArrayOutputStream;
+import java.util.List;
+
+/**
+ * 缴费明细导出
+ */
+@Service("reportPayFeeDetail")
+public class ReportPayFeeDetailAdapt implements IExportDataAdapt{
+
+    @Autowired
+    private IQueryPayFeeDetailInnerServiceSMO queryPayFeeDetailInnerServiceSMOImpl;
+
+    private static final int MAX_ROW = 100;
+
+
+    @Override
+    public SXSSFWorkbook exportData(ExportDataDto exportDataDto) {
+
+        SXSSFWorkbook workbook = null;  //工作簿
+        String userId = "";
+        //工作表
+        workbook = new SXSSFWorkbook();
+        workbook.setCompressTempFiles(false);
+
+        Sheet sheet = workbook.createSheet("缴费明细表");
+        Row row = sheet.createRow(0);
+        row.createCell(0).setCellValue("订单号");
+        row.createCell(1).setCellValue("房号");
+        row.createCell(2).setCellValue("业主");
+        row.createCell(3).setCellValue("费用项");
+        row.createCell(4).setCellValue("费用类型");
+        row.createCell(5).setCellValue("费用状态");
+        row.createCell(6).setCellValue("支付方式");
+        row.createCell(7).setCellValue("费用开始时间");
+        row.createCell(8).setCellValue("费用结束时间");
+        row.createCell(9).setCellValue("缴费时间");
+        row.createCell(10).setCellValue("应收金额");
+        row.createCell(11).setCellValue("实收金额");
+        row.createCell(12).setCellValue("优惠金额");
+        row.createCell(13).setCellValue("减免金额");
+        row.createCell(14).setCellValue("赠送金额");
+        row.createCell(15).setCellValue("滞纳金");
+        row.createCell(16).setCellValue("空置房打折金额");
+        row.createCell(17).setCellValue("空置房减免金额");
+        row.createCell(18).setCellValue("面积");
+        row.createCell(19).setCellValue("车位");
+
+
+        JSONObject reqJson = exportDataDto.getReqJson();
+        ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto = BeanConvertUtil.covertBean(reqJson,ReportFeeMonthStatisticsDto.class);
+        if(reqJson.containsKey("roomName") && !StringUtil.isEmpty(reqJson.getString("roomName"))){
+            String[] roomNameArray = reqJson.getString("roomName").split("-",3);
+            reportFeeMonthStatisticsDto.setFloorNum(roomNameArray[0]);
+            reportFeeMonthStatisticsDto.setUnitNum(roomNameArray[1]);
+            reportFeeMonthStatisticsDto.setRoomNum(roomNameArray[2]);
+        }
+
+        //查询数据
+        getRepairPayFeeDetail(sheet, reportFeeMonthStatisticsDto);
+
+        return workbook;
+
+    }
+
+    private void getRepairPayFeeDetail(Sheet sheet, ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto) {
+        reportFeeMonthStatisticsDto.setPage(1);
+        reportFeeMonthStatisticsDto.setRow(MAX_ROW);
+        ResultVo resultVo = queryPayFeeDetailInnerServiceSMOImpl.query(reportFeeMonthStatisticsDto);
+        appendData(resultVo,sheet,0);
+
+        if(resultVo.getRecords() < 2){
+            return ;
+        }
+
+        for(int page = 2;page <= resultVo.getRecords(); page++){
+            reportFeeMonthStatisticsDto.setPage(page);
+            reportFeeMonthStatisticsDto.setRow(MAX_ROW);
+            resultVo = queryPayFeeDetailInnerServiceSMOImpl.query(reportFeeMonthStatisticsDto);
+            appendData(resultVo,sheet,(page-1)*MAX_ROW);
+        }
+    }
+
+    private void appendData(ResultVo resultVo,Sheet sheet,int step) {
+
+        List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsDtos = (List<ReportFeeMonthStatisticsDto>)resultVo.getData();
+        Row row = null;
+        JSONObject dataObj = null;
+        for (int roomIndex = 0; roomIndex < reportFeeMonthStatisticsDtos.size(); roomIndex++) {
+            row = sheet.createRow(roomIndex +step + 1);
+            dataObj = JSONObject.parseObject(JSONObject.toJSONString(reportFeeMonthStatisticsDtos.get(roomIndex)));
+            row.createCell(0).setCellValue(dataObj.getString("oId"));
+            if (!StringUtil.isEmpty(dataObj.getString("payerObjType")) && dataObj.getString("payerObjType").equals("3333")) { //房屋
+                row.createCell(1).setCellValue(dataObj.getString("floorNum") + "-" + dataObj.getString("unitNum") + "-" + dataObj.getString("roomNum"));
+            } else {
+                row.createCell(1).setCellValue(dataObj.getString("objName"));
+            }
+            row.createCell(2).setCellValue(dataObj.getString("ownerName"));
+            row.createCell(3).setCellValue(dataObj.getString("feeName"));
+            row.createCell(4).setCellValue(dataObj.getString("feeTypeCdName"));
+            row.createCell(5).setCellValue(dataObj.getString("stateName"));
+            row.createCell(6).setCellValue(dataObj.getString("primeRate"));
+            row.createCell(7).setCellValue(dataObj.getString("startTime"));
+            row.createCell(8).setCellValue(dataObj.getString("endTime"));
+            row.createCell(9).setCellValue(dataObj.getString("createTime"));
+            row.createCell(10).setCellValue(dataObj.getDouble("receivableAmount"));
+            row.createCell(11).setCellValue(dataObj.getDouble("receivedAmount"));
+            row.createCell(12).setCellValue(dataObj.getDouble("preferentialAmount"));
+            row.createCell(13).setCellValue(dataObj.getDouble("deductionAmount"));
+            row.createCell(14).setCellValue(dataObj.getDouble("giftAmount"));
+            row.createCell(15).setCellValue(dataObj.getDouble("lateFee"));
+            row.createCell(16).setCellValue(dataObj.getDouble("vacantHousingDiscount"));
+            row.createCell(17).setCellValue(dataObj.getDouble("vacantHousingReduction"));
+            row.createCell(18).setCellValue(dataObj.getString("builtUpArea"));
+            row.createCell(19).setCellValue(dataObj.getString("psName"));
+        }
+    }
+}

+ 10 - 302
service-report/src/main/java/com/java110/report/bmo/reportFeeMonthStatistics/impl/GetReportFeeMonthStatisticsBMOImpl.java

@@ -17,6 +17,7 @@ import com.java110.dto.reportFeeMonthStatistics.ReportFeeMonthStatisticsTotalDto
 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;
@@ -66,6 +67,9 @@ public class GetReportFeeMonthStatisticsBMOImpl implements IGetReportFeeMonthSta
     @Autowired
     private IFeeDetailInnerServiceSMO feeDetailInnerServiceSMOImpl;
 
+    @Autowired
+    private IQueryPayFeeDetailInnerServiceSMO queryPayFeeDetailInnerServiceSMOImpl;
+
     /**
      * @param reportFeeMonthStatisticsDto
      * @return 订单服务能够接受的报文
@@ -401,310 +405,14 @@ public class GetReportFeeMonthStatisticsBMOImpl implements IGetReportFeeMonthSta
         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;
-        //赠送金额(大计)
-        Double allGiftAmount = 0.0;
-        //吴学文 注释 感觉和上面的369 功能重复
-        //int size = 0;
-        if (count > 0) {
-            //查询缴费明细
-            reportFeeMonthStatisticsDtos = reportFeeMonthStatisticsInnerServiceSMOImpl.queryPayFeeDetail(reportFeeMonthStatisticsDto);
-            //吴学文 注释 感觉和上面的369 功能重复
-//            if (reportFeeMonthStatisticsDtos != null && reportFeeMonthStatisticsDtos.size() > 0) {
-//                //查询所有缴费明细记录
-//                ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto1 = BeanConvertUtil.covertBean(reportFeeMonthStatisticsDto, ReportFeeMonthStatisticsDto.class);
-//                reportFeeMonthStatisticsDto1.setPage(PageDto.DEFAULT_PAGE);
-//                List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsDtos1 = reportFeeMonthStatisticsInnerServiceSMOImpl.queryPayFeeDetail(reportFeeMonthStatisticsDto1);
-//                size = reportFeeMonthStatisticsDtos1.size();
-//            }
-            //查询应收、实收总金额(大计)
-            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);
-                }
-                //赠送金额(大计)
-                if (!StringUtil.isEmpty(reportFeeMonthStatistics.getDiscountSmallType()) && reportFeeMonthStatistics.getDiscountSmallType().equals("6")) {
-                    allGiftAmount = 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 totalGiftAmount = 0.0;
-            //滞纳金(小计)
-            Double totalLateFee = 0.0;
-            List<String> ownerIds = new ArrayList<>();
-            for (ReportFeeMonthStatisticsDto reportFeeMonthStatistics : reportFeeMonthStatisticsDtos) {
-                FeeDetailDto feeDetailDto = new FeeDetailDto();
-                feeDetailDto.setDetailId(reportFeeMonthStatistics.getDetailId());
-                List<FeeDetailDto> feeDetailDtos = feeDetailInnerServiceSMOImpl.queryFeeDetails(feeDetailDto);
-                Assert.listOnlyOne(feeDetailDtos, "查询费用明细表错误");
-                reportFeeMonthStatistics.setReceivableAmount(feeDetailDtos.get(0).getReceivableAmount());
-                reportFeeMonthStatistics.setPayableAmount(feeDetailDtos.get(0).getPayableAmount());
-                //应收金额
-                Double receivableAmount = Double.valueOf(reportFeeMonthStatistics.getReceivableAmount());
-                //实收金额
-                Double receivedAmount = Double.valueOf(reportFeeMonthStatistics.getReceivedAmount());
-                totalReceivableAmount = totalReceivableAmount + receivableAmount;
-                totalReceivedAmount = totalReceivedAmount + receivedAmount;
-
-                if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(reportFeeMonthStatistics.getPayerObjType())) {
-                    ownerIds.add(reportFeeMonthStatistics.getOwnerId());
-                }
-
-                // 最大记录时 就去刷新
-                //如果是车位刷房屋信息
-                if (ownerIds.size() == MAX_ROWS) {
-                    refreshReportFeeMonthStatistics(ownerIds, reportFeeMonthStatisticsDtos);
-                    ownerIds = new ArrayList<>();
-                }
-
-                //优惠金额
-                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()));
-                    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 (!StringUtil.isEmpty(reportFeeMonthStatistics.getDiscountSmallType()) && reportFeeMonthStatistics.getDiscountSmallType().equals("6")) {
-                    //赠送金额
-                    Double discountPrice = Double.valueOf(reportFeeMonthStatistics.getDiscountPrice());
-                    totalGiftAmount = totalGiftAmount + discountPrice;
-                    //赠送金额
-                    reportFeeMonthStatistics.setGiftAmount(reportFeeMonthStatistics.getDiscountPrice());
-                } else {
-                    reportFeeMonthStatistics.setGiftAmount("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);
-                if (!StringUtil.isEmpty(reportFeeMonthStatistics.getRepairId())) {
-                    RepairDto repairDto = new RepairDto();
-                    repairDto.setRepairId(reportFeeMonthStatistics.getRepairId());
-                    //查询报修单
-                    List<RepairDto> repairDtos = repairInnerServiceSMOImpl.queryRepairs(repairDto);
-                    //Assert.listOnlyOne(repairDtos, "查询报修单错误!");
-                    if (repairDtos != null && repairDtos.size() == 1) {
-                        if (!StringUtil.isEmpty(repairDtos.get(0).getRepairObjType()) && repairDtos.get(0).getRepairObjType().equals("004")) {
-                            OwnerRoomRelDto ownerRoomRelDto = new OwnerRoomRelDto();
-                            ownerRoomRelDto.setRoomId(repairDtos.get(0).getRepairObjId());
-                            List<OwnerRoomRelDto> ownerRoomRelDtos = ownerRoomRelInnerServiceSMOImpl.queryOwnerRoomRels(ownerRoomRelDto);
-                            if (ownerRoomRelDtos != null && ownerRoomRelDtos.size() == 0) { //查询条数为0条
-                                OwnerRoomRelDto ownerRoomRel = new OwnerRoomRelDto();
-                                ownerRoomRel.setRoomId(repairDtos.get(0).getRepairObjId());
-                                ownerRoomRel.setStatusCd("1"); //看看业主房屋关系数据是否删除了
-                                List<OwnerRoomRelDto> ownerRoomRels = ownerRoomRelInnerServiceSMOImpl.queryOwnerRoomRels(ownerRoomRel);
-                                Assert.listOnlyOne(ownerRoomRels, "查询业主房屋关系表错误!");
-                                OwnerDto owner = new OwnerDto();
-                                owner.setOwnerId(ownerRoomRels.get(0).getOwnerId());
-                                owner.setOwnerTypeCd("1001"); //业主本人
-                                List<OwnerDto> owners = ownerInnerServiceSMOImpl.queryOwners(owner);
-                                if (owners != null && owners.size() == 0) { //查出条数为0条
-                                    //判断业主是否删除了
-                                    OwnerDto newOwner = new OwnerDto();
-                                    newOwner.setOwnerId(ownerRoomRels.get(0).getOwnerId());
-                                    newOwner.setOwnerTypeCd("1001"); //业主本人
-                                    newOwner.setStatusCd("1");
-                                    List<OwnerDto> newOwners = ownerInnerServiceSMOImpl.queryOwners(newOwner);
-                                    Assert.listOnlyOne(newOwners, "查询业主信息错误!");
-                                    reportFeeMonthStatistics.setOwnerName(newOwners.get(0).getName());
-                                } else if (owners != null && owners.size() == 1) { //查出条数为1条
-                                    reportFeeMonthStatistics.setOwnerName(owners.get(0).getName());
-                                } else {
-                                    throw new IllegalArgumentException("查询业主信息错误!");
-                                }
-                            } else if (ownerRoomRelDtos != null && ownerRoomRelDtos.size() == 1) { //查询条数为1条
-                                OwnerDto ownerDto = new OwnerDto();
-                                ownerDto.setOwnerId(ownerRoomRelDtos.get(0).getOwnerId());
-                                ownerDto.setOwnerTypeCd("1001"); //业主本人
-                                List<OwnerDto> ownerDtos = ownerInnerServiceSMOImpl.queryOwners(ownerDto);
-                                if (ownerDtos != null && ownerDtos.size() == 0) { //业主查询条数为0条
-                                    //判断业主是否删除了
-                                    OwnerDto newOwner = new OwnerDto();
-                                    newOwner.setOwnerId(ownerRoomRelDtos.get(0).getOwnerId());
-                                    newOwner.setOwnerTypeCd("1001"); //业主本人
-                                    newOwner.setStatusCd("1");
-                                    List<OwnerDto> newOwners = ownerInnerServiceSMOImpl.queryOwners(newOwner);
-                                    Assert.listOnlyOne(newOwners, "查询业主信息错误!");
-                                    reportFeeMonthStatistics.setOwnerName(newOwners.get(0).getName());
-                                } else if (ownerDtos != null || ownerDtos.size() == 1) {
-                                    reportFeeMonthStatistics.setOwnerName(ownerDtos.get(0).getName());
-                                } else {
-                                    throw new IllegalArgumentException("查询业主信息错误!");
-                                }
-                            } else {
-                                throw new IllegalArgumentException("查询业主房屋关系表错误!");
-                            }
-                        }
-                    }
-                }
-                if (!hasInReportListAndMerge(reportList, reportFeeMonthStatistics)) {
-                    reportList.add(reportFeeMonthStatistics);
-                }
-            }
-
-            //如果是车位刷房屋信息
-            if (ownerIds.size() > 0) {
-                refreshReportFeeMonthStatistics(ownerIds, reportFeeMonthStatisticsDtos);
-            }
-
-            //应收总金额(小计)
-            reportFeeMonthStatisticsTotalDto.setTotalReceivableAmount(String.format("%.2f", totalReceivableAmount));
-            //实收金额(小计)
-            reportFeeMonthStatisticsTotalDto.setTotalReceivedAmount(String.format("%.2f", totalReceivedAmount));
-            //优惠金额(小计)
-            reportFeeMonthStatisticsTotalDto.setTotalPreferentialAmount(String.format("%.2f", totalPreferentialAmount));
-            //减免金额(小计)
-            reportFeeMonthStatisticsTotalDto.setTotalDeductionAmount(String.format("%.2f", totalDeductionAmount));
-            //滞纳金(小计)
-            reportFeeMonthStatisticsTotalDto.setTotalLateFee(String.format("%.2f", totalLateFee));
-            //空置房打折(小计)
-            reportFeeMonthStatisticsTotalDto.setTotalVacantHousingDiscount(String.format("%.2f", totalVacantHousingDiscount));
-            //空置房减免(小计)
-            reportFeeMonthStatisticsTotalDto.setTotalVacantHousingReduction(String.format("%.2f", totalVacantHousingReduction));
-            //赠送规则金额(小计)
-            reportFeeMonthStatisticsTotalDto.setTotalGiftAmount(String.format("%.2f", totalGiftAmount));
-            //应收金额(大计)
-            reportFeeMonthStatisticsTotalDto.setAllReceivableAmount(String.format("%.2f", allReceivableAmount));
-            //实收金额(大计)
-            reportFeeMonthStatisticsTotalDto.setAllReceivedAmount(String.format("%.2f", allReceivedAmount));
-            //优惠金额(大计)
-            reportFeeMonthStatisticsTotalDto.setAllPreferentialAmount(String.format("%.2f", allPreferentialAmount));
-            //减免金额(大计)
-            reportFeeMonthStatisticsTotalDto.setAllDeductionAmount(String.format("%.2f", allDeductionAmount));
-            //滞纳金(大计)
-            reportFeeMonthStatisticsTotalDto.setAllLateFee(String.format("%.2f", allLateFee));
-            //空置房打折金额(大计)
-            reportFeeMonthStatisticsTotalDto.setAllVacantHousingDiscount(String.format("%.2f", allVacantHousingDiscount));
-            //空置房减免金额(大计)
-            reportFeeMonthStatisticsTotalDto.setAllVacantHousingReduction(String.format("%.2f", allVacantHousingReduction));
-            //赠送规则金额(大计)
-            reportFeeMonthStatisticsTotalDto.setAllGiftAmount(String.format("%.2f", allGiftAmount));
-        } 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;

+ 423 - 0
service-report/src/main/java/com/java110/report/smo/impl/QueryPayFeeDetailInnerServiceSMOImpl.java

@@ -0,0 +1,423 @@
+package com.java110.report.smo.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.core.smo.IComputeFeeSMO;
+import com.java110.dto.fee.FeeConfigDto;
+import com.java110.dto.fee.FeeDetailDto;
+import com.java110.dto.fee.FeeDto;
+import com.java110.dto.owner.OwnerDto;
+import com.java110.dto.owner.OwnerRoomRelDto;
+import com.java110.dto.repair.RepairDto;
+import com.java110.dto.reportFeeMonthStatistics.ReportFeeMonthStatisticsDto;
+import com.java110.dto.reportFeeMonthStatistics.ReportFeeMonthStatisticsTotalDto;
+import com.java110.intf.community.IRepairInnerServiceSMO;
+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.utils.util.Assert;
+import com.java110.utils.util.StringUtil;
+import com.java110.vo.ResultVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 查询缴费明细
+ *
+ */
+@RestController
+public class QueryPayFeeDetailInnerServiceSMOImpl implements IQueryPayFeeDetailInnerServiceSMO{
+
+    private int MAX_ROWS = 500;  // 最大行数
+
+    @Autowired
+    private IReportFeeMonthStatisticsInnerServiceSMO reportFeeMonthStatisticsInnerServiceSMOImpl;
+
+    @Autowired
+    private IRepairInnerServiceSMO repairInnerServiceSMOImpl;
+
+    @Autowired
+    private IOwnerRoomRelInnerServiceSMO ownerRoomRelInnerServiceSMOImpl;
+
+    @Autowired
+    private IOwnerInnerServiceSMO ownerInnerServiceSMOImpl;
+
+    @Autowired
+    private IComputeFeeSMO computeFeeSMOImpl;
+
+    @Autowired
+    private IFeeDetailInnerServiceSMO feeDetailInnerServiceSMOImpl;
+
+    @Override
+    public ResultVo query(@RequestBody 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;
+        //赠送金额(大计)
+        Double allGiftAmount = 0.0;
+        //吴学文 注释 感觉和上面的369 功能重复
+        //int size = 0;
+        if (count > 0) {
+            //查询缴费明细
+            reportFeeMonthStatisticsDtos = reportFeeMonthStatisticsInnerServiceSMOImpl.queryPayFeeDetail(reportFeeMonthStatisticsDto);
+            //吴学文 注释 感觉和上面的369 功能重复
+//            if (reportFeeMonthStatisticsDtos != null && reportFeeMonthStatisticsDtos.size() > 0) {
+//                //查询所有缴费明细记录
+//                ReportFeeMonthStatisticsDto reportFeeMonthStatisticsDto1 = BeanConvertUtil.covertBean(reportFeeMonthStatisticsDto, ReportFeeMonthStatisticsDto.class);
+//                reportFeeMonthStatisticsDto1.setPage(PageDto.DEFAULT_PAGE);
+//                List<ReportFeeMonthStatisticsDto> reportFeeMonthStatisticsDtos1 = reportFeeMonthStatisticsInnerServiceSMOImpl.queryPayFeeDetail(reportFeeMonthStatisticsDto1);
+//                size = reportFeeMonthStatisticsDtos1.size();
+//            }
+            //查询应收、实收总金额(大计)
+            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);
+                }
+                //赠送金额(大计)
+                if (!StringUtil.isEmpty(reportFeeMonthStatistics.getDiscountSmallType()) && reportFeeMonthStatistics.getDiscountSmallType().equals("6")) {
+                    allGiftAmount = 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 totalGiftAmount = 0.0;
+            //滞纳金(小计)
+            Double totalLateFee = 0.0;
+            List<String> ownerIds = new ArrayList<>();
+            for (ReportFeeMonthStatisticsDto reportFeeMonthStatistics : reportFeeMonthStatisticsDtos) {
+                FeeDetailDto feeDetailDto = new FeeDetailDto();
+                feeDetailDto.setDetailId(reportFeeMonthStatistics.getDetailId());
+                List<FeeDetailDto> feeDetailDtos = feeDetailInnerServiceSMOImpl.queryFeeDetails(feeDetailDto);
+                Assert.listOnlyOne(feeDetailDtos, "查询费用明细表错误");
+                reportFeeMonthStatistics.setReceivableAmount(feeDetailDtos.get(0).getReceivableAmount());
+                reportFeeMonthStatistics.setPayableAmount(feeDetailDtos.get(0).getPayableAmount());
+                //应收金额
+                Double receivableAmount = Double.valueOf(reportFeeMonthStatistics.getReceivableAmount());
+                //实收金额
+                Double receivedAmount = Double.valueOf(reportFeeMonthStatistics.getReceivedAmount());
+                totalReceivableAmount = totalReceivableAmount + receivableAmount;
+                totalReceivedAmount = totalReceivedAmount + receivedAmount;
+
+                if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(reportFeeMonthStatistics.getPayerObjType())) {
+                    ownerIds.add(reportFeeMonthStatistics.getOwnerId());
+                }
+
+                // 最大记录时 就去刷新
+                //如果是车位刷房屋信息
+                if (ownerIds.size() == MAX_ROWS) {
+                    refreshReportFeeMonthStatistics(ownerIds, reportFeeMonthStatisticsDtos);
+                    ownerIds = new ArrayList<>();
+                }
+
+                //优惠金额
+                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()));
+                    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 (!StringUtil.isEmpty(reportFeeMonthStatistics.getDiscountSmallType()) && reportFeeMonthStatistics.getDiscountSmallType().equals("6")) {
+                    //赠送金额
+                    Double discountPrice = Double.valueOf(reportFeeMonthStatistics.getDiscountPrice());
+                    totalGiftAmount = totalGiftAmount + discountPrice;
+                    //赠送金额
+                    reportFeeMonthStatistics.setGiftAmount(reportFeeMonthStatistics.getDiscountPrice());
+                } else {
+                    reportFeeMonthStatistics.setGiftAmount("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);
+                if (!StringUtil.isEmpty(reportFeeMonthStatistics.getRepairId())) {
+                    RepairDto repairDto = new RepairDto();
+                    repairDto.setRepairId(reportFeeMonthStatistics.getRepairId());
+                    //查询报修单
+                    List<RepairDto> repairDtos = repairInnerServiceSMOImpl.queryRepairs(repairDto);
+                    //Assert.listOnlyOne(repairDtos, "查询报修单错误!");
+                    if (repairDtos != null && repairDtos.size() == 1) {
+                        if (!StringUtil.isEmpty(repairDtos.get(0).getRepairObjType()) && repairDtos.get(0).getRepairObjType().equals("004")) {
+                            OwnerRoomRelDto ownerRoomRelDto = new OwnerRoomRelDto();
+                            ownerRoomRelDto.setRoomId(repairDtos.get(0).getRepairObjId());
+                            List<OwnerRoomRelDto> ownerRoomRelDtos = ownerRoomRelInnerServiceSMOImpl.queryOwnerRoomRels(ownerRoomRelDto);
+                            if (ownerRoomRelDtos != null && ownerRoomRelDtos.size() == 0) { //查询条数为0条
+                                OwnerRoomRelDto ownerRoomRel = new OwnerRoomRelDto();
+                                ownerRoomRel.setRoomId(repairDtos.get(0).getRepairObjId());
+                                ownerRoomRel.setStatusCd("1"); //看看业主房屋关系数据是否删除了
+                                List<OwnerRoomRelDto> ownerRoomRels = ownerRoomRelInnerServiceSMOImpl.queryOwnerRoomRels(ownerRoomRel);
+                                Assert.listOnlyOne(ownerRoomRels, "查询业主房屋关系表错误!");
+                                OwnerDto owner = new OwnerDto();
+                                owner.setOwnerId(ownerRoomRels.get(0).getOwnerId());
+                                owner.setOwnerTypeCd("1001"); //业主本人
+                                List<OwnerDto> owners = ownerInnerServiceSMOImpl.queryOwners(owner);
+                                if (owners != null && owners.size() == 0) { //查出条数为0条
+                                    //判断业主是否删除了
+                                    OwnerDto newOwner = new OwnerDto();
+                                    newOwner.setOwnerId(ownerRoomRels.get(0).getOwnerId());
+                                    newOwner.setOwnerTypeCd("1001"); //业主本人
+                                    newOwner.setStatusCd("1");
+                                    List<OwnerDto> newOwners = ownerInnerServiceSMOImpl.queryOwners(newOwner);
+                                    Assert.listOnlyOne(newOwners, "查询业主信息错误!");
+                                    reportFeeMonthStatistics.setOwnerName(newOwners.get(0).getName());
+                                } else if (owners != null && owners.size() == 1) { //查出条数为1条
+                                    reportFeeMonthStatistics.setOwnerName(owners.get(0).getName());
+                                } else {
+                                    throw new IllegalArgumentException("查询业主信息错误!");
+                                }
+                            } else if (ownerRoomRelDtos != null && ownerRoomRelDtos.size() == 1) { //查询条数为1条
+                                OwnerDto ownerDto = new OwnerDto();
+                                ownerDto.setOwnerId(ownerRoomRelDtos.get(0).getOwnerId());
+                                ownerDto.setOwnerTypeCd("1001"); //业主本人
+                                List<OwnerDto> ownerDtos = ownerInnerServiceSMOImpl.queryOwners(ownerDto);
+                                if (ownerDtos != null && ownerDtos.size() == 0) { //业主查询条数为0条
+                                    //判断业主是否删除了
+                                    OwnerDto newOwner = new OwnerDto();
+                                    newOwner.setOwnerId(ownerRoomRelDtos.get(0).getOwnerId());
+                                    newOwner.setOwnerTypeCd("1001"); //业主本人
+                                    newOwner.setStatusCd("1");
+                                    List<OwnerDto> newOwners = ownerInnerServiceSMOImpl.queryOwners(newOwner);
+                                    Assert.listOnlyOne(newOwners, "查询业主信息错误!");
+                                    reportFeeMonthStatistics.setOwnerName(newOwners.get(0).getName());
+                                } else if (ownerDtos != null || ownerDtos.size() == 1) {
+                                    reportFeeMonthStatistics.setOwnerName(ownerDtos.get(0).getName());
+                                } else {
+                                    throw new IllegalArgumentException("查询业主信息错误!");
+                                }
+                            } else {
+                                throw new IllegalArgumentException("查询业主房屋关系表错误!");
+                            }
+                        }
+                    }
+                }
+                if (!hasInReportListAndMerge(reportList, reportFeeMonthStatistics)) {
+                    reportList.add(reportFeeMonthStatistics);
+                }
+            }
+
+            //如果是车位刷房屋信息
+            if (ownerIds.size() > 0) {
+                refreshReportFeeMonthStatistics(ownerIds, reportFeeMonthStatisticsDtos);
+            }
+
+            //应收总金额(小计)
+            reportFeeMonthStatisticsTotalDto.setTotalReceivableAmount(String.format("%.2f", totalReceivableAmount));
+            //实收金额(小计)
+            reportFeeMonthStatisticsTotalDto.setTotalReceivedAmount(String.format("%.2f", totalReceivedAmount));
+            //优惠金额(小计)
+            reportFeeMonthStatisticsTotalDto.setTotalPreferentialAmount(String.format("%.2f", totalPreferentialAmount));
+            //减免金额(小计)
+            reportFeeMonthStatisticsTotalDto.setTotalDeductionAmount(String.format("%.2f", totalDeductionAmount));
+            //滞纳金(小计)
+            reportFeeMonthStatisticsTotalDto.setTotalLateFee(String.format("%.2f", totalLateFee));
+            //空置房打折(小计)
+            reportFeeMonthStatisticsTotalDto.setTotalVacantHousingDiscount(String.format("%.2f", totalVacantHousingDiscount));
+            //空置房减免(小计)
+            reportFeeMonthStatisticsTotalDto.setTotalVacantHousingReduction(String.format("%.2f", totalVacantHousingReduction));
+            //赠送规则金额(小计)
+            reportFeeMonthStatisticsTotalDto.setTotalGiftAmount(String.format("%.2f", totalGiftAmount));
+            //应收金额(大计)
+            reportFeeMonthStatisticsTotalDto.setAllReceivableAmount(String.format("%.2f", allReceivableAmount));
+            //实收金额(大计)
+            reportFeeMonthStatisticsTotalDto.setAllReceivedAmount(String.format("%.2f", allReceivedAmount));
+            //优惠金额(大计)
+            reportFeeMonthStatisticsTotalDto.setAllPreferentialAmount(String.format("%.2f", allPreferentialAmount));
+            //减免金额(大计)
+            reportFeeMonthStatisticsTotalDto.setAllDeductionAmount(String.format("%.2f", allDeductionAmount));
+            //滞纳金(大计)
+            reportFeeMonthStatisticsTotalDto.setAllLateFee(String.format("%.2f", allLateFee));
+            //空置房打折金额(大计)
+            reportFeeMonthStatisticsTotalDto.setAllVacantHousingDiscount(String.format("%.2f", allVacantHousingDiscount));
+            //空置房减免金额(大计)
+            reportFeeMonthStatisticsTotalDto.setAllVacantHousingReduction(String.format("%.2f", allVacantHousingReduction));
+            //赠送规则金额(大计)
+            reportFeeMonthStatisticsTotalDto.setAllGiftAmount(String.format("%.2f", allGiftAmount));
+        } 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);
+
+        return resultVo;
+    }
+
+    /**
+     * @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;
+    }
+}