package Warning import ( "ColdP_server/controllers/lib" "ColdP_server/logs" "fmt" _ "github.com/astaxie/beego/cache/redis" "github.com/beego/beego/v2/adapter/orm" _ "github.com/go-sql-driver/mysql" "strconv" "strings" "sync" "time" ) // 模板 type WarningType struct { Id int `orm:"column(ID);size(11);auto;pk"` T_name string `orm:"size(256);null"` // 分类 T_Tips string `orm:"type(text);size(256);null"` // 提示 T_Notice int `orm:"size(2);default(0)"` // 是否在报警策略通知机制处展示 0 不展示 1 展示 } var DeviceLogType = [3]int{101, 102, 103} var RateType = [8]int{1, 2, 3, 4, 6, 7, 8, 9} //3 //tp 报警类型 // 1 温度超上限报警 // 2 温度超下限报警 // 3 温度超上限预警 // 4 温度超下限预警 // 5 温度恢复正常 // 6 湿度超上限报警 // 7 湿度超下限报警 // 8 湿度超上限预警 // 9 湿度超下限预警 // 10 湿度恢复正常 //12 //tp 报警类型 // 101 主机报警 // 102 时间报警 // 103 闪存报警 // 104 SD卡报警 // 105 网络报警 // 106 普通日志 // 107 升级固件报警 // 108 系统故障报警 // 109 市电断电报警 // 110 市电已恢复 // 111 电池电量低报警 // 112 电池电量恢复 // 113 传感器故障报警 // 114 传感器恢复 // 115 开始任务(移动端) // 116 中途打印任务(移动端) // 117 结束任务(移动端) // 预警系统 // 1001 设备状态异常 // 1002 传感器数据异常 // 1011 报警策略异常 func (t *WarningType) TableName() string { return "warning_type" // 数据库名称 // ************** 替换 FormulaList ************** } // var redisCache_WarningType cache.Cache var WarningType_list *sync.Map // 泛型 func init() { //注册模型 WarningType_list = new(sync.Map) orm.RegisterModel(new(WarningType)) go Read_WarningType_All_Maps() } type WarningType_R struct { Id int T_name string // 分类 T_check bool // 是否勾选 } type WarningType_ struct { Id int T_name string // 分类 } func WarningTypeToWarningType_R(r WarningType, T_warning string) (v WarningType_R) { v.Id = r.Id v.T_name = r.T_name if strings.Contains(T_warning, "W"+strconv.Itoa(v.Id)+"|") || T_warning == "*" { v.T_check = true } return v } func WarningTypeToWarningType_(r WarningType) (v WarningType_) { v.Id = r.Id v.T_name = r.T_name return v } // 获取全部 func Read_WarningType_All_T_Notice_mechanism() string { logs.Println("=========== 初始化报警规则 =========") time.Sleep(3 * time.Second) o := orm.NewOrm() var r []WarningType qs := o.QueryTable(new(WarningType)) _, err := qs.Filter("T_Notice", 1).All(&r) if err != nil { logs.Error(lib.FuncName(), err) return "" } str := "" for _, v := range r { str += v.T_Tips } return str } // 获取全部 func Read_WarningType_All() (r []WarningType_) { o := orm.NewOrm() var maps []WarningType qs := o.QueryTable(new(WarningType)) _, err := qs.All(&maps) if err != nil { logs.Error(lib.FuncName(), err) return } for _, v := range maps { r = append(r, WarningTypeToWarningType_(v)) } return r } // 报警列表 返回权限拥有的报警类型列表 func Read_WarningType_Power_All(T_warning string) (r []WarningType_) { if len(T_warning) == 0 { return r } o := orm.NewOrm() var maps []WarningType qs := o.QueryTable(new(WarningType)) if T_warning == "*" { _, err := qs.All(&maps) if err != nil { logs.Error(lib.FuncName(), err) return } } else { list := lib.SplitStringIds(T_warning, "W") _, err := qs.Filter("Id__in", list).All(&maps) if err != nil { logs.Error(lib.FuncName(), err) return } } for _, v := range maps { r = append(r, WarningTypeToWarningType_(v)) } return r } // 权限修改 返回全部,已勾选的T_check=true func Read_WarningType_All_Power_T_Warning(T_warning string) (r []WarningType_R) { o := orm.NewOrm() // 也可以直接使用 Model 结构体作为表名 var maps []WarningType qs := o.QueryTable(new(WarningType)) _, err := qs.OrderBy("Id").All(&maps) if err != nil { logs.Error(lib.FuncName(), err) return } for _, v := range maps { r = append(r, WarningTypeToWarningType_R(v, T_warning)) } return r } // 获取全部 func Read_WarningType_All_Maps() { time.Sleep(2 * time.Second) logs.Println("=========== 初始化报警类型 =========") o := orm.NewOrm() for true { var r []WarningType qs := o.QueryTable(new(WarningType)) _, err := qs.All(&r) if err != nil { logs.Error(lib.FuncName(), err) } for _, v := range r { WarningType_list.Store(v.Id, v.T_name) } time.Sleep(1 * time.Hour) } } func Read_WarningType_Get(id int) string { v, ok := WarningType_list.Load(id) /*如果确定是真实的,则存在,否则不存在 */ if ok { return v.(string) } else { return "未知类型" } } // 报警类型 func Read_WarningType(id string) int { var r int WarningType_list.Range(func(key, value any) bool { if value.(string) == id { r = key.(int) return false // 找到匹配后立即结束遍历 } return true // 继续遍历 }) // 如果没有找到匹配项,在遍历结束后返回默认值或其他处理 if r == 0 { // 这里可以根据需要处理未找到的情况,比如返回一个错误码或特定值 fmt.Println("No matching key found for the given ID") } return r }