From 8706d8c91369dc0a25f7e4e4f799396466b61c55 Mon Sep 17 00:00:00 2001 From: huang <1724659546@qq.com> Date: Mon, 29 Sep 2025 17:27:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=BC=BAdevice=E4=BB=93=E5=BA=93?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/infra/models/models.go | 2 + .../infra/repository/device_repository.go | 54 ++++++------------- 2 files changed, 18 insertions(+), 38 deletions(-) diff --git a/internal/infra/models/models.go b/internal/infra/models/models.go index c3ae59b..406be1f 100644 --- a/internal/infra/models/models.go +++ b/internal/infra/models/models.go @@ -23,6 +23,8 @@ func GetAllModels() []interface{} { &SensorData{}, &DeviceCommandLog{}, &PendingCollection{}, + &AreaController{}, + &DeviceTemplate{}, } } diff --git a/internal/infra/repository/device_repository.go b/internal/infra/repository/device_repository.go index 1005a1c..b8f42ca 100644 --- a/internal/infra/repository/device_repository.go +++ b/internal/infra/repository/device_repository.go @@ -23,9 +23,8 @@ type DeviceRepository interface { // ListAll 获取所有设备的列表 ListAll() ([]*models.Device, error) - // ListByParentID 根据父级 ID 列出所有子设备。 - // 如果 parentID 为 nil,则列出所有顶层设备(如区域主控)。 - ListByParentID(parentID *uint) ([]*models.Device, error) + // ListByAreaControllerID 根据区域主控 ID 列出所有子设备。 + ListByAreaControllerID(areaControllerID uint) ([]*models.Device, error) // Update 更新一个已有的设备信息 Update(device *models.Device) error @@ -33,11 +32,8 @@ type DeviceRepository interface { // Delete 根据主键 ID 删除一个设备 Delete(id uint) error - // FindByDevEui 根据 DevEui (存储在 properties JSONB 中的 lora_address) 查找设备 (新增) - FindByDevEui(devEui string) (*models.Device, error) - - // FindByParentAndPhysicalAddress 根据父设备ID和物理地址(总线号、总线地址)查找设备 - FindByParentAndPhysicalAddress(parentID uint, busNumber int32, busAddress int32) (*models.Device, error) + // FindByAreaControllerAndPhysicalAddress 根据区域主控ID和物理地址(总线号、总线地址)查找设备 + FindByAreaControllerAndPhysicalAddress(areaControllerID uint, busNumber int, busAddress int) (*models.Device, error) } // gormDeviceRepository 是 DeviceRepository 的 GORM 实现 @@ -58,7 +54,7 @@ func (r *gormDeviceRepository) Create(device *models.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 { + if err := r.db.Preload("AreaController").Preload("DeviceTemplate").First(&device, id).Error; err != nil { return nil, err } return &device, nil @@ -79,24 +75,16 @@ func (r *gormDeviceRepository) FindByIDString(id string) (*models.Device, error) // ListAll 获取所有设备的列表 func (r *gormDeviceRepository) ListAll() ([]*models.Device, error) { var devices []*models.Device - if err := r.db.Find(&devices).Error; err != nil { + if err := r.db.Preload("AreaController").Preload("DeviceTemplate").Find(&devices).Error; err != nil { return nil, err } return devices, nil } -// ListByParentID 根据父级 ID 列出所有子设备 -func (r *gormDeviceRepository) ListByParentID(parentID *uint) ([]*models.Device, error) { +// ListByAreaControllerID 根据区域主控 ID 列出所有子设备 +func (r *gormDeviceRepository) ListByAreaControllerID(areaControllerID 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 - } - + err := r.db.Preload("AreaController").Preload("DeviceTemplate").Where("area_controller_id = ?", areaControllerID).Find(&devices).Error if err != nil { return nil, err } @@ -115,27 +103,17 @@ func (r *gormDeviceRepository) Delete(id uint) error { return r.db.Delete(&models.Device{}, id).Error } -// FindByDevEui 根据 DevEui (存储在 properties JSONB 中的 lora_address) 查找设备 -func (r *gormDeviceRepository) FindByDevEui(devEui string) (*models.Device, error) { +// FindByAreaControllerAndPhysicalAddress 根据区域主控ID和物理地址(总线号、总线地址)查找设备 +func (r *gormDeviceRepository) FindByAreaControllerAndPhysicalAddress(areaControllerID uint, busNumber int, busAddress int) (*models.Device, error) { var device models.Device - // 使用 GORM 的 JSONB 查询语法: properties->>'lora_address' - if err := r.db.Where("properties->>'lora_address' = ?", devEui).First(&device).Error; err != nil { - return nil, err // 如果找不到或发生其他错误,GORM 会返回错误 - } - return &device, nil -} - -// FindByParentAndPhysicalAddress 根据父设备ID和物理地址(总线号、总线地址)查找设备 -func (r *gormDeviceRepository) FindByParentAndPhysicalAddress(parentID uint, busNumber int32, busAddress int32) (*models.Device, error) { - var device models.Device - // PostgreSQL 使用 ->> 操作符来查询 JSONB 字段的文本值 - err := r.db.Where("parent_id = ?", parentID). - Where("properties->>'bus_number' = ?", strconv.Itoa(int(busNumber))). - Where("properties->>'bus_address' = ?", strconv.Itoa(int(busAddress))). + err := r.db.Preload("AreaController").Preload("DeviceTemplate"). + Where("area_controller_id = ?", areaControllerID). + Where("properties->>'bus_number' = ?", strconv.Itoa(busNumber)). + Where("properties->>'bus_address' = ?", strconv.Itoa(busAddress)). First(&device).Error if err != nil { - return nil, fmt.Errorf("根据父设备ID %d 和物理地址 (总线号: %d, 总线地址: %d) 查找设备失败: %w", parentID, busNumber, busAddress, err) + return nil, fmt.Errorf("根据区域主控ID %d 和物理地址 (总线号: %d, 总线地址: %d) 查找设备失败: %w", areaControllerID, busNumber, busAddress, err) } return &device, nil }