base_from_pb.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package models
  2. import (
  3. "eta/eta_index_lib/global"
  4. "eta/eta_index_lib/utils"
  5. "fmt"
  6. "strconv"
  7. "strings"
  8. "time"
  9. )
  10. type EdbDataFromPb struct {
  11. Date map[string]int64 `json:"date"`
  12. Ticker map[string]string `json:"ticker"`
  13. Field map[string]string `json:"field"`
  14. Value map[string]float64 `json:"value"`
  15. }
  16. func AddEdbDataFromPb(edbCode string, item *EdbDataFromPb) (err error) {
  17. //o := orm.NewOrm()
  18. if len(item.Date) > 0 {
  19. var isAdd bool
  20. dateMap := item.Date
  21. addSql := ` INSERT INTO edb_data_pb(edb_info_id,edb_code,data_time,value,create_time,modify_time,ticker,field,data_timestamp) values `
  22. addSql = utils.ReplaceDriverKeywords("", addSql)
  23. nowStr := time.Now().Format(utils.FormatDateTime)
  24. for k, v := range dateMap {
  25. timeStr := fmt.Sprintf("%d", v)
  26. v = v / 1000
  27. t := time.Unix(v, 0)
  28. dateTime := t.Format(utils.FormatDate)
  29. // //这里的目的是为了北京时间,以防万一,还是重新转一下吧
  30. {
  31. t, err = time.ParseInLocation(utils.FormatDate, dateTime, time.Local)
  32. if err != nil {
  33. return err
  34. }
  35. timeStr = fmt.Sprintf("%d", t.UnixNano()/1e6)
  36. }
  37. val := item.Value[k]
  38. field := item.Field[k]
  39. ticker := item.Ticker[k]
  40. if field == "PX_LAST" {
  41. addSql += "("
  42. addSql += "0," + "'" + edbCode + "'" + "," + "'" + dateTime + "'" + "," + utils.SubFloatToString(val, 20) + "," + "'" + nowStr + "'" +
  43. "," + "'" + nowStr + "'" + "," + "'" + ticker + "'" + "," + "'" + field + "'" + "," + "'" + timeStr + "'"
  44. addSql += "),"
  45. isAdd = true
  46. }
  47. }
  48. if isAdd {
  49. addSql = strings.TrimRight(addSql, ",")
  50. //_, err = o.Raw(addSql).Exec()
  51. err = global.DEFAULT_DB.Exec(addSql).Error
  52. if err != nil {
  53. return
  54. }
  55. }
  56. }
  57. return
  58. }
  59. // 刷新彭博指标数据
  60. func RefreshEdbDataFromPb(edbInfoId int, edbCode, startDate string, item *EdbDataFromPb) (err error) {
  61. //o := orm.NewOrm()
  62. source := utils.DATA_SOURCE_PB
  63. subSource := utils.DATA_SUB_SOURCE_EDB
  64. // 真实数据的最大日期 , 插入规则配置的日期
  65. var realDataMaxDate, edbDataInsertConfigDate time.Time
  66. var edbDataInsertConfig *EdbDataInsertConfig
  67. var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
  68. {
  69. edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
  70. if err != nil && !utils.IsErrNoRow(err) {
  71. return
  72. }
  73. if edbDataInsertConfig != nil {
  74. edbDataInsertConfigDate = edbDataInsertConfig.Date
  75. }
  76. }
  77. var condition string
  78. var pars []interface{}
  79. condition += " AND edb_info_id=? "
  80. pars = append(pars, edbInfoId)
  81. condition += " AND data_time>=? "
  82. pars = append(pars, startDate)
  83. existList, err := GetEdbDataByCondition(source, subSource, condition, pars)
  84. existMap := make(map[string]*EdbInfoSearchData)
  85. for _, v := range existList {
  86. existMap[v.DataTime] = v
  87. }
  88. edbInfoIdStr := strconv.Itoa(edbInfoId)
  89. addMap := make(map[string]string)
  90. if len(item.Date) > 0 {
  91. dateMap := item.Date
  92. var isAdd bool
  93. addSql := ` INSERT INTO edb_data_pb(edb_info_id,edb_code,data_time,value,create_time,modify_time,ticker,field,data_timestamp) values `
  94. addSql = utils.ReplaceDriverKeywords("", addSql)
  95. nowStr := time.Now().Format(utils.FormatDateTime)
  96. for k, v := range dateMap {
  97. timeStr := fmt.Sprintf("%d", v)
  98. v = v / 1000
  99. t := time.Unix(v, 0)
  100. dateTime := t.Format(utils.FormatDate)
  101. // //这里的目的是为了北京时间,以防万一,还是重新转一下吧
  102. {
  103. t, err = time.ParseInLocation(utils.FormatDate, dateTime, time.Local)
  104. if err != nil {
  105. return err
  106. }
  107. timeStr = fmt.Sprintf("%d", t.UnixNano()/1e6)
  108. }
  109. val := item.Value[k]
  110. field := item.Field[k]
  111. ticker := item.Ticker[k]
  112. saveValue := utils.SubFloatToString(val, 30)
  113. if field == "PX_LAST" {
  114. if findItem, ok := existMap[dateTime]; !ok {
  115. if _, addOk := addMap[dateTime]; !addOk {
  116. addSql += "("
  117. addSql += edbInfoIdStr + "," + "'" + edbCode + "'" + "," + "'" + dateTime + "'" + "," + saveValue + "," + "'" + nowStr + "'" +
  118. "," + "'" + nowStr + "'" + "," + "'" + ticker + "'" + "," + "'" + field + "'" + "," + "'" + timeStr + "'"
  119. addSql += "),"
  120. isAdd = true
  121. addMap[dateTime] = saveValue
  122. }
  123. } else {
  124. if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != saveValue {
  125. err = ModifyEdbDataById(source, subSource, findItem.EdbDataId, saveValue)
  126. if err != nil {
  127. return err
  128. }
  129. }
  130. }
  131. // 下面代码主要目的是处理掉手动插入的数据判断
  132. {
  133. if realDataMaxDate.IsZero() || t.After(realDataMaxDate) {
  134. realDataMaxDate = t
  135. }
  136. if edbDataInsertConfigDate.IsZero() || t.Equal(edbDataInsertConfigDate) {
  137. isFindConfigDateRealData = true
  138. }
  139. }
  140. }
  141. }
  142. // 处理手工数据补充的配置
  143. HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, subSource, existMap, isFindConfigDateRealData)
  144. if isAdd {
  145. addSql = strings.TrimRight(addSql, ",")
  146. //_, err = o.Raw(addSql).Exec()
  147. err = global.DEFAULT_DB.Exec(addSql).Error
  148. if err != nil {
  149. fmt.Println("RefreshAllEdbDataByPb add Err", err.Error())
  150. return
  151. }
  152. }
  153. }
  154. return
  155. }