Roc vor 1 Jahr
Ursprung
Commit
c0d0eb1995

+ 167 - 13
controllers/data_manage/excel/custom_analysis.go

@@ -1,10 +1,18 @@
 package excel
 
 import (
+	"encoding/json"
 	"eta/eta_api/controllers"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
+	excelModel "eta/eta_api/models/data_manage/excel"
+	"eta/eta_api/models/data_manage/excel/response"
+	"eta/eta_api/models/data_manage/request"
+	"eta/eta_api/services/data/excel"
 	"eta/eta_api/utils"
+	"strconv"
+	"strings"
+	"time"
 )
 
 // CustomAnalysisController 自定义分析
@@ -12,18 +20,13 @@ type CustomAnalysisController struct {
 	controllers.BaseAuthController
 }
 
-// List
-// @Title ETA表格列表接口
-// @Description ETA表格列表接口
-// @Param   PageSize   query   int  true       "每页数据条数"
-// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
-// @Param   ExcelClassifyId   query   int  true       "分类id"
-// @Param   Keyword   query   string  true       "搜索关键词"
-// @Param   AdminId   query   int  false       "创建人id"
-// @Param   Source   query   int  true       "格来源,1:excel插件的表格,2:自定义表格,3:混合表格,默认:1"
+// GetExcelByName
+// @Title 根据excel名称获取表格详情(基础信息+第一页初始化数据)
+// @Description 根据excel名称获取表格详情(基础信息+第一页初始化数据)
+// @Param   ExcelName   query   string  true       "搜索关键词"
 // @Success 200 {object} response.ExcelListResp
-// @router /excel_info/list [get]
-func (c *CustomAnalysisController) GetByName() {
+// @router /excel_by_name [get]
+func (c *CustomAnalysisController) GetExcelByName() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		c.Data["json"] = br
@@ -44,16 +47,69 @@ func (c *CustomAnalysisController) GetByName() {
 		br.IsSendEmail = false
 		return
 	}
-	excelName = utils.TrimLRStr(excelName)
 
+	resp := response.FindExcelInfoResp{}
+
+	excelName = utils.TrimLRStr(excelName)
 	// 获取数据详情
 	excelDetail, err := data_manage.GetNoContentExcelInfoByName(excelName, utils.CUSTOM_ANALYSIS_TABLE)
 	if err != nil {
-		br.Msg = "获取"
+		if err.Error() == utils.ErrNoRow() {
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "获取成功"
+			br.Data = resp
+			return
+		}
+		br.Msg = "获取表格事变"
 		br.ErrMsg = err.Error()
 		return
 	}
 
+	resp.IsFind = true
+	resp.ExcelInfo = excelDetail
+	if excelDetail != nil {
+		sheetList, err := excelModel.GetAllSheetItemList(excelDetail.ExcelInfoId)
+		if err != nil {
+			br.Msg = "获取sheet失败"
+			br.ErrMsg = "获取sheet失败,err:" + err.Error()
+			return
+		}
+
+		if len(sheetList) > 0 {
+			sheetIdList := make([]int, 0)
+			for _, v := range sheetList {
+				sheetIdList = append(sheetIdList, v.ExcelSheetId)
+			}
+			// 获取所有sheet的第一页的数据
+			sheetDataList, err := excelModel.GetSheetDataListBySheetIdListAndPage(sheetIdList, 1)
+			if err != nil {
+				br.Msg = "获取sheet中的数据失败"
+				br.ErrMsg = "获取sheet中的数据失败,err:" + err.Error()
+				return
+			}
+
+			sheetDataMap := make(map[int]*excelModel.ExcelSheetData)
+			for _, v := range sheetDataList {
+				sheetDataMap[v.ExcelSheetId] = v
+			}
+
+			for k, v := range sheetList {
+				sheetData, ok := sheetDataMap[v.ExcelSheetId]
+				if !ok {
+					continue
+				}
+				v.Data = sheetData
+				sheetList[k] = v
+			}
+
+		}
+
+		// TODO 合并单元格信息、计算公式
+
+		resp.SheetList = sheetList
+	}
+
 	//resp := response.ExcelListResp{
 	//	Paging: page,
 	//	List:   list,
@@ -62,5 +118,103 @@ func (c *CustomAnalysisController) GetByName() {
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// Add
+// @Title 新增表格接口
+// @Description 新增表格接口
+// @Param	request	body request.AddExcelInfoReq true "type json string"
+// @Success 200 {object} response.AddExcelInfoResp
+// @router /add [post]
+func (c *CustomAnalysisController) Add() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	deleteCache := true
+	cacheKey := "CACHE_EXCEL_TABLE_INFO_ADD_" + strconv.Itoa(sysUser.AdminId)
+	defer func() {
+		if deleteCache {
+			_ = utils.Rc.Delete(cacheKey)
+		}
+	}()
+	if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
+		deleteCache = false
+		br.Msg = "系统处理中,请稍后重试!"
+		br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(c.Ctx.Input.RequestBody)
+		return
+	}
+	var req request.AddExcelInfoReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	req.ExcelName = strings.Trim(req.ExcelName, " ")
+	if req.ExcelName == "" {
+		br.Msg = "请填写表格名称!"
+		br.IsSendEmail = false
+		return
+	}
+
+	if req.ExcelClassifyId <= 0 {
+		br.Msg = "分类参数错误!"
+		br.IsSendEmail = false
+		return
+	}
+
+	_, err, errMsg, isSendEmail := excel.AddCustomAnalysisTable(utils.TrimLRStr(req.ExcelName), req.Content, req.ExcelImage, req.ExcelClassifyId, sysUser)
+	if err != nil {
+		br.Msg = "保存失败"
+		if errMsg != `` {
+			br.Msg = errMsg
+		}
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		br.IsSendEmail = isSendEmail
+		return
+	}
+
+	// 更新excel下载地址(默认的EXCEL需要更新,自定义表格不需要更新)
+	//if req.Source == 1 {
+	//	go UpdateExcelInfoFileUrl(excelInfo)
+	//}
+	//
+	//resp := new(response.AddExcelInfoResp)
+	//resp.ExcelInfoId = excelInfo.ExcelInfoId
+	//resp.UniqueCode = excelInfo.UniqueCode
+
+	//新增操作日志
+	//{
+	//	excelLog := &data_manage.ExcelInfoLog{
+	//		//ExcelInfoLogId:  0,
+	//		ExcelInfoId:     excelInfo.ExcelInfoId,
+	//		ExcelName:       req.ExcelName,
+	//		ExcelClassifyId: req.ExcelClassifyId,
+	//		SysUserId:       sysUser.AdminId,
+	//		SysUserRealName: sysUser.RealName,
+	//		UniqueCode:      excelInfo.UniqueCode,
+	//		CreateTime:      time.Now(),
+	//		Content:         string(c.Ctx.Input.RequestBody),
+	//		Status:          "新增表格",
+	//		Method:          c.Ctx.Input.URI(),
+	//	}
+	//	go data_manage.AddExcelInfoLog(excelLog)
+	//}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
 	//br.Data = resp
+	br.IsAddLog = false //数据量太大了,不写入日志吧
 }

