pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/product/server/report/controller/DataListReportController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/product/server/report/entity/ReportColumn.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/product/server/report/entity/ReportEntity.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/product/server/report/service/CommonReportService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/product/server/report/service/DataListReportService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/product/server/report/service/GroupReportService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/product/server/report/service/ListReportConfigServiceImple.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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> 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 @@ -30,7 +43,6 @@ public class DataListReportController extends AbstractBaseController { @Autowired private DataListReportService dataListReportService; /** @@ -77,7 +89,7 @@ */ @RequestMapping(value = "/get-report/{version}", method = RequestMethod.POST) @ApiVersion(1) public String getTableInfo(HttpServletRequest request) { public String getReport(HttpServletRequest request) { try { FieldSetEntity fse = null; Object bean = request.getAttribute(CoreConst.API_POST_REQUEST_DATA); @@ -99,4 +111,34 @@ 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()); } } } 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,6 +36,9 @@ 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)); }); } @@ -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) { 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; } } 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(); if (reportHeader != null) { headTitleRows.addAll(reportHeader); } report.setReportHeader(headTitleRows); } if (!CollectionUtil.isEmpty(tailTitleRows)) { @@ -298,7 +299,11 @@ } } paramKey = dataListReportService.concat(keyObj, CmnConst.ATTR_ROWSPAN); 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 -> { for (Map.Entry<String, String> entry : replaceMap.entrySet()) { column.replace(entry.getKey(), entry.getValue()); }); }); } }); }); return reportData; } 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~"))) { //子报表会传入此key作为报表的uuid 规避参数中有uuid的key 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 位置类型,head-头部,tail-尾部 * @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 位置类型,head-头部,tail-尾部 * @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(); } src/main/java/com/product/server/report/service/GroupReportService.java
@@ -11,6 +11,7 @@ import com.product.core.spring.context.SpringMVCContextHolder; import com.product.server.report.config.CmnConst; import com.product.server.report.entity.ReportColumn; import com.product.server.report.entity.ReportEntity; import com.product.util.BaseUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -35,32 +36,33 @@ * @param recordDte 业务数据dte * @param totalName 总计名称 * @param reportConfigMap 报表配置缓存map * @param tableStyle * @return 获取分组报表的详情 */ public JSONObject getReportEntity(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap, StringBuilder tableStyle) { StringBuilder reportHtml = new StringBuilder(4096); public ReportEntity getReportEntity(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap) { // StringBuilder reportHtml = new StringBuilder(4096); ReportEntity report = new ReportEntity(); // css // StringBuilder cssHtml = dataListReportService.getCssHtml(); // 分组表头区和数据区 StringBuilder groupAndDataAreaHtml = new StringBuilder(1024); // StringBuilder groupAndDataAreaHtml = new StringBuilder(1024); List<List<ReportColumn>>[] rows = new List[2]; Map<String, Set<String>> headAndTailTitleDataMap = Maps.newHashMap(); int totalColCount = reportConfigMap.get(0).size(); int dataAreaColCount = getGroupAndDataAreaHtmlAndReturnDataAreaColCount(groupAndDataAreaHtml, reportConfigMap, headAndTailTitleDataMap, recordDte, totalName); int dataAreaColCount = getGroupAndDataAreaAndReturnDataAreaColCount(rows, reportConfigMap, headAndTailTitleDataMap, recordDte, totalName); totalColCount = Math.max(totalColCount, dataAreaColCount); // 头部标题区 StringBuilder headTitleHtml = null; List<List<ReportColumn>> headTitle = null; if (!reportConfigMap.get(1).isEmpty()) { headTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head"); headTitle = dataListReportService.getTitle(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head"); } // 底部标题区 StringBuilder tailTitleHtml = null; List<List<ReportColumn>> tailTitle = null; if (!reportConfigMap.get(3).isEmpty()) { tailTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail"); tailTitle = dataListReportService.getTitle(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail"); } // reportHtml.append("\n<body>\n<table").append(tableStyle).append(">") @@ -70,11 +72,17 @@ // .append(tailTitleHtml == null ? "" : tailTitleHtml) // .append("\n</table>\n</body>"); JSONObject resultObj = new JSONObject(); resultObj.put(CmnConst.RETURN_ATTR_RESULT, true); resultObj.put(CmnConst.RETURN_ATTR_MESSAGE, "获取报表成功!"); resultObj.put(CmnConst.RETURN_ATTR_HTML, reportHtml); return resultObj; if (rows[0] != null) { if (headTitle == null) { headTitle = new ArrayList<>(); } headTitle.addAll(rows[0]); } report.setReportHeader(headTitle); report.setReportData(rows[1]); report.setReportTail(tailTitle); return report; } /** @@ -244,7 +252,7 @@ * @param totalName 总计名称 * @return 数据区总列数 */ private int getGroupAndDataAreaAndReturnDataAreaColCount(List<List<ReportColumn>> groupAndDataArea, Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName) { private int getGroupAndDataAreaAndReturnDataAreaColCount(List<List<ReportColumn>>[] groupAndDataArea, Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName) { // 分组表头区字段缓存map Map<String, JSONObject> groupAreaFieldConfigMap = dataListReportService.groupAndDataJSONObject2Map(reportConfigMap.get(2)); // 数据区字段缓存map @@ -336,9 +344,9 @@ // 数据标题list List<JSONObject> dataTitleList = Lists.newArrayList(); // 获取标题html groupAndDataArea.addAll(getDataAreaTitle(dataTitleList, groupAreaFieldRecordObj, dataAreaFieldConfigMap, groupAreaRangeObj, dataAreaCommonStatisticsFieldNameList)); groupAndDataArea[0] = (getDataAreaTitle(dataTitleList, groupAreaFieldRecordObj, dataAreaFieldConfigMap, groupAreaRangeObj, dataAreaCommonStatisticsFieldNameList)); // 获取内容html // groupAndDataAreaHtml.append(getDataAreaDataHtml(dataTitleList, dataAreaFieldRecordObj, statisticsMap, totalName, dataAreaGroupFieldNameList, dataAreaFieldConfigMap)); groupAndDataArea[1] = (getDataAreaData(dataTitleList, dataAreaFieldRecordObj, statisticsMap, totalName, dataAreaGroupFieldNameList, dataAreaFieldConfigMap)); return totalColCount; } @@ -723,14 +731,15 @@ List<ReportColumn> columns = new ArrayList<>(); // html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_TITLE).append("\">\n "); for (JSONObject dataTitleObj : rowList) { ReportColumn column = new ReportColumn(); rowspan = Math.max(1, dataTitleObj.getIntValue(CmnConst.ATTR_ROWSPAN)); colspan = Math.max(1, dataTitleObj.getIntValue(CmnConst.ATTR_COLSPAN)); value = dataTitleObj.getString(CmnConst.ATTR_SHOW_NAME); if (!StringUtils.isEmpty(dataTitleObj.getString(CmnConst.ATTR_FIELD_INFO))) { dataAreaFieldName = dataListReportService.fieldInfo2FieldName(dataTitleObj.getString(CmnConst.ATTR_FIELD_INFO)); value = dataListReportService.dealTdWidth(dataAreaFieldConfigMap.get(dataAreaFieldName), value); column.setColumnWidth(dataListReportService.dealColumnWidth(dataAreaFieldConfigMap.get(dataAreaFieldName))); // value = dataListReportService.dealTdWidth(dataAreaFieldConfigMap.get(dataAreaFieldName), value); } ReportColumn column = new ReportColumn(); column.setRowspan(rowspan); column.setColspan(colspan); column.setContent(value); @@ -1046,7 +1055,7 @@ private List<List<ReportColumn>> getDataAreaData(List<JSONObject> dataTitleList, JSONObject dataAreaFieldRecordObj, Map<JSONObject, JSONObject> statisticsMap, String totalName, List<String> dataAreaGroupFieldNameList, Map<String, JSONObject> dataAreaFieldConfigMap) { List<List<JSONObject>> dataAreaGroupFieldDataList = Lists.newArrayList(); getDataAreaGroupFieldDataList(dataAreaFieldRecordObj, dataAreaGroupFieldDataList, new JSONObject(), 1, 1, dataAreaGroupFieldNameList.size(), null); List<List<ReportColumn>> dataRows = new ArrayList<>(); List<JSONObject> groupTitleList = Lists.newArrayList(); JSONObject obj; for (List<JSONObject> rowList : dataAreaGroupFieldDataList) { @@ -1054,7 +1063,7 @@ groupTitleList.add(obj); } StringBuilder html = new StringBuilder(1024); // StringBuilder html = new StringBuilder(1024); JSONObject dataAreaGroupFieldObj; int rowspan; int colspan; @@ -1069,6 +1078,7 @@ List<JSONObject> curRowList; int index; for (int i = 0; i < dataAreaGroupFieldDataList.size(); i++) { List<ReportColumn> columns = new ArrayList<>(); index = 0; curRowList = dataAreaGroupFieldDataList.get(i); if (!curRowList.isEmpty()) { @@ -1077,22 +1087,28 @@ if (dataAreaGroupFieldObj.isEmpty()) { continue; } if (index == 0) { if ("1".equals(dataAreaGroupFieldObj.getString(CmnConst.ATTR_IS_STATISTICS_FIELD))) { html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n "); } else { html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_COMMON).append("\">\n "); } } // if (index == 0) { // if ("1".equals(dataAreaGroupFieldObj.getString(CmnConst.ATTR_IS_STATISTICS_FIELD))) { // html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n "); // } else { // html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_COMMON).append("\">\n "); // } // } rowspan = Math.max(1, dataAreaGroupFieldObj.getIntValue(CmnConst.ATTR_ROWSPAN)); colspan = Math.max(1, dataAreaGroupFieldObj.getIntValue(CmnConst.ATTR_COLSPAN)); value = dataAreaGroupFieldObj.getString(CmnConst.ATTR_SHOW_NAME); html.append("<td rowspan=\"").append(rowspan).append("\" colspan=\"").append(colspan).append("\">").append(value == null ? "" : value).append("</td>"); ReportColumn column = new ReportColumn(); column.setRowspan(rowspan); column.setColspan(colspan); column.setContent(value); columns.add(column); // html.append("<td rowspan=\"").append(rowspan).append("\" colspan=\"").append(colspan).append("\">").append(value == null ? "" : value).append("</td>"); index++; } } else { html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_COMMON).append("\">\n "); } // else { // html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_COMMON).append("\">\n "); // } groupTitleObj = groupTitleList.get(i); for (JSONObject dataTitleObj : dataTitleList) { keyObj = dataListReportService.extendJSONObject((JSONObject) groupTitleObj.clone(), dataTitleObj, Arrays.asList(CmnConst.ATTR_ROWSPAN, CmnConst.ATTR_COLSPAN, CmnConst.ATTR_SHOW_NAME, CmnConst.ATTR_IS_STATISTICS_FIELD, CmnConst.ATTR_REAL_VALUE), -1); @@ -1122,31 +1138,43 @@ } else { value = ""; } html.append("<td"); // html.append("<td"); ReportColumn column = new ReportColumn(); if (!StringUtils.isEmpty(value)) { // class if (!StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL))) { dataListReportService.extendJSONObject(keyObj, dataAreaFieldConfigObj, Collections.singletonList(CmnConst.ATTR_URL)); html.append(" class=\"").append(CmnConst.CLASS_TD_CAN_TURN).append("\""); // html.append(" class=\"").append(CmnConst.CLASS_TD_CAN_TURN).append("\""); } // 字段属性 dataListReportService.getTdAttrObj(keyObj, groupTitleObj); dataListReportService.getTdAttrObj(keyObj, dataTitleObj); html.append(dataListReportService.getTdAttrByObj(keyObj)); String attrUrL = keyObj.getString(CmnConst.ATTR_URL); if (!StringUtils.isEmpty(attrUrL)) { column.setPenetrateProperty(attrUrL.toString()); column.setPenetrate(true); } for (String key : keyObj.keySet()) { column.addProperty(key, keyObj.getString(key)); } // html.append(dataListReportService.getTdAttrByObj(keyObj)); // 格式 value = dataListReportService.formatValue(dataAreaFieldConfigObj, value); } html.append(">").append(value == null ? "" : value).append("</td>"); // html.append(">").append(value == null ? "" : value).append("</td>"); column.setContent(value); columns.add(column); } html.append("\n</tr>"); // html.append("\n</tr>"); dataRows.add(columns); } // 总计 if (!StringUtils.isEmpty(totalName)) { html.append(getTotalStatisticsHtml(statisticsMap, dataTitleList, dataAreaFieldConfigMap, dataAreaGroupFieldNameList.size(), getSubCnt(dataAreaFieldRecordObj), totalName)); dataRows.add(getTotalStatistics(statisticsMap, dataTitleList, dataAreaFieldConfigMap, dataAreaGroupFieldNameList.size(), getSubCnt(dataAreaFieldRecordObj), totalName)); } return null; return dataRows; } /** @@ -1260,6 +1288,86 @@ * @param totalName 总计名称 * @return */ private List<ReportColumn> getTotalStatistics(Map<JSONObject, JSONObject> statisticsMap, List<JSONObject> dataTitleList, Map<String, JSONObject> dataAreaFieldConfigMap, int dataAreaGroupFieldCount, int dataAreaSubCnt, String totalName) { List<ReportColumn> columns = new ArrayList<>(); // StringBuilder html = new StringBuilder(256); // html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n "); // html.append("<td colspan=\"").append(dataAreaGroupFieldCount).append("\">").append(totalName).append("</td>"); ReportColumn column = new ReportColumn(); columns.add(column); column.setColspan(dataAreaGroupFieldCount); column.setContent(totalName); JSONObject dataTitleObj; JSONObject keyObj; JSONObject dataAreaFieldConfigObj; String statisticsType; JSONObject valueObj; String value; int groupAreaSubCnt; for (int i = 0; i < dataTitleList.size(); i++) { column = new ReportColumn(); columns.add(column); dataTitleObj = dataTitleList.get(i); keyObj = dataListReportService.extendJSONObject(null, dataTitleObj, Arrays.asList(CmnConst.ATTR_ROWSPAN, CmnConst.ATTR_COLSPAN, CmnConst.ATTR_SHOW_NAME, CmnConst.ATTR_IS_STATISTICS_FIELD, CmnConst.ATTR_REAL_VALUE), -1); dataAreaFieldConfigObj = dataAreaFieldConfigMap.get(dataListReportService.fieldInfo2FieldName(dataTitleObj.getString(CmnConst.ATTR_FIELD_INFO))); if (dataAreaFieldConfigObj != null) { groupAreaSubCnt = keyObj.getIntValue(CmnConst.ATTR_GROUP_AREA_SUB_CNT); keyObj.remove(CmnConst.ATTR_GROUP_AREA_SUB_CNT); statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS); valueObj = statisticsMap.get(keyObj); if (valueObj == null || valueObj.isEmpty()) { value = getFinalValue(keyObj, dataAreaFieldConfigObj, statisticsMap); } else { if (CmnConst.ATTR_STATISTICS_AVG.equals(statisticsType) && "1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_AVG_TYPE))) { value = getTwoTypesGroupAvgStatisticsValue(dataAreaSubCnt, groupAreaSubCnt, valueObj, dataAreaFieldConfigObj, statisticsType); } else { value = valueObj.getString(statisticsType); } valueObj.put(CmnConst.ATTR_FINAL_VALUE, value); } } else { value = ""; } // html.append("<td"); if (!StringUtils.isEmpty(value)) { // class if (!StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL))) { dataListReportService.extendJSONObject(keyObj, dataAreaFieldConfigObj, Collections.singletonList(CmnConst.ATTR_URL)); // html.append(" class=\"").append(CmnConst.CLASS_TD_CAN_TURN).append("\""); } // 字段属性 dataListReportService.getTdAttrObj(keyObj, dataTitleObj); String attrUrL = keyObj.getString(CmnConst.ATTR_URL); if (!StringUtils.isEmpty(attrUrL)) { column.setPenetrateProperty(attrUrL.toString()); column.setPenetrate(true); } for (String key : keyObj.keySet()) { column.addProperty(key, keyObj.getString(key)); } // html.append(dataListReportService.getTdAttrByObj(keyObj)); // 格式 value = dataListReportService.formatValue(dataAreaFieldConfigObj, value); } column.setContent(value); // html.append(">").append(value == null ? "" : value).append("</td>"); } // html.append("\n</tr>"); return columns; } /** * 获取总计html * * @param statisticsMap 统计map * @param dataTitleList 数据标题list * @param dataAreaFieldConfigMap 数据区字段缓存map * @param dataAreaGroupFieldCount 数据区分组字段个数 * @param dataAreaSubCnt 数据区下级分组项数 * @param totalName 总计名称 * @return */ private StringBuilder getTotalStatisticsHtml(Map<JSONObject, JSONObject> statisticsMap, List<JSONObject> dataTitleList, Map<String, JSONObject> dataAreaFieldConfigMap, int dataAreaGroupFieldCount, int dataAreaSubCnt, String totalName) { StringBuilder html = new StringBuilder(256); html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n "); src/main/java/com/product/server/report/service/ListReportConfigServiceImple.java
@@ -141,7 +141,7 @@ 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());