model_service.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. package service
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "reflect"
  6. "rtzh_elec_temperature/conf"
  7. "rtzh_elec_temperature/datachannel"
  8. "rtzh_elec_temperature/global"
  9. "rtzh_elec_temperature/logger"
  10. "rtzh_elec_temperature/mqtt"
  11. "rtzh_elec_temperature/rtelec_app_public_lib/utils"
  12. "rtzh_elec_temperature/tools"
  13. "strconv"
  14. "strings"
  15. "sync"
  16. "github.com/spf13/cast"
  17. "github.com/astaxie/beego/orm"
  18. )
  19. var DeviceModel = make(map[string]interface{})
  20. var modelList = []interface{}{}
  21. var modelAttrList = new(sync.Map)
  22. var modelPeriod = new(sync.Map)
  23. //模型相关服务
  24. type ModelService struct {
  25. BaseService
  26. }
  27. func init() {
  28. logger.Logger.Println("初始化模型服务")
  29. go func() {
  30. for {
  31. data, ok := <-datachannel.Service_Model_Chanl
  32. logger.Logger.Debug(fmt.Sprintf("=======接收到中台回复的模型查询数据:%+v", data))
  33. if ok {
  34. ins := new(ModelService)
  35. go ins.HandleModel(data, tools.IsEmpty(data["mid"]))
  36. }
  37. }
  38. }()
  39. go func() {
  40. for {
  41. data, ok := <-datachannel.Service_ModelAttr_Chanl
  42. logger.Logger.Debug(fmt.Sprintf("=======接收到中台回复的模型属性查询数据:%+v", data))
  43. if ok {
  44. ins := new(ModelService)
  45. go ins.HandleModelAttr(data, tools.IsEmpty(data["mid"]))
  46. }
  47. }
  48. }()
  49. }
  50. func (t *ModelService) GetModelAttrListObj() *sync.Map {
  51. return modelAttrList
  52. }
  53. func (t *ModelService) SetModelAttrListObj(key int64, value []interface{}) {
  54. modelAttrList.Store(key, value)
  55. }
  56. func (t *ModelService) GetModelListObj() []interface{} {
  57. return modelList
  58. }
  59. //根据模型名称 返回模型id
  60. func (t *ModelService) GetModelId(name string) int {
  61. for _, row2 := range modelList {
  62. row := row2.(map[string]interface{})
  63. if tools.IsEmpty(row["model_name"]) == name {
  64. id, _ := strconv.Atoi(string(row["id"].(json.Number)))
  65. return id
  66. }
  67. }
  68. return 0
  69. }
  70. //根据模型Id返回模型信息
  71. func (t *ModelService) GetModelInfo(id string) interface{} {
  72. for _, row2 := range modelList {
  73. row := row2.(map[string]interface{})
  74. if string(row["id"].(json.Number)) == id {
  75. return row
  76. }
  77. }
  78. return nil
  79. }
  80. func (t *ModelService) SetModelListObj(mm []interface{}) {
  81. modelList = mm
  82. }
  83. //获取所有模型数据
  84. func (t *ModelService) QueryAllModel(messageId string) {
  85. var parameter = make(map[string]interface{})
  86. parameter["mid"] = messageId
  87. parameter["token"] = RtelecManageApp().AppToken
  88. value, _ := json.Marshal(parameter)
  89. utils.MessageIds.Set(messageId, messageId)
  90. mqtt.PublishMessage(global.Rtelec_Topics["model_get"], string(value))
  91. }
  92. //根据模型ID返回属性列表
  93. func (t *ModelService) GetModelAttrList(modelId int64) []interface{} {
  94. lst, ok := modelAttrList.Load(modelId)
  95. if ok {
  96. return lst.([]interface{})
  97. }
  98. return nil
  99. }
  100. //根据模型ID返回属性对象。以attr_name为key
  101. func (t *ModelService) GetModelAttrMap(modelId int64) map[string]interface{} {
  102. lst, ok := modelAttrList.Load(modelId)
  103. if ok {
  104. result := map[string]interface{}{}
  105. for _, r := range lst.([]interface{}) {
  106. r1 := r.(map[string]interface{})
  107. result[tools.IsEmpty(r1["attr_name"])] = r1
  108. }
  109. return result
  110. }
  111. return nil
  112. }
  113. //获取属性
  114. func (t *ModelService) QueryModelAttr(modelId int64, messageId string) {
  115. logger.Logger.Debug(fmt.Sprintf("获取模型%d的属性定义列表!", modelId))
  116. var modelName = ""
  117. for _, record := range t.GetModelListObj() {
  118. row := record.(map[string]interface{})
  119. v, _ := strconv.ParseInt(string(row["id"].(json.Number)), 10, 64)
  120. if v == modelId {
  121. modelName = row["model_name"].(string)
  122. break
  123. }
  124. }
  125. if modelName == "" {
  126. return
  127. }
  128. var para = make(map[string]interface{})
  129. para["modelId"] = modelId
  130. para["modelName"] = modelName
  131. var parameter = make(map[string]interface{})
  132. parameter["mid"] = messageId
  133. utils.MessageIds.Set(messageId, messageId)
  134. parameter["token"] = RtelecManageApp().AppToken
  135. Message, _ := json.Marshal(para)
  136. msg, _ := new(utils.ToolsLogic).EncryptMsg(Message, []byte(conf.GlobalConfig["rtelec_manage_password"]), true)
  137. parameter["message"] = msg
  138. value, _ := json.Marshal(parameter)
  139. logger.Logger.Debug(fmt.Sprintf("发送模型%d的属性定义列表查询数据:%s", modelId, string(value)))
  140. mqtt.PublishMessage(global.Rtelec_Topics["attr_get"], string(value))
  141. }
  142. //处理接收的mqtt模型数据
  143. //接收到的是中台所有模型,需要根据应用的场景-模型关系进行过滤出本应用的模型。如果没有配置场景模型关系,则返回所有模型
  144. func (t *ModelService) HandleModel(data map[string]interface{}, MessageId string) {
  145. if msg, ok := data["message"]; ok {
  146. sceneParas := map[string]string{}
  147. localAppSceneList, _ := new(SceneService).QueryScene(sceneParas)
  148. localAppSceneDict := map[string]orm.Params{}
  149. if localAppSceneList != nil {
  150. //将list转换成Map
  151. for _, row := range localAppSceneList {
  152. localAppSceneDict[tools.IsEmpty(row["modelid"])] = row
  153. }
  154. }
  155. if reflect.TypeOf(msg).Kind() == reflect.String {
  156. decoder := json.NewDecoder(strings.NewReader(msg.(string)))
  157. decoder.UseNumber()
  158. err := decoder.Decode(&data)
  159. if err != nil {
  160. logger.Logger.Error(err, cast.ToString(msg))
  161. return
  162. }
  163. } else {
  164. data = msg.(map[string]interface{})
  165. }
  166. logger.Logger.Debug(localAppSceneDict)
  167. if list, ok := data["list"]; ok {
  168. new(utils.MsgStateManage).SetMessageStateObj(MessageId, utils.MsgState{Success: true, State: true, Message: "操作成功", Value: list})
  169. var tempData = list.([]interface{})
  170. tmmpModelList := []interface{}{}
  171. for _, record := range tempData {
  172. row := record.(map[string]interface{})
  173. //logger.Logger.Debug(record)
  174. _, has := localAppSceneDict[tools.IsEmpty(row["id"])]
  175. if len(localAppSceneDict) == 0 || has {
  176. tmmpModelList = append(tmmpModelList, row)
  177. }
  178. }
  179. t.SetModelListObj(tmmpModelList)
  180. //获取模型属性
  181. for _, mlst := range tmmpModelList {
  182. row := mlst.(map[string]interface{})
  183. modleid := tools.IsEmpty(row["id"])
  184. t.QueryModelAttr(cast.ToInt64(modleid), tools.GetUid())
  185. }
  186. } else {
  187. new(utils.MsgStateManage).SetMessageStateObj(MessageId, utils.MsgState{Success: false, State: false, Message: "获取南向模型失败", Value: []string{}})
  188. }
  189. }
  190. }
  191. //处理接收的mqtt模型属性数据
  192. func (t *ModelService) HandleModelAttr(data map[string]interface{}, messageId string) {
  193. if mid, ok := data["mid"]; ok && mid != "" {
  194. if msg, ok := data["message"]; ok {
  195. if reflect.TypeOf(msg).Kind() == reflect.String {
  196. decoder := json.NewDecoder(strings.NewReader(msg.(string)))
  197. decoder.UseNumber()
  198. err := decoder.Decode(&data)
  199. if err == nil {
  200. //ModelAttrList
  201. if list, ok := data["list"]; ok {
  202. modeid := int64(0)
  203. lst := list.([]interface{})
  204. for _, row := range lst {
  205. row2 := row.(map[string]interface{})
  206. modeid, _ = strconv.ParseInt(string(row2["model_id"].(json.Number)), 10, 64)
  207. break
  208. }
  209. t.SetModelAttrListObj(modeid, lst)
  210. new(utils.MsgStateManage).SetMessageStateObj(messageId, utils.MsgState{Success: true, State: true, Message: "获取属性信息成功", Value: list})
  211. } else {
  212. new(utils.MsgStateManage).SetMessageStateObj(messageId, utils.MsgState{Success: false, State: false, Message: "获取属性信息失败", Value: []string{}})
  213. }
  214. }
  215. }
  216. }
  217. }
  218. }