diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java index 4cec390..ae7dce7 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java +++ b/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 values = extractAllValues(mapper, rawData); diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataBaStatusServiceImpl.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataBaStatusServiceImpl.java index 4d1a553..5bb8fcc 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataBaStatusServiceImpl.java +++ b/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 xData = lineData.getXData(); + Map> 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 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 series : yData.values()) { + series.add(null); + } + } + } + }