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/DataListReportService.java |  477 +++++++++++++++++++++++++++++++----------------------------
 1 files changed, 249 insertions(+), 228 deletions(-)

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 e8f226b..adc1c2b 100644
--- a/src/main/java/com/product/server/report/service/DataListReportService.java
+++ b/src/main/java/com/product/server/report/service/DataListReportService.java
@@ -1,8 +1,6 @@
 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;
@@ -26,8 +24,13 @@
 import com.product.server.report.config.ReportCode;
 import com.product.server.report.entity.ReportColumn;
 import com.product.server.report.entity.ReportEntity;
+import com.product.server.report.util.QuerySqlParseUtil;
 import com.product.util.BaseUtil;
 import com.product.util.SystemParamReplace;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -66,7 +69,7 @@
 	private SystemDataExportService exportService;
 
 	public void outReportExcel(HttpServletResponse response, FieldSetEntity fse) throws BaseException, IOException {
-		ReportEntity reportEntity = getReportEntity(fse);
+		ReportEntity reportEntity = getReport(fse);
 		List<List<ReportColumn>> reportHeader = reportEntity.getReportHeader();
 
 		List<List<String>> headerTemp = processingMergeData(reportHeader);
@@ -97,9 +100,9 @@
 			List<ReportColumn> columns = data.get(i);
 			for (ReportColumn column : columns) {
 				//璺ㄨ
-				int rowspan = column.getRowspan() < 1 ? 1 : column.getRowspan();
+				int rowspan = column.getRowspanInt() < 1 ? 1 : column.getRowspanInt();
 				//璺ㄥ垪
-				int colspan = column.getColspan() < 1 ? 1 : column.getColspan();
+				int colspan = column.getColspanInt() < 1 ? 1 : column.getColspanInt();
 				List<String> currentCell = new ArrayList<>();
 				for (int k = 0; k < colspan; k++) {
 					currentCell.add(column.getContent(true));
@@ -107,7 +110,6 @@
 				for (int j = 0; j < rowspan; j++) {
 					resultData.get(j + i).addAll(currentCell);
 				}
-				System.out.println(resultData);
 			}
 		}
 		return resultData;
@@ -133,36 +135,7 @@
 	}
 
 
-	/**
-	 * @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;
-			}
-		}
-	}
+
 
 	/**
 	 * 鍔犺浇鎵�鏈夌紦瀛�
@@ -244,8 +217,8 @@
 				fieldConfigObj = new JSONObject();
 				areaList.add(fieldConfigObj);
 			} else {
-                fieldConfigObj = areaList.get(areaList.size() - 1);
-            }
+				fieldConfigObj = areaList.get(areaList.size() - 1);
+			}
 			fieldConfigObj.put(attrFse.getString(CmnConst.ATTR_NAME), attrFse.getString(CmnConst.ATTR_VALUE));
 			fieldConfigObj.put(CmnConst.ATTR_X, x);
 			fieldConfigObj.put(CmnConst.ATTR_Y, y);
@@ -360,14 +333,13 @@
 		}
 	}
 
-
 	/**
 	 * 鑾峰彇鎶ヨ〃
 	 *
 	 * @return
 	 */
