device.go 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. package service
  2. import (
  3. "IotAdmin/common/global"
  4. "IotAdmin/core/logger"
  5. "IotAdmin/core/sdk"
  6. "IotAdmin/core/sdk/service"
  7. "IotAdmin/core/tools/utils"
  8. "IotAdmin/iot/constant"
  9. iotInterface "IotAdmin/iot/interface"
  10. iotMeter "IotAdmin/iot/meter"
  11. iotProtocol "IotAdmin/iot/protocol"
  12. iotProtocolHandler "IotAdmin/iot/protocol/handler"
  13. "encoding/json"
  14. "errors"
  15. "strings"
  16. "gorm.io/gorm"
  17. "IotAdmin/app/iot/models"
  18. "IotAdmin/app/iot/service/dto"
  19. cDto "IotAdmin/common/dto"
  20. "IotAdmin/common/permission"
  21. )
  22. // IotDeviceService 设备服务
  23. type IotDeviceService struct {
  24. service.Service
  25. }
  26. // GetPage 获取设备列表
  27. func (e *IotDeviceService) GetPage(c *dto.IotDeviceGetPageReq, p *permission.DataPermission, list *[]models.IotDevice, count *int64) error {
  28. var err error
  29. var data models.IotDevice
  30. db := e.Orm.Model(&data).Scopes(
  31. cDto.MakeCondition(c.GetNeedSearch()),
  32. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  33. permission.Permission(data.TableName(), p),
  34. )
  35. if c.Type == constant.IotDeviceTypeGateway {
  36. db.Preload("Group").Select("id,name,type,group_id,sn,cycle,status,online_status,time_online,time_offline,iot_device.created_at")
  37. } else {
  38. db = db.Where("parent_id = ?", c.ParentId).Select("id,name,type,status,sn,protocol,mode,address,bm_yz,other_config,created_at")
  39. }
  40. err = db.Find(list).Limit(-1).Offset(-1).Count(count).Error
  41. if err != nil {
  42. e.Log.Errorf("IotDeviceService GetPage error:%s \r\n", err)
  43. return err
  44. }
  45. return nil
  46. }
  47. // Get 获取设备对象
  48. func (e *IotDeviceService) Get(d *dto.IotDeviceGetReq, p *permission.DataPermission, model *models.IotDevice) error {
  49. var data models.IotDevice
  50. err := e.Orm.Model(&data).Scopes(
  51. permission.Permission(data.TableName(), p),
  52. ).First(model, d.GetId()).Error
  53. if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
  54. err = errors.New("查看对象不存在或无权查看")
  55. e.Log.Errorf("Service GetIotDevice error:%s \r\n", err)
  56. return err
  57. }
  58. if err != nil {
  59. e.Log.Errorf("db error:%s", err)
  60. return err
  61. }
  62. return nil
  63. }
  64. // Insert 添加设备对象
  65. func (e *IotDeviceService) Insert(c *dto.IotDeviceInsertReq, p *permission.DataPermission) error {
  66. var err error
  67. data := &models.IotDevice{}
  68. last := &models.IotDevice{}
  69. e.Orm.Model(data).Scopes(
  70. permission.Permission(data.TableName(), p),
  71. ).Select("sn").Where("parent_id = ? AND type = ?", c.ParentId, c.Type).Order("created_at desc,id desc").Find(last)
  72. last.Type = c.Type
  73. if c.Type == constant.IotDeviceTypeMeter && last.Sn == "" {
  74. parent := &models.IotDevice{}
  75. e.Orm.Model(parent).First(parent, "id = ?", c.ParentId)
  76. if parent.Sn == "" {
  77. return errors.New("父设备编码为空")
  78. }
  79. last.Sn = parent.Sn
  80. }
  81. data.Last = last
  82. c.Generate(data)
  83. if data.Type == constant.IotDeviceTypeMeter && data.Dsn == "" {
  84. return errors.New("设备上报配置解析失败")
  85. }
  86. err = e.Orm.Create(data).Error
  87. if err != nil {
  88. e.Log.Errorf("IotDeviceService Insert error:%s \r\n", err)
  89. return err
  90. }
  91. if data.Type == constant.IotDeviceTypeGateway {
  92. err = updateDeviceMap(data.Id, constant.IotDeviceAdd)
  93. } else {
  94. err = updateDeviceMap(data.ParentId, constant.IotDeviceAdd)
  95. }
  96. if err != nil {
  97. return err
  98. }
  99. return nil
  100. }
  101. // Update 修改设备对象
  102. func (e *IotDeviceService) Update(c *dto.IotDeviceUpdateReq, p *permission.DataPermission) error {
  103. var err error
  104. var data = models.IotDevice{}
  105. e.Orm.Scopes(
  106. permission.Permission(data.TableName(), p),
  107. ).First(&data, c.GetId())
  108. c.Generate(&data)
  109. if data.Type == constant.IotDeviceTypeMeter && data.Dsn == "" {
  110. return errors.New("设备上报配置解析失败")
  111. }
  112. db := e.Orm.Save(&data)
  113. if err = db.Error; err != nil {
  114. e.Log.Errorf("IotDeviceService Save error:%s \r\n", err)
  115. return err
  116. }
  117. if db.RowsAffected == 0 {
  118. return errors.New("无权更新该数据")
  119. }
  120. if data.Type == constant.IotDeviceTypeGateway {
  121. err = updateDeviceMap(data.Id, constant.IotDeviceUpdate)
  122. } else {
  123. err = updateDeviceMap(data.ParentId, constant.IotDeviceUpdate)
  124. }
  125. if err != nil {
  126. return err
  127. }
  128. return nil
  129. }
  130. // Remove 删除设备
  131. func (e *IotDeviceService) Remove(d *dto.IotDeviceDeleteReq, p *permission.DataPermission) error {
  132. var data models.IotDevice
  133. var devices = make([]models.IotDevice, 0)
  134. db := e.Orm.Model(&data).Scopes(
  135. permission.Permission(data.TableName(), p),
  136. ).Find(&devices, d.GetId()).Delete(&data, d.GetId())
  137. if err := db.Error; err != nil {
  138. e.Log.Errorf("Service RemoveIotDevice error:%s \r\n", err)
  139. return err
  140. }
  141. if db.RowsAffected == 0 {
  142. return errors.New("无权删除该数据")
  143. }
  144. if len(devices) > 0 {
  145. var err error
  146. for _, device := range devices {
  147. if device.Type == constant.IotDeviceTypeGateway {
  148. err = updateDeviceMap(device.Id, constant.IotDeviceDelete)
  149. } else {
  150. err = updateDeviceMap(device.ParentId, constant.IotDeviceDelete)
  151. }
  152. if err != nil {
  153. return err
  154. }
  155. }
  156. }
  157. return nil
  158. }
  159. func (e *IotDeviceService) GetDeviceProtocols(list *[]string) {
  160. *list = iotProtocol.GetMeterProtocols()
  161. }
  162. func (e *IotDeviceService) GetReportProtocols(list *[]string) {
  163. *list = iotProtocol.GetPlatProtocols()
  164. }
  165. func (e *IotDeviceService) Refresh() error {
  166. err := updateDeviceMap(0, constant.IotDeviceRefresh)
  167. return err
  168. }
  169. func (e *IotDeviceService) GetDeviceConfig(d *dto.IotDeviceGetReq, p *permission.DataPermission, data *map[string]interface{}) error {
  170. device := &models.IotDevice{}
  171. err := e.Orm.Model(device).Scopes(
  172. permission.Permission(device.TableName(), p),
  173. ).First(device, d.GetId()).Error
  174. if err != nil {
  175. e.Log.Errorf("IotDeviceService GetDeviceConfig error:%s \r\n", err)
  176. return err
  177. }
  178. if device == nil {
  179. return errors.New("设备不存在或没有设备权限")
  180. }
  181. if device.Type != constant.IotDeviceTypeMeter {
  182. return errors.New("设备类型不支持此操作")
  183. }
  184. var cfg interface{}
  185. sn := device.Sn
  186. if strings.Contains(sn, "_") {
  187. arr := strings.Split(sn, "_")
  188. sn = arr[0]
  189. }
  190. ok := iotMeter.IsOnline(sn)
  191. if ok {
  192. cfg, err = iotMeter.GetMeterConfig(sn, device.Protocol, device.Address)
  193. if err != nil {
  194. return err
  195. }
  196. }
  197. *data = mergeDeviceConfig(device.OtherConfig, cfg)
  198. return nil
  199. }
  200. func (e *IotDeviceService) SetDeviceConfig(d *dto.IotDeviceSetConfigReq, p *permission.DataPermission) error {
  201. device := &models.IotDevice{}
  202. err := e.Orm.Model(device).Scopes(
  203. permission.Permission(device.TableName(), p),
  204. ).First(device, d.Id).Error
  205. if err != nil {
  206. e.Log.Errorf("IotDeviceService GetDeviceConfig error:%s \r\n", err)
  207. return err
  208. }
  209. if device == nil {
  210. return errors.New("设备不存在或没有设备权限")
  211. }
  212. if device.Type != constant.IotDeviceTypeMeter {
  213. return errors.New("设备类型不支持此操作")
  214. }
  215. if err = verifyDeviceConfig(device, d.Config); err != nil {
  216. return err
  217. }
  218. sn := device.Sn
  219. if strings.Contains(sn, "_") {
  220. arr := strings.Split(sn, "_")
  221. sn = arr[0]
  222. }
  223. ok := iotMeter.IsOnline(sn)
  224. if ok {
  225. if err = iotMeter.SetMeterConfig(sn, device.Protocol, device.Address, &d.Config); err != nil {
  226. return err
  227. }
  228. }
  229. err = e.Orm.Model(device).Update("other_config", d.Config).Error
  230. return err
  231. }
  232. func updateDeviceMap(deviceId int, changeType int) error {
  233. q := sdk.Runtime.GetMemoryQueue("")
  234. mp := make(map[string]interface{})
  235. mp["id"] = deviceId
  236. mp["type"] = changeType
  237. message, err := sdk.Runtime.GetStreamMessage("", global.DtuDeviceChange, mp)
  238. if err != nil {
  239. logger.Errorf("构建更新设备列表 message [%s]失败: %v", global.DtuDeviceChange, err)
  240. return err
  241. }
  242. err = q.Append(message)
  243. if err != nil {
  244. logger.Errorf("更新设备设备列表失败: %v", err)
  245. return err
  246. }
  247. return nil
  248. }
  249. func verifyDeviceConfig(device *models.IotDevice, cfgStr string) (err error) {
  250. var cfg interface{}
  251. if cfgStr == "" {
  252. return errors.New("配置不能为空")
  253. }
  254. ok := iotMeter.IsOnline(device.Sn)
  255. if ok {
  256. var handler iotInterface.MeterHandler
  257. handler, err = iotProtocolHandler.GetMeterHandler(device.Protocol)
  258. if err != nil {
  259. return err
  260. }
  261. cfg, err = handler.VerifyConfig(&cfgStr)
  262. if err != nil {
  263. return err
  264. }
  265. } else {
  266. err = json.Unmarshal([]byte(cfgStr), &cfg)
  267. if err != nil {
  268. return err
  269. }
  270. }
  271. var mp map[string]interface{}
  272. mp, err = utils.ToMap(cfg)
  273. if err != nil {
  274. return err
  275. }
  276. if strings.HasPrefix(device.Protocol, "El-") {
  277. if mp["pvRef"] == "" || mp["pvRef"] == "0" || mp["pvRef"] == 0 || mp["pvRef"] == nil {
  278. return errors.New("相基准电压[pvRef]不能为空")
  279. }
  280. if mp["lvRef"] == "" || mp["lvRef"] == "0" || mp["lvRef"] == 0 || mp["lvRef"] == nil {
  281. return errors.New("线基准电压[lvRef]不能为空")
  282. }
  283. }
  284. return err
  285. }
  286. func mergeDeviceConfig(first string, second interface{}) map[string]interface{} {
  287. sMp := make(map[string]interface{})
  288. if second != nil {
  289. sMp, _ = utils.ToMap(second)
  290. }
  291. if first == "" {
  292. return sMp
  293. }
  294. fMp := make(map[string]interface{})
  295. if err := json.Unmarshal([]byte(first), &fMp); err != nil {
  296. return sMp
  297. }
  298. return mergeConfigs(fMp, sMp)
  299. }
  300. func mergeConfigs(first map[string]interface{}, second map[string]interface{}) map[string]interface{} {
  301. mp := make(map[string]interface{})
  302. for k, v := range first {
  303. mp[k] = v
  304. }
  305. for k, v := range second {
  306. mp[k] = v
  307. }
  308. return mp
  309. }