Browse Source

Merge remote-tracking branch 'origin/fix/jy_memory'

Roc 1 year ago
parent
commit
1ba4263242
1 changed files with 240 additions and 178 deletions
  1. 240 178
      services/data/excel/custom_analysis_edb.go

+ 240 - 178
services/data/excel/custom_analysis_edb.go

@@ -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
 }