diff --git a/db/db.go b/db/db.go index 6e102e8..dc7bdec 100644 --- a/db/db.go +++ b/db/db.go @@ -3,10 +3,11 @@ package db import ( "database/sql" "fmt" + _ "gi "log" - "rain_monitor/models" - "time" +/go-sql-driver/mysql" + "rain_monitor/models" _ "github.com/go-sql-driver/mysql" ) @@ -84,6 +85,44 @@ func SaveWeatherData(data *models.WeatherData) (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, data.Timestamp, data.DailyRainfall, data.InstantRainfall, data.YesterdayRainfall, data.TotalRainfall, data.HourlyRainfall, data.LastHourRainfall, data.Max24hRainfall, @@ -96,6 +135,7 @@ func SaveRainGaugeData(data *models.RainGaugeData) (int64, error) { if err != nil { return 0, fmt.Errorf("获取插入ID失败: %v", err) } + log.Printf("雨量计数据已保存,ID=%d, 时间=%v", id, data.Timestamp) return id, nil } @@ -215,8 +255,20 @@ func GetAggregatedData(start, end time.Time) ([]models.AggregatedData, error) { if err != nil { log.Printf("扫描行数据失败: %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) }