From 1156a6e9619864201de922f4cfa93f6db989ff2e Mon Sep 17 00:00:00 2001
From: 1821349743@qq.com <1821349743@qq.com>
Date: 星期一, 17 四月 2023 12:09:07 +0800
Subject: [PATCH] report update

---
 src/main/java/com/product/server/report/entity/ReportEntity.java                  |   35 ++
 src/main/java/com/product/server/report/controller/DataListReportController.java  |  176 +++++++++-----
 src/main/java/com/product/server/report/service/ListReportConfigServiceImple.java |   14 
 src/main/java/com/product/server/report/service/GroupReportService.java           |  186 ++++++++++++---
 pom.xml                                                                           |    4 
 src/main/java/com/product/server/report/service/CommonReportService.java          |   22 +
 src/main/java/com/product/server/report/service/DataListReportService.java        |  204 ++++++++++++++--
 src/main/java/com/product/server/report/entity/ReportColumn.java                  |   26 +
 8 files changed, 498 insertions(+), 169 deletions(-)

diff --git a/pom.xml b/pom.xml
index 00a4e3f..263bc90 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,5 +38,9 @@
             <groupId>com.lx</groupId>
             <artifactId>product-server-admin</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.lx</groupId>
+            <artifactId>product-server-data-export-import</artifactId>
+        </dependency>
     </dependencies>
 </project>
diff --git a/src/main/java/com/product/server/report/controller/DataListReportController.java b/src/main/java/com/product/server/report/controller/DataListReportController.java
index 863f3eb..50fab3c 100644
--- a/src/main/java/com/product/server/report/controller/DataListReportController.java
+++ b/src/main/java/com/product/server/report/controller/DataListReportController.java
@@ -1,22 +1,35 @@
 package com.product.server.report.controller;
 
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import com.product.core.config.CoreConst;
 import com.product.core.controller.support.AbstractBaseController;
 import com.product.core.entity.FieldSetEntity;
 import com.product.core.entity.RequestParameterEntity;
 import com.product.core.exception.BaseException;
 import com.product.core.spring.context.SpringMVCContextHolder;
+import com.product.module.data.config.CmnCode;
+import com.product.module.data.config.CmnConst;
+import com.product.module.data.service.SystemDataExportService;
 import com.product.module.sys.version.ApiVersion;
 import com.product.server.report.config.ReportCode;
 import com.product.server.report.config.SystemCode;
+import com.product.server.report.entity.ReportColumn;
+import com.product.server.report.entity.ReportEntity;
 import com.product.server.report.service.DataListReportService;
 import com.product.util.BaseUtil;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.TimeZone;
+import java.util.stream.Collectors;
 
 /**
  * Copyright 漏 6c
@@ -28,75 +41,104 @@
 @RestController
 @RequestMapping("/api/report/data-list")
 public class DataListReportController extends AbstractBaseController {
-    @Autowired
-    private DataListReportService dataListReportService;
+	@Autowired
+	private DataListReportService dataListReportService;
 
 
+	/**
+	 * 6c-test-璁剧疆鎶ヨ〃缂撳瓨
+	 *
+	 * @param request
+	 * @return
+	 */
+	@RequestMapping(value = "/set-report-cache/{version}", method = RequestMethod.POST)
+	@ApiVersion(1)
+	public String setReportCache(HttpServletRequest request) {
+		try {
+			FieldSetEntity fse = null;
+			Object bean = request.getAttribute(CoreConst.API_POST_REQUEST_DATA);
+			if (bean != null) {
+				RequestParameterEntity reqp = (RequestParameterEntity) bean;
+				fse = reqp.getFormData();
+			}
+			if (bean == null || fse == null) {
+				SpringMVCContextHolder.getSystemLogger().error(SystemCode.SYSTEM_FORM_NODATA.getValue(), SystemCode.SYSTEM_FORM_NODATA.getText());
+				return this.error(SystemCode.SYSTEM_FORM_NODATA.getValue(), SystemCode.SYSTEM_FORM_NODATA.getText());
+			}
+			if (!"1".equals(fse.getString("is_all"))) {
+				dataListReportService.setConfig(fse.getUUID());
+			} else {
+				dataListReportService.setAllConfig();
+			}
+			return OK();
+		} catch (BaseException e) {
+			SpringMVCContextHolder.getSystemLogger().error(e);
+			return this.error(e.getCode(), e.getMessageInfo());
+		} catch (Exception e) {
+			SpringMVCContextHolder.getSystemLogger().error(e);
+			e.printStackTrace();
+			return error(ReportCode.GET_REPORT_FAIL.getValue(), ReportCode.GET_REPORT_FAIL.getText());
+		}
+	}
 
-    /**
-     * 6c-test-璁剧疆鎶ヨ〃缂撳瓨
-     *
-     * @param request
-     * @return
-     */
-    @RequestMapping(value = "/set-report-cache/{version}", method = RequestMethod.POST)
-    @ApiVersion(1)
-    public String setReportCache(HttpServletRequest request) {
-        try {
-            FieldSetEntity fse = null;
-            Object bean = request.getAttribute(CoreConst.API_POST_REQUEST_DATA);
-            if (bean != null) {
-                RequestParameterEntity reqp = (RequestParameterEntity) bean;
-                fse = reqp.getFormData();
-            }
-            if (bean == null || fse == null) {
-                SpringMVCContextHolder.getSystemLogger().error(SystemCode.SYSTEM_FORM_NODATA.getValue(), SystemCode.SYSTEM_FORM_NODATA.getText());
-                return this.error(SystemCode.SYSTEM_FORM_NODATA.getValue(), SystemCode.SYSTEM_FORM_NODATA.getText());
-            }
-            if (!"1".equals(fse.getString("is_all"))) {
-                dataListReportService.setConfig(fse.getUUID());
-            } else {
-                dataListReportService.setAllConfig();
-            }
-            return OK();
-        } catch (BaseException e) {
-            SpringMVCContextHolder.getSystemLogger().error(e);
-            return this.error(e.getCode(), e.getMessageInfo());
-        } catch (Exception e) {
-            SpringMVCContextHolder.getSystemLogger().error(e);
-            e.printStackTrace();
-            return error(ReportCode.GET_REPORT_FAIL.getValue(), ReportCode.GET_REPORT_FAIL.getText());
-        }
-    }
+	/**
+	 * 鑾峰彇鎶ヨ〃
+	 *
+	 * @param request
+	 * @return
+	 */
+	@RequestMapping(value = "/get-report/{version}", method = RequestMethod.POST)
+	@ApiVersion(1)
+	public String getReport(HttpServletRequest request) {
+		try {
+			FieldSetEntity fse = null;
+			Object bean = request.getAttribute(CoreConst.API_POST_REQUEST_DATA);
+			if (bean != null) {
+				RequestParameterEntity reqp = (RequestParameterEntity) bean;
+				fse = reqp.getFormData();
+			}
+			if (bean == null || fse == null) {
+				SpringMVCContextHolder.getSystemLogger().error(SystemCode.SYSTEM_FORM_NODATA.getValue(), SystemCode.SYSTEM_FORM_NODATA.getText());
+				return this.error(SystemCode.SYSTEM_FORM_NODATA.getValue(), SystemCode.SYSTEM_FORM_NODATA.getText());
+			}
+			return BaseUtil.success(dataListReportService.getReportEntity(fse));
+		} catch (BaseException e) {
+			SpringMVCContextHolder.getSystemLogger().error(e);
+			return this.error(e.getCode(), e.getMessageInfo());
+		} catch (Exception e) {
+			SpringMVCContextHolder.getSystemLogger().error(e);
+			e.printStackTrace();
+			return error(ReportCode.GET_REPORT_FAIL.getValue(), ReportCode.GET_REPORT_FAIL.getText());
+		}
+	}
 
