重构 #4
| @@ -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