| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- package service
- import (
- "encoding/json"
- "fmt"
- "reflect"
- "rtzh_elec_temperature/conf"
- "rtzh_elec_temperature/datachannel"
- "rtzh_elec_temperature/global"
- "rtzh_elec_temperature/logger"
- "rtzh_elec_temperature/mqtt"
- "rtzh_elec_temperature/rtelec_app_public_lib/utils"
- "rtzh_elec_temperature/tools"
- "strconv"
- "strings"
- "sync"
- "github.com/spf13/cast"
- "github.com/astaxie/beego/orm"
- )
- var DeviceModel = make(map[string]interface{})
- var modelList = []interface{}{}
- var modelAttrList = new(sync.Map)
- var modelPeriod = new(sync.Map)
- //模型相关服务
- type ModelService struct {
- BaseService
- }
- func init() {
- logger.Logger.Println("初始化模型服务")
- go func() {
- for {
- data, ok := <-datachannel.Service_Model_Chanl
- logger.Logger.Debug(fmt.Sprintf("=======接收到中台回复的模型查询数据:%+v", data))
- if ok {
- ins := new(ModelService)
- go ins.HandleModel(data, tools.IsEmpty(data["mid"]))
- }
- }
- }()
- go func() {
- for {
- data, ok := <-datachannel.Service_ModelAttr_Chanl
- logger.Logger.Debug(fmt.Sprintf("=======接收到中台回复的模型属性查询数据:%+v", data))
- if ok {
- ins := new(ModelService)
- go ins.HandleModelAttr(data, tools.IsEmpty(data["mid"]))
- }
- }
- }()
- }
- func (t *ModelService) GetModelAttrListObj() *sync.Map {
- return modelAttrList
- }
- func (t *ModelService) SetModelAttrListObj(key int64, value []interface{}) {
- modelAttrList.Store(key, value)
- }
- func (t *ModelService) GetModelListObj() []interface{} {
- return modelList
- }
- //根据模型名称 返回模型id
- func (t *ModelService) GetModelId(name string) int {
- for _, row2 := range modelList {
- row := row2.(map[string]interface{})
- if tools.IsEmpty(row["model_name"]) == name {
- id, _ := strconv.Atoi(string(row["id"].(json.Number)))
- return id
- }
- }
- return 0
- }
- //根据模型Id返回模型信息
- func (t *ModelService) GetModelInfo(id string) interface{} {
- for _, row2 := range modelList {
- row := row2.(map[string]interface{})
- if string(row["id"].(json.Number)) == id {
- return row
- }
- }
- return nil
- }
- func (t *ModelService) SetModelListObj(mm []interface{}) {
- modelList = mm
- }
- //获取所有模型数据
- func (t *ModelService) QueryAllModel(messageId string) {
- var parameter = make(map[string]interface{})
- parameter["mid"] = messageId
- parameter["token"] = RtelecManageApp().AppToken
- value, _ := json.Marshal(parameter)
- utils.MessageIds.Set(messageId, messageId)
- mqtt.PublishMessage(global.Rtelec_Topics["model_get"], string(value))
- }
- //根据模型ID返回属性列表
- func (t *ModelService) GetModelAttrList(modelId int64) []interface{} {
- lst, ok := modelAttrList.Load(modelId)
- if ok {
- return lst.([]interface{})
- }
- return nil
- }
- //根据模型ID返回属性对象。以attr_name为key
- func (t *ModelService) GetModelAttrMap(modelId int64) map[string]interface{} {
- lst, ok := modelAttrList.Load(modelId)
- if ok {
- result := map[string]interface{}{}
- for _, r := range lst.([]interface{}) {
- r1 := r.(map[string]interface{})
- result[tools.IsEmpty(r1["attr_name"])] = r1
- }
- return result
- }
- return nil
- }
- //获取属性
- func (t *ModelService) QueryModelAttr(modelId int64, messageId string) {
- logger.Logger.Debug(fmt.Sprintf("获取模型%d的属性定义列表!", modelId))
- var modelName = ""
- for _, record := range t.GetModelListObj() {
- row := record.(map[string]interface{})
- v, _ := strconv.ParseInt(string(row["id"].(json.Number)), 10, 64)
- if v == modelId {
- modelName = row["model_name"].(string)
- break
- }
- }
- if modelName == "" {
- return
- }
- var para = make(map[string]interface{})
- para["modelId"] = modelId
- para["modelName"] = modelName
- var parameter = make(map[string]interface{})
- parameter["mid"] = messageId
- utils.MessageIds.Set(messageId, messageId)
- parameter["token"] = RtelecManageApp().AppToken
- Message, _ := json.Marshal(para)
- msg, _ := new(utils.ToolsLogic).EncryptMsg(Message, []byte(conf.GlobalConfig["rtelec_manage_password"]), true)
- parameter["message"] = msg
- value, _ := json.Marshal(parameter)
- logger.Logger.Debug(fmt.Sprintf("发送模型%d的属性定义列表查询数据:%s", modelId, string(value)))
- mqtt.PublishMessage(global.Rtelec_Topics["attr_get"], string(value))
- }
- //处理接收的mqtt模型数据
- //接收到的是中台所有模型,需要根据应用的场景-模型关系进行过滤出本应用的模型。如果没有配置场景模型关系,则返回所有模型
- func (t *ModelService) HandleModel(data map[string]interface{}, MessageId string) {
- if msg, ok := data["message"]; ok {
- sceneParas := map[string]string{}
- localAppSceneList, _ := new(SceneService).QueryScene(sceneParas)
- localAppSceneDict := map[string]orm.Params{}
- if localAppSceneList != nil {
- //将list转换成Map
- for _, row := range localAppSceneList {
- localAppSceneDict[tools.IsEmpty(row["modelid"])] = row
- }
- }
- if reflect.TypeOf(msg).Kind() == reflect.String {
- decoder := json.NewDecoder(strings.NewReader(msg.(string)))
- decoder.UseNumber()
- err := decoder.Decode(&data)
- if err != nil {
- logger.Logger.Error(err, cast.ToString(msg))
- return
- }
- } else {
- data = msg.(map[string]interface{})
- }
- logger.Logger.Debug(localAppSceneDict)
- if list, ok := data["list"]; ok {
- new(utils.MsgStateManage).SetMessageStateObj(MessageId, utils.MsgState{Success: true, State: true, Message: "操作成功", Value: list})
- var tempData = list.([]interface{})
- tmmpModelList := []interface{}{}
- for _, record := range tempData {
- row := record.(map[string]interface{})
- //logger.Logger.Debug(record)
- _, has := localAppSceneDict[tools.IsEmpty(row["id"])]
- if len(localAppSceneDict) == 0 || has {
- tmmpModelList = append(tmmpModelList, row)
- }
- }
- t.SetModelListObj(tmmpModelList)
- //获取模型属性
- for _, mlst := range tmmpModelList {
- row := mlst.(map[string]interface{})
- modleid := tools.IsEmpty(row["id"])
- t.QueryModelAttr(cast.ToInt64(modleid), tools.GetUid())
- }
- } else {
- new(utils.MsgStateManage).SetMessageStateObj(MessageId, utils.MsgState{Success: false, State: false, Message: "获取南向模型失败", Value: []string{}})
- }
- }
- }
- //处理接收的mqtt模型属性数据
- func (t *ModelService) HandleModelAttr(data map[string]interface{}, messageId string) {
- if mid, ok := data["mid"]; ok && mid != "" {
- if msg, ok := data["message"]; ok {
- if reflect.TypeOf(msg).Kind() == reflect.String {
- decoder := json.NewDecoder(strings.NewReader(msg.(string)))
- decoder.UseNumber()
- err := decoder.Decode(&data)
- if err == nil {
- //ModelAttrList
- if list, ok := data["list"]; ok {
- modeid := int64(0)
- lst := list.([]interface{})
- for _, row := range lst {
- row2 := row.(map[string]interface{})
- modeid, _ = strconv.ParseInt(string(row2["model_id"].(json.Number)), 10, 64)
- break
- }
- t.SetModelAttrListObj(modeid, lst)
- new(utils.MsgStateManage).SetMessageStateObj(messageId, utils.MsgState{Success: true, State: true, Message: "获取属性信息成功", Value: list})
- } else {
- new(utils.MsgStateManage).SetMessageStateObj(messageId, utils.MsgState{Success: false, State: false, Message: "获取属性信息失败", Value: []string{}})
- }
- }
- }
- }
- }
- }
|