Browse Source

add:增加表格小数保留

zqbao 6 months ago
parent
commit
4c8c15998c

+ 16 - 9
controllers/data_manage/excel/excel_info.go

@@ -1839,7 +1839,7 @@ func (c *ExcelInfoController) GetFirstEdbData() {
 		return
 	}
 
-	dataList, err := excel2.GetFirstEdbDataList(edbInfo, num, []string{})
+	dataList, err := excel2.GetFirstEdbDataList(edbInfo, num, []string{}, -1)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = fmt.Sprint("获取失败,Err:", err.Error())
@@ -1868,6 +1868,7 @@ func (c *ExcelInfoController) GetFirstEdbData() {
 	br.Data = response.TableDataItem{
 		EdbInfoId:     edbInfoId,
 		Data:          dataList,
+		Decimal:       -1,
 		ExcelSource:   excelSource,
 		ExcelSourceEn: excelSourceEn,
 	}
@@ -1918,7 +1919,7 @@ func (c *ExcelInfoController) GetOtherEdbData() {
 		br.ErrMsg = fmt.Sprint("获取指标信息失败,Err:", err.Error())
 		return
 	}
-	dataList, err := excel2.GetOtherEdbDataList(edbInfo, req.DateList)
+	dataList, err := excel2.GetOtherEdbDataListFollowDate(edbInfo, req.DateList, req.DateDecimal)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = fmt.Sprint("获取失败,Err:", err.Error())
@@ -1947,6 +1948,7 @@ func (c *ExcelInfoController) GetOtherEdbData() {
 	br.Data = response.TableDataItem{
 		EdbInfoId:     req.EdbInfoId,
 		Data:          dataList,
+		Decimal:       -1,
 		ExcelSource:   excelSource,
 		ExcelSourceEn: excelSourceEn,
 	}
@@ -2008,7 +2010,7 @@ func (c *ExcelInfoController) GetBatchEdbData() {
 			req.Num = len(firstDataList)
 		}
 		if i == 0 {
-			dataList, err := excel2.GetFirstEdbDataList(edbInfo, req.Num, firstDataList)
+			dataList, err := excel2.GetFirstEdbDataList(edbInfo, req.Num, firstDataList, req.Decimal[i])
 			if err != nil {
 				br.Msg = "获取失败"
 				br.ErrMsg = fmt.Sprint("获取失败,Err:", err.Error())
@@ -2021,7 +2023,7 @@ func (c *ExcelInfoController) GetBatchEdbData() {
 					dataList[i], dataList[j] = dataList[j], dataList[i]
 				}
 			}
-			dataList = excel2.PadFirstEdbDataList(dataList, req.DateList, req.SortType)
+			dataList = excel2.PadFirstEdbDataList(dataList, req.DateList, req.SortType, req.Decimal[i])
 
 			sourceNameList, sourceNameEnList, err := excel2.GetEdbSourceByEdbInfoIdList([]int{v})
 			if err != nil {
@@ -2034,6 +2036,7 @@ func (c *ExcelInfoController) GetBatchEdbData() {
 			tableList = append(tableList, &response.TableDataItem{
 				EdbInfoId:     v,
 				Data:          dataList,
+				Decimal:       req.Decimal[i],
 				ExcelSource:   excelSource,
 				ExcelSourceEn: excelSourceEn,
 			})
@@ -2045,7 +2048,7 @@ func (c *ExcelInfoController) GetBatchEdbData() {
 				firstDataList = tmpDataList
 			}
 		} else {
-			dataList, err := excel2.GetOtherEdbDataList(edbInfo, firstDataList)
+			dataList, err := excel2.GetOtherEdbDataList(edbInfo, firstDataList, req.Decimal[i])
 			if err != nil {
 				br.Msg = "获取失败"
 				br.ErrMsg = fmt.Sprint("获取失败,Err:", err.Error())
@@ -2069,6 +2072,7 @@ func (c *ExcelInfoController) GetBatchEdbData() {
 			excelSourceEn := strings.Join(sourceNameEnList, ",")
 			tableList = append(tableList, &response.TableDataItem{
 				EdbInfoId:     v,
+				Decimal:       req.Decimal[i],
 				Data:          dataList,
 				ExcelSource:   excelSource,
 				ExcelSourceEn: excelSourceEn,
@@ -2225,7 +2229,7 @@ func (c *ExcelInfoController) GetFutureDateData() {
 		for i := lenDate - 1; i >= 0; i-- {
 			dateStrList = append(dateStrList, dateList[i].Format(utils.FormatDate))
 		}
-		for _, v := range req.EdbInfoIdList {
+		for j, v := range req.EdbInfoIdList {
 			tmpEdbInfo, ok := edbInfoMap[v]
 			if !ok {
 				br.Msg = "获取指标信息失败"
@@ -2233,7 +2237,7 @@ func (c *ExcelInfoController) GetFutureDateData() {
 				return
 			}
 
-			dataList, err := excel2.GetOtherEdbDataList(tmpEdbInfo, dateStrList)
+			dataList, err := excel2.GetOtherEdbDataList(tmpEdbInfo, dateStrList, req.Decimal[j])
 			if err != nil {
 				br.Msg = "获取失败"
 				br.ErrMsg = fmt.Sprint("获取失败,Err:", err.Error())
@@ -2241,6 +2245,7 @@ func (c *ExcelInfoController) GetFutureDateData() {
 			}
 			result = append(result, response.TableDataItem{
 				EdbInfoId: v,
+				Decimal:   req.Decimal[j],
 				Data:      dataList,
 			})
 		}
@@ -2316,7 +2321,7 @@ func (c *ExcelInfoController) GetHistoryDateData() {
 			br.ErrMsg = "获取指标信息失败,err:" + err.Error()
 			return
 		}
-		firstDataList, err := excel2.GetFirstHistoryEdbDataList(tmpEdbInfo, req.Num, req.EndDate)
+		firstDataList, err := excel2.GetFirstHistoryEdbDataList(tmpEdbInfo, req.Num, req.EndDate, req.Decimal[0])
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = fmt.Sprint("获取失败,Err:", err.Error())
@@ -2325,6 +2330,7 @@ func (c *ExcelInfoController) GetHistoryDateData() {
 
 		result = append(result, response.TableDataItem{
 			EdbInfoId: req.EdbInfoIdList[0],
+			Decimal:   req.Decimal[0],
 			Data:      firstDataList,
 		})
 
@@ -2345,7 +2351,7 @@ func (c *ExcelInfoController) GetHistoryDateData() {
 				return
 			}
 
-			dataList, err := excel2.GetOtherEdbDataList(tmpEdbInfo, dateStrList)
+			dataList, err := excel2.GetOtherEdbDataList(tmpEdbInfo, dateStrList, req.Decimal[k])
 			if err != nil {
 				br.Msg = "获取失败"
 				br.ErrMsg = fmt.Sprint("获取失败,Err:", err.Error())
@@ -2353,6 +2359,7 @@ func (c *ExcelInfoController) GetHistoryDateData() {
 			}
 			result = append(result, response.TableDataItem{
 				EdbInfoId: v,
+				Decimal:   req.Decimal[k],
 				Data:      dataList,
 			})
 		}

+ 8 - 3
models/data_manage/excel/request/excel_info.go

@@ -61,14 +61,16 @@ type CalculateReq struct {
 
 // GetOtherEdbDateDataReq 获取其他指标的指定日期的数据
 type GetOtherEdbDateDataReq struct {
-	EdbInfoId int      `description:"指标id"`
-	SortType  string   `description:"如何排序,是正序还是倒序,枚举值:asc 正序,desc 倒序,不传默认倒序"`
-	DateList  []string `description:"日期列表,从小到大"`
+	EdbInfoId   int            `description:"指标id"`
+	SortType    string         `description:"如何排序,是正序还是倒序,枚举值:asc 正序,desc 倒序,不传默认倒序"`
+	DateList    []string       `description:"日期列表,从小到大"`
+	DateDecimal map[string]int `description:"日期行的小数位数映射"`
 }
 
 type GetBatchEdbDateDataReq struct {
 	EdbInfoId []int    `description:"指标id"`
 	Num       int      `description:"默认期数"`
+	Decimal   []int    `description:"指标上的小数位数"`
 	SortType  string   `description:"如何排序,是正序还是倒序,枚举值:asc 正序,desc 倒序,不传默认倒序"`
 	DateList  []string `description:"日期列表,从小到大"`
 }
@@ -78,6 +80,7 @@ type GetFutureDateDataReq struct {
 	EdbInfoIdList []int  `description:"指标id列表,从左至右,从上到下的顺序"`
 	DateType      int    `description:"日期类型,1:期数,2:截止日期"`
 	Num           int    `description:"需要添加的期数"`
+	Decimal       []int  `description:"小数位数, 从左至右,从上到下的顺序"`
 	StartDate     string `description:"开始日期"`
 	EndDate       string `description:"结束日期"`
 }
@@ -86,6 +89,7 @@ type GetFutureDateDataReq struct {
 type GetHistoryDateDataReq struct {
 	EdbInfoIdList []int  `description:"指标id列表,从左至右,从上到下的顺序"`
 	Num           int    `description:"需要添加的期数"`
+	Decimal       []int  `description:"小数位数, 从左至右,从上到下的顺序"`
 	EndDate       string `description:"结束日期"`
 }
 
@@ -128,6 +132,7 @@ type ManualDataReq struct {
 	DataTimeType        int               `description:"日期类型,1:实际日期;2:未来日期"`
 	ShowValue           string            `description:"展示值"`
 	Value               string            `description:"实际值(计算公式)"`
+	Decimal             int               `description:"小数位数"`
 	RelationEdbInfoList []RelationEdbInfo `description:"关联指标(计算公式中关联的指标,用于计算的时候去匹配)"`
 }
 

+ 1 - 0
models/data_manage/excel/response/excel_info.go

@@ -50,6 +50,7 @@ type TableCellResp struct {
 type TableDataItem struct {
 	EdbInfoId     int                     `description:"指标id"`
 	Data          []request.ManualDataReq `description:"数据列表"`
+	Decimal       int                     `description:"小数位数"`
 	ExcelSource   string                  `description:"表格来源str"`
 	ExcelSourceEn string                  `description:"表格来源(英文)"`
 }

+ 124 - 4
services/data/excel/excel_info.go

@@ -216,7 +216,7 @@ func GetExcelInfoOpButton(sysUser *system.Admin, belongUserId, source int, haveO
 }
 
 // GetFirstEdbDataList 获取第一列的数据
-func GetFirstEdbDataList(edbInfo *data_manage.EdbInfo, num int, manualDateList []string) (resultDataList []request.ManualDataReq, err error) {
+func GetFirstEdbDataList(edbInfo *data_manage.EdbInfo, num int, manualDateList []string, decimal int) (resultDataList []request.ManualDataReq, err error) {
 	var dataList []*data_manage.EdbDataList
 	switch edbInfo.EdbInfoType {
 	case 0:
@@ -289,6 +289,7 @@ func GetFirstEdbDataList(edbInfo *data_manage.EdbInfo, num int, manualDateList [
 			DataTime:     dataList[lenData-i].DataTime,
 			ShowValue:    fmt.Sprint(dataList[lenData-i].Value),
 			Value:        fmt.Sprint(dataList[lenData-i].Value),
+			Decimal:      decimal,
 			DataTimeType: 1,
 		})
 	}
@@ -297,7 +298,7 @@ func GetFirstEdbDataList(edbInfo *data_manage.EdbInfo, num int, manualDateList [
 }
 
 // PadFirstEdbDataList 补齐第一列的数据
-func PadFirstEdbDataList(resultDataList []request.ManualDataReq, dateList []string, sortType string) []request.ManualDataReq {
+func PadFirstEdbDataList(resultDataList []request.ManualDataReq, dateList []string, sortType string, decimal int) []request.ManualDataReq {
 	originDataNum := len(resultDataList)
 	requsetDateNum := len(dateList)
 	if originDataNum >= requsetDateNum {
@@ -309,6 +310,7 @@ func PadFirstEdbDataList(resultDataList []request.ManualDataReq, dateList []stri
 			resultDataList = append(resultDataList, request.ManualDataReq{
 				DataType:     0,
 				DataTime:     dateList[originDataNum+i],
+				Decimal:      decimal,
 				ShowValue:    ``,
 				Value:        ``,
 				DataTimeType: 1,
@@ -320,6 +322,7 @@ func PadFirstEdbDataList(resultDataList []request.ManualDataReq, dateList []stri
 			tmpDateList = append(tmpDateList, request.ManualDataReq{
 				DataType:     0,
 				DataTime:     dateList[originDataNum+i],
+				Decimal:      decimal,
 				ShowValue:    ``,
 				Value:        ``,
 				DataTimeType: 1,
@@ -331,8 +334,123 @@ func PadFirstEdbDataList(resultDataList []request.ManualDataReq, dateList []stri
 	return resultDataList
 }
 
+// GetOtherEdbDataListFollowDate 获取其他列的数据,并设置日期的小数位数
+func GetOtherEdbDataListFollowDate(edbInfo *data_manage.EdbInfo, dateList []string, dateDecimal map[string]int) (resultDataList []request.ManualDataReq, err error) {
+	lenDate := len(dateList)
+	if lenDate <= 0 {
+		return
+	}
+	sortDateList := dateList
+	baseDateList := utils.StrArr{}
+	baseDateList = append(baseDateList, sortDateList...)
+	sort.Sort(baseDateList)
+	sortDateList = append([]string{}, baseDateList...)
+
+	endDateTime, err := time.ParseInLocation(utils.FormatDate, sortDateList[0], time.Local)
+	if err != nil {
+		return
+	}
+
+	firstDateTime, err := time.ParseInLocation(utils.FormatDate, sortDateList[lenDate-1], time.Local)
+	if err != nil {
+		return
+	}
+
+	var dataList []*data_manage.EdbDataList
+	switch edbInfo.EdbInfoType {
+	case 0:
+		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, ``, ``)
+	case 1:
+		_, dataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, ``, false)
+	default:
+		err = errors.New(fmt.Sprint("获取失败,指标类型异常", edbInfo.EdbInfoType))
+	}
+	if err != nil {
+		return
+	}
+
+	// 获取日期内的数据(包含开始日期前一个日期,以及 结束日期后一个日期,目的为了做空日期时的 插值法兼容)
+	baseDataList := make([]*data_manage.EdbDataList, 0)
+	var lastData *data_manage.EdbDataList
+	var isInsert bool
+	for _, data := range dataList {
+		tmpDate := data.DataTime
+		tmpDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, tmpDate, time.Local)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		if tmpDateTime.Before(firstDateTime) {
+			lastData = data
+			continue
+		}
+
+		// 如果是第一次写入数据
+		if !isInsert && lastData != nil {
+			baseDataList = append(baseDataList, lastData)
+		}
+
+		if tmpDateTime.After(endDateTime) {
+			baseDataList = append(baseDataList, data)
+			break
+		}
+		baseDataList = append(baseDataList, data)
+		isInsert = true
+	}
+
+	// 实际数据的日期map
+	realValMap := make(map[string]string)
+	for _, v := range baseDataList {
+		realValMap[v.DataTime] = v.DataTime
+	}
+
+	// 插值法处理
+	handleDataMap := make(map[string]float64)
+	err = data.HandleDataByLinearRegression(baseDataList, handleDataMap)
+	if err != nil {
+		return
+	}
+
+	latestDateTime, _ := time.ParseInLocation(utils.FormatDate, edbInfo.LatestDate, time.Local)
+
+	// 对于不存在的数据做补充
+	for _, date := range sortDateList {
+		dataType := 1
+		if _, ok := realValMap[date]; !ok {
+			dataType = 2
+		} else {
+			dataTime, _ := time.ParseInLocation(utils.FormatDate, date, time.Local)
+			// 如果是预测指标,且当前值的日期,晚于实际日期,那么是预测值
+			if edbInfo.EdbInfoType == 1 && dataTime.After(latestDateTime) {
+				dataType = 5
+			}
+		}
+		var value, showValue string
+		if tmpVal, ok := handleDataMap[date]; ok {
+			value = fmt.Sprint(tmpVal)
+			showValue = value
+		} else {
+			dataType = 3
+		}
+		tmpData := request.ManualDataReq{
+			DataType:  dataType,
+			DataTime:  date,
+			ShowValue: showValue,
+			Value:     value,
+		}
+		if v, ok := dateDecimal[date]; ok {
+			tmpData.Decimal = v
+		} else {
+			tmpData.Decimal = -1
+		}
+		resultDataList = append(resultDataList, tmpData)
+	}
+
+	return
+}
+
 // GetOtherEdbDataList 获取其他列的数据
-func GetOtherEdbDataList(edbInfo *data_manage.EdbInfo, dateList []string) (resultDataList []request.ManualDataReq, err error) {
+func GetOtherEdbDataList(edbInfo *data_manage.EdbInfo, dateList []string, decimal int) (resultDataList []request.ManualDataReq, err error) {
 	lenDate := len(dateList)
 	if lenDate <= 0 {
 		return
@@ -432,6 +550,7 @@ func GetOtherEdbDataList(edbInfo *data_manage.EdbInfo, dateList []string) (resul
 		resultDataList = append(resultDataList, request.ManualDataReq{
 			DataType:  dataType,
 			DataTime:  date,
+			Decimal:   decimal,
 			ShowValue: showValue,
 			Value:     value,
 		})
@@ -441,7 +560,7 @@ func GetOtherEdbDataList(edbInfo *data_manage.EdbInfo, dateList []string) (resul
 }
 
 // GetFirstHistoryEdbDataList 获取指标的历史的数据
-func GetFirstHistoryEdbDataList(edbInfo *data_manage.EdbInfo, num int, endDate string) (resultDataList []request.ManualDataReq, err error) {
+func GetFirstHistoryEdbDataList(edbInfo *data_manage.EdbInfo, num int, endDate string, decimal int) (resultDataList []request.ManualDataReq, err error) {
 	endDateTime, err := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
 	if err != nil {
 		return
@@ -490,6 +609,7 @@ func GetFirstHistoryEdbDataList(edbInfo *data_manage.EdbInfo, num int, endDate s
 		resultDataList = append(resultDataList, request.ManualDataReq{
 			DataType:  dataType,
 			DataTime:  dataList[lenData-i].DataTime,
+			Decimal:   decimal,
 			ShowValue: fmt.Sprint(dataList[lenData-i].Value),
 			Value:     fmt.Sprint(dataList[lenData-i].Value),
 		})

+ 5 - 4
services/data/excel/time_table.go

@@ -7,12 +7,13 @@ import (
 	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
 	"fmt"
-	"github.com/shopspring/decimal"
-	"github.com/yidane/formula"
 	"sort"
 	"strconv"
 	"strings"
 	"time"
+
+	"github.com/shopspring/decimal"
+	"github.com/yidane/formula"
 )
 
 // TableDataConfig
@@ -101,7 +102,7 @@ func GetDataByTableDataConfig(tableDataConfig TableDataConfig) (resultResp reque
 		err = errors.New("找不到A列指标")
 		return
 	}
-	baseFirstEdbInfoDataList, err := GetFirstEdbDataList(firstEdbInfo, tableDataConfig.Num, manualDateList)
+	baseFirstEdbInfoDataList, err := GetFirstEdbDataList(firstEdbInfo, tableDataConfig.Num, manualDateList, -1)
 	if err != nil {
 		return
 	}
@@ -166,7 +167,7 @@ func GetDataByTableDataConfig(tableDataConfig TableDataConfig) (resultResp reque
 			err = errors.New("找不到A列指标")
 			return
 		}
-		otherDataList, tmpErr := GetOtherEdbDataList(tmpEdbInfo, dateList)
+		otherDataList, tmpErr := GetOtherEdbDataList(tmpEdbInfo, dateList, -1)
 		if tmpErr != nil {
 			err = tmpErr
 			return