简单实现DeviceRepository
This commit is contained in:
@@ -60,9 +60,6 @@ type Device struct {
|
|||||||
// Name 是设备的业务名称,应清晰可读,例如 "1号猪舍温度传感器" 或 "做料车间主控"
|
// Name 是设备的业务名称,应清晰可读,例如 "1号猪舍温度传感器" 或 "做料车间主控"
|
||||||
Name string `gorm:"not null" json:"name"`
|
Name string `gorm:"not null" json:"name"`
|
||||||
|
|
||||||
// DeviceCode 是设备的唯一出厂编码或序列号,用于在系统中唯一标识一个物理设备
|
|
||||||
DeviceCode string `gorm:"unique;not null" json:"device_code"`
|
|
||||||
|
|
||||||
// Type 是设备的高级类别,用于区分区域主控和普通设备。建立索引以优化按类型查询。
|
// Type 是设备的高级类别,用于区分区域主控和普通设备。建立索引以优化按类型查询。
|
||||||
Type DeviceType `gorm:"not null;index" json:"type"`
|
Type DeviceType `gorm:"not null;index" json:"type"`
|
||||||
|
|
||||||
|
|||||||
98
internal/infra/repository/device_repository.go
Normal file
98
internal/infra/repository/device_repository.go
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
package repository
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DeviceRepository 定义了与设备模型相关的数据库操作接口
|
||||||
|
// 这一层抽象使得上层业务逻辑无需关心底层数据库的具体实现。
|
||||||
|
type DeviceRepository interface {
|
||||||
|
// Create 创建一个新设备记录
|
||||||
|
Create(device *models.Device) error
|
||||||
|
|
||||||
|
// FindByID 根据主键 ID 查找设备
|
||||||
|
FindByID(id uint) (*models.Device, error)
|
||||||
|
|
||||||
|
// FindByIDString 根据字符串形式的主键 ID 查找设备,方便控制器调用
|
||||||
|
FindByIDString(id string) (*models.Device, error)
|
||||||
|
|
||||||
|
// ListByParentID 根据父级 ID 列出所有子设备。
|
||||||
|
// 如果 parentID 为 nil,则列出所有顶层设备(如区域主控)。
|
||||||
|
ListByParentID(parentID *uint) ([]*models.Device, error)
|
||||||
|
|
||||||
|
// Update 更新一个已有的设备信息
|
||||||
|
Update(device *models.Device) error
|
||||||
|
|
||||||
|
// Delete 根据主键 ID 删除一个设备
|
||||||
|
Delete(id uint) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// gormDeviceRepository 是 DeviceRepository 的 GORM 实现
|
||||||
|
type gormDeviceRepository struct {
|
||||||
|
db *gorm.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewGormDeviceRepository 创建一个新的 DeviceRepository GORM 实现实例
|
||||||
|
func NewGormDeviceRepository(db *gorm.DB) DeviceRepository {
|
||||||
|
return &gormDeviceRepository{db: db}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create 创建一个新的设备记录
|
||||||
|
func (r *gormDeviceRepository) Create(device *models.Device) error {
|
||||||
|
return r.db.Create(device).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
// FindByID 根据 ID 查找设备
|
||||||
|
func (r *gormDeviceRepository) FindByID(id uint) (*models.Device, error) {
|
||||||
|
var device models.Device
|
||||||
|
if err := r.db.First(&device, id).Error; err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &device, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// FindByIDString 根据字符串形式的主键 ID 查找设备
|
||||||
|
func (r *gormDeviceRepository) FindByIDString(id string) (*models.Device, error) {
|
||||||
|
// 将字符串ID转换为uint64
|
||||||
|
idInt, err := strconv.ParseUint(id, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
// 如果转换失败,说明ID格式不正确,返回一个明确的错误
|
||||||
|
return nil, fmt.Errorf("无效的设备ID格式: %w", err)
|
||||||
|
}
|
||||||
|
// 调用已有的 FindByID 方法
|
||||||
|
return r.FindByID(uint(idInt))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListByParentID 根据父级 ID 列出所有子设备
|
||||||
|
func (r *gormDeviceRepository) ListByParentID(parentID *uint) ([]*models.Device, error) {
|
||||||
|
var devices []*models.Device
|
||||||
|
var err error
|
||||||
|
|
||||||
|
// 根据 parentID 是否为 nil,构造不同的查询条件
|
||||||
|
if parentID == nil {
|
||||||
|
err = r.db.Where("parent_id IS NULL").Find(&devices).Error
|
||||||
|
} else {
|
||||||
|
err = r.db.Where("parent_id = ?", *parentID).Find(&devices).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return devices, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update 更新一个已有的设备信息
|
||||||
|
// GORM 的 Save 方法会自动处理主键存在时更新,不存在时创建的逻辑,但这里我们明确用于更新。
|
||||||
|
func (r *gormDeviceRepository) Update(device *models.Device) error {
|
||||||
|
return r.db.Save(device).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete 根据 ID 删除一个设备
|
||||||
|
// GORM 使用软删除,记录不会从数据库中物理移除,而是设置 DeletedAt 字段。
|
||||||
|
func (r *gormDeviceRepository) Delete(id uint) error {
|
||||||
|
return r.db.Delete(&models.Device{}, id).Error
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user