Browse Source

Merge branch 'feature/eta_2.4.6' into debug

hsun 14 hours ago
parent
commit
0725a6e205

+ 3 - 3
controllers/base_from_ths_ds.go

@@ -47,13 +47,13 @@ func (this *ThsDsController) Add() {
 	cacheKey = utils.CACHE_EDB_DATA_ADD + strconv.Itoa(source) + "_" + req.StockCode + req.EdbCode
 	if !utils.Rc.IsExist(cacheKey) {
 		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
-		dataItem, _, err := services.GetEdbDataFromThsDs(req.StockCode, req.EdbCode, utils.BASE_START_DATE, endDate, "", req.ExtraPars)
+		dataItem, _, err := services.GetEdbDataFromThsDs(req.StockCode, req.EdbCode, utils.BASE_START_DATE, endDate, "", req.Days, req.Period, req.ExtraPars)
 		if err != nil {
 			br.Msg = "获取指标信息失败!"
 			br.ErrMsg = "获取指标信息失败 GetEdbDataFromThsDs,Err:" + err.Error()
 			return
 		}
-		err = models.AddEdbDataFromThsDs(req.StockCode, req.EdbCode, dataItem)
+		err = models.AddEdbDataFromThsDs(req.StockCode, req.EdbCode, dataItem, req.Days, req.Period)
 		if err != nil {
 			br.Msg = "获取指标信息失败!"
 			br.ErrMsg = "获取指标信息失败 AddEdbDataFromThs,Err:" + err.Error()
@@ -140,7 +140,7 @@ func (this *ThsDsController) Refresh() {
 		}
 	}
 
-	dataItem, realApiErrMsg, err = services.GetEdbDataFromThsDs(edbInfo.StockCode, edbInfo.IndicatorCode, utils.GetEdbRefreshStartDate(req.StartDate), endDate, edbInfo.TerminalCode, extra.ApiExtraPars)
+	dataItem, realApiErrMsg, err = services.GetEdbDataFromThsDs(edbInfo.StockCode, edbInfo.IndicatorCode, utils.GetEdbRefreshStartDate(req.StartDate), endDate, edbInfo.TerminalCode, extra.Days, extra.Period, extra.ApiExtraPars)
 	if err != nil {
 		br.Msg = "获取指标信息失败!"
 		br.ErrMsg = "获取指标信息失败 GetEdbDataFromThsDs,Err:" + err.Error()

+ 13 - 4
controllers/base_from_wind_wsd.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_index_lib/models"
 	"eta/eta_index_lib/services"
 	"eta/eta_index_lib/utils"
+	"fmt"
 	"strconv"
 	"strings"
 	"time"
@@ -42,7 +43,7 @@ func (this *WindWsdController) Add() {
 		br.ErrMsg = "请输入指标编码,指标编码为空"
 		return
 	}
-	cacheKey = utils.CACHE_EDB_DATA_ADD + strconv.Itoa(source) + "_" + req.StockCode + req.EdbCode
+	cacheKey = utils.CACHE_EDB_DATA_ADD + strconv.Itoa(source) + "_" + req.StockCode + req.EdbCode + req.Days + req.Period + req.PriceAdj
 	if !utils.Rc.IsExist(cacheKey) {
 		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
 
@@ -95,7 +96,7 @@ func (this *WindWsdController) Add() {
 		_ = utils.Rc.Put(terminalCodeCacheKey, terminalCode, utils.GetTodayLastSecond())
 
 		//windUrl = utils.Hz_Wind_Data_Url_LIST[1].Url
-		dataItem, errCode, _, err := services.GetEdbDataFromWindUrlWsd(windUrl, req.StockCode, req.EdbCode, utils.BASE_START_DATE, endDate)
+		dataItem, errCode, _, err := services.GetEdbDataFromWindUrlWsd(windUrl, req.StockCode, req.EdbCode, utils.BASE_START_DATE, endDate, req.Days, req.Period, req.PriceAdj)
 		if errCode == 421 { //指标超限
 			br.Ret = 421
 			br.Msg = "指标超限!"
@@ -112,7 +113,7 @@ func (this *WindWsdController) Add() {
 			br.ErrMsg = "获取指标信息失败 GetEdbDataFromWind,Err:" + err.Error()
 			return
 		}
-		err = models.AddEdbDataFromWindWsd(req.StockCode, dataItem)
+		err = models.AddEdbDataFromWindWsd(req.StockCode, dataItem, req.Days, req.Period, req.PriceAdj)
 		if err != nil {
 			br.Msg = "获取指标信息失败!"
 			br.ErrMsg = "获取指标信息失败 AddEdbDataFromWindWsd,Err:" + err.Error()
@@ -173,6 +174,14 @@ func (this *WindWsdController) Refresh() {
 		br.ErrMsg = "查询指标信息失败 Err:" + err.Error()
 		return
 	}
+	var extra models.EdbInfoExtra
+	if edbInfo.Extra != "" {
+		if e := json.Unmarshal([]byte(edbInfo.Extra), &extra); e != nil {
+			br.Msg = "刷新失败"
+			br.ErrMsg = fmt.Sprintf("API额外参数解析失败, %v", e)
+			return
+		}
+	}
 
 	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
 	var hasUpdate bool
@@ -202,7 +211,7 @@ func (this *WindWsdController) Refresh() {
 		return
 	}
 	var errCode int
-	dataItem, errCode, realApiErrMsg, err = services.GetEdbDataFromWindUrlWsd(terminal.ServerUrl, edbInfo.StockCode, edbInfo.IndicatorCode, utils.GetEdbRefreshStartDate(req.StartDate), utils.GetEdbRefreshEndDate(endDate))
+	dataItem, errCode, realApiErrMsg, err = services.GetEdbDataFromWindUrlWsd(terminal.ServerUrl, edbInfo.StockCode, edbInfo.IndicatorCode, utils.GetEdbRefreshStartDate(req.StartDate), utils.GetEdbRefreshEndDate(endDate), extra.Days, extra.Period, extra.PriceAdj)
 	if errCode == 421 { //指标超限
 		br.Ret = 421
 		br.Msg = "指标超限!"

+ 5 - 2
models/base_from_ths_ds.go

@@ -12,9 +12,12 @@ import (
 var thsds = "thsds"
 
 // 新增同花顺指标数据
-func AddEdbDataFromThsDs(stockCode, edbCode string, item EdbDataFromThs) (err error) {
+func AddEdbDataFromThsDs(stockCode, edbCode string, item EdbDataFromThs, days, period string) (err error) {
 	//o := orm.NewOrm()
 
+	// 指标编码后缀,默认值则无需拼接
+	suffix := utils.GetThsDsIndexCodeSuffix(period, days)
+
 	edbCodeList := strings.Split(edbCode, ",")
 	indexCodeMap := make(map[string]string)
 	if len(item.Tables) > 0 {
@@ -36,7 +39,7 @@ func AddEdbDataFromThsDs(stockCode, edbCode string, item EdbDataFromThs) (err er
 				}
 				timestamp := dataTime.UnixNano() / 1e6
 				timeStr := fmt.Sprintf("%d", timestamp)
-				indexCode := thsds + stockCode + code
+				indexCode := thsds + stockCode + code + suffix
 				indexCodeMap[indexCode] = indexCode
 				addSql += GetAddSql("0", indexCode, eDate, timeStr, utils.SubFloatToString(sValue, 20))
 				isAdd = true

+ 5 - 2
models/base_from_wind_wsd.go

@@ -12,13 +12,16 @@ import (
 
 var windWsd = "wsd"
 
-func AddEdbDataFromWindWsd(stockCode string, item map[string]map[string]interface{}) (err error) {
+func AddEdbDataFromWindWsd(stockCode string, item map[string]map[string]interface{}, days, period, priceAdj string) (err error) {
 	//o := orm.NewOrm()
 
 	var isAdd bool
 	addSql := ` INSERT INTO edb_data_wind_wsd(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
 	addSql = utils.ReplaceDriverKeywords("", addSql)
 
+	// 指标编码后缀,默认值则无需拼接
+	suffix := utils.GetWindWsdIndexCodeSuffix(period, days, priceAdj)
+
 	indexCodeMap := make(map[string]string)
 	for wk, wv := range item {
 		for vk, vv := range wv {
@@ -40,7 +43,7 @@ func AddEdbDataFromWindWsd(stockCode string, item map[string]map[string]interfac
 			}
 
 			vk = strings.ToLower(vk)
-			indexCode = windWsd + stockCode + vk
+			indexCode = windWsd + stockCode + vk + suffix
 
 			indexCodeMap[indexCode] = indexCode
 

+ 3 - 0
models/edb_data_base.go

@@ -63,6 +63,9 @@ type AddEdbInfoReq struct {
 	Source    int    `description:"指标来源ID"`
 	StockCode string `description:"证券代码"`
 	Frequency string `description:"频度"`
+	Days      string `description:"日期序列-日期类型"`
+	Period    string `description:"日期序列-周期"`
+	PriceAdj  string `description:"日期序列-复权方式"`
 	ExtraPars string `description:"额外参数(如同花顺日期序列)"`
 }
 

+ 3 - 0
models/edb_info.go

@@ -1783,6 +1783,9 @@ func GetEdbInfoByEdbCodeList(source int, edbCodeList []string) (items []*EdbInfo
 // EdbInfoExtra 指标额外数据-extra字段
 type EdbInfoExtra struct {
 	ApiExtraPars string `description:"API-额外参数(如同花顺日期序列)"`
+	Days         string `description:"日期序列-日期类型"`
+	Period       string `description:"日期序列-周期"`
+	PriceAdj     string `description:"日期序列-复权方式"`
 }
 
 // GetEdbInfoNoUpdateTotalByIdList 根据指标id列表获取指标信息

+ 8 - 8
services/base_from_ths_ds.go

@@ -10,7 +10,7 @@ import (
 	"strings"
 )
 
-func GetEdbDataFromThsDs(stockCode, edbCode, startDate, endDate, edbTerminalCode, extraPars string) (item models.EdbDataFromThs, apiErrMsg string, err error) {
+func GetEdbDataFromThsDs(stockCode, edbCode, startDate, endDate, edbTerminalCode, days, period, extraPars string) (item models.EdbDataFromThs, apiErrMsg string, err error) {
 	terminal, err := GetTerminal(utils.DATA_SOURCE_THS, edbTerminalCode)
 	if err != nil {
 		err = fmt.Errorf("获取同花顺接口配置出错 Err: %s", err)
@@ -38,11 +38,11 @@ func GetEdbDataFromThsDs(stockCode, edbCode, startDate, endDate, edbTerminalCode
 
 		// TEST
 		//token = "23f339e97fac48d8b99024228fafb6f0128cfbb7.signs_NTc2NjQ4MTA5"
-		item, apiErrMsg, err = getEdbDataFromThsDsHttp(stockCode, edbCode, startDate, endDate, terminal.Value, token, extraPars)
+		item, apiErrMsg, err = getEdbDataFromThsDsHttp(stockCode, edbCode, startDate, endDate, terminal.Value, token, days, period, extraPars)
 		return
 	}
 
-	item, apiErrMsg, err = getEdbDataFromThsDsApp(stockCode, edbCode, startDate, endDate, 0, terminal.ServerUrl, extraPars)
+	item, apiErrMsg, err = getEdbDataFromThsDsApp(stockCode, edbCode, startDate, endDate, 0, terminal.ServerUrl, days, period, extraPars)
 	return
 }
 
@@ -100,13 +100,13 @@ type Type struct {
 //}
 
 // getEdbDataFromThsDs 获取同花顺接口数据
-func getEdbDataFromThsDsApp(stockCode, edbCode, startDate, endDate string, num int, serverUrl, extraPars string) (item models.EdbDataFromThs, apiErrMsg string, err error) {
+func getEdbDataFromThsDsApp(stockCode, edbCode, startDate, endDate string, num int, serverUrl, days, period, extraPars string) (item models.EdbDataFromThs, apiErrMsg string, err error) {
 	if serverUrl == `` {
 		err = errors.New("同花顺接口未配置")
 		return
 	}
-	thsUrl := serverUrl + `edbInfo/ths/ds?StockCode=%s&EdbCode=%s&StartDate=%s&EndDate=%s&ExtraPars=%s`
-	thsUrl = fmt.Sprintf(thsUrl, stockCode, edbCode, startDate, endDate, extraPars)
+	thsUrl := serverUrl + `edbInfo/ths/ds?StockCode=%s&EdbCode=%s&StartDate=%s&EndDate=%s&Days=%s&Interval=%s&ExtraPars=%s`
+	thsUrl = fmt.Sprintf(thsUrl, stockCode, edbCode, startDate, endDate, days, period, extraPars)
 	utils.FileLog.Info("thsUrl:" + thsUrl)
 	body, err := http.Get(thsUrl)
 	utils.FileLog.Info("ths result:" + string(body))
@@ -146,7 +146,7 @@ func getEdbDataFromThsDsApp(stockCode, edbCode, startDate, endDate string, num i
 				//session has expired,please re-login after using the system
 				//如果是同花顺登录session失效了,那么就重新请求获取数据
 				if response.ErrorCode == -1020 && num == 0 {
-					return getEdbDataFromThsDsApp(stockCode, edbCode, startDate, endDate, 1, serverUrl, extraPars)
+					return getEdbDataFromThsDsApp(stockCode, edbCode, startDate, endDate, 1, serverUrl, days, period, extraPars)
 				}
 				err = errors.New(string(body))
 				return
@@ -196,7 +196,7 @@ func getEdbDataFromThsDsApp(stockCode, edbCode, startDate, endDate string, num i
 			//session has expired,please re-login after using the system
 			//如果是同花顺登录session失效了,那么就重新请求获取数据
 			if response.ErrorCode == -1020 && num == 0 {
-				return getEdbDataFromThsDsApp(stockCode, edbCode, startDate, endDate, 1, serverUrl, extraPars)
+				return getEdbDataFromThsDsApp(stockCode, edbCode, startDate, endDate, 1, serverUrl, days, period, extraPars)
 			}
 			err = errors.New(string(body))
 			return

+ 13 - 1
services/base_from_ths_ds_http.go

@@ -10,7 +10,7 @@ import (
 )
 
 // getEdbDataFromThsDsHttp 通过url获取同花顺的日期序列数据
-func getEdbDataFromThsDsHttp(stockCode, edbCode, startDate, endDate, thsRefreshToken, token, extraPars string) (item models.EdbDataFromThs, apiErrMsg string, err error) {
+func getEdbDataFromThsDsHttp(stockCode, edbCode, startDate, endDate, thsRefreshToken, token, days, period, extraPars string) (item models.EdbDataFromThs, apiErrMsg string, err error) {
 	thsUrl := "https://quantapi.51ifind.com/api/v1/date_sequence"
 	//indicators 是 半角逗号分隔的所有指标,宏观指标过多,推荐使用Windows超级命令生成。 "indicators":"M001620326,M002822183"
 	//functionpara 否 key-value格式,省略时不进行更新时间筛选。两个时间控件更新起始时间(startrtime)和更新结束时间(endrtime),不勾选时省略见下方代码块
@@ -49,6 +49,18 @@ func getEdbDataFromThsDsHttp(stockCode, edbCode, startDate, endDate, thsRefreshT
 		"indipara":  indipara,
 	}
 
+	// 日期类型-时间周期参数
+	funcpara := make(map[string]interface{})
+	if days != "" {
+		funcpara["Days"] = days
+	}
+	if period != "" {
+		funcpara["Interval"] = period
+	}
+	if len(funcpara) > 0 {
+		dataMap["functionpara"] = funcpara
+	}
+
 	body, err, _ := postCurl(thsUrl, dataMap, 0, thsRefreshToken, token)
 	if err != nil {
 		// 返回接口报错的实际原因

+ 4 - 4
services/base_from_wind_wsd.go

@@ -79,9 +79,9 @@ func GetEdbDataFromWindWsd(securitiesCode, edbCode, startDate, endDate string) (
 }
 
 // GetEdbDataFromWindUrlWsd 通过url获取wind wsd数据
-func GetEdbDataFromWindUrlWsd(windUrl, stockCode, edbCode, startDate, endDate string) (item map[string]map[string]interface{}, errorCode int, apiErrMsg string, err error) {
-	requestWindUrl := windUrl + `edbInfo/wind/wsd?StockCode=%s&EdbCode=%s&StartDate=%s&EndDate=%s`
-	requestWindUrl = fmt.Sprintf(requestWindUrl, stockCode, edbCode, startDate, endDate)
+func GetEdbDataFromWindUrlWsd(windUrl, stockCode, edbCode, startDate, endDate, days, period, priceAdj string) (item map[string]map[string]interface{}, errorCode int, apiErrMsg string, err error) {
+	requestWindUrl := windUrl + `edbInfo/wind/wsd?StockCode=%s&EdbCode=%s&StartDate=%s&EndDate=%s&Days=%s&Period=%s&PriceAdj=%s`
+	requestWindUrl = fmt.Sprintf(requestWindUrl, stockCode, edbCode, startDate, endDate, days, period, priceAdj)
 	utils.FileLog.Info(fmt.Sprintf("windUrl:%s", requestWindUrl))
 	body, err := http.Get(requestWindUrl)
 	utils.FileLog.Info(fmt.Sprint("wind result:", string(body)))
@@ -89,7 +89,7 @@ func GetEdbDataFromWindUrlWsd(windUrl, stockCode, edbCode, startDate, endDate st
 	if err != nil {
 		apiErrMsg = fmt.Sprintf("服务异常")
 		return
-	}	
+	}
 	return
 }
 

+ 29 - 0
utils/common.go

@@ -1908,3 +1908,32 @@ func FormatZhDate(dateStr string) (newDateTimeStr string, err error) {
 func GetPbNowEndDate() string {
 	return time.Now().Format(FormatDateUnSpace) //彭博的基础数据结束日期
 }
+
+// GetWindWsdIndexCodeSuffix 获取wind日期序列指标编码后缀
+func GetWindWsdIndexCodeSuffix(period, days, priceAdj string) (suffix string) {
+	if period != "" && period != WindWsdPeriodDefault {
+		suffix += period
+	}
+	if days != "" && days != WindWsdDaysDefault {
+		suffixDays := map[string]string{
+			WindWsdDaysWeekdays: WindWsdSuffixWeekdays,
+			WindWsdDaysAlldays:  WindWsdSuffixAlldays,
+		}
+		suffix += suffixDays[days]
+	}
+	if priceAdj != "" {
+		suffix += priceAdj
+	}
+	return
+}
+
+// GetThsDsIndexCodeSuffix 获取同花顺日期序列指标编码后缀
+func GetThsDsIndexCodeSuffix(period, days string) (suffix string) {
+	if period != "" && period != WindWsdPeriodDefault {
+		suffix += period
+	}
+	if days == ThsDsDaysAlldays {
+		suffix += ThsDsDaysSuffixAlldays
+	}
+	return
+}

+ 21 - 0
utils/constants.go

@@ -390,3 +390,24 @@ const (
 	StlTypeResidual = 3 // 残差性指标
 	StlTypeNonTrend = 4 // 非趋势性指标
 )
+
+// 日期序列
+const (
+	WindWsdDaysDefault      = "Trading"   // 日期选项:交易日参数值
+	WindWsdDaysWeekdays     = "Weekdays"  // 日期选项:工作日参数值
+	WindWsdDaysAlldays      = "Alldays"   // 日期选项:日历日参数值
+	WindWsdSuffixWeekdays   = "W"         // 指标编码后缀:工作日
+	WindWsdSuffixAlldays    = "A"         // 指标编码后缀:日历日
+	WindWsdPeriodDefault    = "D"         // 周期:天
+	WindWsdPeriodWeek       = "W"         // 周期:周
+	WindWsdPeriodMonth      = "M"         // 周期:月
+	WindWsdPeriodQuarter    = "Q"         // 周期:季
+	WindWsdPeriodYear       = "Y"         // 周期:年
+	WindWsdRestorationFront = "F"         // 复权方式:前复权
+	WindWsdRestorationBack  = "B"         // 复权方式:后复权
+	WindWsdRestorationFixed = "T"         // 复权方式:定点复权
+	ThsDsDaysDefault        = "Tradedays" // 日期选项:交易日参数值
+	ThsDsDaysAlldays        = "Alldays"   // 日期选项:日历日参数值
+	ThsDsDaysSuffixAlldays  = "A"         // 指标编码后缀:日历日
+	ThsDsdPeriodHalfYear    = "S"         // 周期:半年(其他频度与wind一致)
+)