test.go 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package service
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "log"
  6. "math/rand"
  7. "strconv"
  8. "time"
  9. "ydMonitoring/databases"
  10. )
  11. type DeviceData struct {
  12. T_Id string `json:"t_id"`
  13. T_Sp string `json:"t_sp"`
  14. T_Time string `json:"t_time"`
  15. T_T float64 `json:"t_t"`
  16. T_Rh float64 `json:"t_rh"`
  17. T_Site sql.NullString `json:"t_site"`
  18. Create_time string `json:"create_time"`
  19. }
  20. type DeviceLists struct {
  21. t_save_t string //系统设置间隔时间
  22. t_warn string // 报警间隔时间
  23. t_tlower float64 // 低温下限
  24. t_tupper float64 // 高温上限
  25. t_r_hlower float64 // 湿度下限
  26. t_r_hupper float64 // 湿度上限
  27. sn string // sn
  28. }
  29. func TestService() {
  30. sn := "2024479869314058"
  31. //var t_id string
  32. //t_id := "22"
  33. startTime := "2024-11-25 10:30:00"
  34. endTime := "2024-11-29 16:00:00"
  35. for i := 1; i <= 22; i++ {
  36. t_id := strconv.Itoa(i)
  37. //ablistdevices, ablists := Listdevices(sn, t_id, startTime, endTime)
  38. //abnormal(ablistdevices, ablists.t_save_t, ablists.t_warn, ablists.sn, ablists.t_tlower, ablists.t_tupper, ablists.t_r_hlower, ablists.t_r_hupper)
  39. listdevices, lists := Listdevices(sn, t_id, startTime, endTime)
  40. normal(listdevices, lists.t_save_t, lists.t_warn, lists.sn, lists.t_tlower, lists.t_tupper, lists.t_r_hlower, lists.t_r_hupper)
  41. }
  42. }
  43. func Listdevices(sn, t_id, startTime, endTime string) ([]DeviceData, DeviceLists) {
  44. var deviceslist DeviceLists
  45. sql := fmt.Sprintf("SELECT * FROM z_device_data_%s WHERE t_id=%s and t_time BETWEEN '%s' AND '%s';", sn, t_id, startTime, endTime)
  46. fmt.Println(sql)
  47. deviceslist.sn = sn
  48. devices := make([]DeviceData, 0)
  49. rows, err := databases.Db.Query(sql)
  50. if err != nil {
  51. log.Fatalf("查询失败 %v", err)
  52. }
  53. defer rows.Close()
  54. for rows.Next() {
  55. var device DeviceData
  56. err := rows.Scan(&device.T_Id, &device.T_Sp, &device.T_Time, &device.T_T, &device.T_Rh, &device.T_Site, &device.Create_time)
  57. if err != nil {
  58. log.Fatalf("扫描失败 %v", err)
  59. }
  60. devices = append(devices, device)
  61. }
  62. if err := rows.Err(); err != nil {
  63. log.Fatalf("遍历错误: %v", err)
  64. }
  65. sqls := fmt.Sprintf("SELECT t_save_t,t_warn FROM device_parameter WHERE t_sn='%s' ORDER BY update_time DESC LIMIT 1", sn)
  66. deviceSensorParameter := fmt.Sprintf("SELECT t__tlower,t__tupper,t__r_hlower,t__r_hupper FROM device_sensor_parameter WHERE t_sn='%s' and t__state=1 and t_id = '%s' ORDER BY update_time DESC LIMIT 1", sn, t_id)
  67. databases.Db.QueryRow(sqls).Scan(&deviceslist.t_save_t, &deviceslist.t_warn)
  68. databases.Db.QueryRow(deviceSensorParameter).Scan(&deviceslist.t_tlower, &deviceslist.t_tupper, &deviceslist.t_r_hlower, &deviceslist.t_r_hupper)
  69. return devices, deviceslist
  70. }
  71. func normal(devices []DeviceData, t_save_t, t_warn, sn string, t_tlower, t_tupper, t_r_hlower, t_r_hupper float64) {
  72. timeFormat := "2006-01-02 15:04:05"
  73. floatSave, _ := strconv.ParseFloat(t_save_t, 64)
  74. tx, err := databases.Db.Begin()
  75. if err != nil {
  76. log.Fatalf("开始事务失败: %v", err)
  77. }
  78. defer func() {
  79. if p := recover(); p != nil {
  80. tx.Rollback()
  81. panic(p)
  82. }
  83. if err != nil {
  84. tx.Rollback()
  85. } else {
  86. tx.Commit()
  87. }
  88. }()
  89. for i := 0; i < len(devices)-1; i++ {
  90. t1, err := time.Parse(timeFormat, devices[i].T_Time)
  91. if err != nil {
  92. log.Println("解析时间失败:", err)
  93. continue
  94. }
  95. t2, err := time.Parse(timeFormat, devices[i+1].T_Time)
  96. if err != nil {
  97. log.Println("解析时间失败:", err)
  98. continue
  99. }
  100. timeDiff := t2.Sub(t1).Seconds()
  101. if timeDiff > floatSave {
  102. fmt.Printf("时间差大于系统设置时间:%s 和 %s\n", devices[i].T_Time, devices[i+1].T_Time)
  103. numInserts := int(timeDiff / floatSave)
  104. for j := 1; j <= numInserts; j++ {
  105. t := t1.Truncate(time.Minute)
  106. newTime := t.Add(time.Duration(j*int(floatSave)) * time.Second)
  107. T_T, T_Rh := IsNotWarn(devices, t_tlower, t_tupper, t_r_hlower, t_r_hupper)
  108. devi := DeviceData{
  109. T_Id: devices[i].T_Id,
  110. T_Sp: devices[i].T_Sp,
  111. T_Time: newTime.Format(timeFormat),
  112. T_T: T_T,
  113. T_Rh: T_Rh,
  114. T_Site: devices[i].T_Site,
  115. Create_time: newTime.Format(timeFormat),
  116. }
  117. insertSql := fmt.Sprintf("INSERT INTO z_device_data_%s (t_id, t_sp, t_time, t_t, t_rh, t_site, create_time) VALUES (?, ?, ?, ?, ?, ?, ?)", sn)
  118. _, err := tx.Exec(insertSql, devi.T_Id, devi.T_Sp, devi.T_Time, devi.T_T, devi.T_Rh, devi.T_Site.String, devi.Create_time)
  119. if err != nil {
  120. log.Println("插入新时间点失败:", err)
  121. return
  122. }
  123. log.Println("sn:", sn, "补漏数据:", devi, " 插入时间点:", newTime.Format(timeFormat))
  124. }
  125. //rand.Seed(time.Now().UnixNano())
  126. //randomNumber := rand.Intn(59) + 1
  127. //add := t2.Add(time.Duration(randomNumber) * time.Second).Format(timeFormat)
  128. //format := t2.Format(timeFormat)
  129. //sprintf := fmt.Sprintf("UPDATE z_device_data_%s SET t_time = '%s' WHERE t_time = '%s'", sn, add, format)
  130. //fmt.Println(sprintf)
  131. //_, err = tx.Exec(sprintf)
  132. //if err != nil {
  133. // log.Println("更新时间节点错误:", err)
  134. // return
  135. //}
  136. }
  137. }
  138. }
  139. func abnormal(devices []DeviceData, t_save_t, t_warn, sn string, t_tlower, t_tupper, t_r_hlower, t_r_hupper float64) {
  140. timeFormat := "2006-01-02 15:04:05"
  141. floatWarn, _ := strconv.ParseFloat(t_warn, 64)
  142. tx, err := databases.Db.Begin()
  143. if err != nil {
  144. log.Fatalf("开始事务失败: %v", err)
  145. }
  146. defer func() {
  147. if p := recover(); p != nil {
  148. tx.Rollback()
  149. panic(p)
  150. }
  151. if err != nil {
  152. tx.Rollback()
  153. } else {
  154. tx.Commit()
  155. }
  156. }()
  157. for i := 0; i < len(devices)-1; i++ {
  158. t1, err := time.Parse(timeFormat, devices[i].T_Time)
  159. if err != nil {
  160. log.Println("解析时间失败:", err)
  161. continue
  162. }
  163. t2, err := time.Parse(timeFormat, devices[i+1].T_Time)
  164. if err != nil {
  165. log.Println("解析时间失败:", err)
  166. continue
  167. }
  168. timeDiff := t2.Sub(t1).Seconds()
  169. isAlarm := devices[i].T_T < t_tlower || devices[i].T_T > t_tupper || devices[i].T_Rh < t_r_hlower || devices[i].T_Rh > t_r_hupper
  170. isNextAlarm := devices[i+1].T_T < t_tlower || devices[i+1].T_T > t_tupper || devices[i+1].T_Rh < t_r_hlower || devices[i+1].T_Rh > t_r_hupper
  171. if isAlarm && !isNextAlarm {
  172. fmt.Println("处理报警数据与正常数据之间的间隔", devices[i].T_Time, devices[i+1].T_Time)
  173. interval := floatWarn - 20
  174. newTime := t1.Add(time.Duration(int(interval)) * time.Second)
  175. if timeDiff > floatWarn {
  176. fmt.Printf("间隔时间大于系统设置时间:%s 和 %s\n", devices[i].T_Time, devices[i+1].T_Time)
  177. T_T, T_Rh := IsNotWarn(devices, t_tlower, t_tupper, t_r_hlower, t_r_hupper)
  178. devi := DeviceData{
  179. T_Id: devices[i].T_Id,
  180. T_Sp: devices[i].T_Sp,
  181. T_Time: newTime.Format(timeFormat),
  182. T_T: T_T,
  183. T_Rh: T_Rh,
  184. T_Site: devices[i].T_Site,
  185. Create_time: newTime.Format(timeFormat),
  186. }
  187. insertSql := fmt.Sprintf("INSERT INTO z_device_data_%s (t_id, t_sp, t_time, t_t, t_rh, t_site, create_time) VALUES (?, ?, ?, ?, ?, ?, ?)", sn)
  188. _, err := tx.Exec(insertSql, devi.T_Id, devi.T_Sp, devi.T_Time, devi.T_T, devi.T_Rh, devi.T_Site.String, devi.Create_time)
  189. if err != nil {
  190. log.Println("插入新时间点失败:", err)
  191. return
  192. }
  193. log.Println("sn:", sn, "连续报警补漏数据:", devi, " 插入时间点:", newTime.Format(timeFormat))
  194. }
  195. }
  196. if isAlarm && isNextAlarm {
  197. if timeDiff > floatWarn {
  198. fmt.Printf("连续报警时间差大于报警间隔时间:%s 和 %s\n", devices[i].T_Time, devices[i+1].T_Time)
  199. newTimeWarn := devices[i].T_Time
  200. parse, _ := time.Parse(timeFormat, newTimeWarn)
  201. newTime := parse.Add(time.Duration(int(floatWarn-rand.Float64()*10-0.2)) * time.Second)
  202. fmt.Println("报警新时间:", newTime.Format(timeFormat))
  203. T_T, T_Rh := IsNotWarn(devices, t_tlower, t_tupper, t_r_hlower, t_r_hupper)
  204. devi := DeviceData{
  205. T_Id: devices[i].T_Id,
  206. T_Sp: devices[i].T_Sp,
  207. T_Time: newTime.Format(timeFormat),
  208. T_T: T_T,
  209. T_Rh: T_Rh,
  210. T_Site: devices[i].T_Site,
  211. Create_time: newTime.Format(timeFormat),
  212. }
  213. insertSql := fmt.Sprintf("INSERT INTO z_device_data_%s (t_id, t_sp, t_time, t_t, t_rh, t_site, create_time) VALUES (?, ?, ?, ?, ?, ?, ?)", sn)
  214. _, err := tx.Exec(insertSql, devi.T_Id, devi.T_Sp, devi.T_Time, devi.T_T, devi.T_Rh, devi.T_Site.String, devi.Create_time)
  215. if err != nil {
  216. log.Println("插入新时间点失败:", err)
  217. return
  218. }
  219. log.Println("sn:", sn, "连续报警补漏数据:", devi, " 插入时间点:", newTime.Format(timeFormat))
  220. }
  221. }
  222. }
  223. }
  224. func IsNotWarn(deviceDatas []DeviceData, t_tlower, t_tupper, t_r_hlower, t_r_hupper float64) (T_T float64, T_Rh float64) {
  225. for i, _ := range deviceDatas {
  226. if !(deviceDatas[i].T_T < t_tlower || deviceDatas[i].T_T > t_tupper || deviceDatas[i].T_Rh < t_r_hlower || deviceDatas[i].T_Rh > t_r_hupper) {
  227. T_T = deviceDatas[i].T_T + rand.Float64()*0.4 - 0.2
  228. T_Rh = deviceDatas[i].T_Rh + rand.Float64()*0.4 - 0.2
  229. return T_T, T_Rh
  230. }
  231. }
  232. return 0, 0
  233. }