Browse Source

禁用一个基础指标时,需要禁用相关的所有计算指标

xyxie 9 months ago
parent
commit
46751f2a51

+ 19 - 54
controllers/data_manage/edb_info_refresh.go

@@ -527,7 +527,7 @@ func (c *EdbInfoController) SaveEdbRefreshStatus() {
 	//查询计算指标信息
 	calculateEdbIdList := make([]int, 0)
 	if isStop == 1 {
-		edbInfoList := make([]*data_manage.EdbInfo, 0)
+		fromEdbIdList := make([]int, 0)
 		edbList, e := data_manage.GetEdbInfoByIdList(edbIdList)
 		if e != nil && e.Error() != utils.ErrNoRow() {
 			br.Msg = "获取失败"
@@ -535,29 +535,18 @@ func (c *EdbInfoController) SaveEdbRefreshStatus() {
 			return
 		}
 		for _, v := range edbList {
-			if v.EdbInfoType == 0 && v.EdbType == 2 {
-				edbInfoList = append(edbInfoList, v)
+			if v.EdbInfoType == 0 && v.EdbType == 1 {
+				fromEdbIdList = append(fromEdbIdList, v.EdbInfoId)
 			}
 		}
 
-		calculateEdbMappingListMap, calculateEdbMappingIdsMap, e := data.GetEdbListByEdbInfoId(edbInfoList)
-		if e != nil {
+		hasFind := make(map[int]struct{})
+		calculateEdbIdList, err = data.GetCalculateEdbByFromEdbInfo(fromEdbIdList, calculateEdbIdList, hasFind)
+		if err != nil {
 			br.Msg = "查询计算指标信息失败"
-			br.ErrMsg = "查询计算指标信息失败, Err" + e.Error()
+			br.ErrMsg = "查询计算指标信息失败,Err:" + err.Error()
 			return
 		}
-		for _, v := range edbInfoList {
-			childEdbMappingIds, ok := calculateEdbMappingIdsMap[v.EdbInfoId]
-			if ok {
-				for _, childEdbMappingId := range childEdbMappingIds {
-					childEdbMapping, ok2 := calculateEdbMappingListMap[childEdbMappingId]
-					if !ok2 {
-						continue
-					}
-					calculateEdbIdList = append(calculateEdbIdList, childEdbMapping.EdbInfoId)
-				}
-			}
-		}
 	}
 
 	switch req.Source {
@@ -627,25 +616,13 @@ func (c *EdbInfoController) SaveEdbRefreshStatusSingle() {
 	}
 
 	if isStop == 1 && edbInfo.EdbInfoType == 0 && edbInfo.EdbType == 1 { //基础指标, 只有在停用的情况下才需要查询计算指标
-		// 查询相关的计算指标
-		// 查询间接引用的指标信息
-		edbInfoList := make([]*data_manage.EdbInfo, 0)
-		edbInfoList = append(edbInfoList, edbInfo)
-		calculateEdbMappingListMap, calculateEdbMappingIdsMap, e := data.GetEdbListByEdbInfoId(edbInfoList)
-		if e != nil {
-			err = fmt.Errorf("查询计算指标信息失败,%s", e.Error())
+		hasFind := make(map[int]struct{})
+		calculateEdbIdList, err = data.GetCalculateEdbByFromEdbInfo([]int{edbInfo.EdbInfoId}, calculateEdbIdList, hasFind)
+		if err != nil {
+			br.Msg = "查询计算指标信息失败"
+			br.ErrMsg = "查询计算指标信息失败,Err:" + err.Error()
 			return
 		}
-		childEdbMappingIds, ok := calculateEdbMappingIdsMap[edbInfo.EdbInfoId]
-		if ok {
-			for _, childEdbMappingId := range childEdbMappingIds {
-				childEdbMapping, ok2 := calculateEdbMappingListMap[childEdbMappingId]
-				if !ok2 {
-					continue
-				}
-				calculateEdbIdList = append(calculateEdbIdList, childEdbMapping.EdbInfoId)
-			}
-		}
 	}
 
 	switch edbInfo.Source {
@@ -706,7 +683,6 @@ func (c *EdbInfoController) SaveRelationEdbRefreshStatus() {
 	// todo 批量设置刷新状态修改
 	edbIdList := make([]int, 0)
 	edbCodeList := make([]string, 0)
-	edbInfoList := make([]*data_manage.EdbInfo, 0)
 	// 指标id列表
 	if req.IsSelectAll {
 		// 如果是列表全选
@@ -749,12 +725,13 @@ func (c *EdbInfoController) SaveRelationEdbRefreshStatus() {
 		br.ErrMsg = "获取数据失败,Err:" + e.Error()
 		return
 	}
+	fromEdbIdList := make([]int, 0)
 	for _, v := range edbList {
 		if req.Source == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
 			edbCodeList = append(edbCodeList, v.EdbCode)
 		}
-		if v.EdbInfoType == 0 && v.EdbType == 2 {
-			edbInfoList = append(edbInfoList, v)
+		if v.EdbInfoType == 0 && v.EdbType == 1 {
+			fromEdbIdList = append(fromEdbIdList, v.EdbInfoId)
 		}
 	}
 
@@ -767,24 +744,13 @@ func (c *EdbInfoController) SaveRelationEdbRefreshStatus() {
 	// 查询相关的计算指标
 	calculateEdbIdList := make([]int, 0)
 	if isStop == 1 {
-		calculateEdbMappingListMap, calculateEdbMappingIdsMap, e := data.GetEdbListByEdbInfoId(edbInfoList)
-		if e != nil {
+		hasFind := make(map[int]struct{})
+		calculateEdbIdList, err = data.GetCalculateEdbByFromEdbInfo(fromEdbIdList, calculateEdbIdList, hasFind)
+		if err != nil {
 			br.Msg = "查询计算指标信息失败"
-			br.ErrMsg = "查询计算指标信息失败, Err" + e.Error()
+			br.ErrMsg = "查询计算指标信息失败,Err:" + err.Error()
 			return
 		}
-		for _, v := range edbInfoList {
-			childEdbMappingIds, ok := calculateEdbMappingIdsMap[v.EdbInfoId]
-			if ok {
-				for _, childEdbMappingId := range childEdbMappingIds {
-					childEdbMapping, ok2 := calculateEdbMappingListMap[childEdbMappingId]
-					if !ok2 {
-						continue
-					}
-					calculateEdbIdList = append(calculateEdbIdList, childEdbMapping.EdbInfoId)
-				}
-			}
-		}
 	}
 
 	switch req.Source {
@@ -792,7 +758,6 @@ func (c *EdbInfoController) SaveRelationEdbRefreshStatus() {
 		err = data_manage.ModifyMysteelChemicalUpdateStatusByEdbInfoIds(edbIdList, isStop, edbCodeList, calculateEdbIdList)
 	default:
 		err = data_manage.EdbInfoUpdateStatusByEdbInfoId(edbIdList, isStop, calculateEdbIdList)
-		return
 	}
 	if err != nil {
 		br.Msg = `保存失败`

+ 11 - 0
models/data_manage/chart_edb_mapping.go

@@ -326,3 +326,14 @@ func ModifyChartEdbMapping(chartInfoId int, edbInfoList []*EdbInfo) (err error)
 
 	return
 }
+
+func GetRelationEdbInfoListMappingByCondition(condition string, pars []interface{}) (item []*ChartEdbInfoMapping, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT a.* FROM edb_info AS a 
+	JOIN edb_info_calculate_mapping AS b on a.edb_info_id = b.edb_info_id WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}

+ 49 - 0
services/data/edb_info_relation.go

@@ -418,6 +418,7 @@ func GetEdbRelationList(source, edbInfoType int, classifyId, sysUserId, frequenc
 	return
 }
 
+// 查找当前计算指标的所有溯源指标
 func GetEdbListByEdbInfoId(edbInfoList []*data_manage.EdbInfo) (edbMappingListMap map[int]*data_manage.EdbInfoCalculateMapping, edbInfoMappingRootIdsMap map[int][]int, err error) {
 	if len(edbInfoList) == 0 {
 		return
@@ -621,3 +622,51 @@ func SaveExcelEdbInfoRelation(excelInfoId, source int, addChildExcel bool) (err
 	err = saveEdbInfoRelation(edbInfoIds, excelInfoId, utils.EDB_RELATION_TABLE, source)
 	return
 }
+
+// GetCalculateEdbByFromEdbInfo 找到依赖于该基础指标的所有计算指标
+func GetCalculateEdbByFromEdbInfo(edbInfoIds []int, calculateEdbIds []int, hasFind map[int]struct{}) (newCalculateEdbIds []int, err error) {
+	if len(edbInfoIds) == 0 {
+		return
+	}
+	newCalculateEdbIds = calculateEdbIds
+	newEdbInfoIds := make([]int, 0)
+	for _, v := range edbInfoIds {
+		if _, ok := hasFind[v]; ok {
+			continue
+		}
+		newEdbInfoIds = append(newEdbInfoIds, v)
+	}
+	if len(newEdbInfoIds) == 0 {
+		return
+	}
+	var condition string
+	var pars []interface{}
+	// 关联指标
+	condition += ` AND b.from_edb_info_id in (` + utils.GetOrmInReplace(len(newEdbInfoIds)) + `)`
+	pars = append(pars, newEdbInfoIds)
+
+	//获取关联图表列表
+	list, err := data_manage.GetRelationEdbInfoListMappingByCondition(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		err = fmt.Errorf("获取关联指标信息失败,Err:%s", err.Error())
+		return
+	}
+	calculateEdbIdsTmp := make([]int, 0)
+	for _, mapping := range list {
+		if mapping.EdbType == 2 && mapping.EdbInfoType == 0 { // 如果指标库里的计算指标,则加入,否则继续找
+			newCalculateEdbIds = append(newCalculateEdbIds, mapping.EdbInfoId)
+			calculateEdbIdsTmp = append(calculateEdbIdsTmp, mapping.EdbInfoId)
+		}
+	}
+	for _, v := range newEdbInfoIds {
+		hasFind[v] = struct{}{}
+	}
+	if len(calculateEdbIdsTmp) > 0 {
+		newCalculateEdbIds, err = GetCalculateEdbByFromEdbInfo(calculateEdbIdsTmp, newCalculateEdbIds, hasFind)
+		if err != nil {
+			return
+		}
+	}
+
+	return
+}