Kaynağa Gözat

Merge branch 'fix/2022-06-16' into debug

# Conflicts:
#	models/edb_info.go
Roc 2 yıl önce
ebeveyn
işleme
fc836225b0
3 değiştirilmiş dosya ile 143 ekleme ve 12 silme
  1. 16 2
      controllers/base_from_wind.go
  2. 18 0
      models/edb_info.go
  3. 109 10
      services/base_from_wind.go

+ 16 - 2
controllers/base_from_wind.go

@@ -50,7 +50,10 @@ func (this *WindController) Add() {
 			endDate = time.Now().Format(utils.FormatDate)
 		}
 
-		dataItem, err := services.GetEdbDataFromWind(req.EdbCode, utils.BASE_START_DATE, endDate)
+		dataItem, errCode, err := services.GetEdbDataFromWind(req.EdbCode, utils.BASE_START_DATE, endDate)
+		if errCode == 421 { //指标超限
+			br.Ret = 421
+		}
 		if err != nil {
 			br.Msg = "获取指标信息失败!"
 			br.ErrMsg = "获取指标信息失败 GetEdbDataFromWind,Err:" + err.Error()
@@ -106,6 +109,14 @@ func (this *WindController) Refresh() {
 	if !utils.Rc.IsExist(cacheKey) {
 		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
 
+		//获取指标信息
+		edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
+		if err != nil {
+			br.Msg = "查询指标信息失败!"
+			br.ErrMsg = "查询指标信息失败 Err:" + err.Error()
+			return
+		}
+
 		//特定的指标过滤(wind不对该指标进行更新了)
 		{
 			edbCodeArr := []string{"S6451662", "S6451679", "S6451670", "S6451671", "s6451669", "S6451693", "S6451694"}
@@ -124,7 +135,10 @@ func (this *WindController) Refresh() {
 			endDate = time.Now().Format(utils.FormatDate)
 		}
 
-		dataItem, err := services.GetEdbDataFromWind(req.EdbCode, req.StartDate, endDate)
+		dataItem, errCode, err := services.GetEdbDataFromWindUrl(edbInfo.ServerUrl, req.EdbCode, req.StartDate, endDate)
+		if errCode == 421 { //指标超限
+			br.Ret = 421
+		}
 		if err != nil {
 			br.Msg = "获取指标信息失败!"
 			br.ErrMsg = "获取指标信息失败 GetEdbDataFromWind,Err:" + err.Error()

+ 18 - 0
models/edb_info.go

@@ -30,6 +30,8 @@ type EdbInfo struct {
 	Sort             int     `description:"排序字段"`
 	MoveType         int     `description:"移动方式:1:领先(默认),2:滞后"`
 	MoveFrequency    string  `description:"移动频度"`
+	NoUpdate         int8    `description:"是否停止更新,0:继续更新;1:停止更新"`
+	ServerUrl        string  `description:"服务器地址"`
 }
 
 // AddEdbInfo 添加指标
@@ -249,3 +251,19 @@ func GetEdbDataListAllV1(condition string, pars []interface{}, source, order int
 	_, err = o.Raw(sql, pars).QueryRows(&item)
 	return
 }
+
+// GetEdbInfoByCondition 获取指标列表
+func GetEdbInfoByCondition(condition string, pars []interface{}, order int) (item []*EdbInfo, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM edb_info WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	if order == 1 {
+		sql += ` ORDER BY end_date ASC `
+	} else {
+		sql += ` ORDER BY edb_info_id ASC `
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}

+ 109 - 10
services/base_from_wind.go

@@ -18,9 +18,10 @@ type EdbDataFromWind struct {
 }
 
 // GetEdbDataFromWind 获取wind数据
-func GetEdbDataFromWind(edbCode, startDate, endDate string) (item *EdbDataFromWind, err error) {
+func GetEdbDataFromWind(edbCode, startDate, endDate string) (item *EdbDataFromWind, errorCode int, err error) {
 	windUrl, err := GetWindUrl(edbCode)
 	if err != nil {
+		errorCode = 421
 		go alarm_msg.SendAlarmMsg(fmt.Sprintf("获取wind服务器地址失败,err:%s", err.Error()), 3)
 		return
 	}
@@ -41,7 +42,67 @@ func GetEdbDataFromWind(edbCode, startDate, endDate string) (item *EdbDataFromWi
 	//异常的话,需要邮件通知
 	if len(item.ErrorCode) > 0 {
 		if item.ErrorCode["0"] != 0 {
-			go alarm_msg.SendAlarmMsg(fmt.Sprintf("wind数据服务异常,edbCode:%s,ErrorCode:%d", edbCode, item.ErrorCode["0"]), 3)
+			if item.ErrorCode["0"] == -40522017 {
+				//{
+				//DT: {
+				//0: 1654646400000
+				//},
+				//CLOSE: {
+				//0: "CEDBService:: quota exceeded."
+				//},
+				//ErrorCode: {
+				//0: -40522017
+				//}
+				//}
+				// 设置服务器已超限
+				SetIsLimitEdbCodeInWindUrl(windUrl)
+				err = DeleteEdbCodeInWindUrl(edbCode)
+				if err != nil {
+					return
+				}
+				return GetEdbDataFromWind(edbCode, startDate, endDate)
+			} else if item.ErrorCode["0"] == -40520005 {
+				//.ErrorCode=-40520005
+				//.Data=[No Python API Authority
+				SetIsLimitEdbCodeInWindUrl(windUrl)
+				err = DeleteEdbCodeInWindUrl(edbCode)
+				if err != nil {
+					return
+				}
+				go alarm_msg.SendAlarmMsg(fmt.Sprintf("wind数据服务异常,edbCode:%s,ErrorCode:%d,result:%s", edbCode, item.ErrorCode["0"], string(body)), 3)
+				return GetEdbDataFromWind(edbCode, startDate, endDate)
+			} else {
+				go alarm_msg.SendAlarmMsg(fmt.Sprintf("wind数据服务异常,edbCode:%s,ErrorCode:%d,result:%s", edbCode, item.ErrorCode["0"], string(body)), 3)
+			}
+		}
+	}
+	return
+}
+
+// GetEdbDataFromWindUrl 通过url获取wind数据
+func GetEdbDataFromWindUrl(windUrl, edbCode, startDate, endDate string) (item *EdbDataFromWind, errorCode int, err error) {
+	if windUrl == `` {
+		return GetEdbDataFromWind(edbCode, startDate, endDate)
+	}
+
+	thsUrl := windUrl + `edbInfo/wind?EdbCode=%s&StartDate=%s&EndDate=%s`
+	thsUrl = fmt.Sprintf(thsUrl, edbCode, startDate, endDate)
+	utils.FileLog.Info(fmt.Sprintf("windUrl:%s", thsUrl))
+	body, err := http.Get(thsUrl)
+	fmt.Println("GetEdbDataByWind body:")
+	fmt.Println(string(body))
+	utils.FileLog.Info(fmt.Sprint("wind result:", string(body)))
+
+	if err != nil {
+		return
+	}
+	item = new(EdbDataFromWind)
+	err = json.Unmarshal(body, &item)
+
+	//异常的话,需要邮件通知
+	if len(item.ErrorCode) > 0 {
+		if item.ErrorCode["0"] != 0 {
+			go alarm_msg.SendAlarmMsg(fmt.Sprintf("wind数据服务异常,url:%s;edbCode:%s,ErrorCode:%d,result:%s", windUrl, edbCode, item.ErrorCode["0"], string(body)), 3)
 		}
 	}
 	return
@@ -63,16 +124,26 @@ func GetWindUrl(edbCode string) (windUrl string, err error) {
 	//如果缓存中没有的话,那么从配置中获取
 	for _, windUrlMap := range utils.Hz_Wind_Data_Url_LIST {
 		//判断该url是否被占满了
-		count, tmpErr := GetCountEdbCodeInWindUrl(windUrlMap.Url)
-		if tmpErr != nil && tmpErr.Error() != "nil returned" {
+		//count, tmpErr := GetCountEdbCodeInWindUrl(windUrlMap.Url)
+		//if tmpErr != nil && tmpErr.Error() != "nil returned" {
+		//	err = tmpErr
+		//	return
+		//}
+		//if count < windUrlMap.Num {
+		//	windUrl = windUrlMap.Url
+		//	AddEdbCodeInWindUrl(windUrlMap.Url, edbCode)
+		//	return
+		//}
+		//如果超限了,那么进入下一循环
+		isLimit, tmpErr := GetIsLimitEdbCodeInWindUrl(windUrlMap.Url)
+		if isLimit {
 			err = tmpErr
-			return
-		}
-		if count < windUrlMap.Num {
-			windUrl = windUrlMap.Url
-			AddEdbCodeInWindUrl(windUrlMap.Url, edbCode)
-			return
+			continue
 		}
+
+		windUrl = windUrlMap.Url
+		AddEdbCodeInWindUrl(windUrlMap.Url, edbCode)
+		return
 	}
 	return
 }
@@ -87,6 +158,27 @@ func GetCountEdbCodeInWindUrl(windUrl string) (num int, err error) {
 	return
 }
 
+// GetIsLimitEdbCodeInWindUrl 从缓存key中获取是否超限
+func GetIsLimitEdbCodeInWindUrl(windUrl string) (isLimit bool, err error) {
+	cacheKey := utils.CACHE_WIND_URL + ":limit:" + time.Now().Format(utils.FormatDateUnSpace) + ":" + utils.MD5(windUrl)
+
+	num, err := utils.Rc.RedisInt(cacheKey)
+	if err != nil && err.Error() == "redigo: nil returned" {
+		err = nil
+	}
+	if num > 0 {
+		isLimit = true
+	}
+	return
+}
+
+// SetIsLimitEdbCodeInWindUrl 设置服务器已超限
+func SetIsLimitEdbCodeInWindUrl(windUrl string) {
+	cacheKey := utils.CACHE_WIND_URL + ":limit:" + time.Now().Format(utils.FormatDateUnSpace) + ":" + utils.MD5(windUrl)
+	_ = utils.Rc.SetNX(cacheKey, 1, utils.GetTodayLastSecond())
+	return
+}
+
 // AddEdbCodeInWindUrl 将指标插入到缓存key中
 // @return isInsert bool 是否插入数据,true时为插入数据,false表示数据已存在
 func AddEdbCodeInWindUrl(windUrl, edbCode string) (isInsert bool) {
@@ -97,3 +189,10 @@ func AddEdbCodeInWindUrl(windUrl, edbCode string) (isInsert bool) {
 	utils.Rc.Incrby(cacheKey2, 1)
 	return
 }
+
+// DeleteEdbCodeInWindUrl 删除指标编码 服务器归属 缓存
+func DeleteEdbCodeInWindUrl(edbCode string) (err error) {
+	cacheKey := utils.CACHE_WIND_URL + ":" + edbCode
+	err = utils.Rc.Delete(cacheKey)
+	return
+}