浏览代码

Merge remote-tracking branch 'origin/debug' into debug

zwxi 9 月之前
父节点
当前提交
9736d98a18

+ 80 - 48
controllers/data_manage/correlation/correlation_chart_info.go

@@ -1070,11 +1070,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
+	}
 
 	//清除图表缓存
 	{
@@ -2146,7 +2154,7 @@ func (this *CorrelationChartInfoController) MultiFactorAdd() {
 	}()
 
 	chartType := 9
-	chartSource := utils.CHART_SOURCE_CORRELATION // TODO:暂定相关性图表不新加source
+	chartSource := utils.CHART_SOURCE_CORRELATION
 	startDate := time.Now().AddDate(0, 0, -calculateDays).Format(utils.FormatDate)
 	endDate := time.Now().Format(utils.FormatDate)
 	mappingEdbIds := make([]int, 0) // 该图表关联的指标(去除系列中重复指标之后的)
@@ -2266,19 +2274,47 @@ func (this *CorrelationChartInfoController) MultiFactorAdd() {
 	}
 
 	// 指标系列-图表关联
-	seriesMappings := make([]*data_manage.FactorEdbSeriesChartMapping, 0)
+	chartMappings := make([]*data_manage.FactorEdbSeriesChartMapping, 0)
+	seriesIds := make([]int, 0)
+	seriesIdExist := make(map[int]bool)
+	edbUsed := make(map[string]bool)
 	for _, v := range req.FactorCorrelation.SeriesEdb {
-		seriesMappings = append(seriesMappings, &data_manage.FactorEdbSeriesChartMapping{
-			FactorEdbSeriesId: v.SeriesId,
-			EdbInfoId:         v.EdbInfoId,
-			Source:            chartSource,
-			CreateTime:        time.Now().Local(),
-			ModifyTime:        time.Now().Local(),
-		})
+		if !seriesIdExist[v.SeriesId] {
+			seriesIds = append(seriesIds, v.SeriesId)
+		}
+		k := fmt.Sprintf("%d-%d", v.SeriesId, v.EdbInfoId)
+		edbUsed[k] = true
+	}
+	if len(seriesIds) == 0 {
+		br.Msg = "保存失败"
+		br.ErrMsg = fmt.Sprintf("指标系列异常")
+		return
+	}
+	{
+
+		ob := new(data_manage.FactorEdbSeriesChartMapping)
+		cond := fmt.Sprintf(" AND %s IN (%s) AND %s = 0", ob.Cols().FactorEdbSeriesId, utils.GetOrmInReplace(len(seriesIds)), ob.Cols().ChartInfoId)
+		pars := make([]interface{}, 0)
+		pars = append(pars, seriesIds)
+		items, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = fmt.Sprintf("获取指标系列图表关联失败, Err: %v", e)
+			return
+		}
+		chartMappings = items
+	}
+	for _, v := range chartMappings {
+		v.Source = chartSource
+		k := fmt.Sprintf("%d-%d", v.FactorEdbSeriesId, v.EdbInfoId)
+		if edbUsed[k] {
+			v.EdbUsed = 1
+		}
+		v.ModifyTime = time.Now().Local()
 	}
 
 	// 新增图表/相关性图表/图表指标关联/指标系列图表关联
