|
@@ -357,6 +357,10 @@ func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate st
|
|
|
|
|
|
// 特殊图形数据处理
|
|
|
switch chartType {
|
|
|
+ case 2: // 季节性图
|
|
|
+ if seasonExtraConfig != "" {
|
|
|
+ dataResp, err = SeasonChartData(edbList, seasonExtraConfig)
|
|
|
+ }
|
|
|
case 7: // 柱形图
|
|
|
barChartConf := extraConfig.(data_manage.BarChartInfoReq)
|
|
|
xEdbIdValue, yDataList, err = BarChartData(mappingList, edbDataListMap, barChartConf.DateList, barChartConf.Sort)
|
|
@@ -481,6 +485,9 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
|
|
|
var diffSeconds int64
|
|
|
if chartType == 2 { //季节性图
|
|
|
startDateReal = startDate
|
|
|
+ if len(mappingList) > 1 {
|
|
|
+ item.IsAxis = v.IsAxis
|
|
|
+ }
|
|
|
} else {
|
|
|
if v.EdbInfoType == 0 && v.LeadUnit != "" && v.LeadValue > 0 { //领先指标
|
|
|
var startTimeRealTemp time.Time
|
|
@@ -586,7 +593,7 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if chartType == 2 {
|
|
|
+ if chartType == 2 && item.IsAxis == 1 {
|
|
|
latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
|
|
|
if tmpErr != nil {
|
|
|
//item.DataList = dataList
|
|
@@ -623,7 +630,60 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
|
|
|
}
|
|
|
item.DataList = quarterDataList
|
|
|
}
|
|
|
+ } else if chartType == 2 && item.IsAxis == 0 {
|
|
|
+ // 右轴数据处理
|
|
|
+ xStartDate := "01-01"
|
|
|
+
|
|
|
+ jumpYear := 0
|
|
|
+ var seasonExtra data_manage.SeasonExtraItem
|
|
|
+ if seasonExtraConfig != "" {
|
|
|
+ err = json.Unmarshal([]byte(seasonExtraConfig), &seasonExtra)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if seasonExtra.XStartDate != "" {
|
|
|
+ xStartDate = seasonExtra.XStartDate
|
|
|
+ jumpYear = seasonExtra.JumpYear
|
|
|
+ }
|
|
|
+
|
|
|
+ length := len(dataList)
|
|
|
+ if length == 0 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
|
|
|
+ if tmpErr != nil {
|
|
|
+ //item.DataList = dataList
|
|
|
+ item.IsNullData = true
|
|
|
+ edbList = append(edbList, item)
|
|
|
+ continue
|
|
|
+ err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + v.LatestDate))
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ var rightAxisDate time.Time
|
|
|
+ if jumpYear == 1 {
|
|
|
+ latestDate = latestDate.AddDate(-1, 0, 0)
|
|
|
+ }
|
|
|
+ latestDateStr := fmt.Sprintf("%d-%s", latestDate.Year(), xStartDate)
|
|
|
+ rightAxisDate, err = time.Parse(utils.FormatDate, latestDateStr)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
|
|
|
+ newDataList := make([]*data_manage.EdbDataList, 0)
|
|
|
+ for _, v := range dataList {
|
|
|
+ dataTime, e := time.Parse(utils.FormatDate, v.DataTime)
|
|
|
+ if e != nil {
|
|
|
+ err = errors.New("季节性图处理右轴指标数据转换日期失败,Err:" + e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if dataTime.Equal(rightAxisDate) || dataTime.After(rightAxisDate) {
|
|
|
+ newDataList = append(newDataList, v)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ item.DataList = newDataList
|
|
|
} else if chartType == 7 || chartType == utils.CHART_TYPE_RADAR { //柱方图
|
|
|
//item.DataList = dataList
|
|
|
} else {
|
|
@@ -687,6 +747,7 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*data_manage.EdbDataList, latest
|
|
|
}
|
|
|
endYear := lastDateT.Year()
|
|
|
nowYear := time.Now().Year()
|
|
|
+ chartLegendMaxYear := 0
|
|
|
dataMap := make(map[string]data_manage.QuarterXDateItem, 0)
|
|
|
|
|
|
quarterDataList := make([]*data_manage.QuarterData, 0)
|
|
@@ -732,6 +793,7 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*data_manage.EdbDataList, latest
|
|
|
EndDate: endT,
|
|
|
ShowName: showName,
|
|
|
}
|
|
|
+ chartLegendMaxYear = endT.Year()
|
|
|
dataMap[name] = item
|
|
|
chartLegendMap[name] = idx
|
|
|
idx++
|
|
@@ -742,9 +804,13 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*data_manage.EdbDataList, latest
|
|
|
}
|
|
|
}
|
|
|
lenYear := len(dataMap)
|
|
|
+ if chartLegendMaxYear > endYear {
|
|
|
+ chartLegendMaxYear = endYear
|
|
|
+ }
|
|
|
for k, v := range dataMap {
|
|
|
if i, ok := chartLegendMap[k]; ok {
|
|
|
- v.ChartLegend = strconv.Itoa(endYear - lenYear + i)
|
|
|
+ //v.ChartLegend = strconv.Itoa(endYear - lenYear + i)
|
|
|
+ v.ChartLegend = strconv.Itoa(chartLegendMaxYear - lenYear + i)
|
|
|
}
|
|
|
dataMap[k] = v
|
|
|
}
|
|
@@ -795,6 +861,9 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*data_manage.EdbDataList, latest
|
|
|
}
|
|
|
for k, v := range dataMap {
|
|
|
itemList := quarterMap[k]
|
|
|
+ /*if len(itemList) == 0 {
|
|
|
+ continue
|
|
|
+ }*/
|
|
|
quarterItem := new(data_manage.QuarterData)
|
|
|
quarterItem.Years = v.ShowName
|
|
|
quarterItem.ChartLegend = v.ChartLegend
|
|
@@ -877,6 +946,7 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
|
|
|
}
|
|
|
endYear := lastDateT.Year()
|
|
|
nowYear := time.Now().Year()
|
|
|
+ chartLegendMaxYear := 0
|
|
|
dataMap := make(map[string]data_manage.QuarterXDateItem, 0)
|
|
|
|
|
|
quarterDataList := make([]*data_manage.QuarterData, 0)
|
|
@@ -921,6 +991,7 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
|
|
|
EndDate: endT,
|
|
|
ShowName: showName,
|
|
|
}
|
|
|
+ chartLegendMaxYear = endT.Year()
|
|
|
dataMap[showName] = item
|
|
|
fmt.Println("年份" + showName + "日期" + startStr + " " + endStr)
|
|
|
startTmpT = startT
|
|
@@ -933,9 +1004,13 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
|
|
|
}
|
|
|
}
|
|
|
lenYear := len(dataMap)
|
|
|
+ if chartLegendMaxYear > endYear {
|
|
|
+ chartLegendMaxYear = endYear
|
|
|
+ }
|
|
|
for k, v := range dataMap {
|
|
|
if i, ok := chartLegendMap[k]; ok {
|
|
|
- v.ChartLegend = strconv.Itoa(endYear - lenYear + i)
|
|
|
+ //v.ChartLegend = strconv.Itoa(endYear - lenYear + i)
|
|
|
+ v.ChartLegend = strconv.Itoa(chartLegendMaxYear - lenYear + i)
|
|
|
}
|
|
|
dataMap[k] = v
|
|
|
}
|
|
@@ -1012,6 +1087,9 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
|
|
|
|
|
|
for k, v := range dataMap {
|
|
|
itemList := quarterMap[k]
|
|
|
+ /*if len(itemList) == 0 {
|
|
|
+ continue
|
|
|
+ }*/
|
|
|
quarterItem := new(data_manage.QuarterData)
|
|
|
quarterItem.Years = v.ShowName
|
|
|
quarterItem.ChartLegend = v.ChartLegend
|
|
@@ -2753,7 +2831,7 @@ func RadarChartData(mappingList []*data_manage.ChartEdbInfoMapping, edbDataListM
|
|
|
}
|
|
|
|
|
|
// GetChartConvertEdbData 获取图表数据转换的指标数据
|
|
|
-func GetChartConvertEdbData(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*data_manage.ChartEdbInfoMapping, extraConfigStr string, seasonExtraConfig string) (edbList []*data_manage.ChartEdbInfoMapping, xEdbIdValue []int, yDataList []data_manage.YData, dataResp interface{}, err error, errMsg string) {
|
|
|
+func GetChartConvertEdbData(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*data_manage.ChartEdbInfoMapping, extraConfigStr string, seasonExtraConfig string, isAxis int) (edbList []*data_manage.ChartEdbInfoMapping, xEdbIdValue []int, yDataList []data_manage.YData, dataResp interface{}, err error, errMsg string) {
|
|
|
edbList = make([]*data_manage.ChartEdbInfoMapping, 0)
|
|
|
xEdbIdValue = make([]int, 0)
|
|
|
yDataList = make([]data_manage.YData, 0)
|
|
@@ -2809,13 +2887,17 @@ func GetChartConvertEdbData(chartInfoId, chartType int, calendar, startDate, end
|
|
|
}
|
|
|
|
|
|
// 指标对应的所有数据
|
|
|
- edbDataListMap, edbList, err := getEdbConvertDataMapList(chartInfoId, chartType, calendar, startDate, endDate, mappingList, seasonExtraConfig)
|
|
|
+ edbDataListMap, edbList, err := getEdbConvertDataMapList(chartInfoId, chartType, calendar, startDate, endDate, mappingList, seasonExtraConfig, isAxis)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
// 特殊图形数据处理
|
|
|
switch chartType {
|
|
|
+ case 2: // 季节性图
|
|
|
+ if seasonExtraConfig != "" {
|
|
|
+ dataResp, err = SeasonChartData(edbList, seasonExtraConfig)
|
|
|
+ }
|
|
|
case 7: // 柱形图
|
|
|
barChartConf := extraConfig.(data_manage.BarChartInfoReq)
|
|
|
xEdbIdValue, yDataList, err = BarChartData(mappingList, edbDataListMap, barChartConf.DateList, barChartConf.Sort)
|
|
@@ -2863,7 +2945,7 @@ func GetChartConvertEdbData(chartInfoId, chartType int, calendar, startDate, end
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func getEdbConvertDataMapList(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*data_manage.ChartEdbInfoMapping, seasonExtraConfig string) (edbDataListMap map[int][]*data_manage.EdbDataList, edbList []*data_manage.ChartEdbInfoMapping, err error) {
|
|
|
+func getEdbConvertDataMapList(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*data_manage.ChartEdbInfoMapping, seasonExtraConfig string, isAxis int) (edbDataListMap map[int][]*data_manage.EdbDataList, edbList []*data_manage.ChartEdbInfoMapping, err error) {
|
|
|
// 指标对应的所有数据
|
|
|
edbDataListMap = make(map[int][]*data_manage.EdbDataList)
|
|
|
|
|
@@ -2932,6 +3014,9 @@ func getEdbConvertDataMapList(chartInfoId, chartType int, calendar, startDate, e
|
|
|
var diffSeconds int64
|
|
|
if chartType == 2 { //季节性图
|
|
|
startDateReal = startDate
|
|
|
+ if len(mappingList) > 1 {
|
|
|
+ item.IsAxis = v.IsAxis
|
|
|
+ }
|
|
|
} else {
|
|
|
if v.EdbInfoType == 0 && v.LeadUnit != "" && v.LeadValue > 0 { //领先指标
|
|
|
var startTimeRealTemp time.Time
|
|
@@ -3033,7 +3118,7 @@ func getEdbConvertDataMapList(chartInfoId, chartType int, calendar, startDate, e
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if chartType == 2 {
|
|
|
+ if chartType == 2 && isAxis == 1 {
|
|
|
latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
|
|
|
if tmpErr != nil {
|
|
|
//item.DataList = dataList
|
|
@@ -3070,7 +3155,29 @@ func getEdbConvertDataMapList(chartInfoId, chartType int, calendar, startDate, e
|
|
|
}
|
|
|
item.DataList = quarterDataList
|
|
|
}
|
|
|
-
|
|
|
+ } else if chartType == 2 && isAxis == 0 {
|
|
|
+ // 右轴数据处理,只要最新一年
|
|
|
+ latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
|
|
|
+ if tmpErr != nil {
|
|
|
+ //item.DataList = dataList
|
|
|
+ item.IsNullData = true
|
|
|
+ edbList = append(edbList, item)
|
|
|
+ continue
|
|
|
+ err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + v.LatestDate))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ newDataList := make([]*data_manage.EdbDataList, 0)
|
|
|
+ for _, v := range dataList {
|
|
|
+ dataTime, e := time.Parse(utils.FormatDate, v.DataTime)
|
|
|
+ if e != nil {
|
|
|
+ err = errors.New("季节性图处理右轴指标数据转换日期失败,Err:" + e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if dataTime.Year() == latestDate.Year() {
|
|
|
+ newDataList = append(newDataList, v)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ item.DataList = newDataList
|
|
|
} else if chartType == 7 || chartType == utils.CHART_TYPE_RADAR { //柱方图
|
|
|
//item.DataList = dataList
|
|
|
} else {
|
|
@@ -3081,3 +3188,891 @@ func getEdbConvertDataMapList(chartInfoId, chartType int, calendar, startDate, e
|
|
|
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+// GetChartEdbDataV2 获取图表的指标数据
|
|
|
+func GetChartEdbDataV2(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*data_manage.ChartEdbInfoMapping, extraConfigStr string, seasonExtraConfig string, chartInfoData ChartInfoDataShow) (edbList []*data_manage.ChartEdbInfoMapping, xEdbIdValue []int, yDataList []data_manage.YData, dataResp interface{}, err error, errMsg string) {
|
|
|
+ edbList = make([]*data_manage.ChartEdbInfoMapping, 0)
|
|
|
+ xEdbIdValue = make([]int, 0)
|
|
|
+ yDataList = make([]data_manage.YData, 0)
|
|
|
+
|
|
|
+ var extraConfig interface{}
|
|
|
+ switch chartType {
|
|
|
+ case 7: // 柱形图
|
|
|
+ var barConfig data_manage.BarChartInfoReq
|
|
|
+ if extraConfigStr == `` {
|
|
|
+ errMsg = "柱方图未配置"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ err = json.Unmarshal([]byte(extraConfigStr), &barConfig)
|
|
|
+ if err != nil {
|
|
|
+ errMsg = "柱方图配置异常"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ extraConfig = barConfig
|
|
|
+ case 10: // 截面散点图
|
|
|
+ var tmpExtraConfig data_manage.SectionScatterReq
|
|
|
+ if extraConfigStr == `` {
|
|
|
+ errMsg = "截面散点图未配置"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ err = json.Unmarshal([]byte(extraConfigStr), &tmpExtraConfig)
|
|
|
+ if err != nil {
|
|
|
+ errMsg = "截面散点配置异常"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ extraConfig = tmpExtraConfig
|
|
|
+ case utils.CHART_TYPE_RADAR:
|
|
|
+ var barConfig data_manage.RadarChartInfoReq
|
|
|
+ if extraConfigStr == `` {
|
|
|
+ errMsg = "雷达图未配置"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ err = json.Unmarshal([]byte(extraConfigStr), &barConfig)
|
|
|
+ if err != nil {
|
|
|
+ errMsg = "雷达图配置异常"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ extraConfig = barConfig
|
|
|
+ default:
|
|
|
+ xEdbIdValue = make([]int, 0)
|
|
|
+ yDataList = make([]data_manage.YData, 0)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 指标对应的所有数据
|
|
|
+ edbDataListMap, edbList, err := chartInfoData.GetEdbDataMapList(chartInfoId, chartType, calendar, startDate, endDate, mappingList, seasonExtraConfig)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 特殊图形数据处理
|
|
|
+ switch chartType {
|
|
|
+ case 2: // 季节性图
|
|
|
+ if seasonExtraConfig != "" {
|
|
|
+ dataResp, err = SeasonChartData(edbList, seasonExtraConfig)
|
|
|
+ }
|
|
|
+ case 7: // 柱形图
|
|
|
+ barChartConf := extraConfig.(data_manage.BarChartInfoReq)
|
|
|
+ xEdbIdValue, yDataList, err = BarChartData(mappingList, edbDataListMap, barChartConf.DateList, barChartConf.Sort)
|
|
|
+
|
|
|
+ for k := range yDataList {
|
|
|
+ yDataList[k].Unit = barChartConf.Unit
|
|
|
+ yDataList[k].UnitEn = barChartConf.UnitEn
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, v := range edbList {
|
|
|
+ // 指标别名
|
|
|
+ if barChartConf.EdbInfoIdList != nil && len(barChartConf.EdbInfoIdList) > 0 {
|
|
|
+ for _, reqEdb := range barChartConf.EdbInfoIdList {
|
|
|
+ if v.EdbInfoId == reqEdb.EdbInfoId {
|
|
|
+ v.EdbAliasName = reqEdb.Name
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ case 10: // 截面散点图
|
|
|
+ sectionScatterConf := extraConfig.(data_manage.SectionScatterReq)
|
|
|
+ xEdbIdValue, dataResp, err = GetSectionScatterChartData(chartInfoId, mappingList, edbDataListMap, sectionScatterConf)
|
|
|
+
|
|
|
+ var tmpExtraConfig data_manage.SectionScatterReq
|
|
|
+ if extraConfigStr == `` {
|
|
|
+ errMsg = "截面散点图未配置"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ err = json.Unmarshal([]byte(extraConfigStr), &tmpExtraConfig)
|
|
|
+ if err != nil {
|
|
|
+ errMsg = "截面散点配置异常"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 这个数据没有必要返回给前端
|
|
|
+ for _, v := range edbList {
|
|
|
+ v.DataList = nil
|
|
|
+ }
|
|
|
+ case utils.CHART_TYPE_RADAR: //雷达图
|
|
|
+ radarConf := extraConfig.(data_manage.RadarChartInfoReq)
|
|
|
+ xEdbIdValue, dataResp, err = RadarChartData(mappingList, edbDataListMap, radarConf)
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+// SeasonChartData 季节性图的数据处理
|
|
|
+func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraConfig string) (dataResp data_manage.SeasonChartResp, err error) {
|
|
|
+ var seasonConfig data_manage.SeasonExtraItem
|
|
|
+ err = json.Unmarshal([]byte(seasonExtraConfig), &seasonConfig)
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("季节性图配置异常, Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, mappingItem := range dataList {
|
|
|
+ if mappingItem.IsAxis == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ quarterDataList := mappingItem.DataList.(data_manage.QuarterDataList)
|
|
|
+ // 上下限区间
|
|
|
+ if seasonConfig.MaxMinLimits.Year > 0 {
|
|
|
+ dataResp.MaxMinLimits.List = make([]*data_manage.MaxMinLimitsData, 0)
|
|
|
+ dataTimeMap := make(map[time.Time]time.Time)
|
|
|
+ dataTimeList := make([]string, 0)
|
|
|
+ maxValueMap := make(map[time.Time]float64)
|
|
|
+ minValueMap := make(map[time.Time]float64)
|
|
|
+
|
|
|
+ maxMinDataList := make([]*data_manage.MaxMinLimitsData, 0)
|
|
|
+ // 日度 周度插值
|
|
|
+ for _, v := range quarterDataList {
|
|
|
+ if mappingItem.Frequency == "日度" || mappingItem.Frequency == "周度" {
|
|
|
+ handleDataMap := make(map[string]float64)
|
|
|
+ dataTimeList, _, err = HandleDataByLinearRegressionToList(v.DataList, handleDataMap)
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("插值处理数据异常, Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, date := range dataTimeList {
|
|
|
+ dateTime, e := time.Parse(utils.FormatDate, date)
|
|
|
+ if e != nil {
|
|
|
+ err = errors.New("时间格式化异常, Err:" + e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 不包含今年
|
|
|
+ if dateTime.Year() == time.Now().Year() {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ newDate := dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
|
|
|
+ // 处理上下限列表
|
|
|
+ if value, ok := maxValueMap[newDate]; ok {
|
|
|
+ if value < handleDataMap[date] {
|
|
|
+ maxValueMap[newDate] = handleDataMap[date]
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ maxValueMap[newDate] = handleDataMap[date]
|
|
|
+ }
|
|
|
+
|
|
|
+ if value, ok := minValueMap[newDate]; ok {
|
|
|
+ if value > handleDataMap[date] {
|
|
|
+ minValueMap[newDate] = handleDataMap[date]
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ minValueMap[newDate] = handleDataMap[date]
|
|
|
+ }
|
|
|
+
|
|
|
+ dataTimeMap[newDate] = newDate
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 旬度、月度、季度、半年度 不插值,需要先把日期列表和数据map取出来
|
|
|
+ for _, vv := range v.DataList {
|
|
|
+ dateTime, e := time.Parse(utils.FormatDate, vv.DataTime)
|
|
|
+ if e != nil {
|
|
|
+ err = errors.New("时间格式化异常, Err:" + e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 不包含今年
|
|
|
+ if dateTime.Year() == time.Now().Year() {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ newDate := dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
|
|
|
+
|
|
|
+ if value, ok := maxValueMap[newDate]; ok {
|
|
|
+ if value < vv.Value {
|
|
|
+ maxValueMap[newDate] = vv.Value
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ maxValueMap[newDate] = vv.Value
|
|
|
+ }
|
|
|
+
|
|
|
+ if value, ok := minValueMap[newDate]; ok {
|
|
|
+ if value > vv.Value {
|
|
|
+ minValueMap[newDate] = vv.Value
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ minValueMap[newDate] = vv.Value
|
|
|
+ }
|
|
|
+ dataTimeMap[newDate] = newDate
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, v := range dataTimeMap {
|
|
|
+ maxMinItem := &data_manage.MaxMinLimitsData{}
|
|
|
+ if maxValue, ok := maxValueMap[v]; ok {
|
|
|
+ maxMinItem.MaxValue = maxValue
|
|
|
+ } else {
|
|
|
+ maxMinItem.MaxValue = minValueMap[v]
|
|
|
+ }
|
|
|
+
|
|
|
+ if minValue, ok := minValueMap[v]; ok {
|
|
|
+ maxMinItem.MinValue = minValue
|
|
|
+ } else {
|
|
|
+ maxMinItem.MinValue = maxValueMap[v]
|
|
|
+ }
|
|
|
+ maxMinItem.DataTime = v.Format(utils.FormatDate)
|
|
|
+ maxMinItem.DataTimestamp = v.UnixNano() / 1e6
|
|
|
+
|
|
|
+ maxMinDataList = append(maxMinDataList, maxMinItem)
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // 排序
|
|
|
+ sort.Slice(maxMinDataList, func(i, j int) bool {
|
|
|
+ return maxMinDataList[i].DataTime < maxMinDataList[j].DataTime
|
|
|
+ })
|
|
|
+
|
|
|
+ dataResp.MaxMinLimits.List = maxMinDataList
|
|
|
+ dataResp.MaxMinLimits.Color = seasonConfig.MaxMinLimits.Color
|
|
|
+ dataResp.MaxMinLimits.Legend = seasonConfig.MaxMinLimits.Legend
|
|
|
+ dataResp.MaxMinLimits.IsShow = seasonConfig.MaxMinLimits.IsShow
|
|
|
+ dataResp.MaxMinLimits.IsAdd = seasonConfig.MaxMinLimits.IsAdd
|
|
|
+ dataResp.MaxMinLimits.Year = seasonConfig.MaxMinLimits.Year
|
|
|
+ }
|
|
|
+
|
|
|
+ // 自定义同期均线
|
|
|
+ if seasonConfig.SamePeriodAverage.Year > 0 {
|
|
|
+ handleDataMap := make(map[string]float64)
|
|
|
+ dataTimeMap := make(map[time.Time]time.Time)
|
|
|
+ dataTimeList := make([]string, 0)
|
|
|
+ valueMap := make(map[time.Time]float64)
|
|
|
+
|
|
|
+ averageDataList := make([]*data_manage.SamePeriodAverageData, 0)
|
|
|
+ for i := len(quarterDataList) - 1; i > len(quarterDataList)-seasonConfig.SamePeriodAverage.Year && i > 0; i-- {
|
|
|
+ // 插值成日度
|
|
|
+ dataTimeList, _, err = HandleDataByLinearRegressionToList(quarterDataList[i].DataList, handleDataMap)
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("插值处理数据异常, Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, date := range dataTimeList {
|
|
|
+ dateTime, e := time.Parse(utils.FormatDate, date)
|
|
|
+ if e != nil {
|
|
|
+ err = errors.New("时间格式化异常, Err:" + e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ newDate := dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
|
|
|
+ // 处理均值
|
|
|
+ if value, ok := valueMap[newDate]; ok {
|
|
|
+ valueMap[newDate] = (handleDataMap[date] + value) / 2
|
|
|
+ } else {
|
|
|
+ valueMap[newDate] = handleDataMap[date]
|
|
|
+ }
|
|
|
+
|
|
|
+ dataTimeMap[newDate] = newDate
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, v := range dataTimeMap {
|
|
|
+ averageItem := &data_manage.SamePeriodAverageData{}
|
|
|
+ if value, ok := valueMap[v]; ok {
|
|
|
+ averageItem.Value = value
|
|
|
+ }
|
|
|
+ averageItem.DataTime = v.Format(utils.FormatDate)
|
|
|
+ averageItem.DataTimestamp = v.UnixNano() / 1e6
|
|
|
+
|
|
|
+ averageDataList = append(averageDataList, averageItem)
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // 排序
|
|
|
+ sort.Slice(averageDataList, func(i, j int) bool {
|
|
|
+ return averageDataList[i].DataTime < averageDataList[j].DataTime
|
|
|
+ })
|
|
|
+
|
|
|
+ dataResp.SamePeriodAverage.List = averageDataList
|
|
|
+ dataResp.SamePeriodAverage.Year = seasonConfig.SamePeriodAverage.Year
|
|
|
+ dataResp.SamePeriodAverage.Color = seasonConfig.SamePeriodAverage.Color
|
|
|
+ dataResp.SamePeriodAverage.Legend = seasonConfig.SamePeriodAverage.Legend
|
|
|
+ dataResp.SamePeriodAverage.IsShow = seasonConfig.SamePeriodAverage.IsShow
|
|
|
+ dataResp.SamePeriodAverage.LineType = seasonConfig.SamePeriodAverage.LineType
|
|
|
+ dataResp.SamePeriodAverage.LineWidth = seasonConfig.SamePeriodAverage.LineWidth
|
|
|
+ dataResp.SamePeriodAverage.IsAdd = seasonConfig.SamePeriodAverage.IsAdd
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // 自定义同期标准差
|
|
|
+ if seasonConfig.SamePeriodStandardDeviation.Year > 1 && seasonConfig.SamePeriodStandardDeviation.Multiple > 0 {
|
|
|
+ // 先算均值,再算标准差
|
|
|
+ handleDataMap := make(map[string]float64)
|
|
|
+ dataTimeMap := make(map[time.Time]time.Time)
|
|
|
+ dataTimeValueMap := make(map[time.Time][]float64)
|
|
|
+ dataTimeList := make([]string, 0)
|
|
|
+ valueMap := make(map[time.Time]float64)
|
|
|
+
|
|
|
+ samePeriodStandardDeviationList := make([]*data_manage.MaxMinLimitsData, 0)
|
|
|
+ for i := len(quarterDataList) - 1; i > len(quarterDataList)-seasonConfig.SamePeriodAverage.Year-1 && i > 0; i-- {
|
|
|
+ // 插值成日度
|
|
|
+ dataTimeList, _, err = HandleDataByLinearRegressionToListV2(quarterDataList[i].DataList, handleDataMap)
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("插值处理数据异常, Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, date := range dataTimeList {
|
|
|
+ dateTime, e := time.Parse(utils.FormatDate, date)
|
|
|
+ if e != nil {
|
|
|
+ err = errors.New("时间格式化异常, Err:" + e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ newDate := dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
|
|
|
+ // 处理均值
|
|
|
+ if value, ok := valueMap[newDate]; ok {
|
|
|
+ valueMap[newDate] = (handleDataMap[date] + value) / 2
|
|
|
+ } else {
|
|
|
+ valueMap[newDate] = handleDataMap[date]
|
|
|
+ }
|
|
|
+
|
|
|
+ dataTimeMap[newDate] = newDate
|
|
|
+ valueList := dataTimeValueMap[newDate]
|
|
|
+ valueList = append(valueList, handleDataMap[date])
|
|
|
+ dataTimeValueMap[newDate] = valueList
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, v := range dataTimeMap {
|
|
|
+ valueList := dataTimeValueMap[v]
|
|
|
+ stdev := utils.CalculateStandardDeviation(valueList)
|
|
|
+ stdev, _ = decimal.NewFromFloat(stdev).Round(4).Float64()
|
|
|
+
|
|
|
+ maxMinItem := &data_manage.MaxMinLimitsData{}
|
|
|
+
|
|
|
+ if value, ok := valueMap[v]; ok {
|
|
|
+ maxMinItem.MaxValue = value + stdev*seasonConfig.SamePeriodStandardDeviation.Multiple
|
|
|
+ maxMinItem.MinValue = value - stdev*seasonConfig.SamePeriodStandardDeviation.Multiple
|
|
|
+ }
|
|
|
+
|
|
|
+ maxMinItem.DataTime = v.Format(utils.FormatDate)
|
|
|
+ maxMinItem.DataTimestamp = v.UnixNano() / 1e6
|
|
|
+
|
|
|
+ samePeriodStandardDeviationList = append(samePeriodStandardDeviationList, maxMinItem)
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // 排序
|
|
|
+ sort.Slice(samePeriodStandardDeviationList, func(i, j int) bool {
|
|
|
+ return samePeriodStandardDeviationList[i].DataTime < samePeriodStandardDeviationList[j].DataTime
|
|
|
+ })
|
|
|
+
|
|
|
+ dataResp.SamePeriodStandardDeviation.List = samePeriodStandardDeviationList
|
|
|
+ dataResp.SamePeriodStandardDeviation.Color = seasonConfig.SamePeriodStandardDeviation.Color
|
|
|
+ dataResp.SamePeriodStandardDeviation.Legend = seasonConfig.SamePeriodStandardDeviation.Legend
|
|
|
+ dataResp.SamePeriodStandardDeviation.IsShow = seasonConfig.SamePeriodStandardDeviation.IsShow
|
|
|
+ dataResp.SamePeriodStandardDeviation.Multiple = seasonConfig.SamePeriodStandardDeviation.Multiple
|
|
|
+ dataResp.SamePeriodStandardDeviation.Year = seasonConfig.SamePeriodStandardDeviation.Year
|
|
|
+ dataResp.SamePeriodStandardDeviation.IsAdd = seasonConfig.SamePeriodStandardDeviation.IsAdd
|
|
|
+ }
|
|
|
+
|
|
|
+ // 自定义右轴
|
|
|
+ if seasonConfig.RightAxis.IndicatorType != 0 {
|
|
|
+ if seasonConfig.RightAxis.IndicatorType == 1 {
|
|
|
+ startTime, _ := time.Parse(utils.FormatDate, mappingItem.StartDate)
|
|
|
+ for i := len(quarterDataList) - 1; i > len(quarterDataList)-2 && i > 0; i-- {
|
|
|
+ var rightMappingItem data_manage.ChartEdbInfoMapping
|
|
|
+ rightMappingItem = *mappingItem
|
|
|
+ // 计算同比值
|
|
|
+ tbzDataList, minValue, maxValue, e := GetEdbDataTbzForSeason(mappingItem.Frequency, quarterDataList[i].DataList, startTime)
|
|
|
+ if e != nil {
|
|
|
+ err = errors.New("计算同比值失败, Err:" + e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ rightMappingItem.DataList = tbzDataList
|
|
|
+ rightMappingItem.MaxData = maxValue
|
|
|
+ rightMappingItem.MinData = minValue
|
|
|
+ dataResp.RightAxis.EdbInfoList = append(dataResp.RightAxis.EdbInfoList, &rightMappingItem)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dataResp.RightAxis.SeasonRightAxis = seasonConfig.RightAxis
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// 计算百分位对应的值
|
|
|
+func PercentileAlgorithm(x float64, data []float64) float64 {
|
|
|
+ N := float64(len(data))
|
|
|
+ n := (x / 100) * (N - 1)
|
|
|
+
|
|
|
+ // 如果n是整数,则直接返回第n个数值
|
|
|
+ if n == float64(int(n)) {
|
|
|
+ return data[int(n)-1]
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果n是小数,执行插值
|
|
|
+ nInt := int(n)
|
|
|
+ e := n - float64(nInt)
|
|
|
+
|
|
|
+ // 取出相邻的两个数值
|
|
|
+ Sn := data[nInt-1]
|
|
|
+ Sn1 := data[nInt]
|
|
|
+
|
|
|
+ // 计算插值结果
|
|
|
+ y := Sn + e*(Sn1-Sn)
|
|
|
+
|
|
|
+ return y
|
|
|
+}
|
|
|
+
|
|
|
+func MarkerLineCalculate(markerLine data_manage.MarkersLine, dataList interface{}, chartInfo *data_manage.ChartInfoView) (value string, err error) {
|
|
|
+ if markerLine.Calculation == 1 {
|
|
|
+ // 区间均值
|
|
|
+ averge := 0.0
|
|
|
+ length := 0
|
|
|
+ // 计算左轴
|
|
|
+ if chartInfo.ChartType == 2 && markerLine.EdbType == 0 {
|
|
|
+ //季节性图结构体不一样
|
|
|
+ quarterDataList := dataList.(data_manage.QuarterDataList)
|
|
|
+ for _, quarterData := range quarterDataList[len(quarterDataList)-1:] {
|
|
|
+ for _, vv := range quarterData.DataList {
|
|
|
+ if markerLine.TimeIntervalType == 1 {
|
|
|
+ startDate := markerLine.StartDate.Date
|
|
|
+ endDate := time.Now().Format(utils.FormatDate)
|
|
|
+ if markerLine.StartDate.TimeType == 2 {
|
|
|
+ // 动态
|
|
|
+ if markerLine.StartDate.Conf.BaseDate == 1 {
|
|
|
+ // 指标最新日期
|
|
|
+ startDate = quarterData.DataList[len(quarterData.DataList)-1].DataTime
|
|
|
+ } else {
|
|
|
+ // 系统日期
|
|
|
+ startDate = time.Now().Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ startDate, err = HandleDateChange(startDate, markerLine.StartDate.Conf)
|
|
|
+ }
|
|
|
+ if markerLine.EndDate.TimeType == 1 {
|
|
|
+ // 固定
|
|
|
+ endDate = markerLine.EndDate.Date
|
|
|
+ } else if markerLine.EndDate.TimeType == 2 {
|
|
|
+ // 动态
|
|
|
+ if markerLine.StartDate.Conf.BaseDate == 1 {
|
|
|
+ // 指标最新日期
|
|
|
+ endDate = quarterData.DataList[len(quarterData.DataList)-1].DataTime
|
|
|
+ } else {
|
|
|
+ // 系统日期
|
|
|
+ endDate = time.Now().Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ endDate, err = HandleDateChange(endDate, markerLine.StartDate.Conf)
|
|
|
+ }
|
|
|
+ if vv.DataTime >= startDate && vv.DataTime <= endDate {
|
|
|
+ averge += vv.Value
|
|
|
+ length +=1
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ averge += vv.Value
|
|
|
+ length +=1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ averge = averge / float64(length)
|
|
|
+ value = fmt.Sprintf("%.2f", averge)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ dataList := dataList.([]*data_manage.EdbDataList)
|
|
|
+ for _, dataItem := range dataList {
|
|
|
+ if markerLine.TimeIntervalType == 1 {
|
|
|
+ startDate := markerLine.StartDate.Date
|
|
|
+ endDate := time.Now().Format(utils.FormatDate)
|
|
|
+ if markerLine.StartDate.TimeType == 2 {
|
|
|
+ // 动态
|
|
|
+ if markerLine.StartDate.Conf.BaseDate == 1 {
|
|
|
+ // 指标最新日期
|
|
|
+ startDate = dataList[len(dataList)-1].DataTime
|
|
|
+ } else {
|
|
|
+ // 系统日期
|
|
|
+ startDate = time.Now().Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ startDate, err = HandleDateChange(startDate, markerLine.StartDate.Conf)
|
|
|
+ }
|
|
|
+ if markerLine.EndDate.TimeType == 1 {
|
|
|
+ // 固定
|
|
|
+ endDate = markerLine.EndDate.Date
|
|
|
+ } else if markerLine.EndDate.TimeType == 2 {
|
|
|
+ // 动态
|
|
|
+ if markerLine.StartDate.Conf.BaseDate == 1 {
|
|
|
+ // 指标最新日期
|
|
|
+ endDate = dataList[len(dataList)-1].DataTime
|
|
|
+ } else {
|
|
|
+ // 系统日期
|
|
|
+ endDate = time.Now().Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ endDate, err = HandleDateChange(endDate, markerLine.StartDate.Conf)
|
|
|
+ }
|
|
|
+ if dataItem.DataTime >= startDate && dataItem.DataTime <= endDate {
|
|
|
+ averge += dataItem.Value
|
|
|
+ length += 1
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ averge += dataItem.Value
|
|
|
+ length += 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ averge = averge / float64(length)
|
|
|
+
|
|
|
+ value = fmt.Sprintf("%.2f", averge)
|
|
|
+ }
|
|
|
+ } else if markerLine.Calculation == 2 {
|
|
|
+ // 区间均值加N倍标准差
|
|
|
+ averge := 0.0
|
|
|
+ length := 0
|
|
|
+ // 计算左轴
|
|
|
+ if chartInfo.ChartType == 2 && markerLine.EdbType == 0 {
|
|
|
+ //季节性图结构体不一样
|
|
|
+ faloatList := make([]float64, 0)
|
|
|
+ quarterDataList := dataList.(data_manage.QuarterDataList)
|
|
|
+ for _, quarterData := range quarterDataList[len(quarterDataList)-1:] {
|
|
|
+ for _, vv := range quarterData.DataList {
|
|
|
+ if markerLine.TimeIntervalType == 1 {
|
|
|
+ startDate := markerLine.StartDate.Date
|
|
|
+ endDate := time.Now().Format(utils.FormatDate)
|
|
|
+ if markerLine.StartDate.TimeType == 2 {
|
|
|
+ // 动态
|
|
|
+ if markerLine.StartDate.Conf.BaseDate == 1 {
|
|
|
+ // 指标最新日期
|
|
|
+ startDate = quarterData.DataList[len(quarterData.DataList)-1].DataTime
|
|
|
+ } else {
|
|
|
+ // 系统日期
|
|
|
+ startDate = time.Now().Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ startDate, err = HandleDateChange(startDate, markerLine.StartDate.Conf)
|
|
|
+ }
|
|
|
+ if markerLine.EndDate.TimeType == 1 {
|
|
|
+ // 固定
|
|
|
+ endDate = markerLine.EndDate.Date
|
|
|
+ } else if markerLine.EndDate.TimeType == 2 {
|
|
|
+ // 动态
|
|
|
+ if markerLine.StartDate.Conf.BaseDate == 1 {
|
|
|
+ // 指标最新日期
|
|
|
+ endDate = quarterData.DataList[len(quarterData.DataList)-1].DataTime
|
|
|
+ } else {
|
|
|
+ // 系统日期
|
|
|
+ endDate = time.Now().Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ endDate, err = HandleDateChange(endDate, markerLine.StartDate.Conf)
|
|
|
+ }
|
|
|
+ if vv.DataTime >= startDate && vv.DataTime <= endDate {
|
|
|
+ faloatList = append(faloatList, vv.Value)
|
|
|
+ averge += vv.Value
|
|
|
+ length += 1
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ faloatList = append(faloatList, vv.Value)
|
|
|
+ averge += vv.Value
|
|
|
+ length += 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ averge = averge / float64(length)
|
|
|
+ stdev := utils.CalculateStandardDeviation(faloatList)
|
|
|
+ stdev, _ = decimal.NewFromFloat(stdev).Round(4).Float64()
|
|
|
+
|
|
|
+ value = fmt.Sprintf("%.2f", averge+stdev*markerLine.CalculationValue)
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+ dataList := dataList.([]*data_manage.EdbDataList)
|
|
|
+ floatList := make([]float64, 0)
|
|
|
+ for _, dataItem := range dataList {
|
|
|
+ if markerLine.TimeIntervalType == 1 {
|
|
|
+ startDate := markerLine.StartDate.Date
|
|
|
+ endDate := time.Now().Format(utils.FormatDate)
|
|
|
+ if markerLine.StartDate.TimeType == 2 {
|
|
|
+ // 动态
|
|
|
+ if markerLine.StartDate.Conf.BaseDate == 1 {
|
|
|
+ // 指标最新日期
|
|
|
+ startDate = dataList[len(dataList)-1].DataTime
|
|
|
+ } else {
|
|
|
+ // 系统日期
|
|
|
+ startDate = time.Now().Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ startDate, err = HandleDateChange(startDate, markerLine.StartDate.Conf)
|
|
|
+ }
|
|
|
+ if markerLine.EndDate.TimeType == 1 {
|
|
|
+ // 固定
|
|
|
+ endDate = markerLine.EndDate.Date
|
|
|
+ } else if markerLine.EndDate.TimeType == 2 {
|
|
|
+ // 动态
|
|
|
+ if markerLine.StartDate.Conf.BaseDate == 1 {
|
|
|
+ // 指标最新日期
|
|
|
+ endDate = dataList[len(dataList)-1].DataTime
|
|
|
+ } else {
|
|
|
+ // 系统日期
|
|
|
+ endDate = time.Now().Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ endDate, err = HandleDateChange(endDate, markerLine.StartDate.Conf)
|
|
|
+ }
|
|
|
+ if dataItem.DataTime >= startDate && dataItem.DataTime <= endDate {
|
|
|
+ floatList = append(floatList, dataItem.Value)
|
|
|
+ averge += dataItem.Value
|
|
|
+ length += 1
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ floatList = append(floatList, dataItem.Value)
|
|
|
+ averge += dataItem.Value
|
|
|
+ length += 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ averge = averge / float64(length)
|
|
|
+
|
|
|
+ stdev := utils.CalculateStandardDeviation(floatList)
|
|
|
+ stdev, _ = decimal.NewFromFloat(stdev).Round(4).Float64()
|
|
|
+
|
|
|
+ value = fmt.Sprintf("%.2f", averge+stdev*markerLine.CalculationValue)
|
|
|
+ }
|
|
|
+ } else if markerLine.Calculation == 3 {
|
|
|
+ // 区间个数分位
|
|
|
+ markerLineValue := 0.0
|
|
|
+ if chartInfo.ChartType == 2 && markerLine.EdbType == 0 {
|
|
|
+ //季节性图结构体不一样
|
|
|
+ faloatList := make([]float64, 0)
|
|
|
+ quarterDataList := dataList.(data_manage.QuarterDataList)
|
|
|
+ for _, quarterData := range quarterDataList[len(quarterDataList)-1:] {
|
|
|
+ for _, vv := range quarterData.DataList {
|
|
|
+ if markerLine.TimeIntervalType == 1 {
|
|
|
+ startDate := markerLine.StartDate.Date
|
|
|
+ endDate := time.Now().Format(utils.FormatDate)
|
|
|
+ if markerLine.StartDate.TimeType == 2 {
|
|
|
+ // 动态
|
|
|
+ if markerLine.StartDate.Conf.BaseDate == 1 {
|
|
|
+ // 指标最新日期
|
|
|
+ startDate = quarterData.DataList[len(quarterData.DataList)-1].DataTime
|
|
|
+ } else {
|
|
|
+ // 系统日期
|
|
|
+ startDate = time.Now().Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ startDate, err = HandleDateChange(startDate, markerLine.StartDate.Conf)
|
|
|
+ }
|
|
|
+ if markerLine.EndDate.TimeType == 1 {
|
|
|
+ // 固定
|
|
|
+ endDate = markerLine.EndDate.Date
|
|
|
+ } else if markerLine.EndDate.TimeType == 2 {
|
|
|
+ // 动态
|
|
|
+ if markerLine.StartDate.Conf.BaseDate == 1 {
|
|
|
+ // 指标最新日期
|
|
|
+ endDate = quarterData.DataList[len(quarterData.DataList)-1].DataTime
|
|
|
+ } else {
|
|
|
+ // 系统日期
|
|
|
+ endDate = time.Now().Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ endDate, err = HandleDateChange(endDate, markerLine.StartDate.Conf)
|
|
|
+ }
|
|
|
+ if vv.DataTime >= startDate && vv.DataTime <= endDate {
|
|
|
+ faloatList = append(faloatList, vv.Value)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ faloatList = append(faloatList, vv.Value)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ markerLineValue = PercentileAlgorithm(markerLine.CalculationValue, faloatList)
|
|
|
+ value = fmt.Sprintf("%.2f", markerLineValue)
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+ dataList := dataList.([]*data_manage.EdbDataList)
|
|
|
+ floatList := make([]float64, 0)
|
|
|
+ for _, dataItem := range dataList {
|
|
|
+ if markerLine.TimeIntervalType == 1 {
|
|
|
+ startDate := markerLine.StartDate.Date
|
|
|
+ endDate := time.Now().Format(utils.FormatDate)
|
|
|
+ if markerLine.StartDate.TimeType == 2 {
|
|
|
+ // 动态
|
|
|
+ if markerLine.StartDate.Conf.BaseDate == 1 {
|
|
|
+ // 指标最新日期
|
|
|
+ startDate = dataList[len(dataList)-1].DataTime
|
|
|
+ } else {
|
|
|
+ // 系统日期
|
|
|
+ startDate = time.Now().Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ startDate, err = HandleDateChange(startDate, markerLine.StartDate.Conf)
|
|
|
+ }
|
|
|
+ if markerLine.EndDate.TimeType == 1 {
|
|
|
+ // 固定
|
|
|
+ endDate = markerLine.EndDate.Date
|
|
|
+ } else if markerLine.EndDate.TimeType == 2 {
|
|
|
+ // 动态
|
|
|
+ if markerLine.StartDate.Conf.BaseDate == 1 {
|
|
|
+ // 指标最新日期
|
|
|
+ endDate = dataList[len(dataList)-1].DataTime
|
|
|
+ } else {
|
|
|
+ // 系统日期
|
|
|
+ endDate = time.Now().Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ endDate, err = HandleDateChange(endDate, markerLine.StartDate.Conf)
|
|
|
+ }
|
|
|
+ if dataItem.DataTime >= startDate && dataItem.DataTime <= endDate {
|
|
|
+ floatList = append(floatList, dataItem.Value)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ floatList = append(floatList, dataItem.Value)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ markerLineValue = PercentileAlgorithm(markerLine.CalculationValue, floatList)
|
|
|
+ value = fmt.Sprintf("%.2f", markerLineValue)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// HandleDateChange 处理日期变换
|
|
|
+func HandleDateChange(date string, edbDateConf data_manage.EdbDateChangeConf) (newDate string, err error) {
|
|
|
+ newDate = date
|
|
|
+ if newDate != "" {
|
|
|
+ if len(edbDateConf.DateChange) > 0 {
|
|
|
+ var dateTime time.Time
|
|
|
+ dateTime, err = time.ParseInLocation(utils.FormatDate, newDate, time.Local)
|
|
|
+ if err != nil {
|
|
|
+ err = fmt.Errorf("日期解析失败: %s", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, v := range edbDateConf.DateChange {
|
|
|
+ if v.ChangeType == 1 {
|
|
|
+ dateTime = dateTime.AddDate(v.Year, v.Month, v.Day)
|
|
|
+ newDate = dateTime.Format(utils.FormatDate)
|
|
|
+ } else if v.ChangeType == 2 {
|
|
|
+ newDate, err, _ = handleSystemAppointDateT2(dateTime, v.FrequencyDay, v.Frequency)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ dateTime, err = time.ParseInLocation(utils.FormatDate, newDate, time.Local)
|
|
|
+ if err != nil {
|
|
|
+ err = fmt.Errorf("日期解析失败: %s", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+// handleSystemAppointDateT
|
|
|
+// @Description: 处理系统日期相关的指定频率(所在周/旬/月/季/半年/年的最后/最早一天)
|
|
|
+// @author: Roc
|
|
|
+// @datetime2023-10-27 09:31:35
|
|
|
+// @param Frequency string
|
|
|
+// @param Day string
|
|
|
+// @return date string
|
|
|
+// @return err error
|
|
|
+// @return errMsg string
|
|
|
+func handleSystemAppointDateT2(currDate time.Time, appointDay, frequency string) (date string, err error, errMsg string) {
|
|
|
+ //currDate := time.Now()
|
|
|
+ switch frequency {
|
|
|
+ case "本周":
|
|
|
+ day := int(currDate.Weekday())
|
|
|
+ if day == 0 { // 周日
|
|
|
+ day = 7
|
|
|
+ }
|
|
|
+ num := 0
|
|
|
+ switch appointDay {
|
|
|
+ case "周一":
|
|
|
+ num = 1
|
|
|
+ case "周二":
|
|
|
+ num = 2
|
|
|
+ case "周三":
|
|
|
+ num = 3
|
|
|
+ case "周四":
|
|
|
+ num = 4
|
|
|
+ case "周五":
|
|
|
+ num = 5
|
|
|
+ case "周六":
|
|
|
+ num = 6
|
|
|
+ case "周日":
|
|
|
+ num = 7
|
|
|
+ }
|
|
|
+ day = num - day
|
|
|
+ date = currDate.AddDate(0, 0, day).Format(utils.FormatDate)
|
|
|
+ case "本旬":
|
|
|
+ day := currDate.Day()
|
|
|
+ var tmpDate time.Time
|
|
|
+ switch appointDay {
|
|
|
+ case "第一天":
|
|
|
+ if day <= 10 {
|
|
|
+ tmpDate = time.Date(currDate.Year(), currDate.Month(), 1, 0, 0, 0, 0, currDate.Location())
|
|
|
+ } else if day <= 20 {
|
|
|
+ tmpDate = time.Date(currDate.Year(), currDate.Month(), 11, 0, 0, 0, 0, currDate.Location())
|
|
|
+ } else {
|
|
|
+ tmpDate = time.Date(currDate.Year(), currDate.Month(), 21, 0, 0, 0, 0, currDate.Location())
|
|
|
+ }
|
|
|
+ case "最后一天":
|
|
|
+ if day <= 10 {
|
|
|
+ tmpDate = time.Date(currDate.Year(), currDate.Month(), 10, 0, 0, 0, 0, currDate.Location())
|
|
|
+ } else if day <= 20 {
|
|
|
+ tmpDate = time.Date(currDate.Year(), currDate.Month(), 20, 0, 0, 0, 0, currDate.Location())
|
|
|
+ } else {
|
|
|
+ tmpDate = time.Date(currDate.Year(), currDate.Month()+1, 1, 0, 0, 0, 0, currDate.Location()).AddDate(0, 0, -1)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ date = tmpDate.Format(utils.FormatDate)
|
|
|
+ case "本月":
|
|
|
+ var tmpDate time.Time
|
|
|
+ switch appointDay {
|
|
|
+ case "第一天":
|
|
|
+ tmpDate = time.Date(currDate.Year(), currDate.Month(), 1, 0, 0, 0, 0, currDate.Location())
|
|
|
+ case "最后一天":
|
|
|
+ tmpDate = time.Date(currDate.Year(), currDate.Month()+1, 1, 0, 0, 0, 0, currDate.Location()).AddDate(0, 0, -1)
|
|
|
+ }
|
|
|
+ date = tmpDate.Format(utils.FormatDate)
|
|
|
+ case "本季":
|
|
|
+ month := currDate.Month()
|
|
|
+ var tmpDate time.Time
|
|
|
+ switch appointDay {
|
|
|
+ case "第一天":
|
|
|
+ if month <= 3 {
|
|
|
+ tmpDate = time.Date(currDate.Year(), 1, 1, 0, 0, 0, 0, currDate.Location())
|
|
|
+ } else if month <= 6 {
|
|
|
+ tmpDate = time.Date(currDate.Year(), 4, 1, 0, 0, 0, 0, currDate.Location())
|
|
|
+ } else if month <= 9 {
|
|
|
+ tmpDate = time.Date(currDate.Year(), 7, 1, 0, 0, 0, 0, currDate.Location())
|
|
|
+ } else {
|
|
|
+ tmpDate = time.Date(currDate.Year(), 10, 1, 0, 0, 0, 0, currDate.Location())
|
|
|
+ }
|
|
|
+ case "最后一天":
|
|
|
+ if month <= 3 {
|
|
|
+ tmpDate = time.Date(currDate.Year(), 3, 31, 0, 0, 0, 0, currDate.Location())
|
|
|
+ } else if month <= 6 {
|
|
|
+ tmpDate = time.Date(currDate.Year(), 6, 30, 0, 0, 0, 0, currDate.Location())
|
|
|
+ } else if month <= 9 {
|
|
|
+ tmpDate = time.Date(currDate.Year(), 9, 30, 0, 0, 0, 0, currDate.Location())
|
|
|
+ } else {
|
|
|
+ tmpDate = time.Date(currDate.Year(), 12, 31, 0, 0, 0, 0, currDate.Location())
|
|
|
+ }
|
|
|
+ }
|
|
|
+ date = tmpDate.Format(utils.FormatDate)
|
|
|
+ case "本半年":
|
|
|
+ month := currDate.Month()
|
|
|
+ var tmpDate time.Time
|
|
|
+ switch appointDay {
|
|
|
+ case "第一天":
|
|
|
+ if month <= 6 {
|
|
|
+ tmpDate = time.Date(currDate.Year(), 1, 1, 0, 0, 0, 0, currDate.Location())
|
|
|
+ } else {
|
|
|
+ tmpDate = time.Date(currDate.Year(), 7, 1, 0, 0, 0, 0, currDate.Location())
|
|
|
+ }
|
|
|
+ case "最后一天":
|
|
|
+ if month <= 6 {
|
|
|
+ tmpDate = time.Date(currDate.Year(), 6, 30, 0, 0, 0, 0, currDate.Location())
|
|
|
+ } else {
|
|
|
+ tmpDate = time.Date(currDate.Year(), 12, 31, 0, 0, 0, 0, currDate.Location())
|
|
|
+ }
|
|
|
+ }
|
|
|
+ date = tmpDate.Format(utils.FormatDate)
|
|
|
+ case "本年":
|
|
|
+ var tmpDate time.Time
|
|
|
+ switch appointDay {
|
|
|
+ case "第一天":
|
|
|
+ tmpDate = time.Date(currDate.Year(), 1, 1, 0, 0, 0, 0, currDate.Location())
|
|
|
+ case "最后一天":
|
|
|
+ tmpDate = time.Date(currDate.Year(), 12, 31, 0, 0, 0, 0, currDate.Location())
|
|
|
+ }
|
|
|
+ date = tmpDate.Format(utils.FormatDate)
|
|
|
+ default:
|
|
|
+ errMsg = "错误的日期频度:" + frequency
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|