|
@@ -90,6 +90,7 @@ func GetChartEdbData(chartInfoId int, startDate, endDate string, edbInfoMapping,
|
|
|
var zlFutureGoodEdbInfo *future_good.FutureGoodEdbInfo
|
|
|
var latestDate string // 最新日期是这个
|
|
|
var regionType string // 交易所来源:“国内”,“海外”
|
|
|
+ var futureGoodEdbType int
|
|
|
{
|
|
|
// 寻找主力合约
|
|
|
zlFutureGoodEdbInfo, err = future_good.GetFutureGoodEdbInfo(futureGoodEdbInfoMapping.EdbInfoId)
|
|
@@ -97,6 +98,7 @@ func GetChartEdbData(chartInfoId int, startDate, endDate string, edbInfoMapping,
|
|
|
return
|
|
|
}
|
|
|
regionType = zlFutureGoodEdbInfo.RegionType
|
|
|
+ futureGoodEdbType = zlFutureGoodEdbInfo.FutureGoodEdbType
|
|
|
|
|
|
// 如果当前合约配置的 "画图时,日期来源的指标id" 并不是自己的话,那么就去查找对应配置的合约
|
|
|
if zlFutureGoodEdbInfo.DateSourceId != zlFutureGoodEdbInfo.FutureGoodEdbInfoId {
|
|
@@ -306,7 +308,7 @@ func GetChartEdbData(chartInfoId int, startDate, endDate string, edbInfoMapping,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- tmpXDataList, newYDataList, err := handleResultData(regionType, yDataList, futureGoodEdbInfoList, maxIndex)
|
|
|
+ tmpXDataList, newYDataList, err := handleResultData(regionType, futureGoodEdbType, yDataList, futureGoodEdbInfoList, maxIndex)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
@@ -316,191 +318,6 @@ func GetChartEdbData(chartInfoId int, startDate, endDate string, edbInfoMapping,
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-// BarChartData 柱方图的数据处理
|
|
|
-//func BarChartData(edbInfoMapping *models.ChartEdbInfoMapping, futureGoodMappingList []*models.ChartEdbInfoMapping, edbDataListMap map[int][]*models.EdbDataList, barChartInfoDateList []data_manage.BarChartInfoDateReq, barChartInfoSort data_manage.BarChartInfoSortReq) (edbIdList []int, yDataList []models.YData, err error) {
|
|
|
-// // 指标数据数组(10086:{"2022-12-02":100.01,"2022-12-01":102.3})
|
|
|
-// edbDataMap := make(map[int]map[string]float64)
|
|
|
-// for edbInfoId, edbDataList := range edbDataListMap {
|
|
|
-// edbDateData := make(map[string]float64)
|
|
|
-// for _, edbData := range edbDataList {
|
|
|
-// edbDateData[edbData.DataTime] = edbData.Value
|
|
|
-// }
|
|
|
-// edbDataMap[edbInfoId] = edbDateData
|
|
|
-// }
|
|
|
-//
|
|
|
-// // edbIdList 指标展示顺序;x轴的指标顺序
|
|
|
-// edbIdList = make([]int, 0)
|
|
|
-// edbIdList = append(edbIdList, edbInfoMapping.EdbInfoId)
|
|
|
-// if barChartInfoSort.Sort == 0 {
|
|
|
-// for _, v := range futureGoodMappingList {
|
|
|
-// edbIdList = append(edbIdList, v.EdbInfoId)
|
|
|
-// }
|
|
|
-// }
|
|
|
-//
|
|
|
-// //固定取螺纹期货主力合约的时间序列,最新值为该合约最新日期、N天前为该合约最新日期N天前
|
|
|
-// rbzlInfo, err := future_good.GetFutureGoodEdbInfoByCode("RBZL.SHF")
|
|
|
-// if err != nil {
|
|
|
-// return
|
|
|
-// }
|
|
|
-// latestDate := rbzlInfo.EndDate // 最新日期是这个
|
|
|
-// if rbzlInfo.EndDate == `0000-00-00` {
|
|
|
-// err = errors.New("日期异常")
|
|
|
-// return
|
|
|
-// }
|
|
|
-// latestDateTime, _ := time.ParseInLocation(utils.FormatDate, latestDate, time.Local)
|
|
|
-//
|
|
|
-// yDataList = make([]models.YData, 0) //y轴的数据列表
|
|
|
-//
|
|
|
-// for _, barChartInfoDate := range barChartInfoDateList {
|
|
|
-// var maxDate time.Time
|
|
|
-// var findDateTime time.Time
|
|
|
-// switch barChartInfoDate.Type {
|
|
|
-// case 1: //最新值
|
|
|
-// findDateTime = latestDateTime
|
|
|
-// case 2: //近期几天
|
|
|
-// findDateTime = latestDateTime.AddDate(0, 0, -barChartInfoDate.Value)
|
|
|
-// case 3: // 固定日期
|
|
|
-// //寻找固定日期的数据
|
|
|
-// tmpFindDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, barChartInfoDate.Date, time.Local)
|
|
|
-// if tmpErr != nil {
|
|
|
-// err = tmpErr
|
|
|
-// return
|
|
|
-// }
|
|
|
-// findDateTime = tmpFindDateTime
|
|
|
-// default:
|
|
|
-// err = errors.New(fmt.Sprint("日期类型异常,Type:", barChartInfoDate.Type))
|
|
|
-// return
|
|
|
-// }
|
|
|
-// if findDateTime.IsZero() {
|
|
|
-// err = errors.New("错误的日期")
|
|
|
-// return
|
|
|
-// }
|
|
|
-//
|
|
|
-// findDataList := make([]float64, 0) // 当前日期的数据值
|
|
|
-// noDataIdList := make([]int, 0) // 没有数据的指标id
|
|
|
-// noDataIdMap := make(map[int]int, 0) // 没有数据的指标map
|
|
|
-// xEdbInfoIdList := make([]int, 0) // 当前数据的指标id列表
|
|
|
-//
|
|
|
-// // 现货指标
|
|
|
-// realDateTime, findDataValue, isFind, tmpErr := GetNeedDateData(findDateTime, edbDataListMap[edbInfoMapping.EdbInfoId], edbDataMap[edbInfoMapping.EdbInfoId])
|
|
|
-// if tmpErr != nil {
|
|
|
-// err = tmpErr
|
|
|
-// return
|
|
|
-// }
|
|
|
-// findDataList = append(findDataList, findDataValue)
|
|
|
-// if isFind {
|
|
|
-// maxDate = realDateTime
|
|
|
-// } else {
|
|
|
-// noDataIdList = append(noDataIdList, edbInfoMapping.EdbInfoId)
|
|
|
-// noDataIdMap[edbInfoMapping.EdbInfoId] = edbInfoMapping.EdbInfoId
|
|
|
-// }
|
|
|
-// currMonth := findDateTime.Month() // 当前月份
|
|
|
-// xEdbInfoIdList = append(xEdbInfoIdList, edbInfoMapping.EdbInfoId)
|
|
|
-//
|
|
|
-// // 当前月的后面月份合约的数据
|
|
|
-// for i := currMonth; i < 12; i++ {
|
|
|
-// futureGoodMapping := futureGoodMappingList[i] // 当前的期货指标
|
|
|
-// tmpRealDateTime, tmpFindDataValue, tmpIsFind, tmpErr := GetNeedDateData(findDateTime, edbDataListMap[futureGoodMapping.EdbInfoId], edbDataMap[futureGoodMapping.EdbInfoId])
|
|
|
-// if tmpErr != nil {
|
|
|
-// err = tmpErr
|
|
|
-// return
|
|
|
-// }
|
|
|
-// findDataList = append(findDataList, tmpFindDataValue)
|
|
|
-// if tmpIsFind {
|
|
|
-// if maxDate.IsZero() || maxDate.Before(tmpRealDateTime) {
|
|
|
-// maxDate = tmpRealDateTime
|
|
|
-// }
|
|
|
-// } else {
|
|
|
-// noDataIdList = append(noDataIdList, futureGoodMapping.EdbInfoId)
|
|
|
-// noDataIdMap[futureGoodMapping.EdbInfoId] = futureGoodMapping.EdbInfoId
|
|
|
-// }
|
|
|
-// // 当前期货合约的指标
|
|
|
-// xEdbInfoIdList = append(xEdbInfoIdList, futureGoodMapping.EdbInfoId)
|
|
|
-// }
|
|
|
-//
|
|
|
-// // 当前月的前面月份合约的数据
|
|
|
-// for i := 1; i < int(currMonth); i++ {
|
|
|
-// futureGoodMapping := futureGoodMappingList[i-1] // 当前的期货指标
|
|
|
-// tmpRealDateTime, tmpFindDataValue, tmpIsFind, tmpErr := GetNeedDateData(findDateTime, edbDataListMap[futureGoodMapping.EdbInfoId], edbDataMap[futureGoodMapping.EdbInfoId])
|
|
|
-// if tmpErr != nil {
|
|
|
-// err = tmpErr
|
|
|
-// return
|
|
|
-// }
|
|
|
-// findDataList = append(findDataList, tmpFindDataValue)
|
|
|
-// if tmpIsFind {
|
|
|
-// if maxDate.IsZero() || maxDate.Before(tmpRealDateTime) {
|
|
|
-// maxDate = tmpRealDateTime
|
|
|
-// }
|
|
|
-// } else {
|
|
|
-// noDataIdList = append(noDataIdList, futureGoodMapping.EdbInfoId)
|
|
|
-// noDataIdMap[futureGoodMapping.EdbInfoId] = futureGoodMapping.EdbInfoId
|
|
|
-// }
|
|
|
-// // 当前期货合约的指标
|
|
|
-// xEdbInfoIdList = append(xEdbInfoIdList, futureGoodMapping.EdbInfoId)
|
|
|
-// }
|
|
|
-//
|
|
|
-// yName := barChartInfoDate.Name
|
|
|
-// yNameEn := barChartInfoDate.Name
|
|
|
-// if yName == `` {
|
|
|
-// if barChartInfoDate.Type == 2 {
|
|
|
-// yName = strconv.Itoa(barChartInfoDate.Value) + "天前"
|
|
|
-// if barChartInfoDate.Value == 1 {
|
|
|
-// yNameEn = strconv.Itoa(barChartInfoDate.Value) + "day ago"
|
|
|
-// } else {
|
|
|
-// yNameEn = strconv.Itoa(barChartInfoDate.Value) + " days ago"
|
|
|
-// }
|
|
|
-// } else {
|
|
|
-// yName = maxDate.Format(utils.FormatDate)
|
|
|
-// yNameEn = maxDate.Format(utils.FormatDate)
|
|
|
-// }
|
|
|
-// }
|
|
|
-// yDate := "0000-00-00"
|
|
|
-// if !maxDate.IsZero() {
|
|
|
-// yDate = maxDate.Format(utils.FormatDate)
|
|
|
-// }
|
|
|
-//
|
|
|
-// // 数据处理,将没有数据的下标,赋值平均值
|
|
|
-// {
|
|
|
-// hasDataIndexList := make([]int, 0)
|
|
|
-// for dataK, edbInfoId := range xEdbInfoIdList {
|
|
|
-// if _, ok := noDataIdMap[edbInfoId]; !ok { // 如果是没有数据的指标id
|
|
|
-// hasDataIndexList = append(hasDataIndexList, dataK)
|
|
|
-// }
|
|
|
-// }
|
|
|
-// lenHasDataIndex := len(hasDataIndexList)
|
|
|
-// if lenHasDataIndex > 0 {
|
|
|
-// for lenHasDataI := 1; lenHasDataI < lenHasDataIndex; lenHasDataI++ {
|
|
|
-// perK := hasDataIndexList[lenHasDataI-1] //上一个有数据的指标下标
|
|
|
-// currK := hasDataIndexList[lenHasDataI] //当前有数据的指标下标
|
|
|
-// preVal := findDataList[perK] //上一个有数据的坐标的值
|
|
|
-// currVal := findDataList[currK] //当前有数据的指标的值
|
|
|
-//
|
|
|
-// // 环差值
|
|
|
-// hcValDeci := decimal.NewFromFloat(currVal).Sub(decimal.NewFromFloat(preVal)).Div(decimal.NewFromInt(int64(currK - perK)))
|
|
|
-// var tmpI int64
|
|
|
-// // 将两个中间的数据做平均值补全
|
|
|
-// for hcI := perK + 1; hcI < currK; hcI++ {
|
|
|
-// tmpI++
|
|
|
-// findDataList[hcI], _ = decimal.NewFromFloat(preVal).Add(hcValDeci.Mul(decimal.NewFromInt(tmpI))).RoundCeil(4).Float64()
|
|
|
-// }
|
|
|
-// }
|
|
|
-// }
|
|
|
-// }
|
|
|
-//
|
|
|
-// yDataList = append(yDataList, models.YData{
|
|
|
-// Date: yDate,
|
|
|
-// Value: findDataList,
|
|
|
-// NoDataEdbList: noDataIdList,
|
|
|
-// XEdbInfoIdList: xEdbInfoIdList,
|
|
|
-// Color: barChartInfoDate.Color,
|
|
|
-// Name: yName,
|
|
|
-// NameEn: yNameEn,
|
|
|
-// })
|
|
|
-// }
|
|
|
-//
|
|
|
-// return
|
|
|
-//}
|
|
|
-
|
|
|
// BarChartData 柱方图的数据处理
|
|
|
func BarChartData(edbInfoMapping *models.ChartEdbInfoMapping, futureGoodMappingList []*future_good.FutureGoodEdbInfo, edbDataListMap map[int][]*models.EdbDataList, barChartInfoDateList []data_manage.BarChartInfoDateReq, regionType, latestDate string) (edbIdList []int, yDataList []models.YData, err error) {
|
|
|
// 指标数据数组(10086:{"2022-12-02":100.01,"2022-12-01":102.3})
|
|
@@ -586,9 +403,17 @@ func BarChartData(edbInfoMapping *models.ChartEdbInfoMapping, futureGoodMappingL
|
|
|
}
|
|
|
} else {
|
|
|
for i, v := range futureGoodMappingList {
|
|
|
- if v.Year > currYear || (v.Year == currYear && v.Month > int(currMonth)) {
|
|
|
+ if v.FutureGoodEdbType == 2 {
|
|
|
+ if i == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
indexList = append(indexList, i)
|
|
|
- mList = append(mList, (v.Year-currYear)*12+v.Month-int(currMonth))
|
|
|
+ mList = append(mList, v.Month)
|
|
|
+ } else {
|
|
|
+ if v.Year > currYear || (v.Year == currYear && v.Month > int(currMonth)) {
|
|
|
+ indexList = append(indexList, i)
|
|
|
+ mList = append(mList, (v.Year-currYear)*12+v.Month-int(currMonth))
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -760,7 +585,7 @@ func FutureGoodChartInfoRefresh(chartInfoId int) (err error) {
|
|
|
}
|
|
|
|
|
|
// handleResultData 处理成最终的结果数据
|
|
|
-func handleResultData(regionType string, yDataList []models.YData, futureGoodEdbInfoList []*future_good.FutureGoodEdbInfo, maxIndex int) (xDataList []models.XData, newYDataList []models.YData, err error) {
|
|
|
+func handleResultData(regionType string, futureGoodEdbType int, yDataList []models.YData, futureGoodEdbInfoList []*future_good.FutureGoodEdbInfo, maxIndex int) (xDataList []models.XData, newYDataList []models.YData, err error) {
|
|
|
xDataList = make([]models.XData, 0)
|
|
|
newYDataList = yDataList
|
|
|
|
|
@@ -782,6 +607,89 @@ func handleResultData(regionType string, yDataList []models.YData, futureGoodEdb
|
|
|
futureGoodEdbInfoMap[v.FutureGoodEdbInfoId] = v
|
|
|
}
|
|
|
|
|
|
+ if futureGoodEdbType == 2 { // FutureGoodEdbType int `description:"指标类型,1:年月是固定的合约;2:只有M+N期的合约,未固定年月"`
|
|
|
+ nList := []int{3, 15, 27}
|
|
|
+ for _, i := range nList {
|
|
|
+ xDataList = append(xDataList, models.XData{
|
|
|
+ Name: fmt.Sprint("M+", i),
|
|
|
+ NameEn: fmt.Sprint("M+", i),
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ for yIndex, yData := range yDataList {
|
|
|
+ newYDataList[yIndex].XEdbInfoIdList = []int{}
|
|
|
+ newYDataList[yIndex].Value = []float64{}
|
|
|
+ tmpNList := nList
|
|
|
+
|
|
|
+ //当前的主力合约
|
|
|
+ newYDataList[yIndex].XEdbInfoIdList = append(newYDataList[yIndex].XEdbInfoIdList, yData.XEdbInfoIdList[0])
|
|
|
+ newYDataList[yIndex].Value = append(newYDataList[yIndex].Value, yData.Value[0])
|
|
|
+
|
|
|
+ xEdbInfoIdList := yData.XEdbInfoIdList[1:]
|
|
|
+ valIndex := 1
|
|
|
+ needNum := 0
|
|
|
+ for _, n := range tmpNList {
|
|
|
+ if len(xEdbInfoIdList) > 0 {
|
|
|
+ edbInfoId := xEdbInfoIdList[0]
|
|
|
+ futureGoodEdbInfo, ok := futureGoodEdbInfoMap[edbInfoId]
|
|
|
+ if !ok {
|
|
|
+ err = errors.New("找不到指标")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 当前距离最早的日期相差的N数
|
|
|
+ if futureGoodEdbInfo.Month == n {
|
|
|
+ if needNum > 0 {
|
|
|
+ currVal := yData.Value[valIndex]
|
|
|
+ preVal := yData.Value[valIndex-1]
|
|
|
+ hcValDeci := decimal.NewFromFloat(currVal).Sub(decimal.NewFromFloat(preVal)).Div(decimal.NewFromInt(int64(needNum + 1)))
|
|
|
+
|
|
|
+ for tmpNum := 0; tmpNum < needNum; tmpNum++ {
|
|
|
+ newYDataList[yIndex].XEdbInfoIdList = append(newYDataList[yIndex].XEdbInfoIdList, 0)
|
|
|
+
|
|
|
+ // 赋值平均值
|
|
|
+ tmpVal, _ := decimal.NewFromFloat(preVal).Add(hcValDeci.Mul(decimal.NewFromInt(int64(tmpNum + 1)))).RoundCeil(4).Float64()
|
|
|
+ newYDataList[yIndex].Value = append(newYDataList[yIndex].Value, tmpVal)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ newYDataList[yIndex].XEdbInfoIdList = append(newYDataList[yIndex].XEdbInfoIdList, edbInfoId)
|
|
|
+ newYDataList[yIndex].Value = append(newYDataList[yIndex].Value, yData.Value[valIndex])
|
|
|
+ valIndex++
|
|
|
+ needNum = 0
|
|
|
+ if len(xEdbInfoIdList) > 0 {
|
|
|
+ xEdbInfoIdList = xEdbInfoIdList[1:]
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ needNum++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ maxI := 0
|
|
|
+ for _, yData := range newYDataList {
|
|
|
+ lenEdb := len(yData.XEdbInfoIdList)
|
|
|
+ for i := 0; i < lenEdb; i++ {
|
|
|
+ if yData.XEdbInfoIdList[i] != 0 && !utils.InArrayByInt(yData.NoDataEdbList, yData.XEdbInfoIdList[i]) {
|
|
|
+ if maxI < i {
|
|
|
+ maxI = i
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ xDataList = xDataList[0:maxI]
|
|
|
+ for yIndex, yData := range newYDataList {
|
|
|
+ if len(yData.XEdbInfoIdList) > maxI+1 {
|
|
|
+ newYDataList[yIndex].XEdbInfoIdList = yData.XEdbInfoIdList[0 : maxI+1]
|
|
|
+ }
|
|
|
+ if len(yData.Value) > maxI+1 {
|
|
|
+ newYDataList[yIndex].Value = yData.Value[0 : maxI+1]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
nMap := make(map[int]int)
|
|
|
|
|
|
for _, v := range yDataList {
|
|
@@ -942,13 +850,13 @@ func getFutureGoodEdbInfoList(latestDateTime time.Time, tmpFutureGoodEdbInfoList
|
|
|
//海外的连续日期,目前
|
|
|
if v.FutureGoodEdbType == 2 {
|
|
|
if v.Month <= maxM {
|
|
|
- addMonth := int(earliestDateTime.Month()) + v.Month
|
|
|
- v.Year = earliestDateTime.Year() + addMonth/12
|
|
|
- realMonth := addMonth % 12
|
|
|
- if realMonth == 0 {
|
|
|
- realMonth = 12
|
|
|
- }
|
|
|
- v.Month = realMonth
|
|
|
+ //addMonth := int(earliestDateTime.Month()) + v.Month
|
|
|
+ //v.Year = earliestDateTime.Year() + addMonth/12
|
|
|
+ //realMonth := addMonth % 12
|
|
|
+ //if realMonth == 0 {
|
|
|
+ // realMonth = 12
|
|
|
+ //}
|
|
|
+ //v.Month = realMonth
|
|
|
futureGoodEdbInfoList = append(futureGoodEdbInfoList, v)
|
|
|
}
|
|
|
continue
|