meter_calc.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package iotDb
  2. import (
  3. "IotAdmin/app/iot/models"
  4. "IotAdmin/core/logger"
  5. "IotAdmin/core/sdk"
  6. "IotAdmin/core/storage"
  7. iotMap "IotAdmin/iot/map"
  8. iotReportProtocol "IotAdmin/iot/protocol/report"
  9. "encoding/json"
  10. "errors"
  11. "fmt"
  12. )
  13. // LoadMeterCalcMap 加载表计计算配置
  14. func LoadMeterCalcMap() error {
  15. iotMap.MapMeterCalc.Clean()
  16. calcArr := make([]models.IotMeterCalc, 0)
  17. if len(dbMap) == 0 {
  18. return errors.New("dbMap is empty")
  19. }
  20. for _, db := range dbMap {
  21. arr := make([]models.IotMeterCalc, 0)
  22. mc := &models.IotMeterCalc{}
  23. err := db.Model(mc).Preload("Device").Find(&arr).Error
  24. if err != nil {
  25. continue
  26. }
  27. calcArr = append(calcArr, arr...)
  28. }
  29. return loadMeterCalcMap(&calcArr)
  30. }
  31. func loadMeterCalcMap(arr *[]models.IotMeterCalc) error {
  32. for _, v := range *arr {
  33. if v.Device == nil || v.Device.Protocol == "" {
  34. continue
  35. }
  36. if err := addMeterCalc(v); err != nil {
  37. return err
  38. }
  39. }
  40. return nil
  41. }
  42. // AddMaterCalc 添加表计计算配置
  43. func AddMaterCalc(id, host string) error {
  44. if host == "" {
  45. host = "*"
  46. }
  47. db := dbMap[host]
  48. if db == nil {
  49. return errors.New("db is nil")
  50. }
  51. mc := &models.IotMeterCalc{}
  52. db.Model(mc).Preload("Device").Where("id = ?", id).Find(mc)
  53. return addMeterCalc(*mc)
  54. }
  55. func addMeterCalc(mc models.IotMeterCalc) (err error) {
  56. if mc.Device == nil || mc.Device.Protocol == "" {
  57. return errors.New("device is nil")
  58. }
  59. meterCalcHandler, err := iotReportProtocol.GetMeterCalcHandler(mc.Device.Protocol, mc.Id, mc.Time, mc.Data, mc.Device.OtherConfig)
  60. if err != nil {
  61. return
  62. }
  63. iotMap.MapMeterCalc.Add(mc.Id, &meterCalcHandler)
  64. return
  65. }
  66. func UpdateMeterCalc(message storage.Message) (err error) {
  67. db := sdk.Runtime.GetDbByKey(message.GetPrefix())
  68. if db == nil {
  69. err = errors.New("db not exist")
  70. logger.Errorf("host[%s]'s %s", message.GetPrefix(), err.Error())
  71. return nil
  72. }
  73. var rb []byte
  74. rb, err = json.Marshal(message.GetValues())
  75. if err != nil {
  76. err = fmt.Errorf("json Marshal error,%s, %v", string(rb), err.Error())
  77. return err
  78. }
  79. var val = &models.IotMeterCalc{}
  80. err = json.Unmarshal(rb, val)
  81. if err != nil {
  82. err = fmt.Errorf("json Unmarshal error,%s, %v", string(rb), err.Error())
  83. return err
  84. }
  85. err = db.Model(val).Where("id = ?", val.Id).Assign(models.IotMeterCalc{
  86. Time: val.Time,
  87. Data: val.Data,
  88. }).FirstOrCreate(val).Error
  89. if err != nil {
  90. err = fmt.Errorf("db update error, %v", err.Error())
  91. return err
  92. }
  93. return
  94. }