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
 | |
| }
 |