base_from_wind_wsd.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package models
  2. import (
  3. "eta/eta_index_lib/utils"
  4. "fmt"
  5. "github.com/beego/beego/v2/client/orm"
  6. "strconv"
  7. "strings"
  8. "time"
  9. )
  10. var windWsd = "wsd"
  11. func AddEdbDataFromWindWsd(securitiesCode string, item map[string]map[string]interface{}) (err error) {
  12. o := orm.NewOrm()
  13. var isAdd bool
  14. addSql := ` INSERT INTO edb_data_wind_wsd(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  15. for wk, wv := range item {
  16. for vk, vv := range wv {
  17. var indexCode string
  18. wkInt, err := strconv.ParseInt(wk, 10, 64)
  19. if err != nil {
  20. return err
  21. }
  22. vk = strings.ToLower(vk)
  23. indexCode = windWsd + securitiesCode + vk
  24. timeStr := wk
  25. wkInt = wkInt / 1000
  26. t := time.Unix(wkInt, 0)
  27. dateTime := t.Format(utils.FormatDate)
  28. //saveVal := utils.SubFloatToString(val, 20)
  29. var saveVal string
  30. switch vt := vv.(type) {
  31. case int:
  32. saveVal = strconv.Itoa(vt)
  33. case float64:
  34. saveVal = utils.SubFloatToFloatStr(vt, 20)
  35. case string:
  36. saveVal = vt
  37. }
  38. addSql += GetAddSql("0", indexCode, dateTime, timeStr, saveVal)
  39. isAdd = true
  40. }
  41. }
  42. if isAdd {
  43. addSql = strings.TrimRight(addSql, ",")
  44. _, err = o.Raw(addSql).Exec()
  45. if err != nil {
  46. return
  47. }
  48. }
  49. return
  50. }
  51. // RefreshEdbDataFromWind 刷新wind指标数据
  52. func RefreshEdbDataFromWindWsd(edbInfoId int, edbCode, startDate string, item *EdbDataFromWind) (err error) {
  53. o := orm.NewOrm()
  54. source := utils.DATA_SOURCE_WIND
  55. // 真实数据的最大日期 , 插入规则配置的日期
  56. var realDataMaxDate, edbDataInsertConfigDate time.Time
  57. var edbDataInsertConfig *EdbDataInsertConfig
  58. var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
  59. {
  60. edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
  61. if err != nil && err.Error() != utils.ErrNoRow() {
  62. return
  63. }
  64. if edbDataInsertConfig != nil {
  65. edbDataInsertConfigDate = edbDataInsertConfig.Date
  66. }
  67. }
  68. var condition string
  69. var pars []interface{}
  70. condition += " AND edb_info_id=? "
  71. pars = append(pars, edbInfoId)
  72. var startDateTime time.Time
  73. if startDate != "" {
  74. condition += " AND data_time>=? "
  75. pars = append(pars, startDate)
  76. startDateTime, _ = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  77. }
  78. existList, err := GetEdbDataByCondition(source, condition, pars)
  79. existMap := make(map[string]*EdbInfoSearchData)
  80. for _, v := range existList {
  81. existMap[v.DataTime] = v
  82. }
  83. addSql := ` INSERT INTO edb_data_wind(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  84. var isAdd bool
  85. addMap := make(map[string]string)
  86. edbInfoIdStr := strconv.Itoa(edbInfoId)
  87. for k, v := range item.Dt {
  88. timeStr := fmt.Sprintf("%d", v)
  89. v = v / 1000
  90. t := time.Unix(v, 0)
  91. dateTime := t.Format(utils.FormatDate)
  92. t, _ = time.ParseInLocation(utils.FormatDate, dateTime, time.Local) // 这里的目的是为了处理成北京时间,所以多转一遍
  93. val := item.Close[k]
  94. saveVal := utils.SubFloatToString(val, 30)
  95. //如果传入的开始时间是空的,且当前数据日期早于传入的开始日期,那么需要判断下当前日期的数据是否存在
  96. if !startDateTime.IsZero() && t.Before(startDateTime) {
  97. tmpItem, tmpErr := GetEdbDataByDate(source, edbCode, dateTime)
  98. if tmpErr == nil && tmpItem != nil {
  99. existMap[tmpItem.DataTime] = tmpItem
  100. }
  101. }
  102. if findItem, ok := existMap[dateTime]; !ok {
  103. if _, existOk := addMap[dateTime]; !existOk {
  104. isAdd = true
  105. addSql += GetAddSql(edbInfoIdStr, edbCode, dateTime, timeStr, saveVal)
  106. addMap[dateTime] = saveVal
  107. }
  108. } else {
  109. if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != saveVal {
  110. err = ModifyEdbDataById(source, findItem.EdbDataId, saveVal)
  111. if err != nil {
  112. return err
  113. }
  114. }
  115. }
  116. // 下面代码主要目的是处理掉手动插入的数据判断
  117. {
  118. if realDataMaxDate.IsZero() || t.After(realDataMaxDate) {
  119. realDataMaxDate = t
  120. }
  121. if edbDataInsertConfigDate.IsZero() || t.Equal(edbDataInsertConfigDate) {
  122. isFindConfigDateRealData = true
  123. }
  124. }
  125. }
  126. // 处理手工数据补充的配置
  127. HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, existMap, isFindConfigDateRealData)
  128. if isAdd {
  129. addSql = strings.TrimRight(addSql, ",")
  130. _, err = o.Raw(addSql).Exec()
  131. if err != nil {
  132. fmt.Println("RefreshEdbDataFromWind add Err", err.Error())
  133. return
  134. }
  135. }
  136. return
  137. }