-    /**
-     * 鑾峰彇鎶ヨ〃
-     *
-     * @param request
-     * @return
-     */
-    @RequestMapping(value = "/get-report/{version}", method = RequestMethod.POST)
-    @ApiVersion(1)
-    public String getTableInfo(HttpServletRequest request) {
-        try {
-            FieldSetEntity fse = null;
-            Object bean = request.getAttribute(CoreConst.API_POST_REQUEST_DATA);
-            if (bean != null) {
-                RequestParameterEntity reqp = (RequestParameterEntity) bean;
-                fse = reqp.getFormData();
-            }
-            if (bean == null || fse == null) {
-                SpringMVCContextHolder.getSystemLogger().error(SystemCode.SYSTEM_FORM_NODATA.getValue(), SystemCode.SYSTEM_FORM_NODATA.getText());
-                return this.error(SystemCode.SYSTEM_FORM_NODATA.getValue(), SystemCode.SYSTEM_FORM_NODATA.getText());
-            }
-            return BaseUtil.success(dataListReportService.getReportEntity(fse));
-        } catch (BaseException e) {
-            SpringMVCContextHolder.getSystemLogger().error(e);
-            return this.error(e.getCode(), e.getMessageInfo());
-        } catch (Exception e) {
-            SpringMVCContextHolder.getSystemLogger().error(e);
-            e.printStackTrace();
-            return error(ReportCode.GET_REPORT_FAIL.getValue(), ReportCode.GET_REPORT_FAIL.getText());
-        }
-    }
+	@PostMapping("report-export/{version}")
+	@ApiVersion(1)
+	public String reportDataExport(HttpServletRequest request, HttpServletResponse response) {
+		try {
+			FieldSetEntity fse = BaseUtil.getFieldSetEntity(request);
+
+			//鏄惁褰撳墠椤�
+			boolean exportCurrentPage = fse.getBoolean("exportCurrentPage");
+			if (!exportCurrentPage) {
+				//褰撳墠椤靛彿
+				int pageIndex = fse.getInteger(CmnConst.CPAGE);
+				fse.setValue(CmnConst.CPAGE, pageIndex);
+			} else {
+				fse.setValue(CmnConst.CPAGE, 1);
+				fse.setValue(CmnConst.PAGESIZE, Integer.MAX_VALUE);
+			}
+			 dataListReportService.outReportExcel(response,fse);
+				return OK();
+		} catch (BaseException e) {
+			e.printStackTrace();
+			SpringMVCContextHolder.getSystemLogger().error(e);
+			return error(e);
+		} catch (Exception e) {
+			e.printStackTrace();
+			SpringMVCContextHolder.getSystemLogger().error(e);
+			return error(CmnCode.EXPORT_GENERAL_LIST_DATA_IMPORT_FIAL.getValue(), CmnCode.EXPORT_GENERAL_LIST_DATA_IMPORT_FIAL.getText() + e.getMessage());
+		}
+	}
+
 }
diff --git a/src/main/java/com/product/server/report/entity/ReportColumn.java b/src/main/java/com/product/server/report/entity/ReportColumn.java
index 8af08fc..94e1471 100644
--- a/src/main/java/com/product/server/report/entity/ReportColumn.java
+++ b/src/main/java/com/product/server/report/entity/ReportColumn.java
@@ -1,10 +1,10 @@
 package com.product.server.report.entity;
 
+import cn.hutool.core.util.NumberUtil;
 import com.product.common.lang.StringUtils;
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * @Author cheng
@@ -36,17 +36,20 @@
 			Map<String, String> otherParams = this.otherParams;
 			this.otherParams = new HashMap<>();
 			otherParams.forEach((k, v) -> {
+				if ("rowspan".equals(v) && NumberUtil.isNumber(value) && k.equals(key)) {
+					this.rowspan = NumberUtil.parseInt(value);
+				}
 				this.otherParams.put(k.replace(key, value), v.replace(key, value));
 			});
 		}