+ 2 - 2
controllers/data_manage/excel_classify.go

@@ -43,8 +43,8 @@ func (this *ExcelClassifyController) List() {
 		return
 	}
 
-	// 获取所有excel表格分类
-	allExcelInfo, err := data_manage.GetNoContentExcelInfoAll()
+	// 根据来源获取所有excel表格(无内容)
+	allExcelInfo, err := data_manage.GetNoContentExcelInfoAll(source)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取表格信息失败,Err:" + err.Error()

+ 134 - 1
controllers/data_manage/excel_info.go

@@ -1,6 +1,7 @@
 package data_manage
 
 import (
+	"archive/zip"
 	"encoding/json"
 	"eta/eta_api/controllers"
 	"eta/eta_api/models"
@@ -15,7 +16,9 @@ import (
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"github.com/yidane/formula"
+	"io"
 	"os"
+	"path/filepath"
 	"strconv"
 	"strings"
 	"time"
@@ -2110,13 +2113,143 @@ func (c *ExcelInfoController) Copy() {
 //	startNow := time.Now()
 //	fmt.Println(startNow.Format(utils.FormatDateTime))
 //	startTime := startNow.Unix()
-//	filePath := `static/tmpFile/化工23.05.24.xlsx`
+//	//filePath := `static/tmpFile/test/化工23.05.24.xlsx`
+//	filePath := `static/tmpFile/1. TAROUND_202308010201-500.xlsx`
+//	//filePath := `static/tmpFile/化工23.05.24.xml`
+//	//filePath := `static/tmpFile/化工23.05.24/xl/workbook.xml`
 //	//filePath := `static/tmpFile/1. TAROUND_202308010201.xlsx`
+//
 //	//filePath := `static/tmpFile/1. TAROUND_202308010201-2.xlsx`
+//
 //	//filePath := `static/tmpFile/5. Outage_Values_Daily.xlsx`
 //	//filePath := `static/tmpFile/1. TAROUND_202308010201 - 副本.xlsx`
 //	excel.ConvToLuckySheet(filePath)
 //	cz := time.Now().Unix() - startTime
 //	fmt.Printf("处理完需要的时间:%d秒;约耗时:%d分%d秒", cz, cz/60, cz%60)
 //	fmt.Println()
+//
+//	//sheetName := `日度`
+//	//sheetName := `月度`
+//	//fmt.Println(excel.GetDefaultSheetIndex(filePath, sheetName))
+//
+//	//decompressZip(filePath)
 //}
+
+// src: 需要解压的zip文件
+func decompressZip(src string) error {
+	archive, err := zip.OpenReader(src)
+	if err != nil {
+		return err
+	}
+	dir := filepath.Dir(src) + "/zip"
+	defer archive.Close()
+	for _, f := range archive.File {
+		filePath := filepath.Join(dir, f.Name)
+		if f.FileInfo().IsDir() {
+			os.MkdirAll(filePath, os.ModePerm)
+			continue
+		}
+		if err := os.MkdirAll(filepath.Dir(filePath), os.ModePerm); err != nil {
+			return fmt.Errorf("failed to make directory (%v)", err)
+		}
+		dstFile, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
+		if err != nil {
+			return fmt.Errorf("failed to create file (%v)", err)
+		}
+		fileInArchive, err := f.Open()
+		if err != nil {
+			return fmt.Errorf("failed to open file in zip (%v)", err)
+		}
+		if _, err := io.Copy(dstFile, fileInArchive); err != nil {
+			return fmt.Errorf("failed to copy file in zip (%v)", err)
+		}
+		dstFile.Close()
+		fileInArchive.Close()
+	}
+	return nil
+}
+
+// FixTableData ETA1.0.2 自定义分析(生成指标数据修复)
+func FixTableData() {
+	// 获取一级分类
+	classifyList, err := data_manage.GetExcelClassifyByParentId(0, utils.EXCEL_DEFAULT)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		fmt.Println("数据修复失败,Err:" + err.Error())
+		return
+	}
+	timeTableMap := make(map[int]int)
+	mixTableMap := make(map[int]int)
+	for _, v := range classifyList {
+		// 时间序列表格
+		classify := &data_manage.ExcelClassify{
+			//ExcelClassifyId:   0,
+			ExcelClassifyName: v.ExcelClassifyName,
+			ParentId:          v.ParentId,
+			Source:            utils.TIME_TABLE,
+			SysUserId:         v.SysUserId,
+			SysUserRealName:   v.SysUserRealName,
+			Level:             v.Level,
+			UniqueCode:        utils.MD5(fmt.Sprint(v.UniqueCode, "_", utils.TIME_TABLE)),
+			Sort:              v.Sort,
+			CreateTime:        time.Now(),
+			ModifyTime:        time.Now(),
+		}
+		_, err = data_manage.AddExcelClassify(classify)
+		timeTableMap[v.ExcelClassifyId] = classify.ExcelClassifyId
+
+		// 混合表格
+		classify2 := &data_manage.ExcelClassify{
+			//ExcelClassifyId:   0,
+			ExcelClassifyName: v.ExcelClassifyName,
+			ParentId:          v.ParentId,
+			Source:            utils.MIXED_TABLE,
+			SysUserId:         v.SysUserId,
+			SysUserRealName:   v.SysUserRealName,
+			Level:             v.Level,
+			UniqueCode:        utils.MD5(fmt.Sprint(v.UniqueCode, "_", utils.MIXED_TABLE)),
+			Sort:              v.Sort,
+			CreateTime:        time.Now(),
+			ModifyTime:        time.Now(),
+		}
+		_, err = data_manage.AddExcelClassify(classify2)
+		mixTableMap[v.ExcelClassifyId] = classify2.ExcelClassifyId
+	}
+
+	// 修改时间序列表
+	{
+		// 获取时间序列表
+		timeTableExcelList, err := data_manage.GetNoContentExcelInfoAll(utils.TIME_TABLE)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			fmt.Println("获取时间序列表列表失败,Err:" + err.Error())
+			return
+		}
+
+		for _, v := range timeTableExcelList {
+			classifyId, ok := timeTableMap[v.ExcelClassifyId]
+			if !ok {
+				continue
+			}
+			data_manage.UpdateExcelInfoClassifyId(classifyId, v.ExcelInfoId)
+		}
+	}
+
+	// 修改混合序列表
+	{
+		// 获取时间序列表
+		mixTableExcelList, err := data_manage.GetNoContentExcelInfoAll(utils.MIXED_TABLE)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			fmt.Println("获取时间序列表列表失败,Err:" + err.Error())
+			return
+		}
+
+		for _, v := range mixTableExcelList {
+			classifyId, ok := mixTableMap[v.ExcelClassifyId]
+			if !ok {
+				continue
+			}
+			data_manage.UpdateExcelInfoClassifyId(classifyId, v.ExcelInfoId)
+		}
+	}
+
+	fmt.Println("完成数据修复")
+}

