41 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package repository
 | |
| 
 | |
| import (
 | |
| 	"time"
 | |
| 
 | |
| 	"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
 | |
| 	"gorm.io/gorm"
 | |
| )
 | |
| 
 | |
| // SensorDataRepository 定义了与传感器数据相关的数据库操作接口。
 | |
| type SensorDataRepository interface {
 | |
| 	Create(sensorData *models.SensorData) error
 | |
| 	GetLatestSensorDataByDeviceIDAndSensorType(deviceID uint, sensorType models.SensorType) (*models.SensorData, error)
 | |
| }
 | |
| 
 | |
| // gormSensorDataRepository 是 SensorDataRepository 的 GORM 实现。
 | |
| type gormSensorDataRepository struct {
 | |
| 	db *gorm.DB
 | |
| }
 | |
| 
 | |
| // NewGormSensorDataRepository 创建一个新的 SensorDataRepository GORM 实现实例。
 | |
| // 它直接接收一个 *gorm.DB 实例作为依赖,完全遵循项目中的既定模式。
 | |
| func NewGormSensorDataRepository(db *gorm.DB) SensorDataRepository {
 | |
| 	return &gormSensorDataRepository{db: db}
 | |
| }
 | |
| 
 | |
| // Create 将一条新的传感器数据记录插入数据库。
 | |
| func (r *gormSensorDataRepository) Create(sensorData *models.SensorData) error {
 | |
| 	return r.db.Create(sensorData).Error
 | |
| }
 | |
| 
 | |
| // GetLatestSensorDataByDeviceIDAndSensorType 根据设备ID和传感器类型查询最新的传感器数据。
 | |
| func (r *gormSensorDataRepository) GetLatestSensorDataByDeviceIDAndSensorType(deviceID uint, sensorType models.SensorType) (*models.SensorData, error) {
 | |
| 	var sensorData models.SensorData
 | |
| 	// 增加一个时间范围来缩小查询范围, 从而加快查找速度, 当使用时序数据库时时间范围可以让数据库忽略时间靠前的分片
 | |
| 	err := r.db.Where("device_id = ? AND sensor_type = ? AND time >=?", deviceID, sensorType, time.Now().Add(-24*time.Hour)).
 | |
| 		Order("time DESC").
 | |
| 		First(&sensorData).Error
 | |
| 	return &sensorData, err
 | |
| }
 |