eqiupmentMonitoringV2.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. package service
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "strconv"
  6. "time"
  7. "ydMonitoring/config"
  8. "ydMonitoring/databases"
  9. "ydMonitoring/util"
  10. )
  11. var (
  12. thresholdTemperature,
  13. thresholdHumidity float64
  14. // DateFormat 格式化时间字符串
  15. DateFormat = "2006-01-02 15:04:05"
  16. //EquipmentMonitoringTime uint64
  17. errRangeTime int
  18. )
  19. func init() {
  20. thresholdTemperature = config.Config.GetFloat64("monitoring.temperature")
  21. thresholdHumidity = config.Config.GetFloat64("monitoring.humidity")
  22. errRangeTime = config.Config.GetInt("monitoring.errRangeTime")
  23. //EquipmentMonitoringTime = config.Config.GetUint64("monitoring.equipmentMonitoringTime")
  24. }
  25. type Device struct {
  26. Tsn string //sn
  27. TDevName string //设备名称
  28. TSaveTime int64 //设备保存时间间隔
  29. TSensors [][2]string //设备探头
  30. TTasks [][2]string //任务列表
  31. Tmodel string
  32. }
  33. type DeviceSensor struct {
  34. Tsn string //sn
  35. TId string //探头
  36. TPid string //设备公司id
  37. TName string //设备名称
  38. Tmodel string //设备型号
  39. }
  40. type Data struct {
  41. Tt float64
  42. Trh float64
  43. TTime time.Time
  44. }
  45. var (
  46. thresholdTt,
  47. thresholdTrh float64
  48. recordTime int
  49. )
  50. func init() {
  51. recordTime = config.Config.GetInt("monitoring.equipmentHour")
  52. }
  53. // []string{"BX200GSE", "MD100", "MD200G", "BX100", "KF100", "MD300G"}
  54. // EquipmentMonitoring2 监控设备v2
  55. func EquipmentMonitoring2() {
  56. //1.获取所有设备表
  57. sqlStatement := "select t_sn,t_dev_name,t_model from device where t__state = 1 and t_monitor = 1 and t_online =1 or t_online_s = 1 and t_pid !=2 and (t_model = 'BX200GSE' OR t_model = 'MD100' OR t_model LIKE 'MD200G' OR t_model LIKE 'BX100' OR t_model LIKE 'KF100' OR t_model LIKE 'MD300G') "
  58. rows, _ := databases.Db.Query(sqlStatement)
  59. devices := make([]Device, 0)
  60. var sn, devName, model string
  61. for rows.Next() {
  62. rows.Scan(&sn, &devName, &model)
  63. devices = append(devices, Device{Tsn: sn, TDevName: devName, TSensors: [][2]string{}, TTasks: [][2]string{}, Tmodel: model})
  64. }
  65. //fmt.Println("查询得到设备:", devices)
  66. //fmt.Println("查询得到设备:", len(devices))
  67. //HandleTsn(devices)
  68. DataCaps(devices)
  69. //Forewarn(devices)
  70. }
  71. // 处理sn
  72. func HandleTsn(devices []Device) {
  73. //查询所有设备探头
  74. var sensorId, sensorName string
  75. for i, v := range devices {
  76. sqlStatement := fmt.Sprintf("select t_id,t_name from device_sensor where t__state = 1 AND t_sn = '%s'", v.Tsn)
  77. rows, err := databases.Db.Query(sqlStatement)
  78. if err != nil {
  79. fmt.Println("查询", v.Tsn, "设备探头出错:", err.Error())
  80. }
  81. for rows.Next() {
  82. rows.Scan(&sensorId, &sensorName)
  83. // [设备名称,探头id,探头名称]
  84. v.TSensors = append(v.TSensors, [2]string{sensorId, sensorName})
  85. }
  86. devices[i] = v
  87. }
  88. fmt.Println("查询得到设备探头:", devices)
  89. //查询所有保存时间
  90. var tSaveT int64
  91. var devName any
  92. for i := 0; i < len(devices); i++ {
  93. sqlStatement := fmt.Sprintf("select t_name,t_save_t from device_parameter where t_sn = '%s' order by ID desc,update_time desc limit 1", devices[i].Tsn)
  94. row := databases.Db.QueryRow(sqlStatement)
  95. row.Scan(&devName, &tSaveT)
  96. devices[i].TSaveTime = tSaveT
  97. devices[i].TDevName = fmt.Sprintf("%v", devName)
  98. if tSaveT == 0 {
  99. util.SendWarning(devices[i].Tsn, -1, devices[i].TDevName, "", "设备保存时间未设置!")
  100. continue
  101. }
  102. fmt.Println("设备:", devices[i].Tsn, "保存时间:", devices[i].TSaveTime)
  103. }
  104. //查询是否存在执行计划,判断sn 是否为移动设备;
  105. var now = time.Now()
  106. var lastTowHours = now.Add(time.Hour * -time.Duration(recordTime))
  107. var start, end string
  108. for i, v := range devices {
  109. sqlStatement := fmt.Sprintf("select t__ut_start,t__ut_end from device_task where t_sn = '%s' and t__ut_end >= '%s'", v.Tsn, lastTowHours.Format(DateFormat))
  110. rows, err := databases.Db.Query(sqlStatement)
  111. if err != nil {
  112. fmt.Println(err)
  113. }
  114. //如果存在数据则表示是移动端
  115. for rows.Next() {
  116. rows.Scan(&start, &end)
  117. v.TTasks = append(v.TTasks, [2]string{start, end})
  118. }
  119. devices[i] = v
  120. }
  121. fmt.Println("查询得到设备任务:", devices)
  122. //公共的sql模板
  123. commonsStatement := "SELECT t_t,t_rh,DATE_FORMAT(t_time,'%%Y-%%m-%%d %%H:%%i:%%s') as t_time FROM z_device_data_%s WHERE t_id = '%s' AND t_time BETWEEN '%s' AND '%s' ORDER BY t_time DESC"
  124. var interval int64
  125. for _, v := range devices {
  126. //存在任务
  127. if len(v.TTasks) != 0 {
  128. for _, task := range v.TTasks {
  129. //计算时间差
  130. s, _ := time.Parse(DateFormat, task[0])
  131. e, _ := time.Parse(DateFormat, task[1])
  132. interval = e.Unix() - s.Unix()
  133. //循环查询各探头
  134. for _, sensor := range v.TSensors {
  135. sqlT := fmt.Sprintf(commonsStatement, v.Tsn, sensor[0], task[0], task[1])
  136. fmt.Println(sqlT)
  137. rows, err := databases.Db.Query(sqlT)
  138. if err != nil {
  139. fmt.Println("SOL查询错误!\t", err.Error())
  140. }
  141. handleDeviceData(v, sensor, interval, task[0], task[1], rows)
  142. }
  143. }
  144. continue
  145. }
  146. //不存在任务
  147. interval = now.Unix() - lastTowHours.Unix()
  148. for _, sensor := range v.TSensors {
  149. rows, err := databases.Db.Query(fmt.Sprintf(commonsStatement, v.Tsn, sensor[0], lastTowHours.Format(DateFormat), now.Format(DateFormat)))
  150. if err != nil {
  151. fmt.Println("SOL查询错误!\t", err.Error())
  152. }
  153. handleDeviceData(v, sensor, interval, lastTowHours.Format(DateFormat), now.Format(DateFormat), rows)
  154. }
  155. }
  156. }
  157. // 处理数据
  158. func handleDeviceData(d Device, sensor [2]string, interval int64, start, end string, rows *sql.Rows) {
  159. var sensorId, _ = strconv.ParseInt(sensor[0], 10, 64)
  160. fmt.Println("设备sn:", d.Tsn, "-", sensorId, " 任务时间:", start, end)
  161. //读取数据
  162. datas := make([]Data, 0)
  163. var t, rh float64
  164. var tTime string
  165. for rows.Next() {
  166. rows.Scan(&t, &rh, &tTime)
  167. ttime, _ := time.Parse(DateFormat, tTime)
  168. datas = append(datas, Data{t, rh, ttime})
  169. }
  170. fmt.Println("查询得到设备", d.Tsn, "数据:", len(datas), "最少条数:", d.TSaveTime, interval/d.TSaveTime, "条\t设备保存时间:")
  171. //
  172. ////时间内记录数小于应该保存的记录数,发出预警
  173. //if d.TSaveTime != 0 {
  174. // if int64(len(datas)) < (interval / d.TSaveTime) {
  175. // util.SendWarning(d.Tsn, int(sensorId), d.TDevName, sensor[1], fmt.Sprintf("设备[%s]探头[%d] [%s~%s]超出保存时间范围,缺少数据[%d]条", d.Tsn, sensorId, start, end, interval/d.TSaveTime-int64(len(datas))))
  176. // }
  177. //}
  178. //处理数据
  179. var current, next Data
  180. for i := 0; i < len(datas)-1; i++ {
  181. current = datas[i]
  182. next = datas[i+1]
  183. //不在保存时间范围内
  184. if d.TSaveTime != 0 {
  185. interval := current.TTime.Unix() - next.TTime.Unix() - d.TSaveTime
  186. if interval >= d.TSaveTime {
  187. util.SendWarning(d.Tsn, int(sensorId), d.TDevName, sensor[1], fmt.Sprintf("设备[%s]探头[%d] [%s~%s]超出保存时间范围 [%d] 上传时间间隔[%d],缺少数据[%d]条", d.Tsn, sensorId, next.TTime.Format(DateFormat), current.TTime.Format(DateFormat), interval, d.TSaveTime, interval/d.TSaveTime))
  188. }
  189. }
  190. //温度
  191. temperatureInterval := current.Tt - next.Tt
  192. if temperatureInterval > thresholdTemperature {
  193. util.SendWarning(d.Tsn, int(sensorId), d.TDevName, sensor[1], fmt.Sprintf("设备[%s]探头[%d] [%s~%s]超出温度变化范围,变化差值[%.2f]", d.Tsn, sensorId, next.TTime.Format(DateFormat), current.TTime.Format(DateFormat), temperatureInterval))
  194. }
  195. //湿度
  196. humidityInterval := current.Trh - next.Trh
  197. if humidityInterval > thresholdHumidity {
  198. util.SendWarning(d.Tsn, int(sensorId), d.TDevName, sensor[1], fmt.Sprintf("设备[%s]探头[%d] [%s~%s]超出湿度变化范围,变化差值[%.2f]", d.Tsn, sensorId, next.TTime.Format(DateFormat), current.TTime.Format(DateFormat), humidityInterval))
  199. }
  200. }
  201. }