|
@@ -11,12 +11,15 @@ import (
|
|
|
"eta/eta_api/services"
|
|
|
"eta/eta_api/services/alarm_msg"
|
|
|
"eta/eta_api/services/data"
|
|
|
+ "eta/eta_api/services/data/area_graph"
|
|
|
"eta/eta_api/services/data/data_manage_permission"
|
|
|
"eta/eta_api/services/data/excel"
|
|
|
"eta/eta_api/services/eta_forum"
|
|
|
etaTrialService "eta/eta_api/services/eta_trial"
|
|
|
"eta/eta_api/utils"
|
|
|
"fmt"
|
|
|
+ "github.com/shopspring/decimal"
|
|
|
+ "math"
|
|
|
"os"
|
|
|
"os/exec"
|
|
|
"sort"
|
|
@@ -1514,13 +1517,10 @@ func fillAreaGraphData(extraConfigStr string, edbDataList []*data_manage.ChartEd
|
|
|
}
|
|
|
if tmpConfig.IsHeap == 1 {
|
|
|
standardIndexMap := make(map[string]*data_manage.EdbDataList)
|
|
|
- var standardIndexStartDate, standardIndexEndDate string
|
|
|
for _, v := range edbDataList {
|
|
|
|
|
|
if v.EdbInfoId == tmpConfig.StandardEdbInfoId {
|
|
|
if dataList, ok := v.DataList.([]*data_manage.EdbDataList); ok {
|
|
|
- standardIndexStartDate = dataList[0].DataTime
|
|
|
- standardIndexEndDate = dataList[len(dataList)-1].DataTime
|
|
|
for _, dataObject := range dataList {
|
|
|
standardIndexMap[dataObject.DataTime] = dataObject
|
|
|
}
|
|
@@ -1528,41 +1528,328 @@ func fillAreaGraphData(extraConfigStr string, edbDataList []*data_manage.ChartEd
|
|
|
break
|
|
|
}
|
|
|
}
|
|
|
- switch tmpConfig.NullDealWay {
|
|
|
+ strategy, err := area_graph.CreateStrategy(tmpConfig.NullDealWay)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err, "创建空值处理器失败"
|
|
|
+ }
|
|
|
+ err = strategy.Deal(tmpConfig, edbDataList, standardIndexMap)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err, err.Error()
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
case 1:
|
|
|
|
|
|
-
|
|
|
-
|
|
|
+ err := interpolate(tmpConfig, edbDataList, standardIndexMap)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err, "插值填充失败"
|
|
|
+ }
|
|
|
case 2:
|
|
|
|
|
|
-
|
|
|
-
|
|
|
- for _, v := range edbDataList {
|
|
|
- if v.EdbInfoId != tmpConfig.StandardEdbInfoId {
|
|
|
- if dataList, ok := v.DataList.([]*data_manage.EdbDataList); ok {
|
|
|
- for i := 0; i < len(dataList); i++ {
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
+ fillWithPrevious(tmpConfig, edbDataList, standardIndexMap)
|
|
|
case 3:
|
|
|
|
|
|
- fillWithNext()
|
|
|
+ fillWithNext(tmpConfig, edbDataList, standardIndexMap)
|
|
|
case 4:
|
|
|
|
|
|
- setToZero()
|
|
|
+ setToZero(tmpConfig, edbDataList, standardIndexMap)
|
|
|
case 5:
|
|
|
|
|
|
- deleteDate()
|
|
|
+ deleteDate(edbDataList)
|
|
|
default:
|
|
|
fmt.Println("Unknown NullDealWay:", tmpConfig.NullDealWay)
|
|
|
+ }*/
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil, nil, ""
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+func interpolate(tmpConfig data_manage.AreaExtraConf, edbDataList []*data_manage.ChartEdbInfoMapping, standardIndexMap map[string]*data_manage.EdbDataList) (err error) {
|
|
|
+ for _, v := range edbDataList {
|
|
|
+ if v.EdbInfoId != tmpConfig.StandardEdbInfoId {
|
|
|
+ if dataList, ok := v.DataList.([]*data_manage.EdbDataList); ok {
|
|
|
+
|
|
|
+ var startEdbInfoData *data_manage.EdbDataList
|
|
|
+ for index := 0; index < len(dataList)-1; index++ {
|
|
|
+
|
|
|
+ beforeIndexData := dataList[index]
|
|
|
+ afterIndexData := dataList[index+1]
|
|
|
+
|
|
|
+ if startEdbInfoData == nil {
|
|
|
+ startEdbInfoData = beforeIndexData
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ startDataTime, _ := time.ParseInLocation(utils.FormatDate, startEdbInfoData.DataTime, time.Local)
|
|
|
+ currDataTime, _ := time.ParseInLocation(utils.FormatDate, afterIndexData.DataTime, time.Local)
|
|
|
+ betweenHour := int(currDataTime.Sub(startDataTime).Hours())
|
|
|
+ betweenDay := betweenHour / 24
|
|
|
+
|
|
|
+
|
|
|
+ if betweenDay <= 1 {
|
|
|
+ startEdbInfoData = afterIndexData
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ var a, b float64
|
|
|
+ {
|
|
|
+ coordinateData := make([]utils.Coordinate, 0)
|
|
|
+ tmpCoordinate1 := utils.Coordinate{
|
|
|
+ X: 1,
|
|
|
+ Y: startEdbInfoData.Value,
|
|
|
+ }
|
|
|
+ coordinateData = append(coordinateData, tmpCoordinate1)
|
|
|
+ tmpCoordinate2 := utils.Coordinate{
|
|
|
+ X: float64(betweenDay) + 1,
|
|
|
+ Y: afterIndexData.Value,
|
|
|
+ }
|
|
|
+ coordinateData = append(coordinateData, tmpCoordinate2)
|
|
|
+
|
|
|
+ a, b = utils.GetLinearResult(coordinateData)
|
|
|
+ if math.IsNaN(a) || math.IsNaN(b) {
|
|
|
+ err = errors.New("线性方程公式生成失败")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ for i := 1; i < betweenDay; i++ {
|
|
|
+ tmpDataTime := startDataTime.AddDate(0, 0, i)
|
|
|
+ aDecimal := decimal.NewFromFloat(a)
|
|
|
+ xDecimal := decimal.NewFromInt(int64(i) + 1)
|
|
|
+ bDecimal := decimal.NewFromFloat(b)
|
|
|
+
|
|
|
+ val, _ := aDecimal.Mul(xDecimal).Add(bDecimal).Round(4).Float64()
|
|
|
+ nextDay := tmpDataTime.Format(utils.FormatDate)
|
|
|
+
|
|
|
+ replenishIndexData := data_manage.EdbDataList{
|
|
|
+ EdbDataId: afterIndexData.EdbDataId,
|
|
|
+ DataTime: nextDay,
|
|
|
+ DataTimestamp: tmpDataTime.UnixMilli(),
|
|
|
+ Value: val,
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ dataList = append(dataList[:index+1], append([]*data_manage.EdbDataList{&replenishIndexData}, dataList[index+1:]...)...)
|
|
|
+ }
|
|
|
+ startEdbInfoData = afterIndexData
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ var resultDataList []*data_manage.EdbDataList
|
|
|
+ for _, dataObject := range dataList {
|
|
|
+ if _, ok := standardIndexMap[dataObject.DataTime]; ok {
|
|
|
+
|
|
|
+ resultDataList = append(resultDataList, dataObject)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ sort.Slice(resultDataList, func(i, j int) bool {
|
|
|
+ return resultDataList[i].DataTimestamp < resultDataList[j].DataTimestamp
|
|
|
+ })
|
|
|
+
|
|
|
+ v.DataList = resultDataList
|
|
|
+ }
|
|
|
}
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|
|
|
|
|
|
+
|
|
|
+func deleteDate(edbDataList []*data_manage.ChartEdbInfoMapping) {
|
|
|
+
|
|
|
+ for _, v := range edbDataList {
|
|
|
+ if dataList, ok := v.DataList.([]*data_manage.EdbDataList); ok {
|
|
|
+
|
|
|
+ timeMap := make(map[string]int)
|
|
|
+
|
|
|
+
|
|
|
+ for _, dataObject := range dataList {
|
|
|
+ timeMap[dataObject.DataTime]++
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ var resultDataList []*data_manage.EdbDataList
|
|
|
+ for _, dataObject := range dataList {
|
|
|
+ if timeMap[dataObject.DataTime] == len(edbDataList) {
|
|
|
+
|
|
|
+ resultDataList = append(resultDataList, dataObject)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ v.DataList = resultDataList
|
|
|
+ }
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
- return nil, nil, ""
|
|
|
+
|
|
|
+func setToZero(tmpConfig data_manage.AreaExtraConf, edbDataList []*data_manage.ChartEdbInfoMapping, standardIndexMap map[string]*data_manage.EdbDataList) {
|
|
|
+
|
|
|
+ for _, v := range edbDataList {
|
|
|
+ if v.EdbInfoId != tmpConfig.StandardEdbInfoId {
|
|
|
+ if dataList, ok := v.DataList.([]*data_manage.EdbDataList); ok {
|
|
|
+ for index := 0; index < len(dataList)-1; index++ {
|
|
|
+
|
|
|
+ beforeIndexData := dataList[index]
|
|
|
+ afterIndexData := dataList[index+1]
|
|
|
+
|
|
|
+ for utils.IsMoreThanOneDay(beforeIndexData.DataTime, afterIndexData.DataTime) {
|
|
|
+
|
|
|
+ nextDay := utils.GetNextDay(beforeIndexData.DataTime)
|
|
|
+ toTime := utils.StringToTime(nextDay)
|
|
|
+ replenishIndexData := data_manage.EdbDataList{
|
|
|
+ EdbInfoId: v.EdbInfoId,
|
|
|
+ DataTime: nextDay,
|
|
|
+ DataTimestamp: toTime.UnixMilli(),
|
|
|
+ Value: 0,
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ dataList = append(dataList[:index+1], append([]*data_manage.EdbDataList{&replenishIndexData}, dataList[index+1:]...)...)
|
|
|
+
|
|
|
+
|
|
|
+ beforeIndexData = &replenishIndexData
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ var resultDataList []*data_manage.EdbDataList
|
|
|
+ for _, dataObject := range dataList {
|
|
|
+ _, ok = standardIndexMap[dataObject.DataTime]
|
|
|
+ if ok {
|
|
|
+
|
|
|
+ resultDataList = append(resultDataList, dataObject)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ sort.Slice(resultDataList, func(i, j int) bool {
|
|
|
+ return resultDataList[i].DataTimestamp < resultDataList[j].DataTimestamp
|
|
|
+ })
|
|
|
+
|
|
|
+ v.DataList = resultDataList
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+func fillWithNext(tmpConfig data_manage.AreaExtraConf, edbDataList []*data_manage.ChartEdbInfoMapping, standardIndexMap map[string]*data_manage.EdbDataList) {
|
|
|
+
|
|
|
+ for _, v := range edbDataList {
|
|
|
+ if v.EdbInfoId != tmpConfig.StandardEdbInfoId {
|
|
|
+ if dataList, ok := v.DataList.([]*data_manage.EdbDataList); ok {
|
|
|
+
|
|
|
+ reverseSlice(dataList)
|
|
|
+
|
|
|
+ for index := 0; index < len(dataList)-1; index++ {
|
|
|
+
|
|
|
+ beforeIndexData := dataList[index]
|
|
|
+ afterIndexData := dataList[index+1]
|
|
|
+
|
|
|
+ for utils.IsMoreThanOneDay(beforeIndexData.DataTime, afterIndexData.DataTime) {
|
|
|
+
|
|
|
+ nextDay := utils.GetNextDay(beforeIndexData.DataTime)
|
|
|
+ toTime := utils.StringToTime(nextDay)
|
|
|
+ replenishIndexData := data_manage.EdbDataList{
|
|
|
+ EdbInfoId: v.EdbInfoId,
|
|
|
+ DataTime: nextDay,
|
|
|
+ DataTimestamp: toTime.UnixMilli(),
|
|
|
+ Value: beforeIndexData.Value,
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ dataList = append(dataList[:index+1], append([]*data_manage.EdbDataList{&replenishIndexData}, dataList[index+1:]...)...)
|
|
|
+
|
|
|
+
|
|
|
+ beforeIndexData = &replenishIndexData
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ var resultDataList []*data_manage.EdbDataList
|
|
|
+ for _, dataObject := range dataList {
|
|
|
+ _, ok = standardIndexMap[dataObject.DataTime]
|
|
|
+ if ok {
|
|
|
+
|
|
|
+ resultDataList = append(resultDataList, dataObject)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ sort.Slice(resultDataList, func(i, j int) bool {
|
|
|
+ return resultDataList[i].DataTimestamp < resultDataList[j].DataTimestamp
|
|
|
+ })
|
|
|
+
|
|
|
+ v.DataList = resultDataList
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+func reverseSlice(dataList []*data_manage.EdbDataList) {
|
|
|
+
|
|
|
+ for i, j := 0, len(dataList)-1; i < j; i, j = i+1, j-1 {
|
|
|
+
|
|
|
+ dataList[i], dataList[j] = dataList[j], dataList[i]
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+func fillWithPrevious(tmpConfig data_manage.AreaExtraConf, edbDataList []*data_manage.ChartEdbInfoMapping, standardIndexMap map[string]*data_manage.EdbDataList) {
|
|
|
+
|
|
|
+ for _, v := range edbDataList {
|
|
|
+ if v.EdbInfoId != tmpConfig.StandardEdbInfoId {
|
|
|
+ if dataList, ok := v.DataList.([]*data_manage.EdbDataList); ok {
|
|
|
+ for index := 0; index < len(dataList)-1; index++ {
|
|
|
+
|
|
|
+ beforeIndexData := dataList[index]
|
|
|
+ afterIndexData := dataList[index+1]
|
|
|
+
|
|
|
+ for utils.IsMoreThanOneDay(beforeIndexData.DataTime, afterIndexData.DataTime) {
|
|
|
+
|
|
|
+ nextDay := utils.GetNextDay(beforeIndexData.DataTime)
|
|
|
+ toTime := utils.StringToTime(nextDay)
|
|
|
+ replenishIndexData := data_manage.EdbDataList{
|
|
|
+ EdbInfoId: v.EdbInfoId,
|
|
|
+ DataTime: nextDay,
|
|
|
+ DataTimestamp: toTime.UnixMilli(),
|
|
|
+ Value: beforeIndexData.Value,
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ dataList = append(dataList[:index+1], append([]*data_manage.EdbDataList{&replenishIndexData}, dataList[index+1:]...)...)
|
|
|
+
|
|
|
+
|
|
|
+ beforeIndexData = &replenishIndexData
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ var resultDataList []*data_manage.EdbDataList
|
|
|
+ for _, dataObject := range dataList {
|
|
|
+ _, ok = standardIndexMap[dataObject.DataTime]
|
|
|
+ if ok {
|
|
|
+
|
|
|
+ resultDataList = append(resultDataList, dataObject)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ sort.Slice(resultDataList, func(i, j int) bool {
|
|
|
+ return resultDataList[i].DataTimestamp < resultDataList[j].DataTimestamp
|
|
|
+ })
|
|
|
+
|
|
|
+ v.DataList = resultDataList
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|