From dd6687b118561100e1677e88a9c2f5842a54c531 Mon Sep 17 00:00:00 2001
From: jialh <1972868360@qq.com>
Date: 星期四, 16 四月 2026 18:14:14 +0800
Subject: [PATCH] 水电话费

---
 service-fee/src/main/java/com/java110/fee/cmd/fee/ReportFeePropertyCmd.java |  510 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 499 insertions(+), 11 deletions(-)

diff --git a/service-fee/src/main/java/com/java110/fee/cmd/fee/ReportFeePropertyCmd.java b/service-fee/src/main/java/com/java110/fee/cmd/fee/ReportFeePropertyCmd.java
index 765d5a0..6297a05 100644
--- a/service-fee/src/main/java/com/java110/fee/cmd/fee/ReportFeePropertyCmd.java
+++ b/service-fee/src/main/java/com/java110/fee/cmd/fee/ReportFeePropertyCmd.java
@@ -7,16 +7,24 @@
 import com.java110.core.event.cmd.CmdEvent;
 import com.java110.dto.community.CommunityDto;
 import com.java110.dto.dict.DictDto;
+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.report.ReportExcelDto;
 import com.java110.dto.report.ReportQueryRecord;
 import com.java110.dto.room.RoomDto;
 import com.java110.intf.community.ICommunityInnerServiceSMO;
 import com.java110.intf.community.IRoomInnerServiceSMO;
 import com.java110.intf.dev.IDictV1InnerServiceSMO;
+import com.java110.intf.fee.IFeeConfigInnerServiceSMO;
+import com.java110.intf.fee.IFeeDetailInnerServiceSMO;
 import com.java110.intf.fee.IReportFeeInnerServiceSMO;
+import com.java110.intf.user.IOwnerInnerServiceSMO;
 import com.java110.utils.exception.CmdException;
 import com.java110.utils.util.Assert;
 import com.java110.utils.util.BeanConvertUtil;
