浏览代码

Merge branch 'chart/12.4' into debug

Roc 2 年之前
父节点
当前提交
1441a2907e

+ 43 - 16
controllers/future_good/future_good_edb_info.go

@@ -41,7 +41,7 @@ func (this *FutureGoodEdbInfoController) Add() {
 	}
 	req.EdbCode = utils.TrimStr(req.EdbCode)
 	cacheKey = utils.CACHE_EDB_DATA_ADD + "_futuregood_" + req.EdbCode
-	if !utils.Rc.IsExist(cacheKey) {
+	if true {
 		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
 		defer func() {
 			utils.Rc.Delete(cacheKey)
@@ -61,17 +61,14 @@ func (this *FutureGoodEdbInfoController) Add() {
 		}
 
 		//endDate := utils.BASE_END_DATE
+		endDateTime := time.Now()
+		//每天下午三点之前刷新数据的话,截止日期就到昨天,三点之后才刷新到今天的日期
+		if endDateTime.Hour() < 15 {
+			endDateTime = endDateTime.AddDate(0, 0, -1)
+		}
 		endDate := time.Now().Format(utils.FormatDate)
 
-		windUrl := utils.Hz_Wind_Data_Url_LIST[0].Url
-
-		dataItem, errCode, err := services.GetFutureGoodDataFromWindUrl(windUrl, 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
-			br.Msg = "指标超限!"
-			return
-		}
+		dataItem, err := services.GetFutureGoodDataFromThs(req.EdbCode, utils.BASE_START_DATE, endDate, 0)
 		if err != nil {
 			br.Msg = "获取指标信息失败!"
 			br.ErrMsg = "获取指标信息失败 GetEdbDataFromWind,Err:" + err.Error()
@@ -84,6 +81,14 @@ func (this *FutureGoodEdbInfoController) Add() {
 			br.ErrMsg = "获取指标信息失败 AddEdbDataFromWind,Err:" + err.Error()
 			return
 		}
+
+		// 更新指标最大最小值
+		err, errMsg := future_good.UnifiedModifyEdbInfoMaxAndMinInfo(futureGoodEdbInfo)
+		if err != nil {
+			br.Msg = errMsg
+			br.ErrMsg = err.Error()
+			return
+		}
 		br.Ret = 200
 		br.Success = true
 		br.Msg = "获取成功"
@@ -151,18 +156,20 @@ func (this *FutureGoodEdbInfoController) Refresh() {
 
 	//期货数据,就默认到今天,特殊处理下
 	//endDate := utils.BASE_END_DATE
-	endDate := time.Now().Format(utils.FormatDate)
-
-	dataItem, errCode, err := services.GetFutureGoodDataFromWindUrl(futureGoodEdbInfo.ServerUrl, req.FutureGoodEdbCode, req.StartDate, endDate)
-	if errCode == 421 { //指标超限
-		br.Ret = 421
+	endDateTime := time.Now()
+	//每天下午三点之前刷新数据的话,截止日期就到昨天,三点之后才刷新到今天的日期
+	if endDateTime.Hour() < 15 {
+		endDateTime = endDateTime.AddDate(0, 0, -1)
 	}
+	endDate := endDateTime.Format(utils.FormatDate)
+
+	dataItem, err := services.GetFutureGoodDataFromThs(req.FutureGoodEdbCode, req.StartDate, endDate, 0)
 	if err != nil {
 		br.Msg = "获取指标信息失败!"
 		br.ErrMsg = "获取指标信息失败 GetEdbDataFromWind,Err:" + err.Error()
 		return
 	}
-	err = future_good.RefreshFutureGoodEdbDataFromWind(req.FutureGoodEdbInfoId, req.FutureGoodEdbCode, req.StartDate, dataItem)
+	err = future_good.RefreshFutureGoodEdbDataFromThs(req.FutureGoodEdbInfoId, req.FutureGoodEdbCode, req.StartDate, dataItem)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "刷新指标信息失败!"
 		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromWind,Err:" + err.Error()
@@ -180,3 +187,23 @@ func (this *FutureGoodEdbInfoController) Refresh() {
 	br.Success = true
 	br.Msg = "获取成功"
 }
+
+//func init() {
+//
+//	list, err := future_good.GetFutureGoodEdbInfoList(" AND start_date = '0000-00-00' ", []interface{}{})
+//	if err != nil {
+//		fmt.Println("list err:", err)
+//		return
+//	}
+//
+//	fmt.Println("start")
+//	for _, futureGoodEdbInfo := range list {
+//		// 更新指标最大最小值
+//		err, errMsg := future_good.UnifiedModifyEdbInfoMaxAndMinInfo(futureGoodEdbInfo)
+//		if err != nil {
+//			fmt.Println(futureGoodEdbInfo.FutureGoodEdbCode, "更新失败:", errMsg, ";err:", err)
+//			return
+//		}
+//	}
+//	fmt.Println("end")
+//}

+ 68 - 49
models/future_good/future_good_edb_data.go

@@ -64,7 +64,7 @@ func GetFutureGoodEdbDataList(condition string, pars []interface{}) (list []*Fut
 }
 
 // AddEdbDataFromWind 添加wind商品指标数据
-func AddEdbDataFromWind(futureGoodEdbInfoId int, edbCode string, item *services.FutureGoodDataFromWind) (err error) {
+func AddEdbDataFromWind(futureGoodEdbInfoId int, edbCode string, item *services.FutureGoodDataFromThs) (err error) {
 	var errMsg string
 	o := orm.NewOrm()
 	defer func() {
@@ -76,23 +76,32 @@ func AddEdbDataFromWind(futureGoodEdbInfoId int, edbCode string, item *services.
 
 	var isAdd bool
 	addSql := ` INSERT INTO future_good_edb_data(future_good_edb_info_id,future_good_edb_code,data_time,trade_code,open,high,low,close,volume,amt,oi,settle,create_time,modify_time,data_timestamp) values `
-	for k, v := range item.Dt {
-		timeStr := fmt.Sprintf("%d", v)
-		v = v / 1000
-		t := time.Unix(v, 0)
-		dateTime := t.Format(utils.FormatDate)
-		tradeCode := item.TradeCode[k]
-		open := utils.SubFloatToString(item.Open[k], 20)
-		high := utils.SubFloatToString(item.High[k], 20)
-		low := utils.SubFloatToString(item.Low[k], 20)
-		closeVal := utils.SubFloatToString(item.Close[k], 20)
-		volume := utils.SubFloatToString(item.Volume[k], 20)
-		amt := utils.SubFloatToString(item.Amt[k], 20)
-		oi := utils.SubFloatToString(item.Oi[k], 20)
-		settle := utils.SubFloatToString(item.Settle[k], 20)
-		addSql += GetAddSql(strconv.Itoa(futureGoodEdbInfoId), edbCode, dateTime, tradeCode, open, high, low, closeVal, volume, amt, oi, settle, timeStr)
+
+	table := item.Tables
+	dataLen := len(table.Time)
+	for k := 0; k < dataLen; k++ {
+		eDate := table.Time[k]
+		dataTime, err := time.Parse(utils.FormatDate, eDate)
+		if err != nil {
+			errMsg = " time.Parse :" + err.Error()
+			return err
+		}
+		timestamp := dataTime.UnixNano() / 1e6
+		timeStr := fmt.Sprintf("%d", timestamp)
+
+		tradeCode := ``
+		open := utils.SubFloatToString(table.Open[k], 20)
+		high := utils.SubFloatToString(table.High[k], 20)
+		low := utils.SubFloatToString(table.Low[k], 20)
+		closeVal := utils.SubFloatToString(table.Close[k], 20)
+		volume := utils.SubFloatToString(table.Volume[k], 20)
+		amt := utils.SubFloatToString(table.Amount[k], 20)
+		oi := utils.SubFloatToString(table.Ccl[k], 20)
+		settle := utils.SubFloatToString(table.Settlement[k], 20)
+		addSql += GetAddSql(strconv.Itoa(futureGoodEdbInfoId), edbCode, eDate, tradeCode, open, high, low, closeVal, volume, amt, oi, settle, timeStr)
 
 		isAdd = true
+
 	}
 
 	if isAdd {
@@ -113,8 +122,8 @@ type RefreshFutureEdbEdbInfoReq struct {
 	StartDate           string `description:"开始日期"`
 }
 
-// RefreshFutureGoodEdbDataFromWind 刷新wind期货指标数据
-func RefreshFutureGoodEdbDataFromWind(futureGoodEdbInfoId int, edbCode, startDate string, item *services.FutureGoodDataFromWind) (err error) {
+// RefreshFutureGoodEdbDataFromThs 刷新wind期货指标数据
+func RefreshFutureGoodEdbDataFromThs(futureGoodEdbInfoId int, edbCode, startDate string, item *services.FutureGoodDataFromThs) (err error) {
 	o := orm.NewOrm()
 	to, err := o.Begin()
 	if err != nil {
@@ -129,7 +138,7 @@ func RefreshFutureGoodEdbDataFromWind(futureGoodEdbInfoId int, edbCode, startDat
 		}
 	}()
 
-	var existList []*FutureGoodEdbDataItem
+	var existList []*FutureGoodEdbData
 	// 获取指标中所有存在的数据值
 	{
 		var condition string
@@ -151,34 +160,42 @@ func RefreshFutureGoodEdbDataFromWind(futureGoodEdbInfoId int, edbCode, startDat
 		_, err = to.Raw(sql, pars).QueryRows(&existList)
 	}
 
-	existMap := make(map[string]*FutureGoodEdbDataItem)
+	existMap := make(map[string]*FutureGoodEdbData)
 	for _, v := range existList {
-		existMap[v.DataTime] = v
+		existMap[v.DataTime.Format(utils.FormatDate)] = v
 	}
 	addSql := ` INSERT INTO future_good_edb_data(future_good_edb_info_id,future_good_edb_code,data_time,trade_code,open,high,low,close,volume,amt,oi,settle,create_time,modify_time,data_timestamp) values `
 	var isAdd bool
 	addMap := make(map[string]string)
 
-	for k, v := range item.Dt {
-		timeStr := fmt.Sprintf("%d", v)
-		v = v / 1000
-		t := time.Unix(v, 0)
-		dateTime := t.Format(utils.FormatDate)
-		tradeCode := item.TradeCode[k]
-		open := utils.SubFloatToString(item.Open[k], 20)
-		high := utils.SubFloatToString(item.High[k], 20)
-		low := utils.SubFloatToString(item.Low[k], 20)
-		closeVal := utils.SubFloatToString(item.Close[k], 20)
-		volume := utils.SubFloatToString(item.Volume[k], 20)
-		amt := utils.SubFloatToString(item.Amt[k], 20)
-		oi := utils.SubFloatToString(item.Oi[k], 20)
-		settle := utils.SubFloatToString(item.Settle[k], 20)
-
-		if findItem, ok := existMap[dateTime]; !ok {
-			if _, existOk := addMap[dateTime]; !existOk {
-				addSql += GetAddSql(strconv.Itoa(futureGoodEdbInfoId), edbCode, dateTime, tradeCode, open, high, low, closeVal, volume, amt, oi, settle, timeStr)
-
-				addMap[dateTime] = "1"
+	table := item.Tables
+	dataLen := len(table.Time)
+	for k := 0; k < dataLen; k++ {
+		eDate := table.Time[k]
+		dataTime, tmpErr := time.Parse(utils.FormatDate, eDate)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		timestamp := dataTime.UnixNano() / 1e6
+		timeStr := fmt.Sprintf("%d", timestamp)
+
+		tradeCode := ``
+		open := utils.SubFloatToString(table.Open[k], 20)
+		high := utils.SubFloatToString(table.High[k], 20)
+		low := utils.SubFloatToString(table.Low[k], 20)
+		closeVal := utils.SubFloatToString(table.Close[k], 20)
+		volume := utils.SubFloatToString(table.Volume[k], 20)
+		amt := utils.SubFloatToString(table.Amount[k], 20)
+		oi := utils.SubFloatToString(table.Ccl[k], 20)
+		settle := utils.SubFloatToString(table.Settlement[k], 20)
+		addSql += GetAddSql(strconv.Itoa(futureGoodEdbInfoId), edbCode, eDate, tradeCode, open, high, low, closeVal, volume, amt, oi, settle, timeStr)
+
+		if findItem, ok := existMap[eDate]; !ok {
+			if _, existOk := addMap[eDate]; !existOk {
+				addSql += GetAddSql(strconv.Itoa(futureGoodEdbInfoId), edbCode, eDate, tradeCode, open, high, low, closeVal, volume, amt, oi, settle, timeStr)
+
+				addMap[eDate] = "1"
 			}
 			isAdd = true
 		} else {
@@ -189,35 +206,35 @@ func RefreshFutureGoodEdbDataFromWind(futureGoodEdbInfoId int, edbCode, startDat
 					updateCol = append(updateCol, "TradeCode")
 				}
 				if utils.SubFloatToString(findItem.Open, 30) != open {
-					findItem.Open = item.Open[k]
+					findItem.Open = table.Open[k]
 					updateCol = append(updateCol, "Open")
 				}
 				if utils.SubFloatToString(findItem.High, 30) != high {
-					findItem.High = item.High[k]
+					findItem.High = table.High[k]
 					updateCol = append(updateCol, "High")
 				}
 				if utils.SubFloatToString(findItem.Low, 30) != low {
-					findItem.Low = item.Low[k]
+					findItem.Low = table.Low[k]
 					updateCol = append(updateCol, "Low")
 				}
 				if utils.SubFloatToString(findItem.Close, 30) != closeVal {
-					findItem.Close = item.Close[k]
+					findItem.Close = table.Close[k]
 					updateCol = append(updateCol, "Close")
 				}
 				if utils.SubFloatToString(findItem.Volume, 30) != volume {
-					findItem.Volume = item.Volume[k]
+					findItem.Volume = table.Volume[k]
 					updateCol = append(updateCol, "Volume")
 				}
 				if utils.SubFloatToString(findItem.Amt, 30) != amt {
-					findItem.Amt = item.Amt[k]
+					findItem.Amt = table.Amount[k]
 					updateCol = append(updateCol, "Amt")
 				}
 				if utils.SubFloatToString(findItem.Oi, 30) != oi {
-					findItem.Oi = item.Oi[k]
+					findItem.Oi = table.Ccl[k]
 					updateCol = append(updateCol, "Oi")
 				}
 				if utils.SubFloatToString(findItem.Settle, 30) != settle {
-					findItem.Settle = item.Settle[k]
+					findItem.Settle = table.Settlement[k]
 					updateCol = append(updateCol, "Settle")
 				}
 
@@ -229,7 +246,9 @@ func RefreshFutureGoodEdbDataFromWind(futureGoodEdbInfoId int, edbCode, startDat
 				}
 			}
 		}
+
 	}
+
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		_, err = to.Raw(addSql).Exec()

+ 115 - 0
services/base_from_ths.go

@@ -124,3 +124,118 @@ func getEdbDataFromThs(edbCode, startDate, endDate string, num int) (item *EdbDa
 	}
 	return item, nil
 }
+
+// FutureGoodDataFromThsInterface 同花顺商品数据类型转为interface
+type FutureGoodDataFromThsInterface struct {
+	Errmsg    string      `json:"errmsg"`
+	Errorcode int64       `json:"errorcode"`
+	DataVol   int64       `json:"dataVol"`
+	Perf      interface{} `json:"perf"`
+	Tables    []struct {
+		ThsCode string   `json:"thscode"`
+		Time    []string `json:"time"`
+		Table   struct {
+			LastClose      []float64 `json:"lastclose"`
+			Open           []float64 `json:"open"`
+			High           []float64 `json:"high"`
+			Low            []float64 `json:"low"`
+			Close          []float64 `json:"close"`
+			AvgPrice       []float64 `json:"avgprice"`
+			Change         []float64 `json:"change"`
+			ChangePer      []float64 `json:"changeper"`
+			Volume         []float64 `json:"volume"`
+			Amount         []float64 `json:"amount"`
+			Hsl            []float64 `json:"hsl"`
+			LastSettlement []float64 `json:"lastsettlement"`
+			Settlement     []float64 `json:"settlement"`
+			ZdSettlement   []float64 `json:"zdsettlement"`
+			ZdfSettlement  []float64 `json:"zdfsettlement"`
+			Ccl            []float64 `json:"ccl"`
+			Ccbd           []float64 `json:"ccbd"`
+			Zf             []float64 `json:"zf"`
+			Zjlx           []float64 `json:"zjlx"`
+			Zjcd           []float64 `json:"zjcd"`
+		} `json:"table"`
+	} `json:"tables"`
+}
+
+// FutureGoodDataFromThs 同花顺期货数据
+type FutureGoodDataFromThs struct {
+	DataVol   int64                `json:"dataVol"`
+	Errmsg    string               `json:"errmsg"`
+	Errorcode int64                `json:"errorcode"`
+	Perf      interface{}          `json:"perf"`
+	Tables    FutureGoodDataTables `json:"tables"`
+}
+
+// FutureGoodDataTables 同花顺表格数据
+type FutureGoodDataTables struct {
+	//TradeCode    []string  `json:"id"`
+	Time       []string  `json:"time"`
+	Open       []float64 `json:"open"`
+	High       []float64 `json:"high"`
+	Low        []float64 `json:"low"`
+	Close      []float64 `json:"close"`
+	Volume     []float64 `json:"volume"`
+	Amount     []float64 `json:"amount"`
+	Ccl        []float64 `json:"ccl"`
+	Settlement []float64 `json:"settlement"`
+}
+
+// GetFutureGoodDataFromThs 通过url获取wind的商品数据
+func GetFutureGoodDataFromThs(edbCode, startDate, endDate string, num int) (item *FutureGoodDataFromThs, err error) {
+	thsUrl := utils.Hz_Wind_Data_Url + `edbInfo/ths/future_good?EdbCode=%s&StartDate=%s&EndDate=%s`
+	thsUrl = fmt.Sprintf(thsUrl, edbCode, startDate, endDate)
+	utils.FileLog.Info("thsUrl:" + thsUrl)
+	body, err := http.Get(thsUrl)
+	utils.FileLog.Info("ths result:" + string(body))
+	if err != nil {
+		err = errors.New(" Err:" + err.Error() + ";result:" + string(body))
+		return
+	}
+	if string(body) == "null" {
+		err = errors.New("同花顺数据获取异常:" + err.Error() + ";result:" + string(body))
+		return
+	}
+
+	tmpItems := new(FutureGoodDataFromThsInterface)
+	err = json.Unmarshal(body, &tmpItems)
+	if err != nil {
+		err = errors.New("GetEdbDataFromThs json.Unmarshal Err:" + err.Error())
+		return
+	}
+	if tmpItems.Errorcode != 0 {
+
+		//session has expired,please re-login after using the system
+		//如果是同花顺登录session失效了,那么就重新请求获取数据
+		if tmpItems.Errorcode == -1020 && num == 0 {
+			return GetFutureGoodDataFromThs(edbCode, startDate, endDate, 1)
+		}
+
+		err = errors.New(string(body))
+		return
+	}
+
+	if len(tmpItems.Tables) <= 0 {
+		return
+	}
+	table := tmpItems.Tables[0]
+	item = &FutureGoodDataFromThs{
+		DataVol:   tmpItems.DataVol,
+		Errmsg:    tmpItems.Errmsg,
+		Errorcode: tmpItems.Errorcode,
+		Perf:      tmpItems.Perf,
+		Tables: FutureGoodDataTables{
+			Time:       table.Time,
+			Open:       table.Table.Open,
+			High:       table.Table.High,
+			Low:        table.Table.Low,
+			Close:      table.Table.Close,
+			Volume:     table.Table.Volume,
+			Amount:     table.Table.Amount,
+			Ccl:        table.Table.Ccl,
+			Settlement: table.Table.Settlement,
+		},
+	}
+	return
+}

+ 0 - 65
services/base_from_wind.go

@@ -132,71 +132,6 @@ func GetEdbDataFromWindUrl(windUrl, edbCode, startDate, endDate string) (item *E
 	return
 }
 
-// FutureGoodDataFromWind wind期货数据
-type FutureGoodDataFromWind struct {
-	ErrorCode map[string]int64   `json:"ErrorCode"`
-	Dt        map[string]int64   `json:"DT"`
-	TradeCode map[string]string  `json:"TRADE_CODE"`
-	Close     map[string]float64 `json:"CLOSE"`
-	Open      map[string]float64 `json:"OPEN"`
-	High      map[string]float64 `json:"HIGH"`
-	Low       map[string]float64 `json:"LOW"`
-	Volume    map[string]float64 `json:"VOLUME"`
-	Amt       map[string]float64 `json:"AMT"`
-	Oi        map[string]float64 `json:"OI"`
-	Settle    map[string]float64 `json:"SETTLE"`
-	ErrMsg    string
-}
-
-// GetFutureGoodDataFromWindUrl 通过url获取wind的商品数据
-func GetFutureGoodDataFromWindUrl(windUrl, edbCode, startDate, endDate string) (item *FutureGoodDataFromWind, errorCode int, err error) {
-	requestWindUrl := windUrl + `edbInfo/wind/future_good?FutureGoodEdbCode=%s&StartDate=%s&EndDate=%s`
-	requestWindUrl = fmt.Sprintf(requestWindUrl, edbCode, startDate, endDate)
-	utils.FileLog.Info(fmt.Sprintf("windUrl:%s", requestWindUrl))
-	body, err := http.Get(requestWindUrl)
-	fmt.Println("GetFutureGoodDataFromWindUrl body:")
-	fmt.Println(string(body))
-	utils.FileLog.Info(fmt.Sprint("wind result:", string(body)))
-
-	if err != nil {
-		return
-	}
-	item = new(FutureGoodDataFromWind)
-	err = json.Unmarshal(body, &item)
-
-	//异常的话,需要邮件通知
-	if len(item.ErrorCode) > 0 {
-		if item.ErrorCode["0"] != 0 {
-			if item.ErrorCode["0"] == -40522017 {
-				//{
-				//DT: {
-				//0: 1654646400000
-				//},
-				//CLOSE: {
-				//0: "CEDBService:: quota exceeded."
-				//},
-				//ErrorCode: {
-				//0: -40522017
-				//}
-				//}
-				// 设置服务器已超限
-				errorCode = 421
-				go utils.SendEmail("wind数据接口超限", "地址:"+requestWindUrl, utils.EmailSendToUsers)
-				return
-			} else if item.ErrorCode["0"] == -40520005 {
-				//.ErrorCode=-40520005
-				//.Data=[No Python API Authority
-				err = errors.New("No Python API Authority")
-				go alarm_msg.SendAlarmMsg(fmt.Sprintf("wind商品数据服务异常,edbCode:%s,ErrorCode:%d,result:%s", edbCode, item.ErrorCode["0"], string(body)), 3)
-				return
-			} else {
-				go alarm_msg.SendAlarmMsg(fmt.Sprintf("wind商品数据服务异常,edbCode:%s,ErrorCode:%d,result:%s", edbCode, item.ErrorCode["0"], string(body)), 3)
-			}
-		}
-	}
-	return
-}
-
 // GetWindUrl 获取wind的url
 func GetWindUrl(edbCode string) (windUrl string, err error) {
 	defer func() {