-	chartInfoId, e := data_manage.CreateMultiFactorCorrelationChartAndEdb(chartInfo, edbMappings, chartCorrelate, seriesMappings)
+	chartInfoId, e := data_manage.CreateMultiFactorCorrelationChartAndEdb(chartInfo, edbMappings, chartCorrelate, chartMappings)
 	if e != nil {
 		br.Msg = "保存失败"
 		br.ErrMsg = fmt.Sprintf("新增多因子相关性图表失败, Err: %v", e)
@@ -2548,20 +2584,37 @@ func (this *CorrelationChartInfoController) MultiFactorEdit() {
 		edbMappings = append(edbMappings, m)
 	}
 
-	// 指标系列-图表关联
-	seriesMappings := make([]*data_manage.FactorEdbSeriesChartMapping, 0)
+	edbUsed := make(map[string]bool)
 	for _, v := range req.FactorCorrelation.SeriesEdb {
-		seriesMappings = append(seriesMappings, &data_manage.FactorEdbSeriesChartMapping{
-			FactorEdbSeriesId: v.SeriesId,
-			EdbInfoId:         v.EdbInfoId,
-			Source:            chartSource,
-			CreateTime:        time.Now().Local(),
-			ModifyTime:        time.Now().Local(),
-		})
+		k := fmt.Sprintf("%d-%d", v.SeriesId, v.EdbInfoId)
+		edbUsed[k] = true
+	}
+	// 指标系列-图表关联
+	chartMappings := make([]*data_manage.FactorEdbSeriesChartMapping, 0)
+	{
+		ob := new(data_manage.FactorEdbSeriesChartMapping)
+		cond := fmt.Sprintf(" AND %s = ?", ob.Cols().ChartInfoId)
+		pars := make([]interface{}, 0)
+		pars = append(pars, chartInfo.ChartInfoId)
+		items, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = fmt.Sprintf("获取指标系列图表关联失败, Err: %v", e)
+			return
+		}
+		chartMappings = items
+	}
+	for _, v := range chartMappings {
+		k := fmt.Sprintf("%d-%d", v.FactorEdbSeriesId, v.EdbInfoId)
+		v.EdbUsed = 0
+		if edbUsed[k] {
+			v.EdbUsed = 1
+		}
+		v.ModifyTime = time.Now().Local()
 	}
 
 	// 更新图表/相关性图表/图表指标关联/指标系列图表关联