-	public ReportEntity getReportEntity(FieldSetEntity fse) {
-		ReportEntity report = null;
+	public ReportEntity getReport(FieldSetEntity fse) {
+		ReportEntity reportEntity = new ReportEntity();
 		String reportConfigUUID = fse.getUUID();
 		if (!StringUtils.isEmpty(fse.getString("~report_config_uuid~"))) {
 			//瀛愭姤琛ㄤ細浼犲叆姝ey浣滀负鎶ヨ〃鐨剈uid 瑙勯伩鍙傛暟涓湁uuid鐨刱ey
@@ -439,9 +411,8 @@
 		FieldSetEntity reportSourceFse = reportSourceDte.getFieldSetEntity(0);
 		int curPage = fse.getInteger(CmnConst.CPAGE) == null ? 1 : fse.getInteger(CmnConst.CPAGE);
 
-		JSONObject resultObj = new JSONObject();
+//		JSONObject resultObj = new JSONObject();
 		// 棣栨鍔犺浇锛岄粯璁ゆ坊鍔犳潯浠�
-		Map<String, Map<String, String>> outerMap = Maps.newHashMap();
 		if (fse.getBoolean(CmnConst.FIRST_LOAD)) {
 			DataTableEntity allFilterDte = getDefaultSearchFilter(reportSourceFse.getUUID());
 			Map<String, DataTableEntity> subMap = Maps.newHashMap();
@@ -451,7 +422,7 @@
 			DataTableEntity defaultFilterDte = new DataTableEntity();
 
 			FieldSetEntity tempFse;
-
+			Map<String, Map<String, String>> outerMap = Maps.newHashMap();
 			Map<String, String> innerMap;
 			for (int i = 0; i < allFilterDte.getRows(); i++) {
 				tempFse = allFilterDte.getFieldSetEntity(i);
@@ -466,22 +437,18 @@
 				outerMap.put(tempFse.getString(CmnConst.FIELD_NAME), innerMap);
 			}
 //			resultObj.put("filterInfo", outerMap);
-
+			reportEntity.setFilterInfo(outerMap);
 			if (!DataTableEntity.isEmpty(defaultFilterDte)) {
 				subMap.put("systemSeniorQueryString", defaultFilterDte);
 			}
 			fse.setSubData(subMap);
 		}
 
-		DataTableEntity recordDte = getRecordDte(sort, curPage, reportSourceFse, fse, reportConfigFse, null);
+		List<String> unpivotInfoContainer = Lists.newArrayList();
+		DataTableEntity recordDte = getRecordDte(sort, curPage, reportSourceFse, fse, reportConfigFse, null, unpivotInfoContainer);
 		// 鏄惁娣诲姞鎬诲悎璁�
 		boolean totalStatisticsFlag = "1".equalsIgnoreCase(reportConfigFse.getString(CmnConst.LAST_TOTAL));
 		String totalName = totalStatisticsFlag ? (StringUtils.isEmpty(reportConfigFse.getString(CmnConst.TOTAL_NAME)) ? "鎬昏" : reportConfigFse.getString(CmnConst.TOTAL_NAME)) : "";
-
-//        JSONObject checkObj = checkRecordDte(recordDte);
-//        if (CmnConst.FALSE.equals(checkObj.getString(CmnConst.RETURN_ATTR_RESULT))) {
-//            return checkObj;
-//        }
 
 //		StringBuilder tableStyle = new StringBuilder(32);
 //		String widthType = reportConfigFse.getString(CmnConst.REPORT_WIDTH_TYPE);
@@ -493,50 +460,46 @@
 //				tableStyle.append(" style=\"width:").append(width).append("px\"");
 //			}
 //		}
-
+		List<List<ReportColumn>>[] report = null;
 		if (CmnConst.REPORT_TYPE_COMMON.equals(reportType)) {
-			report = commonReportService.getReportEntity(recordDte, totalName, reportConfigMap);
-			report.setFilterInfo(outerMap);
+			report = commonReportService.getReport(recordDte, totalName, reportConfigMap, unpivotInfoContainer);
+
 		} 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));
+			recordDte.addFieldSetEntity(getRecordDte(sort, curPage, reportSourceFse, fse, reportConfigFse, reportConfigMap, null));
+			report = groupReportService.getReport(recordDte, totalName, reportConfigMap);
 		}
