Data.go 26 KB

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