TaskData.go 69 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390
  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. if TemperatureMin == 0 {
  1798. TemperatureMin = 2
  1799. }
  1800. if TemperatureMax == 0 {
  1801. TemperatureMax = 8
  1802. }
  1803. T_task_id := c.GetString("T_task_id")
  1804. SN_List := c.GetString("SN_List")
  1805. Task_r, err := NatsServer.Read_Task(T_task_id)
  1806. if err != nil {
  1807. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  1808. c.ServeJSON()
  1809. return
  1810. }
  1811. if Task_r.T_collection_state == 2 {
  1812. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  1813. c.ServeJSON()
  1814. return
  1815. }
  1816. Task.Redis_TaskDataJPG_Del(T_task_id)
  1817. // 生成图片
  1818. go TaskDataJPG(StartTime, EndTime, T_task_id, SN_List, TemperatureMin, TemperatureMax)
  1819. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  1820. c.ServeJSON()
  1821. return
  1822. }
  1823. // 存档生成图片
  1824. func TaskDataJPG(StartTime, EndTime, T_task_id, snList string, TemperatureMin, TemperatureMax float64) {
  1825. Task.Redis_TaskDataJPG_Set(T_task_id, Task.TaskDataJPG{
  1826. State: 1,
  1827. Msg: "图片生成中",
  1828. Url: "",
  1829. })
  1830. msg := ""
  1831. state := 2
  1832. url := ""
  1833. if TemperatureMin == 0 {
  1834. TemperatureMin = 2
  1835. }
  1836. if TemperatureMax == 0 {
  1837. TemperatureMax = 8
  1838. }
  1839. SN_List := strings.Split(strings.Trim(snList, "|"), "|")
  1840. if len(snList) == 0 {
  1841. List := Task.Read_TaskData_ById_ClassList(T_task_id)
  1842. for _, v := range List {
  1843. SN_List = append(SN_List, fmt.Sprintf("%s,%s", v.T_sn, v.T_id))
  1844. }
  1845. }
  1846. id_List := []string{}
  1847. sn_List := []string{}
  1848. if len(snList) > 0 {
  1849. for _, v := range SN_List {
  1850. sn_id := strings.Split(v, ",")
  1851. if len(sn_id) != 2 {
  1852. return
  1853. }
  1854. id_List = append(id_List, fmt.Sprintf("'%s'", sn_id[1]))
  1855. sn_List = append(sn_List, fmt.Sprintf("'%s'", sn_id[0]))
  1856. }
  1857. }
  1858. ymin, ymax, minTime, maxTime := Task.Read_TaskData_T_Min_Max_Time_Min_Max(T_task_id, sn_List, id_List, StartTime, EndTime)
  1859. xmin, xmax := float64(minTime.Unix()), float64(maxTime.Unix())
  1860. // 创建一个新的绘图
  1861. p := plot.New()
  1862. // 设置绘图标题和标签
  1863. p.Title.Text = "温度折线图"
  1864. //p.Legend.ThumbnailWidth = 5 * vg.Inch
  1865. p.X.Label.Text = "时间"
  1866. p.Y.Label.Text = "温度"
  1867. // 添加最高,最低标准线 用红色虚线标识
  1868. p.Add(horizontalLine(xmin, xmax, TemperatureMin))
  1869. p.Add(horizontalLine(xmin, xmax, TemperatureMax))
  1870. var chData = make(chan int, 10)
  1871. var jobGroup sync.WaitGroup
  1872. // 创建温度线
  1873. for i := 0; i < len(SN_List); i++ {
  1874. chData <- 1
  1875. jobGroup.Add(1)
  1876. go func(index int) {
  1877. //go func(index int, wg *sync.WaitGroup, p *plot.Plot) {
  1878. defer func() {
  1879. <-chData // 完成时chan取出1个
  1880. jobGroup.Done() // 完成时将等待组值减1
  1881. }()
  1882. sn_id := strings.Split(SN_List[index], ",")
  1883. if len(sn_id) != 2 {
  1884. return
  1885. }
  1886. sn, id := sn_id[0], sn_id[1]
  1887. list, _ := Task.Read_TaskData_ById_List_AES(T_task_id, sn, id, StartTime, EndTime, 0, 9999)
  1888. if len(list) == 0 {
  1889. return
  1890. }
  1891. pts := make(plotter.XYs, len(list))
  1892. for j, d := range list {
  1893. t, _ := lib.TimeStrToTime(d.T_time)
  1894. pts[j].X = float64(t.Unix())
  1895. pts[j].Y = float64(d.T_t)
  1896. }
  1897. line, err := plotter.NewLine(pts)
  1898. if err != nil {
  1899. return
  1900. }
  1901. line.Color = randomColor(index)
  1902. p.Add(line)
  1903. }(i)
  1904. }
  1905. jobGroup.Wait()
  1906. if ymax < 8 {
  1907. ymax = 8
  1908. }
  1909. if ymin > 0 {
  1910. ymin = 0
  1911. }
  1912. p.Y.Min, p.Y.Max = ymin, ymax
  1913. p.X.Min, p.X.Max = xmin, xmax
  1914. p.Y.Tick.Marker = commaTicks{}
  1915. //p.X.Tick.Marker = plot.TimeTicks{Format: "2006-01-02 15:04:05"}
  1916. p.X.Tick.Marker = timeTicks{}
  1917. p.X.Tick.Label.Rotation = math.Pi / 5
  1918. p.X.Tick.Label.YAlign = draw.YCenter
  1919. p.X.Tick.Label.XAlign = draw.XRight
  1920. filename := "jpg" + time.Now().Format("20060102150405")
  1921. // 保存文件
  1922. if err := p.Save(10*vg.Inch, 4*vg.Inch, "ofile/"+filename+".jpg"); err != nil {
  1923. state = 3
  1924. msg = "图片生成失败"
  1925. logs.Error(lib.FuncName(), "生成图片失败", err)
  1926. }
  1927. if !lib.Pload_qiniu("ofile/"+filename+".jpg", "ofile/"+filename+".jpg") {
  1928. state = 3
  1929. msg = "图片上传七牛云失败"
  1930. logs.Error(lib.FuncName(), "上传七牛云失败")
  1931. }
  1932. //删除目录
  1933. os.Remove("ofile/" + filename + ".jpg")
  1934. if len(msg) == 0 {
  1935. msg = "图片生成成功"
  1936. url = "https://bzdcoldverifyoss.baozhida.cn/" + "ofile/" + filename + ".jpg"
  1937. }
  1938. Task.Redis_TaskDataJPG_Set(T_task_id, Task.TaskDataJPG{
  1939. State: state,
  1940. Msg: msg,
  1941. Url: url,
  1942. })
  1943. }
  1944. func (c *TaskDataController) DeviceData_JPG() {
  1945. StartTime := c.GetString("StartTime")
  1946. if len(StartTime) > 0 {
  1947. _, ok := lib.TimeStrToTime(StartTime)
  1948. if !ok {
  1949. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1950. c.ServeJSON()
  1951. return
  1952. }
  1953. }
  1954. EndTime := c.GetString("EndTime")
  1955. if len(EndTime) > 0 {
  1956. _, ok := lib.TimeStrToTime(EndTime)
  1957. if !ok {
  1958. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  1959. c.ServeJSON()
  1960. return
  1961. }
  1962. }
  1963. TemperatureMin, _ := c.GetFloat("TemperatureMin") // 最低温度
  1964. TemperatureMax, _ := c.GetFloat("TemperatureMax") // 最高温度
  1965. if TemperatureMin == 0 {
  1966. TemperatureMin = 2
  1967. }
  1968. if TemperatureMax == 0 {
  1969. TemperatureMax = 8
  1970. }
  1971. T_sn := c.GetString("T_sn")
  1972. T_id := c.GetString("T_id")
  1973. //jpg, is := Task.Redis_TaskDataJPG_Get(T_sn)
  1974. //if !is {
  1975. // // 生成图片
  1976. // go DeviceDataJPG(StartTime, EndTime, T_sn, T_id, TemperatureMin, TemperatureMax)
  1977. // c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Task.TaskDataJPG{State: 1}}
  1978. // c.ServeJSON()
  1979. // return
  1980. //}
  1981. //if jpg.State == 3 {
  1982. // Task.Redis_TaskDataJPG_Del(T_sn)
  1983. // c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: jpg}
  1984. // c.ServeJSON()
  1985. // return
  1986. //}
  1987. url, err := DeviceDataJPG(StartTime, EndTime, T_sn, T_id, TemperatureMin, TemperatureMax)
  1988. if err != nil {
  1989. c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
  1990. c.ServeJSON()
  1991. return
  1992. }
  1993. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
  1994. c.ServeJSON()
  1995. return
  1996. }
  1997. // 存档生成图片
  1998. func DeviceDataJPG(StartTime, EndTime, T_sn, T_id string, TemperatureMin, TemperatureMax float64) (url string, err error) {
  1999. //Task.Redis_TaskDataJPG_Set(T_sn, Task.TaskDataJPG{
  2000. // State: 1,
  2001. // Url: "",
  2002. //})
  2003. //
  2004. //state := 2
  2005. if TemperatureMin == 0 {
  2006. TemperatureMin = 2
  2007. }
  2008. if TemperatureMax == 0 {
  2009. TemperatureMax = 8
  2010. }
  2011. ymin, ymax, minTime, maxTime := Task.Read_DeviceData_T_Min_Max_Time_Min_Max(T_sn, T_id, StartTime, EndTime)
  2012. xmin, xmax := float64(minTime.Unix()), float64(maxTime.Unix())
  2013. // 创建一个新的绘图
  2014. p := plot.New()
  2015. // 设置绘图标题和标签
  2016. p.Title.Text = "温度折线图"
  2017. //p.Legend.ThumbnailWidth = 5 * vg.Inch
  2018. p.X.Label.Text = "时间"
  2019. p.Y.Label.Text = "温度"
  2020. // 添加最高,最低标准线 用红色虚线标识
  2021. p.Add(horizontalLine(xmin, xmax, TemperatureMin))
  2022. p.Add(horizontalLine(xmin, xmax, TemperatureMax))
  2023. list := Task.Read_DeviceData_ById_List(T_sn, T_id, StartTime, EndTime)
  2024. pts := make(plotter.XYs, len(list))
  2025. for j, d := range list {
  2026. t, _ := lib.TimeStrToTime(d.T_time)
  2027. pts[j].X = float64(t.Unix())
  2028. pts[j].Y = float64(d.T_t)
  2029. }
  2030. line, err := plotter.NewLine(pts)
  2031. if err != nil {
  2032. return
  2033. }
  2034. line.Color = randomColor(0)
  2035. p.Add(line)
  2036. if ymax < 8 {
  2037. ymax = 8
  2038. }
  2039. if ymin > 0 {
  2040. ymin = 0
  2041. }
  2042. p.Y.Min, p.Y.Max = ymin, ymax
  2043. p.X.Min, p.X.Max = xmin, xmax
  2044. p.Y.Tick.Marker = commaTicks{}
  2045. //p.X.Tick.Marker = plot.TimeTicks{Format: "2006-01-02 15:04:05"}
  2046. p.X.Tick.Marker = timeTicks{}
  2047. p.X.Tick.Label.Rotation = math.Pi / 5
  2048. p.X.Tick.Label.YAlign = draw.YCenter
  2049. p.X.Tick.Label.XAlign = draw.XRight
  2050. filename := "jpg" + time.Now().Format("20060102150405")
  2051. // 保存文件
  2052. if err := p.Save(10*vg.Inch, 4*vg.Inch, "ofile/"+filename+".jpg"); err != nil {
  2053. logs.Error(lib.FuncName(), "生成图片失败", err)
  2054. }
  2055. if !lib.Pload_qiniu("ofile/"+filename+".jpg", "ofile/"+filename+".jpg") {
  2056. logs.Error(lib.FuncName(), "上传七牛云失败")
  2057. }
  2058. //删除目录
  2059. os.Remove("ofile/" + filename + ".jpg")
  2060. url = "https://bzdcoldverifyoss.baozhida.cn/" + "ofile/" + filename + ".jpg"
  2061. return
  2062. //Task.Redis_TaskDataJPG_Set(T_sn, Task.TaskDataJPG{
  2063. // State: state,
  2064. // Url: "https://bzdcoldverifyoss.baozhida.cn/" + "ofile/" + filename + ".jpg",
  2065. //})
  2066. }
  2067. func horizontalLine(xmin, xmax, y float64) *plotter.Line {
  2068. pts := make(plotter.XYs, 2)
  2069. pts[0].X = xmin
  2070. pts[0].Y = y
  2071. pts[1].X = xmax
  2072. pts[1].Y = y
  2073. line, err := plotter.NewLine(pts)
  2074. if err != nil {
  2075. panic(err)
  2076. }
  2077. line.LineStyle.Dashes = []vg.Length{vg.Points(8), vg.Points(5), vg.Points(1), vg.Points(5)}
  2078. line.Color = color.RGBA{R: 255, A: 255}
  2079. return line
  2080. }
  2081. type timeTicks struct{}
  2082. func (timeTicks) Ticks(min, max float64) []plot.Tick {
  2083. tks := plot.TimeTicks{}.Ticks(min, max)
  2084. for i, t := range tks {
  2085. //if t.Label == "" { // Skip minor ticks, they are fine.
  2086. // continue
  2087. //}
  2088. tks[i].Label = time.Unix(int64(t.Value), 0).Format("2006-01-02 15:04:05")
  2089. }
  2090. return tks
  2091. }
  2092. type commaTicks struct{}
  2093. // Ticks computes the default tick marks, but inserts commas
  2094. // into the labels for the major tick marks.
  2095. func (commaTicks) Ticks(min, max float64) []plot.Tick {
  2096. tks := plot.DefaultTicks{}.Ticks(min, max)
  2097. for i, t := range tks {
  2098. //if t.Label == "" { // Skip minor ticks, they are fine.
  2099. // continue
  2100. //}
  2101. tks[i].Label = fmt.Sprintf("%.0f", t.Value)
  2102. }
  2103. return tks
  2104. }
  2105. // 生成随机颜色的辅助函数
  2106. func randomColor(i int) color.RGBA {
  2107. var colors []color.RGBA
  2108. colors = append(colors,
  2109. color.RGBA{R: 52, G: 152, B: 219, A: 255},
  2110. color.RGBA{R: 230, G: 126, B: 34, A: 255},
  2111. color.RGBA{R: 142, G: 68, B: 173, A: 255},
  2112. color.RGBA{R: 211, G: 84, B: 0, A: 255},
  2113. color.RGBA{R: 231, G: 76, B: 60, A: 255},
  2114. color.RGBA{R: 26, G: 188, B: 156, A: 255},
  2115. color.RGBA{R: 243, G: 156, B: 18, A: 255},
  2116. color.RGBA{R: 22, G: 160, B: 133, A: 255},
  2117. color.RGBA{R: 46, G: 204, B: 113, A: 255},
  2118. color.RGBA{R: 39, G: 174, B: 96, A: 255},
  2119. color.RGBA{R: 41, G: 128, B: 185, A: 255},
  2120. color.RGBA{R: 155, G: 89, B: 182, A: 255},
  2121. color.RGBA{R: 192, G: 57, B: 43, A: 255},
  2122. color.RGBA{R: 241, G: 196, B: 15, A: 255},
  2123. )
  2124. return colors[i%len(colors)]
  2125. }