TaskData.go 69 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377
  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. "errors"
  11. "fmt"
  12. "github.com/beego/beego/v2/client/orm"
  13. beego "github.com/beego/beego/v2/server/web"
  14. "github.com/vmihailenco/msgpack/v5"
  15. "github.com/xuri/excelize/v2"
  16. "gonum.org/v1/plot"
  17. "gonum.org/v1/plot/plotter"
  18. "gonum.org/v1/plot/vg"
  19. "gonum.org/v1/plot/vg/draw"
  20. "image/color"
  21. "math"
  22. "os"
  23. "strconv"
  24. "strings"
  25. "sync"
  26. "time"
  27. )
  28. type TaskDataController struct {
  29. beego.Controller
  30. }
  31. // 列表 -
  32. func (c *TaskDataController) TaskData_List() {
  33. var r_jsons lib.R_JSONS
  34. page, _ := c.GetInt("page")
  35. if page < 1 {
  36. page = 1
  37. }
  38. page_z, _ := c.GetInt("page_z")
  39. if page_z < 1 {
  40. page_z = conf.Page_size
  41. }
  42. Time_start := c.GetString("Time_start")
  43. Time_end := c.GetString("Time_end")
  44. T_sn := c.GetString("T_sn")
  45. T_id := c.GetString("T_id")
  46. T_task_id := c.GetString("T_task_id")
  47. Task_r, err := NatsServer.Read_Task(T_task_id)
  48. if err != nil {
  49. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  50. c.ServeJSON()
  51. return
  52. }
  53. if Task_r.T_collection_state == 2 {
  54. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  55. c.ServeJSON()
  56. return
  57. }
  58. var cnt int64
  59. List, cnt := Task.Read_TaskData_ById_List(Task_r.T_task_id, T_sn, T_id, Time_start, Time_end, page, page_z)
  60. page_size := math.Ceil(float64(cnt) / float64(page_z))
  61. r_jsons.List = List
  62. r_jsons.Page = page
  63. r_jsons.Page_size = int(page_size)
  64. r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
  65. r_jsons.Num = int(cnt)
  66. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  67. c.ServeJSON()
  68. return
  69. }
  70. // 列表 -
  71. func (c *TaskDataController) TaskDataClass_List() {
  72. page, _ := c.GetInt("page")
  73. if page < 1 {
  74. page = 1
  75. }
  76. page_z, _ := c.GetInt("page_z")
  77. if page_z < 1 {
  78. page_z = conf.Page_size
  79. }
  80. T_task_id := c.GetString("T_task_id")
  81. Task_r, err := NatsServer.Read_Task(T_task_id)
  82. if err != nil {
  83. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  84. c.ServeJSON()
  85. return
  86. }
  87. if Task_r.T_collection_state == 2 {
  88. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  89. c.ServeJSON()
  90. return
  91. }
  92. List := Task.Read_TaskData_ById_ClassList(Task_r.T_task_id)
  93. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: List}
  94. c.ServeJSON()
  95. return
  96. }
  97. func (c *TaskDataController) TaskDataClass_Edit() {
  98. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  99. T_task_id := c.GetString("T_task_id")
  100. T_sn := c.GetString("T_sn")
  101. T_id := c.GetString("T_id")
  102. Task_r, err := NatsServer.Read_Task(T_task_id)
  103. if err != nil {
  104. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  105. c.ServeJSON()
  106. return
  107. }
  108. sn, err := Task.Read_TaskData_ByT_id(Task_r.T_task_id, T_id)
  109. if err != nil && !errors.Is(err, orm.ErrNoRows) {
  110. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  111. c.ServeJSON()
  112. return
  113. }
  114. if len(sn) > 0 && sn != T_sn {
  115. c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("编号[%s]已被sn[%s]关联,请修改后重试!", T_id, sn)}
  116. c.ServeJSON()
  117. return
  118. }
  119. //id, err := Task.Read_TaskData_ByT_sn(Task_r.T_task_id, T_sn)
  120. //if err != nil && !errors.Is(err, orm.ErrNoRows) {
  121. // c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  122. // c.ServeJSON()
  123. // return
  124. //}
  125. //if len(id) > 0 && id != T_id {
  126. // c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("sn[%s]已被编号[%s]关联,请修改后重试!", T_sn, id)}
  127. // c.ServeJSON()
  128. // return
  129. //}
  130. err = Task.Update_TaskData_ByT_sn(Task_r.T_task_id, T_sn, T_id)
  131. if err != nil {
  132. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  133. c.ServeJSON()
  134. return
  135. }
  136. System.Add_UserLogs_T(T_uuid, "本地版-任务分裂", "修改分类数据"+Task_r.T_name, Task_r.T_task_id+"|"+T_sn+"|"+T_id)
  137. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  138. c.ServeJSON()
  139. return
  140. }
  141. func (c *TaskDataController) TaskDataClass_Del() {
  142. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  143. T_task_id := c.GetString("T_task_id")
  144. T_sn := c.GetString("T_sn")
  145. Task_r, err := NatsServer.Read_Task(T_task_id)
  146. if err != nil {
  147. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  148. c.ServeJSON()
  149. return
  150. }
  151. err = Task.Delete_TaskData_ByT_sn(Task_r.T_task_id, T_sn)
  152. if err != nil {
  153. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  154. c.ServeJSON()
  155. return
  156. }
  157. System.Add_UserLogs_T(T_uuid, "本地版-任务分类", "删除分类数据"+Task_r.T_name, Task_r.T_task_id+"|"+T_sn)
  158. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  159. c.ServeJSON()
  160. return
  161. }
  162. // 添加-
  163. func (c *TaskDataController) TaskData_AddS() {
  164. // 获取登录用户的uuid
  165. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  166. T_task_id := c.GetString("T_task_id")
  167. Task_r, err := NatsServer.Read_Task(T_task_id)
  168. if err != nil {
  169. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  170. c.ServeJSON()
  171. return
  172. }
  173. //T_sn|T_id|T_t|T_rh|T_time?
  174. T_Data := c.GetString("T_Data")
  175. if len(T_Data) < 5 {
  176. c.Data["json"] = lib.JSONS{Code: 201, Msg: "err T_Data!"}
  177. c.ServeJSON()
  178. return
  179. }
  180. T_Data_list := strings.Split(T_Data, "?")
  181. println(len(T_Data_list), "len(T_Data_list)")
  182. var T_Data_list_x = 0
  183. snMaps := make(map[string]string)
  184. for _, v := range T_Data_list {
  185. // 132|132|23.9|72.1|2023-04-30 07:03:00
  186. if len(v) < 5 {
  187. println(v, "len(v) < 5")
  188. continue
  189. }
  190. v_list := strings.Split(v, "|")
  191. id, sn := v_list[1], v_list[0]
  192. sn1, ok := snMaps[id]
  193. if !ok {
  194. snMaps[id] = sn
  195. } else if sn1 != sn {
  196. c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("编号[%s]已被sn[%s]关联,请修改后重试!", id, sn1)}
  197. c.ServeJSON()
  198. return
  199. }
  200. }
  201. for T_id, T_sn := range snMaps {
  202. sn, err := Task.Read_TaskData_ByT_id(Task_r.T_task_id, T_id)
  203. if err != nil && !errors.Is(err, orm.ErrNoRows) {
  204. continue
  205. }
  206. if len(sn) > 0 && sn != T_sn {
  207. c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("编号[%s]已被sn[%s]关联,请修改后重试!", T_id, sn)}
  208. c.ServeJSON()
  209. return
  210. }
  211. id, err := Task.Read_TaskData_ByT_sn(Task_r.T_task_id, T_sn)
  212. if err != nil && !errors.Is(err, orm.ErrNoRows) {
  213. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  214. c.ServeJSON()
  215. return
  216. }
  217. if len(id) > 0 && id != T_id {
  218. c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("sn[%s]已被编号[%s]关联,请修改后重试!", T_sn, id)}
  219. c.ServeJSON()
  220. return
  221. }
  222. }
  223. for _, v := range T_Data_list {
  224. // 132|132|23.9|72.1|2023-04-30 07:03:00
  225. if len(v) < 5 {
  226. println(v, "len(v) < 5")
  227. continue
  228. }
  229. v_list := strings.Split(v, "|")
  230. t, _ := lib.ReplaceSeconds(v_list[4])
  231. is := Task.Add_TaskData(Task_r.T_task_id, v_list[0], v_list[1], v_list[2], v_list[3], t)
  232. if is {
  233. T_Data_list_x += 1
  234. }
  235. }
  236. 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)
  237. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: strconv.Itoa(T_Data_list_x)}
  238. c.ServeJSON()
  239. return
  240. }
  241. func (c *TaskDataController) TaskData_AddS_Excel() {
  242. // 获取登录用户的uuid
  243. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  244. T_task_id := c.GetString("T_task_id")
  245. Task_r, err := NatsServer.Read_Task(T_task_id)
  246. if err != nil {
  247. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  248. c.ServeJSON()
  249. return
  250. }
  251. // 获取上传的文件
  252. file, _, err := c.GetFile("file")
  253. if err != nil {
  254. c.Data["json"] = lib.JSONS{Code: 202, Msg: "文件上传失败!"}
  255. c.ServeJSON()
  256. return
  257. }
  258. // 解析 Excel 文件
  259. xlFile, err := excelize.OpenReader(file)
  260. if err != nil {
  261. c.Data["json"] = lib.JSONS{Code: 202, Msg: "文件解析失败!"}
  262. c.ServeJSON()
  263. return
  264. }
  265. rows, err := xlFile.GetRows(xlFile.GetSheetName(0))
  266. if err != nil {
  267. c.Data["json"] = lib.JSONS{Code: 202, Msg: "获取工作表失败!"}
  268. c.ServeJSON()
  269. return
  270. }
  271. var T_Data_list_x int
  272. snMaps := make(map[string]string)
  273. var valueStrings []string
  274. for k, val := range rows {
  275. // 跳过第一行
  276. if k == 0 {
  277. continue
  278. }
  279. if len(val) < 5 {
  280. println(val, "len(v) < 5")
  281. continue
  282. }
  283. fmt.Println(val)
  284. id, sn := val[1], val[0]
  285. sn1, ok := snMaps[id]
  286. if !ok {
  287. snMaps[id] = sn
  288. } else if sn1 != sn {
  289. c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("编号[%s]已被sn[%s]关联,请修改后重试!", id, sn1)}
  290. c.ServeJSON()
  291. return
  292. }
  293. t, _ := lib.ReplaceSeconds(val[4])
  294. valueStrings = append(valueStrings, fmt.Sprintf("('%s','%s',%v,%v,'%s')", val[0], val[1], val[2], val[3], t))
  295. //T_Data_list_x += 1
  296. }
  297. for T_id, T_sn := range snMaps {
  298. sn, err := Task.Read_TaskData_ByT_id(Task_r.T_task_id, T_id)
  299. if err != nil && !errors.Is(err, orm.ErrNoRows) {
  300. continue
  301. }
  302. if len(sn) > 0 && sn != T_sn {
  303. c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("编号[%s]已被sn[%s]关联,请修改后重试!", T_id, sn)}
  304. c.ServeJSON()
  305. return
  306. }
  307. id, err := Task.Read_TaskData_ByT_sn(Task_r.T_task_id, T_sn)
  308. if err != nil && !errors.Is(err, orm.ErrNoRows) {
  309. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  310. c.ServeJSON()
  311. return
  312. }
  313. if len(id) > 0 && id != T_id {
  314. c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("sn[%s]已被编号[%s]关联,请修改后重试!", T_sn, id)}
  315. c.ServeJSON()
  316. return
  317. }
  318. }
  319. // 删除重复数据
  320. err = Task.DeleteDeduplicate(T_task_id)
  321. if err != nil {
  322. c.Data["json"] = lib.JSONS{Code: 202, Msg: "导入失败"}
  323. c.ServeJSON()
  324. return
  325. }
  326. // 创建唯一缩影
  327. err = Task.Create_Unique_Index(T_task_id)
  328. if err != nil {
  329. c.Data["json"] = lib.JSONS{Code: 202, Msg: "导入失败"}
  330. c.ServeJSON()
  331. return
  332. }
  333. pageSize := 10000 // 每页的条数
  334. totalPages := len(valueStrings) / pageSize // 总页数
  335. // 遍历每一页
  336. for page := 1; page <= totalPages+1; page++ {
  337. // 计算当前页的起始索引和结束索引
  338. startIndex := (page - 1) * pageSize
  339. if startIndex > len(valueStrings) {
  340. startIndex = len(valueStrings)
  341. }
  342. endIndex := page * pageSize
  343. // 边界判断,如果结束索引超过列表长度,则将结束索引设置为列表最后一个元素的索引加一
  344. if endIndex > len(valueStrings) {
  345. endIndex = len(valueStrings)
  346. }
  347. fmt.Printf("startIndex %d endIndex %d\n", startIndex, endIndex)
  348. // 获取当前页的数据
  349. currentList := valueStrings[startIndex:endIndex]
  350. err = Task.Adds_TaskData(T_task_id, currentList)
  351. if err == nil {
  352. T_Data_list_x += len(currentList)
  353. }
  354. }
  355. //err = Task.Adds_TaskData(T_task_id, valueStrings)
  356. // 删除唯一索引
  357. Task.Delete_Unique_Index(T_task_id)
  358. System.Add_UserLogs_T(T_uuid, "本地版-任务数据", "添加数据"+Task_r.T_name, Task_r.T_task_id+"结果:"+strconv.Itoa(T_Data_list_x))
  359. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: strconv.Itoa(T_Data_list_x)}
  360. c.ServeJSON()
  361. return
  362. }
  363. // 添加-
  364. func (c *TaskDataController) TaskData_Add() {
  365. // 获取登录用户的uuid
  366. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  367. T_sn := c.GetString("T_sn")
  368. T_id := c.GetString("T_id")
  369. T_t, _ := c.GetFloat("T_t")
  370. T_rh, _ := c.GetFloat("T_rh")
  371. T_time := c.GetString("T_time")
  372. T_task_id := c.GetString("T_task_id")
  373. Task_r, err := NatsServer.Read_Task(T_task_id)
  374. if err != nil {
  375. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  376. c.ServeJSON()
  377. return
  378. }
  379. sn, err := Task.Read_TaskData_ByT_id(Task_r.T_task_id, T_id)
  380. if err != nil && !errors.Is(err, orm.ErrNoRows) {
  381. c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
  382. c.ServeJSON()
  383. return
  384. }
  385. if len(sn) > 0 && sn != T_sn {
  386. c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("编号[%s]已被sn[%s]关联,请修改后重试!", T_id, sn)}
  387. c.ServeJSON()
  388. return
  389. }
  390. id, err := Task.Read_TaskData_ByT_sn(Task_r.T_task_id, T_sn)
  391. if err != nil && !errors.Is(err, orm.ErrNoRows) {
  392. c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
  393. c.ServeJSON()
  394. return
  395. }
  396. if len(id) > 0 && id != T_id {
  397. c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("sn[%s]已被编号[%s]关联,请修改后重试!", T_sn, id)}
  398. c.ServeJSON()
  399. return
  400. }
  401. is := Task.Add_TaskData(Task_r.T_task_id, T_sn, T_id, fmt.Sprintf("%.2f", T_t), fmt.Sprintf("%.2f", T_rh), T_time)
  402. if !is {
  403. c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
  404. c.ServeJSON()
  405. return
  406. }
  407. System.Add_UserLogs_T(T_uuid, "本地版-任务数据", "添加数据"+Task_r.T_name, Task_r.T_task_id+"|"+T_sn+"|"+T_id+"|"+fmt.Sprintf("%.2f", T_t)+"|"+fmt.Sprintf("%.2f", T_rh)+T_time)
  408. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  409. c.ServeJSON()
  410. return
  411. }
  412. // 修改-
  413. func (c *TaskDataController) TaskData_Up() {
  414. // 获取登录用户的uuid
  415. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  416. Id, err := c.GetInt("Id")
  417. if err != nil {
  418. c.Data["json"] = lib.JSONS{Code: 201, Msg: "Id 错误!"}
  419. c.ServeJSON()
  420. return
  421. }
  422. T_t, err := c.GetFloat("T_t")
  423. if err != nil {
  424. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_t 错误!"}
  425. c.ServeJSON()
  426. return
  427. }
  428. T_rh, err := c.GetFloat("T_rh")
  429. if err != nil {
  430. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_rh 错误!"}
  431. c.ServeJSON()
  432. return
  433. }
  434. T_time := c.GetString("T_time")
  435. T_task_id := c.GetString("T_task_id")
  436. Task_r, err := NatsServer.Read_Task(T_task_id)
  437. if err != nil {
  438. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  439. c.ServeJSON()
  440. return
  441. }
  442. is := Task.Up_TaskData(Task_r.T_task_id, strconv.Itoa(Id), fmt.Sprintf("%.2f", T_t), fmt.Sprintf("%.2f", T_rh), T_time)
  443. if !is {
  444. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  445. c.ServeJSON()
  446. return
  447. }
  448. 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)
  449. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  450. c.ServeJSON()
  451. return
  452. }
  453. // 删除-
  454. func (c *TaskDataController) TaskData_Del() {
  455. // 获取登录用户的uuid
  456. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  457. Id, err := c.GetInt("Id")
  458. if err != nil {
  459. c.Data["json"] = lib.JSONS{Code: 201, Msg: "Id 错误!"}
  460. c.ServeJSON()
  461. return
  462. }
  463. T_task_id := c.GetString("T_task_id")
  464. Task_r, err := NatsServer.Read_Task(T_task_id)
  465. if err != nil {
  466. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  467. c.ServeJSON()
  468. return
  469. }
  470. is := Task.Del_TaskData(Task_r.T_task_id, strconv.Itoa(Id))
  471. if !is {
  472. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  473. c.ServeJSON()
  474. return
  475. }
  476. System.Add_UserLogs_T(T_uuid, "本地版-任务数据", "删除"+Task_r.T_name, Task_r.T_task_id+"|"+strconv.Itoa(Id))
  477. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  478. c.ServeJSON()
  479. return
  480. }
  481. // 删除-
  482. func (c *TaskDataController) TaskData_Del_t_id() {
  483. // 获取登录用户的uuid
  484. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  485. Id := c.GetString("Id")
  486. T_task_id := c.GetString("T_task_id")
  487. Task_r, err := NatsServer.Read_Task(T_task_id)
  488. if err != nil {
  489. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  490. c.ServeJSON()
  491. return
  492. }
  493. is := Task.Del_TaskData_t_id(Task_r.T_task_id, Id)
  494. if !is {
  495. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  496. c.ServeJSON()
  497. return
  498. }
  499. System.Add_UserLogs_T(T_uuid, "本地版-任务数据", "删除"+Task_r.T_name, Task_r.T_task_id+"|"+Id)
  500. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  501. c.ServeJSON()
  502. return
  503. }
  504. // 列表 - 接口
  505. func (c *TaskDataController) Export_Data_Excel() {
  506. Time_start := c.GetString("Time_start")
  507. Time_end := c.GetString("Time_end")
  508. T_sn_str := c.GetString("T_sn_list") //865901058809339,865901058815849,865901058818991,865901058810568
  509. //T_id, err := c.GetInt("T_id")
  510. //if err != nil {
  511. // T_id = -1
  512. //
  513. //}
  514. T_task_id := c.GetString("T_task_id")
  515. Task_r, err := NatsServer.Read_Task(T_task_id)
  516. if err != nil {
  517. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  518. c.ServeJSON()
  519. return
  520. }
  521. if Task_r.T_collection_state == 2 {
  522. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  523. c.ServeJSON()
  524. return
  525. }
  526. T_sn_list := strings.Split(T_sn_str, ",")
  527. DeviceSensor_data_list := []Task.TaskData_{}
  528. for _, v := range T_sn_list {
  529. DeviceSensor_data, _ := Task.Read_TaskData_ById_List(Task_r.T_task_id, v, "", Time_start, Time_end, 1, 9999)
  530. DeviceSensor_data_list = append(DeviceSensor_data_list, DeviceSensor_data...)
  531. }
  532. f := excelize.NewFile() // 设置单元格的值
  533. // 这里设置表头
  534. f.SetCellValue("Sheet1", "A1", "编号")
  535. f.SetCellValue("Sheet1", "B1", "SN")
  536. f.SetCellValue("Sheet1", "C1", "温度℃")
  537. f.SetCellValue("Sheet1", "D1", "湿度%")
  538. f.SetCellValue("Sheet1", "E1", "记录时间")
  539. // 设置列宽
  540. f.SetColWidth("Sheet1", "A", "A", 7)
  541. f.SetColWidth("Sheet1", "B", "B", 20)
  542. f.SetColWidth("Sheet1", "C", "C", 10)
  543. f.SetColWidth("Sheet1", "D", "D", 10)
  544. f.SetColWidth("Sheet1", "E", "E", 22)
  545. line := 1
  546. // 循环写入数据
  547. for _, v := range DeviceSensor_data_list {
  548. line++
  549. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), v.T_id)
  550. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v.T_sn)
  551. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), strconv.FormatFloat(float64(v.T_t), 'f', 1, 64))
  552. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), strconv.FormatFloat(float64(v.T_rh), 'f', 1, 64))
  553. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v.T_time)
  554. }
  555. fmt.Println("DeviceSensor_data:", len(DeviceSensor_data_list))
  556. lib.Create_Dir("./ofile")
  557. timeStr := time.Now().Format("20060102150405")
  558. // 保存文件
  559. if err := f.SaveAs("ofile/" + timeStr + ".xlsx"); err != nil {
  560. fmt.Println(err)
  561. }
  562. if !lib.Pload_qiniu("ofile/"+timeStr+".xlsx", "ofile/"+timeStr+".xlsx") {
  563. c.Data["json"] = lib.JSONS{Code: 203, Msg: "oss!"}
  564. c.ServeJSON()
  565. return
  566. }
  567. //删除目录
  568. err = os.Remove("ofile/" + timeStr + ".xlsx")
  569. if err != nil {
  570. fmt.Println(err)
  571. }
  572. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: "https://bzdcoldverifyoss.baozhida.cn/" + "ofile/" + timeStr + ".xlsx"}
  573. c.ServeJSON()
  574. return
  575. }
  576. func (c *TaskDataController) Check() {
  577. T_task_id := c.GetString("T_task_id")
  578. Task_r, err := NatsServer.Read_Task(T_task_id)
  579. if Task_r.T_collection_state == 2 {
  580. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  581. c.ServeJSON()
  582. return
  583. }
  584. if err != nil {
  585. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  586. c.ServeJSON()
  587. return
  588. }
  589. type R_JSONS struct {
  590. T_sn string // SN
  591. T_id string // 编号
  592. T_unm int // 数据量
  593. T_time_interval int64 // 时间间隔
  594. Time_start string // 开始
  595. Time_end string // 结束
  596. Result int // 200 OK, 201 可以补 , 202 不能补
  597. Result_str string // 提示内容
  598. Result_Time_start string // 2022-8-05 21:01
  599. Result_Time_defect int64 // 缺失时间间隔
  600. }
  601. var r_jsons []R_JSONS
  602. List := Task.Read_TaskData_ById_ClassList(Task_r.T_task_id)
  603. for _, v := range List {
  604. var r_json R_JSONS
  605. r_json.T_sn = v.T_sn
  606. r_json.T_id = v.T_id
  607. r_json.Result = 200
  608. DeviceSensor_data := Task.Read_TaskData_ById_List_(Task_r.T_task_id, v.T_sn)
  609. r_json.T_unm = len(DeviceSensor_data)
  610. if r_json.T_unm > 2 {
  611. r_json.T_id = DeviceSensor_data[0].T_id
  612. r_json.Time_end = DeviceSensor_data[len(DeviceSensor_data)-1].T_time
  613. r_json.Time_start = DeviceSensor_data[0].T_time
  614. formatTime_a, _ := time.Parse("2006-1-2 15:04", DeviceSensor_data[0].T_time)
  615. formatTime_b, _ := time.Parse("2006-1-2 15:04", DeviceSensor_data[1].T_time)
  616. formatTime_x := formatTime_b.Unix() - formatTime_a.Unix()
  617. r_json.T_time_interval = formatTime_x
  618. println("formatTime_x:", v.T_id, v.T_sn, formatTime_x)
  619. if formatTime_x > 60*30 || formatTime_x < 60 {
  620. r_json.Result = 202
  621. r_json.Result_str = "数据异常(数据的第一个时间与第二个时间相差 " + strconv.FormatInt(formatTime_x, 10) + "秒),必须大于60秒,小于30分钟"
  622. r_jsons = append(r_jsons, r_json)
  623. continue
  624. }
  625. for data_i := 2; data_i < len(DeviceSensor_data); data_i++ {
  626. formatTime_a = formatTime_b
  627. formatTime_b, _ = time.Parse("2006-1-2 15:04", DeviceSensor_data[data_i].T_time)
  628. formatTime_ := formatTime_b.Unix() - formatTime_a.Unix()
  629. println("formatTime_x-:", formatTime_)
  630. if formatTime_ < formatTime_x {
  631. r_json.Result = 202
  632. r_json.Result_str = "开始时间:" + DeviceSensor_data[data_i-1].T_time + " 离下一条时间间隔:" + strconv.FormatInt(formatTime_, 10) + "秒,间隔小于时间间隔,不能自动补充"
  633. break
  634. }
  635. if formatTime_x != formatTime_ {
  636. if formatTime_ > 60*30 {
  637. r_json.Result = 202
  638. r_json.Result_str = "开始时间:" + DeviceSensor_data[data_i-1].T_time + " 离下一条时间间隔:" + strconv.FormatInt(formatTime_, 10) + "秒,相差时间大于30分钟,不能自动补充"
  639. break
  640. }
  641. r_json.Result = 201
  642. r_json.Result_str = "开始时间:" + DeviceSensor_data[data_i-1].T_time + " 离下一条时间间隔:" + strconv.FormatInt(formatTime_, 10) + "秒"
  643. r_json.Result_Time_start = DeviceSensor_data[data_i-1].T_time
  644. r_json.Result_Time_defect = formatTime_
  645. println(r_json.Result_str)
  646. break
  647. }
  648. }
  649. } else {
  650. r_json.Result = 202
  651. r_json.Result_str = "数据量太少 必须大于 2条以上!"
  652. }
  653. r_jsons = append(r_jsons, r_json)
  654. }
  655. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  656. c.ServeJSON()
  657. return
  658. }
  659. func (c *TaskDataController) Check_Asyn() {
  660. T_task_id := c.GetString("T_task_id")
  661. Task_r, err := NatsServer.Read_Task(T_task_id)
  662. if Task_r.T_collection_state == 2 {
  663. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  664. c.ServeJSON()
  665. return
  666. }
  667. if err != nil {
  668. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  669. c.ServeJSON()
  670. return
  671. }
  672. type R_JSONS struct {
  673. T_sn string // SN
  674. T_id string // 编号
  675. T_unm int // 数据量
  676. T_time_interval int64 // 时间间隔
  677. Time_start string // 开始
  678. Time_end string // 结束
  679. Result int // 200 OK, 201 可以补 , 202 不能补
  680. Result_str string // 提示内容
  681. Result_Time_start string // 2022-8-05 21:01
  682. Result_Time_defect int64 // 缺失时间间隔
  683. }
  684. List := Task.Read_TaskData_ById_ClassList(Task_r.T_task_id)
  685. r_jsons := make([]R_JSONS, len(List))
  686. var limitMaxNum = 10
  687. var chData = make(chan int, limitMaxNum)
  688. var jobGroup sync.WaitGroup
  689. var tasknum = len(List)
  690. for i := 0; i < tasknum; i++ {
  691. chData <- 1
  692. jobGroup.Add(1)
  693. go func(index int, wg *sync.WaitGroup, res *[]R_JSONS) {
  694. defer wg.Done()
  695. var r_json R_JSONS
  696. r_json.T_sn = List[index].T_sn
  697. r_json.T_id = List[index].T_id
  698. r_json.Result = 200
  699. DeviceSensor_data := Task.Read_TaskData_ById_List_(Task_r.T_task_id, List[index].T_sn)
  700. r_json.T_unm = len(DeviceSensor_data)
  701. if r_json.T_unm > 2 {
  702. r_json.T_id = DeviceSensor_data[0].T_id
  703. r_json.Time_end = DeviceSensor_data[len(DeviceSensor_data)-1].T_time
  704. r_json.Time_start = DeviceSensor_data[0].T_time
  705. formatTime_a, _ := time.Parse("2006-1-2 15:04", DeviceSensor_data[0].T_time)
  706. formatTime_b, _ := time.Parse("2006-1-2 15:04", DeviceSensor_data[1].T_time)
  707. formatTime_x := formatTime_b.Unix() - formatTime_a.Unix()
  708. r_json.T_time_interval = formatTime_x
  709. println("formatTime_x:", List[index].T_id, List[index].T_sn, formatTime_x)
  710. if formatTime_x > 60*30 || formatTime_x < 60 {
  711. r_json.Result = 202
  712. r_json.Result_str = "数据异常(数据的第一个时间与第二个时间相差 " + strconv.FormatInt(formatTime_x, 10) + "秒),必须大于60秒,小于30分钟"
  713. *res = append(*res, r_json)
  714. <-chData
  715. return
  716. }
  717. for data_i := 2; data_i < len(DeviceSensor_data); data_i++ {
  718. formatTime_a = formatTime_b
  719. formatTime_b, _ = time.Parse("2006-1-2 15:04", DeviceSensor_data[data_i].T_time)
  720. formatTime_ := formatTime_b.Unix() - formatTime_a.Unix()
  721. if formatTime_ < formatTime_x {
  722. println("formatTime_x-:", formatTime_)
  723. r_json.Result = 202
  724. r_json.Result_str = "开始时间:" + DeviceSensor_data[data_i-1].T_time + " 离下一条时间间隔:" + strconv.FormatInt(formatTime_, 10) + "秒,间隔小于时间间隔,不能自动补充"
  725. break
  726. }
  727. if formatTime_x != formatTime_ {
  728. if formatTime_ > 60*30 {
  729. println("formatTime_x-:", formatTime_)
  730. r_json.Result = 202
  731. r_json.Result_str = "开始时间:" + DeviceSensor_data[data_i-1].T_time + " 离下一条时间间隔:" + strconv.FormatInt(formatTime_, 10) + "秒,相差时间大于30分钟,不能自动补充"
  732. break
  733. }
  734. r_json.Result = 202
  735. r_json.Result_str = "开始时间:" + DeviceSensor_data[data_i-1].T_time + " 离下一条时间间隔:" + strconv.FormatInt(formatTime_, 10) + "秒"
  736. r_json.Result_Time_start = DeviceSensor_data[data_i-1].T_time
  737. r_json.Result_Time_defect = formatTime_
  738. println(r_json.Result_str)
  739. break
  740. }
  741. }
  742. } else {
  743. r_json.Result = 202
  744. r_json.Result_str = "数据量太少 必须大于 2条以上!"
  745. }
  746. *res = append(*res, r_json)
  747. <-chData
  748. }(i, &jobGroup, &r_jsons)
  749. }
  750. //使用Wait等待所有任务执行完毕
  751. jobGroup.Wait()
  752. jsonsMap := map[string]R_JSONS{}
  753. resp := make([]R_JSONS, 0)
  754. for _, json := range r_jsons {
  755. jsonsMap[json.T_id] = json
  756. }
  757. for _, v := range List {
  758. resp = append(resp, jsonsMap[v.T_id])
  759. }
  760. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: resp}
  761. c.ServeJSON()
  762. return
  763. }
  764. // 打包数据本地数据
  765. func (c *TaskDataController) TaskData_Import_TaskData() {
  766. // 获取登录用户的uuid
  767. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  768. T_task_id := c.GetString("T_task_id")
  769. _, err := NatsServer.Read_Task(T_task_id)
  770. if err != nil {
  771. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  772. c.ServeJSON()
  773. return
  774. }
  775. if err = lib.Create_Dir(conf.Sql_Temp_Dir); err != nil {
  776. logs.Println("创建sql临时文件失败")
  777. }
  778. sql_file := fmt.Sprintf("%sZ_TaskData_%s.sql", conf.Sql_Temp_Dir, T_task_id)
  779. org, err := Task.Dump_TaskData(T_task_id, conf.MysqlServer2_Username, conf.MysqlServer2_Password, conf.MysqlServer2_UrlPort, conf.MysqlServer2_Database, sql_file)
  780. if err != nil {
  781. c.Data["json"] = lib.JSONS{Code: 202, Msg: "z_task_data_" + T_task_id + "线上数据导出失败!"}
  782. c.ServeJSON()
  783. return
  784. }
  785. System.Add_UserLogs_T(T_uuid, "本地版-任务数据-打包本地数据", "导出线上数据Z_TaskData_"+T_task_id, org)
  786. i := 0
  787. flag := false
  788. Task.CREATE_TaskData(conf.Local_AliasName, T_task_id)
  789. for i < 10 {
  790. Task.Truncate_TaskData(conf.Local_AliasName, T_task_id)
  791. org, err = Task.Insert_TaskData(conf.MysqlServer_Username, conf.MysqlServer_Password, conf.MysqlServer_UrlPort, conf.MysqlServer_Database, sql_file)
  792. if err != nil {
  793. logs.Println("任务数据-打包本地数据", "线下导入数据Z_TaskData_"+T_task_id, err.Error())
  794. } else {
  795. if Task.Check_TaskData_Num(T_task_id) {
  796. System.Add_UserLogs_T(T_uuid, "本地版-任务数据-打包本地数据", "线下导入数据Z_TaskData_"+T_task_id, org)
  797. flag = true
  798. break
  799. }
  800. }
  801. i++
  802. }
  803. // 重试10次后仍然没有成功导入数据
  804. if !flag {
  805. c.Data["json"] = lib.JSONS{Code: 202, Msg: "z_task_data_" + T_task_id + "线下导入数据失败!"}
  806. c.ServeJSON()
  807. return
  808. }
  809. //删除导出的sql文件
  810. _ = os.Remove(sql_file)
  811. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  812. c.ServeJSON()
  813. }
  814. // 更新线上数据
  815. func (c *TaskDataController) TaskData_Up_TaskData() {
  816. // 获取登录用户的uuid
  817. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  818. T_task_id := c.GetString("T_task_id")
  819. Task_r, err := NatsServer.Read_Task(T_task_id)
  820. if err != nil {
  821. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  822. c.ServeJSON()
  823. return
  824. }
  825. if err = lib.Create_Dir(conf.Sql_Temp_Dir); err != nil {
  826. logs.Println("创建sql临时文件失败")
  827. }
  828. sql_file := fmt.Sprintf("%sZ_TaskData_%s.sql", conf.Sql_Temp_Dir, T_task_id)
  829. org, err := Task.Dump_TaskData(T_task_id, conf.MysqlServer_Username, conf.MysqlServer_Password, conf.MysqlServer_UrlPort, conf.MysqlServer_Database, sql_file)
  830. if err != nil {
  831. logs.Println(T_uuid, "任务数据-更新线上数据", "导出线下数据Z_TaskData_"+T_task_id, err.Error())
  832. c.Data["json"] = lib.JSONS{Code: 202, Msg: "z_task_data_" + T_task_id + "线下数据导出失败!"}
  833. c.ServeJSON()
  834. return
  835. }
  836. System.Add_UserLogs_T(T_uuid, "本地版-任务数据-更新线上数据", "线上导入数据Z_TaskData_"+T_task_id, org)
  837. i := 0
  838. flag := false
  839. for i < 10 {
  840. Task.Truncate_TaskData(conf.Server_AliasName, T_task_id)
  841. org, err = Task.Insert_TaskData(conf.MysqlServer2_Username, conf.MysqlServer2_Password, conf.MysqlServer2_UrlPort, conf.MysqlServer2_Database, sql_file)
  842. if err != nil {
  843. logs.Println(T_uuid, "任务数据-更新线上数据", "线上导入数据Z_TaskData_"+T_task_id, err.Error())
  844. } else {
  845. if Task.Check_TaskData_Num(T_task_id) {
  846. System.Add_UserLogs_T(T_uuid, "本地版-任务数据-更新线上数据", "线上导入数据Z_TaskData_"+T_task_id, org)
  847. flag = true
  848. break
  849. }
  850. }
  851. i++
  852. }
  853. // 重试10次后仍然没有成功导入数据
  854. if !flag {
  855. c.Data["json"] = lib.JSONS{Code: 202, Msg: "z_task_data_" + T_task_id + "线上导入数据失败!"}
  856. c.ServeJSON()
  857. return
  858. }
  859. //删除导出的sql文件
  860. _ = os.Remove(sql_file)
  861. // 线上数据更新后 将当前任务 交付审核 标志 为 1
  862. Task_r.T_delivery_state = 1
  863. err = NatsServer.Update_Task(Task_r)
  864. if err != nil {
  865. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  866. c.ServeJSON()
  867. return
  868. }
  869. // 向线上用户日志表写入数据
  870. System.Add_UserLogs_T(T_uuid, "本地版-任务", "修改", Task_r)
  871. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  872. c.ServeJSON()
  873. }
  874. // 更新线上数据后台执行
  875. func (c *TaskDataController) TaskData_Up_TaskData_Back() {
  876. // 获取登录用户的uuid
  877. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  878. T_task_id := c.GetString("T_task_id")
  879. Task_r, err := NatsServer.Read_Task(T_task_id)
  880. if err != nil {
  881. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  882. c.ServeJSON()
  883. return
  884. }
  885. if Task_r.T_delivery_state == 2 {
  886. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  887. c.ServeJSON()
  888. return
  889. }
  890. // 采集中
  891. Task_r.T_delivery_state = 2
  892. err = NatsServer.Update_Task(Task_r)
  893. if err != nil {
  894. c.Data["json"] = lib.JSONS{Code: 202, Msg: "提交失败!"}
  895. c.ServeJSON()
  896. return
  897. }
  898. data := Nats.Up_TaskData_Back{
  899. T_uuid: T_uuid,
  900. Task: Task_r,
  901. }
  902. b, _ := msgpack.Marshal(&data)
  903. _ = lib.Nats.Publish("ColdVerify_Local_Up_TaskData", b)
  904. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  905. c.ServeJSON()
  906. return
  907. }
  908. // CopyFromPosition 数据拷贝
  909. func (c *TaskDataController) CopyFromPosition() {
  910. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  911. //if !b_ {
  912. // c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  913. // c.ServeJSON()
  914. // return
  915. //}
  916. StartTime := c.GetString("StartTime")
  917. startTime, ok := lib.TimeStrToTime(StartTime)
  918. if !ok {
  919. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  920. c.ServeJSON()
  921. return
  922. }
  923. EndTime := c.GetString("EndTime")
  924. endTime, ok := lib.TimeStrToTime(EndTime)
  925. if !ok {
  926. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  927. c.ServeJSON()
  928. return
  929. }
  930. CopyTime := c.GetString("CopyTime")
  931. copyTime, ok := lib.TimeStrToTime(CopyTime)
  932. if !ok {
  933. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  934. c.ServeJSON()
  935. return
  936. }
  937. CopyEndTime := copyTime.Add(endTime.Sub(startTime)).Format("2006-01-02 15:04:05")
  938. // 时间间隔 分钟
  939. T_saveT, _ := c.GetInt("T_saveT")
  940. SN_List := strings.Split(strings.Trim(c.GetString("SN_List"), "|"), "|")
  941. T_task_id := c.GetString("T_task_id")
  942. Task_r, err := NatsServer.Read_Task(T_task_id)
  943. if err != nil {
  944. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  945. c.ServeJSON()
  946. return
  947. }
  948. if Task_r.T_collection_state == 2 {
  949. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  950. c.ServeJSON()
  951. return
  952. }
  953. for _, v := range SN_List {
  954. sn_id := strings.Split(v, ",")
  955. if len(sn_id) != 2 {
  956. continue
  957. }
  958. sn, id_str := sn_id[0], sn_id[1]
  959. Task.DeleteTaskDataByTimeRange(Task_r.T_task_id, sn, id_str, CopyTime, CopyEndTime)
  960. List, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, sn, id_str, StartTime, EndTime, 0, 9999)
  961. ct := copyTime
  962. go func(TaskDataList []Task.TaskData_, task_id string, T_saveT int) {
  963. for _, taskData := range TaskDataList {
  964. taskData.T_time = ct.Format("2006-01-02 15:04:05")
  965. Task.InsertTaskData(task_id, taskData)
  966. ct = ct.Add(time.Second * time.Duration(T_saveT))
  967. }
  968. }(List, Task_r.T_task_id, T_saveT)
  969. }
  970. System.Add_UserLogs_T(T_uuid, "数据复制", fmt.Sprintf("数据复制(%s)[%s|%s],复制时间:%s,,时间间隔:%d", T_task_id, StartTime, EndTime, CopyTime, T_saveT), SN_List)
  971. c.Data["json"] = lib.JSONS{200, "数据复制已提交后台处理!", nil}
  972. c.ServeJSON()
  973. return
  974. }
  975. // RepairSensorData 数据补漏
  976. func (c *TaskDataController) RepairSensorData() {
  977. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  978. //if !b_ {
  979. // c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  980. // c.ServeJSON()
  981. // return
  982. //}
  983. StartTime := c.GetString("StartTime")
  984. _, ok := lib.TimeStrToTime(StartTime)
  985. if !ok {
  986. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  987. c.ServeJSON()
  988. return
  989. }
  990. EndTime := c.GetString("EndTime")
  991. _, ok = lib.TimeStrToTime(EndTime)
  992. if !ok {
  993. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  994. c.ServeJSON()
  995. return
  996. }
  997. // 时间间隔 秒
  998. saveTime, _ := c.GetInt("T_saveT")
  999. SN_List := strings.Split(strings.Trim(c.GetString("SN_List"), "|"), "|")
  1000. T_task_id := c.GetString("T_task_id")
  1001. Task_r, err := NatsServer.Read_Task(T_task_id)
  1002. if err != nil {
  1003. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  1004. c.ServeJSON()
  1005. return
  1006. }
  1007. if Task_r.T_collection_state == 2 {
  1008. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  1009. c.ServeJSON()
  1010. return
  1011. }
  1012. num := 0
  1013. for _, v := range SN_List {
  1014. sn_id := strings.Split(v, ",")
  1015. if len(sn_id) != 2 {
  1016. continue
  1017. }
  1018. sn, id_str := sn_id[0], sn_id[1]
  1019. list, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, sn, id_str, StartTime, EndTime, 0, 9999)
  1020. for i := 0; i < len(list)-1; i++ {
  1021. current := list[i].T_time
  1022. next := list[i+1].T_time
  1023. c, _ := time.Parse("2006-01-02 15:04:05", current)
  1024. n, _ := time.Parse("2006-01-02 15:04:05", next)
  1025. interval := n.Unix() - c.Unix()
  1026. logs.Debug("时间间隔:", interval, "保存时间:", saveTime)
  1027. fmt.Println("当前:", current, "下一个:", next)
  1028. if int(interval) > saveTime {
  1029. ttInterval := list[i+1].T_t - list[i].T_t
  1030. ttt := list[i].T_t // 温度临时变量
  1031. trhInterval := list[i+1].T_rh - list[i].T_rh
  1032. trht := list[i].T_rh //湿度临时变量
  1033. count := (int(interval) - saveTime) / saveTime
  1034. if int(interval)%saveTime != 0 {
  1035. count++
  1036. }
  1037. num += count
  1038. for k := 0; k < count; k++ {
  1039. t := c.Add(time.Second * time.Duration(saveTime)).Format("2006-01-02 15:04:05") //时间临时变量
  1040. ttt += ttInterval / float32(count)
  1041. trht += trhInterval / float32(count)
  1042. Task.InsertTaskData(Task_r.T_task_id, Task.TaskData_{
  1043. T_sn: list[i].T_sn,
  1044. T_id: list[i].T_id,
  1045. T_t: ttt,
  1046. T_rh: trht,
  1047. T_time: t,
  1048. })
  1049. c = c.Add(time.Second * time.Duration(saveTime))
  1050. }
  1051. }
  1052. }
  1053. }
  1054. System.Add_UserLogs_T(T_uuid, "数据补漏", fmt.Sprintf("数据补漏(%s)[%s|%s],时间间隔:%d", T_task_id, StartTime, EndTime, saveTime), SN_List)
  1055. c.Data["json"] = lib.JSONS{200, fmt.Sprintf("补漏完成!共补漏%d条数据", num), nil}
  1056. c.ServeJSON()
  1057. return
  1058. }
  1059. // DataSensorDataTrend 数据趋势
  1060. func (c *TaskDataController) DataSensorDataTrend() {
  1061. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1062. //if !b_ {
  1063. // c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  1064. // c.ServeJSON()
  1065. // return
  1066. //}
  1067. StartTime := c.GetString("StartTime")
  1068. _, ok := lib.TimeStrToTime(StartTime)
  1069. if !ok {
  1070. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1071. c.ServeJSON()
  1072. return
  1073. }
  1074. EndTime := c.GetString("EndTime")
  1075. _, ok = lib.TimeStrToTime(EndTime)
  1076. if !ok {
  1077. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1078. c.ServeJSON()
  1079. return
  1080. }
  1081. // 时间间隔 秒
  1082. saveTime, _ := c.GetInt("T_saveT")
  1083. SN_List := strings.Split(strings.Trim(c.GetString("SN_List"), "|"), "|")
  1084. T_task_id := c.GetString("T_task_id")
  1085. Task_r, err := NatsServer.Read_Task(T_task_id)
  1086. if err != nil {
  1087. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  1088. c.ServeJSON()
  1089. return
  1090. }
  1091. if Task_r.T_collection_state == 2 {
  1092. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  1093. c.ServeJSON()
  1094. return
  1095. }
  1096. for _, v := range SN_List {
  1097. sn_id := strings.Split(v, ",")
  1098. if len(sn_id) != 2 {
  1099. continue
  1100. }
  1101. sn, id_str := sn_id[0], sn_id[1]
  1102. list, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, sn, id_str, StartTime, EndTime, 0, 9999)
  1103. if len(list) == 0 {
  1104. continue
  1105. }
  1106. Task.DeleteTaskDataByTimeRange(Task_r.T_task_id, sn, id_str, StartTime, EndTime)
  1107. first := list[0]
  1108. last := list[len(list)-1]
  1109. current, _ := time.Parse("2006-01-02 15:04:05", first.T_time)
  1110. next, _ := time.Parse("2006-01-02 15:04:05", last.T_time)
  1111. interval := next.Sub(current).Seconds() / float64(saveTime)
  1112. ttInterval := (last.T_t - first.T_t) / float32(interval)
  1113. trhInterval := (last.T_rh - first.T_rh) / float32(interval)
  1114. tt := first.T_t
  1115. ttrh := first.T_rh
  1116. for current.Unix() < next.Unix() {
  1117. tt += ttInterval
  1118. ttrh += trhInterval
  1119. ttime := current.Format("2006-01-02 15:04:05")
  1120. Task.InsertTaskData(Task_r.T_task_id, Task.TaskData_{
  1121. //加保存时间
  1122. T_sn: first.T_sn,
  1123. T_id: id_str,
  1124. T_t: tt,
  1125. T_rh: ttrh,
  1126. T_time: ttime,
  1127. })
  1128. current = current.Add(time.Second * time.Duration(saveTime))
  1129. }
  1130. }
  1131. System.Add_UserLogs_T(T_uuid, "数据趋势", fmt.Sprintf("数据趋势(%s)[%s|%s],时间间隔:%d", T_task_id, StartTime, EndTime, saveTime), SN_List)
  1132. c.Data["json"] = lib.JSONS{200, "设置趋势操作成功", nil}
  1133. c.ServeJSON()
  1134. return
  1135. }
  1136. // UpdateRand 数据随机
  1137. func (c *TaskDataController) UpdateRand() {
  1138. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1139. //if !b_ {
  1140. // c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  1141. // c.ServeJSON()
  1142. // return
  1143. //}
  1144. StartTime := c.GetString("StartTime")
  1145. _, ok := lib.TimeStrToTime(StartTime)
  1146. if !ok {
  1147. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1148. c.ServeJSON()
  1149. return
  1150. }
  1151. EndTime := c.GetString("EndTime")
  1152. _, ok = lib.TimeStrToTime(EndTime)
  1153. if !ok {
  1154. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1155. c.ServeJSON()
  1156. return
  1157. }
  1158. TemperatureMin, _ := c.GetInt("TemperatureMin") // 温度
  1159. TemperatureMax, _ := c.GetInt("TemperatureMax")
  1160. HumidityMax, _ := c.GetInt("HumidityMax") // 湿度
  1161. HumidityMin, _ := c.GetInt("HumidityMin")
  1162. SN_List := strings.Split(strings.Trim(c.GetString("SN_List"), "|"), "|")
  1163. T_task_id := c.GetString("T_task_id")
  1164. Task_r, err := NatsServer.Read_Task(T_task_id)
  1165. if err != nil {
  1166. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  1167. c.ServeJSON()
  1168. return
  1169. }
  1170. if Task_r.T_collection_state == 2 {
  1171. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  1172. c.ServeJSON()
  1173. return
  1174. }
  1175. for _, v := range SN_List {
  1176. sn_id := strings.Split(v, ",")
  1177. if len(sn_id) != 2 {
  1178. continue
  1179. }
  1180. sn, id := sn_id[0], sn_id[1]
  1181. Task.UpdateTaskDataTemperatureAndHumidityRandom(Task_r.T_task_id, sn, id, StartTime, EndTime, TemperatureMax, TemperatureMin, HumidityMax, HumidityMin)
  1182. }
  1183. System.Add_UserLogs_T(T_uuid, "数据随机", fmt.Sprintf("数据随机(%s)[%s|%s],温度[%d-%d],湿度[%d-%d]", T_task_id, StartTime, EndTime, TemperatureMin, TemperatureMax, HumidityMax, HumidityMin), SN_List)
  1184. //反馈成功
  1185. c.Data["json"] = lib.JSONS{200, "调整随机偏移值成功!", nil}
  1186. c.ServeJSON()
  1187. return
  1188. }
  1189. // UpdateFix 更新固定值
  1190. func (c *TaskDataController) UpdateFix() {
  1191. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1192. //if !b_ {
  1193. // c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  1194. // c.ServeJSON()
  1195. // return
  1196. //}
  1197. StartTime := c.GetString("StartTime")
  1198. _, ok := lib.TimeStrToTime(StartTime)
  1199. if !ok {
  1200. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1201. c.ServeJSON()
  1202. return
  1203. }
  1204. EndTime := c.GetString("EndTime")
  1205. _, ok = lib.TimeStrToTime(EndTime)
  1206. if !ok {
  1207. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1208. c.ServeJSON()
  1209. return
  1210. }
  1211. FixTemperature := c.GetString("FixTemperature")
  1212. FixHumidity := c.GetString("FixHumidity")
  1213. //2.得到数据进行统一设置访问修改
  1214. humidity, _ := strconv.ParseFloat(FixHumidity, 64)
  1215. temperature, _ := strconv.ParseFloat(FixTemperature, 64)
  1216. SN_List := strings.Split(strings.Trim(c.GetString("SN_List"), "|"), "|")
  1217. T_task_id := c.GetString("T_task_id")
  1218. Task_r, err := NatsServer.Read_Task(T_task_id)
  1219. if err != nil {
  1220. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  1221. c.ServeJSON()
  1222. return
  1223. }
  1224. if Task_r.T_collection_state == 2 {
  1225. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  1226. c.ServeJSON()
  1227. return
  1228. }
  1229. //3.循环更新数据
  1230. for _, v := range SN_List {
  1231. sn_id := strings.Split(v, ",")
  1232. if len(sn_id) != 2 {
  1233. continue
  1234. }
  1235. sn, id := sn_id[0], sn_id[1]
  1236. Task.UpdateTaskDataTemperatureAndHumidity(Task_r.T_task_id, sn, id, StartTime, EndTime, temperature, humidity)
  1237. }
  1238. System.Add_UserLogs_T(T_uuid, "更新固定值", fmt.Sprintf("更新固定值(%s)[%s|%s],温度[%f],湿度[%f]", T_task_id, StartTime, EndTime, temperature, humidity), SN_List)
  1239. //4.反馈成功
  1240. c.Data["json"] = lib.JSONS{200, "调整固定偏移值成功!", nil}
  1241. c.ServeJSON()
  1242. }
  1243. // DataSensorDataSmooth 数据平滑
  1244. func (c *TaskDataController) DataSensorDataSmooth() {
  1245. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1246. //if !b_ {
  1247. // c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  1248. // c.ServeJSON()
  1249. // return
  1250. //}
  1251. StartTime := c.GetString("StartTime")
  1252. _, ok := lib.TimeStrToTime(StartTime)
  1253. if !ok {
  1254. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1255. c.ServeJSON()
  1256. return
  1257. }
  1258. EndTime := c.GetString("EndTime")
  1259. _, ok = lib.TimeStrToTime(EndTime)
  1260. if !ok {
  1261. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1262. c.ServeJSON()
  1263. return
  1264. }
  1265. tRange, _ := c.GetFloat("tRange")
  1266. hRange, _ := c.GetFloat("hRange")
  1267. SN_List := strings.Split(strings.Trim(c.GetString("SN_List"), "|"), "|")
  1268. T_task_id := c.GetString("T_task_id")
  1269. Task_r, err := NatsServer.Read_Task(T_task_id)
  1270. if err != nil {
  1271. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  1272. c.ServeJSON()
  1273. return
  1274. }
  1275. if Task_r.T_collection_state == 2 {
  1276. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  1277. c.ServeJSON()
  1278. return
  1279. }
  1280. var count int
  1281. for _, v := range SN_List {
  1282. sn_id := strings.Split(v, ",")
  1283. if len(sn_id) != 2 {
  1284. continue
  1285. }
  1286. sn := sn_id[0]
  1287. id_str := sn_id[1]
  1288. list, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, sn, id_str, StartTime, EndTime, 0, 9999)
  1289. for i := 1; i < len(list); i++ {
  1290. n := list[i-1]
  1291. old := list[i]
  1292. newO := list[i]
  1293. //变化差
  1294. var tInterval = old.T_t - n.T_t
  1295. var hInterval = old.T_rh - n.T_rh
  1296. fmt.Println("温度:", n.T_t, "温度next:", old.T_t, "差值:", n.T_t-old.T_t)
  1297. if tRange != 0 {
  1298. if tInterval > float32(tRange) {
  1299. newO.T_t = n.T_t + float32(tRange)
  1300. } else if tInterval < -float32(tRange) {
  1301. newO.T_t = n.T_t - float32(tRange)
  1302. }
  1303. }
  1304. if hRange != 0 {
  1305. if hInterval > float32(hRange) {
  1306. newO.T_rh = n.T_rh + float32(hRange)
  1307. } else if hInterval < -float32(hRange) {
  1308. newO.T_rh = n.T_rh - float32(hRange)
  1309. }
  1310. }
  1311. if old.T_rh != newO.T_rh || old.T_t != newO.T_t {
  1312. fmt.Println("原始数据:", old, "新数据:", newO)
  1313. list[i] = newO
  1314. Task.UpdateTaskData(Task_r.T_task_id, sn, id_str, old, newO)
  1315. count++
  1316. }
  1317. }
  1318. }
  1319. System.Add_UserLogs_T(T_uuid, "数据平滑", fmt.Sprintf("数据平滑(%s)[%s|%s],温度[%f],湿度[%f]", T_task_id, StartTime, EndTime, tRange, hRange), SN_List)
  1320. c.Data["json"] = lib.JSONS{200, "操作成功处理" + fmt.Sprint(count) + "条数据", nil}
  1321. c.ServeJSON()
  1322. }
  1323. // CopyFromPosition 数据拷贝平均值
  1324. func (c *TaskDataController) CopyFromPositionAverageSN() {
  1325. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1326. //if !b_ {
  1327. // c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  1328. // c.ServeJSON()
  1329. // return
  1330. //}
  1331. StartTime := c.GetString("StartTime")
  1332. startTime, ok := lib.TimeStrToTime(StartTime)
  1333. if !ok {
  1334. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1335. c.ServeJSON()
  1336. return
  1337. }
  1338. EndTime := c.GetString("EndTime")
  1339. endTime, ok := lib.TimeStrToTime(EndTime)
  1340. if !ok {
  1341. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1342. c.ServeJSON()
  1343. return
  1344. }
  1345. CopyTime := c.GetString("CopyTime")
  1346. CopySN := c.GetString("CopySN")
  1347. CopyID := c.GetString("CopyID")
  1348. copyTime, ok := lib.TimeStrToTime(CopyTime)
  1349. // 时间间隔 s
  1350. T_saveT, _ := c.GetInt("T_saveT")
  1351. if !ok {
  1352. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1353. c.ServeJSON()
  1354. return
  1355. }
  1356. CopyEndTime := copyTime.Add(endTime.Sub(startTime)).Format("2006-01-02 15:04:05")
  1357. SN_List := strings.Split(strings.Trim(c.GetString("SN_List"), "|"), "|")
  1358. if len(SN_List) != 2 {
  1359. c.Data["json"] = lib.JSONS{Code: 202, Msg: "SN_List Err!"}
  1360. c.ServeJSON()
  1361. return
  1362. }
  1363. T_task_id := c.GetString("T_task_id")
  1364. Task_r, err := NatsServer.Read_Task(T_task_id)
  1365. if err != nil {
  1366. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  1367. c.ServeJSON()
  1368. return
  1369. }
  1370. if Task_r.T_collection_state == 2 {
  1371. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  1372. c.ServeJSON()
  1373. return
  1374. }
  1375. sn_id1 := strings.Split(SN_List[0], ",")
  1376. if len(sn_id1) != 2 {
  1377. c.Data["json"] = lib.JSONS{Code: 202, Msg: "SN_List Err!"}
  1378. c.ServeJSON()
  1379. return
  1380. }
  1381. sn1, id_str1 := sn_id1[0], sn_id1[1]
  1382. sn_id2 := strings.Split(SN_List[1], ",")
  1383. if len(sn_id2) != 2 {
  1384. c.Data["json"] = lib.JSONS{Code: 202, Msg: "SN_List Err!"}
  1385. c.ServeJSON()
  1386. return
  1387. }
  1388. sn2, id_str2 := sn_id2[0], sn_id2[1]
  1389. List1, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, sn1, id_str1, StartTime, EndTime, 0, 9999)
  1390. List2, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, sn2, id_str2, StartTime, EndTime, 0, 9999)
  1391. num := len(List1)
  1392. if len(List2) < len(List1) {
  1393. num = len(List2)
  1394. }
  1395. var list []Task.TaskData_
  1396. ct := copyTime
  1397. for i := 0; i < num; i++ {
  1398. if List1[i].T_time != List2[i].T_time {
  1399. c.Data["json"] = lib.JSONS{202, fmt.Sprintf("%s【%s】、%s【%s】时间不一致", List1[i].T_id, List1[i].T_time, List2[i].T_id, List2[i].T_time), nil}
  1400. c.ServeJSON()
  1401. return
  1402. //ct = ct.Add(time.Second * time.Duration(T_saveT))
  1403. //continue
  1404. }
  1405. T_t := (List1[i].T_t + List2[i].T_t) / 2
  1406. T_rh := (List1[i].T_rh + List2[i].T_rh) / 2
  1407. list = append(list, Task.TaskData_{
  1408. T_sn: CopySN,
  1409. T_id: CopyID,
  1410. T_t: T_t,
  1411. T_rh: T_rh,
  1412. T_time: ct.Format("2006-01-02 15:04:05"),
  1413. })
  1414. ct = ct.Add(time.Second * time.Duration(T_saveT))
  1415. }
  1416. Task.DeleteTaskDataByTimeRange(Task_r.T_task_id, CopySN, CopyID, CopyTime, CopyEndTime)
  1417. go func(TaskDataList []Task.TaskData_, task_id string) {
  1418. for _, taskData := range TaskDataList {
  1419. Task.InsertTaskData(task_id, taskData)
  1420. }
  1421. }(list, Task_r.T_task_id)
  1422. System.Add_UserLogs_T(T_uuid, "数据复制平均值", fmt.Sprintf("数据复制(%s)[%s|%s],复制时间:%s,,时间间隔:%d", T_task_id, StartTime, EndTime, CopyTime, T_saveT), SN_List)
  1423. c.Data["json"] = lib.JSONS{200, "数据复制已提交后台处理!", nil}
  1424. c.ServeJSON()
  1425. return
  1426. }
  1427. // CopyFromPosition 数据拷贝
  1428. func (c *TaskDataController) CopyFromPositionSN() {
  1429. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1430. //if !b_ {
  1431. // c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  1432. // c.ServeJSON()
  1433. // return
  1434. //}
  1435. StartTime := c.GetString("StartTime")
  1436. startTime, ok := lib.TimeStrToTime(StartTime)
  1437. if !ok {
  1438. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1439. c.ServeJSON()
  1440. return
  1441. }
  1442. EndTime := c.GetString("EndTime")
  1443. endTime, ok := lib.TimeStrToTime(EndTime)
  1444. if !ok {
  1445. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1446. c.ServeJSON()
  1447. return
  1448. }
  1449. CopyTime := c.GetString("CopyTime")
  1450. copyTime, ok := lib.TimeStrToTime(CopyTime)
  1451. CopySN := c.GetString("CopySN")
  1452. CopyID := c.GetString("CopyID")
  1453. if !ok {
  1454. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1455. c.ServeJSON()
  1456. return
  1457. }
  1458. CopyEndTime := copyTime.Add(endTime.Sub(startTime)).Format("2006-01-02 15:04:05")
  1459. // 时间间隔 分钟
  1460. T_saveT, _ := c.GetInt("T_saveT")
  1461. SN_List := strings.Split(strings.Trim(c.GetString("SN_List"), "|"), "|")
  1462. if len(SN_List) != 1 {
  1463. c.Data["json"] = lib.JSONS{202, "SN_List Err!", nil}
  1464. c.ServeJSON()
  1465. return
  1466. }
  1467. T_task_id := c.GetString("T_task_id")
  1468. Task_r, err := NatsServer.Read_Task(T_task_id)
  1469. if err != nil {
  1470. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  1471. c.ServeJSON()
  1472. return
  1473. }
  1474. if Task_r.T_collection_state == 2 {
  1475. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  1476. c.ServeJSON()
  1477. return
  1478. }
  1479. sn_id := strings.Split(SN_List[0], ",")
  1480. if len(sn_id) != 2 {
  1481. c.Data["json"] = lib.JSONS{202, "SN_List Err!", nil}
  1482. c.ServeJSON()
  1483. return
  1484. }
  1485. sn, id_str := sn_id[0], sn_id[1]
  1486. Task.DeleteTaskDataByTimeRange(Task_r.T_task_id, CopySN, CopyID, CopyTime, CopyEndTime)
  1487. List, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, sn, id_str, StartTime, EndTime, 0, 9999)
  1488. ct := copyTime
  1489. go func(TaskDataList []Task.TaskData_, task_id string, T_saveT int) {
  1490. for _, taskData := range TaskDataList {
  1491. taskData.T_time = ct.Format("2006-01-02 15:04:05")
  1492. taskData.T_sn = CopySN
  1493. taskData.T_id = CopyID
  1494. Task.InsertTaskData(task_id, taskData)
  1495. ct = ct.Add(time.Second * time.Duration(T_saveT))
  1496. }
  1497. }(List, Task_r.T_task_id, T_saveT)
  1498. System.Add_UserLogs_T(T_uuid, "数据复制", fmt.Sprintf("数据复制(%s)[%s|%s],复制时间:%s,,时间间隔:%d", T_task_id, StartTime, EndTime, CopyTime, T_saveT), SN_List)
  1499. c.Data["json"] = lib.JSONS{200, "数据复制已提交后台处理!", nil}
  1500. c.ServeJSON()
  1501. return
  1502. }
  1503. // 数据偏移到区间内
  1504. func (c *TaskDataController) DataSkewingInterval() {
  1505. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1506. //if !b_ {
  1507. // c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  1508. // c.ServeJSON()
  1509. // return
  1510. //}
  1511. StartTime := c.GetString("StartTime")
  1512. _, ok := lib.TimeStrToTime(StartTime)
  1513. if !ok {
  1514. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1515. c.ServeJSON()
  1516. return
  1517. }
  1518. EndTime := c.GetString("EndTime")
  1519. _, ok = lib.TimeStrToTime(EndTime)
  1520. if !ok {
  1521. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1522. c.ServeJSON()
  1523. return
  1524. }
  1525. TemperatureMin, _ := c.GetFloat("TemperatureMin") // 温度
  1526. TemperatureMax, _ := c.GetFloat("TemperatureMax")
  1527. Tmin, Tmax := TemperatureMin, TemperatureMax
  1528. SN_List := strings.Split(strings.Trim(c.GetString("SN_List"), "|"), "|")
  1529. T_task_id := c.GetString("T_task_id")
  1530. Task_r, err := NatsServer.Read_Task(T_task_id)
  1531. if err != nil {
  1532. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  1533. c.ServeJSON()
  1534. return
  1535. }
  1536. if Task_r.T_collection_state == 2 {
  1537. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  1538. c.ServeJSON()
  1539. return
  1540. }
  1541. errMsg := []string{}
  1542. for _, v := range SN_List {
  1543. sn_id := strings.Split(v, ",")
  1544. if len(sn_id) != 2 {
  1545. continue
  1546. }
  1547. sn, id := sn_id[0], sn_id[1]
  1548. min, max := Task.Read_TaskData_T_Min_Max(Task_r.T_task_id, sn, id, StartTime, EndTime)
  1549. if min < Tmin && max > Tmax {
  1550. errMsg = append(errMsg, fmt.Sprintf("【%s】最低温度[%.2f]低于给定的最低温度[%.2f],并且最高温度[%.2f]高于给定的最高温度[%.2f],无法偏移!", id, min, Tmin, max, Tmax))
  1551. continue
  1552. }
  1553. if min > Tmin && max < Tmax {
  1554. continue
  1555. //errMsg = append(errMsg, fmt.Sprintf("【%s】最低温度[%.2f]高于给定最低温度[%.2f],并且最高温度[%.2f]低于给定最高温度[%.2f],无须偏移!", id, min, Tmin, max, Tmax))
  1556. }
  1557. // 判断是否能向上偏移
  1558. if min < Tmin && max < Tmax && (Tmin-min+max) > Tmax {
  1559. errMsg = append(errMsg, fmt.Sprintf("【%s】偏移后最高温度[%.2f]将高于给定的最高温度[%.2f],无法偏移!", id, Tmin-min+max, Tmax))
  1560. continue
  1561. }
  1562. if max > Tmax && min > Tmin && (min-(max-Tmax)) < Tmin {
  1563. errMsg = append(errMsg, fmt.Sprintf("【%s】偏移后最低温度[%.2f]将低于给定的最低温度[%.2f],无法偏移!", id, min-(max-Tmax), Tmin))
  1564. continue
  1565. }
  1566. // 向上偏移
  1567. if min < Tmin && max < Tmax && (Tmin-min+max) <= Tmax {
  1568. Task.UpdateTaskDataTemperatureAndHumidity(Task_r.T_task_id, sn, id, StartTime, EndTime, Tmin-min, 0)
  1569. continue
  1570. }
  1571. // 向下偏移
  1572. if max > Tmax && min > Tmin && (min-(max-Tmax)) >= Tmin {
  1573. Task.UpdateTaskDataTemperatureAndHumidity(Task_r.T_task_id, sn, id, StartTime, EndTime, -(max - Tmax), 0)
  1574. continue
  1575. }
  1576. }
  1577. System.Add_UserLogs_T(T_uuid, "数据偏移到给定范围", fmt.Sprintf("数据偏移到给定范围(%s)[%s|%s],温度[%f-%f]", T_task_id, StartTime, EndTime, TemperatureMin, TemperatureMax), SN_List)
  1578. if len(errMsg) > 0 {
  1579. c.Data["json"] = lib.JSONS{202, "", errMsg}
  1580. c.ServeJSON()
  1581. return
  1582. }
  1583. //反馈成功
  1584. c.Data["json"] = lib.JSONS{200, "调整区间偏移值成功!", nil}
  1585. c.ServeJSON()
  1586. return
  1587. }
  1588. // 等比缩放
  1589. func (c *TaskDataController) DataGeometricScale() {
  1590. T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1591. //if !b_ {
  1592. // c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
  1593. // c.ServeJSON()
  1594. // return
  1595. //}
  1596. StartTime := c.GetString("StartTime")
  1597. _, ok := lib.TimeStrToTime(StartTime)
  1598. if !ok {
  1599. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1600. c.ServeJSON()
  1601. return
  1602. }
  1603. EndTime := c.GetString("EndTime")
  1604. _, ok = lib.TimeStrToTime(EndTime)
  1605. if !ok {
  1606. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1607. c.ServeJSON()
  1608. return
  1609. }
  1610. Temperature, _ := c.GetFloat("Temperature") // 温度比列
  1611. Humidity, _ := c.GetFloat("Humidity") // 适度比列
  1612. SN_List := strings.Split(strings.Trim(c.GetString("SN_List"), "|"), "|")
  1613. T_task_id := c.GetString("T_task_id")
  1614. Task_r, err := NatsServer.Read_Task(T_task_id)
  1615. if err != nil {
  1616. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  1617. c.ServeJSON()
  1618. return
  1619. }
  1620. if Task_r.T_collection_state == 2 {
  1621. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  1622. c.ServeJSON()
  1623. return
  1624. }
  1625. errMsg := []string{}
  1626. for _, v := range SN_List {
  1627. sn_id := strings.Split(v, ",")
  1628. if len(sn_id) != 2 {
  1629. continue
  1630. }
  1631. sn, id := sn_id[0], sn_id[1]
  1632. Task.UpdateTaskDataTemperatureAndHumidityByGeometric(Task_r.T_task_id, sn, id, StartTime, EndTime, Temperature, Humidity)
  1633. }
  1634. System.Add_UserLogs_T(T_uuid, "数据等比缩放", fmt.Sprintf("数据等比缩放(%s)[%s|%s],温度[%f-%f]", T_task_id, StartTime, EndTime, Temperature, Humidity), SN_List)
  1635. if len(errMsg) > 0 {
  1636. c.Data["json"] = lib.JSONS{202, "", errMsg}
  1637. c.ServeJSON()
  1638. return
  1639. }
  1640. //反馈成功
  1641. c.Data["json"] = lib.JSONS{200, "数据等比缩放成功!", nil}
  1642. c.ServeJSON()
  1643. return
  1644. }
  1645. // 存档列表
  1646. func (c *TaskDataController) TaskDataCopy_List() {
  1647. var r_jsons lib.R_JSONS
  1648. page, _ := c.GetInt("page")
  1649. if page < 1 {
  1650. page = 1
  1651. }
  1652. page_z, _ := c.GetInt("page_z")
  1653. if page_z < 1 {
  1654. page_z = conf.Page_size
  1655. }
  1656. T_task_id := c.GetString("T_task_id")
  1657. Task_r, err := NatsServer.Read_Task(T_task_id)
  1658. if err != nil {
  1659. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  1660. c.ServeJSON()
  1661. return
  1662. }
  1663. if Task_r.T_collection_state == 2 {
  1664. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  1665. c.ServeJSON()
  1666. return
  1667. }
  1668. var cnt int64
  1669. List, cnt := Task.Read_TaskCopy_List(Task_r.T_task_id, page, page_z)
  1670. page_size := math.Ceil(float64(cnt) / float64(page_z))
  1671. r_jsons.List = List
  1672. r_jsons.Page = page
  1673. r_jsons.Page_size = int(page_size)
  1674. r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
  1675. r_jsons.Num = int(cnt)
  1676. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  1677. c.ServeJSON()
  1678. return
  1679. }
  1680. // 添加存档
  1681. func (c *TaskDataController) TaskDataCopy_Add() {
  1682. T_task_id := c.GetString("T_task_id")
  1683. Task_r, err := NatsServer.Read_Task(T_task_id)
  1684. if err != nil {
  1685. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  1686. c.ServeJSON()
  1687. return
  1688. }
  1689. if Task_r.T_collection_state == 2 {
  1690. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  1691. c.ServeJSON()
  1692. return
  1693. }
  1694. var_ := Task.TaskCopy{
  1695. T_task_id: T_task_id,
  1696. T_time: time.Now().Format("2006-01-02 15:04:05"),
  1697. T_State: 1,
  1698. }
  1699. T_copy_id, is := Task.Add_TaskCopy(var_)
  1700. if !is {
  1701. c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
  1702. c.ServeJSON()
  1703. return
  1704. }
  1705. // 创建数据表
  1706. Task.CREATE_TaskDataCopy(conf.Local_AliasName, T_copy_id)
  1707. // 将数据表存档
  1708. Task.TaskData_Arhiving(T_task_id, T_copy_id)
  1709. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_copy_id}
  1710. c.ServeJSON()
  1711. return
  1712. }
  1713. // 删除存档
  1714. func (c *TaskDataController) TaskDataCopy_Del() {
  1715. T_copy_id := c.GetString("T_copy_id")
  1716. r, err := Task.Read_TaskCopy(T_copy_id)
  1717. if err != nil {
  1718. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_copy_id 错误!"}
  1719. c.ServeJSON()
  1720. return
  1721. }
  1722. is := Task.Delete_TaskCopy(r)
  1723. if !is {
  1724. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  1725. c.ServeJSON()
  1726. return
  1727. }
  1728. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_copy_id}
  1729. c.ServeJSON()
  1730. return
  1731. }
  1732. // 存档恢复
  1733. func (c *TaskDataController) TaskDataCopy_Recover() {
  1734. T_task_id := c.GetString("T_task_id")
  1735. T_copy_id := c.GetString("T_copy_id")
  1736. Task_r, err := NatsServer.Read_Task(T_task_id)
  1737. if err != nil {
  1738. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  1739. c.ServeJSON()
  1740. return
  1741. }
  1742. if Task_r.T_collection_state == 2 {
  1743. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  1744. c.ServeJSON()
  1745. return
  1746. }
  1747. _, err = Task.Read_TaskCopy(T_copy_id)
  1748. if err != nil {
  1749. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_copy_id 错误!"}
  1750. c.ServeJSON()
  1751. return
  1752. }
  1753. is := Task.TaskData_Recover(T_task_id, T_copy_id)
  1754. if !is {
  1755. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  1756. c.ServeJSON()
  1757. return
  1758. }
  1759. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_copy_id}
  1760. c.ServeJSON()
  1761. return
  1762. }
  1763. // 查询图片生成状态
  1764. func (c *TaskDataController) TaskData_JPGState() {
  1765. T_task_id := c.GetString("T_task_id")
  1766. jpg, is := Task.Redis_TaskDataJPG_Get(T_task_id)
  1767. if !is {
  1768. c.Data["json"] = lib.JSONS{Code: 202, Msg: "暂无图片正在生成"}
  1769. c.ServeJSON()
  1770. return
  1771. }
  1772. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: jpg}
  1773. c.ServeJSON()
  1774. return
  1775. }
  1776. func (c *TaskDataController) TaskData_JPG() {
  1777. StartTime := c.GetString("StartTime")
  1778. if len(StartTime) > 0 {
  1779. _, ok := lib.TimeStrToTime(StartTime)
  1780. if !ok {
  1781. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1782. c.ServeJSON()
  1783. return
  1784. }
  1785. }
  1786. EndTime := c.GetString("EndTime")
  1787. if len(EndTime) > 0 {
  1788. _, ok := lib.TimeStrToTime(EndTime)
  1789. if !ok {
  1790. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1791. c.ServeJSON()
  1792. return
  1793. }
  1794. }
  1795. TemperatureMin, _ := c.GetFloat("TemperatureMin") // 最低温度
  1796. TemperatureMax, _ := c.GetFloat("TemperatureMax") // 最高温度
  1797. T_task_id := c.GetString("T_task_id")
  1798. SN_List := c.GetString("SN_List")
  1799. Task_r, err := NatsServer.Read_Task(T_task_id)
  1800. if err != nil {
  1801. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  1802. c.ServeJSON()
  1803. return
  1804. }
  1805. if Task_r.T_collection_state == 2 {
  1806. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  1807. c.ServeJSON()
  1808. return
  1809. }
  1810. Task.Redis_TaskDataJPG_Del(T_task_id)
  1811. // 生成图片
  1812. go TaskDataJPG(StartTime, EndTime, T_task_id, SN_List, TemperatureMin, TemperatureMax)
  1813. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  1814. c.ServeJSON()
  1815. return
  1816. }
  1817. // 存档生成图片
  1818. func TaskDataJPG(StartTime, EndTime, T_task_id, snList string, TemperatureMin, TemperatureMax float64) {
  1819. Task.Redis_TaskDataJPG_Set(T_task_id, Task.TaskDataJPG{
  1820. State: 1,
  1821. Msg: "图片生成中",
  1822. Url: "",
  1823. })
  1824. msg := ""
  1825. state := 2
  1826. url := ""
  1827. SN_List := strings.Split(strings.Trim(snList, "|"), "|")
  1828. if len(snList) == 0 {
  1829. List := Task.Read_TaskData_ById_ClassList(T_task_id)
  1830. for _, v := range List {
  1831. SN_List = append(SN_List, fmt.Sprintf("%s,%s", v.T_sn, v.T_id))
  1832. }
  1833. }
  1834. id_List := []string{}
  1835. sn_List := []string{}
  1836. if len(snList) > 0 {
  1837. for _, v := range SN_List {
  1838. sn_id := strings.Split(v, ",")
  1839. if len(sn_id) != 2 {
  1840. return
  1841. }
  1842. id_List = append(id_List, fmt.Sprintf("'%s'", sn_id[1]))
  1843. sn_List = append(sn_List, fmt.Sprintf("'%s'", sn_id[0]))
  1844. }
  1845. }
  1846. ymin, ymax, minTime, maxTime := Task.Read_TaskData_T_Min_Max_Time_Min_Max(T_task_id, sn_List, id_List, StartTime, EndTime)
  1847. xmin, xmax := float64(minTime.Unix()), float64(maxTime.Unix())
  1848. // 创建一个新的绘图
  1849. p := plot.New()
  1850. // 设置绘图标题和标签
  1851. p.Title.Text = "温度折线图"
  1852. //p.Legend.ThumbnailWidth = 5 * vg.Inch
  1853. p.X.Label.Text = "时间"
  1854. p.Y.Label.Text = "温度"
  1855. // 添加最高,最低标准线 用红色虚线标识
  1856. p.Add(horizontalLine(xmin, xmax, TemperatureMin))
  1857. p.Add(horizontalLine(xmin, xmax, TemperatureMax))
  1858. var chData = make(chan int, 10)
  1859. var jobGroup sync.WaitGroup
  1860. // 创建温度线
  1861. for i := 0; i < len(SN_List); i++ {
  1862. chData <- 1
  1863. jobGroup.Add(1)
  1864. go func(index int) {
  1865. //go func(index int, wg *sync.WaitGroup, p *plot.Plot) {
  1866. defer func() {
  1867. <-chData // 完成时chan取出1个
  1868. jobGroup.Done() // 完成时将等待组值减1
  1869. }()
  1870. sn_id := strings.Split(SN_List[index], ",")
  1871. if len(sn_id) != 2 {
  1872. return
  1873. }
  1874. sn, id := sn_id[0], sn_id[1]
  1875. list, _ := Task.Read_TaskData_ById_List_AES(T_task_id, sn, id, StartTime, EndTime, 0, 9999)
  1876. if len(list) == 0 {
  1877. return
  1878. }
  1879. pts := make(plotter.XYs, len(list))
  1880. for j, d := range list {
  1881. t, _ := lib.TimeStrToTime(d.T_time)
  1882. pts[j].X = float64(t.Unix())
  1883. pts[j].Y = float64(d.T_t)
  1884. }
  1885. line, err := plotter.NewLine(pts)
  1886. if err != nil {
  1887. return
  1888. }
  1889. line.Color = randomColor(index)
  1890. p.Add(line)
  1891. }(i)
  1892. }
  1893. jobGroup.Wait()
  1894. if ymax < 8 {
  1895. ymax = 8
  1896. }
  1897. if ymin > 0 {
  1898. ymin = 0
  1899. }
  1900. p.Y.Min, p.Y.Max = ymin, ymax
  1901. p.X.Min, p.X.Max = xmin, xmax
  1902. p.Y.Tick.Marker = commaTicks{}
  1903. //p.X.Tick.Marker = plot.TimeTicks{Format: "2006-01-02 15:04:05"}
  1904. p.X.Tick.Marker = timeTicks{}
  1905. p.X.Tick.Label.Rotation = math.Pi / 5
  1906. p.X.Tick.Label.YAlign = draw.YCenter
  1907. p.X.Tick.Label.XAlign = draw.XRight
  1908. filename := "jpg" + time.Now().Format("20060102150405")
  1909. // 保存文件
  1910. if err := p.Save(10*vg.Inch, 4*vg.Inch, "ofile/"+filename+".jpg"); err != nil {
  1911. state = 3
  1912. msg = "图片生成失败"
  1913. logs.Error(lib.FuncName(), "生成图片失败", err)
  1914. }
  1915. if !lib.Pload_qiniu("ofile/"+filename+".jpg", "ofile/"+filename+".jpg") {
  1916. state = 3
  1917. msg = "图片上传七牛云失败"
  1918. logs.Error(lib.FuncName(), "上传七牛云失败")
  1919. }
  1920. //删除目录
  1921. os.Remove("ofile/" + filename + ".jpg")
  1922. if len(msg) == 0 {
  1923. msg = "图片生成成功"
  1924. url = "https://bzdcoldverifyoss.baozhida.cn/" + "ofile/" + filename + ".jpg"
  1925. }
  1926. Task.Redis_TaskDataJPG_Set(T_task_id, Task.TaskDataJPG{
  1927. State: state,
  1928. Msg: msg,
  1929. Url: url,
  1930. })
  1931. }
  1932. func (c *TaskDataController) DeviceData_JPG() {
  1933. StartTime := c.GetString("StartTime")
  1934. if len(StartTime) > 0 {
  1935. _, ok := lib.TimeStrToTime(StartTime)
  1936. if !ok {
  1937. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1938. c.ServeJSON()
  1939. return
  1940. }
  1941. }
  1942. EndTime := c.GetString("EndTime")
  1943. if len(EndTime) > 0 {
  1944. _, ok := lib.TimeStrToTime(EndTime)
  1945. if !ok {
  1946. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1947. c.ServeJSON()
  1948. return
  1949. }
  1950. }
  1951. TemperatureMin, _ := c.GetFloat("TemperatureMin") // 最低温度
  1952. TemperatureMax, _ := c.GetFloat("TemperatureMax") // 最高温度
  1953. if TemperatureMin == 0 {
  1954. TemperatureMin = 2
  1955. }
  1956. if TemperatureMax == 0 {
  1957. TemperatureMax = 8
  1958. }
  1959. T_sn := c.GetString("T_sn")
  1960. T_id := c.GetString("T_id")
  1961. //jpg, is := Task.Redis_TaskDataJPG_Get(T_sn)
  1962. //if !is {
  1963. // // 生成图片
  1964. // go DeviceDataJPG(StartTime, EndTime, T_sn, T_id, TemperatureMin, TemperatureMax)
  1965. // c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Task.TaskDataJPG{State: 1}}
  1966. // c.ServeJSON()
  1967. // return
  1968. //}
  1969. //if jpg.State == 3 {
  1970. // Task.Redis_TaskDataJPG_Del(T_sn)
  1971. // c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: jpg}
  1972. // c.ServeJSON()
  1973. // return
  1974. //}
  1975. url, err := DeviceDataJPG(StartTime, EndTime, T_sn, T_id, TemperatureMin, TemperatureMax)
  1976. if err != nil {
  1977. c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
  1978. c.ServeJSON()
  1979. return
  1980. }
  1981. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
  1982. c.ServeJSON()
  1983. return
  1984. }
  1985. // 存档生成图片
  1986. func DeviceDataJPG(StartTime, EndTime, T_sn, T_id string, TemperatureMin, TemperatureMax float64) (url string, err error) {
  1987. //Task.Redis_TaskDataJPG_Set(T_sn, Task.TaskDataJPG{
  1988. // State: 1,
  1989. // Url: "",
  1990. //})
  1991. //
  1992. //state := 2
  1993. if TemperatureMin == 0 {
  1994. TemperatureMin = 2
  1995. }
  1996. if TemperatureMax == 0 {
  1997. TemperatureMax = 8
  1998. }
  1999. ymin, ymax, minTime, maxTime := Task.Read_DeviceData_T_Min_Max_Time_Min_Max(T_sn, T_id, StartTime, EndTime)
  2000. xmin, xmax := float64(minTime.Unix()), float64(maxTime.Unix())
  2001. // 创建一个新的绘图
  2002. p := plot.New()
  2003. // 设置绘图标题和标签
  2004. p.Title.Text = "温度折线图"
  2005. //p.Legend.ThumbnailWidth = 5 * vg.Inch
  2006. p.X.Label.Text = "时间"
  2007. p.Y.Label.Text = "温度"
  2008. // 添加最高,最低标准线 用红色虚线标识
  2009. p.Add(horizontalLine(xmin, xmax, TemperatureMin))
  2010. p.Add(horizontalLine(xmin, xmax, TemperatureMax))
  2011. list := Task.Read_DeviceData_ById_List(T_sn, T_id, StartTime, EndTime)
  2012. pts := make(plotter.XYs, len(list))
  2013. for j, d := range list {
  2014. t, _ := lib.TimeStrToTime(d.T_time)
  2015. pts[j].X = float64(t.Unix())
  2016. pts[j].Y = float64(d.T_t)
  2017. }
  2018. line, err := plotter.NewLine(pts)
  2019. if err != nil {
  2020. return
  2021. }
  2022. line.Color = randomColor(0)
  2023. p.Add(line)
  2024. if ymax < 8 {
  2025. ymax = 8
  2026. }
  2027. if ymin > 0 {
  2028. ymin = 0
  2029. }
  2030. p.Y.Min, p.Y.Max = ymin, ymax
  2031. p.X.Min, p.X.Max = xmin, xmax
  2032. p.Y.Tick.Marker = commaTicks{}
  2033. //p.X.Tick.Marker = plot.TimeTicks{Format: "2006-01-02 15:04:05"}
  2034. p.X.Tick.Marker = timeTicks{}
  2035. p.X.Tick.Label.Rotation = math.Pi / 5
  2036. p.X.Tick.Label.YAlign = draw.YCenter
  2037. p.X.Tick.Label.XAlign = draw.XRight
  2038. filename := "jpg" + time.Now().Format("20060102150405")
  2039. // 保存文件
  2040. if err := p.Save(10*vg.Inch, 4*vg.Inch, "ofile/"+filename+".jpg"); err != nil {
  2041. logs.Error(lib.FuncName(), "生成图片失败", err)
  2042. }
  2043. if !lib.Pload_qiniu("ofile/"+filename+".jpg", "ofile/"+filename+".jpg") {
  2044. logs.Error(lib.FuncName(), "上传七牛云失败")
  2045. }
  2046. //删除目录
  2047. os.Remove("ofile/" + filename + ".jpg")
  2048. url = "https://bzdcoldverifyoss.baozhida.cn/" + "ofile/" + filename + ".jpg"
  2049. return
  2050. //Task.Redis_TaskDataJPG_Set(T_sn, Task.TaskDataJPG{
  2051. // State: state,
  2052. // Url: "https://bzdcoldverifyoss.baozhida.cn/" + "ofile/" + filename + ".jpg",
  2053. //})
  2054. }
  2055. func horizontalLine(xmin, xmax, y float64) *plotter.Line {
  2056. pts := make(plotter.XYs, 2)
  2057. pts[0].X = xmin
  2058. pts[0].Y = y
  2059. pts[1].X = xmax
  2060. pts[1].Y = y
  2061. line, err := plotter.NewLine(pts)
  2062. if err != nil {
  2063. panic(err)
  2064. }
  2065. line.LineStyle.Dashes = []vg.Length{vg.Points(8), vg.Points(5), vg.Points(1), vg.Points(5)}
  2066. line.Color = color.RGBA{R: 255, A: 255}
  2067. return line
  2068. }
  2069. type timeTicks struct{}
  2070. func (timeTicks) Ticks(min, max float64) []plot.Tick {
  2071. tks := plot.TimeTicks{}.Ticks(min, max)
  2072. for i, t := range tks {
  2073. //if t.Label == "" { // Skip minor ticks, they are fine.
  2074. // continue
  2075. //}
  2076. tks[i].Label = time.Unix(int64(t.Value), 0).Format("2006-01-02 15:04:05")
  2077. }
  2078. return tks
  2079. }
  2080. type commaTicks struct{}
  2081. // Ticks computes the default tick marks, but inserts commas
  2082. // into the labels for the major tick marks.
  2083. func (commaTicks) Ticks(min, max float64) []plot.Tick {
  2084. tks := plot.DefaultTicks{}.Ticks(min, max)
  2085. for i, t := range tks {
  2086. //if t.Label == "" { // Skip minor ticks, they are fine.
  2087. // continue
  2088. //}
  2089. tks[i].Label = fmt.Sprintf("%.0f", t.Value)
  2090. }
  2091. return tks
  2092. }
  2093. // 生成随机颜色的辅助函数
  2094. func randomColor(i int) color.RGBA {
  2095. var colors []color.RGBA
  2096. colors = append(colors,
  2097. color.RGBA{R: 52, G: 152, B: 219, A: 255},
  2098. color.RGBA{R: 230, G: 126, B: 34, A: 255},
  2099. color.RGBA{R: 142, G: 68, B: 173, A: 255},
  2100. color.RGBA{R: 211, G: 84, B: 0, A: 255},
  2101. color.RGBA{R: 231, G: 76, B: 60, A: 255},
  2102. color.RGBA{R: 26, G: 188, B: 156, A: 255},
  2103. color.RGBA{R: 243, G: 156, B: 18, A: 255},
  2104. color.RGBA{R: 22, G: 160, B: 133, A: 255},
  2105. color.RGBA{R: 46, G: 204, B: 113, A: 255},
  2106. color.RGBA{R: 39, G: 174, B: 96, A: 255},
  2107. color.RGBA{R: 41, G: 128, B: 185, A: 255},
  2108. color.RGBA{R: 155, G: 89, B: 182, A: 255},
  2109. color.RGBA{R: 192, G: 57, B: 43, A: 255},
  2110. color.RGBA{R: 241, G: 196, B: 15, A: 255},
  2111. )
  2112. return colors[i%len(colors)]
  2113. }