|
|
@ -31,9 +31,8 @@ import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
|
import java.net.URLDecoder; |
|
|
import java.net.URLDecoder; |
|
|
import java.nio.charset.StandardCharsets; |
|
|
import java.nio.charset.StandardCharsets; |
|
|
import java.time.Instant; |
|
|
import java.time.*; |
|
|
import java.time.LocalDate; |
|
|
import java.time.format.DateTimeFormatter; |
|
|
import java.time.ZoneId; |
|
|
|
|
|
import java.util.*; |
|
|
import java.util.*; |
|
|
import java.util.function.Function; |
|
|
import java.util.function.Function; |
|
|
import java.util.stream.Collectors; |
|
|
import java.util.stream.Collectors; |
|
|
@ -235,10 +234,107 @@ public class DeviceDataBaStatusServiceImpl implements DeviceDataBaStatusService |
|
|
lineData.setAttrCode(lineDataSearchParams.getAttrCodeList()[0]); |
|
|
lineData.setAttrCode(lineDataSearchParams.getAttrCodeList()[0]); |
|
|
lineData.getYData().put("common", yCommon); |
|
|
lineData.getYData().put("common", yCommon); |
|
|
|
|
|
|
|
|
|
|
|
fillToEndOfDay(lineData);//补全24小时的算法
|
|
|
|
|
|
|
|
|
lineDataList.add(lineData); |
|
|
lineDataList.add(lineData); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return SimpleDataResponse.success(lineDataList); |
|
|
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); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|