From d09fb815bbf6bf1455e4e1e82b1cd338fd715036 Mon Sep 17 00:00:00 2001 From: huang <1724659546@qq.com> Date: Fri, 12 Sep 2025 16:28:28 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E5=8D=95=E5=AE=9E=E7=8E=B0DeviceRepos?= =?UTF-8?q?itory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/infra/models/device.go | 3 - .../infra/repository/device_repository.go | 98 +++++++++++++++++++ 2 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 internal/infra/repository/device_repository.go diff --git a/internal/infra/models/device.go b/internal/infra/models/device.go index de978bc..cbae8f3 100644 --- a/internal/infra/models/device.go +++ b/internal/infra/models/device.go @@ -60,9 +60,6 @@ type Device struct { // Name 是设备的业务名称,应清晰可读,例如 "1号猪舍温度传感器" 或 "做料车间主控" Name string `gorm:"not null" json:"name"` - // DeviceCode 是设备的唯一出厂编码或序列号,用于在系统中唯一标识一个物理设备 - DeviceCode string `gorm:"unique;not null" json:"device_code"` - // Type 是设备的高级类别,用于区分区域主控和普通设备。建立索引以优化按类型查询。 Type DeviceType `gorm:"not null;index" json:"type"` diff --git a/internal/infra/repository/device_repository.go b/internal/infra/repository/device_repository.go new file mode 100644 index 0000000..50ab009 --- /dev/null +++ b/internal/infra/repository/device_repository.go @@ -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 +}