+import com.java110.utils.util.DateUtil;
 import com.java110.vo.FeeQueryParams;
 import com.java110.vo.ResultVo;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -25,9 +33,8 @@
 
 import java.math.BigDecimal;
 import java.text.ParseException;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Java110Cmd(serviceCode = "fee.reportPropertyFeeCmd")
 public class ReportFeePropertyCmd extends Cmd {
@@ -43,6 +50,15 @@
 
     @Autowired
     private IRoomInnerServiceSMO roomInnerServiceSMOImpl;
+
+    @Autowired
+    private IFeeConfigInnerServiceSMO  feeConfigInnerServiceSMOImpl;
+
+    @Autowired
+    private IOwnerInnerServiceSMO ownerInnerServiceSMOImpl;
+
+    @Autowired
+    private IFeeDetailInnerServiceSMO feeDetailInnerServiceSMOImpl;
 
     @Override
     public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
@@ -74,7 +90,42 @@
         reportQueryRecord.setOperator("鐧藉崟娴佹按鐗╀笟琛�");
         List<ReportQueryRecord> reportQueryRecords = reportFeeInnerServiceSMOImpl.queryReport(BeanConvertUtil.beanCovertMap(reportQueryRecord));
 
-        if(reportQueryRecords.size()>0 && !reqJson.containsKey("reload")){
+        if (reqJson.containsKey("roomNum") && !(reqJson.get("roomNum").equals(""))) {
+            RoomDto roomDto = new RoomDto();
+            String[] roomTitle = reqJson.getString("roomNum").split("-");
+            roomDto.setFloorNum(roomTitle[0]);
+            roomDto.setUnitNum(roomTitle[1]);
+            roomDto.setRoomNum(roomTitle[2]);
+            roomDto.setCommunityId(reqJson.getString("communityId"));
+            List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);//鑾峰彇鎴垮眿
+            OwnerDto ownerDto = new OwnerDto();
+            ownerDto.setCommunityId(reqJson.getString("communityId"));
+            ownerDto.setRoomId(roomDtos.get(0).getRoomId());
+            List<OwnerDto> ownerDtos = ownerInnerServiceSMOImpl.queryOwners(ownerDto);//鑾峰彇涓氫富
+
+            roomDto.setOwnerName(ownerDtos.get(0).getName());
+
+            ReportExcelDto reportExcelDto = new ReportExcelDto();
+            reportExcelDto.setOwner(ownerDtos.get(0));
+            reportExcelDto.setRoomDto(roomDtos.get(0));
+            FeeDetailDto feeDetailDto = new FeeDetailDto();
+            List<Map> rooms = roomInnerServiceSMOImpl.queryRoomsAsReport(roomDto);
+
+            reportExcelDto.setPropertyFeeList(backFeeList("3333",rooms.get(0).get("room_id")));
+            reportExcelDto.setCarFeeList(backFeeList("6666",rooms.get(0).get("room_id")));
+            reportExcelDto.setOtherFeeList(backFeeList("7777",rooms.get(0).get("room_id")));
+
+
+
+            ResultVo resultVo = new ResultVo(reportExcelDto);
+
+            ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
+
+            context.setResponseEntity(responseEntity);
+            return;
+        }
+
+        else if(reportQueryRecords.size()>0 && !reqJson.containsKey("reload") && !reqJson.containsKey("floorId")){
             ResultVo resultVo = new ResultVo(JSONObject.parse(reportQueryRecords.get(reportQueryRecords.size()-1).getReportContent()));
 
             ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
@@ -83,26 +134,463 @@
         }
 
         else{
-
+            int row = Integer.parseInt(reqJson.containsKey("row")?reqJson.getString("row"):"10");
+            int page = Integer.parseInt(reqJson.containsKey("page")?reqJson.getString("page"):"1");
+            startYear = 2016;
+            endYear = DateUtil.getYear();
+            Object[][] test = new Object[row][];
             RoomDto roomDto = new RoomDto();
-            roomDto.setRoomId(reqJson.getString("communityId"));
+            roomDto.setCommunityId(reqJson.getString("communityId"));
+            roomDto.setRow(row);
+            roomDto.setPage(page * row - row);
+            roomDto.setFloorNum(reqJson.containsKey("floorId")&&!(reqJson.getString("floorId").equals(""))?reqJson.getString("floorId"):null);
+            roomDto.setOwnerName(reqJson.containsKey("ownerName")&&reqJson.getString("ownerName").equals("")?null:reqJson.getString("ownerName"));
             List<Map> rooms = roomInnerServiceSMOImpl.queryRoomsAsReport(roomDto);
+            if (rooms.size() == 0) {
+                ResultVo resultVo = new ResultVo("鏈煡璇㈠埌鏁版嵁");
+                resultVo.setTotal(0);
+                resultVo.setRecords(0);
+                ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.NOT_FOUND);
+                context.setResponseEntity(responseEntity);
+                return;
+            }
+            int count = roomInnerServiceSMOImpl.queryRoomsCount(roomDto);
+            FeeConfigDto feeConfigDto = new FeeConfigDto();
+            feeConfigDto.setCommunityId(reqJson.getString("communityId"));
+            if(reqJson.containsKey("feeTypeCd") && !(reqJson.get("feeTypeCd").equals(""))){
+                feeConfigDto.setFeeTypeCd(reqJson.getString("feeTypeCd"));
+            }else{
+                feeConfigDto.setFeeTypeCds(new String[]{"630000001"});
+            }
+            if(reqJson.containsKey("importFee") && !(reqJson.get("importFee").equals(""))){
+                feeConfigDto.setFeeNameEq(reqJson.getString("importFee"));
+            }else{
+                feeConfigDto.setFeeTypeCds(new String[]{"630000001"});
+            }
+            List<FeeConfigDto> originalDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
+
+// 2. 娴佸紡澶勭悊锛氭帓搴� 鈫� 鍘婚噸锛堟寜鍗曚环锛� 鈫� 鍙栧墠2鏉�
+            List<FeeConfigDto> top2DistinctPriceDtos = originalDtos.stream()
+                    // 绗竴姝ワ細鎸変笟鍔¤鍒欐帓搴忥紙绀轰緥锛氬厛鎸夊崟浠峰崌搴忥紝鐩稿悓鍗曚环鎸塻tartTime闄嶅簭锛堜繚鐣欐渶鏂拌褰曪級锛�
+                    .sorted(
+                            // 鍗曚环鎺掑簭锛歯ull鍊兼斁鏈�鍚庯紝闈瀗ull鎸夎嚜鐒堕『搴忥紙濡侭igDecimal鍗囧簭锛�
+                            Comparator.comparing(FeeConfigDto::getSquarePrice, Comparator.nullsLast(Comparator.naturalOrder()))
+                                    // 鐩稿悓鍗曚环鏃讹紝鎸塻tartTime闄嶅簭锛堢‘淇濅繚鐣欌�滄渶鏂扳�濈殑閭f潯锛�
+                                    .thenComparing(FeeConfigDto::getStartTime, Comparator.nullsLast(Comparator.reverseOrder()))
+                    )
+                    // 绗簩姝ワ細鎸夊崟浠峰垎缁勶紙鑷姩鍘婚噸锛屾瘡缁勫搴斾竴涓敮涓�鍗曚环锛�
+                    .collect(Collectors.groupingBy(
+                            dto -> (dto.getSquarePrice() == null) ? new Object() : dto.getSquarePrice(), // 澶勭悊null鐨勫垎缁勯敭
+                            Collectors.toList() // 姣忕粍鍐呮槸鎺掑簭鍚庣殑璁板綍锛堝凡纭繚鏈�浼橈級
+                    ))
+                    // 绗笁姝ワ細鎻愬彇姣忕粍鐨勭涓�鏉★紙鍗宠鍗曚环鐨勨�滄渶浼樿褰曗�濓級锛屽啀鍙栧墠2鏉�
+                    .values().stream()
+                    .map(group -> group.get(0))
+                    .collect(Collectors.toList());
+            List<FeeConfigDto> feeConfigDtos = top2DistinctPriceDtos;
+
+            int arrLength = 11 + (2 * feeConfigDtos.size()) + 8 + ((endYear - startYear + 1) * 3 + 10) - 9;
+            ReportExcelDto[] header = new ReportExcelDto[arrLength];
+            List<List<ReportExcelDto>> lists = headerDoing(feeConfigDtos, startYear, endYear, arrLength);
+            test[0] = header;
+            for (int i = 1; i <= rooms.size(); i++) {
+                Map map = rooms.get(i - 1);
+                String[] strings = new String[arrLength];
+                strings[0] = String.valueOf(row * (page - 1) + i);
+                strings[1] = String.valueOf(rooms.get(i - 1).get("property_type"));
+                strings[2] = rooms.get(i - 1).get("floor_num").toString();
+                strings[3] = rooms.get(i - 1).get("unit_num").toString();
+                strings[4] = rooms.get(i - 1).get("room_num").toString();
+                strings[5] = strings[3] + "-" +  strings[4];
+                strings[6] = rooms.get(i - 1).get("property_address").toString();
+                strings[7] = rooms.get(i - 1).get("room_area").toString();
+                strings[8] = rooms.get(i - 1).get("name").toString();
+                for (int j = 1; j <= feeConfigDtos.size(); j++) {
+                    strings[8 + j] = doublequ2(Double.parseDouble(feeConfigDtos.get(j - 1).getSquarePrice()))+"";
+                }
+                strings[8 + feeConfigDtos.size() + 1] = "";
+                for (int j = 1; j <= feeConfigDtos.size(); j++) {
+                    strings[8 + feeConfigDtos.size() + 1 + j] = (doublequ2(Double.parseDouble(feeConfigDtos.get(j - 1).getSquarePrice()) * Double.parseDouble(String.valueOf((BigDecimal) rooms.get(i - 1).get("room_area")))))+"";
+                }
+                strings[8 + (2 * feeConfigDtos.size()) + 2] = (doublequ2(Double.parseDouble(feeConfigDtos.get(feeConfigDtos.size() - 1).getSquarePrice()) * Double.parseDouble(String.valueOf((BigDecimal) rooms.get(i - 1).get("room_area")))))+"";
+                strings[8 + (2 * feeConfigDtos.size()) + 2] = doublequ2(Double.parseDouble(strings[8 + (2 * feeConfigDtos.size()) + 2]) * 12)+"";
+                HashMap<Object, Object> objectObjectHashMap = new HashMap<>();
+                objectObjectHashMap.put("payObjId", map.get("room_id"));
+                List<Map> fee = reportFeeInnerServiceSMOImpl.onceRoomFee(objectObjectHashMap);
+                double allMoney = 0;
+                double allPayMoney = 0;
+                int monthCount = 0;
+                double noPayMoney = 0;
+                double year1 = 0;
+                double year2 = 0;
+                double discountMoney = 0;
+                String noPayDate = "";
+                currentYear = DateUtil.getYear();
+                for (Map map1 : fee){
+                    if(map1.containsKey("缁熻缁村害") && !(map1.get("缁熻缁村害").toString().contains("鎬昏"))){
+                        allMoney = doublequ2(((BigDecimal) map1.get("搴旀敹閲戦")).doubleValue()+allMoney);
+                        allPayMoney = doublequ2(((BigDecimal) map1.get("瀹炴敹閲戦")).doubleValue()+allPayMoney);
+                        monthCount = ((BigDecimal)map1.get("鏈敹鏈堟暟")).intValue()+monthCount;
+                        noPayMoney = doublequ2(((BigDecimal)map1.get("鏈敹閲戦")).intValue()+noPayMoney);
+                        noPayDate = noPayDate + map1.get("鏈敹鍖洪棿");
+                        discountMoney = doublequ2(((BigDecimal)map1.get("鎶樻墸閲戦")).doubleValue()+discountMoney);
+                        if(map1.get("缁熻缁村害").equals("2026")){
+                            year1 = doublequ2(((BigDecimal) map1.get("搴旀敹閲戦")).doubleValue() + year1);
+                        }
+                        if(map1.get("缁熻缁村害").equals("2027")){
+                            year2 = doublequ2(((BigDecimal) map1.get("搴旀敹閲戦")).doubleValue() + year2);
+                        }
+                    }
+
+                }
+                for (int x = endYear ; x >= startYear ; x --){
+                    strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - x)) + 1] = "0";
+                    strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - x)) + 2] = "";
+                    strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - x)) + 3] = "";
+                    for (Map map1 : fee){
+                        if(map1.get("缁熻缁村害").equals((endYear - x + startYear)+"骞�")) {
+                            strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - x)) + 1] = Integer.parseInt(strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - x)) + 1]) + ((BigDecimal) map1.get("宸叉敹鏈堟暟")).intValue() + "";
+                            if(map1.containsKey("宸叉敹鍖洪棿")){
+                                strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - x)) + 2] = strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - x)) + 2] + "  " + map1.get("宸叉敹鍖洪棿");
+                            }
+                            if(map1.containsKey("鏈敹鍖洪棿")){
+                                strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - x)) + 3] = strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - x)) + 3] + "  " + map1.get("鏈敹鍖洪棿");
+                            }
+                        }
+                    }
+                }
+                strings[8 + (2 * feeConfigDtos.size()) + 3] = allMoney+"";
+                strings[8 + (2 * feeConfigDtos.size()) + 4] = allPayMoney+"";
+                strings[8 + (2 * feeConfigDtos.size()) + 5] = "";
+                strings[8 + (2 * feeConfigDtos.size()) + 6] = year1+"";//2026
+                strings[8 + (2 * feeConfigDtos.size()) + 7] = year2+"";//2027
+                strings[8 + (2 * feeConfigDtos.size()) + 8] = monthCount+"";
+                strings[8 + (2 * feeConfigDtos.size()) + 9] = noPayMoney+"";
+                strings[8 + (2 * feeConfigDtos.size()) + 10] = "";//22
+                strings[8 + (2 * feeConfigDtos.size()) + 11] = "";//23鍘嗗勾寰呮敹
+                strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - startYear)) + 3 + 1] = discountMoney+"";
+                test[i - 1] = strings;
+            }
 
 
             reportQueryRecord.setCommunityId(reqJson.getString("communityId"));
             reportQueryRecord.setQueryStatus("0");
             reportQueryRecord.setEndYear(currentYear+"");
