123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498 |
- package future_good
- import (
- "errors"
- "fmt"
- "hongze/hongze_chart_lib/models"
- "hongze/hongze_chart_lib/models/data_manage"
- efuture_good "hongze/hongze_chart_lib/models/data_manage/future_good"
- "hongze/hongze_chart_lib/services/alarm_msg"
- "hongze/hongze_chart_lib/services/data"
- "hongze/hongze_chart_lib/utils"
- "sort"
- "strconv"
- "time"
- )
- // GetChartEdbData 获取图表的指标数据
- func GetChartEdbData(chartInfoId int, startDate, endDate string, edbInfoMapping, futureGoodEdbInfoMapping *models.ChartEdbInfoMapping, barChartInfoDateList []data_manage.BarChartInfoDateReq, barChartInfoSort data_manage.BarChartInfoSortReq) (barConfigEdbInfoIdList []data_manage.BarChartInfoEdbItemReq, edbList []*models.ChartEdbInfoMapping, xEdbIdValue []int, yDataList []models.YData, err error) {
- edbList = make([]*models.ChartEdbInfoMapping, 0)
- if futureGoodEdbInfoMapping == nil {
- err = errors.New("商品指标未选取")
- return
- }
- if edbInfoMapping == nil {
- err = errors.New("ETA指标未选取")
- return
- }
- // 指标对应的所有数据
- edbDataListMap := make(map[int][]*models.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)
- }
- // 普通的指标数据
- {
- dataList := make([]*models.EdbDataList, 0)
- dataList, err = models.GetEdbDataList(edbInfoMapping.Source, edbInfoMapping.EdbInfoId, startDate, endDate)
- edbDataListMap[edbInfoMapping.EdbInfoId] = dataList
- item.DataList = dataList
- edbList = append(edbList, edbInfoMapping)
- barConfigEdbInfoIdList = append(barConfigEdbInfoIdList, data_manage.BarChartInfoEdbItemReq{
- EdbInfoId: edbInfoMapping.EdbInfoId,
- //Name: edbInfoMapping.EdbName,
- Name: "现货价",
- NameEn: "Spot Price",
- Source: edbInfoMapping.Source,
- })
- }
- nowMonth := time.Now().Month()
- // 获取期货指标以及期货数据
- futureGoodEdbInfoList, err := efuture_good.GetFutureGoodEdbInfoListByParentId(futureGoodEdbInfoMapping.EdbInfoId)
- if err != nil {
- return
- }
- futureGoodMappingList := make([]*models.ChartEdbInfoMapping, 0)
- //当前月份之后的月
- nextFutureGoodEdbInfoList := make([]*efuture_good.FutureGoodEdbInfo, 0)
- for k, v := range futureGoodEdbInfoList {
- // 过滤当前月
- if v.Month == int(nowMonth) {
- continue
- }
- if v.Month < int(nowMonth) {
- nextFutureGoodEdbInfoList = append(nextFutureGoodEdbInfoList, v)
- continue
- }
- newMappingInfo := &models.ChartEdbInfoMapping{
- EdbInfoId: v.FutureGoodEdbInfoId,
- SourceName: v.Exchange,
- Source: utils.CHART_SOURCE_FUTURE_GOOD,
- 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,
- })
- }
- //当前月份之前的月
- for k, v := range nextFutureGoodEdbInfoList {
- newMappingInfo := &models.ChartEdbInfoMapping{
- EdbInfoId: v.FutureGoodEdbInfoId,
- SourceName: v.Exchange,
- Source: utils.CHART_SOURCE_FUTURE_GOOD,
- 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 + "1" + 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,
- })
- }
- // 获取数据
- for _, v := range futureGoodMappingList {
- dataList := make([]*models.EdbDataList, 0)
- tmpDataList, tmpErr := efuture_good.GetFutureGoodEdbDataListByDate(v.EdbInfoId, startDate, endDate)
- if tmpErr != nil {
- return
- }
- for _, tmpData := range tmpDataList {
- dataList = append(dataList, &models.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
- }
- edbList = append(edbList, futureGoodMappingList...)
- xEdbIdValue, yDataList, err = BarChartData(edbList, edbDataListMap, barChartInfoDateList, barChartInfoSort)
- return
- }
- // BarChartData 柱方图的数据处理
- func BarChartData(mappingList []*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)
- //Sort int `description:"排序类型,0:默认,1:升序,2:降序"`
- dateData := make(map[int]float64)
- if barChartInfoSort.Sort == 0 {
- for _, v := range mappingList {
- edbIdList = append(edbIdList, v.EdbInfoId)
- }
- } else {
- lenBarChartInfoDateList := len(barChartInfoDateList)
- if barChartInfoSort.DateIndex >= lenBarChartInfoDateList {
- err = errors.New("排序日期异常")
- return
- }
- notDataEdbIdList := make([]int, 0) //没有数据的指标id
- // 日期配置
- barChartInfoDate := barChartInfoDateList[barChartInfoSort.DateIndex]
- for edbInfoId, dataList := range edbDataListMap {
- if len(dataList) <= 0 {
- // 没有数据的指标id
- notDataEdbIdList = append(notDataEdbIdList, edbInfoId)
- continue
- }
- findDate := barChartInfoDate.Date
- switch barChartInfoDate.Type {
- case 1: //最新值
- findDate = dataList[len(dataList)-1].DataTime
- case 2: //近期几天
- findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[len(dataList)-1].DataTime, time.Local)
- if tmpErr != nil {
- err = tmpErr
- return
- }
- findDateTime = findDateTime.AddDate(0, 0, -barChartInfoDate.Value)
- lenData := len(dataList) - 1
- for i := lenData; i >= 0; i-- {
- currDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[i].DataTime, time.Local)
- if tmpErr != nil {
- err = tmpErr
- return
- }
- if currDateTime.Equal(findDateTime) || currDateTime.Before(findDateTime) {
- findDate = dataList[i].DataTime
- break
- }
- }
- case 3: // 固定日期
- //最早的日期
- minDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[0].DataTime, time.Local)
- if tmpErr != nil {
- err = tmpErr
- return
- }
- //寻找固定日期的数据
- findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, barChartInfoDate.Date, time.Local)
- if tmpErr != nil {
- err = tmpErr
- return
- }
- for tmpDateTime := findDateTime; tmpDateTime.After(minDateTime) || tmpDateTime.Equal(minDateTime); tmpDateTime = tmpDateTime.AddDate(0, 0, -1) {
- tmpDate := tmpDateTime.Format(utils.FormatDate)
- if _, ok := edbDataMap[edbInfoId][tmpDate]; ok { //如果能找到数据,那么就返回
- findDate = tmpDate
- break
- }
- }
- default:
- err = errors.New(fmt.Sprint("日期类型异常,Type:", barChartInfoDate.Type))
- return
- }
- if tmpValue, ok := edbDataMap[edbInfoId][findDate]; ok {
- dateData[edbInfoId] = tmpValue
- } else {
- // 没有数据的指标id
- notDataEdbIdList = append(notDataEdbIdList, edbInfoId)
- }
- }
- //Sort int `description:"排序类型,0:默认,1:升序,2:降序"`
- // 排序
- dateDataSort := utils.NewMapSorter(dateData)
- sort.Sort(dateDataSort)
- if barChartInfoSort.Sort == 1 {
- // 先将没有数据的指标id放在最前面
- if len(notDataEdbIdList) > 0 {
- edbIdList = append(edbIdList, notDataEdbIdList...)
- }
- for _, v := range dateDataSort {
- edbIdList = append(edbIdList, v.Key)
- }
- } else {
- for i := len(dateDataSort) - 1; i >= 0; i-- {
- edbIdList = append(edbIdList, dateDataSort[i].Key)
- }
- // 再将没有数据的指标id放在最后面
- if len(notDataEdbIdList) > 0 {
- edbIdList = append(edbIdList, notDataEdbIdList...)
- }
- }
- }
- yDataList = make([]models.YData, 0) //y轴的数据列表
- for _, barChartInfoDate := range barChartInfoDateList {
- var maxDate time.Time
- findDataList := make([]float64, 0) // 当前日期的数据值
- for _, edbInfoId := range edbIdList {
- findDate := barChartInfoDate.Date //需要的日期值
- dataList := edbDataListMap[edbInfoId] //指标的所有数据值
- if len(dataList) <= 0 {
- // 没有数据的指标id
- findDataList = append(findDataList, 0)
- continue
- }
- switch barChartInfoDate.Type {
- case 1: //最新值
- dataList := edbDataListMap[edbInfoId]
- findDate = dataList[len(dataList)-1].DataTime
- case 2: //近期几天
- findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[len(dataList)-1].DataTime, time.Local)
- if tmpErr != nil {
- err = tmpErr
- return
- }
- findDateTime = findDateTime.AddDate(0, 0, -barChartInfoDate.Value)
- lenData := len(dataList) - 1
- for i := lenData; i >= 0; i-- {
- currDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[i].DataTime, time.Local)
- if tmpErr != nil {
- err = tmpErr
- return
- }
- if currDateTime.Equal(findDateTime) || currDateTime.Before(findDateTime) {
- findDate = dataList[i].DataTime
- break
- }
- }
- case 3: // 固定日期
- //最早的日期
- minDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[0].DataTime, time.Local)
- if tmpErr != nil {
- err = tmpErr
- return
- }
- //寻找固定日期的数据
- findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, barChartInfoDate.Date, time.Local)
- if tmpErr != nil {
- err = tmpErr
- return
- }
- for tmpDateTime := findDateTime; tmpDateTime.After(minDateTime) || tmpDateTime.Equal(minDateTime); tmpDateTime = tmpDateTime.AddDate(0, 0, -1) {
- tmpDate := tmpDateTime.Format(utils.FormatDate)
- if _, ok := edbDataMap[edbInfoId][tmpDate]; ok { //如果能找到数据,那么就返回
- findDate = tmpDate
- break
- }
- }
- default:
- err = errors.New(fmt.Sprint("日期类型异常,Type:", barChartInfoDate.Type))
- return
- }
- findDateTime, _ := time.ParseInLocation(utils.FormatDate, findDate, time.Local)
- if maxDate.IsZero() {
- maxDate = findDateTime
- } else {
- if findDateTime.After(maxDate) {
- maxDate = findDateTime
- }
- }
- if tmpValue, ok := edbDataMap[edbInfoId][findDate]; ok {
- findDataList = append(findDataList, tmpValue)
- } else {
- findDataList = append(findDataList, 0)
- }
- }
- 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)
- }
- }
- yDataList = append(yDataList, models.YData{
- Date: maxDate.Format(utils.FormatDate),
- Value: findDataList,
- Color: barChartInfoDate.Color,
- Name: yName,
- NameEn: yNameEn,
- })
- }
- return
- }
- // FutureGoodChartInfoRefresh
- // @author Roc
- // @datetime 2023-2-2 18:44:46
- // @description 商品价格曲线图表刷新
- 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 := models.GetEtaEdbChartEdbMapping(chartInfoId)
- if err != nil {
- errMsg = "获取需要刷新的ETA指标失败:Err:" + err.Error()
- return
- }
- // 获取期货指标
- futureGoodEdbInfoMapping, err := models.GetFutureGoodEdbChartEdbMapping(chartInfoId)
- if err != nil {
- errMsg = "获取需要刷新的商品期货指标失败:Err:" + err.Error()
- return
- }
- // 获取期货指标以及期货数据
- futureGoodEdbInfoList, err := efuture_good.GetFutureGoodEdbInfoListByParentId(futureGoodEdbInfoMapping.EdbInfoId)
- if err != nil {
- return
- }
- // 批量刷新ETA指标
- err, _ = data.EdbInfoRefreshAllFromBase([]int{edbInfoMapping.EdbInfoId}, false)
- if err != nil {
- return
- }
- // 批量刷新期货指标
- err = FutureGoodEdbInfoRefreshAllFromBase(futureGoodEdbInfoList, false)
- if err != nil {
- return
- }
- return
- }
|