Roc 1 year ago
parent
commit
ab5b94de42

+ 19 - 8
controllers/data_manage/excel/mixed_table.go

@@ -150,15 +150,27 @@ func (c *ExcelInfoController) CalculateData() {
 	}
 
 	// 数据处理成需要返回的样式
-	num := 5
+	//num := 5
 	lenDate := len(respItem.Data.DateList)
-	if lenDate < 5 {
-		num = lenDate
-	}
+	//if lenDate < 5 {
+	//	num = lenDate
+	//}
 
 	dataListResp := make([]data_manage.DataList, 0)
-	for i := 1; i <= num; i++ {
-		date := respItem.Data.DateList[lenDate-i]
+	//for i := 1; i <= num; i++ {
+	//	date := respItem.Data.DateList[lenDate-i]
+	//	val, ok := respItem.Data.DataMap[date]
+	//	if !ok {
+	//		continue
+	//	}
+	//
+	//	dataListResp = append(dataListResp, data_manage.DataList{
+	//		Value:    fmt.Sprint(val),
+	//		DataTime: date,
+	//	})
+	//}
+	for i := lenDate - 1; i >= 0; i-- {
+		date := respItem.Data.DateList[i]
 		val, ok := respItem.Data.DataMap[date]
 		if !ok {
 			continue
@@ -169,9 +181,8 @@ func (c *ExcelInfoController) CalculateData() {
 			DataTime: date,
 		})
 	}
-
 	br.Ret = 200
 	br.Success = true
-	br.Msg = "获取系统日期成功"
+	br.Msg = "计算成功"
 	br.Data = dataListResp
 }

+ 1 - 3
go.mod

