Browse Source

状态运行图补充24小时

zhc
review512jwy@163.com 4 weeks ago
parent
commit
ec026e6510
  1. 5
      dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java
  2. 102
      dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataBaStatusServiceImpl.java

5
dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java

@ -159,11 +159,6 @@ public class CommonOpt {
return getAuroraInfoByApikey(paramMap);
}
public String buildAuroraJdbcUrl(String dbUrl, String auroraHost) {
String regex = "(jdbc:mysql://)([^/]+)(/data_center_aeon_admin.*)";
return dbUrl.replaceAll(regex, "$1" + auroraHost + "$3");
}
public String extractValue(ObjectMapper mapper, Long categoryId, String rawData) {
if (Constants.DEVICE_TYPE_TEMPERATURE_HUMIDITY.contains(categoryId)){
List<String> values = extractAllValues(mapper, rawData);

102
dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataBaStatusServiceImpl.java

@ -31,9 +31,8 @@ import org.springframework.stereotype.Service;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -235,10 +234,107 @@ public class DeviceDataBaStatusServiceImpl implements DeviceDataBaStatusService
lineData.setAttrCode(lineDataSearchParams.getAttrCodeList()[0]);
lineData.getYData().put("common", yCommon);
fillToEndOfDay(lineData);//补全24小时的算法
lineDataList.add(lineData);
}
return SimpleDataResponse.success(lineDataList);
}
public static void fillToEndOfDay(LineData lineData) {
DateTimeFormatter DF = Constants.FORMATTER_YMDHMS;
List<String> xData = lineData.getXData();
Map<String, List<Object>> yData = lineData.getYData();
// 至少 1 个点才能补
if (xData == null || xData.isEmpty()) {
return;
}
// 最后一个已有时间点
LocalDateTime lastTime = LocalDateTime.parse(
xData.get(xData.size() - 1), DF
);
LocalDate date = lastTime.toLocalDate();
// 当天 00:00
LocalDateTime startOfDay = date.atStartOfDay();
// 当天 24:00(次日 00:00)
LocalDateTime endOfDay = date.plusDays(1).atStartOfDay();
// 如果已经到 24 点,不补
if (!lastTime.isBefore(endOfDay)) {
return;
}
// 已有数据占据的时长(0 点 → 最后一个点)
long existSeconds = Duration.between(startOfDay, lastTime).getSeconds();
long daySeconds = Duration.between(startOfDay, endOfDay).getSeconds(); // 86400
if (existSeconds <= 0 || daySeconds <= 0) {
return;
}
int existCount = xData.size();
// 等比例推算全天应有点数
double ratio = (double) existSeconds / daySeconds;
int totalCount = (int) Math.ceil(existCount / ratio);
int appendCount = totalCount - existCount;
if (appendCount <= 0) {
return;
}
// 防止点数爆炸
int MAX_APPEND = 300;
appendCount = Math.min(appendCount, MAX_APPEND);
// 剩余可补时长
long appendSeconds = Duration.between(lastTime, endOfDay).getSeconds();
// 计算步长(兜底)
long stepSeconds = appendSeconds / appendCount;
if (stepSeconds <= 0) {
stepSeconds = appendSeconds;
}
LocalDateTime cursor = lastTime;
boolean appended = false;
// 按比例补点
for (int i = 0; i < appendCount; i++) {
cursor = cursor.plusSeconds(stepSeconds);
if (!cursor.isBefore(endOfDay)) {
break;
}
xData.add(cursor.format(DF));
appended = true;
for (List<Object> series : yData.values()) {
series.add(null);
}
}
// 保底:如果最后一个点仍然 < 23:59:59,强制补一个
LocalDateTime finalTime = LocalDateTime.parse(
xData.get(xData.size() - 1), DF
);
LocalDateTime lastSecondOfDay = endOfDay.minusSeconds(1);
if (finalTime.isBefore(lastSecondOfDay)) {
xData.add(lastSecondOfDay.format(DF));
for (List<Object> series : yData.values()) {
series.add(null);
}
}
}
}

Loading…
Cancel
Save