فهرست منبع

fix:品种变更指标关联时候,需要同步去更新图表关联的指标信息

Roc 1 سال پیش
والد
کامیت
e4549676ba

+ 4 - 0
controllers/data_manage/cross_variety/tag.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_api/models/data_manage/cross_variety"
 	"eta/eta_api/models/data_manage/cross_variety/request"
 	"eta/eta_api/models/data_manage/cross_variety/response"
+	cross_varietyService "eta/eta_api/services/data/cross_variety"
 	"eta/eta_api/utils"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"time"
@@ -397,6 +398,9 @@ func (c *TagController) SaveVarietyEdb() {
 		return
 	}
 
+	// 修改跨品种分析图表的关联指标
+	go cross_varietyService.ModifyChartEdbMapping(req.ChartTagId)
+
 	br.Ret = 200
 	br.Msg = "保存成功"
 	br.Success = true

+ 101 - 0
models/data_manage/chart_edb_mapping.go

@@ -2,8 +2,11 @@ package data_manage
 
 import (
 	"eta/eta_api/utils"
+	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"strconv"
+	"strings"
 	"time"
 )
 
@@ -198,3 +201,101 @@ func GetChartEdbMappingByFutureGoodEdbInfoId(edbInfoId int) (item *ChartEdbInfoM
 	err = o.Raw(sql, edbInfoId).QueryRow(&item)
 	return
 }
