123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421 |
- /*
- * @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"
- "os"
- "path"
- "rtzh_elec_temperature/excel"
- "rtzh_elec_temperature/rtelec_app_public_lib/service"
- "rtzh_elec_temperature/tools"
- "sort"
- "strconv"
- "strings"
- "time"
- "github.com/spf13/cast"
- "github.com/astaxie/beego/orm"
- )
- //Excel相关服务
- type ExcelController struct {
- BaseController
- }
- func init() {
- }
- //公用数据导出方法
- // @Summary 数据导出为Excel
- // @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参数)
- // @Tags api
- // @Accept x-www-form-urlencoded
- // @Produce json
- // @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(导出缺点数据填充规则)"
- // @Param caption query string false "数据标题/文件名称,将显示在excel中的第一行。"
- // @Param expcols query string false "需要导出的字段名。未设置时按数据结果全部返回。"
- // @Param expcolnames query string false "导出字段名对应的中文名称。与导出字段名一一对应"
- // @Param ...paras query string false "根据业务查询需求,提供相应的参数"
- // @Success 200 {object} ApiOK|ApiError 服务访问成功
- // @Failure 401 status 认证未通过,一般是未指定token或token已失效
- // @Failure 500 status 服务器|后台发生错误
- // @router /expTableData [get]
- func (c *ExcelController) ExpTableData() {
- code := c.GetString("code", "") //业务数据类别,由系统定义
- if code == "" {
- c.Data["json"] = c.ApiError("导出的业务数据类别不能为空")
- 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.ApiError("设置了导出列,但列名与中文名数量不一致")
- c.ServeJSON()
- return
- }
- paras := c.Input()
- param := map[string]interface{}{"code": code}
- for k, _ := range paras {
- param[k] = paras.Get(k)
- }
- datalist := []orm.Params{}
- var err error
- switch code {
- case "history-data-opt":
- //自定义日期段历史数据导出
- hismgr := new(service.HistoryService)
- hismgr.Model.Deviceid = cast.ToInt32(param["deviceid"])
- hismgr.StartDate = cast.ToString(param["starttime"])
- hismgr.EndDate = cast.ToString(param["endtime"])
- if hismgr.Model.Deviceid == 0 {
- err = errors.New("设备编号不能为空")
- }
- if hismgr.StartDate == "" {
- err = errors.New("导出数据的开始日期不能为空")
- }
- if err == nil {
- result, _, err := hismgr.SearchHistory()
- if err == nil {
- datalist = result["tbody"].([]orm.Params)
- }
- }
- /*
- 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 "report-opt":
- //导出指定类型报表
- obj := new(service.StatReportService)
- deviceid, _ := c.GetInt32("device_id")
- if deviceid == 0 {
- c.Data["json"] = c.ApiError("设备ID不能为空")
- c.ServeJSON()
- return
- }
- cols := new(service.DeviceService).DeviceMpInfo(deviceid)
- if len(cols) == 0 {
- c.Data["json"] = c.ApiError("该设备的未配置测点!")
- c.ServeJSON()
- return
- }
- expcols = []string{"acquisition_time"}
- expcolnames = []string{"采集时间"}
- tems := []string{}
- hums := []string{}
- vol := []string{}
- for _, r := range cols {
- an := tools.IsEmpty(r["attrname"])
- switch an[0:3] {
- case "Tem":
- tems = append(tems, an)
- break
- case "Hum":
- hums = append(hums, an)
- break
- case "Vol":
- vol = append(vol, an)
- break
- }
- }
- sort.Strings(tems)
- expcols = append(expcols, tems...)
- if len(hums) > 0 {
- sort.Strings(hums)
- expcols = append(expcols, hums...)
- }
- if len(vol) > 0 {
- sort.Strings(vol)
- expcols = append(expcols, vol...)
- }
- for _, r := range expcols {
- if r == "acquisition_time" {
- continue
- }
- expcolnames = append(expcolnames, tools.IsEmpty(cols[r]["mpname"]))
- }
- obj.UserInfo = c.GetCurrentUserInfo_rt()
- rtid, _ := c.GetInt64("reportid")
- typeid := c.GetString("reporttype")
- r, err := obj.ExpDataQuery(deviceid, rtid, typeid)
- if err == nil {
- datalist = r
- }
- break
- case "report-all":
- //导出全部报表
- obj := new(service.StatReportService)
- deviceid, _ := c.GetInt32("device_id")
- if deviceid == 0 {
- c.Data["json"] = c.ApiError("设备ID不能为空")
- c.ServeJSON()
- return
- }
- cols := new(service.DeviceService).DeviceMpInfo(deviceid)
- if len(cols) == 0 {
- c.Data["json"] = c.ApiError("该设备的未配置测点!")
- c.ServeJSON()
- return
- }
- expcols = []string{"acquisition_time"}
- expcolnames = []string{"采集时间"}
- tems := []string{}
- hums := []string{}
- vol := []string{}
- for _, r := range cols {
- an := tools.IsEmpty(r["attrname"])
- switch an[0:3] {
- case "Tem":
- tems = append(tems, an)
- break
- case "Hum":
- hums = append(hums, an)
- break
- case "Vol":
- vol = append(vol, an)
- break
- }
- }
- sort.Strings(tems)
- expcols = append(expcols, tems...)
- if len(hums) > 0 {
- sort.Strings(hums)
- expcols = append(expcols, hums...)
- }
- if len(vol) > 0 {
- sort.Strings(vol)
- expcols = append(expcols, vol...)
- }
- for _, r := range expcols {
- if r == "acquisition_time" {
- continue
- }
- expcolnames = append(expcolnames, tools.IsEmpty(cols[r]["mpname"]))
- }
- obj.UserInfo = c.GetCurrentUserInfo_rt()
- rtid, _ := c.GetInt64("reportid", 0)
- if rtid == 0 {
- rtid, _ = strconv.ParseInt(time.Now().Format("2006"), 10, 64)
- }
- r, err := obj.ExpDataQuery(deviceid, rtid, "1")
- if err == nil {
- datalist = r
- }
- 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 "optimize_invalid_fillrule":
- dataOptSrv := new(service.DataoptimizeService)
- dataOptSrv.UserInfo = c.GetCurrentUserInfo_rt()
- modelid, _ := c.GetInt("model_id")
- deviceid, _ := c.GetInt("device_id")
- datalist, err = dataOptSrv.ExpInvalidFillRule(modelid, deviceid)
- expcols = []string{"modelname", "attrname", "devicename", "mpname", "minvalue", "maxvalue"}
- expcolnames = []string{"模型名称(必填)", "模型属性名称(必填)", "设备名称", "测点名称", "有效最小值(必填)", "有效最大值(必填)"}
- break
- case "optimize_deletion_fillrule":
- dataOptSrv := new(service.DataoptimizeService)
- dataOptSrv.UserInfo = c.GetCurrentUserInfo_rt()
- modelid, _ := c.GetInt("model_id")
- deviceid, _ := c.GetInt("device_id")
- expcols = []string{"modelname", "attrname", "devicename", "mpname", "fill"}
- expcolnames = []string{"模型名称(必填)", "模型属性名称(必填)", "设备名称", "测点名称", "填充测点列表(多个测点用逗号分隔)"}
- datalist, err = dataOptSrv.ExpDeletionFillRule(modelid, deviceid)
- break
- case "device_info":
- dataOptSrv := new(service.DeviceService)
- dataOptSrv.UserInfo = c.GetCurrentUserInfo_rt()
- expcols = []string{"region_name", "model_name", "devicename", "serial", "baudrate", "stopbit", "checkbit", "databit", "slaveid", "ip", "port", "mqtttopic", "eid", "dev_type_name"}
- expcolnames = []string{"区域名称(必填)", "模型名称(必填)", "设备名称(必填)", "串口号", "串口波特率", "串口停止位", "串口检测位", "串口数据位", "从设备ID", "IP地址", "端口号", "MQTT主题", "微功耗传感器ID", "设备类型(支持开关柜\\台区\\输电线路\\杆塔)"}
- datalist, err = dataOptSrv.Exp()
- break
- case "device_mp_info":
- deviceid, _ := c.GetInt32("device_id")
- if deviceid == 0 {
- err = errors.New("无效的设备ID")
- } else {
- dataOptSrv := new(service.DeviceService)
- dataOptSrv.UserInfo = c.GetCurrentUserInfo_rt()
- expcols = []string{"devicename", "mpname", "zonename", "positionname", "modelname", "attrname", "phase"}
- expcolnames = []string{"设备名称(必填)", "测点名称(必填)", "区域名称", "位置", "模型名称(必填)", "模型属性名称(必填)", "相位(支持A|B|C|N及空)"}
- datalist, err = dataOptSrv.ExpMp(deviceid)
- }
- break
- case "device_setting":
- deviceid, _ := c.GetInt("deviceid")
- ds := new(service.AlarmDeviceService)
- expcols = []string{"alarm_id", "deviceid", "mpid", "attrname", "mpname", "alarm_type", "alarm_level", "strategy_name", "upcycle", "threshold"}
- expcolnames = []string{"告警编号", "设备编号", "测点编号", "测点属性名称", "测点名称", "告警类型", "报警等级", "告警策略名称", "上升周期(绝对值告警可不填)", "阈值"}
- datalist, err = ds.ImportModelsDeviceSettingData(int64(deviceid))
- break
- case "device_setting_export":
- deviceid, _ := c.GetInt("deviceid")
- ds := new(service.AlarmDeviceService)
- expcols = []string{"deviceid", "mpid", "attrname", "mpname", "alarm_type", "upcycle", "threshold"}
- expcolnames = []string{"设备编号", "测点编号", "测点属性名称", "测点名称", "告警类型", "上升周期(绝对值告警可不填)", "阈值"}
- datalist, err = ds.ExportExcelDeviceSettingData(int64(deviceid))
- break
- case "alarm_info":
- alarm_level, _ := c.GetInt("alarm_level", 0)
- mpname := c.GetString("mpname")
- alarmDesc := c.GetString("alarmDesc")
- beginTime := c.GetString("beginTime")
- endTime := c.GetString("endTime")
- ds := new(service.AlarmInfoService)
- expcols = []string{"create_at", "devicename", "mpname", "alarm_desc", "is_reset", "alarm_level", "confirm"}
- expcolnames = []string{"时间", "设备名称", "告警测点", "告警内容", "是否复归", "告警等级", "是否确认"}
- datalist, err = ds.ExprotAlarmInfoList(mpname, alarm_level, alarmDesc, beginTime, endTime, 1, 0)
- break
- default:
- datalist = nil
- err = errors.New("未定义的导出数据类型:" + code)
- break
- }
- if err != nil {
- c.Data["json"] = c.ApiError(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.ApiError(errf.Error())
- } else {
- c.Data["json"] = c.ApiOK("/static/download/" + filename)
- }
- c.ServeJSON()
- }
- //公用数据导入方法
- // @Summary 将Excel数据导入到指定模块
- // @Description 将Excel数据导入到指定模块
- // @Tags api
- // @Accept x-www-form-urlencoded
- // @Produce json
- // @Param code query string true "业务数据类别,由系统定义。当前支持:device_info、device_mp_info、optimize_invalid_fillrule、optimize_deletion_fillrule"
- // @Param file query file true "文件流参数名"
- // @Param ...paras query string false "根据业务查询需求,提供相应的参数"
- // @Success 200 {object} ApiOK|ApiError 服务访问成功
- // @Failure 401 status 认证未通过,一般是未指定token或token已失效
- // @Failure 500 status 服务器|后台发生错误
- // @router /upload [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 "optimize_invalid_fillrule":
- dataOptSrv := new(service.DataoptimizeService)
- dataOptSrv.UserInfo = c.GetCurrentUserInfo_rt()
- err = dataOptSrv.ImpInvalidExcel(param)
- break
- case "optimize_deletion_fillrule":
- dataOptSrv := new(service.DataoptimizeService)
- dataOptSrv.UserInfo = c.GetCurrentUserInfo_rt()
- err = dataOptSrv.ImpDeletionExcel(param)
- break
- case "device_setting":
- ds := new(service.AlarmDeviceService)
- // 将获取到的param导入到数据库中
- ds.UserInfo = c.GetCurrentUserInfo_rt()
- err = ds.ImportExcelDeviceSettingData(param)
- break
- case "device_info":
- devSrv := new(service.DeviceService) //
- devSrv.UserInfo = c.GetCurrentUserInfo_rt()
- err = devSrv.Imp(param)
- break
- case "device_mp_info":
- devSrv := new(service.DeviceService) //
- devSrv.UserInfo = c.GetCurrentUserInfo_rt()
- err = devSrv.ImpMp(param)
- break
- default:
- err = errors.New("未定义的导出业务类型code")
- break
- }
- if err != nil {
- c.Data["json"] = c.ApiError(err.Error())
- } else {
- c.Data["json"] = c.ApiOK(data)
- }
- c.ServeJSON()
- }
|