-		if(!StringUtils.isEmpty(subReportProperty)){
-			subReportProperty=subReportProperty.replace(key,value);
+		if (!StringUtils.isEmpty(subReportProperty)) {
+			subReportProperty = subReportProperty.replace(key, value);
 		}
-		if(!StringUtils.isEmpty(penetrateProperty)){
-			penetrateProperty=penetrateProperty.replace(key,value);
+		if (!StringUtils.isEmpty(penetrateProperty)) {
+			penetrateProperty = penetrateProperty.replace(key, value);
 		}
-		if(!StringUtils.isEmpty(content)){
-			content=content.replace(key,value);
+		if (!StringUtils.isEmpty(content)) {
+			content = content.replace(key, value);
 		}
 	}
 
@@ -71,7 +74,14 @@
 	}
 
 	public String getContent() {
-		return content;
+		return getContent(false);
+	}
+
+	public String getContent(boolean emptyChar) {
+		if (emptyChar) {
+			return this.content == null ? "" : this.content;
+		}
+		return this.content;
 	}
 
 	public void setContent(String content) {
diff --git a/src/main/java/com/product/server/report/entity/ReportEntity.java b/src/main/java/com/product/server/report/entity/ReportEntity.java
index 23eeec5..7f7d080 100644
--- a/src/main/java/com/product/server/report/entity/ReportEntity.java
+++ b/src/main/java/com/product/server/report/entity/ReportEntity.java
@@ -27,6 +27,11 @@
 	private Map<String, Map<String, String>> filterInfo;
 	//瀛楁淇℃伅
 	private JSONArray systemFieldMeta;
+	//鎶ヨ〃閰嶇疆uuid
+	private String reportConfigUid;
+	//鎶ヨ〃鍚嶇О
+	private String reportName;
+
 
 
 	/************鍒嗛〉鍙傛暟*************/
@@ -37,7 +42,7 @@
 
 	private int pageIndex;
 
-	private int totalPage;
+	private int totalCount;
 
 	/************鍒嗛〉鍙傛暟************
 
@@ -126,6 +131,26 @@
 		this.systemFieldMeta = systemFieldMeta;
 	}
 
+	public void setEntityType(String entityType) {
+		this.entityType = entityType;
+	}
+
+	public String getReportConfigUid() {
+		return reportConfigUid;
+	}
+
+	public void setReportConfigUid(String reportConfigUid) {
+		this.reportConfigUid = reportConfigUid;
+	}
+
+	public String getReportName() {
+		return reportName;
+	}
+
+	public void setReportName(String reportName) {
+		this.reportName = reportName;
+	}
+
 	public boolean isPage() {
 		return isPage;
 	}
@@ -150,11 +175,11 @@
 		this.pageIndex = pageIndex;
 	}
 
-	public int getTotalPage() {
-		return totalPage;
+	public int getTotalCount() {
+		return totalCount;
 	}
 
-	public void setTotalPage(int totalPage) {
-		this.totalPage = totalPage;
+	public void setTotalCount(int totalCount) {
+		this.totalCount = totalCount;
 	}
 }
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 f239244..d5a3ac0 100644
--- a/src/main/java/com/product/server/report/service/CommonReportService.java
+++ b/src/main/java/com/product/server/report/service/CommonReportService.java
@@ -40,7 +40,6 @@
 	 * @param recordDte           涓氬姟鏁版嵁dte
 	 * @param totalStatisticsFlag 鏄惁鍚堣鏍囪瘑
 	 * @param reportConfigMap     鎶ヨ〃閰嶇疆缂撳瓨map
-	 * @param tableStyle
 	 * @return
 	 */
 	public ReportEntity getReportEntity(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap) {
@@ -64,7 +63,9 @@
 
 		if (!CollectionUtil.isEmpty(headTitleRows)) {
 			List<List<ReportColumn>> reportHeader = report.getReportHeader();
-			headTitleRows.addAll(reportHeader);
+			if (reportHeader != null) {
+				headTitleRows.addAll(reportHeader);
+			}
 			report.setReportHeader(headTitleRows);
 		}
 		if (!CollectionUtil.isEmpty(tailTitleRows)) {
@@ -298,7 +299,11 @@
 						}
 					}
 					paramKey = dataListReportService.concat(keyObj, CmnConst.ATTR_ROWSPAN);
-					column.setRowspan(NumberUtil.parseInt(paramKey));
+					if (NumberUtil.isNumber(paramKey)) {
+						column.setRowspan(NumberUtil.parseInt(paramKey));
+					} else {
+						column.addProperty(paramKey, "rowspan");
+					}
 					replaceMap.put(paramKey, "1");
 				}
 				// class
@@ -349,13 +354,14 @@
 		if (!StringUtils.isEmpty(totalName)) {
 			reportData.add(getDataAreaTotalStatistics(statisticsMap, dataAreaFieldConfigMap, dataAreaGroupFieldNameList, preFse, dataAreaGroupFieldRecordObj, totalName));
 		}
-		for (Map.Entry<String, String> entry : replaceMap.entrySet()) {
-			reportData.stream().forEach(item -> {
-				item.stream().forEach(column -> {
+		reportData.stream().forEach(item -> {
+			item.stream().forEach(column -> {
+				for (Map.Entry<String, String> entry : replaceMap.entrySet()) {
 					column.replace(entry.getKey(), entry.getValue());
-				});
+				}
 			});
-		}
+		});
+
 
 		return reportData;
 	}
diff --git a/src/main/java/com/product/server/report/service/DataListReportService.java b/src/main/java/com/product/server/report/service/DataListReportService.java
index ef59fc0..99f5050 100644
--- a/src/main/java/com/product/server/report/service/DataListReportService.java
+++ b/src/main/java/com/product/server/report/service/DataListReportService.java
@@ -1,5 +1,8 @@
 package com.product.server.report.service;
 
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.util.NumberUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
@@ -18,6 +21,7 @@
 import com.product.core.service.support.AbstractBaseService;
 import com.product.core.service.support.QueryFilterService;
 import com.product.core.spring.context.SpringMVCContextHolder;
+import com.product.module.data.service.SystemDataExportService;
 import com.product.server.report.config.CmnConst;
 import com.product.server.report.config.ReportCode;
 import com.product.server.report.entity.ReportColumn;
@@ -27,6 +31,9 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.text.DecimalFormat;
 import java.text.ParseException;
@@ -34,6 +41,7 @@
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 /**
  * Copyright 漏 6c
@@ -54,6 +62,107 @@
 	private QueryFilterService queryFilterService;
 	@Autowired
 	private RouterService routerService;
+	@Resource
+	private SystemDataExportService exportService;
+
+	public void outReportExcel(HttpServletResponse response, FieldSetEntity fse) throws BaseException, IOException {
+		ReportEntity reportEntity = getReportEntity(fse);
+		List<List<ReportColumn>> reportHeader = reportEntity.getReportHeader();
+
+		List<List<String>> headerTemp = processingMergeData(reportHeader);
+		List<List<String>> header = headerTemp.get(0).stream().map(item -> new ArrayList<String>()).collect(Collectors.toList());
+		int size = headerTemp.get(0).size();
+		for (int i = 0; i < size; i++) {
+			for (int k = 0; k < headerTemp.size(); k++) {
+				header.get(i).add(headerTemp.get(k).get(i));
+			}
+		}
+
+		List<List<ReportColumn>> reportData = reportEntity.getReportData();
+		if (!CollectionUtil.isEmpty(reportEntity.getReportTail())) {
+			reportData.addAll(reportEntity.getReportTail());
+		}
+
+		List<List<String>> data = processingMergeData(reportData);
+		exportService.writeExcel(header, data, "娴嬭瘯", response);
+	}
+
+
+	private static List<List<String>> processingMergeData(List<List<ReportColumn>> data) {
+		if (CollectionUtil.isEmpty(data)) {
+			return null;
+		}
+		List<List<String>> resultData = data.stream().map(item -> new ArrayList<String>()).collect(Collectors.toList());
+		for (int i = 0; i < data.size(); i++) {
+			List<ReportColumn> columns = data.get(i);
+			for (ReportColumn column : columns) {
+				//璺ㄨ
+				int rowspan = column.getRowspan() < 1 ? 1 : column.getRowspan();
+				//璺ㄥ垪
+				int colspan = column.getColspan() < 1 ? 1 : column.getColspan();
+				List<String> currentCell = new ArrayList<>();
+				for (int k = 0; k < colspan; k++) {
+					currentCell.add(column.getContent(true));
+				}
+				for (int j = 0; j < rowspan; j++) {
+					resultData.get(j + i).addAll(currentCell);
+				}
+				System.out.println(resultData);
+			}
+		}
+		return resultData;
+	}
+
+	public static void main(String[] args) {
+		List<List<ReportColumn>> data = new ArrayList<>();
+		List<ReportColumn> columns = new ArrayList<>();
+		ReportColumn column = new ReportColumn();
+		column.setRowspan(2);
+		column.setColspan(4);
+		column.setContent("璺ㄨ鏁帮細2锛岃法鍒楁暟锛�4");
+		columns.add(column);
+		data.add(columns);
+		columns = new ArrayList<>();
+		data.add(columns);
+		for (int i = 0; i < 3; i++) {
+			column = new ReportColumn();
+			column.setContent("璺ㄨ鏁帮細1锛岃法鍒楁暟锛�1,涓嬫爣:" + i);
+			columns.add(column);
+		}
+		processingMergeData(data);
+	}
+
+
+	/**
+	 * @param target
+	 * @param content
+	 * @param colspan
+	 * @param rowspan
+	 * @param currentColspan
+	 * @param currentRowsSpan
+	 */
+	private void rowspanAndColspan(String[][] target, String content, int colspan, int rowspan, int currentColspan, int currentRowsSpan) {
+		int k = currentColspan;
+		int i = currentRowsSpan;
+		if (colspan > 1) {
+			for (int j = 1; j < colspan; j++) {
+				int index = j + k;
+				while (target[i][index] != null) {
+					index++;
+				}
+				target[i][index] = content;
+			}
+		}
+		if (rowspan > 1) {
+			for (int j = 1; j < rowspan; j++) {
+				int index = i + k;
+				while (target[index][k] != null) {
+					index++;
+				}
+				target[index][k] = content;
+			}
+		}
+	}
 
 	/**
 	 * 鍔犺浇鎵�鏈夌紦瀛�
@@ -262,6 +371,7 @@
 		ReportEntity report = null;
 		String reportConfigUUID = fse.getUUID();
 		if (!StringUtils.isEmpty(fse.getString("~report_config_uuid~"))) {
+			//瀛愭姤琛ㄤ細浼犲叆姝ey浣滀负鎶ヨ〃鐨剈uid 瑙勯伩鍙傛暟涓湁uuid鐨刱ey
 			reportConfigUUID = fse.getString("~report_config_uuid~");
 		}
 		DataTableEntity reportConfigDte = DataPoolCacheImpl.getInstance().getCacheData(CmnConst.CACHE_REPORT_CONFIG, new String[]{reportConfigUUID});
@@ -387,15 +497,15 @@
 
 		if (CmnConst.REPORT_TYPE_COMMON.equals(reportType)) {
 			report = commonReportService.getReportEntity(recordDte, totalName, reportConfigMap);
-			//TODO
 			report.setFilterInfo(outerMap);
 		} else if (CmnConst.REPORT_TYPE_GROUP.equals(reportType)) {
 			// 鐗规畩澶勭悊棰濆鏌ヨ鍐呭
 			recordDte.addFieldSetEntity(getRecordDte(sort, curPage, reportSourceFse, fse, reportConfigFse, reportConfigMap));
+			report = groupReportService.getReportEntity(recordDte, totalName, reportConfigMap);
 //			resultObj.putAll(groupReportService.getReport(recordDte, totalName, reportConfigMap, tableStyle));
 		}
-		//TODO
-
+		report.setReportConfigUid(reportConfigFse.getUUID());
+		report.setReportName(reportConfigFse.getString(CmnConst.REPORT_NAME));
 //		report.setFilterInfo(outerMap);
 		if (CmnConst.FALSE.equals(resultObj.getString(CmnConst.RETURN_ATTR_RESULT))) {
 			resultObj.put(CmnConst.RETURN_ATTR_RESULT, true);
@@ -405,7 +515,7 @@
 			SQLEntity sqlEntity = recordDte.getSqle();
 			if ("1".equals(reportConfigFse.getString(CmnConst.IS_PAGE)) && sqlEntity != null) {
 				report.setPage(true);
-				report.setTotalPage(sqlEntity.getTotalpage());
+				report.setTotalCount(sqlEntity.getTotalCount());
 				report.setPageSize(StringUtils.isEmpty(reportConfigFse.getString(CmnConst.PAGE_SIZE)) ? 0 : reportConfigFse.getInteger(CmnConst.PAGE_SIZE));
 				report.setPageIndex(curPage);
 //				resultObj.put(CmnConst.IS_PAGE, 1);
@@ -421,7 +531,7 @@
 		report.setSystemFieldMeta(getSearchInfo(reportSourceFse.getUUID()));
 		report.setReportType(reportConfigFse.getString("type_uuid"));
 //		resultObj.put("systemFieldMeta", );
-		resultObj.put("report_type", reportConfigFse.getString("type_uuid"));
+//		resultObj.put("report_type", reportConfigFse.getString("type_uuid"));
 //        System.out.println(resultObj.getString("html"));
 
 		return report;
@@ -628,7 +738,9 @@
 	 * @param reportConfigFse
 	 * @return
 	 */
-	private DataTableEntity getRecordDte(StringBuilder sort, int curPage, FieldSetEntity reportSourceFse, FieldSetEntity fse, FieldSetEntity reportConfigFse, Map<Integer, List<JSONObject>> reportConfigMap) {
+	private DataTableEntity getRecordDte(StringBuilder sort, int curPage, FieldSetEntity
+			reportSourceFse, FieldSetEntity fse, FieldSetEntity
+												 reportConfigFse, Map<Integer, List<JSONObject>> reportConfigMap) {
 		boolean spTimeFlag = reportConfigMap != null;
 		String sql;
 		String sqlText = reportSourceFse.getString(CmnConst.SQL_TEXT);
@@ -766,7 +878,8 @@
 	 * @param sort
 	 * @return
 	 */
-	private String replaceSqlContent(String sqlText, FieldSetEntity fse, StringBuilder sort, FieldSetEntity reportConfigFse, int curPage, String selectedFields, Map<String, List<String>> queryFilterMap) {
+	private String replaceSqlContent(String sqlText, FieldSetEntity fse, StringBuilder sort, FieldSetEntity
+			reportConfigFse, int curPage, String selectedFields, Map<String, List<String>> queryFilterMap) {
 		queryFilterMap = queryFilterMap == null ? queryFilterService.getQueryFilterMore(fse) : queryFilterMap;
 		selectedFields = StringUtils.isEmpty(selectedFields) ? "*" : selectedFields;
 		// 鏇挎崲sql涓殑绯荤粺鍙傛暟
@@ -841,7 +954,8 @@
 		return sql.toString();
 	}
 
-	private String replaceSqlContent(String sqlText, FieldSetEntity fse, StringBuilder sort, FieldSetEntity reportConfigFse, int curPage) {
+	private String replaceSqlContent(String sqlText, FieldSetEntity fse, StringBuilder sort, FieldSetEntity
+			reportConfigFse, int curPage) {
 		return replaceSqlContent(sqlText, fse, sort, reportConfigFse, curPage, null, null);
 	}
 
@@ -854,7 +968,8 @@
 	 * @param queryFilterMap
 	 * @return
 	 */
-	private String spReplaceSqlContent(String suitContent, String regexp, int num, Map<String, List<String>> queryFilterMap, Map<String, List<String>> residueQueryFilterMap) {
+	private String spReplaceSqlContent(String suitContent, String regexp, int num, Map<
+			String, List<String>> queryFilterMap, Map<String, List<String>> residueQueryFilterMap) {
 		List<String> innerSuitList = getSuitContent(suitContent, regexp);
 		String curField;
 		String filter;
@@ -933,7 +1048,9 @@
 	 * @param queryFilterMap
 	 * @param curFieldName
 	 */
-	private void spDealFilterForLastYear(Map<String, List<String>> tempQueryFilterMap, Map<String, List<String>> queryFilterMap, String curFieldName) {
+	private void spDealFilterForLastYear
+	(Map<String, List<String>> tempQueryFilterMap, Map<String, List<String>> queryFilterMap, String
+			curFieldName) {
 		List<String> paramList = tempQueryFilterMap.get(curFieldName);
 		for (int i = 0; i < paramList.size(); i++) {
 			paramList.set(i, paramList.get(i).replace("str_to_date(", "date_add(str_to_date(")
@@ -954,7 +1071,9 @@
 	 * @param queryFilterMap
 	 * @param curFieldName
 	 */
-	private void spDealFilterForPrePeriod(Map<String, List<String>> tempQueryFilterMap, Map<String, List<String>> queryFilterMap, String curFieldName) {
+	private void spDealFilterForPrePeriod
+	(Map<String, List<String>> tempQueryFilterMap, Map<String, List<String>> queryFilterMap, String
+			curFieldName) {
 		List<String> paramList = tempQueryFilterMap.get(curFieldName);
 		String[] timeArr = paramList.get(0).split("~");
 		try {
@@ -987,7 +1106,8 @@
 	 * @param dataList
 	 * @return
 	 */
-	private Set<String> getFieldAndSpTimeStatisticsTypeSet(Set<String> baseFieldSet, Map<String, Map<String, JSONObject>> spTimeStatisticsFieldMap, List<JSONObject> dataList) {
+	private Set<String> getFieldAndSpTimeStatisticsTypeSet
+	(Set<String> baseFieldSet, Map<String, Map<String, JSONObject>> spTimeStatisticsFieldMap, List<JSONObject> dataList) {
 		Set<String> spTimeStatisticsTypeSet = Sets.newHashSet();
 		JSONObject curFieldObj;
 		String fieldName;
@@ -1133,7 +1253,8 @@
 	 * @param locationType            浣嶇疆绫诲瀷锛宧ead-澶撮儴锛宼ail-灏鹃儴
 	 * @return
 	 */
-	public StringBuilder getTitleHtml(List<JSONObject> list, int totalColCount, Map<String, Set<String>> headAndTailTitleDataMap, String locationType) {
+	public StringBuilder getTitleHtml(List<JSONObject> list, int totalColCount, Map<
+			String, Set<String>> headAndTailTitleDataMap, String locationType) {
 		StringBuilder html = new StringBuilder(1024);
 		int colspan;
 		int preRow = 0;
@@ -1201,16 +1322,17 @@
 	 * @param locationType            浣嶇疆绫诲瀷锛宧ead-澶撮儴锛宼ail-灏鹃儴
 	 * @return
 	 */
-	public List<List<ReportColumn>> getTitle(List<JSONObject> list, int totalColCount, Map<String, Set<String>> headAndTailTitleDataMap, String locationType) {
+	public List<List<ReportColumn>> getTitle(List<JSONObject> list, int totalColCount, Map<
+			String, Set<String>> headAndTailTitleDataMap, String locationType) {
 		List<List<ReportColumn>> row = new ArrayList<>();
-		StringBuilder html = new StringBuilder(1024);
+//		StringBuilder html = new StringBuilder(1024);
 		int colspan;
 		int preRow = 0;
 		int preCol = 0;
 		int curRow;
 		int curCol;
 		String value;
-		String style;
+//		String style;
 
 		List<ReportColumn> reportColumns = new ArrayList<>();
 		for (JSONObject singleObj : list) {
@@ -1220,22 +1342,26 @@
 			colspan = colspan < 0 ? totalColCount : Math.max(1, colspan);
 			value = replaceFormDataAndSysData(singleObj.getString(CmnConst.ATTR_SHOW_NAME), headAndTailTitleDataMap, singleObj);
 			value = value == null ? "" : value;
-			if ("1".equals(singleObj.getString(CmnConst.ATTR_IS_TITLE))) {
-				style = " class=\"" + CmnConst.CLASS_TR_REPORT_TITLE + "\"";
-			} else {
-				if ("head".equals(locationType)) {
-					style = " class=\"" + CmnConst.CLASS_TR_HEAD + "\"";
-				} else {
-					style = " class=\"" + CmnConst.CLASS_TR_TAIL + "\"";
-				}
-			}
+//			if ("1".equals(singleObj.getString(CmnConst.ATTR_IS_TITLE))) {
+//				style = " class=\"" + CmnConst.CLASS_TR_REPORT_TITLE + "\"";
+//			} else {
+//				if ("head".equals(locationType)) {
+//					style = " class=\"" + CmnConst.CLASS_TR_HEAD + "\"";
+//				} else {
+//					style = " class=\"" + CmnConst.CLASS_TR_TAIL + "\"";
+//				}
+//			}
 			if (preRow < curRow) {
-				if (preRow != 0) {
-					row.add(getAimNumTdPlaceholderColumn(totalColCount - preCol, 1));
+				if(!reportColumns.isEmpty()){
+					row.add(reportColumns);
+					reportColumns=new ArrayList<>();
 				}
-				if (preRow == 0 && preCol == 0 && preCol < curCol - 1) {
-					row.add(getAimNumTdPlaceholderColumn(curCol - preCol - 1, 1));
-				}
+//				if (preRow != 0) {
+//					row.add(getAimNumTdPlaceholderColumn(totalColCount - preCol, 1));
+//				}
+//				if (preRow == 0 && preCol == 0 && preCol < curCol - 1) {
+//					row.add(getAimNumTdPlaceholderColumn(curCol - preCol - 1, 1));
+//				}
 				preCol = curCol;
 			}
 			if (preCol < curCol - 1) {
@@ -1255,7 +1381,7 @@
 			}
 		}
 		row.add(reportColumns);
-		reportColumns.addAll(getAimNumTdPlaceholderColumn(totalColCount - preCol, 1));
+//		reportColumns.addAll(getAimNumTdPlaceholderColumn(totalColCount - preCol, 1));
 //		row.add();
 		return row;
 	}
@@ -1295,7 +1421,8 @@
 	 * @param lastStageFlag          鏄惁鏈骇锛堟暟鎹尯鍒嗙粍瀛楁鏈骇鍜屽垎缁勮〃澶村尯瀛楁閮芥槸鏈骇鎵嶄负鏈骇锛�
 	 * @return
 	 */
-	public JSONObject getStatisticsValueObj(JSONObject valueJsonObject, JSONObject dataAreaFieldConfigObj, String actualValue, String type, boolean lastStageFlag) {
+	public JSONObject getStatisticsValueObj(JSONObject valueJsonObject, JSONObject dataAreaFieldConfigObj, String
+			actualValue, String type, boolean lastStageFlag) {
 		if (valueJsonObject == null) {
 			valueJsonObject = new JSONObject();
 		}
@@ -1356,7 +1483,8 @@
 	 * @param set
 	 * @param recordFse
 	 */
-	public void getHeadAndTailTitleDataMap(Map<String, Set<String>> headAndTailTitleDataMap, Set<String> set, FieldSetEntity recordFse) {
+	public void getHeadAndTailTitleDataMap
+	(Map<String, Set<String>> headAndTailTitleDataMap, Set<String> set, FieldSetEntity recordFse) {
 		for (String fieldName : set) {
 			headAndTailTitleDataMap.computeIfAbsent(fieldName, k -> Sets.newLinkedHashSet()).add(recordFse.getString(fieldName));
 		}
@@ -1498,6 +1626,10 @@
 		return dealedValueSb.toString();
 	}
 
+	public int dealColumnWidth(JSONObject dataAreaFieldConfigObj) {
+		return NumberUtil.isNumber(dataAreaFieldConfigObj.getString(CmnConst.ATTR_WIDTH)) ? NumberUtil.parseInt(dataAreaFieldConfigObj.getString(CmnConst.ATTR_WIDTH)) : 0;
+	}
+
 	/**
 	 * 鑾峰彇td鐨勫睘鎬�
 	 *
@@ -1577,7 +1709,8 @@
 	 * @param singleObj
 	 * @return
 	 */
-	public String replaceFormDataAndSysData(String str, Map<String, Set<String>> headAndTailTitleDataMap, JSONObject singleObj) {
+	public String replaceFormDataAndSysData(String
+													str, Map<String, Set<String>> headAndTailTitleDataMap, JSONObject singleObj) {
 		if (StringUtils.isEmpty(str)) {
 			return "";
 		}
@@ -1825,7 +1958,8 @@
 	 * @param type      绫诲瀷锛�1-鑾峰彇鐩爣灞炴�э紝鍏朵粬-鎺掗櫎鐩爣灞炴��
 	 * @return
 	 */
-	public JSONObject extendJSONObject(JSONObject aimObj, JSONObject sourceObj, Collection<String> aimAttr, int type) {
+	public JSONObject extendJSONObject(JSONObject aimObj, JSONObject sourceObj, Collection<String> aimAttr,
+									   int type) {
 		if (aimObj == null) {
 			aimObj = new JSONObject();
 		}
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 59fa0b1..6caf017 100644
--- a/src/main/java/com/product/server/report/service/GroupReportService.java
+++ b/src/main/java/com/product/server/report/service/GroupReportService.java
@@ -11,6 +11,7 @@
 import com.product.core.spring.context.SpringMVCContextHolder;
 import com.product.server.report.config.CmnConst;
 import com.product.server.report.entity.ReportColumn;
+import com.product.server.report.entity.ReportEntity;
 import com.product.util.BaseUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -35,32 +36,33 @@
 	 * @param recordDte       涓氬姟鏁版嵁dte
 	 * @param totalName       鎬昏鍚嶇О
 	 * @param reportConfigMap 鎶ヨ〃閰嶇疆缂撳瓨map
-	 * @param tableStyle
 	 * @return 鑾峰彇鍒嗙粍鎶ヨ〃鐨勮鎯�
 	 */
-	public JSONObject getReportEntity(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap, StringBuilder tableStyle) {
-		StringBuilder reportHtml = new StringBuilder(4096);
-
+	public ReportEntity getReportEntity(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap) {
+//		StringBuilder reportHtml = new StringBuilder(4096);
+		ReportEntity report = new ReportEntity();
 		// css
 //        StringBuilder cssHtml = dataListReportService.getCssHtml();
 
 		// 鍒嗙粍琛ㄥご鍖哄拰鏁版嵁鍖�
-		StringBuilder groupAndDataAreaHtml = new StringBuilder(1024);
+//		StringBuilder groupAndDataAreaHtml = new StringBuilder(1024);
+		List<List<ReportColumn>>[] rows = new List[2];
 		Map<String, Set<String>> headAndTailTitleDataMap = Maps.newHashMap();
 		int totalColCount = reportConfigMap.get(0).size();
-		int dataAreaColCount = getGroupAndDataAreaHtmlAndReturnDataAreaColCount(groupAndDataAreaHtml, reportConfigMap, headAndTailTitleDataMap, recordDte, totalName);
+		int dataAreaColCount = getGroupAndDataAreaAndReturnDataAreaColCount(rows, reportConfigMap, headAndTailTitleDataMap, recordDte, totalName);
 		totalColCount = Math.max(totalColCount, dataAreaColCount);
 
 		// 澶撮儴鏍囬鍖�
-		StringBuilder headTitleHtml = null;
+
+		List<List<ReportColumn>> headTitle = null;
 		if (!reportConfigMap.get(1).isEmpty()) {
-			headTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head");
+			headTitle = dataListReportService.getTitle(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head");
 		}
 
 		// 搴曢儴鏍囬鍖�
-		StringBuilder tailTitleHtml = null;
+		List<List<ReportColumn>> tailTitle = null;
 		if (!reportConfigMap.get(3).isEmpty()) {
-			tailTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail");
+			tailTitle = dataListReportService.getTitle(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail");
 		}
 
 //        reportHtml.append("\n<body>\n<table").append(tableStyle).append(">")
@@ -70,11 +72,17 @@
 //                .append(tailTitleHtml == null ? "" : tailTitleHtml)
 //                .append("\n</table>\n</body>");
 
-		JSONObject resultObj = new JSONObject();
-		resultObj.put(CmnConst.RETURN_ATTR_RESULT, true);
-		resultObj.put(CmnConst.RETURN_ATTR_MESSAGE, "鑾峰彇鎶ヨ〃鎴愬姛锛�");
-		resultObj.put(CmnConst.RETURN_ATTR_HTML, reportHtml);
-		return resultObj;
+		if (rows[0] != null) {
+			if (headTitle == null) {
+				headTitle = new ArrayList<>();
+			}
+			headTitle.addAll(rows[0]);
+		}
+		report.setReportHeader(headTitle);
+
+		report.setReportData(rows[1]);
+		report.setReportTail(tailTitle);
+		return report;
 	}
 
 	/**
@@ -244,7 +252,7 @@
 	 * @param totalName               鎬昏鍚嶇О
 	 * @return 鏁版嵁鍖烘�诲垪鏁�
 	 */
-	private int getGroupAndDataAreaAndReturnDataAreaColCount(List<List<ReportColumn>> groupAndDataArea, Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName) {
+	private int getGroupAndDataAreaAndReturnDataAreaColCount(List<List<ReportColumn>>[] groupAndDataArea, Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName) {
 		// 鍒嗙粍琛ㄥご鍖哄瓧娈电紦瀛榤ap
 		Map<String, JSONObject> groupAreaFieldConfigMap = dataListReportService.groupAndDataJSONObject2Map(reportConfigMap.get(2));
 		// 鏁版嵁鍖哄瓧娈电紦瀛榤ap
@@ -336,9 +344,9 @@
 		// 鏁版嵁鏍囬list
 		List<JSONObject> dataTitleList = Lists.newArrayList();
 		// 鑾峰彇鏍囬html
-		groupAndDataArea.addAll(getDataAreaTitle(dataTitleList, groupAreaFieldRecordObj, dataAreaFieldConfigMap, groupAreaRangeObj, dataAreaCommonStatisticsFieldNameList));
+		groupAndDataArea[0] = (getDataAreaTitle(dataTitleList, groupAreaFieldRecordObj, dataAreaFieldConfigMap, groupAreaRangeObj, dataAreaCommonStatisticsFieldNameList));
 		// 鑾峰彇鍐呭html
-//		groupAndDataAreaHtml.append(getDataAreaDataHtml(dataTitleList, dataAreaFieldRecordObj, statisticsMap, totalName, dataAreaGroupFieldNameList, dataAreaFieldConfigMap));
+		groupAndDataArea[1] = (getDataAreaData(dataTitleList, dataAreaFieldRecordObj, statisticsMap, totalName, dataAreaGroupFieldNameList, dataAreaFieldConfigMap));
 
 		return totalColCount;
 	}
@@ -723,14 +731,15 @@
 			List<ReportColumn> columns = new ArrayList<>();
 //			html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_TITLE).append("\">\n    ");
 			for (JSONObject dataTitleObj : rowList) {
+				ReportColumn column = new ReportColumn();
 				rowspan = Math.max(1, dataTitleObj.getIntValue(CmnConst.ATTR_ROWSPAN));
 				colspan = Math.max(1, dataTitleObj.getIntValue(CmnConst.ATTR_COLSPAN));
 				value = dataTitleObj.getString(CmnConst.ATTR_SHOW_NAME);
 				if (!StringUtils.isEmpty(dataTitleObj.getString(CmnConst.ATTR_FIELD_INFO))) {
 					dataAreaFieldName = dataListReportService.fieldInfo2FieldName(dataTitleObj.getString(CmnConst.ATTR_FIELD_INFO));
-					value = dataListReportService.dealTdWidth(dataAreaFieldConfigMap.get(dataAreaFieldName), value);
+					column.setColumnWidth(dataListReportService.dealColumnWidth(dataAreaFieldConfigMap.get(dataAreaFieldName)));
+//					value = dataListReportService.dealTdWidth(dataAreaFieldConfigMap.get(dataAreaFieldName), value);
 				}
-				ReportColumn column = new ReportColumn();
 				column.setRowspan(rowspan);
 				column.setColspan(colspan);
 				column.setContent(value);
@@ -1046,7 +1055,7 @@
 	private List<List<ReportColumn>> getDataAreaData(List<JSONObject> dataTitleList, JSONObject dataAreaFieldRecordObj, Map<JSONObject, JSONObject> statisticsMap, String totalName, List<String> dataAreaGroupFieldNameList, Map<String, JSONObject> dataAreaFieldConfigMap) {
 		List<List<JSONObject>> dataAreaGroupFieldDataList = Lists.newArrayList();
 		getDataAreaGroupFieldDataList(dataAreaFieldRecordObj, dataAreaGroupFieldDataList, new JSONObject(), 1, 1, dataAreaGroupFieldNameList.size(), null);
-
+		List<List<ReportColumn>> dataRows = new ArrayList<>();
 		List<JSONObject> groupTitleList = Lists.newArrayList();
 		JSONObject obj;
 		for (List<JSONObject> rowList : dataAreaGroupFieldDataList) {
@@ -1054,7 +1063,7 @@
 			groupTitleList.add(obj);
 		}
 
-		StringBuilder html = new StringBuilder(1024);
+//		StringBuilder html = new StringBuilder(1024);
 		JSONObject dataAreaGroupFieldObj;
 		int rowspan;
 		int colspan;
@@ -1069,6 +1078,7 @@
 		List<JSONObject> curRowList;
 		int index;
 		for (int i = 0; i < dataAreaGroupFieldDataList.size(); i++) {
+			List<ReportColumn> columns = new ArrayList<>();
 			index = 0;
 			curRowList = dataAreaGroupFieldDataList.get(i);
 			if (!curRowList.isEmpty()) {
@@ -1077,22 +1087,28 @@
 					if (dataAreaGroupFieldObj.isEmpty()) {
 						continue;
 					}
-					if (index == 0) {
-						if ("1".equals(dataAreaGroupFieldObj.getString(CmnConst.ATTR_IS_STATISTICS_FIELD))) {
-							html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n    ");
-						} else {
-							html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_COMMON).append("\">\n    ");
-						}
-					}
+//					if (index == 0) {
+//						if ("1".equals(dataAreaGroupFieldObj.getString(CmnConst.ATTR_IS_STATISTICS_FIELD))) {
+//							html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n    ");
+//						} else {
+//							html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_COMMON).append("\">\n    ");
+//						}
+//					}
 					rowspan = Math.max(1, dataAreaGroupFieldObj.getIntValue(CmnConst.ATTR_ROWSPAN));
 					colspan = Math.max(1, dataAreaGroupFieldObj.getIntValue(CmnConst.ATTR_COLSPAN));
 					value = dataAreaGroupFieldObj.getString(CmnConst.ATTR_SHOW_NAME);
-					html.append("<td rowspan=\"").append(rowspan).append("\" colspan=\"").append(colspan).append("\">").append(value == null ? "" : value).append("</td>");
+					ReportColumn column = new ReportColumn();
+					column.setRowspan(rowspan);
+					column.setColspan(colspan);
+					column.setContent(value);
+					columns.add(column);
+//					html.append("<td rowspan=\"").append(rowspan).append("\" colspan=\"").append(colspan).append("\">").append(value == null ? "" : value).append("</td>");
 					index++;
 				}
-			} else {
-				html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_COMMON).append("\">\n    ");
 			}
+//			else {
+//				html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_COMMON).append("\">\n    ");
+//			}
 			groupTitleObj = groupTitleList.get(i);
 			for (JSONObject dataTitleObj : dataTitleList) {
 				keyObj = dataListReportService.extendJSONObject((JSONObject) groupTitleObj.clone(), dataTitleObj, Arrays.asList(CmnConst.ATTR_ROWSPAN, CmnConst.ATTR_COLSPAN, CmnConst.ATTR_SHOW_NAME, CmnConst.ATTR_IS_STATISTICS_FIELD, CmnConst.ATTR_REAL_VALUE), -1);
@@ -1122,31 +1138,43 @@
 				} else {
 					value = "";
 				}
-				html.append("<td");
+//				html.append("<td");
+				ReportColumn column = new ReportColumn();
 				if (!StringUtils.isEmpty(value)) {
 					// class
 					if (!StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL))) {
 						dataListReportService.extendJSONObject(keyObj, dataAreaFieldConfigObj, Collections.singletonList(CmnConst.ATTR_URL));
-						html.append(" class=\"").append(CmnConst.CLASS_TD_CAN_TURN).append("\"");
+//						html.append(" class=\"").append(CmnConst.CLASS_TD_CAN_TURN).append("\"");
 					}
 					// 瀛楁灞炴��
 					dataListReportService.getTdAttrObj(keyObj, groupTitleObj);
 					dataListReportService.getTdAttrObj(keyObj, dataTitleObj);
-					html.append(dataListReportService.getTdAttrByObj(keyObj));
+					String attrUrL = keyObj.getString(CmnConst.ATTR_URL);
+					if (!StringUtils.isEmpty(attrUrL)) {
+						column.setPenetrateProperty(attrUrL.toString());
+						column.setPenetrate(true);
+					}
+					for (String key : keyObj.keySet()) {
+						column.addProperty(key, keyObj.getString(key));
+					}
+//					html.append(dataListReportService.getTdAttrByObj(keyObj));
 					// 鏍煎紡
 					value = dataListReportService.formatValue(dataAreaFieldConfigObj, value);
 				}
-				html.append(">").append(value == null ? "" : value).append("</td>");
+//				html.append(">").append(value == null ? "" : value).append("</td>");
+				column.setContent(value);
+				columns.add(column);
 			}
-			html.append("\n</tr>");
+//			html.append("\n</tr>");
+			dataRows.add(columns);
 		}
 
 		// 鎬昏
 		if (!StringUtils.isEmpty(totalName)) {
-			html.append(getTotalStatisticsHtml(statisticsMap, dataTitleList, dataAreaFieldConfigMap, dataAreaGroupFieldNameList.size(), getSubCnt(dataAreaFieldRecordObj), totalName));
+			dataRows.add(getTotalStatistics(statisticsMap, dataTitleList, dataAreaFieldConfigMap, dataAreaGroupFieldNameList.size(), getSubCnt(dataAreaFieldRecordObj), totalName));
 		}
 
-		return null;
+		return dataRows;
 	}
 
 	/**
@@ -1260,6 +1288,86 @@
 	 * @param totalName               鎬昏鍚嶇О
 	 * @return
 	 */
+	private List<ReportColumn> getTotalStatistics(Map<JSONObject, JSONObject> statisticsMap, List<JSONObject> dataTitleList, Map<String, JSONObject> dataAreaFieldConfigMap, int dataAreaGroupFieldCount, int dataAreaSubCnt, String totalName) {
+		List<ReportColumn> columns = new ArrayList<>();
+//		StringBuilder html = new StringBuilder(256);
+//		html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n    ");
+//		html.append("<td colspan=\"").append(dataAreaGroupFieldCount).append("\">").append(totalName).append("</td>");
+		ReportColumn column = new ReportColumn();
+		columns.add(column);
+		column.setColspan(dataAreaGroupFieldCount);
+		column.setContent(totalName);
+		JSONObject dataTitleObj;
+		JSONObject keyObj;
+		JSONObject dataAreaFieldConfigObj;
+		String statisticsType;
+		JSONObject valueObj;
+		String value;
+		int groupAreaSubCnt;
+		for (int i = 0; i < dataTitleList.size(); i++) {
+			column = new ReportColumn();
+			columns.add(column);
+			dataTitleObj = dataTitleList.get(i);
+			keyObj = dataListReportService.extendJSONObject(null, dataTitleObj, Arrays.asList(CmnConst.ATTR_ROWSPAN, CmnConst.ATTR_COLSPAN, CmnConst.ATTR_SHOW_NAME, CmnConst.ATTR_IS_STATISTICS_FIELD, CmnConst.ATTR_REAL_VALUE), -1);
+			dataAreaFieldConfigObj = dataAreaFieldConfigMap.get(dataListReportService.fieldInfo2FieldName(dataTitleObj.getString(CmnConst.ATTR_FIELD_INFO)));
+			if (dataAreaFieldConfigObj != null) {
+				groupAreaSubCnt = keyObj.getIntValue(CmnConst.ATTR_GROUP_AREA_SUB_CNT);
+				keyObj.remove(CmnConst.ATTR_GROUP_AREA_SUB_CNT);
+				statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS);
+				valueObj = statisticsMap.get(keyObj);
+				if (valueObj == null || valueObj.isEmpty()) {
+					value = getFinalValue(keyObj, dataAreaFieldConfigObj, statisticsMap);
+				} else {
+					if (CmnConst.ATTR_STATISTICS_AVG.equals(statisticsType) && "1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_AVG_TYPE))) {
+						value = getTwoTypesGroupAvgStatisticsValue(dataAreaSubCnt, groupAreaSubCnt, valueObj, dataAreaFieldConfigObj, statisticsType);
+					} else {
+						value = valueObj.getString(statisticsType);
+					}
+					valueObj.put(CmnConst.ATTR_FINAL_VALUE, value);
+				}
+			} else {
+				value = "";
+			}
+//			html.append("<td");
+			if (!StringUtils.isEmpty(value)) {
+				// class
+				if (!StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL))) {
+					dataListReportService.extendJSONObject(keyObj, dataAreaFieldConfigObj, Collections.singletonList(CmnConst.ATTR_URL));
+//					html.append(" class=\"").append(CmnConst.CLASS_TD_CAN_TURN).append("\"");
+				}
+				// 瀛楁灞炴��
+				dataListReportService.getTdAttrObj(keyObj, dataTitleObj);
+				String attrUrL = keyObj.getString(CmnConst.ATTR_URL);
+				if (!StringUtils.isEmpty(attrUrL)) {
+					column.setPenetrateProperty(attrUrL.toString());
+					column.setPenetrate(true);
+				}
+				for (String key : keyObj.keySet()) {
+					column.addProperty(key, keyObj.getString(key));
+				}
+//				html.append(dataListReportService.getTdAttrByObj(keyObj));
+				// 鏍煎紡
+				value = dataListReportService.formatValue(dataAreaFieldConfigObj, value);
+
+			}
+			column.setContent(value);
+//			html.append(">").append(value == null ? "" : value).append("</td>");
+		}
+//		html.append("\n</tr>");
+		return columns;
+	}
+
+	/**
+	 * 鑾峰彇鎬昏html
+	 *
+	 * @param statisticsMap           缁熻map
+	 * @param dataTitleList           鏁版嵁鏍囬list
+	 * @param dataAreaFieldConfigMap  鏁版嵁鍖哄瓧娈电紦瀛榤ap
+	 * @param dataAreaGroupFieldCount 鏁版嵁鍖哄垎缁勫瓧娈典釜鏁�
+	 * @param dataAreaSubCnt          鏁版嵁鍖轰笅绾у垎缁勯」鏁�
+	 * @param totalName               鎬昏鍚嶇О
+	 * @return
+	 */
 	private StringBuilder getTotalStatisticsHtml(Map<JSONObject, JSONObject> statisticsMap, List<JSONObject> dataTitleList, Map<String, JSONObject> dataAreaFieldConfigMap, int dataAreaGroupFieldCount, int dataAreaSubCnt, String totalName) {
 		StringBuilder html = new StringBuilder(256);
 		html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n    ");
diff --git a/src/main/java/com/product/server/report/service/ListReportConfigServiceImple.java b/src/main/java/com/product/server/report/service/ListReportConfigServiceImple.java
index c65054e..c7d3c5c 100644
--- a/src/main/java/com/product/server/report/service/ListReportConfigServiceImple.java
+++ b/src/main/java/com/product/server/report/service/ListReportConfigServiceImple.java
@@ -15,7 +15,7 @@
 
 @Service
 public class ListReportConfigServiceImple implements ListReportConfigService {
-	
+
 	@Autowired
 	public BaseDao baseDao;
 	public BaseDao getBaseDao() {
@@ -25,7 +25,7 @@
 		this.baseDao = baseDao;
 	}
 	public ListReportServer reportServerNew;
-	
+
 	public ListReportServer getReportServerNew() {
 		return reportServerNew;
 	}
@@ -81,7 +81,7 @@
 				}else{
 					showGroupField[i] = false;//鏄惁鍒嗙粍
 				}
-			} 
+			}
 			//鏄惁鍥哄畾琛ㄥご
 			if(felset.getString("fix_header").equals("1")){
 				rc.setFixHeader(true);
@@ -101,7 +101,7 @@
 //			}else{
 //				rc.setPage(false);
 //			}
-			DataTableEntity headerData = baseDao.listTable("product_sys_report_header_properties", "report_uuid = '"+tableUuid+"'");			
+			DataTableEntity headerData = baseDao.listTable("product_sys_report_header_properties", "report_uuid = '"+tableUuid+"'");
 			if(headerData.getRows() > 0){
 				int headerY = headerData.getRows() / fieldData.getRows();//浜岀淮鏁扮粍y
 				int[][] headerColspan = new int[headerY][fieldData.getRows()];//璺ㄥ垪
@@ -114,7 +114,7 @@
 							//鍒楀彂鐢熸敼鍙�
 				            if(y != Integer.parseInt(header.getString("header_index").split("-")[1])){
 				                y = Integer.parseInt(header.getString("header_index").split("-")[1]);
-				               
+
 				            }
 				            headerTitle[y][x] = header.getString("header_name");
 				            headerColspan[y][x] = Integer.parseInt(header.getString("header_colspan"));
@@ -138,10 +138,10 @@
 			rc.setFormat(showFormat);//瀛楁鏍煎紡
 			rc.setGroupField(showGroupField);//鏄惁鍒嗙粍
 		}
-		
+
 		System.out.println(data.getRows());
 //		rc.setCurrentPage(1);//褰撳墠椤�
-//		rc.setTotalPage(data.getRows() / felset.getInteger("page_size"));//鎬婚〉鏁�
+//		rc.setTotalCount(data.getRows() / felset.getInteger("page_size"));//鎬婚〉鏁�
 //		rc.setTotalRow(data.getRows());//鎬绘潯鏁�
 		rc.setDt(data);
 		System.out.println(rc.getDt().getRows());

--
Gitblit v1.9.2