From cb4df5a1c9cda76e828fa202990df33be0735105 Mon Sep 17 00:00:00 2001
From: 许鹏程 <1821349743@qq.com>
Date: 星期四, 29 六月 2023 09:32:34 +0800
Subject: [PATCH] poi、easyexcel、poi-tl升级 ,合并空调中的报表、数据源模块

---
 src/main/java/com/product/server/report/service/GroupReportService.java |  572 +++++++--------------------------------------------------
 1 files changed, 70 insertions(+), 502 deletions(-)

diff --git a/src/main/java/com/product/server/report/service/GroupReportService.java b/src/main/java/com/product/server/report/service/GroupReportService.java
index 6caf017..df67eb8 100644
--- a/src/main/java/com/product/server/report/service/GroupReportService.java
+++ b/src/main/java/com/product/server/report/service/GroupReportService.java
@@ -1,5 +1,6 @@
 package com.product.server.report.service;
 
+import cn.hutool.core.util.NumberUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -11,8 +12,11 @@
 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.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -38,112 +42,54 @@
 	 * @param reportConfigMap 鎶ヨ〃閰嶇疆缂撳瓨map
 	 * @return 鑾峰彇鍒嗙粍鎶ヨ〃鐨勮鎯�
 	 */
-	public ReportEntity getReportEntity(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap) {
+	public List<List<ReportColumn>>[] getReport(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap) {
 //		StringBuilder reportHtml = new StringBuilder(4096);
-		ReportEntity report = new ReportEntity();
+		List<List<ReportColumn>>[] reportColumnList = new List[]{new ArrayList(), new ArrayList(), new ArrayList()};
 		// css
-//        StringBuilder cssHtml = dataListReportService.getCssHtml();
+//		StringBuilder cssHtml = dataListReportService.getCssHtml();
 
 		// 鍒嗙粍琛ㄥご鍖哄拰鏁版嵁鍖�
 //		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 = getGroupAndDataAreaAndReturnDataAreaColCount(rows, reportConfigMap, headAndTailTitleDataMap, recordDte, totalName);
+		//鏁版嵁鍖哄煙鏁版嵁
+		List<List<ReportColumn>> dataAreaList = new ArrayList<>();
+		int[] number = getGroupAndDataAreaHtmlAndReturnDataAreaColCount(dataAreaList, reportConfigMap, headAndTailTitleDataMap, recordDte, totalName);
+		int dataAreaColCount = number[0];
+		//鏍囬琛屾暟
+		int titleAreaRow = number[1];
 		totalColCount = Math.max(totalColCount, dataAreaColCount);
-
+		reportColumnList[1] = dataAreaList;
 		// 澶撮儴鏍囬鍖�
-
-		List<List<ReportColumn>> headTitle = null;
 		if (!reportConfigMap.get(1).isEmpty()) {
-			headTitle = dataListReportService.getTitle(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head");
+			reportColumnList[0] = dataListReportService.getTitleRows(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head");
 		}
-
-		// 搴曢儴鏍囬鍖�
-		List<List<ReportColumn>> tailTitle = null;
-		if (!reportConfigMap.get(3).isEmpty()) {
-			tailTitle = dataListReportService.getTitle(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail");
-		}
-
-//        reportHtml.append("\n<body>\n<table").append(tableStyle).append(">")
-//                .append(cssHtml)
-//                .append(headTitleHtml == null ? "" : headTitleHtml)
-//                .append(groupAndDataAreaHtml)
-//                .append(tailTitleHtml == null ? "" : tailTitleHtml)
-//                .append("\n</table>\n</body>");
-
-		if (rows[0] != null) {
-			if (headTitle == null) {
-				headTitle = new ArrayList<>();
+		//浠庢暟鎹尯鍩熷彇鍑烘爣棰樿鏀惧叆澶撮儴鏍囬鍖哄苟灏嗘爣棰樿浠庢暟鎹尯鍩熷垹闄�
+		if (titleAreaRow > 0) {
+			for (int i = 0; i < titleAreaRow; i++) {
+				reportColumnList[0].add(dataAreaList.get(0));
+				dataAreaList.remove(0);
 			}
-			headTitle.addAll(rows[0]);
 		}
-		report.setReportHeader(headTitle);
-
-		report.setReportData(rows[1]);
-		report.setReportTail(tailTitle);
-		return report;
-	}
-
-	/**
-	 * 鎶ヨ〃-瑙f瀽
-	 *
-	 * @param recordDte       涓氬姟鏁版嵁dte
-	 * @param totalName       鎬昏鍚嶇О
-	 * @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);
-
-		// css
-		StringBuilder cssHtml = dataListReportService.getCssHtml();
-
-		// 鍒嗙粍琛ㄥご鍖哄拰鏁版嵁鍖�
-		StringBuilder groupAndDataAreaHtml = new StringBuilder(1024);
-		Map<String, Set<String>> headAndTailTitleDataMap = Maps.newHashMap();
-		int totalColCount = reportConfigMap.get(0).size();
-		int dataAreaColCount = getGroupAndDataAreaHtmlAndReturnDataAreaColCount(groupAndDataAreaHtml, reportConfigMap, headAndTailTitleDataMap, recordDte, totalName);
-		totalColCount = Math.max(totalColCount, dataAreaColCount);
-
-		// 澶撮儴鏍囬鍖�
-		StringBuilder headTitleHtml = null;
-		if (!reportConfigMap.get(1).isEmpty()) {
-			headTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head");
-		}
-
 		// 搴曢儴鏍囬鍖�
-		StringBuilder tailTitleHtml = null;
 		if (!reportConfigMap.get(3).isEmpty()) {
-			tailTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail");
+			reportColumnList[2] = dataListReportService.getTitleRows(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail");
 		}
 
-		reportHtml.append("\n<body>\n<table").append(tableStyle).append(">")
-				.append(cssHtml)
-				.append(headTitleHtml == null ? "" : headTitleHtml)
-				.append(groupAndDataAreaHtml)
-				.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;
+		return reportColumnList;
 	}
 
 	/**
 	 * 鎶ヨ〃-瑙f瀽-鏀惧叆鍒嗙粍琛ㄥご鍖哄拰鏁版嵁Html锛岃繑鍥炲垪鏁�
 	 *
-	 * @param groupAndDataAreaHtml    html瀹瑰櫒
+	 * @param dataAreaList            鏁版嵁鍖哄煙鏁版嵁
 	 * @param reportConfigMap         鎶ヨ〃缂撳瓨鏁版嵁map
 	 * @param headAndTailTitleDataMap 澶撮儴銆佸熬閮ㄦ爣棰樺尯鏁版嵁瀛楁map瀹瑰櫒
 	 * @param recordDte               鏁版嵁婧愰泦鍚�
 	 * @param totalName               鎬昏鍚嶇О
 	 * @return 鏁版嵁鍖烘�诲垪鏁�
 	 */
-	private int getGroupAndDataAreaHtmlAndReturnDataAreaColCount(StringBuilder groupAndDataAreaHtml, Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName) {
+	private int[] getGroupAndDataAreaHtmlAndReturnDataAreaColCount(List<List<ReportColumn>> dataAreaList, Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName) {
 		// 鍒嗙粍琛ㄥご鍖哄瓧娈电紦瀛榤ap
 		Map<String, JSONObject> groupAreaFieldConfigMap = dataListReportService.groupAndDataJSONObject2Map(reportConfigMap.get(2));
 		// 鏁版嵁鍖哄瓧娈电紦瀛榤ap
@@ -235,120 +181,13 @@
 		// 鏁版嵁鏍囬list
 		List<JSONObject> dataTitleList = Lists.newArrayList();
 		// 鑾峰彇鏍囬html
-		groupAndDataAreaHtml.append(getDataAreaTitleHtml(dataTitleList, groupAreaFieldRecordObj, dataAreaFieldConfigMap, groupAreaRangeObj, dataAreaCommonStatisticsFieldNameList));
+		List<List<ReportColumn>> dataAreaTitleRows = getDataAreaTitleRows(dataTitleList, groupAreaFieldRecordObj, dataAreaFieldConfigMap, groupAreaRangeObj, dataAreaCommonStatisticsFieldNameList);
+		dataAreaList.addAll(dataAreaTitleRows);
 		// 鑾峰彇鍐呭html
-		groupAndDataAreaHtml.append(getDataAreaDataHtml(dataTitleList, dataAreaFieldRecordObj, statisticsMap, totalName, dataAreaGroupFieldNameList, dataAreaFieldConfigMap));
+		List<List<ReportColumn>> dataAreaDataRows = getDataAreaDataRows(dataTitleList, dataAreaFieldRecordObj, statisticsMap, totalName, dataAreaGroupFieldNameList, dataAreaFieldConfigMap);
+		dataAreaList.addAll(dataAreaDataRows);
 
-		return totalColCount;
-	}
-
-	/**
-	 * 鎶ヨ〃-瑙f瀽-鏀惧叆鍒嗙粍琛ㄥご鍖哄拰鏁版嵁锛岃繑鍥炲垪鏁�
-	 *
-	 * @param groupAndDataArea        瀹瑰櫒
-	 * @param reportConfigMap         鎶ヨ〃缂撳瓨鏁版嵁map
-	 * @param headAndTailTitleDataMap 澶撮儴銆佸熬閮ㄦ爣棰樺尯鏁版嵁瀛楁map瀹瑰櫒
-	 * @param recordDte               鏁版嵁婧愰泦鍚�
-	 * @param totalName               鎬昏鍚嶇О
-	 * @return 鏁版嵁鍖烘�诲垪鏁�
-	 */
-	private int getGroupAndDataAreaAndReturnDataAreaColCount(List<List<ReportColumn>>[] groupAndDataArea, Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName) {
-		// 鍒嗙粍琛ㄥご鍖哄瓧娈电紦瀛榤ap
-		Map<String, JSONObject> groupAreaFieldConfigMap = dataListReportService.groupAndDataJSONObject2Map(reportConfigMap.get(2));
-		// 鏁版嵁鍖哄瓧娈电紦瀛榤ap
-		Map<String, JSONObject> dataAreaFieldConfigMap = dataListReportService.groupAndDataJSONObject2Map(reportConfigMap.get(0));
-
-		// 鍒嗙粍琛ㄥご鍖哄垎缁勭粺璁″瓧娈靛悕绉發ist
-		List<String> groupAreaGroupStatisticsFieldNameList = Lists.newArrayList();
-		// 鍒嗙粍琛ㄥご鍖哄垎缁勫瓧娈靛悕绉發ist
-		List<String> groupAreaGroupFieldNameList = Lists.newArrayList();
-		// 鍒嗙粍琛ㄥご鍖哄尯鍩熻寖鍥磑bj
-		JSONObject groupAreaRangeObj = new JSONObject();
-		groupAreaFieldConfigMap.forEach((fieldName, fieldConfigObj) -> {
-			groupAreaGroupFieldNameList.add(fieldName);
-			if ("1".equals(fieldConfigObj.getString(CmnConst.ATTR_IS_STATISTICS))) {
-				groupAreaGroupStatisticsFieldNameList.add(fieldName);
-			}
-			if (groupAreaRangeObj.getIntValue(CmnConst.MIN_X) == 0) {
-				groupAreaRangeObj.put(CmnConst.MIN_X, fieldConfigObj.getIntValue(CmnConst.ATTR_X));
-			} else {
-				groupAreaRangeObj.put(CmnConst.MIN_X, Math.min(groupAreaRangeObj.getIntValue(CmnConst.MIN_X), fieldConfigObj.getIntValue(CmnConst.ATTR_X)));
-			}
-			groupAreaRangeObj.put(CmnConst.MAX_X, Math.max(groupAreaRangeObj.getIntValue(CmnConst.MAX_X), fieldConfigObj.getIntValue(CmnConst.ATTR_X) + Math.max(1, fieldConfigObj.getIntValue(CmnConst.ATTR_COLSPAN)) - 1));
-			groupAreaRangeObj.put(CmnConst.MAX_Y, Math.max(groupAreaRangeObj.getIntValue(CmnConst.MAX_Y), fieldConfigObj.getIntValue(CmnConst.ATTR_Y) + Math.max(1, fieldConfigObj.getIntValue(CmnConst.ATTR_ROWSPAN)) - 1));
-		});
-
-		// 鏁版嵁鍖哄垎缁勭粺璁″瓧娈靛悕绉發ist
-		List<String> dataAreaGroupStatisticsFieldNameList = Lists.newArrayList();
-		// 鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist
-		List<String> dataAreaGroupFieldNameList = Lists.newArrayList();
-		// 鏁版嵁鍖虹壒娈婄粺璁″瓧娈靛悕绉發ist-鍒嗙粍琛ㄥご鍖轰笅缁熻瀛楁
-		List<String> dataAreaSpStatisticsFieldNameList = Lists.newArrayList();
-		// 鏁版嵁鍖烘櫘閫氱粺璁″瓧娈靛悕绉發ist-闈炴暟鎹尯鍒嗙粍瀛楁锛岄潪鍒嗙粍琛ㄥご鍖轰笅缁熻瀛楁
-		List<String> dataAreaCommonStatisticsFieldNameList = Lists.newArrayList();
-		dataAreaFieldConfigMap.forEach((fieldName, fieldConfigObj) -> {
-			if ("1".equals(fieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) {
-				dataAreaGroupFieldNameList.add(fieldName);
-				if ("1".equals(fieldConfigObj.getString(CmnConst.ATTR_IS_STATISTICS))) {
-					dataAreaGroupStatisticsFieldNameList.add(fieldName);
-				}
-			} else {
-				if (fieldConfigObj.getIntValue(CmnConst.ATTR_X) < groupAreaRangeObj.getIntValue(CmnConst.MIN_X) || fieldConfigObj.getIntValue(CmnConst.ATTR_X) > groupAreaRangeObj.getIntValue(CmnConst.MAX_X)) {
-					dataAreaCommonStatisticsFieldNameList.add(fieldName);
-				} else {
-					dataAreaSpStatisticsFieldNameList.add(fieldName);
-				}
-			}
-		});
-
-		// 鑾峰彇鍒嗙粍琛ㄥご缁熻瀛楁瀵瑰簲鐨勬暟鎹尯瀛楁map
-		Map<String, List<String>> groupAreaStatisticsField2DataAreaFieldMap = getGroupAreaStatisticsField2DataAreaFieldMap(groupAreaFieldConfigMap, dataAreaFieldConfigMap);
-		// 鑾峰彇鍒嗙粍琛ㄥご鍖烘湯琛屽垎缁勫瓧娈靛搴旀暟鎹尯瀛楁map
-		Map<String, List<String>> groupAreaLastStageField2DataAreaFieldMap = getGroupAreaLastStageField2DataAreaFieldMap(groupAreaFieldConfigMap, dataAreaFieldConfigMap, groupAreaRangeObj);
-
-		// 鑾峰彇鎸囧畾鏁版嵁闆嗕腑鍖呭惈鐨勬暟鎹尯瀛楁闆嗗悎
-		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();
-		// 鍒嗙粍琛ㄥご鍖烘暟鎹畂bj
-		JSONObject groupAreaFieldRecordObj = new JSONObject(Maps.newTreeMap((o1, o2) -> dataListReportService.compare(o1, o2)));
-		// 鏁版嵁鍖哄垎缁勫瓧娈祇bj
-		JSONObject dataAreaFieldRecordObj = new JSONObject(Maps.newLinkedHashMap());
-
-		FieldSetEntity recordFse;
-		for (int i = 0; i < recordDte.getRows(); i++) {
-			recordFse = recordDte.getFieldSetEntity(i);
-
-			// 鑾峰彇澶撮儴銆佸熬閮ㄦ爣棰樺尯鏁版嵁瀛楁
-			dataListReportService.getHeadAndTailTitleDataMap(headAndTailTitleDataMap, headAndTailFieldSet, recordFse);
-
-			// 鑾峰彇鍒嗙粍琛ㄥご鍖烘暟鎹畂bj
-			getGroupAreaFieldRecordObj(groupAreaFieldRecordObj, groupAreaFieldConfigMap, recordFse, groupAreaStatisticsField2DataAreaFieldMap, groupAreaLastStageField2DataAreaFieldMap);
-
-			// 鑾峰彇鏁版嵁鍖哄垎缁勫瓧娈祇bj
-			getDataAreaGroupFieldRecordObj(dataAreaFieldRecordObj, dataAreaFieldConfigMap, recordFse);
-
-			// 鑾峰彇鏁版嵁鍖虹壒娈婂瓧娈电殑缁熻
-			statisticsDataAreaSpField(statisticsMap, dataAreaFieldConfigMap, dataAreaSpStatisticsFieldNameList, recordFse);
-
-			// 鑾峰彇鏁版嵁鍖烘櫘閫氬瓧娈电殑缁熻
-			statisticsDataAreaCommonField(statisticsMap, dataAreaFieldConfigMap, dataAreaCommonStatisticsFieldNameList, recordFse);
-		}
-
-		// 鑾峰彇鍒嗙粍琛ㄥご鍖哄拰鏁版嵁鍖烘�诲垪鏁�
-		int totalColCount = getTotalColCount(groupAreaFieldRecordObj, dataAreaGroupFieldNameList.size(), dataAreaCommonStatisticsFieldNameList.size());
-
-		// 鏁版嵁鏍囬list
-		List<JSONObject> dataTitleList = Lists.newArrayList();
-		// 鑾峰彇鏍囬html
-		groupAndDataArea[0] = (getDataAreaTitle(dataTitleList, groupAreaFieldRecordObj, dataAreaFieldConfigMap, groupAreaRangeObj, dataAreaCommonStatisticsFieldNameList));
-		// 鑾峰彇鍐呭html
-		groupAndDataArea[1] = (getDataAreaData(dataTitleList, dataAreaFieldRecordObj, statisticsMap, totalName, dataAreaGroupFieldNameList, dataAreaFieldConfigMap));
-
-		return totalColCount;
+		return new int[]{totalColCount, dataAreaTitleRows.size()};
 	}
 
 	/**
@@ -664,95 +503,6 @@
 	}
 
 	/**
-	 * 鑾峰彇鏍囬
-	 *
-	 * @param dataTitleList                         鏁版嵁鏍囬list
-	 * @param groupAreaFieldRecordObj               鍒嗙粍琛ㄥご鍖哄瓧娈佃褰昽bj
-	 * @param dataAreaFieldConfigMap                鏁版嵁鍖哄瓧娈电紦瀛榤ap
-	 * @param groupAreaRangeObj                     鍒嗙粍琛ㄥご鍘昏寖鍥磑bj
-	 * @param dataAreaCommonStatisticsFieldNameList 鏁版嵁鍖烘櫘閫氱粺璁″瓧娈靛悕绉發ist
-	 * @return 鏁版嵁鏍囬html
-	 */
-	private List<List<ReportColumn>> getDataAreaTitle(List<JSONObject> dataTitleList, JSONObject groupAreaFieldRecordObj, Map<String, JSONObject> dataAreaFieldConfigMap, JSONObject groupAreaRangeObj, List<String> dataAreaCommonStatisticsFieldNameList) {
-		int maxRow = groupAreaRangeObj.getIntValue(CmnConst.MAX_Y);
-		List<List<JSONObject>> groupAreaRangeTitleList = Lists.newArrayList();
-		for (int i = 0; i <= maxRow; i++) {
-			groupAreaRangeTitleList.add(Lists.newArrayList());
-		}
-		getGroupAreaRangeTitleList(dataAreaFieldConfigMap, groupAreaFieldRecordObj, groupAreaRangeTitleList, new JSONObject(), 0, maxRow, null);
-
-		List<JSONObject> beforeGroupAreaTitleList = Lists.newArrayList();
-		List<JSONObject> afterGroupAreaTitleList = Lists.newArrayList();
-
-		String dataAreaFieldName;
-		JSONObject dataAreaFieldConfigObj;
-		JSONObject titleObj;
-		for (Map.Entry<String, JSONObject> entry : dataAreaFieldConfigMap.entrySet()) {
-			dataAreaFieldName = entry.getKey();
-			dataAreaFieldConfigObj = entry.getValue();
-			titleObj = new JSONObject();
-//            titleObj.put(CmnConst.ATTR_FIELD_INFO, getFieldInfo(dataAreaFieldConfigObj));
-			titleObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(dataAreaFieldName));
-			if (dataAreaCommonStatisticsFieldNameList.contains(dataAreaFieldName)) {
-				titleObj.put(CmnConst.ATTR_SHOW_NAME, dataListReportService.getStatisticsDesc(dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS), dataAreaFieldConfigObj.getString(CmnConst.ATTR_SHOW_NAME)));
-			} else {
-				titleObj.put(CmnConst.ATTR_SHOW_NAME, dataAreaFieldConfigObj.getString(CmnConst.ATTR_SHOW_NAME));
-			}
-			titleObj.put(CmnConst.ATTR_ROWSPAN, maxRow + 1);
-			titleObj.put(CmnConst.ATTR_COLSPAN, 1);
-			if (dataAreaFieldConfigObj.getIntValue(CmnConst.ATTR_X) < groupAreaRangeObj.getIntValue(CmnConst.MIN_X)) {
-				beforeGroupAreaTitleList.add(titleObj);
-			}
-			if (dataAreaFieldConfigObj.getIntValue(CmnConst.ATTR_X) > groupAreaRangeObj.getIntValue(CmnConst.MAX_X)) {
-				if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) {
-					beforeGroupAreaTitleList.add(titleObj);
-				} else {
-					afterGroupAreaTitleList.add(titleObj);
-				}
-			}
-		}
-
-		dataTitleList.addAll(groupAreaRangeTitleList.get(maxRow));
-		dataTitleList.addAll(afterGroupAreaTitleList);
-
-		List<JSONObject> firstList = Lists.newArrayList();
-		firstList.addAll(beforeGroupAreaTitleList);
-		firstList.addAll(groupAreaRangeTitleList.get(0));
-		firstList.addAll(afterGroupAreaTitleList);
-
-		groupAreaRangeTitleList.set(0, firstList);
-
-//		StringBuilder html = new StringBuilder(1024);
-		int rowspan;
-		int colspan;
-		String value;
-		List<List<ReportColumn>> rowColumn = new ArrayList<>();
-		for (List<JSONObject> rowList : groupAreaRangeTitleList) {
-			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));
-					column.setColumnWidth(dataListReportService.dealColumnWidth(dataAreaFieldConfigMap.get(dataAreaFieldName)));
-//					value = dataListReportService.dealTdWidth(dataAreaFieldConfigMap.get(dataAreaFieldName), value);
-				}
-				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>");
-			}
-			rowColumn.add(columns);
-//			html.append("\n</tr>");
-		}
-		return rowColumn;
-	}
-
-	/**
 	 * 鑾峰彇鏍囬html
 	 *
 	 * @param dataTitleList                         鏁版嵁鏍囬list
@@ -762,7 +512,8 @@
 	 * @param dataAreaCommonStatisticsFieldNameList 鏁版嵁鍖烘櫘閫氱粺璁″瓧娈靛悕绉發ist
 	 * @return 鏁版嵁鏍囬html
 	 */
-	private StringBuilder getDataAreaTitleHtml(List<JSONObject> dataTitleList, JSONObject groupAreaFieldRecordObj, Map<String, JSONObject> dataAreaFieldConfigMap, JSONObject groupAreaRangeObj, List<String> dataAreaCommonStatisticsFieldNameList) {
+	private List<List<ReportColumn>> getDataAreaTitleRows(List<JSONObject> dataTitleList, JSONObject groupAreaFieldRecordObj, Map<String, JSONObject> dataAreaFieldConfigMap, JSONObject groupAreaRangeObj, List<String> dataAreaCommonStatisticsFieldNameList) {
+		List<List<ReportColumn>> reportColumnList = Lists.newArrayList();
 		int maxRow = groupAreaRangeObj.getIntValue(CmnConst.MAX_Y);
 		List<List<JSONObject>> groupAreaRangeTitleList = Lists.newArrayList();
 		for (int i = 0; i <= maxRow; i++) {
@@ -816,20 +567,27 @@
 		int colspan;
 		String value;
 		for (List<JSONObject> rowList : groupAreaRangeTitleList) {
-			html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_TITLE).append("\">\n    ");
+			List<ReportColumn> reportColumns = new ArrayList<>();
+//			html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_TITLE).append("\">\n    ");
 			for (JSONObject dataTitleObj : rowList) {
 				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);
+				ReportColumn column = new ReportColumn(colspan, rowspan);
 				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);
+					JSONObject dataAreaFieldConfigObjTemp = dataAreaFieldConfigMap.get(dataAreaFieldName);
+					String width = dataAreaFieldConfigObjTemp == null ? null : dataAreaFieldConfigObjTemp.getString(CmnConst.ATTR_WIDTH);
+					if (!StringUtils.isEmpty(width) && NumberUtil.isNumber(width)) {
+						column.setColumnWidth(NumberUtil.parseInt(width));
+					}
 				}
-				html.append("<td rowspan=\"").append(rowspan).append("\" colspan=\"").append(colspan).append("\">").append(value == null ? "" : value).append("</td>");
+				column.setContent(value);
+				reportColumns.add(column);
 			}
-			html.append("\n</tr>");
+			reportColumnList.add(reportColumns);
 		}
