354798ggg
2023-05-25 8e997417832cb0339303391517b10c0d964574f9
src/main/java/com/product/server/report/service/GroupReportService.java
@@ -11,6 +11,7 @@
import com.product.core.spring.context.SpringMVCContextHolder;
import com.product.server.report.config.CmnConst;
import com.product.server.report.entity.ReportColumn;
import com.product.server.report.entity.ReportEntity;
import com.product.util.BaseUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -35,32 +36,33 @@
    * @param recordDte       业务数据dte
    * @param totalName       总计名称
    * @param reportConfigMap 报表配置缓存map
    * @param tableStyle
    * @return 获取分组报表的详情
    */
   public JSONObject getReportEntity(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap, StringBuilder tableStyle) {
      StringBuilder reportHtml = new StringBuilder(4096);
   public ReportEntity getReportEntity(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap) {
//      StringBuilder reportHtml = new StringBuilder(4096);
      ReportEntity report = new ReportEntity();
      // css
//        StringBuilder cssHtml = dataListReportService.getCssHtml();
      // 分组表头区和数据区
      StringBuilder groupAndDataAreaHtml = new StringBuilder(1024);
//      StringBuilder groupAndDataAreaHtml = new StringBuilder(1024);
      List<List<ReportColumn>>[] rows = new List[2];
      Map<String, Set<String>> headAndTailTitleDataMap = Maps.newHashMap();
      int totalColCount = reportConfigMap.get(0).size();
      int dataAreaColCount = getGroupAndDataAreaHtmlAndReturnDataAreaColCount(groupAndDataAreaHtml, reportConfigMap, headAndTailTitleDataMap, recordDte, totalName);
      int dataAreaColCount = getGroupAndDataAreaAndReturnDataAreaColCount(rows, reportConfigMap, headAndTailTitleDataMap, recordDte, totalName);
      totalColCount = Math.max(totalColCount, dataAreaColCount);
      // 头部标题区
      StringBuilder headTitleHtml = null;
      List<List<ReportColumn>> headTitle = null;
      if (!reportConfigMap.get(1).isEmpty()) {
         headTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head");
         headTitle = dataListReportService.getTitle(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head");
      }
      // 底部标题区
      StringBuilder tailTitleHtml = null;
      List<List<ReportColumn>> tailTitle = null;
      if (!reportConfigMap.get(3).isEmpty()) {
         tailTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail");
         tailTitle = dataListReportService.getTitle(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail");
      }
//        reportHtml.append("\n<body>\n<table").append(tableStyle).append(">")
@@ -70,11 +72,17 @@
//                .append(tailTitleHtml == null ? "" : tailTitleHtml)
//                .append("\n</table>\n</body>");
      JSONObject resultObj = new JSONObject();
      resultObj.put(CmnConst.RETURN_ATTR_RESULT, true);
      resultObj.put(CmnConst.RETURN_ATTR_MESSAGE, "获取报表成功!");
      resultObj.put(CmnConst.RETURN_ATTR_HTML, reportHtml);
      return resultObj;
      if (rows[0] != null) {
         if (headTitle == null) {
            headTitle = new ArrayList<>();
         }
         headTitle.addAll(rows[0]);
      }
      report.setReportHeader(headTitle);
      report.setReportData(rows[1]);
      report.setReportTail(tailTitle);
      return report;
   }
   /**
@@ -244,7 +252,7 @@
    * @param totalName               总计名称
    * @return 数据区总列数
    */
   private int getGroupAndDataAreaAndReturnDataAreaColCount(List<List<ReportColumn>> groupAndDataArea, Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName) {
   private int getGroupAndDataAreaAndReturnDataAreaColCount(List<List<ReportColumn>>[] groupAndDataArea, Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName) {
      // 分组表头区字段缓存map
      Map<String, JSONObject> groupAreaFieldConfigMap = dataListReportService.groupAndDataJSONObject2Map(reportConfigMap.get(2));
      // 数据区字段缓存map
@@ -336,9 +344,9 @@
      // 数据标题list
      List<JSONObject> dataTitleList = Lists.newArrayList();
      // 获取标题html
      groupAndDataArea.addAll(getDataAreaTitle(dataTitleList, groupAreaFieldRecordObj, dataAreaFieldConfigMap, groupAreaRangeObj, dataAreaCommonStatisticsFieldNameList));
      groupAndDataArea[0] = (getDataAreaTitle(dataTitleList, groupAreaFieldRecordObj, dataAreaFieldConfigMap, groupAreaRangeObj, dataAreaCommonStatisticsFieldNameList));
      // 获取内容html
//      groupAndDataAreaHtml.append(getDataAreaDataHtml(dataTitleList, dataAreaFieldRecordObj, statisticsMap, totalName, dataAreaGroupFieldNameList, dataAreaFieldConfigMap));
      groupAndDataArea[1] = (getDataAreaData(dataTitleList, dataAreaFieldRecordObj, statisticsMap, totalName, dataAreaGroupFieldNameList, dataAreaFieldConfigMap));
      return totalColCount;
   }
@@ -723,14 +731,15 @@
         List<ReportColumn> columns = new ArrayList<>();
//         html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_TITLE).append("\">\n    ");
         for (JSONObject dataTitleObj : rowList) {
            ReportColumn column = new ReportColumn();
            rowspan = Math.max(1, dataTitleObj.getIntValue(CmnConst.ATTR_ROWSPAN));
            colspan = Math.max(1, dataTitleObj.getIntValue(CmnConst.ATTR_COLSPAN));
            value = dataTitleObj.getString(CmnConst.ATTR_SHOW_NAME);
            if (!StringUtils.isEmpty(dataTitleObj.getString(CmnConst.ATTR_FIELD_INFO))) {
               dataAreaFieldName = dataListReportService.fieldInfo2FieldName(dataTitleObj.getString(CmnConst.ATTR_FIELD_INFO));
               value = dataListReportService.dealTdWidth(dataAreaFieldConfigMap.get(dataAreaFieldName), value);
               column.setColumnWidth(dataListReportService.dealColumnWidth(dataAreaFieldConfigMap.get(dataAreaFieldName)));
//               value = dataListReportService.dealTdWidth(dataAreaFieldConfigMap.get(dataAreaFieldName), value);
            }
            ReportColumn column = new ReportColumn();
            column.setRowspan(rowspan);
            column.setColspan(colspan);
            column.setContent(value);
@@ -1046,7 +1055,7 @@
   private List<List<ReportColumn>> getDataAreaData(List<JSONObject> dataTitleList, JSONObject dataAreaFieldRecordObj, Map<JSONObject, JSONObject> statisticsMap, String totalName, List<String> dataAreaGroupFieldNameList, Map<String, JSONObject> dataAreaFieldConfigMap) {
      List<List<JSONObject>> dataAreaGroupFieldDataList = Lists.newArrayList();
      getDataAreaGroupFieldDataList(dataAreaFieldRecordObj, dataAreaGroupFieldDataList, new JSONObject(), 1, 1, dataAreaGroupFieldNameList.size(), null);
      List<List<ReportColumn>> dataRows = new ArrayList<>();
      List<JSONObject> groupTitleList = Lists.newArrayList();
      JSONObject obj;
      for (List<JSONObject> rowList : dataAreaGroupFieldDataList) {
@@ -1054,7 +1063,7 @@
         groupTitleList.add(obj);
      }
      StringBuilder html = new StringBuilder(1024);
//      StringBuilder html = new StringBuilder(1024);
      JSONObject dataAreaGroupFieldObj;
      int rowspan;
      int colspan;
@@ -1069,6 +1078,7 @@
      List<JSONObject> curRowList;
      int index;
      for (int i = 0; i < dataAreaGroupFieldDataList.size(); i++) {
         List<ReportColumn> columns = new ArrayList<>();
         index = 0;
         curRowList = dataAreaGroupFieldDataList.get(i);
         if (!curRowList.isEmpty()) {
@@ -1077,22 +1087,28 @@
               if (dataAreaGroupFieldObj.isEmpty()) {
                  continue;
               }
               if (index == 0) {
                  if ("1".equals(dataAreaGroupFieldObj.getString(CmnConst.ATTR_IS_STATISTICS_FIELD))) {
                     html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n    ");
                  } else {
                     html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_COMMON).append("\">\n    ");
                  }
               }
//               if (index == 0) {
//                  if ("1".equals(dataAreaGroupFieldObj.getString(CmnConst.ATTR_IS_STATISTICS_FIELD))) {
//                     html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n    ");
//                  } else {
//                     html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_COMMON).append("\">\n    ");
//                  }
//               }
               rowspan = Math.max(1, dataAreaGroupFieldObj.getIntValue(CmnConst.ATTR_ROWSPAN));
               colspan = Math.max(1, dataAreaGroupFieldObj.getIntValue(CmnConst.ATTR_COLSPAN));
               value = dataAreaGroupFieldObj.getString(CmnConst.ATTR_SHOW_NAME);
               html.append("<td rowspan=\"").append(rowspan).append("\" colspan=\"").append(colspan).append("\">").append(value == null ? "" : value).append("</td>");
               ReportColumn column = new ReportColumn();
               column.setRowspan(rowspan);
               column.setColspan(colspan);
               column.setContent(value);
               columns.add(column);
//               html.append("<td rowspan=\"").append(rowspan).append("\" colspan=\"").append(colspan).append("\">").append(value == null ? "" : value).append("</td>");
               index++;
            }
         } else {
            html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_COMMON).append("\">\n    ");
         }
//         else {
//            html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_COMMON).append("\">\n    ");
//         }
         groupTitleObj = groupTitleList.get(i);
         for (JSONObject dataTitleObj : dataTitleList) {
            keyObj = dataListReportService.extendJSONObject((JSONObject) groupTitleObj.clone(), dataTitleObj, Arrays.asList(CmnConst.ATTR_ROWSPAN, CmnConst.ATTR_COLSPAN, CmnConst.ATTR_SHOW_NAME, CmnConst.ATTR_IS_STATISTICS_FIELD, CmnConst.ATTR_REAL_VALUE), -1);
@@ -1122,31 +1138,43 @@
            } else {
               value = "";
            }
            html.append("<td");
//            html.append("<td");
            ReportColumn column = new ReportColumn();
            if (!StringUtils.isEmpty(value)) {
               // class
               if (!StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL))) {
                  dataListReportService.extendJSONObject(keyObj, dataAreaFieldConfigObj, Collections.singletonList(CmnConst.ATTR_URL));
                  html.append(" class=\"").append(CmnConst.CLASS_TD_CAN_TURN).append("\"");
//                  html.append(" class=\"").append(CmnConst.CLASS_TD_CAN_TURN).append("\"");
               }
               // 字段属性
               dataListReportService.getTdAttrObj(keyObj, groupTitleObj);
               dataListReportService.getTdAttrObj(keyObj, dataTitleObj);
               html.append(dataListReportService.getTdAttrByObj(keyObj));
               String attrUrL = keyObj.getString(CmnConst.ATTR_URL);
               if (!StringUtils.isEmpty(attrUrL)) {
                  column.setPenetrateProperty(attrUrL.toString());
                  column.setPenetrate(true);
               }
               for (String key : keyObj.keySet()) {
                  column.addProperty(key, keyObj.getString(key));
               }
//               html.append(dataListReportService.getTdAttrByObj(keyObj));
               // 格式
               value = dataListReportService.formatValue(dataAreaFieldConfigObj, value);
            }
            html.append(">").append(value == null ? "" : value).append("</td>");
//            html.append(">").append(value == null ? "" : value).append("</td>");
            column.setContent(value);
            columns.add(column);
         }
         html.append("\n</tr>");
//         html.append("\n</tr>");
         dataRows.add(columns);
      }
      // 总计
      if (!StringUtils.isEmpty(totalName)) {
         html.append(getTotalStatisticsHtml(statisticsMap, dataTitleList, dataAreaFieldConfigMap, dataAreaGroupFieldNameList.size(), getSubCnt(dataAreaFieldRecordObj), totalName));
         dataRows.add(getTotalStatistics(statisticsMap, dataTitleList, dataAreaFieldConfigMap, dataAreaGroupFieldNameList.size(), getSubCnt(dataAreaFieldRecordObj), totalName));
      }
      return null;
      return dataRows;
   }
   /**
@@ -1260,6 +1288,86 @@
    * @param totalName               总计名称
    * @return
    */
   private List<ReportColumn> getTotalStatistics(Map<JSONObject, JSONObject> statisticsMap, List<JSONObject> dataTitleList, Map<String, JSONObject> dataAreaFieldConfigMap, int dataAreaGroupFieldCount, int dataAreaSubCnt, String totalName) {
      List<ReportColumn> columns = new ArrayList<>();
//      StringBuilder html = new StringBuilder(256);
//      html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n    ");
//      html.append("<td colspan=\"").append(dataAreaGroupFieldCount).append("\">").append(totalName).append("</td>");
      ReportColumn column = new ReportColumn();
      columns.add(column);
      column.setColspan(dataAreaGroupFieldCount);
      column.setContent(totalName);
      JSONObject dataTitleObj;
      JSONObject keyObj;
      JSONObject dataAreaFieldConfigObj;
      String statisticsType;
      JSONObject valueObj;
      String value;
      int groupAreaSubCnt;
      for (int i = 0; i < dataTitleList.size(); i++) {
         column = new ReportColumn();
         columns.add(column);
         dataTitleObj = dataTitleList.get(i);
         keyObj = dataListReportService.extendJSONObject(null, dataTitleObj, Arrays.asList(CmnConst.ATTR_ROWSPAN, CmnConst.ATTR_COLSPAN, CmnConst.ATTR_SHOW_NAME, CmnConst.ATTR_IS_STATISTICS_FIELD, CmnConst.ATTR_REAL_VALUE), -1);
         dataAreaFieldConfigObj = dataAreaFieldConfigMap.get(dataListReportService.fieldInfo2FieldName(dataTitleObj.getString(CmnConst.ATTR_FIELD_INFO)));
         if (dataAreaFieldConfigObj != null) {
            groupAreaSubCnt = keyObj.getIntValue(CmnConst.ATTR_GROUP_AREA_SUB_CNT);
            keyObj.remove(CmnConst.ATTR_GROUP_AREA_SUB_CNT);
            statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS);
            valueObj = statisticsMap.get(keyObj);
            if (valueObj == null || valueObj.isEmpty()) {
               value = getFinalValue(keyObj, dataAreaFieldConfigObj, statisticsMap);
            } else {
               if (CmnConst.ATTR_STATISTICS_AVG.equals(statisticsType) && "1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_AVG_TYPE))) {
                  value = getTwoTypesGroupAvgStatisticsValue(dataAreaSubCnt, groupAreaSubCnt, valueObj, dataAreaFieldConfigObj, statisticsType);
               } else {
                  value = valueObj.getString(statisticsType);
               }
               valueObj.put(CmnConst.ATTR_FINAL_VALUE, value);
            }
         } else {
            value = "";
         }
//         html.append("<td");
         if (!StringUtils.isEmpty(value)) {
            // class
            if (!StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL))) {
               dataListReportService.extendJSONObject(keyObj, dataAreaFieldConfigObj, Collections.singletonList(CmnConst.ATTR_URL));
//               html.append(" class=\"").append(CmnConst.CLASS_TD_CAN_TURN).append("\"");
            }
            // 字段属性
            dataListReportService.getTdAttrObj(keyObj, dataTitleObj);
            String attrUrL = keyObj.getString(CmnConst.ATTR_URL);
            if (!StringUtils.isEmpty(attrUrL)) {
               column.setPenetrateProperty(attrUrL.toString());
               column.setPenetrate(true);
            }
            for (String key : keyObj.keySet()) {
               column.addProperty(key, keyObj.getString(key));
            }
//            html.append(dataListReportService.getTdAttrByObj(keyObj));
            // 格式
            value = dataListReportService.formatValue(dataAreaFieldConfigObj, value);
         }
         column.setContent(value);
//         html.append(">").append(value == null ? "" : value).append("</td>");
      }
//      html.append("\n</tr>");
      return columns;
   }
   /**
    * 获取总计html
    *
    * @param statisticsMap           统计map
    * @param dataTitleList           数据标题list
    * @param dataAreaFieldConfigMap  数据区字段缓存map
    * @param dataAreaGroupFieldCount 数据区分组字段个数
    * @param dataAreaSubCnt          数据区下级分组项数
    * @param totalName               总计名称
    * @return
    */
   private StringBuilder getTotalStatisticsHtml(Map<JSONObject, JSONObject> statisticsMap, List<JSONObject> dataTitleList, Map<String, JSONObject> dataAreaFieldConfigMap, int dataAreaGroupFieldCount, int dataAreaSubCnt, String totalName) {
      StringBuilder html = new StringBuilder(256);
      html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n    ");