Roc 1 year ago
parent
commit
822d393f57

+ 8 - 4
controllers/data_manage/excel/excel_info.go

@@ -180,7 +180,7 @@ func (c *ExcelInfoController) Add() {
 			br.ErrMsg = "表格json转结构体失败,Err:" + err.Error()
 			return
 		}
-		newResult, tmpErr := excel2.GetMixedTableCellData(result.Data)
+		newResult, tmpErr := excel2.GetMixedTableCellData(result.CellRelation, result.Data)
 		if tmpErr != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取最新的数据失败,Err:" + err.Error()
@@ -595,7 +595,7 @@ func (c *ExcelInfoController) Edit() {
 			br.ErrMsg = "表格json转结构体失败,Err:" + err.Error()
 			return
 		}
-		newResult, tmpErr := excel2.GetMixedTableCellData(result.Data)
+		newResult, tmpErr := excel2.GetMixedTableCellData(result.CellRelation, result.Data)
 		if tmpErr != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取最新的数据失败,Err:" + err.Error()
@@ -1183,7 +1183,7 @@ func (c *ExcelInfoController) GetExcelTableData() {
 			br.ErrMsg = "表格json转结构体失败,Err:" + err.Error()
 			return
 		}
-		newResult, tmpErr := excel2.GetMixedTableCellData(result.Data)
+		newResult, tmpErr := excel2.GetMixedTableCellData(result.CellRelation, result.Data)
 		if tmpErr != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取最新的数据失败,Err:" + err.Error()
@@ -1908,7 +1908,7 @@ func (c *ExcelInfoController) Download() {
 			br.ErrMsg = "表格json转结构体失败,Err:" + err.Error()
 			return
 		}
-		newResult, tmpErr := excel2.GetMixedTableCellData(result.Data)
+		newResult, tmpErr := excel2.GetMixedTableCellData(result.CellRelation, result.Data)
 		if tmpErr != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取最新的数据失败,Err:" + err.Error()
@@ -2140,3 +2140,7 @@ func decompressZip(src string) error {
 	}
 	return nil
 }
+
+func init() {
+	//excel.HandleDate(dataTimeType int, val)
+}

+ 0 - 17
models/data_manage/excel/request/excel_info.go

@@ -128,20 +128,3 @@ type CopyExcelInfoReq struct {
 	ExcelName       string `description:"表格名称"`
 	ExcelClassifyId int    `description:"分类id"`
 }
-
-// MixedTableReq 混合表格保存请求参数
-type MixedTableReq struct {
-	CellRelation string                    `description:"单元格关系"`
-	Data         [][]MixedTableCellDataReq `description:"混合表格单元格参数"`
-}
-
-// MixedTableCellDataReq 混合表格单元格参数
-type MixedTableCellDataReq struct {
-	Uid          string `description:"单元格唯一标识"`
-	DataType     int    `description:"数据类型,1:日期,2:指标,3:自定义文本,4:插值"`
-	DataTime     string `description:"所属日期"`
-	DataTimeType int    `description:"日期类型:0:手动输入日期;1:导入系统日期;2:导入系统日期计算后的日期;3:导入系统日期相关的指定日期;4:导入指标日期(指标库的最新日期);"`
-	EdbInfoId    int    `description:"指标id"`
-	ShowValue    string `description:"展示值"`
-	Value        string `description:"实际值"`
-}

+ 53 - 0
models/data_manage/excel/request/mixed_table.go

