feat:新增RAW数据
This commit is contained in:
parent
3166c937ee
commit
16f49a47e9
@ -249,3 +249,56 @@ func (dao *SensorDAO) GetLatestSensorData() (*model.SensorData, error) {
|
|||||||
|
|
||||||
return &data, nil
|
return &data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetRawData 获取指定时间范围内的原始传感器数据
|
||||||
|
func (dao *SensorDAO) GetRawData(start, end time.Time) ([]model.AggregatedData, error) {
|
||||||
|
query := `
|
||||||
|
SELECT
|
||||||
|
timestamp,
|
||||||
|
temperature/10 AS temperature,
|
||||||
|
rainfall,
|
||||||
|
humidity/10 AS humidity,
|
||||||
|
wind_speed/100 AS wind_speed,
|
||||||
|
atm_pressure/10 AS atm_pressure,
|
||||||
|
solar_radiation
|
||||||
|
FROM sensor_data
|
||||||
|
WHERE timestamp BETWEEN ? AND ?
|
||||||
|
ORDER BY timestamp DESC
|
||||||
|
`
|
||||||
|
|
||||||
|
// 执行查询
|
||||||
|
rows, err := dao.db.Query(query, start, end)
|
||||||
|
if err != nil {
|
||||||
|
logger.Logger.Printf("查询原始数据失败: %v (开始=%s, 结束=%s)",
|
||||||
|
err, start.Format(time.RFC3339), end.Format(time.RFC3339))
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
|
||||||
|
var result []model.AggregatedData
|
||||||
|
for rows.Next() {
|
||||||
|
var data model.AggregatedData
|
||||||
|
err := rows.Scan(
|
||||||
|
&data.Timestamp,
|
||||||
|
&data.AvgTemperature,
|
||||||
|
&data.Rainfall,
|
||||||
|
&data.AvgHumidity,
|
||||||
|
&data.AvgWindSpeed,
|
||||||
|
&data.AvgAtmPressure,
|
||||||
|
&data.AvgSolarRadiation)
|
||||||
|
if err != nil {
|
||||||
|
logger.Logger.Printf("扫描数据行失败: %v", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
result = append(result, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查是否有游标错误
|
||||||
|
if err = rows.Err(); err != nil {
|
||||||
|
logger.Logger.Printf("查询游标错误: %v", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.Logger.Printf("原始数据查询成功: 返回%d条记录", len(result))
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"go_rain_dtu/internal/dao"
|
"go_rain_dtu/internal/dao"
|
||||||
|
"go_rain_dtu/internal/model"
|
||||||
"go_rain_dtu/internal/tcp"
|
"go_rain_dtu/internal/tcp"
|
||||||
"go_rain_dtu/pkg/logger"
|
"go_rain_dtu/pkg/logger"
|
||||||
)
|
)
|
||||||
@ -39,9 +40,18 @@ func (h *SensorHandler) GetAggregatedData(w http.ResponseWriter, r *http.Request
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
data, err := h.dao.GetAggregatedData(startTime, endTime, interval)
|
var data []model.AggregatedData
|
||||||
|
var err error
|
||||||
|
|
||||||
|
// 判断是否获取原始数据
|
||||||
|
if interval == "raw" {
|
||||||
|
data, err = h.dao.GetRawData(startTime, endTime)
|
||||||
|
} else {
|
||||||
|
data, err = h.dao.GetAggregatedData(startTime, endTime, interval)
|
||||||
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Logger.Printf("获取聚合数据失败: %v", err)
|
logger.Logger.Printf("获取数据失败: %v", err)
|
||||||
http.Error(w, "服务器内部错误", http.StatusInternalServerError)
|
http.Error(w, "服务器内部错误", http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -112,10 +122,19 @@ func (h *SensorHandler) GetLatestData(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询数据库获取最新数据
|
// 查询数据库获取数据
|
||||||
data, err := h.dao.GetAggregatedData(startTime, endTime, interval)
|
var data []model.AggregatedData
|
||||||
|
var err error
|
||||||
|
|
||||||
|
// 判断是否获取原始数据
|
||||||
|
if interval == "raw" {
|
||||||
|
data, err = h.dao.GetRawData(startTime, endTime)
|
||||||
|
} else {
|
||||||
|
data, err = h.dao.GetAggregatedData(startTime, endTime, interval)
|
||||||
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Logger.Printf("获取最新聚合数据失败: %v", err)
|
logger.Logger.Printf("获取数据失败: %v", err)
|
||||||
http.Error(w, "服务器内部错误", http.StatusInternalServerError)
|
http.Error(w, "服务器内部错误", http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@ -172,6 +172,7 @@
|
|||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label for="interval">数据粒度:</label>
|
<label for="interval">数据粒度:</label>
|
||||||
<select id="interval">
|
<select id="interval">
|
||||||
|
<option value="raw">原始数据</option>
|
||||||
<option value="1min">1分钟(测试用)</option>
|
<option value="1min">1分钟(测试用)</option>
|
||||||
<option value="5min" selected>5分钟</option>
|
<option value="5min" selected>5分钟</option>
|
||||||
<option value="30min">30分钟</option>
|
<option value="30min">30分钟</option>
|
||||||
@ -411,19 +412,7 @@
|
|||||||
function queryLatestData() {
|
function queryLatestData() {
|
||||||
const interval = document.getElementById('interval').value;
|
const interval = document.getElementById('interval').value;
|
||||||
|
|
||||||
// 根据粒度调整查询范围
|
// 计算最近时间范围
|
||||||
let hours = 1;
|
|
||||||
if (interval === "1min") {
|
|
||||||
hours = 0.5; // 30分钟
|
|
||||||
} else if (interval === "5min") {
|
|
||||||
hours = 1; // 1小时
|
|
||||||
} else if (interval === "30min") {
|
|
||||||
hours = 6; // 6小时
|
|
||||||
} else {
|
|
||||||
hours = 24; // 1天
|
|
||||||
}
|
|
||||||
|
|
||||||
// 计算最近时间范围 - 使用当天0点到现在
|
|
||||||
const endTime = new Date();
|
const endTime = new Date();
|
||||||
const startTime = new Date(endTime);
|
const startTime = new Date(endTime);
|
||||||
startTime.setHours(0, 0, 0, 0); // 设置为当天0点
|
startTime.setHours(0, 0, 0, 0); // 设置为当天0点
|
||||||
@ -465,7 +454,7 @@
|
|||||||
function loadInitialData() {
|
function loadInitialData() {
|
||||||
const interval = document.getElementById('interval').value;
|
const interval = document.getElementById('interval').value;
|
||||||
|
|
||||||
// 计算最近时间范围 - 使用当天0点到现在
|
// 计算最近时间范围
|
||||||
const endTime = new Date();
|
const endTime = new Date();
|
||||||
const startTime = new Date(endTime);
|
const startTime = new Date(endTime);
|
||||||
startTime.setHours(0, 0, 0, 0); // 设置为当天0点
|
startTime.setHours(0, 0, 0, 0); // 设置为当天0点
|
||||||
@ -543,7 +532,7 @@
|
|||||||
{
|
{
|
||||||
type: 'bar',
|
type: 'bar',
|
||||||
label: '降雨量(mm)',
|
label: '降雨量(mm)',
|
||||||
data: data.map(item => item.rainfall),
|
data: data.map(item => item.rainfall !== null && !isNaN(item.rainfall) ? item.rainfall : 0),
|
||||||
backgroundColor: 'rgba(54, 162, 235, 0.5)',
|
backgroundColor: 'rgba(54, 162, 235, 0.5)',
|
||||||
borderColor: 'rgba(54, 162, 235, 1)',
|
borderColor: 'rgba(54, 162, 235, 1)',
|
||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
@ -552,7 +541,7 @@
|
|||||||
{
|
{
|
||||||
type: 'line',
|
type: 'line',
|
||||||
label: '温度(℃)',
|
label: '温度(℃)',
|
||||||
data: data.map(item => item.avg_temperature),
|
data: data.map(item => item.avg_temperature !== null && !isNaN(item.avg_temperature) ? item.avg_temperature : null),
|
||||||
borderColor: 'rgb(255, 99, 132)',
|
borderColor: 'rgb(255, 99, 132)',
|
||||||
backgroundColor: 'rgba(255, 99, 132, 0.5)',
|
backgroundColor: 'rgba(255, 99, 132, 0.5)',
|
||||||
tension: 0.1,
|
tension: 0.1,
|
||||||
@ -628,12 +617,12 @@
|
|||||||
// 太阳辐射是原始值
|
// 太阳辐射是原始值
|
||||||
row.innerHTML = `
|
row.innerHTML = `
|
||||||
<td>${formattedDate}</td>
|
<td>${formattedDate}</td>
|
||||||
<td>${item.rainfall.toFixed(1)}</td>
|
<td>${item.rainfall !== null && !isNaN(item.rainfall) ? item.rainfall.toFixed(1) : '0.0'}</td>
|
||||||
<td>${item.avg_temperature.toFixed(1)}</td>
|
<td>${item.avg_temperature !== null && !isNaN(item.avg_temperature) ? item.avg_temperature.toFixed(1) : '0.0'}</td>
|
||||||
<td>${item.avg_humidity.toFixed(1)}</td>
|
<td>${item.avg_humidity !== null && !isNaN(item.avg_humidity) ? item.avg_humidity.toFixed(1) : '0.0'}</td>
|
||||||
<td>${item.avg_wind_speed.toFixed(2)}</td>
|
<td>${item.avg_wind_speed !== null && !isNaN(item.avg_wind_speed) ? item.avg_wind_speed.toFixed(2) : '0.00'}</td>
|
||||||
<td>${item.atm_pressure ? item.atm_pressure.toFixed(1) : 'N/A'}</td>
|
<td>${item.atm_pressure !== null && !isNaN(item.atm_pressure) ? item.atm_pressure.toFixed(1) : '0.0'}</td>
|
||||||
<td>${item.solar_radiation ? item.solar_radiation.toFixed(0) : 'N/A'}</td>
|
<td>${item.solar_radiation !== null && !isNaN(item.solar_radiation) ? item.solar_radiation.toFixed(0) : '0'}</td>
|
||||||
`;
|
`;
|
||||||
tbody.appendChild(row);
|
tbody.appendChild(row);
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user