-		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);
-			resultObj.put(CmnConst.RETURN_ATTR_MESSAGE, "鑾峰彇鎶ヨ〃澶辫触锛�");
+		if (report != null) {
+			List<List<ReportColumn>> head = report[0];
+			List<List<ReportColumn>> data = report[1];
+			List<List<ReportColumn>> tail = report[2];
+			reportEntity.setReportHeader(head);
+			reportEntity.setReportData(data);
+			reportEntity.setReportTail(tail);
+		}
+
+
+		reportEntity.setReportConfigUid(reportConfigFse.getUUID());
+		reportEntity.setReportName(reportConfigFse.getString(CmnConst.REPORT_NAME));
+
+		// 鍒嗛〉鍙傛暟
+		SQLEntity sqlEntity = recordDte.getSqle();
+		if ("1".equals(reportConfigFse.getString(CmnConst.IS_PAGE)) && sqlEntity != null) {
+			reportEntity.setPage(true);
+			reportEntity.setPageIndex(curPage);
+			reportEntity.setTotalCount(sqlEntity.getTotalCount());
+			reportEntity.setPageSize(StringUtils.isEmpty(reportConfigFse.getString(CmnConst.PAGE_SIZE)) ? 0 : reportConfigFse.getInteger(CmnConst.PAGE_SIZE));
 		} else {
-			// 鍒嗛〉鍙傛暟
-			SQLEntity sqlEntity = recordDte.getSqle();
-			if ("1".equals(reportConfigFse.getString(CmnConst.IS_PAGE)) && sqlEntity != null) {
-				report.setPage(true);
-				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);
-//				resultObj.put(CmnConst.CPAGE, curPage);
-//				resultObj.put("totalCount", sqlEntity.getTotalCount());
-//				resultObj.put("totalpage", sqlEntity.getTotalpage());
-//				resultObj.put("pagesize", StringUtils.isEmpty(reportConfigFse.getString(CmnConst.PAGE_SIZE)) ? 0 : reportConfigFse.getInteger(CmnConst.PAGE_SIZE));
-			}
+			reportEntity.setPage(false);
 		}
 //		if (!DataTableEntity.isEmpty(recordDte)) {
 //			resultObj.put("current_page_count", recordDte.getRows());
+//
 //		}
-		report.setSystemFieldMeta(getSearchInfo(reportSourceFse.getUUID()));
-		report.setReportType(reportConfigFse.getString("type_uuid"));
-//		resultObj.put("systemFieldMeta", );
-//		resultObj.put("report_type", reportConfigFse.getString("type_uuid"));
-//        System.out.println(resultObj.getString("html"));
-
-		return report;
+		reportEntity.setReportType(reportConfigFse.getString("type_uuid"));
+		reportEntity.setSystemFieldMeta(getSearchInfo(reportSourceFse.getUUID()));
+		return reportEntity;
 	}
