DataGeneratorController.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749
  1. package controllers
  2. import (
  3. "ColdP_server/controllers/lib"
  4. "ColdP_server/logs"
  5. "ColdP_server/models/Company"
  6. "ColdP_server/models/Device"
  7. "encoding/json"
  8. "fmt"
  9. "github.com/beego/beego/v2/adapter/orm"
  10. beego "github.com/beego/beego/v2/server/web"
  11. "github.com/xuri/excelize/v2"
  12. "io"
  13. "strconv"
  14. "strings"
  15. "time"
  16. )
  17. type DataGeneratorController struct {
  18. beego.Controller
  19. }
  20. // GeneratorHtml 获取页面
  21. func (c *DataGeneratorController) GeneratorHtml() {
  22. b_, admin := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  23. if !b_ {
  24. c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  25. c.ServeJSON()
  26. return
  27. }
  28. classList := Company.Read_CompanyClass_All(admin.T_pid, "")
  29. c.Data["Class_List"] = classList
  30. //确认状态为登录状态后
  31. c.TplName = "Data/GeneratorData2.html"
  32. }
  33. // DeviceSensorData 获取对应设备探头数据
  34. func (c *DataGeneratorController) DeviceSensorData() {
  35. b_, _ := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  36. if !b_ {
  37. c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  38. c.ServeJSON()
  39. return
  40. }
  41. startTime := c.GetString("startTime")
  42. endTime := c.GetString("endTime")
  43. sns := make([][]string, 0)
  44. json.Unmarshal([]byte(c.GetString("sns")), &sns)
  45. type Temp struct {
  46. Sn []string `json:"sn"`
  47. Data []Device.DeviceSensorData `json:"data"`
  48. }
  49. datas := make([]Temp, 0)
  50. for _, sn := range sns {
  51. //sn = [sn,探头id]
  52. id, _ := strconv.ParseInt(sn[1], 10, 63)
  53. v, err := Device.ReadDeviceSensorByTsnTidTimeRange(sn[0], int(id), startTime, endTime)
  54. if err != nil {
  55. c.Data["json"] = lib.JSONS{Code: 500, Msg: "读取设备探头错误!"}
  56. c.ServeJSON()
  57. return
  58. }
  59. datas = append(datas, Temp{sn, v})
  60. }
  61. c.Data["json"] = lib.JSONS{Code: 200, Msg: "获取数据成功", Data: datas}
  62. c.ServeJSON()
  63. }
  64. // UpdateFix 更新固定值
  65. func (c *DataGeneratorController) UpdateFix() {
  66. b_, _ := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  67. if !b_ {
  68. c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  69. c.ServeJSON()
  70. return
  71. }
  72. //1.解析数据
  73. var body = c.Ctx.Request.Body
  74. defer body.Close()
  75. type T struct {
  76. FixTemperature string `json:"fixTemperature"`
  77. FixHumidity string `json:"fixHumidity"`
  78. Sns [][2]string `json:"sns"`
  79. Data []int64 `json:"data"`
  80. }
  81. var temp = T{}
  82. bytes, _ := io.ReadAll(body)
  83. json.Unmarshal(bytes, &temp)
  84. fmt.Println("解析后:", temp.Data[0])
  85. //2.得到数据进行统一设置访问修改
  86. humidity, _ := strconv.ParseFloat(temp.FixHumidity, 64)
  87. temperature, _ := strconv.ParseFloat(temp.FixTemperature, 64)
  88. //开始时间到结束时间
  89. startTime := time.UnixMilli(temp.Data[0]).Format("2006-01-02 15:04:05")
  90. endTime := time.UnixMilli(temp.Data[1]).Format("2006-01-02 15:04:05")
  91. //3.循环更新数据
  92. for _, v := range temp.Sns {
  93. sn := v[0]
  94. tId := v[1]
  95. Device.UpdateDeviceSensorDataTemperatureAndHumidity(sn, tId, startTime, endTime, temperature, humidity)
  96. }
  97. //4.反馈成功
  98. c.Data["json"] = lib.JSONS{200, "调整固定偏移值成功!", nil}
  99. c.ServeJSON()
  100. }
  101. // Delete 删除
  102. func (c *DataGeneratorController) Delete() {
  103. b_, _ := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  104. if !b_ {
  105. c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  106. c.ServeJSON()
  107. return
  108. }
  109. //1.解析数据
  110. var body = c.Ctx.Request.Body
  111. defer body.Close()
  112. type T struct {
  113. Sns [][2]string `json:"sns"`
  114. Data []int64 `json:"data"`
  115. }
  116. var temp = T{}
  117. bytes, _ := io.ReadAll(body)
  118. json.Unmarshal(bytes, &temp)
  119. fmt.Println("解析后:", temp.Data[0])
  120. //开始时间到结束时间
  121. startTime := time.UnixMilli(temp.Data[0]).Format("2006-01-02 15:04:05")
  122. endTime := time.UnixMilli(temp.Data[1]).Format("2006-01-02 15:04:05")
  123. //3.循环更新数据
  124. for _, v := range temp.Sns {
  125. sn := v[0]
  126. tId := v[1]
  127. Device.DeleteDeviceSensorDataByTimeRange(sn, tId, startTime, endTime)
  128. }
  129. //4.反馈成功
  130. c.Data["json"] = lib.JSONS{200, "调整固定偏移值成功!", nil}
  131. c.ServeJSON()
  132. }
  133. // UpdateRand 更新随机值
  134. func (c *DataGeneratorController) UpdateRand() {
  135. b_, _ := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  136. if !b_ {
  137. c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  138. c.ServeJSON()
  139. return
  140. }
  141. //解析请求参数
  142. body := c.Ctx.Request.Body
  143. defer body.Close()
  144. bytes, _ := io.ReadAll(body)
  145. type T struct {
  146. TemperatureMin int `json:"temperatureMin"`
  147. TemperatureMax int `json:"temperatureMax"`
  148. HumidityMax int `json:"humidityMax"`
  149. HumidityMin int `json:"humidityMin"`
  150. Sns [][2]string `json:"sns"`
  151. Data []int64 `json:"data"`
  152. }
  153. var t = T{}
  154. json.Unmarshal(bytes, &t)
  155. fmt.Println("requestJSON: ", t, "原始json:", string(bytes))
  156. //开始时间到结束时间
  157. startTime := time.UnixMilli(t.Data[0]).Format("2006-01-02 15:04:05")
  158. endTime := time.UnixMilli(t.Data[1]).Format("2006-01-02 15:04:05")
  159. for _, v := range t.Sns {
  160. sn := v[0]
  161. tId := v[1]
  162. Device.UpdateDeviceSensorDataTemperatureAndHumidityRandom(sn, tId, startTime, endTime, t.TemperatureMax, t.TemperatureMin, t.HumidityMax, t.HumidityMin)
  163. }
  164. //反馈成功
  165. c.Data["json"] = lib.JSONS{200, "调整随机偏移值成功!", nil}
  166. c.ServeJSON()
  167. return
  168. }
  169. // CopyFromPosition 数据拷贝
  170. func (c *DataGeneratorController) CopyFromPosition() {
  171. b_, admin := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  172. if !b_ {
  173. c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  174. c.ServeJSON()
  175. return
  176. }
  177. var body = c.Ctx.Request.Body
  178. defer body.Close()
  179. bytes, _ := io.ReadAll(body)
  180. type T struct {
  181. CopyPosition string `json:"copyPosition"`
  182. Sns [][2]string `json:"sns"`
  183. Data []int64 `json:"data"`
  184. }
  185. t := T{}
  186. json.Unmarshal(bytes, &t)
  187. //开始时间 和结束时间,插入的时间范围
  188. fmt.Println(t)
  189. copyTime, _ := time.Parse("2006-01-02 15:04:05", t.CopyPosition)
  190. startTime := time.UnixMilli(t.Data[0]).Format("2006-01-02 15:04:05")
  191. endTime := time.UnixMilli(t.Data[1]).Format("2006-01-02 15:04:05")
  192. for _, v := range t.Sns {
  193. sn := v[0]
  194. tId := v[1]
  195. list := Device.SelectDeviceSensorDataListByTimeRange(sn, tId, startTime, endTime)
  196. saveTime := Device.ReadDeviceParameterByTsn(sn).T_saveT
  197. ct := copyTime
  198. go func(list []Device.DeviceSensorData, sn string, saveTime int) {
  199. for _, d := range list {
  200. d.T_time = ct.Format("2006-01-02 15:04:05")
  201. d.CreateTime = ct.Format("2006-01-02 15:04:05")
  202. Device.InsertDeviceSensorData(sn, d, admin)
  203. ct = ct.Add(time.Second * time.Duration(saveTime))
  204. }
  205. }(list, sn, saveTime)
  206. }
  207. c.Data["json"] = lib.JSONS{200, "数据复制已提交后台处理!", nil}
  208. c.ServeJSON()
  209. return
  210. }
  211. // RepairSensorData 数据补漏
  212. func (c *DataGeneratorController) RepairSensorData() {
  213. b_, admin := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  214. if !b_ {
  215. c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  216. c.ServeJSON()
  217. return
  218. }
  219. sns := make([][2]string, 0)
  220. timeRange := make([]int64, 0)
  221. json.Unmarshal([]byte(c.GetString("sns")), &sns)
  222. json.Unmarshal([]byte(c.GetString("data")), &timeRange)
  223. start := time.UnixMilli(timeRange[0]).Format("2006-01-02 15:04:05")
  224. end := time.UnixMilli(timeRange[1]).Format("2006-01-02 15:04:05")
  225. num := 0
  226. for _, v := range sns {
  227. sn := v[0]
  228. tId := v[1]
  229. saveTime := Device.ReadDeviceParameterByTsn(sn).T_saveT
  230. list := Device.SelectDeviceSensorDataListByTimeRange(sn, tId, start, end)
  231. for i := 0; i < len(list)-1; i++ {
  232. current := list[i].T_time
  233. next := list[i+1].T_time
  234. ct, _ := time.Parse("2006-01-02 15:04:05 +0800 CST", current)
  235. //format := cts.Format("2006-01-02 15:04:05")
  236. //ct, _ := time.Parse("2006-01-02 15:04:05", format)
  237. n, _ := time.Parse("2006-01-02 15:04:05 +0800 CST", next)
  238. //nsfmt := ns.Format("2006-01-02 15:04:05")
  239. //n, _ := time.Parse("2006-01-02 15:04:05", nsfmt)
  240. interval := n.Unix() - ct.Unix()
  241. logs.Debug("时间间隔:", interval)
  242. fmt.Println("当前:", current, "下一个:", next)
  243. if int(interval) > saveTime {
  244. ttInterval := list[i+1].T_t - list[i].T_t
  245. ttt := list[i].T_t // 温度临时变量
  246. trhInterval := list[i+1].T_rh - list[i].T_rh
  247. trht := list[i].T_rh //湿度临时变量
  248. count := int(interval) / saveTime
  249. num += count
  250. for k := 0; k < count; k++ {
  251. t := ct.Format("2006-01-02 15:04:05") //时间临时变量
  252. ttt += ttInterval / float64(count)
  253. trht += trhInterval / float64(count)
  254. Device.InsertDeviceSensorData(sn, Device.DeviceSensorData{
  255. list[i].T_id,
  256. list[i].T_sp,
  257. t,
  258. lib.Decimal(ttt),
  259. lib.Decimal(trht),
  260. list[i].T_site,
  261. list[i].CreateTime,
  262. }, admin)
  263. ct = ct.Add(time.Second * time.Duration(saveTime))
  264. }
  265. }
  266. }
  267. }
  268. c.Data["json"] = lib.JSONS{200, fmt.Sprintf("补漏完成!共补漏%d条数据", num), nil}
  269. c.ServeJSON()
  270. return
  271. }
  272. // RepairAllSensorData 补漏所有缺失数据
  273. //
  274. // func (c *DataGeneratorController) RepairAllSensorData() {
  275. // b_, _ := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  276. // if !b_ {
  277. // //c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  278. // //c.ServeJSON()
  279. // //return
  280. // }
  281. // o := orm.NewOrm()
  282. // // 查询设备 BX200GSE MD100 MD200G BX100 KF100 MD300G
  283. // deviceList := []Device.Device{}
  284. //
  285. // var err error
  286. // _, err = o.QueryTable(new(Device.Device)).
  287. // Filter("T_model__in", []string{"BX200GSE", "MD100", "MD200G", "BX100", "KF100", "MD300G"}).
  288. // Filter("T_state", 1).
  289. // //Filter("T_sn", "2023388677995151").
  290. // All(&deviceList)
  291. // if err != nil {
  292. // logs.Error("获取设备列表失败", err)
  293. // return
  294. // }
  295. // start := "2024-07-01 00:00:00"
  296. // end := time.Now().Format("2006-01-02 15:04:05")
  297. // num := 0
  298. // for _, device := range deviceList {
  299. // // 获取传感器列表
  300. // deviceSensorList := []Device.DeviceSensor{}
  301. // _, err = o.QueryTable(new(Device.DeviceSensor)).Filter("T_sn", device.T_sn).All(&deviceSensorList)
  302. // if err != nil {
  303. // logs.Error(lib.FuncName(), err)
  304. // }
  305. // counts := 0
  306. // for _, v := range deviceSensorList {
  307. // sn := v.T_sn
  308. // //tId := v.T_id
  309. // itoa := strconv.Itoa(v.T_id)
  310. // saveTime := Device.ReadDeviceParameterByTsn(sn).T_saveT
  311. // list := Device.SelectDeviceSensorDataListByTimeRange(sn, itoa, start, end)
  312. //
  313. // for i := 0; i < len(list)-1; i++ {
  314. // current := list[i].T_time
  315. // next := list[i+1].T_time
  316. // ct, _ := time.Parse("2006-01-02 15:04:05 +0800 CST", current)
  317. // n, _ := time.Parse("2006-01-02 15:04:05 +0800 CST", next)
  318. // interval := n.Unix() - ct.Unix()
  319. // if int(interval) > saveTime {
  320. // ttInterval := list[i+1].T_t - list[i].T_t
  321. // ttt := list[i].T_t // 温度临时变量
  322. // trhInterval := list[i+1].T_rh - list[i].T_rh
  323. // trht := list[i].T_rh //湿度临时变量
  324. // count := int(interval) / saveTime
  325. // num += count
  326. // counts += count
  327. // for k := 0; k < count; k++ {
  328. // t := ct.Format("2006-01-02 15:04:05") //时间临时变量
  329. // ttt += ttInterval / float64(count)
  330. // trht += trhInterval / float64(count)
  331. // //Device.InsertDeviceSensorData(sn, Device.DeviceSensorData{
  332. // // list[i].T_id,
  333. // // list[i].T_sp,
  334. // // t,
  335. // // lib.Decimal(ttt),
  336. // // lib.Decimal(trht),
  337. // // list[i].T_site,
  338. // // list[i].CreateTime,
  339. // //}, admin)
  340. // ct = ct.Add(time.Second * time.Duration(saveTime))
  341. // log.Print(t)
  342. // }
  343. // }
  344. // }
  345. // }
  346. // // 每个设备补漏完成后睡眠一秒
  347. // time.Sleep(time.Second * 1)
  348. // logs.Info(fmt.Sprintf("设备 %s 补漏完成!共补漏 %d 条数据", device.T_sn, counts))
  349. // }
  350. // c.Data["json"] = lib.JSONS{200, fmt.Sprintf("补漏完成!共补漏%d条数据", num), nil}
  351. // c.ServeJSON()
  352. // return
  353. // }
  354. //func (c *DataGeneratorController) RepairAllSensorData() {
  355. // b_, admin := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  356. // if !b_ {
  357. // // 用户验证逻辑省略
  358. // }
  359. // o := orm.NewOrm()
  360. // deviceList := []Device.Device{}
  361. //
  362. // var err error
  363. // _, err = o.QueryTable(new(Device.Device)).
  364. // Filter("T_model__in", []string{"BX200GSE", "MD100", "MD200G", "BX100", "KF100", "MD300G"}).
  365. // Filter("T_state", 1).
  366. // //Filter("T_sn", "2023388677995151").
  367. // All(&deviceList)
  368. // if err != nil {
  369. // logs.Error("获取设备列表失败", err)
  370. // return
  371. // }
  372. //
  373. // start := "2024-07-01 00:00:00"
  374. // end := time.Now().Format("2006-01-02 15:04:05")
  375. //
  376. // // 创建或打开日志文件
  377. // logFile, err := os.OpenFile("repair_log.txt", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
  378. // if err != nil {
  379. // logs.Error("打开日志文件失败", err)
  380. // return
  381. // }
  382. // defer logFile.Close()
  383. //
  384. // // 使用 log 包的 Writer 将日志输出到文件
  385. // fileLogger := log.New(logFile, "", log.LstdFlags)
  386. // for _, device := range deviceList {
  387. // deviceSensorList := []Device.DeviceSensor{}
  388. // _, err = o.QueryTable(new(Device.DeviceSensor)).Filter("T_sn", device.T_sn).All(&deviceSensorList)
  389. // if err != nil {
  390. // logs.Error(lib.FuncName(), err)
  391. // continue
  392. // }
  393. //
  394. // num := 0 // 统计当前设备补漏的数据条数
  395. // for _, v := range deviceSensorList {
  396. // sn := v.T_sn
  397. // itoa := strconv.Itoa(v.T_id)
  398. // saveTime := Device.ReadDeviceParameterByTsn(sn).T_saveT
  399. // list := Device.SelectDeviceSensorDataListByTimeRange(sn, itoa, start, end)
  400. //
  401. // for i := 0; i < len(list)-1; i++ {
  402. // current := list[i].T_time
  403. // next := list[i+1].T_time
  404. // ct, _ := time.Parse("2006-01-02 15:04:05 +0800 CST", current)
  405. // n, _ := time.Parse("2006-01-02 15:04:05 +0800 CST", next)
  406. // interval := n.Unix() - ct.Unix()
  407. // if int(interval) > saveTime {
  408. // ttInterval := list[i+1].T_t - list[i].T_t
  409. // ttt := list[i].T_t // 温度临时变量
  410. // trhInterval := list[i+1].T_rh - list[i].T_rh
  411. // trht := list[i].T_rh //湿度临时变量
  412. // count := int(interval) / saveTime
  413. // num += count
  414. // for k := 0; k < count; k++ {
  415. // t := ct.Format("2006-01-02 15:04:05") //时间临时变量
  416. // ttt += ttInterval / float64(count)
  417. // trht += trhInterval / float64(count)
  418. // Device.InsertDeviceSensorData(sn, Device.DeviceSensorData{
  419. // list[i].T_id,
  420. // list[i].T_sp,
  421. // t,
  422. // lib.Decimal(ttt),
  423. // lib.Decimal(trht),
  424. // list[i].T_site,
  425. // list[i].CreateTime,
  426. // }, admin)
  427. // ct = ct.Add(time.Second * time.Duration(saveTime))
  428. // log.Print(t)
  429. // }
  430. // }
  431. // }
  432. // }
  433. // // 每个设备补漏完成后记录到文件
  434. // fileLogger.Printf("设备 %s 补漏完成!共补漏 %d 条数据\n", device.T_sn, num)
  435. // time.Sleep(time.Second * 1)
  436. // }
  437. //
  438. // c.Data["json"] = lib.JSONS{200, fmt.Sprintf("所有设备补漏完成!"), nil}
  439. // c.ServeJSON()
  440. // return
  441. //}
  442. func (c *DataGeneratorController) RepairAllSensorData() {
  443. b_, admin := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  444. if !b_ {
  445. // 用户验证逻辑省略
  446. }
  447. o := orm.NewOrm()
  448. deviceList := []Device.Device{}
  449. var err error
  450. _, err = o.QueryTable(new(Device.Device)).
  451. Filter("T_model__in", []string{"BX200GSE", "MD100", "MD200G", "BX100", "KF100", "MD300G"}).
  452. Filter("T_state", 1).
  453. //Filter("T_pid", 80).
  454. Filter("T_sn", "kf861693223539284").
  455. All(&deviceList)
  456. if err != nil {
  457. logs.Error("获取设备列表失败", err)
  458. return
  459. }
  460. start := "2024.05.14 00:00:00"
  461. end := time.Now().Format("2006-01-02 15:04:05")
  462. // 初始化Excel文件
  463. f := excelize.NewFile()
  464. // 创建工作表
  465. sheetName := "RepairLog"
  466. f.NewSheet(sheetName)
  467. // 设置列标题
  468. f.SetCellValue(sheetName, "A1", "设备序列号")
  469. f.SetCellValue(sheetName, "B1", "传感器ID")
  470. f.SetCellValue(sheetName, "C1", "补漏起始时间")
  471. f.SetCellValue(sheetName, "D1", "补漏结束时间")
  472. f.SetCellValue(sheetName, "E1", "补漏数据量")
  473. row := 2 // 从第二行开始记录数据
  474. totalRows := 0 // 总的补漏条数
  475. for _, device := range deviceList {
  476. deviceSensorList := []Device.DeviceSensor{}
  477. _, err = o.QueryTable(new(Device.DeviceSensor)).Filter("T_sn", device.T_sn).All(&deviceSensorList)
  478. if err != nil {
  479. logs.Error(lib.FuncName(), err)
  480. continue
  481. }
  482. num := map[int]int{} // 用于存储每个传感器ID补漏的数量
  483. startTime := map[int]string{} // 用于存储每个传感器ID补漏的起始时间
  484. endTime := map[int]string{} // 用于存储每个传感器ID补漏的结束时间
  485. for _, v := range deviceSensorList {
  486. sn := v.T_sn
  487. itoa := strconv.Itoa(v.T_id)
  488. saveTime := Device.ReadDeviceParameterByTsn(sn).T_saveT
  489. list := Device.SelectDeviceSensorDataListByTimeRange(sn, itoa, start, end)
  490. // 确定每个传感器ID补漏的起始时间和结束时间
  491. for i := 0; i < len(list)-1; i++ {
  492. current := list[i].T_time
  493. next := list[i+1].T_time
  494. ct, _ := time.Parse("2006-01-02 15:04:05 +0800 CST", current)
  495. n, _ := time.Parse("2006-01-02 15:04:05 +0800 CST", next)
  496. interval := n.Unix() - ct.Unix()
  497. if int(interval) > saveTime {
  498. ttInterval := list[i+1].T_t - list[i].T_t
  499. ttt := list[i].T_t // 温度临时变量
  500. trhInterval := list[i+1].T_rh - list[i].T_rh
  501. trht := list[i].T_rh //湿度临时变量
  502. count := int(interval) / saveTime
  503. num[v.T_id] += count
  504. for k := 0; k < count; k++ {
  505. t := ct.Add(time.Duration(k) * time.Duration(saveTime) * time.Second).Format("2006-01-02 15:04:05") //时间临时变量
  506. ttt += ttInterval / float64(count)
  507. trht += trhInterval / float64(count)
  508. Device.InsertDeviceSensorData(sn, Device.DeviceSensorData{
  509. list[i].T_id,
  510. list[i].T_sp,
  511. t,
  512. lib.Decimal(ttt),
  513. lib.Decimal(trht),
  514. list[i].T_site,
  515. list[i].CreateTime,
  516. }, admin)
  517. logs.Println(t)
  518. }
  519. // 更新起始时间和结束时间
  520. if _, ok := startTime[v.T_id]; !ok {
  521. startTime[v.T_id] = ct.Format("2006-01-02 15:04:05")
  522. }
  523. endTime[v.T_id] = ct.Add(time.Duration(count-1) * time.Duration(saveTime) * time.Second).Format("2006-01-02 15:04:05")
  524. }
  525. }
  526. }
  527. // 记录每个设备及其每个传感器ID的数据
  528. for sensorID, count := range num {
  529. if count > 0 { // 只记录补漏数量大于0的数据
  530. f.SetCellValue(sheetName, fmt.Sprintf("A%d", row), device.T_sn)
  531. f.SetCellValue(sheetName, fmt.Sprintf("B%d", row), sensorID)
  532. f.SetCellValue(sheetName, fmt.Sprintf("C%d", row), startTime[sensorID])
  533. f.SetCellValue(sheetName, fmt.Sprintf("D%d", row), endTime[sensorID])
  534. f.SetCellValue(sheetName, fmt.Sprintf("E%d", row), count)
  535. row++
  536. totalRows += count
  537. }
  538. }
  539. //time.Sleep(time.Second * 1)
  540. }
  541. // 在最后一行记录总的补漏条数
  542. f.SetCellValue(sheetName, fmt.Sprintf("A%d", row), "总补漏条数")
  543. f.SetCellValue(sheetName, fmt.Sprintf("B%d", row), totalRows)
  544. // 保存Excel文件
  545. if err := f.SaveAs("repair_log.xlsx"); err != nil {
  546. logs.Error("保存Excel文件失败", err)
  547. return
  548. }
  549. c.Data["json"] = lib.JSONS{200, fmt.Sprintf("所有设备补漏完成!"), nil}
  550. c.ServeJSON()
  551. return
  552. }
  553. // DataSensorDataSmooth 数据平滑
  554. func (c *DataGeneratorController) DataSensorDataSmooth() {
  555. b_, _ := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  556. if !b_ {
  557. c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  558. c.ServeJSON()
  559. return
  560. }
  561. var (
  562. sns [][2]string
  563. timeRange []int64
  564. tRange float64
  565. hRange float64
  566. )
  567. json.Unmarshal([]byte(c.GetString("sns")), &sns)
  568. json.Unmarshal([]byte(c.GetString("data")), &timeRange)
  569. tRange, _ = c.GetFloat("tRange")
  570. hRange, _ = c.GetFloat("hRange")
  571. start := time.UnixMilli(timeRange[0]).Format("2006-01-02 15:04:05")
  572. end := time.UnixMilli(timeRange[1]).Format("2006-01-02 15:04:05")
  573. fmt.Println(tRange, hRange)
  574. var count int
  575. for _, v := range sns {
  576. sn := v[0]
  577. id := v[1]
  578. list := Device.SelectDeviceSensorDataListByTimeRange(sn, id, start, end)
  579. for i := 1; i < len(list); i++ {
  580. n := list[i-1]
  581. old := list[i]
  582. newO := list[i]
  583. //变化差
  584. var tInterval = old.T_t - n.T_t
  585. var hInterval = old.T_rh - n.T_rh
  586. fmt.Println("温度:", n.T_t, "温度next:", old.T_t, "差值:", n.T_t-old.T_t)
  587. if tRange != 0 {
  588. if tInterval > tRange {
  589. newO.T_t = n.T_t + tRange
  590. } else if tInterval < -tRange {
  591. newO.T_t = n.T_t - tRange
  592. }
  593. }
  594. if hRange != 0 {
  595. if hInterval > hRange {
  596. newO.T_rh = n.T_rh + hRange
  597. } else if hInterval < -hRange {
  598. newO.T_rh = n.T_rh - hRange
  599. }
  600. }
  601. if old != newO {
  602. fmt.Println("原始数据:", old, "新数据:", newO)
  603. list[i] = newO
  604. newO.T_t = lib.Decimal(newO.T_t)
  605. newO.T_rh = lib.Decimal(newO.T_rh)
  606. Device.UpdateDeviceSensorData(sn, id, old, newO)
  607. count++
  608. }
  609. }
  610. }
  611. c.Data["json"] = lib.JSONS{200, "操作成功处理" + fmt.Sprint(count) + "条数据", nil}
  612. c.ServeJSON()
  613. }
  614. // DataSensorDataTrend 数据趋势
  615. func (c *DataGeneratorController) DataSensorDataTrend() {
  616. b_, _ := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  617. if !b_ {
  618. c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  619. c.ServeJSON()
  620. return
  621. }
  622. //获取数据
  623. timeRange := make([]int64, 0)
  624. sns := make([][2]string, 0)
  625. json.Unmarshal([]byte(c.GetString("data")), &timeRange)
  626. json.Unmarshal([]byte(c.GetString("sns")), &sns)
  627. start := time.UnixMilli(timeRange[0]).Format("2006-01-02 15:04:05")
  628. end := time.UnixMilli(timeRange[1]).Format("2006-01-02 15:04:05")
  629. for _, v := range sns {
  630. sn := v[0]
  631. tId := v[1]
  632. list := Device.SelectDeviceSensorDataListByTimeRange(sn, tId, start, end)
  633. first := list[0]
  634. last := list[len(list)-1]
  635. ttInterval := (last.T_t - first.T_t) / float64(len(list)-2)
  636. trhInterval := (last.T_rh - first.T_rh) / float64(len(list)-2)
  637. if len(list) < 3 {
  638. continue
  639. }
  640. for i, d := range list[1 : len(list)-1] {
  641. old := list[i]
  642. if ttInterval != 0 {
  643. d.T_t = list[0].T_t + float64(i+1)*ttInterval
  644. }
  645. if trhInterval != 0 {
  646. d.T_rh = list[0].T_rh + float64(i+1)*trhInterval
  647. }
  648. if d != old {
  649. d.T_t = lib.Decimal(d.T_t)
  650. d.T_rh = lib.Decimal(d.T_rh)
  651. Device.UpdateDeviceSensorData(sn, tId, old, d)
  652. }
  653. }
  654. }
  655. c.Data["json"] = lib.JSONS{200, "设置平滑操作成功", nil}
  656. c.ServeJSON()
  657. return
  658. }
  659. // ImportSensorData 导入数据
  660. func (c *DataGeneratorController) ImportSensorData() {
  661. b_, admin := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  662. if !b_ {
  663. c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  664. c.ServeJSON()
  665. return
  666. }
  667. //读取文件
  668. file, _, err := c.GetFile("file")
  669. if err != nil {
  670. fmt.Println("读取form文件失败", err.Error())
  671. }
  672. //解析文件
  673. read, err := excelize.OpenReader(file)
  674. if err != nil {
  675. fmt.Println("解析错误:", err.Error())
  676. }
  677. rows, err := read.GetRows("data")
  678. if err != nil {
  679. fmt.Println("解析excel错误", err.Error())
  680. }
  681. values := make([][]string, 0)
  682. for _, row := range rows[1:] {
  683. //t_id t_sp t_time t_t t_rh t_site create_time
  684. values = append(values, row)
  685. }
  686. //添加操作
  687. sns := strings.Split(c.GetString("sn"), "|")
  688. for _, v := range sns {
  689. for _, ev := range values {
  690. temperature, _ := strconv.ParseFloat(ev[4], 64)
  691. humidty, _ := strconv.ParseFloat(ev[5], 64)
  692. temperature = lib.Decimal(temperature)
  693. humidty = lib.Decimal(humidty)
  694. data := Device.ToSensorData(strings.Split(v, ",")[1], ev[1], ev[2], ev[3], temperature, humidty, ev[6])
  695. Device.InsertDeviceSensorData(strings.Split(v, ",")[0], data, admin)
  696. }
  697. }
  698. c.Data["json"] = lib.JSONS{200, "导入数据成功!", nil}
  699. c.ServeJSON()
  700. return
  701. }