edb_trade_analysis.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package models
  2. import (
  3. "eta_gn/eta_index_lib/utils"
  4. "fmt"
  5. "github.com/shopspring/decimal"
  6. "time"
  7. )
  8. type EdbTradeAnalysis struct{}
  9. func (obj EdbTradeAnalysis) GetSource() int {
  10. return utils.DATA_SOURCE_TRADE_ANALYSIS
  11. }
  12. func (obj EdbTradeAnalysis) GetSourceName() string {
  13. return utils.DATA_SOURCE_NAME_TRADE_ANALYSIS
  14. }
  15. func (obj EdbTradeAnalysis) GetEdbType() int {
  16. return utils.DEFAULT_EDB_TYPE
  17. }
  18. func (obj EdbTradeAnalysis) Refresh(edbInfo *EdbInfo, convertData []*EdbDataList) (err error) {
  19. if edbInfo == nil {
  20. err = fmt.Errorf("指标信息有误, EdbInfo: %v", edbInfo)
  21. return
  22. }
  23. var realDataMaxDate, edbDataInsertConfigDate time.Time
  24. var edbDataInsertConfig *EdbDataInsertConfig
  25. var isFindConfigDateRealData bool
  26. {
  27. conf, e := GetEdbDataInsertConfigByEdbId(edbInfo.EdbInfoId)
  28. if e != nil && e.Error() != utils.ErrNoRow() {
  29. err = fmt.Errorf("GetEdbDataInsertConfigByEdbId err: %v", e)
  30. return
  31. }
  32. edbDataInsertConfig = conf
  33. if edbDataInsertConfig != nil {
  34. edbDataInsertConfigDate = edbDataInsertConfig.Date
  35. }
  36. }
  37. dataOb := new(EdbDataTradeAnalysis)
  38. dataExists := make(map[string]*EdbDataTradeAnalysis)
  39. searchExistMap := make(map[string]*EdbInfoSearchData)
  40. {
  41. cond := fmt.Sprintf(" AND %s = ?", dataOb.Cols().EdbInfoId)
  42. pars := make([]interface{}, 0)
  43. pars = append(pars, edbInfo.EdbInfoId)
  44. list, e := dataOb.GetItemsByCondition(cond, pars, []string{}, "")
  45. if e != nil {
  46. err = fmt.Errorf("获取指标数据失败, %v", e)
  47. return
  48. }
  49. for _, v := range list {
  50. dataExists[v.DataTime.Format(utils.FormatDate)] = v
  51. searchExistMap[v.DataTime.Format(utils.FormatDate)] = &EdbInfoSearchData{
  52. EdbDataId: v.EdbDataId,
  53. EdbInfoId: v.EdbInfoId,
  54. DataTime: v.DataTime.Format(utils.FormatDate),
  55. Value: v.Value,
  56. EdbCode: v.EdbCode,
  57. DataTimestamp: v.DataTimestamp,
  58. }
  59. }
  60. }
  61. insertExist := make(map[string]bool)
  62. insertData := make([]*EdbDataTradeAnalysis, 0)
  63. updateData := make([]*EdbDataTradeAnalysis, 0)
  64. for _, v := range convertData {
  65. dataDate, e := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
  66. if e != nil {
  67. utils.FileLog.Info(fmt.Sprintf("持仓分析-数据日期转换失败, EdbCode: %s, DataDate: %s", edbInfo.EdbCode, v.DataTime))
  68. continue
  69. }
  70. strDate := v.DataTime
  71. if realDataMaxDate.IsZero() || dataDate.After(realDataMaxDate) {
  72. realDataMaxDate = dataDate
  73. }
  74. if edbDataInsertConfigDate.IsZero() || dataDate.Equal(edbDataInsertConfigDate) {
  75. isFindConfigDateRealData = true
  76. }
  77. saveVal := decimal.NewFromFloat(v.Value).Round(4).String()
  78. d, e := decimal.NewFromString(saveVal)
  79. if e != nil {
  80. utils.FileLog.Info(fmt.Sprintf("EdbDataTradeAnalysis NewFromString err: %v", e))
  81. continue
  82. }
  83. saveFloat, _ := d.Float64()
  84. exists := dataExists[strDate]
  85. if exists != nil {
  86. existVal := decimal.NewFromFloat(exists.Value).Round(4).String()
  87. if saveVal != existVal {
  88. exists.Value = saveFloat
  89. updateData = append(updateData, exists)
  90. }
  91. continue
  92. }
  93. if insertExist[strDate] {
  94. continue
  95. }
  96. insertExist[strDate] = true
  97. timestamp := dataDate.UnixNano() / 1e6
  98. insertData = append(insertData, &EdbDataTradeAnalysis{
  99. EdbInfoId: edbInfo.EdbInfoId,
  100. EdbCode: edbInfo.EdbCode,
  101. DataTime: dataDate,
  102. Value: saveFloat,
  103. CreateTime: time.Now(),
  104. ModifyTime: time.Now(),
  105. DataTimestamp: timestamp,
  106. })
  107. }
  108. if len(insertData) > 0 {
  109. if e := dataOb.CreateMulti(insertData); e != nil {
  110. err = fmt.Errorf("批量新增指标数据失败, %v", e)
  111. return
  112. }
  113. }
  114. if len(updateData) > 0 {
  115. if e := dataOb.MultiUpdateValue(updateData); e != nil {
  116. err = fmt.Errorf("批量更新指标数据失败, %v", e)
  117. return
  118. }
  119. }
  120. HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfo.EdbInfoId, obj.GetSource(), 0, searchExistMap, isFindConfigDateRealData)
  121. return
  122. }
  123. func (obj EdbTradeAnalysis) UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo *EdbInfo) (err error) {
  124. err, _ = UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
  125. return
  126. }