hsun 8 месяцев назад
Родитель
Сommit
bed46c6a1f

+ 105 - 29
controllers/data_manage/correlation/correlation_chart_info.go

@@ -1326,32 +1326,72 @@ func (this *CorrelationChartInfoController) Copy() {
 		}
 
 		// 指标系列-图表关联
-		seriesMappings := make([]*data_manage.FactorEdbSeriesChartMapping, 0)
+		seriesIds := make([]int, 0)
+		originChartMappings := 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, req.ChartInfoId)
-			mappings, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
+			list, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
 			if e != nil {
 				br.Msg = "保存失败"
 				br.ErrMsg = fmt.Sprintf("获取指标系列-图表关联失败, Err: %v", e)
 				return
 			}
-			for _, v := range mappings {
-				seriesMappings = append(seriesMappings, &data_manage.FactorEdbSeriesChartMapping{
-					FactorEdbSeriesId: v.FactorEdbSeriesId,
-					ChartInfoId:       req.ChartInfoId,
-					EdbInfoId:         v.EdbInfoId,
-					Source:            v.Source,
-					CreateTime:        time.Now().Local(),
-					ModifyTime:        time.Now().Local(),
-				})
+			for _, v := range list {
+				//seriesMappings = append(seriesMappings, &data_manage.FactorEdbSeriesChartMapping{
+				//	FactorEdbSeriesId: v.FactorEdbSeriesId,
+				//	ChartInfoId:       req.ChartInfoId,
+				//	EdbInfoId:         v.EdbInfoId,
+				//	Source:            v.Source,
+				//	CreateTime:        time.Now().Local(),
+				//	ModifyTime:        time.Now().Local(),
+				//})
+				if !utils.InArrayByInt(seriesIds, v.FactorEdbSeriesId) {
+					seriesIds = append(seriesIds, v.FactorEdbSeriesId)
+				}
 			}
+			originChartMappings = list
+		}
+		if len(seriesIds) == 0 {
+			br.Msg = "保存失败"
+			br.ErrMsg = "源图表系列有误"
+			return
+		}
+
+		// 注意此处要复制一份系列及系列关联指标, 不可共用被复制图表的系列
+		originSeries := make([]*data_manage.FactorEdbSeries, 0)
+		{
+			ob := new(data_manage.FactorEdbSeries)
+			cond := fmt.Sprintf(" AND %s IN (%s)", ob.Cols().PrimaryId, utils.GetOrmInReplace(len(seriesIds)))
+			pars := make([]interface{}, 0)
+			pars = append(pars, seriesIds)
+			list, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
+			if e != nil {
+				br.Msg = "保存失败"
+				br.ErrMsg = fmt.Sprintf("获取源图表系列失败, %v", e)
+				return
+			}
+			originSeries = list
+		}
+		originEdbSeriesMapping := make([]*data_manage.FactorEdbSeriesMapping, 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)
+			list, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
+			if e != nil {
+				br.Msg = "保存失败"
+				br.ErrMsg = fmt.Sprintf("获取源图表系列指标失败, %v", e)
+				return
+			}
+			originEdbSeriesMapping = list
 		}
 
 		// 新增图表/相关性图表/图表指标关联/指标系列图表关联
