|
@@ -45,6 +45,8 @@ type CoordinatePoint struct {
|
|
|
YEdbInfoId int
|
|
|
XDate string
|
|
|
YDate string
|
|
|
+ DateType int `description:"日期类型:1-最新日期;2-N天前;3-固定日期"`
|
|
|
+ DaysAgo int `description:"N天前的N值"`
|
|
|
}
|
|
|
|
|
|
|
|
@@ -140,7 +142,12 @@ func GetChartData(chartInfoId int, config request.ChartConfigReq) (edbList []*mo
|
|
|
|
|
|
dataMap := make(map[string]float64)
|
|
|
dateMap := make(map[string]string)
|
|
|
+ dateTypeMap := make(map[int]int)
|
|
|
+ daysAgoMap := make(map[int]int)
|
|
|
+
|
|
|
for dateIndex, dateConfig := range config.DateConfigList {
|
|
|
+ dateTypeMap[dateIndex] = dateConfig.DateType
|
|
|
+ daysAgoMap[dateIndex] = dateConfig.Num
|
|
|
for _, edbInfoMapping := range mappingList {
|
|
|
|
|
|
dataList, ok := edbDataListMap[edbInfoMapping.EdbInfoId]
|
|
@@ -162,19 +169,18 @@ func GetChartData(chartInfoId int, config request.ChartConfigReq) (edbList []*mo
|
|
|
err = tmpErr
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
|
|
|
endDateStr := ``
|
|
|
var endDate time.Time
|
|
|
- var currVal float64
|
|
|
|
|
|
+ var currVal float64
|
|
|
switch dateConfig.DateType {
|
|
|
case 1:
|
|
|
endDateStr = dataEndDateStr
|
|
|
endDate = dataEndDate
|
|
|
currVal = dataList[k].Value
|
|
|
- case 2:
|
|
|
- tmpEndDate := currDay.AddDate(0, 0, -dateConfig.Num)
|
|
|
+ case 2:
|
|
|
+ tmpEndDate := time.Now().AddDate(0, 0, -dateConfig.Num)
|
|
|
tmpEndDateStr := tmpEndDate.Format(utils.FormatDate)
|
|
|
|
|
|
for i := k; i >= 0; i-- {
|
|
@@ -202,6 +208,45 @@ func GetChartData(chartInfoId int, config request.ChartConfigReq) (edbList []*mo
|
|
|
currVal = dataList[i].Value
|
|
|
break
|
|
|
}
|
|
|
+ case 3:
|
|
|
+ if dateConfig.FixDate == "" {
|
|
|
+ errMsg = "固定日期不可为空"
|
|
|
+ err = fmt.Errorf("固定日期为空")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ strFixDate := dateConfig.FixDate
|
|
|
+ fixDate, e := time.ParseInLocation(utils.FormatDate, strFixDate, time.Local)
|
|
|
+ if e != nil {
|
|
|
+ errMsg = "固定日期格式有误"
|
|
|
+ err = fmt.Errorf("固定日期有误, FixDate: %s", dateConfig.FixDate)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ for i := k; i >= 0; i-- {
|
|
|
+ strThisDate := dataList[i].DataTime
|
|
|
+
|
|
|
+ if strFixDate == strThisDate {
|
|
|
+ k = i
|
|
|
+ endDateStr = strThisDate
|
|
|
+ endDate = fixDate
|
|
|
+ currVal = dataList[i].Value
|
|
|
+ break
|
|
|
+ }
|
|
|
+
|
|
|
+ thisDate, e := time.ParseInLocation(utils.FormatDate, strThisDate, time.Local)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("数据日期格式有误: %s", e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if thisDate.After(fixDate) {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ k = i
|
|
|
+ endDateStr = strThisDate
|
|
|
+ endDate = thisDate
|
|
|
+ currVal = dataList[i].Value
|
|
|
+ break
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
@@ -213,51 +258,85 @@ func GetChartData(chartInfoId int, config request.ChartConfigReq) (edbList []*mo
|
|
|
earliestDate := endDate.AddDate(0, 0, -config.CalculateValue*moveUnitDays)
|
|
|
earliestDateStr := earliestDate.Format(utils.FormatDate)
|
|
|
|
|
|
- var minVal, maxVal float64
|
|
|
- var isNotFirst bool
|
|
|
- for i := k; i >= 0; i-- {
|
|
|
- tmpData := dataList[i]
|
|
|
- if !isNotFirst {
|
|
|
- maxVal = tmpData.Value
|
|
|
- minVal = tmpData.Value
|
|
|
- isNotFirst = true
|
|
|
- continue
|
|
|
- }
|
|
|
+ var percentVal float64
|
|
|
+
|
|
|
+ if config.PercentType == utils.PercentCalculateTypeRange {
|
|
|
+ var minVal, maxVal float64
|
|
|
+ var isNotFirst bool
|
|
|
+ for i := k; i >= 0; i-- {
|
|
|
+ tmpData := dataList[i]
|
|
|
+ if !isNotFirst {
|
|
|
+ maxVal = tmpData.Value
|
|
|
+ minVal = tmpData.Value
|
|
|
+ isNotFirst = true
|
|
|
+ continue
|
|
|
+ }
|
|
|
|
|
|
- tmpDateStr := dataList[i].DataTime
|
|
|
-
|
|
|
- if earliestDateStr == tmpDateStr {
|
|
|
- break
|
|
|
- }
|
|
|
- tmpDate, tmpErr := time.ParseInLocation(utils.FormatDate, tmpDateStr, time.Local)
|
|
|
- if tmpErr != nil {
|
|
|
- err = tmpErr
|
|
|
- return
|
|
|
+ tmpDateStr := dataList[i].DataTime
|
|
|
+
|
|
|
+ if earliestDateStr == tmpDateStr {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ tmpDate, tmpErr := time.ParseInLocation(utils.FormatDate, tmpDateStr, time.Local)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if tmpDate.Before(earliestDate) {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ if tmpData.Value > maxVal {
|
|
|
+ maxVal = tmpData.Value
|
|
|
+ }
|
|
|
+ if tmpData.Value < minVal {
|
|
|
+ minVal = tmpData.Value
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
- if tmpDate.Before(earliestDate) {
|
|
|
+
|
|
|
+
|
|
|
+ if maxVal == minVal {
|
|
|
continue
|
|
|
}
|
|
|
+
|
|
|
+ tmpV := (currVal - minVal) / (maxVal - minVal) * 100
|
|
|
+ percentVal, _ = decimal.NewFromFloat(tmpV).Round(4).Float64()
|
|
|
+ }
|
|
|
|
|
|
- if tmpData.Value > maxVal {
|
|
|
- maxVal = tmpData.Value
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if config.PercentType == utils.PercentCalculateTypeNum {
|
|
|
+
|
|
|
+ var tinyN, bigN int
|
|
|
+ lastVal := decimal.NewFromFloat(currVal)
|
|
|
+ for i := k; i >= 0; i-- {
|
|
|
+ date, e := time.ParseInLocation(utils.FormatDate, dataList[i].DataTime, time.Local)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("数据日期格式有误: %s", e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if !date.Before(earliestDate) && !date.After(endDate) {
|
|
|
+ bigN += 1
|
|
|
+ }
|
|
|
+ dateVal := decimal.NewFromFloat(dataList[i].Value)
|
|
|
+ if dateVal.LessThanOrEqual(lastVal) {
|
|
|
+ tinyN += 1
|
|
|
+ }
|
|
|
}
|
|
|
- if tmpData.Value < minVal {
|
|
|
- minVal = tmpData.Value
|
|
|
+
|
|
|
+ if bigN == 1 {
|
|
|
+ continue
|
|
|
}
|
|
|
+ numerator := decimal.NewFromInt(int64(tinyN - 1))
|
|
|
+ denominator := decimal.NewFromInt(int64(bigN - 1))
|
|
|
+ percentVal, _ = numerator.Div(denominator).Round(4).Float64()
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- if maxVal == minVal {
|
|
|
- continue
|
|
|
- }
|
|
|
-
|
|
|
- tmpV := (currVal - minVal) / (maxVal - minVal) * 100
|
|
|
- tmpV, _ = decimal.NewFromFloat(tmpV).Round(4).Float64()
|
|
|
-
|
|
|
|
|
|
key := fmt.Sprint(dateIndex, "_", edbInfoMapping.EdbInfoId)
|
|
|
- dataMap[key] = tmpV
|
|
|
+ dataMap[key] = percentVal
|
|
|
dateMap[key] = endDateStr
|
|
|
}
|
|
|
}
|
|
@@ -283,7 +362,7 @@ func GetChartData(chartInfoId int, config request.ChartConfigReq) (edbList []*mo
|
|
|
|
|
|
coordinatePointList := make([]CoordinatePoint, 0)
|
|
|
|
|
|
- for dateIndex := range config.DateConfigList {
|
|
|
+ for dateIndex, _ := range config.DateConfigList {
|
|
|
key1 := fmt.Sprint(dateIndex, "_", xEdbInfoId)
|
|
|
xVal, ok1 := dataMap[key1]
|
|
|
if !ok1 {
|
|
@@ -321,6 +400,8 @@ func GetChartData(chartInfoId int, config request.ChartConfigReq) (edbList []*mo
|
|
|
YEdbInfoId: yEdbInfoId,
|
|
|
XDate: dateMap[key1],
|
|
|
YDate: dateMap[key2],
|
|
|
+ DateType: dateTypeMap[dateIndex],
|
|
|
+ DaysAgo: daysAgoMap[dateIndex],
|
|
|
})
|
|
|
}
|
|
|
|
|
@@ -356,7 +437,7 @@ func GetChartData(chartInfoId int, config request.ChartConfigReq) (edbList []*mo
|
|
|
}
|
|
|
|
|
|
|
|
|
- for k := range edbList {
|
|
|
+ for k, _ := range edbList {
|
|
|
edbList[k].DataList = nil
|
|
|
}
|
|
|
|