提交 52866af4 authored 作者: Matrix's avatar Matrix

时间区域更新

上级 1109ad39
...@@ -3,9 +3,7 @@ package com.example.pt; ...@@ -3,9 +3,7 @@ package com.example.pt;
import com.example.pt.collectors.DataRecord; import com.example.pt.collectors.DataRecord;
import com.example.pt.collectors.DataRecordService; import com.example.pt.collectors.DataRecordService;
import javafx.application.Application; import javafx.application.Application;
import javafx.collections.ListChangeListener;
import javafx.geometry.Pos; import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene; import javafx.scene.Scene;
import javafx.scene.chart.CategoryAxis; import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.LineChart; import javafx.scene.chart.LineChart;
...@@ -15,13 +13,13 @@ import javafx.scene.control.*; ...@@ -15,13 +13,13 @@ import javafx.scene.control.*;
import javafx.scene.input.MouseEvent; import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane; import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox; import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage; import javafx.stage.Stage;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
...@@ -63,10 +61,8 @@ public class ChartApp extends Application { ...@@ -63,10 +61,8 @@ public class ChartApp extends Application {
@Override @Override
public void start(Stage primaryStage) { public void start(Stage primaryStage) {
// 获取初始数据 // 获取初始数据
List<DataRecord> dataRecords = dataRecordService.list(); List<DataRecord> initialDataRecords = dataRecordService.list();
Map<Integer, List<DataRecord>> initialRidToDataRecordsMap = initialDataRecords.stream().filter(record -> record.getRid() == RID_FENG_GE || record.getRid() == RID_DA_SI_MA).collect(Collectors.groupingBy(DataRecord::getRid));
// 过滤 rid 为 9999 和 606118 的记录
Map<Integer, List<DataRecord>> ridToDataRecordsMap = dataRecords.stream().filter(record -> record.getRid() == RID_FENG_GE || record.getRid() == RID_DA_SI_MA).collect(Collectors.groupingBy(DataRecord::getRid));
// 创建折线图 // 创建折线图
CategoryAxis xAxis = new CategoryAxis(); CategoryAxis xAxis = new CategoryAxis();
...@@ -83,10 +79,27 @@ public class ChartApp extends Application { ...@@ -83,10 +79,27 @@ public class ChartApp extends Application {
intervalComboBox.getItems().addAll(1, 5, 10, 30, 60); intervalComboBox.getItems().addAll(1, 5, 10, 30, 60);
intervalComboBox.getSelectionModel().selectFirst(); intervalComboBox.getSelectionModel().selectFirst();
// 添加日期选择器
DatePicker startDatePicker = new DatePicker(LocalDate.now().minusDays(7));
DatePicker endDatePicker = new DatePicker(LocalDate.now());
// 添加时段选择器
// TextField timeRangeField = new TextField("00:00-23:59");
// 添加时间段选择器
ComboBox<String> timeRangeComboBox = new ComboBox<>();
timeRangeComboBox.getItems().addAll("全天", "上午", "下午", "晚上");
timeRangeComboBox.getSelectionModel().selectFirst();
// 添加更新按钮
Button updateButton = new Button("更新"); Button updateButton = new Button("更新");
updateButton.setOnAction(event -> updateChartData(ridToDataRecordsMap, intervalComboBox.getValue())); updateButton.setOnAction(event -> {
LocalDate startDate = startDatePicker.getValue();
LocalDate endDate = endDatePicker.getValue();
updateChartData(initialRidToDataRecordsMap, intervalComboBox.getValue(), startDate, endDate, timeRangeComboBox.getValue());
});
HBox hbox = new HBox(10, intervalComboBox, updateButton); HBox hbox = new HBox(10, intervalComboBox, startDatePicker, endDatePicker, timeRangeComboBox, updateButton);
hbox.setAlignment(Pos.CENTER); hbox.setAlignment(Pos.CENTER);
// 设置场景并显示图表 // 设置场景并显示图表
...@@ -98,10 +111,15 @@ public class ChartApp extends Application { ...@@ -98,10 +111,15 @@ public class ChartApp extends Application {
primaryStage.show(); primaryStage.show();
// 初始化图表数据 // 初始化图表数据
updateChartData(ridToDataRecordsMap, intervalComboBox.getValue()); LocalDate startDate = startDatePicker.getValue();
LocalDate endDate = endDatePicker.getValue();
String timeRange = timeRangeComboBox.getValue();
updateChartData(initialRidToDataRecordsMap, intervalComboBox.getValue(), startDate, endDate, timeRange);
} }
private void updateChartData(Map<Integer, List<DataRecord>> ridToDataRecordsMap, int intervalInMinutes) {
private void updateChartData(Map<Integer, List<DataRecord>> ridToDataRecordsMap, int intervalInMinutes, LocalDate startDate, LocalDate endDate, String timeRange) {
lineChart.getData().clear(); lineChart.getData().clear();
for (Map.Entry<Integer, List<DataRecord>> entry : ridToDataRecordsMap.entrySet()) { for (Map.Entry<Integer, List<DataRecord>> entry : ridToDataRecordsMap.entrySet()) {
...@@ -112,13 +130,16 @@ public class ChartApp extends Application { ...@@ -112,13 +130,16 @@ public class ChartApp extends Application {
List<DataRecord> sortedRecords = new ArrayList<>(records); List<DataRecord> sortedRecords = new ArrayList<>(records);
sortedRecords.sort(Comparator.comparing(DataRecord::getTimestamp)); sortedRecords.sort(Comparator.comparing(DataRecord::getTimestamp));
// 根据日期和时段进行筛选
List<DataRecord> filteredRecords = filterRecordsByDateAndTimeRange(sortedRecords, startDate, endDate, timeRange);
// 计算票数增长量 // 计算票数增长量
List<DataRecord> aggregatedData = new ArrayList<>(); List<DataRecord> aggregatedData = new ArrayList<>();
DataRecord previousRecord = null; DataRecord previousRecord = null;
LocalDateTime currentIntervalStart = sortedRecords.get(0).getTimestamp(); LocalDateTime currentIntervalStart = filteredRecords.get(0).getTimestamp();
int maxScInCurrentInterval = sortedRecords.get(0).getSc(); int maxScInCurrentInterval = filteredRecords.get(0).getSc();
for (DataRecord record : sortedRecords) { for (DataRecord record : filteredRecords) {
if (record.getTimestamp().isAfter(currentIntervalStart.plus(intervalInMinutes, ChronoUnit.MINUTES))) { if (record.getTimestamp().isAfter(currentIntervalStart.plus(intervalInMinutes, ChronoUnit.MINUTES))) {
// 当前记录超出当前时间区间,将之前的数据添加到折线图 // 当前记录超出当前时间区间,将之前的数据添加到折线图
int scGrowth = previousRecord == null ? maxScInCurrentInterval : maxScInCurrentInterval - previousRecord.getSc(); int scGrowth = previousRecord == null ? maxScInCurrentInterval : maxScInCurrentInterval - previousRecord.getSc();
...@@ -160,27 +181,40 @@ public class ChartApp extends Application { ...@@ -160,27 +181,40 @@ public class ChartApp extends Application {
}); });
} }
}); });
// dataPoint.nodeProperty().addListener((observable, oldValue, newValue) -> {
// if (newValue != null) {
// StackPane stackPane = (StackPane) newValue;
// Label label = new Label(String.valueOf(dataPoint.getYValue()));
// stackPane.getChildren().add(label);
// }
// });
} else { } else {
isFirstDataPoint = false; isFirstDataPoint = false;
} }
} }
lineChart.getData().add(series); lineChart.getData().add(series);
} }
} }
private List<DataRecord> filterRecordsByDateAndTimeRange(List<DataRecord> records, LocalDate startDate, LocalDate endDate, String timeRange) {
return records.stream()
.filter(record -> {
if (startDate != null && endDate != null) {
return !record.getTimestamp().toLocalDate().isBefore(startDate) && !record.getTimestamp().toLocalDate().isAfter(endDate);
}
return true;
})
.filter(record -> {
switch (timeRange) {
case "上午":
return record.getTimestamp().toLocalTime().getHour() >= 0 && record.getTimestamp().toLocalTime().getHour() < 12;
case "下午":
return record.getTimestamp().toLocalTime().getHour() >= 12 && record.getTimestamp().toLocalTime().getHour() < 18;
case "晚上":
return record.getTimestamp().toLocalTime().getHour() >= 18 && record.getTimestamp().toLocalTime().getHour() < 24;
default:
return true;
}
})
.collect(Collectors.toList());
}
@Override @Override
public void stop() { public void stop() {
springContext.close(); springContext.close();
} }
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论