TaskData.go 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501
  1. package controllers
  2. import (
  3. "ColdVerify_server/Nats"
  4. "ColdVerify_server/conf"
  5. "ColdVerify_server/lib"
  6. "ColdVerify_server/logs"
  7. "ColdVerify_server/models/Account"
  8. "ColdVerify_server/models/Device"
  9. "ColdVerify_server/models/System"
  10. "ColdVerify_server/models/Task"
  11. "errors"
  12. "fmt"
  13. beego "github.com/beego/beego/v2/server/web"
  14. "github.com/signintech/gopdf"
  15. "github.com/xuri/excelize/v2"
  16. "log"
  17. "math"
  18. "os"
  19. "sort"
  20. "strconv"
  21. "strings"
  22. "sync"
  23. "time"
  24. )
  25. type TaskDataController struct {
  26. beego.Controller
  27. }
  28. // 获取-
  29. func (c *TaskDataController) Extract_TaskData() {
  30. // 验证登录 User_is, User_r
  31. user_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  32. if !User_is {
  33. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  34. c.ServeJSON()
  35. return
  36. }
  37. Time_start := c.GetString("Time_start")
  38. Time_end := c.GetString("Time_end")
  39. T_task_id := c.GetString("T_task_id")
  40. Task_r, is := Task.Read_Task(T_task_id)
  41. if !is {
  42. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  43. c.ServeJSON()
  44. return
  45. }
  46. DeviceClass_List := Device.Read_DeviceClassList_List_id(Task_r.T_class)
  47. if len(DeviceClass_List) == 0 {
  48. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_Class_id 分类设备列表 为空!"}
  49. c.ServeJSON()
  50. return
  51. }
  52. logs.Println("----导入 :", DeviceClass_List)
  53. // 清空表
  54. Task.Truncate_TaskData(Task_r.T_task_id)
  55. // 插入 数据
  56. for _, v := range DeviceClass_List {
  57. logs.Println("---- :", v.T_sn, Task_r.T_task_id, Time_start, Time_end)
  58. Task.Import_TaskData(v.T_sn, v.T_id, Task_r.T_task_id, Time_start, Time_end)
  59. }
  60. // 提取数据后 将 当前任务 数据采集 标志 为 1
  61. Task_r.T_collection_state = 1
  62. if !Task.Update_Task(Task_r, "T_collection_state") {
  63. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  64. c.ServeJSON()
  65. return
  66. }
  67. System.Add_UserLogs_T(user_r.T_uuid, "任务", "修改", Task_r)
  68. System.Add_UserLogs(user_r.T_uuid, "提取数据", "提取数据"+Task_r.T_name, Task_r.T_task_id+"|"+Time_start+"|"+Time_end)
  69. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  70. c.ServeJSON()
  71. return
  72. }
  73. // 后台导出数据
  74. func (c *TaskDataController) Extract_TaskData_Back() {
  75. // 验证登录 User_is, User_r
  76. user_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  77. if !User_is {
  78. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  79. c.ServeJSON()
  80. return
  81. }
  82. Time_start := c.GetString("Time_start")
  83. Time_end := c.GetString("Time_end")
  84. T_task_id := c.GetString("T_task_id")
  85. Task_r, is := Task.Read_Task(T_task_id)
  86. if !is {
  87. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  88. c.ServeJSON()
  89. return
  90. }
  91. // 采集中
  92. if Task_r.T_collection_state == 2 {
  93. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据正采集中,请勿重复提交!"}
  94. c.ServeJSON()
  95. return
  96. }
  97. DeviceClass_List := Device.Read_DeviceClassList_List_id(Task_r.T_class)
  98. if len(DeviceClass_List) == 0 {
  99. c.Data["json"] = lib.JSONS{Code: 202, Msg: "设备列表为空,请先添加设备!"}
  100. c.ServeJSON()
  101. return
  102. }
  103. // 更新状态为采集中
  104. Task_r.T_collection_state = 2
  105. if !Task.Update_Task(Task_r, "T_collection_state") {
  106. c.Data["json"] = lib.JSONS{Code: 202, Msg: "导出数据失败!"}
  107. c.ServeJSON()
  108. return
  109. }
  110. resp := Nats.Extract_TaskData_Back{
  111. T_uuid: user_r.T_uuid,
  112. Time_start: Time_start,
  113. Time_end: Time_end,
  114. DeviceClassList: DeviceClass_List,
  115. Task: Task_r,
  116. }
  117. // 后台执行打包数据
  118. //b, _ := msgpack.Marshal(&data)
  119. //_ = lib.Nats.Publish("ColdVerify_Server_Extract_TaskData_Back", b)
  120. go func(resp Nats.Extract_TaskData_Back, Task_r Task.Task) {
  121. Task_rname := resp.Task
  122. // 清空表
  123. Task.Truncate_TaskData(Task_rname.T_task_id)
  124. //失败重试5次
  125. DeviceClassList := new(sync.Map)
  126. var count int
  127. for _, v := range resp.DeviceClassList {
  128. if strings.Contains(v.T_sn, "-") || len(v.T_sn) == 0 {
  129. // 从3.0平台导入
  130. continue
  131. }
  132. DeviceClassList.Store(fmt.Sprintf("%s|%s", v.T_sn, v.T_id), 5)
  133. //err = Task.Import_TaskData_Back(v.T_sn, v.T_id, resp.Task.T_task_id, resp.Time_start, resp.Time_end)
  134. //count++
  135. //time.Sleep(5 * time.Second)
  136. }
  137. DeviceClassList.Range(func(k, v interface{}) bool {
  138. count++
  139. return true
  140. })
  141. for count > 0 {
  142. DeviceClassList.Range(func(k, v any) bool {
  143. T_snid := strings.Split(k.(string), "|")
  144. T_sn := T_snid[0]
  145. T_id := T_snid[1]
  146. temp := v.(int)
  147. temp--
  148. DeviceClassList.Store(k, temp)
  149. err := Task.Import_TaskData_Back(T_sn, T_id, resp.Task.T_task_id, resp.Time_start, resp.Time_end)
  150. if err == nil || strings.Contains(err.Error(), "doesn't exist") {
  151. DeviceClassList.Delete(k)
  152. count--
  153. } else {
  154. logs.Error("设备数据同步到任务数据失败", err)
  155. DeviceClassList.Delete(k)
  156. count--
  157. }
  158. return true
  159. })
  160. }
  161. // 提取数据后 将 当前任务 数据采集 标志 为 1
  162. Task_r.T_collection_state = 1
  163. if !Task.Update_Task(Task_r, "T_collection_state") {
  164. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  165. c.ServeJSON()
  166. return
  167. }
  168. }(resp, Task_r)
  169. System.Add_UserLogs_T(resp.T_uuid, "任务", "修改", Task_r)
  170. System.Add_UserLogs(resp.T_uuid, "提取数据", "提取数据"+Task_r.T_name, Task_r.T_task_id+"|"+resp.Time_start+"|"+resp.Time_end)
  171. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  172. c.ServeJSON()
  173. return
  174. }
  175. // 列表 -
  176. func (c *TaskDataController) TaskData_List() {
  177. // 验证登录 User_is, User_r
  178. _, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  179. if !User_is {
  180. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  181. c.ServeJSON()
  182. return
  183. }
  184. var r_jsons lib.R_JSONS
  185. page, _ := c.GetInt("page")
  186. if page < 1 {
  187. page = 1
  188. }
  189. page_z, _ := c.GetInt("page_z")
  190. if page_z < 1 {
  191. page_z = conf.Page_size
  192. }
  193. Time_start := c.GetString("Time_start")
  194. Time_end := c.GetString("Time_end")
  195. T_sn := c.GetString("T_sn")
  196. T_id := c.GetString("T_id")
  197. T_layout_no := c.GetString("T_layout_no") // 替换之前的T_id
  198. if len(T_layout_no) > 0 {
  199. T_id = T_layout_no
  200. }
  201. T_task_id := c.GetString("T_task_id")
  202. Task_r, is := Task.Read_Task(T_task_id)
  203. if !is {
  204. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  205. c.ServeJSON()
  206. return
  207. }
  208. if Task_r.T_delivery_state == 2 {
  209. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  210. c.ServeJSON()
  211. return
  212. }
  213. // 查询设备列表
  214. dcList, _ := Device.Read_DeviceClassList_OrderList(Task_r.T_class, T_sn, "", "", page, 9999)
  215. // 保存布局编号和校准证书对应关系
  216. var deviceCertificateMap = make(map[string]string) // t_id, T_Certificate_sn
  217. for _, v := range dcList {
  218. deviceCertificateMap[v.T_id] = v.T_Certificate_sn
  219. }
  220. var cnt int64
  221. List, cnt := Task.Read_TaskData_ById_List(Task_r.T_task_id, T_sn, T_id, Time_start, Time_end, page, page_z)
  222. for i := 0; i < len(List); i++ {
  223. List[i].T_Certificate_sn = deviceCertificateMap[List[i].T_id]
  224. }
  225. page_size := math.Ceil(float64(cnt) / float64(page_z))
  226. r_jsons.List = List
  227. r_jsons.Page = page
  228. r_jsons.Page_size = int(page_size)
  229. r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
  230. r_jsons.Num = int(cnt)
  231. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  232. c.ServeJSON()
  233. return
  234. }
  235. // 列表 -
  236. func (c *TaskDataController) UserTaskData_List() {
  237. // 验证登录 User_is, User_r
  238. User_r, User_is := Account.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  239. if !User_is {
  240. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  241. c.ServeJSON()
  242. return
  243. }
  244. var r_jsons lib.R_JSONS
  245. page, _ := c.GetInt("page")
  246. if page < 1 {
  247. page = 1
  248. }
  249. page_z, _ := c.GetInt("page_z")
  250. if page_z < 1 {
  251. page_z = conf.Page_size
  252. }
  253. Time_start := c.GetString("Time_start")
  254. Time_end := c.GetString("Time_end")
  255. T_sn := c.GetString("T_sn")
  256. T_id := c.GetString("T_id")
  257. T_layout_no := c.GetString("T_layout_no") // 替换之前的T_id
  258. if len(T_layout_no) > 0 {
  259. T_id = T_layout_no
  260. }
  261. T_task_id := c.GetString("T_task_id")
  262. Task_r, is := Task.Read_Task(T_task_id)
  263. if !is {
  264. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  265. c.ServeJSON()
  266. return
  267. }
  268. if Task_r.T_delivery_state == 2 {
  269. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  270. c.ServeJSON()
  271. return
  272. }
  273. if Task_r.T_uuid != User_r.T_uuid {
  274. c.Data["json"] = lib.JSONS{Code: 200, Msg: "无权访问!"}
  275. c.ServeJSON()
  276. return
  277. }
  278. if len(Time_start) == 0 {
  279. Time_start = Task_r.T_VerifyDeviceDataStartTime
  280. }
  281. if len(Time_end) == 0 {
  282. Time_end = Task_r.T_VerifyDeviceDataEndTime
  283. }
  284. // 查询设备列表
  285. dcList, _ := Device.Read_DeviceClassList_OrderList(Task_r.T_class, T_sn, "", "", page, 9999)
  286. // 保存布局编号和校准证书对应关系
  287. var deviceCertificateMap = make(map[string]string) // t_id, T_Certificate_sn
  288. for _, v := range dcList {
  289. deviceCertificateMap[v.T_id] = v.T_Certificate_sn
  290. }
  291. var cnt int64
  292. List, cnt := Task.Read_TaskData_ById_List(Task_r.T_task_id, T_sn, T_id, Time_start, Time_end, page, page_z)
  293. for i := 0; i < len(List); i++ {
  294. List[i].T_Certificate_sn = deviceCertificateMap[List[i].T_id]
  295. }
  296. page_size := math.Ceil(float64(cnt) / float64(page_z))
  297. r_jsons.List = List
  298. r_jsons.Page = page
  299. r_jsons.Page_size = int(page_size)
  300. r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
  301. r_jsons.Num = int(cnt)
  302. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  303. c.ServeJSON()
  304. return
  305. }
  306. // 列表 -
  307. func (c *TaskDataController) TaskDataClass_List() {
  308. // 验证登录 User_is, User_r
  309. _, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  310. if !User_is {
  311. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  312. c.ServeJSON()
  313. return
  314. }
  315. T_task_id := c.GetString("T_task_id")
  316. Task_r, is := Task.Read_Task(T_task_id)
  317. if !is {
  318. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  319. c.ServeJSON()
  320. return
  321. }
  322. if Task_r.T_delivery_state == 2 {
  323. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  324. c.ServeJSON()
  325. return
  326. }
  327. List := Task.Read_TaskData_ById_ClassList(Task_r.T_task_id)
  328. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: List}
  329. c.ServeJSON()
  330. return
  331. }
  332. // 添加-
  333. func (c *TaskDataController) TaskData_AddS() {
  334. // 验证登录 User_is, User_r
  335. user_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  336. if !User_is {
  337. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  338. c.ServeJSON()
  339. return
  340. }
  341. T_task_id := c.GetString("T_task_id")
  342. Task_r, is := Task.Read_Task(T_task_id)
  343. if !is {
  344. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  345. c.ServeJSON()
  346. return
  347. }
  348. //T_sn|T_id|T_t|T_rh|T_time?
  349. T_Data := c.GetString("T_Data")
  350. if len(T_Data) < 5 {
  351. c.Data["json"] = lib.JSONS{Code: 202, Msg: "err T_Data!"}
  352. c.ServeJSON()
  353. return
  354. }
  355. T_Data_list := strings.Split(T_Data, "?")
  356. println(len(T_Data_list), "len(T_Data_list)")
  357. var T_Data_list_x = 0
  358. for _, v := range T_Data_list {
  359. // 2022-08-09 14:25:00|27.7|55.2
  360. if len(v) < 5 {
  361. println(v, "len(v) < 5")
  362. continue
  363. }
  364. v_list := strings.Split(v, "|")
  365. is = Task.Add_TaskData(Task_r.T_task_id, v_list[0], v_list[1], v_list[2], v_list[3], v_list[4])
  366. if is {
  367. T_Data_list_x += 1
  368. }
  369. }
  370. System.Add_UserLogs(user_r.T_uuid, "任务数据", "添加数据"+Task_r.T_name, Task_r.T_task_id+"结果:"+string(len(T_Data_list))+"/"+string(T_Data_list_x)+"|=> "+T_Data)
  371. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: strconv.Itoa(T_Data_list_x)}
  372. c.ServeJSON()
  373. return
  374. }
  375. // 添加-
  376. func (c *TaskDataController) TaskData_Add() {
  377. // 验证登录 User_is, User_r
  378. user_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  379. if !User_is {
  380. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  381. c.ServeJSON()
  382. return
  383. }
  384. T_sn := c.GetString("T_sn")
  385. T_id, _ := c.GetInt("T_id")
  386. T_t, _ := c.GetFloat("T_t")
  387. T_rh, _ := c.GetFloat("T_rh")
  388. T_time := c.GetString("T_time")
  389. T_task_id := c.GetString("T_task_id")
  390. Task_r, is := Task.Read_Task(T_task_id)
  391. if !is {
  392. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  393. c.ServeJSON()
  394. return
  395. }
  396. is = Task.Add_TaskData(Task_r.T_task_id, T_sn, strconv.Itoa(T_id), fmt.Sprintf("%.2f", T_t), fmt.Sprintf("%.2f", T_rh), T_time)
  397. if !is {
  398. c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
  399. c.ServeJSON()
  400. return
  401. }
  402. System.Add_UserLogs(user_r.T_uuid, "任务数据", "添加数据"+Task_r.T_name, Task_r.T_task_id+"|"+T_sn+"|"+strconv.Itoa(T_id)+"|"+fmt.Sprintf("%.2f", T_t)+"|"+fmt.Sprintf("%.2f", T_rh)+T_time)
  403. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  404. c.ServeJSON()
  405. return
  406. }
  407. // 修改-
  408. func (c *TaskDataController) TaskData_Up() {
  409. // 验证登录 User_is, User_r
  410. user_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  411. if !User_is {
  412. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  413. c.ServeJSON()
  414. return
  415. }
  416. Id, err := c.GetInt("Id")
  417. if err != nil {
  418. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  419. c.ServeJSON()
  420. return
  421. }
  422. T_t, err := c.GetFloat("T_t")
  423. if err != nil {
  424. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_t 错误!"}
  425. c.ServeJSON()
  426. return
  427. }
  428. T_rh, err := c.GetFloat("T_rh")
  429. if err != nil {
  430. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_rh 错误!"}
  431. c.ServeJSON()
  432. return
  433. }
  434. T_time := c.GetString("T_time")
  435. T_task_id := c.GetString("T_task_id")
  436. Task_r, is := Task.Read_Task(T_task_id)
  437. if !is {
  438. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  439. c.ServeJSON()
  440. return
  441. }
  442. is = Task.Up_TaskData(Task_r.T_task_id, strconv.Itoa(Id), fmt.Sprintf("%.2f", T_t), fmt.Sprintf("%.2f", T_rh), T_time)
  443. if !is {
  444. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  445. c.ServeJSON()
  446. return
  447. }
  448. System.Add_UserLogs(user_r.T_uuid, "任务数据", "修改数据"+Task_r.T_name, Task_r.T_task_id+"|"+strconv.Itoa(Id)+"|"+fmt.Sprintf("%.2f", T_t)+"|"+fmt.Sprintf("%.2f", T_rh)+T_time)
  449. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  450. c.ServeJSON()
  451. return
  452. }
  453. // 删除-
  454. func (c *TaskDataController) TaskData_Del() {
  455. // 验证登录 User_is, User_r
  456. user_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  457. if !User_is {
  458. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  459. c.ServeJSON()
  460. return
  461. }
  462. Id, err := c.GetInt("Id")
  463. if err != nil {
  464. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  465. c.ServeJSON()
  466. return
  467. }
  468. T_task_id := c.GetString("T_task_id")
  469. Task_r, is := Task.Read_Task(T_task_id)
  470. if !is {
  471. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  472. c.ServeJSON()
  473. return
  474. }
  475. is = Task.Del_TaskData(Task_r.T_task_id, strconv.Itoa(Id))
  476. if !is {
  477. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  478. c.ServeJSON()
  479. return
  480. }
  481. System.Add_UserLogs(user_r.T_uuid, "任务数据", "删除"+Task_r.T_name, Task_r.T_task_id+"|"+strconv.Itoa(Id))
  482. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  483. c.ServeJSON()
  484. return
  485. }
  486. // 删除-
  487. func (c *TaskDataController) TaskData_Del_t_id() {
  488. // 验证登录 User_is, User_r
  489. user_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  490. if !User_is {
  491. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  492. c.ServeJSON()
  493. return
  494. }
  495. Id, err := c.GetInt("Id")
  496. if err != nil {
  497. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  498. c.ServeJSON()
  499. return
  500. }
  501. T_task_id := c.GetString("T_task_id")
  502. Task_r, is := Task.Read_Task(T_task_id)
  503. if !is {
  504. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  505. c.ServeJSON()
  506. return
  507. }
  508. is = Task.Del_TaskData_t_id(Task_r.T_task_id, strconv.Itoa(Id))
  509. if !is {
  510. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  511. c.ServeJSON()
  512. return
  513. }
  514. System.Add_UserLogs(user_r.T_uuid, "任务数据", "删除"+Task_r.T_name, Task_r.T_task_id+"|"+strconv.Itoa(Id))
  515. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  516. c.ServeJSON()
  517. return
  518. }
  519. // 列表 - 接口
  520. func (c *TaskDataController) Export_Data_Excel() {
  521. // 验证登录 User_is, User_r
  522. _, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  523. if !User_is {
  524. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  525. c.ServeJSON()
  526. return
  527. }
  528. Time_start := c.GetString("Time_start")
  529. Time_end := c.GetString("Time_end")
  530. T_sn_str := c.GetString("T_sn_list") //865901058809339,865901058815849,865901058818991,865901058810568
  531. //T_id, err := c.GetInt("T_id")
  532. //if err != nil {
  533. // T_id = -1
  534. //
  535. //}
  536. T_task_id := c.GetString("T_task_id")
  537. Task_r, is := Task.Read_Task(T_task_id)
  538. if !is {
  539. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  540. c.ServeJSON()
  541. return
  542. }
  543. T_sn_list := strings.Split(T_sn_str, ",")
  544. DeviceSensor_data_list := []Task.TaskData_{}
  545. for _, v := range T_sn_list {
  546. DeviceSensor_data, _ := Task.Read_TaskData_ById_List(Task_r.T_task_id, v, "", Time_start, Time_end, 1, 9999)
  547. DeviceSensor_data_list = append(DeviceSensor_data_list, DeviceSensor_data...)
  548. }
  549. f := excelize.NewFile() // 设置单元格的值
  550. // 这里设置表头
  551. f.SetCellValue("Sheet1", "A1", "编号")
  552. f.SetCellValue("Sheet1", "B1", "SN")
  553. f.SetCellValue("Sheet1", "C1", "温度℃")
  554. f.SetCellValue("Sheet1", "D1", "湿度%")
  555. f.SetCellValue("Sheet1", "E1", "记录时间")
  556. // 设置列宽
  557. f.SetColWidth("Sheet1", "A", "A", 7)
  558. f.SetColWidth("Sheet1", "B", "B", 20)
  559. f.SetColWidth("Sheet1", "C", "C", 10)
  560. f.SetColWidth("Sheet1", "D", "D", 10)
  561. f.SetColWidth("Sheet1", "E", "E", 22)
  562. line := 1
  563. // 循环写入数据
  564. for _, v := range DeviceSensor_data_list {
  565. line++
  566. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), v.T_id)
  567. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v.T_sn)
  568. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), strconv.FormatFloat(float64(v.T_t), 'f', 1, 64))
  569. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), strconv.FormatFloat(float64(v.T_rh), 'f', 1, 64))
  570. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v.T_time)
  571. }
  572. logs.Println("DeviceSensor_data:", len(DeviceSensor_data_list))
  573. lib.Create_Dir("./ofile")
  574. timeStr := time.Now().Format("20060102150405")
  575. // 保存文件
  576. if err := f.SaveAs("ofile/" + timeStr + ".xlsx"); err != nil {
  577. logs.Error(lib.FuncName(), err)
  578. }
  579. if !lib.Pload_qiniu("ofile/"+timeStr+".xlsx", "ofile/"+timeStr+".xlsx") {
  580. c.Data["json"] = lib.JSONS{Code: 203, Msg: "oss!"}
  581. c.ServeJSON()
  582. return
  583. }
  584. //删除目录
  585. //err = os.Remove("ofile/" + timeStr + ".xlsx")
  586. //if err != nil {
  587. // logs.Error(lib.FuncName(),err)
  588. //}
  589. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: "https://bzdcoldverifyoss.baozhida.cn/" + "ofile/" + timeStr + ".xlsx"}
  590. c.ServeJSON()
  591. return
  592. }
  593. // 列表 - 接口
  594. func (c *TaskDataController) Export_Data_PDF() {
  595. // 验证登录 User_is, User_r
  596. _, User_is := Account.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  597. if !User_is {
  598. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  599. c.ServeJSON()
  600. return
  601. }
  602. Time_start := c.GetString("Time_start")
  603. Time_end := c.GetString("Time_end")
  604. T_sn_str := c.GetString("T_sn_list") //865901058809339,865901058815849,865901058818991,865901058810568
  605. //T_id, err := c.GetInt("T_id")
  606. //if err != nil {
  607. // T_id = -1
  608. //
  609. //}
  610. T_task_id := c.GetString("T_task_id")
  611. Task_r, is := Task.Read_Task(T_task_id)
  612. if !is {
  613. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  614. c.ServeJSON()
  615. return
  616. }
  617. dcList, _ := Device.Read_DeviceClassList_OrderList(Task_r.T_class, "", "", "", 0, 9999)
  618. // 查询设备列表
  619. // 保存布局编号和校准证书对应关系
  620. var deviceCertificateMap = make(map[string]string) // t_id, T_Certificate_sn
  621. for _, v := range dcList {
  622. deviceCertificateMap[v.T_id] = v.T_Certificate_sn
  623. }
  624. T_sn_list := strings.Split(T_sn_str, ",")
  625. DeviceSensor_data_list := []Task.TaskData_{}
  626. for _, v := range T_sn_list {
  627. DeviceSensor_data, _ := Task.Read_TaskData_ById_List(Task_r.T_task_id, v, "", Time_start, Time_end, 1, 9999)
  628. DeviceSensor_data_list = append(DeviceSensor_data_list, DeviceSensor_data...)
  629. for i := 0; i < len(DeviceSensor_data_list); i++ {
  630. DeviceSensor_data_list[i].T_Certificate_sn = deviceCertificateMap[DeviceSensor_data_list[i].T_id]
  631. }
  632. }
  633. //------
  634. var err error
  635. pdf := &gopdf.GoPdf{}
  636. pdf.Start(gopdf.Config{PageSize: gopdf.Rect{W: 595.28, H: 841.89}}) //595.28, 841.89 = A4
  637. //err = GetFont(pdf, "LiberationSerif-Regular.ttf")
  638. //if err != nil {
  639. // log.Fatalln(err)
  640. //}
  641. //err = pdf.SetFont("Ubuntu-L", "", 14)
  642. //if err != nil {
  643. // log.Fatalln(err)
  644. //}
  645. err = pdf.AddTTFFont("simsun", "static/fonts/三极行楷简体-粗.ttf")
  646. if err != nil {
  647. c.Data["json"] = lib.JSONS{Code: 204, Msg: "ok!", Data: err}
  648. c.ServeJSON()
  649. return
  650. }
  651. err = pdf.SetFont("simsun", "", 24)
  652. if err != nil {
  653. c.Data["json"] = lib.JSONS{Code: 205, Msg: "ok!", Data: err}
  654. c.ServeJSON()
  655. return
  656. }
  657. pdf.SetGrayFill(0.5)
  658. pdf.SetMargins(0, 20, 0, 20)
  659. pdf.AddPage()
  660. //use path
  661. //pdf.Image("logo.png", 100, 50, &gopdf.Rect{W: 50, H: 50})
  662. textw, _ := pdf.MeasureTextWidth(Task_r.T_name)
  663. pdf.SetX((595 / 2) - (textw / 2))
  664. pdf.SetY(40)
  665. pdf.Text(Task_r.T_name)
  666. // 线
  667. pdf.SetLineWidth(2)
  668. pdf.SetLineType("dashed")
  669. pdf.Line(10, 60, 585, 60)
  670. err = pdf.AddTTFFont("wts", "static/fonts/MiSans-Medium.ttf")
  671. if err != nil {
  672. c.Data["json"] = lib.JSONS{Code: 206, Msg: "ok!", Data: err}
  673. c.ServeJSON()
  674. return
  675. }
  676. err = pdf.SetFont("wts", "", 12)
  677. if err != nil {
  678. c.Data["json"] = lib.JSONS{Code: 207, Msg: "ok!", Data: err}
  679. c.ServeJSON()
  680. return
  681. }
  682. t_ := Time_start + " / " + Time_end
  683. if len(Time_start) == 0 {
  684. t_ = "所有数据"
  685. }
  686. //fmt.Sprintf(" %.1f ", v.T_t)
  687. lib.RectFillColor(pdf, "提取数据时间段["+t_+"]", 14, 22, 80, 550, 40, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  688. lib.RectFillColor(pdf, "布局编号", 12, 22, 120, 80, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  689. lib.RectFillColor(pdf, "证书编号", 12, 92, 120, 150, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  690. lib.RectFillColor(pdf, "温度℃", 12, 242, 120, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  691. lib.RectFillColor(pdf, "湿度%", 12, 342, 120, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  692. //lib.RectFillColor(pdf, "温度范围", 12, 272, 120, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  693. //lib.RectFillColor(pdf, "湿度范围", 12, 362, 120, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  694. lib.RectFillColor(pdf, "记录时间", 12, 442, 120, 130, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  695. var y float64 = 140
  696. err = pdf.SetFont("wts", "", 10)
  697. if err != nil {
  698. c.Data["json"] = lib.JSONS{Code: 207, Msg: "ok!", Data: err}
  699. c.ServeJSON()
  700. return
  701. }
  702. for _, v := range DeviceSensor_data_list {
  703. //text := fmt.Sprintf(" %d ", i+1)
  704. var textH float64 = 25 // if text height is 25px.
  705. pdf.SetNewY(y, textH)
  706. y = pdf.GetY()
  707. //pdf.SetX(x) // must after pdf.SetNewY() called.
  708. //err = pdf.Text(text)
  709. //if err != nil {
  710. // log.Fatalln(err)
  711. //}
  712. T_t := fmt.Sprintf(" %.1f ", v.T_t)
  713. T_rh := fmt.Sprintf(" %.1f ", v.T_rh)
  714. T_time := fmt.Sprintf("%s", v.T_time)
  715. lib.RectFillColor(pdf, v.T_id, 10, 22, y, 80, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  716. lib.RectFillColor(pdf, v.T_Certificate_sn, 10, 92, y, 150, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  717. lib.RectFillColor(pdf, T_t, 10, 242, y, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  718. lib.RectFillColor(pdf, T_rh, 10, 342, y, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  719. lib.RectFillColor(pdf, T_time, 10, 442, y, 130, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  720. y += 20
  721. }
  722. timeStr := "ofile/" + time.Now().Format("20060102150405") + ".pdf"
  723. err = pdf.WritePdf(timeStr)
  724. if err != nil {
  725. c.Data["json"] = lib.JSONS{Code: 207, Msg: "ok!", Data: err}
  726. c.ServeJSON()
  727. return
  728. }
  729. if !lib.Pload_qiniu(timeStr, timeStr) {
  730. c.Data["json"] = lib.JSONS{Code: 203, Msg: "oss!"}
  731. c.ServeJSON()
  732. return
  733. }
  734. //删除目录
  735. err = os.Remove(timeStr)
  736. if err != nil {
  737. logs.Error(lib.FuncName(), err)
  738. }
  739. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: "https://bzdcoldverifyoss.baozhida.cn/" + timeStr}
  740. c.ServeJSON()
  741. return
  742. }
  743. // 列表 - 接口
  744. func (c *TaskDataController) Check() {
  745. // 验证登录 User_is, User_r
  746. _, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  747. if !User_is {
  748. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  749. c.ServeJSON()
  750. return
  751. }
  752. T_task_id := c.GetString("T_task_id")
  753. Task_r, is := Task.Read_Task(T_task_id)
  754. if !is {
  755. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  756. c.ServeJSON()
  757. return
  758. }
  759. type R_JSONS struct {
  760. T_sn string // SN
  761. T_id string // 编号
  762. T_unm int // 数据量
  763. T_time_interval int64 // 时间间隔
  764. Time_start string // 开始
  765. Time_end string // 结束
  766. Result int // 200 OK, 201 可以补 , 202 不能补
  767. Result_str string // 提示内容
  768. Result_Time_start string // 2022-8-05 21:01
  769. Result_Time_defect int64 // 缺失时间间隔
  770. }
  771. var r_jsons []R_JSONS
  772. List := Task.Read_TaskData_ById_ClassList(Task_r.T_task_id)
  773. for _, v := range List {
  774. var r_json R_JSONS
  775. r_json.T_sn = v.T_sn
  776. r_json.Result = 200
  777. DeviceSensor_data := Task.Read_TaskData_ById_List_(Task_r.T_task_id, v.T_sn)
  778. r_json.T_unm = len(DeviceSensor_data)
  779. if r_json.T_unm > 2 {
  780. r_json.T_id = DeviceSensor_data[0].T_id
  781. r_json.Time_end = DeviceSensor_data[len(DeviceSensor_data)-1].T_time
  782. r_json.Time_start = DeviceSensor_data[0].T_time
  783. formatTime_a, _ := time.Parse("2006-1-2 15:04", DeviceSensor_data[0].T_time)
  784. formatTime_b, _ := time.Parse("2006-1-2 15:04", DeviceSensor_data[1].T_time)
  785. formatTime_x := formatTime_b.Unix() - formatTime_a.Unix()
  786. r_json.T_time_interval = formatTime_x
  787. println("formatTime_x:", v.T_id, v.T_sn, formatTime_x)
  788. if formatTime_x > 60*30 || formatTime_x < 60 {
  789. r_json.Result = 202
  790. r_json.Result_str = "数据异常(数据的第一个时间与第二个时间相差 " + strconv.FormatInt(formatTime_x, 10) + "秒),必须大于60秒,小于30分钟"
  791. r_jsons = append(r_jsons, r_json)
  792. continue
  793. }
  794. for data_i := 2; data_i < len(DeviceSensor_data); data_i++ {
  795. formatTime_a = formatTime_b
  796. formatTime_b, _ = time.Parse("2006-1-2 15:04", DeviceSensor_data[data_i].T_time)
  797. formatTime_ := formatTime_b.Unix() - formatTime_a.Unix()
  798. println("formatTime_x-:", formatTime_)
  799. if formatTime_ < formatTime_x {
  800. r_json.Result = 202
  801. r_json.Result_str = "开始时间:" + DeviceSensor_data[data_i-1].T_time + " 离下一条时间间隔:" + strconv.FormatInt(formatTime_, 10) + "秒,间隔小于时间间隔,不能自动补充"
  802. break
  803. }
  804. if formatTime_x != formatTime_ {
  805. if formatTime_ > 60*30 {
  806. r_json.Result = 202
  807. r_json.Result_str = "开始时间:" + DeviceSensor_data[data_i-1].T_time + " 离下一条时间间隔:" + strconv.FormatInt(formatTime_, 10) + "秒,相差时间大于30分钟,不能自动补充"
  808. break
  809. }
  810. r_json.Result = 201
  811. r_json.Result_str = "开始时间:" + DeviceSensor_data[data_i-1].T_time + " 离下一条时间间隔:" + strconv.FormatInt(formatTime_, 10) + "秒"
  812. r_json.Result_Time_start = DeviceSensor_data[data_i-1].T_time
  813. r_json.Result_Time_defect = formatTime_
  814. println(r_json.Result_str)
  815. break
  816. }
  817. }
  818. } else {
  819. r_json.Result = 202
  820. r_json.Result_str = "数据量太少 必须大于 2条以上!"
  821. }
  822. r_jsons = append(r_jsons, r_json)
  823. }
  824. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  825. c.ServeJSON()
  826. return
  827. }
  828. func (c *TaskDataController) TaskData_Temperature_Pdf() {
  829. // 验证登录管理员 User_is, User_r
  830. _, User_Admin_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  831. // 验证登录用户 User_is, User_r
  832. _, User_is := Account.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  833. if !User_Admin_is && !User_is {
  834. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  835. c.ServeJSON()
  836. return
  837. }
  838. Time_start := c.GetString("Time_start")
  839. Time_end := c.GetString("Time_end")
  840. T_sn := c.GetString("T_sn")
  841. T_id := c.GetString("T_id")
  842. T_task_id := c.GetString("T_task_id")
  843. err := c.TaskData_Pdf(Time_start, Time_end, T_task_id, T_sn, T_id, Task.Temperature)
  844. if err != nil {
  845. c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
  846. c.ServeJSON()
  847. return
  848. }
  849. }
  850. func (c *TaskDataController) TaskData_Humidity_Pdf() {
  851. // 验证登录管理员 User_is, User_r
  852. _, User_Admin_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  853. // 验证登录用户 User_is, User_r
  854. _, User_is := Account.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  855. if !User_Admin_is && !User_is {
  856. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  857. c.ServeJSON()
  858. return
  859. }
  860. Time_start := c.GetString("Time_start")
  861. Time_end := c.GetString("Time_end")
  862. T_sn := c.GetString("T_sn")
  863. T_id := c.GetString("T_id")
  864. T_task_id := c.GetString("T_task_id")
  865. err := c.TaskData_Pdf(Time_start, Time_end, T_task_id, T_sn, T_id, Task.Humidity)
  866. if err != nil {
  867. c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
  868. c.ServeJSON()
  869. return
  870. }
  871. }
  872. func (c *TaskDataController) TaskData_Pdf(Time_start, Time_end, T_task_id, T_sn, T_id, T_type string) (err error) {
  873. Task_r, is := Task.Read_Task(T_task_id)
  874. if !is {
  875. return errors.New("T_task_id 错误!")
  876. }
  877. user, is := Account.Read_User(Task_r.T_uuid)
  878. if !is {
  879. return errors.New("Task uuid 错误!")
  880. }
  881. if Task_r.T_delivery_state == 2 {
  882. return errors.New("数据采集中,请稍后!")
  883. }
  884. pdf := &gopdf.GoPdf{}
  885. pdf.Start(gopdf.Config{PageSize: gopdf.Rect{W: 595.28, H: 841.89}}) //595.28, 841.89 = A4
  886. err = pdf.AddTTFFont("wts", "static/fonts/MiSans-Medium.ttf")
  887. if err != nil {
  888. return
  889. }
  890. err = pdf.SetFont("wts", "", 15)
  891. if err != nil {
  892. return
  893. }
  894. pdf.SetGrayFill(0.5)
  895. pdf.SetMargins(0, 20, 0, 20)
  896. pdf.AddPage()
  897. imgH, _ := gopdf.ImageHolderByPath("./static/logo.jpg")
  898. err = pdf.ImageByHolder(imgH, 10, 10, &gopdf.Rect{W: 93, H: 32})
  899. name := user.T_name
  900. var y float64 = 40
  901. textw, _ := pdf.MeasureTextWidth(name)
  902. pdf.SetX((595 / 2) - (textw / 2))
  903. pdf.SetY(y)
  904. pdf.Text(name)
  905. y += 20
  906. T_type_name := ""
  907. if T_type == Task.Temperature {
  908. T_type_name = "温度"
  909. }
  910. if T_type == Task.Humidity {
  911. T_type_name = "湿度"
  912. }
  913. title := Task_r.T_name + T_type_name + "验证数据"
  914. textw, _ = pdf.MeasureTextWidth(title)
  915. pdf.SetX((595 / 2) - (textw / 2))
  916. pdf.SetY(y)
  917. pdf.Text(title)
  918. // 查询设备列表
  919. //dcList, _ := Device.Read_DeviceClassList_OrderList(Task_r.T_class, T_sn, T_id, "", 0, 9999)
  920. dcList := []Device.DeviceClassList{}
  921. dataList, _ := Task.Read_TaskData_ById_List(Task_r.T_task_id, T_sn, T_id, Time_start, Time_end, 0, 9999)
  922. dataListMap := make(map[string][]Task.TaskData_)
  923. dcListMap := make(map[string]string)
  924. dataMap := make(map[string]string)
  925. timeMap := make(map[string]bool)
  926. for _, data := range dataList {
  927. dataListMap[data.T_id] = append(dataListMap[data.T_id], data)
  928. if _, ok := dcListMap[data.T_id]; !ok {
  929. dcListMap[data.T_id] = data.T_sn
  930. }
  931. k := fmt.Sprintf("%s,%s", data.T_time, data.T_id)
  932. if T_type == Task.Temperature {
  933. dataMap[k] = fmt.Sprintf("%.1f", data.T_t)
  934. }
  935. if T_type == Task.Humidity {
  936. dataMap[k] = fmt.Sprintf("%.1f", data.T_rh)
  937. }
  938. if _, ok := timeMap[data.T_time]; !ok {
  939. timeMap[data.T_time] = true
  940. }
  941. }
  942. for id, sn := range dcListMap {
  943. dcList = append(dcList, Device.DeviceClassList{T_id: id, T_sn: sn})
  944. }
  945. for id, list := range dataListMap {
  946. sort.Slice(list, func(i, j int) bool {
  947. return list[i].T_time < list[j].T_time
  948. })
  949. dataListMap[id] = list
  950. }
  951. var timeList []string
  952. for k, _ := range timeMap {
  953. timeList = append(timeList, k)
  954. }
  955. sort.Slice(timeList, func(i, j int) bool {
  956. return timeList[i] < timeList[j]
  957. })
  958. err = pdf.SetFont("wts", "", 12)
  959. if err != nil {
  960. return
  961. }
  962. if len(timeList) > 0 {
  963. y += 20
  964. timeStr := fmt.Sprintf("%s - %s", timeList[0], timeList[len(timeList)-1])
  965. textw, _ = pdf.MeasureTextWidth(timeStr)
  966. pdf.SetX((595 / 2) - (textw / 2))
  967. pdf.SetY(y)
  968. pdf.Text(timeStr)
  969. }
  970. //y += 20
  971. var x float64 = 10
  972. var w float64 = 120
  973. err = pdf.SetFont("wts", "", 10)
  974. if err != nil {
  975. return
  976. }
  977. idWidthMap := make(map[string]float64)
  978. dcList1 := make([]Device.DeviceClassList, 0)
  979. for _, list := range dcList {
  980. idw, _ := pdf.MeasureTextWidth(list.T_id)
  981. if !lib.IsNumeric(list.T_id) {
  982. dcList1 = append(dcList1, list)
  983. }
  984. if idw > 20 {
  985. idWidthMap[list.T_id] = idw + 12
  986. } else {
  987. idWidthMap[list.T_id] = 30.3
  988. }
  989. }
  990. sort.Slice(dcList1, func(i, j int) bool {
  991. return dcList1[i].T_id < dcList1[j].T_id
  992. })
  993. dcList2 := listSubtract(dcList, dcList1)
  994. // 获取探头时间
  995. var timeList2 []string
  996. timeMap2 := make(map[string]struct{})
  997. for _, list := range dcList2 {
  998. dataList2, ok := dataListMap[list.T_id]
  999. if ok {
  1000. for _, data := range dataList2 {
  1001. if _, ok = timeMap2[data.T_time]; !ok {
  1002. timeMap2[data.T_time] = struct{}{}
  1003. }
  1004. }
  1005. }
  1006. }
  1007. for k, _ := range timeMap2 {
  1008. timeList2 = append(timeList2, k)
  1009. }
  1010. sort.Slice(timeList2, func(i, j int) bool {
  1011. return timeList2[i] < timeList2[j]
  1012. })
  1013. var temp int
  1014. for index, dc := range dcList1 {
  1015. dataList2, _ := dataListMap[dc.T_id]
  1016. err = pdf.SetFont("wts", "", 15)
  1017. if err != nil {
  1018. return
  1019. }
  1020. y += 30
  1021. var textH float64 = 20 // if text height is 25px.
  1022. if y >= 790 {
  1023. addStampImage(pdf, 455, y-150)
  1024. // AddWatermark(Task_r, pdf)
  1025. pdf.AddPage()
  1026. y = 30
  1027. } else {
  1028. if index > 0 {
  1029. y += 10
  1030. }
  1031. }
  1032. textw, _ = pdf.MeasureTextWidth(dc.T_id)
  1033. pdf.SetX((595 / 2) - (textw / 2))
  1034. pdf.SetY(y)
  1035. pdf.Text(dc.T_id)
  1036. y += 10
  1037. err = pdf.SetFont("wts", "", 10)
  1038. if err != nil {
  1039. return
  1040. }
  1041. if y < 790 {
  1042. x = 10
  1043. for i := 0; i < 4; i++ {
  1044. w = 113.8
  1045. lib.RectFillColor(pdf, "时间", 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1046. x += w
  1047. w = 30
  1048. lib.RectFillColor(pdf, T_type_name, 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1049. x += w
  1050. }
  1051. y += 20
  1052. } else {
  1053. addStampImage(pdf, 455, y-150)
  1054. // AddWatermark(Task_r, pdf)
  1055. pdf.AddPage()
  1056. y = 20
  1057. x = 10
  1058. for i := 0; i < 4; i++ {
  1059. w = 113.8
  1060. lib.RectFillColor(pdf, "时间", 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1061. x += w
  1062. w = 30
  1063. lib.RectFillColor(pdf, T_type_name, 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1064. x += w
  1065. }
  1066. y += 20
  1067. }
  1068. for i := 0; i < len(dataList2); i++ {
  1069. if y > 790 {
  1070. addStampImage(pdf, 455, y-130)
  1071. // AddWatermark(Task_r, pdf)
  1072. pdf.AddPage()
  1073. y = pdf.GetY()
  1074. x = 10
  1075. for k := 0; k < 4; k++ {
  1076. w = 113.8
  1077. lib.RectFillColor(pdf, "时间", 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1078. x += w
  1079. w = 30
  1080. lib.RectFillColor(pdf, T_type_name, 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1081. x += w
  1082. }
  1083. y += 20
  1084. }
  1085. temp = i % 4
  1086. // 每页添加表头
  1087. if y == 20 && temp == 0 {
  1088. x = 10
  1089. for k := 0; k < 4; k++ {
  1090. w = 113.8
  1091. lib.RectFillColor(pdf, "时间", 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1092. x += w
  1093. w = 30
  1094. lib.RectFillColor(pdf, T_type_name, 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1095. x += w
  1096. }
  1097. y += 20
  1098. }
  1099. x = 10 + 143.8*float64(temp)
  1100. w = 113.8
  1101. lib.RectFillColor(pdf, dataList2[i].T_time, 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1102. x += w
  1103. w = 30
  1104. if T_type == Task.Temperature {
  1105. lib.RectFillColor(pdf, fmt.Sprintf("%.1f", dataList2[i].T_t), 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1106. }
  1107. if T_type == Task.Humidity {
  1108. lib.RectFillColor(pdf, fmt.Sprintf("%.1f", dataList2[i].T_rh), 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1109. }
  1110. //if y > 760 {
  1111. // fmt.Println("=====y:", y)
  1112. //}
  1113. //if y > 790 {
  1114. // addStampImage(pdf, 455, y-130)
  1115. //}
  1116. if temp == 3 {
  1117. y += 20
  1118. pdf.SetNewY(y, textH)
  1119. y = pdf.GetY()
  1120. }
  1121. }
  1122. }
  1123. if len(dcList2) > 0 {
  1124. if temp != 3 {
  1125. y += 20
  1126. }
  1127. y += 40
  1128. }
  1129. sort.Slice(dcList2, func(i, j int) bool {
  1130. return dcList2[i].T_id < dcList2[j].T_id
  1131. })
  1132. chunks := splitData(dcList2, 454.5, idWidthMap)
  1133. for i, list := range chunks {
  1134. if i > 0 {
  1135. y += 40
  1136. }
  1137. if y < 790 {
  1138. x = 10
  1139. w = 120.7
  1140. lib.RectFillColor(pdf, "时间", 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1141. x += w
  1142. w = 30.3
  1143. for _, v2 := range list {
  1144. w = idWidthMap[v2.T_id]
  1145. lib.RectFillColor(pdf, v2.T_id, 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1146. x += w
  1147. }
  1148. y += 20
  1149. } else {
  1150. addStampImage(pdf, 455, y-150)
  1151. // AddWatermark(Task_r, pdf)
  1152. pdf.AddPage()
  1153. y = 20
  1154. }
  1155. StampImageX := x
  1156. for j, t := range timeList2 {
  1157. if j > 0 {
  1158. y += 20
  1159. }
  1160. if y >= 790 {
  1161. addStampImage(pdf, StampImageX-130, y-130)
  1162. // AddWatermark(Task_r, pdf)
  1163. pdf.AddPage()
  1164. y = pdf.GetY()
  1165. x = 10
  1166. w = 120.7
  1167. lib.RectFillColor(pdf, "时间", 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1168. x += w
  1169. w = 30.3
  1170. for _, v2 := range list {
  1171. w = idWidthMap[v2.T_id]
  1172. lib.RectFillColor(pdf, v2.T_id, 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1173. x += w
  1174. }
  1175. y += 20
  1176. x = 10
  1177. }
  1178. x = 10
  1179. if y == 20 {
  1180. w = 120.7
  1181. lib.RectFillColor(pdf, "时间", 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1182. x += w
  1183. w = 30.3
  1184. for _, v2 := range list {
  1185. w = idWidthMap[v2.T_id]
  1186. lib.RectFillColor(pdf, v2.T_id, 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1187. x += w
  1188. }
  1189. y += 20
  1190. x = 10
  1191. }
  1192. w = 120.7
  1193. lib.RectFillColor(pdf, t, 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1194. x += w
  1195. w = 30.3
  1196. for _, v := range list {
  1197. t_t := dataMap[fmt.Sprintf("%s,%s", t, v.T_id)]
  1198. w = idWidthMap[v.T_id]
  1199. lib.RectFillColor(pdf, t_t, 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  1200. x += w
  1201. }
  1202. StampImageX = x
  1203. }
  1204. }
  1205. if y <= 790 {
  1206. if y < 150 {
  1207. y = 20
  1208. } else {
  1209. y = y - 145
  1210. }
  1211. x = x - 135
  1212. if len(dcList2) == 0 {
  1213. x = 455
  1214. }
  1215. addStampImage(pdf, x, y)
  1216. // AddWatermark(Task_r, pdf)
  1217. } else if y > 790 && len(dcList2) == 0 {
  1218. if y < 150 {
  1219. y = 20
  1220. } else {
  1221. y = y - 145
  1222. }
  1223. addStampImage(pdf, 455, y)
  1224. }
  1225. filename := time.Now().Format("20060102150405") + ".pdf"
  1226. timeStr := "ofile/" + T_type_name + filename
  1227. err = pdf.WritePdf(timeStr)
  1228. if err != nil {
  1229. c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
  1230. c.ServeJSON()
  1231. return
  1232. }
  1233. // 上传 OSS
  1234. //url, is := NatsServer.Qiniu_UploadFile(lib.GetCurrentDirectory()+"/ofile/"+timeStr, timeStr)
  1235. //url, is := NatsServer.Qiniu_UploadFile("/Users/zoie/work/bzd_project/ColdVerify_server/"+timeStr, timeStr)
  1236. //if !is {
  1237. // err = errors.New("oss!")
  1238. // return
  1239. //}
  1240. defer func() {
  1241. //删除目录
  1242. os.Remove(timeStr)
  1243. }()
  1244. c.Ctx.Output.Download(timeStr)
  1245. //c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
  1246. //c.ServeJSON()
  1247. //return
  1248. return nil
  1249. }
  1250. // 添加公章图片
  1251. func addStampImage(pdf *gopdf.GoPdf, x, y float64) {
  1252. imagePath := "./static/commonSeal.jpg"
  1253. if x < 10 {
  1254. x = 10
  1255. }
  1256. if y < 20 {
  1257. y = 20
  1258. }
  1259. err := pdf.Image(imagePath, x, y, &gopdf.Rect{W: 123, H: 128.6})
  1260. if err != nil {
  1261. log.Print(err.Error())
  1262. }
  1263. }
  1264. func listSubtract(sliceA, sliceB []Device.DeviceClassList) []Device.DeviceClassList {
  1265. // 创建一个集合用于存储 sliceB 的元素
  1266. elementsToRemove := make(map[string]Device.DeviceClassList)
  1267. for _, item := range sliceB {
  1268. elementsToRemove[item.T_id] = item
  1269. }
  1270. // 构建新切片,包含 sliceA 中不在 elementsToRemove 中的元素
  1271. var result []Device.DeviceClassList
  1272. for _, item := range sliceA {
  1273. if _, found := elementsToRemove[item.T_id]; !found {
  1274. result = append(result, item)
  1275. }
  1276. }
  1277. return result
  1278. }
  1279. func splitData(data []Device.DeviceClassList, threshold float64, idWidthMap map[string]float64) [][]Device.DeviceClassList {
  1280. var result [][]Device.DeviceClassList
  1281. var currentBatch []Device.DeviceClassList
  1282. var currentSum float64
  1283. for _, item := range data {
  1284. wd := idWidthMap[item.T_id]
  1285. if currentSum+wd > threshold+0.1 {
  1286. // 当前批次超过阈值,切分
  1287. result = append(result, currentBatch)
  1288. // 重置当前批次和当前总和
  1289. currentBatch = []Device.DeviceClassList{}
  1290. currentSum = 0
  1291. }
  1292. currentBatch = append(currentBatch, item)
  1293. currentSum += wd
  1294. }
  1295. // 添加最后一批
  1296. if len(currentBatch) > 0 {
  1297. result = append(result, currentBatch)
  1298. }
  1299. return result
  1300. }
  1301. func AddWatermark(task Task.Task, pdf *gopdf.GoPdf) {
  1302. // 设置透明度 (通过绘制透明背景实现)
  1303. // 使用浅色字体来模拟透明度
  1304. //originalX := pdf.GetX()
  1305. //originalY := pdf.GetY()
  1306. //grayColor := color.RGBA{R: 200, G: 200, B: 200, A: 255} // 浅灰色,接近透明效果
  1307. //pdf.SetTextColor(grayColor.R, grayColor.G, grayColor.B) // 设置字体颜色
  1308. //pdf.SetFontSize(50)
  1309. //
  1310. //// 设置水印的重复布局
  1311. //text := "水印"
  1312. //xOffset := 180.0 // X 坐标的偏移量
  1313. //yOffset := 180.0 // Y 坐标的偏移量
  1314. //angle := 45.0 // 旋转角度(度)
  1315. //
  1316. //// 循环绘制水印
  1317. //for y := 0.0; y < 780; y += yOffset { // 842 是 A4 页面高度的像素数 (72 DPI)
  1318. // for x := -100.0; x < 595; x += xOffset { // 595 是 A4 页面宽度的像素数 (72 DPI)
  1319. // // 保存当前的绘制状态
  1320. // pdf.SetX(x)
  1321. // pdf.SetY(y)
  1322. // pdf.Rotate(angle, x+100, y+50) // 旋转水印
  1323. // pdf.Cell(nil, text)
  1324. // pdf.RotateReset() // 恢复旋转状态
  1325. // }
  1326. //}
  1327. //
  1328. //grayColor2 := color.RGBA{R: 0, G: 0, B: 0, A: 0} // 浅灰色,接近透明效果
  1329. //pdf.SetTextColor(grayColor2.R, grayColor2.G, grayColor2.B) // 设置字体颜色
  1330. //pdf.SetFontSize(10)
  1331. //pdf.SetX(originalX)
  1332. //pdf.SetY(originalY)
  1333. }