+ 11 - 0
go.mod

@@ -47,19 +47,23 @@ require (
 	github.com/alibabacloud-go/tea-utils v1.3.6 // indirect
 	github.com/alibabacloud-go/tea-xml v1.1.2 // indirect
 	github.com/aliyun/credentials-go v1.1.2 // indirect
+	github.com/andybalholm/brotli v1.0.1 // indirect
 	github.com/andybalholm/cascadia v1.3.1 // indirect
 	github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211218165449-dd623ecc2f02 // indirect
 	github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect
+	github.com/beevik/etree v1.2.0 // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d // indirect
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 	github.com/clbanning/mxj/v2 v2.5.5 // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
+	github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect
 	github.com/fatih/structs v1.1.0 // indirect
 	github.com/fsnotify/fsnotify v1.6.0 // indirect
 	github.com/garyburd/redigo v1.6.3 // indirect
 	github.com/go-redis/redis/v8 v8.11.6-0.20220405070650-99c79f7041fc // indirect
 	github.com/golang/protobuf v1.5.2 // indirect
+	github.com/golang/snappy v0.0.2 // indirect
 	github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac // indirect
 	github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82 // indirect
 	github.com/gonum/integrate v0.0.0-20181209220457-a422b5c0fdf2 // indirect
@@ -70,13 +74,18 @@ require (
 	github.com/jmespath/go-jmespath v0.4.0 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/klauspost/compress v1.11.4 // indirect
+	github.com/klauspost/pgzip v1.2.5 // indirect
 	github.com/lib/pq v1.10.7 // indirect
 	github.com/mailru/easyjson v0.7.7 // indirect
 	github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
+	github.com/mholt/archiver/v3 v3.5.1 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
+	github.com/nwaples/rardecode v1.1.0 // indirect
+	github.com/pierrec/lz4/v4 v4.1.2 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/prometheus/client_golang v1.14.0 // indirect
 	github.com/prometheus/client_model v0.3.0 // indirect
@@ -93,6 +102,8 @@ require (
 	github.com/tidwall/match v1.1.1 // indirect
 	github.com/tidwall/pretty v1.2.0 // indirect
 	github.com/tjfoc/gmsm v1.3.2 // indirect
+	github.com/ulikunitz/xz v0.5.9 // indirect
+	github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
 	github.com/xuri/efp v0.0.0-20230802181842-ad255f2331ca // indirect
 	github.com/xuri/nfp v0.0.0-20230819163627-dc951e3ffe1a // indirect
 	golang.org/x/crypto v0.12.0 // indirect

+ 26 - 0
go.sum

@@ -82,6 +82,8 @@ github.com/aliyun/aliyun-oss-go-sdk v2.2.0+incompatible h1:ht2+VfbXtNLGhCsnTMc6/
 github.com/aliyun/aliyun-oss-go-sdk v2.2.0+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
 github.com/aliyun/credentials-go v1.1.2 h1:qU1vwGIBb3UJ8BwunHDRFtAhS6jnQLnde/yk0+Ih2GY=
 github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw=
+github.com/andybalholm/brotli v1.0.1 h1:KqhlKozYbRtJvsPrrEeXcO+N2l6NYT5A2QAFmSULpEc=
+github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
 github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
 github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
 github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211218165449-dd623ecc2f02 h1:o2oaBQGTzO+xNh12e7xWkphNe7H2DTiWv1ml9a2P9PQ=
@@ -102,6 +104,8 @@ github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd h1:jZtX5jh5IOMu0fpOT
 github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ=
 github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542 h1:nYXb+3jF6Oq/j8R/y90XrKpreCxIalBWfeyeKymgOPk=
 github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU=
+github.com/beevik/etree v1.2.0 h1:l7WETslUG/T+xOPs47dtd6jov2Ii/8/OjCldk5fYfQw=
+github.com/beevik/etree v1.2.0/go.mod h1:aiPf89g/1k3AShMVAzriilpcE4R/Vuor90y83zVZWFc=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
@@ -153,6 +157,9 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumC
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
+github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 h1:iFaUwBSo5Svw6L7HYpRu/0lE3e0BaElwnNO1qkNQxBY=
+github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s=
+github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY=
 github.com/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU=
 github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
 github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw=
@@ -246,6 +253,8 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu
 github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
 github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.2 h1:aeE13tS0IiQgFjYdoL8qN3K1N2bXXtI6Vi51/y7BpMw=
+github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=
 github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
 github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac h1:Q0Jsdxl5jbxouNs1TQYt0gxesYMU4VXRbsTlgDloZ50=
@@ -334,6 +343,12 @@ github.com/kgiannakakis/mp3duration v0.0.0-20191013070830-d834f8d5ed53 h1:+8X3HM
 github.com/kgiannakakis/mp3duration v0.0.0-20191013070830-d834f8d5ed53/go.mod h1:E61jD6q4yJ6Cu9uDGRAfiENM1G5TVZhOog0Y3+GgTpQ=
 github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+github.com/klauspost/compress v1.11.4 h1:kz40R/YWls3iqT9zX9AHN3WoVsrAWVyui5sxuLqiXqU=
+github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
+github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE=
+github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY=
@@ -361,6 +376,8 @@ github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
 github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
+github.com/mholt/archiver/v3 v3.5.1 h1:rDjOBX9JSF5BvoJGvjqK479aL70qh9DIpZCl+k7Clwo=
+github.com/mholt/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4=
 github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
 github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -382,6 +399,8 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWb
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 github.com/nosixtools/solarlunar v0.0.0-20211112060703-1b6dea7b4a19 h1:LhWT2dBuNkYexwRSsPpYh67e0ikmH1ebBDaVkGHoMts=
 github.com/nosixtools/solarlunar v0.0.0-20211112060703-1b6dea7b4a19/go.mod h1:LjhyrWzOLJ9l1azMoNr9iCvfNrHEREqvJHzSLQcD0/o=
+github.com/nwaples/rardecode v1.1.0 h1:vSxaY8vQhOcVr4mm5e8XllHWTiM4JF507A0Katqw7MQ=
+github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
 github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
 github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
@@ -413,6 +432,8 @@ github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233 h1:jmJndGFBPjNWW+MA
 github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
 github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I=
 github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pierrec/lz4/v4 v4.1.2 h1:qvY3YFXRQE/XB8MlLzJH7mSzBs74eA2gg52YTk6jUPM=
+github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -530,10 +551,15 @@ github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM=
 github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w=
 github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83 h1:9AUN7+NK4IV+A11igqjQM5i8obiOAQo4SXgjaxe+orI=
 github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
+github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
+github.com/ulikunitz/xz v0.5.9 h1:RsKRIA2MO8x56wkkcd3LbtcE/uMszhb6DpRf+3uwa3I=
+github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
 github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b h1:0Ve0/CCjiAiyKddUMUn3RwIGlq2iTW4GuVzyoKBYO/8=
 github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
 github.com/wenzhenxi/gorsa v0.0.0-20210524035706-528c7050d703 h1:Tiqr9EWpYopXZf668mgTNWguzE6ssRIEviULO3gSWnU=
 github.com/wenzhenxi/gorsa v0.0.0-20210524035706-528c7050d703/go.mod h1:nfhBTKji6rC8lrjyikx8NJ85JHg6ZQam0a9Je+2RVOg=
+github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo=
+github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
 github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 h1:6932x8ltq1w4utjmfMPVj09jdMlkY0aiA6+Skbtl3/c=
 github.com/xuri/efp v0.0.0-20220603152613-6918739fd470/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
 github.com/xuri/efp v0.0.0-20230802181842-ad255f2331ca h1:uvPMDVyP7PXMMioYdyPH+0O+Ta/UO1WFfNYMO3Wz0eg=

+ 32 - 1
models/data_manage/excel/excel_sheet.go

@@ -10,7 +10,7 @@ type ExcelSheet struct {
 	ExcelSheetId int       `orm:"column(excel_sheet_id);pk"`
 	ExcelInfoId  int       `description:"excel的id"`
 	SheetName    string    `description:"sheet名称"`
-	order        int       `description:"排序"`
+	Sort         int       `description:"排序"`
 	ModifyTime   time.Time `description:"最近修改日期"`
 	CreateTime   time.Time `description:"创建日期"`
 }
@@ -35,3 +35,34 @@ func AddExcelSheet(excelInfo *ExcelSheet) (err error) {
 
 	return
 }
+
+// GetAllSheetList 根据excel_id获取所有的sheet
+func GetAllSheetList(excelInfoId int) (item []*ExcelSheet, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT *
+FROM excel_sheet WHERE 1=1 AND excel_info_id = ? `
+	sql += " ORDER BY sort asc "
+	_, err = o.Raw(sql, excelInfoId).QueryRows(&item)
+	return
+}
+
+// SheetItem excel表格详情表
+type SheetItem struct {
+	ExcelSheetId int             `orm:"column(excel_sheet_id);pk"`
+	ExcelInfoId  int             `description:"excel的id"`
+	SheetName    string          `description:"sheet名称"`
+	Sort         int             `description:"排序"`
+	ModifyTime   time.Time       `description:"最近修改日期"`
+	CreateTime   time.Time       `description:"创建日期"`
+	Data         *ExcelSheetData `description:"excel的数据"`
+}
+
+// GetAllSheetItemList 根据excel_id获取所有的sheet详情
+func GetAllSheetItemList(excelInfoId int) (item []*SheetItem, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT *
+FROM excel_sheet WHERE 1=1 AND excel_info_id = ? `
+	sql += " ORDER BY sort asc "
+	_, err = o.Raw(sql, excelInfoId).QueryRows(&item)
+	return
+}

+ 15 - 0
models/data_manage/excel/excel_sheet_data.go

@@ -1,6 +1,7 @@
 package excel
 
 import (
+	"eta/eta_api/utils"
 	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
@@ -36,3 +37,17 @@ func AddExcelSheetData(excelInfo *ExcelSheetData) (err error) {
 
 	return
 }
+
+// GetSheetDataListBySheetIdListAndPage 根据sheet_id列表和页码获取所有的sheet数据详情
+func GetSheetDataListBySheetIdListAndPage(excelSheetIdList []int, page int) (item []*ExcelSheetData, err error) {
+	num := len(excelSheetIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT *
+FROM excel_sheet_data WHERE 1=1 AND excel_sheet_id in ` + utils.GetOrmInReplace(num) + ` AND sort = ? `
+	_, err = o.Raw(sql, excelSheetIdList, page).QueryRows(&item)
+
+	return
+}

+ 1 - 0
models/data_manage/excel/request/excel.go

@@ -0,0 +1 @@
+package request

+ 12 - 0
models/data_manage/excel/response/sheet.go

@@ -0,0 +1,12 @@
+package response
+
+import (
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_manage/excel"
+)
+
+type FindExcelInfoResp struct {
+	IsFind    bool                         `description:"是否存在同名文件"`
+	ExcelInfo *data_manage.MyExcelInfoList `description:"图表详情"`
+	SheetList []*excel.SheetItem           `description:"sheet列表"`
+}

+ 6 - 1
models/data_manage/excel_classify.go

@@ -9,7 +9,7 @@ import (
 // ExcelClassify excel表格分类
 type ExcelClassify struct {
 	ExcelClassifyId   int       `orm:"column(excel_classify_id);pk"`
-	Source            int       `description:"表格来源,1:excel插件的表格,2:自定义表格,3:混合表格,默认:1"`
+	Source            int       `description:"表格来源,1:excel插件的表格,2:自定义表格,3:混合表格,4:自定义分析,默认:1"`
 	ExcelClassifyName string    `description:"分类名称"`
 	ParentId          int       `description:"父级id"`
 	SysUserId         int       `description:"创建人id"`
@@ -26,6 +26,11 @@ type ExcelClassify struct {
 func AddExcelClassify(item *ExcelClassify) (lastId int64, err error) {
 	o := orm.NewOrmUsingDB("data")
 	lastId, err = o.Insert(item)
+	if err != nil {
+		return
+	}
+	item.ExcelClassifyId = int(lastId)
+
 	return
 }
 

+ 24 - 19
models/data_manage/excel_info.go

@@ -9,7 +9,7 @@ import (
 // ExcelInfo excel表格详情表
 type ExcelInfo struct {
 	ExcelInfoId     int       `orm:"column(excel_info_id);pk"`
-	Source          int       `description:"表格来源,1:excel插件的表格,2:自定义表格,默认:1"`
+	Source          int       `description:"表格来源,1:excel插件的表格,2:自定义表格,3:混合表格,4:自定义分析,默认:1"`
 	ExcelType       int       `description:"表格类型,1:指标列,2:日期列,默认:1"`
 	ExcelName       string    `description:"表格名称"`
 	UniqueCode      string    `description:"表格唯一编码"`
@@ -79,12 +79,12 @@ func GetExcelInfoAll() (items []*ExcelClassifyItems, err error) {
 }
 
 // GetNoContentExcelInfoAll 获取不含content的表格列表 用于分类展示
-func GetNoContentExcelInfoAll() (items []*ExcelClassifyItems, err error) {
+func GetNoContentExcelInfoAll(source int) (items []*ExcelClassifyItems, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT excel_info_id,excel_classify_id,excel_name AS excel_classify_name,
              unique_code,sys_user_id,sys_user_real_name
-            FROM excel_info where is_delete=0 ORDER BY sort asc,create_time desc `
-	_, err = o.Raw(sql).QueryRows(&items)
+            FROM excel_info where is_delete=0  AND source = ?  ORDER BY sort asc,create_time desc `
+	_, err = o.Raw(sql, source).QueryRows(&items)
 	return
 }
 
@@ -253,24 +253,10 @@ func GetExcelListCountByCondition(condition string, pars []interface{}) (count i
 	return
 }
 
-// GetMyExcelListByAdminId 根据操作人id获取表格列表
-func GetMyExcelListByAdminId(adminId int) (item []*MyChartView, err error) {
-	o := orm.NewOrmUsingDB("data")
-	//sql := ` SELECT * FROM my_chart WHERE 1=1 AND admin_id=? `
-
-	sql := ` SELECT a.*,GROUP_CONCAT(c.my_chart_classify_id SEPARATOR ',') AS my_chart_classify_id FROM my_chart AS a
-			LEFT JOIN  my_chart_classify_mapping AS b ON a.my_chart_id=b.my_chart_id AND a.admin_id=b.admin_id
-			LEFT JOIN my_chart_classify AS c ON b.my_chart_classify_id=c.my_chart_classify_id AND b.admin_id=c.admin_id
-			WHERE 1=1 AND a.admin_id=? AND a.source=2
-			GROUP BY a.chart_info_id `
-	_, err = o.Raw(sql, adminId).QueryRows(&item)
-	return
-}
-
 // GetExcelViewInfoByExcelInfoId 根据excelInfoId 获取ETA表格详情
 func GetExcelViewInfoByExcelInfoId(excelInfoId int) (item *MyExcelInfoList, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM excel_info WHERE excel_info_id = ? AND is_delete=0 `
+	sql := ` SELECT excel_info_id,source,excel_type,excel_name,unique_code,excel_classify_id,sys_user_id,sys_user_real_name,excel_image,file_url,sort,create_time,modify_time FROM excel_info WHERE excel_info_id = ? AND is_delete=0 `
 	err = o.Raw(sql, excelInfoId).QueryRow(&item)
 	return
 }
@@ -282,3 +268,22 @@ func GetExcelInfoCountByClassifyId(classifyId int) (total int64, err error) {
 	err = o.Raw(sql, classifyId).QueryRow(&total)
 	return
 }
+
+// UpdateExcelInfoClassifyId 更改表格分类
+func UpdateExcelInfoClassifyId(classifyId, excelInfoId int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` update excel_info set excel_classify_id = ? WHERE excel_info_id=? `
+	_, err = o.Raw(sql, classifyId, excelInfoId).Exec()
+
+	return
+}
+
+// GetNoContentExcelInfoByName 根据名称 获取eta表格详情
+func GetNoContentExcelInfoByName(excelName string, source int) (item *MyExcelInfoList, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT excel_info_id,source,excel_type,excel_name,unique_code,excel_classify_id,sys_user_id,sys_user_real_name,excel_image,file_url,sort,create_time,modify_time 
+ FROM excel_info WHERE excel_name = ? AND source = ? AND is_delete=0 `
+	err = o.Raw(sql, excelName, source).QueryRow(&item)
+
+	return
+}

+ 18 - 0
routers/commentsRouter.go

@@ -178,6 +178,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/excel:CustomAnalysisController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/excel:CustomAnalysisController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/excel:CustomAnalysisController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/excel:CustomAnalysisController"],
+        beego.ControllerComments{
+            Method: "GetExcelByName",
+            Router: `/excel_by_name`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/future_good:FutureGoodChartClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/future_good:FutureGoodChartClassifyController"],
         beego.ControllerComments{
             Method: "AddChartClassify",

+ 6 - 0
routers/router.go

@@ -11,6 +11,7 @@ import (
 	"eta/eta_api/controllers"
 	"eta/eta_api/controllers/data_manage"
 	"eta/eta_api/controllers/data_manage/correlation"
+	"eta/eta_api/controllers/data_manage/excel"
 	future_good2 "eta/eta_api/controllers/data_manage/future_good"
 	"eta/eta_api/controllers/data_manage/line_equation"
 	"eta/eta_api/controllers/data_manage/line_feature"
@@ -264,6 +265,11 @@ func init() {
 				&trade_analysis.TradeAnalysisController{},
 			),
 		),
+		web.NSNamespace("/custom_analysis",
+			web.NSInclude(
+				&excel.CustomAnalysisController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 1 - 1
services/data/chart_info_elastic.go

@@ -1,10 +1,10 @@
 package data
 
 import (
-	"fmt"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/services/elastic"
 	"eta/eta_api/utils"
+	"fmt"
 	"strconv"
 	"strings"
 )

+ 157 - 0
services/data/excel/custom_analysis.go

@@ -0,0 +1,157 @@
+package excel
+
+import (
+	"encoding/json"
+	"errors"
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_manage/excel"
+	"eta/eta_api/models/system"
+	"eta/eta_api/utils"
+	"strconv"
+	"time"
+)
+
+// AddCustomAnalysisTable 添加自定义分析表格
+func AddCustomAnalysisTable(excelName, content, excelImage string, excelClassifyId int, sysUser *system.Admin) (excelInfo *data_manage.ExcelInfo, err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+
+	contentByte := []byte(content)
+
+	var luckySheet LuckySheet
+
+	err = json.Unmarshal(contentByte, &luckySheet)
+	if err != nil {
+		return
+	}
+	return
+	excelClassify, err := data_manage.GetExcelClassifyById(excelClassifyId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			errMsg = "分类不存在"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+		errMsg = "获取分类信息失败"
+		err = errors.New("获取分类信息失败,Err:" + err.Error())
+		return
+	}
+	if excelClassify == nil {
+		errMsg = "分类不存在"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	if excelClassify.Source != utils.CUSTOM_ANALYSIS_TABLE {
+		errMsg = "当前分类不是自定义分析分类"
+		err = errors.New("当前分类不是自定义分析分类")
+		isSendEmail = false
+		return
+	}
+
+	// 校验是否同名文件
+	{
+		var condition string
+		var pars []interface{}
+		condition += " AND excel_classify_id=? "
+		pars = append(pars, excelClassifyId)
+
+		condition += " AND excel_name=? "
+		pars = append(pars, excelName)
+
+		// 获取分类下是否存在该表格名称
+		count, tmpErr := data_manage.GetExcelInfoCountByCondition(condition, pars)
+		if tmpErr != nil {
+			errMsg = "判断表格名称是否存在失败"
+			err = errors.New("判断表格名称是否存在失败,Err:" + tmpErr.Error())
+			return
+		}
+		if count > 0 {
+			errMsg = "表格名称已存在,请重新填写表格名称"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+	}
+
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	// 表格
+	excelInfo = &data_manage.ExcelInfo{
+		//ExcelInfoId:     0,
+		ExcelName: excelName,
+		Source:    utils.CUSTOM_ANALYSIS_TABLE,
+		//ExcelType:       req.ExcelType,
+		UniqueCode:      utils.MD5(utils.EXCEL_DATA_PREFIX + "_" + timestamp),
+		ExcelClassifyId: excelClassifyId,
+		SysUserId:       sysUser.AdminId,
+		SysUserRealName: sysUser.RealName,
+		Content:         ``,
+		ExcelImage:      excelImage,
+		Sort:            0,
+		IsDelete:        0,
+		ModifyTime:      time.Now(),
+		CreateTime:      time.Now(),
+	}
+
+	sheetsList := make([]*excel.ExcelSheet, 0)
+	// sheet处理
+	for k, sheetInfo := range luckySheet.Sheets {
+		sheetsList = append(sheetsList, &excel.ExcelSheet{
+			ExcelSheetId: 0,
+			ExcelInfoId:  0,
+			SheetName:    sheetInfo.Name,
+			Sort:         k,
+			ModifyTime:   time.Now(),
+			CreateTime:   time.Now(),
+		})
+
+		//sheetData := make([]*excel.ExcelSheetData, 0)
+
+	}
+
+	//err = data_manage.AddExcelInfo(excelInfo)
+
+	return
+}
+
+type LuckySheet struct {
+	Info struct {
+		Name           string    `json:"name"`
+		Creator        string    `json:"creator"`
+		Lastmodifiedby string    `json:"lastmodifiedby"`
+		CreatedTime    time.Time `json:"createdTime"`
+		ModifiedTime   time.Time `json:"modifiedTime"`
+		Company        string    `json:"company"`
+		Appversion     string    `json:"appversion"`
+	} `json:"info"`
+	Sheets []struct {
+		Name string `json:"name"`
+		//Config struct {
+		//	Columnlen struct {
+		//		Num15 int `json:"15"`
+		//		Num16 int `json:"16"`
+		//		Num20 int `json:"20"`
+		//		Num34 int `json:"34"`
+		//		Num35 int `json:"35"`
+		//	} `json:"columnlen"`
+		//} `json:"config"`
+		Index            string `json:"index"`
+		Order            string `json:"order"`
+		ZoomRatio        int    `json:"zoomRatio"`
+		ShowGridLines    string `json:"showGridLines"`
+		DefaultColWidth  int    `json:"defaultColWidth"`
+		DefaultRowHeight int    `json:"defaultRowHeight"`
+		Celldata         []struct {
+			R int         `json:"r"`
+			C int         `json:"c"`
+			V interface{} `json:"v,omitempty"`
+		} `json:"celldata"`
+		CalcChain []interface{} `json:"calcChain"`
+		//DataVerification struct {
+		//} `json:"dataVerification"`
+		//Hyperlink struct {
+		//} `json:"hyperlink"`
+		//Hide int `json:"hide"`
+	} `json:"sheets"`
+}

+ 2 - 0
services/excel/excel_to_lucky_sheet.go

@@ -35,11 +35,13 @@ func ConvToLuckySheet(filePath string) (err error) {
 		}
 		sheetDataList = append(sheetDataList, sheetData)
 	}
+
 	byteS, err := json.Marshal(sheetDataList)
 	if err != nil {
 		return
 	}
 	utils.FileLog.Info(string(byteS))
+
 	return
 }
 

+ 4 - 3
utils/constants.go

@@ -267,9 +267,10 @@ const (
 
 // ETA表格
 const (
-	EXCEL_DEFAULT = 1 // 自定义excel
-	TIME_TABLE    = 2 // 时间序列表格
-	MIXED_TABLE   = 3 // 混合表格
+	EXCEL_DEFAULT         = 1 // 自定义excel
+	TIME_TABLE            = 2 // 时间序列表格
+	MIXED_TABLE           = 3 // 混合表格
+	CUSTOM_ANALYSIS_TABLE = 4 // 自定义分析表格
 )
 
 // 图表样式类型