Bläddra i källkod

fix:图表收藏

Roc 2 månader sedan
förälder
incheckning
e8731cd807

+ 31 - 0
cache/data_collect_handler.go

@@ -0,0 +1,31 @@
+package cache
+
+import (
+	"eta_gn/eta_api/models/data_manage"
+	"eta_gn/eta_api/utils"
+	"fmt"
+)
+
+// AddDataCollectHandler
+// @Description: 将需要重新处理收藏的资产的指标加入缓存
+// @author: Roc
+// @datetime 2024-12-27 16:55:09
+// @param dataId int 资产(指标、图表)ID
+// @param dataType int 资产类型:1-指标;2-图表
+// @return bool
+func AddDataCollectHandler(dataId, dataType int) bool {
+	record := data_manage.DataCollectHandleItem{
+		DataId:   dataId,
+		DataType: dataType,
+	}
+	if utils.Re == nil {
+		err := utils.Rc.LPush(utils.CACHE_KEY_DATA_COLLECT_HANDLER, record)
+
+		utils.FileLog.Info(fmt.Sprintf("将需要重新处理收藏的资产的指标加入缓存 AddDataCollectHandler LPush: 资产(指标、图表)ID:%d,资产类型:%d", dataId, dataType))
+		if err != nil {
+			fmt.Println("AddDataCollectHandler LPush Err:" + err.Error())
+		}
+		return true
+	}
+	return false
+}

+ 165 - 17
controllers/data_manage/chart_info_share.go

