TaskData.go 77 KB

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