解析device和task的配置全部用内置方法处理

This commit is contained in:
2025-09-27 00:58:22 +08:00
parent 29fa23ba36
commit aed665b6b0
8 changed files with 46 additions and 15 deletions

View File

@@ -6,6 +6,8 @@ import (
"gorm.io/datatypes"
"gorm.io/gorm"
"git.huangwc.com/pig/pig-farm-controller/internal/infra/utils"
)
// DeviceType 定义了设备的高级类别
@@ -139,20 +141,23 @@ func (d *Device) SelfCheck() bool {
return false
}
// 检查通用属性是否存在
has := func(key string) bool {
_, ok := props[key]
return ok
// hasPureNumeric 检查一个key是否存在于map中并且其值是纯数字整数或可解析为整数的字符串
hasPureNumeric := func(key string) bool {
val, ok := props[key]
if !ok {
return false // Key不存在
}
return utils.IsPureNumeric(val)
}
// 根据子类型进行具体校验
switch d.SubType {
// 所有传感器类型都必须有 Command 和总线信息
// 所有传感器类型都必须有 Command 和总线信息,且总线信息为纯数字
case SubTypeSensorTemp, SubTypeSensorHumidity, SubTypeSensorWeight, SubTypeSensorAmmonia:
return d.Command != "" && has(BusNumber) && has(BusAddress)
// 所有开关类型都必须有继电器和总线信息
return d.Command != "" && hasPureNumeric(BusNumber) && hasPureNumeric(BusAddress)
// 所有开关类型都必须有继电器和总线信息,且都为纯数字
case SubTypeFan, SubTypeWaterCurtain, SubTypeValveFeed:
return has(BusNumber) && has(BusAddress) && has(RelayChannel)
return hasPureNumeric(BusNumber) && hasPureNumeric(BusAddress) && hasPureNumeric(RelayChannel)
// 如果是未知的子类型,或者没有子类型,则认为自检失败
default:
return false

View File

@@ -1,6 +1,8 @@
package models
import (
"encoding/json"
"errors"
"fmt"
"sort"
"time"
@@ -172,3 +174,16 @@ type Task struct {
func (Task) TableName() string {
return "tasks"
}
// ParseParameters 解析 JSON 属性到一个具体的结构体中。
// 调用方需要传入一个指向目标结构体实例的指针。
// 示例:
//
// var param LoraParameters
// if err := task.ParseParameters(&param); err != nil { ... }
func (t Task) ParseParameters(v interface{}) error {
if t.Parameters == nil {
return errors.New("设备属性为空,无法解析")
}
return json.Unmarshal(t.Parameters, v)
}

View File

@@ -0,0 +1,13 @@
package utils
import (
"fmt"
"strconv"
)
// IsPureNumeric 检查值是否纯数字(整数或可转换为整数的字符串)。
func IsPureNumeric(val interface{}) bool {
v := fmt.Sprintf("%v", val)
_, err := strconv.Atoi(v)
return err == nil
}