|
@@ -293,7 +293,7 @@ func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate st
|
|
|
case 2: // 季节性图
|
|
|
if seasonExtraConfig != "" {
|
|
|
// 季节性图计算不管图上数据时间,拿所有数据
|
|
|
- _, tempEdbList, e := getEdbDataMapList(chartInfoId, chartType, calendar, "1990-01-01", "", mappingList, seasonExtraConfig)
|
|
|
+ _, tempEdbList, e := getEdbDataMapListForSeason(chartInfoId, chartType, calendar, "1990-01-01", "", mappingList, seasonExtraConfig)
|
|
|
if e != nil {
|
|
|
err = e
|
|
|
return
|
|
@@ -2294,6 +2294,7 @@ func SeasonChartData(dataList []*models.ChartEdbInfoMapping, seasonExtraConfig s
|
|
|
dataTimeList := make([]string, 0)
|
|
|
valueMap := make(map[time.Time]float64)
|
|
|
averageDataList := make([]*models.SamePeriodAverageData, 0)
|
|
|
+ dateNumMap := make(map[time.Time]float64)
|
|
|
for i := len(quarterDataList) - 1; i >= 0; i-- {
|
|
|
// 插值成日度
|
|
|
dataTimeList, _, err = HandleDataByLinearRegressionToList(quarterDataList[i].DataList, handleDataMap)
|
|
@@ -2322,19 +2323,26 @@ func SeasonChartData(dataList []*models.ChartEdbInfoMapping, seasonExtraConfig s
|
|
|
newDate := dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
|
|
|
// 处理均值
|
|
|
if value, ok := valueMap[newDate]; ok {
|
|
|
- valueMap[newDate] = (handleDataMap[date] + value) / 2
|
|
|
+ valueMap[newDate] = handleDataMap[date] + value
|
|
|
} else {
|
|
|
valueMap[newDate] = handleDataMap[date]
|
|
|
}
|
|
|
+ dateNumMap[newDate] += 1
|
|
|
|
|
|
dataTimeMap[newDate] = newDate
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ //year := float64(seasonConfig.SamePeriodAverage.Year)
|
|
|
for _, v := range dataTimeMap {
|
|
|
averageItem := &models.SamePeriodAverageData{}
|
|
|
+ year := dateNumMap[v]
|
|
|
if value, ok := valueMap[v]; ok {
|
|
|
- averageItem.Value = value
|
|
|
+ if year > 0 {
|
|
|
+ averageItem.Value = value / year
|
|
|
+ } else {
|
|
|
+ averageItem.Value = value
|
|
|
+ }
|
|
|
}
|
|
|
averageItem.DataTime = v.Format(utils.FormatDate)
|
|
|
averageItem.DataTimestamp = v.UnixNano() / 1e6
|
|
@@ -2464,3 +2472,292 @@ func SeasonChartData(dataList []*models.ChartEdbInfoMapping, seasonExtraConfig s
|
|
|
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+// getEdbDataMapListForSeason 获取指标最后的基础数据-插值补充好数据-季节性图用
|
|
|
+func getEdbDataMapListForSeason(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*models.ChartEdbInfoMapping, seasonExtraConfig string) (edbDataListMap map[int][]*models.EdbDataList, edbList []*models.ChartEdbInfoMapping, err error) {
|
|
|
+ // 指标对应的所有数据
|
|
|
+ edbDataListMap = make(map[int][]*models.EdbDataList)
|
|
|
+
|
|
|
+ for _, v := range mappingList {
|
|
|
+ //fmt.Println("v:", v.EdbInfoId)
|
|
|
+ item := new(models.ChartEdbInfoMapping)
|
|
|
+ item.EdbInfoId = v.EdbInfoId
|
|
|
+ item.SourceName = v.SourceName
|
|
|
+ item.Source = v.Source
|
|
|
+ item.EdbCode = v.EdbCode
|
|
|
+ item.EdbName = v.EdbName
|
|
|
+ item.EdbNameEn = v.EdbNameEn
|
|
|
+ item.Frequency = v.Frequency
|
|
|
+ item.EdbType = v.EdbType
|
|
|
+ item.FrequencyEn = GetFrequencyEn(v.Frequency)
|
|
|
+ if v.Unit != `无` {
|
|
|
+ item.Unit = v.Unit
|
|
|
+ }
|
|
|
+ item.UnitEn = v.UnitEn
|
|
|
+ item.StartDate = v.StartDate
|
|
|
+ item.EndDate = v.EndDate
|
|
|
+ item.ModifyTime = v.ModifyTime
|
|
|
+ item.EdbInfoCategoryType = v.EdbInfoCategoryType
|
|
|
+ item.PredictChartColor = v.PredictChartColor
|
|
|
+ item.ClassifyId = v.ClassifyId
|
|
|
+ if chartInfoId <= 0 {
|
|
|
+ item.IsAxis = 1
|
|
|
+ item.LeadValue = 0
|
|
|
+ item.LeadUnit = ""
|
|
|
+ item.ChartEdbMappingId = 0
|
|
|
+ item.ChartInfoId = 0
|
|
|
+ item.IsOrder = false
|
|
|
+ item.EdbInfoType = 1
|
|
|
+ item.ChartStyle = ""
|
|
|
+ item.ChartColor = ""
|
|
|
+ item.ChartWidth = 0
|
|
|
+ item.MaxData = v.MaxValue
|
|
|
+ item.MinData = v.MinValue
|
|
|
+ } else {
|
|
|
+ item.IsAxis = v.IsAxis
|
|
|
+ item.EdbInfoType = v.EdbInfoType
|
|
|
+ item.LeadValue = v.LeadValue
|
|
|
+ item.LeadUnit = v.LeadUnit
|
|
|
+ item.LeadUnitEn = GetLeadUnitEn(v.LeadUnit)
|
|
|
+ item.ChartEdbMappingId = v.ChartEdbMappingId
|
|
|
+ item.ChartInfoId = v.ChartInfoId
|
|
|
+ item.ChartStyle = v.ChartStyle
|
|
|
+ item.ChartColor = v.ChartColor
|
|
|
+ item.ChartWidth = v.ChartWidth
|
|
|
+ item.IsOrder = v.IsOrder
|
|
|
+ item.MaxData = v.MaxData
|
|
|
+ item.MinData = v.MinData
|
|
|
+ }
|
|
|
+ item.LatestValue = v.LatestValue
|
|
|
+ item.LatestDate = v.LatestDate
|
|
|
+ item.UniqueCode = v.UniqueCode
|
|
|
+ item.MoveLatestDate = v.LatestDate
|
|
|
+ item.EdbAliasName = v.EdbAliasName
|
|
|
+ item.IsConvert = v.IsConvert
|
|
|
+ item.ConvertType = v.ConvertType
|
|
|
+ item.ConvertValue = v.ConvertValue
|
|
|
+ item.ConvertUnit = v.ConvertUnit
|
|
|
+ item.ConvertEnUnit = v.ConvertEnUnit
|
|
|
+ item.IsJoinPermission = v.IsJoinPermission
|
|
|
+
|
|
|
+ var startDateReal string
|
|
|
+ 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
|
|
|
+ startDateParse, _ := time.Parse(utils.FormatDate, startDate)
|
|
|
+ switch v.LeadUnit {
|
|
|
+ case "天":
|
|
|
+ startTimeRealTemp = startDateParse.AddDate(0, 0, -v.LeadValue)
|
|
|
+ case "月":
|
|
|
+ startTimeRealTemp = startDateParse.AddDate(0, -v.LeadValue, 0)
|
|
|
+ case "季":
|
|
|
+ startTimeRealTemp = startDateParse.AddDate(0, -3*v.LeadValue, 0)
|
|
|
+ case "周":
|
|
|
+ startTimeRealTemp = startDateParse.AddDate(0, 0, -7*v.LeadValue)
|
|
|
+ case "年":
|
|
|
+ startTimeRealTemp = startDateParse.AddDate(-v.LeadValue, 0, 0)
|
|
|
+ }
|
|
|
+ if startTimeRealTemp.Before(startDateParse) {
|
|
|
+ startDateReal = startTimeRealTemp.Format(utils.FormatDate)
|
|
|
+ diffSeconds = (int64(startTimeRealTemp.UnixNano()) - int64(startDateParse.UnixNano())) / 1e6
|
|
|
+ } else {
|
|
|
+ startDateReal = startDate
|
|
|
+ diffSeconds = 0
|
|
|
+ }
|
|
|
+
|
|
|
+ // 预测指标的开始日期也要偏移
|
|
|
+ {
|
|
|
+ day, tmpErr := utils.GetDaysBetween2Date(utils.FormatDate, startDate, startDateReal)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ moveLatestDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, item.MoveLatestDate, time.Local)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ item.MoveLatestDate = moveLatestDateTime.AddDate(0, 0, day).Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ startDateReal = startDate
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //fmt.Println("line 1011 chart:", v.Source, v.EdbInfoId, startDateReal, endDate)
|
|
|
+ calendarPreYear := 0
|
|
|
+ if calendar == "农历" {
|
|
|
+ newStartDateReal, err := time.Parse(utils.FormatDate, startDateReal)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("time.Parse:" + err.Error())
|
|
|
+ }
|
|
|
+ calendarPreYear = newStartDateReal.Year() - 1
|
|
|
+ newStartDateReal = newStartDateReal.AddDate(-1, 0, 0)
|
|
|
+ startDateReal = newStartDateReal.Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ dataList := make([]*models.EdbDataList, 0)
|
|
|
+ //fmt.Println("chart:", v.Source, v.EdbInfoId, startDateReal, endDate)
|
|
|
+ //fmt.Println("calendarPreYear:", calendarPreYear)
|
|
|
+ //var newEdbInfo *data_manage.EdbInfo
|
|
|
+ switch v.EdbInfoCategoryType {
|
|
|
+ case 0:
|
|
|
+ dataList, err = models.GetEdbDataList(v.Source, v.SubSource, v.EdbInfoId, startDateReal, endDate)
|
|
|
+ case 1:
|
|
|
+ _, dataList, _, _, err, _ = GetPredictDataListByPredictEdbInfoId(v.EdbInfoId, startDateReal, endDate, true)
|
|
|
+ default:
|
|
|
+ err = errors.New(fmt.Sprint("获取失败,指标类型异常", v.EdbInfoCategoryType))
|
|
|
+ }
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ handleDataMap := make(map[string]float64)
|
|
|
+ newDataList, _, _, e := HandleDataByLinearRegressionToListV3(dataList, handleDataMap)
|
|
|
+ if e != nil {
|
|
|
+ err = e
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if v.IsConvert == 1 {
|
|
|
+ switch v.ConvertType {
|
|
|
+ case 1:
|
|
|
+ for i, data := range newDataList {
|
|
|
+ newDataList[i].Value = data.Value * v.ConvertValue
|
|
|
+ }
|
|
|
+ //item.MaxData = item.MaxData * v.ConvertValue
|
|
|
+ //item.MinData = item.MinData * v.ConvertValue
|
|
|
+ case 2:
|
|
|
+ for i, data := range newDataList {
|
|
|
+ newDataList[i].Value = data.Value / v.ConvertValue
|
|
|
+ }
|
|
|
+ //item.MaxData = item.MaxData / v.ConvertValue
|
|
|
+ //item.MinData = item.MinData / v.ConvertValue
|
|
|
+ case 3:
|
|
|
+ for i, data := range newDataList {
|
|
|
+ if data.Value <= 0 {
|
|
|
+ err = errors.New("数据中含有负数或0,无法对数运算")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ newDataList[i].Value = math.Log(data.Value) / math.Log(v.ConvertValue)
|
|
|
+ }
|
|
|
+ //item.MaxData = math.Log(item.MaxData) / math.Log(v.ConvertValue)
|
|
|
+ //item.MinData = math.Log(item.MinData) / math.Log(v.ConvertValue)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ edbDataListMap[v.EdbInfoId] = newDataList
|
|
|
+
|
|
|
+ if diffSeconds != 0 && v.EdbInfoType == 0 {
|
|
|
+ newDataListLen := len(newDataList)
|
|
|
+ for i := 0; i < newDataListLen; i++ {
|
|
|
+ newDataList[i].DataTimestamp = newDataList[i].DataTimestamp - diffSeconds
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if chartType == 2 && item.IsAxis == 1 {
|
|
|
+ latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
|
|
|
+ if tmpErr != nil {
|
|
|
+ //item.DataList = newDataList
|
|
|
+ item.IsNullData = true
|
|
|
+ edbList = append(edbList, item)
|
|
|
+ continue
|
|
|
+ err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + v.LatestDate))
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if calendar == "农历" {
|
|
|
+ if len(newDataList) <= 0 {
|
|
|
+ result := new(models.EdbDataResult)
|
|
|
+ item.DataList = result
|
|
|
+ } else {
|
|
|
+ result, tmpErr := models.AddCalculateQuarterV6(newDataList)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = errors.New("获取农历数据失败,Err:" + tmpErr.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ quarterDataList, tErr := GetSeasonEdbInfoDataListByXDateNong(result, latestDate, seasonExtraConfig, calendarPreYear)
|
|
|
+ if tErr != nil {
|
|
|
+ err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ item.DataList = quarterDataList
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+ quarterDataList, tErr := GetSeasonEdbInfoDataListByXDate(newDataList, latestDate, seasonExtraConfig)
|
|
|
+ if tErr != nil {
|
|
|
+ err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ item.DataList = quarterDataList
|
|
|
+ }
|
|
|
+
|
|
|
+ } else if chartType == 2 && item.IsAxis == 0 {
|
|
|
+ // 右轴数据处理
|
|
|
+ xStartDate := "01-01"
|
|
|
+
|
|
|
+ jumpYear := 0
|
|
|
+ var seasonExtra models.SeasonExtraItem
|
|
|
+ if seasonExtraConfig != "" {
|
|
|
+ err = json.Unmarshal([]byte(seasonExtraConfig), &seasonExtra)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if seasonExtra.XStartDate != "" {
|
|
|
+ xStartDate = seasonExtra.XStartDate
|
|
|
+ jumpYear = seasonExtra.JumpYear
|
|
|
+ }
|
|
|
+
|
|
|
+ length := len(newDataList)
|
|
|
+ if length == 0 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
|
|
|
+ if tmpErr != nil {
|
|
|
+ //item.DataList = newDataList
|
|
|
+ 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
|
|
|
+ }
|
|
|
+
|
|
|
+ newList := make([]*models.EdbDataList, 0)
|
|
|
+ for _, v := range newDataList {
|
|
|
+ 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) {
|
|
|
+ newList = append(newList, v)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ item.DataList = newList
|
|
|
+ } else if chartType == 7 || chartType == utils.CHART_TYPE_RADAR { //柱方图
|
|
|
+ //item.DataList = newDataList
|
|
|
+ } else {
|
|
|
+ item.DataList = newDataList
|
|
|
+ }
|
|
|
+ edbList = append(edbList, item)
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|