Explorar o código

循环引用,不允许指标替换

xyxie hai 6 meses
pai
achega
db2ef5d4eb

+ 36 - 0
controllers/data_manage/edb_info.go

@@ -3996,6 +3996,42 @@ func (this *ChartInfoController) EdbInfoReplace() {
 		return
 	}
 
+	if oldEdbInfo.EdbInfoType == 1 || newEdbInfo.EdbInfoType == 1 {
+		br.Msg = "预测指标不允许替换"
+		br.ErrMsg = "预测指标不允许替换"
+		return
+	}
+	// 判断指标是否循环引用
+	if oldEdbInfo.EdbType == 2 {
+		// 查询该计算指标的所有相关指标,如果相关指标中包含新指标,则提示
+		hasRelation, e := data.CheckTwoEdbInfoRelation(oldEdbInfo, newEdbInfo)
+		if e != nil {
+			br.Msg = "替换失败!"
+			br.ErrMsg = "查询指标引用关系失败,Err:" + e.Error()
+			return
+		}
+		if hasRelation {
+			br.Msg = "原指标与替换指标存在引用关系,不允许替换"
+			br.ErrMsg = "原指标与替换指标存在引用关系,不允许替换"
+			return
+		}
+	}
+
+	if newEdbInfo.EdbType == 2 {
+		// 查询该计算指标的所有相关指标,如果相关指标中包含新指标,则提示
+		hasRelation, e := data.CheckTwoEdbInfoRelation(newEdbInfo, oldEdbInfo)
+		if e != nil {
+			br.Msg = "替换失败!"
+			br.ErrMsg = "查询指标引用关系失败,Err:" + e.Error()
+			return
+		}
+		if hasRelation {
+			br.Msg = "原指标与替换指标存在引用关系,不允许替换"
+			br.ErrMsg = "原指标与替换指标存在引用关系,不允许替换"
+			return
+		}
+	}
+
 	sysAdminId := sysUser.AdminId
 	//replaceChartTotal, replaceCalculateTotal, err := data.EdbInfoReplace(oldEdbInfo, newEdbInfo, sysAdminId, sysUser.RealName)
 	_, _, err = data.EdbInfoReplace(oldEdbInfo, newEdbInfo, sysAdminId, sysUser.RealName)

+ 48 - 0
services/data/edb_info_relation.go

@@ -678,3 +678,51 @@ func GetCalculateEdbByFromEdbInfo(edbInfoIds []int, calculateEdbIds []int, hasFi
 
 	return
 }
+
+// 查询两个指标是否存在循环引用关系
+func CheckTwoEdbInfoRelation(edbInfoA, edbInfoB *data_manage.EdbInfo) (hasRelation bool, err error) {
+	edbInfoIds := make([]int, 0)
+	edbInfoIds = append(edbInfoIds, edbInfoA.EdbInfoId)
+	//查询指标信息
+	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 v.EdbInfoId == edbInfoB.EdbInfoId {
+			hasRelation = true
+			return
+		}
+		if _, ok := allEdbMappingMap[v.EdbInfoId]; !ok {
+			allEdbMappingMap[v.EdbInfoId] = make([]*data_manage.EdbInfoCalculateMappingInfo, 0)
+		}
+		allEdbMappingMap[v.EdbInfoId] = append(allEdbMappingMap[v.EdbInfoId], v)
+	}
+	//查询指标映射
+	//查询所有指标数据
+	//查询这个指标相关的mapping信息放到数组里,
+	//将得到的指标ID信息放到数组里
+	hasFindMap := make(map[int]struct{})
+	edbInfoIdMap := make(map[int]struct{})
+	edbMappingList := make([]*data_manage.EdbInfoCalculateMapping, 0)
+	edbInfoMappingRootIdsMap := make(map[int][]int, 0)
+	edbMappingMap := make(map[int]struct{})
+
+	if edbInfoA.EdbType == 2 {
+		edbInfoId := edbInfoA.EdbInfoId
+		edbMappingList, err = getCalculateEdbInfoByEdbInfoId(allEdbMappingMap, edbInfoId, hasFindMap, edbInfoIdMap, edbMappingList, edbMappingMap, edbInfoMappingRootIdsMap, edbInfoId)
+		if err != nil {
+			err = fmt.Errorf(" GetCalculateEdbInfoByEdbInfoId err: %s", err.Error())
+			return
+		}
+		// 判断其中是否包含指标B
+		if _, ok := edbInfoIdMap[edbInfoB.EdbInfoId]; ok { // 如果包含,则说明存在循环引用关系
+			hasRelation = true
+			return
+		}
+	}
+
+	return
+}

+ 2 - 1
static/ErrMsgConfig.json

@@ -58,5 +58,6 @@
   "当前指标已添加到跨品种分析,不可删除": "The current metric has been added to cross-commodity analysis and cannot be deleted.",
   "指标已删除,请刷新页面": "Metric deleted, please refresh the page.",
   "删除失败": "Deletion failed.",
-  "指标数据异常,请检查": "The metric data is abnormal, please check."
+  "指标数据异常,请检查": "The metric data is abnormal, please check.",
+  "原指标与替换指标存在引用关系,不允许替换": "Original indicators and replacement indicators have a referencing relationship, which is not allowed to be replaced."
 }