From 0d63f52d84e393204af3ba5bce86bdfddf936be8 Mon Sep 17 00:00:00 2001 From: 1821349743@qq.com <1821349743@qq.com> Date: 星期六, 08 四月 2023 16:39:25 +0800 Subject: [PATCH] 修改报表加载返回html更改为数据 --- src/main/java/com/product/server/report/service/CommonReportService.java | 1443 ++++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 916 insertions(+), 527 deletions(-) diff --git a/src/main/java/com/product/server/report/service/CommonReportService.java b/src/main/java/com/product/server/report/service/CommonReportService.java index c9c6a7e..f239244 100644 --- a/src/main/java/com/product/server/report/service/CommonReportService.java +++ b/src/main/java/com/product/server/report/service/CommonReportService.java @@ -1,6 +1,8 @@ package com.product.server.report.service; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -11,7 +13,10 @@ import com.product.core.service.support.AbstractBaseService; 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 com.product.util.SystemParamReplace; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -26,556 +31,940 @@ */ @Component public class CommonReportService extends AbstractBaseService { - @Autowired - private DataListReportService dataListReportService; + @Autowired + private DataListReportService dataListReportService; - /** - * 鎶ヨ〃-瑙f瀽 - * - * @param recordDte 涓氬姟鏁版嵁dte - * @param totalStatisticsFlag 鏄惁鍚堣鏍囪瘑 - * @param reportConfigMap 鎶ヨ〃閰嶇疆缂撳瓨map - * @param tableStyle - * @return - */ - public JSONObject getReport(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap, StringBuilder tableStyle) { - StringBuilder reportHtml = new StringBuilder(4096); + /** + * 鎶ヨ〃-瑙f瀽 + * + * @param recordDte 涓氬姟鏁版嵁dte + * @param totalStatisticsFlag 鏄惁鍚堣鏍囪瘑 + * @param reportConfigMap 鎶ヨ〃閰嶇疆缂撳瓨map + * @param tableStyle + * @return + */ + public ReportEntity getReportEntity(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap) { + ReportEntity report = null; + Map<String, Set<String>> headAndTailTitleDataMap = Maps.newHashMap(); + // 鏁版嵁鍖� + report = getDataArea(reportConfigMap, headAndTailTitleDataMap, recordDte, totalName); - // css - StringBuilder cssHtml = dataListReportService.getCssHtml(); + int totalColCount = reportConfigMap.get(0).size(); - // 鏁版嵁鍖� - Map<String, Set<String>> headAndTailTitleDataMap = Maps.newHashMap(); - String dataAreaHtml = getDataAreaHtml(reportConfigMap, headAndTailTitleDataMap, recordDte, totalName); + // 澶撮儴鏍囬鍖� + List<List<ReportColumn>> headTitleRows = null; + if (!reportConfigMap.get(1).isEmpty()) { + headTitleRows = dataListReportService.getTitle(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head"); + } + // 搴曢儴鏍囬鍖� + List<List<ReportColumn>> tailTitleRows = null; + if (!reportConfigMap.get(3).isEmpty()) { + tailTitleRows = dataListReportService.getTitle(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail"); + } - int totalColCount = reportConfigMap.get(0).size(); - // 澶撮儴鏍囬鍖� - StringBuilder headTitleHtml = null; - if (!reportConfigMap.get(1).isEmpty()) { - headTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head"); - } + if (!CollectionUtil.isEmpty(headTitleRows)) { + List<List<ReportColumn>> reportHeader = report.getReportHeader(); + headTitleRows.addAll(reportHeader); + report.setReportHeader(headTitleRows); + } + if (!CollectionUtil.isEmpty(tailTitleRows)) { + report.setReportTail(tailTitleRows); + } - // 搴曢儴鏍囬鍖� - StringBuilder tailTitleHtml = null; - if (!reportConfigMap.get(3).isEmpty()) { - tailTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail"); - } - reportHtml.append("\n<body>\n<table class=\"report_main\"").append(tableStyle).append(">") - .append(cssHtml) - .append(headTitleHtml == null ? "" : headTitleHtml) - .append(dataAreaHtml) - .append(tailTitleHtml == null ? "" : tailTitleHtml) - .append("\n</table>\n</body>"); + return report; + } - 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; - } + /** + * 鎶ヨ〃-瑙f瀽 + * + * @param recordDte 涓氬姟鏁版嵁dte + * @param totalStatisticsFlag 鏄惁鍚堣鏍囪瘑 + * @param reportConfigMap 鎶ヨ〃閰嶇疆缂撳瓨map + * @param tableStyle + * @return + */ + public JSONObject getReport(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap, StringBuilder tableStyle) { + StringBuilder reportHtml = new StringBuilder(4096); - /** - * 鑾峰彇鎶ヨ〃鏁版嵁鍖篽tml - * - * @param reportConfigMap 鎶ヨ〃缂撳瓨map - * @param headAndTailTitleDataMap 澶撮儴銆佸熬閮ㄦ爣棰樺尯鏁版嵁瀛楁map - * @param recordDte 涓氬姟鏁版嵁闆嗗悎 - * @param totalName 鎬昏鍚嶇О锛岄潪绌�-闇�瑕佹�昏 - * @return - */ - private String getDataAreaHtml(Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName) { - // 鏁版嵁鍖哄瓧娈电紦瀛榤ap - Map<String, JSONObject> dataAreaFieldConfigMap = dataListReportService.groupAndDataJSONObject2Map(reportConfigMap.get(0)); - // 鑾峰彇鎸囧畾鏁版嵁闆嗕腑鍖呭惈鐨勬暟鎹尯瀛楁闆嗗悎 - Set<String> headAndTailFieldSet = Sets.newHashSet(); - headAndTailFieldSet.addAll(dataListReportService.getDataFields(reportConfigMap.get(1))); - headAndTailFieldSet.addAll(dataListReportService.getDataFields(reportConfigMap.get(3))); - // 缁熻map - Map<JSONObject, JSONObject> statisticsMap = Maps.newLinkedHashMap(); + // css + StringBuilder cssHtml = dataListReportService.getCssHtml(); - StringBuilder dataAreaHtml = new StringBuilder(1024); - // 鏍囬 - dataAreaHtml.append(getDataAreaTitleHtml(dataAreaFieldConfigMap)); - // 鍐呭 - dataAreaHtml.append(getDataAreaDataHtml(dataAreaFieldConfigMap, recordDte, headAndTailTitleDataMap, headAndTailFieldSet, statisticsMap, totalName)); - return dataAreaHtml.toString(); - } + // 鏁版嵁鍖� + Map<String, Set<String>> headAndTailTitleDataMap = Maps.newHashMap(); + String dataAreaHtml = getDataAreaHtml(reportConfigMap, headAndTailTitleDataMap, recordDte, totalName); - /** - * 鑾峰彇鏍囬 - * - * @param dataAreaFieldConfigMap 鏁版嵁鍖哄瓧娈电紦瀛榤ap - * @return - */ - private StringBuilder getDataAreaTitleHtml(Map<String, JSONObject> dataAreaFieldConfigMap) { - StringBuilder html = new StringBuilder(256); - html.append("<tr class=\"").append(CmnConst.CLASS_TR_DATA_TITLE).append("\">"); - dataAreaFieldConfigMap.forEach((dataAreaFieldName, dataAreaFieldConfigObj) -> { - html.append("<td>").append(dataListReportService.dealTdWidth(dataAreaFieldConfigObj, dataAreaFieldConfigObj.getString(CmnConst.ATTR_SHOW_NAME))).append("</td>"); - }); - html.append("</tr>"); - return html; - } + int totalColCount = reportConfigMap.get(0).size(); + // 澶撮儴鏍囬鍖� + StringBuilder headTitleHtml = null; + if (!reportConfigMap.get(1).isEmpty()) { + headTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head"); + } - /** - * 鑾峰彇鍐呭锛屽寘鍚粺璁� - * - * @param dataAreaFieldConfigMap 鏁版嵁鍖哄瓧娈电紦瀛榤ap - * @param recordDte 涓氬姟鏁版嵁闆嗗悎 - * @param headAndTailFieldSet 澶撮儴銆佸熬閮ㄦ爣棰樺尯瀛楁set - * @param statisticsMap 缁熻map - * @param totalName 鎬昏鍚嶇О - * @return - */ - private String getDataAreaDataHtml(Map<String, JSONObject> dataAreaFieldConfigMap, DataTableEntity recordDte, Map<String, Set<String>> headAndTailTitleDataMap, Set<String> headAndTailFieldSet, Map<JSONObject, JSONObject> statisticsMap, String totalName) { - // 鏁版嵁鍖哄垎缁勭粺璁″瓧娈靛悕绉發ist - List<String> dataAreaGroupStatisticsFieldNameList = Lists.newArrayList(); - // 鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist - List<String> dataAreaGroupFieldNameList = Lists.newArrayList(); - dataAreaFieldConfigMap.forEach((dataAreaFieldName, dataAreaFieldConfigObj) -> { - if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) { - dataAreaGroupFieldNameList.add(dataAreaFieldName); - if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_STATISTICS))) { - dataAreaGroupStatisticsFieldNameList.add(dataAreaFieldName); - } - } - }); + // 搴曢儴鏍囬鍖� + StringBuilder tailTitleHtml = null; + if (!reportConfigMap.get(3).isEmpty()) { + tailTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail"); + } - StringBuilder dataAreaDataHtml = new StringBuilder(1024); - StringBuilder curRowHtml = new StringBuilder(256); - FieldSetEntity recordFse; - FieldSetEntity preFse = null; - String dataAreaFieldName; - JSONObject dataAreaFieldConfigObj; - String value; - JSONObject keyObj; - Map<String, String> replaceMap = Maps.newHashMap(); - Map<String, String> dataAreaClosestGroupStatisticsFieldValueMap = Maps.newHashMap(); - Map<String, String> dataAreaClosestGroupFieldValueMap = Maps.newHashMap(); - String closestGroupStatisticsFieldName = null; - String closestGroupFieldName = null; - String tempFieldName; - String paramKey; - boolean combineFlag; - JSONObject dataAreaGroupFieldRecordObj = new JSONObject(); - for (int i = 0; i < recordDte.getRows(); i++) { - recordFse = recordDte.getFieldSetEntity(i); - // 鑾峰彇澶撮儴銆佸熬閮ㄦ爣棰樺尯鏁版嵁瀛楁 - dataListReportService.getHeadAndTailTitleDataMap(headAndTailTitleDataMap, headAndTailFieldSet, recordFse); + reportHtml.append("\n<body>\n<table class=\"report_main\"").append(tableStyle).append(">") + .append(cssHtml) + .append(headTitleHtml == null ? "" : headTitleHtml) + .append(dataAreaHtml) + .append(tailTitleHtml == null ? "" : tailTitleHtml) + .append("\n</table>\n</body>"); - curRowHtml.setLength(0); - String rowUuid = IdUtil.simpleUUID(); - curRowHtml.append("\n<tr rowIndex=\"" + (i + 1) + "\" id=\"" + rowUuid + "\" class=\"").append(CmnConst.CLASS_TR_DATA_COMMON).append("\">\n "); - combineFlag = true; - for (Map.Entry<String, JSONObject> entry : dataAreaFieldConfigMap.entrySet()) { - dataAreaFieldName = entry.getKey(); - dataAreaFieldConfigObj = entry.getValue(); - value = dataListReportService.getValue(dataAreaFieldConfigObj, recordFse, dataAreaFieldName); - // 鑻ユ槸鑷畾涔夊瓧娈碉紝鍒欐斁鍏ヤ笟鍔℃暟鎹褰曚腑 - if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_CUSTOM_FIELD))) { - recordFse.setValue(dataAreaFieldName, value); - } - if (dataAreaGroupFieldNameList.contains(dataAreaFieldName)) { - int curFieldIndex = dataAreaGroupFieldNameList.indexOf(dataAreaFieldName); - // 璁板綍鍒嗙粍瀛楁 - recordDataAreaGroupField(dataAreaGroupFieldRecordObj, dataAreaGroupFieldNameList, curFieldIndex, recordFse); + 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; + } - // 鍒嗙粍鍚堝瓧娈靛苟 - closestGroupFieldName = dataAreaFieldName; - if (preFse != null && combineFlag) { - if (value.equals(dataAreaClosestGroupFieldValueMap.get(closestGroupFieldName))) { - dealReplaceMapAddRowspan(replaceMap, dataAreaGroupFieldNameList.subList(0, curFieldIndex + 1), preFse, true); - continue; - } else { - combineFlag = false; - } - } - dataAreaClosestGroupFieldValueMap.put(dataAreaFieldName, value); - } - // 鍒嗙粍缁熻 - if (dataAreaGroupStatisticsFieldNameList.contains(dataAreaFieldName)) { - int minK = dataAreaGroupStatisticsFieldNameList.size(); - for (int j = 0; j < dataAreaGroupStatisticsFieldNameList.size(); j++) { - tempFieldName = dataAreaGroupStatisticsFieldNameList.get(j); - if (!StringUtils.isEmpty(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName)) && !recordFse.getString(tempFieldName).equals(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName))) { - minK = j; - break; - } - } - for (int k = dataAreaGroupStatisticsFieldNameList.size() - 1; k >= minK; k--) { - tempFieldName = dataAreaGroupStatisticsFieldNameList.get(k); - if (preFse != null && dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName) != null) { - dataAreaDataHtml.append(getDataAreaGroupStatisticsFieldStatisticsRowHtml(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName), statisticsMap, dataAreaFieldConfigMap, tempFieldName, preFse, dataAreaGroupFieldNameList, replaceMap, dataAreaGroupFieldRecordObj)); - dataAreaClosestGroupStatisticsFieldValueMap.remove(tempFieldName); - } - } - closestGroupStatisticsFieldName = dataAreaFieldName; - dataAreaClosestGroupStatisticsFieldValueMap.put(dataAreaFieldName, value); - } - // 闈炲垎缁勭粺璁″瓧娈碉紙鏅��+鑷畾涔夛級 - if (!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP)) && !StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS))) { - addStatisticsRowInfo(statisticsMap, dataAreaGroupStatisticsFieldNameList, recordFse, dataAreaFieldConfigObj, dataAreaFieldName, value); - } - // 鑷畾涔夌粺璁″瓧娈碉紙鏈寚瀹氱粺璁$被鍨嬶紝浣跨敤鍩虹瀛楁鍏紡杩涜璁$畻锛� - if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_CUSTOM_FIELD)) - && StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS)) - && !StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_FORMULA))) { - String formula = dataAreaFieldConfigObj.getString(CmnConst.ATTR_FORMULA); - List<String> formFieldList = dataListReportService.getSuitContent(formula, CmnConst.REGEXP_FORM_FIELD); - Map<String, String> formulaMap = Maps.newHashMap(); - boolean statisticsFlag = true; - JSONObject tempObj; - for (String formFieldInfo : formFieldList) { - tempObj = dataAreaFieldConfigMap.get(dataListReportService.fieldInfo2FieldName(formFieldInfo)); - if (tempObj == null || StringUtils.isEmpty(tempObj.getString(CmnConst.ATTR_STATISTICS))) { - statisticsFlag = false; - break; - } - formulaMap.put(formFieldInfo, tempObj.getString(CmnConst.ATTR_STATISTICS)); - } - if (statisticsFlag) { - addStatisticsRowInfo(statisticsMap, dataAreaGroupStatisticsFieldNameList, recordFse, dataAreaFieldConfigObj, dataAreaFieldName, value, formulaMap); - } - } - if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) { - keyObj = new JSONObject(); - for (String dataAreaGroupFieldName : dataAreaGroupFieldNameList) { - keyObj.put(dataAreaGroupFieldName, recordFse.getString(dataAreaGroupFieldName)); - if (dataAreaGroupFieldName.equals(dataAreaFieldName)) { - keyObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(dataAreaGroupFieldName)); - break; - } - } - paramKey = dataListReportService.concat(keyObj, CmnConst.ATTR_ROWSPAN); - curRowHtml.append("<td rowspan=\"").append(paramKey).append("\""); - replaceMap.put(paramKey, "1"); - } else { - curRowHtml.append("<td"); - } - // class - if (!StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL))) { - curRowHtml.append(" class=\"").append(CmnConst.CLASS_TD_CAN_TURN).append("true".equals(dataAreaFieldConfigObj.getString("~isSubReport~")) ? "\"skipSubReport=true" : "\"").append(" router=\"").append(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL)).append("\""); - } - String attrValue = recordFse.getString(dataAreaFieldName + CmnConst.PROMPT_REAL_VALUE_TAIL); - if (StringUtils.isEmpty(attrValue)) { - attrValue = recordFse.getString(dataAreaFieldName); - } - curRowHtml.append(" ").append(dataAreaFieldName).append("=\"").append(attrValue).append("\""); - curRowHtml.append(">"); - // 鏍煎紡 - value = dataListReportService.formatValue(dataAreaFieldConfigObj, value); - curRowHtml.append(value == null ? "" : value); - curRowHtml.append("</td>"); - } - curRowHtml.append("\n</tr>"); - dataAreaDataHtml.append(curRowHtml); - preFse = recordFse; - } + /** + * 鑾峰彇鎶ヨ〃鏁版嵁鍖篽tml + * + * @param reportConfigMap 鎶ヨ〃缂撳瓨map + * @param headAndTailTitleDataMap 澶撮儴銆佸熬閮ㄦ爣棰樺尯鏁版嵁瀛楁map + * @param recordDte 涓氬姟鏁版嵁闆嗗悎 + * @param totalName 鎬昏鍚嶇О锛岄潪绌�-闇�瑕佹�昏 + * @return + */ + private String getDataAreaHtml(Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName) { + // 鏁版嵁鍖哄瓧娈电紦瀛榤ap + Map<String, JSONObject> dataAreaFieldConfigMap = dataListReportService.groupAndDataJSONObject2Map(reportConfigMap.get(0)); + // 鑾峰彇鎸囧畾鏁版嵁闆嗕腑鍖呭惈鐨勬暟鎹尯瀛楁闆嗗悎 + Set<String> headAndTailFieldSet = Sets.newHashSet(); + headAndTailFieldSet.addAll(dataListReportService.getDataFields(reportConfigMap.get(1))); + headAndTailFieldSet.addAll(dataListReportService.getDataFields(reportConfigMap.get(3))); + // 缁熻map + Map<JSONObject, JSONObject> statisticsMap = Maps.newLinkedHashMap(); - // 琛ュ叏鏈熬缁熻 - if (!StringUtils.isEmpty(closestGroupStatisticsFieldName)) { - int maxK = -1; - for (int j = 0; j < dataAreaGroupStatisticsFieldNameList.size(); j++) { - tempFieldName = dataAreaGroupStatisticsFieldNameList.get(j); - if (closestGroupStatisticsFieldName.equals(tempFieldName)) { - maxK = j; - } - } - for (int k = maxK; k >= 0; k--) { - tempFieldName = dataAreaGroupStatisticsFieldNameList.get(k); - if (preFse != null) { - dataAreaDataHtml.append(getDataAreaGroupStatisticsFieldStatisticsRowHtml(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName), statisticsMap, dataAreaFieldConfigMap, tempFieldName, preFse, dataAreaGroupFieldNameList, replaceMap, dataAreaGroupFieldRecordObj)); - } - } - } + StringBuilder dataAreaHtml = new StringBuilder(1024); + // 鏍囬 + dataAreaHtml.append(getDataAreaTitleHtml(dataAreaFieldConfigMap)); + // 鍐呭 + dataAreaHtml.append(getDataAreaDataHtml(dataAreaFieldConfigMap, recordDte, headAndTailTitleDataMap, headAndTailFieldSet, statisticsMap, totalName)); + return dataAreaHtml.toString(); + } - // 鎬昏 - if (!StringUtils.isEmpty(totalName)) { - dataAreaDataHtml.append(getDataAreaTotalStatisticsHtml(statisticsMap, dataAreaFieldConfigMap, dataAreaGroupFieldNameList, preFse, dataAreaGroupFieldRecordObj, totalName)); - } + private ReportEntity getDataArea(Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName) { + // 鏁版嵁鍖哄瓧娈电紦瀛榤ap + Map<String, JSONObject> dataAreaFieldConfigMap = dataListReportService.groupAndDataJSONObject2Map(reportConfigMap.get(0)); + // 鑾峰彇鎸囧畾鏁版嵁闆嗕腑鍖呭惈鐨勬暟鎹尯瀛楁闆嗗悎 + Set<String> headAndTailFieldSet = Sets.newHashSet(); + headAndTailFieldSet.addAll(dataListReportService.getDataFields(reportConfigMap.get(1))); + headAndTailFieldSet.addAll(dataListReportService.getDataFields(reportConfigMap.get(3))); + // 缁熻map + Map<JSONObject, JSONObject> statisticsMap = Maps.newLinkedHashMap(); + List<ReportColumn> reportHeader = getReportHeader(dataAreaFieldConfigMap); + List<List<ReportColumn>> reportData = getReportData(dataAreaFieldConfigMap, recordDte, headAndTailTitleDataMap, headAndTailFieldSet, statisticsMap, totalName); + ReportEntity report = new ReportEntity(); + report.addReportHeader(reportHeader); + report.setReportData(reportData); + return report; + } - String str = dataAreaDataHtml.toString(); - for (Map.Entry<String, String> entry : replaceMap.entrySet()) { - str = str.replace(entry.getKey(), entry.getValue()); - } + private List<ReportColumn> getReportHeader(Map<String, JSONObject> dataAreaFieldConfigMap) { + if (CollectionUtil.isEmpty(dataAreaFieldConfigMap)) { + return null; + } + List<ReportColumn> reportColumnList = new ArrayList<>(); + dataAreaFieldConfigMap.forEach((k, v) -> { + ReportColumn column = new ReportColumn(); + column.setContent(v.getString(CmnConst.ATTR_SHOW_NAME)); + column.setColumnWidth(NumberUtil.isNumber(v.getString(CmnConst.ATTR_WIDTH)) ? NumberUtil.parseInt(v.getString(CmnConst.ATTR_WIDTH)) : 0); + reportColumnList.add(column); + }); + return reportColumnList; + } - return str; - } + private List<List<ReportColumn>> getReportData(Map<String, JSONObject> dataAreaFieldConfigMap, DataTableEntity recordDte, Map<String, Set<String>> headAndTailTitleDataMap, Set<String> headAndTailFieldSet, Map<JSONObject, JSONObject> statisticsMap, String totalName) { + List<List<ReportColumn>> reportData = new ArrayList<>(); + // 鏁版嵁鍖哄垎缁勭粺璁″瓧娈靛悕绉發ist + List<String> dataAreaGroupStatisticsFieldNameList = Lists.newArrayList(); + // 鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist + List<String> dataAreaGroupFieldNameList = Lists.newArrayList(); + dataAreaFieldConfigMap.forEach((dataAreaFieldName, dataAreaFieldConfigObj) -> { + if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) { + dataAreaGroupFieldNameList.add(dataAreaFieldName); + if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_STATISTICS))) { + dataAreaGroupStatisticsFieldNameList.add(dataAreaFieldName); + } + } + }); - /** - * 娣诲姞鍒嗙粍缁熻淇℃伅 - * @param statisticsMap 缁熻map - * @param dataAreaGroupStatisticsFieldNameList 鏁版嵁鍖哄垎缁勭粺璁″瓧娈靛悕绉發ist - * @param recordFse 涓氬姟鏁版嵁fse - * @param dataAreaFieldConfigObj 鏁版嵁鍖哄瓧娈祇bj - * @param dataAreaFieldName 鏁版嵁鍖哄瓧娈靛悕绉� - * @param value 鍊� - * @param formulaMap 鍏紡map锛屽瓧娈礽nfo鍜岀粺璁$被鍨嬬殑鏄犲皠 - */ - private void addStatisticsRowInfo(Map<JSONObject, JSONObject> statisticsMap, List<String> dataAreaGroupStatisticsFieldNameList, FieldSetEntity recordFse, JSONObject dataAreaFieldConfigObj, String dataAreaFieldName, String value, Map<String, String> formulaMap) { - JSONObject keyObj = new JSONObject(); - keyObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(dataAreaFieldName)); - String statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS); - if (StringUtils.isEmpty(statisticsType) && "1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_STATISTICS))) { - statisticsType = CmnConst.ATTR_STATISTICS_DEFAULT; - } - String statisticsValue; - String formula = dataAreaFieldConfigObj.getString(CmnConst.ATTR_FORMULA); - JSONObject formulaFieldKeyObj = new JSONObject(); - // 鎬昏 - JSONObject cloneKeyObj = (JSONObject) keyObj.clone(); - JSONObject valueObj = statisticsMap.computeIfAbsent(cloneKeyObj, k -> new JSONObject()); - statisticsValue = getStatisticsValue(statisticsMap, formulaMap, formulaFieldKeyObj, formula, value); - statisticsMap.put(keyObj, dataListReportService.getStatisticsValueObj(valueObj, dataAreaFieldConfigObj, statisticsValue, statisticsType, true)); - // 鍒嗙粍缁熻 - for (String dataAreaGroupStatisticsFieldName : dataAreaGroupStatisticsFieldNameList) { - keyObj.put(dataAreaGroupStatisticsFieldName, recordFse.getString(dataAreaGroupStatisticsFieldName)); - formulaFieldKeyObj.put(dataAreaGroupStatisticsFieldName, recordFse.getString(dataAreaGroupStatisticsFieldName)); - cloneKeyObj = (JSONObject) keyObj.clone(); - valueObj = statisticsMap.computeIfAbsent(cloneKeyObj, k -> new JSONObject()); - statisticsValue = getStatisticsValue(statisticsMap, formulaMap, formulaFieldKeyObj, formula, value); - statisticsMap.put(keyObj, dataListReportService.getStatisticsValueObj(valueObj, dataAreaFieldConfigObj, statisticsValue, statisticsType, true)); - } - } - private void addStatisticsRowInfo(Map<JSONObject, JSONObject> statisticsMap, List<String> dataAreaGroupStatisticsFieldNameList, FieldSetEntity recordFse, JSONObject dataAreaFieldConfigObj, String dataAreaFieldName, String value) { - addStatisticsRowInfo(statisticsMap, dataAreaGroupStatisticsFieldNameList, recordFse, dataAreaFieldConfigObj, dataAreaFieldName, value, null); - } + FieldSetEntity recordFse; + FieldSetEntity preFse = null; + String dataAreaFieldName; + JSONObject dataAreaFieldConfigObj; + String value; + JSONObject keyObj; + Map<String, String> replaceMap = Maps.newHashMap(); + Map<String, String> dataAreaClosestGroupStatisticsFieldValueMap = Maps.newHashMap(); + Map<String, String> dataAreaClosestGroupFieldValueMap = Maps.newHashMap(); + String closestGroupStatisticsFieldName = null; + String closestGroupFieldName = null; + String tempFieldName; + String paramKey; + boolean combineFlag; + JSONObject dataAreaGroupFieldRecordObj = new JSONObject(); + for (int i = 0; i < recordDte.getRows(); i++) { + recordFse = recordDte.getFieldSetEntity(i); + // 鑾峰彇澶撮儴銆佸熬閮ㄦ爣棰樺尯鏁版嵁瀛楁 + dataListReportService.getHeadAndTailTitleDataMap(headAndTailTitleDataMap, headAndTailFieldSet, recordFse); - /** - * 鑾峰彇缁熻琛岀殑鍏紡璁$畻鍊� - * @param statisticsMap 缁熻map - * @param formulaMap 鍏紡map - * @param formulaFieldKeyObj 鍏紡瀛楁keyobj - * @param formula 鍏紡 - * @param value 鍘熸湰鐨勫�� - * @return - */ - private String getStatisticsValue(Map<JSONObject, JSONObject> statisticsMap, Map<String, String> formulaMap, JSONObject formulaFieldKeyObj, String formula, String value) { - String statisticsValue = ""; - String formulaFieldValue; - if (formulaMap != null && !formulaMap.isEmpty()) { - for (Map.Entry<String, String> entry : formulaMap.entrySet()) { - formulaFieldKeyObj.put(CmnConst.ATTR_FIELD_INFO, entry.getKey()); - formulaFieldValue = statisticsMap.get(formulaFieldKeyObj).getString(entry.getValue()); - if (formulaFieldValue != null && formulaFieldValue.matches(CmnConst.REGEXP_NUMBER)) { - formulaFieldValue += "d"; - } - formula = formula.replace(entry.getKey(), StringUtils.isEmpty(formulaFieldValue) ? "" : formulaFieldValue); - } - try { - statisticsValue = BaseUtil.executeExpression(formula, Maps.newHashMap()).toString(); - } catch (Exception e) { - SpringMVCContextHolder.getSystemLogger().error(e); - statisticsValue = ""; - } - } - return StringUtils.isEmpty(statisticsValue) ? value : statisticsValue; - } + combineFlag = true; - /** - * 鑾峰彇鏁版嵁鍖哄垎缁勭粺璁″瓧娈电粺璁¤html - * - * @param waitStatisticsValue 寰呯粺璁$殑鍊� - * @param statisticsMap 缁熻map - * @param dataAreaFieldConfigMap 鏁版嵁鍖哄瓧娈电紦瀛榤ap - * @param tempFieldName 鏈鎿嶄綔鐨勫瓧娈靛悕绉� - * @param recordFse 涓氬姟鏁版嵁璁板綍 - * @param dataAreaGroupFieldNameList 鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist - * @param replaceMap 鏇挎崲map - * @param dataAreaGroupFieldRecordObj 鏁版嵁鍖哄垎缁勫瓧娈佃褰昽bj - * @return - */ - private StringBuilder getDataAreaGroupStatisticsFieldStatisticsRowHtml(String waitStatisticsValue, Map<JSONObject, JSONObject> statisticsMap, Map<String, JSONObject> dataAreaFieldConfigMap, - String tempFieldName, FieldSetEntity recordFse, List<String> dataAreaGroupFieldNameList, Map<String, String> replaceMap, JSONObject dataAreaGroupFieldRecordObj) { - StringBuilder html = new StringBuilder(); - html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n "); - String dataAreaFieldName; - JSONObject dataAreaFieldConfigObj; - boolean flag = false; - JSONObject keyObj = new JSONObject(); - String value; - String statisticsType; - int index = 0; - List<String> needAddRowspanDataAreaGroupFieldNameList = Lists.newArrayList(); - for (Map.Entry<String, JSONObject> entry : dataAreaFieldConfigMap.entrySet()) { - index++; - dataAreaFieldName = entry.getKey(); - if (!flag) { - if (dataAreaGroupFieldNameList.contains(dataAreaFieldName)) { - keyObj.put(dataAreaFieldName, recordFse.getString(dataAreaFieldName)); - if (dataAreaFieldName.equals(tempFieldName)) { - html.append("<td colspan=\"").append(dataAreaGroupFieldNameList.size() - index + 1).append("\">").append(waitStatisticsValue).append(CmnConst.STATISTICS_NAME).append("</td>"); - flag = true; - } - if (!flag) { - needAddRowspanDataAreaGroupFieldNameList.add(dataAreaFieldName); - } - } - } else { - dataAreaFieldConfigObj = entry.getValue(); - statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS); - if (!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_CUSTOM_FIELD)) && StringUtils.isEmpty(statisticsType)) { - if (!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) { - html.append("<td></td>"); - } - } else { - keyObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(dataAreaFieldName)); - if (statisticsMap.get(keyObj) == null) { - value = ""; - } else { - JSONObject valueObj = statisticsMap.get(keyObj); - if (StringUtils.isEmpty(statisticsType)) { - statisticsType = CmnConst.ATTR_STATISTICS_DEFAULT; - } - if (CmnConst.ATTR_STATISTICS_AVG.equals(statisticsType) && "1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_AVG_TYPE))) { - int subCnt = getAimSubCnt(keyObj, dataAreaGroupFieldNameList, dataAreaGroupFieldRecordObj); - valueObj.put(CmnConst.ATTR_STATISTICS_SUB_CNT, subCnt); - dataListReportService.getAvgValue(valueObj, dataAreaFieldConfigObj, false); - } - value = valueObj.getString(statisticsType); - } - // 鏍煎紡 - value = dataListReportService.formatValue(dataAreaFieldConfigObj, value); - html.append("<td>").append(value == null ? "" : value).append("</td>"); - } - } - } - html.append("\n</tr>"); - dealReplaceMapAddRowspan(replaceMap, needAddRowspanDataAreaGroupFieldNameList, recordFse, false); - return html; - } + List<ReportColumn> columns = new ArrayList<>(); + for (Map.Entry<String, JSONObject> entry : dataAreaFieldConfigMap.entrySet()) { + ReportColumn column = new ReportColumn(); + dataAreaFieldName = entry.getKey(); + dataAreaFieldConfigObj = entry.getValue(); + value = dataListReportService.getValue(dataAreaFieldConfigObj, recordFse, dataAreaFieldName); + // 鑻ユ槸鑷畾涔夊瓧娈碉紝鍒欐斁鍏ヤ笟鍔℃暟鎹褰曚腑 + if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_CUSTOM_FIELD))) { + recordFse.setValue(dataAreaFieldName, value); + } + if (dataAreaGroupFieldNameList.contains(dataAreaFieldName)) { + int curFieldIndex = dataAreaGroupFieldNameList.indexOf(dataAreaFieldName); + // 璁板綍鍒嗙粍瀛楁 + recordDataAreaGroupField(dataAreaGroupFieldRecordObj, dataAreaGroupFieldNameList, curFieldIndex, recordFse); - /** - * 鑾峰彇鎬昏html - * - * @param statisticsMap 缁熻map - * @param dataAreaFieldConfigMap 鏁版嵁鍖哄瓧娈电紦瀛榤ap - * @param dataAreaGroupFieldNameList 鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist - * @param preFse 鏈�杩戞搷浣滅殑鏁版嵁fse - * @param dataAreaGroupFieldRecordObj 鏁版嵁鍖哄垎缁勫瓧娈佃褰昽bj - * @param totalName 鎬昏鍚嶇О - * @return - */ - private String getDataAreaTotalStatisticsHtml(Map<JSONObject, JSONObject> statisticsMap, Map<String, JSONObject> dataAreaFieldConfigMap, List<String> dataAreaGroupFieldNameList, FieldSetEntity preFse, JSONObject dataAreaGroupFieldRecordObj, String totalName) { - StringBuilder html = new StringBuilder(512); - String dataAreaFieldName; - JSONObject dataAreaFieldConfigObj; - String value; - JSONObject keyObj = new JSONObject(); - String statisticsType; - html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n "); - if (preFse == null) { - return html.toString(); - } - int index = 0; - for (Map.Entry<String, JSONObject> entry : dataAreaFieldConfigMap.entrySet()) { - index++; - dataAreaFieldName = entry.getKey(); - if (!dataAreaGroupFieldNameList.contains(dataAreaFieldName)) { - dataAreaFieldConfigObj = entry.getValue(); - statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS); - keyObj.put(CmnConst.ATTR_FIELD_INFO, dataAreaFieldConfigObj.getString(CmnConst.ATTR_FIELD_INFO)); - if ((!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_CUSTOM_FIELD)) && StringUtils.isEmpty(statisticsType)) || statisticsMap.get(keyObj) == null) { - value = ""; - } else { - JSONObject valueObj = statisticsMap.get(keyObj); - if (StringUtils.isEmpty(statisticsType)) { - statisticsType = CmnConst.ATTR_STATISTICS_DEFAULT; - } - if (CmnConst.ATTR_STATISTICS_AVG.equals(statisticsType) && "1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_AVG_TYPE))) { - int subCnt = dataAreaGroupFieldRecordObj.size(); - valueObj.put(CmnConst.ATTR_STATISTICS_SUB_CNT, subCnt); - dataListReportService.getAvgValue(valueObj, dataAreaFieldConfigObj, false); - } - value = valueObj.getString(statisticsType); - } - // 鏍煎紡 - value = dataListReportService.formatValue(dataAreaFieldConfigObj, value); - html.append("<td>").append(value == null ? "" : value).append("</td>"); - } else { - if (index == 1) { - html.append("<td colspan=\"").append(dataAreaGroupFieldNameList.size()).append("\">").append(totalName).append("</td>"); - } - } - } - html.append("\n</tr>"); - return html.toString(); - } + // 鍒嗙粍鍚堝瓧娈靛苟 + closestGroupFieldName = dataAreaFieldName; + if (preFse != null && combineFlag) { + if (value.equals(dataAreaClosestGroupFieldValueMap.get(closestGroupFieldName))) { + dealReplaceMapAddRowspan(replaceMap, dataAreaGroupFieldNameList.subList(0, curFieldIndex + 1), preFse, true); + continue; + } else { + combineFlag = false; + } + } + dataAreaClosestGroupFieldValueMap.put(dataAreaFieldName, value); + } + // 鍒嗙粍缁熻 + if (dataAreaGroupStatisticsFieldNameList.contains(dataAreaFieldName)) { + int minK = dataAreaGroupStatisticsFieldNameList.size(); + for (int j = 0; j < dataAreaGroupStatisticsFieldNameList.size(); j++) { + tempFieldName = dataAreaGroupStatisticsFieldNameList.get(j); + if (!StringUtils.isEmpty(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName)) && !recordFse.getString(tempFieldName).equals(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName))) { + minK = j; + break; + } + } + for (int k = dataAreaGroupStatisticsFieldNameList.size() - 1; k >= minK; k--) { + tempFieldName = dataAreaGroupStatisticsFieldNameList.get(k); + if (preFse != null && dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName) != null) { + reportData.add(getDataAreaGroupStatisticsFieldStatisticsRow(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName), statisticsMap, dataAreaFieldConfigMap, tempFieldName, preFse, dataAreaGroupFieldNameList, replaceMap, dataAreaGroupFieldRecordObj)); + dataAreaClosestGroupStatisticsFieldValueMap.remove(tempFieldName); + } + } + closestGroupStatisticsFieldName = dataAreaFieldName; + dataAreaClosestGroupStatisticsFieldValueMap.put(dataAreaFieldName, value); + } + // 闈炲垎缁勭粺璁″瓧娈碉紙鏅��+鑷畾涔夛級 + if (!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP)) && !StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS))) { + addStatisticsRowInfo(statisticsMap, dataAreaGroupStatisticsFieldNameList, recordFse, dataAreaFieldConfigObj, dataAreaFieldName, value); + } + // 鑷畾涔夌粺璁″瓧娈碉紙鏈寚瀹氱粺璁$被鍨嬶紝浣跨敤鍩虹瀛楁鍏紡杩涜璁$畻锛� + if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_CUSTOM_FIELD)) + && StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS)) + && !StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_FORMULA))) { + String formula = dataAreaFieldConfigObj.getString(CmnConst.ATTR_FORMULA); + List<String> formFieldList = dataListReportService.getSuitContent(formula, CmnConst.REGEXP_FORM_FIELD); + Map<String, String> formulaMap = Maps.newHashMap(); + boolean statisticsFlag = true; + JSONObject tempObj; + for (String formFieldInfo : formFieldList) { + tempObj = dataAreaFieldConfigMap.get(dataListReportService.fieldInfo2FieldName(formFieldInfo)); + if (tempObj == null || StringUtils.isEmpty(tempObj.getString(CmnConst.ATTR_STATISTICS))) { + statisticsFlag = false; + break; + } + formulaMap.put(formFieldInfo, tempObj.getString(CmnConst.ATTR_STATISTICS)); + } + if (statisticsFlag) { + addStatisticsRowInfo(statisticsMap, dataAreaGroupStatisticsFieldNameList, recordFse, dataAreaFieldConfigObj, dataAreaFieldName, value, formulaMap); + } + } + if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) { + keyObj = new JSONObject(); + for (String dataAreaGroupFieldName : dataAreaGroupFieldNameList) { + keyObj.put(dataAreaGroupFieldName, recordFse.getString(dataAreaGroupFieldName)); + if (dataAreaGroupFieldName.equals(dataAreaFieldName)) { + keyObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(dataAreaGroupFieldName)); + break; + } + } + paramKey = dataListReportService.concat(keyObj, CmnConst.ATTR_ROWSPAN); + column.setRowspan(NumberUtil.parseInt(paramKey)); + replaceMap.put(paramKey, "1"); + } + // class + if (!StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL))) { + //瀛愭姤琛� + String url = dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL); + url = SystemParamReplace.replaceParams(url, recordFse); + column.setSubReport("true".equals(dataAreaFieldConfigObj.getString("~isSubReport~"))); + if (!column.isSubReport()) { + column.setPenetrate(true); + column.setPenetrateProperty(url); + } else { + column.setSubReportProperty(url); + } + } + String attrValue = recordFse.getString(dataAreaFieldName + CmnConst.PROMPT_REAL_VALUE_TAIL); + if (StringUtils.isEmpty(attrValue)) { + attrValue = recordFse.getString(dataAreaFieldName); + } + column.addProperty(dataAreaFieldName, attrValue); + // 鏍煎紡 + value = dataListReportService.formatValue(dataAreaFieldConfigObj, value); + column.setContent(value); + columns.add(column); + } + reportData.add(columns); + preFse = recordFse; + } - /** - * 澶勭悊鍙傛暟鏇挎崲map-娣诲姞鏁版嵁鍖哄垎缁勫瓧娈电殑鍗犺 - * - * @param replaceMap 鏇挎崲map - * @param needAddRowspanDataAreaGroupFieldNames 闇�瑕佹坊鍔犲崰琛岀殑鏁版嵁鍖哄垎缁勫瓧娈靛悕绉伴泦鍚� - * @param recordFse 涓氬姟鏁版嵁璁板綍 - */ - private void dealReplaceMapAddRowspan(Map<String, String> replaceMap, Collection<String> needAddRowspanDataAreaGroupFieldNames, FieldSetEntity recordFse, boolean commonFieldFlag) { - JSONObject keyObj = new JSONObject(); - String value; - int rowspan; - String paramKey; - int index = 0; - for (String fieldName : needAddRowspanDataAreaGroupFieldNames) { - index++; - keyObj.put(fieldName, recordFse.getString(fieldName)); - if (commonFieldFlag && index != needAddRowspanDataAreaGroupFieldNames.size()) { - continue; - } - keyObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(fieldName)); - paramKey = dataListReportService.concat(keyObj, CmnConst.ATTR_ROWSPAN); - value = replaceMap.get(paramKey); - rowspan = StringUtils.isEmpty(value) ? 1 : Integer.parseInt(value) + 1; - replaceMap.put(paramKey, String.valueOf(rowspan)); - } - } + // 琛ュ叏鏈熬缁熻 + if (!StringUtils.isEmpty(closestGroupStatisticsFieldName)) { + int maxK = -1; + for (int j = 0; j < dataAreaGroupStatisticsFieldNameList.size(); j++) { + tempFieldName = dataAreaGroupStatisticsFieldNameList.get(j); + if (closestGroupStatisticsFieldName.equals(tempFieldName)) { + maxK = j; + } + } + for (int k = maxK; k >= 0; k--) { + tempFieldName = dataAreaGroupStatisticsFieldNameList.get(k); + if (preFse != null) { + reportData.add(getDataAreaGroupStatisticsFieldStatisticsRow(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName), statisticsMap, dataAreaFieldConfigMap, tempFieldName, preFse, dataAreaGroupFieldNameList, replaceMap, dataAreaGroupFieldRecordObj)); + } + } + } - /** - * 璁板綍鍒嗙粍瀛楁 - * - * @param dataAreaGroupFieldRecordObj 鏁版嵁鍖哄垎缁勫瓧娈佃褰昽bj - * @param dataAreaGroupFieldNameList 鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist - * @param curFieldIndex 褰撳墠瀛楁涓嬫爣 - * @param recordFse 涓氬姟鏁版嵁璁板綍 - */ - private void recordDataAreaGroupField(JSONObject dataAreaGroupFieldRecordObj, List<String> dataAreaGroupFieldNameList, int curFieldIndex, FieldSetEntity recordFse) { - String tempFieldName; - JSONObject parentObj = dataAreaGroupFieldRecordObj; - JSONObject subObj; - String value; - for (int j = 0; j <= curFieldIndex; j++) { - tempFieldName = dataAreaGroupFieldNameList.get(j); - value = recordFse.getString(tempFieldName); - subObj = parentObj.getJSONObject(value); - if (subObj == null) { - subObj = new JSONObject(); - parentObj.put(value, subObj); - } - parentObj = subObj; - } - } + // 鎬昏 + if (!StringUtils.isEmpty(totalName)) { + reportData.add(getDataAreaTotalStatistics(statisticsMap, dataAreaFieldConfigMap, dataAreaGroupFieldNameList, preFse, dataAreaGroupFieldRecordObj, totalName)); + } + for (Map.Entry<String, String> entry : replaceMap.entrySet()) { + reportData.stream().forEach(item -> { + item.stream().forEach(column -> { + column.replace(entry.getKey(), entry.getValue()); + }); + }); + } - /** - * 鑾峰彇鎸囧畾鐨勪笅绾у垎缁勯」 - * - * @param keyObj 鎸囧畾鐨刱ey - * @param dataAreaGroupFieldNameList 鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist - * @param dataAreaGroupFieldRecordObj 鏁版嵁鍖哄垎缁勫瓧娈佃褰昽bj - * @return - */ - private int getAimSubCnt(JSONObject keyObj, List<String> dataAreaGroupFieldNameList, JSONObject dataAreaGroupFieldRecordObj) { - String value; - JSONObject parentObj = dataAreaGroupFieldRecordObj; - JSONObject subObj = null; - for (String fieldName : dataAreaGroupFieldNameList) { - value = keyObj.getString(fieldName); - if (value != null) { - subObj = parentObj.getJSONObject(value); - } else { - break; - } - parentObj = subObj; - } - return subObj == null ? 0 : subObj.size(); - } + return reportData; + } + + /** + * 鑾峰彇鎬昏琛� + * + * @param statisticsMap 缁熻map + * @param dataAreaFieldConfigMap 鏁版嵁鍖哄瓧娈电紦瀛榤ap + * @param dataAreaGroupFieldNameList 鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist + * @param preFse 鏈�杩戞搷浣滅殑鏁版嵁fse + * @param dataAreaGroupFieldRecordObj 鏁版嵁鍖哄垎缁勫瓧娈佃褰昽bj + * @param totalName 鎬昏鍚嶇О + * @return + */ + private List<ReportColumn> getDataAreaTotalStatistics(Map<JSONObject, JSONObject> statisticsMap, Map<String, JSONObject> dataAreaFieldConfigMap, List<String> dataAreaGroupFieldNameList, FieldSetEntity preFse, JSONObject dataAreaGroupFieldRecordObj, String totalName) { + List<ReportColumn> columns = new ArrayList<>(); +// StringBuilder html = new StringBuilder(512); + String dataAreaFieldName; + JSONObject dataAreaFieldConfigObj; + String value; + JSONObject keyObj = new JSONObject(); + String statisticsType; +// html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n "); + if (preFse == null) { + return null; + } + int index = 0; + for (Map.Entry<String, JSONObject> entry : dataAreaFieldConfigMap.entrySet()) { + ReportColumn column = new ReportColumn(); + index++; + dataAreaFieldName = entry.getKey(); + if (!dataAreaGroupFieldNameList.contains(dataAreaFieldName)) { + dataAreaFieldConfigObj = entry.getValue(); + statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS); + keyObj.put(CmnConst.ATTR_FIELD_INFO, dataAreaFieldConfigObj.getString(CmnConst.ATTR_FIELD_INFO)); + if ((!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_CUSTOM_FIELD)) && StringUtils.isEmpty(statisticsType)) || statisticsMap.get(keyObj) == null) { + value = ""; + } else { + JSONObject valueObj = statisticsMap.get(keyObj); + if (StringUtils.isEmpty(statisticsType)) { + statisticsType = CmnConst.ATTR_STATISTICS_DEFAULT; + } + if (CmnConst.ATTR_STATISTICS_AVG.equals(statisticsType) && "1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_AVG_TYPE))) { + int subCnt = dataAreaGroupFieldRecordObj.size(); + valueObj.put(CmnConst.ATTR_STATISTICS_SUB_CNT, subCnt); + dataListReportService.getAvgValue(valueObj, dataAreaFieldConfigObj, false); + } + value = valueObj.getString(statisticsType); + } + // 鏍煎紡 + value = dataListReportService.formatValue(dataAreaFieldConfigObj, value); + column.setContent(value); +// html.append("<td>").append(value == null ? "" : value).append("</td>"); + } else { + if (index == 1) { + column.setColspan(dataAreaGroupFieldNameList.size()); + column.setContent(totalName); +// html.append("<td colspan=\"").append(dataAreaGroupFieldNameList.size()).append("\">").append(totalName).append("</td>"); + } + } + columns.add(column); + } +// html.append("\n</tr>"); + return columns; + } + + private List<ReportColumn> getDataAreaGroupStatisticsFieldStatisticsRow(String waitStatisticsValue, Map<JSONObject, JSONObject> statisticsMap, Map<String, JSONObject> dataAreaFieldConfigMap, + String tempFieldName, FieldSetEntity recordFse, List<String> dataAreaGroupFieldNameList, Map<String, String> replaceMap, JSONObject dataAreaGroupFieldRecordObj) { + List<ReportColumn> columns = new ArrayList<>(); +// StringBuilder html = new StringBuilder(); +// html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n "); + String dataAreaFieldName; + JSONObject dataAreaFieldConfigObj; + boolean flag = false; + JSONObject keyObj = new JSONObject(); + String value; + String statisticsType; + int index = 0; + List<String> needAddRowspanDataAreaGroupFieldNameList = Lists.newArrayList(); + for (Map.Entry<String, JSONObject> entry : dataAreaFieldConfigMap.entrySet()) { + ReportColumn column = new ReportColumn(); + index++; + dataAreaFieldName = entry.getKey(); + if (!flag) { + if (dataAreaGroupFieldNameList.contains(dataAreaFieldName)) { + keyObj.put(dataAreaFieldName, recordFse.getString(dataAreaFieldName)); + if (dataAreaFieldName.equals(tempFieldName)) { + column.setColspan(dataAreaGroupFieldNameList.size() - index + 1); + column.setContent(waitStatisticsValue + CmnConst.STATISTICS_NAME); + } + if (!flag) { + needAddRowspanDataAreaGroupFieldNameList.add(dataAreaFieldName); + } + } + } else { + dataAreaFieldConfigObj = entry.getValue(); + statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS); + if (!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_CUSTOM_FIELD)) && StringUtils.isEmpty(statisticsType)) { + if (!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) { +// html.append("<td></td>"); + } + } else { + keyObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(dataAreaFieldName)); + if (statisticsMap.get(keyObj) == null) { + value = ""; + } else { + JSONObject valueObj = statisticsMap.get(keyObj); + if (StringUtils.isEmpty(statisticsType)) { + statisticsType = CmnConst.ATTR_STATISTICS_DEFAULT; + } + if (CmnConst.ATTR_STATISTICS_AVG.equals(statisticsType) && "1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_AVG_TYPE))) { + int subCnt = getAimSubCnt(keyObj, dataAreaGroupFieldNameList, dataAreaGroupFieldRecordObj); + valueObj.put(CmnConst.ATTR_STATISTICS_SUB_CNT, subCnt); + dataListReportService.getAvgValue(valueObj, dataAreaFieldConfigObj, false); + } + value = valueObj.getString(statisticsType); + } + // 鏍煎紡 + value = dataListReportService.formatValue(dataAreaFieldConfigObj, value); + column.setContent(value); +// html.append("<td>").append(value == null ? "" : value).append("</td>"); + } + } + columns.add(column); + } +// html.append("\n</tr>"); + dealReplaceMapAddRowspan(replaceMap, needAddRowspanDataAreaGroupFieldNameList, recordFse, false); + return null; + } + + + /** + * 鑾峰彇鏍囬 + * + * @param dataAreaFieldConfigMap 鏁版嵁鍖哄瓧娈电紦瀛榤ap + * @return + */ + private StringBuilder getDataAreaTitleHtml(Map<String, JSONObject> dataAreaFieldConfigMap) { + StringBuilder html = new StringBuilder(256); + html.append("<tr class=\"").append(CmnConst.CLASS_TR_DATA_TITLE).append("\">"); + dataAreaFieldConfigMap.forEach((dataAreaFieldName, dataAreaFieldConfigObj) -> { + html.append("<td>").append(dataListReportService.dealTdWidth(dataAreaFieldConfigObj, dataAreaFieldConfigObj.getString(CmnConst.ATTR_SHOW_NAME))).append("</td>"); + }); + html.append("</tr>"); + return html; + } + + /** + * 鑾峰彇鍐呭锛屽寘鍚粺璁� + * + * @param dataAreaFieldConfigMap 鏁版嵁鍖哄瓧娈电紦瀛榤ap + * @param recordDte 涓氬姟鏁版嵁闆嗗悎 + * @param headAndTailFieldSet 澶撮儴銆佸熬閮ㄦ爣棰樺尯瀛楁set + * @param statisticsMap 缁熻map + * @param totalName 鎬昏鍚嶇О + * @return + */ + private String getDataAreaDataHtml(Map<String, JSONObject> dataAreaFieldConfigMap, DataTableEntity recordDte, Map<String, Set<String>> headAndTailTitleDataMap, Set<String> headAndTailFieldSet, Map<JSONObject, JSONObject> statisticsMap, String totalName) { + // 鏁版嵁鍖哄垎缁勭粺璁″瓧娈靛悕绉發ist + List<String> dataAreaGroupStatisticsFieldNameList = Lists.newArrayList(); + // 鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist + List<String> dataAreaGroupFieldNameList = Lists.newArrayList(); + dataAreaFieldConfigMap.forEach((dataAreaFieldName, dataAreaFieldConfigObj) -> { + if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) { + dataAreaGroupFieldNameList.add(dataAreaFieldName); + if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_STATISTICS))) { + dataAreaGroupStatisticsFieldNameList.add(dataAreaFieldName); + } + } + }); + + StringBuilder dataAreaDataHtml = new StringBuilder(1024); + StringBuilder curRowHtml = new StringBuilder(256); + FieldSetEntity recordFse; + FieldSetEntity preFse = null; + String dataAreaFieldName; + JSONObject dataAreaFieldConfigObj; + String value; + JSONObject keyObj; + Map<String, String> replaceMap = Maps.newHashMap(); + Map<String, String> dataAreaClosestGroupStatisticsFieldValueMap = Maps.newHashMap(); + Map<String, String> dataAreaClosestGroupFieldValueMap = Maps.newHashMap(); + String closestGroupStatisticsFieldName = null; + String closestGroupFieldName = null; + String tempFieldName; + String paramKey; + boolean combineFlag; + JSONObject dataAreaGroupFieldRecordObj = new JSONObject(); + for (int i = 0; i < recordDte.getRows(); i++) { + recordFse = recordDte.getFieldSetEntity(i); + // 鑾峰彇澶撮儴銆佸熬閮ㄦ爣棰樺尯鏁版嵁瀛楁 + dataListReportService.getHeadAndTailTitleDataMap(headAndTailTitleDataMap, headAndTailFieldSet, recordFse); + + curRowHtml.setLength(0); + String rowUuid = IdUtil.simpleUUID(); + curRowHtml.append("\n<tr rowIndex=\"" + (i + 1) + "\" id=\"" + rowUuid + "\" class=\"").append(CmnConst.CLASS_TR_DATA_COMMON).append("\">\n "); + combineFlag = true; + for (Map.Entry<String, JSONObject> entry : dataAreaFieldConfigMap.entrySet()) { + dataAreaFieldName = entry.getKey(); + dataAreaFieldConfigObj = entry.getValue(); + value = dataListReportService.getValue(dataAreaFieldConfigObj, recordFse, dataAreaFieldName); + // 鑻ユ槸鑷畾涔夊瓧娈碉紝鍒欐斁鍏ヤ笟鍔℃暟鎹褰曚腑 + if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_CUSTOM_FIELD))) { + recordFse.setValue(dataAreaFieldName, value); + } + if (dataAreaGroupFieldNameList.contains(dataAreaFieldName)) { + int curFieldIndex = dataAreaGroupFieldNameList.indexOf(dataAreaFieldName); + // 璁板綍鍒嗙粍瀛楁 + recordDataAreaGroupField(dataAreaGroupFieldRecordObj, dataAreaGroupFieldNameList, curFieldIndex, recordFse); + + // 鍒嗙粍鍚堝瓧娈靛苟 + closestGroupFieldName = dataAreaFieldName; + if (preFse != null && combineFlag) { + if (value.equals(dataAreaClosestGroupFieldValueMap.get(closestGroupFieldName))) { + dealReplaceMapAddRowspan(replaceMap, dataAreaGroupFieldNameList.subList(0, curFieldIndex + 1), preFse, true); + continue; + } else { + combineFlag = false; + } + } + dataAreaClosestGroupFieldValueMap.put(dataAreaFieldName, value); + } + // 鍒嗙粍缁熻 + if (dataAreaGroupStatisticsFieldNameList.contains(dataAreaFieldName)) { + int minK = dataAreaGroupStatisticsFieldNameList.size(); + for (int j = 0; j < dataAreaGroupStatisticsFieldNameList.size(); j++) { + tempFieldName = dataAreaGroupStatisticsFieldNameList.get(j); + if (!StringUtils.isEmpty(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName)) && !recordFse.getString(tempFieldName).equals(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName))) { + minK = j; + break; + } + } + for (int k = dataAreaGroupStatisticsFieldNameList.size() - 1; k >= minK; k--) { + tempFieldName = dataAreaGroupStatisticsFieldNameList.get(k); + if (preFse != null && dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName) != null) { + dataAreaDataHtml.append(getDataAreaGroupStatisticsFieldStatisticsRowHtml(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName), statisticsMap, dataAreaFieldConfigMap, tempFieldName, preFse, dataAreaGroupFieldNameList, replaceMap, dataAreaGroupFieldRecordObj)); + dataAreaClosestGroupStatisticsFieldValueMap.remove(tempFieldName); + } + } + closestGroupStatisticsFieldName = dataAreaFieldName; + dataAreaClosestGroupStatisticsFieldValueMap.put(dataAreaFieldName, value); + } + // 闈炲垎缁勭粺璁″瓧娈碉紙鏅��+鑷畾涔夛級 + if (!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP)) && !StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS))) { + addStatisticsRowInfo(statisticsMap, dataAreaGroupStatisticsFieldNameList, recordFse, dataAreaFieldConfigObj, dataAreaFieldName, value); + } + // 鑷畾涔夌粺璁″瓧娈碉紙鏈寚瀹氱粺璁$被鍨嬶紝浣跨敤鍩虹瀛楁鍏紡杩涜璁$畻锛� + if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_CUSTOM_FIELD)) + && StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS)) + && !StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_FORMULA))) { + String formula = dataAreaFieldConfigObj.getString(CmnConst.ATTR_FORMULA); + List<String> formFieldList = dataListReportService.getSuitContent(formula, CmnConst.REGEXP_FORM_FIELD); + Map<String, String> formulaMap = Maps.newHashMap(); + boolean statisticsFlag = true; + JSONObject tempObj; + for (String formFieldInfo : formFieldList) { + tempObj = dataAreaFieldConfigMap.get(dataListReportService.fieldInfo2FieldName(formFieldInfo)); + if (tempObj == null || StringUtils.isEmpty(tempObj.getString(CmnConst.ATTR_STATISTICS))) { + statisticsFlag = false; + break; + } + formulaMap.put(formFieldInfo, tempObj.getString(CmnConst.ATTR_STATISTICS)); + } + if (statisticsFlag) { + addStatisticsRowInfo(statisticsMap, dataAreaGroupStatisticsFieldNameList, recordFse, dataAreaFieldConfigObj, dataAreaFieldName, value, formulaMap); + } + } + if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) { + keyObj = new JSONObject(); + for (String dataAreaGroupFieldName : dataAreaGroupFieldNameList) { + keyObj.put(dataAreaGroupFieldName, recordFse.getString(dataAreaGroupFieldName)); + if (dataAreaGroupFieldName.equals(dataAreaFieldName)) { + keyObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(dataAreaGroupFieldName)); + break; + } + } + paramKey = dataListReportService.concat(keyObj, CmnConst.ATTR_ROWSPAN); + curRowHtml.append("<td rowspan=\"").append(paramKey).append("\""); + replaceMap.put(paramKey, "1"); + } else { + curRowHtml.append("<td"); + } + // class + if (!StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL))) { + curRowHtml.append(" class=\"").append(CmnConst.CLASS_TD_CAN_TURN).append("true".equals(dataAreaFieldConfigObj.getString("~isSubReport~")) ? "\"skipSubReport=true" : "\"").append(" router=\"").append(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL)).append("\""); + } + String attrValue = recordFse.getString(dataAreaFieldName + CmnConst.PROMPT_REAL_VALUE_TAIL); + if (StringUtils.isEmpty(attrValue)) { + attrValue = recordFse.getString(dataAreaFieldName); + } + curRowHtml.append(" ").append(dataAreaFieldName).append("=\"").append(attrValue).append("\""); + curRowHtml.append(">"); + // 鏍煎紡 + value = dataListReportService.formatValue(dataAreaFieldConfigObj, value); + curRowHtml.append(value == null ? "" : value); + curRowHtml.append("</td>"); + } + curRowHtml.append("\n</tr>"); + dataAreaDataHtml.append(curRowHtml); + preFse = recordFse; + } + + // 琛ュ叏鏈熬缁熻 + if (!StringUtils.isEmpty(closestGroupStatisticsFieldName)) { + int maxK = -1; + for (int j = 0; j < dataAreaGroupStatisticsFieldNameList.size(); j++) { + tempFieldName = dataAreaGroupStatisticsFieldNameList.get(j); + if (closestGroupStatisticsFieldName.equals(tempFieldName)) { + maxK = j; + } + } + for (int k = maxK; k >= 0; k--) { + tempFieldName = dataAreaGroupStatisticsFieldNameList.get(k); + if (preFse != null) { + dataAreaDataHtml.append(getDataAreaGroupStatisticsFieldStatisticsRowHtml(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName), statisticsMap, dataAreaFieldConfigMap, tempFieldName, preFse, dataAreaGroupFieldNameList, replaceMap, dataAreaGroupFieldRecordObj)); + } + } + } + + // 鎬昏 + if (!StringUtils.isEmpty(totalName)) { + dataAreaDataHtml.append(getDataAreaTotalStatisticsHtml(statisticsMap, dataAreaFieldConfigMap, dataAreaGroupFieldNameList, preFse, dataAreaGroupFieldRecordObj, totalName)); + } + + String str = dataAreaDataHtml.toString(); + for (Map.Entry<String, String> entry : replaceMap.entrySet()) { + str = str.replace(entry.getKey(), entry.getValue()); + } + + return str; + } + + /** + * 娣诲姞鍒嗙粍缁熻淇℃伅 + * + * @param statisticsMap 缁熻map + * @param dataAreaGroupStatisticsFieldNameList 鏁版嵁鍖哄垎缁勭粺璁″瓧娈靛悕绉發ist + * @param recordFse 涓氬姟鏁版嵁fse + * @param dataAreaFieldConfigObj 鏁版嵁鍖哄瓧娈祇bj + * @param dataAreaFieldName 鏁版嵁鍖哄瓧娈靛悕绉� + * @param value 鍊� + * @param formulaMap 鍏紡map锛屽瓧娈礽nfo鍜岀粺璁$被鍨嬬殑鏄犲皠 + */ + private void addStatisticsRowInfo(Map<JSONObject, JSONObject> statisticsMap, List<String> dataAreaGroupStatisticsFieldNameList, FieldSetEntity recordFse, JSONObject dataAreaFieldConfigObj, String dataAreaFieldName, String value, Map<String, String> formulaMap) { + JSONObject keyObj = new JSONObject(); + keyObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(dataAreaFieldName)); + String statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS); + if (StringUtils.isEmpty(statisticsType) && "1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_STATISTICS))) { + statisticsType = CmnConst.ATTR_STATISTICS_DEFAULT; + } + String statisticsValue; + String formula = dataAreaFieldConfigObj.getString(CmnConst.ATTR_FORMULA); + JSONObject formulaFieldKeyObj = new JSONObject(); + // 鎬昏 + JSONObject cloneKeyObj = (JSONObject) keyObj.clone(); + JSONObject valueObj = statisticsMap.computeIfAbsent(cloneKeyObj, k -> new JSONObject()); + statisticsValue = getStatisticsValue(statisticsMap, formulaMap, formulaFieldKeyObj, formula, value); + statisticsMap.put(keyObj, dataListReportService.getStatisticsValueObj(valueObj, dataAreaFieldConfigObj, statisticsValue, statisticsType, true)); + // 鍒嗙粍缁熻 + for (String dataAreaGroupStatisticsFieldName : dataAreaGroupStatisticsFieldNameList) { + keyObj.put(dataAreaGroupStatisticsFieldName, recordFse.getString(dataAreaGroupStatisticsFieldName)); + formulaFieldKeyObj.put(dataAreaGroupStatisticsFieldName, recordFse.getString(dataAreaGroupStatisticsFieldName)); + cloneKeyObj = (JSONObject) keyObj.clone(); + valueObj = statisticsMap.computeIfAbsent(cloneKeyObj, k -> new JSONObject()); + statisticsValue = getStatisticsValue(statisticsMap, formulaMap, formulaFieldKeyObj, formula, value); + statisticsMap.put(keyObj, dataListReportService.getStatisticsValueObj(valueObj, dataAreaFieldConfigObj, statisticsValue, statisticsType, true)); + } + } + + private void addStatisticsRowInfo(Map<JSONObject, JSONObject> statisticsMap, List<String> dataAreaGroupStatisticsFieldNameList, FieldSetEntity recordFse, JSONObject dataAreaFieldConfigObj, String dataAreaFieldName, String value) { + addStatisticsRowInfo(statisticsMap, dataAreaGroupStatisticsFieldNameList, recordFse, dataAreaFieldConfigObj, dataAreaFieldName, value, null); + } + + /** + * 鑾峰彇缁熻琛岀殑鍏紡璁$畻鍊� + * + * @param statisticsMap 缁熻map + * @param formulaMap 鍏紡map + * @param formulaFieldKeyObj 鍏紡瀛楁keyobj + * @param formula 鍏紡 + * @param value 鍘熸湰鐨勫�� + * @return + */ + private String getStatisticsValue(Map<JSONObject, JSONObject> statisticsMap, Map<String, String> formulaMap, JSONObject formulaFieldKeyObj, String formula, String value) { + String statisticsValue = ""; + String formulaFieldValue; + if (formulaMap != null && !formulaMap.isEmpty()) { + for (Map.Entry<String, String> entry : formulaMap.entrySet()) { + formulaFieldKeyObj.put(CmnConst.ATTR_FIELD_INFO, entry.getKey()); + formulaFieldValue = statisticsMap.get(formulaFieldKeyObj).getString(entry.getValue()); + if (formulaFieldValue != null && formulaFieldValue.matches(CmnConst.REGEXP_NUMBER)) { + formulaFieldValue += "d"; + } + formula = formula.replace(entry.getKey(), StringUtils.isEmpty(formulaFieldValue) ? "" : formulaFieldValue); + } + try { + statisticsValue = BaseUtil.executeExpression(formula, Maps.newHashMap()).toString(); + } catch (Exception e) { + SpringMVCContextHolder.getSystemLogger().error(e); + statisticsValue = ""; + } + } + return StringUtils.isEmpty(statisticsValue) ? value : statisticsValue; + } + + /** + * 鑾峰彇鏁版嵁鍖哄垎缁勭粺璁″瓧娈电粺璁¤html + * + * @param waitStatisticsValue 寰呯粺璁$殑鍊� + * @param statisticsMap 缁熻map + * @param dataAreaFieldConfigMap 鏁版嵁鍖哄瓧娈电紦瀛榤ap + * @param tempFieldName 鏈鎿嶄綔鐨勫瓧娈靛悕绉� + * @param recordFse 涓氬姟鏁版嵁璁板綍 + * @param dataAreaGroupFieldNameList 鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist + * @param replaceMap 鏇挎崲map + * @param dataAreaGroupFieldRecordObj 鏁版嵁鍖哄垎缁勫瓧娈佃褰昽bj + * @return + */ + private StringBuilder getDataAreaGroupStatisticsFieldStatisticsRowHtml(String waitStatisticsValue, Map<JSONObject, JSONObject> statisticsMap, Map<String, JSONObject> dataAreaFieldConfigMap, + String tempFieldName, FieldSetEntity recordFse, List<String> dataAreaGroupFieldNameList, Map<String, String> replaceMap, JSONObject dataAreaGroupFieldRecordObj) { + StringBuilder html = new StringBuilder(); + html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n "); + String dataAreaFieldName; + JSONObject dataAreaFieldConfigObj; + boolean flag = false; + JSONObject keyObj = new JSONObject(); + String value; + String statisticsType; + int index = 0; + List<String> needAddRowspanDataAreaGroupFieldNameList = Lists.newArrayList(); + for (Map.Entry<String, JSONObject> entry : dataAreaFieldConfigMap.entrySet()) { + index++; + dataAreaFieldName = entry.getKey(); + if (!flag) { + if (dataAreaGroupFieldNameList.contains(dataAreaFieldName)) { + keyObj.put(dataAreaFieldName, recordFse.getString(dataAreaFieldName)); + if (dataAreaFieldName.equals(tempFieldName)) { + html.append("<td colspan=\"").append(dataAreaGroupFieldNameList.size() - index + 1).append("\">").append(waitStatisticsValue).append(CmnConst.STATISTICS_NAME).append("</td>"); + flag = true; + } + if (!flag) { + needAddRowspanDataAreaGroupFieldNameList.add(dataAreaFieldName); + } + } + } else { + dataAreaFieldConfigObj = entry.getValue(); + statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS); + if (!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_CUSTOM_FIELD)) && StringUtils.isEmpty(statisticsType)) { + if (!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) { + html.append("<td></td>"); + } + } else { + keyObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(dataAreaFieldName)); + if (statisticsMap.get(keyObj) == null) { + value = ""; + } else { + JSONObject valueObj = statisticsMap.get(keyObj); + if (StringUtils.isEmpty(statisticsType)) { + statisticsType = CmnConst.ATTR_STATISTICS_DEFAULT; + } + if (CmnConst.ATTR_STATISTICS_AVG.equals(statisticsType) && "1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_AVG_TYPE))) { + int subCnt = getAimSubCnt(keyObj, dataAreaGroupFieldNameList, dataAreaGroupFieldRecordObj); + valueObj.put(CmnConst.ATTR_STATISTICS_SUB_CNT, subCnt); + dataListReportService.getAvgValue(valueObj, dataAreaFieldConfigObj, false); + } + value = valueObj.getString(statisticsType); + } + // 鏍煎紡 + value = dataListReportService.formatValue(dataAreaFieldConfigObj, value); + html.append("<td>").append(value == null ? "" : value).append("</td>"); + } + } + } + html.append("\n</tr>"); + dealReplaceMapAddRowspan(replaceMap, needAddRowspanDataAreaGroupFieldNameList, recordFse, false); + return html; + } + + /** + * 鑾峰彇鎬昏html + * + * @param statisticsMap 缁熻map + * @param dataAreaFieldConfigMap 鏁版嵁鍖哄瓧娈电紦瀛榤ap + * @param dataAreaGroupFieldNameList 鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist + * @param preFse 鏈�杩戞搷浣滅殑鏁版嵁fse + * @param dataAreaGroupFieldRecordObj 鏁版嵁鍖哄垎缁勫瓧娈佃褰昽bj + * @param totalName 鎬昏鍚嶇О + * @return + */ + private String getDataAreaTotalStatisticsHtml(Map<JSONObject, JSONObject> statisticsMap, Map<String, JSONObject> dataAreaFieldConfigMap, List<String> dataAreaGroupFieldNameList, FieldSetEntity preFse, JSONObject dataAreaGroupFieldRecordObj, String totalName) { + StringBuilder html = new StringBuilder(512); + String dataAreaFieldName; + JSONObject dataAreaFieldConfigObj; + String value; + JSONObject keyObj = new JSONObject(); + String statisticsType; + html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n "); + if (preFse == null) { + return html.toString(); + } + int index = 0; + for (Map.Entry<String, JSONObject> entry : dataAreaFieldConfigMap.entrySet()) { + index++; + dataAreaFieldName = entry.getKey(); + if (!dataAreaGroupFieldNameList.contains(dataAreaFieldName)) { + dataAreaFieldConfigObj = entry.getValue(); + statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS); + keyObj.put(CmnConst.ATTR_FIELD_INFO, dataAreaFieldConfigObj.getString(CmnConst.ATTR_FIELD_INFO)); + if ((!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_CUSTOM_FIELD)) && StringUtils.isEmpty(statisticsType)) || statisticsMap.get(keyObj) == null) { + value = ""; + } else { + JSONObject valueObj = statisticsMap.get(keyObj); + if (StringUtils.isEmpty(statisticsType)) { + statisticsType = CmnConst.ATTR_STATISTICS_DEFAULT; + } + if (CmnConst.ATTR_STATISTICS_AVG.equals(statisticsType) && "1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_AVG_TYPE))) { + int subCnt = dataAreaGroupFieldRecordObj.size(); + valueObj.put(CmnConst.ATTR_STATISTICS_SUB_CNT, subCnt); + dataListReportService.getAvgValue(valueObj, dataAreaFieldConfigObj, false); + } + value = valueObj.getString(statisticsType); + } + // 鏍煎紡 + value = dataListReportService.formatValue(dataAreaFieldConfigObj, value); + html.append("<td>").append(value == null ? "" : value).append("</td>"); + } else { + if (index == 1) { + html.append("<td colspan=\"").append(dataAreaGroupFieldNameList.size()).append("\">").append(totalName).append("</td>"); + } + } + } + html.append("\n</tr>"); + return html.toString(); + } + + /** + * 澶勭悊鍙傛暟鏇挎崲map-娣诲姞鏁版嵁鍖哄垎缁勫瓧娈电殑鍗犺 + * + * @param replaceMap 鏇挎崲map + * @param needAddRowspanDataAreaGroupFieldNames 闇�瑕佹坊鍔犲崰琛岀殑鏁版嵁鍖哄垎缁勫瓧娈靛悕绉伴泦鍚� + * @param recordFse 涓氬姟鏁版嵁璁板綍 + */ + private void dealReplaceMapAddRowspan(Map<String, String> replaceMap, Collection<String> needAddRowspanDataAreaGroupFieldNames, FieldSetEntity recordFse, boolean commonFieldFlag) { + JSONObject keyObj = new JSONObject(); + String value; + int rowspan; + String paramKey; + int index = 0; + for (String fieldName : needAddRowspanDataAreaGroupFieldNames) { + index++; + keyObj.put(fieldName, recordFse.getString(fieldName)); + if (commonFieldFlag && index != needAddRowspanDataAreaGroupFieldNames.size()) { + continue; + } + keyObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(fieldName)); + paramKey = dataListReportService.concat(keyObj, CmnConst.ATTR_ROWSPAN); + value = replaceMap.get(paramKey); + rowspan = StringUtils.isEmpty(value) ? 1 : Integer.parseInt(value) + 1; + replaceMap.put(paramKey, String.valueOf(rowspan)); + } + } + + /** + * 璁板綍鍒嗙粍瀛楁 + * + * @param dataAreaGroupFieldRecordObj 鏁版嵁鍖哄垎缁勫瓧娈佃褰昽bj + * @param dataAreaGroupFieldNameList 鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist + * @param curFieldIndex 褰撳墠瀛楁涓嬫爣 + * @param recordFse 涓氬姟鏁版嵁璁板綍 + */ + private void recordDataAreaGroupField(JSONObject dataAreaGroupFieldRecordObj, List<String> dataAreaGroupFieldNameList, int curFieldIndex, FieldSetEntity recordFse) { + String tempFieldName; + JSONObject parentObj = dataAreaGroupFieldRecordObj; + JSONObject subObj; + String value; + for (int j = 0; j <= curFieldIndex; j++) { + tempFieldName = dataAreaGroupFieldNameList.get(j); + value = recordFse.getString(tempFieldName); + subObj = parentObj.getJSONObject(value); + if (subObj == null) { + subObj = new JSONObject(); + parentObj.put(value, subObj); + } + parentObj = subObj; + } + } + + /** + * 鑾峰彇鎸囧畾鐨勪笅绾у垎缁勯」 + * + * @param keyObj 鎸囧畾鐨刱ey + * @param dataAreaGroupFieldNameList 鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist + * @param dataAreaGroupFieldRecordObj 鏁版嵁鍖哄垎缁勫瓧娈佃褰昽bj + * @return + */ + private int getAimSubCnt(JSONObject keyObj, List<String> dataAreaGroupFieldNameList, JSONObject dataAreaGroupFieldRecordObj) { + String value; + JSONObject parentObj = dataAreaGroupFieldRecordObj; + JSONObject subObj = null; + for (String fieldName : dataAreaGroupFieldNameList) { + value = keyObj.getString(fieldName); + if (value != null) { + subObj = parentObj.getJSONObject(value); + } else { + break; + } + parentObj = subObj; + } + return subObj == null ? 0 : subObj.size(); + } } -- Gitblit v1.9.2