|
@@ -2,10 +2,13 @@ package services
|
|
|
|
|
|
import (
|
|
import (
|
|
"encoding/json"
|
|
"encoding/json"
|
|
|
|
+ "eta/eta_index_lib/logic"
|
|
"eta/eta_index_lib/models"
|
|
"eta/eta_index_lib/models"
|
|
|
|
+ "eta/eta_index_lib/services/alarm_msg"
|
|
"eta/eta_index_lib/utils"
|
|
"eta/eta_index_lib/utils"
|
|
"fmt"
|
|
"fmt"
|
|
"github.com/rdlucklib/rdluck_tools/http"
|
|
"github.com/rdlucklib/rdluck_tools/http"
|
|
|
|
+ "github.com/shopspring/decimal"
|
|
"net/url"
|
|
"net/url"
|
|
"strings"
|
|
"strings"
|
|
"time"
|
|
"time"
|
|
@@ -22,6 +25,9 @@ func GetEdbDataFromThsHf(thsParams models.ThsHfSearchEdbReq, terminalCode string
|
|
err = fmt.Errorf("获取同花顺终端配置失败, %v", e)
|
|
err = fmt.Errorf("获取同花顺终端配置失败, %v", e)
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
+ if thsParams.EndTime == "" {
|
|
|
|
+ thsParams.EndTime = time.Now().Local().Format(utils.FormatDateTime)
|
|
|
|
+ }
|
|
|
|
|
|
// 走API
|
|
// 走API
|
|
if utils.ThsDataMethod == "" || utils.ThsDataMethod == "api" {
|
|
if utils.ThsDataMethod == "" || utils.ThsDataMethod == "api" {
|
|
@@ -302,3 +308,208 @@ func getEdbDataFromThsHfApp(thsParams models.ThsHfSearchEdbReq, num int, serverU
|
|
}
|
|
}
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+// WriteRefreshBaseThsHfIndex 源指标刷新
|
|
|
|
+func WriteRefreshBaseThsHfIndex(indexItem *models.BaseFromThsHfIndex, codeWithData *models.ThsHfIndexWithData, startTime string) (err error) {
|
|
|
|
+ defer func() {
|
|
|
|
+ if err != nil {
|
|
|
|
+ tips := fmt.Sprintf("WriteRefreshBaseThsHfIndex-更新失败, %v", err)
|
|
|
|
+ utils.FileLog.Info(tips)
|
|
|
|
+ go alarm_msg.SendAlarmMsg(tips, 3)
|
|
|
|
+ }
|
|
|
|
+ }()
|
|
|
|
+ if indexItem == nil {
|
|
|
|
+ err = fmt.Errorf("指标不存在")
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ if len(codeWithData.IndexData) == 0 {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 获取源指标数据
|
|
|
|
+ dataOb := new(models.BaseFromThsHfData)
|
|
|
|
+ originData := make([]*models.BaseFromThsHfData, 0)
|
|
|
|
+ {
|
|
|
|
+ cond := fmt.Sprintf(" AND %s = ?", dataOb.Cols().IndexCode)
|
|
|
|
+ pars := make([]interface{}, 0)
|
|
|
|
+ pars = append(pars, indexItem.IndexCode)
|
|
|
|
+ if startTime != "" {
|
|
|
|
+ cond += fmt.Sprintf(" AND %s >= ?", dataOb.Cols().DataTime)
|
|
|
|
+ pars = append(pars, startTime)
|
|
|
|
+ }
|
|
|
|
+ list, e := dataOb.GetItemsByCondition(cond, pars, []string{}, "")
|
|
|
|
+ if e != nil {
|
|
|
|
+ err = fmt.Errorf("获取源指标数据失败, %v", e)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ originData = list
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 更新指标数据
|
|
|
|
+ dateExist := make(map[string]*models.BaseFromThsHfData)
|
|
|
|
+ newValExist := make(map[string]bool)
|
|
|
|
+ if len(originData) > 0 {
|
|
|
|
+ // unicode去重
|
|
|
|
+ for _, d := range originData {
|
|
|
|
+ uni := utils.MD5(fmt.Sprint(indexItem.IndexCode, d.DataTime.Format("2006-01-02 15:04")))
|
|
|
|
+ dateExist[uni] = d
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 筛选新增/更新数据
|
|
|
|
+ updateData := make([]*models.BaseFromThsHfData, 0)
|
|
|
|
+ insertData := make([]*models.BaseFromThsHfData, 0)
|
|
|
|
+ for _, d := range codeWithData.IndexData {
|
|
|
|
+ uni := utils.MD5(fmt.Sprint(indexItem.IndexCode, d.DataTime.Format("2006-01-02 15:04")))
|
|
|
|
+ origin := dateExist[uni]
|
|
|
|
+
|
|
|
|
+ // unicode检验是否存在
|
|
|
|
+ strNewVal := decimal.NewFromFloat(d.Value).Round(4).String()
|
|
|
|
+ di, _ := decimal.NewFromString(strNewVal)
|
|
|
|
+ newVal, _ := di.Float64()
|
|
|
|
+ if origin != nil {
|
|
|
|
+ strExistVal := decimal.NewFromFloat(origin.Value).Round(4).String()
|
|
|
|
+ if strNewVal == strExistVal {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ origin.Value = newVal
|
|
|
|
+ origin.ModifyTime = time.Now().Local()
|
|
|
|
+ updateData = append(updateData, origin)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 新增的数据去重
|
|
|
|
+ if newValExist[uni] {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ newValExist[uni] = true
|
|
|
|
+ newData := new(models.BaseFromThsHfData)
|
|
|
|
+ newData.BaseFromThsHfIndexId = indexItem.BaseFromThsHfIndexId
|
|
|
|
+ newData.IndexCode = indexItem.IndexCode
|
|
|
|
+ newData.DataTime = d.DataTime
|
|
|
|
+ newData.Value = newVal
|
|
|
|
+ newData.CreateTime = time.Now()
|
|
|
|
+ newData.ModifyTime = time.Now()
|
|
|
|
+ newData.DataTimestamp = d.DataTime.UnixNano() / 1e6
|
|
|
|
+ insertData = append(insertData, newData)
|
|
|
|
+ }
|
|
|
|
+ if e := dataOb.MultiInsertOrUpdate(insertData, updateData); e != nil {
|
|
|
|
+ err = fmt.Errorf("新增/更新源指标数据失败, %v", e)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 更新指标开始结束时间
|
|
|
|
+ minMax, e := dataOb.GetIndexMinMax(indexItem.IndexCode)
|
|
|
|
+ if e == nil && minMax != nil {
|
|
|
|
+ minDate, e := time.ParseInLocation(utils.FormatDateTime, minMax.MinDate, time.Local)
|
|
|
|
+ if e != nil {
|
|
|
|
+ err = fmt.Errorf("源数据最小日期有误, MinDate: %s, %v", minMax.MinDate, e)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ maxDate, e := time.ParseInLocation(utils.FormatDateTime, minMax.MaxDate, time.Local)
|
|
|
|
+ if e != nil {
|
|
|
|
+ err = fmt.Errorf("源数据最大日期有误, MaxDate: %s, %v", minMax.MaxDate, e)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ indexItem.StartDate = minDate
|
|
|
|
+ indexItem.EndDate = maxDate
|
|
|
|
+ indexItem.ModifyTime = time.Now().Local()
|
|
|
|
+ updateCols := []string{indexItem.Cols().StartDate, indexItem.Cols().EndDate, indexItem.Cols().ModifyTime}
|
|
|
|
+ if e = indexItem.Update(updateCols); e != nil {
|
|
|
|
+ err = fmt.Errorf("更新源指标开始结束时间失败, %v", e)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 同步刷新指标库
|
|
|
|
+ go func() {
|
|
|
|
+ _ = RefreshThsHfIndexFromBase(indexItem.IndexCode, startTime)
|
|
|
|
+ }()
|
|
|
|
+ return
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// RefreshThsHfIndexFromBase 根据源指标刷新指标库
|
|
|
|
+func RefreshThsHfIndexFromBase(baseCode, startTime string) (err error) {
|
|
|
|
+ defer func() {
|
|
|
|
+ if err != nil {
|
|
|
|
+ tips := fmt.Sprintf("RefreshThsHfIndexFromBase-刷新指标库失败, %v", err)
|
|
|
|
+ utils.FileLog.Info(tips)
|
|
|
|
+ go alarm_msg.SendAlarmMsg(tips, 3)
|
|
|
|
+ }
|
|
|
|
+ }()
|
|
|
|
+
|
|
|
|
+ // 获取指标关联信息
|
|
|
|
+ mappings := make([]*models.BaseFromEdbMapping, 0)
|
|
|
|
+ {
|
|
|
|
+ ob := new(models.BaseFromEdbMapping)
|
|
|
|
+ cond := fmt.Sprintf(" AND %s = ?", ob.Cols().BaseIndexCode)
|
|
|
|
+ pars := make([]interface{}, 0)
|
|
|
|
+ pars = append(pars, baseCode)
|
|
|
|
+ list, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
|
|
|
|
+ if e != nil {
|
|
|
|
+ err = fmt.Errorf("获取源指标关联失败, %v", e)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ mappings = list
|
|
|
|
+ }
|
|
|
|
+ if len(mappings) == 0 {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ codeMapping := make(map[string]*models.BaseFromEdbMapping)
|
|
|
|
+ edbInfoIds := make([]int, 0)
|
|
|
|
+ for _, v := range mappings {
|
|
|
|
+ if codeMapping[v.EdbCode] == nil {
|
|
|
|
+ codeMapping[v.EdbCode] = v
|
|
|
|
+ }
|
|
|
|
+ edbInfoIds = append(edbInfoIds, v.EdbInfoId)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 指标信息
|
|
|
|
+ edbInfoList, e := models.GetEdbInfoByIdList(edbInfoIds)
|
|
|
|
+ if e != nil {
|
|
|
|
+ err = fmt.Errorf("获取指标信息列表失败, %v", e)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ codeEdb := make(map[string]*models.EdbInfo)
|
|
|
|
+ for _, v := range edbInfoList {
|
|
|
|
+ if codeEdb[v.EdbCode] == nil {
|
|
|
|
+ codeEdb[v.EdbCode] = v
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ thsOb := new(models.EdbThsHf)
|
|
|
|
+ source := thsOb.GetSource()
|
|
|
|
+ subSource := thsOb.GetSubSource()
|
|
|
|
+ for _, v := range mappings {
|
|
|
|
+ cacheKey := fmt.Sprintf("%s_%d_%d_%s", utils.CACHE_EDB_DATA_REFRESH, source, subSource, v.EdbCode)
|
|
|
|
+ if utils.Rc.IsExist(cacheKey) {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
|
|
|
|
+
|
|
|
|
+ edb := codeEdb[v.EdbCode]
|
|
|
|
+ if edb == nil {
|
|
|
|
+ utils.FileLog.Info(fmt.Sprintf("RefreshThsHfIndexFromBase-指标信息有误, EdbCode: %s", v.EdbCode))
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 刷新指标
|
|
|
|
+ if e := thsOb.Refresh(edb, codeMapping[v.EdbCode], startTime); e != nil {
|
|
|
|
+ utils.FileLog.Info(fmt.Sprintf("RefreshThsHfIndexFromBase-刷新指标失败, %v", e))
|
|
|
|
+ _ = utils.Rc.Delete(cacheKey)
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 更新指标最值
|
|
|
|
+ e, _ = models.UnifiedModifyEdbInfoMaxAndMinInfo(edb)
|
|
|
|
+ if e != nil {
|
|
|
|
+ utils.FileLog.Info(fmt.Sprintf("RefreshThsHfIndexFromBase-更新指标最值失败, %v", e))
|
|
|
|
+ _ = utils.Rc.Delete(cacheKey)
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ _ = utils.Rc.Delete(cacheKey)
|
|
|
|
+
|
|
|
|
+ // 更新ES
|
|
|
|
+ go logic.UpdateEs(edb.EdbInfoId)
|
|
|
|
+ }
|
|
|
|
+ return
|
|
|
|
+}
|