Эх сурвалжийг харах

Merge branch 'feature/eta_2.4.6' into debug

hsun 4 цаг өмнө
parent
commit
9630734c74

+ 74 - 7
controllers/data_manage/edb_info.go

@@ -58,6 +58,13 @@ func (this *EdbInfoController) EdbInfoSearch() {
 	stockCode := this.GetString("StockCode")
 	frequency := this.GetString("Frequency")
 
+	// 日期序列参数
+	period := this.GetString("Period")
+	days := this.GetString("Days")
+	priceAdj := this.GetString("PriceAdj")
+	extraPars := this.GetString("ExtraPars")
+	extraPars = strings.TrimSpace(extraPars)
+
 	if source <= 0 {
 		br.Msg = "无效的数据来源"
 		return
@@ -220,7 +227,21 @@ func (this *EdbInfoController) EdbInfoSearch() {
 					br.Msg = "请输入指标代码"
 					return
 				}
-				respItem, err := data.AddEdbDataThsDs(source, stockCode, edbCode)
+				// 部分常量共用
+				periodArr := []string{
+					utils.WindWsdPeriodDefault, utils.WindWsdPeriodWeek, utils.WindWsdPeriodMonth,
+					utils.WindWsdPeriodQuarter, utils.ThsDsdPeriodHalfYear, utils.WindWsdPeriodYear,
+				}
+				if period != "" && !utils.InArrayByStr(periodArr, period) {
+					br.Msg = "周期类型有误"
+					return
+				}
+				daysArr := []string{utils.ThsDsDaysDefault, utils.ThsDsDaysAlldays}
+				if days != "" && !utils.InArrayByStr(daysArr, days) {
+					br.Msg = "日期类型有误"
+					return
+				}
+				respItem, err := data.AddEdbDataThsDs(source, stockCode, edbCode, extraPars, days, period)
 				if err != nil {
 					br.Msg = "获取失败"
 					br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -299,7 +320,25 @@ func (this *EdbInfoController) EdbInfoSearch() {
 					br.Msg = "请输入指标代码"
 					return
 				}
-				respItem, err := data.AddEdbDataWindWsd(source, stockCode, edbCode)
+				periodArr := []string{
+					utils.WindWsdPeriodDefault, utils.WindWsdPeriodWeek, utils.WindWsdPeriodMonth,
+					utils.WindWsdPeriodQuarter, utils.WindWsdPeriodYear,
+				}
+				if period != "" && !utils.InArrayByStr(periodArr, period) {
+					br.Msg = "周期类型有误"
+					return
+				}
+				daysArr := []string{utils.WindWsdDaysWeekdays, utils.WindWsdDaysDefault, utils.WindWsdDaysAlldays}
+				if days != "" && !utils.InArrayByStr(daysArr, days) {
+					br.Msg = "日期类型有误"
+					return
+				}
+				priceAdjArr := []string{utils.WindWsdRestorationFront, utils.WindWsdRestorationBack, utils.WindWsdRestorationFixed}
+				if priceAdj != "" && !utils.InArrayByStr(priceAdjArr, priceAdj) {
+					br.Msg = "复权方式有误"
+					return
+				}
+				respItem, err := data.AddEdbDataWindWsd(source, stockCode, edbCode, days, period, priceAdj)
 				if err != nil {
 					br.Msg = "获取失败"
 					br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -1880,6 +1919,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 			}
 		}
 		if isAdd {
+			// 日期序列
 			if subSource == utils.DATA_SUB_SOURCE_DATE {
 				if source == utils.DATA_SOURCE_WIND {
 					//wsdData := windWsdRespItem.Data
@@ -1946,8 +1986,11 @@ func (this *EdbInfoController) EdbInfoSearch() {
 
 					stockList := make([]*data_manage.StockInfo, 0)
 					edbCodeArr := strings.Split(edbCode, ",")
+					// 指标编码后缀,默认值则无需拼接
+					suffix := utils.GetWindWsdIndexCodeSuffix(period, days, priceAdj)
+
 					for _, v := range edbCodeArr {
-						indexCode := utils.WindDbWsd + stockCode + v
+						indexCode := utils.WindDbWsd + stockCode + v + suffix
 
 						dataList, err := data_manage.GetEdbDataAllByEdbCodeAndSubSource(indexCode, source, utils.DATA_SUB_SOURCE_DATE, utils.EDB_DATA_LIMIT)
 						if err != nil && err.Error() != utils.ErrNoRow() {
@@ -1959,6 +2002,9 @@ func (this *EdbInfoController) EdbInfoSearch() {
 						stockInfo := new(data_manage.StockInfo)
 						stockInfo.StockCode = stockCode
 						stockInfo.EdbCode = v
+						stockInfo.Days = days
+						stockInfo.Period = period
+						stockInfo.PriceAdj = priceAdj
 						stockInfo.DataList = dataList
 						stockList = append(stockList, stockInfo)
 					}
@@ -1966,8 +2012,11 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				} else if source == utils.DATA_SOURCE_THS {
 					stockList := make([]*data_manage.StockInfo, 0)
 					edbCodeArr := strings.Split(edbCode, ",")
+					// 指标编码后缀,默认值则无需拼接
+					suffix := utils.GetThsDsIndexCodeSuffix(period, days)
+
 					for _, v := range edbCodeArr {
-						indexCode := utils.ThsDs + stockCode + v
+						indexCode := utils.ThsDs + stockCode + v + suffix
 
 						dataList, err := data_manage.GetEdbDataAllByEdbCodeAndSubSource(indexCode, source, utils.DATA_SUB_SOURCE_DATE, utils.EDB_DATA_LIMIT)
 						if err != nil && err.Error() != utils.ErrNoRow() {
@@ -1979,6 +2028,8 @@ func (this *EdbInfoController) EdbInfoSearch() {
 						stockInfo := new(data_manage.StockInfo)
 						stockInfo.StockCode = stockCode
 						stockInfo.EdbCode = v
+						stockInfo.Days = days
+						stockInfo.Period = period
 						stockInfo.DataList = dataList
 						stockList = append(stockList, stockInfo)
 					}
@@ -5692,7 +5743,7 @@ func (this *EdbInfoController) EdbInfoExistCheck() {
 	br.Data = resp
 }
 
-// EdbInfoAdd
+// EdbInfoBatchAdd
 // @Title 指标批量保存接口
 // @Description 指标批量保存接口
 // @Param	request	body data_manage.BatchAddEdbInfoReq true "type json string"
@@ -5795,11 +5846,13 @@ func (this *EdbInfoController) EdbInfoBatchAdd() {
 		edbInfoItem.Source = v.Source
 		switch v.Source {
 		case utils.DATA_SOURCE_WIND:
+			suffix := utils.GetWindWsdIndexCodeSuffix(v.Period, v.Days, v.PriceAdj)
 			edbInfoItem.SourceName = "wind"
-			edbInfoItem.EdbCode = utils.WindDbWsd + v.StockCode + v.EdbCode
+			edbInfoItem.EdbCode = utils.WindDbWsd + v.StockCode + v.EdbCode + suffix
 		case utils.DATA_SOURCE_THS:
+			suffix := utils.GetThsDsIndexCodeSuffix(v.Period, v.Days)
 			edbInfoItem.SourceName = "ths"
-			edbInfoItem.EdbCode = utils.ThsDs + v.StockCode + v.EdbCode
+			edbInfoItem.EdbCode = utils.ThsDs + v.StockCode + v.EdbCode + suffix
 		}
 		edbInfoItem.SubSource = utils.DATA_SUB_SOURCE_DATE
 		edbInfoItem.SubSourceName = "日期序列"
@@ -5815,6 +5868,20 @@ func (this *EdbInfoController) EdbInfoBatchAdd() {
 		edbInfoItem.IndicatorCode = v.EdbCode
 		edbInfoItem.StockCode = v.StockCode
 
+		// 日期序列参数
+		var extra data_manage.EdbInfoExtra
+		extra.Days = v.Days
+		extra.Period = v.Period
+		extra.PriceAdj = v.PriceAdj
+		extra.ApiExtraPars = v.ApiExtraPars
+		b, e := json.Marshal(extra)
+		if e != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = fmt.Sprintf("额外参数JSON格式化失败, %v", e)
+			return
+		}
+		edbInfoItem.Extra = string(b)
+
 		// 指标入库
 		edbInfo, err, errMsg, isSendEmail := data.EdbInfoWsdAdd(edbInfoItem)
 		if err != nil {

+ 22 - 7
models/data_manage/edb_info.go

@@ -137,6 +137,9 @@ type EdbInfoSearch struct {
 type StockInfo struct {
 	StockCode string
 	EdbCode   string
+	Days      string `description:"日期序列-日期类型"`
+	Period    string `description:"日期序列-周期"`
+	PriceAdj  string `description:"日期序列-复权方式"`
 	DataList  []*EdbInfoSearchData
 }
 
@@ -1519,13 +1522,17 @@ type BatchAddEdbInfoReq struct {
 }
 
 type BatchAddEdbInfo struct {
-	Source     int    `description:"来源id"`
-	EdbName    string `description:"指标名称"`
-	Frequency  string `description:"频率"`
-	Unit       string `description:"单位"`
-	ClassifyId int    `description:"分类id"`
-	StockCode  string `description:"证券代码"`
-	EdbCode    string `description:"指标编码"`
+	Source       int    `description:"来源id"`
+	EdbName      string `description:"指标名称"`
+	Frequency    string `description:"频率"`
+	Unit         string `description:"单位"`
+	ClassifyId   int    `description:"分类id"`
+	StockCode    string `description:"证券代码"`
+	EdbCode      string `description:"指标编码"`
+	Days         string `description:"日期序列-日期类型"`
+	Period       string `description:"日期序列-周期"`
+	PriceAdj     string `description:"日期序列-复权方式"`
+	ApiExtraPars string `description:"API额外参数"`
 }
 
 func GetEdbInfoWsdMaxAndMinInfo(source, subSource int, edbCode string) (item *EdbInfoMaxAndMinInfo, err error) {
@@ -1883,3 +1890,11 @@ func getThsHfAllDataByMongo(edbInfoId, source, subSource int, startDataTime stri
 
 	return
 }
+
+// EdbInfoExtra 指标额外数据-extra字段
+type EdbInfoExtra struct {
+	ApiExtraPars string `description:"API-额外参数(如同花顺日期序列)"`
+	Days         string `description:"日期序列-日期类型"`
+	Period       string `description:"日期序列-周期"`
+	PriceAdj     string `description:"日期序列-复权方式"`
+}

+ 9 - 11
services/data/base_edb_lib.go

@@ -88,32 +88,30 @@ func AddEdbData(source int, edbCode, frequency string) (resp *models.BaseRespons
 	return
 }
 
-// AddEdbData 新增指标数据
-func AddEdbDataWindWsd(source int, stockCode, edbCode string) (resp *models.BaseResponse, err error) {
+// AddEdbDataWindWsd 新增指标数据
+func AddEdbDataWindWsd(source int, stockCode, edbCode, days, period, priceAdj string) (resp *models.BaseResponse, err error) {
 	param := make(map[string]interface{})
 	param["EdbCode"] = edbCode
 	param["StockCode"] = stockCode
 	param["Source"] = source
+	param["Days"] = days
+	param["Period"] = period
+	param["PriceAdj"] = priceAdj
 	urlStr := `wind/wsd/add`
-	if urlStr == "" {
-		err = fmt.Errorf("未实现该指标的刷新接口,请联系管理员")
-		return
-	}
 	resp, err = postRefreshEdbData(param, urlStr)
 	return
 }
 
 // AddEdbDataThsDs 新增指标数据
-func AddEdbDataThsDs(source int, stockCode, edbCode string) (resp *models.BaseResponse, err error) {
+func AddEdbDataThsDs(source int, stockCode, edbCode, extraPars, days, period string) (resp *models.BaseResponse, err error) {
 	param := make(map[string]interface{})
 	param["EdbCode"] = edbCode
 	param["StockCode"] = stockCode
 	param["Source"] = source
+	param["Days"] = days
+	param["Period"] = period
+	param["ExtraPars"] = extraPars
 	urlStr := `ths/ds/add`
-	if urlStr == "" {
-		err = fmt.Errorf("未实现该指标的刷新接口,请联系管理员")
-		return
-	}
 	resp, err = postRefreshEdbData(param, urlStr)
 	return
 }

+ 29 - 0
utils/common.go

@@ -2618,3 +2618,32 @@ func FindMinMax(numbers []float64) (min float64, max float64) {
 
 	return min, max
 }
+
+// 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

@@ -492,3 +492,24 @@ const (
 	ChartClassifyResourceStatusDown    = 2 // 图表分类下架状态
 	ChartClassifyResourceStatusDefault = 0 // 图表分类默认状态
 )
+
+// 日期序列
+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一致)
+)