meter_calc.go 2.7 KB

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