From 314849f125e0165fc7caa1b8cd40dd6adeafa777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Clyd=E2=80=9D?= <“lyd@datametatech.com”> Date: Tue, 1 Apr 2025 19:54:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E7=9B=91=E6=B5=8B=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kms/yg/cz/enmu/MonitorComposeEnum.java | 87 +++++++++++++------ .../java/com/kms/yxgh/util/TimeSplitter.java | 85 ++++++++++++++++++ 2 files changed, 147 insertions(+), 25 deletions(-) create mode 100644 shuili-system/src/main/java/com/kms/yxgh/util/TimeSplitter.java diff --git a/shuili-system/src/main/java/com/kms/yg/cz/enmu/MonitorComposeEnum.java b/shuili-system/src/main/java/com/kms/yg/cz/enmu/MonitorComposeEnum.java index 5dd9fcd1..d1e8c628 100644 --- a/shuili-system/src/main/java/com/kms/yg/cz/enmu/MonitorComposeEnum.java +++ b/shuili-system/src/main/java/com/kms/yg/cz/enmu/MonitorComposeEnum.java @@ -3,20 +3,43 @@ package com.kms.yg.cz.enmu; import cn.hutool.core.collection.CollectionUtil; import com.kms.yg.cz.dto.CharInfoDto; import com.kms.yg.cz.dto.MonitorQueDto; -import com.shuili.common.utils.DateUtils; +import com.kms.yxgh.util.TimeSplitter; import com.shuili.common.utils.StringUtils; import lombok.Getter; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.KeyValue; import org.apache.commons.collections4.keyvalue.DefaultKeyValue; -import java.util.*; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; -import static com.kms.yg.cz.enmu.MonitorTypeEnum.*; -import static com.shuili.common.utils.DateUtils.YYYY_MM_DD_HH_MM_SS; - - +import static com.kms.yg.cz.enmu.MonitorTypeEnum.AIR_TEMPE; +import static com.kms.yg.cz.enmu.MonitorTypeEnum.CRACK_OPENING_DEGREE; +import static com.kms.yg.cz.enmu.MonitorTypeEnum.GATE_FLOW_RATE; +import static com.kms.yg.cz.enmu.MonitorTypeEnum.HORIZONTAL_DISPLACEMENT_X_SURFACE; +import static com.kms.yg.cz.enmu.MonitorTypeEnum.HORIZONTAL_DISPLACEMENT_Y_SURFACE; +import static com.kms.yg.cz.enmu.MonitorTypeEnum.RAINFALL; +import static com.kms.yg.cz.enmu.MonitorTypeEnum.SEEPAGE_FLOW; +import static com.kms.yg.cz.enmu.MonitorTypeEnum.SK_RAINFALL; +import static com.kms.yg.cz.enmu.MonitorTypeEnum.STRAIN; +import static com.kms.yg.cz.enmu.MonitorTypeEnum.STRESS; +import static com.kms.yg.cz.enmu.MonitorTypeEnum.VERTICAL_DISPLACEMENT; +import static com.kms.yg.cz.enmu.MonitorTypeEnum.WATER_LEVEL_ABOVE_GATE; +import static com.kms.yg.cz.enmu.MonitorTypeEnum.WATER_LEVEL_BELOW_GATE; +import static com.kms.yg.cz.enmu.MonitorTypeEnum.WATER_TEMPE; + + +@Slf4j @Getter public enum MonitorComposeEnum { @@ -86,17 +109,9 @@ public enum MonitorComposeEnum { public CharInfoDto toChar(Map>> dataMap, MonitorQueDto sp) { CharInfoDto charInfoDto = new CharInfoDto(); - charInfoDto.setXAxis(Stream.concat(this.leftElements.stream(), this.rightElements.stream()) - .flatMap(type -> { - MonitorSourceEnum source = type.getSource(); - return dataMap.get(source).stream().map(map -> map.get(type.getTimeField())); - } - ).filter(Objects::nonNull) - .filter(item -> item instanceof Date) - .map(item -> (Date) item) - .map(date -> DateUtils.parseDateToStr(YYYY_MM_DD_HH_MM_SS, date)) - .sorted() - .collect(Collectors.toList())); + charInfoDto.setXAxis(TimeSplitter + .splitByHour(TimeSplitter + .getDateStr(sp.getStartTime()), TimeSplitter.getDateStr(sp.getEndTime()))); List yAxis = new ArrayList<>(); if (CollectionUtil.isNotEmpty(this.leftElements)) { @@ -124,19 +139,41 @@ public enum MonitorComposeEnum { } private List getCollect(List element, String name, Map>> dataMap, CharInfoDto charInfoDto) { + Map tempMap = new HashMap<>(); return element.stream() .map(type -> { CharInfoDto.Series series = new CharInfoDto.Series(); series.setName(type.getZhName()); MonitorSourceEnum source = type.getSource(); - Map values = dataMap.get(source).stream() + dataMap.get(source).stream() .map(map -> { - Object time = map.get(type.getTimeField()); - if (time instanceof Date) { - DefaultKeyValue keyValue = new DefaultKeyValue<>(); - keyValue.setKey(DateUtils.parseDateToStr(YYYY_MM_DD_HH_MM_SS, (Date) time)); - keyValue.setValue(map.get(type.getValueField())); - return keyValue; + try { + Object time = map.get(type.getTimeField()); + if (time instanceof Date) { + DefaultKeyValue keyValue = new DefaultKeyValue<>(); + String key = TimeSplitter.parseDateToPoint((Date) time); + Object value = map.get(type.getValueField()); + keyValue.setKey(key); + keyValue.setValue(value); + if (tempMap.containsKey(key) + && !StringUtils.isEmpty(value.toString()) + && !StringUtils.isEmpty(tempMap.get(key).toString()) + ) { + BigDecimal t1 = new BigDecimal(value.toString()); + BigDecimal t2 = new BigDecimal(tempMap.get(key).toString()); + int result = t1.compareTo(t2); + if (result > 0) { + tempMap.put(key, value); + } + } else { + tempMap.put(key, value); + } + return keyValue; + } + } catch (Exception e) { + log.debug("getCollectError:{}", map.toString()); + log.debug("getCollectErrorTempMap:{}", tempMap.toString()); + e.printStackTrace(); } return null; }) @@ -144,7 +181,7 @@ public enum MonitorComposeEnum { .collect(Collectors.toMap(KeyValue::getKey, KeyValue::getValue, (v1, v2) -> v2)); series.setData(charInfoDto.getXAxis().stream() .map(time -> { - Object value = values.get(time); + Object value = tempMap.get(time); return value == null || StringUtils.isEmpty(value.toString()) ? "0" : value.toString(); }).collect(Collectors.toList())); return series; diff --git a/shuili-system/src/main/java/com/kms/yxgh/util/TimeSplitter.java b/shuili-system/src/main/java/com/kms/yxgh/util/TimeSplitter.java new file mode 100644 index 00000000..3a2a63c4 --- /dev/null +++ b/shuili-system/src/main/java/com/kms/yxgh/util/TimeSplitter.java @@ -0,0 +1,85 @@ +package com.kms.yxgh.util; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +public class TimeSplitter { + + public static List splitByHour(String startTimeStr, String endTimeStr) { + endTimeStr = endTimeStr.replaceAll("59", "00"); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime startTime = LocalDateTime.parse(startTimeStr, formatter); + LocalDateTime endTime = LocalDateTime.parse(endTimeStr, formatter); + + List result = new ArrayList<>(); + + // 处理开始时间不是整点的情况 + if (startTime.getMinute() != 0 || startTime.getSecond() != 0) { + // 将开始时间设置为下一个整点 + LocalDateTime nextHour = startTime + .plusHours(1) + .withMinute(0) + .withSecond(0); + + // 如果下一个整点已经超过结束时间,则只添加开始和结束时间 + if (nextHour.isAfter(endTime)) { + result.add(startTimeStr); + result.add(endTimeStr); + return result; + } + + // 添加开始时间和第一个整点时间 + result.add(startTimeStr); + result.add(nextHour.format(formatter)); + startTime = nextHour; + } + + // 添加中间的整点时间 + LocalDateTime currentHour = startTime; + while (currentHour.plusHours(1).isBefore(endTime) || currentHour.plusHours(1).isEqual(endTime)) { + result.add(currentHour.format(formatter)); + currentHour = currentHour.plusHours(1); + } + + // 处理结束时间 + if (currentHour.isBefore(endTime)) { + result.add(currentHour.format(formatter)); + result.add(endTimeStr); + } else { + result.add(endTimeStr); + } + return result.stream().sorted().collect(Collectors.toList()); + } + + public static String getDateStr(Date date) { + LocalDateTime ldt = date.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + return ldt.format(formatter); + } + + public static String parseDateToPoint(Date date) { + // 转换为整点时间 + ZonedDateTime zdt = date.toInstant() + .atZone(ZoneId.systemDefault()) + .withMinute(0) + .withSecond(0) + .withNano(0); + // 格式化为字符串 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + return zdt.format(formatter); + } + + public static void main(String[] args) { + } + + +} +