@@ -0,0 +1,53 @@
+package request
+
+// 单元格的数据类型
+const (
+	DateDT          = iota + 1 //日期
+	EdbDT                      // 指标类型
+	CustomTextDT               // 自定义文本
+	InsertDataDT               // 插值
+	PopInsertDataDT            // 弹框插值
+)
+
+// 单元格的日期类型类型
+const (
+	CustomDateT          = iota //手动输入日期
+	SystemDateT                 // 系统日期
+	SystemCalculateDateT        // 系统日期计算后的日期
+	SystemAppointDateT          // 导入系统日期相关的指定频率(所在周/旬/月/季/半年/年的最后/最早一天)
+	EdbDateDT                   // 导入指标日期(指标库的最新日期)
+)
+
+// MixedTableReq 混合表格保存请求参数
+type MixedTableReq struct {
+	CellRelation string                    `description:"单元格关系"`
+	Data         [][]MixedTableCellDataReq `description:"混合表格单元格参数"`
+}
+
+// MixedTableCellDataReq 混合表格单元格参数
+type MixedTableCellDataReq struct {
+	Uid          string `description:"单元格唯一标识"`
+	DataType     int    `description:"数据类型,1:日期,2:指标,3:自定义文本,4:插值"`
+	DataTime     string `description:"所属日期"`
+	DataTimeType int    `description:"日期类型:0:手动输入日期;1:导入系统日期;2:导入系统日期计算后的日期;3:导入系统日期相关的指定频率(所在周/旬/月/季/半年/年的最后/最早一天);4:导入指标日期(指标库的最新日期);"`
+	EdbInfoId    int    `description:"指标id"`
+	ShowValue    string `description:"展示值"`
+	Value        string `description:"实际值"`
+}
+
+// CellRelationConf
+// @Description: 单元格的关系配置结构体
+type CellRelationConf struct {
+	CellRelation
+	//Type         int          `json:"type" description:"数据类型,跟MixedTableCellDataReq的DataType保持一致"`
+	//Key          string       `json:"key" description:"单元格的唯一标识"`
+	RelationDate CellRelation `json:"relation_date"`
+	RelationEdb  CellRelation `json:"relation_edb"`
+}
+
+// CellRelation
+// @Description: 单元格的关系结构体
+type CellRelation struct {
+	Type int    `json:"type" description:"数据类型,跟MixedTableCellDataReq的DataType保持一致"`
+	Key  string `json:"key" description:"单元格的唯一标识"`
+}

+ 1 - 91
services/data/excel/excel_info.go

@@ -73,7 +73,7 @@ func GetExcelDetailInfoByExcelInfoId(excelInfoId int) (excelDetail response.Exce
 			err = errors.New("表格json转结构体失败,Err:" + err.Error())
 			return
 		}
-		newData, tmpErr := GetMixedTableCellData(result.Data)
+		newData, tmpErr := GetMixedTableCellData(result.CellRelation, result.Data)
 		if tmpErr != nil {
 			err = errors.New("获取最新的数据失败,Err:" + tmpErr.Error())
 			return
@@ -1261,93 +1261,3 @@ func calculate(calculateFormula string, TagMap map[string]float64) (calVal, errM
 
 	return
 }
-
-// GetMixedTableCellData 获取混合表格数据
-func GetMixedTableCellData(config [][]request.MixedTableCellDataReq) (newMixedTableCellDataList [][]request.MixedTableCellDataReq, err error) {
-	newMixedTableCellDataList = config
-
-	edbInfoIdList := make([]int, 0)
-	dataEdbInfoIdList := make([]int, 0)
-	for _, row := range config {
-		for _, cell := range row {
-			if cell.DataType == 2 {
-				edbInfoIdList = append(edbInfoIdList, cell.EdbInfoId)
-			} else if utils.InArrayByInt([]int{4, 5}, cell.DataType) {
-				dataEdbInfoIdList = append(dataEdbInfoIdList, cell.EdbInfoId)
-			}
-		}
-	}
-
-	edbInfoList, err := data_manage.GetEdbInfoByIdList(edbInfoIdList)
-	if err != nil {
-		return
-	}
-
-	// 指标信息map
-	edbInfoMap := make(map[int]*data_manage.EdbInfo)
-	// 日度指标数据map
-	edbDataListMap := make(map[int]map[string]float64)
-	// 月度指标数据map
-	edbMonthDataListMap := make(map[int]map[string]float64)
-	for _, edbInfo := range edbInfoList {
-		edbInfoMap[edbInfo.EdbInfoId] = edbInfo
-
-		dataList := make([]*data_manage.EdbDataList, 0)
-		switch edbInfo.EdbInfoType {
-		case 0:
-			dataList, _ = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.EdbInfoId, ``, ``)
-		case 1:
-			_, dataList, _, _, _, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, ``, false)
-		default:
-			err = errors.New(fmt.Sprint("获取失败,指标类型异常", edbInfo.EdbInfoType))
-		}
-
-		dateValMap := make(map[string]float64)
-		monthValMap := make(map[string]float64)
-		for _, data := range dataList {
-			// 日度数据
-			dateValMap[data.DataTime] = data.Value
-			// 月度数据(取该月份的第一个数据)
-			yearMonth := strings.Join(strings.Split(data.DataTime, "-")[0:2], "-")
-			if _, ok := monthValMap[yearMonth]; !ok {
-				monthValMap[yearMonth] = data.Value
-			}
-		}
-		edbDataListMap[edbInfo.EdbInfoId] = dateValMap
-		edbMonthDataListMap[edbInfo.EdbInfoId] = monthValMap
-	}
-
-	for k, row := range newMixedTableCellDataList {
-		for i, cell := range row {
-			if cell.DataType == 2 {
-				if edbInfo, ok := edbInfoMap[cell.EdbInfoId]; ok {
-					cell.ShowValue = edbInfo.EdbName
-				}
-			} else if utils.InArrayByInt([]int{4, 5}, cell.DataType) {
-				tmpDateList := strings.Split(cell.DataTime, "-")
-				tmpDateValMap := make(map[string]float64)
-				if len(tmpDateList) == 2 {
-					//月度数据
-					if dateValMap, ok := edbMonthDataListMap[cell.EdbInfoId]; ok {
-						tmpDateValMap = dateValMap
-					}
-				} else {
-					// 日度数据
-					if dateValMap, ok := edbDataListMap[cell.EdbInfoId]; ok {
-						tmpDateValMap = dateValMap
-					}
-
-				}
-				if val, ok2 := tmpDateValMap[cell.DataTime]; ok2 {
-					//cell.ShowValue = fmt.Sprint(val)
-					cell.ShowValue = utils.FormatTableDataShowValue(val)
-				}
-			}
-
-			row[i] = cell
-		}
-		newMixedTableCellDataList[k] = row
-	}
-
-	return
-}

