123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981 |
- package future_good
- import (
- "errors"
- "eta/eta_mobile/models/data_manage"
- future_good2 "eta/eta_mobile/models/data_manage/future_good"
- "eta/eta_mobile/services/alarm_msg"
- "eta/eta_mobile/services/data"
- "eta/eta_mobile/utils"
- "fmt"
- "github.com/shopspring/decimal"
- "sort"
- "strconv"
- "time"
- )
- func GetChartEdbData(chartInfoId int, startDate, endDate string, edbInfoMapping, futureGoodEdbInfoMapping *data_manage.ChartEdbInfoMapping, barChartInfoDateList []data_manage.BarChartInfoDateReq, needData bool) (barConfigEdbInfoIdList []data_manage.BarChartInfoEdbItemReq, edbList []*data_manage.ChartEdbInfoMapping, xEdbIdValue []int, xDataList []data_manage.XData, yDataList []data_manage.YData, err error) {
- edbList = make([]*data_manage.ChartEdbInfoMapping, 0)
- if futureGoodEdbInfoMapping == nil {
- err = errors.New("商品指标未选取")
- return
- }
- if edbInfoMapping == nil {
- err = errors.New("ETA指标未选取")
- return
- }
-
- edbDataListMap := make(map[int][]*data_manage.EdbDataList)
- item := new(data_manage.ChartEdbInfoMapping)
- edbInfoMapping.FrequencyEn = data.GetFrequencyEn(edbInfoMapping.Frequency)
- if edbInfoMapping.Unit == `无` {
- edbInfoMapping.Unit = ``
- }
- if futureGoodEdbInfoMapping.Unit == `无` {
- futureGoodEdbInfoMapping.Unit = ``
- }
- if chartInfoId <= 0 {
- edbInfoMapping.IsAxis = 1
- edbInfoMapping.LeadValue = 0
- edbInfoMapping.LeadUnit = ""
- edbInfoMapping.ChartEdbMappingId = 0
- edbInfoMapping.ChartInfoId = 0
- edbInfoMapping.IsOrder = false
- edbInfoMapping.EdbInfoType = 1
- edbInfoMapping.ChartStyle = ""
- edbInfoMapping.ChartColor = ""
- edbInfoMapping.ChartWidth = 0
- futureGoodEdbInfoMapping.IsAxis = 1
- futureGoodEdbInfoMapping.LeadValue = 0
- futureGoodEdbInfoMapping.LeadUnit = ""
- futureGoodEdbInfoMapping.ChartEdbMappingId = 0
- futureGoodEdbInfoMapping.ChartInfoId = 0
- futureGoodEdbInfoMapping.IsOrder = false
- futureGoodEdbInfoMapping.EdbInfoType = 1
- futureGoodEdbInfoMapping.ChartStyle = ""
- futureGoodEdbInfoMapping.ChartColor = ""
- futureGoodEdbInfoMapping.ChartWidth = 0
- } else {
- edbInfoMapping.LeadUnitEn = data.GetLeadUnitEn(edbInfoMapping.LeadUnit)
- futureGoodEdbInfoMapping.LeadUnitEn = data.GetLeadUnitEn(futureGoodEdbInfoMapping.LeadUnit)
- }
-
- {
- edbList = append(edbList, edbInfoMapping)
- barConfigEdbInfoIdList = append(barConfigEdbInfoIdList, data_manage.BarChartInfoEdbItemReq{
- EdbInfoId: edbInfoMapping.EdbInfoId,
-
- Name: "现货价",
- NameEn: "Spot Price",
- Source: edbInfoMapping.Source,
- })
- }
-
- var zlFutureGoodEdbInfo *future_good2.FutureGoodEdbInfo
- var latestDate string
- var regionType string
- var futureGoodEdbType int
- {
-
- zlFutureGoodEdbInfo, err = future_good2.GetFutureGoodEdbInfo(futureGoodEdbInfoMapping.EdbInfoId)
- if err != nil {
- return
- }
- regionType = zlFutureGoodEdbInfo.RegionType
- futureGoodEdbType = zlFutureGoodEdbInfo.FutureGoodEdbType
-
- if zlFutureGoodEdbInfo.DateSourceId != zlFutureGoodEdbInfo.FutureGoodEdbInfoId {
- sourceDateFutureGoodEdbInfo, tmpErr := future_good2.GetFutureGoodEdbInfo(zlFutureGoodEdbInfo.DateSourceId)
- if tmpErr != nil {
- err = tmpErr
- return
- }
- latestDate = sourceDateFutureGoodEdbInfo.EndDate
- } else {
- latestDate = zlFutureGoodEdbInfo.EndDate
- }
- if latestDate == `0000-00-00` {
- err = errors.New("日期异常")
- return
- }
- }
-
- tmpFutureGoodEdbInfoList, err := future_good2.GetFutureGoodEdbInfoListByParentId(futureGoodEdbInfoMapping.EdbInfoId)
- if err != nil {
- return
- }
- latestDateTime, _ := time.ParseInLocation(utils.FormatDate, latestDate, time.Local)
- _, futureGoodEdbInfoList, err := getFutureGoodEdbInfoList(latestDateTime, tmpFutureGoodEdbInfoList, barChartInfoDateList)
- if err != nil {
- return
- }
- futureGoodMappingList := make([]*data_manage.ChartEdbInfoMapping, 0)
- for k, v := range futureGoodEdbInfoList {
- newMappingInfo := &data_manage.ChartEdbInfoMapping{
- EdbInfoId: v.FutureGoodEdbInfoId,
- SourceName: v.Exchange,
- Source: 0,
- EdbCode: v.FutureGoodEdbCode,
- EdbName: v.FutureGoodEdbName,
- EdbAliasName: v.FutureGoodEdbName,
- EdbNameEn: v.FutureGoodEdbNameEn,
- EdbType: edbInfoMapping.EdbType,
- Frequency: edbInfoMapping.Frequency,
- FrequencyEn: edbInfoMapping.FrequencyEn,
- Unit: edbInfoMapping.Unit,
- UnitEn: edbInfoMapping.UnitEn,
- StartDate: v.StartDate,
- EndDate: v.EndDate,
- ModifyTime: v.ModifyTime.Format(utils.FormatDateTime),
- ChartEdbMappingId: v.FutureGoodEdbInfoId,
- ChartInfoId: edbInfoMapping.ChartInfoId,
- MaxData: v.MaxValue,
- MinData: v.MinValue,
- IsOrder: edbInfoMapping.IsOrder,
- IsAxis: edbInfoMapping.IsAxis,
- EdbInfoType: edbInfoMapping.EdbInfoType,
- EdbInfoCategoryType: edbInfoMapping.EdbInfoCategoryType,
- LeadValue: edbInfoMapping.LeadValue,
- LeadUnit: edbInfoMapping.LeadUnit,
- LeadUnitEn: edbInfoMapping.LeadUnitEn,
- ChartStyle: edbInfoMapping.ChartStyle,
- ChartColor: edbInfoMapping.ChartColor,
- PredictChartColor: edbInfoMapping.PredictChartColor,
- ChartWidth: edbInfoMapping.ChartWidth,
- ChartType: edbInfoMapping.ChartType,
- LatestDate: v.LatestDate.Format(utils.FormatDateTime),
- LatestValue: v.LatestValue,
- UniqueCode: futureGoodEdbInfoMapping.UniqueCode + strconv.Itoa(k),
- MinValue: v.MinValue,
- MaxValue: v.MaxValue,
- DataList: nil,
- IsNullData: false,
- }
- futureGoodMappingList = append(futureGoodMappingList, newMappingInfo)
- barConfigEdbInfoIdList = append(barConfigEdbInfoIdList, data_manage.BarChartInfoEdbItemReq{
- EdbInfoId: newMappingInfo.EdbInfoId,
- Name: fmt.Sprint("M+", v.Month),
- NameEn: fmt.Sprint("M+", v.Month),
- Source: newMappingInfo.Source,
- })
- }
- if regionType == `海外` {
- zlFutureGoodEdbMapping := &data_manage.ChartEdbInfoMapping{
- EdbInfoId: zlFutureGoodEdbInfo.FutureGoodEdbInfoId,
- SourceName: zlFutureGoodEdbInfo.Exchange,
- Source: 0,
- EdbCode: zlFutureGoodEdbInfo.FutureGoodEdbCode,
- EdbName: zlFutureGoodEdbInfo.FutureGoodEdbName,
- EdbAliasName: zlFutureGoodEdbInfo.FutureGoodEdbName,
- EdbNameEn: zlFutureGoodEdbInfo.FutureGoodEdbNameEn,
- EdbType: edbInfoMapping.EdbType,
- Frequency: edbInfoMapping.Frequency,
- FrequencyEn: edbInfoMapping.FrequencyEn,
- Unit: edbInfoMapping.Unit,
- UnitEn: edbInfoMapping.UnitEn,
- StartDate: zlFutureGoodEdbInfo.StartDate,
- EndDate: zlFutureGoodEdbInfo.EndDate,
- ModifyTime: zlFutureGoodEdbInfo.ModifyTime.Format(utils.FormatDateTime),
- ChartEdbMappingId: zlFutureGoodEdbInfo.FutureGoodEdbInfoId,
- ChartInfoId: edbInfoMapping.ChartInfoId,
- MaxData: zlFutureGoodEdbInfo.MaxValue,
- MinData: zlFutureGoodEdbInfo.MinValue,
- IsOrder: edbInfoMapping.IsOrder,
- IsAxis: edbInfoMapping.IsAxis,
- EdbInfoType: edbInfoMapping.EdbInfoType,
- EdbInfoCategoryType: edbInfoMapping.EdbInfoCategoryType,
- LeadValue: edbInfoMapping.LeadValue,
- LeadUnit: edbInfoMapping.LeadUnit,
- LeadUnitEn: edbInfoMapping.LeadUnitEn,
- ChartStyle: edbInfoMapping.ChartStyle,
- ChartColor: edbInfoMapping.ChartColor,
- PredictChartColor: edbInfoMapping.PredictChartColor,
- ChartWidth: edbInfoMapping.ChartWidth,
- ChartType: edbInfoMapping.ChartType,
- LatestDate: zlFutureGoodEdbInfo.LatestDate.Format(utils.FormatDateTime),
- LatestValue: zlFutureGoodEdbInfo.LatestValue,
- UniqueCode: futureGoodEdbInfoMapping.UniqueCode + strconv.Itoa(0),
- MinValue: zlFutureGoodEdbInfo.MinValue,
- MaxValue: zlFutureGoodEdbInfo.MaxValue,
- DataList: nil,
- IsNullData: false,
- }
- edbList = append(edbList, zlFutureGoodEdbMapping)
- edbList = append(edbList, futureGoodMappingList...)
- } else {
- edbList = append(edbList, futureGoodMappingList...)
- }
- if !needData {
- return
- }
-
-
- {
- dataList := make([]*data_manage.EdbDataList, 0)
- dataList, err = data_manage.GetEdbDataList(edbInfoMapping.Source, edbInfoMapping.SubSource, edbInfoMapping.EdbInfoId, startDate, endDate)
- if err != nil {
- return
- }
- edbDataListMap[edbInfoMapping.EdbInfoId] = dataList
- item.DataList = dataList
- }
-
- for _, v := range futureGoodMappingList {
- dataList := make([]*data_manage.EdbDataList, 0)
- tmpDataList, tmpErr := future_good2.GetFutureGoodEdbDataListByDate(v.EdbInfoId, startDate, endDate)
- if tmpErr != nil {
- return
- }
- for _, tmpData := range tmpDataList {
- dataList = append(dataList, &data_manage.EdbDataList{
- EdbDataId: tmpData.FutureGoodEdbDataId,
- EdbInfoId: tmpData.FutureGoodEdbInfoId,
- DataTime: tmpData.DataTime.Format(utils.FormatDate),
- DataTimestamp: tmpData.DataTimestamp,
- Value: tmpData.Close,
- })
- }
- edbDataListMap[v.EdbInfoId] = dataList
- v.DataList = dataList
- }
- xEdbIdValue, yDataList, err = BarChartData(edbList[0], futureGoodEdbInfoList, edbDataListMap, barChartInfoDateList, regionType, edbInfoMapping.EndDate)
- xDataList = []data_manage.XData{
- {
- Name: "现货价",
- NameEn: "Spot Price",
- },
- }
-
-
-
-
-
-
-
-
-
-
- futureGoodEdbInfoIndexMap := make(map[int]int)
- for index, v := range futureGoodEdbInfoList {
- futureGoodEdbInfoIndexMap[v.FutureGoodEdbInfoId] = index
- }
- nMap := make(map[int]int)
- maxIndex := 0
- for k, tmpYData := range yDataList {
- yDataMap := tmpYData.EdbValMap
- edbInfoIdList := make([]int, 0)
- noDataEdbInfoIdList := make([]int, 0)
- valueList := make([]float64, 0)
- noDataEdbIdMap := make(map[int]int)
-
- for _, n := range tmpYData.M {
- nMap[n] = n
- }
-
- {
- baseEdbInfId := edbList[0].EdbInfoId
- edbInfoIdList = append(edbInfoIdList, baseEdbInfId)
- tmpVal, ok := yDataMap[baseEdbInfId]
- valueList = append(valueList, tmpVal)
- if !ok || tmpVal == 0 {
- noDataEdbInfoIdList = append(noDataEdbInfoIdList, baseEdbInfId)
- noDataEdbIdMap[baseEdbInfId] = baseEdbInfId
- }
- }
- for _, futureGoodEdbInfo := range futureGoodEdbInfoList {
- tmpEdbInfId := futureGoodEdbInfo.FutureGoodEdbInfoId
- edbInfoIdList = append(edbInfoIdList, tmpEdbInfId)
- tmpVal, ok := yDataMap[tmpEdbInfId]
- valueList = append(valueList, tmpVal)
- if !ok || tmpVal == 0 {
- noDataEdbInfoIdList = append(noDataEdbInfoIdList, tmpEdbInfId)
- noDataEdbIdMap[tmpEdbInfId] = tmpEdbInfId
- }
- }
-
- tmpYData.NoDataEdbList = noDataEdbInfoIdList
- yDataList[k] = tmpYData
- lenEdbId := len(edbInfoIdList)
- tmpMaxIndex := lenEdbId - 1
- for i := lenEdbId - 1; i >= 0; i-- {
-
- if _, ok := noDataEdbIdMap[edbInfoIdList[i]]; !ok {
-
- if maxIndex < i-1 {
- maxIndex = i - 1
- }
- break
- }
- tmpMaxIndex = i - 1
- }
-
- if maxIndex < tmpMaxIndex {
- maxIndex = tmpMaxIndex
- }
- }
-
-
- nList := make([]int, 0)
- for _, n := range nMap {
- nList = append(nList, n)
- }
- sort.Slice(nList, func(i, j int) bool {
- return nList[i] < nList[j]
- })
- for k, v := range yDataList {
- if len(v.XEdbInfoIdList) >= maxIndex+1 {
- yDataList[k].XEdbInfoIdList = v.XEdbInfoIdList[0 : maxIndex+1]
- }
- if len(v.Value) >= maxIndex+1 {
- yDataList[k].Value = v.Value[0 : maxIndex+1]
- }
- }
- tmpXDataList, newYDataList, err := handleResultData(regionType, futureGoodEdbType, yDataList, futureGoodEdbInfoList, maxIndex)
- if err != nil {
- return
- }
- xDataList = append(xDataList, tmpXDataList...)
- yDataList = newYDataList
- return
- }
- func BarChartData(edbInfoMapping *data_manage.ChartEdbInfoMapping, futureGoodMappingList []*future_good2.FutureGoodEdbInfo, edbDataListMap map[int][]*data_manage.EdbDataList, barChartInfoDateList []data_manage.BarChartInfoDateReq, regionType, latestDate string) (edbIdList []int, yDataList []data_manage.YData, err error) {
-
-
- baseEdbDataMap := make(map[string]float64)
- for edbInfoId, edbDataList := range edbDataListMap {
- if edbInfoId == edbInfoMapping.EdbInfoId {
- for _, edbData := range edbDataList {
- baseEdbDataMap[edbData.DataTime] = edbData.Value
- }
- }
- }
-
- futureGoodEdbDataMap := make(map[int]map[string]float64)
- for edbInfoId, edbDataList := range edbDataListMap {
- if edbInfoId == edbInfoMapping.EdbInfoId {
- continue
- }
- edbDateData := make(map[string]float64)
- for _, edbData := range edbDataList {
- edbDateData[edbData.DataTime] = edbData.Value
- }
- futureGoodEdbDataMap[edbInfoId] = edbDateData
- }
-
- edbIdList = make([]int, 0)
- edbIdList = append(edbIdList, edbInfoMapping.EdbInfoId)
- for _, v := range futureGoodMappingList {
- edbIdList = append(edbIdList, v.FutureGoodEdbInfoId)
- }
- latestDateTime, _ := time.ParseInLocation(utils.FormatDate, latestDate, time.Local)
- yDataList = make([]data_manage.YData, 0)
- for _, barChartInfoDate := range barChartInfoDateList {
- yDataMap := make(map[int]float64)
- 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)
- noDataIdMap := make(map[int]int, 0)
- xEdbInfoIdList := make([]int, 0)
-
- realDateTime, findDataValue, isFind, tmpErr := GetNeedDateData(findDateTime, edbDataListMap[edbInfoMapping.EdbInfoId], baseEdbDataMap, futureGoodEdbDataMap)
- if tmpErr != nil {
- err = tmpErr
- return
- }
- findDataList = append(findDataList, findDataValue)
- yDataMap[edbInfoMapping.EdbInfoId] = findDataValue
- if isFind {
- maxDate = realDateTime
- } else {
- noDataIdList = append(noDataIdList, edbInfoMapping.EdbInfoId)
- noDataIdMap[edbInfoMapping.EdbInfoId] = edbInfoMapping.EdbInfoId
- }
-
-
-
- currMonth := realDateTime.Month()
- currYear := realDateTime.Year()
- xEdbInfoIdList = append(xEdbInfoIdList, edbInfoMapping.EdbInfoId)
- mList := make([]int, 0)
- indexList := make([]int, 0)
- if regionType == `国内` {
- for i := currMonth + 1; i <= 12; i++ {
- indexList = append(indexList, int(i))
- mList = append(mList, int(i-currMonth))
- }
- for i := 1; i < int(currMonth); i++ {
- indexList = append(indexList, i)
- mList = append(mList, 12+i-int(currMonth))
- }
- } else {
- for i, v := range futureGoodMappingList {
- if v.FutureGoodEdbType == 2 {
- if i == 0 {
- continue
- }
- indexList = append(indexList, i)
- 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))
- }
- }
- }
- }
- for _, i := range indexList {
- futureGoodMapping := futureGoodMappingList[i]
-
-
-
-
-
-
- tmpRealDateTime := realDateTime
- tmpFindDataValue, tmpIsFind := futureGoodEdbDataMap[futureGoodMapping.FutureGoodEdbInfoId][tmpRealDateTime.Format(utils.FormatDate)]
- yDataMap[futureGoodMapping.FutureGoodEdbInfoId] = tmpFindDataValue
- findDataList = append(findDataList, tmpFindDataValue)
- if tmpIsFind {
- if maxDate.IsZero() || maxDate.Before(tmpRealDateTime) {
- maxDate = tmpRealDateTime
- }
- } else {
- noDataIdList = append(noDataIdList, futureGoodMapping.FutureGoodEdbInfoId)
- noDataIdMap[futureGoodMapping.FutureGoodEdbInfoId] = futureGoodMapping.FutureGoodEdbInfoId
- }
-
- xEdbInfoIdList = append(xEdbInfoIdList, futureGoodMapping.FutureGoodEdbInfoId)
- }
- 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 {
- 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, data_manage.YData{
- Date: yDate,
- ConfigDate: realDateTime,
- Value: findDataList,
- NoDataEdbList: noDataIdList,
- XEdbInfoIdList: xEdbInfoIdList,
- Color: barChartInfoDate.Color,
- Name: yName,
- NameEn: yNameEn,
- EdbValMap: yDataMap,
- M: mList,
- })
- }
- return
- }
- func handleResultData(regionType string, futureGoodEdbType int, yDataList []data_manage.YData, futureGoodEdbInfoList []*future_good2.FutureGoodEdbInfo, maxIndex int) (xDataList []data_manage.XData, newYDataList []data_manage.YData, err error) {
- xDataList = make([]data_manage.XData, 0)
- newYDataList = yDataList
- if regionType == `国内` {
- for i := 1; i < 12; i++ {
- if i > maxIndex {
- break
- }
- xDataList = append(xDataList, data_manage.XData{
- Name: fmt.Sprint("M+", i),
- NameEn: fmt.Sprint("M+", i),
- })
- }
- return
- }
- futureGoodEdbInfoMap := make(map[int]*future_good2.FutureGoodEdbInfo)
- for _, v := range futureGoodEdbInfoList {
- futureGoodEdbInfoMap[v.FutureGoodEdbInfoId] = v
- }
- if futureGoodEdbType == 2 {
- nList := []int{3, 15, 27}
- for _, i := range nList {
- xDataList = append(xDataList, data_manage.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
- }
-
- 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 {
- findDateTime := v.ConfigDate
- currMonth := findDateTime.Month()
- currYear := findDateTime.Year()
-
- for edbInfoIndex, edbInfoId := range v.XEdbInfoIdList {
-
- if edbInfoIndex == 0 {
- continue
- }
- futureGoodEdbInfo, ok := futureGoodEdbInfoMap[edbInfoId]
- if !ok {
- err = errors.New("找不到指标")
- return
- }
- n := (futureGoodEdbInfo.Year-currYear)*12 + futureGoodEdbInfo.Month - int(currMonth)
- nMap[n] = n
- }
- }
-
- nList := make([]int, 0)
- for _, n := range nMap {
- nList = append(nList, n)
- }
- sort.Slice(nList, func(i, j int) bool {
- return nList[i] < nList[j]
- })
-
- for _, n := range nList {
- xDataList = append(xDataList, data_manage.XData{
- Name: fmt.Sprint("M+", n),
- NameEn: fmt.Sprint("M+", n),
- })
- }
- 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:]
- currDataTime := yData.ConfigDate
- 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
- }
-
- divMonth := (futureGoodEdbInfo.Year-currDataTime.Year())*12 + (futureGoodEdbInfo.Month - int(currDataTime.Month()))
- if divMonth == 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
- }
- func getFutureGoodEdbInfoList(latestDateTime time.Time, tmpFutureGoodEdbInfoList []*future_good2.FutureGoodEdbInfo, barChartInfoDateList []data_manage.BarChartInfoDateReq) (earliestDateTime time.Time, futureGoodEdbInfoList []*future_good2.FutureGoodEdbInfo, err error) {
- maxM := 36
- futureGoodEdbInfoList = make([]*future_good2.FutureGoodEdbInfo, 0)
- earliestDateTime = latestDateTime
- for _, barChartInfoDate := range barChartInfoDateList {
- 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
- }
- if findDateTime.Before(earliestDateTime) {
- earliestDateTime = findDateTime
- }
- }
- for _, v := range tmpFutureGoodEdbInfoList {
- if v.RegionType == `国内` {
- futureGoodEdbInfoList = append(futureGoodEdbInfoList, v)
- continue
- }
-
- if v.FutureGoodEdbType == 2 {
- if v.Month <= maxM {
-
-
-
-
-
-
-
- futureGoodEdbInfoList = append(futureGoodEdbInfoList, v)
- }
- continue
- }
- if v.Year < earliestDateTime.Year() {
- continue
- }
-
- if v.Year <= earliestDateTime.Year() {
- futureGoodEdbInfoList = append(futureGoodEdbInfoList, v)
- continue
- }
-
- if (v.Year-earliestDateTime.Year())*12+(v.Month-int(earliestDateTime.Month())) <= maxM {
- futureGoodEdbInfoList = append(futureGoodEdbInfoList, v)
- continue
- }
- }
- return
- }
- func GetNeedDateData(needDateTime time.Time, dataList []*data_manage.EdbDataList, edbDataMap map[string]float64, allEdbDataMap map[int]map[string]float64) (findDateTime time.Time, findDataValue float64, isFind bool, err error) {
-
- if len(dataList) <= 0 {
-
- return
- }
-
- minDateTime, err := time.ParseInLocation(utils.FormatDate, dataList[0].DataTime, time.Local)
- if err != nil {
- return
- }
-
- maxCount := 1
- for tmpDateTime := needDateTime; tmpDateTime.After(minDateTime) || tmpDateTime.Equal(minDateTime); tmpDateTime = tmpDateTime.AddDate(0, 0, -1) {
- tmpDate := tmpDateTime.Format(utils.FormatDate)
- tmpValue, ok := edbDataMap[tmpDate]
- if !ok {
- continue
- }
-
- count := 0
- for _, currEdbDataMap := range allEdbDataMap {
- _, tmpIsFind := currEdbDataMap[tmpDate]
- if tmpIsFind {
- count++
- if count >= maxCount {
- continue
- }
- }
- }
-
- if count < maxCount {
- continue
- }
-
-
- if tmpValue == 0 {
- return
- }
- findDateTime, _ = time.ParseInLocation(utils.FormatDate, tmpDate, time.Local)
- findDataValue = tmpValue
- isFind = true
- return
- }
- return
- }
- func FutureGoodChartInfoRefresh(chartInfoId int) (err error) {
- var errMsg string
- defer func() {
- if err != nil {
- go alarm_msg.SendAlarmMsg("ChartInfoRefresh:"+errMsg, 3)
- fmt.Println("ChartInfoRefresh Err:" + errMsg)
- }
- }()
- edbInfoMapping, err := data_manage.GetEtaEdbChartEdbMapping(chartInfoId)
- if err != nil {
- errMsg = "获取需要刷新的ETA指标失败:Err:" + err.Error()
- return
- }
-
- futureGoodEdbInfoMapping, err := data_manage.GetFutureGoodEdbChartEdbMapping(chartInfoId)
- if err != nil {
- errMsg = "获取需要刷新的商品期货指标失败:Err:" + err.Error()
- return
- }
-
- futureGoodEdbInfoList, err := future_good2.GetFutureGoodEdbInfoListByParentId(futureGoodEdbInfoMapping.EdbInfoId)
- if err != nil {
- return
- }
-
- err, _ = data.EdbInfoRefreshAllFromBaseV3([]int{edbInfoMapping.EdbInfoId}, false, true, false)
- if err != nil {
- return
- }
-
- err = FutureGoodEdbInfoRefreshAllFromBase(futureGoodEdbInfoList, false)
- if err != nil {
- return
- }
- return
- }
|