@@ -2,6 +2,7 @@ package data_manage
 
 import (
 	"encoding/json"
+	"eta_gn/eta_api/cache"
 	"eta_gn/eta_api/controllers"
 	"eta_gn/eta_api/models"
 	"eta_gn/eta_api/models/data_manage"
@@ -128,12 +129,76 @@ func (c *ChartInfoShareController) Save() {
 	}
 	if chartItem.SysUserId != c.SysUser.AdminId {
 		br.Msg = "您没有权限设置共享"
-		br.ErrMsg = "您没有权限设置共享,EdbInfoId:" + strconv.Itoa(req.ChartInfoId)
+		br.ErrMsg = "您没有权限设置共享,ChartInfoId:" + strconv.Itoa(req.ChartInfoId)
 		br.IsSendEmail = false
 		return
 	}
 
 	obj := data_manage.ChartInfoShare{}
+
+	// 如果图表未公开,则判断是否被其他用户使用
+	if chartItem.PublicStatus != utils.DataPublicSuccess {
+		checkUserIdList := []int{sysUser.AdminId}
+		if len(req.UserIdList) > 0 {
+			checkUserIdList = append(checkUserIdList, req.UserIdList...)
+		}
+
+		{
+			userIdList, err := obj.GetAllUserIdListByChartInfoIdAndNoShareType(chartItem.ChartInfoId, req.ShareType)
+			if err != nil {
+				br.Msg = "设置失败!"
+				br.ErrMsg = "设置失败,Err:" + err.Error()
+				return
+			}
+			if len(userIdList) > 0 {
+				checkUserIdList = append(checkUserIdList, userIdList...)
+			}
+		}
+
+		// 校验是否被其他用户关联
+		noReferenced, otherUserIdList, err, tips := data.CheckChartReferencedByOthers([]int{chartItem.ChartInfoId}, []string{chartItem.UniqueCode}, checkUserIdList)
+		if err != nil {
+			br.Msg = "保存失败"
+			if tips != "" {
+				br.Msg = tips
+			}
+			br.ErrMsg = "设置图表共享失败,查找图表的关联用户失败,Err:" + err.Error()
+			return
+		}
+
+		if !noReferenced {
+			userNameStr := ``
+			if len(otherUserIdList) > 0 {
+				userNameList := make([]string, 0)
+				userList, err := system.GetAdminListByIdList(otherUserIdList)
+				if err != nil {
+					br.Msg = "保存失败"
+					if tips != "" {
+						br.Msg = tips
+					}
+					br.ErrMsg = "设置图表共享失败,查找用户信息失败,Err:" + err.Error()
+					return
+				}
+				for _, userInfo := range userList {
+					userNameList = append(userNameList, userInfo.RealName)
+				}
+				userNameStr = strings.Join(userNameList, "、")
+			}
+			msg := `图表被其他用户使用,无法设置共享`
+			if userNameStr != "" {
+				msg = fmt.Sprintf(`图表被用户%s使用,无法设置共享`, userNameStr)
+			}
+			if tips != "" {
+				msg = fmt.Sprintf(`%s,用户为:%s,无法设置共享`, tips, userNameStr)
+			}
+			br.Msg = msg
+			br.ErrMsg = "图表被其他用户共享,无法设置共享,ChartInfoId:" + strconv.Itoa(chartItem.ChartInfoId)
+			br.IsSendEmail = false
+			return
+		}
+	}
+
+	// 修改
 	err = obj.SaveChartInfoShare([]int{req.ChartInfoId}, req.UserIdList, req.ShareType)
 	if err != nil {
 		br.Msg = `保存失败`
@@ -144,6 +209,9 @@ func (c *ChartInfoShareController) Save() {
 	// 更新es
 	data.AddOrEditChartInfoToEs(req.ChartInfoId)
 
+	// 图表收藏操作处理
+	go cache.AddDataCollectHandler(req.ChartInfoId, utils.DataCollectTypeChart)
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "保存成功"
@@ -349,15 +417,15 @@ func (c *ChartInfoShareController) List() {
 		return
 	}
 
-	editShareEdbInfoIdMap, err := data.GetAllEditSharedChartInfoIdMapByReceivedUserId(c.SysUser.AdminId)
+	editShareChartInfoIdMap, err := data.GetAllEditSharedChartInfoIdMapByReceivedUserId(c.SysUser.AdminId)
 	if err != nil {
 		br.Msg = "获取失败"
-		br.ErrMsg = "获取所有有编辑权限的分享指标失败,Err:" + err.Error()
+		br.ErrMsg = "获取所有有编辑权限的分享图表失败,Err:" + err.Error()
 		return
 	}
 	for _, chartInfo := range respList {
 		chartInfo.HaveOperaAuth = true
-		button := data.GetChartOpButton(c.SysUser, chartInfo.SysUserId, chartInfo.ChartInfoId, chartInfo.HaveOperaAuth, editShareEdbInfoIdMap)
+		button := data.GetChartOpButton(c.SysUser, chartInfo.SysUserId, chartInfo.ChartInfoId, chartInfo.HaveOperaAuth, editShareChartInfoIdMap)
 		chartInfo.Button.IsEdit = button.OpButton
 		chartInfo.Button.IsCopy = button.DeleteButton
 	}
@@ -593,30 +661,110 @@ func (c *ChartInfoShareController) BatchSave() {
 	}
 
 	num := len(selectChartInfoIdList)
-
+	if num <= 0 {
+		br.Msg = `请选择图表`
+		br.IsSendEmail = false
+		return
+	}
 	if num > 30 {
 		br.Msg = `图表数量不能超过30个`
 		br.IsSendEmail = false
 		return
 	}
 
-	// 设置
-	if num > 0 {
+	chartInfoList, err := data_manage.GetChartInfoListByChartIdList(selectChartInfoIdList)
+	if err != nil {
+		br.Msg = "设置失败!"
+		br.ErrMsg = "设置失败,Err:" + err.Error()
+		return
+	}
+	obj := data_manage.ChartInfoShare{}
 
-		obj := data_manage.ChartInfoShare{}
-		err = obj.SaveChartInfoShare(selectChartInfoIdList, req.UserIdList, req.ShareType)
-		if err != nil {
-			br.Msg = `保存失败`
-			br.ErrMsg = `保存失败:` + err.Error()
-			return
-		}
+	{
+		for _, chartItem := range chartInfoList {
+			// 如果指标已公开,则不判断是否被其他用户使用
+			if chartItem.PublicStatus == utils.DataPublicSuccess {
+				continue
+			}
+			if chartItem.PublicStatus != utils.DataPublicSuccess {
+				checkUserIdList := []int{sysUser.AdminId}
+				if len(req.UserIdList) > 0 {
+					checkUserIdList = append(checkUserIdList, req.UserIdList...)
+				}
 
-		// 更新es
-		for _, chartInfoId := range selectChartInfoIdList {
-			data.AddOrEditChartInfoToEs(chartInfoId)
+				{
+					userIdList, err := obj.GetAllUserIdListByChartInfoIdAndNoShareType(chartItem.ChartInfoId, req.ShareType)
+					if err != nil {
+						br.Msg = "设置失败!"
+						br.ErrMsg = "设置失败,Err:" + err.Error()
+						return
+					}
+					if len(userIdList) > 0 {
+						checkUserIdList = append(checkUserIdList, userIdList...)
+					}
+				}
+
+				// 校验是否被其他用户关联
+				noReferenced, otherUserIdList, err, tips := data.CheckChartReferencedByOthers([]int{chartItem.ChartInfoId}, []string{chartItem.UniqueCode}, checkUserIdList)
+				if err != nil {
+					br.Msg = "保存失败"
+					if tips != "" {
+						br.Msg = tips
+					}
+					br.ErrMsg = "设置指标共享失败,查找指标的关联用户失败,Err:" + err.Error()
+					return
+				}
+
+				if !noReferenced {
+					userNameStr := ``
+					if len(otherUserIdList) > 0 {
+						userNameList := make([]string, 0)
+						userList, err := system.GetAdminListByIdList(otherUserIdList)
+						if err != nil {
+							br.Msg = "保存失败"
+							if tips != "" {
+								br.Msg = tips
+							}
+							br.ErrMsg = "设置指标共享失败,查找用户信息失败,Err:" + err.Error()
+							return
+						}
+						for _, userInfo := range userList {
+							userNameList = append(userNameList, userInfo.RealName)
+						}
+						userNameStr = strings.Join(userNameList, "、")
+					}
+					msg := fmt.Sprintf(`指标《%s》被其他用户使用,无法设置共享`, chartItem.ChartName)
+					if userNameStr != "" {
+						msg = fmt.Sprintf(`指标《%s》被用户%s使用,无法设置共享`, chartItem.ChartName, userNameStr)
+					}
+					if tips != "" {
+						msg = fmt.Sprintf(`%s,用户为:%s,无法设置共享`, tips, userNameStr)
+					}
+					br.Msg = msg
+					br.ErrMsg = "指标被其他用户共享,无法设置共享,ChartInfoId:" + strconv.Itoa(chartItem.ChartInfoId)
+					br.IsSendEmail = false
+					return
+				}
+			}
 		}
 	}
 
+	// 设置
+	err = obj.SaveChartInfoShare(selectChartInfoIdList, req.UserIdList, req.ShareType)
+	if err != nil {
+		br.Msg = `保存失败`
+		br.ErrMsg = `保存失败:` + err.Error()
+		return
+	}
+
+	// 更新es
+	for _, chartInfoId := range selectChartInfoIdList {
+		data.AddOrEditChartInfoToEs(chartInfoId)
+
+		// 图表收藏操作处理
+		go cache.AddDataCollectHandler(chartInfoId, utils.DataCollectTypeChart)
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "保存成功"

+ 9 - 0
controllers/data_manage/edb_info_share.go

@@ -2,6 +2,7 @@ package data_manage
 
 import (
 	"encoding/json"
+	"eta_gn/eta_api/cache"
 	"eta_gn/eta_api/controllers"
 	"eta_gn/eta_api/models"
 	"eta_gn/eta_api/models/data_manage"
@@ -153,6 +154,7 @@ func (c *EdbInfoShareController) Save() {
 			}
 		}
 
+		// 校验是否被其他用户关联
 		noReferenced, otherUserIdList, err, tips := data.CheckEdbReferencedByOthers(edbItem.EdbInfoType, []int{edbItem.EdbInfoId}, checkUserIdList)
 		if err != nil {
 			br.Msg = "保存失败"
@@ -195,6 +197,7 @@ func (c *EdbInfoShareController) Save() {
 		}
 	}
 
+	// 修改
 	err = obj.SaveEdbInfoShare([]int{req.EdbInfoId}, req.UserIdList, req.ShareType)
 	if err != nil {
 		br.Msg = `保存失败`
@@ -205,6 +208,9 @@ func (c *EdbInfoShareController) Save() {
 	// 更新es
 	data.AddOrEditEdbInfoToEs(req.EdbInfoId)
 
+	// 指标收藏操作处理
+	go cache.AddDataCollectHandler(req.EdbInfoId, utils.DataCollectTypeEdb)
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "保存成功"
@@ -817,6 +823,7 @@ func (c *EdbInfoShareController) BatchSave() {
 					}
 				}
 
+				// 校验是否被其他用户关联
 				noReferenced, otherUserIdList, err, tips := data.CheckEdbReferencedByOthers(edbItem.EdbInfoType, []int{edbItem.EdbInfoId}, checkUserIdList)
 				if err != nil {
 					br.Msg = "保存失败"
@@ -872,6 +879,8 @@ func (c *EdbInfoShareController) BatchSave() {
 	// 更新es
 	for _, edbInfoId := range selectEdbInfoIdList {
 		data.AddOrEditEdbInfoToEs(edbInfoId)
+		// 指标收藏操作处理
+		go cache.AddDataCollectHandler(edbInfoId, utils.DataCollectTypeEdb)
 	}
 
 	br.Ret = 200

+ 22 - 0
models/bi_dashboard/bi_dashboard_detail.go

@@ -69,3 +69,25 @@ type DelDashboardDetailReq struct {
 func DeleteBiDashboardDetailByDetailId(id int) (err error) {
 	return global.DEFAULT_DmSQL.Where("bi_dashboard_detail_id = ?", id).Delete(&BiDashboardDetail{}).Error
 }
+
+// GetUserIdListRelationBiDashboardDetailByCondition
+// @Description: 根据条件获取关联图的用户id列表
+// @author: Roc
+// @datetime 2024-12-26 10:13:47
+// @param condition string
+// @param pars []interface{}
+// @return total int
+// @return err error
+func GetUserIdListRelationBiDashboardDetailByCondition(condition string, pars []interface{}) (userIdList []int, err error) {
+	o := global.DmSQL["data"]
+	sql := ` SELECT b.sys_admin_id FROM bi_dashboard_detail AS a 
+	JOIN bi_dashboard AS b on a.bi_dashboard_id = b.bi_dashboard_id WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` GROUP BY b.sys_admin_id `
+
+	err = o.Raw(sql, pars...).Scan(&userIdList).Error
+
+	return
+}

+ 1 - 1
models/data_manage/chart_info.go

@@ -2164,7 +2164,7 @@ func GetChartInfoListGroupByUserId(edbIdList []string) (items []*ChartInfo, err
 // @param edbIdList
 // @return items
 // @return err
-func GetChartInfoListByChartIdList(charIdList []string) (items []*ChartInfo, err error) {
+func GetChartInfoListByChartIdList(charIdList []int) (items []*ChartInfo, err error) {
 	num := len(charIdList)
 	if num <= 0 {
 		return

+ 31 - 0
models/data_manage/chart_info_share.go

@@ -168,6 +168,37 @@ ORDER BY share_time DESC`
 	return
 }
 
+// GetAllUserIdListByChartInfoId
+// @Description: 根据图表id获取所有用户id
+// @author: Roc
+// @receiver m
+// @datetime 2024-12-27 15:33:16
+// @param chartInfoId int
+// @return list []int
+// @return err error
+func (m ChartInfoShare) GetAllUserIdListByChartInfoId(chartInfoId int) (list []int, err error) {
+	sql := `SELECT a.sys_user_id  FROM chart_info_share AS a 
+	  WHERE 1=1 AND a.chart_info_id = ? GROUP BY a.sys_user_id `
+	err = global.DmSQL["data"].Raw(sql, chartInfoId).Scan(&list).Error
+	return
+}
+
+// GetAllUserIdListByChartInfoIdAndNoShareType
+// @Description: 根据图表id和不需要的共享类型,获取所有用户id
+// @author: Roc
+// @receiver m
+// @datetime 2024-12-27 15:33:16
+// @param chartInfoId int
+// @param shareType int8
+// @return list []int
+// @return err error
+func (m ChartInfoShare) GetAllUserIdListByChartInfoIdAndNoShareType(chartInfoId int, shareType int8) (list []int, err error) {
+	sql := `SELECT a.sys_user_id  FROM chart_info_share AS a 
+	  WHERE 1=1 AND a.chart_info_id = ? AND a.share_type != ? GROUP BY a.sys_user_id `
+	err = global.DmSQL["data"].Raw(sql, chartInfoId, shareType).Scan(&list).Error
+	return
+}
+
 // GetAllEditSharedChartInfoIdListByReceivedUserId
 // @Description: 获取所有我收到的共享的、可以编辑的图表id列表
 // @author: Roc

+ 43 - 0
models/data_manage/collect_chart.go

@@ -241,6 +241,49 @@ func GetUserAllCollectChartInfoIdList(userId int) (list []int, err error) {
 	return
 }
 
+// GetChartAllCollectUserIdList
+// @Description: 根据图表ID获取所有收藏的用户id列表
+// @author: Roc
+// @datetime 2024-12-27 17:03:03
+// @param chartInfoId int
+// @return list []int
+// @return err error
+func GetChartAllCollectUserIdList(chartInfoId int) (list []int, err error) {
+	sql := `SELECT sys_user_id FROM chart_collect WHERE 1=1 AND chart_info_id = ? GROUP BY sys_user_id`
+	err = global.DmSQL["data"].Raw(sql, chartInfoId).Scan(&list).Error
+	return
+}
+
+// GetChartAllCollectUserIdList
+// @Description: 根据指标ID获取所有收藏的用户id列表
+// @author: Roc
+// @receiver m
+// @datetime 2024-12-27 17:03:03
+// @param chartInfoId int
+// @return list []int
+// @return err error
+func (m *ChartCollect) GetChartAllCollectUserIdList(chartInfoId int) (list []int, err error) {
+	sql := `SELECT sys_user_id FROM chart_collect WHERE 1=1 AND chart_info_id = ? GROUP BY sys_user_id`
+	err = global.DmSQL["data"].Raw(sql, chartInfoId).Scan(&list).Error
+	return
+}
+
+// DeleteByChartInfoIdAndUserIdList
+// @Description: 根据指标ID和用户id列表删除对应关系
+// @author: Roc
+// @receiver m
+// @datetime 2024-12-27 17:12:03
+// @param chartInfoId int
+// @param userIdList []int
+// @return err error
+func (m *ChartCollect) DeleteByChartInfoIdAndUserIdList(chartInfoId int, userIdList []int) (err error) {
+	// 先删除
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE chart_info_id = ? AND sys_user_id in (?) `, m.TableName())
+	err = global.DmSQL["data"].Exec(sql, chartInfoId, userIdList).Error
+
+	return
+}
+
 type CollectChartInfoQuery struct {
 	ChartInfo
 	CollectClassifyIdStr string    `gorm:"column:collect_classify_id" description:"收藏分类ID"`

+ 37 - 0
models/data_manage/collect_edb.go

@@ -255,6 +255,36 @@ func GetUserAllCollectEdbInfoIdList(userId int) (list []int, err error) {
 	return
 }
 
+// GetEdbAllCollectUserIdList
+// @Description: 根据指标ID获取所有收藏的用户id列表
+// @author: Roc
+// @receiver m
+// @datetime 2024-12-27 17:03:03
+// @param edbInfoId int
+// @return list []int
+// @return err error
+func (m *EdbCollect) GetEdbAllCollectUserIdList(edbInfoId int) (list []int, err error) {
+	sql := `SELECT sys_user_id FROM edb_collect WHERE 1=1 AND edb_info_id = ? GROUP BY sys_user_id`
+	err = global.DmSQL["data"].Raw(sql, edbInfoId).Scan(&list).Error
+	return
+}
+
+// DeleteByEdbInfoIdAndUserIdList
+// @Description: 根据指标ID和用户id列表删除对应关系
+// @author: Roc
+// @receiver m
+// @datetime 2024-12-27 17:12:03
+// @param edbInfoId int
+// @param userIdList []int
+// @return err error
+func (m *EdbCollect) DeleteByEdbInfoIdAndUserIdList(edbInfoId int, userIdList []int) (err error) {
+	// 先删除
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE edb_info_id = ? AND sys_user_id in (?) `, m.TableName())
+	err = global.DmSQL["data"].Exec(sql, edbInfoId, userIdList).Error
+
+	return
+}
+
 type CollectEdbInfoQuery struct {
 	EdbInfo
 	CollectClassifyIdStr string    `gorm:"column:collect_classify_id" description:"收藏分类ID"`
@@ -395,3 +425,10 @@ func (m *EdbCollect) GetItemsByUserIdAndEdbInfoIdList(userId int, edbInfoIdList
 
 	return
 }
+
+// DataCollectHandleItem
+// @Description: 处理收藏的结构体
+type DataCollectHandleItem struct {
+	DataId   int
+	DataType int `description:"数据类型,1:指标,2:图表"`
+}

+ 4 - 4
models/data_manage/edb_info.go

@@ -952,15 +952,15 @@ func ReplaceChartEdb(oldEdbInfo, newEdbInfo *EdbInfo, userId int) (relationEdbIn
 		}
 		replaceChartTotal = len(chartEdbMappingList)
 		// 查询所有的相关的图表信息
-		chartInfoIds := make([]string, 0)
+		chartInfoIdList := make([]int, 0)
 		if len(chartEdbMappingList) > 0 {
 			for _, chartEdbMapping := range chartEdbMappingList {
-				chartInfoIds = append(chartInfoIds, strconv.Itoa(chartEdbMapping.ChartInfoId))
+				chartInfoIdList = append(chartInfoIdList, chartEdbMapping.ChartInfoId)
 			}
 		}
 
-		if len(chartInfoIds) > 0 {
-			chartInfoList, e := GetChartInfoListByChartIdList(chartInfoIds)
+		if len(chartInfoIdList) > 0 {
+			chartInfoList, e := GetChartInfoListByChartIdList(chartInfoIdList)
 			if e != nil {
 				err = e
 				errmsg = "获取图表信息失败:Err:" + e.Error()

+ 16 - 1
models/data_manage/edb_info_share.go

@@ -178,8 +178,23 @@ ORDER BY share_time DESC`
 	return
 }
 
+// GetAllUserIdListByEdbInfoId
+// @Description: 根据指标id获取所有用户id
+// @author: Roc
+// @receiver m
+// @datetime 2024-12-27 15:33:16
+// @param edbInfoId int
+// @return list []int
+// @return err error
+func (m EdbInfoShare) GetAllUserIdListByEdbInfoId(edbInfoId int) (list []int, err error) {
+	sql := `SELECT a.sys_user_id  FROM edb_info_share AS a 
+	  WHERE 1=1 AND a.edb_info_id = ?  GROUP BY a.sys_user_id `
+	err = global.DmSQL["data"].Raw(sql, edbInfoId).Scan(&list).Error
+	return
+}
+
 // GetAllUserIdListByEdbInfoIdAndNoShareType
-// @Description: 根据指标id和共享类型,获取所有用户id
+// @Description: 根据指标id和不需要的共享类型,获取所有用户id
 // @author: Roc
 // @receiver m
 // @datetime 2024-12-27 15:33:16

+ 36 - 0
services/data/chart_info.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"errors"
 	"eta_gn/eta_api/models"
+	"eta_gn/eta_api/models/bi_dashboard"
 	"eta_gn/eta_api/models/company"
 	"eta_gn/eta_api/models/data_manage"
 	"eta_gn/eta_api/models/system"
@@ -4998,3 +4999,38 @@ func getEdbDataMapListForSeason(chartInfoId, chartType int, calendar, startDate,
 
 	return
 }
+
+// CheckChartReferencedByOthers
+// @Description: 校验图表是否被其他用户关联
+// @author: Roc
+// @datetime 2024-12-27 16:32:38
+// @param chartInfoIdList []int
+// @param chartUniqueCodeList []string
+// @param belongUserIdList []int
+// @return noReferenced bool
+// @return otherUserIdList []int
+// @return err error
+// @return tips string
+func CheckChartReferencedByOthers(chartInfoIdList []int, chartUniqueCodeList []string, belongUserIdList []int) (noReferenced bool, otherUserIdList []int, err error, tips string) {
+	otherUserIdList = []int{}
+	//判断图表是否用于bi看板,则不可删除
+	{
+		var condition string
+		var pars []interface{}
+		// 关联指标
+		condition += ` AND type = 1 AND a.unique_code in (?) AND b.sys_admin_id not in (?) `
+		pars = append(pars, chartUniqueCodeList, belongUserIdList)
+		otherUserIdList, err = bi_dashboard.GetUserIdListRelationBiDashboardDetailByCondition(condition, pars)
+		if err != nil {
+			err = errors.New("判断图表是否被用于BI看板失败,Err:" + err.Error())
+			return
+		}
+		if len(otherUserIdList) > 0 {
+			tips = "当前图表已被其他用户用作BI看板"
+			return
+		}
+	}
+
+	noReferenced = true
+	return
+}

+ 10 - 1
services/data/data_manage_permission/data_move.go

@@ -554,7 +554,16 @@ func MoveEdbChart(source, subSource, oldUserId, newUserId int, isSelectAll bool,
 		// 只展示eta图库
 		subSource = utils.CHART_SOURCE_DEFAULT
 
-		tmpList, tmpErr := data_manage.GetChartInfoListByChartIdList(dataId)
+		chartInfoIdList := make([]int, 0)
+		for _, id := range dataId {
+			edbInfoId, tmpErr := strconv.Atoi(id)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			chartInfoIdList = append(chartInfoIdList, edbInfoId)
+		}
+		tmpList, tmpErr := data_manage.GetChartInfoListByChartIdList(chartInfoIdList)
 		if tmpErr != nil {
 			err = tmpErr
 			return

+ 10 - 1
services/data/data_manage_permission/edb_permission.go

@@ -110,7 +110,16 @@ func SetEdbChartPermission(source, subSource, userId int, authUserList []int, is
 	case utils.ChartPermissionSource:
 		//图库
 		content += `(图库)`
-		tmpList, tmpErr := data_manage.GetChartInfoListByChartIdList(dataIdList)
+		chartInfoIdList := make([]int, 0)
+		for _, id := range dataIdList {
+			edbInfoId, tmpErr := strconv.Atoi(id)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			chartInfoIdList = append(chartInfoIdList, edbInfoId)
+		}
+		tmpList, tmpErr := data_manage.GetChartInfoListByChartIdList(chartInfoIdList)
 		if tmpErr != nil {
 			err = tmpErr
 			return

+ 11 - 0
services/data/edb_info.go

@@ -2053,6 +2053,17 @@ func GetIsSupplierStop(source int, edbCode string) (isSupplierStop int) {
 
 //IsSupplierStop  int    `description:"是否供应商停更:1:停更,0:未停更"`
 
+// CheckEdbReferencedByOthers
+// @Description: 校验指标是否被其他用户关联
+// @author: Roc
+// @datetime 2024-12-27 16:20:47
+// @param edbInfoType int
+// @param edbInfoIdList []int
+// @param belongUserIdList []int
+// @return noReferenced bool
+// @return otherUserIdList []int
+// @return err error
+// @return tips string
 func CheckEdbReferencedByOthers(edbInfoType int, edbInfoIdList, belongUserIdList []int) (noReferenced bool, otherUserIdList []int, err error, tips string) {
 	otherUserIdList = []int{}
 	//判断指标是否用于作图,如果用于作图,则不可删除

+ 198 - 0
services/data_collect_handler.go

@@ -0,0 +1,198 @@
+package services
+
+import (
+	"encoding/json"
+	"errors"
+	"eta_gn/eta_api/models/data_manage"
+	"eta_gn/eta_api/services/alarm_msg"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"time"
+)
+
+// HandleDataCollectCache
+// @Description: 资产收藏处理
+// @author: Roc
+// @datetime 2024-12-27 16:56:36
+func HandleDataCollectCache() {
+	var err error
+	for {
+		utils.Rc.Brpop(utils.CACHE_KEY_DATA_COLLECT_HANDLER, func(b []byte) {
+			defer func() {
+				if err != nil {
+					utils.FileLog.Info("HandleDataCollectCache err:" + err.Error())
+					go alarm_msg.SendAlarmMsg("资产收藏处理失败提醒,errMsg:"+err.Error(), 3)
+				}
+			}()
+			record := new(data_manage.DataCollectHandleItem)
+			if err = json.Unmarshal(b, &record); err != nil {
+				fmt.Println("json unmarshal wrong!")
+				return
+			}
+			dataId := record.DataId
+			dataType := record.DataType
+			utils.FileLog.Info(fmt.Sprintf("资产收藏处理失败提醒 DealReplaceEdbCache: 旧指标ID:%d,新指标ID:%d", dataId, dataType))
+			deleteCache := true
+			setNxKey := fmt.Sprintf("EDB_INFO_REPLACE:%d-%d", dataId, dataType)
+			defer func() {
+				if deleteCache {
+					utils.Rc.Delete(setNxKey)
+				}
+			}()
+			if !utils.Rc.SetNX(setNxKey, 1, 30*time.Minute) {
+				deleteCache = false
+				err = fmt.Errorf("资产收藏处理:%d为新指标%d:正在处理中", dataId, dataType)
+				return
+			}
+
+			switch dataType {
+			case 1: // 指标处理
+				handleEdbCollectCache(dataId)
+			case 2: // 图表处理
+				handleChartCollectCache(dataId)
+			}
+		})
+	}
+}
+
+// handleEdbCollectCache
+// @Description: 指标收藏关系处理
+// @author: Roc
+// @datetime 2024-12-27 17:15:19
+// @param edbInfoId int
+func handleEdbCollectCache(edbInfoId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			utils.FileLog.Info("handleEdbCollectCache err:" + err.Error())
+			go alarm_msg.SendAlarmMsg("指标收藏处理失败提醒,errMsg:"+err.Error(), 3)
+		}
+	}()
+	edbInfo, err := data_manage.GetEdbInfoById(edbInfoId)
+	if err != nil {
+		return
+	}
+
+	// 公开那就直接返回
+	if edbInfo.PublicStatus == utils.DataPublicSuccess {
+		return
+	}
+
+	edbCollectObj := data_manage.EdbCollect{}
+
+	// 获取所有已经收藏的人
+	allCollectUserIdList, err := edbCollectObj.GetEdbAllCollectUserIdList(edbInfoId)
+	if err != nil {
+		err = errors.New("查找指标的所有收藏人失败,Err:" + err.Error())
+		return
+	}
+	// 没有人收藏,那么就直接返回
+	if len(allCollectUserIdList) <= 0 {
+		return
+	}
+
+	userIdMap := make(map[int]bool)
+	for _, v := range allCollectUserIdList {
+		userIdMap[v] = true
+	}
+
+	// 自己的指标,肯定可以收藏的
+	delete(userIdMap, edbInfo.SysUserId)
+
+	// 获取该指标的被分享人
+	obj := data_manage.EdbInfoShare{}
+	shareUserIdList, err := obj.GetAllUserIdListByEdbInfoId(edbInfoId)
+	if err != nil {
+		err = errors.New("查找指标的所有收藏人失败,Err:" + err.Error())
+		return
+	}
+	for _, v := range shareUserIdList {
+		delete(userIdMap, v)
+	}
+
+	// 没有待移除的用户,那么就直接返回
+	if len(userIdMap) < 0 {
+		return
+	}
+
+	// 删除收藏关系
+	deleteUserIdList := make([]int, 0)
+	for userId, _ := range userIdMap {
+		deleteUserIdList = append(deleteUserIdList, userId)
+	}
+	// 删除收藏关系
+	err = edbCollectObj.DeleteByEdbInfoIdAndUserIdList(edbInfoId, deleteUserIdList)
+
+	return
+}
+
+// handleChartCollectCache
+// @Description: 图表收藏关系处理
+// @author: Roc
+// @datetime 2024-12-27 17:15:19
+// @param chartInfoId int
+func handleChartCollectCache(chartInfoId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			utils.FileLog.Info("handleChartCollectCache err:" + err.Error())
+			go alarm_msg.SendAlarmMsg("图表收藏处理失败提醒,errMsg:"+err.Error(), 3)
+		}
+	}()
+	chartInfo, err := data_manage.GetChartInfoById(chartInfoId)
+	if err != nil {
+		return
+	}
+
+	// 公开那就直接返回
+	if chartInfo.PublicStatus == utils.DataPublicSuccess {
+		return
+	}
+
+	chartCollectObj := data_manage.ChartCollect{}
+
+	// 获取所有已经收藏的人
+	allCollectUserIdList, err := chartCollectObj.GetChartAllCollectUserIdList(chartInfoId)
+	if err != nil {
+		err = errors.New("查找图表的所有收藏人失败,Err:" + err.Error())
+		return
+	}
+	// 没有人收藏,那么就直接返回
+	if len(allCollectUserIdList) <= 0 {
+		return
+	}
+
+	userIdMap := make(map[int]bool)
+	for _, v := range allCollectUserIdList {
+		userIdMap[v] = true
+	}
+
+	// 自己的图表,肯定可以收藏的
+	delete(userIdMap, chartInfo.SysUserId)
+
+	// 获取该图表的被分享人
+	obj := data_manage.ChartInfoShare{}
+	shareUserIdList, err := obj.GetAllUserIdListByChartInfoId(chartInfoId)
+	if err != nil {
+		err = errors.New("查找图表的所有收藏人失败,Err:" + err.Error())
+		return
+	}
+	for _, v := range shareUserIdList {
+		delete(userIdMap, v)
+	}
+
+	// 没有待移除的用户,那么就直接返回
+	if len(userIdMap) < 0 {
+		return
+	}
+
+	// 删除收藏关系
+	deleteUserIdList := make([]int, 0)
+	for userId, _ := range userIdMap {
+		deleteUserIdList = append(deleteUserIdList, userId)
+	}
+	// 删除收藏关系
+	err = chartCollectObj.DeleteByChartInfoIdAndUserIdList(chartInfoId, deleteUserIdList)
+
+	return
+}

+ 3 - 0
services/task.go

@@ -21,6 +21,9 @@ func Task() {
 	// 进行指标替换操作
 	go DealReplaceEdbCache()
 
+	// 资产收藏操作
+	go HandleDataCollectCache()
+
 	// 修复分类LevelPath
 	//FixClassifyLevelPath()
 

+ 6 - 0
utils/constants.go

@@ -217,6 +217,7 @@ const (
 
 	CACHE_KEY_REPLACE_EDB                   = "eta:replace_edb"                   //系统用户操作日志队列
 	CACHE_KEY_BI_DASHBOARD_PREPARE_RESOURCE = "eta:bi_dashboard:prepare_resource" // 准备引用到看板的知识资源
+	CACHE_KEY_DATA_COLLECT_HANDLER          = "eta:data:collect:handler"          // 资产收藏处理队列
 )
 
 // 模板消息推送类型
@@ -474,6 +475,11 @@ const (
 	ShareTypeEdit = 2 // 可编辑
 )
 
+const (
+	DataCollectTypeEdb   = 1 // 资产收藏类型-指标
+	DataCollectTypeChart = 2 // 资产收藏类型-图库
+)
+
 // BaseEdbRefreshStartDate 指标的基础刷新开始日期
 const BaseEdbRefreshStartDate = `1899-01-01`