354798ggg
2023-05-25 8e997417832cb0339303391517b10c0d964574f9
src/main/java/com/product/server/report/service/DataListReportService.java
@@ -1,5 +1,8 @@
package com.product.server.report.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
@@ -18,6 +21,7 @@
import com.product.core.service.support.AbstractBaseService;
import com.product.core.service.support.QueryFilterService;
import com.product.core.spring.context.SpringMVCContextHolder;
import com.product.module.data.service.SystemDataExportService;
import com.product.server.report.config.CmnConst;
import com.product.server.report.config.ReportCode;
import com.product.server.report.entity.ReportColumn;
@@ -27,6 +31,9 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
@@ -34,6 +41,7 @@
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
 * Copyright © 6c
@@ -54,6 +62,107 @@
   private QueryFilterService queryFilterService;
   @Autowired
   private RouterService routerService;
   @Resource
   private SystemDataExportService exportService;
   public void outReportExcel(HttpServletResponse response, FieldSetEntity fse) throws BaseException, IOException {
      ReportEntity reportEntity = getReportEntity(fse);
      List<List<ReportColumn>> reportHeader = reportEntity.getReportHeader();
      List<List<String>> headerTemp = processingMergeData(reportHeader);
      List<List<String>> header = headerTemp.get(0).stream().map(item -> new ArrayList<String>()).collect(Collectors.toList());
      int size = headerTemp.get(0).size();
      for (int i = 0; i < size; i++) {
         for (int k = 0; k < headerTemp.size(); k++) {
            header.get(i).add(headerTemp.get(k).get(i));
         }
      }
      List<List<ReportColumn>> reportData = reportEntity.getReportData();
      if (!CollectionUtil.isEmpty(reportEntity.getReportTail())) {
         reportData.addAll(reportEntity.getReportTail());
      }
      List<List<String>> data = processingMergeData(reportData);
      exportService.writeExcel(header, data, "测试", response);
   }
   private static List<List<String>> processingMergeData(List<List<ReportColumn>> data) {
      if (CollectionUtil.isEmpty(data)) {
         return null;
      }
      List<List<String>> resultData = data.stream().map(item -> new ArrayList<String>()).collect(Collectors.toList());
      for (int i = 0; i < data.size(); i++) {
         List<ReportColumn> columns = data.get(i);
         for (ReportColumn column : columns) {
            //跨行
            int rowspan = column.getRowspan() < 1 ? 1 : column.getRowspan();
            //跨列
            int colspan = column.getColspan() < 1 ? 1 : column.getColspan();
            List<String> currentCell = new ArrayList<>();
            for (int k = 0; k < colspan; k++) {
               currentCell.add(column.getContent(true));
            }
            for (int j = 0; j < rowspan; j++) {
               resultData.get(j + i).addAll(currentCell);
            }
            System.out.println(resultData);
         }
      }
      return resultData;
   }
   public static void main(String[] args) {
      List<List<ReportColumn>> data = new ArrayList<>();
      List<ReportColumn> columns = new ArrayList<>();
      ReportColumn column = new ReportColumn();
      column.setRowspan(2);
      column.setColspan(4);
      column.setContent("跨行数:2,跨列数:4");
      columns.add(column);
      data.add(columns);
      columns = new ArrayList<>();
      data.add(columns);
      for (int i = 0; i < 3; i++) {
         column = new ReportColumn();
         column.setContent("跨行数:1,跨列数:1,下标:" + i);
         columns.add(column);
      }
      processingMergeData(data);
   }
   /**
    * @param target
    * @param content
    * @param colspan
    * @param rowspan
    * @param currentColspan
    * @param currentRowsSpan
    */
   private void rowspanAndColspan(String[][] target, String content, int colspan, int rowspan, int currentColspan, int currentRowsSpan) {
      int k = currentColspan;
      int i = currentRowsSpan;
      if (colspan > 1) {
         for (int j = 1; j < colspan; j++) {
            int index = j + k;
            while (target[i][index] != null) {
               index++;
            }
            target[i][index] = content;
         }
      }
      if (rowspan > 1) {
         for (int j = 1; j < rowspan; j++) {
            int index = i + k;
            while (target[index][k] != null) {
               index++;
            }
            target[index][k] = content;
         }
      }
   }
   /**
    * 加载所有缓存
@@ -262,6 +371,7 @@
      ReportEntity report = null;
      String reportConfigUUID = fse.getUUID();
      if (!StringUtils.isEmpty(fse.getString("~report_config_uuid~"))) {
         //子报表会传入此key作为报表的uuid 规避参数中有uuid的key
         reportConfigUUID = fse.getString("~report_config_uuid~");
      }
      DataTableEntity reportConfigDte = DataPoolCacheImpl.getInstance().getCacheData(CmnConst.CACHE_REPORT_CONFIG, new String[]{reportConfigUUID});
@@ -387,15 +497,15 @@
      if (CmnConst.REPORT_TYPE_COMMON.equals(reportType)) {
         report = commonReportService.getReportEntity(recordDte, totalName, reportConfigMap);
         //TODO
         report.setFilterInfo(outerMap);
      } else if (CmnConst.REPORT_TYPE_GROUP.equals(reportType)) {
         // 特殊处理额外查询内容
         recordDte.addFieldSetEntity(getRecordDte(sort, curPage, reportSourceFse, fse, reportConfigFse, reportConfigMap));
         report = groupReportService.getReportEntity(recordDte, totalName, reportConfigMap);
//         resultObj.putAll(groupReportService.getReport(recordDte, totalName, reportConfigMap, tableStyle));
      }
      //TODO
      report.setReportConfigUid(reportConfigFse.getUUID());
      report.setReportName(reportConfigFse.getString(CmnConst.REPORT_NAME));
//      report.setFilterInfo(outerMap);
      if (CmnConst.FALSE.equals(resultObj.getString(CmnConst.RETURN_ATTR_RESULT))) {
         resultObj.put(CmnConst.RETURN_ATTR_RESULT, true);
@@ -405,7 +515,7 @@
         SQLEntity sqlEntity = recordDte.getSqle();
         if ("1".equals(reportConfigFse.getString(CmnConst.IS_PAGE)) && sqlEntity != null) {
            report.setPage(true);
            report.setTotalPage(sqlEntity.getTotalpage());
            report.setTotalCount(sqlEntity.getTotalCount());
            report.setPageSize(StringUtils.isEmpty(reportConfigFse.getString(CmnConst.PAGE_SIZE)) ? 0 : reportConfigFse.getInteger(CmnConst.PAGE_SIZE));
            report.setPageIndex(curPage);
//            resultObj.put(CmnConst.IS_PAGE, 1);
@@ -421,7 +531,7 @@
      report.setSystemFieldMeta(getSearchInfo(reportSourceFse.getUUID()));
      report.setReportType(reportConfigFse.getString("type_uuid"));
//      resultObj.put("systemFieldMeta", );
      resultObj.put("report_type", reportConfigFse.getString("type_uuid"));
//      resultObj.put("report_type", reportConfigFse.getString("type_uuid"));
//        System.out.println(resultObj.getString("html"));
      return report;
@@ -628,7 +738,9 @@
    * @param reportConfigFse
    * @return
    */
   private DataTableEntity getRecordDte(StringBuilder sort, int curPage, FieldSetEntity reportSourceFse, FieldSetEntity fse, FieldSetEntity reportConfigFse, Map<Integer, List<JSONObject>> reportConfigMap) {
   private DataTableEntity getRecordDte(StringBuilder sort, int curPage, FieldSetEntity
         reportSourceFse, FieldSetEntity fse, FieldSetEntity
                                     reportConfigFse, Map<Integer, List<JSONObject>> reportConfigMap) {
      boolean spTimeFlag = reportConfigMap != null;
      String sql;
      String sqlText = reportSourceFse.getString(CmnConst.SQL_TEXT);
@@ -766,7 +878,8 @@
    * @param sort
    * @return
    */
   private String replaceSqlContent(String sqlText, FieldSetEntity fse, StringBuilder sort, FieldSetEntity reportConfigFse, int curPage, String selectedFields, Map<String, List<String>> queryFilterMap) {
   private String replaceSqlContent(String sqlText, FieldSetEntity fse, StringBuilder sort, FieldSetEntity
         reportConfigFse, int curPage, String selectedFields, Map<String, List<String>> queryFilterMap) {
      queryFilterMap = queryFilterMap == null ? queryFilterService.getQueryFilterMore(fse) : queryFilterMap;
      selectedFields = StringUtils.isEmpty(selectedFields) ? "*" : selectedFields;
      // 替换sql中的系统参数
@@ -841,7 +954,8 @@
      return sql.toString();
   }
   private String replaceSqlContent(String sqlText, FieldSetEntity fse, StringBuilder sort, FieldSetEntity reportConfigFse, int curPage) {
   private String replaceSqlContent(String sqlText, FieldSetEntity fse, StringBuilder sort, FieldSetEntity
         reportConfigFse, int curPage) {
      return replaceSqlContent(sqlText, fse, sort, reportConfigFse, curPage, null, null);
   }
@@ -854,7 +968,8 @@
    * @param queryFilterMap
    * @return
    */
   private String spReplaceSqlContent(String suitContent, String regexp, int num, Map<String, List<String>> queryFilterMap, Map<String, List<String>> residueQueryFilterMap) {
   private String spReplaceSqlContent(String suitContent, String regexp, int num, Map<
         String, List<String>> queryFilterMap, Map<String, List<String>> residueQueryFilterMap) {
      List<String> innerSuitList = getSuitContent(suitContent, regexp);
      String curField;
      String filter;
@@ -933,7 +1048,9 @@
    * @param queryFilterMap
    * @param curFieldName
    */
   private void spDealFilterForLastYear(Map<String, List<String>> tempQueryFilterMap, Map<String, List<String>> queryFilterMap, String curFieldName) {
   private void spDealFilterForLastYear
   (Map<String, List<String>> tempQueryFilterMap, Map<String, List<String>> queryFilterMap, String
         curFieldName) {
      List<String> paramList = tempQueryFilterMap.get(curFieldName);
      for (int i = 0; i < paramList.size(); i++) {
         paramList.set(i, paramList.get(i).replace("str_to_date(", "date_add(str_to_date(")
@@ -954,7 +1071,9 @@
    * @param queryFilterMap
    * @param curFieldName
    */
   private void spDealFilterForPrePeriod(Map<String, List<String>> tempQueryFilterMap, Map<String, List<String>> queryFilterMap, String curFieldName) {
   private void spDealFilterForPrePeriod
   (Map<String, List<String>> tempQueryFilterMap, Map<String, List<String>> queryFilterMap, String
         curFieldName) {
      List<String> paramList = tempQueryFilterMap.get(curFieldName);
      String[] timeArr = paramList.get(0).split("~");
      try {
@@ -987,7 +1106,8 @@
    * @param dataList
    * @return
    */
   private Set<String> getFieldAndSpTimeStatisticsTypeSet(Set<String> baseFieldSet, Map<String, Map<String, JSONObject>> spTimeStatisticsFieldMap, List<JSONObject> dataList) {
   private Set<String> getFieldAndSpTimeStatisticsTypeSet
   (Set<String> baseFieldSet, Map<String, Map<String, JSONObject>> spTimeStatisticsFieldMap, List<JSONObject> dataList) {
      Set<String> spTimeStatisticsTypeSet = Sets.newHashSet();
      JSONObject curFieldObj;
      String fieldName;
@@ -1133,7 +1253,8 @@
    * @param locationType            位置类型,head-头部,tail-尾部
    * @return
    */
   public StringBuilder getTitleHtml(List<JSONObject> list, int totalColCount, Map<String, Set<String>> headAndTailTitleDataMap, String locationType) {
   public StringBuilder getTitleHtml(List<JSONObject> list, int totalColCount, Map<
         String, Set<String>> headAndTailTitleDataMap, String locationType) {
      StringBuilder html = new StringBuilder(1024);
      int colspan;
      int preRow = 0;
@@ -1201,16 +1322,17 @@
    * @param locationType            位置类型,head-头部,tail-尾部
    * @return
    */
   public List<List<ReportColumn>> getTitle(List<JSONObject> list, int totalColCount, Map<String, Set<String>> headAndTailTitleDataMap, String locationType) {
   public List<List<ReportColumn>> getTitle(List<JSONObject> list, int totalColCount, Map<
         String, Set<String>> headAndTailTitleDataMap, String locationType) {
      List<List<ReportColumn>> row = new ArrayList<>();
      StringBuilder html = new StringBuilder(1024);
//      StringBuilder html = new StringBuilder(1024);
      int colspan;
      int preRow = 0;
      int preCol = 0;
      int curRow;
      int curCol;
      String value;
      String style;
//      String style;
      List<ReportColumn> reportColumns = new ArrayList<>();
      for (JSONObject singleObj : list) {
@@ -1220,22 +1342,26 @@
         colspan = colspan < 0 ? totalColCount : Math.max(1, colspan);
         value = replaceFormDataAndSysData(singleObj.getString(CmnConst.ATTR_SHOW_NAME), headAndTailTitleDataMap, singleObj);
         value = value == null ? "" : value;
         if ("1".equals(singleObj.getString(CmnConst.ATTR_IS_TITLE))) {
            style = " class=\"" + CmnConst.CLASS_TR_REPORT_TITLE + "\"";
         } else {
            if ("head".equals(locationType)) {
               style = " class=\"" + CmnConst.CLASS_TR_HEAD + "\"";
            } else {
               style = " class=\"" + CmnConst.CLASS_TR_TAIL + "\"";
            }
         }
//         if ("1".equals(singleObj.getString(CmnConst.ATTR_IS_TITLE))) {
//            style = " class=\"" + CmnConst.CLASS_TR_REPORT_TITLE + "\"";
//         } else {
//            if ("head".equals(locationType)) {
//               style = " class=\"" + CmnConst.CLASS_TR_HEAD + "\"";
//            } else {
//               style = " class=\"" + CmnConst.CLASS_TR_TAIL + "\"";
//            }
//         }
         if (preRow < curRow) {
            if (preRow != 0) {
               row.add(getAimNumTdPlaceholderColumn(totalColCount - preCol, 1));
            if(!reportColumns.isEmpty()){
               row.add(reportColumns);
               reportColumns=new ArrayList<>();
            }
            if (preRow == 0 && preCol == 0 && preCol < curCol - 1) {
               row.add(getAimNumTdPlaceholderColumn(curCol - preCol - 1, 1));
            }
//            if (preRow != 0) {
//               row.add(getAimNumTdPlaceholderColumn(totalColCount - preCol, 1));
//            }
//            if (preRow == 0 && preCol == 0 && preCol < curCol - 1) {
//               row.add(getAimNumTdPlaceholderColumn(curCol - preCol - 1, 1));
//            }
            preCol = curCol;
         }
         if (preCol < curCol - 1) {
@@ -1255,7 +1381,7 @@
         }
      }
      row.add(reportColumns);
      reportColumns.addAll(getAimNumTdPlaceholderColumn(totalColCount - preCol, 1));
//      reportColumns.addAll(getAimNumTdPlaceholderColumn(totalColCount - preCol, 1));
//      row.add();
      return row;
   }
@@ -1295,7 +1421,8 @@
    * @param lastStageFlag          是否末级(数据区分组字段末级和分组表头区字段都是末级才为末级)
    * @return
    */
   public JSONObject getStatisticsValueObj(JSONObject valueJsonObject, JSONObject dataAreaFieldConfigObj, String actualValue, String type, boolean lastStageFlag) {
   public JSONObject getStatisticsValueObj(JSONObject valueJsonObject, JSONObject dataAreaFieldConfigObj, String
         actualValue, String type, boolean lastStageFlag) {
      if (valueJsonObject == null) {
         valueJsonObject = new JSONObject();
      }
@@ -1356,7 +1483,8 @@
    * @param set
    * @param recordFse
    */
   public void getHeadAndTailTitleDataMap(Map<String, Set<String>> headAndTailTitleDataMap, Set<String> set, FieldSetEntity recordFse) {
   public void getHeadAndTailTitleDataMap
   (Map<String, Set<String>> headAndTailTitleDataMap, Set<String> set, FieldSetEntity recordFse) {
      for (String fieldName : set) {
         headAndTailTitleDataMap.computeIfAbsent(fieldName, k -> Sets.newLinkedHashSet()).add(recordFse.getString(fieldName));
      }
@@ -1498,6 +1626,10 @@
      return dealedValueSb.toString();
   }
   public int dealColumnWidth(JSONObject dataAreaFieldConfigObj) {
      return NumberUtil.isNumber(dataAreaFieldConfigObj.getString(CmnConst.ATTR_WIDTH)) ? NumberUtil.parseInt(dataAreaFieldConfigObj.getString(CmnConst.ATTR_WIDTH)) : 0;
   }
   /**
    * 获取td的属性
    *
@@ -1577,7 +1709,8 @@
    * @param singleObj
    * @return
    */
   public String replaceFormDataAndSysData(String str, Map<String, Set<String>> headAndTailTitleDataMap, JSONObject singleObj) {
   public String replaceFormDataAndSysData(String
                                       str, Map<String, Set<String>> headAndTailTitleDataMap, JSONObject singleObj) {
      if (StringUtils.isEmpty(str)) {
         return "";
      }
@@ -1825,7 +1958,8 @@
    * @param type      类型:1-获取目标属性,其他-排除目标属性
    * @return
    */
   public JSONObject extendJSONObject(JSONObject aimObj, JSONObject sourceObj, Collection<String> aimAttr, int type) {
   public JSONObject extendJSONObject(JSONObject aimObj, JSONObject sourceObj, Collection<String> aimAttr,
                              int type) {
      if (aimObj == null) {
         aimObj = new JSONObject();
      }