+
+// ModifyChartEdbMapping
+// @Description: 修改图表的关系表
+// @author: Roc
+// @datetime 2023-12-11 17:23:32
+// @param chartInfoId int
+// @param edbInfoList []*EdbInfo
+// @return err error
+func ModifyChartEdbMapping(chartInfoId int, edbInfoList []*EdbInfo) (err error) {
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			fmt.Println("AddCalculateHcz,Err:" + err.Error())
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+	list := make([]*ChartEdbMapping, 0)
+	sql := ` SELECT a.*
+             FROM chart_edb_mapping AS a
+			 WHERE chart_info_id=? 
+             ORDER BY chart_edb_mapping_id ASC `
+	_, err = o.Raw(sql, chartInfoId).QueryRows(&list)
+
+	if err != nil {
+		return
+	}
+
+	mappingIdMap := make(map[int]*ChartEdbMapping)
+	removeMapping := make(map[int]int)
+	for _, v := range list {
+		mappingIdMap[v.EdbInfoId] = v
+		removeMapping[v.EdbInfoId] = v.ChartEdbMappingId
+	}
+
+	addList := make([]*ChartEdbMapping, 0)
+	for _, v := range edbInfoList {
+		_, ok := mappingIdMap[v.EdbInfoId]
+		// 存在该指标关系就不处理了
+		if ok {
+			delete(removeMapping, v.EdbInfoId)
+			continue
+		}
+		timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+		// 不存在就添加
+		addList = append(addList, &ChartEdbMapping{
+			//ChartEdbMappingId: 0,
+			ChartInfoId: chartInfoId,
+			EdbInfoId:   v.EdbInfoId,
+			CreateTime:  time.Now(),
+			ModifyTime:  time.Now(),
+			UniqueCode:  utils.MD5(utils.CHART_PREFIX + "_" + fmt.Sprint(chartInfoId) + "_" + fmt.Sprint(v.EdbInfoId) + "_" + timestamp),
+			MaxData:     v.MaxValue,
+			MinData:     v.MinValue,
+			//IsOrder:     v.IsOrder,
+			//IsAxis:      v.IsAxis,
+			EdbInfoType: v.EdbInfoType,
+			//LeadValue:   v.LeadValue,
+			//LeadUnit:    v.LeadUnit,
+			//ChartStyle:  v.ChartStyle,
+			//ChartColor:  v.ChartColor,
+			//ChartWidth:  v.ChartWidth,
+			Source: v.Source,
+		})
+	}
+
+	// 需要添加的话,那就添加吧
+	if len(addList) > 0 {
+		_, err = o.InsertMulti(len(addList), addList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 移除不必要的mapping
+	if len(removeMapping) > 0 {
+		removeIdList := make([]string, 0) //需要移除的日期
+		for _, v := range removeMapping {
+			removeIdList = append(removeIdList, fmt.Sprint(v))
+		}
+		removeIdStr := strings.Join(removeIdList, `","`)
+		removeIdStr = `"` + removeIdStr + `"`
+		//如果拼接指标变更了,那么需要删除所有的指标数据
+		sql := fmt.Sprintf(` DELETE FROM chart_edb_mapping WHERE chart_edb_mapping_id in (%s) `, removeIdStr)
+
+		_, err = o.Raw(sql).Exec()
+		if err != nil {
+			err = fmt.Errorf("移除不必要的mapping失败,Err:" + err.Error())
+			return
+		}
+	}
+
+	return
+}

+ 1 - 1
models/data_manage/cross_variety/chart_info_cross_variety.go

@@ -48,7 +48,7 @@ func GetCountChartByTagId(tagId int) (total int64, err error) {
 // @return err error
 func GeChartInfoCrossVarietyListByTagId(tagId int) (items []*ChartInfoCrossVariety, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := `SELECT a.* FROM chart_info AS a JOIN
+	sql := `SELECT b.* FROM chart_info AS a JOIN
     chart_info_cross_variety AS b on a.chart_info_id = b.chart_info_id 
     WHERE b.chart_x_tag_id = ? or b.chart_y_tag_id=?`
 	_, err = o.Raw(sql, tagId, tagId).QueryRows(&items)

+ 3 - 3
models/data_manage/cross_variety/chart_tag_variety.go

@@ -238,7 +238,7 @@ func GetCountByEdbInfoId(edbInfoId int) (total int, err error) {
 	return
 }
 
-// GetChartVarietyItemListByTagIdList
+// GetChartTagVarietyListByTagIdList
 // @Description: 根据标签id列表获取所有绑定的品种列表
 // @author: Roc
 // @datetime 2023-11-22 10:44:35
@@ -246,13 +246,13 @@ func GetCountByEdbInfoId(edbInfoId int) (total int, err error) {
 // @param chartVarietyId int
 // @return items []*ChartVariety
 // @return err error
-func GetChartVarietyItemListByTagIdList(chartTagIdList []int) (items []*ChartVariety, err error) {
+func GetChartTagVarietyListByTagIdList(chartTagIdList []int) (items []*ChartTagVariety, err error) {
 	num := len(chartTagIdList)
 	if num <= 0 {
 		return
 	}
 	o := orm.NewOrmUsingDB("data")
-	sql := `SELECT b.* FROM chart_tag_variety a 
+	sql := `SELECT a.* FROM chart_tag_variety a 
          join chart_variety b on a.chart_variety_id=b.chart_variety_id WHERE chart_tag_id in (` + utils.GetOrmInReplace(num) + `) `
 	_, err = o.Raw(sql, chartTagIdList).QueryRows(&items)
 

+ 20 - 0
models/data_manage/cross_variety/chart_variety_mapping.go

@@ -1,6 +1,7 @@
 package cross_variety
 
 import (
+	"eta/eta_api/utils"
 	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
@@ -45,3 +46,22 @@ func GetCountChartByVarietyId(varietyId int) (total int64, err error) {
 
 	return
 }
+
+// GetChartVarietyMappingListByChartInfoIdList
+// @Description: 根据图表id列表获取图表与品种的关系列表
+// @author: Roc
+// @datetime 2023-11-24 15:22:36
+// @param chartInfoId int
+// @return items []*ChartVarietyMapping
+// @return err error
+func GetChartVarietyMappingListByChartInfoIdList(chartInfoIdList []int) (items []*ChartVarietyMapping, err error) {
+	num := len(chartInfoIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM chart_variety_mapping WHERE chart_info_id in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, chartInfoIdList).QueryRows(&items)
+
+	return
+}

+ 118 - 2
services/data/cross_variety/chart.go

@@ -817,16 +817,31 @@ func EditChartInfo(req request.EditChartReq, sysUser *system.Admin) (chartItem *
 	return
 }
 
-func Modify(tagId int) {
-	// todo 找出标签关联的图表
+// ModifyChartEdbMapping
+// @Description: 修改图表的关系表
+// @author: Roc
+// @datetime 2023-12-11 17:32:31
+// @param tagId int
+func ModifyChartEdbMapping(tagId int) {
+	errMsgList := make([]string, 0)
+	defer func() {
+		if len(errMsgList) > 0 {
+			utils.FileLog.Error("修改跨品种分析的图表关联指标失败:\n" + strings.Join(errMsgList, "\n"))
+		}
+	}()
+	// 找出标签关联的图表
 	list, err := cross_varietyModel.GeChartInfoCrossVarietyListByTagId(tagId)
 	if err != nil {
 		return
 	}
 
+	chartInfoIdList := make([]int, 0)
+
 	tagIdList := make([]int, 0)
 	tagIdMap := make(map[int]int, 0)
 	for _, v := range list {
+		chartInfoIdList = append(chartInfoIdList, v.ChartInfoId)
+
 		if _, ok := tagIdMap[v.ChartXTagId]; !ok {
 			tagIdList = append(tagIdList, v.ChartXTagId)
 			tagIdMap[v.ChartXTagId] = 1
@@ -838,5 +853,106 @@ func Modify(tagId int) {
 		}
 	}
 
+	// 找出所有标签关联的品种和对应的指标
+	chartTagVarietyList, err := cross_varietyModel.GetChartTagVarietyListByTagIdList(tagIdList)
+	if err != nil {
+		return
+	}
+
+	// 所有指标id
+	allEdbInfoIdList := make([]int, 0)
+
+	// 标签关联品种的指标列表
+	tagVarietyEdbMap := make(map[string][]int)
+	for _, v := range chartTagVarietyList {
+		if v.EdbInfoId <= 0 {
+			continue
+		}
+		key := fmt.Sprint(v.ChartTagId, "_", v.ChartVarietyId)
+		tagVarietyEdbList, ok := tagVarietyEdbMap[key]
+		if !ok {
+			tagVarietyEdbList = make([]int, 0)
+		}
+		tagVarietyEdbMap[key] = append(tagVarietyEdbList, v.EdbInfoId)
+		allEdbInfoIdList = append(allEdbInfoIdList, v.EdbInfoId)
+	}
+
+	edbInfoMap := make(map[int]*data_manage.EdbInfo)
+	// 获取指标列表
+	if len(allEdbInfoIdList) > 0 {
+		allEdbInfoList, tmpErr := data_manage.GetEdbInfoByIdList(allEdbInfoIdList)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range allEdbInfoList {
+			edbInfoMap[v.EdbInfoId] = v
+		}
+	}
+
+	// 图表关联的品种列表
+	chartVarietyMappingList, err := cross_varietyModel.GetChartVarietyMappingListByChartInfoIdList(chartInfoIdList)
+	if err != nil {
+		return
+	}
+
+	// 图表关联的品种map
+	chartVarietyMappingListMap := make(map[int][]int)
+	for _, v := range chartVarietyMappingList {
+		if v.ChartInfoId <= 0 {
+			continue
+		}
+		varietyMappingList, ok := chartVarietyMappingListMap[v.ChartInfoId]
+		if !ok {
+			varietyMappingList = make([]int, 0)
+		}
+		chartVarietyMappingListMap[v.ChartInfoId] = append(varietyMappingList, v.ChartVarietyId)
+	}
+
+	// 处理图表
+	for _, v := range list {
+		// 获取关联的指标id
+		edbInfoList := make([]*data_manage.EdbInfo, 0)
+		edbInfoIdMap := make(map[int]int, 0)
+
+		// 找出图表关联的品种
+		varietyIdList, ok := chartVarietyMappingListMap[v.ChartInfoId]
+		if ok {
+			// 获取品种与标签的id
+			for _, varietyId := range varietyIdList {
+				// 先处理x轴
+				key := fmt.Sprint(v.ChartXTagId, "_", varietyId)
+				if tmpEdbInfoIdList, ok2 := tagVarietyEdbMap[key]; ok2 {
+					for _, edbInfoId := range tmpEdbInfoIdList {
+						if _, ok3 := edbInfoIdMap[edbInfoId]; !ok3 {
+							if edbInfo, ok4 := edbInfoMap[edbInfoId]; ok4 {
+								edbInfoList = append(edbInfoList, edbInfo)
+							}
+							edbInfoIdMap[edbInfoId] = edbInfoId
+						}
+					}
+				}
+
+				// 处理y轴
+				key = fmt.Sprint(v.ChartYTagId, "_", varietyId)
+				if tmpEdbInfoIdList, ok2 := tagVarietyEdbMap[key]; ok2 {
+					for _, edbInfoId := range tmpEdbInfoIdList {
+						if _, ok3 := edbInfoIdMap[edbInfoId]; !ok3 {
+							if edbInfo, ok4 := edbInfoMap[edbInfoId]; ok4 {
+								edbInfoList = append(edbInfoList, edbInfo)
+							}
+							edbInfoIdMap[edbInfoId] = edbInfoId
+						}
+					}
+				}
+			}
+		}
+
+		tmpErr := data_manage.ModifyChartEdbMapping(v.ChartInfoId, edbInfoList)
+		if tmpErr != nil {
+			errMsgList = append(errMsgList, fmt.Sprint("修改", v.ChartInfoId, "失败,err:", tmpErr))
+		}
+	}
+
 	return
 }