/* * @Author: liling * @Date: 2022-08-13 14:38:13 * @LastEditors: liling * @LastEditTime: 2022-08-13 14:38:15 * @FilePath: \police_security\controllers\exelController.go * @Description:excel导入导出相关控制器 * * Copyright (c) 2022 by liling/jujutong, All Rights Reserved. */ package controllers import ( "errors" "fmt" "os" "path" "scd_check_tools/excel" "scd_check_tools/global" "scd_check_tools/logger" "scd_check_tools/models/bo" "scd_check_tools/tools" "strings" "time" "github.com/astaxie/beego/orm" ) //文件/附件服务 type ExcelController struct { BaseController } func init() { } //公用数据导出方法 // @Summary Excel数据导出 // @Description Excel数据导出。导出成功时将返回导出文件的下载地址。 // @Tags 文件/附件服务接口 // @Accept x-www-form-urlencoded // @Produce json // @Param code query string true "业务类型。值为:scd-comp-result(差异对比结果)\scl-check-result(SCL校验结果)之一" // @Param caption query string false "数据标题" // @Param expcols query string false "导出的数据列,与expcolnames一一对应。从个数据列之间使用逗号分隔。未设置时将导出业务对应的所有列" // @Param expcolnames query string false "导出的数据列对应的名称,与expcols一一一对应。从个数据列名之间使用逗号分隔。未设置时将导出业务对应的所有列" // @Success 200 {object} ResultOK 成功 // @Failure 500 {object} ResultError 失败 // @router expTableData [post] func (c *ExcelController) ExpTableData() { code := c.GetString("code", "") //业务数据类别,由系统定义 if code == "" { c.Data["json"] = c.ResultError("导出的业务数据类别不能为空") c.ServeJSON() return } expCaption := c.GetString("caption", "数据导出-"+time.Now().Format("20060102150405")) expcols := []string{} expcolnames := []string{} c1 := c.GetString("expcols") if c1 != "" { expcols = strings.Split(c1, ",") } c2 := c.GetString("expcolnames") if c2 != "" { expcolnames = strings.Split(c2, ",") } if len(expcols) != len(expcolnames) { c.Data["json"] = c.ResultError("设置了导出列,但列名与中文名数量不一致") c.ServeJSON() return } paras := c.Input() param := map[string]interface{}{"code": code} for k, _ := range paras { param[k] = paras.Get(k) } datalist := []orm.Params{} scdinfo := orm.Params{} var err error switch code { case "log-opt": //操作日志导出 /* datatable := map[string]interface{}{"state": param["state"], "starttime": param["starttime"], "endtime": param["endtime"], "words": param["words"]} queryPara := map[string]interface{}{"datatable": datatable} queryReturn, err := bo.QueryGlobalsyslogList(queryPara) if err == nil { datalist = queryReturn["data"].([]orm.Params) }*/ break case "log-colle": //数据采集日志导出 /* datatable := map[string]interface{}{"starttime": param["starttime"], "endtime": param["endtime"]} queryPara := map[string]interface{}{"datatable": datatable} queryReturn, err := bo.QueryDatalogList(queryPara) if err == nil { datalist = queryReturn["data"].([]orm.Params) }*/ break case "log-report": /* datatable := map[string]interface{}{"state": param["state"], "starttime": param["starttime"], "endtime": param["endtime"], "words": param["words"], "type": param["type"]} queryPara := map[string]interface{}{"datatable": datatable} queryReturn, err := bo.QueryReportlogList(queryPara) if err == nil { datalist = queryReturn["data"].([]orm.Params) }*/ //上报日志导出 break case "scd-comp-result": //SCD一致性比对结果 obj := new(bo.ScdCompare) compid, _ := c.GetInt("comp_id") datalist, err = obj.ExpResultList(compid, c.GetString("nodetype"), c.GetString("nodeid")) break case "scl-check-result": //SCL校验结果 scdid, _ := c.GetInt64("scd_id") scdObj := new(bo.ScdMgr) scdinfo, err = scdObj.One(tools.IsEmpty(scdid)) iedname := c.GetString("ied_name") nodename := c.GetString("node_name") if err == nil { scdname := tools.IsEmpty(scdinfo["scd_name"]) stationinfo, _ := new(bo.BasicArea).One(tools.IsEmpty(scdinfo["station_id"])) if stationinfo != nil { obj := new(bo.ScdNodeRule) obj.ScdID = scdid datalist, _, err = obj.ResultList("", "", c.GetString("alert_level"), iedname, nodename, c.GetString("node_id"), 1, 30000) if iedname != "" { expCaption = fmt.Sprintf("%s-%s-装置(%s)校验结果", stationinfo.AreaName, scdname, iedname) } else if nodename != "" { nodename_zh := "" switch nodename { case "SCLSyntax": nodename_zh = "语法" break case "voltage_level": nodename_zh = "电压等级" key := "global_code_" + c.GetString("node_id") vol, _ := global.GoCahce.Get(key) if vol != nil { nodename_zh = nodename_zh + "(" + tools.IsEmpty(vol.(orm.Params)["name"]) + ")" } break case "area": nodename_zh = "间隔" areaObj := new(bo.ScdAreaMgr) areaInfo, _ := areaObj.One(c.GetString("node_id")) if areaInfo != nil { nodename_zh = nodename_zh + "(" + areaInfo.(bo.T_substation_area).Name + ")" } break default: nodename_zh = nodename break } expCaption = fmt.Sprintf("%s-%s-%s校验结果", stationinfo.AreaName, scdname, nodename_zh) } else { expCaption = fmt.Sprintf("%s-%s全部校验结果", stationinfo.AreaName, scdname) } } } break default: datalist = nil err = errors.New("未定义的导出数据类型:" + code) break } if err != nil { c.Data["json"] = c.ResultError(err.Error()) c.ServeJSON() return } curPath, _ := os.Getwd() //当前绝对路径 excel.InitExcel("exp_data_"+time.Now().Format("20060102150405"), curPath+string(os.PathSeparator)+"static"+string(os.PathSeparator)+"download") filename, errf := excel.ExportExcel(expCaption, expcols, expcolnames, datalist, true) if errf != nil { c.Data["json"] = c.ResultError(errf.Error()) } else { c.Data["json"] = c.ResultOK("static/download/"+filename, 0) } c.ServeJSON() } //公用数据导入方法 // @Summary 将Excel数据导入到指定模块 // @Description 将Excel数据导入到指定模块 // @Tags api // @Accept x-www-form-urlencoded // @Produce json // @Param code query string true "业务数据类别,由系统定义。当前支持:ied_func_fcda" // @Param file query file true "文件流参数名" // @Param ...paras query string false "根据业务查询需求,提供相应的参数" // @Success 200 {object} ApiOK|ApiError 服务访问成功 // @Failure 401 status 认证未通过,一般是未指定token或token已失效 // @Failure 500 status 服务器|后台发生错误 // @router impData [post] func (c *ExcelController) UploadExcelFile() { code := c.GetString("code", "") //业务数据类别,由系统定义 if code == "" { c.Data["json"] = c.ResultError("导入的业务数据类别不能为空") c.ServeJSON() return } _, h, _ := c.GetFile("file") ext := path.Ext(h.Filename) if strings.Index(".csv,.xlsx", ext) == -1 { c.Data["json"] = c.WarpError("不支持的文件格式") c.ServeJSON() return } param := tools.ParseFormParam(c.Ctx.Request.Form) tmmpDir := os.TempDir() + string(os.PathSeparator) + h.Filename c.SaveToFile("file", tmmpDir) if ext == ".csv" { opt := map[string]string{"delimiter": c.GetString("delimiter", "\"")} opt["separator"] = c.GetString("separator", ",") csvData, err0 := excel.ImpCsv(tmmpDir, opt) os.Remove(tmmpDir) if err0 != nil { c.Data["json"] = c.WarpError(err0.Error()) c.ServeJSON() return } param["datalist"] = csvData } else { dataList, err0 := excel.ImpExcel(tmmpDir) os.Remove(tmmpDir) if err0 != nil { c.Data["json"] = c.WarpError(err0.Error()) c.ServeJSON() return } param["datalist"] = dataList } if len(param["datalist"].([]map[int]string)) == 0 { c.Data["json"] = c.WarpError("文件中没有可导入的数据,请检查后重试") c.ServeJSON() return } var err error var data interface{} //param为excel解析结果 //以下为你的逻辑处理 //.... //siteDataObj := new(bo.SiteData) //data, err := siteDataObj.ExpData(GetCurrentUser(c.Ctx), param) switch code { case "ied_func_fcda": dataOptSrv := new(bo.SysCheckModelIedFuncMgr) dataOptSrv.SetUserInfo(c.GetCurrentUserInfo()) _, err = dataOptSrv.Imp(param) break /* case "optimize_deletion_fillrule": dataOptSrv := new(service.DataoptimizeService) dataOptSrv.UserInfo = c.GetCurrentUserInfo_rt() err = dataOptSrv.ImpDeletionExcel(param) break */ default: err = errors.New("未定义的导入业务类型code") break } if err != nil { logger.Logger.Info(fmt.Sprintf("导入源数据:%+v", param)) c.Data["json"] = c.WarpError(err.Error()) } else { c.Data["json"] = c.WarpOK(data) } c.ServeJSON() }