-	e = data_manage.UpdateMultiFactorCorrelationChartAndEdb(chartInfo, edbMappings, chartCorrelate, seriesMappings, chartUpdateCols, correlateUpdateCols)
+	e = data_manage.UpdateMultiFactorCorrelationChartAndEdb(chartInfo, edbMappings, chartCorrelate, chartMappings, chartUpdateCols, correlateUpdateCols)
 	if e != nil {
 		br.Msg = "保存失败"
 		br.ErrMsg = fmt.Sprintf("新增多因子相关性图表失败, Err: %v", e)
@@ -2694,16 +2747,14 @@ func (this *CorrelationChartInfoController) MultiFactorDetail() {
 		return
 	}
 
-	// 是否已被引用, 去重系列IDs
-	factorUsed := make(map[string]bool)
 	seriesIds := make([]int, 0)
 	seriesIdExist := make(map[int]bool)
+	edbInfoIds := make([]int, 0)
 	for _, v := range chartMappings {
-		s := fmt.Sprintf("%d-%d", v.FactorEdbSeriesId, v.EdbInfoId)
-		factorUsed[s] = true
 		if !seriesIdExist[v.FactorEdbSeriesId] {
 			seriesIds = append(seriesIds, v.FactorEdbSeriesId)
 		}
+		edbInfoIds = append(edbInfoIds, v.EdbInfoId)
 	}
 	if len(seriesIds) == 0 {
 		br.Msg = "因子指标系列异常"
@@ -2739,26 +2790,6 @@ func (this *CorrelationChartInfoController) MultiFactorDetail() {
 	correlateConf.CalculateUnit = chartCorrelate.CalculateUnit
 	correlateConf.CalculateValue = chartCorrelate.CalculateValue
 
-	// 因子指标信息-包含计算结果
-	edbMappings := make([]*data_manage.FactorEdbSeriesMapping, 0)
-	edbInfoIds := make([]int, 0)
-	{
-		ob := new(data_manage.FactorEdbSeriesMapping)
-		cond := fmt.Sprintf(" AND %s IN (%s)", ob.Cols().FactorEdbSeriesId, utils.GetOrmInReplace(len(seriesIds)))
-		pars := make([]interface{}, 0)
-		pars = append(pars, seriesIds)
-		order := fmt.Sprintf("%s ASC, %s ASC", ob.Cols().FactorEdbSeriesId, ob.Cols().EdbInfoId)
-		items, e := ob.GetItemsByCondition(cond, pars, []string{}, order)
-		if e != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取因子指标关联失败, Err: " + e.Error()
-			return
-		}
-		for _, v := range items {
-			edbInfoIds = append(edbInfoIds, v.EdbInfoId)
-		}
-		edbMappings = items
-	}
 	edbIdItem := make(map[int]*data_manage.EdbInfo)
 	edbItems, e := data_manage.GetEdbInfoByIdList(edbInfoIds)
 	if e != nil {
@@ -2773,7 +2804,7 @@ func (this *CorrelationChartInfoController) MultiFactorDetail() {
 	// 相关性矩阵
 	seriesEdb := make(map[int][]*data_manage.FactorEdbSeriesMappingItem)
 	var matrixItems []data_manage.FactorEdbSeriesCorrelationMatrixItem
-	for _, v := range edbMappings {
+	for _, v := range chartMappings {
 		edbItem := edbIdItem[v.EdbInfoId]
 		if edbItem == nil {
 			continue
@@ -2794,8 +2825,9 @@ func (this *CorrelationChartInfoController) MultiFactorDetail() {
 		}
 		sort.Sort(data_manage.FactorEdbSeriesCorrelationMatrixOrder(values))
 		item.Values = values
-		s := fmt.Sprintf("%d-%d", v.FactorEdbSeriesId, v.EdbInfoId)
-		item.Used = factorUsed[s]
+		if v.EdbUsed == 1 {
+			item.Used = true
+		}
 		item.SourceName = edbItem.SourceName
 		matrixItems = append(matrixItems, item)
 

+ 43 - 7
controllers/data_manage/factor_edb_series.go

@@ -652,6 +652,7 @@ func (this *FactorEdbSeriesController) CorrelationMatrix() {
 	calculateWorkers := make(chan struct{}, 10)
 	wg := sync.WaitGroup{}
 	edbExists := make(map[string]bool)
+	chartKeyMap := make(map[string]*data_manage.FactorEdbSeriesChartMapping)
 	for _, v := range edbMappings {
 		existsKey := fmt.Sprintf("%d-%d", v.FactorEdbSeriesId, v.EdbInfoId)
 		if edbExists[existsKey] {
@@ -734,22 +735,40 @@ func (this *FactorEdbSeriesController) CorrelationMatrix() {
 				}
 			}
 
-			// 存储计算结果, 注此处保存的是排序前的顺序
-			b, e := json.Marshal(values)
+			// 图表关联-此处添加的chart_info_id=0
+			newMapping := new(data_manage.FactorEdbSeriesChartMapping)
+			newMapping.CalculateType = data_manage.FactorEdbSeriesChartCalculateTypeCorrelation
+
+			// 计算参数
+			var calculatePars data_manage.FactorEdbSeriesChartCalculateCorrelationReq
+			calculatePars.BaseEdbInfoId = req.BaseEdbInfoId
+			calculatePars.LeadValue = req.Correlation.LeadValue
+			calculatePars.LeadUnit = req.Correlation.LeadUnit
+			calculatePars.CalculateValue = req.Correlation.CalculateValue
+			calculatePars.CalculateUnit = req.Correlation.CalculateUnit
+			bc, e := json.Marshal(calculatePars)
 			if e != nil {
 				item.Msg = fmt.Sprintf("计算失败")
-				item.ErrMsg = fmt.Sprintf("计算结果JSON格式化失败, err: %v", e)
+				item.ErrMsg = fmt.Sprintf("计算参数JSON格式化失败, err: %v", e)
 				resp.Fail = append(resp.Fail, item)
 				return
 			}
-			mapping.CalculateData = string(b)
-			mapping.ModifyTime = time.Now().Local()
-			if e = mapping.Update([]string{mapping.Cols().CalculateData, mapping.Cols().ModifyTime}); e != nil {
+			newMapping.CalculatePars = string(bc)
+
+			// 计算结果, 注此处保存的是排序前的顺序
+			bv, e := json.Marshal(values)
+			if e != nil {
 				item.Msg = fmt.Sprintf("计算失败")
-				item.ErrMsg = fmt.Sprintf("更新相关性矩阵计算结果失败, err: %v", e)
+				item.ErrMsg = fmt.Sprintf("计算结果JSON格式化失败, err: %v", e)
 				resp.Fail = append(resp.Fail, item)
 				return
 			}
+			newMapping.CalculateData = string(bv)
+			newMapping.FactorEdbSeriesId = mapping.FactorEdbSeriesId
+			newMapping.EdbInfoId = mapping.EdbInfoId
+			newMapping.CreateTime = time.Now().Local()
+			newMapping.ModifyTime = time.Now().Local()
+			chartKeyMap[existsKey] = newMapping
 
 			// 按照固定规则排期数[0 1 2 3 -1 -2 -3], 仅矩阵展示为此顺序
 			sort.Sort(data_manage.FactorEdbSeriesCorrelationMatrixOrder(values))
@@ -760,6 +779,23 @@ func (this *FactorEdbSeriesController) CorrelationMatrix() {
 	}
 	wg.Wait()
 
+	// 新增图表关联, 此处按照顺序添加
+	chartMappings := make([]*data_manage.FactorEdbSeriesChartMapping, 0)
+	for _, v := range edbMappings {
+		k := fmt.Sprintf("%d-%d", v.FactorEdbSeriesId, v.EdbInfoId)
+		item := chartKeyMap[k]
+		if item == nil {
+			continue
+		}
+		chartMappings = append(chartMappings, item)
+	}
+	chartMappingOb := new(data_manage.FactorEdbSeriesChartMapping)
+	if e = chartMappingOb.ClearAndCreateMapping(req.SeriesIds, chartMappings); e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("新增图表关联失败, Err: %v", e)
+		return
+	}
+
 	br.Data = resp
 	br.Ret = 200
 	br.Success = true

+ 13 - 1
controllers/data_manage/future_good/future_good_profit_chart_info.go

@@ -322,6 +322,8 @@ func (this *FutureGoodChartInfoController) ProfitChartInfoAdd() {
 	resp.UniqueCode = chartInfo.UniqueCode
 	resp.ChartType = req.ChartType
 
+	// 添加指标引用记录
+	_ = data.SaveChartEdbInfoRelation(edbInfoIdArr, chartInfo)
 	//添加es数据
 	go data.EsAddOrEditChartInfo(chartInfo.ChartInfoId)
 
@@ -645,6 +647,8 @@ func (this *FutureGoodChartInfoController) ProfitChartInfoEdit() {
 	resp.UniqueCode = chartItem.UniqueCode
 	resp.ChartType = req.ChartType
 
+	// 添加指标引用记录
+	_ = data.SaveChartEdbInfoRelation(edbInfoIdArr, chartItem)
 	//添加es数据
 	go data.EsAddOrEditChartInfo(chartItem.ChartInfoId)
 	//修改my eta es数据
@@ -825,7 +829,15 @@ func copyProfitChartInfo(oldChartInfo *data_manage.ChartInfo, chartClassifyId in
 		br.ErrMsg = "保存商品利润图表失败,Err:" + err.Error()
 		return
 	}
-
+	// 添加指标引用记录
+	edbInfoIdArr := make([]int, 0)
+	edbInfoIdArrStr := strings.Split(oldChartInfo.EdbInfoIds, ",")
+	for _, v := range edbInfoIdArrStr {
+		i, _ := strconv.Atoi(v)
+		edbInfoIdArr = append(edbInfoIdArr, i)
+	}
+	//保存图表与指标的关系
+	_ = data.SaveChartEdbInfoRelation(edbInfoIdArr, chartInfo)
 	//添加es数据
 	go data.EsAddOrEditChartInfo(chartInfo.ChartInfoId)
 	//修改my eta es数据

+ 35 - 20
models/data_manage/chart_info_correlation.go

@@ -167,7 +167,7 @@ type CorrelationChartInfoExtraConfig struct {
 }
 
 // CreateMultiFactorCorrelationChartAndEdb 新增多因子相关性图表
-func CreateMultiFactorCorrelationChartAndEdb(chartInfo *ChartInfo, edbMappingList []*ChartEdbMapping, correlationInfo *ChartInfoCorrelation, seriesMappings []*FactorEdbSeriesChartMapping) (chartInfoId int, err error) {
+func CreateMultiFactorCorrelationChartAndEdb(chartInfo *ChartInfo, edbMappingList []*ChartEdbMapping, correlationInfo *ChartInfoCorrelation, chartMappings []*FactorEdbSeriesChartMapping) (chartInfoId int, err error) {
 	o := orm.NewOrmUsingDB("data")
 	tx, e := o.Begin()
 	if e != nil {
@@ -211,20 +211,31 @@ func CreateMultiFactorCorrelationChartAndEdb(chartInfo *ChartInfo, edbMappingLis
 	}
 
 	// 指标系列-图表关联
-	if len(seriesMappings) > 0 {
-		for _, v := range seriesMappings {
-			v.ChartInfoId = chartInfoId
-		}
-		if _, e = tx.InsertMulti(200, seriesMappings); e != nil {
-			err = fmt.Errorf("series chart mappings insert err: %v", e)
+	if len(chartMappings) > 0 {
+		chartMappingOb := new(FactorEdbSeriesChartMapping)
+		sql := fmt.Sprintf(`UPDATE %s SET %s = ?, %s = ?, %s = ?, %s = ? WHERE %s = ?`, chartMappingOb.TableName(), chartMappingOb.Cols().ChartInfoId, chartMappingOb.Cols().Source, chartMappingOb.Cols().EdbUsed, chartMappingOb.Cols().ModifyTime, chartMappingOb.Cols().PrimaryId)
+		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 chartMappings {
+			v.ChartInfoId = chartInfoId
+			_, e = p.Exec(v.ChartInfoId, v.Source, v.EdbUsed, v.ModifyTime, v.FactorEdbSeriesChartMappingId)
+			if e != nil {
+				err = fmt.Errorf("update exec err: %v", e)
+				return
+			}
+		}
 	}
 	return
 }
 
 // UpdateMultiFactorCorrelationChartAndEdb 编辑多因子相关性图表
-func UpdateMultiFactorCorrelationChartAndEdb(chartInfo *ChartInfo, edbMappingList []*ChartEdbMapping, correlationInfo *ChartInfoCorrelation, seriesMappings []*FactorEdbSeriesChartMapping, chartUpdateCols, correlateUpdateCols []string) (err error) {
+func UpdateMultiFactorCorrelationChartAndEdb(chartInfo *ChartInfo, edbMappingList []*ChartEdbMapping, correlationInfo *ChartInfoCorrelation, chartMappings []*FactorEdbSeriesChartMapping, chartUpdateCols, correlateUpdateCols []string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	tx, e := o.Begin()
 	if e != nil {
@@ -272,20 +283,24 @@ func UpdateMultiFactorCorrelationChartAndEdb(chartInfo *ChartInfo, edbMappingLis
 	}
 
 	// 指标系列-图表关联
-	sql = `DELETE FROM factor_edb_series_chart_mapping WHERE chart_info_id = ?`
-	_, e = tx.Raw(sql, chartInfo.ChartInfoId).Exec()
-	if e != nil {
-		err = fmt.Errorf("clear chart series mapping err: %v", e)
-		return
-	}
-	if len(seriesMappings) > 0 {
-		for _, v := range seriesMappings {
-			v.ChartInfoId = chartInfo.ChartInfoId
-		}
-		if _, e = tx.InsertMulti(200, seriesMappings); e != nil {
-			err = fmt.Errorf("series chart mappings insert err: %v", e)
+	if len(chartMappings) > 0 {
+		chartMappingOb := new(FactorEdbSeriesChartMapping)
+		sql = fmt.Sprintf(`UPDATE %s SET %s = ?, %s = ? WHERE %s = ?`, chartMappingOb.TableName(), chartMappingOb.Cols().EdbUsed, chartMappingOb.Cols().ModifyTime, chartMappingOb.Cols().PrimaryId)
+		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 chartMappings {
+			_, e = p.Exec(v.EdbUsed, v.ModifyTime, v.FactorEdbSeriesChartMappingId)
+			if e != nil {
+				err = fmt.Errorf("update exec err: %v", e)
+				return
+			}
+		}
 	}
 	return
 }

+ 66 - 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",
 	}
@@ -149,3 +165,47 @@ func (m *FactorEdbSeriesChartMapping) GetDistinctSeriesIdByChartId(chartId int)
 	_, err = o.Raw(sql, chartId).QueryRows(&seriesIds)
 	return
 }
+
+// ClearAndCreateMapping 新增图表关联
+func (m *FactorEdbSeriesChartMapping) ClearAndCreateMapping(seriesIds []int, mappings []*FactorEdbSeriesChartMapping) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	tx, e := o.Begin()
+	if e != nil {
+		err = fmt.Errorf("orm begin err: %v", e)
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	if len(seriesIds) > 0 {
+		sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s) AND %s = 0`, m.TableName(), m.Cols().FactorEdbSeriesId, utils.GetOrmInReplace(len(seriesIds)), m.Cols().ChartInfoId)
+		_, e = tx.Raw(sql, seriesIds).Exec()
+		if e != nil {
+			err = fmt.Errorf("remove chart mapping err: %v", e)
+			return
+		}
+	}
+
+	if len(mappings) > 0 {
+		_, e = tx.InsertMulti(200, mappings)
+		if e != nil {
+			err = fmt.Errorf("insert multi mapping err: %v", e)
+			return
+		}
+	}
+	return
+}
+
+// FactorEdbSeriesChartCalculateCorrelationReq 图表相关性计算参数
+type FactorEdbSeriesChartCalculateCorrelationReq struct {
+	BaseEdbInfoId  int    `description:"标的指标ID"`
+	LeadValue      int    `description:"领先期数"`
+	LeadUnit       string `description:"频度"`
+	CalculateValue int    `description:"计算窗口"`
+	CalculateUnit  string `description:"计算频度"`
+}

+ 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 - 6
services/data/correlation/chart_info.go

@@ -581,11 +581,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)
@@ -594,6 +596,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 {
@@ -606,7 +655,6 @@ func ChartInfoRefresh(chartInfoId int) (err error) {
 		errMsg = "获取相关性图表, A指标mapping信息失败, Err:" + err.Error()
 		return
 	}
-	// TODO:多因子刷新
 	edbInfoMappingB, err := data_manage.GetChartEdbMappingByEdbInfoId(correlationChart.EdbInfoIdSecond)
 	if err != nil {
 		errMsg = "获取相关性图表, B指标mapping信息失败, Err:" + err.Error()
@@ -1455,16 +1503,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)

+ 2 - 1
services/data/excel/mixed_table.go

@@ -1258,7 +1258,8 @@ func changePointDecimalPlaces(str string, changeNum int, numberType string, isPe
 		val, _ = decimal.NewFromFloat(val).Round(int32(decimalPlaces)).Float64()
 		newStr = strconv.FormatFloat(val, 'f', decimalPlaces, 64)
 	} else {
-		newStr = fmt.Sprintf("%v", val)
+		// 此处用%.f避免科学计数法, 从而导致后面出现很多位0
+		newStr = fmt.Sprintf("%.f", val)
 	}
 	// 计算小数位数
 	decimalPlaces = 0

+ 48 - 0
services/data/factor_edb_series.go

@@ -2,6 +2,7 @@ package data
 
 import (
 	"encoding/json"
+	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/utils"
@@ -141,3 +142,50 @@ func FactorEdbStepCalculate(seriesId int, edbArr []*data_manage.EdbInfo, calcula
 	wg.Wait()
 	return
 }
+
+// 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
+}