-		return html;
+		return reportColumnList;
 	}
 
 	/**
@@ -935,7 +693,7 @@
 	 * @param dataAreaFieldConfigMap     鏁版嵁鍖哄瓧娈电紦瀛榤ap
 	 * @return 涓氬姟鏁版嵁鍐呭html
 	 */
-	private StringBuilder getDataAreaDataHtml(List<JSONObject> dataTitleList, JSONObject dataAreaFieldRecordObj, Map<JSONObject, JSONObject> statisticsMap, String totalName, List<String> dataAreaGroupFieldNameList, Map<String, JSONObject> dataAreaFieldConfigMap) {
+	private List<List<ReportColumn>> getDataAreaDataRows(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);
 
@@ -1037,144 +795,34 @@
 		if (!StringUtils.isEmpty(totalName)) {
 			html.append(getTotalStatisticsHtml(statisticsMap, dataTitleList, dataAreaFieldConfigMap, dataAreaGroupFieldNameList.size(), getSubCnt(dataAreaFieldRecordObj), totalName));
 		}
-
-		return html;
-	}
-
-	/**
-	 * 鑾峰彇鍐呭html
-	 *
-	 * @param dataTitleList              鏁版嵁鏍囬list
-	 * @param dataAreaFieldRecordObj     鏁版嵁鍖哄瓧娈佃褰昽bj
-	 * @param statisticsMap              缁熻map
-	 * @param totalName                  鎬昏鍚嶇О锛岄潪绌�-闇�瑕佹�昏
-	 * @param dataAreaGroupFieldNameList 鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist
-	 * @param dataAreaFieldConfigMap     鏁版嵁鍖哄瓧娈电紦瀛榤ap
-	 * @return 涓氬姟鏁版嵁鍐呭html
-	 */
-	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) {
-			obj = dataListReportService.extendJSONObject(null, rowList.get(rowList.size() - 1), Arrays.asList(CmnConst.ATTR_ROWSPAN, CmnConst.ATTR_COLSPAN, CmnConst.ATTR_SHOW_NAME, CmnConst.ATTR_IS_STATISTICS_FIELD), -1);
-			groupTitleList.add(obj);
-		}
-
-//		StringBuilder html = new StringBuilder(1024);
-		JSONObject dataAreaGroupFieldObj;
-		int rowspan;
-		int colspan;
-		String value;
-		JSONObject groupTitleObj;
-		JSONObject keyObj;
-		JSONObject valueObj;
-		String statisticsType;
-		JSONObject dataAreaFieldConfigObj;
-		int groupAreaSubCnt;
-		int dataAreaSubCnt;
-		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()) {
-				for (int j = 0; j < curRowList.size(); j++) {
-					dataAreaGroupFieldObj = curRowList.get(j);
-					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    ");
-//						}
-//					}
-					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);
-					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++;
+		List<List<ReportColumn>> reportColumnList = new ArrayList<>();
+		//瑙f瀽html
+		//鍦╤tml鍓嶉潰鎷兼帴涓�涓猼able鏍囩鍜宼body锛屽惁鍒橨soup瑙f瀽浼氭姤閿�
+		html.insert(0, "<table><tbody>");
+		html.append("</tbody></table>");
+		Document doc = Jsoup.parse(html.toString());
+		Elements trs = doc.select("tr");
+		Elements tds;
+		List<ReportColumn> reportColumn;
+		ReportColumn column;
+		for (Element tr : trs) {
+			tds = tr.select("td");
+			reportColumn = new ArrayList<>();
+			for (Element td : tds) {
+				column = new ReportColumn();
+				column.setColspan(Integer.parseInt(BaseUtil.ifNull(td.attr("colspan"), "1")));
+				column.setRowspan(Integer.parseInt(BaseUtil.ifNull(td.attr("rowspan"), "1")));
+				Set<String> classNames = td.classNames();
+				if (classNames.contains(CmnConst.CLASS_TD_CAN_TURN)) {
+					column.setPenetrate(true);
+					column.setPenetrateProperty(td.attr("router"));
 				}
+				column.setContent(td.text());
+				reportColumn.add(column);
 			}
-//			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);
-				dataAreaFieldConfigObj = dataAreaFieldConfigMap.get(dataListReportService.fieldInfo2FieldName(dataTitleObj.getString(CmnConst.ATTR_FIELD_INFO)));
-				if (dataAreaFieldConfigObj != null) {
-					groupAreaSubCnt = keyObj.getIntValue(CmnConst.ATTR_GROUP_AREA_SUB_CNT);
-					dataAreaSubCnt = keyObj.getIntValue(CmnConst.ATTR_DATA_AREA_SUB_CNT);
-					keyObj.remove(CmnConst.ATTR_GROUP_AREA_SUB_CNT);
-					keyObj.remove(CmnConst.ATTR_DATA_AREA_SUB_CNT);
-					keyObj.remove(CmnConst.ATTR_REAL_VALUE);
-					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))) {
-							if (dataAreaSubCnt == 0 && groupAreaSubCnt == 0) {
-								value = valueObj.getString(statisticsType);
-							} else {
-								value = getTwoTypesGroupAvgStatisticsValue(dataAreaSubCnt, groupAreaSubCnt, valueObj, dataAreaFieldConfigObj, statisticsType);
-							}
-						} else {
-							value = valueObj.getString(statisticsType);
-						}
-						valueObj.put(CmnConst.ATTR_FINAL_VALUE, value);
-					}
-				} else {
-					value = "";
-				}
-//				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("\"");
-					}
-					// 瀛楁灞炴��
-					dataListReportService.getTdAttrObj(keyObj, groupTitleObj);
-					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);
-				}
-//				html.append(">").append(value == null ? "" : value).append("</td>");
-				column.setContent(value);
-				columns.add(column);
-			}
-//			html.append("\n</tr>");
-			dataRows.add(columns);
+			reportColumnList.add(reportColumn);
 		}
-
-		// 鎬昏
-		if (!StringUtils.isEmpty(totalName)) {
-			dataRows.add(getTotalStatistics(statisticsMap, dataTitleList, dataAreaFieldConfigMap, dataAreaGroupFieldNameList.size(), getSubCnt(dataAreaFieldRecordObj), totalName));
-		}
-
-		return dataRows;
+		return reportColumnList;
 	}
 
 	/**
@@ -1275,86 +923,6 @@
 			}
 		}
 		return row;
-	}
-
-	/**
-	 * 鑾峰彇鎬昏html
-	 *
-	 * @param statisticsMap           缁熻map
-	 * @param dataTitleList           鏁版嵁鏍囬list
-	 * @param dataAreaFieldConfigMap  鏁版嵁鍖哄瓧娈电紦瀛榤ap
-	 * @param dataAreaGroupFieldCount 鏁版嵁鍖哄垎缁勫瓧娈典釜鏁�
-	 * @param dataAreaSubCnt          鏁版嵁鍖轰笅绾у垎缁勯」鏁�
-	 * @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;
 	}
 
 	/**

--
Gitblit v1.9.2