|
|
@@ -1,6 +1,7 @@
|
|
|
package com.usky.ems.service.impl;
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.usky.common.core.exception.BusinessException;
|
|
|
import com.usky.common.security.utils.SecurityUtils;
|
|
|
import com.usky.ems.domain.DmpDevice;
|
|
|
import com.usky.ems.domain.EmsDevice;
|
|
|
@@ -17,7 +18,11 @@ import org.springframework.util.StringUtils;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
import java.io.IOException;
|
|
|
import java.io.OutputStream;
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.nio.charset.StandardCharsets;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@@ -29,6 +34,9 @@ public class EmsReportServiceImpl implements EmsReportService {
|
|
|
|
|
|
private static final String[] ENERGY_TYPE_NAMES = {"", "电", "水", "气"};
|
|
|
|
|
|
+ private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+
|
|
|
+
|
|
|
@Autowired
|
|
|
private DmpDeviceMapper dmpDeviceMapper;
|
|
|
@Autowired
|
|
|
@@ -150,4 +158,546 @@ public class EmsReportServiceImpl implements EmsReportService {
|
|
|
throw new RuntimeException("导出失败", e);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public EnergyReportResponse getEnergyReport(EnergyReportRequest request) {
|
|
|
+ if (request == null || request.getDeviceList() == null || request.getDeviceList().isEmpty()) {
|
|
|
+ return createEmptyEnergyReport();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 解析时间
|
|
|
+ LocalDateTime startTime = parseDateTime(request.getStartTime());
|
|
|
+ LocalDateTime endTime = parseDateTime(request.getEndTime());
|
|
|
+ if (startTime == null || endTime == null) {
|
|
|
+ return createEmptyEnergyReport();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 校验时间参数
|
|
|
+ validateTimeParams(startTime, endTime, request.getTimeType());
|
|
|
+
|
|
|
+ // 生成列定义
|
|
|
+ List<EnergyReportResponse.ColumnItem> columnList = generateEnergyReportColumns(request.getTimeType(), startTime, endTime);
|
|
|
+
|
|
|
+ // 生成数据列表
|
|
|
+ List<EnergyReportResponse.ValueItem> valueList = generateEnergyReportData(request, startTime, endTime);
|
|
|
+
|
|
|
+ EnergyReportResponse response = new EnergyReportResponse();
|
|
|
+ response.setColumnList(columnList);
|
|
|
+ response.setValueList(valueList);
|
|
|
+
|
|
|
+ return response;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ItemReportResponse getItemReport(ItemReportRequest request) {
|
|
|
+ if (request == null || request.getItemCodes() == null || request.getItemCodes().isEmpty()) {
|
|
|
+ return createEmptyItemReport();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 解析时间
|
|
|
+ LocalDateTime startTime = parseDateTime(request.getStartTime());
|
|
|
+ LocalDateTime endTime = parseDateTime(request.getEndTime());
|
|
|
+ if (startTime == null || endTime == null) {
|
|
|
+ return createEmptyItemReport();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 校验时间参数
|
|
|
+ validateTimeParams(startTime, endTime, request.getDateType());
|
|
|
+
|
|
|
+ // 生成标题列
|
|
|
+ List<ItemReportResponse.TitleItem> titleList = generateItemReportTitles(request.getDateType(), startTime, endTime);
|
|
|
+
|
|
|
+ // 生成数据列表
|
|
|
+ List<Map<String, Object>> dataList = generateItemReportData(request, startTime, endTime);
|
|
|
+
|
|
|
+ ItemReportResponse response = new ItemReportResponse();
|
|
|
+ response.setTitleList(titleList);
|
|
|
+ response.setDataList(dataList);
|
|
|
+
|
|
|
+ return response;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public SpaceReportResponse getSpaceReport(SpaceReportRequest request) {
|
|
|
+ if (request == null || request.getSpaces() == null || request.getSpaces().isEmpty()) {
|
|
|
+ return createEmptySpaceReport();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 解析时间
|
|
|
+ LocalDateTime startTime = parseDateTime(request.getStartTime());
|
|
|
+ LocalDateTime endTime = parseDateTime(request.getEndTime());
|
|
|
+ if (startTime == null || endTime == null) {
|
|
|
+ return createEmptySpaceReport();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 校验时间参数
|
|
|
+ validateTimeParams(startTime, endTime, request.getDateType());
|
|
|
+
|
|
|
+ // 生成列定义
|
|
|
+ List<EnergyReportResponse.ColumnItem> columnList = generateSpaceReportColumns(request.getDateType(), startTime, endTime);
|
|
|
+
|
|
|
+ // 生成数据列表
|
|
|
+ List<Map<String, Object>> valueList = generateSpaceReportData(request, startTime, endTime);
|
|
|
+
|
|
|
+ // 计算总计
|
|
|
+ Number total = calculateSpaceReportTotal(valueList);
|
|
|
+
|
|
|
+ SpaceReportResponse response = new SpaceReportResponse();
|
|
|
+ response.setColumnList(columnList);
|
|
|
+ response.setValueList(valueList);
|
|
|
+ response.setTotal(total);
|
|
|
+
|
|
|
+ return response;
|
|
|
+ }
|
|
|
+
|
|
|
+ // ==================== 能源报表私有方法 ====================
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成能源报表列定义
|
|
|
+ */
|
|
|
+ private List<EnergyReportResponse.ColumnItem> generateEnergyReportColumns(String timeType, LocalDateTime startTime, LocalDateTime endTime) {
|
|
|
+ List<EnergyReportResponse.ColumnItem> columns = new ArrayList<>();
|
|
|
+
|
|
|
+ // 固定列
|
|
|
+ columns.add(createColumn("设备名称", "deviceName", true));
|
|
|
+ columns.add(createColumn("通讯地址", "commAddress", true));
|
|
|
+ columns.add(createColumn("功能点", "identifier", true));
|
|
|
+ columns.add(createColumn("合计", "total", true));
|
|
|
+
|
|
|
+ // 动态时间列
|
|
|
+ List<String> timeLabels = generateTimeLabels(timeType, startTime, endTime);
|
|
|
+ for (String label : timeLabels) {
|
|
|
+ columns.add(createColumn(label, "_" + label.replace("时", "").replace("日", "").replace("月", ""), false));
|
|
|
+ }
|
|
|
+
|
|
|
+ return columns;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成能源报表数据
|
|
|
+ */
|
|
|
+ private List<EnergyReportResponse.ValueItem> generateEnergyReportData(EnergyReportRequest request, LocalDateTime startTime, LocalDateTime endTime) {
|
|
|
+ List<EnergyReportResponse.ValueItem> valueList = new ArrayList<>();
|
|
|
+
|
|
|
+ for (EnergyReportRequest.DeviceItem device : request.getDeviceList()) {
|
|
|
+ if (device == null || StringUtils.isEmpty(device.getId())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询该设备的能耗数据
|
|
|
+ Map<String, String> timeData = queryDeviceEnergyData(device.getId(), startTime, endTime, request.getTimeType());
|
|
|
+
|
|
|
+ // 计算合计
|
|
|
+ String total = calculateTotal(timeData);
|
|
|
+
|
|
|
+ EnergyReportResponse.ValueItem item = new EnergyReportResponse.ValueItem();
|
|
|
+ item.setDeviceId(device.getId());
|
|
|
+ item.setDeviceName(device.getName());
|
|
|
+ item.setCommAddress(device.getCommAddress());
|
|
|
+ item.setIdentifier(request.getFuncList() != null && !request.getFuncList().isEmpty()
|
|
|
+ ? request.getFuncList().get(0).getIdentifierName() : "-");
|
|
|
+ item.setTotal(total);
|
|
|
+ item.setTimeData(timeData);
|
|
|
+
|
|
|
+ valueList.add(item);
|
|
|
+ }
|
|
|
+
|
|
|
+ return valueList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询设备能耗数据(模拟实现,实际应从TDengine或能耗表查询)
|
|
|
+ */
|
|
|
+ private Map<String, String> queryDeviceEnergyData(String deviceId, LocalDateTime startTime, LocalDateTime endTime, String timeType) {
|
|
|
+ Map<String, String> data = new LinkedHashMap<>();
|
|
|
+
|
|
|
+ // TODO: 实际应从数据库查询真实数据
|
|
|
+ // 这里使用模拟数据
|
|
|
+ List<String> timeLabels = generateTimeLabels(timeType, startTime, endTime);
|
|
|
+ for (String label : timeLabels) {
|
|
|
+ String key = "_" + label.replace("时", "").replace("日", "").replace("月", "");
|
|
|
+ data.put(key, "-"); // 模拟无数据
|
|
|
+ }
|
|
|
+
|
|
|
+ return data;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算合计值
|
|
|
+ */
|
|
|
+ private String calculateTotal(Map<String, String> timeData) {
|
|
|
+ if (timeData == null || timeData.isEmpty()) {
|
|
|
+ return "-";
|
|
|
+ }
|
|
|
+
|
|
|
+ BigDecimal sum = BigDecimal.ZERO;
|
|
|
+ boolean hasData = false;
|
|
|
+ for (String value : timeData.values()) {
|
|
|
+ if (!"-".equals(value)) {
|
|
|
+ try {
|
|
|
+ sum = sum.add(new BigDecimal(value));
|
|
|
+ hasData = true;
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ // 忽略无效数据
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return hasData ? sum.toString() : "-";
|
|
|
+ }
|
|
|
+
|
|
|
+ // ==================== 分项报表私有方法 ====================
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成分项报表标题列
|
|
|
+ */
|
|
|
+ private List<ItemReportResponse.TitleItem> generateItemReportTitles(String dateType, LocalDateTime startTime, LocalDateTime endTime) {
|
|
|
+ List<ItemReportResponse.TitleItem> titles = new ArrayList<>();
|
|
|
+
|
|
|
+ // 固定列
|
|
|
+ titles.add(createTitleItem("name", true, "分项名称", null));
|
|
|
+ titles.add(createTitleItem("total", true, "合计", null));
|
|
|
+
|
|
|
+ // 动态时间列
|
|
|
+ List<String> timeLabels = generateTimeLabels(dateType, startTime, endTime);
|
|
|
+ int index = 1;
|
|
|
+ for (String label : timeLabels) {
|
|
|
+ titles.add(createTitleItem("_" + index, false, label, index));
|
|
|
+ index++;
|
|
|
+ }
|
|
|
+
|
|
|
+ return titles;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成分项报表数据
|
|
|
+ */
|
|
|
+ private List<Map<String, Object>> generateItemReportData(ItemReportRequest request, LocalDateTime startTime, LocalDateTime endTime) {
|
|
|
+ List<Map<String, Object>> dataList = new ArrayList<>();
|
|
|
+
|
|
|
+ for (ItemReportRequest.ItemCodeItem itemCode : request.getItemCodes()) {
|
|
|
+ if (itemCode == null || StringUtils.isEmpty(itemCode.getCode())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, Object> row = new LinkedHashMap<>();
|
|
|
+ row.put("name", itemCode.getName());
|
|
|
+
|
|
|
+ // 查询分项能耗数据(模拟)
|
|
|
+ Map<String, Number> timeData = queryItemEnergyData(itemCode.getCode(), request.getSpaceId(),
|
|
|
+ startTime, endTime, request.getDateType());
|
|
|
+
|
|
|
+ // 计算合计
|
|
|
+ Number total = calculateItemTotal(timeData);
|
|
|
+ row.put("total", total);
|
|
|
+
|
|
|
+ // 添加时间列数据
|
|
|
+ int index = 1;
|
|
|
+ for (Number value : timeData.values()) {
|
|
|
+ row.put("_" + index, value);
|
|
|
+ index++;
|
|
|
+ }
|
|
|
+
|
|
|
+ dataList.add(row);
|
|
|
+ }
|
|
|
+
|
|
|
+ return dataList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询分项能耗数据(模拟实现)
|
|
|
+ */
|
|
|
+ private Map<String, Number> queryItemEnergyData(String itemCode, Long spaceId,
|
|
|
+ LocalDateTime startTime, LocalDateTime endTime, String dateType) {
|
|
|
+ Map<String, Number> data = new LinkedHashMap<>();
|
|
|
+
|
|
|
+ // TODO: 实际应从数据库查询真实数据
|
|
|
+ List<String> timeLabels = generateTimeLabels(dateType, startTime, endTime);
|
|
|
+ for (String label : timeLabels) {
|
|
|
+ data.put(label, 0); // 模拟数据为0
|
|
|
+ }
|
|
|
+
|
|
|
+ return data;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算分项合计
|
|
|
+ */
|
|
|
+ private Number calculateItemTotal(Map<String, Number> timeData) {
|
|
|
+ if (timeData == null || timeData.isEmpty()) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ double sum = 0;
|
|
|
+ for (Number value : timeData.values()) {
|
|
|
+ sum += value.doubleValue();
|
|
|
+ }
|
|
|
+ return sum;
|
|
|
+ }
|
|
|
+
|
|
|
+ // ==================== 区域报表私有方法 ====================
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成区域报表列定义
|
|
|
+ */
|
|
|
+ private List<EnergyReportResponse.ColumnItem> generateSpaceReportColumns(String dateType, LocalDateTime startTime, LocalDateTime endTime) {
|
|
|
+ List<EnergyReportResponse.ColumnItem> columns = new ArrayList<>();
|
|
|
+
|
|
|
+ // 固定列
|
|
|
+ columns.add(createColumn("区域名称", "spaceName", true));
|
|
|
+ columns.add(createColumn("分项名称", "itemName", true));
|
|
|
+ columns.add(createColumn("合计", "total", true));
|
|
|
+
|
|
|
+ // 动态时间列
|
|
|
+ List<String> timeLabels = generateTimeLabels(dateType, startTime, endTime);
|
|
|
+ for (String label : timeLabels) {
|
|
|
+ columns.add(createColumn(label, "_" + label.replace("月", ""), false));
|
|
|
+ }
|
|
|
+
|
|
|
+ return columns;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成区域报表数据
|
|
|
+ */
|
|
|
+ private List<Map<String, Object>> generateSpaceReportData(SpaceReportRequest request, LocalDateTime startTime, LocalDateTime endTime) {
|
|
|
+ List<Map<String, Object>> valueList = new ArrayList<>();
|
|
|
+
|
|
|
+ for (SpaceReportRequest.SpaceItem space : request.getSpaces()) {
|
|
|
+ if (space == null || space.getId() == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (SpaceReportRequest.ItemCodeItem itemCode : request.getItemCodes()) {
|
|
|
+ if (itemCode == null || StringUtils.isEmpty(itemCode.getCode())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, Object> row = new LinkedHashMap<>();
|
|
|
+ row.put("spaceName", space.getName());
|
|
|
+ row.put("itemName", itemCode.getName());
|
|
|
+
|
|
|
+ // 查询区域分项能耗数据(模拟)
|
|
|
+ Map<String, Number> timeData = querySpaceItemEnergyData(space.getId(), itemCode.getCode(),
|
|
|
+ startTime, endTime, request.getDateType());
|
|
|
+
|
|
|
+ // 计算合计
|
|
|
+ Number total = calculateItemTotal(timeData);
|
|
|
+ row.put("total", total);
|
|
|
+
|
|
|
+ // 添加时间列数据
|
|
|
+ int index = 1;
|
|
|
+ for (Number value : timeData.values()) {
|
|
|
+ row.put("_" + index, value);
|
|
|
+ index++;
|
|
|
+ }
|
|
|
+
|
|
|
+ valueList.add(row);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return valueList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询区域分项能耗数据(模拟实现)
|
|
|
+ */
|
|
|
+ private Map<String, Number> querySpaceItemEnergyData(Long spaceId, String itemCode,
|
|
|
+ LocalDateTime startTime, LocalDateTime endTime, String dateType) {
|
|
|
+ Map<String, Number> data = new LinkedHashMap<>();
|
|
|
+
|
|
|
+ // TODO: 实际应从数据库查询真实数据
|
|
|
+ List<String> timeLabels = generateTimeLabels(dateType, startTime, endTime);
|
|
|
+ for (String label : timeLabels) {
|
|
|
+ data.put(label, 0); // 模拟数据为0
|
|
|
+ }
|
|
|
+
|
|
|
+ return data;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算区域报表总计
|
|
|
+ */
|
|
|
+ private Number calculateSpaceReportTotal(List<Map<String, Object>> valueList) {
|
|
|
+ if (valueList == null || valueList.isEmpty()) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ double sum = 0;
|
|
|
+ for (Map<String, Object> row : valueList) {
|
|
|
+ Object total = row.get("total");
|
|
|
+ if (total instanceof Number) {
|
|
|
+ sum += ((Number) total).doubleValue();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return sum;
|
|
|
+ }
|
|
|
+
|
|
|
+ // ==================== 通用工具方法 ====================
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验时间参数
|
|
|
+ * 1. 结束时间不得早于开始时间
|
|
|
+ * 2. 按日查询:起止时间必须是同一天
|
|
|
+ * 3. 按月查询:起止时间必须是同一月
|
|
|
+ * 4. 按年查询:起止时间必须是同一年
|
|
|
+ */
|
|
|
+ private void validateTimeParams(LocalDateTime startTime, LocalDateTime endTime, String timeType) {
|
|
|
+ // 基本校验:结束时间不得早于开始时间
|
|
|
+ if (endTime.isBefore(startTime)) {
|
|
|
+ throw new BusinessException("结束时间不得早于开始时间");
|
|
|
+ }
|
|
|
+
|
|
|
+ String type = timeType != null ? timeType.toLowerCase() : "date";
|
|
|
+
|
|
|
+ switch (type) {
|
|
|
+ case "date":
|
|
|
+ // 按日查询:必须是同一天
|
|
|
+ if (!startTime.toLocalDate().isEqual(endTime.toLocalDate())) {
|
|
|
+ throw new BusinessException("按日查询时,起止时间必须是同一天");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "month":
|
|
|
+ // 按月查询:必须是同一月
|
|
|
+ if (startTime.getYear() != endTime.getYear() ||
|
|
|
+ startTime.getMonthValue() != endTime.getMonthValue()) {
|
|
|
+ throw new BusinessException("按月查询时,起止时间必须是同一月");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "year":
|
|
|
+ // 按年查询:必须是同一年
|
|
|
+ if (startTime.getYear() != endTime.getYear()) {
|
|
|
+ throw new BusinessException("按年查询时,起止时间必须是同一年");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ // 默认不校验
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建列定义
|
|
|
+ */
|
|
|
+ private EnergyReportResponse.ColumnItem createColumn(String label, String prop, Boolean fixed) {
|
|
|
+ EnergyReportResponse.ColumnItem column = new EnergyReportResponse.ColumnItem();
|
|
|
+ column.setLabel(label);
|
|
|
+ column.setProp(prop);
|
|
|
+ column.setFixed(fixed);
|
|
|
+ column.setChildren(null);
|
|
|
+ return column;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建标题项
|
|
|
+ */
|
|
|
+ private ItemReportResponse.TitleItem createTitleItem(String prop, Boolean fixed, String label, Integer value) {
|
|
|
+ ItemReportResponse.TitleItem item = new ItemReportResponse.TitleItem();
|
|
|
+ item.setProp(prop);
|
|
|
+ item.setFixed(fixed);
|
|
|
+ item.setLabel(label);
|
|
|
+ item.setValue(value);
|
|
|
+ return item;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成时间标签列表
|
|
|
+ * 规则:
|
|
|
+ * - 按日(date)查询 → 返回小时数据(根据起止时间的小时范围)
|
|
|
+ * - 按月(month)查询 → 返回日数据(01日-31日)
|
|
|
+ * - 按年(year)查询 → 返回月数据(1月-12月)
|
|
|
+ */
|
|
|
+ private List<String> generateTimeLabels(String timeType, LocalDateTime startTime, LocalDateTime endTime) {
|
|
|
+ List<String> labels = new ArrayList<>();
|
|
|
+
|
|
|
+ if (startTime == null || endTime == null) {
|
|
|
+ return labels;
|
|
|
+ }
|
|
|
+
|
|
|
+ String type = timeType != null ? timeType.toLowerCase() : "date";
|
|
|
+
|
|
|
+ switch (type) {
|
|
|
+ case "date":
|
|
|
+ // 按日查询:根据起止时间的小时来分段
|
|
|
+ int startHour = startTime.getHour();
|
|
|
+ int endHour = endTime.getHour();
|
|
|
+ for (int i = startHour; i <= endHour; i++) {
|
|
|
+ labels.add(i + "时");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "month":
|
|
|
+ // 按月查询:返回日数据 01日, 02日, ..., 31日
|
|
|
+ LocalDate start = startTime.toLocalDate();
|
|
|
+ LocalDate end = endTime.toLocalDate();
|
|
|
+ int day = 1;
|
|
|
+ while (!start.isAfter(end)) {
|
|
|
+ labels.add(String.format("%02d日", day));
|
|
|
+ start = start.plusDays(1);
|
|
|
+ day++;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "year":
|
|
|
+ // 按年查询:返回月数据 1月, 2月, ..., 12月
|
|
|
+ int startMonth = startTime.getMonthValue();
|
|
|
+ int endMonth = endTime.getMonthValue();
|
|
|
+ int year = startTime.getYear();
|
|
|
+ int endYear = endTime.getYear();
|
|
|
+
|
|
|
+ while (year < endYear || (year == endYear && startMonth <= endMonth)) {
|
|
|
+ labels.add(startMonth + "月");
|
|
|
+ startMonth++;
|
|
|
+ if (startMonth > 12) {
|
|
|
+ startMonth = 1;
|
|
|
+ year++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ // 默认按日查询,返回小时数据
|
|
|
+ for (int i = 0; i < 24; i++) {
|
|
|
+ labels.add(i + "时");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return labels;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 解析日期时间字符串
|
|
|
+ */
|
|
|
+ private LocalDateTime parseDateTime(String dateTimeStr) {
|
|
|
+ if (!StringUtils.hasText(dateTimeStr)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ return LocalDateTime.parse(dateTimeStr, DATE_TIME_FORMATTER);
|
|
|
+ } catch (Exception e) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // ==================== 空响应创建方法 ====================
|
|
|
+
|
|
|
+ private EnergyReportResponse createEmptyEnergyReport() {
|
|
|
+ EnergyReportResponse response = new EnergyReportResponse();
|
|
|
+ response.setColumnList(new ArrayList<>());
|
|
|
+ response.setValueList(new ArrayList<>());
|
|
|
+ return response;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ItemReportResponse createEmptyItemReport() {
|
|
|
+ ItemReportResponse response = new ItemReportResponse();
|
|
|
+ response.setTitleList(new ArrayList<>());
|
|
|
+ response.setDataList(new ArrayList<>());
|
|
|
+ return response;
|
|
|
+ }
|
|
|
+
|
|
|
+ private SpaceReportResponse createEmptySpaceReport() {
|
|
|
+ SpaceReportResponse response = new SpaceReportResponse();
|
|
|
+ response.setColumnList(new ArrayList<>());
|
|
|
+ response.setValueList(new ArrayList<>());
|
|
|
+ response.setTotal(0);
|
|
|
+ return response;
|
|
|
+ }
|
|
|
}
|