fix: 修正雨量存储
This commit is contained in:
parent
fe240df61c
commit
0067c2d15e
60
db/db.go
60
db/db.go
@ -3,10 +3,11 @@ package db
|
|||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
_ "gi
|
||||||
"log"
|
"log"
|
||||||
"rain_monitor/models"
|
/go-sql-driver/mysql"
|
||||||
"time"
|
|
||||||
|
|
||||||
|
"rain_monitor/models"
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -84,6 +85,44 @@ func SaveWeatherData(data *models.WeatherData) (int64, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func SaveRainGaugeData(data *models.RainGaugeData) (int64, error) {
|
func SaveRainGaugeData(data *models.RainGaugeData) (int64, error) {
|
||||||
|
// 检查是否在短时间内已经插入过类似数据
|
||||||
|
// 获取最近5分钟内的数据
|
||||||
|
fiveMinutesAgo := data.Timestamp.Add(-5 * time.Minute)
|
||||||
|
rows, err := db.Query(`
|
||||||
|
SELECT id, timestamp, total_rainfall
|
||||||
|
FROM rain_gauge_data
|
||||||
|
WHERE timestamp BETWEEN ? AND ?
|
||||||
|
ORDER BY timestamp DESC
|
||||||
|
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("查询最近雨量计数据失败: %v", err)
|
||||||
|
// 即使查询失败,我们仍然尝试插入新数据
|
||||||
|
} else {
|
||||||
|
|
||||||
|
|
||||||
|
// 检查是否有相似数据
|
||||||
|
for rows.Next() {
|
||||||
|
var id int64
|
||||||
|
var ts time.Time
|
||||||
|
|
||||||
|
|
||||||
|
if err := rows.Scan(&id, &ts, &rainfall); err != nil {
|
||||||
|
log.Printf("扫描雨量计数据失败: %v", err)
|
||||||
|
continue
|
||||||
|
|
||||||
|
|
||||||
|
// 如果时间非常接近(小于1分钟)且雨量数据相同或非常接近,则认为是重复数据
|
||||||
|
timeDiff := data.Timestamp.Sub(ts)
|
||||||
|
|
||||||
|
|
||||||
|
if timeDiff < time.Minute && rainfallDiff < 0.1 {
|
||||||
|
log.Printf("检测到重复的雨量计数据,跳过插入。ID=%d, 时间=%v", id, ts)
|
||||||
|
return id, nil // 返回已存在的记录ID
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
result, err := db.Exec(models.InsertRainGaugeDataSQL,
|
result, err := db.Exec(models.InsertRainGaugeDataSQL,
|
||||||
data.Timestamp, data.DailyRainfall, data.InstantRainfall, data.YesterdayRainfall,
|
data.Timestamp, data.DailyRainfall, data.InstantRainfall, data.YesterdayRainfall,
|
||||||
data.TotalRainfall, data.HourlyRainfall, data.LastHourRainfall, data.Max24hRainfall,
|
data.TotalRainfall, data.HourlyRainfall, data.LastHourRainfall, data.Max24hRainfall,
|
||||||
@ -96,6 +135,7 @@ func SaveRainGaugeData(data *models.RainGaugeData) (int64, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("获取插入ID失败: %v", err)
|
return 0, fmt.Errorf("获取插入ID失败: %v", err)
|
||||||
}
|
}
|
||||||
|
log.Printf("雨量计数据已保存,ID=%d, 时间=%v", id, data.Timestamp)
|
||||||
|
|
||||||
return id, nil
|
return id, nil
|
||||||
}
|
}
|
||||||
@ -215,8 +255,20 @@ func GetAggregatedData(start, end time.Time) ([]models.AggregatedData, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("扫描行数据失败: %v", err)
|
log.Printf("扫描行数据失败: %v", err)
|
||||||
return nil, fmt.Errorf("扫描聚合数据失败: %v", err)
|
return nil, fmt.Errorf("扫描聚合数据失败: %v", err)
|
||||||
}
|
|
||||||
data.FormattedTime = timestampStr
|
|
||||||
|
// 设置格式化时间字符串
|
||||||
|
|
||||||
|
|
||||||
|
// 尝试解析时间字符串为time.Time类型
|
||||||
|
timestamp, err := time.Parse("2006-01-02 15:04:05", timestampStr)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("解析时间字符串失败: %v, 原始字符串: %s", err, timestampStr)
|
||||||
|
// 即使解析失败,也继续处理,前端会使用FormattedTime
|
||||||
|
} else {
|
||||||
|
data.Timestamp = timestamp
|
||||||
|
|
||||||
|
|
||||||
result = append(result, data)
|
result = append(result, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user