-//            reportQueryRecord.setReportContent(JSONObject.toJSONString());
+            ReportExcelDto reportExcelDto = new ReportExcelDto();
+            reportExcelDto.setHeader(lists);
+            reportExcelDto.setData(test);
+            reportQueryRecord.setReportContent(JSONObject.toJSONString(reportExcelDto));
             reportQueryRecord.setOperator("鐧藉崟娴佹按鐗╀笟琛�");
 
-
 //            int i = reportFeeInnerServiceSMOImpl.saveReport(BeanConvertUtil.beanCovertMap(reportQueryRecord));
-            String[][] strings = new String[10][57];
-            ResultVo resultVo = new ResultVo(strings);
-
+            ResultVo resultVo = new ResultVo(reportExcelDto);
+            resultVo.setTotal(count);
+            resultVo.setRecords(count / row);
             ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
 
             context.setResponseEntity(responseEntity);
         }
     }
+
+    public Object[][] doCmd2(JSONObject reqJson) throws CmdException, ParseException {
+        int startYear = 2020;
+        CommunityDto communityDto = new CommunityDto();
+        communityDto.setCommunityId(reqJson.getString("communityId"));
+        List<CommunityDto> communityDtos = communityInnerServiceSMOImpl.queryCommunitys(communityDto);
+        FeeQueryParams feeQueryParams = new FeeQueryParams();
+        feeQueryParams.setCommunityId(reqJson.getString("communityId"));
+        feeQueryParams.setStartYear(startYear);
+        int currentYear = java.time.Year.now().getValue();
+        feeQueryParams.setEndYear(currentYear + 2);
+        if(reqJson.containsKey("endYear") && !reqJson.get("endYear").equals("") && reqJson.get("endYear") != null) {
+            currentYear=Integer.parseInt(reqJson.get("endYear")+"");
+            feeQueryParams.setEndYear(Integer.parseInt(reqJson.get("endYear")+"")+2);
+        }
+        int endYear = feeQueryParams.getEndYear();
+        int doYear = endYear - startYear;
+
+        ReportQueryRecord reportQueryRecord = new ReportQueryRecord();
+        reportQueryRecord.setCommunityId(reqJson.getString("communityId"));
+        reportQueryRecord.setQueryStatus("0");
+        reportQueryRecord.setEndYear(currentYear+"");
+        reportQueryRecord.setOperator("鐧藉崟娴佹按鐗╀笟琛�");
+        List<ReportQueryRecord> reportQueryRecords = reportFeeInnerServiceSMOImpl.queryReport(BeanConvertUtil.beanCovertMap(reportQueryRecord));
+            int row = Integer.parseInt(reqJson.containsKey("row")?reqJson.getString("row"):"10");
+            int page = Integer.parseInt(reqJson.containsKey("page")?reqJson.getString("page"):"1");
+            startYear = 2016;
+            endYear = DateUtil.getYear();
+            Object[][] test = new Object[row][];
+            RoomDto roomDto = new RoomDto();
+            roomDto.setCommunityId(reqJson.getString("communityId"));
+            roomDto.setRow(row);
+            roomDto.setPage(page * row - row);
+            roomDto.setFloorNum(reqJson.containsKey("floorId")&&!(reqJson.getString("floorId").equals(""))?reqJson.getString("floorId"):null);
+            roomDto.setOwnerName(reqJson.containsKey("ownerName")&&reqJson.getString("ownerName").equals("")?null:reqJson.getString("ownerName"));
+            List<Map> rooms = roomInnerServiceSMOImpl.queryRoomsAsReport(roomDto);
+            int count = roomInnerServiceSMOImpl.queryRoomsCount(roomDto);
+            FeeConfigDto feeConfigDto = new FeeConfigDto();
+            feeConfigDto.setCommunityId(reqJson.getString("communityId"));
+            if(reqJson.containsKey("feeTypeCd") && !(reqJson.get("feeTypeCd").equals(""))){
+                feeConfigDto.setFeeTypeCd(reqJson.getString("feeTypeCd"));
+            }else{
+                feeConfigDto.setFeeTypeCds(new String[]{"630000001"});
+            }
+            if(reqJson.containsKey("importFee") && !(reqJson.get("importFee").equals(""))){
+                feeConfigDto.setFeeNameEq(reqJson.getString("importFee"));
+            }else{
+                feeConfigDto.setFeeTypeCds(new String[]{"630000001"});
+            }
+            List<FeeConfigDto> originalDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
+
+// 2. 娴佸紡澶勭悊锛氭帓搴� 鈫� 鍘婚噸锛堟寜鍗曚环锛� 鈫� 鍙栧墠2鏉�
+            List<FeeConfigDto> top2DistinctPriceDtos = originalDtos.stream()
+                    // 绗竴姝ワ細鎸変笟鍔¤鍒欐帓搴忥紙绀轰緥锛氬厛鎸夊崟浠峰崌搴忥紝鐩稿悓鍗曚环鎸塻tartTime闄嶅簭锛堜繚鐣欐渶鏂拌褰曪級锛�
+                    .sorted(
+                            // 鍗曚环鎺掑簭锛歯ull鍊兼斁鏈�鍚庯紝闈瀗ull鎸夎嚜鐒堕『搴忥紙濡侭igDecimal鍗囧簭锛�
+                            Comparator.comparing(FeeConfigDto::getSquarePrice, Comparator.nullsLast(Comparator.naturalOrder()))
+                                    // 鐩稿悓鍗曚环鏃讹紝鎸塻tartTime闄嶅簭锛堢‘淇濅繚鐣欌�滄渶鏂扳�濈殑閭f潯锛�
+                                    .thenComparing(FeeConfigDto::getStartTime, Comparator.nullsLast(Comparator.reverseOrder()))
+                    )
+                    // 绗簩姝ワ細鎸夊崟浠峰垎缁勶紙鑷姩鍘婚噸锛屾瘡缁勫搴斾竴涓敮涓�鍗曚环锛�
+                    .collect(Collectors.groupingBy(
+                            dto -> (dto.getSquarePrice() == null) ? new Object() : dto.getSquarePrice(), // 澶勭悊null鐨勫垎缁勯敭
+                            Collectors.toList() // 姣忕粍鍐呮槸鎺掑簭鍚庣殑璁板綍锛堝凡纭繚鏈�浼橈級
+                    ))
+                    // 绗笁姝ワ細鎻愬彇姣忕粍鐨勭涓�鏉★紙鍗宠鍗曚环鐨勨�滄渶浼樿褰曗�濓級锛屽啀鍙栧墠2鏉�
+                    .values().stream()
+                    .map(group -> group.get(0))
+                    .collect(Collectors.toList());
+            List<FeeConfigDto> feeConfigDtos = top2DistinctPriceDtos;
+
+            int arrLength = 11 + (2 * feeConfigDtos.size()) + 8 + ((endYear - startYear + 1) * 3 + 10) - 9;
+            ReportExcelDto[] header = new ReportExcelDto[arrLength];
+            List<List<ReportExcelDto>> lists = headerDoing(feeConfigDtos, startYear, endYear, arrLength);
+            test[0] = header;
+            for (int i = 1; i <= rooms.size(); i++) {
+                Map map = rooms.get(i - 1);
+                String[] strings = new String[arrLength];
+                strings[0] = String.valueOf(row * (page - 1) + i);
+                strings[1] = String.valueOf(rooms.get(i - 1).get("property_type"));
+                strings[2] = rooms.get(i - 1).get("floor_num").toString();
+                strings[3] = rooms.get(i - 1).get("unit_num").toString();
+                strings[4] = rooms.get(i - 1).get("room_num").toString();
+                strings[5] = strings[3] + "-" +  strings[4];
+                strings[6] = rooms.get(i - 1).get("property_address").toString();
+                strings[7] = rooms.get(i - 1).get("room_area").toString();
+                strings[8] = rooms.get(i - 1).get("name").toString();
+                for (int j = 1; j <= feeConfigDtos.size(); j++) {
+                    strings[8 + j] = doublequ2(Double.parseDouble(feeConfigDtos.get(j - 1).getSquarePrice()))+"";
+                }
+                strings[8 + feeConfigDtos.size() + 1] = "";
+                for (int j = 1; j <= feeConfigDtos.size(); j++) {
+                    strings[8 + feeConfigDtos.size() + 1 + j] = (doublequ2(Double.parseDouble(feeConfigDtos.get(j - 1).getSquarePrice()) * Double.parseDouble(String.valueOf((BigDecimal) rooms.get(i - 1).get("room_area")))))+"";
+                }
+                strings[8 + (2 * feeConfigDtos.size()) + 2] = (doublequ2(Double.parseDouble(feeConfigDtos.get(feeConfigDtos.size() - 1).getSquarePrice()) * Double.parseDouble(String.valueOf((BigDecimal) rooms.get(i - 1).get("room_area")))))+"";
+                strings[8 + (2 * feeConfigDtos.size()) + 2] = doublequ2(Double.parseDouble(strings[8 + (2 * feeConfigDtos.size()) + 2]) * 12)+"";
+                HashMap<Object, Object> objectObjectHashMap = new HashMap<>();
+                objectObjectHashMap.put("payObjId", map.get("room_id"));
+                List<Map> fee = reportFeeInnerServiceSMOImpl.onceRoomFee(objectObjectHashMap);
+                double allMoney = 0;
+                double allPayMoney = 0;
+                int monthCount = 0;
+                double noPayMoney = 0;
+                double year1 = 0;
+                double year2 = 0;
+                double discountMoney = 0;
+                String noPayDate = "";
+                currentYear = DateUtil.getYear();
+                for (Map map1 : fee){
+                    if(map1.containsKey("缁熻缁村害") && !(map1.get("缁熻缁村害").toString().contains("鎬昏"))){
+                        allMoney = doublequ2(((BigDecimal) map1.get("搴旀敹閲戦")).doubleValue()+allMoney);
+                        allPayMoney = doublequ2(((BigDecimal) map1.get("瀹炴敹閲戦")).doubleValue()+allPayMoney);
+                        monthCount = ((BigDecimal)map1.get("鏈敹鏈堟暟")).intValue()+monthCount;
+                        noPayMoney = doublequ2(((BigDecimal)map1.get("鏈敹閲戦")).intValue()+noPayMoney);
+                        noPayDate = noPayDate + map1.get("鏈敹鍖洪棿");
+                        discountMoney = doublequ2(((BigDecimal)map1.get("鎶樻墸閲戦")).doubleValue()+discountMoney);
+                        if(map1.get("缁熻缁村害").equals("2026")){
+                            year1 = doublequ2(((BigDecimal) map1.get("搴旀敹閲戦")).doubleValue() + year1);
+                        }
+                        if(map1.get("缁熻缁村害").equals("2027")){
+                            year2 = doublequ2(((BigDecimal) map1.get("搴旀敹閲戦")).doubleValue() + year2);
+                        }
+                    }
+
+                }
+                for (int x = endYear ; x >= startYear ; x --){
+                    strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - x)) + 1] = "0";
+                    strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - x)) + 2] = "";
+                    strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - x)) + 3] = "";
+                    for (Map map1 : fee){
+                        if(map1.get("缁熻缁村害").equals((endYear - x + startYear)+"骞�")) {
+                            strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - x)) + 1] = Integer.parseInt(strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - x)) + 1]) + ((BigDecimal) map1.get("宸叉敹鏈堟暟")).intValue() + "";
+                            if(map1.containsKey("宸叉敹鍖洪棿")){
+                                strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - x)) + 2] = strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - x)) + 2] + "  " + map1.get("宸叉敹鍖洪棿");
+                            }
+                            if(map1.containsKey("鏈敹鍖洪棿")){
+                                strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - x)) + 3] = strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - x)) + 3] + "  " + map1.get("鏈敹鍖洪棿");
+                            }
+                        }
+                    }
+                }
+                strings[8 + (2 * feeConfigDtos.size()) + 3] = allMoney+"";
+                strings[8 + (2 * feeConfigDtos.size()) + 4] = allPayMoney+"";
+                strings[8 + (2 * feeConfigDtos.size()) + 5] = "";
+                strings[8 + (2 * feeConfigDtos.size()) + 6] = year1+"";//2026
+                strings[8 + (2 * feeConfigDtos.size()) + 7] = year2+"";//2027
+                strings[8 + (2 * feeConfigDtos.size()) + 8] = monthCount+"";
+                strings[8 + (2 * feeConfigDtos.size()) + 9] = noPayMoney+"";
+                strings[8 + (2 * feeConfigDtos.size()) + 10] = "";//22
+                strings[8 + (2 * feeConfigDtos.size()) + 11] = "";//23鍘嗗勾寰呮敹
+                strings[8 + (2 * feeConfigDtos.size()) + 10 + (3 * (endYear - startYear)) + 3 + 1] = discountMoney+"";
+                test[i - 1] = strings;
+            }
+
+
+            return test;
+    }
+
+    private String[][] backFeeList(String number, Object roomId) {
+        HashMap<Object, Object> objectObjectHashMap = new HashMap<>();
+        objectObjectHashMap.put("payObjId", roomId);
+        objectObjectHashMap.put("feeTypeCd",number);
+        List<Map> fee = reportFeeInnerServiceSMOImpl.onceRoomFee(objectObjectHashMap);
+        String[][] strings = new String[fee.size()][17];
+        for (int i = 0 ; i < fee.size(); i++) {
+            Map map = fee.get(i);
+            strings[i][0] = (String) map.get("缁熻缁村害");
+            strings[i][1] = ((BigDecimal) map.get("搴旀敹鏈堟暟")).toString();
+            strings[i][2] = doublequ2(((BigDecimal) map.get("搴旀敹閲戦")).doubleValue())+"";
+//                strings[i][3] = (String) map.get("鎶樻墸閲戦");
+            strings[i][4] = doublequ2(((BigDecimal) map.get("鎶樻墸閲戦")).doubleValue())+"";
+//                strings[i][5] = (String) map.get("鎶樻墸閲戦");
+//                strings[i][6] = (String) map.get("鎶樻墸閲戦");
+//                strings[i][7] = (String) map.get("鎶樻墸閲戦");//鐢宠浜�
+//                strings[i][8] = (String) map.get("鎶樻墸閲戦");//瀹℃壒浜�
+//                strings[i][9] = (String) map.get("鎶樻墸閲戦");//鍙戣捣鏃ユ湡
+            strings[i][10] = Double.parseDouble(strings[i][2]) - Double.parseDouble(strings[i][4])+"";
+            strings[i][11] = ((BigDecimal) map.get("宸叉敹鏈堟暟")).toString();
+            strings[i][12] = doublequ2(((BigDecimal) map.get("瀹炴敹閲戦")).doubleValue())+"";
+            strings[i][13] = (String) map.get("宸叉敹鍖洪棿");
+            strings[i][14] = ((BigDecimal) map.get("鏈敹鏈堟暟")).toString();
+            strings[i][15] = doublequ2(((BigDecimal) map.get("鏈敹閲戦")).doubleValue())+"";
+            strings[i][16] = (String) map.get("鏈敹鍖洪棿");
+        }
+        return strings;
+    }
+
+    private void setHeader(String[] header) {
+        header[0] = "骞翠唤";
+        header[1] = "搴旂即鏈堟暟";
+        header[2] = "搴旂即閲戦";
+        header[3] = "鎶樻墸";
+        header[4] = "鎵撴姌閲戦";
+        header[5] = "鎵撴姌鍖洪棿";
+        header[6] = "鎵撴姌鍗曞綊妗f棩鏈�";
+        header[7] = "鐢宠浜�";
+        header[8] = "瀹℃壒浜�";
+        header[9] = "鍙戣捣鏃ユ湡";
+        header[10] = "鎶樺悗搴旂即";
+        header[11] = "宸叉敹鏈堟暟";
+        header[12] = "宸茬即閲戦";
+        header[13] = "宸叉敹鍖洪棿";
+        header[14] = "鏈即鏈堟暟";
+        header[15] = "鏈即閲戦";
+        header[16] = "鏈敹鍖洪棿";
+
+    }
+
+    private List<List<ReportExcelDto>> headerDoing(List<FeeConfigDto> feeConfigDtos, int startYear, int endYear, int arrLength) {
+        LinkedList<List<ReportExcelDto>> reportExcelDtos = new LinkedList<>();
+        int feeRow = feeConfigDtos.size();
+        LinkedList<ReportExcelDto> header = new LinkedList<>();
+
+// 1. 鍥哄畾琛ㄥご椤癸細涓ユ牸鎸夊師浠g爜col鍊艰缃�
+        header.add(createHeaderRow("搴忓彿", 1, 3));          // 鍘焤ow.setCol(1)
+        header.add(createHeaderRow("鐗╀笟绫诲瀷", 1, 3));      // 鍘熸湭鏀筩ol锛屾部鐢ㄥ墠涓�涓�1
+        header.add(createHeaderRow("妤兼爧鍙�/寮�", 1, 3));    // 鍘熸湭鏀筩ol锛屾部鐢�1
+        header.add(createHeaderRow("闂ㄥ彿", 1, 3));          // 鍘熸湭鏀筩ol锛屾部鐢�1
+        header.add(createHeaderRow("瀹ゅ彿", 1, 3));          // 鍘熸湭鏀筩ol锛屾部鐢�1
+        header.add(createHeaderRow("闂ㄥ鍙�", 1, 3));        // 鍘熸湭鏀筩ol锛屾部鐢�1
+        header.add(createHeaderRow("浜ц瘉鍦板潃", 1, 3));      // 鍘熸湭鏀筩ol锛屾部鐢�1
+        header.add(createHeaderRow("鏀惰垂闈㈢Н锛坢虏锛�", 1, 3));// 鍘熸湭鏀筩ol锛屾部鐢�1
+        header.add(createHeaderRow("璐埧浜哄鍚�", 1, 3));    // 鍘熸湭鏀筩ol锛屾部鐢�1
+
+// 2. 绗竴涓猣eeRow寰幆锛氬師鏈樉寮忔敼col锛屾部鐢ㄥ墠涓�涓�1锛堟寜鍘熼�昏緫淇濇寔col=1锛�
+        for (int i = 0; i < feeRow; i++) {
+            header.add(createHeaderRow(feeConfigDtos.get(i).getFeeName(), 1, 3));
+        }
+
+// 3. 璁惧杩愪綔璐癸細鍘熸湭鏀筩ol锛屾部鐢ㄥ墠涓�涓�1
+        header.add(createHeaderRow("璁惧杩愪綔璐�", 1, 3));
+
+// 4. 绗簩涓猣eeRow寰幆锛氬師鏈樉寮忔敼col锛屾部鐢ㄥ墠涓�涓�1锛堟寜鍘熼�昏緫淇濇寔col=1锛�
+        for (int i = 0; i < feeRow; i++) {
+            header.add(createHeaderRow(feeConfigDtos.get(i).getFeeName(), 1, 3));
+        }
+
+// 5. 骞村簲鏀舵锛氬師鏄惧紡setCol(1)锛屼繚鎸乧ol=1
+        header.add(createHeaderRow("骞村簲鏀舵", 1, 3));
+
+// 6. 鍚堣(2020骞�1鏈�-鑷充粖)锛氬師鏄惧紡setCol(8)锛屼繚鎸乧ol=8锛涘師setRow(1)锛屼繚鎸乺ow=1
+        header.add(createHeaderRow("鍚堣(2020骞�1鏈�-鑷充粖)", 8, 1));
+
+// 7. 鍘嗗勾瀹炴敹锛氬師鏄惧紡setCol((endYear - startYear + 1) * 3)锛屼繚鎸佽璁$畻閫昏緫
+        int yearCol = (endYear - startYear + 1) * 3;
+        header.add(createHeaderRow("鍘嗗勾瀹炴敹", yearCol+1, 1));
+        header.add(createHeaderRow("鎿嶄綔", 1, 3));    // 鍘熸湭鏀筩ol锛屾部鐢�1
+
+// 鏈�缁堟坊鍔犺〃澶村埌鎶ヨ〃鍒楄〃
+        reportExcelDtos.add(header);
+
+
+        // 鍒濆鍖� LinkedList锛堣�岄潪鏁扮粍锛屾敮鎸侀『搴忔坊鍔狅級
+        LinkedList<ReportExcelDto> header2 = new LinkedList<>();
+
+// 1. 搴旀敹銆佸疄鏀躲�佷唬鏀剁瓑鍥哄畾椤癸細鎸夐『搴廰dd锛屽搴斿師鏁扮粍0-7涓嬫爣
+        header2.add(createHeaderRow("搴旀敹", 1, 2));          // 瀵瑰簲鍘焗eader[0]
+        header2.add(createHeaderRow("瀹炴敹", 1, 2));          // 瀵瑰簲鍘焗eader[1]
+        header2.add(createHeaderRow("浠f敹", 1, 2));          // 瀵瑰簲鍘焗eader[2]
+        header2.add(createHeaderRow("2026骞�", 1, 2));        // 瀵瑰簲鍘焗eader[3]
+        header2.add(createHeaderRow("2027骞�", 1, 2));        // 瀵瑰簲鍘焗eader[4]
+        header2.add(createHeaderRow("寰呮敹鏈堟暟", 1, 2));      // 瀵瑰簲鍘焗eader[5]
+        header2.add(createHeaderRow("寰呮敹閲戦", 1, 2));      // 瀵瑰簲鍘焗eader[6]
+        header2.add(createHeaderRow("浠f敹鍖洪棿", 1, 2));      // 瀵瑰簲鍘焗eader[7]
+
+// 2. 骞翠唤寰幆锛氭寜鍘熶笅鏍囬�昏緫璁$畻椤哄簭锛岀户缁璦dd锛堝師header[8]鍙婁互鍚庯級
+        for (int i = startYear; i <= endYear; i++) {
+            // 鍘熼�昏緫锛歩ndex = 7 + (i - startYear + 1) 鈫� 棣栨寰幆i=startYear鏃讹紝index=8
+            // LinkedList鏃犻渶鍏冲績涓嬫爣锛岀洿鎺dd鍗冲彲淇濇寔椤哄簭锛堜笌鍘熸暟缁勪笅鏍囬『搴忎竴鑷达級
+            header2.add(createHeaderRow(String.valueOf(i), 3, 1));
+        }
+
+// 3. 鎵撴姌閲戦姹囨�伙細鍘熼�昏緫涓�"骞翠唤寰幆鍚�"鐨勪笅涓�涓綅缃紝缁х画add
+        header2.add(createHeaderRow("鎵撴姌閲戦姹囨��", 1, 2));
+
+// 4. 鏈�缁堟坊鍔犲埌鎶ヨ〃鍒楄〃
+        reportExcelDtos.add(header2);
+
+        LinkedList<ReportExcelDto> header3 = new LinkedList<>();
+
+        for (int i = startYear ; i <= endYear ; i++){
+            header3.add(createHeaderRow("宸叉敹鏈堟暟", 1, 1));
+            header3.add(createHeaderRow("宸叉敹鍖洪棿", 1, 1));
+            header3.add(createHeaderRow("鏈敹鍖洪棿", 1, 1));
+        }
+        reportExcelDtos.add(header3);
+
+        return reportExcelDtos;
+    }
+
+    private ReportExcelDto createHeaderRow(String text, int col, int row) {
+        ReportExcelDto reportExcelDto = new ReportExcelDto();
+        reportExcelDto.setTest(text); // 娉ㄦ剰锛氬彲鑳芥槸setText()鐨勭瑪璇�
+        reportExcelDto.setCol(col);
+        reportExcelDto.setRow(row);
+        return reportExcelDto;
+    }
+
+    public double doublequ2(double num){
+        return (int)(num * 100) / 100.0;
+    }
 }
+

--
Gitblit v1.8.0