-
-
 
 	/**
 	 * 鑾峰彇鎶ヨ〃缂撳瓨淇℃伅
@@ -578,12 +541,17 @@
 	 * @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, Collection<String> unpivotInfoContainer) {
 		boolean spTimeFlag = reportConfigMap != null;
 		String sql;
 		String sqlText = reportSourceFse.getString(CmnConst.SQL_TEXT);
+		Map<String, List<String>> queryFilterMap = queryFilterService.getQueryFilterMore(fse);
+		// [=table_name=]鍐欐硶澶勭悊鈥斺�旀浛鎹负瀵瑰簲鐨剋ith璇彞,0-杩戞湡锛�1-鎵�鏈�
+		int year = queryFilterMap == null || queryFilterMap.get("query_time") == null || "0".equals(queryFilterMap.get("query_time").get(0)) ? 2 : 0;
+		sqlText = QuerySqlParseUtil.parseSplitTableSql(baseDao, sqlText, year);
+		// {==}鍐欐硶澶勭悊-鏇挎崲涓哄搴旂殑琛屽垪杞崲璇彞
+		sqlText = dealUnpivot(sqlText, queryFilterMap, unpivotInfoContainer);
+
 		DataTableEntity recordDte = new DataTableEntity();
 
 		if (spTimeFlag) {
@@ -593,7 +561,6 @@
 			Set<String> spTimeStatisticsTypeSet = Sets.newHashSet();
 			spTimeStatisticsTypeSet.addAll(getFieldAndSpTimeStatisticsTypeSet(baseFieldSet, spTimeStatisticsFieldMap, reportConfigMap.get(0)));
 			spTimeStatisticsTypeSet.addAll(getFieldAndSpTimeStatisticsTypeSet(baseFieldSet, spTimeStatisticsFieldMap, reportConfigMap.get(2)));
-			Map<String, List<String>> queryFilterMap = queryFilterService.getQueryFilterMore(fse);
 			Set<String> selectedFieldSet;
 			String headContent;
 			DataTableEntity tempDte;
@@ -678,6 +645,154 @@
 	}
 
 	/**
+	 * 瀛愭柟娉�-澶勭悊琛屽垪杞崲鐨勮鍙�
+	 *
+	 * @param sql                  寰呭鐞嗙殑sql
+	 * @param queryFilterMap       杩囨护鏉′欢map
+	 * @param unpivotInfoContainer 琛屽垪杞崲瀹瑰櫒锛岃鏂规硶浼氬皢澶勭悊濂戒簡鐨勫唴瀹圭洿鎺ユ斁鍏ヨ瀹瑰櫒涓�
+	 * @return
+	 */
+	private String dealUnpivot(String sql, Map<String, List<String>> queryFilterMap, Collection<String> unpivotInfoContainer) {
+		String regexp = "\\{=.+=\\}";
+		List<String> suitList = getSuitContent(sql, regexp);
+		String tempStr;
+		List<String> fieldInfoList;
+		String[] fieldArr;
+		String filter;
+		String startTimeStr;
+		String finalTimeStr;
+		int beginIndex;
+		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		List<String> timeList;
+		for (String content : suitList) {
+			tempStr = content.substring(2, content.length() - 2).trim();
+			fieldInfoList = getSuitContent(tempStr, "\\{\\$((?!\\{\\$).)+\\$\\}");
+			for (String fieldInfo : fieldInfoList) {
+				fieldArr = fieldInfo.substring(2, fieldInfo.length() - 2).trim().split(" ");
+				if (fieldArr.length != 3) {
+					continue;
+				}
+				if ("date".equalsIgnoreCase(fieldArr[1])) {
+					if (queryFilterMap == null || queryFilterMap.isEmpty()) {
+						return sql.replaceAll(regexp, "");
+					}
+					filter = queryFilterMap.get(fieldArr[0]).get(0);
+					beginIndex = filter.indexOf("str_to_date('") + "str_to_date('".length();
+					startTimeStr = filter.substring(beginIndex, beginIndex + 19);
+					beginIndex = filter.lastIndexOf("str_to_date('") + "str_to_date('".length();
+					finalTimeStr = filter.substring(beginIndex, beginIndex + 19);
+					try {
+						timeList = enumTime(dateFormat.parse(startTimeStr), dateFormat.parse(finalTimeStr), fieldArr[2]);
+					} catch (Exception e) {
+						SpringMVCContextHolder.getSystemLogger().error("transfer error: " + filter);
+						timeList = Lists.newArrayList();
+					}
+					unpivotInfoContainer.addAll(timeList);
+					tempStr = joinSql(timeList, tempStr, fieldInfo);
+				} else if ("prompt".equalsIgnoreCase(fieldArr[1])) {
+					String promptName = fieldArr[2];
+					DataTableEntity dte;
+					StringBuilder promptSql = new StringBuilder();
+					FieldSetEntity fse;
+					if (promptName.startsWith("銆�")) {
+						promptSql.append("select dict_label show_value,dict_value real_value from product_sys_dict where is_used=1 and dict_name=?");
+						if (queryFilterMap != null && !queryFilterMap.isEmpty() && queryFilterMap.get(fieldArr[0]) != null && !StringUtils.isEmpty(queryFilterMap.get(fieldArr[0]).get(1))) {
+							promptSql.append(" and (dict_value").append(queryFilterMap.get(fieldArr[0]).get(1)).append(")");
+						}
+						dte = baseDao.listTable(promptSql.toString(), new Object[]{promptName.substring(1, promptName.length() - 1)});
+					} else {
+						fse = baseDao.getFieldSetEntityByFilter("product_sys_prompt", "prompt_name=?", new Object[]{promptName}, false);
+						promptSql.append("select ").append(fse.getString("view_fields")).append(" show_value,").append(fse.getString("value_field")).append(" real_value from ").append(fse.getString("source_table"));
+						if (!StringUtils.isEmpty(fse.getString("filter"))) {
+							promptSql.append(" where (").append(fse.getString("filter")).append(")");
+						}
+						if (queryFilterMap != null && !queryFilterMap.isEmpty() && queryFilterMap.get(fieldArr[0]) != null && !StringUtils.isEmpty(queryFilterMap.get(fieldArr[0]).get(1))) {
+							if (!StringUtils.isEmpty(fse.getString("filter"))) {
+								promptSql.append(" and");
+							} else {
+								promptSql.append(" where");
+							}
+							promptSql.append(" (").append(fse.getString("value_field")).append(queryFilterMap.get(fieldArr[0]).get(1)).append(")");
+						}
+						dte = baseDao.listTable(promptSql.toString(), new Object[]{});
+					}
+					for (int i = 0; i < dte.getRows(); i++) {
+						fse = dte.getFieldSetEntity(i);
+						unpivotInfoContainer.add(fse.getString("show_value"));
+					}
+					tempStr = joinSql(dte, tempStr, fieldInfo);
+				}
+			}
+			sql = sql.replace(content, tempStr.contains("{$") ? "" : tempStr);
+		}
+		return sql;
+	}
+
+	private String joinSql(Collection<String> collection, String unpivotContent, String fieldInfo) {
+		StringBuilder unpivotSb = new StringBuilder(128);
+		for (String singleStr : collection) {
+			if (unpivotSb.length() > 0) {
+				unpivotSb.append("\n    ");
+			}
+			unpivotSb.append(unpivotContent.replace(fieldInfo, singleStr)).append(" '").append(singleStr).append("'");
+		}
+		return unpivotSb.toString();
+	}
+
+	private String joinSql(DataTableEntity dte, String unpivotContent, String fieldInfo) {
+		StringBuilder unpivotSb = new StringBuilder(128);
+		for (int i = 0; i < dte.getRows(); i++) {
+			FieldSetEntity fse = dte.getFieldSetEntity(i);
+			if (unpivotSb.length() > 0) {
+				unpivotSb.append("\n    ");
+			}
+			unpivotSb.append(unpivotContent.replace(fieldInfo, fse.getString("real_value"))).append(" '").append(fse.getString("show_value")).append("'");
+		}
+		return unpivotSb.toString();
+	}
+
+	/**
+	 * 鎸夌収鏃堕棿姝ラ暱鏋氫妇鏃堕棿鑼冨洿涔嬪唴鐨勬椂闂�
+	 *
+	 * @param startTime
+	 * @param finalTime
+	 * @param formatInfo
+	 * @return
+	 */
+	public static List<String> enumTime(Date startTime, Date finalTime, String formatInfo) {
+		Calendar c1 = Calendar.getInstance();
+		Calendar c2 = Calendar.getInstance();
+		c1.setTime(startTime);
+		c2.setTime(finalTime);
+		int step = 1;
+		String format = formatInfo;
+		if (formatInfo.contains("[")) {
+			step = Integer.parseInt(formatInfo.substring(formatInfo.indexOf("[") + 1, formatInfo.indexOf("]")));
+			format = formatInfo.substring(0, formatInfo.indexOf("["));
+		}
+		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
+		List<String> timeList = Lists.newArrayList();
+		if (formatInfo.contains("H")) {
+			enumTime(c1, c2, timeList, dateFormat, step, Calendar.HOUR);
+		} else if (formatInfo.contains("d")) {
+			enumTime(c1, c2, timeList, dateFormat, step, Calendar.DATE);
+		} else if (formatInfo.contains("M")) {
+			enumTime(c1, c2, timeList, dateFormat, step, Calendar.MONTH);
+		} else if (formatInfo.contains("y")) {
+			enumTime(c1, c2, timeList, dateFormat, step, Calendar.YEAR);
+		}
+		return timeList;
+	}
+
+	private static void enumTime(Calendar c1, Calendar c2, List<String> timeList, SimpleDateFormat dateFormat, int step, int param) {
+		if (c1.compareTo(c2) <= 0) {
+			timeList.add(dateFormat.format(c1.getTime()));
+			c1.add(param, step);
+			enumTime(c1, c2, timeList, dateFormat, step, param);
+		}
+	}
+
+	/**
 	 * 瀛愭柟娉�-getRecordDte-鍔犺浇鍙傜収
 	 *
 	 * @param recordDte
@@ -718,9 +833,10 @@
 	 * @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;
+		// 澶勭悊鎺夎繎鏈熷拰鎵�鏈夌殑杩囨护鏉′欢
+		queryFilterMap.remove("query_time");
 		selectedFields = StringUtils.isEmpty(selectedFields) ? "*" : selectedFields;
 		// 鏇挎崲sql涓殑绯荤粺鍙傛暟
 		sqlText = SystemParamReplace.replaceParams(sqlText, fse);
@@ -765,7 +881,7 @@
 			}
 		}
 		// 鍓旈櫎寮傚父鍖哄煙
-		sqlText = sqlText.replaceAll(CmnConst.REGEXP_FILTER_AREA, "").replaceAll(CmnConst.REGEXP_ALL_TYPE, "null").replaceAll(CmnConst.REGEXP_ALWAYS_TRUE, "");
+		sqlText = sqlText.replaceAll(CmnConst.REGEXP_FILTER_AREA, "").replaceAll(CmnConst.REGEXP_ALL_TYPE, "null").replaceAll(CmnConst.REGEXP_ALWAYS_TRUE, "").replaceAll("(\\t*\\n){2,}", "\n");
 		String queryFilter = "";
 		if (signCount > 0) {
 			for (Map.Entry<String, List<String>> entry : residueQueryFilterMap.entrySet()) {
@@ -778,7 +894,7 @@
 				queryFilter += " (" + entry.getValue().get(2) + ") ";
 			}
 		} else {
-			queryFilter = queryFilterMap.isEmpty() ? queryFilterService.getQueryFilter(fse) : queryFilterMap.get(CmnConst.SYSTEM_SENIOR_QUERY_STRING).get(0);
+			queryFilter = queryFilterMap.isEmpty() || queryFilterMap.size() == 1 ? queryFilterService.getQueryFilter(fse) : queryFilterMap.get(CmnConst.SYSTEM_SENIOR_QUERY_STRING).get(0);
 		}
 
 		StringBuilder sql = new StringBuilder(1024);
@@ -794,8 +910,7 @@
 		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);
 	}
 
@@ -808,8 +923,7 @@
 	 * @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;
@@ -844,9 +958,17 @@
 						// 涓婃湡
 						spDealFilterForPrePeriod(tempQueryFilterMap, queryFilterMap, curField);
 					}
+					filter = tempQueryFilterMap.get(curField).get(num);
+					suitContent = suitContent.replace(innerSuitContent, filter);
+				} else if ("split".equals(spStatisticsWay)) {
+					// 鍙槸鎷嗗垎骞舵彁鍙栧尯鍩熺殑鍊硷紝鍙湁鑾峰彇鑼冨洿鐨勫�肩殑鏃跺�欏彲浠ヨ繖鏍锋搷浣�
+					List<String> paramList = tempQueryFilterMap.get(curField);
+					String[] timeArr = paramList.get(0).split("~");
+					suitContent = suitContent.replace(innerSuitContent, timeArr[Integer.parseInt(spStatisticsWayValue)]);
+				} else {
+					filter = tempQueryFilterMap.get(curField).get(num);
+					suitContent = suitContent.replace(innerSuitContent, filter);
 				}
-				filter = tempQueryFilterMap.get(curField).get(num);
-				suitContent = suitContent.replace(innerSuitContent, filter);
 				residueQueryFilterMap.remove(curField);
 				if (getSuitContent(suitContent, CmnConst.REGEXP_ALL_TYPE).isEmpty() && suitContent.matches(CmnConst.REGEXP_FILTER_AREA)) {
 					suitContent = suitContent.substring(2, suitContent.length() - 2);
@@ -888,9 +1010,7 @@
 	 * @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(")
@@ -911,9 +1031,7 @@
 	 * @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 {
@@ -946,8 +1064,7 @@
 	 * @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;
@@ -1029,6 +1146,7 @@
 					tempObj.put("table_name", reportSourceFieldFse.getString(CmnConst.TABLE_NAME));
 					tempObj.put(CmnConst.SEARCH_TYPE, reportSourceFieldFse.getObject(CmnConst.SEARCH_TYPE));
 					tempObj.put("is_multiple", "2".equals(reportSourceFieldFse.getString(CmnConst.SEARCH_TYPE)));
+					tempObj.put("field_prompt_filter", reportSourceFieldFse.getString("field_prompt_filter"));
 				}
 			}
 		}
@@ -1093,8 +1211,8 @@
 	 * @param locationType            浣嶇疆绫诲瀷锛宧ead-澶撮儴锛宼ail-灏鹃儴
 	 * @return
 	 */
