Browse Source

wind、ths日期序列新增参数

hsun 1 week ago
parent
commit
f874e0e7ed

+ 69 - 16
controllers/data_manage/edb_info.go

@@ -60,6 +60,10 @@ 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)
 
@@ -192,7 +196,21 @@ func (this *EdbInfoController) EdbInfoSearch() {
 					br.Msg = "请输入指标代码"
 					return
 				}
-				respItem, err := data.AddEdbDataThsDs(source, stockCode, edbCode, extraPars)
+				// 部分常量共用
+				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()
@@ -271,7 +289,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()
@@ -1991,6 +2027,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 			}
 		}
 		if isAdd {
+			// 日期序列
 			if subSource == utils.DATA_SUB_SOURCE_DATE {
 				if source == utils.DATA_SOURCE_WIND {
 					//wsdData := windWsdRespItem.Data
@@ -2057,8 +2094,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 && !utils.IsErrNoRow(err) {
@@ -2070,6 +2110,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)
 					}
@@ -2077,8 +2120,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 && !utils.IsErrNoRow(err) {
@@ -2090,6 +2136,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)
 					}
@@ -5951,7 +5999,7 @@ func (this *EdbInfoController) EdbInfoExistCheck() {
 	br.Data = resp
 }
 
-// EdbInfoAdd
+// EdbInfoBatchAdd
 // @Title 指标批量保存接口
 // @Description 指标批量保存接口
 // @Param	request	body data_manage.BatchAddEdbInfoReq true "type json string"
@@ -6061,11 +6109,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 = "日期序列"
@@ -6082,17 +6132,20 @@ func (this *EdbInfoController) EdbInfoBatchAdd() {
 		edbInfoItem.StockCode = v.StockCode
 		edbInfoItem.TerminalCode = terminalCode
 		edbInfoItem.ServerUrl = serverUrl
+
+		// 日期序列参数
 		var extra data_manage.EdbInfoExtra
-		if v.ApiExtraPars != "" {
-			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)
+		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)

+ 9 - 0
models/data_manage/edb_info.go

@@ -174,6 +174,9 @@ type EdbInfoSearch struct {
 type StockInfo struct {
 	StockCode string
 	EdbCode   string
+	Days      string `description:"日期序列-日期类型"`
+	Period    string `description:"日期序列-周期"`
+	PriceAdj  string `description:"日期序列-复权方式"`
 	DataList  []*EdbInfoSearchData
 }
 
@@ -1848,6 +1851,9 @@ type BatchAddEdbInfo struct {
 	ClassifyId   int    `description:"分类id"`
 	StockCode    string `description:"证券代码"`
 	EdbCode      string `description:"指标编码"`
+	Days         string `description:"日期序列-日期类型"`
+	Period       string `description:"日期序列-周期"`
+	PriceAdj     string `description:"日期序列-复权方式"`
 	ApiExtraPars string `description:"API额外参数"`
 }
 
@@ -2181,6 +2187,9 @@ func GetEdbInfoFieldList(cond string, pars []interface{}, fields []string) (item
 // EdbInfoExtra 指标额外数据-extra字段
 type EdbInfoExtra struct {
 	ApiExtraPars string `description:"API-额外参数(如同花顺日期序列)"`
+	Days         string `description:"日期序列-日期类型"`
+	Period       string `description:"日期序列-周期"`
+	PriceAdj     string `description:"日期序列-复权方式"`
 }
 
 func GetEdbInfoListByCond(condition string, pars []interface{}) (list []*EdbInfoList, err error) {

+ 8 - 7
services/data/base_edb_lib.go

@@ -96,27 +96,28 @@ 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, extraPars 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`
 	resp, err = postRefreshEdbData(param, urlStr)

+ 29 - 0
utils/common.go

@@ -3101,3 +3101,32 @@ func GetFirstNChars(s string, max int) string {
 	}
 	return string(runes[: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
+}

+ 44 - 22
utils/constants.go

@@ -223,28 +223,28 @@ const (
 
 // 缓存key
 const (
-	CACHE_KEY_LOGS                    = "HZ_ADMIN_CACHE_KEY_LOGS"             //api用户操作日志队列
-	CACHE_KEY_ADMIN                   = "calendar:admin:list"                 //系统用户列表缓存key
-	CACHE_KEY_ADMIN_ID                = "calendar:admin:id:list"              //系统用户列表缓存key
-	CACHE_KEY_OLD_REPORT_PUBLISH      = "HZ_CACHE_KEY_OLD_REPORT_PUBLISH"     //老后台报告发布队列
-	CACHE_ADMIN_YB_CONFIG             = "admin:yb_config:"                    //研报配置相关缓存前缀
-	CACHE_WIND_URL                    = "CACHE_WIND_URL"                      //指标与wind服务器的绑定关系
-	CACHE_CHART_INFO_DATA             = "chart:info:data:"                    //图表数据
-	CACHE_CHART_CLASSIFY              = "chart:classify"                      //图表分类数据
-	CACHE_IMPORT_MANUAL_DATA          = "import:manual:data"                  //手工数据导入后刷新
-	CACHE_MYSTEEL_CHEMICAL_ADD_DATA   = "import:mysteelchemical:data"         //钢联化工的数据源导入后刷新
-	CACHE_ACCESS_TOKEN_LOGIN          = "pc_eta_admin:login:"                 //管理后台登录
-	CACHE_ACCESS_TOKEN_LOGIN_NO_TRUST = "pc_eta_admin:login:no_trust:"        //管理后台登录(不可信登录态)
-	CACHE_ABNORMAL_LOGIN              = "pc_eta_admin:login:abnormal:"        //管理后台登录-异常登录
-	CACHE_LOGIN_ERR_PASS              = "pc_eta_admin:login:errPass:"         //管理后台登录-输入错误密码次数
-	MOBILE_CACHE_ABNORMAL_LOGIN       = "mobile_eta_admin:login:abnormal:"        //管理后台登录-异常登录
-	MOBILE_CACHE_LOGIN_ERR_PASS             = "mobile_eta_admin:login:errPass:"         //管理后台登录-输入错误密码次数
-
-	CACHE_FIND_PASS_VERIFY            = "pc_eta_admin:findPass:verify:"       //找回密码校验成功标记
-	CACHE_KEY_MYSTEEL_REFRESH         = "mysteel_chemical:refresh"            //钢联化工刷新
-	CACHE_KEY_DAYNEW_REFRESH          = "admin:day_new:refresh"               //每日资讯拉取企业微信聊天记录
-	CACHE_KEY_DAYNEW_TRANSLATE        = "admin:day_new:translate"             //每日资讯中翻英
-	CACHE_KEY_ADMIN_OPERATE_RECORD    = "HZ_ADMIN_CACHE_ADMIN_OPERATE_RECORD" //系统用户操作日志队列
+	CACHE_KEY_LOGS                    = "HZ_ADMIN_CACHE_KEY_LOGS"          //api用户操作日志队列
+	CACHE_KEY_ADMIN                   = "calendar:admin:list"              //系统用户列表缓存key
+	CACHE_KEY_ADMIN_ID                = "calendar:admin:id:list"           //系统用户列表缓存key
+	CACHE_KEY_OLD_REPORT_PUBLISH      = "HZ_CACHE_KEY_OLD_REPORT_PUBLISH"  //老后台报告发布队列
+	CACHE_ADMIN_YB_CONFIG             = "admin:yb_config:"                 //研报配置相关缓存前缀
+	CACHE_WIND_URL                    = "CACHE_WIND_URL"                   //指标与wind服务器的绑定关系
+	CACHE_CHART_INFO_DATA             = "chart:info:data:"                 //图表数据
+	CACHE_CHART_CLASSIFY              = "chart:classify"                   //图表分类数据
+	CACHE_IMPORT_MANUAL_DATA          = "import:manual:data"               //手工数据导入后刷新
+	CACHE_MYSTEEL_CHEMICAL_ADD_DATA   = "import:mysteelchemical:data"      //钢联化工的数据源导入后刷新
+	CACHE_ACCESS_TOKEN_LOGIN          = "pc_eta_admin:login:"              //管理后台登录
+	CACHE_ACCESS_TOKEN_LOGIN_NO_TRUST = "pc_eta_admin:login:no_trust:"     //管理后台登录(不可信登录态)
+	CACHE_ABNORMAL_LOGIN              = "pc_eta_admin:login:abnormal:"     //管理后台登录-异常登录
+	CACHE_LOGIN_ERR_PASS              = "pc_eta_admin:login:errPass:"      //管理后台登录-输入错误密码次数
+	MOBILE_CACHE_ABNORMAL_LOGIN       = "mobile_eta_admin:login:abnormal:" //管理后台登录-异常登录
+	MOBILE_CACHE_LOGIN_ERR_PASS       = "mobile_eta_admin:login:errPass:"  //管理后台登录-输入错误密码次数
+
+	CACHE_FIND_PASS_VERIFY         = "pc_eta_admin:findPass:verify:"       //找回密码校验成功标记
+	CACHE_KEY_MYSTEEL_REFRESH      = "mysteel_chemical:refresh"            //钢联化工刷新
+	CACHE_KEY_DAYNEW_REFRESH       = "admin:day_new:refresh"               //每日资讯拉取企业微信聊天记录
+	CACHE_KEY_DAYNEW_TRANSLATE     = "admin:day_new:translate"             //每日资讯中翻英
+	CACHE_KEY_ADMIN_OPERATE_RECORD = "HZ_ADMIN_CACHE_ADMIN_OPERATE_RECORD" //系统用户操作日志队列
 
 	CACHE_SYNC_ADMIN        = "hz_crm_eta:sync_admin"        // 同步用户的缓存队列key
 	CACHE_SYNC_ROLE         = "hz_crm_eta:sync_role"         // 同步角色的缓存队列key
@@ -588,6 +588,7 @@ const (
 const (
 	FICC_ARTICLE_UPDATE_KEY = "FICC_ARTICLE_UPDATE_KEY" //权益报告通知给FICC这边的缓存key
 )
+
 // 图表分类设置精选资源分类
 const (
 	ChartClassifyIsSelected            = 1 // 图表分类设置精选资源分类
@@ -602,3 +603,24 @@ const (
 const (
 	DATA_SOURCE_NAME_RADISH_RESEARCH = "萝卜投研" // 萝卜投研 -> 105
 )
+
+// 日期序列
+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一致)
+)