device.go 9.2 KB

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