Forráskód Böngészése

相关性代码同步

hsun 8 hónapja
szülő
commit
18bf7b932d

+ 9 - 1
controllers/data_manage/correlation/correlation_chart_info.go

@@ -1027,11 +1027,19 @@ func (this *CorrelationChartInfoController) Refresh() {
 	}
 
 	// 刷新相关性图表
-	if e := correlationServ.ChartInfoRefresh(chartInfo.ChartInfoId); e != nil {
+	isAsync, e := correlationServ.ChartInfoRefresh(chartInfo.ChartInfoId, chartInfo.UniqueCode)
+	if e != nil {
 		br.Msg = "刷新失败"
 		br.ErrMsg = "刷新相关性图表失败, Err:" + err.Error()
 		return
 	}
+	// 多因子相关性异步刷新, 前端提示
+	if isAsync {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "刷新时间较长, 请10分钟后查看"
+		return
+	}
 
 	//清除图表缓存
 	{

+ 22 - 6
models/data_manage/factor_edb_series_chart_mapping.go

@@ -8,13 +8,21 @@ import (
 	"time"
 )
 
+const (
+	FactorEdbSeriesChartCalculateTypeCorrelation = 1 // 相关性计算
+)
+
 // FactorEdbSeriesChartMapping 因子指标系列-图表关联
 type FactorEdbSeriesChartMapping struct {
 	FactorEdbSeriesChartMappingId int       `orm:"column(factor_edb_series_chart_mapping_id);pk"`
-	FactorEdbSeriesId             int       `description:"因子指标系列ID"`
 	ChartInfoId                   int       `description:"图表ID"`
+	Source                        int       `description:"图表来源, 同chart_info表source"`
+	CalculateType                 int       `description:"计算方式: 1-相关性"`
+	CalculatePars                 string    `description:"计算参数-JSON(如计算窗口等)"`
+	CalculateData                 string    `description:"计算数据-JSON(如相关性矩阵等)"`
+	FactorEdbSeriesId             int       `description:"因子指标系列ID"`
 	EdbInfoId                     int       `description:"指标ID"`
-	Source                        int       `description:"图表来源,同chart_info表source"`
+	EdbUsed                       int       `description:"指标是否使用: 0-否; 1-是"`
 	CreateTime                    time.Time `description:"创建时间"`
 	ModifyTime                    time.Time `description:"修改时间"`
 }
@@ -25,10 +33,14 @@ func (m *FactorEdbSeriesChartMapping) TableName() string {
 
 type MultipleFactorSeriesChartMappingCols struct {
 	PrimaryId         string
-	FactorEdbSeriesId string
 	ChartInfoId       string
-	EdbInfoId         string
 	Source            string
+	CalculateType     string
+	CalculatePars     string
+	CalculateData     string
+	FactorEdbSeriesId string
+	EdbInfoId         string
+	EdbUsed           string
 	CreateTime        string
 	ModifyTime        string
 }
@@ -36,10 +48,14 @@ type MultipleFactorSeriesChartMappingCols struct {
 func (m *FactorEdbSeriesChartMapping) Cols() MultipleFactorSeriesChartMappingCols {
 	return MultipleFactorSeriesChartMappingCols{
 		PrimaryId:         "factor_edb_series_chart_mapping_id",
-		FactorEdbSeriesId: "factor_edb_series_id",
 		ChartInfoId:       "chart_info_id",
-		EdbInfoId:         "edb_info_id",
 		Source:            "source",
+		CalculateType:     "calculate_type",
+		CalculatePars:     "calculate_pars",
+		CalculateData:     "calculate_data",
+		FactorEdbSeriesId: "factor_edb_series_id",
+		EdbInfoId:         "edb_info_id",
+		EdbUsed:           "edb_used",
 		CreateTime:        "create_time",
 		ModifyTime:        "modify_time",
 	}

+ 0 - 46
models/data_manage/factor_edb_series_mapping.go

@@ -14,7 +14,6 @@ type FactorEdbSeriesMapping struct {
 	FactorEdbSeriesId        int       `description:"因子指标系列ID"`
 	EdbInfoId                int       `description:"指标ID"`
 	EdbCode                  string    `description:"指标编码"`
-	CalculateData            string    `description:"计算数据-JSON(如相关性矩阵等等)"`
 	CreateTime               time.Time `description:"创建时间"`
 	ModifyTime               time.Time `description:"修改时间"`
 }
@@ -28,7 +27,6 @@ type FactorEdbSeriesMappingCols struct {
 	FactorEdbSeriesId string
 	EdbInfoId         string
 	EdbCode           string
-	CalculateData     string
 	CreateTime        string
 	ModifyTime        string
 }
@@ -39,7 +37,6 @@ func (m *FactorEdbSeriesMapping) Cols() FactorEdbSeriesMappingCols {
 		FactorEdbSeriesId: "factor_edb_series_id",
 		EdbInfoId:         "edb_info_id",
 		EdbCode:           "edb_code",
-		CalculateData:     "calculate_data",
 		CreateTime:        "create_time",
 		ModifyTime:        "modify_time",
 	}
@@ -168,46 +165,3 @@ func (m *FactorEdbSeriesMapping) Format2Item() (item *FactorEdbSeriesMappingItem
 	item.EdbCode = m.EdbCode
 	return
 }
-
-// FactorEdbSeriesMappingUpdateCalculate 更新计算数据
-//type FactorEdbSeriesMappingUpdateCalculate struct {
-//	SeriesId      int    `description:"因子指标系列ID"`
-//	EdbInfoId     int    `description:"指标ID"`
-//	CalculateData string `description:"计算数据-JSON"`
-//}
-//
-//func (m *FactorEdbSeriesMapping) UpdateCalculateData(updates []*FactorEdbSeriesMappingUpdateCalculate) (err error) {
-//	if len(updates) == 0 {
-//		return
-//	}
-//	o := orm.NewOrm()
-//	sql := fmt.Sprintf(`UPDATE %s SET %s = ? WHERE %s = ? AND %s = ?`, m.TableName(), m.Cols().CalculateData, m.Cols().FactorEdbSeriesId, m.Cols().EdbInfoId)
-//	p, e := o.Raw(sql).Prepare()
-//	if e != nil {
-//		err = fmt.Errorf("sql prepare err: %v", e)
-//		return
-//	}
-//	defer func() {
-//		_ = p.Close()
-//	}()
-//	for _, v := range updates {
-//		_, e = p.Exec(v.CalculateData, v.SeriesId, v.EdbInfoId)
-//		if e != nil {
-//			err = fmt.Errorf("update exec err: %v", e)
-//			return
-//		}
-//	}
-//	return
-//}
-
-// GetChartUsedFactorSeriesEdb 获取图表引用的系列指标
-func GetChartUsedFactorSeriesEdb(chartId int) (items []*FactorEdbSeriesMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
-	chartOb := new(FactorEdbSeriesChartMapping)
-	edbOb := new(FactorEdbSeriesMapping)
-	sql := fmt.Sprintf(`SELECT b.* FROM %s AS a
-	JOIN %s AS b ON a.%s = b.%s AND a.%s = b.%s
-	WHERE a.%s = ? ORDER BY %s ASC`, chartOb.TableName(), edbOb.TableName(), chartOb.Cols().FactorEdbSeriesId, edbOb.Cols().FactorEdbSeriesId, chartOb.Cols().EdbInfoId, edbOb.Cols().EdbInfoId, chartOb.Cols().ChartInfoId, edbOb.Cols().FactorEdbSeriesId)
-	_, err = o.Raw(sql, chartId).QueryRows(&items)
-	return
-}

+ 58 - 5
services/data/correlation/chart_info.go

@@ -564,11 +564,13 @@ func GetRollingCorrelationChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *d
 }
 
 // ChartInfoRefresh 图表刷新
-func ChartInfoRefresh(chartInfoId int) (err error) {
+func ChartInfoRefresh(chartInfoId int, uniqueCode string) (isAsync bool, err error) {
 	var errMsg string
 	defer func() {
 		if err != nil {
-			go alarm_msg.SendAlarmMsg("CorrelationChartInfoRefresh: "+errMsg, 3)
+			tips := fmt.Sprintf("CorrelationChartInfoRefresh: %s", errMsg)
+			utils.FileLog.Info(tips)
+			go alarm_msg.SendAlarmMsg(tips, 3)
 		}
 	}()
 	correlationChart := new(data_manage.ChartInfoCorrelation)
@@ -577,6 +579,53 @@ func ChartInfoRefresh(chartInfoId int) (err error) {
 		return
 	}
 
+	// 多因子刷新-异步
+	if correlationChart.AnalysisMode == 1 {
+		isAsync = true
+
+		go func() {
+			// 1.刷新图表关联的指标
+			mappings, e := data_manage.GetChartEdbMappingList(chartInfoId)
+			if e != nil {
+				utils.FileLog.Info(fmt.Sprintf("获取图表关联指标失败, err: %v", e))
+				return
+			}
+			if len(mappings) == 0 {
+				utils.FileLog.Info("图表无关联指标")
+				return
+			}
+			var edbIds []int
+			for _, v := range mappings {
+				edbIds = append(edbIds, v.EdbInfoId)
+			}
+			if e, _ = data.EdbInfoRefreshAllFromBaseV3(edbIds, false, true, false); e != nil {
+				utils.FileLog.Info(fmt.Sprintf("批量刷新指标失败, err: %v", e))
+				return
+			}
+
+			// 2.刷新指标系列计算数据
+			for _, v := range mappings {
+				_, e = data.PostRefreshFactorEdbRecalculate(v.EdbInfoId, v.EdbCode)
+				if e != nil {
+					utils.FileLog.Info(fmt.Sprintf("PostRefreshFactorEdbRecalculate err: %v", e))
+					continue
+				}
+			}
+
+			// 3.刷新图表矩阵
+			_, e = data.PostRefreshFactorEdbChartRecalculate(chartInfoId)
+			if e != nil {
+				utils.FileLog.Info(fmt.Sprintf("PostRefreshFactorEdbRecalculate err: %v", e))
+				return
+			}
+
+			// 4.清除图表缓存
+			key := utils.HZ_CHART_LIB_DETAIL + uniqueCode
+			_ = utils.Rc.Delete(key)
+		}()
+		return
+	}
+
 	// 批量刷新ETA指标
 	err, _ = data.EdbInfoRefreshAllFromBaseV3([]int{correlationChart.EdbInfoIdFirst, correlationChart.EdbInfoIdSecond}, false, true, false)
 	if err != nil {
@@ -1241,16 +1290,20 @@ func GetFactorChartDataByChartId(chartInfoId int, extraConfig string) (xEdbIdVal
 	}
 
 	// 获取图表引用到的系列指标
-	edbMappings, e := data_manage.GetChartUsedFactorSeriesEdb(chartInfoId)
+	chartMappingOb := new(data_manage.FactorEdbSeriesChartMapping)
+	cond := fmt.Sprintf(" AND %s = ? AND %s = 1", chartMappingOb.Cols().ChartInfoId, chartMappingOb.Cols().EdbUsed)
+	pars := make([]interface{}, 0)
+	pars = append(pars, chartInfoId)
+	chartMappings, e := chartMappingOb.GetItemsByCondition(cond, pars, []string{}, "")
 	if e != nil {
-		err = fmt.Errorf("获取图表引用系列指标失败, err: %v", e)
+		err = fmt.Errorf("获取图表引用系列指标失败")
 		return
 	}
 
 	// 取出计算结果
 	yDataList = make([]data_manage.YData, 0)
 	yDate := "0000-00-00"
-	for k, m := range edbMappings {
+	for k, m := range chartMappings {
 		var values []data_manage.FactorEdbSeriesCorrelationMatrixValues
 		if m.CalculateData != "" {
 			e = json.Unmarshal([]byte(m.CalculateData), &values)

+ 55 - 0
services/data/factor_edb_series.go

@@ -0,0 +1,55 @@
+package data
+
+import (
+	"encoding/json"
+	"eta/eta_mobile/models"
+	"eta/eta_mobile/utils"
+	"fmt"
+)
+
+// PostRefreshFactorEdbRecalculate 因子指标重计算
+func PostRefreshFactorEdbRecalculate(edbInfoId int, edbCode string) (resp *models.BaseResponse, err error) {
+	param := make(map[string]interface{})
+	param["EdbInfoId"] = edbInfoId
+	param["EdbCode"] = edbCode
+	postUrl := fmt.Sprintf("%s%s", utils.EDB_LIB_URL, "factor_edb_series/recalculate")
+	postData, e := json.Marshal(param)
+	if e != nil {
+		err = fmt.Errorf("param json err: %v", e)
+		return
+	}
+	result, e := HttpPost(postUrl, string(postData), utils.ZhLangVersion, "application/json")
+	if e != nil {
+		err = fmt.Errorf("http post err: %v", e)
+		return
+	}
+	utils.FileLog.Info("PostRefreshFactorEdbRecalculate:" + postUrl + ";" + string(postData) + ";result:" + string(result))
+	if e = json.Unmarshal(result, &resp); e != nil {
+		err = fmt.Errorf("resp unmarshal err: %v", e)
+		return
+	}
+	return
+}
+
+// PostRefreshFactorEdbChartRecalculate 因子指标图表重计算
+func PostRefreshFactorEdbChartRecalculate(chartInfoId int) (resp *models.BaseResponse, err error) {
+	param := make(map[string]interface{})
+	param["ChartInfoId"] = chartInfoId
+	postUrl := fmt.Sprintf("%s%s", utils.EDB_LIB_URL, "factor_edb_series/chart_recalculate")
+	postData, e := json.Marshal(param)
+	if e != nil {
+		err = fmt.Errorf("param json err: %v", e)
+		return
+	}
+	result, e := HttpPost(postUrl, string(postData), utils.ZhLangVersion, "application/json")
+	if e != nil {
+		err = fmt.Errorf("http post err: %v", e)
+		return
+	}
+	utils.FileLog.Info("PostRefreshFactorEdbChartRecalculate:" + postUrl + ";" + string(postData) + ";result:" + string(result))
+	if e = json.Unmarshal(result, &resp); e != nil {
+		err = fmt.Errorf("resp unmarshal err: %v", e)
+		return
+	}
+	return
+}