143 lines
4.2 KiB
Go
143 lines
4.2 KiB
Go
package dto
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
|
)
|
|
|
|
// NewDeviceResponse 从数据库模型创建一个新的设备响应 DTO
|
|
func NewDeviceResponse(device *models.Device) (*DeviceResponse, error) {
|
|
if device == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
var props map[string]interface{}
|
|
if len(device.Properties) > 0 && string(device.Properties) != "null" {
|
|
if err := device.ParseProperties(&props); err != nil {
|
|
return nil, fmt.Errorf("解析设备属性失败 (ID: %d): %w", device.ID, err)
|
|
}
|
|
}
|
|
|
|
// 确保 DeviceTemplate 和 AreaController 已预加载
|
|
deviceTemplateName := ""
|
|
if device.DeviceTemplate.ID != 0 {
|
|
deviceTemplateName = device.DeviceTemplate.Name
|
|
}
|
|
|
|
areaControllerName := ""
|
|
if device.AreaController.ID != 0 {
|
|
areaControllerName = device.AreaController.Name
|
|
}
|
|
|
|
return &DeviceResponse{
|
|
ID: device.ID,
|
|
Name: device.Name,
|
|
DeviceTemplateID: device.DeviceTemplateID,
|
|
DeviceTemplateName: deviceTemplateName,
|
|
AreaControllerID: device.AreaControllerID,
|
|
AreaControllerName: areaControllerName,
|
|
Location: device.Location,
|
|
Properties: props,
|
|
CreatedAt: device.CreatedAt.Format(time.RFC3339),
|
|
UpdatedAt: device.UpdatedAt.Format(time.RFC3339),
|
|
}, nil
|
|
}
|
|
|
|
// NewListDeviceResponse 从数据库模型切片创建一个新的设备列表响应 DTO 切片
|
|
func NewListDeviceResponse(devices []*models.Device) ([]*DeviceResponse, error) {
|
|
list := make([]*DeviceResponse, 0, len(devices))
|
|
for _, device := range devices {
|
|
resp, err := NewDeviceResponse(device)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
list = append(list, resp)
|
|
}
|
|
return list, nil
|
|
}
|
|
|
|
// NewAreaControllerResponse 从数据库模型创建一个新的区域主控响应 DTO
|
|
func NewAreaControllerResponse(ac *models.AreaController) (*AreaControllerResponse, error) {
|
|
if ac == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
var props map[string]interface{}
|
|
if len(ac.Properties) > 0 && string(ac.Properties) != "null" {
|
|
if err := json.Unmarshal(ac.Properties, &props); err != nil {
|
|
return nil, fmt.Errorf("解析区域主控属性失败 (ID: %d): %w", ac.ID, err)
|
|
}
|
|
}
|
|
|
|
return &AreaControllerResponse{
|
|
ID: ac.ID,
|
|
Name: ac.Name,
|
|
NetworkID: ac.NetworkID,
|
|
Location: ac.Location,
|
|
Status: ac.Status,
|
|
Properties: props,
|
|
CreatedAt: ac.CreatedAt.Format(time.RFC3339),
|
|
UpdatedAt: ac.UpdatedAt.Format(time.RFC3339),
|
|
}, nil
|
|
}
|
|
|
|
// NewListAreaControllerResponse 从数据库模型切片创建一个新的区域主控列表响应 DTO 切片
|
|
func NewListAreaControllerResponse(acs []*models.AreaController) ([]*AreaControllerResponse, error) {
|
|
list := make([]*AreaControllerResponse, 0, len(acs))
|
|
for _, ac := range acs {
|
|
resp, err := NewAreaControllerResponse(ac)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
list = append(list, resp)
|
|
}
|
|
return list, nil
|
|
}
|
|
|
|
// NewDeviceTemplateResponse 从数据库模型创建一个新的设备模板响应 DTO
|
|
func NewDeviceTemplateResponse(dt *models.DeviceTemplate) (*DeviceTemplateResponse, error) {
|
|
if dt == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
var commands map[string]interface{}
|
|
if err := dt.ParseCommands(&commands); err != nil {
|
|
return nil, fmt.Errorf("解析设备模板命令失败 (ID: %d): %w", dt.ID, err)
|
|
}
|
|
|
|
var values []models.ValueDescriptor
|
|
if dt.Category == models.CategorySensor {
|
|
if err := dt.ParseValues(&values); err != nil {
|
|
return nil, fmt.Errorf("解析设备模板值描述符失败 (ID: %d): %w", dt.ID, err)
|
|
}
|
|
}
|
|
|
|
return &DeviceTemplateResponse{
|
|
ID: dt.ID,
|
|
Name: dt.Name,
|
|
Manufacturer: dt.Manufacturer,
|
|
Description: dt.Description,
|
|
Category: dt.Category,
|
|
Commands: commands,
|
|
Values: values,
|
|
CreatedAt: dt.CreatedAt.Format(time.RFC3339),
|
|
UpdatedAt: dt.UpdatedAt.Format(time.RFC3339),
|
|
}, nil
|
|
}
|
|
|
|
// NewListDeviceTemplateResponse 从数据库模型切片创建一个新的设备模板列表响应 DTO 切片
|
|
func NewListDeviceTemplateResponse(dts []*models.DeviceTemplate) ([]*DeviceTemplateResponse, error) {
|
|
list := make([]*DeviceTemplateResponse, 0, len(dts))
|
|
for _, dt := range dts {
|
|
resp, err := NewDeviceTemplateResponse(dt)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
list = append(list, resp)
|
|
}
|
|
return list, nil
|
|
}
|