excelController.go 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  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. "fmt"
  15. "os"
  16. "path"
  17. "scd_check_tools/excel"
  18. "scd_check_tools/global"
  19. "scd_check_tools/logger"
  20. "scd_check_tools/models/bo"
  21. "scd_check_tools/tools"
  22. "strings"
  23. "time"
  24. "github.com/astaxie/beego/orm"
  25. )
  26. //文件/附件服务
  27. type ExcelController struct {
  28. BaseController
  29. }
  30. func init() {
  31. }
  32. //公用数据导出方法
  33. // @Summary Excel数据导出
  34. // @Description Excel数据导出。导出成功时将返回导出文件的下载地址。
  35. // @Tags 文件/附件服务接口
  36. // @Accept x-www-form-urlencoded
  37. // @Produce json
  38. // @Param code query string true "业务类型。值为:scd-comp-result(差异对比结果)\scl-check-result(SCL校验结果)之一"
  39. // @Param caption query string false "数据标题"
  40. // @Param expcols query string false "导出的数据列,与expcolnames一一对应。从个数据列之间使用逗号分隔。未设置时将导出业务对应的所有列"
  41. // @Param expcolnames query string false "导出的数据列对应的名称,与expcols一一一对应。从个数据列名之间使用逗号分隔。未设置时将导出业务对应的所有列"
  42. // @Success 200 {object} ResultOK 成功
  43. // @Failure 500 {object} ResultError 失败
  44. // @router expTableData [post]
  45. func (c *ExcelController) ExpTableData() {
  46. code := c.GetString("code", "") //业务数据类别,由系统定义
  47. if code == "" {
  48. c.Data["json"] = c.ResultError("导出的业务数据类别不能为空")
  49. c.ServeJSON()
  50. return
  51. }
  52. expCaption := c.GetString("caption", "数据导出-"+time.Now().Format("20060102150405"))
  53. expcols := []string{}
  54. expcolnames := []string{}
  55. c1 := c.GetString("expcols")
  56. if c1 != "" {
  57. expcols = strings.Split(c1, ",")
  58. }
  59. c2 := c.GetString("expcolnames")
  60. if c2 != "" {
  61. expcolnames = strings.Split(c2, ",")
  62. }
  63. if len(expcols) != len(expcolnames) {
  64. c.Data["json"] = c.ResultError("设置了导出列,但列名与中文名数量不一致")
  65. c.ServeJSON()
  66. return
  67. }
  68. paras := c.Input()
  69. param := map[string]interface{}{"code": code}
  70. for k, _ := range paras {
  71. param[k] = paras.Get(k)
  72. }
  73. datalist := []orm.Params{}
  74. scdinfo := orm.Params{}
  75. var err error
  76. switch code {
  77. case "log-opt":
  78. //操作日志导出
  79. /*
  80. datatable := map[string]interface{}{"state": param["state"], "starttime": param["starttime"], "endtime": param["endtime"], "words": param["words"]}
  81. queryPara := map[string]interface{}{"datatable": datatable}
  82. queryReturn, err := bo.QueryGlobalsyslogList(queryPara)
  83. if err == nil {
  84. datalist = queryReturn["data"].([]orm.Params)
  85. }*/
  86. break
  87. case "log-colle":
  88. //数据采集日志导出
  89. /*
  90. datatable := map[string]interface{}{"starttime": param["starttime"], "endtime": param["endtime"]}
  91. queryPara := map[string]interface{}{"datatable": datatable}
  92. queryReturn, err := bo.QueryDatalogList(queryPara)
  93. if err == nil {
  94. datalist = queryReturn["data"].([]orm.Params)
  95. }*/
  96. break
  97. case "log-report":
  98. /*
  99. datatable := map[string]interface{}{"state": param["state"], "starttime": param["starttime"], "endtime": param["endtime"], "words": param["words"], "type": param["type"]}
  100. queryPara := map[string]interface{}{"datatable": datatable}
  101. queryReturn, err := bo.QueryReportlogList(queryPara)
  102. if err == nil {
  103. datalist = queryReturn["data"].([]orm.Params)
  104. }*/
  105. //上报日志导出
  106. break
  107. case "scd-comp-result":
  108. //SCD一致性比对结果
  109. obj := new(bo.ScdCompare)
  110. compid, _ := c.GetInt("comp_id")
  111. datalist, err = obj.ExpResultList(compid, c.GetString("nodetype"), c.GetString("nodeid"))
  112. break
  113. case "scl-check-result":
  114. //SCL校验结果
  115. scdid, _ := c.GetInt64("scd_id")
  116. scdObj := new(bo.ScdMgr)
  117. scdinfo, err = scdObj.One(tools.IsEmpty(scdid))
  118. iedname := c.GetString("ied_name")
  119. nodename := c.GetString("node_name")
  120. if err == nil {
  121. scdname := tools.IsEmpty(scdinfo["scd_name"])
  122. stationinfo, _ := new(bo.BasicArea).One(tools.IsEmpty(scdinfo["station_id"]))
  123. if stationinfo != nil {
  124. obj := new(bo.ScdNodeRule)
  125. obj.ScdID = scdid
  126. datalist, _, err = obj.ResultList("", "",
  127. c.GetString("alert_level"),
  128. iedname,
  129. nodename,
  130. c.GetString("node_id"), 1, 30000)
  131. if iedname != "" {
  132. expCaption = fmt.Sprintf("%s-%s-装置(%s)校验结果", stationinfo.AreaName, scdname, iedname)
  133. } else if nodename != "" {
  134. nodename_zh := ""
  135. switch nodename {
  136. case "SCLSyntax":
  137. nodename_zh = "语法"
  138. break
  139. case "voltage_level":
  140. nodename_zh = "电压等级"
  141. key := "global_code_" + c.GetString("node_id")
  142. vol, _ := global.GoCahce.Get(key)
  143. if vol != nil {
  144. nodename_zh = nodename_zh + "(" + tools.IsEmpty(vol.(orm.Params)["name"]) + ")"
  145. }
  146. break
  147. case "area":
  148. nodename_zh = "间隔"
  149. areaObj := new(bo.ScdAreaMgr)
  150. areaInfo, _ := areaObj.One(c.GetString("node_id"))
  151. if areaInfo != nil {
  152. nodename_zh = nodename_zh + "(" + areaInfo.(bo.T_substation_area).Name + ")"
  153. }
  154. break
  155. default:
  156. nodename_zh = nodename
  157. break
  158. }
  159. expCaption = fmt.Sprintf("%s-%s-%s校验结果", stationinfo.AreaName, scdname, nodename_zh)
  160. } else {
  161. expCaption = fmt.Sprintf("%s-%s全部校验结果", stationinfo.AreaName, scdname)
  162. }
  163. }
  164. }
  165. break
  166. default:
  167. datalist = nil
  168. err = errors.New("未定义的导出数据类型:" + code)
  169. break
  170. }
  171. if err != nil {
  172. c.Data["json"] = c.ResultError(err.Error())
  173. c.ServeJSON()
  174. return
  175. }
  176. curPath, _ := os.Getwd() //当前绝对路径
  177. excel.InitExcel("exp_data_"+time.Now().Format("20060102150405"), curPath+string(os.PathSeparator)+"static"+string(os.PathSeparator)+"download")
  178. filename, errf := excel.ExportExcel(expCaption, expcols, expcolnames, datalist, true)
  179. if errf != nil {
  180. c.Data["json"] = c.ResultError(errf.Error())
  181. } else {
  182. c.Data["json"] = c.ResultOK("static/download/"+filename, 0)
  183. }
  184. c.ServeJSON()
  185. }
  186. //公用数据导入方法
  187. // @Summary 将Excel数据导入到指定模块
  188. // @Description 将Excel数据导入到指定模块
  189. // @Tags api
  190. // @Accept x-www-form-urlencoded
  191. // @Produce json
  192. // @Param code query string true "业务数据类别,由系统定义。当前支持:ied_func_fcda"
  193. // @Param file query file true "文件流参数名"
  194. // @Param ...paras query string false "根据业务查询需求,提供相应的参数"
  195. // @Success 200 {object} ApiOK|ApiError 服务访问成功
  196. // @Failure 401 status 认证未通过,一般是未指定token或token已失效
  197. // @Failure 500 status 服务器|后台发生错误
  198. // @router impData [post]
  199. func (c *ExcelController) UploadExcelFile() {
  200. code := c.GetString("code", "") //业务数据类别,由系统定义
  201. if code == "" {
  202. c.Data["json"] = c.ResultError("导入的业务数据类别不能为空")
  203. c.ServeJSON()
  204. return
  205. }
  206. _, h, _ := c.GetFile("file")
  207. ext := path.Ext(h.Filename)
  208. if strings.Index(".csv,.xlsx", ext) == -1 {
  209. c.Data["json"] = c.WarpError("不支持的文件格式")
  210. c.ServeJSON()
  211. return
  212. }
  213. param := tools.ParseFormParam(c.Ctx.Request.Form)
  214. tmmpDir := os.TempDir() + string(os.PathSeparator) + h.Filename
  215. c.SaveToFile("file", tmmpDir)
  216. if ext == ".csv" {
  217. opt := map[string]string{"delimiter": c.GetString("delimiter", "\"")}
  218. opt["separator"] = c.GetString("separator", ",")
  219. csvData, err0 := excel.ImpCsv(tmmpDir, opt)
  220. os.Remove(tmmpDir)
  221. if err0 != nil {
  222. c.Data["json"] = c.WarpError(err0.Error())
  223. c.ServeJSON()
  224. return
  225. }
  226. param["datalist"] = csvData
  227. } else {
  228. dataList, err0 := excel.ImpExcel(tmmpDir)
  229. os.Remove(tmmpDir)
  230. if err0 != nil {
  231. c.Data["json"] = c.WarpError(err0.Error())
  232. c.ServeJSON()
  233. return
  234. }
  235. param["datalist"] = dataList
  236. }
  237. if len(param["datalist"].([]map[int]string)) == 0 {
  238. c.Data["json"] = c.WarpError("文件中没有可导入的数据,请检查后重试")
  239. c.ServeJSON()
  240. return
  241. }
  242. var err error
  243. var data interface{}
  244. //param为excel解析结果
  245. //以下为你的逻辑处理
  246. //....
  247. //siteDataObj := new(bo.SiteData)
  248. //data, err := siteDataObj.ExpData(GetCurrentUser(c.Ctx), param)
  249. switch code {
  250. case "ied_func_fcda":
  251. dataOptSrv := new(bo.SysCheckModelIedFuncMgr)
  252. dataOptSrv.SetUserInfo(c.GetCurrentUserInfo())
  253. _, err = dataOptSrv.Imp(param)
  254. break
  255. /*
  256. case "optimize_deletion_fillrule":
  257. dataOptSrv := new(service.DataoptimizeService)
  258. dataOptSrv.UserInfo = c.GetCurrentUserInfo_rt()
  259. err = dataOptSrv.ImpDeletionExcel(param)
  260. break
  261. */
  262. default:
  263. err = errors.New("未定义的导入业务类型code")
  264. break
  265. }
  266. if err != nil {
  267. logger.Logger.Info(fmt.Sprintf("导入源数据:%+v", param))
  268. c.Data["json"] = c.WarpError(err.Error())
  269. } else {
  270. c.Data["json"] = c.WarpOK(data)
  271. }
  272. c.ServeJSON()
  273. }