Data.go 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909
  1. package controllers
  2. import (
  3. "Cold_Api/Nats/NatsServer"
  4. "Cold_Api/conf"
  5. "Cold_Api/controllers/lib"
  6. "Cold_Api/logs"
  7. "Cold_Api/models/Account"
  8. "Cold_Api/models/Device"
  9. "fmt"
  10. beego "github.com/beego/beego/v2/server/web"
  11. "github.com/signintech/gopdf"
  12. "github.com/xuri/excelize/v2"
  13. "math"
  14. "os"
  15. "strconv"
  16. "time"
  17. )
  18. type DataController struct {
  19. beego.Controller
  20. Admin_r Account.Admin // 登陆的用户
  21. T_pid int // 公司id
  22. }
  23. func (c *DataController) Prepare() {
  24. GetCookie := c.Ctx.GetCookie("User_tokey")
  25. GetString := c.GetString("User_tokey")
  26. User_tokey := GetCookie
  27. if len(User_tokey) == 0 {
  28. User_tokey = GetString
  29. }
  30. if Account.Admin_r == nil {
  31. return
  32. }
  33. c.Admin_r = *Account.Admin_r
  34. T_pid := c.Admin_r.T_pid
  35. EntryPid, _ := Account.Redis_Tokey_T_pid_Get(User_tokey)
  36. if EntryPid > 0 {
  37. T_pid = EntryPid
  38. }
  39. c.T_pid = T_pid
  40. }
  41. // 获取传感器
  42. func (c *DataController) Device_Sensor_Get() {
  43. T_sn := c.GetString("T_sn")
  44. T_id, _ := c.GetInt("T_id")
  45. //c.Data["Class_List"] = Device.Read_Class_All_1()
  46. DeviceSensor_r, err := Device.Read_DeviceSensor_ByTsn_Tid(T_sn, T_id)
  47. if err != nil {
  48. c.Data["json"] = lib.JSONS{Code: 202, Msg: "获取失败!"}
  49. c.ServeJSON()
  50. return
  51. }
  52. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Device.DeviceSensorToDeviceSensor_R(DeviceSensor_r)}
  53. c.ServeJSON()
  54. return
  55. }
  56. // 传感器列表
  57. func (c *DataController) Device_Sensor_List() {
  58. type R_JSONS struct {
  59. //必须的大写开头
  60. DeviceSensor_lite []Device.DeviceSensor_R
  61. Num int
  62. Page int
  63. Page_size int
  64. Pages []lib.Page_T
  65. }
  66. var r_jsons R_JSONS
  67. page, _ := c.GetInt("page")
  68. if page < 1 {
  69. page = 1
  70. }
  71. page_z, _ := c.GetInt("page_z")
  72. if page_z == 0 {
  73. page_z = conf.Page_size
  74. }
  75. T_Class_id, _ := c.GetInt("T_calssid")
  76. T_type, T_type_err := c.GetInt("T_type")
  77. if T_type_err != nil {
  78. T_type = -1
  79. }
  80. T_name := c.GetString("T_name")
  81. // 数据展示页面
  82. T_RealTime, T_RealTime_err := c.GetInt("T_RealTime")
  83. if T_RealTime_err != nil {
  84. T_RealTime = 0
  85. }
  86. // 轨迹展示页面
  87. T_MapShow, T_MapShow_err := c.GetInt("T_MapShow")
  88. if T_MapShow_err != nil {
  89. T_MapShow = 0
  90. }
  91. var cnt int64
  92. Device.Read_DeviceSensorParameter_All_Map("", 0)
  93. r_jsons.DeviceSensor_lite, cnt = Device.Read_DeviceSensor_List_For_Data(c.T_pid, T_name, T_Class_id, T_type, T_RealTime, T_MapShow, page, page_z)
  94. page_size := math.Ceil(float64(cnt) / float64(page_z))
  95. r_jsons.Page = page
  96. r_jsons.Page_size = int(page_size)
  97. r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
  98. r_jsons.Num = int(cnt)
  99. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  100. c.ServeJSON()
  101. return
  102. }
  103. // 传感器数据列表
  104. func (c *DataController) Device_Sensor_Data() {
  105. page, _ := c.GetInt("page")
  106. page_z, _ := c.GetInt("page_z")
  107. T_id, _ := c.GetInt("T_id")
  108. SN := c.GetString("T_sn")
  109. Time_start := c.GetString("Time_start")
  110. Time_end := c.GetString("Time_end")
  111. type R_JSONS struct {
  112. //必须的大写开头
  113. DeviceSensor_data []Device.DeviceData_R
  114. Num int
  115. Page int
  116. Page_size int
  117. Pages []lib.Page_T
  118. }
  119. var r_jsons R_JSONS
  120. var cnt int
  121. Device.Read_DeviceSensorParameter_All_Map(SN, T_id)
  122. r_jsons.DeviceSensor_data, cnt = Device.Read_DeviceData_ById_List(SN, T_id, Time_start, Time_end, page, page_z)
  123. page_size := math.Ceil(float64(cnt) / float64(page_z))
  124. r_jsons.Page = page
  125. r_jsons.Page_size = int(page_size)
  126. r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
  127. r_jsons.Num = cnt
  128. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  129. c.ServeJSON()
  130. return
  131. }
  132. // 实时轨迹
  133. func (c *DataController) Device_Sensor_Data_Real() {
  134. page, _ := c.GetInt("page")
  135. page_z, _ := c.GetInt("page_z")
  136. T_id, _ := c.GetInt("T_id")
  137. T_sn := c.GetString("T_sn")
  138. TaskList, num := Device.Read_DeviceTask_All(T_sn)
  139. if num == 0 {
  140. c.Data["json"] = lib.JSONS{Code: 202, Msg: "暂时没有轨迹信息"}
  141. c.ServeJSON()
  142. return
  143. }
  144. Time_start := TaskList[0].T_Ut_start
  145. Time_end := TaskList[0].T_Ut_end
  146. type R_JSONS struct {
  147. //必须的大写开头
  148. DeviceSensor_data []Device.DeviceData_R
  149. Num int
  150. Page int
  151. Page_size int
  152. Pages []lib.Page_T
  153. }
  154. var r_jsons R_JSONS
  155. var cnt int
  156. Device.Read_DeviceSensorParameter_All_Map(T_sn, T_id)
  157. r_jsons.DeviceSensor_data, cnt = Device.Read_DeviceData_ById_List(T_sn, T_id, Time_start, Time_end, page, page_z)
  158. page_size := math.Ceil(float64(cnt) / float64(page_z))
  159. r_jsons.Page = page
  160. r_jsons.Page_size = int(page_size)
  161. r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
  162. r_jsons.Num = cnt
  163. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  164. c.ServeJSON()
  165. return
  166. }
  167. // 设备数据
  168. func (c *DataController) Device_Sensor_Data_More() {
  169. page, _ := c.GetInt("page")
  170. if page < 1 {
  171. page = 1
  172. }
  173. page_z, _ := c.GetInt("page_z")
  174. if page_z < 1 {
  175. page_z = conf.Page_size
  176. }
  177. T_snid := c.GetString("T_snid")
  178. Time_start := c.GetString("Time_start")
  179. Time_end := c.GetString("Time_end")
  180. if len(T_snid) < 10 {
  181. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  182. c.ServeJSON()
  183. return
  184. }
  185. type R_JSONS struct {
  186. //必须的大写开头
  187. Data []Device.DeviceData_R
  188. Num int64
  189. Page int
  190. Page_size int
  191. }
  192. var r_jsons R_JSONS
  193. r_jsons.Data, r_jsons.Num = Device.Read_DeviceData_By_T_snid_List(T_snid, Time_start, Time_end, page, page_z)
  194. r_jsons.Page = page
  195. r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
  196. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  197. c.ServeJSON()
  198. return
  199. }
  200. // -------------------------------------
  201. // 导出传感器数据列表
  202. func (c *DataController) Device_Sensor_Data_Excel() {
  203. T_snid := c.GetString("T_snid")
  204. Time_start := c.GetString("Time_start")
  205. Time_end := c.GetString("Time_end")
  206. if len(T_snid) < 10 {
  207. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  208. c.ServeJSON()
  209. return
  210. }
  211. var DeviceSensor_data []Device.DeviceData_R
  212. DeviceSensor_data, _ = Device.Read_DeviceData_By_T_snid_List(T_snid, Time_start, Time_end, 0, 9999)
  213. f := excelize.NewFile() // 设置单元格的值
  214. // 这里设置表头
  215. f.SetCellValue("Sheet1", "A1", "编号")
  216. f.SetCellValue("Sheet1", "B1", "传感器名称")
  217. f.SetCellValue("Sheet1", "C1", "温度℃")
  218. f.SetCellValue("Sheet1", "D1", "湿度%")
  219. f.SetCellValue("Sheet1", "E1", "温度范围 ℃")
  220. f.SetCellValue("Sheet1", "F1", "湿度范围 %")
  221. f.SetCellValue("Sheet1", "G1", "记录时间")
  222. f.SetCellValue("Sheet1", "H1", "备注")
  223. // 设置列宽
  224. f.SetColWidth("Sheet1", "A", "A", 10)
  225. f.SetColWidth("Sheet1", "B", "B", 15)
  226. f.SetColWidth("Sheet1", "C", "D", 10)
  227. f.SetColWidth("Sheet1", "E", "F", 15)
  228. f.SetColWidth("Sheet1", "G", "G", 22)
  229. f.SetColWidth("Sheet1", "H", "H", 22)
  230. line := 1
  231. headStyleLower, _ := f.NewStyle(
  232. &excelize.Style{
  233. Font: &excelize.Font{Size: 11, Color: "#ff8585", Family: "arial"},
  234. })
  235. headStyleUpper, _ := f.NewStyle(
  236. &excelize.Style{
  237. Font: &excelize.Font{Size: 11, Color: "#ff8585", Family: "arial"},
  238. })
  239. // 循环写入数据
  240. for _, v := range DeviceSensor_data {
  241. line++
  242. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), line-1)
  243. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v.T_name+"["+strconv.Itoa(v.T_id)+"]")
  244. if v.T_ist == 1 {
  245. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v.T_t)
  246. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), strconv.FormatFloat(float64(v.T_tl), 'f', 2, 64)+"~"+strconv.FormatFloat(float64(v.T_tu), 'f', 2, 64))
  247. if v.T_t < v.T_tl || v.T_t > v.T_tu {
  248. f.SetCellStyle("Sheet1", fmt.Sprintf("A%d", line), fmt.Sprintf("G%d", line), headStyleLower)
  249. }
  250. }
  251. if v.T_ish == 1 {
  252. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.T_rh)
  253. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), strconv.FormatFloat(float64(v.T_rhl), 'f', 2, 64)+"~"+strconv.FormatFloat(float64(v.T_rhu), 'f', 2, 64))
  254. if v.T_rh < v.T_rhl || v.T_rh > v.T_rhu {
  255. f.SetCellStyle("Sheet1", fmt.Sprintf("A%d", line), fmt.Sprintf("G%d", line), headStyleUpper)
  256. }
  257. }
  258. f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), v.T_time)
  259. f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), v.T_remark)
  260. //if v.T_ist == 1 && (v.T_t < v.T_tl || v.T_t > v.T_tu) {
  261. // f.SetCellStyle("Sheet1", fmt.Sprintf("A%d", line), fmt.Sprintf("G%d", line), headStyleLower)
  262. //}
  263. //if v.T_ish == 1 && (v.T_rh < v.T_rhl || v.T_rh > v.T_rhu) {
  264. // f.SetCellStyle("Sheet1", fmt.Sprintf("A%d", line), fmt.Sprintf("G%d", line), headStyleUpper)
  265. //}
  266. }
  267. timeStr := time.Now().Format("20060102150405")
  268. // 保存文件
  269. if err := f.SaveAs("ofile/" + timeStr + ".xlsx"); err != nil {
  270. fmt.Println(err)
  271. }
  272. // 上传 OSS
  273. url, is := NatsServer.Qiniu_UploadFile(lib.GetCurrentDirectory()+"/ofile/"+timeStr+".xlsx", "ofile/"+timeStr+".xlsx")
  274. if !is {
  275. c.Data["json"] = lib.JSONS{Code: 202, Msg: "oss!"}
  276. c.ServeJSON()
  277. return
  278. }
  279. //删除目录
  280. err := os.Remove("ofile/" + timeStr + ".xlsx")
  281. if err != nil {
  282. fmt.Println(err)
  283. }
  284. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
  285. c.ServeJSON()
  286. return
  287. }
  288. // 列表 - 接口
  289. func (c *DataController) Device_Sensor_Data_Excel_m() {
  290. T_snid := c.GetString("T_snid")
  291. Time_start := c.GetString("Time_start")
  292. Time_end := c.GetString("Time_end")
  293. t_x, _ := c.GetInt("t_x")
  294. if len(T_snid) < 10 {
  295. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  296. c.ServeJSON()
  297. return
  298. }
  299. var DeviceSensor_data []Device.DeviceData_R
  300. DeviceSensor_data, _ = Device.Read_DeviceData_By_T_snid_List(T_snid, Time_start, Time_end, 0, 9999)
  301. f := excelize.NewFile() // 设置单元格的值
  302. // 这里设置表头
  303. f.SetCellValue("Sheet1", "A1", "编号")
  304. f.SetCellValue("Sheet1", "B1", "传感器名称")
  305. f.SetCellValue("Sheet1", "C1", "温度℃")
  306. f.SetCellValue("Sheet1", "D1", "湿度%")
  307. f.SetCellValue("Sheet1", "E1", "温度范围 ℃")
  308. f.SetCellValue("Sheet1", "F1", "湿度范围 %")
  309. f.SetCellValue("Sheet1", "G1", "记录时间")
  310. // 设置列宽
  311. f.SetColWidth("Sheet1", "A", "A", 10)
  312. f.SetColWidth("Sheet1", "B", "B", 15)
  313. f.SetColWidth("Sheet1", "C", "D", 10)
  314. f.SetColWidth("Sheet1", "E", "F", 15)
  315. f.SetColWidth("Sheet1", "G", "G", 22)
  316. line := 1
  317. headStyleLower, _ := f.NewStyle(
  318. &excelize.Style{
  319. Font: &excelize.Font{Size: 11, Color: "#a8f7ff", Family: "arial"},
  320. })
  321. headStyleUpper, _ := f.NewStyle(
  322. &excelize.Style{
  323. Font: &excelize.Font{Size: 11, Color: "#ff8585", Family: "arial"},
  324. })
  325. atime, _ := time.ParseDuration("-1m") // Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
  326. // 循环写入数据
  327. for v_i, v := range DeviceSensor_data {
  328. line++
  329. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), line-1)
  330. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v.T_name+"["+strconv.Itoa(v.T_id)+"]")
  331. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v.T_t)
  332. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.T_rh)
  333. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), strconv.FormatFloat(float64(v.T_tl), 'f', 2, 64)+"~"+strconv.FormatFloat(float64(v.T_tu), 'f', 2, 64))
  334. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), strconv.FormatFloat(float64(v.T_rhl), 'f', 2, 64)+"~"+strconv.FormatFloat(float64(v.T_rhu), 'f', 2, 64))
  335. f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), v.T_time)
  336. if v.T_t < v.T_tl || v.T_t > v.T_tu {
  337. f.SetCellStyle("Sheet1", fmt.Sprintf("A%d", line), fmt.Sprintf("G%d", line), headStyleLower)
  338. }
  339. if v.T_rh < v.T_rhl || v.T_rh > v.T_rhu {
  340. f.SetCellStyle("Sheet1", fmt.Sprintf("A%d", line), fmt.Sprintf("G%d", line), headStyleUpper)
  341. }
  342. if len(DeviceSensor_data)-1 == v_i {
  343. break
  344. }
  345. cha_v := ((DeviceSensor_data[v_i+1].T_t - v.T_t) / 3)
  346. println("t_x:", t_x)
  347. for i := 0; i < t_x; i++ {
  348. println("// -------", i)
  349. v.T_t = float32(lib.Decimal(float64(v.T_t + cha_v)))
  350. fTime, _ := time.Parse("2006-01-02 15:04:05", v.T_time)
  351. fTime = fTime.Add(atime)
  352. v.T_time = fTime.Format("2006-01-02 15:04:05")
  353. line++
  354. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), line-1)
  355. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v.T_name+"["+strconv.Itoa(v.T_id)+"]")
  356. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v.T_t)
  357. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.T_rh)
  358. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), strconv.FormatFloat(float64(v.T_tl), 'f', 2, 64)+"~"+strconv.FormatFloat(float64(v.T_tu), 'f', 2, 64))
  359. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), strconv.FormatFloat(float64(v.T_rhl), 'f', 2, 64)+"~"+strconv.FormatFloat(float64(v.T_rhu), 'f', 2, 64))
  360. f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), v.T_time)
  361. if v.T_t < v.T_tl || v.T_t > v.T_tu {
  362. f.SetCellStyle("Sheet1", fmt.Sprintf("A%d", line), fmt.Sprintf("G%d", line), headStyleLower)
  363. }
  364. if v.T_rh < v.T_rhl || v.T_rh > v.T_rhu {
  365. f.SetCellStyle("Sheet1", fmt.Sprintf("A%d", line), fmt.Sprintf("G%d", line), headStyleUpper)
  366. }
  367. }
  368. }
  369. timeStr := time.Now().Format("20060102150405")
  370. // 保存文件
  371. if err := f.SaveAs("ofile/" + timeStr + ".xlsx"); err != nil {
  372. fmt.Println(err)
  373. }
  374. // 上传 OSS
  375. url, is := NatsServer.Qiniu_UploadFile(lib.GetCurrentDirectory()+"/ofile/"+timeStr+".xlsx", "ofile/"+timeStr+".xlsx")
  376. if !is {
  377. c.Data["json"] = lib.JSONS{Code: 202, Msg: "oss!"}
  378. c.ServeJSON()
  379. return
  380. }
  381. //删除目录
  382. //err := os.Remove("ofile/" + timeStr + ".xlsx")
  383. //if err != nil {
  384. // fmt.Println(err)
  385. //}
  386. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
  387. c.ServeJSON()
  388. return
  389. }
  390. // 小程序 - 打印
  391. func (c *DataController) DeviceSensor_Data_Print() {
  392. SN := c.GetString("T_sn")
  393. Time_start := c.GetString("Time_start")
  394. Time_end := c.GetString("Time_end")
  395. type R_JSONS struct {
  396. //必须的大写开头
  397. T_time string
  398. T1 interface{}
  399. T2 interface{}
  400. T3 interface{}
  401. T4 interface{}
  402. }
  403. r_jsons := make(map[string]R_JSONS)
  404. type JSONS struct {
  405. //必须的大写开头
  406. Code int16
  407. Msg string
  408. DeviceSensorNum int
  409. DeviceSensor Device.DeviceSensor_Applet
  410. AdminNane string
  411. Data interface{} // 泛型
  412. }
  413. GROUP_BY_t_time := Device.Read_DeviceData_List_GROUP_BY_t_time(SN, Time_start, Time_end)
  414. // 时间 MAP
  415. for _, vt := range GROUP_BY_t_time {
  416. stamp, _ := time.Parse("2006-1-02 15:04:05", lib.To_string(vt[0]))
  417. T_time := stamp.Format("2006-01-02 15:04:05")
  418. r_jsons[T_time] = R_JSONS{T_time: T_time, T1: nil, T2: nil, T3: nil, T4: nil}
  419. }
  420. dsList := Device.Read_DeviceSensor_List_T_sn_T_datashow(SN)
  421. if len(dsList) == 0 {
  422. c.Data["json"] = JSONS{Code: 200, Msg: "ok!", DeviceSensorNum: len(dsList), Data: r_jsons}
  423. c.ServeJSON()
  424. return
  425. }
  426. company, _ := Account.Read_Company_ById(c.T_pid)
  427. for i, v := range dsList {
  428. if i >= 4 {
  429. break
  430. }
  431. // 记录传感器
  432. maps, num := Device.Read_DeviceData_ById_List(SN, v.T_id, Time_start, Time_end, 1, 9999)
  433. if num > 0 {
  434. for _, v_map := range maps {
  435. ws, ok := r_jsons[v_map.T_time]
  436. if ok {
  437. switch i {
  438. case 0:
  439. ws.T1 = v_map
  440. case 1:
  441. ws.T2 = v_map
  442. case 2:
  443. ws.T3 = v_map
  444. case 3:
  445. ws.T4 = v_map
  446. }
  447. r_jsons[v_map.T_time] = ws
  448. }
  449. }
  450. }
  451. }
  452. c.Data["json"] = JSONS{Code: 200, Msg: "ok!", DeviceSensorNum: len(dsList), DeviceSensor: Device.DeviceSensorToDeviceSensor_Applet(dsList[0]), AdminNane: company.T_name, Data: r_jsons}
  453. c.ServeJSON()
  454. return
  455. }
  456. // 列表 - 接口
  457. func (c *DataController) Device_Sensor_Data_PDF() {
  458. T_snid := c.GetString("T_snid")
  459. Time_start := c.GetString("Time_start")
  460. Time_end := c.GetString("Time_end")
  461. if len(T_snid) < 10 {
  462. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_snid Err!"}
  463. c.ServeJSON()
  464. return
  465. }
  466. var DeviceSensor_data []Device.DeviceData_R
  467. DeviceSensor_data, _ = Device.Read_DeviceData_By_T_snid_List(T_snid, Time_start, Time_end, 0, 9999)
  468. var err error
  469. pdf := &gopdf.GoPdf{}
  470. pdf.Start(gopdf.Config{PageSize: gopdf.Rect{W: 595.28, H: 841.89}}) //595.28, 841.89 = A4
  471. //err = GetFont(pdf, "LiberationSerif-Regular.ttf")
  472. //if err != nil {
  473. // log.Fatalln(err)
  474. //}
  475. //err = pdf.SetFont("Ubuntu-L", "", 14)
  476. //if err != nil {
  477. // log.Fatalln(err)
  478. //}
  479. err = pdf.AddTTFFont("simsun", "static/fonts/三极行楷简体-粗.ttf")
  480. if err != nil {
  481. c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
  482. c.ServeJSON()
  483. return
  484. }
  485. err = pdf.SetFont("simsun", "", 24)
  486. if err != nil {
  487. c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
  488. c.ServeJSON()
  489. return
  490. }
  491. pdf.SetGrayFill(0.5)
  492. pdf.SetMargins(0, 20, 0, 20)
  493. pdf.AddPage()
  494. //use path
  495. //pdf.Image("logo.png", 100, 50, &gopdf.Rect{W: 50, H: 50})
  496. company, _ := Account.Read_Company_ById(c.T_pid)
  497. textw, _ := pdf.MeasureTextWidth(company.T_name)
  498. pdf.SetX((595 / 2) - (textw / 2))
  499. pdf.SetY(40)
  500. pdf.Text(company.T_name)
  501. // 线
  502. pdf.SetLineWidth(2)
  503. pdf.SetLineType("dashed")
  504. pdf.Line(10, 60, 585, 60)
  505. err = pdf.AddTTFFont("wts", "static/fonts/MiSans-Medium.ttf")
  506. if err != nil {
  507. c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
  508. c.ServeJSON()
  509. return
  510. }
  511. err = pdf.SetFont("wts", "", 12)
  512. if err != nil {
  513. c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
  514. c.ServeJSON()
  515. return
  516. }
  517. var s_time, e_time string
  518. if len(DeviceSensor_data) > 0 {
  519. s_time = fmt.Sprintf("%s", DeviceSensor_data[0].T_time)
  520. e_time = fmt.Sprintf("%s", DeviceSensor_data[len(DeviceSensor_data)-1].T_time)
  521. }
  522. //fmt.Sprintf(" %.1f ", v.T_t)
  523. lib.RectFillColor(pdf, "历史数据["+e_time+" / "+s_time+"]", 14, 22, 80, 550, 40, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  524. lib.RectFillColor(pdf, "序号", 12, 22, 120, 30, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  525. lib.RectFillColor(pdf, "传感器名称", 12, 52, 120, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  526. lib.RectFillColor(pdf, "温度℃", 12, 152, 120, 50, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  527. lib.RectFillColor(pdf, "湿度%", 12, 202, 120, 50, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  528. lib.RectFillColor(pdf, "温度范围", 12, 252, 120, 80, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  529. lib.RectFillColor(pdf, "湿度范围", 12, 332, 120, 80, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  530. lib.RectFillColor(pdf, "记录时间", 12, 412, 120, 120, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  531. lib.RectFillColor(pdf, "备注", 12, 532, 120, 40, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  532. var y float64 = 140
  533. err = pdf.SetFont("wts", "", 10)
  534. if err != nil {
  535. c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
  536. c.ServeJSON()
  537. return
  538. }
  539. for i, v := range DeviceSensor_data {
  540. text := fmt.Sprintf(" %d ", i+1)
  541. var textH float64 = 25 // if text height is 25px.
  542. pdf.SetNewY(y, textH)
  543. y = pdf.GetY()
  544. //pdf.SetX(x) // must after pdf.SetNewY() called.
  545. //err = pdf.Text(text)
  546. //if err != nil {
  547. // log.Fatalln(err)
  548. //}
  549. T_t := fmt.Sprintf(" %.1f ", v.T_t)
  550. T_rh := fmt.Sprintf(" %.1f ", v.T_rh)
  551. T_Tlu := fmt.Sprintf(" %.1f ~ %.1f ", v.T_tl, v.T_tu)
  552. T_Rlu := fmt.Sprintf(" %.1f ~ %.1f ", v.T_rhl, v.T_rhu)
  553. T_time := fmt.Sprintf("%s", v.T_time)
  554. if v.T_ist == 1 {
  555. lib.RectFillColor(pdf, T_t, 10, 152, y, 50, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  556. lib.RectFillColor(pdf, T_Tlu, 10, 252, y, 80, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  557. } else {
  558. lib.RectFillColor(pdf, "", 10, 152, y, 50, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  559. lib.RectFillColor(pdf, "", 10, 252, y, 80, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  560. }
  561. if v.T_ish == 1 {
  562. lib.RectFillColor(pdf, T_rh, 10, 202, y, 50, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  563. lib.RectFillColor(pdf, T_Rlu, 10, 332, y, 80, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  564. } else {
  565. lib.RectFillColor(pdf, "", 10, 202, y, 50, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  566. lib.RectFillColor(pdf, "", 10, 332, y, 80, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  567. }
  568. lib.RectFillColor(pdf, text, 10, 22, y, 30, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  569. lib.RectFillColor(pdf, v.T_name, 10, 52, y, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  570. lib.RectFillColor(pdf, T_time, 10, 412, y, 120, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  571. lib.RectFillColor(pdf, v.T_remark, 10, 532, y, 40, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  572. y += 20
  573. }
  574. timeStr := "ofile/" + time.Now().Format("20060102150405") + ".pdf"
  575. err = pdf.WritePdf(timeStr)
  576. if err != nil {
  577. c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
  578. c.ServeJSON()
  579. return
  580. }
  581. // 上传 OSS
  582. url, is := NatsServer.Qiniu_UploadFile(lib.GetCurrentDirectory()+"/"+timeStr, timeStr)
  583. if !is {
  584. c.Data["json"] = lib.JSONS{Code: 202, Msg: "oss!"}
  585. c.ServeJSON()
  586. return
  587. }
  588. //删除目录
  589. err = os.Remove(timeStr)
  590. if err != nil {
  591. fmt.Println(err)
  592. }
  593. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
  594. c.ServeJSON()
  595. return
  596. }
  597. // 数据备份
  598. func (c *DataController) Device_Sensor_Data_BackUp() {
  599. page, _ := c.GetInt("page")
  600. if page < 1 {
  601. page = 1
  602. }
  603. page_z, _ := c.GetInt("page_z")
  604. if page_z < 1 {
  605. page_z = conf.Page_size
  606. }
  607. T_snid := c.GetString("T_snid")
  608. Time_start := c.GetString("Time_start")
  609. Time_end := c.GetString("Time_end")
  610. if len(T_snid) < 10 {
  611. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_snid Err!"}
  612. c.ServeJSON()
  613. return
  614. }
  615. if _, is := lib.DateStrToDate(Time_start); !is {
  616. c.Data["json"] = lib.JSONS{Code: 202, Msg: "日期格式错误!"}
  617. c.ServeJSON()
  618. return
  619. }
  620. if _, is := lib.DateStrToDate(Time_end); !is {
  621. c.Data["json"] = lib.JSONS{Code: 202, Msg: "日期格式错误!"}
  622. c.ServeJSON()
  623. return
  624. }
  625. Time_start += " 00:00:00"
  626. Time_end += " 23:59:59"
  627. var r_jsons lib.R_JSONS
  628. r_jsons.Data, r_jsons.Num = Device.Read_DeviceData_BackUp_List(T_snid, Time_start, Time_end, page, page_z)
  629. r_jsons.Page = page
  630. r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
  631. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  632. c.ServeJSON()
  633. return
  634. }
  635. // 数据备份pdf
  636. func (c *DataController) Device_Sensor_Data_BackUp_PDF() {
  637. T_sn := c.GetString("T_sn")
  638. T_id, _ := c.GetInt("T_id")
  639. T_date := c.GetString("T_date")
  640. T_snid := fmt.Sprintf("%s,%d", T_sn, T_id)
  641. date, is := lib.DateStrToDate(T_date)
  642. if !is {
  643. c.Data["json"] = lib.JSONS{Code: 202, Msg: "日期格式错误!"}
  644. c.ServeJSON()
  645. return
  646. }
  647. Time_start := T_date + " 00:00:00"
  648. Time_end := T_date + " 23:59:59"
  649. var DeviceSensor_data []Device.DeviceData_R
  650. DeviceSensor_data, _ = Device.Read_DeviceData_By_T_snid_List(T_snid, Time_start, Time_end, 0, 9999)
  651. var err error
  652. pdf := &gopdf.GoPdf{}
  653. pdf.Start(gopdf.Config{PageSize: gopdf.Rect{W: 595.28, H: 841.89}}) //595.28, 841.89 = A4
  654. //err = GetFont(pdf, "LiberationSerif-Regular.ttf")
  655. //if err != nil {
  656. // log.Fatalln(err)
  657. //}
  658. //err = pdf.SetFont("Ubuntu-L", "", 14)
  659. //if err != nil {
  660. // log.Fatalln(err)
  661. //}
  662. err = pdf.AddTTFFont("simsun", "static/fonts/三极行楷简体-粗.ttf")
  663. if err != nil {
  664. c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
  665. c.ServeJSON()
  666. return
  667. }
  668. err = pdf.SetFont("simsun", "", 24)
  669. if err != nil {
  670. c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
  671. c.ServeJSON()
  672. return
  673. }
  674. pdf.SetGrayFill(0.5)
  675. pdf.SetMargins(0, 20, 0, 20)
  676. pdf.AddPage()
  677. //use path
  678. //pdf.Image("logo.png", 100, 50, &gopdf.Rect{W: 50, H: 50})
  679. company, _ := Account.Read_Company_ById(c.T_pid)
  680. textw, _ := pdf.MeasureTextWidth(company.T_name)
  681. pdf.SetX((595 / 2) - (textw / 2))
  682. pdf.SetY(40)
  683. pdf.Text(company.T_name)
  684. // 线
  685. pdf.SetLineWidth(2)
  686. pdf.SetLineType("dashed")
  687. pdf.Line(10, 60, 585, 60)
  688. err = pdf.AddTTFFont("wts", "static/fonts/MiSans-Medium.ttf")
  689. if err != nil {
  690. c.Data["json"] = lib.JSONS{Code: 202, Msg: "ok!", Data: err}
  691. c.ServeJSON()
  692. return
  693. }
  694. err = pdf.SetFont("wts", "", 12)
  695. if err != nil {
  696. c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
  697. c.ServeJSON()
  698. return
  699. }
  700. var s_time, e_time string
  701. if len(DeviceSensor_data) > 0 {
  702. s_time = fmt.Sprintf("%s", DeviceSensor_data[0].T_time)
  703. e_time = fmt.Sprintf("%s", DeviceSensor_data[len(DeviceSensor_data)-1].T_time)
  704. }
  705. //fmt.Sprintf(" %.1f ", v.T_t)
  706. lib.RectFillColor(pdf, "历史数据["+e_time+" / "+s_time+"]", 14, 22, 80, 550, 40, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  707. lib.RectFillColor(pdf, "序号", 12, 22, 120, 30, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  708. lib.RectFillColor(pdf, "传感器名称", 12, 52, 120, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  709. lib.RectFillColor(pdf, "温度℃", 12, 152, 120, 60, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  710. lib.RectFillColor(pdf, "湿度%", 12, 212, 120, 60, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  711. lib.RectFillColor(pdf, "温度范围", 12, 272, 120, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  712. lib.RectFillColor(pdf, "湿度范围", 12, 362, 120, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  713. lib.RectFillColor(pdf, "记录时间", 12, 452, 120, 120, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  714. var y float64 = 140
  715. err = pdf.SetFont("wts", "", 10)
  716. if err != nil {
  717. c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
  718. c.ServeJSON()
  719. return
  720. }
  721. for i, v := range DeviceSensor_data {
  722. text := fmt.Sprintf(" %d ", i+1)
  723. var textH float64 = 25 // if text height is 25px.
  724. pdf.SetNewY(y, textH)
  725. y = pdf.GetY()
  726. //pdf.SetX(x) // must after pdf.SetNewY() called.
  727. //err = pdf.Text(text)
  728. //if err != nil {
  729. // log.Fatalln(err)
  730. //}
  731. T_t := fmt.Sprintf(" %.1f ", v.T_t)
  732. T_rh := fmt.Sprintf(" %.1f ", v.T_rh)
  733. T_Tlu := fmt.Sprintf(" %.1f ~ %.1f ", v.T_tl, v.T_tu)
  734. T_Rlu := fmt.Sprintf(" %.1f ~ %.1f ", v.T_rhl, v.T_rhu)
  735. T_time := fmt.Sprintf("%s", v.T_time)
  736. //if user_r.Admin_rh == 0 && strings.Contains(v.T_sn, "YD") {
  737. // T_rh = "-"
  738. // T_Rlu = "-"
  739. //}
  740. lib.RectFillColor(pdf, text, 10, 22, y, 30, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  741. lib.RectFillColor(pdf, v.T_name, 10, 52, y, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  742. lib.RectFillColor(pdf, T_t, 10, 152, y, 60, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  743. lib.RectFillColor(pdf, T_rh, 10, 212, y, 60, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  744. lib.RectFillColor(pdf, T_Tlu, 10, 272, y, 90, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  745. lib.RectFillColor(pdf, T_Rlu, 10, 362, y, 90, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  746. lib.RectFillColor(pdf, T_time, 10, 452, y, 120, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
  747. y += 20
  748. }
  749. deviceSensor, _ := Device.Read_DeviceSensor_ByT_sn(T_sn, T_id)
  750. rand_x := int64(lib.Random(0, 10000))
  751. filenameStr := fmt.Sprintf("backup/sn/%s_%s(%s).pdf", lib.GetRandstring(8, "0123456789", rand_x), deviceSensor.T_name, date.Format("2006-01-02"))
  752. err = pdf.WritePdf(filenameStr)
  753. if err != nil {
  754. c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
  755. c.ServeJSON()
  756. return
  757. }
  758. // 上传 OSS
  759. url, is := NatsServer.Qiniu_UploadFile(lib.GetCurrentDirectory()+"/"+filenameStr, filenameStr)
  760. if !is {
  761. c.Data["json"] = lib.JSONS{Code: 202, Msg: "oss!"}
  762. c.ServeJSON()
  763. return
  764. }
  765. //删除目录
  766. err = os.Remove(filenameStr)
  767. if err != nil {
  768. logs.Error(lib.FuncName(), err)
  769. }
  770. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
  771. c.ServeJSON()
  772. return
  773. }