|
@@ -10,6 +10,7 @@ import (
|
|
|
"fmt"
|
|
|
"github.com/araddon/dateparse"
|
|
|
"github.com/shopspring/decimal"
|
|
|
+ "github.com/tealeg/xlsx"
|
|
|
"github.com/xuri/excelize/v2"
|
|
|
"strings"
|
|
|
)
|
|
@@ -88,16 +89,17 @@ func GenerateExcelCustomAnalysisExcel(excelInfo *excel.ExcelInfo) (downloadFileP
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+// 数据集
|
|
|
+type dataStruct struct {
|
|
|
+ Value float64
|
|
|
+ Ok bool
|
|
|
+}
|
|
|
+
|
|
|
// HandleEdbSequenceVal 处理日期集和数据集(获取可用的日期、数据集)
|
|
|
func HandleEdbSequenceVal(dateSequenceVal, dataSequenceVal []string) (newDateList []string, newDataList []float64, err error, errMsg string) {
|
|
|
newDateList = make([]string, 0)
|
|
|
newDataList = make([]float64, 0)
|
|
|
|
|
|
- // 数据集
|
|
|
- type dataStruct struct {
|
|
|
- Value float64
|
|
|
- Ok bool
|
|
|
- }
|
|
|
dataList := make([]dataStruct, 0)
|
|
|
{
|
|
|
for _, v := range dataSequenceVal {
|
|
@@ -202,6 +204,13 @@ func HandleEdbSequenceVal(dateSequenceVal, dataSequenceVal []string) (newDateLis
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+// ResetCustomAnalysisData 数据重置的结构体
|
|
|
+type ResetCustomAnalysisData struct {
|
|
|
+ EdbInfoId int
|
|
|
+ DateList []string
|
|
|
+ DataList []float64
|
|
|
+}
|
|
|
+
|
|
|
// Refresh 刷新表格关联的指标信息
|
|
|
func Refresh(excelInfo *excel.ExcelInfo) (err error, errMsg string, isSendEmail bool) {
|
|
|
isSendEmail = true
|
|
@@ -243,224 +252,277 @@ func Refresh(excelInfo *excel.ExcelInfo) (err error, errMsg string, isSendEmail
|
|
|
|
|
|
//fmt.Println(xlsxFile)
|
|
|
|
|
|
- // ResetCustomAnalysisData 数据重置的结构体
|
|
|
- type ResetCustomAnalysisData struct {
|
|
|
- EdbInfoId int
|
|
|
- DateList []string
|
|
|
- DataList []float64
|
|
|
- }
|
|
|
-
|
|
|
edbInfoIdList := make([]int, 0)
|
|
|
|
|
|
for _, v := range list {
|
|
|
edbInfoIdList = append(edbInfoIdList, v.EdbInfoId)
|
|
|
|
|
|
- dateList := make([]string, 0)
|
|
|
- dataList := make([]string, 0)
|
|
|
+ // 获取对应的日期和数据列表
|
|
|
+ relDateList, relDataList, tmpErr, tmpErrMsg := getDateAndDataList(v, xlsxFile)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ errMsg = tmpErrMsg
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //fmt.Println(v)
|
|
|
+ req2 := &ResetCustomAnalysisData{
|
|
|
+ EdbInfoId: v.EdbInfoId,
|
|
|
+ DateList: relDateList,
|
|
|
+ DataList: relDataList,
|
|
|
+ }
|
|
|
|
|
|
- // 日期序列
|
|
|
- {
|
|
|
- sheetName, startColumnName, endColumnName, startNum, endNum, isAll, isRow, isColumn, tmpErr := GetSheetStr(v.DateSequenceStr)
|
|
|
- if tmpErr != nil {
|
|
|
- err = tmpErr
|
|
|
- return
|
|
|
- }
|
|
|
+ // 调用指标库去更新
|
|
|
+ reqJson, tmpErr := json.Marshal(req2)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ respItem, tmpErr := data.ResetCustomAnalysisData(string(reqJson))
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if respItem.Ret != 200 {
|
|
|
+ errMsg = respItem.Msg
|
|
|
+ err = errors.New(respItem.ErrMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- // 查找sheet页
|
|
|
- sheetInfo, ok := xlsxFile.Sheet[sheetName]
|
|
|
- if !ok {
|
|
|
- errMsg = "找不到" + sheetName
|
|
|
- err = errors.New(errMsg)
|
|
|
- return
|
|
|
- }
|
|
|
+ if len(edbInfoIdList) > 0 {
|
|
|
+ err, _ = data.EdbInfoRefreshAllFromBaseV3(edbInfoIdList, false, true, true)
|
|
|
+ }
|
|
|
|
|
|
- startNum = startNum - 1
|
|
|
- endNum = endNum - 1
|
|
|
- // 选择行的数据
|
|
|
- if isRow {
|
|
|
- // 因为是选择一行的数据,所以开始行和结束行时一样的
|
|
|
- //endNum = startNum - 1
|
|
|
-
|
|
|
- // 开始列名、结束列
|
|
|
- var startColumn, endColumn int
|
|
|
- if isAll {
|
|
|
- // 结束列(其实也就是整列的个数)
|
|
|
- endColumn = len(sheetInfo.Cols) - 1
|
|
|
- } else {
|
|
|
- tmpStartColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
|
|
|
- if tmpErr != nil {
|
|
|
- errMsg = "列名异常:" + startColumnName
|
|
|
- err = errors.New(errMsg)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- tmpEndColumn, tmpErr := excelize.ColumnNameToNumber(endColumnName)
|
|
|
- if tmpErr != nil {
|
|
|
- errMsg = "列名异常:" + endColumnName
|
|
|
- err = errors.New(errMsg)
|
|
|
- return
|
|
|
- }
|
|
|
- startColumn = tmpStartColumn - 1
|
|
|
- endColumn = tmpEndColumn - 1
|
|
|
- }
|
|
|
+ //xlsxFile.Sheet[]
|
|
|
|
|
|
- for currColumn := startColumn; currColumn <= endColumn; currColumn++ {
|
|
|
- currCell := sheetInfo.Cell(startNum, currColumn)
|
|
|
- if currCell == nil {
|
|
|
- errMsg = fmt.Sprintf("第%d列,第%d行数据异常", startColumn, startNum)
|
|
|
- err = errors.New(errMsg)
|
|
|
- return
|
|
|
- }
|
|
|
- dateList = append(dateList, currCell.Value)
|
|
|
- }
|
|
|
+ return
|
|
|
+}
|
|
|
|
|
|
- } else if isColumn { // 选择列的数据
|
|
|
- if isAll {
|
|
|
- // 选择一整列的话,结束行得根据实际情况调整(其实也就是整个sheet有多少行)
|
|
|
- endNum = len(sheetInfo.Rows) - 1
|
|
|
- }
|
|
|
+// getDateAndDataList
|
|
|
+// @Description: 获取待刷新的日期和数据
|
|
|
+// @author: Roc
|
|
|
+// @datetime 2023-12-21 15:21:14
|
|
|
+// @param excelEdbMappingItem *excel.ExcelEdbMappingItem
|
|
|
+// @param xlsxFile *xlsx.File
|
|
|
+// @return newDateList []string
|
|
|
+// @return newDataList []float64
|
|
|
+// @return err error
|
|
|
+// @return errMsg string
|
|
|
+func getDateAndDataList(excelEdbMappingItem *excel.ExcelEdbMappingItem, xlsxFile *xlsx.File) (newDateList []string, newDataList []float64, err error, errMsg string) {
|
|
|
+ var dateList, dataList []string
|
|
|
+
|
|
|
+ // 日期序列
|
|
|
+ {
|
|
|
+ sheetName, startColumnName, endColumnName, startNum, endNum, isAll, isRow, isColumn, tmpErr := GetSheetStr(excelEdbMappingItem.DateSequenceStr)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
|
|
|
- startColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
|
|
|
+ // 查找sheet页
|
|
|
+ sheetInfo, ok := xlsxFile.Sheet[sheetName]
|
|
|
+ if !ok {
|
|
|
+ errMsg = "找不到" + sheetName
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ startNum = startNum - 1
|
|
|
+ endNum = endNum - 1
|
|
|
+ // 选择行的数据
|
|
|
+ if isRow {
|
|
|
+ // 因为是选择一行的数据,所以开始行和结束行时一样的
|
|
|
+ //endNum = startNum - 1
|
|
|
+
|
|
|
+ // 开始列名、结束列
|
|
|
+ var startColumn, endColumn int
|
|
|
+ if isAll {
|
|
|
+ // 结束列(其实也就是整列的个数)
|
|
|
+ endColumn = len(sheetInfo.Cols) - 1
|
|
|
+ } else {
|
|
|
+ tmpStartColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
|
|
|
if tmpErr != nil {
|
|
|
errMsg = "列名异常:" + startColumnName
|
|
|
err = errors.New(errMsg)
|
|
|
return
|
|
|
}
|
|
|
- startColumn = startColumn - 1
|
|
|
-
|
|
|
- for currRow := startNum; currRow <= endNum; currRow++ {
|
|
|
- currCell := sheetInfo.Cell(currRow, startColumn)
|
|
|
- if currCell == nil {
|
|
|
- errMsg = fmt.Sprintf("第%d列,第%d行数据异常", startColumn, startNum)
|
|
|
- err = errors.New(errMsg)
|
|
|
- return
|
|
|
- }
|
|
|
- dateList = append(dateList, currCell.Value)
|
|
|
+
|
|
|
+ tmpEndColumn, tmpErr := excelize.ColumnNameToNumber(endColumnName)
|
|
|
+ if tmpErr != nil {
|
|
|
+ errMsg = "列名异常:" + endColumnName
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
}
|
|
|
+ startColumn = tmpStartColumn - 1
|
|
|
+ endColumn = tmpEndColumn - 1
|
|
|
}
|
|
|
|
|
|
- }
|
|
|
+ // 最大列数,如果设置的超过了最大列数,那么结束列就是最大列数
|
|
|
+ maxCol := len(sheetInfo.Cols)
|
|
|
+ if endColumn > maxCol {
|
|
|
+ endColumn = maxCol - 1
|
|
|
+ }
|
|
|
|
|
|
- // 数据序列
|
|
|
- {
|
|
|
- sheetName, startColumnName, endColumnName, startNum, endNum, isAll, isRow, isColumn, tmpErr := GetSheetStr(v.DataSequenceStr)
|
|
|
- if tmpErr != nil {
|
|
|
- err = tmpErr
|
|
|
- return
|
|
|
+ // 长度固定,避免一直申请内存空间
|
|
|
+ dateList = make([]string, endColumn-startColumn+1)
|
|
|
+
|
|
|
+ i := 0
|
|
|
+ for currColumn := startColumn; currColumn <= endColumn; currColumn++ {
|
|
|
+ currCell := sheetInfo.Cell(startNum, currColumn)
|
|
|
+ if currCell == nil {
|
|
|
+ errMsg = fmt.Sprintf("第%d列,第%d行数据异常", startColumn, startNum)
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //dateList = append(dateList, currCell.Value)
|
|
|
+ dateList[i] = currCell.Value
|
|
|
+ i++
|
|
|
}
|
|
|
|
|
|
- // 查找sheet页
|
|
|
- sheetInfo, ok := xlsxFile.Sheet[sheetName]
|
|
|
- if !ok {
|
|
|
- errMsg = "找不到" + sheetName
|
|
|
+ } else if isColumn { // 选择列的数据
|
|
|
+ if isAll {
|
|
|
+ // 选择一整列的话,结束行得根据实际情况调整(其实也就是整个sheet有多少行)
|
|
|
+ endNum = len(sheetInfo.Rows) - 1
|
|
|
+ }
|
|
|
+
|
|
|
+ startColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
|
|
|
+ if tmpErr != nil {
|
|
|
+ errMsg = "列名异常:" + startColumnName
|
|
|
err = errors.New(errMsg)
|
|
|
return
|
|
|
}
|
|
|
+ startColumn = startColumn - 1
|
|
|
|
|
|
- startNum = startNum - 1
|
|
|
- endNum = endNum - 1
|
|
|
- // 选择行的数据
|
|
|
- if isRow {
|
|
|
- // 开始列名、结束列
|
|
|
- var startColumn, endColumn int
|
|
|
- if isAll {
|
|
|
- // 结束列(其实也就是整列的个数)
|
|
|
- endColumn = len(sheetInfo.Cols) - 1
|
|
|
- } else {
|
|
|
-
|
|
|
- tmpStartColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
|
|
|
- if tmpErr != nil {
|
|
|
- errMsg = "列名异常:" + startColumnName
|
|
|
- err = errors.New(errMsg)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- tmpEndColumn, tmpErr := excelize.ColumnNameToNumber(endColumnName)
|
|
|
- if tmpErr != nil {
|
|
|
- errMsg = "列名异常:" + endColumnName
|
|
|
- err = errors.New(errMsg)
|
|
|
- return
|
|
|
- }
|
|
|
- startColumn = tmpStartColumn - 1
|
|
|
- endColumn = tmpEndColumn - 1
|
|
|
+ // 最大行数,如果设置的超过了最大行数,那么结束行就是最大行数
|
|
|
+ maxRow := len(sheetInfo.Rows)
|
|
|
+ if endNum > maxRow {
|
|
|
+ endNum = maxRow - 1
|
|
|
+ }
|
|
|
+ // 长度固定,避免一直申请内存空间
|
|
|
+ dateList = make([]string, endNum-startNum+1)
|
|
|
+ i := 0
|
|
|
+ for currRow := startNum; currRow <= endNum; currRow++ {
|
|
|
+ currCell := sheetInfo.Cell(currRow, startColumn)
|
|
|
+ if currCell == nil {
|
|
|
+ errMsg = fmt.Sprintf("第%d列,第%d行数据异常", startColumn, startNum)
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
}
|
|
|
+ //dateList = append(dateList, currCell.Value)
|
|
|
+ dateList[i] = currCell.Value
|
|
|
+ i++
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- for currColumn := startColumn; currColumn <= endColumn; currColumn++ {
|
|
|
- currCell := sheetInfo.Cell(startNum, currColumn)
|
|
|
- if currCell == nil {
|
|
|
- errMsg = fmt.Sprintf("第%d列,第%d行数据异常", startColumn, startNum)
|
|
|
- err = errors.New(errMsg)
|
|
|
- return
|
|
|
- }
|
|
|
- dataList = append(dataList, currCell.Value)
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- } else if isColumn { // 选择列的数据
|
|
|
- if isAll {
|
|
|
- // 选择一整列的话,结束行得根据实际情况调整(其实也就是整个sheet有多少行)
|
|
|
- endNum = len(sheetInfo.Rows) - 1
|
|
|
- }
|
|
|
+ // 数据序列
|
|
|
+ {
|
|
|
+ sheetName, startColumnName, endColumnName, startNum, endNum, isAll, isRow, isColumn, tmpErr := GetSheetStr(excelEdbMappingItem.DataSequenceStr)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查找sheet页
|
|
|
+ sheetInfo, ok := xlsxFile.Sheet[sheetName]
|
|
|
+ if !ok {
|
|
|
+ errMsg = "找不到" + sheetName
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ startNum = startNum - 1
|
|
|
+ endNum = endNum - 1
|
|
|
+ // 选择行的数据
|
|
|
+ if isRow {
|
|
|
+ // 开始列名、结束列
|
|
|
+ var startColumn, endColumn int
|
|
|
+ if isAll {
|
|
|
+ // 结束列(其实也就是整列的个数)
|
|
|
+ endColumn = len(sheetInfo.Cols) - 1
|
|
|
+ } else {
|
|
|
|
|
|
- startColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
|
|
|
+ tmpStartColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
|
|
|
if tmpErr != nil {
|
|
|
errMsg = "列名异常:" + startColumnName
|
|
|
err = errors.New(errMsg)
|
|
|
return
|
|
|
}
|
|
|
- startColumn = startColumn - 1
|
|
|
-
|
|
|
- for currRow := startNum; currRow <= endNum; currRow++ {
|
|
|
- currCell := sheetInfo.Cell(currRow, startColumn)
|
|
|
- if currCell == nil {
|
|
|
- errMsg = fmt.Sprintf("第%d列,第%d行数据异常", startColumn, startNum)
|
|
|
- err = errors.New(errMsg)
|
|
|
- return
|
|
|
- }
|
|
|
- dataList = append(dataList, currCell.Value)
|
|
|
+
|
|
|
+ tmpEndColumn, tmpErr := excelize.ColumnNameToNumber(endColumnName)
|
|
|
+ if tmpErr != nil {
|
|
|
+ errMsg = "列名异常:" + endColumnName
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
}
|
|
|
+ startColumn = tmpStartColumn - 1
|
|
|
+ endColumn = tmpEndColumn - 1
|
|
|
}
|
|
|
|
|
|
- }
|
|
|
+ // 最大列数,如果设置的超过了最大列数,那么结束列就是最大列数
|
|
|
+ maxCol := len(sheetInfo.Cols)
|
|
|
+ if endColumn > maxCol {
|
|
|
+ endColumn = maxCol - 1
|
|
|
+ }
|
|
|
+ // 长度固定,避免一直申请内存空间
|
|
|
+ dataList = make([]string, endColumn-startColumn+1)
|
|
|
+ i := 0
|
|
|
+ for currColumn := startColumn; currColumn <= endColumn; currColumn++ {
|
|
|
+ currCell := sheetInfo.Cell(startNum, currColumn)
|
|
|
+ if currCell == nil {
|
|
|
+ errMsg = fmt.Sprintf("第%d列,第%d行数据异常", startColumn, startNum)
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //dataList = append(dataList, currCell.Value)
|
|
|
+ dataList[i] = currCell.Value
|
|
|
+ i++
|
|
|
+ }
|
|
|
|
|
|
- //fmt.Println("日期序列结束")
|
|
|
+ } else if isColumn { // 选择列的数据
|
|
|
+ if isAll {
|
|
|
+ // 选择一整列的话,结束行得根据实际情况调整(其实也就是整个sheet有多少行)
|
|
|
+ endNum = len(sheetInfo.Rows) - 1
|
|
|
+ }
|
|
|
|
|
|
- // 将excel中的日期、数据系列处理
|
|
|
- relDateList, relDataList, tmpErr, tmpErrMsg := HandleEdbSequenceVal(dateList, dataList)
|
|
|
- if tmpErr != nil {
|
|
|
- err = tmpErr
|
|
|
- errMsg = tmpErrMsg
|
|
|
- return
|
|
|
- }
|
|
|
- req2 := &ResetCustomAnalysisData{
|
|
|
- EdbInfoId: v.EdbInfoId,
|
|
|
- DateList: relDateList,
|
|
|
- DataList: relDataList,
|
|
|
- }
|
|
|
+ startColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
|
|
|
+ if tmpErr != nil {
|
|
|
+ errMsg = "列名异常:" + startColumnName
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ startColumn = startColumn - 1
|
|
|
|
|
|
- // 调用指标库去更新
|
|
|
- reqJson, tmpErr := json.Marshal(req2)
|
|
|
- if tmpErr != nil {
|
|
|
- err = tmpErr
|
|
|
- return
|
|
|
- }
|
|
|
- respItem, tmpErr := data.ResetCustomAnalysisData(string(reqJson))
|
|
|
- if tmpErr != nil {
|
|
|
- err = tmpErr
|
|
|
- return
|
|
|
- }
|
|
|
- if respItem.Ret != 200 {
|
|
|
- errMsg = respItem.Msg
|
|
|
- err = errors.New(respItem.ErrMsg)
|
|
|
- return
|
|
|
+ // 最大行数,如果设置的超过了最大行数,那么结束行就是最大行数
|
|
|
+ maxRow := len(sheetInfo.Rows)
|
|
|
+ if endNum > maxRow {
|
|
|
+ endNum = maxRow - 1
|
|
|
+ }
|
|
|
+
|
|
|
+ // 长度固定,避免一直申请内存空间
|
|
|
+ dataList = make([]string, endNum-startNum+1)
|
|
|
+ i := 0
|
|
|
+ for currRow := startNum; currRow <= endNum; currRow++ {
|
|
|
+ currCell := sheetInfo.Cell(currRow, startColumn)
|
|
|
+ if currCell == nil {
|
|
|
+ errMsg = fmt.Sprintf("第%d列,第%d行数据异常", startColumn, startNum)
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //dataList = append(dataList, currCell.Value)
|
|
|
+ dataList[i] = currCell.Value
|
|
|
+ i++
|
|
|
+ }
|
|
|
}
|
|
|
- //sheetInfo.Cell()
|
|
|
- }
|
|
|
|
|
|
- if len(edbInfoIdList) > 0 {
|
|
|
- err, _ = data.EdbInfoRefreshAllFromBaseV3(edbInfoIdList, false, true, true)
|
|
|
}
|
|
|
|
|
|
- //xlsxFile.Sheet[]
|
|
|
+ //fmt.Println(dateList, dataList)
|
|
|
+ //fmt.Println("日期序列结束")
|
|
|
+
|
|
|
+ // 将excel中的日期、数据系列处理
|
|
|
+ newDateList, newDataList, err, errMsg = HandleEdbSequenceVal(dateList, dataList)
|
|
|
|
|
|
return
|
|
|
}
|