bloomberg.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package pcsg
  2. import (
  3. "eta/eta_bridge/global"
  4. "fmt"
  5. "strings"
  6. "time"
  7. )
  8. // PythonBloombergGeneralData 通用数据格式(有空改成Map吧...然后做成配置方便加新字段...)
  9. type PythonBloombergGeneralData struct {
  10. NAME string `json:"NAME" description:"指标名称, 可能为null"`
  11. IDENTIFIER string `json:"IDENTIFIER" description:"指标编码"`
  12. PX_LAST_EOD *float64 `json:"PX_LAST_EOD" description:"数据值, 可能为null"`
  13. PX_VOLUME_EOD *float64 `json:"PX_VOLUME_EOD" description:"数据值, 可能为null"`
  14. PX_LAST *float64 `json:"PX_LAST" description:"数据值, 可能为null"`
  15. PX_VOLUME *float64 `json:"PX_VOLUME" description:"数据值, 可能为null"`
  16. LAST_UPDATE_DATE_EOD string `json:"LAST_UPDATE_DATE_EOD" description:"数据日期"`
  17. DATE string `json:"DATE" description:"数据日期"`
  18. PX_SETTLE *float64 `json:"PX_SETTLE" description:"数据值, 可能为null"`
  19. PX_SETTLE_LAST_DT string `json:"PX_SETTLE_LAST_DT" description:"数据日期"`
  20. OPEN_INT *float64 `json:"OPEN_INT"`
  21. OPEN_INT_DATE string `json:"OPEN_INT_DATE"`
  22. DL_SNAPSHOT_START_TIME string `json:"DL_SNAPSHOT_START_TIME" description:"数据日期"`
  23. }
  24. // PythonBloombergGeneralResult API响应体
  25. type PythonBloombergGeneralResult struct {
  26. Code int `json:"code"`
  27. Msg string `json:"msg"`
  28. Data []map[string]interface{} `json:"data"`
  29. }
  30. // BaseFromBloombergApiIndexAndData Bloomberg原始指标及数据
  31. type BaseFromBloombergApiIndexAndData struct {
  32. BaseFromBloombergIndexId int `description:"指标ID"`
  33. IndexCode string `description:"指标编码"`
  34. IndexName string `description:"指标名称"`
  35. Unit string `description:"单位"`
  36. Source string `description:"来源"`
  37. Frequency string `description:"频度"`
  38. CreateTime time.Time `description:"创建时间"`
  39. ModifyTime time.Time `description:"修改时间"`
  40. Data []BaseFromBloombergApiIndexData `description:"数据列表"`
  41. }
  42. // BaseFromBloombergApiIndexData Bloomberg原始指标数据
  43. type BaseFromBloombergApiIndexData struct {
  44. DataTime time.Time `description:"数据日期"`
  45. Value float64 `description:"数据值"`
  46. }
  47. // TaskConfPCSGBloomberg 配置
  48. type TaskConfPCSGBloomberg struct {
  49. TaskKey string `json:"TaskKey" description:"任务名称"`
  50. IndexCodeField string `json:"IndexCodeField" description:"指标编码字段名"`
  51. IndexNameField string `json:"IndexNameField" description:"指标名称字段名"`
  52. FrequencyVal string `json:"FrequencyVal" description:"频度"`
  53. UnitVal string `json:"UnitVal" description:"单位"`
  54. DataTimeField string `json:"DataTimeField" description:"数据日期字段名"`
  55. DataTimeFormat string `json:"DataTimeFormat" description:"数据日期格式"`
  56. DataTimeMoveDays int `json:"DataTimeMoveDays" description:"数据日期位移天数"`
  57. DataValField string `json:"DataValField" description:"数据值字段名"`
  58. CheckDataTimeField string `json:"CheckDataTimeField" description:"需要校验的数据日期字段名"`
  59. CheckDataTimeFormat string `json:"CheckDataTimeFormat" description:"需要校验的数据日期格式"`
  60. }
  61. func FormatPythonBloombergGeneralData2Base(origin map[string]interface{}, conf *TaskConfPCSGBloomberg) (item BaseFromBloombergApiIndexAndData) {
  62. // 指标编码
  63. if v, ok := origin[conf.IndexCodeField]; ok {
  64. indexCode, yes := v.(string)
  65. if !yes {
  66. return
  67. }
  68. item.IndexCode = strings.TrimSpace(indexCode)
  69. }
  70. // 指标名称/频率/单位
  71. if v, ok := origin[conf.IndexNameField]; ok {
  72. indexName, yes := v.(string)
  73. if yes {
  74. item.IndexName = strings.TrimSpace(indexName)
  75. }
  76. }
  77. item.Frequency = conf.FrequencyVal
  78. item.Unit = conf.UnitVal
  79. // 校验一下指定字段的日期格式, 如果格式不对那么不处理
  80. checkTimeFunc := func(dataMap map[string]interface{}) (pass bool) {
  81. pass = true // 默认处理
  82. f, ok := dataMap[conf.CheckDataTimeField]
  83. if !ok {
  84. return
  85. }
  86. checkField, yes := f.(string)
  87. if !yes {
  88. return
  89. }
  90. f, ok = dataMap[conf.CheckDataTimeFormat]
  91. if !ok {
  92. return
  93. }
  94. checkFormat, yes := f.(string)
  95. if !yes {
  96. return
  97. }
  98. f, ok = dataMap[checkField]
  99. if !ok {
  100. return
  101. }
  102. fieldVal, yes := f.(string)
  103. if !yes {
  104. return
  105. }
  106. // 格式不一致, 那么不处理
  107. _, e := time.ParseInLocation(checkFormat, fieldVal, time.Local)
  108. if e != nil {
  109. pass = false
  110. return
  111. }
  112. return
  113. }
  114. if !checkTimeFunc(origin) {
  115. return
  116. }
  117. // 数据日期
  118. item.Data = make([]BaseFromBloombergApiIndexData, 0)
  119. var dataTime time.Time
  120. if v, ok := origin[conf.DataTimeField]; ok {
  121. strTime, yes := v.(string)
  122. if !yes {
  123. return
  124. }
  125. if strTime == "" {
  126. return
  127. }
  128. d, e := time.ParseInLocation(conf.DataTimeFormat, strTime, time.Local)
  129. if e != nil {
  130. global.LOG.Info(fmt.Sprintf("数据日期解析失败, %s, err: %v", strTime, e))
  131. return
  132. }
  133. if d.IsZero() {
  134. global.LOG.Info(fmt.Sprintf("数据日期解析为空, %s", strTime))
  135. return
  136. }
  137. if conf.DataTimeMoveDays != 0 {
  138. d = d.AddDate(0, 0, conf.DataTimeMoveDays)
  139. }
  140. dataTime = d
  141. }
  142. // 数据值
  143. var dataVal *float64
  144. if v, ok := origin[conf.DataValField]; ok {
  145. val, yes := v.(*float64)
  146. if !yes {
  147. global.LOG.Info(fmt.Sprintf("数据float断言失败, %v", v))
  148. return
  149. }
  150. if val == nil {
  151. return
  152. }
  153. dataVal = val
  154. }
  155. item.Data = append(item.Data, BaseFromBloombergApiIndexData{
  156. DataTime: dataTime,
  157. Value: *dataVal,
  158. })
  159. return
  160. }