+ 235 - 0
services/data/excel/mixed_table.go

@@ -0,0 +1,235 @@
+package excel
+
+import (
+	"encoding/json"
+	"errors"
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_manage/excel/request"
+	"eta/eta_api/services/data"
+	"eta/eta_api/utils"
+	"fmt"
+	"strings"
+	"time"
+)
+
+// GetMixedTableCellData 获取混合表格数据
+func GetMixedTableCellData(cellRelationConf string, config [][]request.MixedTableCellDataReq) (newMixedTableCellDataList [][]request.MixedTableCellDataReq, err error) {
+	newMixedTableCellDataList = config
+
+	// 单元格关系配置x信息
+	cellRelationConfMap := make(map[string]request.CellRelationConf)
+	cellRelationConfList := make([]request.CellRelationConf, 0)
+	if cellRelationConf != `` {
+		err = json.Unmarshal([]byte(cellRelationConf), &cellRelationConfList)
+		if err != nil {
+			return
+		}
+
+		for _, v := range cellRelationConfList {
+			cellRelationConfMap[v.Key] = v
+		}
+	}
+
+	// 找出所有的关联指标id
+	config, edbInfoIdList, _ := handleConfig(config)
+
+	edbInfoList, err := data_manage.GetEdbInfoByIdList(edbInfoIdList)
+	if err != nil {
+		return
+	}
+
+	// 指标信息map
+	edbInfoMap := make(map[int]*data_manage.EdbInfo)
+	// 日度指标数据map
+	edbDataListMap := make(map[int]map[string]float64)
+	// 月度指标数据map
+	edbMonthDataListMap := make(map[int]map[string]float64)
+	for _, edbInfo := range edbInfoList {
+		edbInfoMap[edbInfo.EdbInfoId] = edbInfo
+
+		dataList := make([]*data_manage.EdbDataList, 0)
+		switch edbInfo.EdbInfoType {
+		case 0:
+			dataList, _ = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.EdbInfoId, ``, ``)
+		case 1:
+			_, dataList, _, _, _, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, ``, false)
+		default:
+			err = errors.New(fmt.Sprint("获取失败,指标类型异常", edbInfo.EdbInfoType))
+		}
+
+		dateValMap := make(map[string]float64)
+		monthValMap := make(map[string]float64)
+		for _, data := range dataList {
+			// 日度数据
+			dateValMap[data.DataTime] = data.Value
+			// 月度数据(取该月份的第一个数据)
+			yearMonth := strings.Join(strings.Split(data.DataTime, "-")[0:2], "-")
+			if _, ok := monthValMap[yearMonth]; !ok {
+				monthValMap[yearMonth] = data.Value
+			}
+		}
+		edbDataListMap[edbInfo.EdbInfoId] = dateValMap
+		edbMonthDataListMap[edbInfo.EdbInfoId] = monthValMap
+	}
+
+	for k, row := range newMixedTableCellDataList {
+		for i, cell := range row {
+			if cell.DataType == request.EdbDT {
+				if edbInfo, ok := edbInfoMap[cell.EdbInfoId]; ok {
+					cell.ShowValue = edbInfo.EdbName
+				}
+			} else if utils.InArrayByInt([]int{request.InsertDataDT, request.PopInsertDataDT}, cell.DataType) {
+				tmpDateList := strings.Split(cell.DataTime, "-")
+				tmpDateValMap := make(map[string]float64)
+				if len(tmpDateList) == 2 {
+					//月度数据
+					if dateValMap, ok := edbMonthDataListMap[cell.EdbInfoId]; ok {
+						tmpDateValMap = dateValMap
+					}
+				} else {
+					// 日度数据
+					if dateValMap, ok := edbDataListMap[cell.EdbInfoId]; ok {
+						tmpDateValMap = dateValMap
+					}
+
+				}
+				if val, ok2 := tmpDateValMap[cell.DataTime]; ok2 {
+					//cell.ShowValue = fmt.Sprint(val)
+					cell.ShowValue = utils.FormatTableDataShowValue(val)
+				}
+			}
+
+			row[i] = cell
+		}
+		newMixedTableCellDataList[k] = row
+	}
+
+	return
+}
+
+func handleConfig(config [][]request.MixedTableCellDataReq) ([][]request.MixedTableCellDataReq, []int, []int) {
+	edbInfoIdList := make([]int, 0)
+	dataEdbInfoIdList := make([]int, 0)
+	for _, row := range config {
+		for _, cell := range row {
+			switch cell.DataType {
+			case request.EdbDT: // 指标信息
+				edbInfoIdList = append(edbInfoIdList, cell.EdbInfoId)
+			case request.InsertDataDT, request.PopInsertDataDT: // 插值、弹框插值
+				dataEdbInfoIdList = append(dataEdbInfoIdList, cell.EdbInfoId)
+			case request.DateDT: // 日期类型
+			}
+		}
+	}
+
+	return config, edbInfoIdList, dataEdbInfoIdList
+}
+
+func HandleDate(dataTimeType int, val string) (date string, err error, errMsg string) {
+	return handleDate(dataTimeType, val)
+}
+
+func handleDate(dataTimeType int, val string) (date string, err error, errMsg string) {
+	if val == `` {
+		errMsg = "错误的日期数据"
+		err = errors.New(errMsg)
+		return
+	}
+	switch dataTimeType {
+	case request.CustomDateT: //手动输入日期
+		date = val
+	case request.SystemDateT: // 系统日期
+		date = time.Now().Format(utils.FormatDate)
+	case request.SystemCalculateDateT: // 系统日期计算后的日期
+		date, err, errMsg = handleSystemCalculateDateT(val)
+	case request.SystemAppointDateT: // 处理系统日期相关的指定频率(所在周/旬/月/季/半年/年的最后/最早一天)
+		date, err, errMsg = handleSystemAppointDateT(val)
+	case request.EdbDateDT: // 导入指标日期(指标库的最新日期)
+	default:
+		errMsg = "错误的日期类型"
+		err = errors.New(errMsg)
+		return
+	}
+
+	return
+}
+
+//	 handleSystemCalculateDateT
+//		@Description: 处理系统日期计算后的日期
+//		@author: Roc
+//		@datetime2023-10-26 11:12:56
+//		@param val string
+//		@return date string
+//		@return err error
+//		@return errMsg string
+func handleSystemCalculateDateT(val string) (date string, err error, errMsg string) {
+	type SystemCalculateVal struct {
+		Num       int
+		Frequency string
+	}
+	var config SystemCalculateVal
+	err = json.Unmarshal([]byte(val), &config)
+	if err != nil {
+		return
+	}
+	currDate := time.Now()
+	switch config.Frequency {
+	case "", "日":
+		date = currDate.AddDate(0, 0, config.Num).Format(utils.FormatDate)
+	default:
+		errMsg = "错误的日期频度:" + config.Frequency
+		err = errors.New(errMsg)
+		return
+	}
+
+	return
+}
+
+//	 handleSystemAppointDateT
+//		@Description: 处理系统日期相关的指定频率(所在周/旬/月/季/半年/年的最后/最早一天)
+//		@author: Roc
+//		@datetime2023-10-26 11:13:52
+//		@param val string
+//		@return date string
+//		@return err error
+//		@return errMsg string
+func handleSystemAppointDateT(val string) (date string, err error, errMsg string) {
+	type SystemCalculateVal struct {
+		Frequency string
+		Day       string
+	}
+	var config SystemCalculateVal
+	err = json.Unmarshal([]byte(val), &config)
+	if err != nil {
+		return
+	}
+	currDate := time.Now()
+	switch config.Frequency {
+	case "本周":
+		day := currDate.Day()
+		num := 0
+		switch config.Day {
+		case "周一":
+			num = 1
+		case "周二":
+			num = 2
+		case "周三":
+			num = 3
+		case "周四":
+			num = 4
+		case "周五":
+			num = 5
+		case "周六":
+			num = 6
+		case "周日":
+			num = 0
+		}
+		day = day - num
+	default:
+		errMsg = "错误的日期频度:" + config.Frequency
+		err = errors.New(errMsg)
+		return
+	}
+
+	return
+}