package pcsg import ( "eta/eta_bridge/global" "eta/eta_bridge/utils" "fmt" "strings" "time" ) const ( TaskKey0000 = "IDpcsgDailySnap0000" SubOneDayTaskKey = "IDpcsgDailySnap0330" // 日期-1的key TaskKey0345 = "IDpcsgDailySnap0345" TaskKeyHistU3 = "IDpcsgDailyRunHistU3" TaskKeyIDpcsgDailyRun11 = "IDpcsgDailyRun11" TaskKeyIDpcsgDailyRun12 = "IDpcsgDailyRun12" ) // PythonBloombergGeneralData 通用数据格式(有空改成Map吧...然后做成配置方便加新字段...) type PythonBloombergGeneralData struct { NAME string `json:"NAME" description:"指标名称, 可能为null"` IDENTIFIER string `json:"IDENTIFIER" description:"指标编码"` PX_LAST_EOD *float64 `json:"PX_LAST_EOD" description:"数据值, 可能为null"` PX_VOLUME_EOD *float64 `json:"PX_VOLUME_EOD" description:"数据值, 可能为null"` PX_LAST *float64 `json:"PX_LAST" description:"数据值, 可能为null"` PX_VOLUME *float64 `json:"PX_VOLUME" description:"数据值, 可能为null"` LAST_UPDATE_DATE_EOD string `json:"LAST_UPDATE_DATE_EOD" description:"数据日期"` DATE string `json:"DATE" description:"数据日期"` PX_SETTLE *float64 `json:"PX_SETTLE" description:"数据值, 可能为null"` PX_SETTLE_LAST_DT string `json:"PX_SETTLE_LAST_DT" description:"数据日期"` OPEN_INT *float64 `json:"OPEN_INT"` OPEN_INT_DATE string `json:"OPEN_INT_DATE"` DL_SNAPSHOT_START_TIME string `json:"DL_SNAPSHOT_START_TIME" description:"数据日期"` LAST_UPDATE string `json:"LAST_UPDATE" description:"IDpcsgDailySnap0000和IDpcsgDailySnap0330判断用的"` PX_CLOSE_DT string `json:"PX_CLOSE_DT" description:"数据日期"` LAST_UPDATE_DT string `json:"LAST_UPDATE_DT" description:"数据日期"` HEATING_DAYS *float64 `json:"HEATING_DAYS" description:"数据值, 可能为null"` COOLING_DAYS *float64 `json:"COOLING_DAYS" description:"数据值, 可能为null"` PX_OPEN *float64 `json:"PX_OPEN" description:"数据值, 可能为null"` PX_LOW *float64 `json:"PX_LOW" description:"数据值, 可能为null"` PX_HIGH *float64 `json:"PX_HIGH" description:"数据值, 可能为null"` WIND_SPEED *float64 `json:"WIND_SPEED" description:"数据值, 可能为null"` PRECIPITATION *float64 `json:"PRECIPITATION" description:"数据值, 可能为null"` } // PythonBloombergGeneralResult API响应体 type PythonBloombergGeneralResult struct { Code int `json:"code"` Msg string `json:"msg"` Data []PythonBloombergGeneralData `json:"data"` } // BaseFromBloombergApiIndexAndData Bloomberg原始指标及数据 type BaseFromBloombergApiIndexAndData struct { BaseFromBloombergIndexId int `description:"指标ID"` IndexCode string `description:"指标编码"` IndexName string `description:"指标名称"` Unit string `description:"单位"` Source string `description:"来源"` Frequency string `description:"频度"` CreateTime time.Time `description:"创建时间"` ModifyTime time.Time `description:"修改时间"` Data []BaseFromBloombergApiIndexData `description:"数据列表"` } // BaseFromBloombergApiIndexData Bloomberg原始指标数据 type BaseFromBloombergApiIndexData struct { DataTime time.Time `description:"数据日期"` Value float64 `description:"数据值"` } func FormatPythonBloombergGeneralData2Base(origin PythonBloombergGeneralData, frequency, taskKey string) (item BaseFromBloombergApiIndexAndData) { if origin.IDENTIFIER == "" { return } item.IndexCode = strings.TrimSpace(origin.IDENTIFIER) item.IndexName = strings.TrimSpace(origin.NAME) item.Frequency = frequency item.Unit = "无" item.Data = make([]BaseFromBloombergApiIndexData, 0) // 数据来源的值和日期对应字段不同 var dataTime time.Time var val *float64 if origin.LAST_UPDATE_DATE_EOD != "" && origin.PX_LAST_EOD != nil { dataTime, _ = time.ParseInLocation(utils.FormatDate, origin.LAST_UPDATE_DATE_EOD, time.Local) val = origin.PX_LAST_EOD } if origin.LAST_UPDATE_DATE_EOD != "" && origin.PX_VOLUME_EOD != nil { dataTime, _ = time.ParseInLocation(utils.FormatDate, origin.LAST_UPDATE_DATE_EOD, time.Local) val = origin.PX_VOLUME_EOD } if origin.DATE != "" && origin.PX_LAST != nil { dataTime, _ = time.ParseInLocation(utils.FormatDate, origin.DATE, time.Local) val = origin.PX_LAST } if origin.DATE != "" && origin.PX_VOLUME != nil { dataTime, _ = time.ParseInLocation(utils.FormatDate, origin.DATE, time.Local) val = origin.PX_VOLUME } if origin.PX_SETTLE_LAST_DT != "" && origin.PX_SETTLE != nil { dataTime, _ = time.ParseInLocation(utils.FormatDate, origin.PX_SETTLE_LAST_DT, time.Local) val = origin.PX_SETTLE } if origin.OPEN_INT_DATE != "" && origin.OPEN_INT != nil { dataTime, _ = time.ParseInLocation(utils.FormatDate, origin.OPEN_INT_DATE, time.Local) val = origin.OPEN_INT } if taskKey == TaskKey0345 && origin.PX_CLOSE_DT != "" && origin.PX_LAST != nil { dataTime, _ = time.ParseInLocation(utils.FormatDate, origin.PX_CLOSE_DT, time.Local) val = origin.PX_LAST } if (taskKey == TaskKey0000 || taskKey == SubOneDayTaskKey) && origin.DL_SNAPSHOT_START_TIME != "" && origin.PX_LAST != nil { // 根据LAST_UPDATE的格式进行判断, 仅加入格式为hh:mm:ss的 _, e := time.ParseInLocation("15:04:05", origin.LAST_UPDATE, time.Local) if e != nil { return } d, e := time.ParseInLocation("2006-01-02T15:04:05", origin.DL_SNAPSHOT_START_TIME, time.Local) if e != nil { global.LOG.Info(fmt.Sprintf("DL_SNAPSHOT_START_TIME日期解析失败, %s", origin.DL_SNAPSHOT_START_TIME)) } dataTime = d // 这个任务日期需要-1 if taskKey == SubOneDayTaskKey { dataTime = dataTime.AddDate(0, 0, -1) } val = origin.PX_LAST } if !dataTime.IsZero() && val != nil { item.Data = append(item.Data, BaseFromBloombergApiIndexData{ DataTime: dataTime, Value: *val, }) } return } // FormatPythonBloombergDailyRun11Data2Base Run11不要了被Run12替代了,留这过渡一下 func FormatPythonBloombergDailyRun11Data2Base(origin PythonBloombergGeneralData, frequency, taskKey string) (items []BaseFromBloombergApiIndexAndData) { if origin.IDENTIFIER == "" { return } if origin.LAST_UPDATE_DT == "" { return } dataTime, err := time.ParseInLocation(utils.FormatDate, origin.LAST_UPDATE_DT, time.Local) if err != nil { return } items = make([]BaseFromBloombergApiIndexAndData, 0) // WER1UK00 Index, WER1UK00 Index HDD, WER1UK00 Index CDD item := BaseFromBloombergApiIndexAndData{} item.IndexCode = strings.TrimSpace(origin.IDENTIFIER) item.IndexName = strings.TrimSpace(origin.NAME) item.Frequency = frequency item.Unit = "无" item.Data = make([]BaseFromBloombergApiIndexData, 0) itemHDD := BaseFromBloombergApiIndexAndData{} itemHDD.IndexCode = strings.TrimSpace(origin.IDENTIFIER) itemHDD.IndexCode = fmt.Sprintf("%s HDD", itemHDD.IndexCode) itemHDD.IndexName = strings.TrimSpace(origin.NAME) itemHDD.IndexName = fmt.Sprintf("%s HDD", itemHDD.IndexName) itemHDD.Frequency = frequency itemHDD.Unit = "无" itemHDD.Data = make([]BaseFromBloombergApiIndexData, 0) itemCDD := BaseFromBloombergApiIndexAndData{} itemCDD.IndexCode = strings.TrimSpace(origin.IDENTIFIER) itemCDD.IndexCode = fmt.Sprintf("%s CDD", itemCDD.IndexCode) itemCDD.IndexName = strings.TrimSpace(origin.NAME) itemCDD.IndexName = fmt.Sprintf("%s CDD", itemCDD.IndexName) itemCDD.Frequency = frequency itemCDD.Unit = "无" itemCDD.Data = make([]BaseFromBloombergApiIndexData, 0) // 数据来源的值和日期对应字段不同 if origin.PX_LAST != nil { val := origin.PX_LAST item.Data = append(item.Data, BaseFromBloombergApiIndexData{ DataTime: dataTime, Value: *val, }) } if origin.HEATING_DAYS != nil { val := origin.HEATING_DAYS itemHDD.Data = append(itemHDD.Data, BaseFromBloombergApiIndexData{ DataTime: dataTime, Value: *val, }) } if origin.COOLING_DAYS != nil { val := origin.COOLING_DAYS itemCDD.Data = append(itemCDD.Data, BaseFromBloombergApiIndexData{ DataTime: dataTime, Value: *val, }) } items = append(items, item, itemHDD, itemCDD) return } func FormatPythonBloombergDailyRunHistV1Data2Base(origin PythonBloombergGeneralData, frequency, taskKey string) (item BaseFromBloombergApiIndexAndData) { if origin.IDENTIFIER == "" { return } item.IndexCode = strings.TrimSpace(origin.IDENTIFIER) if item.IndexCode == "TZT1 COMB Comdty" { item.IndexCode = "TZT1 COMB V Comdty" } item.IndexName = strings.TrimSpace(origin.NAME) item.Frequency = frequency item.Unit = "无" item.Data = make([]BaseFromBloombergApiIndexData, 0) // 数据来源的值和日期对应字段不同 var dataTime time.Time var val *float64 if origin.DATE != "" && origin.PX_VOLUME != nil { dataTime, _ = time.ParseInLocation(utils.FormatDate, origin.DATE, time.Local) val = origin.PX_VOLUME } if !dataTime.IsZero() && val != nil { item.Data = append(item.Data, BaseFromBloombergApiIndexData{ DataTime: dataTime, Value: *val, }) } return } func FormatPythonBloombergDailyHistU3Data2Base(origin PythonBloombergGeneralData, frequency string) (items []BaseFromBloombergApiIndexAndData) { origin.IDENTIFIER = strings.TrimSpace(origin.IDENTIFIER) if origin.IDENTIFIER == "" { return } dataTime, err := time.ParseInLocation(utils.FormatDate, origin.DATE, time.Local) if err != nil { return } items = make([]BaseFromBloombergApiIndexAndData, 0) // TZT1 Comdty / CO1 Comdty if origin.IDENTIFIER == "CO1 Comdty" { itemA1 := BaseFromBloombergApiIndexAndData{} itemA1.IndexCode = "CO1 O Comdty" itemA1.IndexName = "ICE Brent 1st Line - Open" itemA1.Frequency = frequency itemA1.Unit = "无" itemA1.Data = make([]BaseFromBloombergApiIndexData, 0) itemA2 := BaseFromBloombergApiIndexAndData{} itemA2.IndexCode = "CO1 L Comdty" itemA2.IndexName = "ICE Brent 1st Line - Low" itemA2.Frequency = frequency itemA2.Unit = "无" itemA2.Data = make([]BaseFromBloombergApiIndexData, 0) itemA3 := BaseFromBloombergApiIndexAndData{} itemA3.IndexCode = "CO1 H Comdty" itemA3.IndexName = "ICE Brent 1st Line - High" itemA3.Frequency = frequency itemA3.Unit = "无" itemA3.Data = make([]BaseFromBloombergApiIndexData, 0) // 数据来源的值和日期对应字段不同 if origin.PX_OPEN != nil { val := origin.PX_OPEN itemA1.Data = append(itemA1.Data, BaseFromBloombergApiIndexData{ DataTime: dataTime, Value: *val, }) } if origin.PX_LOW != nil { val := origin.PX_LOW itemA2.Data = append(itemA2.Data, BaseFromBloombergApiIndexData{ DataTime: dataTime, Value: *val, }) } if origin.PX_HIGH != nil { val := origin.PX_HIGH itemA3.Data = append(itemA3.Data, BaseFromBloombergApiIndexData{ DataTime: dataTime, Value: *val, }) } items = append(items, itemA1, itemA2, itemA3) } if origin.IDENTIFIER == "TZT1 Comdty" { itemB1 := BaseFromBloombergApiIndexAndData{} itemB1.IndexCode = "TZT1 O Comdty" itemB1.IndexName = "ICE TTF 1st Line - Open" itemB1.Frequency = frequency itemB1.Unit = "无" itemB1.Data = make([]BaseFromBloombergApiIndexData, 0) itemB2 := BaseFromBloombergApiIndexAndData{} itemB2.IndexCode = "TZT1 L Comdty" itemB2.IndexName = "ICE TTF 1st Line - Low" itemB2.Frequency = frequency itemB2.Unit = "无" itemB2.Data = make([]BaseFromBloombergApiIndexData, 0) itemB3 := BaseFromBloombergApiIndexAndData{} itemB3.IndexCode = "TZT1 H Comdty" itemB3.IndexName = "ICE TTF 1st Line - High" itemB3.Frequency = frequency itemB3.Unit = "无" itemB3.Data = make([]BaseFromBloombergApiIndexData, 0) // 数据来源的值和日期对应字段不同 if origin.PX_OPEN != nil { val := origin.PX_OPEN itemB1.Data = append(itemB1.Data, BaseFromBloombergApiIndexData{ DataTime: dataTime, Value: *val, }) } if origin.PX_LOW != nil { val := origin.PX_LOW itemB2.Data = append(itemB2.Data, BaseFromBloombergApiIndexData{ DataTime: dataTime, Value: *val, }) } if origin.PX_HIGH != nil { val := origin.PX_HIGH itemB3.Data = append(itemB3.Data, BaseFromBloombergApiIndexData{ DataTime: dataTime, Value: *val, }) } items = append(items, itemB1, itemB2, itemB3) } return } // FormatPythonBloombergDailyRun12Data2Base 替换Run11 func FormatPythonBloombergDailyRun12Data2Base(origin PythonBloombergGeneralData, frequency string) (items []BaseFromBloombergApiIndexAndData) { if origin.IDENTIFIER == "" { return } if origin.LAST_UPDATE_DT == "" { return } dataTime, err := time.ParseInLocation(utils.FormatDate, origin.LAST_UPDATE_DT, time.Local) if err != nil { return } items = make([]BaseFromBloombergApiIndexAndData, 0) // WER1UK00 Index, WER1UK00 Index HDD, WER1UK00 Index CDD, WER1UK00 Index Pre, WER1UK00 Index Win item := BaseFromBloombergApiIndexAndData{} item.IndexCode = strings.TrimSpace(origin.IDENTIFIER) item.IndexName = strings.TrimSpace(origin.NAME) item.Frequency = frequency item.Unit = "无" item.Data = make([]BaseFromBloombergApiIndexData, 0) itemHDD := BaseFromBloombergApiIndexAndData{} itemHDD.IndexCode = strings.TrimSpace(origin.IDENTIFIER) itemHDD.IndexCode = fmt.Sprintf("%s HDD", itemHDD.IndexCode) itemHDD.IndexName = strings.TrimSpace(origin.NAME) itemHDD.IndexName = fmt.Sprintf("%s HDD", itemHDD.IndexName) itemHDD.Frequency = frequency itemHDD.Unit = "无" itemHDD.Data = make([]BaseFromBloombergApiIndexData, 0) itemCDD := BaseFromBloombergApiIndexAndData{} itemCDD.IndexCode = strings.TrimSpace(origin.IDENTIFIER) itemCDD.IndexCode = fmt.Sprintf("%s CDD", itemCDD.IndexCode) itemCDD.IndexName = strings.TrimSpace(origin.NAME) itemCDD.IndexName = fmt.Sprintf("%s CDD", itemCDD.IndexName) itemCDD.Frequency = frequency itemCDD.Unit = "无" itemCDD.Data = make([]BaseFromBloombergApiIndexData, 0) itemPre := BaseFromBloombergApiIndexAndData{} itemPre.IndexCode = strings.TrimSpace(origin.IDENTIFIER) itemPre.IndexCode = fmt.Sprintf("%s Pre", itemPre.IndexCode) itemPre.IndexName = strings.TrimSpace(origin.NAME) itemPre.IndexName = fmt.Sprintf("%s Precipitation", itemPre.IndexName) itemPre.Frequency = frequency itemPre.Unit = "无" itemPre.Data = make([]BaseFromBloombergApiIndexData, 0) itemWin := BaseFromBloombergApiIndexAndData{} itemWin.IndexCode = strings.TrimSpace(origin.IDENTIFIER) itemWin.IndexCode = fmt.Sprintf("%s Win", itemWin.IndexCode) itemWin.IndexName = strings.TrimSpace(origin.NAME) itemWin.IndexName = fmt.Sprintf("%s Wind Speed", itemWin.IndexName) itemWin.Frequency = frequency itemWin.Unit = "无" itemWin.Data = make([]BaseFromBloombergApiIndexData, 0) // 数据来源的值和日期对应字段不同 if origin.PX_LAST != nil { val := origin.PX_LAST item.Data = append(item.Data, BaseFromBloombergApiIndexData{ DataTime: dataTime, Value: *val, }) } if origin.HEATING_DAYS != nil { val := origin.HEATING_DAYS itemHDD.Data = append(itemHDD.Data, BaseFromBloombergApiIndexData{ DataTime: dataTime, Value: *val, }) } if origin.COOLING_DAYS != nil { val := origin.COOLING_DAYS itemCDD.Data = append(itemCDD.Data, BaseFromBloombergApiIndexData{ DataTime: dataTime, Value: *val, }) } if origin.WIND_SPEED != nil { val := origin.WIND_SPEED itemWin.Data = append(itemWin.Data, BaseFromBloombergApiIndexData{ DataTime: dataTime, Value: *val, }) } if origin.PRECIPITATION != nil { val := origin.PRECIPITATION itemPre.Data = append(itemPre.Data, BaseFromBloombergApiIndexData{ DataTime: dataTime, Value: *val, }) } items = append(items, item, itemHDD, itemCDD, itemWin, itemPre) return }