-	public StringBuilder getTitleHtml(List<JSONObject> list, int totalColCount, Map<
-			String, Set<String>> headAndTailTitleDataMap, String locationType) {
+	public List<List<ReportColumn>> getTitleRows(List<JSONObject> list, int totalColCount, Map<String, Set<String>> headAndTailTitleDataMap, String locationType) {
+		List<List<ReportColumn>> reportColumnList = new ArrayList<>();
 		StringBuilder html = new StringBuilder(1024);
 		int colspan;
 		int preRow = 0;
@@ -1102,7 +1220,6 @@
 		int curRow;
 		int curCol;
 		String value;
-		String style;
 		for (JSONObject singleObj : list) {
 			curRow = singleObj.getIntValue(CmnConst.ATTR_Y);
 			curCol = singleObj.getIntValue(CmnConst.ATTR_X);
@@ -1110,15 +1227,6 @@
 			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 (preRow < curRow) {
 				if (preRow == 0) {
 					html.append("\n<tr ");
@@ -1126,7 +1234,7 @@
 					html.append(getAimNumTdPlaceholder(totalColCount - preCol, 1));
 					html.append("\n</tr>\n<tr ");
 				}
-				html.append(style).append(">\n    ");
+				html.append(">\n    ");
 				if (preRow == 0 && preCol == 0 && preCol < curCol - 1) {
 					html.append(getAimNumTdPlaceholder(curCol - preCol - 1, 1));
 				}
@@ -1150,80 +1258,25 @@
 		}
 		html.append(getAimNumTdPlaceholder(totalColCount - preCol, 1));
 		html.append("\n</tr>");
-		return html;
-	}
-
-	/**
-	 * 鎶ヨ〃-瑙f瀽-鑾峰彇澶撮儴鎴栬�呭熬閮ㄦ爣棰楬tml
-	 *
-	 * @param list                    鎶ヨ〃閰嶇疆淇℃伅锛岀紦瀛榣ist
-	 * @param totalColCount           鎬诲垪鏁�
-	 * @param headAndTailTitleDataMap 澶撮儴銆佸熬閮ㄦ爣棰樺尯鏁版嵁瀛楁map
-	 * @param locationType            浣嶇疆绫诲瀷锛宧ead-澶撮儴锛宼ail-灏鹃儴
-	 * @return
-	 */
-	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);
-		int colspan;
-		int preRow = 0;
-		int preCol = 0;
-		int curRow;
-		int curCol;
-		String value;
-//		String style;
-
-		List<ReportColumn> reportColumns = new ArrayList<>();
-		for (JSONObject singleObj : list) {
-			curRow = singleObj.getIntValue(CmnConst.ATTR_Y);
-			curCol = singleObj.getIntValue(CmnConst.ATTR_X);
-			colspan = singleObj.getIntValue(CmnConst.ATTR_COLSPAN);
-			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 (preRow < curRow) {
-				if(!reportColumns.isEmpty()){
-					row.add(reportColumns);
-					reportColumns=new ArrayList<>();
-				}
-//				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;
+		// 瑙f瀽html
+		Document doc = Jsoup.parse(html.toString());
+		Elements trs = doc.select("tr");
+		Elements tds;
+		List<ReportColumn> reportColumn;
+		ReportColumn column;
+		for (Element tr : trs) {
+			tds = tr.select("td");
+			reportColumn = new ArrayList<>();
+			for (Element td : tds) {
+				column = new ReportColumn();
+				column.setColspan(Integer.parseInt(BaseUtil.ifNull(td.attr("colspan"), "1")));
+				column.setRowspan(Integer.parseInt(BaseUtil.ifNull(td.attr("rowspan"), "1")));
+				column.setContent(td.text());
+				reportColumn.add(column);
 			}
-			if (preCol < curCol - 1) {
-				row.add(getAimNumTdPlaceholderColumn(curCol - preCol - 1, 1));
-			}
-			if ("1".equals(singleObj.getString(CmnConst.ATTR_IS_TITLE))) {
-				colspan = totalColCount;
-			}
-			ReportColumn column = new ReportColumn();
-			column.setColspan(colspan);
-			column.setContent(value);
-			reportColumns.add(column);
-			preRow = curRow;
-			preCol = curCol + singleObj.getIntValue(CmnConst.ATTR_COLSPAN) - 1;
-			if ("1".equals(singleObj.getString(CmnConst.ATTR_IS_TITLE))) {
-				preCol = totalColCount;
-			}
+			reportColumnList.add(reportColumn);
 		}
-		row.add(reportColumns);
-//		reportColumns.addAll(getAimNumTdPlaceholderColumn(totalColCount - preCol, 1));
-//		row.add();
-		return row;
+		return reportColumnList;
 	}
 
 	/**
@@ -1261,8 +1314,7 @@
 	 * @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();
 		}
@@ -1323,8 +1375,7 @@
 	 * @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));
 		}
@@ -1466,10 +1517,6 @@
 		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鐨勫睘鎬�
 	 *
@@ -1549,8 +1596,7 @@
 	 * @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 "";
 		}
@@ -1717,30 +1763,6 @@
 	 * @param num
 	 * @return
 	 */
-	public List<ReportColumn> getAimNumTdPlaceholderColumn(int num, int type) {
-		List<ReportColumn> columns = new ArrayList<>();
-		if (num <= 0) {
-			return columns;
-		}
-		if (type == 0) {
-			for (int i = 0; i < num; i++) {
-				columns.add(new ReportColumn());
-			}
-		} else {
-
-			ReportColumn column = new ReportColumn();
-			column.setColspan(num);
-			columns.add(column);
-		}
-		return columns;
-	}
-
-	/**
-	 * 鑾峰彇鎸囧畾涓暟鐨則d鍗犱綅
-	 *
-	 * @param num
-	 * @return
-	 */
 	public String getAimNumTdPlaceholder(int num, int type) {
 		StringBuilder result = new StringBuilder(64);
 		if (num <= 0) {
@@ -1798,8 +1820,7 @@
 	 * @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();
 		}

--
Gitblit v1.9.2