excelController.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. /*
  2. * @Author: liling
  3. * @Date: 2022-08-13 14:38:13
  4. * @LastEditors: liling
  5. * @LastEditTime: 2022-08-13 14:38:15
  6. * @FilePath: \police_security\controllers\exelController.go
  7. * @Description:excel导入导出相关控制器
  8. *
  9. * Copyright (c) 2022 by liling/jujutong, All Rights Reserved.
  10. */
  11. package controllers
  12. import (
  13. "errors"
  14. "os"
  15. "path"
  16. "rtzh_elec_temperature/excel"
  17. "rtzh_elec_temperature/rtelec_app_public_lib/service"
  18. "rtzh_elec_temperature/tools"
  19. "sort"
  20. "strconv"
  21. "strings"
  22. "time"
  23. "github.com/spf13/cast"
  24. "github.com/astaxie/beego/orm"
  25. )
  26. //Excel相关服务
  27. type ExcelController struct {
  28. BaseController
  29. }
  30. func init() {
  31. }
  32. //公用数据导出方法
  33. // @Summary 数据导出为Excel
  34. // @Description 数据导出为Excel。接口将生成数据文件,并返回文件下载路径。当前支持:device_info、device_mp_info、history-data-opt(自定义日期段历史数据导出)、report-all(导出全部报表)、report-opt(各类型报表导出,需要device_id、reportid、reporttype[1|2|3|4]三个参数)、optimize_invalid_fillrule(导出无效数据填充规则,需要device_id和model_id参数)、optimize_invalid_fillrule(导出缺点数据填充规则,需要device_id和model_id参数)
  35. // @Tags api
  36. // @Accept x-www-form-urlencoded
  37. // @Produce json
  38. // @Param code query string true "业务数据类别,由系统定义。当前支持:history-data-opt(自定义日期段历史数据导出)、report-all(导出全部报表)、report-opt(各类型报表导出,需要device_id、reportid、reporttype[1|2|3|4]三个参数)、optimize_invalid_fillrule(导出无效数据填充规则)、optimize_invalid_fillrule(导出缺点数据填充规则)"
  39. // @Param caption query string false "数据标题/文件名称,将显示在excel中的第一行。"
  40. // @Param expcols query string false "需要导出的字段名。未设置时按数据结果全部返回。"
  41. // @Param expcolnames query string false "导出字段名对应的中文名称。与导出字段名一一对应"
  42. // @Param ...paras query string false "根据业务查询需求,提供相应的参数"
  43. // @Success 200 {object} ApiOK|ApiError 服务访问成功
  44. // @Failure 401 status 认证未通过,一般是未指定token或token已失效
  45. // @Failure 500 status 服务器|后台发生错误
  46. // @router /expTableData [get]
  47. func (c *ExcelController) ExpTableData() {
  48. code := c.GetString("code", "") //业务数据类别,由系统定义
  49. if code == "" {
  50. c.Data["json"] = c.ApiError("导出的业务数据类别不能为空")
  51. c.ServeJSON()
  52. return
  53. }
  54. expCaption := c.GetString("caption", "数据导出-"+time.Now().Format("20060102150405"))
  55. expcols := []string{}
  56. expcolnames := []string{}
  57. c1 := c.GetString("expcols")
  58. if c1 != "" {
  59. expcols = strings.Split(c1, ",")
  60. }
  61. c2 := c.GetString("expcolnames")
  62. if c2 != "" {
  63. expcolnames = strings.Split(c2, ",")
  64. }
  65. if len(expcols) != len(expcolnames) {
  66. c.Data["json"] = c.ApiError("设置了导出列,但列名与中文名数量不一致")
  67. c.ServeJSON()
  68. return
  69. }
  70. paras := c.Input()
  71. param := map[string]interface{}{"code": code}
  72. for k, _ := range paras {
  73. param[k] = paras.Get(k)
  74. }
  75. datalist := []orm.Params{}
  76. var err error
  77. switch code {
  78. case "history-data-opt":
  79. //自定义日期段历史数据导出
  80. hismgr := new(service.HistoryService)
  81. hismgr.Model.Deviceid = cast.ToInt32(param["deviceid"])
  82. hismgr.StartDate = cast.ToString(param["starttime"])
  83. hismgr.EndDate = cast.ToString(param["endtime"])
  84. if hismgr.Model.Deviceid == 0 {
  85. err = errors.New("设备编号不能为空")
  86. }
  87. if hismgr.StartDate == "" {
  88. err = errors.New("导出数据的开始日期不能为空")
  89. }
  90. if err == nil {
  91. result, _, err := hismgr.SearchHistory()
  92. if err == nil {
  93. datalist = result["tbody"].([]orm.Params)
  94. }
  95. }
  96. /*
  97. datatable := map[string]interface{}{"state": param["state"], "starttime": param["starttime"], "endtime": param["endtime"], "words": param["words"]}
  98. queryPara := map[string]interface{}{"datatable": datatable}
  99. queryReturn, err := bo.QueryGlobalsyslogList(queryPara)
  100. if err == nil {
  101. datalist = queryReturn["data"].([]orm.Params)
  102. }*/
  103. break
  104. case "report-opt":
  105. //导出指定类型报表
  106. obj := new(service.StatReportService)
  107. deviceid, _ := c.GetInt32("device_id")
  108. if deviceid == 0 {
  109. c.Data["json"] = c.ApiError("设备ID不能为空")
  110. c.ServeJSON()
  111. return
  112. }
  113. cols := new(service.DeviceService).DeviceMpInfo(deviceid)
  114. if len(cols) == 0 {
  115. c.Data["json"] = c.ApiError("该设备的未配置测点!")
  116. c.ServeJSON()
  117. return
  118. }
  119. expcols = []string{"acquisition_time"}
  120. expcolnames = []string{"采集时间"}
  121. tems := []string{}
  122. hums := []string{}
  123. vol := []string{}
  124. for _, r := range cols {
  125. an := tools.IsEmpty(r["attrname"])
  126. switch an[0:3] {
  127. case "Tem":
  128. tems = append(tems, an)
  129. break
  130. case "Hum":
  131. hums = append(hums, an)
  132. break
  133. case "Vol":
  134. vol = append(vol, an)
  135. break
  136. }
  137. }
  138. sort.Strings(tems)
  139. expcols = append(expcols, tems...)
  140. if len(hums) > 0 {
  141. sort.Strings(hums)
  142. expcols = append(expcols, hums...)
  143. }
  144. if len(vol) > 0 {
  145. sort.Strings(vol)
  146. expcols = append(expcols, vol...)
  147. }
  148. for _, r := range expcols {
  149. if r == "acquisition_time" {
  150. continue
  151. }
  152. expcolnames = append(expcolnames, tools.IsEmpty(cols[r]["mpname"]))
  153. }
  154. obj.UserInfo = c.GetCurrentUserInfo_rt()
  155. rtid, _ := c.GetInt64("reportid")
  156. typeid := c.GetString("reporttype")
  157. r, err := obj.ExpDataQuery(deviceid, rtid, typeid)
  158. if err == nil {
  159. datalist = r
  160. }
  161. break
  162. case "report-all":
  163. //导出全部报表
  164. obj := new(service.StatReportService)
  165. deviceid, _ := c.GetInt32("device_id")
  166. if deviceid == 0 {
  167. c.Data["json"] = c.ApiError("设备ID不能为空")
  168. c.ServeJSON()
  169. return
  170. }
  171. cols := new(service.DeviceService).DeviceMpInfo(deviceid)
  172. if len(cols) == 0 {
  173. c.Data["json"] = c.ApiError("该设备的未配置测点!")
  174. c.ServeJSON()
  175. return
  176. }
  177. expcols = []string{"acquisition_time"}
  178. expcolnames = []string{"采集时间"}
  179. tems := []string{}
  180. hums := []string{}
  181. vol := []string{}
  182. for _, r := range cols {
  183. an := tools.IsEmpty(r["attrname"])
  184. switch an[0:3] {
  185. case "Tem":
  186. tems = append(tems, an)
  187. break
  188. case "Hum":
  189. hums = append(hums, an)
  190. break
  191. case "Vol":
  192. vol = append(vol, an)
  193. break
  194. }
  195. }
  196. sort.Strings(tems)
  197. expcols = append(expcols, tems...)
  198. if len(hums) > 0 {
  199. sort.Strings(hums)
  200. expcols = append(expcols, hums...)
  201. }
  202. if len(vol) > 0 {
  203. sort.Strings(vol)
  204. expcols = append(expcols, vol...)
  205. }
  206. for _, r := range expcols {
  207. if r == "acquisition_time" {
  208. continue
  209. }
  210. expcolnames = append(expcolnames, tools.IsEmpty(cols[r]["mpname"]))
  211. }
  212. obj.UserInfo = c.GetCurrentUserInfo_rt()
  213. rtid, _ := c.GetInt64("reportid", 0)
  214. if rtid == 0 {
  215. rtid, _ = strconv.ParseInt(time.Now().Format("2006"), 10, 64)
  216. }
  217. r, err := obj.ExpDataQuery(deviceid, rtid, "1")
  218. if err == nil {
  219. datalist = r
  220. }
  221. break
  222. case "log-report":
  223. /*
  224. datatable := map[string]interface{}{"state": param["state"], "starttime": param["starttime"], "endtime": param["endtime"], "words": param["words"], "type": param["type"]}
  225. queryPara := map[string]interface{}{"datatable": datatable}
  226. queryReturn, err := bo.QueryReportlogList(queryPara)
  227. if err == nil {
  228. datalist = queryReturn["data"].([]orm.Params)
  229. }*/
  230. //上报日志导出
  231. break
  232. case "optimize_invalid_fillrule":
  233. dataOptSrv := new(service.DataoptimizeService)
  234. dataOptSrv.UserInfo = c.GetCurrentUserInfo_rt()
  235. modelid, _ := c.GetInt("model_id")
  236. deviceid, _ := c.GetInt("device_id")
  237. datalist, err = dataOptSrv.ExpInvalidFillRule(modelid, deviceid)
  238. expcols = []string{"modelname", "attrname", "devicename", "mpname", "minvalue", "maxvalue"}
  239. expcolnames = []string{"模型名称(必填)", "模型属性名称(必填)", "设备名称", "测点名称", "有效最小值(必填)", "有效最大值(必填)"}
  240. break
  241. case "optimize_deletion_fillrule":
  242. dataOptSrv := new(service.DataoptimizeService)
  243. dataOptSrv.UserInfo = c.GetCurrentUserInfo_rt()
  244. modelid, _ := c.GetInt("model_id")
  245. deviceid, _ := c.GetInt("device_id")
  246. expcols = []string{"modelname", "attrname", "devicename", "mpname", "fill"}
  247. expcolnames = []string{"模型名称(必填)", "模型属性名称(必填)", "设备名称", "测点名称", "填充测点列表(多个测点用逗号分隔)"}
  248. datalist, err = dataOptSrv.ExpDeletionFillRule(modelid, deviceid)
  249. break
  250. case "device_info":
  251. dataOptSrv := new(service.DeviceService)
  252. dataOptSrv.UserInfo = c.GetCurrentUserInfo_rt()
  253. expcols = []string{"region_name", "model_name", "devicename", "serial", "baudrate", "stopbit", "checkbit", "databit", "slaveid", "ip", "port", "mqtttopic", "eid", "dev_type_name"}
  254. expcolnames = []string{"区域名称(必填)", "模型名称(必填)", "设备名称(必填)", "串口号", "串口波特率", "串口停止位", "串口检测位", "串口数据位", "从设备ID", "IP地址", "端口号", "MQTT主题", "微功耗传感器ID", "设备类型(支持开关柜\\台区\\输电线路\\杆塔)"}
  255. datalist, err = dataOptSrv.Exp()
  256. break
  257. case "device_mp_info":
  258. deviceid, _ := c.GetInt32("device_id")
  259. if deviceid == 0 {
  260. err = errors.New("无效的设备ID")
  261. } else {
  262. dataOptSrv := new(service.DeviceService)
  263. dataOptSrv.UserInfo = c.GetCurrentUserInfo_rt()
  264. expcols = []string{"devicename", "mpname", "zonename", "positionname", "modelname", "attrname", "phase"}
  265. expcolnames = []string{"设备名称(必填)", "测点名称(必填)", "区域名称", "位置", "模型名称(必填)", "模型属性名称(必填)", "相位(支持A|B|C|N及空)"}
  266. datalist, err = dataOptSrv.ExpMp(deviceid)
  267. }
  268. break
  269. case "device_setting":
  270. deviceid, _ := c.GetInt("deviceid")
  271. ds := new(service.AlarmDeviceService)
  272. expcols = []string{"alarm_id", "deviceid", "mpid", "attrname", "mpname", "alarm_type", "alarm_level", "strategy_name", "upcycle", "threshold"}
  273. expcolnames = []string{"告警编号", "设备编号", "测点编号", "测点属性名称", "测点名称", "告警类型", "报警等级", "告警策略名称", "上升周期(绝对值告警可不填)", "阈值"}
  274. datalist, err = ds.ImportModelsDeviceSettingData(int64(deviceid))
  275. break
  276. case "device_setting_export":
  277. deviceid, _ := c.GetInt("deviceid")
  278. ds := new(service.AlarmDeviceService)
  279. expcols = []string{"deviceid", "mpid", "attrname", "mpname", "alarm_type", "upcycle", "threshold"}
  280. expcolnames = []string{"设备编号", "测点编号", "测点属性名称", "测点名称", "告警类型", "上升周期(绝对值告警可不填)", "阈值"}
  281. datalist, err = ds.ExportExcelDeviceSettingData(int64(deviceid))
  282. break
  283. case "alarm_info":
  284. alarm_level, _ := c.GetInt("alarm_level", 0)
  285. mpname := c.GetString("mpname")
  286. alarmDesc := c.GetString("alarmDesc")
  287. beginTime := c.GetString("beginTime")
  288. endTime := c.GetString("endTime")
  289. ds := new(service.AlarmInfoService)
  290. expcols = []string{"create_at", "devicename", "mpname", "alarm_desc", "is_reset", "alarm_level", "confirm"}
  291. expcolnames = []string{"时间", "设备名称", "告警测点", "告警内容", "是否复归", "告警等级", "是否确认"}
  292. datalist, err = ds.ExprotAlarmInfoList(mpname, alarm_level, alarmDesc, beginTime, endTime, 1, 0)
  293. break
  294. default:
  295. datalist = nil
  296. err = errors.New("未定义的导出数据类型:" + code)
  297. break
  298. }
  299. if err != nil {
  300. c.Data["json"] = c.ApiError(err.Error())
  301. c.ServeJSON()
  302. return
  303. }
  304. curPath, _ := os.Getwd() //当前绝对路径
  305. excel.InitExcel("exp_data_"+time.Now().Format("20060102150405"), curPath+string(os.PathSeparator)+"static"+string(os.PathSeparator)+"download")
  306. filename, errf := excel.ExportExcel(expCaption, expcols, expcolnames, datalist, true)
  307. if errf != nil {
  308. c.Data["json"] = c.ApiError(errf.Error())
  309. } else {
  310. c.Data["json"] = c.ApiOK("/static/download/" + filename)
  311. }
  312. c.ServeJSON()
  313. }
  314. //公用数据导入方法
  315. // @Summary 将Excel数据导入到指定模块
  316. // @Description 将Excel数据导入到指定模块
  317. // @Tags api
  318. // @Accept x-www-form-urlencoded
  319. // @Produce json
  320. // @Param code query string true "业务数据类别,由系统定义。当前支持:device_info、device_mp_info、optimize_invalid_fillrule、optimize_deletion_fillrule"
  321. // @Param file query file true "文件流参数名"
  322. // @Param ...paras query string false "根据业务查询需求,提供相应的参数"
  323. // @Success 200 {object} ApiOK|ApiError 服务访问成功
  324. // @Failure 401 status 认证未通过,一般是未指定token或token已失效
  325. // @Failure 500 status 服务器|后台发生错误
  326. // @router /upload [post]
  327. func (c *ExcelController) UploadExcelFile() {
  328. code := c.GetString("code", "") //业务数据类别,由系统定义
  329. if code == "" {
  330. c.Data["json"] = c.ResultError("导入的业务数据类别不能为空")
  331. c.ServeJSON()
  332. return
  333. }
  334. _, h, _ := c.GetFile("file")
  335. ext := path.Ext(h.Filename)
  336. if strings.Index(".csv,.xlsx", ext) == -1 {
  337. c.Data["json"] = c.WarpError("不支持的文件格式")
  338. c.ServeJSON()
  339. return
  340. }
  341. param := tools.ParseFormParam(c.Ctx.Request.Form)
  342. tmmpDir := os.TempDir() + string(os.PathSeparator) + h.Filename
  343. c.SaveToFile("file", tmmpDir)
  344. if ext == ".csv" {
  345. opt := map[string]string{"delimiter": c.GetString("delimiter", "\"")}
  346. opt["separator"] = c.GetString("separator", ",")
  347. csvData, err0 := excel.ImpCsv(tmmpDir, opt)
  348. os.Remove(tmmpDir)
  349. if err0 != nil {
  350. c.Data["json"] = c.WarpError(err0.Error())
  351. c.ServeJSON()
  352. return
  353. }
  354. param["datalist"] = csvData
  355. } else {
  356. dataList, err0 := excel.ImpExcel(tmmpDir)
  357. os.Remove(tmmpDir)
  358. if err0 != nil {
  359. c.Data["json"] = c.WarpError(err0.Error())
  360. c.ServeJSON()
  361. return
  362. }
  363. param["datalist"] = dataList
  364. }
  365. if len(param["datalist"].([]map[int]string)) == 0 {
  366. c.Data["json"] = c.WarpError("文件中没有可导入的数据,请检查后重试")
  367. c.ServeJSON()
  368. return
  369. }
  370. var err error
  371. var data interface{}
  372. //param为excel解析结果
  373. //以下为你的逻辑处理
  374. //....
  375. //siteDataObj := new(bo.SiteData)
  376. //data, err := siteDataObj.ExpData(GetCurrentUser(c.Ctx), param)
  377. switch code {
  378. case "optimize_invalid_fillrule":
  379. dataOptSrv := new(service.DataoptimizeService)
  380. dataOptSrv.UserInfo = c.GetCurrentUserInfo_rt()
  381. err = dataOptSrv.ImpInvalidExcel(param)
  382. break
  383. case "optimize_deletion_fillrule":
  384. dataOptSrv := new(service.DataoptimizeService)
  385. dataOptSrv.UserInfo = c.GetCurrentUserInfo_rt()
  386. err = dataOptSrv.ImpDeletionExcel(param)
  387. break
  388. case "device_setting":
  389. ds := new(service.AlarmDeviceService)
  390. // 将获取到的param导入到数据库中
  391. ds.UserInfo = c.GetCurrentUserInfo_rt()
  392. err = ds.ImportExcelDeviceSettingData(param)
  393. break
  394. case "device_info":
  395. devSrv := new(service.DeviceService) //
  396. devSrv.UserInfo = c.GetCurrentUserInfo_rt()
  397. err = devSrv.Imp(param)
  398. break
  399. case "device_mp_info":
  400. devSrv := new(service.DeviceService) //
  401. devSrv.UserInfo = c.GetCurrentUserInfo_rt()
  402. err = devSrv.ImpMp(param)
  403. break
  404. default:
  405. err = errors.New("未定义的导出业务类型code")
  406. break
  407. }
  408. if err != nil {
  409. c.Data["json"] = c.ApiError(err.Error())
  410. } else {
  411. c.Data["json"] = c.ApiOK(data)
  412. }
  413. c.ServeJSON()
  414. }