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/CommonReportService.java | 1144 ++++++++++++++++++++++++++++++--------------------------
 1 files changed, 617 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..9415869 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,7 @@
 package com.product.server.report.service;
 
 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,6 +12,7 @@
 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.util.BaseUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -26,556 +28,644 @@
  */
 @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);
 
-        // css
-        StringBuilder cssHtml = dataListReportService.getCssHtml();
+	/**
+	 * 鎶ヨ〃-瑙f瀽
+	 *
+	 * @param recordDte            涓氬姟鏁版嵁dte
+	 * @param totalName            鎬昏鍚嶇О
+	 * @param reportConfigMap      鎶ヨ〃閰嶇疆缂撳瓨map
+	 * @param unpivotInfoContainer 琛屽垪杞崲淇℃伅
+	 * @return
+	 */
+	public List<List<ReportColumn>>[] getReport(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap, Collection<String> unpivotInfoContainer) {
+		List<List<ReportColumn>>[] reportColumnList = new List[]{new ArrayList(), new ArrayList(), new ArrayList()};
 
-        // 鏁版嵁鍖�
-        Map<String, Set<String>> headAndTailTitleDataMap = Maps.newHashMap();
-        String dataAreaHtml = getDataAreaHtml(reportConfigMap, headAndTailTitleDataMap, recordDte, totalName);
+		// 鏁版嵁鍖�
+		Map<String, Set<String>> headAndTailTitleDataMap = Maps.newHashMap();
+		List<List<ReportColumn>> reportRows = getDataArea(reportConfigMap, headAndTailTitleDataMap, recordDte, totalName, unpivotInfoContainer);
+		int totalColCount = reportConfigMap.get(0).size() + unpivotInfoContainer.size() - 1;
+		// 澶撮儴鏍囬鍖�
+		if (!reportConfigMap.get(1).isEmpty()) {
+			reportColumnList[0] = (dataListReportService.getTitleRows(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head"));
+		}
+		//濡傛灉reportRows 琛屾暟澶т簬0灏嗙涓�琛岀殑鏁版嵁鏀惧叆澶撮儴鏍囬鍖�
+		if (reportRows.size() >= 0) {
+			reportColumnList[0].add(reportRows.get(0));
+			reportRows.remove(0);
+		}
+		reportColumnList[1] = reportRows;
+		// 搴曢儴鏍囬鍖�
+		if (!reportConfigMap.get(3).isEmpty()) {
+			reportColumnList[2] = (dataListReportService.getTitleRows(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");
-        }
+//		reportHtml.append("\n<body>\n<table class=\"report_main\"").append(tableStyle).append(">")
+//				.append(headTitleHtml == null ? "" : headTitleHtml)
+//				.append(dataAreaHtml)
+//				.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 reportColumnList;
+	}
 
-        // 搴曢儴鏍囬鍖�
-        StringBuilder tailTitleHtml = null;
-        if (!reportConfigMap.get(3).isEmpty()) {
-            tailTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail");
-        }
+	/**
+	 * 鑾峰彇鎶ヨ〃鏁版嵁鍖篽tml
+	 *
+	 * @param reportConfigMap         鎶ヨ〃缂撳瓨map
+	 * @param headAndTailTitleDataMap 澶撮儴銆佸熬閮ㄦ爣棰樺尯鏁版嵁瀛楁map
+	 * @param recordDte               涓氬姟鏁版嵁闆嗗悎
+	 * @param totalName               鎬昏鍚嶇О锛岄潪绌�-闇�瑕佹�昏
+	 * @return
+	 */
+	private List<List<ReportColumn>> getDataArea(Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName, Collection<String> unpivotInfoContainer) {
+		List<List<ReportColumn>> reportColumnList = Lists.newArrayList();
+		// 鏁版嵁鍖哄瓧娈电紦瀛榤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();
 
-        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>");
+		// 灏嗚鍒楄浆鎹㈢殑淇℃伅娣诲姞鍒版暟鎹尯瀛楁缂撳瓨map閲岄潰
+		Map<String, JSONObject> newDataAreaFieldConfigMap = Maps.newLinkedHashMap();
+		int x = 0;
+		if (!unpivotInfoContainer.isEmpty()) {
+			for (Map.Entry<String, JSONObject> entry : dataAreaFieldConfigMap.entrySet()) {
+				String fieldName = entry.getKey();
+				JSONObject fieldConfigObj = entry.getValue();
+				if (fieldConfigObj.getIntValue(CmnConst.IS_UNPIVOT) == 1) {
+					x = fieldConfigObj.getIntValue(CmnConst.ATTR_X);
+					fieldConfigObj.put(CmnConst.IS_UNPIVOT, 0);
+					fieldConfigObj.put(CmnConst.ATTR_IS_CUSTOM_FIELD, 0);
+					for (String unpivotField : unpivotInfoContainer) {
+						JSONObject newFieldConfigObj = new JSONObject();
+						newFieldConfigObj.putAll(fieldConfigObj);
+						newFieldConfigObj.put(CmnConst.ATTR_X, ++x);
+						newFieldConfigObj.put(CmnConst.ATTR_SHOW_NAME, newFieldConfigObj.getString(CmnConst.ATTR_SHOW_NAME).replace("{#unpivot_name#}", unpivotField));
+						newDataAreaFieldConfigMap.put(unpivotField, newFieldConfigObj);
+					}
+				} else {
+					if (x > fieldConfigObj.getIntValue(CmnConst.ATTR_X)) {
+						fieldConfigObj.put(CmnConst.ATTR_X, ++x);
+					}
+					newDataAreaFieldConfigMap.put(fieldName, fieldConfigObj);
+				}
+			}
+		} else {
+			newDataAreaFieldConfigMap = dataAreaFieldConfigMap;
+		}
 
-        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;
-    }
+		// 鏍囬
+		reportColumnList.add(getDataAreaTitle(newDataAreaFieldConfigMap));
+		// 鍐呭
+		List<List<ReportColumn>> dataAreaData = getDataAreaData(newDataAreaFieldConfigMap, recordDte, headAndTailTitleDataMap, headAndTailFieldSet, statisticsMap, totalName);
+		reportColumnList.addAll(dataAreaData);
+		return reportColumnList;
+	}
 
-    /**
-     * 鑾峰彇鎶ヨ〃鏁版嵁鍖篽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();
+	/**
+	 * 鑾峰彇鏍囬
+	 *
+	 * @param dataAreaFieldConfigMap 鏁版嵁鍖哄瓧娈电紦瀛榤ap
+	 * @return
+	 */
+	private List<ReportColumn> getDataAreaTitle(Map<String, JSONObject> dataAreaFieldConfigMap) {
+		List<ReportColumn> columnRow = new ArrayList<>();
+		dataAreaFieldConfigMap.forEach((dataAreaFieldName, dataAreaFieldConfigObj) -> {
+			ReportColumn column = new ReportColumn();
+			column.setContent(dataAreaFieldConfigObj.getString(CmnConst.ATTR_SHOW_NAME));
+			String width = dataAreaFieldConfigObj.getString(CmnConst.ATTR_WIDTH);
+			//鍒ゆ柇瀹藉害鏄惁涓虹┖骞朵笖鏄暟瀛楋紙姝f暣鏁板拰灏忔暟閮藉彲浠ワ級
+			if (StringUtils.isNotBlank(width) && width.matches("^[0-9]+(.[0-9]+)?$")) {
+				//灏嗗搴﹁浆鎹负double绫诲瀷
+				column.setColumnWidth(NumberUtil.parseInt(width));
+			}
+			columnRow.add(column);
+		});
+		return columnRow;
+	}
 
-        StringBuilder dataAreaHtml = new StringBuilder(1024);
-        // 鏍囬
-        dataAreaHtml.append(getDataAreaTitleHtml(dataAreaFieldConfigMap));
-        // 鍐呭
-        dataAreaHtml.append(getDataAreaDataHtml(dataAreaFieldConfigMap, recordDte, headAndTailTitleDataMap, headAndTailFieldSet, statisticsMap, totalName));
-        return dataAreaHtml.toString();
-    }
+	/**
+	 * 鑾峰彇鍐呭锛屽寘鍚粺璁�
+	 *
+	 * @param dataAreaFieldConfigMap 鏁版嵁鍖哄瓧娈电紦瀛榤ap
+	 * @param recordDte              涓氬姟鏁版嵁闆嗗悎
+	 * @param headAndTailFieldSet    澶撮儴銆佸熬閮ㄦ爣棰樺尯瀛楁set
+	 * @param statisticsMap          缁熻map
+	 * @param totalName              鎬昏鍚嶇О
+	 * @return
+	 */
+	private List<List<ReportColumn>> getDataAreaData(Map<String, JSONObject> dataAreaFieldConfigMap, DataTableEntity recordDte, Map<String, Set<String>> headAndTailTitleDataMap, Set<String> headAndTailFieldSet, Map<JSONObject, JSONObject> statisticsMap, String totalName) {
+		List<List<ReportColumn>> reportColumnList = Lists.newArrayList();
+		// 鏁版嵁鍖哄垎缁勭粺璁″瓧娈靛悕绉發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 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;
-    }
+//		StringBuilder dataAreaDataHtml = new StringBuilder(1024);
+//		StringBuilder curRowHtml = new StringBuilder(256);
+		List<ReportColumn> curRowColumn = new ArrayList<>();
+		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;
+		ReportColumn currentColumn = new ReportColumn();
+		JSONObject dataAreaGroupFieldRecordObj = new JSONObject();
+		for (int i = 0; i < recordDte.getRows(); i++) {
+			recordFse = recordDte.getFieldSetEntity(i);
+			// 鑾峰彇澶撮儴銆佸熬閮ㄦ爣棰樺尯鏁版嵁瀛楁
+			dataListReportService.getHeadAndTailTitleDataMap(headAndTailTitleDataMap, headAndTailFieldSet, recordFse);
 
-    /**
-     * 鑾峰彇鍐呭锛屽寘鍚粺璁�
-     *
-     * @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);
-                }
-            }
-        });
+//			curRowHtml.setLength(0);
+			curRowColumn = new ArrayList<>();
 
-        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);
+			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);
 
-            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) {
+							reportColumnList.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);
+//					curRowHtml.append("<td rowspan=\"").append(paramKey).append("\"");
+					currentColumn.setRowspan(paramKey);
+					replaceMap.put(paramKey, "1");
+				}
+//				else {
+//					curRowHtml.append("<td");
+//				}
+				// class
+				if (!StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL))) {
+					currentColumn.setSubReport("true".equals(dataAreaFieldConfigObj.getString("~isSubReport~")));
+					if (!currentColumn.isSubReport()) {
+						currentColumn.setPenetrate(true);
+						currentColumn.setPenetrateProperty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL));
+					} else {
+						currentColumn.setSubReportProperty(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);
+				}
+				if (!dataAreaFieldName.matches("\\d+")) {
+					currentColumn.addProperty(dataAreaFieldName, attrValue);
+//					curRowHtml.append(" ").append(dataAreaFieldName).append("=\"").append(attrValue).append("\"");
+				}
+				// 瑙f瀽绌块�忓弬鏁�
+				String urlParam = dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL_PARAM);
+				String attrParam;
+				if (!StringUtils.isEmpty(urlParam)) {
+					List<String> suitFieldList = BaseUtil.getSuitContent(urlParam, "\\{#\\w+#\\}");
+					for (String singleSuitFieldName : suitFieldList) {
+						attrParam = singleSuitFieldName.substring(2, singleSuitFieldName.length() - 2);
+						currentColumn.addProperty(attrParam, recordFse.getString(attrParam));
+//						curRowHtml.append(" ").append(attrParam).append("=\"").append(recordFse.getString(attrParam)).append("\"");
+					}
+				}
+//				curRowHtml.append(">");
+				// 鏍煎紡
+				value = dataListReportService.formatValue(dataAreaFieldConfigObj, value);
+//				curRowHtml.append(value == null ? "" : value);
+//				curRowHtml.append("</td>");
+				currentColumn.setContent(value);
+				curRowColumn.add(currentColumn);
+				currentColumn = new ReportColumn();
+			}
+//			curRowHtml.append("\n</tr>");
+//			dataAreaDataHtml.append(curRowHtml);
+			reportColumnList.add(curRowColumn);
+			preFse = 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) {
+					reportColumnList.add(getDataAreaGroupStatisticsFieldStatisticsRow(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName), statisticsMap, dataAreaFieldConfigMap, tempFieldName, preFse, dataAreaGroupFieldNameList, replaceMap, dataAreaGroupFieldRecordObj));
+				}
+			}
+		}
 
-        // 琛ュ叏鏈熬缁熻
-        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)) {
+			List<ReportColumn> reportColumns = getDataAreaTotalStatisticsRow(statisticsMap, dataAreaFieldConfigMap, dataAreaGroupFieldNameList, preFse, dataAreaGroupFieldRecordObj, totalName);
+			if (reportColumns != null && reportColumns.size() > 0) {
+				reportColumnList.add(reportColumns);
+			}
+		}
+		//寰幆鎵�鏈夌殑column杩涜鍙傛暟鏇挎崲
+		for (List<ReportColumn> reportColumns : reportColumnList) {
+			if (reportColumns != null) {
+				for (ReportColumn reportColumn : reportColumns) {
+					if (reportColumn != null) {
 
-        // 鎬昏
-        if (!StringUtils.isEmpty(totalName)) {
-            dataAreaDataHtml.append(getDataAreaTotalStatisticsHtml(statisticsMap, dataAreaFieldConfigMap, dataAreaGroupFieldNameList, preFse, dataAreaGroupFieldRecordObj, totalName));
-        }
+						for (Map.Entry<String, String> entry : replaceMap.entrySet()) {
+							reportColumn.replace(entry.getKey(), entry.getValue());
+						}
+					}
+				}
 
-        String str = dataAreaDataHtml.toString();
-        for (Map.Entry<String, String> entry : replaceMap.entrySet()) {
-            str = str.replace(entry.getKey(), entry.getValue());
-        }
+			}
+		}
 
-        return str;
-    }
+		return reportColumnList;
+	}
 
-    /**
-     * 娣诲姞鍒嗙粍缁熻淇℃伅
-     * @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 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));
+		}
+	}
 
-    /**
-     * 鑾峰彇缁熻琛岀殑鍏紡璁$畻鍊�
-     * @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;
-    }
+	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);
+	}
 
-    /**
-     * 鑾峰彇鏁版嵁鍖哄垎缁勭粺璁″瓧娈电粺璁¤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;
-    }
+	/**
+	 * 鑾峰彇缁熻琛岀殑鍏紡璁$畻鍊�
+	 *
+	 * @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 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();
-    }
+	/**
+	 * 鑾峰彇鏁版嵁鍖哄垎缁勭粺璁″瓧娈电粺璁¤html
+	 *
+	 * @param waitStatisticsValue         寰呯粺璁$殑鍊�
+	 * @param statisticsMap               缁熻map
+	 * @param dataAreaFieldConfigMap      鏁版嵁鍖哄瓧娈电紦瀛榤ap
+	 * @param tempFieldName               鏈鎿嶄綔鐨勫瓧娈靛悕绉�
+	 * @param recordFse                   涓氬姟鏁版嵁璁板綍
+	 * @param dataAreaGroupFieldNameList  鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist
+	 * @param replaceMap                  鏇挎崲map
+	 * @param dataAreaGroupFieldRecordObj 鏁版嵁鍖哄垎缁勫瓧娈佃褰昽bj
+	 * @return
+	 */
+	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> columnRow = new ArrayList<>();
+		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)) {
+						ReportColumn column = new ReportColumn();
+						column.setColspan(dataAreaGroupFieldNameList.size() - index + 1);
+						column.setContent(waitStatisticsValue);
+//						html.append("<td colspan=\"").append(dataAreaGroupFieldNameList.size() - index + 1).append("\">").append(waitStatisticsValue).append(CmnConst.STATISTICS_NAME).append("</td>");
+						flag = true;
+						columnRow.add(column);
+					}
+					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>");
+						columnRow.add(new ReportColumn());
+					}
+				} 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>");
+					columnRow.add(new ReportColumn(value == null ? "" : value));
+				}
+			}
+		}
+		dealReplaceMapAddRowspan(replaceMap, needAddRowspanDataAreaGroupFieldNameList, recordFse, false);
+		return columnRow;
+	}
 
