Browse Source

Merge branch 'hotfix/wind_server_url' of eta_server/eta_api into master

xyxie 11 months ago
parent
commit
ee62a6ea23

+ 9 - 0
controllers/data_manage/edb_info.go

@@ -5372,6 +5372,13 @@ func (this *EdbInfoController) EdbInfoBatchAdd() {
 			return
 		}
 
+		terminalCode, serverUrl, _, e := data.GetEdbTerminalCodeBySource(v.Source, v.EdbCode, v.StockCode)
+		if e != nil {
+			br.Msg = "获取可以使用的终端地址失败"
+			br.ErrMsg = "获取可以使用的终端地址失败,Err:" + e.Error()
+			return
+		}
+
 		edbInfoItem := new(data_manage.EdbInfo)
 		edbInfoItem.Source = v.Source
 		switch v.Source {
@@ -5392,6 +5399,8 @@ func (this *EdbInfoController) EdbInfoBatchAdd() {
 		edbInfoItem.SysUserRealName = sysUser.RealName
 		edbInfoItem.IndicatorCode = v.EdbCode
 		edbInfoItem.StockCode = v.StockCode
+		edbInfoItem.TerminalCode = terminalCode
+		edbInfoItem.ServerUrl = serverUrl
 
 		// 指标入库
 		edbInfo, err, errMsg, isSendEmail := data.EdbInfoWsdAdd(edbInfoItem)

+ 23 - 0
models/data_manage/edb_config.go

@@ -0,0 +1,23 @@
+package data_manage
+
+import "github.com/beego/beego/v2/client/orm"
+
+type EdbConfig struct {
+	ConfigValue string `description:"详情"`
+}
+
+// EdbConfigUpdate 修改配置
+func EdbConfigUpdate(newValue, configCode string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE edb_config SET  config_value=?   WHERE config_code=  ?`
+	_, err = o.Raw(sql, newValue, configCode).Exec()
+	return
+}
+
+// GetConfigDetailByCode 根据配置编码获取配置的值
+func GetConfigDetailByCode(configCode string) (item *EdbConfig, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT config_value FROM edb_config WHERE config_code=? `
+	err = o.Raw(sql, configCode).QueryRow(&item)
+	return
+}

+ 21 - 0
models/data_manage/edb_terminal.go

@@ -127,3 +127,24 @@ func (item *EdbTerminal) Update(cols []string) (err error) {
 	_, err = o.Update(item, cols...)
 	return
 }
+
+// GetEdbTerminalByCode 根据终端编码获取终端信息
+func GetEdbTerminalByCode(terminalCode string) (item *EdbTerminal, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT *  FROM edb_terminal WHERE terminal_code = ? `
+	err = o.Raw(sql, terminalCode).QueryRow(&item)
+	return
+}
+
+type TerminalCodeCountGroup struct {
+	TerminalCode string
+	Total        int
+}
+
+// GetEdbCountGroupByTerminal 获取终端code分组总数
+func GetEdbCountGroupByTerminal(source int) (list []TerminalCodeCountGroup, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `select terminal_code,count(1) total from edb_info where source = ? AND no_update=0 AND terminal_code != "" group by terminal_code; `
+	_, err = o.Raw(sql, source).QueryRows(&list)
+	return
+}

+ 119 - 35
services/data/edb_info.go

@@ -2331,29 +2331,12 @@ func EdbInfoAdd(source, subSource, classifyId int, edbCode, edbName, frequency,
 	if source == utils.DATA_SOURCE_STOCK_PLANT {
 		edbType = 2 //计算指标
 	}
-	// todo 如果缓存中的终端信息丢了是否需要调整 从缓存中获取
-	serverUrl := ``
-	if edbInfo.Source == utils.DATA_SOURCE_WIND {
-		windCacheKey := utils.CACHE_WIND_URL + ":" + edbCode
-		serverUrl, _ = utils.Rc.RedisString(windCacheKey)
-		if serverUrl == `` {
-			if len(utils.Hz_Data_WIND_Url_List) >= 1 {
-				serverUrl = utils.Hz_Data_WIND_Url_List[len(utils.Hz_Data_WIND_Url_List)-1] //默认是最后一个服务器地址
-			}
-		}
-	}
-	// 获取终端信息
-	terminalCodeCacheKey := utils.CACHE_EDB_TERMINAL_CODE_URL + edbCode
-	terminalCode, tE := utils.Rc.RedisString(terminalCodeCacheKey)
-	if tE != nil {
-		utils.FileLog.Info(fmt.Sprintf("从缓存中获取数据源终端信息失败, Err: %s", tE))
-	}
-	var sourceIndexName string
-	if terminalCode == "" {
-		terminalCode, sourceIndexName, tE = GetTerminalFromBaseIndex(source, edbCode)
-		if tE != nil {
-			utils.FileLog.Info(fmt.Sprintf("获取数据源终端信息失败, Err: %s", tE))
-		}
+	// 从缓存中获取
+	terminalCode, serverUrl, sourceIndexName, e := GetEdbTerminalCodeBySource(edbInfo.Source, edbInfo.EdbCode, edbInfo.StockCode)
+	if e != nil {
+		errMsg = "获取可以使用的终端地址失败"
+		err = errors.New("获取可以使用的终端地址失败,Err:" + e.Error())
+		return
 	}
 	//获取该层级下最大的排序数
 	maxSort, err := GetEdbClassifyMaxSort(classifyId, 0)
@@ -3003,17 +2986,7 @@ func EdbInfoWsdAdd(item *data_manage.EdbInfo) (edbInfo *data_manage.EdbInfo, err
 	if source == utils.DATA_SOURCE_STOCK_PLANT {
 		edbType = 2 //计算指标
 	}
-	//从缓存中获取
-	serverUrl := ``
-	if edbInfo.Source == utils.DATA_SOURCE_WIND {
-		windCacheKey := utils.CACHE_WIND_URL + ":" + item.EdbCode
-		serverUrl, _ = utils.Rc.RedisString(windCacheKey)
-		if serverUrl == `` {
-			if len(utils.Hz_Data_WIND_Url_List) >= 1 {
-				serverUrl = utils.Hz_Data_WIND_Url_List[len(utils.Hz_Data_WIND_Url_List)-1] //默认是最后一个服务器地址
-			}
-		}
-	}
+
 	//获取该层级下最大的排序数
 	maxSort, err := GetEdbClassifyMaxSort(item.ClassifyId, 0)
 	if err != nil {
@@ -3032,7 +3005,7 @@ func EdbInfoWsdAdd(item *data_manage.EdbInfo) (edbInfo *data_manage.EdbInfo, err
 	edbInfo.SysUserRealName = item.SysUserRealName
 	edbInfo.CreateTime = time.Now()
 	edbInfo.ModifyTime = time.Now()
-	edbInfo.ServerUrl = serverUrl
+	edbInfo.ServerUrl = item.ServerUrl
 	edbInfo.Sort = maxSort + 1
 	edbInfo.DataDateType = `交易日`
 	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
@@ -3042,6 +3015,7 @@ func EdbInfoWsdAdd(item *data_manage.EdbInfo) (edbInfo *data_manage.EdbInfo, err
 	edbInfo.SubSourceName = "日期序列"
 	edbInfo.IndicatorCode = item.IndicatorCode
 	edbInfo.StockCode = item.StockCode
+	edbInfo.TerminalCode = item.TerminalCode
 	edbInfoId, err := data_manage.AddEdbInfo(edbInfo)
 	if err != nil {
 		errMsg = "保存失败"
@@ -3257,3 +3231,113 @@ func EdbInfoSmmApiAdd(item *data_manage.EdbInfo) (edbInfo *data_manage.EdbInfo,
 	AddOrEditEdbInfoToEs(int(edbInfoId))
 	return
 }
+
+// GetEdbTerminal 获取终端信息
+func GetEdbTerminal(source int, oldTerminalCode string) (edbTerminal *data_manage.EdbTerminal, err error) {
+	if source == utils.DATA_SOURCE_WIND && oldTerminalCode == "" {
+		tmpConfig := new(data_manage.EdbConfig)
+		tmpConfig, err = data_manage.GetConfigDetailByCode("wind_terminal_code")
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			err = errors.New("获取配置的wind地址失败,err:" + err.Error())
+			return
+		}
+		err = nil
+		if tmpConfig != nil {
+			oldTerminalCode = tmpConfig.ConfigValue
+			//return
+		}
+	}
+	if oldTerminalCode != "" {
+		edbTerminal, err = data_manage.GetEdbTerminalByCode(oldTerminalCode)
+		if err != nil {
+			return
+		}
+		return
+	}
+
+	// 配置中没有的话,那么就从分组获取,
+	list, err := data_manage.GetEdbCountGroupByTerminal(source)
+	if err != nil {
+		return
+	}
+	//windUrlNum := 0
+
+	//获取对应的配置url
+	terminalNumMap := make(map[string]int)
+	for _, v := range list {
+		terminalNumMap[v.TerminalCode] = v.Total
+	}
+
+	terminalList, err := data_manage.GetEdbTerminalListBySource(source)
+	if err != nil {
+		return
+	}
+	if len(terminalList) == 0 {
+		err = errors.New("终端地址未配置")
+		return
+	}
+	num := 0
+	for _, v := range terminalList {
+		tmpNum := terminalNumMap[v.TerminalCode]
+		if edbTerminal == nil {
+			edbTerminal = v
+			num = tmpNum
+		} else if tmpNum < num {
+			edbTerminal = v
+			num = tmpNum
+		}
+	}
+	if edbTerminal == nil {
+		err = errors.New("获取配置的终端地址失败")
+		return
+	}
+	/*if edbTerminal != nil {
+		windUrl = edbTerminal.ServerUrl
+		terminalCode = edbTerminal.TerminalCode
+	}*/
+	return
+}
+
+func GetEdbTerminalCodeBySource(source int, edbCode, stockCode string) (terminalCode, serverUrl, sourceIndexName string, err error) {
+	var e error
+	if stockCode != "" {
+		terminalCodeCacheKey := utils.CACHE_EDB_TERMINAL_CODE_URL + stockCode
+		terminalCode, e = utils.Rc.RedisString(terminalCodeCacheKey)
+		if e != nil {
+			utils.FileLog.Info(fmt.Sprintf("从缓存中获取数据源终端信息失败, Err: %s", e))
+		}
+
+		terminalInfo, e := GetEdbTerminal(source, terminalCode)
+		if e != nil {
+			err = errors.New("获取可以使用的终端失败,Err:" + e.Error())
+			return
+		}
+		serverUrl = terminalInfo.ServerUrl
+		terminalCode = terminalInfo.TerminalCode
+		return
+	}
+	// 获取终端信息
+	terminalCodeCacheKey := utils.CACHE_EDB_TERMINAL_CODE_URL + edbCode
+	terminalCode, tE := utils.Rc.RedisString(terminalCodeCacheKey)
+	if tE != nil {
+		utils.FileLog.Info(fmt.Sprintf("从缓存中获取数据源终端信息失败, Err: %s", tE))
+	}
+	var terminalCodeOrigin string
+	terminalCodeOrigin, sourceIndexName, tE = GetTerminalFromBaseIndex(source, edbCode)
+	if tE != nil {
+		utils.FileLog.Info(fmt.Sprintf("获取数据源终端信息失败, Err: %s", tE))
+	}
+	if terminalCodeOrigin != "" {
+		terminalCode = terminalCodeOrigin
+	}
+	if source == utils.DATA_SOURCE_WIND || source == utils.DATA_SOURCE_THS {
+		terminalInfo, e := GetEdbTerminal(source, terminalCode)
+		if e != nil {
+			err = errors.New("获取可以使用的终端失败,Err:" + e.Error())
+			return
+		}
+		serverUrl = terminalInfo.ServerUrl
+		terminalCode = terminalInfo.TerminalCode
+	}
+	return
+}