cron.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package service
  2. import (
  3. "server/logger"
  4. "server/modbus"
  5. "server/model"
  6. "server/utils"
  7. "time"
  8. )
  9. type Cron struct {
  10. }
  11. // RelayOnOffTimeTask 定时开关 前提是 设备在线 否则失效
  12. func (c Cron) RelayOnOffTimeTask() {
  13. current := time.Now().Format("15:04")
  14. devices, err := utils.GetOnlineDevices()
  15. if err != nil {
  16. logger.Get().Errorf("LoadData err = %s", err.Error())
  17. return
  18. }
  19. relayMap := make(map[string]map[int]int)
  20. for _, d := range devices {
  21. //if d.State == 0 {
  22. // continue
  23. //}
  24. tmp, isExist := relayMap[d.Sn]
  25. if !isExist { // 回路id 回路状态
  26. tmp = make(map[int]int)
  27. }
  28. relays := d.DeviceLoops
  29. rcTime, rlTime, err := utils.SunriseSunsetForChina(28.23, 113.05)
  30. if err != nil {
  31. logger.Get().Errorf("SunriseSunsetForChina err = %s", err.Error())
  32. rcTime = "06:00"
  33. rlTime = "18:00"
  34. }
  35. for _, r := range relays {
  36. //日出日落时间
  37. if r.TimeCondition1OnTime == "日出" {
  38. r.TimeCondition1OnTime = rcTime
  39. } else if r.TimeCondition1OnTime == "日落" {
  40. r.TimeCondition1OnTime = rlTime
  41. }
  42. if r.TimeCondition1OffTime == "日出" {
  43. r.TimeCondition1OffTime = rcTime
  44. } else if r.TimeCondition1OffTime == "日落" {
  45. r.TimeCondition1OffTime = rlTime
  46. }
  47. if r.TimeCondition2OnTime == "日出" {
  48. r.TimeCondition2OnTime = rcTime
  49. } else if r.TimeCondition2OnTime == "日落" {
  50. r.TimeCondition2OnTime = rlTime
  51. }
  52. if r.TimeCondition2OffTime == "日出" {
  53. r.TimeCondition2OffTime = rcTime
  54. } else if r.TimeCondition2OffTime == "日落" {
  55. r.TimeCondition2OffTime = rlTime
  56. }
  57. isTiming := 0 // 用来判断该设备的回路 是否定时
  58. //控制回路 时间判断 是否关闭 当前时间是否等与规定时间 规定时间到规定时间+10分钟
  59. //因为1分钟执行一次,所以会多次执行,则新加判断 如果数据库中状态和回路状态相同则不执行下去
  60. layout := "15:04"
  61. rTimeCondition1OnTime, _ := time.Parse(layout, r.TimeCondition1OnTime)
  62. rTimeCondition1OffTime, _ := time.Parse(layout, r.TimeCondition1OffTime)
  63. rTimeCondition2OnTime, _ := time.Parse(layout, r.TimeCondition2OnTime)
  64. rTimeCondition2OffTime, _ := time.Parse(layout, r.TimeCondition2OffTime)
  65. rCurrent, _ := time.Parse(layout, current)
  66. if r.TimeCondition1OnTime != "关闭" &&
  67. (r.TimeCondition1OnTime == current ||
  68. (rCurrent.Before(rTimeCondition1OnTime.Add(11*time.Minute)) && rCurrent.After(rTimeCondition1OnTime))) {
  69. tmp[r.ID] = 1
  70. isTiming = 1
  71. }
  72. if r.TimeCondition1OffTime != "关闭" && (r.TimeCondition1OffTime == current ||
  73. (rCurrent.Before(rTimeCondition1OffTime.Add(11*time.Minute)) && rCurrent.After(rTimeCondition1OffTime))) {
  74. tmp[r.ID] = 0
  75. isTiming = 1
  76. }
  77. if r.TimeCondition2OnTime != "关闭" && (r.TimeCondition2OnTime == current ||
  78. (rCurrent.Before(rTimeCondition2OnTime.Add(11*time.Minute)) && rCurrent.After(rTimeCondition2OnTime))) {
  79. tmp[r.ID] = 1
  80. isTiming = 1
  81. }
  82. if r.TimeCondition2OffTime != "关闭" && (r.TimeCondition2OffTime == current ||
  83. (rCurrent.Before(rTimeCondition2OffTime.Add(11*time.Minute)) && rCurrent.After(rTimeCondition2OffTime))) {
  84. tmp[r.ID] = 0
  85. isTiming = 1
  86. }
  87. if isTiming == 1 {
  88. relayMap[d.Sn] = tmp
  89. }
  90. }
  91. }
  92. for key, value := range relayMap {
  93. reg, dev, err := utils.GetDataByDeviceId(key)
  94. if err != nil {
  95. logger.Get().Errorf("GetDataByDeviceId err = %s\n", err.Error())
  96. }
  97. for i, i2 := range value {
  98. data := modbus.DeviceLoopSwitch(i, i2)
  99. if model.ConnectionMap[key] == nil {
  100. logger.Get().Errorf("设备连接丢失")
  101. }
  102. err := utils.WriteDevice(data, model.ConnectionMap[key])
  103. time.Sleep(100 * time.Millisecond)
  104. if err != nil {
  105. logger.Get().Errorf("WriteDevice err = %s\n", err.Error())
  106. }
  107. for j, loop := range dev.DeviceLoops {
  108. if loop.ID == i {
  109. dev.DeviceLoops[j].State = i2
  110. }
  111. }
  112. }
  113. for i, device := range reg.Devices {
  114. if device.Sn == dev.Sn {
  115. reg.Devices[i] = dev
  116. }
  117. }
  118. data, err := utils.SaveRegionOnData(reg)
  119. if err != nil {
  120. logger.Get().Errorf("SaveRegionOnData err = %s\n", err.Error())
  121. }
  122. err = SaveData(data)
  123. if err != nil {
  124. logger.Get().Errorf("SaveData err = %s\n", err.Error())
  125. }
  126. }
  127. }