-    /**
-     * 澶勭悊鍙傛暟鏇挎崲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));
-        }
-    }
+	/**
+	 * 鑾峰彇鎬昏html
+	 *
+	 * @param statisticsMap               缁熻map
+	 * @param dataAreaFieldConfigMap      鏁版嵁鍖哄瓧娈电紦瀛榤ap
+	 * @param dataAreaGroupFieldNameList  鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist
+	 * @param preFse                      鏈�杩戞搷浣滅殑鏁版嵁fse
+	 * @param dataAreaGroupFieldRecordObj 鏁版嵁鍖哄垎缁勫瓧娈佃褰昽bj
+	 * @param totalName                   鎬昏鍚嶇О
+	 * @return
+	 */
+	private List<ReportColumn> getDataAreaTotalStatisticsRow(Map<JSONObject, JSONObject> statisticsMap, Map<String, JSONObject> dataAreaFieldConfigMap, List<String> dataAreaGroupFieldNameList, FieldSetEntity preFse, JSONObject dataAreaGroupFieldRecordObj, String totalName) {
+		List<ReportColumn> reportColumns = new ArrayList<>();
+		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()) {
+			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);
+				reportColumns.add(new ReportColumn(value == null ? "" : value));
+			} else {
+				if (index == 1) {
+					ReportColumn column = new ReportColumn();
+					column.setColspan(dataAreaGroupFieldNameList.size());
+					column.setContent(totalName);
+					reportColumns.add(column);
+				}
+			}
+		}
+		return reportColumns;
+	}
 
-    /**
-     * 璁板綍鍒嗙粍瀛楁
-     *
-     * @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;
-        }
-    }
+	/**
+	 * 澶勭悊鍙傛暟鏇挎崲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 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();
-    }
+	/**
+	 * 璁板綍鍒嗙粍瀛楁
+	 *
+	 * @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