TaskData.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
  1. package controllers
  2. import (
  3. "ColdVerify_local/Nats"
  4. "ColdVerify_local/Nats/NatsServer"
  5. "ColdVerify_local/conf"
  6. "ColdVerify_local/lib"
  7. "ColdVerify_local/logs"
  8. "ColdVerify_local/models/System"
  9. "ColdVerify_local/models/Task"
  10. "fmt"
  11. beego "github.com/beego/beego/v2/server/web"
  12. "github.com/vmihailenco/msgpack/v5"
  13. "github.com/xuri/excelize/v2"
  14. "math"
  15. "os"
  16. "sort"
  17. "strconv"
  18. "strings"
  19. "sync"
  20. "time"
  21. )
  22. type TaskDataController struct {
  23. beego.Controller
  24. }
  25. // 列表 -
  26. func (c *TaskDataController) TaskData_List() {
  27. var r_jsons lib.R_JSONS
  28. page, _ := c.GetInt("page")
  29. if page < 1 {
  30. page = 1
  31. }
  32. page_z, _ := c.GetInt("page_z")
  33. if page_z < 1 {
  34. page_z = conf.Page_size
  35. }
  36. Time_start := c.GetString("Time_start")
  37. Time_end := c.GetString("Time_end")
  38. T_sn := c.GetString("T_sn")
  39. T_id, err := c.GetInt("T_id")
  40. if err != nil {
  41. T_id = -1
  42. }
  43. T_task_id := c.GetString("T_task_id")
  44. Task_r, err := NatsServer.Read_Task(T_task_id)
  45. if err != nil {
  46. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  47. c.ServeJSON()
  48. return
  49. }
  50. var cnt int64
  51. List, cnt := Task.Read_TaskData_ById_List(Task_r.T_task_id, T_sn, T_id, Time_start, Time_end, page, page_z)
  52. page_size := math.Ceil(float64(cnt) / float64(page_z))
  53. r_jsons.List = List
  54. r_jsons.Page = page
  55. r_jsons.Page_size = int(page_size)
  56. r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
  57. r_jsons.Num = int(cnt)
  58. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  59. c.ServeJSON()
  60. return
  61. }
  62. // 列表 -
  63. func (c *TaskDataController) TaskDataClass_List() {
  64. page, _ := c.GetInt("page")
  65. if page < 1 {
  66. page = 1
  67. }
  68. page_z, _ := c.GetInt("page_z")
  69. if page_z < 1 {
  70. page_z = conf.Page_size
  71. }
  72. T_task_id := c.GetString("T_task_id")
  73. Task_r, err := NatsServer.Read_Task(T_task_id)
  74. if err != nil {
  75. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  76. c.ServeJSON()
  77. return
  78. }
  79. List := Task.Read_TaskData_ById_ClassList(Task_r.T_task_id)
  80. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: List}
  81. c.ServeJSON()
  82. return
  83. }
  84. func (c *TaskDataController) TaskDataClass_Edit() {
  85. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  86. T_task_id := c.GetString("T_task_id")
  87. T_sn := c.GetString("T_sn")
  88. T_id := c.GetString("T_id")
  89. Task_r, err := NatsServer.Read_Task(T_task_id)
  90. if err != nil {
  91. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  92. c.ServeJSON()
  93. return
  94. }
  95. err = Task.Update_TaskData_ByT_sn(Task_r.T_task_id, T_sn, T_id)
  96. if err != nil {
  97. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  98. c.ServeJSON()
  99. return
  100. }
  101. System.Add_UserLogs_T(T_uuid, "本地版-任务分裂", "修改分类数据"+Task_r.T_name, Task_r.T_task_id+"|"+T_sn+"|"+T_id)
  102. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  103. c.ServeJSON()
  104. return
  105. }
  106. func (c *TaskDataController) TaskDataClass_Del() {
  107. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  108. T_task_id := c.GetString("T_task_id")
  109. T_sn := c.GetString("T_sn")
  110. Task_r, err := NatsServer.Read_Task(T_task_id)
  111. if err != nil {
  112. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  113. c.ServeJSON()
  114. return
  115. }
  116. err = Task.Delete_TaskData_ByT_sn(Task_r.T_task_id, T_sn)
  117. if err != nil {
  118. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  119. c.ServeJSON()
  120. return
  121. }
  122. System.Add_UserLogs_T(T_uuid, "本地版-任务分裂", "删除分类数据"+Task_r.T_name, Task_r.T_task_id+"|"+T_sn)
  123. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  124. c.ServeJSON()
  125. return
  126. }
  127. // 添加-
  128. func (c *TaskDataController) TaskData_AddS() {
  129. // 获取登录用户的uuid
  130. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  131. T_task_id := c.GetString("T_task_id")
  132. Task_r, err := NatsServer.Read_Task(T_task_id)
  133. if err != nil {
  134. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  135. c.ServeJSON()
  136. return
  137. }
  138. //T_sn|T_id|T_t|T_rh|T_time?
  139. T_Data := c.GetString("T_Data")
  140. if len(T_Data) < 5 {
  141. c.Data["json"] = lib.JSONS{Code: 201, Msg: "err T_Data!"}
  142. c.ServeJSON()
  143. return
  144. }
  145. T_Data_list := strings.Split(T_Data, "?")
  146. println(len(T_Data_list), "len(T_Data_list)")
  147. var T_Data_list_x = 0
  148. for _, v := range T_Data_list {
  149. // 2022-08-09 14:25:00|27.7|55.2
  150. if len(v) < 5 {
  151. println(v, "len(v) < 5")
  152. continue
  153. }
  154. v_list := strings.Split(v, "|")
  155. is := Task.Add_TaskData(Task_r.T_task_id, v_list[0], v_list[1], v_list[2], v_list[3], v_list[4])
  156. if is {
  157. T_Data_list_x += 1
  158. }
  159. }
  160. System.Add_UserLogs_T(T_uuid, "本地版-任务数据", "添加数据"+Task_r.T_name, Task_r.T_task_id+"结果:"+string(len(T_Data_list))+"/"+string(T_Data_list_x)+"|=> "+T_Data)
  161. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: strconv.Itoa(T_Data_list_x)}
  162. c.ServeJSON()
  163. return
  164. }
  165. // 添加-
  166. func (c *TaskDataController) TaskData_Add() {
  167. // 获取登录用户的uuid
  168. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  169. T_sn := c.GetString("T_sn")
  170. T_id, _ := c.GetInt("T_id")
  171. T_t, _ := c.GetFloat("T_t")
  172. T_rh, _ := c.GetFloat("T_rh")
  173. T_time := c.GetString("T_time")
  174. T_task_id := c.GetString("T_task_id")
  175. Task_r, err := NatsServer.Read_Task(T_task_id)
  176. if err != nil {
  177. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  178. c.ServeJSON()
  179. return
  180. }
  181. is := Task.Add_TaskData(Task_r.T_task_id, T_sn, strconv.Itoa(T_id), fmt.Sprintf("%.2f", T_t), fmt.Sprintf("%.2f", T_rh), T_time)
  182. if !is {
  183. c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
  184. c.ServeJSON()
  185. return
  186. }
  187. System.Add_UserLogs_T(T_uuid, "本地版-任务数据", "添加数据"+Task_r.T_name, Task_r.T_task_id+"|"+T_sn+"|"+strconv.Itoa(T_id)+"|"+fmt.Sprintf("%.2f", T_t)+"|"+fmt.Sprintf("%.2f", T_rh)+T_time)
  188. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  189. c.ServeJSON()
  190. return
  191. }
  192. // 修改-
  193. func (c *TaskDataController) TaskData_Up() {
  194. // 获取登录用户的uuid
  195. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  196. Id, err := c.GetInt("Id")
  197. if err != nil {
  198. c.Data["json"] = lib.JSONS{Code: 201, Msg: "Id 错误!"}
  199. c.ServeJSON()
  200. return
  201. }
  202. T_t, err := c.GetFloat("T_t")
  203. if err != nil {
  204. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_t 错误!"}
  205. c.ServeJSON()
  206. return
  207. }
  208. T_rh, err := c.GetFloat("T_rh")
  209. if err != nil {
  210. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_rh 错误!"}
  211. c.ServeJSON()
  212. return
  213. }
  214. T_time := c.GetString("T_time")
  215. T_task_id := c.GetString("T_task_id")
  216. Task_r, err := NatsServer.Read_Task(T_task_id)
  217. if err != nil {
  218. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  219. c.ServeJSON()
  220. return
  221. }
  222. is := Task.Up_TaskData(Task_r.T_task_id, strconv.Itoa(Id), fmt.Sprintf("%.2f", T_t), fmt.Sprintf("%.2f", T_rh), T_time)
  223. if !is {
  224. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  225. c.ServeJSON()
  226. return
  227. }
  228. System.Add_UserLogs_T(T_uuid, "本地版-任务数据", "修改数据"+Task_r.T_name, Task_r.T_task_id+"|"+strconv.Itoa(Id)+"|"+fmt.Sprintf("%.2f", T_t)+"|"+fmt.Sprintf("%.2f", T_rh)+T_time)
  229. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  230. c.ServeJSON()
  231. return
  232. }
  233. // 删除-
  234. func (c *TaskDataController) TaskData_Del() {
  235. // 获取登录用户的uuid
  236. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  237. Id, err := c.GetInt("Id")
  238. if err != nil {
  239. c.Data["json"] = lib.JSONS{Code: 201, Msg: "Id 错误!"}
  240. c.ServeJSON()
  241. return
  242. }
  243. T_task_id := c.GetString("T_task_id")
  244. Task_r, err := NatsServer.Read_Task(T_task_id)
  245. if err != nil {
  246. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  247. c.ServeJSON()
  248. return
  249. }
  250. is := Task.Del_TaskData(Task_r.T_task_id, strconv.Itoa(Id))
  251. if !is {
  252. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  253. c.ServeJSON()
  254. return
  255. }
  256. System.Add_UserLogs_T(T_uuid, "本地版-任务数据", "删除"+Task_r.T_name, Task_r.T_task_id+"|"+strconv.Itoa(Id))
  257. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  258. c.ServeJSON()
  259. return
  260. }
  261. // 删除-
  262. func (c *TaskDataController) TaskData_Del_t_id() {
  263. // 获取登录用户的uuid
  264. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  265. Id, err := c.GetInt("Id")
  266. if err != nil {
  267. c.Data["json"] = lib.JSONS{Code: 201, Msg: "Id 错误!"}
  268. c.ServeJSON()
  269. return
  270. }
  271. T_task_id := c.GetString("T_task_id")
  272. Task_r, err := NatsServer.Read_Task(T_task_id)
  273. if err != nil {
  274. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  275. c.ServeJSON()
  276. return
  277. }
  278. is := Task.Del_TaskData_t_id(Task_r.T_task_id, strconv.Itoa(Id))
  279. if !is {
  280. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  281. c.ServeJSON()
  282. return
  283. }
  284. System.Add_UserLogs_T(T_uuid, "本地版-任务数据", "删除"+Task_r.T_name, Task_r.T_task_id+"|"+strconv.Itoa(Id))
  285. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  286. c.ServeJSON()
  287. return
  288. }
  289. // 列表 - 接口
  290. func (c *TaskDataController) Export_Data_Excel() {
  291. Time_start := c.GetString("Time_start")
  292. Time_end := c.GetString("Time_end")
  293. T_sn_str := c.GetString("T_sn_list") //865901058809339,865901058815849,865901058818991,865901058810568
  294. //T_id, err := c.GetInt("T_id")
  295. //if err != nil {
  296. // T_id = -1
  297. //
  298. //}
  299. T_task_id := c.GetString("T_task_id")
  300. Task_r, err := NatsServer.Read_Task(T_task_id)
  301. if err != nil {
  302. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  303. c.ServeJSON()
  304. return
  305. }
  306. T_sn_list := strings.Split(T_sn_str, ",")
  307. DeviceSensor_data_list := []Task.TaskData_{}
  308. for _, v := range T_sn_list {
  309. DeviceSensor_data, _ := Task.Read_TaskData_ById_List(Task_r.T_task_id, v, -1, Time_start, Time_end, 1, 9999)
  310. DeviceSensor_data_list = append(DeviceSensor_data_list, DeviceSensor_data...)
  311. }
  312. f := excelize.NewFile() // 设置单元格的值
  313. // 这里设置表头
  314. f.SetCellValue("Sheet1", "A1", "编号")
  315. f.SetCellValue("Sheet1", "B1", "SN")
  316. f.SetCellValue("Sheet1", "C1", "温度℃")
  317. f.SetCellValue("Sheet1", "D1", "湿度%")
  318. f.SetCellValue("Sheet1", "E1", "记录时间")
  319. // 设置列宽
  320. f.SetColWidth("Sheet1", "A", "A", 7)
  321. f.SetColWidth("Sheet1", "B", "B", 20)
  322. f.SetColWidth("Sheet1", "C", "C", 10)
  323. f.SetColWidth("Sheet1", "D", "D", 10)
  324. f.SetColWidth("Sheet1", "E", "E", 22)
  325. line := 1
  326. // 循环写入数据
  327. for _, v := range DeviceSensor_data_list {
  328. line++
  329. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), v.T_id)
  330. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v.T_sn)
  331. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), strconv.FormatFloat(float64(v.T_t), 'f', 1, 64))
  332. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), strconv.FormatFloat(float64(v.T_rh), 'f', 1, 64))
  333. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v.T_time)
  334. }
  335. fmt.Println("DeviceSensor_data:", len(DeviceSensor_data_list))
  336. lib.Create_Dir("./ofile")
  337. timeStr := time.Now().Format("20060102150405")
  338. // 保存文件
  339. if err := f.SaveAs("ofile/" + timeStr + ".xlsx"); err != nil {
  340. fmt.Println(err)
  341. }
  342. if !lib.Pload_qiniu("ofile/"+timeStr+".xlsx", "ofile/"+timeStr+".xlsx") {
  343. c.Data["json"] = lib.JSONS{Code: 203, Msg: "oss!"}
  344. c.ServeJSON()
  345. return
  346. }
  347. //删除目录
  348. //err = os.Remove("ofile/" + timeStr + ".xlsx")
  349. //if err != nil {
  350. // fmt.Println(err)
  351. //}
  352. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: "https://bzdcoldverifyoss.baozhida.cn/" + "ofile/" + timeStr + ".xlsx"}
  353. c.ServeJSON()
  354. return
  355. }
  356. func (c *TaskDataController) Check() {
  357. T_task_id := c.GetString("T_task_id")
  358. Task_r, err := NatsServer.Read_Task(T_task_id)
  359. if err != nil {
  360. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  361. c.ServeJSON()
  362. return
  363. }
  364. type R_JSONS struct {
  365. T_sn string // SN
  366. T_id string // 编号
  367. T_unm int // 数据量
  368. T_time_interval int64 // 时间间隔
  369. Time_start string // 开始
  370. Time_end string // 结束
  371. Result int // 200 OK, 201 可以补 , 202 不能补
  372. Result_str string // 提示内容
  373. Result_Time_start string // 2022-8-05 21:01
  374. Result_Time_defect int64 // 缺失时间间隔
  375. }
  376. var r_jsons []R_JSONS
  377. List := Task.Read_TaskData_ById_ClassList(Task_r.T_task_id)
  378. for _, v := range List {
  379. var r_json R_JSONS
  380. r_json.T_sn = v.T_sn
  381. r_json.Result = 200
  382. DeviceSensor_data := Task.Read_TaskData_ById_List_(Task_r.T_task_id, v.T_sn)
  383. r_json.T_unm = len(DeviceSensor_data)
  384. if r_json.T_unm > 2 {
  385. r_json.T_id = DeviceSensor_data[0].T_id
  386. r_json.Time_end = DeviceSensor_data[len(DeviceSensor_data)-1].T_time
  387. r_json.Time_start = DeviceSensor_data[0].T_time
  388. formatTime_a, _ := time.Parse("2006-1-2 15:04", DeviceSensor_data[0].T_time)
  389. formatTime_b, _ := time.Parse("2006-1-2 15:04", DeviceSensor_data[1].T_time)
  390. formatTime_x := formatTime_b.Unix() - formatTime_a.Unix()
  391. r_json.T_time_interval = formatTime_x
  392. println("formatTime_x:", v.T_id, v.T_sn, formatTime_x)
  393. if formatTime_x > 60*30 || formatTime_x < 60 {
  394. r_json.Result = 202
  395. r_json.Result_str = "数据异常(数据的第一个时间与第二个时间相差 " + strconv.FormatInt(formatTime_x, 10) + "秒),必须大于60秒,小于30分钟"
  396. r_jsons = append(r_jsons, r_json)
  397. continue
  398. }
  399. for data_i := 2; data_i < len(DeviceSensor_data); data_i++ {
  400. formatTime_a = formatTime_b
  401. formatTime_b, _ = time.Parse("2006-1-2 15:04", DeviceSensor_data[data_i].T_time)
  402. formatTime_ := formatTime_b.Unix() - formatTime_a.Unix()
  403. println("formatTime_x-:", formatTime_)
  404. if formatTime_ < formatTime_x {
  405. r_json.Result = 202
  406. r_json.Result_str = "开始时间:" + DeviceSensor_data[data_i-1].T_time + " 离下一条时间间隔:" + strconv.FormatInt(formatTime_, 10) + "秒,间隔小于时间间隔,不能自动补充"
  407. break
  408. }
  409. if formatTime_x != formatTime_ {
  410. if formatTime_ > 60*30 {
  411. r_json.Result = 202
  412. r_json.Result_str = "开始时间:" + DeviceSensor_data[data_i-1].T_time + " 离下一条时间间隔:" + strconv.FormatInt(formatTime_, 10) + "秒,相差时间大于30分钟,不能自动补充"
  413. break
  414. }
  415. r_json.Result = 201
  416. r_json.Result_str = "开始时间:" + DeviceSensor_data[data_i-1].T_time + " 离下一条时间间隔:" + strconv.FormatInt(formatTime_, 10) + "秒"
  417. r_json.Result_Time_start = DeviceSensor_data[data_i-1].T_time
  418. r_json.Result_Time_defect = formatTime_
  419. println(r_json.Result_str)
  420. break
  421. }
  422. }
  423. } else {
  424. r_json.Result = 202
  425. r_json.Result_str = "数据量太少 必须大于 2条以上!"
  426. }
  427. r_jsons = append(r_jsons, r_json)
  428. }
  429. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  430. c.ServeJSON()
  431. return
  432. }
  433. func (c *TaskDataController) Check_Asyn() {
  434. T_task_id := c.GetString("T_task_id")
  435. Task_r, err := NatsServer.Read_Task(T_task_id)
  436. if err != nil {
  437. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  438. c.ServeJSON()
  439. return
  440. }
  441. type R_JSONS struct {
  442. T_sn string // SN
  443. T_id string // 编号
  444. T_unm int // 数据量
  445. T_time_interval int64 // 时间间隔
  446. Time_start string // 开始
  447. Time_end string // 结束
  448. Result int // 200 OK, 201 可以补 , 202 不能补
  449. Result_str string // 提示内容
  450. Result_Time_start string // 2022-8-05 21:01
  451. Result_Time_defect int64 // 缺失时间间隔
  452. }
  453. var r_jsons []R_JSONS
  454. List := Task.Read_TaskData_ById_ClassList(Task_r.T_task_id)
  455. var limitMaxNum = 10
  456. var chData = make(chan int, limitMaxNum)
  457. var jobGroup sync.WaitGroup
  458. var tasknum = len(List)
  459. //处理任务,最多同时有10个协程
  460. for i := 0; i < tasknum; i++ {
  461. chData <- 1
  462. go func(index int, r_jsons *[]R_JSONS) {
  463. defer jobGroup.Done()
  464. jobGroup.Add(1)
  465. var r_json R_JSONS
  466. r_json.T_sn = List[index].T_sn
  467. r_json.Result = 200
  468. DeviceSensor_data := Task.Read_TaskData_ById_List_(Task_r.T_task_id, List[index].T_sn)
  469. r_json.T_unm = len(DeviceSensor_data)
  470. if r_json.T_unm > 2 {
  471. if List[index].T_sn == "000000000000004" {
  472. fmt.Println("-------------", List[index].T_sn)
  473. }
  474. r_json.T_id = DeviceSensor_data[0].T_id
  475. r_json.Time_end = DeviceSensor_data[len(DeviceSensor_data)-1].T_time
  476. r_json.Time_start = DeviceSensor_data[0].T_time
  477. formatTime_a, _ := time.Parse("2006-1-2 15:04", DeviceSensor_data[0].T_time)
  478. formatTime_b, _ := time.Parse("2006-1-2 15:04", DeviceSensor_data[1].T_time)
  479. formatTime_x := formatTime_b.Unix() - formatTime_a.Unix()
  480. r_json.T_time_interval = formatTime_x
  481. println("formatTime_x:", List[index].T_id, List[index].T_sn, formatTime_x)
  482. if formatTime_x > 60*30 || formatTime_x < 60 {
  483. r_json.Result = 202
  484. r_json.Result_str = "数据异常(数据的第一个时间与第二个时间相差 " + strconv.FormatInt(formatTime_x, 10) + "秒),必须大于60秒,小于30分钟"
  485. *r_jsons = append(*r_jsons, r_json)
  486. <-chData
  487. return
  488. }
  489. for data_i := 2; data_i < len(DeviceSensor_data); data_i++ {
  490. formatTime_a = formatTime_b
  491. formatTime_b, _ = time.Parse("2006-1-2 15:04", DeviceSensor_data[data_i].T_time)
  492. formatTime_ := formatTime_b.Unix() - formatTime_a.Unix()
  493. if formatTime_ < formatTime_x {
  494. println("formatTime_x-:", formatTime_)
  495. r_json.Result = 202
  496. r_json.Result_str = "开始时间:" + DeviceSensor_data[data_i-1].T_time + " 离下一条时间间隔:" + strconv.FormatInt(formatTime_, 10) + "秒,间隔小于时间间隔,不能自动补充"
  497. break
  498. }
  499. if formatTime_x != formatTime_ {
  500. if formatTime_ > 60*30 {
  501. println("formatTime_x-:", formatTime_)
  502. r_json.Result = 202
  503. r_json.Result_str = "开始时间:" + DeviceSensor_data[data_i-1].T_time + " 离下一条时间间隔:" + strconv.FormatInt(formatTime_, 10) + "秒,相差时间大于30分钟,不能自动补充"
  504. break
  505. }
  506. r_json.Result = 201
  507. r_json.Result_str = "开始时间:" + DeviceSensor_data[data_i-1].T_time + " 离下一条时间间隔:" + strconv.FormatInt(formatTime_, 10) + "秒"
  508. r_json.Result_Time_start = DeviceSensor_data[data_i-1].T_time
  509. r_json.Result_Time_defect = formatTime_
  510. println(r_json.Result_str)
  511. break
  512. }
  513. }
  514. } else {
  515. r_json.Result = 202
  516. r_json.Result_str = "数据量太少 必须大于 2条以上!"
  517. }
  518. *r_jsons = append(*r_jsons, r_json)
  519. <-chData
  520. }(i, &r_jsons)
  521. }
  522. //使用Wait等待所有任务执行完毕
  523. jobGroup.Wait()
  524. sort.Slice(r_jsons, func(i, j int) bool {
  525. return r_jsons[i].T_id < r_jsons[j].T_id
  526. })
  527. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  528. c.ServeJSON()
  529. return
  530. }
  531. // 打包数据本地数据
  532. func (c *TaskDataController) TaskData_Import_TaskData() {
  533. // 获取登录用户的uuid
  534. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  535. T_task_id := c.GetString("T_task_id")
  536. _, err := NatsServer.Read_Task(T_task_id)
  537. if err != nil {
  538. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  539. c.ServeJSON()
  540. return
  541. }
  542. if err = lib.Create_Dir(conf.Sql_Temp_Dir); err != nil {
  543. logs.Println("创建sql临时文件失败")
  544. }
  545. sql_file := fmt.Sprintf("%sZ_TaskData_%s.sql", conf.Sql_Temp_Dir, T_task_id)
  546. org, err := Task.Dump_TaskData(T_task_id, conf.MysqlServer2_Username, conf.MysqlServer2_Password, conf.MysqlServer2_UrlPort, conf.MysqlServer2_Database, sql_file)
  547. if err != nil {
  548. c.Data["json"] = lib.JSONS{Code: 202, Msg: "z_task_data_" + T_task_id + "线上数据导出失败!"}
  549. c.ServeJSON()
  550. return
  551. }
  552. System.Add_UserLogs_T(T_uuid, "本地版-任务数据-打包本地数据", "导出线上数据Z_TaskData_"+T_task_id, org)
  553. i := 0
  554. flag := false
  555. Task.CREATE_TaskData(conf.Local_AliasName, T_task_id)
  556. for i < 10 {
  557. Task.Truncate_TaskData(conf.Local_AliasName, T_task_id)
  558. org, err = Task.Insert_TaskData(conf.MysqlServer_Username, conf.MysqlServer_Password, conf.MysqlServer_UrlPort, conf.MysqlServer_Database, sql_file)
  559. if err != nil {
  560. logs.Println("任务数据-打包本地数据", "线下导入数据Z_TaskData_"+T_task_id, err.Error())
  561. } else {
  562. if Task.Check_TaskData_Num(T_task_id) {
  563. System.Add_UserLogs_T(T_uuid, "本地版-任务数据-打包本地数据", "线下导入数据Z_TaskData_"+T_task_id, org)
  564. flag = true
  565. break
  566. }
  567. }
  568. i++
  569. }
  570. // 重试10次后仍然没有成功导入数据
  571. if !flag {
  572. c.Data["json"] = lib.JSONS{Code: 202, Msg: "z_task_data_" + T_task_id + "线下导入数据失败!"}
  573. c.ServeJSON()
  574. return
  575. }
  576. //删除导出的sql文件
  577. _ = os.Remove(sql_file)
  578. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  579. c.ServeJSON()
  580. }
  581. // 更新线上数据
  582. func (c *TaskDataController) TaskData_Up_TaskData() {
  583. // 获取登录用户的uuid
  584. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  585. T_task_id := c.GetString("T_task_id")
  586. Task_r, err := NatsServer.Read_Task(T_task_id)
  587. if err != nil {
  588. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  589. c.ServeJSON()
  590. return
  591. }
  592. if err = lib.Create_Dir(conf.Sql_Temp_Dir); err != nil {
  593. logs.Println("创建sql临时文件失败")
  594. }
  595. sql_file := fmt.Sprintf("%sZ_TaskData_%s.sql", conf.Sql_Temp_Dir, T_task_id)
  596. org, err := Task.Dump_TaskData(T_task_id, conf.MysqlServer_Username, conf.MysqlServer_Password, conf.MysqlServer_UrlPort, conf.MysqlServer_Database, sql_file)
  597. if err != nil {
  598. logs.Println(T_uuid, "任务数据-更新线上数据", "导出线下数据Z_TaskData_"+T_task_id, err.Error())
  599. c.Data["json"] = lib.JSONS{Code: 202, Msg: "z_task_data_" + T_task_id + "线下数据导出失败!"}
  600. c.ServeJSON()
  601. return
  602. }
  603. System.Add_UserLogs_T(T_uuid, "本地版-任务数据-更新线上数据", "线上导入数据Z_TaskData_"+T_task_id, org)
  604. i := 0
  605. flag := false
  606. for i < 10 {
  607. Task.Truncate_TaskData(conf.Server_AliasName, T_task_id)
  608. org, err = Task.Insert_TaskData(conf.MysqlServer2_Username, conf.MysqlServer2_Password, conf.MysqlServer2_UrlPort, conf.MysqlServer2_Database, sql_file)
  609. if err != nil {
  610. logs.Println(T_uuid, "任务数据-更新线上数据", "线上导入数据Z_TaskData_"+T_task_id, err.Error())
  611. } else {
  612. if Task.Check_TaskData_Num(T_task_id) {
  613. System.Add_UserLogs_T(T_uuid, "本地版-任务数据-更新线上数据", "线上导入数据Z_TaskData_"+T_task_id, org)
  614. flag = true
  615. break
  616. }
  617. }
  618. i++
  619. }
  620. // 重试10次后仍然没有成功导入数据
  621. if !flag {
  622. c.Data["json"] = lib.JSONS{Code: 202, Msg: "z_task_data_" + T_task_id + "线上导入数据失败!"}
  623. c.ServeJSON()
  624. return
  625. }
  626. //删除导出的sql文件
  627. _ = os.Remove(sql_file)
  628. // 线上数据更新后 将当前任务 交付审核 标志 为 1
  629. Task_r.T_delivery_state = 1
  630. err = NatsServer.Update_Task(Task_r)
  631. if err != nil {
  632. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  633. c.ServeJSON()
  634. return
  635. }
  636. // 向线上用户日志表写入数据
  637. System.Add_UserLogs_T(T_uuid, "本地版-任务", "修改", Task_r)
  638. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  639. c.ServeJSON()
  640. }
  641. // 更新线上数据后台执行
  642. func (c *TaskDataController) TaskData_Up_TaskData_Back() {
  643. // 获取登录用户的uuid
  644. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  645. T_task_id := c.GetString("T_task_id")
  646. Task_r, err := NatsServer.Read_Task(T_task_id)
  647. if err != nil {
  648. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  649. c.ServeJSON()
  650. return
  651. }
  652. // 采集中
  653. Task_r.T_delivery_state = 2
  654. err = NatsServer.Update_Task(Task_r)
  655. if err != nil {
  656. c.Data["json"] = lib.JSONS{Code: 202, Msg: "提交失败!"}
  657. c.ServeJSON()
  658. return
  659. }
  660. data := Nats.Up_TaskData_Back{
  661. T_uuid: T_uuid,
  662. Task: Task_r,
  663. }
  664. b, _ := msgpack.Marshal(&data)
  665. _ = lib.Nats.Publish("ColdVerify_Local_Up_TaskData", b)
  666. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  667. c.ServeJSON()
  668. }