You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
3.4 KiB

package common_models
import (
"encoding/json"
"errors"
"fmt"
"gitea.anxinyun.cn/container/common_models/constant/logTag"
"gitea.anxinyun.cn/container/common_models/constant/settlementParam"
"log"
"strconv"
)
var group36 = `
RedisKey = group:36 的值
{
"id": 36,
"name": "上游沉降",
"group_type": "202",
"items": [
{
"sensor": 26,
"params_value": {
"base": false
}
},
{
"sensor": 43,
"params_value": {
"base": false
}
},
{
"sensor": 192,
"params_value": {
"base": true
}
}
],
"params": {
"ref_base": 193,
"ref_point": 23
}
}
`
type StationGroup struct {
Id int `json:"id"`
Name string `json:"name"`
GroupType string `json:"group_type"`
Items []GroupItem `json:"items"`
Params map[string]interface{}
}
// AllCorrItems 分组的关联项 = Items + 该分组的级联 ref_base、ref_point(可能有多层)
func (g *StationGroup) AllCorrItems() []GroupItem {
var allCorrItems []GroupItem
for _, item := range g.Items {
allCorrItems = append(allCorrItems, item.CorrItems()...)
}
return allCorrItems
}
// GetSettlementBaseItem 获取沉降分组的基点
func (g *StationGroup) GetSettlementBaseItem() *GroupItem {
for _, item := range g.Items {
if item.ParamsValue[settlementParam.Base] == true {
return &item
}
}
return nil
}
func (g *StationGroup) R() string {
return fmt.Sprintf("[%s:%d]", logTag.Group, g.Id)
}
// redis序列化
func (g *StationGroup) MarshalBinary() (data []byte, err error) {
return json.Marshal(g)
}
// redis序列化
func (g *StationGroup) UnmarshalBinary(data []byte) error {
return json.Unmarshal(data, g)
}
type GroupItem struct {
StationId int `json:"sensor"`
ParamsValue map[string]interface{} `json:"params_value"`
SubItems map[string]GroupItem `json:"subItems,omitempty"`
}
// GetDoubleParam 返回param的float64值
func (g *GroupItem) GetDoubleParam(key string) (float64, error) {
value := g.ParamsValue[key]
switch v := value.(type) {
case int:
return float64(v), nil
case float64:
return v, nil
case string:
if floatValue, err := strconv.ParseFloat(v, 64); err == nil {
return floatValue, nil
} else {
log.Printf("[GroupItem.getDoubleParam] key=%s value=%v ,value parse to float64 error: %v\n", key, value, err)
return 0.0, err
}
}
var noKeyMsg = fmt.Sprintf("[GroupItem.getDoubleParam] no key=%s\n", key)
log.Println(noKeyMsg)
return 0.0, errors.New(noKeyMsg)
}
// CorrItems 基点的级联参考基点和参考测点
func (g *GroupItem) CorrItems() []GroupItem {
if g.SubItems == nil {
return []GroupItem{*g}
}
var result []GroupItem
for _, item := range g.SubItems {
result = append(result, item.CorrItems()...)
}
result = append(result, *g)
return result
}
// StationGroupInfo 测点的分组信息(对应 ET3.0 的 secure_station_group )
type StationGroupInfo struct {
StationId int `json:"station"`
GroupId int `json:"group"`
Params map[string]interface{} `json:"params"`
Name string `json:"name"`
GroupType string `json:"group_type"`
}
// redis序列化
func (g *StationGroupInfo) MarshalBinary() (data []byte, err error) {
return json.Marshal(g)
}
// redis序列化
func (g *StationGroupInfo) UnmarshalBinary(data []byte) error {
return json.Unmarshal(data, g)
}