Эх сурвалжийг харах

优化指标搜索逻辑,支持指标分类权限控制

- 重构了获取不可见指标的逻辑,同时引入了不可见指标分类的概念
- 修改了ES搜索逻辑,支持根据不可见指标分类进行过滤
- 优化了数据库查询条件,增加了对不可见指标分类的处理- 新增了获取已加入权限控制的指标和指标分类的接口
- 调整了前端返回的不可见指标列表,增加了分类信息
Roc 5 сар өмнө
parent
commit
2d4223291c

+ 28 - 29
controllers/data_manage/edb_info.go

@@ -3463,19 +3463,12 @@ func (this *EdbInfoController) EdbInfoFilterByEs() {
 	var edbInfoList []*data_manage.EdbInfoList
 	var err error
 
-	noPermissionEdbInfoIdList := make([]int, 0) //无权限指标
-	// 获取当前账号的不可见指标
-	{
-		obj := data_manage.EdbInfoNoPermissionAdmin{}
-		confList, err := obj.GetAllListByAdminId(this.SysUser.AdminId)
-		if err != nil && !utils.IsErrNoRow(err) {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
-			return
-		}
-		for _, v := range confList {
-			noPermissionEdbInfoIdList = append(noPermissionEdbInfoIdList, v.EdbInfoId)
-		}
+	// 无权限指标 和 无权限指标分类id
+	noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, err := data_manage_permission.GetUserAllEdbAndClassifyNoPermissionList(this.SysUser.AdminId, utils.EDB_INFO_TYPE, edbType)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+		return
 	}
 
 	// 是否走ES
@@ -3489,10 +3482,10 @@ func (this *EdbInfoController) EdbInfoFilterByEs() {
 
 		// 普通的搜索
 		if !isAddPredictEdb {
-			total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, 0, frequency, noPermissionEdbInfoIdList, edbType)
+			total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, 0, frequency, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, edbType)
 		} else {
 			// 允许添加预测指标的搜索
-			total, edbInfoList, err = elastic.SearchAddPredictEdbInfoData(utils.DATA_INDEX_NAME, keyWord, noPermissionEdbInfoIdList, startSize, pageSize, edbType)
+			total, edbInfoList, err = elastic.SearchAddPredictEdbInfoData(utils.DATA_INDEX_NAME, keyWord, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, startSize, pageSize, edbType)
 		}
 		isEs = true
 	} else {
@@ -3508,6 +3501,12 @@ func (this *EdbInfoController) EdbInfoFilterByEs() {
 			condition += ` AND edb_info_id  not in (` + utils.GetOrmInReplace(lenNoPermissionEdbInfoIdList) + `) `
 			pars = append(pars, noPermissionEdbInfoIdList)
 		}
+		// 无权限指标分类id
+		lenNoPermissionEdbClassifyIdList := len(noPermissionEdbClassifyIdList)
+		if lenNoPermissionEdbClassifyIdList > 0 {
+			condition += ` AND classify_id  not in (` + utils.GetOrmInReplace(lenNoPermissionEdbClassifyIdList) + `) `
+			pars = append(pars, noPermissionEdbClassifyIdList)
+		}
 
 		switch filterSource {
 		case 2:
@@ -4864,19 +4863,12 @@ func (this *EdbInfoController) AllEdbInfoByEs() {
 	var edbInfoList []*data_manage.EdbInfoList
 	var err error
 
-	noPermissionEdbInfoIdList := make([]int, 0) //无权限指标
-	// 获取当前账号的不可见指标
-	{
-		obj := data_manage.EdbInfoNoPermissionAdmin{}
-		confList, err := obj.GetAllListByAdminId(this.SysUser.AdminId)
-		if err != nil && !utils.IsErrNoRow(err) {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
-			return
-		}
-		for _, v := range confList {
-			noPermissionEdbInfoIdList = append(noPermissionEdbInfoIdList, v.EdbInfoId)
-		}
+	// 无权限指标 和 无权限指标分类id
+	noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, err := data_manage_permission.GetUserAllEdbAndClassifyNoPermissionList(this.SysUser.AdminId, utils.EDB_INFO_TYPE, edbType)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+		return
 	}
 
 	// 是否走ES
@@ -4889,7 +4881,7 @@ func (this *EdbInfoController) AllEdbInfoByEs() {
 		keyWordArr = append(keyWordArr, newKeyWord...)
 
 		// 普通的搜索
-		total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, -1, frequency, noPermissionEdbInfoIdList, edbType)
+		total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, -1, frequency, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, edbType)
 		isEs = true
 	} else {
 		var condition string
@@ -4905,6 +4897,13 @@ func (this *EdbInfoController) AllEdbInfoByEs() {
 			pars = append(pars, noPermissionEdbInfoIdList)
 		}
 
+		// 无权限指标分类id
+		lenNoPermissionEdbClassifyIdList := len(noPermissionEdbClassifyIdList)
+		if lenNoPermissionEdbClassifyIdList > 0 {
+			condition += ` AND classify_id  not in (` + utils.GetOrmInReplace(lenNoPermissionEdbClassifyIdList) + `) `
+			pars = append(pars, noPermissionEdbClassifyIdList)
+		}
+
 		switch filterSource {
 		case 2:
 			condition += ` AND frequency='月度' `

+ 13 - 14
controllers/data_manage/predict_edb_info.go

@@ -1166,19 +1166,12 @@ func (this *PredictEdbInfoController) FilterByEs() {
 	var edbInfoList []*data_manage.EdbInfoList
 	var err error
 
-	noPermissionEdbInfoIdList := make([]int, 0) //无权限指标
-	// 获取当前账号的不可见指标
-	{
-		obj := data_manage.EdbInfoNoPermissionAdmin{}
-		confList, err := obj.GetAllListByAdminId(this.SysUser.AdminId)
-		if err != nil && !utils.IsErrNoRow(err) {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
-			return
-		}
-		for _, v := range confList {
-			noPermissionEdbInfoIdList = append(noPermissionEdbInfoIdList, v.EdbInfoId)
-		}
+	// 无权限指标 和 无权限指标分类id
+	noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, err := data_manage_permission.GetUserAllEdbAndClassifyNoPermissionList(this.SysUser.AdminId, utils.PREDICT_EDB_INFO_TYPE, 0)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+		return
 	}
 
 	// 是否走ES
@@ -1192,7 +1185,7 @@ func (this *PredictEdbInfoController) FilterByEs() {
 		if isOnlyMe {
 			total, edbInfoList, err = elastic.SearchEdbInfoDataByAdminId(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, 1, frequency, this.SysUser.AdminId)
 		} else {
-			total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, 1, frequency, noPermissionEdbInfoIdList, 0)
+			total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, 1, frequency, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, 0)
 		}
 		isEs = true
 	} else {
@@ -1207,6 +1200,12 @@ func (this *PredictEdbInfoController) FilterByEs() {
 			condition += ` AND edb_info_id  not in (` + utils.GetOrmInReplace(lenNoPermissionEdbInfoIdList) + `) `
 			pars = append(pars, noPermissionEdbInfoIdList)
 		}
+		// 无权限指标分类id
+		lenNoPermissionEdbClassifyIdList := len(noPermissionEdbClassifyIdList)
+		if lenNoPermissionEdbClassifyIdList > 0 {
+			condition += ` AND classify_id  not in (` + utils.GetOrmInReplace(lenNoPermissionEdbClassifyIdList) + `) `
+			pars = append(pars, noPermissionEdbClassifyIdList)
+		}
 
 		switch filterSource {
 		case 2:

+ 17 - 0
models/data_manage/edb_classify.go

@@ -734,3 +734,20 @@ func GetChildEdbClassifyByClassifyType(classifyType int) (items []*EdbClassifyIt
 	err = o.Raw(sql, classifyType).Find(&items).Error
 	return
 }
+
+// GetIsJoinPermissionEdbClassifyIdList
+// @Description: 获取已经加入指标管控的指标分类id列表
+// @param classifyType
+// @return list
+// @return err
+func GetIsJoinPermissionEdbClassifyIdList(classifyType int) (list []int, err error) {
+	pars := make([]interface{}, 0)
+	sql := ` SELECT classify_id FROM edb_classify WHERE 1=1  AND is_join_permission = 1 `
+	if classifyType >= 0 {
+		sql += ` AND classify_type = ? `
+		pars = append(pars, classifyType)
+	}
+	err = global.DmSQL["data"].Raw(sql, pars...).Scan(&list).Error
+
+	return
+}

+ 23 - 0
models/data_manage/edb_info.go

@@ -2028,3 +2028,26 @@ func GetEdbInfoByTypes(edbInfoType, edbType int) (items []*EdbClassifyItems, err
 	err = o.Raw(sql, edbInfoType, edbType).Scan(&items).Error
 	return
 }
+
+// GetIsJoinPermissionEdbInfoIdList
+// @Description: 获取已经加入指标管控的指标id列表
+// @param edbInfoType
+// @param edbType
+// @return list
+// @return err
+func GetIsJoinPermissionEdbInfoIdList(edbInfoType, edbType int) (list []int, err error) {
+	pars := make([]interface{}, 0)
+	sql := ` SELECT edb_info_id FROM edb_info WHERE 1=1  AND is_join_permission = 1 `
+	if edbInfoType >= 0 {
+		sql += ` AND edb_info_type = ? `
+		pars = append(pars, edbInfoType)
+	}
+	if edbInfoType > 0 {
+		sql += ` AND edb_type = ? `
+		pars = append(pars, edbType)
+	}
+	sql += ` ORDER BY create_time DESC `
+	err = global.DmSQL["data"].Raw(sql, pars...).Scan(&list).Error
+
+	return
+}

+ 72 - 0
services/data/data_manage_permission/edb.go

@@ -159,3 +159,75 @@ func CheckEdbPermission(edbIsJoinPermission, edbClassifyIsJoinPermission, userId
 
 	return
 }
+
+// GetUserAllEdbAndClassifyNoPermissionList
+// @Description: 根据用户获取已经未授权的指标ID列表和指标分类ID列表
+// @param userId
+// @param edbInfoType
+// @param edbType
+// @return edbIdList
+// @return classifyIdList
+// @return err
+func GetUserAllEdbAndClassifyNoPermissionList(userId, edbInfoType, edbType int) (edbIdList, classifyIdList []int, err error) {
+	edbIdList = make([]int, 0)
+	classifyIdList = make([]int, 0)
+
+	// 获取所有无权限指标id列表
+	{
+		isJoinPermissionEdbIdList, tmpErr := data_manage.GetIsJoinPermissionEdbInfoIdList(edbInfoType, edbType)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		// 获取有权限的指标ID列表
+		hasPermissionEdbIdList, tmpErr := data_manage_permission.GetPermissionEdbIdList(userId, 0)
+		if tmpErr != nil {
+			err = tmpErr
+			fmt.Println("获取授权指标列表失败, err:", tmpErr)
+			return
+		}
+		for _, edbId := range isJoinPermissionEdbIdList {
+			if !utils.InArrayByInt(hasPermissionEdbIdList, edbId) {
+				edbIdList = append(edbIdList, edbId)
+			}
+		}
+	}
+
+	// 获取所有无权限指标分类id列表
+	{
+		classifyType := -1
+		if edbInfoType == utils.EDB_INFO_TYPE {
+			// 普通指标
+			if edbType == utils.EdbTypeBase {
+				classifyType = 0
+			} else if edbType == utils.EdbTypeCalculate {
+				classifyType = 2
+			}
+		} else if edbInfoType == utils.PREDICT_EDB_INFO_TYPE {
+			// 预测指标
+			classifyType = 1
+		}
+
+		isJoinPermissionEdbClassifyIdList, tmpErr := data_manage.GetIsJoinPermissionEdbClassifyIdList(classifyType)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		// 获取有权限的指标分类ID列表
+		hasPermissionClassifyIdList, tmpErr := data_manage_permission.GetPermissionEdbClassifyIdList(userId, 0)
+		if tmpErr != nil {
+			err = tmpErr
+			fmt.Println("获取授权指标分类列表失败, err:", err)
+			return
+		}
+		for _, classifyId := range isJoinPermissionEdbClassifyIdList {
+			if !utils.InArrayByInt(hasPermissionClassifyIdList, classifyId) {
+				classifyIdList = append(classifyIdList, classifyId)
+			}
+		}
+	}
+
+	return
+}

+ 23 - 2
services/elastic/elastic.go

@@ -87,7 +87,7 @@ func EsAddOrEditEdbInfoData(indexName, docId string, item *data_manage.EdbInfoLi
 }
 
 // SearchEdbInfoData 查询es中的指标数据
-func SearchEdbInfoData(indexName, keywordStr string, from, size, filterSource, source int, edbInfoType int8, frequency string, noPermissionEdbInfoIdList []int, edbType int) (total int64, list []*data_manage.EdbInfoList, err error) {
+func SearchEdbInfoData(indexName, keywordStr string, from, size, filterSource, source int, edbInfoType int8, frequency string, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList []int, edbType int) (total int64, list []*data_manage.EdbInfoList, err error) {
 	list = make([]*data_manage.EdbInfoList, 0)
 	defer func() {
 		if err != nil {
@@ -248,6 +248,16 @@ func SearchEdbInfoData(indexName, keywordStr string, from, size, filterSource, s
 		})
 	}
 
+	// noPermissionEdbInfoIdList 无权限指标id
+	if len(noPermissionEdbClassifyIdList) > 0 {
+		mustNotMap = append(mustNotMap, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"ClassifyId": noPermissionEdbClassifyIdList,
+				//"Frequency.keyword": "月度",
+			},
+		})
+	}
+
 	// 指标类型:普通指标、预测指标(小于0 代表不区分指标是普通还是预测)
 	if edbInfoType >= 0 {
 		mustMap = append(mustMap, map[string]interface{}{
@@ -635,7 +645,7 @@ func SearchEdbInfoDataBak(indexName, keywordStr string, from, size, filterSource
 }
 
 // SearchAddPredictEdbInfoData 查询允许添加预测指标的数据
-func SearchAddPredictEdbInfoData(indexName, keywordStr string, noPermissionEdbInfoIdList []int, from, size, edbType int) (total int64, list []*data_manage.EdbInfoList, err error) {
+func SearchAddPredictEdbInfoData(indexName, keywordStr string, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList []int, from, size, edbType int) (total int64, list []*data_manage.EdbInfoList, err error) {
 	list = make([]*data_manage.EdbInfoList, 0)
 	defer func() {
 		if err != nil {
@@ -743,6 +753,17 @@ func SearchAddPredictEdbInfoData(indexName, keywordStr string, noPermissionEdbIn
 			},
 		})
 	}
+
+	// noPermissionEdbClassifyIdList 无权限指标分类id
+	if len(noPermissionEdbClassifyIdList) > 0 {
+		mustNotMap = append(mustNotMap, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"ClassifyId": noPermissionEdbClassifyIdList,
+				//"Frequency.keyword": "月度",
+			},
+		})
+	}
+
 	return searchEdbInfoData(indexName, mustMap, mustNotMap, shouldMap, from, size)
 }