Browse Source

Merge branch 'fix/trade_position'

Roc 1 năm trước cách đây
mục cha
commit
ec6f62444c

+ 2 - 27
models/data_manage/trade_analysis/trade_analysis.go

@@ -83,6 +83,7 @@ type TradeClassifyNameListItemItem struct {
 type TradeClassifyName struct {
 	ClassifyName string //分类名称
 	ClassifyType string //分类名称下的类型
+	LatestDate   string //分类下最晚日期
 }
 
 // GetExchangeClassify 获取交易所分类列表
@@ -128,6 +129,7 @@ type GetPositionTopResp struct {
 	CleanBuyList  GetPositionTopList `description:"净多单列表"`
 	CleanSoldList GetPositionTopList `description:"净空单列表"`
 	DataTime      string             `description:"最新日期或者请求日期"`
+	LastDataTime  string             `description:"最新日期"`
 }
 
 type GetPositionTopList struct {
@@ -156,30 +158,3 @@ func GetTradePositionTop(exchange string, classifyName, classifyType, dataTime s
 
 	return
 }
-
-func GetTradeTopLastDataTime(exchange string, classifyName, classifyType string) (item *TradePositionTop, err error) {
-	tableName := "trade_position_" + exchange + "_top"
-	sql := `SELECT * FROM ` + tableName + ` WHERE classify_name=? `
-	pars := make([]interface{}, 0)
-	if exchange == "zhengzhou" {
-		pars = append(pars, classifyType)
-	} else {
-		pars = append(pars, classifyName)
-		sql += ` AND classify_type=? `
-		pars = append(pars, classifyType)
-	}
-	sql += ` ORDER BY data_time desc`
-	o := orm.NewOrmUsingDB("data")
-	err = o.Raw(sql, pars...).QueryRow(&item)
-
-	return
-}
-
-func GetZhengzhouClassifyTypeByClassifyName(classifyName string) (item *TradeClassifyName, err error) {
-	tableName := "base_from_trade_zhengzhou_index"
-	sql := `SELECT classify_name, classify_type FROM ` + tableName + ` WHERE classify_name=? `
-	o := orm.NewOrmUsingDB("data")
-	err = o.Raw(sql, classifyName).QueryRow(&item)
-
-	return
-}

+ 55 - 0
models/data_manage/trade_analysis/trade_classify.go

@@ -0,0 +1,55 @@
+package trade_analysis
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// BaseFromTradeClassify 交易所分类表
+type BaseFromTradeClassify struct {
+	Id           uint64    `orm:"column(id);pk"`
+	ClassifyName string    //分类名称
+	ClassifyType string    //分类名称下的类型
+	Exchange     string    //交易所
+	LatestDate   time.Time //数据最近的日期
+	CreateTime   time.Time //插入时间
+	ModifyTime   time.Time //修改时间
+}
+
+// GetAllBaseFromTradeClassify 获取所有的交易所分类列表
+func GetAllBaseFromTradeClassify() (list []*BaseFromTradeClassify, err error) {
+	sql := `SELECT * FROM base_from_trade_classify   `
+
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sql).QueryRows(&list)
+
+	return
+}
+
+func GetTradeTopLastDataTime(exchange string, classifyName, classifyType string) (item *BaseFromTradeClassify, err error) {
+	sql := `SELECT * FROM base_from_trade_classify WHERE exchange = ? AND classify_name=? `
+	pars := make([]interface{}, 0)
+	pars = append(pars, exchange)
+
+	if exchange == "zhengzhou" {
+		pars = append(pars, classifyType)
+	} else {
+		pars = append(pars, classifyName)
+		sql += ` AND classify_type=? `
+		pars = append(pars, classifyType)
+	}
+	sql += ` ORDER BY latest_date desc`
+	o := orm.NewOrmUsingDB("data")
+	err = o.Raw(sql, pars...).QueryRow(&item)
+
+	return
+}
+
+// GetClassifyTypeByClassifyName 根据分类名称获取分类类型
+func GetClassifyTypeByClassifyName(exchange, classifyName string) (item *TradeClassifyName, err error) {
+	sql := `SELECT classify_name, classify_type FROM base_from_trade_classify WHERE exchange = ? AND classify_name=? `
+	o := orm.NewOrmUsingDB("data")
+	err = o.Raw(sql, exchange, classifyName).QueryRow(&item)
+
+	return
+}

+ 61 - 44
services/data/trade_analysis/trade_analysis.go

@@ -6,7 +6,6 @@ import (
 	"fmt"
 	"sort"
 	"strings"
-	"sync"
 	"time"
 )
 
@@ -26,36 +25,44 @@ func GetClassifyName() (list trade_analysis.TradeClassifyNameListSort, err error
 		"cffex":     4,
 		"ine":       5,
 	}
-	//查询每个交易所的最新更新时间
-	//查询每个交易所下的classifyNameList
+	//查询所有交易所下的分类
+	classifyExchangeList, tmpErr := trade_analysis.GetAllBaseFromTradeClassify()
+	if tmpErr != nil {
+		err = tmpErr
+		errMsg = "查询交易所最新更新时间失败"
+		return
+	}
+
+	// 每个交易所的分类信息
 	classifyExchangeMap := make(map[string][]trade_analysis.TradeClassifyName)
-	timeMap := make(map[string]string)
-	i := 0
-	var wg sync.WaitGroup
-	for k := range exchanges {
-		wg.Add(1)
-		go func(k string, classifyExchangeMap map[string][]trade_analysis.TradeClassifyName) {
-			defer wg.Done()
-			nameList, tmpErr := trade_analysis.GetExchangeClassify(k)
-			if tmpErr != nil {
-				err = tmpErr
-				return
-			}
-			for _, n := range nameList {
-				classifyExchangeMap[k] = append(classifyExchangeMap[k], n)
-			}
+	// 每个交易所的最新更新时间
+	timeLastMap := make(map[string]time.Time)
+	for _, v := range classifyExchangeList {
+		tmpExchange := v.Exchange
 
-			dataTimeItem, tmpErr := trade_analysis.GetExchangeLastTime(k)
-			if tmpErr != nil {
-				err = tmpErr
-				errMsg = "查询交易所最新更新时间失败"
-				return
-			}
-			timeMap[k] = dataTimeItem.CreateTime.Format(utils.FormatDateTime)
+		// 分类
+		tmpList, ok := classifyExchangeMap[tmpExchange]
+		if !ok {
+			tmpList = make([]trade_analysis.TradeClassifyName, 0)
+		}
+		tmpList = append(tmpList, trade_analysis.TradeClassifyName{
+			ClassifyName: v.ClassifyName,
+			ClassifyType: v.ClassifyType,
+			LatestDate:   v.LatestDate.Format(utils.FormatDate),
+		})
+		classifyExchangeMap[v.Exchange] = tmpList
 
-		}(k, classifyExchangeMap)
+		// 时间
+		if tmpLastTime, ok2 := timeLastMap[tmpExchange]; !ok2 {
+			timeLastMap[tmpExchange] = v.ModifyTime
+		} else {
+			if v.ModifyTime.After(tmpLastTime) {
+				timeLastMap[tmpExchange] = v.ModifyTime
+			}
+		}
 	}
-	wg.Wait()
+
+	i := 0
 	currDate := time.Now().Format(utils.FormatDate)
 	for k, v := range exchanges {
 		tmp := trade_analysis.TradeClassifyNameList{
@@ -70,12 +77,16 @@ func GetClassifyName() (list trade_analysis.TradeClassifyNameListSort, err error
 			errMsg = "查询交易所分类信息失败"
 			return
 		}
-		tmp.DataTime, ok = timeMap[k]
-		if !ok {
+
+		// 查询交易所最新更新时间失败
+		if timeLast, ok := timeLastMap[k]; ok {
+			tmp.DataTime = timeLast.Format(utils.FormatDateTime)
+		} else {
 			err = fmt.Errorf("查询交易所最新更新时间失败")
 			errMsg = "查询交易所最新更新时间失败"
 			return
 		}
+
 		classifyMap := make(map[string][]trade_analysis.TradeClassifyNameListItemItem)
 		if len(nameList) > 0 {
 			if k == "zhengzhou" {
@@ -217,10 +228,10 @@ func getZhengzhouClassifyName(code string) (name string) {
 func GetPositionTopDetail(req trade_analysis.GetPositionTopReq) (ret trade_analysis.GetPositionTopResp, err error, errMsg string) {
 	//定义交易所
 	exchanges := map[string]string{
-		"郑商所":  "zhengzhou",
-		"大商所":  "dalian",
-		"上期所":  "shanghai",
-		"中金所":  "cffex",
+		"郑商所":   "zhengzhou",
+		"大商所":   "dalian",
+		"上期所":   "shanghai",
+		"中金所":   "cffex",
 		"上期能源": "ine",
 	}
 	exchange, ok := exchanges[req.Exchange]
@@ -230,16 +241,20 @@ func GetPositionTopDetail(req trade_analysis.GetPositionTopReq) (ret trade_analy
 		return
 	}
 	dataTimeStr := req.DataTime
-	var dataTime time.Time
+	var lastDataTime, dataTime time.Time
+
 	//查询最新的时间
+	lastItem, tmpErr := trade_analysis.GetTradeTopLastDataTime(exchange, req.ClassifyName, req.ClassifyType)
+	if tmpErr != nil {
+		errMsg = "查询最新的榜单信息失败"
+		err = tmpErr
+		return
+	}
+	lastDataTime = lastItem.LatestDate
+
+	// 如果没有传入日期,那么就用最晚的的日期
 	if dataTimeStr == "" {
-		lastItem, tmpErr := trade_analysis.GetTradeTopLastDataTime(exchange, req.ClassifyName, req.ClassifyType)
-		if tmpErr != nil {
-			errMsg = "查询最新的榜单信息失败"
-			err = tmpErr
-			return
-		}
-		dataTime = lastItem.DataTime
+		dataTime = lastDataTime
 	} else {
 		dataTime, err = time.ParseInLocation(utils.FormatDate, dataTimeStr, time.Local)
 		if err != nil {
@@ -247,6 +262,10 @@ func GetPositionTopDetail(req trade_analysis.GetPositionTopReq) (ret trade_analy
 			return
 		}
 	}
+	dataTimeStr = dataTime.Format(utils.FormatDate)
+	
+	ret.DataTime = dataTimeStr
+	ret.LastDataTime = lastDataTime.Format(utils.FormatDate)
 
 	//遇到周末则跳过当天
 	weekStr := dataTime.Weekday().String()
@@ -255,13 +274,12 @@ func GetPositionTopDetail(req trade_analysis.GetPositionTopReq) (ret trade_analy
 		err = fmt.Errorf(errMsg)*/
 		return
 	}
-	dataTimeStr = dataTime.Format(utils.FormatDate)
 	classifyName := req.ClassifyName
 	classifyType := req.ClassifyType
 	if exchange == "zhengzhou" {
 		classifyName = classifyType
 		var typeItem *trade_analysis.TradeClassifyName
-		typeItem, err = trade_analysis.GetZhengzhouClassifyTypeByClassifyName(classifyName)
+		typeItem, err = trade_analysis.GetClassifyTypeByClassifyName(exchange, classifyName)
 		if err != nil {
 			if err.Error() == utils.ErrNoRow() {
 				errMsg = "该合约不存在"
@@ -360,6 +378,5 @@ func GetPositionTopDetail(req trade_analysis.GetPositionTopReq) (ret trade_analy
 	ret.CleanSoldList.TotalDealChange = totalChangeMap[4]
 	ret.CleanSoldList.List = detailList[4]
 
-	ret.DataTime = dataTimeStr
 	return
 }