@@ -11,7 +11,7 @@ require (
 	github.com/alibabacloud-go/tea v1.1.20
 	github.com/alibabacloud-go/tea-utils/v2 v2.0.1
 	github.com/aliyun/alibaba-cloud-sdk-go v1.61.1656
-	github.com/aliyun/aliyun-oss-go-sdk v2.2.0+incompatible
+	github.com/aliyun/aliyun-oss-go-sdk v3.0.1+incompatible
 	github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de
 	github.com/beego/bee/v2 v2.0.4
 	github.com/beego/beego/v2 v2.0.7
@@ -54,7 +54,6 @@ require (
 	github.com/aliyun/credentials-go v1.1.2 // 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/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
@@ -97,7 +96,6 @@ require (
 	github.com/richardlehane/mscfb v1.0.4 // indirect
 	github.com/richardlehane/msoleps v1.0.3 // indirect
 	github.com/rs/xid v1.5.0 // indirect
-	github.com/satori/go.uuid v1.2.0 // indirect
 	github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
 	github.com/spf13/cast v1.5.0 // indirect
 	github.com/stretchr/testify v1.8.1 // indirect

+ 2 - 6
go.sum

@@ -61,8 +61,8 @@ github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGn
 github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk=
 github.com/aliyun/alibaba-cloud-sdk-go v1.61.1656 h1:YTWW7mBjwviuRvqiEpqaAj0AyVPj9AoJmQGCb5lXYUc=
 github.com/aliyun/alibaba-cloud-sdk-go v1.61.1656/go.mod h1:RcDobYh8k5VP6TNybz9m++gL3ijVI5wueVr0EM10VsU=
-github.com/aliyun/aliyun-oss-go-sdk v2.2.0+incompatible h1:ht2+VfbXtNLGhCsnTMc6/N26nSTBK6qdhktjYyjJQkk=
-github.com/aliyun/aliyun-oss-go-sdk v2.2.0+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
+github.com/aliyun/aliyun-oss-go-sdk v3.0.1+incompatible h1:so4m5rRA32Tc5GgKg/5gKUu0CRsYmVO3ThMP6T3CwLc=
+github.com/aliyun/aliyun-oss-go-sdk v3.0.1+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/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
@@ -74,8 +74,6 @@ github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhP
 github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw=
 github.com/astaxie/beego v1.12.3/go.mod h1:p3qIm0Ryx7zeBHLljmd7omloyca1s4yu1a8kM1FkpIA=
 github.com/aws/aws-sdk-go v1.42.23/go.mod h1:gyRszuZ/icHmHAVE4gc/r+cfCmhA1AD+vqfWbgI+eHs=
-github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA=
-github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
 github.com/beego/bee/v2 v2.0.4 h1:nEjPwxJ8D+cr54eWChJGoGRH7bJ7OQwbhx8rU0OQf7E=
 github.com/beego/bee/v2 v2.0.4/go.mod h1:wq0YrEmPcdNfDNpaUgiTkaW9zso7M8n0HCCShEBOzM0=
 github.com/beego/beego/v2 v2.0.7 h1:9KNnUM40tn3pbCOFfe6SJ1oOL0oTi/oBS/C/wCEdAXA=
@@ -373,8 +371,6 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ
 github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
 github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
 github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
-github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
-github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
 github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg=
 github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
 github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 h1:DAYUYH5869yV94zvCES9F51oYtN5oGlwjxJJz7ZCnik=

+ 5 - 6
models/data_manage/excel/request/mixed_table.go

@@ -3,11 +3,11 @@ package request
 // 单元格的数据类型
 const (
 	DateDT                   = iota + 1 //日期
-	EdbDT                               // 指标类型
-	CustomTextDT                        // 自定义文本
-	InsertDataDT                        // 插值(插入指标值,表格上,自动判断日期和指标的交集位置,插入值)
-	PopInsertDataDT                     // 弹框插值(在表格上选择日期,然后空白单元格选择弹框并选择指标,插入该指标与该日期的值)
-	InsertEdbCalculateDataDT            // 插入指标计算公式生成的值
+	EdbDT                               // 2 指标类型
+	CustomTextDT                        // 3 自定义文本
+	InsertDataDT                        // 4 插值(插入指标值,表格上,自动判断日期和指标的交集位置,插入值)
+	PopInsertDataDT                     // 5 弹框插值(在表格上选择日期,然后空白单元格选择弹框并选择指标,插入该指标与该日期的值)
+	InsertEdbCalculateDataDT            // 6 插入指标计算公式生成的值
 )
 
 // 单元格的日期类型类型
@@ -79,7 +79,6 @@ type EdbDateConf struct {
 type CalculateConf struct {
 	EdbInfoId int `description:"指标id"`
 	//DataList      []*EdbInfoSearchData
-	DataTime      string      `description:"所属日期"`
 	Frequency     string      `description:"需要转换的频度"`
 	Formula       interface{} `description:"计算公式,默认是string,实际上还需要转成其他样式"`
 	Calendar      string      `description:"公历/农历"`

+ 106 - 7
services/data/excel/mixed_table.go

@@ -43,9 +43,11 @@ func GetMixedTableCellData(cellRelationConf string, config [][]request.MixedTabl
 	// 指标信息map
 	edbInfoMap := make(map[int]*data_manage.EdbInfo)
 	// 日度指标数据map
-	edbDataListMap := make(map[int]map[string]float64)
+	edbDayDataListMap := make(map[int]map[string]float64)
 	// 月度指标数据map
 	edbMonthDataListMap := make(map[int]map[string]float64)
+	// 日度指标数据map
+	edbDataListMap := make(map[int][]*data_manage.EdbDataList)
 	for _, edbInfo := range edbInfoList {
 		edbInfoMap[edbInfo.EdbInfoId] = edbInfo
 
@@ -61,19 +63,23 @@ func GetMixedTableCellData(cellRelationConf string, config [][]request.MixedTabl
 
 		dateValMap := make(map[string]float64)
 		monthValMap := make(map[string]float64)
-		for _, data := range dataList {
+		for _, tmpData := range dataList {
 			// 日度数据
-			dateValMap[data.DataTime] = data.Value
+			dateValMap[tmpData.DataTime] = tmpData.Value
 			// 月度数据(取该月份的第一个数据)
-			yearMonth := strings.Join(strings.Split(data.DataTime, "-")[0:2], "-")
+			yearMonth := strings.Join(strings.Split(tmpData.DataTime, "-")[0:2], "-")
 			if _, ok := monthValMap[yearMonth]; !ok {
-				monthValMap[yearMonth] = data.Value
+				monthValMap[yearMonth] = tmpData.Value
 			}
 		}
-		edbDataListMap[edbInfo.EdbInfoId] = dateValMap
+		edbDayDataListMap[edbInfo.EdbInfoId] = dateValMap
 		edbMonthDataListMap[edbInfo.EdbInfoId] = monthValMap
+		edbDataListMap[edbInfo.EdbInfoId] = dataList
 	}
 
+	// 单元格实际绑定的信息map
+	cellDataRelationMap := make(map[string]request.MixedTableCellDataReq, 0)
+
 	// 处理指定指标的日期
 	for k, row := range config {
 		for i, cell := range row {
@@ -86,10 +92,26 @@ func GetMixedTableCellData(cellRelationConf string, config [][]request.MixedTabl
 				}
 			}
 			row[i] = cell
+
+			cellDataRelationMap[cell.Uid] = cell
 		}
 		config[k] = row
 	}
 
+	type BaseCalculate struct {
+		DataList      []*data_manage.EdbDataList
+		Frequency     string `description:"需要转换的频度"`
+		Formula       interface{}
+		Calendar      string `description:"公历/农历"`
+		MoveType      int    `description:"移动方式:1:领先(默认),2:滞后"`
+		MoveFrequency string `description:"移动频度"`
+		FromFrequency string `description:"来源的频度"`
+		Source        int    `description:"1:累计值转月;2:累计值转季;3:同比值;4:同差值;5:N数值移动平均数计算;6:环比值;7:环差值;8:升频;9:降频;10:时间移位;11:超季节性;12:年化;13:累计值;14:累计值年初至今;15:指数修匀;16:日均值"`
+	}
+
+	// 指标计算的结果map
+	edbSourceDataMap := make(map[string]map[string]float64)
+
 	for k, row := range config {
 		for i, cell := range row {
 			switch cell.DataType {
@@ -107,7 +129,7 @@ func GetMixedTableCellData(cellRelationConf string, config [][]request.MixedTabl
 					}
 				} else {
 					// 日度数据
-					if dateValMap, ok := edbDataListMap[cell.EdbInfoId]; ok {
+					if dateValMap, ok := edbDayDataListMap[cell.EdbInfoId]; ok {
 						tmpDateValMap = dateValMap
 					}
 
@@ -116,6 +138,83 @@ func GetMixedTableCellData(cellRelationConf string, config [][]request.MixedTabl
 					//cell.ShowValue = fmt.Sprint(val)
 					cell.ShowValue = utils.FormatTableDataShowValue(val)
 				}
+			case request.InsertEdbCalculateDataDT: // 指标类型
+				// 日期
+				relationConf, ok := cellRelationConfMap[cell.Uid]
+				if !ok {
+					// 日期关系配置不存在
+					continue
+				}
+				if relationConf.RelationDate.Key == `` {
+					// 日期关系配置未绑定
+					continue
+				}
+
+				relationCell, ok := cellDataRelationMap[relationConf.RelationDate.Key]
+				if relationConf.RelationDate.Key == `` {
+					// 找不到对应日期的单元格
+					continue
+				}
+
+				var tmpDataMap map[string]float64
+
+				key := utils.MD5(cell.Value)
+				tmpDataMap, ok = edbSourceDataMap[key]
+				if !ok {
+					// 对应的配置值
+					var tmpConfig request.CalculateConf
+					err = json.Unmarshal([]byte(cell.Value), &tmpConfig)
+					if err != nil {
+						return
+					}
+
+					tmpDataList, ok := edbDataListMap[tmpConfig.EdbInfoId]
+					if !ok {
+						continue
+					}
+					edbInfo, ok := edbInfoMap[tmpConfig.EdbInfoId]
+					if !ok {
+						continue
+					}
+
+					req2 := &BaseCalculate{
+						DataList:      tmpDataList,
+						Frequency:     tmpConfig.Frequency,
+						Formula:       tmpConfig.Formula,
+						Calendar:      tmpConfig.Calendar,
+						MoveType:      tmpConfig.MoveType,
+						MoveFrequency: tmpConfig.MoveFrequency,
+						FromFrequency: edbInfo.Frequency,
+						Source:        tmpConfig.Source,
+					}
+
+					// 调用指标库去更新
+					reqJson, tmpErr := json.Marshal(req2)
+					if tmpErr != nil {
+						utils.FileLog.Error(fmt.Sprintf("计算失败1,配置信息;%s;错误原因:%s", cell.Value, tmpErr.Error()))
+						err = tmpErr
+						return
+					}
+					respItem, tmpErr := data.BaseCalculate(string(reqJson))
+					if tmpErr != nil {
+						utils.FileLog.Error(fmt.Sprintf("计算失败2,配置信息;%s;错误原因:%s", cell.Value, tmpErr.Error()))
+						err = tmpErr
+						return
+					}
+					if respItem.Ret != 200 {
+						utils.FileLog.Error(fmt.Sprintf("计算失败3,配置信息;%s;原因:%s;错误原因:%s", cell.Value, respItem.Msg, respItem.ErrMsg))
+						continue
+					}
+
+					tmpDataMap = respItem.Data.DataMap
+					// 计算结果存一份,万一存在重复的计算方式,那么省的重新计算一下
+					edbSourceDataMap[key] = tmpDataMap
+				}
+
+				val := tmpDataMap[relationCell.DataTime]
+
+				cell.ShowValue = utils.FormatTableDataShowValue(val)
+				//
 			}
 
 			row[i] = cell