Browse Source

优化查询间接引用的情况,防止死循环

xyxie 8 months ago
parent
commit
cb89452677

+ 11 - 0
models/data_manage/edb_info_calculate_mapping.go

@@ -1,6 +1,7 @@
 package data_manage
 
 import (
+	"eta/eta_api/utils"
 	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
@@ -101,3 +102,13 @@ func GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId int) (items []*EdbInfoC
 	_, err = o.Raw(sql, edbInfoId).QueryRows(&items)
 	return
 }
+
+// GetEdbInfoCalculateMappingListByEdbInfoIds 根据生成的指标id获取来源的指标id列表
+func GetEdbInfoCalculateMappingListByEdbInfoIds(edbInfoIds []int) (items []*EdbInfoCalculateMappingInfo, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT a.*,b.edb_type as from_edb_type,b.edb_info_type as from_edb_info_type, b.unique_code AS from_unique_code, b.classify_id AS from_classify_id,b.no_update FROM edb_info_calculate_mapping AS a
+			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
+			WHERE a.edb_info_id in (` + utils.GetOrmInReplace(len(edbInfoIds)) + `) `
+	_, err = o.Raw(sql, edbInfoIds).QueryRows(&items)
+	return
+}

+ 1 - 1
models/data_manage/edb_info_relation.go

@@ -21,7 +21,7 @@ type EdbInfoRelation struct {
 	RelationTime       time.Time `description:"引用时间"`
 	RelationType       int       `description:"引用类型,0:直接饮用,1间接引用"`
 	RootEdbInfoId      int       `description:"间接引用时,关联的直接引用的指标ID"`
-	ChildEdbInfoId     int       `description:"间接引用时,计算指标直接关联的指标ID"`
+	ChildEdbInfoId     int       `description:"间接引用时,关联的计算指标ID"`
 }
 
 func (e *EdbInfoRelation) TableName() string {

+ 40 - 14
services/data/edb_info_relation.go

@@ -285,7 +285,7 @@ func SaveCalendarEdbInfoRelation(chartPermissionId int, matterDate string, editM
 				ModifyTime:         nowTime,
 			}
 			addList = append(addList, tmp)
-			//todo 添加指标间接引用
+			//添加指标间接引用
 			if edbInfo.EdbType == 2 {
 				childEdbMappingIds, ok1 := calculateEdbMappingIdsMap[edbInfo.EdbInfoId]
 				if !ok1 {
@@ -407,7 +407,31 @@ func GetEdbRelationList(source int, classifyId, sysUserId, frequency, keyword, s
 }
 
 func GetEdbListByEdbInfoId(edbInfoList []*data_manage.EdbInfo) (edbInfoMap map[int]*data_manage.EdbInfo, edbMappingListMap map[int]*data_manage.EdbInfoCalculateMapping, edbInfoMappingRootIdsMap map[int][]int, err error) {
+	if len(edbInfoList) == 0 {
+		return
+	}
+	edbInfoIds := make([]int, 0)
+	for _, v := range edbInfoList {
+		if v.EdbType == 2 {
+			edbInfoIds = append(edbInfoIds, v.EdbInfoId)
+		}
+	}
+	if len(edbInfoIds) == 0 {
+		return
+	}
 	//查询指标信息
+	allEdbMappingMap := make(map[int][]*data_manage.EdbInfoCalculateMappingInfo, 0)
+	allMappingList, e := data_manage.GetEdbInfoCalculateMappingListByEdbInfoIds(edbInfoIds)
+	if e != nil {
+		err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoIds err: %s", e.Error())
+		return
+	}
+	for _, v := range allMappingList {
+		if _, ok := allEdbMappingMap[v.EdbInfoId]; !ok {
+			allEdbMappingMap[v.EdbInfoId] = make([]*data_manage.EdbInfoCalculateMappingInfo, 0)
+		}
+		allEdbMappingMap[v.EdbInfoId] = append(allEdbMappingMap[v.EdbInfoId], v)
+	}
 	//查询指标映射
 	//查询所有指标数据
 	//查询这个指标相关的mapping信息放到数组里,
@@ -420,7 +444,7 @@ func GetEdbListByEdbInfoId(edbInfoList []*data_manage.EdbInfo) (edbInfoMap map[i
 	for _, edbInfo := range edbInfoList {
 		if edbInfo.EdbType == 2 {
 			edbInfoId := edbInfo.EdbInfoId
-			edbMappingList, err = GetCalculateEdbInfoByEdbInfoId(edbInfoId, hasFindMap, edbInfoIdMap, edbMappingList, edbMappingMap, edbInfoMappingRootIdsMap, edbInfoId)
+			edbMappingList, err = getCalculateEdbInfoByEdbInfoId(allEdbMappingMap, edbInfoId, hasFindMap, edbInfoIdMap, edbMappingList, edbMappingMap, edbInfoMappingRootIdsMap, edbInfoId)
 			if err != nil {
 				err = fmt.Errorf(" GetCalculateEdbInfoByEdbInfoId err: %s", err.Error())
 				return
@@ -457,8 +481,8 @@ func GetEdbListByEdbInfoId(edbInfoList []*data_manage.EdbInfo) (edbInfoMap map[i
 	return
 }
 
-// GetCalculateEdbInfoByEdbInfoId 计算指标追溯
-func GetCalculateEdbInfoByEdbInfoId(edbInfoId int, hasFindMap map[int]struct{}, edbInfoIdMap map[int]struct{}, edbMappingList []*data_manage.EdbInfoCalculateMapping, edbMappingMap map[int]struct{}, edbInfoMappingRootIdsMap map[int][]int, rootEdbInfoId int) (newEdbMappingList []*data_manage.EdbInfoCalculateMapping, err error) {
+// getCalculateEdbInfoByEdbInfoId 计算指标追溯
+func getCalculateEdbInfoByEdbInfoId(allEdbMappingMap map[int][]*data_manage.EdbInfoCalculateMappingInfo, edbInfoId int, hasFindMap map[int]struct{}, edbInfoIdMap map[int]struct{}, edbMappingList []*data_manage.EdbInfoCalculateMapping, edbMappingMap map[int]struct{}, edbInfoMappingRootIdsMap map[int][]int, rootEdbInfoId int) (newEdbMappingList []*data_manage.EdbInfoCalculateMapping, err error) {
 	newEdbMappingList = edbMappingList
 	_, ok := hasFindMap[edbInfoId]
 	if ok {
@@ -468,13 +492,16 @@ func GetCalculateEdbInfoByEdbInfoId(edbInfoId int, hasFindMap map[int]struct{},
 	if _, ok1 := edbInfoIdMap[edbInfoId]; !ok1 {
 		edbInfoIdMap[edbInfoId] = struct{}{}
 	}
-
-	edbInfoMappingList, e := data_manage.GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId)
-	if e != nil {
-		err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoId err: %s", e.Error())
-		return
+	edbInfoMappingList := make([]*data_manage.EdbInfoCalculateMappingInfo, 0)
+	edbInfoMappingList, ok = allEdbMappingMap[edbInfoId]
+	if !ok {
+		edbInfoMappingList, err = data_manage.GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId)
+		if err != nil {
+			err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoId err: %s", err.Error())
+			return
+		}
 	}
-
+	hasFindMap[edbInfoId] = struct{}{}
 	if len(edbInfoMappingList) > 0 {
 		fromEdbInfoIdList := make([]int, 0)
 		edbInfoMappingIdList := make([]int, 0)
@@ -509,9 +536,9 @@ func GetCalculateEdbInfoByEdbInfoId(edbInfoId int, hasFindMap map[int]struct{},
 			if edbInfoId != v.FromEdbInfoId && (v.FromEdbType == 2 || v.FromEdbInfoType == 1) {
 				// 查过了就不查了
 				if _, ok2 := hasFindMap[v.FromEdbInfoId]; !ok2 {
-					newEdbMappingList, e = GetCalculateEdbInfoByEdbInfoId(v.FromEdbInfoId, hasFindMap, edbInfoIdMap, newEdbMappingList, edbMappingMap, edbInfoMappingRootIdsMap, rootEdbInfoId)
-					if e != nil {
-						err = fmt.Errorf("traceEdbInfoByEdbInfoId err: %s", e.Error())
+					newEdbMappingList, err = getCalculateEdbInfoByEdbInfoId(allEdbMappingMap, v.FromEdbInfoId, hasFindMap, edbInfoIdMap, newEdbMappingList, edbMappingMap, edbInfoMappingRootIdsMap, rootEdbInfoId)
+					if err != nil {
+						err = fmt.Errorf("traceEdbInfoByEdbInfoId err: %s", err.Error())
 						return
 					}
 				}
@@ -521,7 +548,6 @@ func GetCalculateEdbInfoByEdbInfoId(edbInfoId int, hasFindMap map[int]struct{},
 		edbInfoMappingRootIdsMap[rootEdbInfoId] = append(edbInfoMappingRootIdsMap[rootEdbInfoId], edbInfoMappingIdList...)
 	}
 
-	hasFindMap[edbInfoId] = struct{}{}
 	return
 }