device.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. package service
  2. import (
  3. "IotAdmin/common/global"
  4. "IotAdmin/core/logger"
  5. "IotAdmin/core/sdk"
  6. "IotAdmin/core/sdk/service"
  7. "IotAdmin/iot/constant"
  8. iotProtocol "IotAdmin/iot/protocol"
  9. "errors"
  10. "gorm.io/gorm"
  11. "IotAdmin/app/iot/models"
  12. "IotAdmin/app/iot/service/dto"
  13. cDto "IotAdmin/common/dto"
  14. "IotAdmin/common/permission"
  15. )
  16. // IotDeviceService 设备服务
  17. type IotDeviceService struct {
  18. service.Service
  19. }
  20. // GetPage 获取设备列表
  21. func (e *IotDeviceService) GetPage(c *dto.IotDeviceGetPageReq, p *permission.DataPermission, list *[]models.IotDevice, count *int64) error {
  22. var err error
  23. var data models.IotDevice
  24. db := e.Orm.Model(&data).Scopes(
  25. cDto.MakeCondition(c.GetNeedSearch()),
  26. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  27. permission.Permission(data.TableName(), p),
  28. )
  29. if c.Type == constant.IotDeviceTypeGateway {
  30. db.Preload("Group").Select("id,name,type,group_id,sn,cycle,status,online_status,time_online,time_offline,iot_device.created_at")
  31. } else {
  32. db = db.Where("parent_id = ?", c.ParentId).Select("id,name,type,status,sn,protocol,mode,address,bm_yz,other_config,created_at")
  33. }
  34. err = db.Find(list).Limit(-1).Offset(-1).Count(count).Error
  35. if err != nil {
  36. e.Log.Errorf("IotDeviceService GetPage error:%s \r\n", err)
  37. return err
  38. }
  39. return nil
  40. }
  41. // Get 获取设备对象
  42. func (e *IotDeviceService) Get(d *dto.IotDeviceGetReq, p *permission.DataPermission, model *models.IotDevice) error {
  43. var data models.IotDevice
  44. err := e.Orm.Model(&data).Scopes(
  45. permission.Permission(data.TableName(), p),
  46. ).First(model, d.GetId()).Error
  47. if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
  48. err = errors.New("查看对象不存在或无权查看")
  49. e.Log.Errorf("Service GetIotDevice error:%s \r\n", err)
  50. return err
  51. }
  52. if err != nil {
  53. e.Log.Errorf("db error:%s", err)
  54. return err
  55. }
  56. return nil
  57. }
  58. // Insert 添加设备对象
  59. func (e *IotDeviceService) Insert(c *dto.IotDeviceInsertReq, p *permission.DataPermission) error {
  60. var err error
  61. data := &models.IotDevice{}
  62. last := &models.IotDevice{}
  63. e.Orm.Model(data).Scopes(
  64. permission.Permission(data.TableName(), p),
  65. ).Select("sn").Where("parent_id = ? AND type = ?", c.ParentId, c.Type).Order("created_at desc,id desc").Find(last)
  66. last.Type = c.Type
  67. if c.Type == constant.IotDeviceTypeMeter && last.Sn == "" {
  68. parent := &models.IotDevice{}
  69. e.Orm.Model(parent).First(parent, "id = ?", c.ParentId)
  70. if parent.Sn == "" {
  71. return errors.New("父设备编码为空")
  72. }
  73. last.Sn = parent.Sn
  74. }
  75. data.Last = last
  76. c.Generate(data)
  77. if data.Type == constant.IotDeviceTypeMeter && data.Dsn == "" {
  78. return errors.New("设备上报配置解析失败")
  79. }
  80. err = e.Orm.Create(data).Error
  81. if err != nil {
  82. e.Log.Errorf("IotDeviceService Insert error:%s \r\n", err)
  83. return err
  84. }
  85. if data.Type == constant.IotDeviceTypeGateway {
  86. err = updateDeviceMap(data.Id, constant.IotDeviceAdd)
  87. } else {
  88. err = updateDeviceMap(data.ParentId, constant.IotDeviceAdd)
  89. }
  90. if err != nil {
  91. return err
  92. }
  93. return nil
  94. }
  95. // Update 修改设备对象
  96. func (e *IotDeviceService) Update(c *dto.IotDeviceUpdateReq, p *permission.DataPermission) error {
  97. var err error
  98. var data = models.IotDevice{}
  99. e.Orm.Scopes(
  100. permission.Permission(data.TableName(), p),
  101. ).First(&data, c.GetId())
  102. c.Generate(&data)
  103. if data.Type == constant.IotDeviceTypeMeter && data.Dsn == "" {
  104. return errors.New("设备上报配置解析失败")
  105. }
  106. db := e.Orm.Save(&data)
  107. if err = db.Error; err != nil {
  108. e.Log.Errorf("IotDeviceService Save error:%s \r\n", err)
  109. return err
  110. }
  111. if db.RowsAffected == 0 {
  112. return errors.New("无权更新该数据")
  113. }
  114. if data.Type == constant.IotDeviceTypeGateway {
  115. err = updateDeviceMap(data.Id, constant.IotDeviceUpdate)
  116. } else {
  117. err = updateDeviceMap(data.ParentId, constant.IotDeviceUpdate)
  118. }
  119. if err != nil {
  120. return err
  121. }
  122. return nil
  123. }
  124. // Remove 删除设备
  125. func (e *IotDeviceService) Remove(d *dto.IotDeviceDeleteReq, p *permission.DataPermission) error {
  126. var data models.IotDevice
  127. var devices = make([]models.IotDevice, 0)
  128. db := e.Orm.Model(&data).Scopes(
  129. permission.Permission(data.TableName(), p),
  130. ).Find(&devices, d.GetId()).Delete(&data, d.GetId())
  131. if err := db.Error; err != nil {
  132. e.Log.Errorf("Service RemoveIotDevice error:%s \r\n", err)
  133. return err
  134. }
  135. if db.RowsAffected == 0 {
  136. return errors.New("无权删除该数据")
  137. }
  138. if len(devices) > 0 {
  139. var err error
  140. for _, device := range devices {
  141. if device.Type == constant.IotDeviceTypeGateway {
  142. err = updateDeviceMap(device.Id, constant.IotDeviceDelete)
  143. } else {
  144. err = updateDeviceMap(device.ParentId, constant.IotDeviceDelete)
  145. }
  146. if err != nil {
  147. return err
  148. }
  149. }
  150. }
  151. return nil
  152. }
  153. func (e *IotDeviceService) GetDeviceProtocols(list *[]string) {
  154. *list = iotProtocol.GetMeterProtocols()
  155. }
  156. func (e *IotDeviceService) GetReportProtocols(list *[]string) {
  157. *list = iotProtocol.GetPlatProtocols()
  158. }
  159. func (e *IotDeviceService) Refresh() error {
  160. err := updateDeviceMap(0, constant.IotDeviceRefresh)
  161. return err
  162. }
  163. func updateDeviceMap(deviceId int, changeType int) error {
  164. q := sdk.Runtime.GetMemoryQueue("")
  165. mp := make(map[string]interface{})
  166. mp["id"] = deviceId
  167. mp["type"] = changeType
  168. message, err := sdk.Runtime.GetStreamMessage("", global.DtuDeviceChange, mp)
  169. if err != nil {
  170. logger.Errorf("构建更新设备列表 message [%s]失败: %v", global.DtuDeviceChange, err)
  171. return err
  172. }
  173. err = q.Append(message)
  174. if err != nil {
  175. logger.Errorf("更新设备设备列表失败: %v", err)
  176. return err
  177. }
  178. return nil
  179. }