package com.product.server.report.service; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.product.common.lang.StringUtils; import com.product.core.entity.DataTableEntity; import com.product.core.entity.FieldSetEntity; import com.product.core.service.support.AbstractBaseService; import com.product.core.spring.context.SpringMVCContextHolder; import com.product.server.report.config.CmnConst; import com.product.util.BaseUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.*; /** * Copyright © 6c * * @Date: 2021-04-16 17:07 * @Author: 6c * @Description: */ @Component public class GroupReportService extends AbstractBaseService { @Autowired private DataListReportService dataListReportService; /** * 报表-解析 * @param recordDte 业务数据dte * @param totalName 总计名称 * @param reportConfigMap 报表配置缓存map * @param tableStyle * @return 获取分组报表的详情 */ public JSONObject getReport(DataTableEntity recordDte, String totalName, Map> reportConfigMap, StringBuilder tableStyle) { StringBuilder reportHtml = new StringBuilder(4096); // css StringBuilder cssHtml = dataListReportService.getCssHtml(); // 分组表头区和数据区 StringBuilder groupAndDataAreaHtml = new StringBuilder(1024); Map> headAndTailTitleDataMap = Maps.newHashMap(); int totalColCount = reportConfigMap.get(0).size(); int dataAreaColCount = getGroupAndDataAreaHtmlAndReturnDataAreaColCount(groupAndDataAreaHtml, reportConfigMap, headAndTailTitleDataMap, recordDte, totalName); totalColCount = Math.max(totalColCount, dataAreaColCount); // 头部标题区 StringBuilder headTitleHtml = null; if (!reportConfigMap.get(1).isEmpty()) { headTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head"); } // 底部标题区 StringBuilder tailTitleHtml = null; if (!reportConfigMap.get(3).isEmpty()) { tailTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail"); } reportHtml.append("\n\n") .append(cssHtml) .append(headTitleHtml == null ? "" : headTitleHtml) .append(groupAndDataAreaHtml) .append(tailTitleHtml == null ? "" : tailTitleHtml) .append("\n\n"); 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; } /** * 报表-解析-放入分组表头区和数据Html,返回列数 * @param groupAndDataAreaHtml html容器 * @param reportConfigMap 报表缓存数据map * @param headAndTailTitleDataMap 头部、尾部标题区数据字段map容器 * @param recordDte 数据源集合 * @param totalName 总计名称 * @return 数据区总列数 */ private int getGroupAndDataAreaHtmlAndReturnDataAreaColCount(StringBuilder groupAndDataAreaHtml, Map> reportConfigMap, Map> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName) { // 分组表头区字段缓存map Map groupAreaFieldConfigMap = dataListReportService.groupAndDataJSONObject2Map(reportConfigMap.get(2)); // 数据区字段缓存map Map dataAreaFieldConfigMap = dataListReportService.groupAndDataJSONObject2Map(reportConfigMap.get(0)); // 分组表头区分组统计字段名称list List groupAreaGroupStatisticsFieldNameList = Lists.newArrayList(); // 分组表头区分组字段名称list List groupAreaGroupFieldNameList = Lists.newArrayList(); // 分组表头区区域范围obj JSONObject groupAreaRangeObj = new JSONObject(); groupAreaFieldConfigMap.forEach((fieldName, fieldConfigObj) -> { groupAreaGroupFieldNameList.add(fieldName); if ("1".equals(fieldConfigObj.getString(CmnConst.ATTR_IS_STATISTICS))) { groupAreaGroupStatisticsFieldNameList.add(fieldName); } if (groupAreaRangeObj.getIntValue(CmnConst.MIN_X) == 0) { groupAreaRangeObj.put(CmnConst.MIN_X, fieldConfigObj.getIntValue(CmnConst.ATTR_X)); } else { groupAreaRangeObj.put(CmnConst.MIN_X, Math.min(groupAreaRangeObj.getIntValue(CmnConst.MIN_X), fieldConfigObj.getIntValue(CmnConst.ATTR_X))); } groupAreaRangeObj.put(CmnConst.MAX_X, Math.max(groupAreaRangeObj.getIntValue(CmnConst.MAX_X), fieldConfigObj.getIntValue(CmnConst.ATTR_X) + Math.max(1, fieldConfigObj.getIntValue(CmnConst.ATTR_COLSPAN)) - 1)); groupAreaRangeObj.put(CmnConst.MAX_Y, Math.max(groupAreaRangeObj.getIntValue(CmnConst.MAX_Y), fieldConfigObj.getIntValue(CmnConst.ATTR_Y) + Math.max(1, fieldConfigObj.getIntValue(CmnConst.ATTR_ROWSPAN)) - 1)); }); // 数据区分组统计字段名称list List dataAreaGroupStatisticsFieldNameList = Lists.newArrayList(); // 数据区分组字段名称list List dataAreaGroupFieldNameList = Lists.newArrayList(); // 数据区特殊统计字段名称list-分组表头区下统计字段 List dataAreaSpStatisticsFieldNameList = Lists.newArrayList(); // 数据区普通统计字段名称list-非数据区分组字段,非分组表头区下统计字段 List dataAreaCommonStatisticsFieldNameList = Lists.newArrayList(); dataAreaFieldConfigMap.forEach((fieldName, fieldConfigObj) -> { if ("1".equals(fieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) { dataAreaGroupFieldNameList.add(fieldName); if ("1".equals(fieldConfigObj.getString(CmnConst.ATTR_IS_STATISTICS))) { dataAreaGroupStatisticsFieldNameList.add(fieldName); } } else { if (fieldConfigObj.getIntValue(CmnConst.ATTR_X) < groupAreaRangeObj.getIntValue(CmnConst.MIN_X) || fieldConfigObj.getIntValue(CmnConst.ATTR_X) > groupAreaRangeObj.getIntValue(CmnConst.MAX_X)) { dataAreaCommonStatisticsFieldNameList.add(fieldName); } else { dataAreaSpStatisticsFieldNameList.add(fieldName); } } }); // 获取分组表头统计字段对应的数据区字段map Map> groupAreaStatisticsField2DataAreaFieldMap = getGroupAreaStatisticsField2DataAreaFieldMap(groupAreaFieldConfigMap, dataAreaFieldConfigMap); // 获取分组表头区末行分组字段对应数据区字段map Map> groupAreaLastStageField2DataAreaFieldMap = getGroupAreaLastStageField2DataAreaFieldMap(groupAreaFieldConfigMap, dataAreaFieldConfigMap, groupAreaRangeObj); // 获取指定数据集中包含的数据区字段集合 Set headAndTailFieldSet = Sets.newHashSet(); headAndTailFieldSet.addAll(dataListReportService.getDataFields(reportConfigMap.get(1))); headAndTailFieldSet.addAll(dataListReportService.getDataFields(reportConfigMap.get(3))); // 统计map Map statisticsMap = Maps.newLinkedHashMap(); // 分组表头区数据obj JSONObject groupAreaFieldRecordObj = new JSONObject(Maps.newTreeMap((o1, o2) -> dataListReportService.compare(o1, o2))); // 数据区分组字段obj JSONObject dataAreaFieldRecordObj = new JSONObject(Maps.newLinkedHashMap()); FieldSetEntity recordFse; for (int i = 0;i < recordDte.getRows();i++) { recordFse = recordDte.getFieldSetEntity(i); // 获取头部、尾部标题区数据字段 dataListReportService.getHeadAndTailTitleDataMap(headAndTailTitleDataMap, headAndTailFieldSet, recordFse); // 获取分组表头区数据obj getGroupAreaFieldRecordObj(groupAreaFieldRecordObj, groupAreaFieldConfigMap, recordFse, groupAreaStatisticsField2DataAreaFieldMap, groupAreaLastStageField2DataAreaFieldMap); // 获取数据区分组字段obj getDataAreaGroupFieldRecordObj(dataAreaFieldRecordObj, dataAreaFieldConfigMap, recordFse); // 获取数据区特殊字段的统计 statisticsDataAreaSpField(statisticsMap, dataAreaFieldConfigMap, dataAreaSpStatisticsFieldNameList, recordFse); // 获取数据区普通字段的统计 statisticsDataAreaCommonField(statisticsMap, dataAreaFieldConfigMap, dataAreaCommonStatisticsFieldNameList, recordFse); } // 获取分组表头区和数据区总列数 int totalColCount = getTotalColCount(groupAreaFieldRecordObj, dataAreaGroupFieldNameList.size(), dataAreaCommonStatisticsFieldNameList.size()); // 数据标题list List dataTitleList = Lists.newArrayList(); // 获取标题html groupAndDataAreaHtml.append(getDataAreaTitleHtml(dataTitleList, groupAreaFieldRecordObj, dataAreaFieldConfigMap, groupAreaRangeObj, dataAreaCommonStatisticsFieldNameList)); // 获取内容html groupAndDataAreaHtml.append(getDataAreaDataHtml(dataTitleList, dataAreaFieldRecordObj, statisticsMap, totalName, dataAreaGroupFieldNameList, dataAreaFieldConfigMap)); return totalColCount; } /** * 获取分组表头统计字段对应的数据区字段map * @param groupAreaFieldConfigMap 分组表头区字段缓存map * @param dataAreaFieldConfigMap 数据区字段缓存map * @return 分组表头统计字段对应的数据区字段map */ private Map> getGroupAreaStatisticsField2DataAreaFieldMap(Map groupAreaFieldConfigMap, Map dataAreaFieldConfigMap) { Map> resultMap = Maps.newLinkedHashMap(); String groupAreaFieldName; JSONObject groupAreaFieldConfigObj; JSONObject dataAreaFieldConfigObj; for (Map.Entry groupAreaFieldConfigEntry : groupAreaFieldConfigMap.entrySet()) { groupAreaFieldConfigObj = groupAreaFieldConfigEntry.getValue(); if (!"1".equals(groupAreaFieldConfigObj.getString(CmnConst.ATTR_IS_STATISTICS))) { continue; } groupAreaFieldName = groupAreaFieldConfigEntry.getKey(); for (Map.Entry dataAreaFieldConfigEntry : dataAreaFieldConfigMap.entrySet()) { dataAreaFieldConfigObj = dataAreaFieldConfigEntry.getValue(); if (dataListReportService.transfer2List(dataAreaFieldConfigObj.get(CmnConst.ATTR_GROUP_AREA_GROUP_FIELD)).contains(groupAreaFieldName)) { resultMap.computeIfAbsent(groupAreaFieldName, k -> Lists.newArrayList()).add(dataAreaFieldConfigEntry.getKey()); } } } return resultMap; } /** * 获取分组表头区末行分组字段对应数据区字段map * @param groupAreaFieldConfigMap 分组表头区字段缓存map * @param dataAreaFieldConfigMap 数据区字段缓存map * @param groupAreaRangeObj 分组表头区范围obj * @return 分组表头区末行分组字段对应数据区字段map */ private Map> getGroupAreaLastStageField2DataAreaFieldMap(Map groupAreaFieldConfigMap, Map dataAreaFieldConfigMap, JSONObject groupAreaRangeObj) { Map> resultMap = Maps.newLinkedHashMap(); String groupFieldName; JSONObject groupAreaFieldConfigObj; JSONObject dataAreaFieldConfigObj; for (Map.Entry groupAreaFieldConfigEntry : groupAreaFieldConfigMap.entrySet()) { groupAreaFieldConfigObj = groupAreaFieldConfigEntry.getValue(); if (groupAreaFieldConfigObj.getIntValue(CmnConst.ATTR_Y) + Math.max(1, groupAreaFieldConfigObj.getIntValue(CmnConst.ATTR_ROWSPAN)) - 1 < groupAreaRangeObj.getIntValue(CmnConst.MAX_Y)) { continue; } groupFieldName = groupAreaFieldConfigEntry.getKey(); for (Map.Entry dataAreaFieldConfigEntry : dataAreaFieldConfigMap.entrySet()) { dataAreaFieldConfigObj = dataAreaFieldConfigEntry.getValue(); if (dataListReportService.transfer2List(dataAreaFieldConfigObj.get(CmnConst.ATTR_GROUP_AREA_GROUP_FIELD)).contains(groupFieldName)) { resultMap.computeIfAbsent(groupFieldName, k -> Lists.newArrayList()).add(dataAreaFieldConfigEntry.getKey()); } } } return resultMap; } /** * 获取标题-分组表头区数据obj * @param groupAreaFieldRecordObj 分组表头区字段记录obj * @param groupAreaFieldConfigMap 分组表头区字段缓存map * @param recordFse 业务数据记录 * @param groupAreaStatisticsField2DataAreaFieldMap 分组表头区统计字段对应数据区字段map * @param groupAreaLastStageField2DataAreaFieldMap 分组表头区末级字段对应数据区字段map */ private void getGroupAreaFieldRecordObj(JSONObject groupAreaFieldRecordObj, Map groupAreaFieldConfigMap, FieldSetEntity recordFse, Map> groupAreaStatisticsField2DataAreaFieldMap, Map> groupAreaLastStageField2DataAreaFieldMap) { JSONObject parentObj = groupAreaFieldRecordObj; JSONObject subObj; String value; List list; String groupAreaGroupFieldName; int i = 0; List statisticsFieldList; String realValue; for (Map.Entry entry : groupAreaFieldConfigMap.entrySet()) { list = Lists.newArrayList(); list.addAll(dataListReportService.transfer2List(entry.getValue().get(CmnConst.ATTR_GROUP_AREA_GROUP_FIELD))); list.add(entry.getKey()); for (;i < list.size();i++) { groupAreaGroupFieldName = list.get(i); realValue = dataListReportService.getRealValue(recordFse, groupAreaGroupFieldName); value = recordFse.getString(groupAreaGroupFieldName); if (parentObj.get(value) == null) { subObj = new JSONObject(Maps.newTreeMap((o1, o2) -> dataListReportService.compare(o1, o2))); parentObj.put(value, subObj); // 添加分组表头区分组统计字段对应数据区字段 if (groupAreaStatisticsField2DataAreaFieldMap.containsKey(groupAreaGroupFieldName)) { parentObj.put(value + CmnConst.STATISTICS_NAME, groupAreaStatisticsField2DataAreaFieldMap.get(groupAreaGroupFieldName)); statisticsFieldList = dataListReportService.transfer2List(parentObj.get(CmnConst.ATTR_STATISTICS_FIELD)); if (statisticsFieldList.isEmpty()) { parentObj.put(CmnConst.ATTR_STATISTICS_FIELD, statisticsFieldList); } if (!statisticsFieldList.contains(value + CmnConst.STATISTICS_NAME)) { statisticsFieldList.add(value + CmnConst.STATISTICS_NAME); } } // 添加分组表头区末级字段对应数据区字段 if (groupAreaLastStageField2DataAreaFieldMap.containsKey(groupAreaGroupFieldName)) { parentObj.put(value, groupAreaLastStageField2DataAreaFieldMap.get(groupAreaGroupFieldName)); } // 添加field_info if (StringUtils.isEmpty(parentObj.getString(CmnConst.ATTR_FIELD_INFO))) { parentObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(groupAreaGroupFieldName)); } if (!StringUtils.isEmpty(realValue)) { subObj.put(CmnConst.ATTR_REAL_VALUE, realValue); } } else { if (!(parentObj.get(value) instanceof JSONObject)) { continue; } subObj = parentObj.getJSONObject(value); } parentObj = subObj; } } } /** * 获取数据区分组字段obj * @param dataAreaFieldRecordObj 数据区字段记录obj * @param dataAreaFieldConfigMap 数据区字段缓存map * @param recordFse 业务数据记录 */ private void getDataAreaGroupFieldRecordObj(JSONObject dataAreaFieldRecordObj, Map dataAreaFieldConfigMap, FieldSetEntity recordFse) { JSONObject parentObj = dataAreaFieldRecordObj; JSONObject subObj; String value; List list; String groupAreaGroupFieldName; int i = 0; String dataAreaFieldName; JSONObject dataAreaFieldConfigObj; List statisticsFieldList; String realValue; for (Map.Entry entry : dataAreaFieldConfigMap.entrySet()) { dataAreaFieldConfigObj = entry.getValue(); if (!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) { break; } dataAreaFieldName = entry.getKey(); realValue = dataListReportService.getRealValue(recordFse, dataAreaFieldName); list = Lists.newArrayList(); list.addAll(dataListReportService.transfer2List(dataAreaFieldConfigObj.get(CmnConst.ATTR_DATA_AREA_GROUP_FIELD))); list.add(dataAreaFieldName); for (;i < list.size();i++) { groupAreaGroupFieldName = list.get(i); value = recordFse.getString(groupAreaGroupFieldName); subObj = parentObj.getJSONObject(value); if (subObj == null) { subObj = new JSONObject(Maps.newLinkedHashMap()); parentObj.put(value, subObj); } // 添加数据区分组统计字段 if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_STATISTICS))) { parentObj.put(value + CmnConst.STATISTICS_NAME, new JSONObject()); statisticsFieldList = dataListReportService.transfer2List(parentObj.get(CmnConst.ATTR_STATISTICS_FIELD)); if (statisticsFieldList.isEmpty()) { parentObj.put(CmnConst.ATTR_STATISTICS_FIELD, statisticsFieldList); } if (!statisticsFieldList.contains(value + CmnConst.STATISTICS_NAME)) { statisticsFieldList.add(value + CmnConst.STATISTICS_NAME); } } // 添加field_info if (StringUtils.isEmpty(parentObj.getString(CmnConst.ATTR_FIELD_INFO))) { parentObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(groupAreaGroupFieldName)); } if (!StringUtils.isEmpty(realValue)) { subObj.put(CmnConst.ATTR_REAL_VALUE, realValue); } parentObj = subObj; } } } /** * 获取数据区特殊字段的统计 * @param statisticsMap 统计map * @param dataAreaFieldConfigMap 数据区字段缓存map * @param dataAreaSpStatisticsFieldNameList 数据区特殊统计字段名称list(分组表头区下统计字段) * @param recordFse 业务数据记录 */ private void statisticsDataAreaSpField(Map statisticsMap, Map dataAreaFieldConfigMap, List dataAreaSpStatisticsFieldNameList, FieldSetEntity recordFse) { JSONObject dataAreaFieldConfigObj; List groupAreaGroupFieldNameList; List dataAreaGroupFieldNameList; String value; JSONObject keyObj; JSONObject valueObj; JSONObject groupAreaKeyObj; JSONObject dataAreaKeyObj; String statisticsType; for (String dataAreaFieldName : dataAreaSpStatisticsFieldNameList) { keyObj = new JSONObject(); groupAreaKeyObj = new JSONObject(); keyObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(dataAreaFieldName)); dataAreaFieldConfigObj = dataAreaFieldConfigMap.get(dataAreaFieldName); groupAreaGroupFieldNameList = dataListReportService.transfer2List(dataAreaFieldConfigObj.get(CmnConst.ATTR_GROUP_AREA_GROUP_FIELD)); dataAreaGroupFieldNameList = dataListReportService.transfer2List(dataAreaFieldConfigObj.get(CmnConst.ATTR_DATA_AREA_GROUP_FIELD)); value = dataListReportService.getValue(dataAreaFieldConfigObj, recordFse, dataAreaFieldName); statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS); for (String groupAreaGroupFieldName : groupAreaGroupFieldNameList) { dataAreaKeyObj = new JSONObject(); for (String dataAreaGroupFieldName : dataAreaGroupFieldNameList) { keyObj.remove(dataAreaGroupFieldName); } groupAreaKeyObj.put(groupAreaGroupFieldName, recordFse.getString(groupAreaGroupFieldName)); dataListReportService.extendJSONObject(keyObj, groupAreaKeyObj, null); valueObj = statisticsMap.get(keyObj); valueObj = dataListReportService.getStatisticsValueObj(valueObj, dataAreaFieldConfigObj, value, statisticsType, true); statisticsMap.put((JSONObject) keyObj.clone(), valueObj); for (String dataAreaGroupFieldName : dataAreaGroupFieldNameList) { dataAreaKeyObj.put(dataAreaGroupFieldName, recordFse.getString(dataAreaGroupFieldName)); keyObj = dataListReportService.extendJSONObject(keyObj, dataAreaKeyObj, null); valueObj = statisticsMap.get(keyObj); valueObj = dataListReportService.getStatisticsValueObj(valueObj, dataAreaFieldConfigObj, value, statisticsType, true); statisticsMap.put((JSONObject) keyObj.clone(), valueObj); } } } } /** * 取数据区普通字段的统计 * @param statisticsMap 统计map * @param dataAreaFieldConfigMap 数据区字段缓存map * @param dataAreaCommonStatisticsFieldNameList 数据区普通统计字段名称list * @param recordFse 业务数据记录 */ private void statisticsDataAreaCommonField(Map statisticsMap, Map dataAreaFieldConfigMap, List dataAreaCommonStatisticsFieldNameList, FieldSetEntity recordFse) { JSONObject dataAreaFieldConfigObj; List dataAreaGroupFieldNameList; String value; JSONObject dataAreaKeyObj = new JSONObject(); JSONObject keyObj; JSONObject valueObj; String statisticsType; int i; for (String dataAreaFieldName : dataAreaCommonStatisticsFieldNameList) { i = 0; keyObj = new JSONObject(); dataAreaFieldConfigObj = dataAreaFieldConfigMap.get(dataAreaFieldName); dataAreaGroupFieldNameList = dataListReportService.transfer2List(dataAreaFieldConfigObj.get(CmnConst.ATTR_DATA_AREA_GROUP_FIELD)); statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS); value = dataListReportService.getValue(dataAreaFieldConfigObj, recordFse, dataAreaFieldName); keyObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(dataAreaFieldName)); valueObj = statisticsMap.get(keyObj); valueObj = dataListReportService.getStatisticsValueObj(valueObj, dataAreaFieldConfigObj, value, statisticsType, false); statisticsMap.put((JSONObject) keyObj.clone(), valueObj); for (String dataAreaGroupFieldName : dataAreaGroupFieldNameList) { i++; dataAreaKeyObj.put(dataAreaGroupFieldName, recordFse.getString(dataAreaGroupFieldName)); keyObj = dataListReportService.extendJSONObject(keyObj, dataAreaKeyObj, null); valueObj = statisticsMap.get(keyObj); valueObj = dataListReportService.getStatisticsValueObj(valueObj, dataAreaFieldConfigObj, value, statisticsType, i == dataAreaGroupFieldNameList.size()); statisticsMap.put((JSONObject) keyObj.clone(), valueObj); } } } /** * 获取分组表头区和数据区总列数 * @param groupAreaFieldRecordObj 分组表头区字段记录obj * @param dataAreaGroupFieldCount 数据区分组字段个数 * @param dataAreaCommonStatisticsFieldCount 数据区普通统计字段个数 * @return 分组表头区和数据区总列数 */ private int getTotalColCount(JSONObject groupAreaFieldRecordObj, int dataAreaGroupFieldCount, int dataAreaCommonStatisticsFieldCount) { int groupAreaColCount = getGroupAreaColCount(groupAreaFieldRecordObj, 0); return groupAreaColCount + dataAreaGroupFieldCount + dataAreaCommonStatisticsFieldCount; } /** * 获取分组表头区总列数 * @param curOperateObj 当前操作的obj * @param groupAreaColCount 分组表头区列数 * @return 分组表头区总列数 */ private int getGroupAreaColCount(JSONObject curOperateObj, int groupAreaColCount) { if (curOperateObj == null) { return groupAreaColCount; } String key; Object value; for (Map.Entry entry : curOperateObj.entrySet()) { key = entry.getKey(); if (CmnConst.ATTR_FIELD_INFO.equals(key) || CmnConst.ATTR_STATISTICS_FIELD.equals(key)) { continue; } value = entry.getValue(); if (value == null) { continue; } if (value instanceof List) { groupAreaColCount += ((List) value).size(); } else if (value instanceof JSONObject) { groupAreaColCount = getGroupAreaColCount((JSONObject) value, groupAreaColCount); } } return groupAreaColCount; } /** * 获取标题html * @param dataTitleList 数据标题list * @param groupAreaFieldRecordObj 分组表头区字段记录obj * @param dataAreaFieldConfigMap 数据区字段缓存map * @param groupAreaRangeObj 分组表头去范围obj * @param dataAreaCommonStatisticsFieldNameList 数据区普通统计字段名称list * @return 数据标题html */ private StringBuilder getDataAreaTitleHtml(List dataTitleList, JSONObject groupAreaFieldRecordObj, Map dataAreaFieldConfigMap, JSONObject groupAreaRangeObj, List dataAreaCommonStatisticsFieldNameList) { int maxRow = groupAreaRangeObj.getIntValue(CmnConst.MAX_Y); List> groupAreaRangeTitleList = Lists.newArrayList(); for (int i = 0;i <= maxRow;i++) { groupAreaRangeTitleList.add(Lists.newArrayList()); } getGroupAreaRangeTitleList(dataAreaFieldConfigMap, groupAreaFieldRecordObj, groupAreaRangeTitleList, new JSONObject(), 0, maxRow, null); List beforeGroupAreaTitleList = Lists.newArrayList(); List afterGroupAreaTitleList = Lists.newArrayList(); String dataAreaFieldName; JSONObject dataAreaFieldConfigObj; JSONObject titleObj; for (Map.Entry entry : dataAreaFieldConfigMap.entrySet()) { dataAreaFieldName = entry.getKey(); dataAreaFieldConfigObj = entry.getValue(); titleObj = new JSONObject(); // titleObj.put(CmnConst.ATTR_FIELD_INFO, getFieldInfo(dataAreaFieldConfigObj)); titleObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(dataAreaFieldName)); if (dataAreaCommonStatisticsFieldNameList.contains(dataAreaFieldName)) { titleObj.put(CmnConst.ATTR_SHOW_NAME, dataListReportService.getStatisticsDesc(dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS), dataAreaFieldConfigObj.getString(CmnConst.ATTR_SHOW_NAME))); } else { titleObj.put(CmnConst.ATTR_SHOW_NAME, dataAreaFieldConfigObj.getString(CmnConst.ATTR_SHOW_NAME)); } titleObj.put(CmnConst.ATTR_ROWSPAN, maxRow + 1); titleObj.put(CmnConst.ATTR_COLSPAN, 1); if (dataAreaFieldConfigObj.getIntValue(CmnConst.ATTR_X) < groupAreaRangeObj.getIntValue(CmnConst.MIN_X)) { beforeGroupAreaTitleList.add(titleObj); } if (dataAreaFieldConfigObj.getIntValue(CmnConst.ATTR_X) > groupAreaRangeObj.getIntValue(CmnConst.MAX_X)) { if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) { beforeGroupAreaTitleList.add(titleObj); } else { afterGroupAreaTitleList.add(titleObj); } } } dataTitleList.addAll(groupAreaRangeTitleList.get(maxRow)); dataTitleList.addAll(afterGroupAreaTitleList); List firstList = Lists.newArrayList(); firstList.addAll(beforeGroupAreaTitleList); firstList.addAll(groupAreaRangeTitleList.get(0)); firstList.addAll(afterGroupAreaTitleList); groupAreaRangeTitleList.set(0, firstList); StringBuilder html = new StringBuilder(1024); int rowspan; int colspan; String value; for (List rowList : groupAreaRangeTitleList) { html.append("\n\n "); for (JSONObject dataTitleObj : rowList) { rowspan = Math.max(1, dataTitleObj.getIntValue(CmnConst.ATTR_ROWSPAN)); colspan = Math.max(1, dataTitleObj.getIntValue(CmnConst.ATTR_COLSPAN)); value = dataTitleObj.getString(CmnConst.ATTR_SHOW_NAME); 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); } html.append("").append(value == null ? "" : value).append(""); } html.append("\n"); } return html; } /** * 获取分组表头区范围的标题list * @param dataAreaFieldConfigMap 数据区字段缓存map * @param curOperateObj 当前操作obj * @param groupAreaRangeTitleList 分组表头区范围下数据标题list * @param preTitleObj 最近操作的标题obj * @param row 当前行数 * @param maxRow 最大行数 */ private void getGroupAreaRangeTitleList(Map dataAreaFieldConfigMap, JSONObject curOperateObj, List> groupAreaRangeTitleList, JSONObject preTitleObj, int row, int maxRow, String parentFieldName) { if (curOperateObj == null || curOperateObj.isEmpty()) { return; } String key; Object value; JSONObject curTitleObj; String groupAreaFieldName = dataListReportService.fieldInfo2FieldName(curOperateObj.getString(CmnConst.ATTR_FIELD_INFO)); List statisticsFieldList = dataListReportService.transfer2List(curOperateObj.get(CmnConst.ATTR_STATISTICS_FIELD)); String realValue = curOperateObj.getString(CmnConst.ATTR_REAL_VALUE); String fieldName = dataListReportService.fieldInfo2FieldName(curOperateObj.getString(CmnConst.ATTR_FIELD_INFO)); String newKey; JSONObject realValueObj; for (Map.Entry entry : curOperateObj.entrySet()) { curTitleObj = dataListReportService.extendJSONObject(null, preTitleObj, null); if (!StringUtils.isEmpty(realValue) && !StringUtils.isEmpty(parentFieldName)) { if (curTitleObj.get(CmnConst.ATTR_REAL_VALUE) == null) { realValueObj = new JSONObject(); curTitleObj.put(CmnConst.ATTR_REAL_VALUE, realValueObj); } else { realValueObj = (JSONObject) curTitleObj.get(CmnConst.ATTR_REAL_VALUE); } realValueObj.put(parentFieldName, realValue); } key = entry.getKey(); if (CmnConst.ATTR_FIELD_INFO.equals(key) || CmnConst.ATTR_STATISTICS_FIELD.equals(key) || CmnConst.ATTR_REAL_VALUE.equals(key)) { continue; } value = entry.getValue(); if (value == null) { continue; } curTitleObj.put(CmnConst.ATTR_SHOW_NAME, key); if (statisticsFieldList.contains(key)) { curTitleObj.put(CmnConst.ATTR_IS_STATISTICS_FIELD, "1"); newKey = key.replace(CmnConst.STATISTICS_NAME, ""); curTitleObj.put(groupAreaFieldName, newKey); curTitleObj.put(CmnConst.ATTR_GROUP_AREA_SUB_CNT, getSubCnt(curOperateObj.getJSONObject(newKey))); } else { curTitleObj.put(groupAreaFieldName, key); } groupAreaRangeTitleList.get(row).add(curTitleObj); if (value instanceof List) { curTitleObj.put(CmnConst.ATTR_COLSPAN, ((List) value).size()); curTitleObj.put(CmnConst.ATTR_ROWSPAN, maxRow - row); for (String dataAreaFieldName : (List) value) { JSONObject cloneTitleObj = (JSONObject) curTitleObj.clone(); cloneTitleObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(dataAreaFieldName)); cloneTitleObj.put(CmnConst.ATTR_COLSPAN, 1); cloneTitleObj.put(CmnConst.ATTR_ROWSPAN, 1); JSONObject dataAreaFieldConfigObj = dataAreaFieldConfigMap.get(dataAreaFieldName); cloneTitleObj.put(CmnConst.ATTR_SHOW_NAME, dataListReportService.getStatisticsDesc(dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS), dataAreaFieldConfigObj.getString(CmnConst.ATTR_SHOW_NAME))); groupAreaRangeTitleList.get(maxRow).add(cloneTitleObj); } } else { if (value instanceof JSONObject) { curTitleObj.put(CmnConst.ATTR_COLSPAN, getGroupAreaColCount((JSONObject) value, 0)); curTitleObj.put(CmnConst.ATTR_ROWSPAN, 1); getGroupAreaRangeTitleList(dataAreaFieldConfigMap, (JSONObject) value, groupAreaRangeTitleList, curTitleObj, row + 1, maxRow, fieldName); } } } } /** * 获取下级分组项数 * @param obj 待操作的obj * @return 下级分组项数 */ private int getSubCnt(JSONObject obj) { int count = 0; List statisticsFieldList = dataListReportService.transfer2List(obj.get(CmnConst.ATTR_STATISTICS_FIELD)); for (String key : obj.keySet()) { if (CmnConst.ATTR_FIELD_INFO.equals(key) || CmnConst.ATTR_STATISTICS_FIELD.equals(key) || statisticsFieldList.contains(key)) { continue; } count++; } return count; } /** * 获取内容html * @param dataTitleList 数据标题list * @param dataAreaFieldRecordObj 数据区字段记录obj * @param statisticsMap 统计map * @param totalName 总计名称,非空-需要总计 * @param dataAreaGroupFieldNameList 数据区分组字段名称list * @param dataAreaFieldConfigMap 数据区字段缓存map * @return 业务数据内容html */ private StringBuilder getDataAreaDataHtml(List dataTitleList, JSONObject dataAreaFieldRecordObj, Map statisticsMap, String totalName, List dataAreaGroupFieldNameList, Map dataAreaFieldConfigMap) { List> dataAreaGroupFieldDataList = Lists.newArrayList(); getDataAreaGroupFieldDataList(dataAreaFieldRecordObj, dataAreaGroupFieldDataList, new JSONObject(), 1, 1, dataAreaGroupFieldNameList.size(), null); List groupTitleList = Lists.newArrayList(); JSONObject obj; for (List rowList : dataAreaGroupFieldDataList) { obj = dataListReportService.extendJSONObject(null, rowList.get(rowList.size() - 1), Arrays.asList(CmnConst.ATTR_ROWSPAN, CmnConst.ATTR_COLSPAN, CmnConst.ATTR_SHOW_NAME, CmnConst.ATTR_IS_STATISTICS_FIELD), -1); groupTitleList.add(obj); } StringBuilder html = new StringBuilder(1024); JSONObject dataAreaGroupFieldObj; int rowspan; int colspan; String value; JSONObject groupTitleObj; JSONObject keyObj; JSONObject valueObj; String statisticsType; JSONObject dataAreaFieldConfigObj; int groupAreaSubCnt; int dataAreaSubCnt; List curRowList; int index; for (int i = 0;i < dataAreaGroupFieldDataList.size();i++) { index = 0; curRowList = dataAreaGroupFieldDataList.get(i); if (!curRowList.isEmpty()) { for (int j = 0; j < curRowList.size(); j++) { dataAreaGroupFieldObj = curRowList.get(j); if (dataAreaGroupFieldObj.isEmpty()) { continue; } if (index == 0) { if ("1".equals(dataAreaGroupFieldObj.getString(CmnConst.ATTR_IS_STATISTICS_FIELD))) { html.append("\n\n "); } else { html.append("\n\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("").append(value == null ? "" : value).append(""); index++; } } else { html.append("\n\n "); } groupTitleObj = groupTitleList.get(i); for (JSONObject dataTitleObj : dataTitleList) { keyObj = dataListReportService.extendJSONObject((JSONObject) groupTitleObj.clone(), dataTitleObj, Arrays.asList(CmnConst.ATTR_ROWSPAN, CmnConst.ATTR_COLSPAN, CmnConst.ATTR_SHOW_NAME, CmnConst.ATTR_IS_STATISTICS_FIELD, CmnConst.ATTR_REAL_VALUE), -1); dataAreaFieldConfigObj = dataAreaFieldConfigMap.get(dataListReportService.fieldInfo2FieldName(dataTitleObj.getString(CmnConst.ATTR_FIELD_INFO))); if (dataAreaFieldConfigObj != null) { groupAreaSubCnt = keyObj.getIntValue(CmnConst.ATTR_GROUP_AREA_SUB_CNT); dataAreaSubCnt = keyObj.getIntValue(CmnConst.ATTR_DATA_AREA_SUB_CNT); keyObj.remove(CmnConst.ATTR_GROUP_AREA_SUB_CNT); keyObj.remove(CmnConst.ATTR_DATA_AREA_SUB_CNT); keyObj.remove(CmnConst.ATTR_REAL_VALUE); statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS); valueObj = statisticsMap.get(keyObj); if (valueObj == null || valueObj.isEmpty()) { value = getFinalValue(keyObj, dataAreaFieldConfigObj, statisticsMap); } else { if (CmnConst.ATTR_STATISTICS_AVG.equals(statisticsType) && "1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_AVG_TYPE))) { if (dataAreaSubCnt == 0 && groupAreaSubCnt == 0) { value = valueObj.getString(statisticsType); } else { value = getTwoTypesGroupAvgStatisticsValue(dataAreaSubCnt, groupAreaSubCnt, valueObj, dataAreaFieldConfigObj, statisticsType); } } else { value = valueObj.getString(statisticsType); } valueObj.put(CmnConst.ATTR_FINAL_VALUE, value); } } else { value = ""; } html.append("").append(value == null ? "" : value).append(""); } html.append("\n"); } // 总计 if (!StringUtils.isEmpty(totalName)) { html.append(getTotalStatisticsHtml(statisticsMap, dataTitleList, dataAreaFieldConfigMap, dataAreaGroupFieldNameList.size(), getSubCnt(dataAreaFieldRecordObj), totalName)); } return html; } /** * 获取数据区分组字段数据list * @param curOperateObj 当前操作obj * @param dataAreaGroupFieldDataList 数据区分组字段数据list * @param preObj 最近操作的obj * @param row 当前行数 * @param maxCol 最大列数 * @return 数据区分组字段数据list */ private int getDataAreaGroupFieldDataList(JSONObject curOperateObj, List> dataAreaGroupFieldDataList, JSONObject preObj, int row, int col, int maxCol, String parentFieldName) { String key; Object value; JSONObject curObj; JSONObject topLeftCornerObj; String dataAreaFieldName = dataListReportService.fieldInfo2FieldName(curOperateObj.getString(CmnConst.ATTR_FIELD_INFO)); List statisticsFieldList = dataListReportService.transfer2List(curOperateObj.get(CmnConst.ATTR_STATISTICS_FIELD)); String realValue = curOperateObj.getString(CmnConst.ATTR_REAL_VALUE); JSONObject objValue; String newKey; List curRowList; JSONObject realValueObj; for (Map.Entry entry : curOperateObj.entrySet()) { curObj = dataListReportService.extendJSONObject(null, preObj, null); key = entry.getKey(); if (CmnConst.ATTR_FIELD_INFO.equals(key) || CmnConst.ATTR_STATISTICS_FIELD.equals(key) || CmnConst.ATTR_REAL_VALUE.equals(key)) { continue; } value = entry.getValue(); if (value == null) { continue; } if (!StringUtils.isEmpty(realValue) && !StringUtils.isEmpty(parentFieldName)) { if (curObj.get(CmnConst.ATTR_REAL_VALUE) == null) { realValueObj = new JSONObject(); curObj.put(CmnConst.ATTR_REAL_VALUE, realValueObj); } else { realValueObj = (JSONObject) curObj.get(CmnConst.ATTR_REAL_VALUE); } realValueObj.put(parentFieldName, realValue); } if (dataAreaGroupFieldDataList.size() < row) { curRowList = Lists.newArrayList(); dataAreaGroupFieldDataList.add(curRowList); } else { curRowList = dataAreaGroupFieldDataList.get(row - 1); } if (curRowList.size() < col - 1) { for (int i = 0; i < col - 1; i++) { curRowList.add(new JSONObject()); } } curObj.put(CmnConst.ATTR_SHOW_NAME, key); if (statisticsFieldList.contains(key)) { curObj.put(CmnConst.ATTR_IS_STATISTICS_FIELD, "1"); newKey = key.replace(CmnConst.STATISTICS_NAME, ""); curObj.put(dataAreaFieldName, newKey); curObj.put(CmnConst.ATTR_DATA_AREA_SUB_CNT, getSubCnt(curOperateObj.getJSONObject(newKey))); } else { curObj.put(dataAreaFieldName, key); } curObj.put(CmnConst.ATTR_ROWSPAN, 1); curObj.put(CmnConst.ATTR_COLSPAN, 1); curRowList.add(curObj); if (value instanceof JSONObject) { objValue = (JSONObject) value; if (objValue.isEmpty()) { curObj.put(CmnConst.ATTR_COLSPAN, maxCol - col + 1); if (row > 1 && col > 1) { int emptyCount = 0; for (JSONObject obj : curRowList) { if (obj.isEmpty()) { emptyCount++; } else { break; } } for (int j = 0; j < emptyCount; j++) { int curRow = row - 2; topLeftCornerObj = dataAreaGroupFieldDataList.get(curRow).get(j); while (topLeftCornerObj.isEmpty() && curRow > 0) { curRow--; topLeftCornerObj = dataAreaGroupFieldDataList.get(curRow).get(j); } topLeftCornerObj.put(CmnConst.ATTR_ROWSPAN, topLeftCornerObj.getIntValue(CmnConst.ATTR_ROWSPAN) + 1); } } row++; continue; } if (objValue.size() == 1&& objValue.containsKey(CmnConst.ATTR_REAL_VALUE)) { row++; continue; } row = getDataAreaGroupFieldDataList(objValue, dataAreaGroupFieldDataList, curObj, row, col + 1, maxCol, dataAreaFieldName); } } return row; } /** * 获取总计html * @param statisticsMap 统计map * @param dataTitleList 数据标题list * @param dataAreaFieldConfigMap 数据区字段缓存map * @param dataAreaGroupFieldCount 数据区分组字段个数 * @param dataAreaSubCnt 数据区下级分组项数 * @param totalName 总计名称 * @return */ private StringBuilder getTotalStatisticsHtml(Map statisticsMap, List dataTitleList, Map dataAreaFieldConfigMap, int dataAreaGroupFieldCount, int dataAreaSubCnt, String totalName) { StringBuilder html = new StringBuilder(256); html.append("\n\n "); html.append("").append(totalName).append(""); JSONObject dataTitleObj; JSONObject keyObj; JSONObject dataAreaFieldConfigObj; String statisticsType; JSONObject valueObj; String value; int groupAreaSubCnt; for (int i = 0;i < dataTitleList.size();i++) { 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("").append(value == null ? "" : value).append(""); } html.append("\n"); return html; } /** * 获取统计方式为“最终统计”的值 * @param keyObj * @param dataAreaFieldConfigObj * @param statisticsMap * @return */ private String getFinalValue(JSONObject keyObj, JSONObject dataAreaFieldConfigObj, Map statisticsMap) { JSONObject valueObj; String value; if (CmnConst.ATTR_STATISTICS_FINAL_STATISTICS.equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS)) && "1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_CUSTOM_FIELD)) && !StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_FORMULA))) { // 统计方式为“最终统计” String formula = dataAreaFieldConfigObj.getString(CmnConst.ATTR_FORMULA); List suitList = dataListReportService.getSuitContent(formula, "\\{#((?!\\{).)+#\\}"); JSONObject tempObj = (JSONObject) keyObj.clone(); for (String suitContent : suitList) { tempObj.put(CmnConst.ATTR_FIELD_INFO, suitContent); valueObj = statisticsMap.get(tempObj); formula = formula.replace(suitContent, (valueObj == null || valueObj.getString(CmnConst.ATTR_FINAL_VALUE) == null ? "0" : valueObj.getString(CmnConst.ATTR_FINAL_VALUE)) + "d"); } try { value = BaseUtil.executeExpression(formula.replace("/0", "/1").replaceAll("\\/\\{#[\\w]+#}", "/1").replaceAll("\\{#[\\w]+#}", "0"), Maps.newHashMap()).toString(); } catch (Exception e) { SpringMVCContextHolder.getSystemLogger().error(e); value = ""; } } else { value = ""; } return value; } /** * 获取行列两种不同的下级分组平均值 * @param dataAreaSubCnt 按照数据区分组的下级分组项数 * @param groupAreaSubCnt 按照分组表头去分组的下级分组项数 * @param curFieldStatisticsObj 当前字段统计obj * @param dataAreaFieldConfigObj 当前数据区字段缓存obj * @param statisticsType 统计类型 * @return 按照下级分组项进行平均的行列平均值 */ private String getTwoTypesGroupAvgStatisticsValue(int dataAreaSubCnt, int groupAreaSubCnt, JSONObject curFieldStatisticsObj, JSONObject dataAreaFieldConfigObj, String statisticsType) { // 列下级分组 StringBuilder value = new StringBuilder(32); String dataAreaValue = getGroupAreaGroupAvgStatisticsValue(dataAreaSubCnt, curFieldStatisticsObj, dataAreaFieldConfigObj, statisticsType, CmnConst.ATTR_STATISTICS_DATA_AREA_AVG, dataAreaSubCnt == 0); String groupAreaValue = getGroupAreaGroupAvgStatisticsValue(groupAreaSubCnt, curFieldStatisticsObj, dataAreaFieldConfigObj, statisticsType, CmnConst.ATTR_STATISTICS_GROUP_AREA_AVG, groupAreaSubCnt == 0); if (dataAreaSubCnt > 0) { value.append(dataAreaValue); } if (dataAreaSubCnt > 0 && groupAreaSubCnt > 0) { value.append("\\"); } if (groupAreaSubCnt > 0) { value.append(groupAreaValue); } return value.toString(); } /** * 获取指定类型的下级分组平均值 * @param subCnt 下级分组项数 * @param curFieldStatisticsObj 当前字段统计obj * @param dataAreaFieldConfigObj 当前数据区字段缓存obj * @param statisticsType 统计类型 * @param avgType CmnConst.ATTR_STATISTICS_DATA_AREA_AVG-行;CmnConst.ATTR_STATISTICS_GROUP_AREA_AVG-列 * @return 按照下级分组项进行平均的平均值 */ private String getGroupAreaGroupAvgStatisticsValue(int subCnt, JSONObject curFieldStatisticsObj, JSONObject dataAreaFieldConfigObj, String statisticsType, String avgType, boolean lastStage) { String value; if (subCnt > 0) { curFieldStatisticsObj.put(CmnConst.ATTR_STATISTICS_SUB_CNT, subCnt); dataListReportService.getAvgValue(curFieldStatisticsObj, dataAreaFieldConfigObj, lastStage); value = curFieldStatisticsObj.getString(statisticsType); curFieldStatisticsObj.put(avgType, value); } else { value = curFieldStatisticsObj.getString(statisticsType); } return value == null ? "" : value; } }