-		chartInfoId, e := data_manage.CreateMultiFactorCorrelationChartAndEdb(chartInfo, edbMappings, chartCorrelate, seriesMappings)
+		chartInfoId, e := data_manage.CreateMultiFactorCorrelationChartAndEdb(chartInfo, edbMappings, chartCorrelate, originChartMappings, true, originSeries, originEdbSeriesMapping)
 		if e != nil {
 			br.Msg = "保存失败"
 			br.ErrMsg = fmt.Sprintf("新增多因子相关性图表失败, Err: %v", e)
@@ -2100,6 +2140,10 @@ func (this *CorrelationChartInfoController) MultiFactorAdd() {
 		br.Msg = "请选择标的指标"
 		return
 	}
+	if len(req.FactorCorrelation.SeriesIds) == 0 {
+		br.Msg = "请选择因子指标系列"
+		return
+	}
 	if len(req.FactorCorrelation.SeriesEdb) == 0 {
 		br.Msg = "请选择因子指标"
 		return
@@ -2273,27 +2317,19 @@ func (this *CorrelationChartInfoController) MultiFactorAdd() {
 		edbMappings = append(edbMappings, m)
 	}
 
-	// 指标系列-图表关联
-	chartMappings := make([]*data_manage.FactorEdbSeriesChartMapping, 0)
-	seriesIds := make([]int, 0)
-	seriesIdExist := make(map[int]bool)
+	// 标记引用的指标
+	seriesIds := req.FactorCorrelation.SeriesIds
 	edbUsed := make(map[string]bool)
 	for _, v := range req.FactorCorrelation.SeriesEdb {
-		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
-	}
-	{
 
+	// 指标系列-图表关联
+	chartMappings := make([]*data_manage.FactorEdbSeriesChartMapping, 0)
+	{
 		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)
+		cond := fmt.Sprintf(" AND %s IN (%s)", ob.Cols().FactorEdbSeriesId, utils.GetOrmInReplace(len(seriesIds)))
 		pars := make([]interface{}, 0)
 		pars = append(pars, seriesIds)
 		items, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
@@ -2313,8 +2349,41 @@ func (this *CorrelationChartInfoController) MultiFactorAdd() {
 		v.ModifyTime = time.Now().Local()
 	}
 
+	// 另存为
+	originSeries := make([]*data_manage.FactorEdbSeries, 0)
+	originEdbSeriesMapping := make([]*data_manage.FactorEdbSeriesMapping, 0)
+	if req.SaveAs {
+		// 注意此处要复制一份系列及系列关联指标, 不可共用被复制图表的系列
+		{
+			ob := new(data_manage.FactorEdbSeries)
+			cond := fmt.Sprintf(" AND %s IN (%s)", ob.Cols().PrimaryId, utils.GetOrmInReplace(len(seriesIds)))
+			pars := make([]interface{}, 0)
+			pars = append(pars, seriesIds)
+			list, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
+			if e != nil {
+				br.Msg = "保存失败"
+				br.ErrMsg = fmt.Sprintf("获取源图表系列失败, %v", e)
+				return
+			}
+			originSeries = list
+		}
+		{
+			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)
+			list, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
+			if e != nil {
+				br.Msg = "保存失败"
+				br.ErrMsg = fmt.Sprintf("获取源图表系列指标失败, %v", e)
+				return
+			}
+			originEdbSeriesMapping = list
+		}
+	}
+
 	// 新增图表/相关性图表/图表指标关联/指标系列图表关联
-	chartInfoId, e := data_manage.CreateMultiFactorCorrelationChartAndEdb(chartInfo, edbMappings, chartCorrelate, chartMappings)
+	chartInfoId, e := data_manage.CreateMultiFactorCorrelationChartAndEdb(chartInfo, edbMappings, chartCorrelate, chartMappings, req.SaveAs, originSeries, originEdbSeriesMapping)
 	if e != nil {
 		br.Msg = "保存失败"
 		br.ErrMsg = fmt.Sprintf("新增多因子相关性图表失败, Err: %v", e)
@@ -2342,6 +2411,7 @@ func (this *CorrelationChartInfoController) MultiFactorAdd() {
 	resp.ChartInfoId = chartInfo.ChartInfoId
 	resp.UniqueCode = chartInfo.UniqueCode
 	resp.ChartType = chartInfo.ChartType
+	resp.ClassifyId = req.ClassifyId
 
 	br.Data = resp
 	br.Ret = 200
@@ -2394,6 +2464,10 @@ func (this *CorrelationChartInfoController) MultiFactorEdit() {
 		br.Msg = "请选择标的指标"
 		return
 	}
+	if len(req.FactorCorrelation.SeriesIds) == 0 {
+		br.Msg = "请选择因子指标系列"
+		return
+	}
 	if len(req.FactorCorrelation.SeriesEdb) == 0 {
 		br.Msg = "请选择因子指标"
 		return
@@ -2584,6 +2658,7 @@ func (this *CorrelationChartInfoController) MultiFactorEdit() {
 		edbMappings = append(edbMappings, m)
 	}
 
+	seriesIds := req.FactorCorrelation.SeriesIds
 	edbUsed := make(map[string]bool)
 	for _, v := range req.FactorCorrelation.SeriesEdb {
 		k := fmt.Sprintf("%d-%d", v.SeriesId, v.EdbInfoId)
@@ -2593,9 +2668,9 @@ func (this *CorrelationChartInfoController) MultiFactorEdit() {
 	chartMappings := make([]*data_manage.FactorEdbSeriesChartMapping, 0)
 	{
 		ob := new(data_manage.FactorEdbSeriesChartMapping)
-		cond := fmt.Sprintf(" AND %s = ?", ob.Cols().ChartInfoId)
+		cond := fmt.Sprintf(" AND %s IN (%s)", ob.Cols().FactorEdbSeriesId, utils.GetOrmInReplace(len(seriesIds)))
 		pars := make([]interface{}, 0)
-		pars = append(pars, chartInfo.ChartInfoId)
+		pars = append(pars, seriesIds)
 		items, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
 		if e != nil {
 			br.Msg = "保存失败"
@@ -2647,6 +2722,7 @@ func (this *CorrelationChartInfoController) MultiFactorEdit() {
 	resp.ChartInfoId = chartInfo.ChartInfoId
 	resp.UniqueCode = chartInfo.UniqueCode
 	resp.ChartType = chartInfo.ChartType
+	resp.ClassifyId = req.ClassifyId
 
 	br.Data = resp
 	br.Ret = 200

+ 18 - 0
controllers/data_manage/edb_info_calculate.go

@@ -2137,6 +2137,19 @@ func (this *ChartInfoController) CalculateMultiChoice() {
 	notFrequency := this.GetString("NotFrequency")
 	edbInfoType, _ := this.GetInt("EdbInfoType", 0)
 	var edbIdArr []int
+	var filterEdbIds []int
+	if edbInfoIds != "" {
+		arr := strings.Split(edbInfoIds, ",")
+		for _, v := range arr {
+			t, e := strconv.Atoi(v)
+			if e != nil {
+				br.Msg = "参数有误"
+				br.ErrMsg = fmt.Sprintf("指标ID有误, %s", v)
+				return
+			}
+			filterEdbIds = append(filterEdbIds, t)
+		}
+	}
 
 	if selectAll {
 		// 如果勾了列表全选,那么EdbCode传的就是排除的code
@@ -2185,7 +2198,12 @@ func (this *ChartInfoController) CalculateMultiChoice() {
 			return
 		}
 
+		filterLen := len(filterEdbIds)
 		for _, v := range edbList {
+			// 全选-排除传入的指标
+			if filterLen > 0 && utils.InArrayByInt(filterEdbIds, v.EdbInfoId) {
+				continue
+			}
 			edbIdArr = append(edbIdArr, v.EdbInfoId)
 		}
 	} else {

+ 1 - 0
models/data_manage/chart_info.go

@@ -1440,6 +1440,7 @@ type AddChartInfoResp struct {
 	ChartInfoId int    `description:"图表id"`
 	UniqueCode  string `description:"图表唯一编码"`
 	ChartType   int    `description:"生成样式:1:曲线图,2:季节性图"`
+	ClassifyId  int    `description:"分类ID"`
 }
 
 type QuarterDataList []*QuarterData

+ 54 - 15
models/data_manage/chart_info_correlation.go

@@ -145,6 +145,7 @@ type FactorCorrelationConfig struct {
 	CalculateValue int                       `description:"计算窗口"`
 	CalculateUnit  string                    `description:"计算频度"`
 	SeriesEdb      []CorrelationSeriesEdbReq `description:"关联系列指标"`
+	SeriesIds      []int                     `description:"所有因子系列"`
 }
 
 // CorrelationChartLegend 相关性图表图例
@@ -167,7 +168,7 @@ type CorrelationChartInfoExtraConfig struct {
 }
 
 // CreateMultiFactorCorrelationChartAndEdb 新增多因子相关性图表
-func CreateMultiFactorCorrelationChartAndEdb(chartInfo *ChartInfo, edbMappingList []*ChartEdbMapping, correlationInfo *ChartInfoCorrelation, chartMappings []*FactorEdbSeriesChartMapping) (chartInfoId int, err error) {
+func CreateMultiFactorCorrelationChartAndEdb(chartInfo *ChartInfo, edbMappingList []*ChartEdbMapping, correlationInfo *ChartInfoCorrelation, chartMappings []*FactorEdbSeriesChartMapping, saveAs bool, copySeries []*FactorEdbSeries, copySeriesEdb []*FactorEdbSeriesMapping) (chartInfoId int, err error) {
 	o := orm.NewOrmUsingDB("data")
 	tx, e := o.Begin()
 	if e != nil {
@@ -210,25 +211,63 @@ func CreateMultiFactorCorrelationChartAndEdb(chartInfo *ChartInfo, edbMappingLis
 		return
 	}
 
-	// 指标系列-图表关联
-	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 !saveAs {
+		// 指标系列-图表关联
+		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
+	}
+
+	// 另存为
+	seriesIdMap := make(map[int]int) // 此处做一个原ID与新ID的映射
+	for _, v := range copySeries {
+		id := v.FactorEdbSeriesId
+		v.FactorEdbSeriesId = 0
+		newId, e := tx.Insert(v)
 		if e != nil {
-			err = fmt.Errorf("sql prepare err: %v", e)
+			err = fmt.Errorf("copy series err: %v", e)
 			return
 		}
-		defer func() {
-			_ = p.Close()
-		}()
+		seriesIdMap[id] = int(newId)
+	}
+	for _, v := range copySeriesEdb {
+		v.FactorEdbSeriesMappingId = 0
+		v.FactorEdbSeriesId = seriesIdMap[v.FactorEdbSeriesId]
+	}
+	_, e = tx.InsertMulti(200, copySeriesEdb)
+	if e != nil {
+		err = fmt.Errorf("copy series edb mappings err: %v", e)
+		return
+	}
+	if len(chartMappings) > 0 {
 		for _, v := range chartMappings {
+			v.FactorEdbSeriesChartMappingId = 0
 			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
-			}
+			v.FactorEdbSeriesId = seriesIdMap[v.FactorEdbSeriesId]
+		}
+		_, e = tx.InsertMulti(200, chartMappings)
+		if e != nil {
+			err = fmt.Errorf("copy series chart mappings err: %v", e)
+			return
 		}
 	}
 	return

+ 1 - 0
models/data_manage/correlation/request/chart.go

@@ -26,6 +26,7 @@ type CorrelationChartMultiFactorSaveReq struct {
 	FactorCorrelation *data_manage.FactorCorrelationConfig         `description:"多因子指标系列-相关性配置"`
 	SourcesFrom       *data_manage.ChartInfoSourcesFrom            `description:"图表来源"`
 	ExtraConfig       *data_manage.CorrelationChartInfoExtraConfig `description:"额外设置"`
+	SaveAs            bool                                         `description:"是否另存为: true-是"`
 }
 
 // CorrelationChartMultiFactorSaveAsReq 多因子相关性图表-另存为请求