fix: 修正雨量存储

This commit is contained in:
yarnom 2025-07-10 11:57:10 +08:00
parent fe240df61c
commit 0067c2d15e

View File

@ -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)
} }