Browse Source

Merge remote-tracking branch 'origin/eta/1.7.6'

# Conflicts:
#	models/db.go
#	routers/router.go
Roc 1 year ago
parent
commit
3e891f3fd9
73 changed files with 12443 additions and 1886 deletions
  1. 4 4
      controllers/base_auth.go
  2. 1 1
      controllers/base_common.go
  3. 87 18
      controllers/data_manage/chart_classify.go
  4. 637 294
      controllers/data_manage/chart_info.go
  5. 2 2
      controllers/data_manage/correlation/correlation_chart_classify.go
  6. 132 2
      controllers/data_manage/correlation/correlation_chart_info.go
  7. 137 3
      controllers/data_manage/cross_variety/chart_info.go
  8. 2 2
      controllers/data_manage/cross_variety/classify.go
  9. 394 0
      controllers/data_manage/data_manage_permission/data_manage_permission.go
  10. 396 0
      controllers/data_manage/data_manage_permission/data_move.go
  11. 250 0
      controllers/data_manage/data_manage_permission/message.go
  12. 168 41
      controllers/data_manage/edb_classify.go
  13. 468 306
      controllers/data_manage/edb_info.go
  14. 98 14
      controllers/data_manage/edb_info_calculate.go
  15. 20 2
      controllers/data_manage/excel/custom_analysis.go
  16. 174 3
      controllers/data_manage/excel/excel_classify.go
  17. 68 23
      controllers/data_manage/excel/excel_info.go
  18. 54 12
      controllers/data_manage/excel/mixed_table.go
  19. 3 3
      controllers/data_manage/future_good/future_good_chart_classify.go
  20. 84 5
      controllers/data_manage/future_good/future_good_chart_info.go
  21. 81 4
      controllers/data_manage/future_good/future_good_profit_chart_info.go
  22. 2 2
      controllers/data_manage/line_equation/line_chart_classify.go
  23. 133 2
      controllers/data_manage/line_equation/line_chart_info.go
  24. 133 2
      controllers/data_manage/line_feature/chart_info.go
  25. 2 2
      controllers/data_manage/line_feature/classify.go
  26. 213 15
      controllers/data_manage/my_chart.go
  27. 335 270
      controllers/data_manage/predict_edb_classify.go
  28. 268 43
      controllers/data_manage/predict_edb_info.go
  29. 1 1
      controllers/data_stat/edb_source_stat.go
  30. 86 0
      controllers/message.go
  31. 37 0
      models/data_manage/chart_classify.go
  32. 7 7
      models/data_manage/chart_edb_mapping.go
  33. 65 4
      models/data_manage/chart_info.go
  34. 976 0
      models/data_manage/data_manage_permission/chart.go
  35. 489 0
      models/data_manage/data_manage_permission/classify_no_auth_record.go
  36. 989 0
      models/data_manage/data_manage_permission/edb.go
  37. 973 0
      models/data_manage/data_manage_permission/excel.go
  38. 152 0
      models/data_manage/data_manage_permission/message.go
  39. 103 0
      models/data_manage/data_manage_permission/move.go
  40. 85 0
      models/data_manage/data_manage_permission/move_record.go
  41. 316 0
      models/data_manage/data_manage_permission/no_auth_record.go
  42. 89 0
      models/data_manage/data_manage_permission/req_and_resp.go
  43. 75 37
      models/data_manage/edb_classify.go
  44. 95 32
      models/data_manage/edb_info.go
  45. 7 5
      models/data_manage/edb_info_calculate.go
  46. 56 0
      models/data_manage/excel/excel_classify.go
  47. 132 34
      models/data_manage/excel/excel_info.go
  48. 10 7
      models/data_manage/excel/request/excel_info.go
  49. 21 19
      models/data_manage/excel/response/excel_info.go
  50. 1 0
      models/data_manage/excel/response/sheet.go
  51. 3 1
      models/data_manage/my_chart.go
  52. 63 2
      models/data_manage/mysteel_chemical_index.go
  53. 7 2
      models/data_manage/response/predit_edb_info.go
  54. 29 0
      models/db.go
  55. 51 0
      models/target.go
  56. 144 45
      routers/commentsRouter.go
  57. 7 0
      routers/router.go
  58. 61 8
      services/data/chart_classify.go
  59. 24 2
      services/data/chart_info.go
  60. 1 1
      services/data/correlation/chart_info.go
  61. 1 1
      services/data/cross_variety/chart.go
  62. 155 0
      services/data/data_manage_permission/chart.go
  63. 1365 0
      services/data/data_manage_permission/data_move.go
  64. 161 0
      services/data/data_manage_permission/edb.go
  65. 715 0
      services/data/data_manage_permission/edb_permission.go
  66. 155 0
      services/data/data_manage_permission/excel.go
  67. 152 0
      services/data/data_manage_permission/message.go
  68. 99 13
      services/data/edb_classify.go
  69. 44 576
      services/data/edb_info.go
  70. 62 9
      services/data/excel/excel_info.go
  71. 19 2
      services/data/excel/excel_op.go
  72. 1 1
      services/data/line_feature/chart_info.go
  73. 13 2
      services/data/predict_edb_info.go

+ 4 - 4
controllers/base_auth.go

@@ -54,10 +54,10 @@ type BaseAuthController struct {
 }
 
 func (c *BaseAuthController) Prepare() {
-	fmt.Println("enter prepare")
+	//fmt.Println("enter prepare")
 	method := c.Ctx.Input.Method()
 	uri := c.Ctx.Input.URI()
-	fmt.Println("Url:", uri)
+	//fmt.Println("Url:", uri)
 	if method != "HEAD" {
 		if method == "POST" || method == "GET" {
 			authorization := c.Ctx.Input.Header("authorization")
@@ -206,7 +206,7 @@ func (c *BaseAuthController) Prepare() {
 			uri = strings.Replace(uri, "/adminapi", "", 1)
 			uris := strings.Split(uri, "?")
 			uri = uris[0]
-			fmt.Println("uri:", uri)
+			//fmt.Println("uri:", uri)
 			apis := strings.Split(api, "&")
 			apiMap := make(map[string]bool, 0)
 			for _, s := range apis {
@@ -394,7 +394,7 @@ func (c *BaseAuthController) logUri(respContent []byte, requestBody, ip string)
 	authorization := ""
 	method := c.Ctx.Input.Method()
 	uri := c.Ctx.Input.URI()
-	fmt.Println("Url:", uri)
+	//fmt.Println("Url:", uri)
 	if method != "HEAD" {
 		if method == "POST" || method == "GET" {
 			authorization = c.Ctx.Input.Header("authorization")

+ 1 - 1
controllers/base_common.go

@@ -120,7 +120,7 @@ func (c *BaseCommonController) logUri(respContent []byte, requestBody, ip string
 	authorization := ""
 	method := c.Ctx.Input.Method()
 	uri := c.Ctx.Input.URI()
-	fmt.Println("Url:", uri)
+	//fmt.Println("Url:", uri)
 	if method != "HEAD" {
 		if method == "POST" || method == "GET" {
 			authorization = c.Ctx.Input.Header("authorization")

+ 87 - 18
controllers/data_manage/chart_classify.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/utils"
 	"fmt"
 	"strconv"
@@ -95,7 +96,7 @@ func (this *ChartClassifyController) ChartClassifyListV2() {
 			return
 		}
 		// 移除没有权限的图表
-		allNodes := data.HandleNoPermissionChart(resp.AllNodes, noPermissionChartIdMap)
+		allNodes := data.HandleNoPermissionChart(resp.AllNodes, noPermissionChartIdMap, this.SysUser.AdminId)
 		resp.AllNodes = allNodes
 
 		br.Ret = 200
@@ -114,7 +115,7 @@ func (this *ChartClassifyController) ChartClassifyListV2() {
 				err := json.Unmarshal(redisData, &resp)
 				if err == nil && resp != nil {
 					// 移除没有权限的图表
-					allNodes := data.HandleNoPermissionChart(resp.AllNodes, noPermissionChartIdMap)
+					allNodes := data.HandleNoPermissionChart(resp.AllNodes, noPermissionChartIdMap, this.SysUser.AdminId)
 					resp.AllNodes = allNodes
 
 					br.Ret = 200
@@ -190,7 +191,7 @@ func (this *ChartClassifyController) ChartClassifyListV2() {
 	}
 
 	// 移除没有权限的图表
-	allNodes := data.HandleNoPermissionChart(resp.AllNodes, noPermissionChartIdMap)
+	allNodes := data.HandleNoPermissionChart(resp.AllNodes, noPermissionChartIdMap, this.SysUser.AdminId)
 	resp.AllNodes = allNodes
 
 	br.Ret = 200
@@ -274,10 +275,18 @@ func (this *ChartClassifyController) ChartClassifyItems() {
 		return
 	}
 
+	// 已授权分类id
+	permissionClassifyIdList, err := data_manage_permission.GetUserChartClassifyPermissionList(this.SysUser.AdminId, 0)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+		return
+	}
+
 	nodeAll := make([]*data_manage.ChartClassifyItems, 0)
 	for k := range rootList {
 		rootNode := rootList[k]
-		data.ChartClassifyItemsMakeTree(this.SysUser, classifyAll, rootNode)
+		data.ChartClassifyItemsMakeTree(this.SysUser, classifyAll, rootNode, permissionClassifyIdList)
 		nodeAll = append(nodeAll, rootNode)
 	}
 
@@ -369,12 +378,19 @@ func (this *ChartClassifyController) AddChartClassify() {
 	classify.Sort = maxSort + 1
 	classify.Source = utils.CHART_SOURCE_DEFAULT
 
-	_, err = data_manage.AddChartClassify(classify)
+	classifyId, err := data_manage.AddChartClassify(classify)
 	if err != nil {
 		br.Msg = "保存分类失败"
 		br.ErrMsg = "保存分类失败,Err:" + err.Error()
 		return
 	}
+	classify.ChartClassifyId = int(classifyId)
+
+	// 继承分类权限
+	{
+		go data_manage_permission.InheritParentClassify(5, utils.CHART_SOURCE_DEFAULT, classify.ChartClassifyId, classify.ParentId, classify.ChartClassifyName)
+	}
+
 	br.Ret = 200
 	br.Msg = "保存成功"
 	br.Success = true
@@ -416,10 +432,18 @@ func (this *ChartClassifyController) EditChartClassify() {
 		br.Msg = "获取分类信息失败,Err:" + err.Error()
 		return
 	}
+	// 已授权分类id
+	permissionClassifyIdList, err := data_manage_permission.GetUserChartClassifyPermissionList(this.SysUser.AdminId, item.ChartClassifyId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+		return
+	}
+	haveOperaAuth := data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(item.IsJoinPermission, item.ChartClassifyId, permissionClassifyIdList)
 
 	// 权限校验
 	{
-		button := data.GetChartClassifyOpButton(this.SysUser, item.SysUserId)
+		button := data.GetChartClassifyOpButton(this.SysUser, item.SysUserId, haveOperaAuth)
 		if !button.OpButton {
 			br.Msg = "无操作权限"
 			br.IsSendEmail = false
@@ -488,9 +512,17 @@ func (this *ChartClassifyController) DeleteChartClassifyCheck() {
 			br.Msg = "获取分类信息失败,Err:" + err.Error()
 			return
 		}
+		// 已授权分类id
+		permissionClassifyIdList, err := data_manage_permission.GetUserChartClassifyPermissionList(this.SysUser.AdminId, item.ChartClassifyId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+			return
+		}
 		// 权限校验
 		{
-			button := data.GetChartClassifyOpButton(this.SysUser, item.SysUserId)
+			haveOperaAuth := data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(item.IsJoinPermission, item.ChartClassifyId, permissionClassifyIdList)
+			button := data.GetChartClassifyOpButton(this.SysUser, item.SysUserId, haveOperaAuth)
 			if !button.OpButton {
 				br.Msg = "无操作权限"
 				br.IsSendEmail = false
@@ -580,9 +612,18 @@ func (this *ChartClassifyController) DeleteChartClassify() {
 			br.Msg = "获取分类信息失败,Err:" + err.Error()
 			return
 		}
+		// 已授权分类id
+		permissionClassifyIdList, err := data_manage_permission.GetUserChartClassifyPermissionList(this.SysUser.AdminId, item.ChartClassifyId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+			return
+		}
+
 		// 权限校验
 		{
-			button := data.GetChartClassifyOpButton(this.SysUser, item.SysUserId)
+			haveOperaAuth := data_manage_permission.CheckChartClassifyPermissionByPermissionIdList(item.IsJoinPermission, item.ChartClassifyId, permissionClassifyIdList)
+			button := data.GetChartClassifyOpButton(this.SysUser, item.SysUserId, haveOperaAuth)
 			if !button.OpButton {
 				br.Msg = "无操作权限"
 				br.IsSendEmail = false
@@ -630,14 +671,34 @@ func (this *ChartClassifyController) DeleteChartClassify() {
 			br.Msg = "图表已删除,请刷新页面"
 			return
 		}
-		//图表操作权限
-		ok := data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
-		if !ok {
-			br.Msg = "没有该图表的操作权限"
-			br.ErrMsg = "没有该图表的操作权限"
+
+		chartClassifyItem, err := data_manage.GetChartClassifyById(chartInfo.ChartClassifyId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取图表分类详情数据失败,Err:" + err.Error()
 			return
 		}
 
+		// 已授权图表、分类id
+		permissionChartIdList, permissionClassifyIdList, err := data_manage_permission.GetUserChartAndClassifyPermissionList(this.SysUser.AdminId, chartInfo.ChartInfoId, chartInfo.ChartClassifyId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+			return
+		}
+
+		// 权限校验
+		{
+			haveOperaAuth := data_manage_permission.CheckChartPermissionByPermissionIdList(chartInfo.IsJoinPermission, chartClassifyItem.IsJoinPermission, chartInfo.ChartInfoId, chartInfo.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
+			//图表操作权限
+			ok := data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, haveOperaAuth)
+			if !ok {
+				br.Msg = "没有该图表的操作权限"
+				br.ErrMsg = "没有该图表的操作权限"
+				return
+			}
+		}
+
 		// 获取引用该图表的MyCharts, 用于ES删除
 		var myCond string
 		var myPars []interface{}
@@ -798,10 +859,18 @@ func (this *ChartClassifyController) ChartClassifyMove() {
 		br.Msg = "移动失败,分类名称已存在"
 		return
 	}
-
+	// 已授权分类id
+	permissionClassifyIdList, err := data_manage_permission.GetUserChartClassifyPermissionList(this.SysUser.AdminId, chartClassifyInfo.ChartClassifyId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+		return
+	}
 	// 权限校验
 	{
-		button := data.GetChartClassifyOpButton(this.SysUser, chartClassifyInfo.SysUserId)
+		haveOperaAuth := data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(chartClassifyInfo.IsJoinPermission, chartClassifyInfo.ChartClassifyId, permissionClassifyIdList)
+
+		button := data.GetChartClassifyOpButton(this.SysUser, chartClassifyInfo.SysUserId, haveOperaAuth)
 		if !button.OpButton {
 			br.Msg = "无操作权限"
 			br.IsSendEmail = false
@@ -988,7 +1057,7 @@ func (this *ChartClassifyController) ChartClassifyChartListV2() {
 			return
 		}
 		// 移除没有权限的图表
-		allNodes := data.HandleNoPermissionChart(allChartInfo, noPermissionChartIdMap)
+		allNodes := data.HandleNoPermissionChart(allChartInfo, noPermissionChartIdMap, this.SysUser.AdminId)
 		resp.AllNodes = allNodes
 
 		br.Ret = 200
@@ -1006,10 +1075,10 @@ func (this *ChartClassifyController) ChartClassifyChartListV2() {
 		return
 	}
 	// 移除没有权限的图表
-	allNodes := data.HandleNoPermissionChart(allChartInfo, noPermissionChartIdMap)
+	allNodes := data.HandleNoPermissionChart(allChartInfo, noPermissionChartIdMap, this.SysUser.AdminId)
 
 	for k, item := range allNodes {
-		item.Button = data.GetChartOpButton(this.SysUser, item.SysUserId)
+		item.Button = data.GetChartOpButton(this.SysUser, item.SysUserId, item.HaveOperaAuth)
 		item.Button.AddButton = false
 		item.Button.OpButton = false
 		item.Button.DeleteButton = false

+ 637 - 294
controllers/data_manage/chart_info.go

@@ -9,6 +9,7 @@ import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/services"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/data/data_manage_permission"
 	etaTrialService "eta/eta_api/services/eta_trial"
 	"eta/eta_api/utils"
 	"fmt"
@@ -601,6 +602,22 @@ func (this *ChartInfoController) ChartInfoMove() {
 		return
 	}
 
+	// 数据权限校验
+	{
+		haveOperaAuth, err := data_manage_permission.CheckChartPermissionByChartInfoId(chartInfo.ChartInfoId, chartInfo.ChartClassifyId, chartInfo.IsJoinPermission, sysUser.AdminId)
+		if err != nil {
+			br.Msg = "移动失败"
+			br.ErrMsg = "获取图表权限失败,Err:" + err.Error()
+			return
+		}
+		if !haveOperaAuth {
+			br.Msg = "无操作权限"
+			br.ErrMsg = "无操作权限"
+			br.IsSendEmail = false
+			return
+		}
+	}
+
 	//如果改变了分类,那么移动该图表数据
 	if chartInfo.ChartClassifyId != req.ChartClassifyId {
 		//查询需要修改的分类下是否存在同一个图表名称
@@ -772,6 +789,8 @@ func (this *ChartInfoController) ChartInfoDetail() {
 
 	var err error
 	chartInfo := new(data_manage.ChartInfoView)
+	chartInfo.HaveOperaAuth = true
+
 	if chartInfoId > 0 {
 		chartInfo, err = data_manage.GetChartInfoViewById(chartInfoId)
 		if err != nil {
@@ -796,8 +815,30 @@ func (this *ChartInfoController) ChartInfoDetail() {
 		}
 		chartInfo.ChartThemeStyle = chartTheme.Config
 		chartInfo.ChartThemeId = chartTheme.ChartThemeId
+
+		// 图表数据权限
+		{
+			// 图表分类
+			chartClassify, err := data_manage.GetChartClassifyById(chartInfo.ChartClassifyId)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取图表分类信息失败,Err:" + err.Error()
+				return
+			}
+
+			// 已授权分类id
+			permissionChartIdList, permissionClassifyIdList, err := data_manage_permission.GetUserChartAndClassifyPermissionList(this.SysUser.AdminId, chartInfo.ChartInfoId, chartInfo.ChartClassifyId)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+				return
+			}
+			chartInfo.HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(chartInfo.IsJoinPermission, chartClassify.IsJoinPermission, chartInfo.ChartInfoId, chartInfo.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
+		}
 	}
 
+	resp := new(data_manage.ChartInfoDetailResp)
+
 	mappingList := make([]*data_manage.ChartEdbInfoMapping, 0)
 	if chartInfoId > 0 {
 		mappingList, err = data_manage.GetChartEdbMappingList(chartInfoId)
@@ -854,72 +895,79 @@ func (this *ChartInfoController) ChartInfoDetail() {
 	// 开始/结束日期
 	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
 
-	// 获取图表中的指标数据
-	edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr, chartInfo.SeasonExtraConfig)
-	if err != nil {
-		br.Msg = "获取失败"
-		if errMsg != `` {
-			br.Msg = errMsg
+	if chartInfo.HaveOperaAuth {
+		// 获取图表中的指标数据
+		edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr, chartInfo.SeasonExtraConfig)
+		if err != nil {
+			br.Msg = "获取失败"
+			if errMsg != `` {
+				br.Msg = errMsg
+			}
+			br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
+			return
 		}
-		br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
-		return
-	}
-	// 单位
-	if chartType == utils.CHART_TYPE_BAR && len(yDataList) > 0 {
-		chartInfo.Unit = yDataList[0].Unit
-		chartInfo.UnitEn = yDataList[0].UnitEn
-	}
-	warnEdbList := make([]string, 0)
-	for _, v := range edbList {
-		if v.IsNullData {
-			warnEdbList = append(warnEdbList, v.EdbName+"("+v.EdbCode+")")
+		// 单位
+		if chartType == utils.CHART_TYPE_BAR && len(yDataList) > 0 {
+			chartInfo.Unit = yDataList[0].Unit
+			chartInfo.UnitEn = yDataList[0].UnitEn
 		}
-	}
-	if len(warnEdbList) > 0 {
-		chartInfo.WarnMsg = `图表引用指标异常,异常指标:` + strings.Join(warnEdbList, ",")
-	}
-	if chartInfoId > 0 && chartInfo != nil {
-		//判断是否加入我的图库
-		{
-			var myChartCondition string
-			var myChartPars []interface{}
-			myChartCondition += ` AND a.admin_id=? `
-			myChartPars = append(myChartPars, sysUser.AdminId)
-			myChartCondition += ` AND a.chart_info_id=? `
-			myChartPars = append(myChartPars, chartInfo.ChartInfoId)
-
-			myChartList, err := data_manage.GetMyChartByCondition(myChartCondition, myChartPars)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error()
-				return
-			}
-			if myChartList != nil && len(myChartList) > 0 {
-				chartInfo.IsAdd = true
-				chartInfo.MyChartId = myChartList[0].MyChartId
-				chartInfo.MyChartClassifyId = myChartList[0].MyChartClassifyId
+		warnEdbList := make([]string, 0)
+		for _, v := range edbList {
+			if v.IsNullData {
+				warnEdbList = append(warnEdbList, v.EdbName+"("+v.EdbCode+")")
 			}
 		}
-		if chartInfo.ChartType == 2 {
-			if chartInfo.SeasonStartDate != "" {
-				chartInfo.StartDate = chartInfo.SeasonStartDate
-				chartInfo.EndDate = chartInfo.SeasonEndDate
-				if chartInfo.DateType == 3 {
-					chartInfo.DateType = 5
+		if len(warnEdbList) > 0 {
+			chartInfo.WarnMsg = `图表引用指标异常,异常指标:` + strings.Join(warnEdbList, ",")
+		}
+		if chartInfoId > 0 && chartInfo != nil {
+			//判断是否加入我的图库
+			{
+				var myChartCondition string
+				var myChartPars []interface{}
+				myChartCondition += ` AND a.admin_id=? `
+				myChartPars = append(myChartPars, sysUser.AdminId)
+				myChartCondition += ` AND a.chart_info_id=? `
+				myChartPars = append(myChartPars, chartInfo.ChartInfoId)
+
+				myChartList, err := data_manage.GetMyChartByCondition(myChartCondition, myChartPars)
+				if err != nil && err.Error() != utils.ErrNoRow() {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error()
+					return
+				}
+				if myChartList != nil && len(myChartList) > 0 {
+					chartInfo.IsAdd = true
+					chartInfo.MyChartId = myChartList[0].MyChartId
+					chartInfo.MyChartClassifyId = myChartList[0].MyChartClassifyId
+				}
+			}
+			if chartInfo.ChartType == 2 {
+				if chartInfo.SeasonStartDate != "" {
+					chartInfo.StartDate = chartInfo.SeasonStartDate
+					chartInfo.EndDate = chartInfo.SeasonEndDate
+					if chartInfo.DateType == 3 {
+						chartInfo.DateType = 5
+					}
 				}
 			}
 		}
-	}
 
-	// 图表的指标来源
-	sourceNameList, sourceNameEnList := data.GetEdbSourceByEdbInfoIdList(edbList)
-	chartInfo.ChartSource = strings.Join(sourceNameList, ",")
-	chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
+		// 图表的指标来源
+		sourceNameList, sourceNameEnList := data.GetEdbSourceByEdbInfoIdList(edbList)
+		chartInfo.ChartSource = strings.Join(sourceNameList, ",")
+		chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
+		//判断是否需要展示英文标识
+		chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList, chartInfo.Source, chartInfo.ChartType)
+
+		resp.EdbInfoList = edbList
+		resp.XEdbIdValue = xEdbIdValue
+		resp.YDataList = yDataList
+		resp.DataResp = dataResp
+	}
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
-	//判断是否需要展示英文标识
-	chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList, chartInfo.Source, chartInfo.ChartType)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, chartInfo.HaveOperaAuth)
 	chartInfo.Button = data_manage.ChartViewButton{
 		IsEdit:    chartInfo.IsEdit,
 		IsEnChart: chartInfo.IsEnChart,
@@ -928,13 +976,8 @@ func (this *ChartInfoController) ChartInfoDetail() {
 		IsSetName: chartInfo.IsSetName,
 	}
 
-	resp := new(data_manage.ChartInfoDetailResp)
 	resp.ChartInfo = chartInfo
-	resp.EdbInfoList = edbList
-	resp.XEdbIdValue = xEdbIdValue
-	resp.YDataList = yDataList
 	resp.BarChartInfo = barConfig
-	resp.DataResp = dataResp
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -1104,7 +1147,7 @@ func (this *ChartInfoController) PreviewChartInfoDetail() {
 	}
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	//判断是否需要展示英文标识
 	chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList, chartInfo.Source, chartInfo.ChartType)
 	chartInfo.Button = data_manage.ChartViewButton{
@@ -1172,6 +1215,28 @@ func (this *ChartInfoController) ChartInfoDetailV2() {
 		return
 	}
 
+	resp := new(data_manage.ChartInfoDetailResp)
+
+	// 图表数据权限
+	{
+		// 图表分类
+		chartClassify, err := data_manage.GetChartClassifyById(chartInfo.ChartClassifyId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取图表分类信息失败,Err:" + err.Error()
+			return
+		}
+
+		// 已授权分类id
+		permissionChartIdList, permissionClassifyIdList, err := data_manage_permission.GetUserChartAndClassifyPermissionList(this.SysUser.AdminId, chartInfo.ChartInfoId, chartInfo.ChartClassifyId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+			return
+		}
+		chartInfo.HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(chartInfo.IsJoinPermission, chartClassify.IsJoinPermission, chartInfo.ChartInfoId, chartInfo.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
+	}
+
 	// 获取主题样式
 	chartTheme, err := data.GetChartThemeConfig(chartInfo.ChartThemeId, chartInfo.Source, chartInfo.ChartType)
 	if err != nil {
@@ -1262,58 +1327,110 @@ func (this *ChartInfoController) ChartInfoDetailV2() {
 		extraConfigStr = chartInfo.BarConfig
 	}
 
-	// 获取图表中的指标数据
-	edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr, chartInfo.SeasonExtraConfig)
-	if err != nil {
-		br.Msg = "获取失败"
-		if errMsg != `` {
-			br.Msg = errMsg
+	if chartInfo.HaveOperaAuth {
+		// 获取图表中的指标数据
+		edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr, chartInfo.SeasonExtraConfig)
+		if err != nil {
+			br.Msg = "获取失败"
+			if errMsg != `` {
+				br.Msg = errMsg
+			}
+			br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
+			return
 		}
-		br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
-		return
-	}
-	// 单位
-	if chartType == utils.CHART_TYPE_BAR && len(yDataList) > 0 {
-		chartInfo.Unit = yDataList[0].Unit
-		chartInfo.UnitEn = yDataList[0].UnitEn
-	}
-	warnEdbList := make([]string, 0)
-	for _, v := range edbList {
-		if v.IsNullData {
-			warnEdbList = append(warnEdbList, v.EdbName+"("+v.EdbCode+")")
+		// 单位
+		if chartType == utils.CHART_TYPE_BAR && len(yDataList) > 0 {
+			chartInfo.Unit = yDataList[0].Unit
+			chartInfo.UnitEn = yDataList[0].UnitEn
 		}
-	}
-	if len(warnEdbList) > 0 {
-		chartInfo.WarnMsg = `图表引用指标异常,异常指标:` + strings.Join(warnEdbList, ",")
-	}
-	if chartInfoId > 0 && chartInfo != nil {
-		//判断是否加入我的图库
+		warnEdbList := make([]string, 0)
+		for _, v := range edbList {
+			if v.IsNullData {
+				warnEdbList = append(warnEdbList, v.EdbName+"("+v.EdbCode+")")
+			}
+		}
+		if len(warnEdbList) > 0 {
+			chartInfo.WarnMsg = `图表引用指标异常,异常指标:` + strings.Join(warnEdbList, ",")
+		}
+		if chartInfoId > 0 && chartInfo != nil {
+			//判断是否加入我的图库
+			{
+				var myChartCondition string
+				var myChartPars []interface{}
+				myChartCondition += ` AND a.admin_id=? `
+				myChartPars = append(myChartPars, sysUser.AdminId)
+				myChartCondition += ` AND a.chart_info_id=? `
+				myChartPars = append(myChartPars, chartInfo.ChartInfoId)
+
+				myChartList, err := data_manage.GetMyChartByCondition(myChartCondition, myChartPars)
+				if err != nil && err.Error() != utils.ErrNoRow() {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error()
+					return
+				}
+				if myChartList != nil && len(myChartList) > 0 {
+					chartInfo.IsAdd = true
+					chartInfo.MyChartId = myChartList[0].MyChartId
+					chartInfo.MyChartClassifyId = myChartList[0].MyChartClassifyId
+				}
+			}
+		}
+		//判断是否需要展示英文标识
+		chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList, chartInfo.Source, chartInfo.ChartType)
+
+		// 图表的指标来源
+		sourceNameList, sourceNameEnList := data.GetEdbSourceByEdbInfoIdList(edbList)
+
+		chartInfo.ChartSource = strings.Join(sourceNameList, ",")
+		chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
+
+		// 指标权限
 		{
-			var myChartCondition string
-			var myChartPars []interface{}
-			myChartCondition += ` AND a.admin_id=? `
-			myChartPars = append(myChartPars, sysUser.AdminId)
-			myChartCondition += ` AND a.chart_info_id=? `
-			myChartPars = append(myChartPars, chartInfo.ChartInfoId)
-
-			myChartList, err := data_manage.GetMyChartByCondition(myChartCondition, myChartPars)
-			if err != nil && err.Error() != utils.ErrNoRow() {
+
+			classifyMap := make(map[int]*data_manage.EdbClassify)
+
+			// 分类
+			{
+				classifyIdList := make([]int, 0)
+				for _, v := range edbList {
+					classifyIdList = append(classifyIdList, v.ClassifyId)
+				}
+				classifyList, tmpErr := data_manage.GetEdbClassifyByIdList(classifyIdList)
+				if tmpErr != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取分类列表失败,Err:" + tmpErr.Error()
+					return
+				}
+				for _, v := range classifyList {
+					classifyMap[v.ClassifyId] = v
+				}
+			}
+			// 获取所有有权限的指标和分类
+			permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUser.AdminId, 0, 0)
+			if err != nil {
 				br.Msg = "获取失败"
-				br.ErrMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error()
+				br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
 				return
 			}
-			if myChartList != nil && len(myChartList) > 0 {
-				chartInfo.IsAdd = true
-				chartInfo.MyChartId = myChartList[0].MyChartId
-				chartInfo.MyChartClassifyId = myChartList[0].MyChartClassifyId
+
+			for _, item := range edbList {
+				// 数据权限
+				if currClassify, ok := classifyMap[item.ClassifyId]; ok {
+					item.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(item.IsJoinPermission, currClassify.IsJoinPermission, item.EdbInfoId, item.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+				}
 			}
 		}
+
+		resp.EdbInfoList = edbList
+		resp.XEdbIdValue = xEdbIdValue
+		resp.YDataList = yDataList
+		resp.DataResp = dataResp
+	} else {
+		resp.EdbInfoList = mappingList
 	}
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
-	//判断是否需要展示英文标识
-	chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList, chartInfo.Source, chartInfo.ChartType)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, chartInfo.HaveOperaAuth)
 	chartInfo.Button = data_manage.ChartViewButton{
 		IsEdit:    chartInfo.IsEdit,
 		IsEnChart: chartInfo.IsEnChart,
@@ -1322,18 +1439,8 @@ func (this *ChartInfoController) ChartInfoDetailV2() {
 		IsSetName: chartInfo.IsSetName,
 	}
 
-	// 图表的指标来源
-	sourceNameList, sourceNameEnList := data.GetEdbSourceByEdbInfoIdList(edbList)
-	chartInfo.ChartSource = strings.Join(sourceNameList, ",")
-	chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
-
-	resp := new(data_manage.ChartInfoDetailResp)
 	resp.ChartInfo = chartInfo
-	resp.EdbInfoList = edbList
-	resp.XEdbIdValue = xEdbIdValue
-	resp.YDataList = yDataList
 	resp.BarChartInfo = barConfig
-	resp.DataResp = dataResp
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -1635,7 +1742,7 @@ func (this *ChartInfoController) ChartInfoSearch() {
 		return
 	}
 	keyWord := this.GetString("KeyWord")
-	searchList := make([]*data_manage.ChartInfo, 0)
+	searchList := make([]data_manage.ChartInfoMore, 0)
 	//var err error
 	//if KeyWord == "" {
 	//	searchList, err = data_manage.ChartInfoSearchByKeyWord(KeyWord)
@@ -1676,15 +1783,55 @@ func (this *ChartInfoController) ChartInfoSearch() {
 		}
 		for _, nv := range newSearchList {
 			if _, ok := existMap[nv.ChartInfoId]; !ok {
-				searchList = append(searchList, nv)
+				searchList = append(searchList, data_manage.ChartInfoMore{
+					ChartInfo: *nv,
+				})
 			}
 			existMap[nv.ChartInfoId] = nv.ChartName
 		}
 	}
 
 	if searchList == nil {
-		searchList = make([]*data_manage.ChartInfo, 0)
+		searchList = make([]data_manage.ChartInfoMore, 0)
+	}
+
+	// 数据权限
+	if len(searchList) > 0 {
+		// 涉及分类id
+		classifyIdList := make([]int, 0)
+		for _, v := range searchList {
+			classifyIdList = append(classifyIdList, v.ChartClassifyId)
+		}
+
+		// 图表分类
+		chartClassifyList, err := data_manage.GetChartClassifyByIdList(classifyIdList)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取图表分类失败,Err:" + err.Error()
+			return
+		}
+
+		chartClassifyMap := make(map[int]*data_manage.ChartClassify)
+		for _, v := range chartClassifyList {
+			chartClassifyMap[v.ChartClassifyId] = v
+		}
+
+		// 已授权图表和分类id
+		permissionChartIdList, permissionClassifyIdList, err := data_manage_permission.GetUserChartAndClassifyPermissionList(sysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "已授权图表和分类id失败,Err:" + err.Error()
+			return
+		}
+
+		// 权限判断
+		for k, v := range searchList {
+			if currClassify, ok := chartClassifyMap[v.ChartClassifyId]; ok {
+				searchList[k].HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(v.IsJoinPermission, currClassify.IsJoinPermission, v.ChartInfoId, v.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
+			}
+		}
 	}
+
 	//新增搜索词记录
 	{
 		searchKeyword := new(data_manage.SearchKeyword)
@@ -1759,8 +1906,11 @@ func (this *ChartInfoController) ChartInfoSearchByEs() {
 		}
 	}
 
+	// 是否走ES
+	isEs := false
 	if keyword != "" {
 		searchList, total, err = data.EsSearchChartInfo(keyword, showSysId, []int{utils.CHART_SOURCE_DEFAULT}, noPermissionChartIdList, startSize, pageSize)
+		isEs = true
 	} else {
 		total, searchList, err = data_manage.ChartInfoSearchByEmptyKeyWord(showSysId, []int{utils.CHART_SOURCE_DEFAULT}, noPermissionChartIdList, startSize, pageSize)
 		if err != nil && err.Error() != utils.ErrNoRow() {
@@ -1772,10 +1922,18 @@ func (this *ChartInfoController) ChartInfoSearchByEs() {
 
 	finalList := make([]*data_manage.ChartInfoMore, 0)
 	if len(searchList) > 0 {
+		// 涉及分类id
+		classifyIdList := make([]int, 0)
+		// 图表id
+		chartInfoIdList := make([]int, 0)
+
 		chartInfoIds := ""
 		chartEdbMap := make(map[int][]*data_manage.ChartEdbInfoMapping)
+
 		for _, v := range searchList {
 			chartInfoIds += strconv.Itoa(v.ChartInfoId) + ","
+			classifyIdList = append(classifyIdList, v.ChartClassifyId)
+			chartInfoIdList = append(chartInfoIdList, v.ChartInfoId)
 		}
 		if chartInfoIds != "" {
 			chartInfoIds = strings.Trim(chartInfoIds, ",")
@@ -1790,6 +1948,51 @@ func (this *ChartInfoController) ChartInfoSearchByEs() {
 				chartEdbMap[v.ChartInfoId] = append(chartEdbMap[v.ChartInfoId], v)
 			}
 		}
+		// 当前列表中的分类map
+		chartClassifyMap := make(map[int]*data_manage.ChartClassify)
+
+		// 图表分类
+		{
+			chartClassifyList, err := data_manage.GetChartClassifyByIdList(classifyIdList)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取图表分类失败,Err:" + err.Error()
+				return
+			}
+			for _, v := range chartClassifyList {
+				chartClassifyMap[v.ChartClassifyId] = v
+			}
+		}
+		// 图表
+		if isEs {
+			// 当前列表中的图表map
+			chartInfoMap := make(map[int]*data_manage.ChartInfo)
+			tmpChartList, err := data_manage.GetChartInfoByIdList(chartInfoIdList)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取所有有权限的图表失败,Err:" + err.Error()
+				return
+			}
+			for _, tmpChartInfo := range tmpChartList {
+				chartInfoMap[tmpChartInfo.ChartInfoId] = tmpChartInfo
+			}
+			for _, v := range searchList {
+				// 图表权限
+				chartViewInfo, ok := chartInfoMap[v.ChartInfoId]
+				if !ok {
+					continue
+				}
+				v.IsJoinPermission = chartViewInfo.IsJoinPermission
+			}
+		}
+
+		// 已授权图表和分类id
+		permissionChartIdList, permissionClassifyIdList, err := data_manage_permission.GetUserChartAndClassifyPermissionList(sysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "已授权图表和分类id失败,Err:" + err.Error()
+			return
+		}
 
 		for _, v := range searchList {
 			tmp := new(data_manage.ChartInfoMore)
@@ -1798,6 +2001,12 @@ func (this *ChartInfoController) ChartInfoSearchByEs() {
 			if edbTmpList, ok := chartEdbMap[v.ChartInfoId]; ok {
 				tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, edbTmpList, v.Source, v.ChartType)
 			}
+
+			// 图表权限
+			if currClassify, ok := chartClassifyMap[v.ChartClassifyId]; ok {
+				tmp.HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(v.IsJoinPermission, currClassify.IsJoinPermission, v.ChartInfoId, v.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
+			}
+
 			finalList = append(finalList, tmp)
 		}
 	}
@@ -2012,41 +2221,170 @@ func (this *ChartInfoController) ChartInfoDetailFromUniqueCode() {
 func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCache bool, sysUser *system.Admin) (resp *data_manage.ChartInfoDetailFromUniqueCodeResp, isOk bool, msg, errMsg string) {
 	resp = new(data_manage.ChartInfoDetailFromUniqueCodeResp)
 
+	msg = `获取失败`
 	adminId := sysUser.AdminId
 
+	// 图表数据权限
+	// 图表分类
+	chartClassify, err := data_manage.GetChartClassifyById(chartInfo.ChartClassifyId)
+	if err != nil {
+		errMsg = "获取图表分类信息失败,Err:" + err.Error()
+		return
+	}
+
+	// 已授权分类id
+	permissionChartIdList, permissionClassifyIdList, err := data_manage_permission.GetUserChartAndClassifyPermissionList(adminId, chartInfo.ChartInfoId, chartInfo.ChartClassifyId)
+	if err != nil {
+		errMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+		return
+	}
+
+	// 指标数据map
+	edbClassifyPermissionMap := make(map[int]data_manage_permission.EdbClassifyPermission)
+	defer func() {
+		if isOk {
+
+			// 图表权限校验
+			{
+				resp.ChartInfo.HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(chartInfo.IsJoinPermission, chartClassify.IsJoinPermission, chartInfo.ChartInfoId, chartInfo.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
+
+				//图表操作权限
+				chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, resp.ChartInfo.HaveOperaAuth)
+				chartInfo.Button = data_manage.ChartViewButton{
+					IsEdit:    chartInfo.IsEdit,
+					IsEnChart: chartInfo.IsEnChart,
+					IsAdd:     chartInfo.IsAdd,
+					IsCopy:    true,
+					IsSetName: chartInfo.IsSetName,
+				}
+
+				//if !resp.ChartInfo.HaveOperaAuth {
+				//	for _, v := range resp.EdbInfoList {
+				//		v.DataList = nil
+				//	}
+				//	resp.DataResp = nil
+				//	resp.XEdbIdValue = []int{}
+				//	resp.YDataList = []data_manage.YData{}
+				//}
+			}
+
+			// 指标权限
+			{
+				classifyMap := make(map[int]*data_manage.EdbClassify)
+				// 分类
+				{
+					classifyIdList := make([]int, 0)
+					for _, v := range resp.EdbInfoList {
+						classifyIdList = append(classifyIdList, v.ClassifyId)
+					}
+					classifyList, tmpErr := data_manage.GetEdbClassifyByIdList(classifyIdList)
+					if tmpErr != nil {
+						errMsg = "获取分类列表失败,Err:" + tmpErr.Error()
+						return
+					}
+					for _, v := range classifyList {
+						classifyMap[v.ClassifyId] = v
+					}
+				}
+
+				// 指标
+				if len(edbClassifyPermissionMap) < 0 {
+					edbInfoIdList := make([]int, 0)
+					for _, v := range resp.EdbInfoList {
+						edbInfoIdList = append(edbInfoIdList, v.EdbInfoId)
+					}
+					edbInfoList, tmpErr := data_manage.GetEdbInfoByIdList(edbInfoIdList)
+					if tmpErr != nil {
+						errMsg = "获取指标列表失败,Err:" + tmpErr.Error()
+						return
+					}
+					for _, v := range edbInfoList {
+						edbClassifyPermissionMap[v.EdbInfoId] = data_manage_permission.EdbClassifyPermission{
+							ClassifyId:       v.ClassifyId,
+							IsJoinPermission: v.IsJoinPermission,
+							EdbInfoId:        v.EdbInfoId,
+						}
+					}
+				}
+
+				// 获取所有有权限的指标和分类
+				permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUser.AdminId, 0, 0)
+				if err != nil {
+					errMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+					return
+				}
+
+				for _, v := range resp.EdbInfoList {
+					// 数据权限
+					edbItem, ok := edbClassifyPermissionMap[v.EdbInfoId]
+					if !ok {
+						continue
+					}
+
+					if currClassify, ok := classifyMap[edbItem.ClassifyId]; ok {
+						v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(edbItem.IsJoinPermission, currClassify.IsJoinPermission, edbItem.EdbInfoId, edbItem.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+					}
+				}
+			}
+		}
+	}()
+
 	//判断是否存在缓存,如果存在缓存,那么直接从缓存中获取
 	key := data.GetChartInfoDataKey(chartInfo.ChartInfoId)
 	if utils.Re == nil && isCache {
 		if utils.Re == nil && utils.Rc.IsExist(key) {
-			if data, err1 := utils.Rc.RedisBytes(key); err1 == nil {
-				err := json.Unmarshal(data, &resp)
-				if err == nil && resp != nil {
-					// 这里跟当前用户相关的信息重新查询写入resp, 不使用缓存中的
-					var myCond string
-					var myPars []interface{}
-					myCond += ` AND a.admin_id=? `
-					myPars = append(myPars, adminId)
-					myCond += ` AND a.chart_info_id=? `
-					myPars = append(myPars, chartInfo.ChartInfoId)
-					myList, err := data_manage.GetMyChartByCondition(myCond, myPars)
+			if redisData, err1 := utils.Rc.RedisBytes(key); err1 == nil {
+				err := json.Unmarshal(redisData, &resp)
+				if err != nil || resp == nil {
+					return
+				}
+				// 这里跟当前用户相关的信息重新查询写入resp, 不使用缓存中的
+				var myCond string
+				var myPars []interface{}
+				myCond += ` AND a.admin_id=? `
+				myPars = append(myPars, adminId)
+				myCond += ` AND a.chart_info_id=? `
+				myPars = append(myPars, chartInfo.ChartInfoId)
+				myList, err := data_manage.GetMyChartByCondition(myCond, myPars)
+				if err != nil && err.Error() != utils.ErrNoRow() {
+					msg = "获取失败"
+					errMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error()
+					return
+				}
+				resp.ChartInfo.IsAdd = false
+				resp.ChartInfo.MyChartId = 0
+				resp.ChartInfo.MyChartClassifyId = ""
+				if myList != nil && len(myList) > 0 {
+					resp.ChartInfo.IsAdd = true
+					resp.ChartInfo.MyChartId = myList[0].MyChartId
+					resp.ChartInfo.MyChartClassifyId = myList[0].MyChartClassifyId
+				}
+
+				//判断是否加入我的图库
+				{
+					var myChartCondition string
+					var myChartPars []interface{}
+					myChartCondition += ` AND a.admin_id=? `
+					myChartPars = append(myChartPars, adminId)
+					myChartCondition += ` AND a.chart_info_id=? `
+					myChartPars = append(myChartPars, chartInfo.ChartInfoId)
+
+					myChartList, err := data_manage.GetMyChartByCondition(myChartCondition, myChartPars)
 					if err != nil && err.Error() != utils.ErrNoRow() {
 						msg = "获取失败"
 						errMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error()
 						return
 					}
-					resp.ChartInfo.IsAdd = false
-					resp.ChartInfo.MyChartId = 0
-					resp.ChartInfo.MyChartClassifyId = ""
-					if myList != nil && len(myList) > 0 {
-						resp.ChartInfo.IsAdd = true
-						resp.ChartInfo.MyChartId = myList[0].MyChartId
-						resp.ChartInfo.MyChartClassifyId = myList[0].MyChartClassifyId
+					if myChartList != nil && len(myChartList) > 0 {
+						chartInfo.IsAdd = true
+						chartInfo.MyChartId = myChartList[0].MyChartId
+						chartInfo.MyChartClassifyId = myChartList[0].MyChartClassifyId
 					}
-
-					isOk = true
-					fmt.Println("source redis")
-					return
 				}
+
+				isOk = true
+				fmt.Println("source redis")
+				return
 			}
 		}
 	}
@@ -2150,46 +2488,15 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 		ChartClassify     []*ChartClassifyView
 	*/
 
-	chartClassify, _ := data_manage.GetChartClassifyViewById(chartInfo.ChartClassifyId)
-	if chartClassify != nil {
+	chartViewClassify, _ := data_manage.GetChartClassifyViewById(chartInfo.ChartClassifyId)
+	if chartViewClassify != nil {
 		chartClassifyParent, _ := data_manage.GetChartClassifyViewById(chartClassify.ParentId)
 		chartInfo.ChartClassify = append(chartInfo.ChartClassify, chartClassifyParent)
 	}
-	chartInfo.ChartClassify = append(chartInfo.ChartClassify, chartClassify)
+	chartInfo.ChartClassify = append(chartInfo.ChartClassify, chartViewClassify)
 	resp.EdbInfoList = edbList
 	//判断是否需要展示英文标识
 	chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList, chartInfo.Source, chartInfo.ChartType)
-	//判断是否加入我的图库
-	{
-		var myChartCondition string
-		var myChartPars []interface{}
-		myChartCondition += ` AND a.admin_id=? `
-		myChartPars = append(myChartPars, adminId)
-		myChartCondition += ` AND a.chart_info_id=? `
-		myChartPars = append(myChartPars, chartInfo.ChartInfoId)
-
-		myChartList, err := data_manage.GetMyChartByCondition(myChartCondition, myChartPars)
-		if err != nil && err.Error() != utils.ErrNoRow() {
-			msg = "获取失败"
-			errMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error()
-			return
-		}
-		if myChartList != nil && len(myChartList) > 0 {
-			chartInfo.IsAdd = true
-			chartInfo.MyChartId = myChartList[0].MyChartId
-			chartInfo.MyChartClassifyId = myChartList[0].MyChartClassifyId
-		}
-	}
-
-	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
-	chartInfo.Button = data_manage.ChartViewButton{
-		IsEdit:    chartInfo.IsEdit,
-		IsEnChart: chartInfo.IsEnChart,
-		IsAdd:     chartInfo.IsAdd,
-		IsCopy:    true,
-		IsSetName: chartInfo.IsSetName,
-	}
 
 	// 图表的指标来源
 	sourceNameList, sourceNameEnList := data.GetEdbSourceByEdbInfoIdList(edbList)
@@ -2210,6 +2517,15 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	}
 	isOk = true
 
+	// 遍历到校验map
+	for _, v := range edbList {
+		edbClassifyPermissionMap[v.EdbInfoId] = data_manage_permission.EdbClassifyPermission{
+			ClassifyId:       v.ClassifyId,
+			IsJoinPermission: v.IsJoinPermission,
+			EdbInfoId:        v.EdbInfoId,
+		}
+	}
+
 	return
 }
 
@@ -2748,7 +3064,7 @@ func (this *ChartInfoController) PreviewBarChartInfo() {
 	chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	//判断是否需要展示英文标识
 	chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList, chartInfo.Source, chartInfo.ChartType)
 	chartInfo.Button = data_manage.ChartViewButton{
@@ -2838,7 +3154,7 @@ func (this *ChartInfoController) PreviewSectionScatterChartInfo() {
 	chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	//判断是否需要展示英文标识
 	chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList, utils.CHART_SOURCE_DEFAULT, chartType)
 	chartInfo.Button = data_manage.ChartViewButton{
@@ -3247,7 +3563,7 @@ func (this *ChartInfoController) PreviewRadarChartInfo() {
 	}
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	//判断是否需要展示英文标识
 	chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList, utils.CHART_SOURCE_DEFAULT, chartType)
 	chartInfo.Button = data_manage.ChartViewButton{
@@ -3327,8 +3643,12 @@ func (this *ChartInfoController) ChartInfoConvertDetail() {
 	convertUnit := this.GetString("ConvertUnit")
 	convertEnUnit := this.GetString("ConvertEnUnit")
 
+	resp := new(data_manage.ChartInfoDetailResp)
 	var err error
 	chartInfo := new(data_manage.ChartInfoView)
+	chartInfo.HaveOperaAuth = true
+
+	// 通过id获取详情
 	if chartInfoId > 0 {
 		chartInfo, err = data_manage.GetChartInfoViewById(chartInfoId)
 		if err != nil {
@@ -3353,154 +3673,177 @@ func (this *ChartInfoController) ChartInfoConvertDetail() {
 		}
 		chartInfo.ChartThemeStyle = chartTheme.Config
 		chartInfo.ChartThemeId = chartTheme.ChartThemeId
-	}
 
-	mappingList := make([]*data_manage.ChartEdbInfoMapping, 0)
-	if chartInfoId > 0 {
-		mappingList, err = data_manage.GetChartEdbMappingList(chartInfoId)
-		if err != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
-			return
-		}
-	} else {
-		if edbInfoId != "" {
-			mappingList, err = data_manage.GetChartEdbMappingListByEdbInfoId(edbInfoId)
+		// 图表数据权限
+		{
+			// 图表分类
+			chartClassify, err := data_manage.GetChartClassifyById(chartInfo.ChartClassifyId)
 			if err != nil {
 				br.Msg = "获取失败"
-				br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
+				br.ErrMsg = "获取图表分类信息失败,Err:" + err.Error()
 				return
 			}
-			if isConvert == 1 && len(mappingList) > 0 {
-				for i, _ := range mappingList {
-					mappingList[i].IsConvert = 1
-					mappingList[i].ConvertType = convertType
-					mappingList[i].ConvertValue = convertValue
-					mappingList[i].ConvertUnit = convertUnit
-					mappingList[i].ConvertEnUnit = convertEnUnit
-				}
+
+			// 已授权分类id
+			permissionChartIdList, permissionClassifyIdList, err := data_manage_permission.GetUserChartAndClassifyPermissionList(this.SysUser.AdminId, chartInfo.ChartInfoId, chartInfo.ChartClassifyId)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+				return
 			}
+			chartInfo.HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(chartInfo.IsJoinPermission, chartClassify.IsJoinPermission, chartInfo.ChartInfoId, chartInfo.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
 		}
-	}
 
-	// 图表额外数据参数
-	extraConfigStr := chartInfo.ExtraConfig
-	// 柱方图的一些配置
-	var barConfig data_manage.BarChartInfoReq
-	if chartInfo != nil && chartInfo.ChartType == 7 {
-		if chartInfo.BarConfig == `` {
-			br.Msg = "柱方图未配置"
-			br.ErrMsg = "柱方图未配置"
-			return
+		//图表操作权限
+		chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, chartInfo.HaveOperaAuth)
+		chartInfo.Button = data_manage.ChartViewButton{
+			IsEdit:    chartInfo.IsEdit,
+			IsEnChart: chartInfo.IsEnChart,
+			IsAdd:     chartInfo.IsAdd,
+			IsCopy:    true,
+			IsSetName: chartInfo.IsSetName,
 		}
-		err := json.Unmarshal([]byte(chartInfo.BarConfig), &barConfig)
-		if err != nil {
-			br.Msg = "柱方图配置异常"
-			br.ErrMsg = "柱方图配置异常"
-			return
-		}
-		extraConfigStr = chartInfo.BarConfig
 	}
-	yearMax := 0
-	if dateType == utils.DateTypeNYears {
-		for _, v := range mappingList {
-			if v.LatestDate != "" {
-				lastDateT, tErr := time.Parse(utils.FormatDate, v.LatestDate)
-				if tErr != nil {
+
+	// 有数据权限的话,获取图表的数据
+	if chartInfo.HaveOperaAuth {
+		mappingList := make([]*data_manage.ChartEdbInfoMapping, 0)
+		if chartInfoId > 0 {
+			mappingList, err = data_manage.GetChartEdbMappingList(chartInfoId)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
+				return
+			}
+		} else {
+			if edbInfoId != "" {
+				mappingList, err = data_manage.GetChartEdbMappingListByEdbInfoId(edbInfoId)
+				if err != nil {
 					br.Msg = "获取失败"
-					br.ErrMsg = "获取图表日期信息失败,Err:" + tErr.Error()
+					br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
 					return
 				}
-				if lastDateT.Year() > yearMax {
-					yearMax = lastDateT.Year()
+				if isConvert == 1 && len(mappingList) > 0 {
+					for i, _ := range mappingList {
+						mappingList[i].IsConvert = 1
+						mappingList[i].ConvertType = convertType
+						mappingList[i].ConvertValue = convertValue
+						mappingList[i].ConvertUnit = convertUnit
+						mappingList[i].ConvertEnUnit = convertEnUnit
+					}
 				}
 			}
 		}
-	}
-	// 开始/结束日期
-	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
 
-	// 获取图表中的指标数据
-	edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartConvertEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr, chartInfo.SeasonExtraConfig)
-	if err != nil {
-		br.Msg = "获取失败"
-		if errMsg != `` {
-			br.Msg = errMsg
-		}
-		br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
-		return
-	}
-	// 单位
-	if chartType == utils.CHART_TYPE_BAR && len(yDataList) > 0 {
-		chartInfo.Unit = yDataList[0].Unit
-		chartInfo.UnitEn = yDataList[0].UnitEn
-	}
-	warnEdbList := make([]string, 0)
-	for _, v := range edbList {
-		if v.IsNullData {
-			warnEdbList = append(warnEdbList, v.EdbName+"("+v.EdbCode+")")
-		}
-	}
-	if len(warnEdbList) > 0 {
-		chartInfo.WarnMsg = `图表引用指标异常,异常指标:` + strings.Join(warnEdbList, ",")
-	}
-	if chartInfoId > 0 && chartInfo != nil {
-		//判断是否加入我的图库
-		{
-			var myChartCondition string
-			var myChartPars []interface{}
-			myChartCondition += ` AND a.admin_id=? `
-			myChartPars = append(myChartPars, sysUser.AdminId)
-			myChartCondition += ` AND a.chart_info_id=? `
-			myChartPars = append(myChartPars, chartInfo.ChartInfoId)
-
-			myChartList, err := data_manage.GetMyChartByCondition(myChartCondition, myChartPars)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error()
+		// 图表额外数据参数
+		extraConfigStr := chartInfo.ExtraConfig
+		// 柱方图的一些配置
+		var barConfig data_manage.BarChartInfoReq
+		if chartInfo != nil && chartInfo.ChartType == 7 {
+			if chartInfo.BarConfig == `` {
+				br.Msg = "柱方图未配置"
+				br.ErrMsg = "柱方图未配置"
 				return
 			}
-			if myChartList != nil && len(myChartList) > 0 {
-				chartInfo.IsAdd = true
-				chartInfo.MyChartId = myChartList[0].MyChartId
-				chartInfo.MyChartClassifyId = myChartList[0].MyChartClassifyId
+			err := json.Unmarshal([]byte(chartInfo.BarConfig), &barConfig)
+			if err != nil {
+				br.Msg = "柱方图配置异常"
+				br.ErrMsg = "柱方图配置异常"
+				return
+			}
+			extraConfigStr = chartInfo.BarConfig
+		}
+		yearMax := 0
+		if dateType == utils.DateTypeNYears {
+			for _, v := range mappingList {
+				if v.LatestDate != "" {
+					lastDateT, tErr := time.Parse(utils.FormatDate, v.LatestDate)
+					if tErr != nil {
+						br.Msg = "获取失败"
+						br.ErrMsg = "获取图表日期信息失败,Err:" + tErr.Error()
+						return
+					}
+					if lastDateT.Year() > yearMax {
+						yearMax = lastDateT.Year()
+					}
+				}
 			}
 		}
-		if chartInfo.ChartType == 2 {
-			if chartInfo.SeasonStartDate != "" {
-				chartInfo.StartDate = chartInfo.SeasonStartDate
-				chartInfo.EndDate = chartInfo.SeasonEndDate
-				if chartInfo.DateType == 3 {
-					chartInfo.DateType = 5
+		// 开始/结束日期
+		startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
+
+		// 获取图表中的指标数据
+		edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartConvertEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr, chartInfo.SeasonExtraConfig)
+		if err != nil {
+			br.Msg = "获取失败"
+			if errMsg != `` {
+				br.Msg = errMsg
+			}
+			br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
+			return
+		}
+		// 单位
+		if chartType == utils.CHART_TYPE_BAR && len(yDataList) > 0 {
+			chartInfo.Unit = yDataList[0].Unit
+			chartInfo.UnitEn = yDataList[0].UnitEn
+		}
+		warnEdbList := make([]string, 0)
+		for _, v := range edbList {
+			if v.IsNullData {
+				warnEdbList = append(warnEdbList, v.EdbName+"("+v.EdbCode+")")
+			}
+		}
+		if len(warnEdbList) > 0 {
+			chartInfo.WarnMsg = `图表引用指标异常,异常指标:` + strings.Join(warnEdbList, ",")
+		}
+		if chartInfoId > 0 && chartInfo != nil {
+			//判断是否加入我的图库
+			{
+				var myChartCondition string
+				var myChartPars []interface{}
+				myChartCondition += ` AND a.admin_id=? `
+				myChartPars = append(myChartPars, sysUser.AdminId)
+				myChartCondition += ` AND a.chart_info_id=? `
+				myChartPars = append(myChartPars, chartInfo.ChartInfoId)
+
+				myChartList, err := data_manage.GetMyChartByCondition(myChartCondition, myChartPars)
+				if err != nil && err.Error() != utils.ErrNoRow() {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error()
+					return
+				}
+				if myChartList != nil && len(myChartList) > 0 {
+					chartInfo.IsAdd = true
+					chartInfo.MyChartId = myChartList[0].MyChartId
+					chartInfo.MyChartClassifyId = myChartList[0].MyChartClassifyId
+				}
+			}
+			if chartInfo.ChartType == 2 {
+				if chartInfo.SeasonStartDate != "" {
+					chartInfo.StartDate = chartInfo.SeasonStartDate
+					chartInfo.EndDate = chartInfo.SeasonEndDate
+					if chartInfo.DateType == 3 {
+						chartInfo.DateType = 5
+					}
 				}
 			}
 		}
-	}
 
-	// 图表的指标来源
-	sourceNameList, sourceNameEnList := data.GetEdbSourceByEdbInfoIdList(edbList)
-	chartInfo.ChartSource = strings.Join(sourceNameList, ",")
-	chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
+		// 图表的指标来源
+		sourceNameList, sourceNameEnList := data.GetEdbSourceByEdbInfoIdList(edbList)
+		chartInfo.ChartSource = strings.Join(sourceNameList, ",")
+		chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
+		//判断是否需要展示英文标识
+		chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList, chartInfo.Source, chartInfo.ChartType)
 
-	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
-	//判断是否需要展示英文标识
-	chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList, chartInfo.Source, chartInfo.ChartType)
-	chartInfo.Button = data_manage.ChartViewButton{
-		IsEdit:    chartInfo.IsEdit,
-		IsEnChart: chartInfo.IsEnChart,
-		IsAdd:     chartInfo.IsAdd,
-		IsCopy:    true,
-		IsSetName: chartInfo.IsSetName,
+		resp.EdbInfoList = edbList
+		resp.XEdbIdValue = xEdbIdValue
+		resp.YDataList = yDataList
+		resp.DataResp = dataResp
+		resp.BarChartInfo = barConfig
 	}
 
-	resp := new(data_manage.ChartInfoDetailResp)
 	resp.ChartInfo = chartInfo
-	resp.EdbInfoList = edbList
-	resp.XEdbIdValue = xEdbIdValue
-	resp.YDataList = yDataList
-	resp.BarChartInfo = barConfig
-	resp.DataResp = dataResp
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"

+ 2 - 2
controllers/data_manage/correlation/correlation_chart_classify.go

@@ -104,7 +104,7 @@ func (this *CorrelationChartClassifyController) ChartClassifyList() {
 	}
 
 	// 移除没有权限的图表
-	allNodes := data.HandleNoPermissionChart(rootList, noPermissionChartIdMap)
+	allNodes := data.HandleNoPermissionChart(rootList, noPermissionChartIdMap, this.SysUser.AdminId)
 	resp.AllNodes = allNodes
 
 	br.Ret = 200
@@ -475,7 +475,7 @@ func (this *CorrelationChartClassifyController) DeleteChartClassify() {
 			return
 		}
 		//图表操作权限
-		ok := data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+		ok := data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 		if !ok {
 			br.Msg = "没有该图表的操作权限"
 			br.ErrMsg = "没有该图表的操作权限"

+ 132 - 2
controllers/data_manage/correlation/correlation_chart_info.go

@@ -9,6 +9,7 @@ import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
 	correlationServ "eta/eta_api/services/data/correlation"
+	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
@@ -777,7 +778,7 @@ func (this *CorrelationChartInfoController) Detail() {
 	}
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	//判断是否需要展示英文标识
 	chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList[0:1], chartInfo.Source, chartInfo.ChartType)
 	chartInfo.UnitEn = edbInfoMappingA.UnitEn
@@ -800,6 +801,57 @@ func (this *CorrelationChartInfoController) Detail() {
 		IsSetName: chartInfo.IsSetName,
 	}
 
+	// 指标权限
+	{
+		edbClassifyPermissionMap := make(map[int]data_manage_permission.EdbClassifyPermission)
+		classifyMap := make(map[int]*data_manage.EdbClassify)
+		// 分类
+		{
+			classifyIdList := make([]int, 0)
+			for _, v := range edbList {
+				classifyIdList = append(classifyIdList, v.ClassifyId)
+			}
+			classifyList, tmpErr := data_manage.GetEdbClassifyByIdList(classifyIdList)
+			if tmpErr != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取分类列表失败,Err:" + tmpErr.Error()
+				return
+			}
+			for _, v := range classifyList {
+				classifyMap[v.ClassifyId] = v
+			}
+		}
+
+		// 遍历到校验map
+		for _, v := range edbList {
+			edbClassifyPermissionMap[v.EdbInfoId] = data_manage_permission.EdbClassifyPermission{
+				ClassifyId:       v.ClassifyId,
+				IsJoinPermission: v.IsJoinPermission,
+				EdbInfoId:        v.EdbInfoId,
+			}
+		}
+
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range edbList {
+			// 数据权限
+			edbItem, ok := edbClassifyPermissionMap[v.EdbInfoId]
+			if !ok {
+				continue
+			}
+
+			if currClassify, ok := classifyMap[edbItem.ClassifyId]; ok {
+				v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(edbItem.IsJoinPermission, currClassify.IsJoinPermission, edbItem.EdbInfoId, edbItem.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			}
+		}
+	}
+
 	resp := new(data_manage.ChartInfoDetailResp)
 	resp.ChartInfo = chartInfo
 	resp.EdbInfoList = edbList
@@ -1127,6 +1179,73 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 
 	adminId := sysUser.AdminId
 
+	// 指标数据map
+	edbClassifyPermissionMap := make(map[int]data_manage_permission.EdbClassifyPermission)
+	defer func() {
+		if isOk {
+			resp.ChartInfo.HaveOperaAuth = true
+
+			// 指标权限
+			{
+				classifyMap := make(map[int]*data_manage.EdbClassify)
+				// 分类
+				{
+					classifyIdList := make([]int, 0)
+					for _, v := range resp.EdbInfoList {
+						classifyIdList = append(classifyIdList, v.ClassifyId)
+					}
+					classifyList, tmpErr := data_manage.GetEdbClassifyByIdList(classifyIdList)
+					if tmpErr != nil {
+						errMsg = "获取分类列表失败,Err:" + tmpErr.Error()
+						return
+					}
+					for _, v := range classifyList {
+						classifyMap[v.ClassifyId] = v
+					}
+				}
+
+				// 指标
+				if len(edbClassifyPermissionMap) < 0 {
+					edbInfoIdList := make([]int, 0)
+					for _, v := range resp.EdbInfoList {
+						edbInfoIdList = append(edbInfoIdList, v.EdbInfoId)
+					}
+					edbInfoList, tmpErr := data_manage.GetEdbInfoByIdList(edbInfoIdList)
+					if tmpErr != nil {
+						errMsg = "获取指标列表失败,Err:" + tmpErr.Error()
+						return
+					}
+					for _, v := range edbInfoList {
+						edbClassifyPermissionMap[v.EdbInfoId] = data_manage_permission.EdbClassifyPermission{
+							ClassifyId:       v.ClassifyId,
+							IsJoinPermission: v.IsJoinPermission,
+							EdbInfoId:        v.EdbInfoId,
+						}
+					}
+				}
+
+				// 获取所有有权限的指标和分类
+				permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUser.AdminId, 0, 0)
+				if err != nil {
+					errMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+					return
+				}
+
+				for _, v := range resp.EdbInfoList {
+					// 数据权限
+					edbItem, ok := edbClassifyPermissionMap[v.EdbInfoId]
+					if !ok {
+						continue
+					}
+
+					if currClassify, ok := classifyMap[edbItem.ClassifyId]; ok {
+						v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(edbItem.IsJoinPermission, currClassify.IsJoinPermission, edbItem.EdbInfoId, edbItem.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+					}
+				}
+			}
+		}
+	}()
+
 	//判断是否存在缓存,如果存在缓存,那么直接从缓存中获取
 	key := data.GetChartInfoDataKey(chartInfo.ChartInfoId)
 	if utils.Re == nil && isCache {
@@ -1272,7 +1391,7 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	}
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	//判断是否需要展示英文标识
 	chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList[0:1], chartInfo.Source, chartInfo.ChartType)
 	chartInfo.UnitEn = edbInfoMappingA.UnitEn
@@ -1303,6 +1422,15 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	resp.DataResp = dataResp
 	resp.Status = true
 
+	// 遍历到校验map
+	for _, v := range edbList {
+		edbClassifyPermissionMap[v.EdbInfoId] = data_manage_permission.EdbClassifyPermission{
+			ClassifyId:       v.ClassifyId,
+			IsJoinPermission: v.IsJoinPermission,
+			EdbInfoId:        v.EdbInfoId,
+		}
+	}
+
 	// 将数据加入缓存
 	if utils.Re == nil {
 		d, _ := json.Marshal(resp)
@@ -1523,6 +1651,8 @@ func (this *CorrelationChartInfoController) SearchByEs() {
 		for _, v := range searchList {
 			tmp := new(data_manage.ChartInfoMore)
 			tmp.ChartInfo = *v
+			// 图表数据权限
+			tmp.HaveOperaAuth = true
 			//判断是否需要展示英文标识
 			if edbTmpList, ok := chartEdbMap[v.ChartInfoId]; ok {
 				tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, edbTmpList, v.Source, v.ChartType)

+ 137 - 3
controllers/data_manage/cross_variety/chart_info.go

@@ -11,6 +11,7 @@ import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
 	"eta/eta_api/services/data/cross_variety"
+	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
@@ -578,7 +579,7 @@ func (c *ChartInfoController) Detail() {
 	}
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	////判断是否需要展示英文标识
 	//chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList[0:1], chartInfo.Source, chartInfo.ChartType)
 	//chartInfo.UnitEn = edbInfoMappingA.UnitEn
@@ -592,6 +593,58 @@ func (c *ChartInfoController) Detail() {
 		IsSetName: chartInfo.IsSetName,
 	}
 
+	chartInfo.HaveOperaAuth = true
+	// 指标权限
+	{
+		edbClassifyPermissionMap := make(map[int]data_manage_permission.EdbClassifyPermission)
+		classifyMap := make(map[int]*data_manage.EdbClassify)
+		// 分类
+		{
+			classifyIdList := make([]int, 0)
+			for _, v := range edbList {
+				classifyIdList = append(classifyIdList, v.ClassifyId)
+			}
+			classifyList, tmpErr := data_manage.GetEdbClassifyByIdList(classifyIdList)
+			if tmpErr != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取分类列表失败,Err:" + tmpErr.Error()
+				return
+			}
+			for _, v := range classifyList {
+				classifyMap[v.ClassifyId] = v
+			}
+		}
+
+		// 遍历到校验map
+		for _, v := range edbList {
+			edbClassifyPermissionMap[v.EdbInfoId] = data_manage_permission.EdbClassifyPermission{
+				ClassifyId:       v.ClassifyId,
+				IsJoinPermission: v.IsJoinPermission,
+				EdbInfoId:        v.EdbInfoId,
+			}
+		}
+
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range edbList {
+			// 数据权限
+			edbItem, ok := edbClassifyPermissionMap[v.EdbInfoId]
+			if !ok {
+				continue
+			}
+
+			if currClassify, ok := classifyMap[edbItem.ClassifyId]; ok {
+				v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(edbItem.IsJoinPermission, currClassify.IsJoinPermission, edbItem.EdbInfoId, edbItem.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			}
+		}
+	}
+
 	resp := new(data_manage.ChartInfoDetailResp)
 	resp.ChartInfo = chartInfo
 	resp.DataResp = dataResp
@@ -1221,7 +1274,7 @@ func (c *ChartInfoController) DeleteChart() {
 		return
 	}
 	//图表操作权限
-	ok := data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	ok := data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	if !ok {
 		br.Msg = "没有该图表的操作权限"
 		br.ErrMsg = "没有该图表的操作权限"
@@ -1365,6 +1418,9 @@ func (c *ChartInfoController) SearchByEs() {
 	startSize = paging.StartIndex(currentIndex, pageSize)
 
 	keyword := c.GetString("Keyword")
+	if keyword == `` { // 兼容jp前端
+		keyword = c.GetString("KeyWord")
+	}
 
 	//只看我的
 	isShowMe, _ := c.GetBool("IsShowMe")
@@ -1429,6 +1485,8 @@ func (c *ChartInfoController) SearchByEs() {
 		for _, v := range searchList {
 			tmp := new(data_manage.ChartInfoMore)
 			tmp.ChartInfo = *v
+			// 图表数据权限
+			tmp.HaveOperaAuth = true
 			//判断是否需要展示英文标识
 			if _, ok := chartEdbMap[v.ChartInfoId]; ok {
 				tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, []*data_manage.ChartEdbInfoMapping{}, v.Source, v.ChartType)
@@ -1461,6 +1519,73 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 
 	adminId := sysUser.AdminId
 
+	// 指标数据map
+	edbClassifyPermissionMap := make(map[int]data_manage_permission.EdbClassifyPermission)
+	defer func() {
+		if isOk {
+			resp.ChartInfo.HaveOperaAuth = true
+
+			// 指标权限
+			{
+				classifyMap := make(map[int]*data_manage.EdbClassify)
+				// 分类
+				{
+					classifyIdList := make([]int, 0)
+					for _, v := range resp.EdbInfoList {
+						classifyIdList = append(classifyIdList, v.ClassifyId)
+					}
+					classifyList, tmpErr := data_manage.GetEdbClassifyByIdList(classifyIdList)
+					if tmpErr != nil {
+						errMsg = "获取分类列表失败,Err:" + tmpErr.Error()
+						return
+					}
+					for _, v := range classifyList {
+						classifyMap[v.ClassifyId] = v
+					}
+				}
+
+				// 指标
+				if len(edbClassifyPermissionMap) < 0 {
+					edbInfoIdList := make([]int, 0)
+					for _, v := range resp.EdbInfoList {
+						edbInfoIdList = append(edbInfoIdList, v.EdbInfoId)
+					}
+					edbInfoList, tmpErr := data_manage.GetEdbInfoByIdList(edbInfoIdList)
+					if tmpErr != nil {
+						errMsg = "获取指标列表失败,Err:" + tmpErr.Error()
+						return
+					}
+					for _, v := range edbInfoList {
+						edbClassifyPermissionMap[v.EdbInfoId] = data_manage_permission.EdbClassifyPermission{
+							ClassifyId:       v.ClassifyId,
+							IsJoinPermission: v.IsJoinPermission,
+							EdbInfoId:        v.EdbInfoId,
+						}
+					}
+				}
+
+				// 获取所有有权限的指标和分类
+				permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUser.AdminId, 0, 0)
+				if err != nil {
+					errMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+					return
+				}
+
+				for _, v := range resp.EdbInfoList {
+					// 数据权限
+					edbItem, ok := edbClassifyPermissionMap[v.EdbInfoId]
+					if !ok {
+						continue
+					}
+
+					if currClassify, ok := classifyMap[edbItem.ClassifyId]; ok {
+						v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(edbItem.IsJoinPermission, currClassify.IsJoinPermission, edbItem.EdbInfoId, edbItem.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+					}
+				}
+			}
+		}
+	}()
+
 	//判断是否存在缓存,如果存在缓存,那么直接从缓存中获取
 	key := data.GetChartInfoDataKey(chartInfo.ChartInfoId)
 	if utils.Re == nil && isCache {
@@ -1553,7 +1678,7 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	}
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	//判断是否需要展示英文标识
 	//chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList[0:1], chartInfo.Source, chartInfo.ChartType)
 	//chartInfo.UnitEn = edbInfoMappingA.UnitEn
@@ -1578,6 +1703,15 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	resp.EdbInfoList = edbList
 	resp.Status = true
 
+	// 遍历到校验map
+	for _, v := range edbList {
+		edbClassifyPermissionMap[v.EdbInfoId] = data_manage_permission.EdbClassifyPermission{
+			ClassifyId:       v.ClassifyId,
+			IsJoinPermission: v.IsJoinPermission,
+			EdbInfoId:        v.EdbInfoId,
+		}
+	}
+
 	// 将数据加入缓存
 	if utils.Re == nil {
 		d, _ := json.Marshal(resp)

+ 2 - 2
controllers/data_manage/cross_variety/classify.go

@@ -95,7 +95,7 @@ func (c *ClassifyController) List() {
 	}
 
 	// 移除没有权限的图表
-	allNodes = data.HandleNoPermissionChart(allNodes, noPermissionChartIdMap)
+	allNodes = data.HandleNoPermissionChart(allNodes, noPermissionChartIdMap, c.SysUser.AdminId)
 	resp.AllNodes = allNodes
 
 	br.Ret = 200
@@ -315,7 +315,7 @@ func (c *ClassifyController) DeleteChartClassify() {
 			return
 		}
 		//图表操作权限
-		ok := data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+		ok := data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 		if !ok {
 			br.Msg = "没有该图表的操作权限"
 			br.ErrMsg = "没有该图表的操作权限"

+ 394 - 0
controllers/data_manage/data_manage_permission/data_manage_permission.go

@@ -0,0 +1,394 @@
+package data_manage_permission
+
+import (
+	"encoding/json"
+	"eta/eta_api/controllers"
+	"eta/eta_api/models"
+	data_manage_permission2 "eta/eta_api/models/data_manage/data_manage_permission"
+	"eta/eta_api/services/data/data_manage_permission"
+	"eta/eta_api/utils"
+)
+
+// 资产的含义:指标/图表/表格
+
+// DataMangePermissionController 数据权限管理
+type DataMangePermissionController struct {
+	controllers.BaseAuthController
+}
+
+// SetEdbChartPermission
+// @Title 指标/图表/表格权限设置接口
+// @Description 指标/图表/表格权限设置接口
+// @Param	request	body data_manage.SetEdbChartPermissionReq true "type json string"
+// @Success 200 {object} data_manage.ChartListResp
+// @router /edb_chart/permission/set [post]
+func (c *DataMangePermissionController) SetEdbChartPermission() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req data_manage_permission2.SetEdbChartPermissionReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.Source <= 0 || req.Source > 6 {
+		br.Msg = "错误的来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 子来源(目前作用于ETA表格,2024-3-26 14:12:09)
+	if req.Source == 6 && (req.SubSource <= utils.EXCEL_DEFAULT || req.SubSource > utils.CUSTOM_ANALYSIS_TABLE) {
+		br.Msg = "错误的子来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	if !req.IsSelectAll && len(req.DataIdList) <= 0 {
+		br.Msg = "请勾选数据项"
+		br.IsSendEmail = false
+		return
+	}
+
+	err, errMsg := data_manage_permission.SetEdbChartPermission(req.Source, req.SubSource, req.UserId, req.UserList, req.IsSelectAll, req.DataIdList, req.NoDataIdList, req.Keyword, req.ClassifyId, sysUser.AdminId)
+	if err != nil {
+		//br.Success = true
+		br.Msg = "设置失败"
+		if errMsg != `` {
+			br.Msg = errMsg
+		}
+		br.ErrMsg = "设置失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.IsAddLog = true
+	br.Success = true
+	br.Msg = "设置成功"
+}
+
+// SetPermissionEdbChartClassifyIsPermission
+// @Title 指标/图表/表格分类是否涉密设置接口
+// @Description 指标/图表/表格分类是否涉密设置接口
+// @Param	request	body data_manage.MoveEdbChartReq true "type json string"
+// @Success 200 {object} data_manage.ChartListResp
+// @router /edb_chart/classify/permission/is_permission/set [post]
+func (c *DataMangePermissionController) SetPermissionEdbChartClassifyIsPermission() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req data_manage_permission2.SetDataIsPermissionReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.Source <= 0 || req.Source > 6 {
+		br.Msg = "错误的来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 子来源(目前作用于ETA表格,2024-3-26 14:12:09)
+	if req.Source == 6 && (req.SubSource <= utils.EXCEL_DEFAULT || req.SubSource > utils.CUSTOM_ANALYSIS_TABLE) {
+		br.Msg = "错误的子来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	err, errMsg := data_manage_permission.SetDataClassifyIsPermission(req.Source, req.SubSource, req.ClassifyIdList, sysUser.AdminId)
+	if err != nil {
+		//br.Success = true
+		br.Msg = "设置失败"
+		if errMsg != `` {
+			br.Msg = errMsg
+		}
+		br.ErrMsg = "设置失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.IsAddLog = true
+	br.Success = true
+	br.Msg = "设置成功"
+}
+
+// SetEdbChartClassifyPermission
+// @Title 指标/图表/表格分类权限设置接口
+// @Description 指标/图表/表格分类权限设置接口
+// @Param	request	body data_manage.SetEdbChartClassifyPermissionReq true "type json string"
+// @Success 200 {object} data_manage.ChartListResp
+// @router /edb_chart/classify/permission/set [post]
+func (c *DataMangePermissionController) SetEdbChartClassifyPermission() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req data_manage_permission2.SetEdbChartClassifyPermissionReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.Source <= 0 || req.Source > 6 {
+		br.Msg = "错误的来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 子来源(目前作用于ETA表格,2024-3-26 14:12:09)
+	if req.Source == 6 && (req.SubSource <= utils.EXCEL_DEFAULT || req.SubSource > utils.CUSTOM_ANALYSIS_TABLE) {
+		br.Msg = "错误的子来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	if len(req.UserList) <= 0 {
+		br.Msg = "请选择用户"
+		br.IsSendEmail = false
+		return
+	}
+
+	err, errMsg := data_manage_permission.SetEdbChartClassifyPermission(req.Source, req.SubSource, req.UserList, req.ClassifyIdList, sysUser.AdminId)
+	if err != nil {
+		//br.Success = true
+		br.Msg = "设置失败"
+		if errMsg != `` {
+			br.Msg = errMsg
+		}
+		br.ErrMsg = "设置失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.IsAddLog = true
+	br.Success = true
+	br.Msg = "设置成功"
+}
+
+// GetEdbChartPermission
+// @Title 指标/图表/表格权限设置接口
+// @Description 指标/图表/表格权限设置接口
+// @Param   Source   query   int  false       "来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格"
+// @Param   SubSource   query   int  false       "子来源 :目前作用于ETA表格,2024-3-26 14:12:09"
+// @Param   DataId   query   int  false       "资产id"
+// @Success 200 {object} data_manage.ChartListResp
+// @router /edb_chart/permission/show_by_data [get]
+func (c *DataMangePermissionController) GetEdbChartPermission() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	source, _ := c.GetInt("Source")
+	if source <= 0 || source > 6 {
+		br.Msg = "错误的来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 子来源(目前作用于ETA表格,2024-3-26 14:12:09)
+	subSource, _ := c.GetInt("SubSource")
+	if source == 6 && (subSource <= utils.EXCEL_DEFAULT || subSource > utils.CUSTOM_ANALYSIS_TABLE) {
+		br.Msg = "错误的子来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	dataId, _ := c.GetInt("DataId")
+	// 用户判断
+	if dataId <= 0 {
+		br.Msg = "请选择数据"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 获取已经配置了的资产id列表
+	idList, err := data_manage_permission.GetUserIdListPermissionByDataId(source, subSource, dataId)
+	if err != nil {
+		//br.Success = true
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = idList
+}
+
+// GetEdbChartClassifyPermission
+// @Title 获取指标/图表/表格分类权限设置接口
+// @Description 获取指标/图表/表格分类权限设置接口
+// @Param   Source   query   int  false       "来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格"
+// @Param   SubSource   query   int  false       "子来源 :目前作用于ETA表格,2024-3-26 14:12:09"
+// @Param   UserId   query   int  false       "用户id"
+// @Success 200 {object} data_manage.ChartListResp
+// @router /edb_chart/classify/permission/show_by_user [get]
+func (c *DataMangePermissionController) GetEdbChartClassifyPermission() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	source, _ := c.GetInt("Source")
+	if source <= 0 || source > 6 {
+		br.Msg = "错误的来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 子来源(目前作用于ETA表格,2024-3-26 14:12:09)
+	subSource, _ := c.GetInt("SubSource")
+	if source == 6 && (subSource <= utils.EXCEL_DEFAULT || subSource > utils.CUSTOM_ANALYSIS_TABLE) {
+		br.Msg = "错误的子来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	userId, _ := c.GetInt("UserId")
+
+	// 来源判断
+	if source <= 0 || source > 6 {
+		br.Msg = "错误的来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 子来源(目前作用于ETA表格,2024-3-26 14:12:09)
+	if source == 6 && (subSource <= utils.EXCEL_DEFAULT || subSource > utils.CUSTOM_ANALYSIS_TABLE) {
+		br.Msg = "错误的子来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 用户判断
+	if userId <= 0 {
+		br.Msg = "请选择用户"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 获取已经配置了的分类id列表
+	idList, err := data_manage_permission.GetEdbChartClassifyIdListPermissionByUserId(source, subSource, userId)
+	if err != nil {
+		//br.Success = true
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = idList
+}
+
+// GetEdbChartNoPermission
+// @Title 根据资产id获取其分类没有权限的用户id列表接口
+// @Description 根据资产id获取其分类没有权限的用户id列表接口
+// @Param   Source   query   int  false       "来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格"
+// @Param   SubSource   query   int  false       "子来源 :目前作用于ETA表格,2024-3-26 14:12:09"
+// @Param   DataId   query   int  false       "资产id"
+// @Success 200 {object} data_manage.ChartListResp
+// @router /edb_chart/no_classify_permission/show_by_data [get]
+func (c *DataMangePermissionController) GetEdbChartNoPermission() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	source, _ := c.GetInt("Source")
+	if source <= 0 || source > 6 {
+		br.Msg = "错误的来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 子来源(目前作用于ETA表格,2024-3-26 14:12:09)
+	subSource, _ := c.GetInt("SubSource")
+	if source == 6 && (subSource <= utils.EXCEL_DEFAULT || subSource > utils.CUSTOM_ANALYSIS_TABLE) {
+		br.Msg = "错误的子来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	dataId, _ := c.GetInt("DataId")
+
+	// 用户判断
+	if dataId <= 0 {
+		br.Msg = "请选择数据"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 获取已经配置了的资产id列表
+	idList, err := data_manage_permission.GetUserIdListNoPermissionByDataId(source, subSource, dataId)
+	if err != nil {
+		//br.Success = true
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = idList
+}

+ 396 - 0
controllers/data_manage/data_manage_permission/data_move.go

@@ -0,0 +1,396 @@
+package data_manage_permission
+
+import (
+	"encoding/json"
+	"eta/eta_api/models"
+	"eta/eta_api/models/data_manage"
+	data_manage_permissionModel "eta/eta_api/models/data_manage/data_manage_permission"
+	"eta/eta_api/services/data/data_manage_permission"
+	"eta/eta_api/utils"
+	"github.com/rdlucklib/rdluck_tools/paging"
+)
+
+// EdbChartClassifyList
+// @Title 获取指标/图表分类列表数据接口
+// @Description 获取指标/图表分类列表数据接口
+// @Param   Source   query   int  false       "来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格"
+// @Param   SubSource   query   int  false       "子来源 :ETA表格中的各种表格类型,以及图表的来源(这个是后续的扩展方向)"
+// @Success 200 {object} data_manage.ChartListResp
+// @router /edb_chart/classify [get]
+func (c *DataMangePermissionController) EdbChartClassifyList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	source, _ := c.GetInt("Source")
+	if source <= 0 || source > 6 {
+		br.Msg = "错误的来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 子来源(目前作用于ETA表格,2024-3-26 14:12:09)
+	subSource, _ := c.GetInt("SubSource")
+	if source == 6 && (subSource <= utils.EXCEL_DEFAULT || subSource > utils.CUSTOM_ANALYSIS_TABLE) {
+		br.Msg = "错误的子来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	list, err := data_manage_permission.GetEdbChartClassifyList(source, subSource)
+	if err != nil {
+		//br.Success = true
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}
+
+// SecretEdbChartClassifyList
+// @Title 获取涉密的指标/图表分类列表数据接口
+// @Description 获取指标/图表分类列表数据接口
+// @Param   Source   query   int  false       "来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格"
+// @Param   SubSource   query   int  false       "子来源 :ETA表格中的各种表格类型,以及图表的来源(这个是后续的扩展方向)"
+// @Success 200 {object} data_manage.ChartListResp
+// @router /edb_chart/classify/secret [get]
+func (c *DataMangePermissionController) SecretEdbChartClassifyList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	source, _ := c.GetInt("Source")
+	if source <= 0 || source > 6 {
+		br.Msg = "错误的来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 子来源(目前作用于ETA表格,2024-3-26 14:12:09)
+	subSource, _ := c.GetInt("SubSource")
+	if source == 6 && (subSource <= utils.EXCEL_DEFAULT || subSource > utils.CUSTOM_ANALYSIS_TABLE) {
+		br.Msg = "错误的子来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	resp, err := data_manage_permission.GetEdbChartClassifyList(source, subSource)
+	if err != nil {
+		//br.Success = true
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	resp.List = removeNodesWithNoJoinPermissionAndEmptyChildRecursively(resp.List)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+func removeNodesWithNoJoinPermissionAndEmptyChildRecursively(nodes []*data_manage.EdbChartClassify) []*data_manage.EdbChartClassify {
+	var newListNode []*data_manage.EdbChartClassify
+
+	for _, node := range nodes {
+		if node.Child != nil {
+			node.Child = removeNodesWithNoJoinPermissionAndEmptyChildRecursively(node.Child)
+		}
+
+		if node.IsJoinPermission != 0 || (node.Child != nil && len(node.Child) > 0) {
+			newListNode = append(newListNode, node)
+		}
+	}
+
+	return newListNode
+}
+
+// MoveEdbChartList
+// @Title 获取指标/图表创建人列表数据接口
+// @Description 获取指标/图表创建人列表数据接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   Source   query   int  false       "来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格"
+// @Param   SubSource   query   int  false       "子来源 :目前作用于ETA表格,2024-3-26 14:12:09"
+// @Param   Keyword   query   string  false       "关键字,code或者名称"
+// @Param   Classify   query   string  false       "分类id"
+// @Param   UserId   query   int  false       "创建人id"
+// @Success 200 {object} data_manage.ChartListResp
+// @router /edb_chart/list [get]
+func (c *DataMangePermissionController) MoveEdbChartList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	source, _ := c.GetInt("Source")
+	if source <= 0 || source > 6 {
+		br.Msg = "错误的来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 子来源(目前作用于ETA表格,2024-3-26 14:12:09)
+	subSource, _ := c.GetInt("SubSource")
+	if source == 6 && (subSource <= utils.EXCEL_DEFAULT || subSource > utils.CUSTOM_ANALYSIS_TABLE) {
+		br.Msg = "错误的子来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	userId, _ := c.GetInt("UserId")
+	keyword := c.GetString("Keyword")
+	classify := c.GetString("Classify")
+	pageSize, _ := c.GetInt("PageSize")
+	currentIndex, _ := c.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+	resp := data_manage.MoveEdbChartListResp{}
+	var total int
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	defaultList := make([]data_manage.MoveEdbChartList, 0)
+	resp.List = defaultList
+	resp.Paging = page
+	// 没有传入条件,那就默认自动返回
+	//if userId <= 0 && keyword == `` && classify == `` {
+	//	br.Ret = 200
+	//	br.Success = true
+	//	br.Msg = "获取成功"
+	//	br.Data = resp
+	//	return
+	//}
+
+	list, total, err := data_manage_permission.GetMoveEdbChartList(source, subSource, userId, keyword, classify, startSize, pageSize)
+	if err != nil {
+		//br.Success = true
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	if list == nil {
+		list = defaultList
+	}
+
+	page = paging.GetPaging(currentIndex, pageSize, total)
+	resp.Paging = page
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.IsAddLog = false
+	br.Data = resp
+}
+
+// MoveEdbChartUser
+// @Title 指标/图表创建人变更接口
+// @Description 指标/图表创建人变更接口
+// @Param	request	body data_manage_permissionModel.MoveEdbChartReq true "type json string"
+// @Success 200 {object} data_manage.ChartListResp
+// @router /edb_chart/change_user [post]
+func (c *DataMangePermissionController) MoveEdbChartUser() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req data_manage_permissionModel.MoveEdbChartReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.Source <= 0 || req.Source > 6 {
+		br.Msg = "错误的来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 子来源(目前作用于ETA表格,2024-3-26 14:12:09)
+	if req.Source == 6 && (req.SubSource <= utils.EXCEL_DEFAULT || req.SubSource > utils.CUSTOM_ANALYSIS_TABLE) {
+		br.Msg = "错误的子来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	if !req.IsSelectAll && len(req.DataIdList) <= 0 {
+		br.Msg = "请勾选数据项"
+		br.IsSendEmail = false
+		return
+	}
+	if req.NewUserId <= 0 {
+		br.Msg = "请选择新的创建人"
+		br.IsSendEmail = false
+		return
+	}
+
+	err, errMsg := data_manage_permission.MoveEdbChart(req.Source, req.SubSource, req.UserId, req.NewUserId, req.IsSelectAll, req.DataIdList, req.NoDataIdList, req.Keyword, req.ClassifyId, sysUser.AdminId)
+	if err != nil {
+		//br.Success = true
+		br.Msg = "移动失败"
+		if errMsg != `` {
+			br.Msg = errMsg
+		}
+		br.ErrMsg = "移动失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.IsAddLog = true
+	br.Success = true
+	br.Msg = "修改成功"
+}
+
+// MoveAllEdbChartUser
+// @Title 通过原创建人转移指标/图表创建人接口
+// @Description 通过原创建人转移指标/图表创建人接口
+// @Param request body data_manage_permission.MoveAllEdbChartReq true "type json string"
+// @Success 200 {object} data_manage.ChartListResp
+// @router /edb_chart/all/change_user [post]
+func (c *DataMangePermissionController) MoveAllEdbChartUser() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req data_manage_permissionModel.MoveAllEdbChartReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if len(req.Source) <= 0 {
+		br.Msg = "请选择来源"
+		br.IsSendEmail = false
+		return
+	}
+
+	if len(req.OldUserId) <= 0 {
+		br.Msg = "请选择旧的创建人"
+		br.IsSendEmail = false
+		return
+	}
+
+	if req.NewUserId <= 0 {
+		br.Msg = "请选择新的创建人"
+		br.IsSendEmail = false
+		return
+	}
+
+	err, errMsg := data_manage_permission.MoveAllEdbChart(req.Source, req.OldUserId, req.NewUserId, sysUser.AdminId)
+	if err != nil {
+		//br.Success = true
+		br.Msg = "移动失败"
+		if errMsg != `` {
+			br.Msg = errMsg
+		}
+		br.ErrMsg = "移动失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.IsAddLog = true
+	br.Success = true
+	br.Msg = "移动成功"
+}
+
+// MoveEdbChartCount
+// @Title 获取指标/图表创建人汇总数据接口
+// @Description 获取指标/图表创建人汇总数据接口
+// @Param   UserId   query   int  false       "创建人id"
+// @Param   CountType   query   int  false       "来源 :1:设置资产权限;2:设置数据权限"
+// @Success 200 {object} data_manage.ChartListResp
+// @router /edb_chart/count [get]
+func (c *DataMangePermissionController) MoveEdbChartCount() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	userId, _ := c.GetInt("UserId")
+	countType, _ := c.GetInt("CountType", 1)
+
+	// 没有传入条件,那就默认自动返回
+	if userId <= 0 {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		//br.Data = resp
+		return
+	}
+
+	resp, err := data_manage_permission.GetMoveEdbChartCount(userId, countType)
+	if err != nil {
+		//br.Success = true
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 250 - 0
controllers/data_manage/data_manage_permission/message.go

@@ -0,0 +1,250 @@
+package data_manage_permission
+
+import (
+	"encoding/json"
+	"eta/eta_api/models"
+	"eta/eta_api/models/data_manage/data_manage_permission"
+	data_manage_permissionServ "eta/eta_api/services/data/data_manage_permission"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+// MessageList
+// @Title 资产消息列表
+// @Description 资产消息列表
+// @Param   PageSize			query	int		true	"每页数据条数"
+// @Param   CurrentIndex		query	int		true	"当前页页码"
+// @Success 200 {object} data_manage_permission.DataPermissionMessageListResp
+// @router /message/list [get]
+func (c *DataMangePermissionController) MessageList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	// 分页
+	pageSize, _ := c.GetInt("PageSize")
+	currentIndex, _ := c.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	resp := new(data_manage_permission.DataPermissionMessageListResp)
+	resp.List = make([]*data_manage_permission.DataPermissionMessageItem, 0)
+	cond := fmt.Sprintf(` AND %s = ?`, data_manage_permission.DataPermissionMessageCols.ReceiveUserId)
+	pars := make([]interface{}, 0)
+	pars = append(pars, sysUser.AdminId)
+	order := fmt.Sprintf(`%s ASC, %s DESC`, data_manage_permission.DataPermissionMessageCols.IsRead, data_manage_permission.DataPermissionMessageCols.CreateTime)
+
+	messageOb := new(data_manage_permission.DataPermissionMessage)
+	total, e := messageOb.GetCountByCondition(cond, pars)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取资产消息列表总数失败, Err: " + e.Error()
+		return
+	}
+	list, e := messageOb.GetPageItemsByCondition(cond, pars, []string{}, order, startSize, pageSize)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取资产消息列表失败, Err: " + e.Error()
+		return
+	}
+	for _, v := range list {
+		t := data_manage_permission.FormatDataPermissionMessage2Item(v)
+		resp.List = append(resp.List, t)
+	}
+
+	// 未读消息数
+	cond += fmt.Sprintf(` AND %s = ?`, data_manage_permission.DataPermissionMessageCols.IsRead)
+	pars = append(pars, 0)
+	unreadTotal, e := messageOb.GetCountByCondition(cond, pars)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取资产消息列表总数失败, Err: " + e.Error()
+		return
+	}
+	resp.UnreadTotal = unreadTotal
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp.Paging = page
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// MessageRead
+// @Title 消息已读
+// @Description 消息已读
+// @Param	request	body data_manage_permission.DataPermissionMessageReadReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /message/read [post]
+func (c *DataMangePermissionController) MessageRead() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req data_manage_permission.DataPermissionMessageReadReq
+	if e := json.Unmarshal(c.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数有误"
+		br.ErrMsg = "参数解析失败, Err: " + e.Error()
+		return
+	}
+	if req.MessageId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("参数有误, MessageId: %d", req.MessageId)
+		return
+	}
+
+	messageOb := new(data_manage_permission.DataPermissionMessage)
+	messageItem, e := messageOb.GetItemById(req.MessageId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "消息不存在, 请刷新页面"
+			return
+		}
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取审批消息失败, Err: " + e.Error()
+		return
+	}
+
+	// 不等于0的时候,说明已经操作过了,就不重复操作了
+	if messageItem.IsRead != 0 {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "操作成功"
+		return
+	}
+
+	if messageItem.ReceiveUserId != int32(sysUser.AdminId) {
+		br.Msg = "标记已读失败,不是本人消息"
+		br.ErrMsg = "标记已读失败,不是本人消息 "
+		br.IsSendEmail = false
+		return
+	}
+	messageItem.IsRead = 1
+	messageItem.ModifyTime = time.Now().Local()
+	cols := []string{"IsRead", "ModifyTime"}
+	if e = messageItem.Update(cols); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "更新消息已读失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// MessageDetail
+// @Title 资产消息详情
+// @Description 资产消息详情
+// @Param   MessageId			query	int		true	"消息ID"
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   Source   query   int  false       "来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格"
+// @Param   SubSource   query   int  false       "子来源 :目前作用于ETA表格,2024-3-26 14:12:09"
+// @Success 200 {object} data_manage_permission.MessageDetailListResp
+// @router /message/detail [get]
+func (c *DataMangePermissionController) MessageDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	messageId, _ := c.GetInt("MessageId", 0)
+	if messageId <= 0 {
+		br.Msg = "请选择消息"
+		br.ErrMsg = "请选择消息"
+		br.IsSendEmail = false
+		return
+	}
+	source, _ := c.GetInt("Source")
+	// 子来源(目前作用于ETA表格,2024-3-26 14:12:09)
+	subSource, _ := c.GetInt("SubSource")
+
+	pageSize, _ := c.GetInt("PageSize")
+	currentIndex, _ := c.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+	resp := data_manage_permission.MessageDetailListResp{}
+	var total int
+	page := paging.GetPaging(currentIndex, pageSize, total)
+
+	messageOb := new(data_manage_permission.DataPermissionMessage)
+	messageItem, e := messageOb.GetItemById(messageId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "消息不存在, 请刷新页面"
+			return
+		}
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取审批消息失败, Err: " + e.Error()
+		return
+	}
+
+	total, list, err := data_manage_permissionServ.GetMessageDetail(messageItem, source, subSource, startSize, pageSize)
+	if err != nil {
+		//br.Success = true
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	page = paging.GetPaging(currentIndex, pageSize, total)
+	resp.Paging = page
+	resp.List = list
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.IsAddLog = false
+	br.Data = resp
+}

+ 168 - 41
controllers/data_manage/edb_classify.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/utils"
 	"sort"
 )
@@ -39,6 +40,19 @@ func (this *EdbClassifyController) ListV2() {
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
+	// 分类map
+	classifyMap := make(map[int]*data_manage.EdbClassifyItems)
+	for _, v := range classifyAll {
+		classifyMap[v.ClassifyId] = v
+	}
+
+	// 已授权分类id
+	permissionClassifyIdList, err := data_manage_permission.GetUserEdbClassifyPermissionList(this.SysUser.AdminId, 0)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+		return
+	}
 
 	// 获取当前账号的不可见指标
 	obj := data_manage.EdbInfoNoPermissionAdmin{}
@@ -59,19 +73,36 @@ func (this *EdbClassifyController) ListV2() {
 		return
 	}
 	edbInfoMap := make(map[int][]*data_manage.EdbClassifyItems)
-	for _, v := range allEdbInfo {
-		// 如果指标不可见,那么就不返回该指标
-		if _, ok := noPermissionEdbInfoIdMap[v.EdbInfoId]; ok {
-			continue
+	if len(allEdbInfo) > 0 {
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range allEdbInfo {
+			// 如果指标不可见,那么就不返回该指标
+			if _, ok := noPermissionEdbInfoIdMap[v.EdbInfoId]; ok {
+				continue
+			}
+			// 数据权限
+			if classifyInfo, ok := classifyMap[v.ClassifyId]; ok {
+				v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(v.IsJoinPermission, classifyInfo.IsJoinPermission, v.EdbInfoId, v.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			}
+
+			button := data.GetEdbOpButton(this.SysUser, v.SysUserId, v.EdbType, utils.EDB_INFO_TYPE, v.HaveOperaAuth)
+			button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
+			v.Button = button
+			edbInfoMap[v.ClassifyId] = append(edbInfoMap[v.ClassifyId], v)
 		}
-		button := data.GetEdbOpButton(this.SysUser, v.SysUserId, v.EdbType, utils.EDB_INFO_TYPE)
-		button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
-		v.Button = button
-		edbInfoMap[v.ClassifyId] = append(edbInfoMap[v.ClassifyId], v)
 	}
 	rootChildMap := make(map[int][]*data_manage.EdbClassifyItems)
 	for _, v := range classifyAll {
-		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+		// 数据权限
+		v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ClassifyId, permissionClassifyIdList)
+		// 按钮权限
+		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId, v.HaveOperaAuth)
 		button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
 		v.Button = button
 
@@ -85,7 +116,10 @@ func (this *EdbClassifyController) ListV2() {
 	}
 	nodeAll := make([]*data_manage.EdbClassifyItems, 0)
 	for _, v := range rootList {
-		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+		// 数据权限
+		v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ClassifyId, permissionClassifyIdList)
+		// 按钮权限
+		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId, v.HaveOperaAuth)
 		v.Button = button
 
 		if existItems, ok := rootChildMap[v.ClassifyId]; ok {
@@ -620,6 +654,13 @@ func (this *EdbClassifyController) ItemsV2() {
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
+	// 已授权分类id
+	permissionClassifyIdList, err := data_manage_permission.GetUserEdbClassifyPermissionList(this.SysUser.AdminId, 0)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+		return
+	}
 	//allEdbInfo, err := data_manage.GetEdbInfoAll(0)
 	//if err != nil && err.Error() != utils.ErrNoRow() {
 	//	br.Msg = "获取失败"
@@ -635,7 +676,10 @@ func (this *EdbClassifyController) ItemsV2() {
 	//}
 	rootChildMap := make(map[int][]*data_manage.EdbClassifyItems)
 	for _, v := range classifyAll {
-		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+		// 数据权限
+		v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ClassifyId, permissionClassifyIdList)
+		// 按钮权限
+		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId, v.HaveOperaAuth)
 		button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
 		v.Button = button
 
@@ -649,7 +693,10 @@ func (this *EdbClassifyController) ItemsV2() {
 	}
 	nodeAll := make([]*data_manage.EdbClassifyItems, 0)
 	for _, v := range rootList {
-		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+		// 数据权限
+		v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ClassifyId, permissionClassifyIdList)
+		// 按钮权限
+		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId, v.HaveOperaAuth)
 		v.Button = button
 
 		if existItems, ok := rootChildMap[v.ClassifyId]; ok {
@@ -711,6 +758,13 @@ func (this *EdbClassifyController) ClassifyEdbInfoList() {
 		return
 	}
 
+	classifyInfo, err := data_manage.GetEdbClassifyById(classifyId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
+		return
+	}
+
 	// 获取当前账号的不可见指标
 	obj := data_manage.EdbInfoNoPermissionAdmin{}
 	confList, err := obj.GetAllListByAdminId(this.SysUser.AdminId)
@@ -732,16 +786,27 @@ func (this *EdbClassifyController) ClassifyEdbInfoList() {
 	}
 
 	list := make([]*data_manage.EdbClassifyItems, 0)
-	for _, v := range allEdbInfo {
-		// 如果指标不可见,那么就不返回该指标
-		if _, ok := noPermissionEdbInfoIdMap[v.EdbInfoId]; ok {
-			continue
+
+	if len(allEdbInfo) > 0 {
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+			return
 		}
-		button := data.GetEdbOpButton(this.SysUser, v.SysUserId, v.EdbType, utils.EDB_INFO_TYPE)
-		button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
-		v.Button = button
+		for _, v := range allEdbInfo {
+			// 如果指标不可见,那么就不返回该指标
+			if _, ok := noPermissionEdbInfoIdMap[v.EdbInfoId]; ok {
+				continue
+			}
+			v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(v.IsJoinPermission, classifyInfo.IsJoinPermission, v.EdbInfoId, v.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			button := data.GetEdbOpButton(this.SysUser, v.SysUserId, v.EdbType, utils.EDB_INFO_TYPE, v.HaveOperaAuth)
+			button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
+			v.Button = button
 
-		list = append(list, v)
+			list = append(list, v)
+		}
 	}
 
 	resp := new(data_manage.ClassifyEdbInfoListResp)
@@ -781,16 +846,30 @@ func (this *EdbClassifyController) ItemsV3() {
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
+	// 已授权分类id
+	permissionClassifyIdList, err := data_manage_permission.GetUserEdbClassifyPermissionList(this.SysUser.AdminId, 0)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+		return
+	}
+
 	rootTwoMap := make(map[int][]*data_manage.EdbClassifyItems)
 	for _, v := range rootTwoList {
-		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+		// 数据权限
+		v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ClassifyId, permissionClassifyIdList)
+		// 按钮权限
+		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId, v.HaveOperaAuth)
 		v.Button = button
 
 		rootTwoMap[v.ParentId] = append(rootTwoMap[v.ParentId], v)
 	}
 	rootTwoChildMap := make(map[int][]*data_manage.EdbClassifyItems)
 	for _, v := range classifyAll {
-		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+		// 数据权限
+		v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ClassifyId, permissionClassifyIdList)
+		// 按钮权限
+		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId, v.HaveOperaAuth)
 		v.Button = button
 		if v.Level == 3 {
 			rootTwoChildMap[v.ParentId] = append(rootTwoChildMap[v.ParentId], v)
@@ -799,18 +878,27 @@ func (this *EdbClassifyController) ItemsV3() {
 
 	nodeAll := make([]*data_manage.EdbClassifyItems, 0)
 	for _, v := range rootList {
-		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+		// 数据权限
+		v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ClassifyId, permissionClassifyIdList)
+		// 按钮权限
+		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId, v.HaveOperaAuth)
 		v.Button = button
 
 		if existItems, ok := rootTwoMap[v.ClassifyId]; ok {
 			v.Children = existItems
 			for _, item := range existItems {
-				button := data.GetEdbClassifyOpButton(this.SysUser, item.SysUserId)
+				// 数据权限
+				v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ClassifyId, permissionClassifyIdList)
+				// 按钮权限
+				button := data.GetEdbClassifyOpButton(this.SysUser, item.SysUserId, v.HaveOperaAuth)
 				item.Button = button
 
 				if existItems, ok := rootTwoChildMap[item.ClassifyId]; ok {
 					for _, existItem := range existItems {
-						button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+						// 数据权限
+						v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ClassifyId, permissionClassifyIdList)
+						// 按钮权限
+						button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId, v.HaveOperaAuth)
 						button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
 						existItem.Button = button
 					}
@@ -839,11 +927,10 @@ func (this *EdbClassifyController) ItemsV3() {
 			}
 		}
 	}
-	// 是否允许添加一级分类
 
 	// 是否允许添加一级分类
 	canOpClassify := true
-	button := data.GetEdbClassifyOpButton(this.SysUser, 0)
+	button := data.GetEdbClassifyOpButton(this.SysUser, 0, true)
 	if !button.AddButton {
 		canOpClassify = false
 	}
@@ -909,22 +996,51 @@ func (this *EdbClassifyController) SimpleList() {
 			return
 		}
 
-		for _, v := range allEdbInfo {
-			// 如果指标不可见,那么就不返回该指标
-			if _, ok := noPermissionEdbInfoIdMap[v.EdbInfoId]; ok {
-				continue
+		if len(allEdbInfo) > 0 {
+			// 查询当前分类信息
+			currClassify, err := data_manage.GetEdbClassifyById(parentId)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取当前分类信息失败,Err:" + err.Error()
+				return
+			}
+			// 获取所有有权限的指标和分类
+			permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+				return
+			}
+			for _, v := range allEdbInfo {
+				// 如果指标不可见,那么就不返回该指标
+				if _, ok := noPermissionEdbInfoIdMap[v.EdbInfoId]; ok {
+					continue
+				}
+				v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(v.IsJoinPermission, currClassify.IsJoinPermission, v.EdbInfoId, v.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+				button := data.GetEdbOpButton(this.SysUser, v.SysUserId, v.EdbType, utils.EDB_INFO_TYPE, v.HaveOperaAuth)
+				button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
+				v.Button = button
+				v.Children = make([]*data_manage.EdbClassifyItems, 0)
+				v.ParentId = parentId
+				nodeAll = append(nodeAll, v)
 			}
-			button := data.GetEdbOpButton(this.SysUser, v.SysUserId, v.EdbType, utils.EDB_INFO_TYPE)
-			button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
-			v.Button = button
-			v.Children = make([]*data_manage.EdbClassifyItems, 0)
-			v.ParentId = parentId
-			nodeAll = append(nodeAll, v)
 		}
+
 	}
 	if len(rootList) > 0 {
+		// 已授权分类id
+		permissionClassifyIdList, err := data_manage_permission.GetUserEdbClassifyPermissionList(this.SysUser.AdminId, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+			return
+		}
+
 		for _, v := range rootList {
-			button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+			// 数据权限
+			v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ClassifyId, permissionClassifyIdList)
+			// 按钮权限
+			button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId, v.HaveOperaAuth)
 			v.Button = button
 			v.Children = make([]*data_manage.EdbClassifyItems, 0)
 			nodeAll = append(nodeAll, v)
@@ -952,7 +1068,7 @@ func (this *EdbClassifyController) SimpleList() {
 
 	// 是否允许添加一级分类
 	canOpClassify := true
-	button := data.GetEdbClassifyOpButton(this.SysUser, 0)
+	button := data.GetEdbClassifyOpButton(this.SysUser, 0, true)
 	if !button.AddButton {
 		canOpClassify = false
 	}
@@ -989,8 +1105,19 @@ func (this *EdbClassifyController) ClassifyTree() {
 	var sortList data_manage.EdbClassifyItemList
 
 	if len(allList) > 0 {
+		// 已授权分类id
+		permissionClassifyIdList, err := data_manage_permission.GetUserEdbClassifyPermissionList(this.SysUser.AdminId, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+			return
+		}
+
 		for k, v := range allList {
-			button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+			// 数据权限
+			v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ClassifyId, permissionClassifyIdList)
+			// 按钮权限
+			button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId, v.HaveOperaAuth)
 			allList[k].Button = button
 		}
 		nodeAll = data.GetClassifyTreeRecursive(allList, 0)
@@ -1014,7 +1141,7 @@ func (this *EdbClassifyController) ClassifyTree() {
 
 	// 是否允许添加一级分类
 	canOpClassify := true
-	button := data.GetEdbClassifyOpButton(this.SysUser, 0)
+	button := data.GetEdbClassifyOpButton(this.SysUser, 0, true)
 	if !button.AddButton {
 		canOpClassify = false
 	}

+ 468 - 306
controllers/data_manage/edb_info.go

@@ -12,6 +12,7 @@ import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/data/data_manage_permission"
 	excel2 "eta/eta_api/services/data/excel"
 	"eta/eta_api/services/data_stat"
 	"eta/eta_api/services/elastic"
@@ -2056,64 +2057,100 @@ func (this *EdbInfoController) EdbInfoList() {
 
 	//获取英文频度
 	edbInfoItem.FrequencyEn = data.GetFrequencyEn(edbInfoItem.Frequency)
-	//获取指标数据
-	var dataCondition string
-	var dataPars []interface{}
 
-	dataCondition += ` AND edb_info_id=? `
-	dataPars = append(dataPars, edbInfoItem.EdbInfoId)
+	//查询目录
+	classifyList, err, errMsg := data.GetFullClassifyByClassifyId(edbInfoItem.ClassifyId)
+	if err != nil {
+		br.Msg = err.Error()
+		br.ErrMsg = errMsg
+		return
+	}
 
-	if edbInfoItem.SubSource == utils.DATA_SUB_SOURCE_DATE {
-		if edbInfoItem.Source == utils.DATA_SOURCE_WIND {
-			dataCount, err := data_manage.GetEdbWsdDataCountByCondition(dataCondition, dataPars, edbInfoItem.Source)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				br.Msg = "获取指标信息失败"
-				br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
-				return
+	// 权限校验
+	{
+		var currClassify *data_manage.EdbClassifyIdItems
+		for _, v := range classifyList {
+			if edbInfoItem.ClassifyId == v.ClassifyId {
+				currClassify = v
+				break
 			}
-			page = paging.GetPaging(currentIndex, pageSize, dataCount)
-			dataList, err := data_manage.GetEdbWsdDataListByCondition(dataCondition, dataPars, edbInfoItem.Source, pageSize, startSize)
+		}
+		if currClassify != nil {
+			edbInfoItem.HaveOperaAuth, err = data_manage_permission.CheckEdbPermission(edbInfoItem.IsJoinPermission, currClassify.IsJoinPermission, this.SysUser.AdminId, edbInfoItem.EdbInfoId, edbInfoItem.ClassifyId)
 			if err != nil {
-				br.Msg = "获取指标信息失败"
-				br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
+				br.Msg = err.Error()
+				br.ErrMsg = "校验指标权限失败,err:" + err.Error()
 				return
 			}
-			edbInfoItem.DataList = dataList
-		} else if edbInfoItem.Source == utils.DATA_SOURCE_THS {
-			dataCount, err := data_manage.GetTHsDsDataCountByCondition(dataCondition, dataPars, edbInfoItem.Source)
+		}
+	}
+
+	// 按钮校验
+	button := data.GetEdbOpButton(this.SysUser, edbInfoItem.SysUserId, edbInfoItem.EdbType, edbInfoItem.EdbInfoType, edbInfoItem.HaveOperaAuth)
+	button.AddButton = false
+	edbInfoItem.Button = button
+	edbInfoItem.DataList = make([]*data_manage.EdbData, 0)
+
+	// 如果有数据权限,那么就去获取指标数据
+	if edbInfoItem.HaveOperaAuth {
+		var dataCondition string
+		var dataPars []interface{}
+
+		dataCondition += ` AND edb_info_id=? `
+		dataPars = append(dataPars, edbInfoItem.EdbInfoId)
+
+		if edbInfoItem.SubSource == utils.DATA_SUB_SOURCE_DATE {
+			if edbInfoItem.Source == utils.DATA_SOURCE_WIND {
+				dataCount, err := data_manage.GetEdbWsdDataCountByCondition(dataCondition, dataPars, edbInfoItem.Source)
+				if err != nil && err.Error() != utils.ErrNoRow() {
+					br.Msg = "获取指标信息失败"
+					br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
+					return
+				}
+				page = paging.GetPaging(currentIndex, pageSize, dataCount)
+				dataList, err := data_manage.GetEdbWsdDataListByCondition(dataCondition, dataPars, edbInfoItem.Source, pageSize, startSize)
+				if err != nil {
+					br.Msg = "获取指标信息失败"
+					br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
+					return
+				}
+				edbInfoItem.DataList = dataList
+			} else if edbInfoItem.Source == utils.DATA_SOURCE_THS {
+				dataCount, err := data_manage.GetTHsDsDataCountByCondition(dataCondition, dataPars, edbInfoItem.Source)
+				if err != nil && err.Error() != utils.ErrNoRow() {
+					br.Msg = "获取指标信息失败"
+					br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
+					return
+				}
+				page = paging.GetPaging(currentIndex, pageSize, dataCount)
+				dataList, err := data_manage.GetThsDsDataListByCondition(dataCondition, dataPars, edbInfoItem.Source, pageSize, startSize)
+				if err != nil {
+					br.Msg = "获取指标信息失败"
+					br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
+					return
+				}
+				edbInfoItem.DataList = dataList
+			} else {
+				br.Msg = "指标数据源id错误"
+				br.ErrMsg = "指标数据源id错误"
+				return
+			}
+		} else {
+			dataCount, err := data_manage.GetEdbDataCountByCondition(dataCondition, dataPars, edbInfoItem.Source, edbInfoItem.SubSource)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取指标信息失败"
 				br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
 				return
 			}
 			page = paging.GetPaging(currentIndex, pageSize, dataCount)
-			dataList, err := data_manage.GetThsDsDataListByCondition(dataCondition, dataPars, edbInfoItem.Source, pageSize, startSize)
+			dataList, err := data_manage.GetEdbDataListByCondition(dataCondition, dataPars, edbInfoItem.Source, edbInfoItem.SubSource, pageSize, startSize)
 			if err != nil {
 				br.Msg = "获取指标信息失败"
 				br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
 				return
 			}
 			edbInfoItem.DataList = dataList
-		} else {
-			br.Msg = "指标数据源id错误"
-			br.ErrMsg = "指标数据源id错误"
-			return
-		}
-	} else {
-		dataCount, err := data_manage.GetEdbDataCountByCondition(dataCondition, dataPars, edbInfoItem.Source, edbInfoItem.SubSource)
-		if err != nil && err.Error() != utils.ErrNoRow() {
-			br.Msg = "获取指标信息失败"
-			br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
-			return
 		}
-		page = paging.GetPaging(currentIndex, pageSize, dataCount)
-		dataList, err := data_manage.GetEdbDataListByCondition(dataCondition, dataPars, edbInfoItem.Source, edbInfoItem.SubSource, pageSize, startSize)
-		if err != nil {
-			br.Msg = "获取指标信息失败"
-			br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
-			return
-		}
-		edbInfoItem.DataList = dataList
 	}
 
 	// 获取指标插入配置
@@ -2131,20 +2168,8 @@ func (this *EdbInfoController) EdbInfoList() {
 		}
 	}
 
-	// 按钮校验
-	button := data.GetEdbOpButton(this.SysUser, edbInfoItem.SysUserId, edbInfoItem.EdbType, edbInfoItem.EdbInfoType)
-	button.AddButton = false
-	edbInfoItem.Button = button
-
 	//是否展示英文标识
 	edbInfoItem.IsEnEdb = data.CheckIsEnEdb(edbInfoItem.EdbNameEn, edbInfoItem.Unit, edbInfoItem.UnitEn)
-	//查询目录
-	classifyList, err, errMsg := data.GetFullClassifyByClassifyId(edbInfoItem.ClassifyId)
-	if err != nil {
-		br.Msg = err.Error()
-		br.ErrMsg = errMsg
-		return
-	}
 
 	resp.Paging = page
 	resp.Item = edbInfoItem
@@ -2377,8 +2402,19 @@ func (this *EdbInfoController) EdbInfoEdit() {
 		return
 	}
 
+	var haveOperaAuth bool
+	// 权限校验
+	{
+		haveOperaAuth, err = data_manage_permission.CheckEdbPermissionByEdbInfoId(edbInfo.EdbInfoId, edbInfo.ClassifyId, edbInfo.IsJoinPermission, this.SysUser.AdminId)
+		if err != nil {
+			br.Msg = err.Error()
+			br.ErrMsg = "校验指标权限失败,err:" + err.Error()
+			return
+		}
+	}
+
 	// 编辑权限校验
-	button := data.GetEdbOpButton(this.SysUser, edbInfo.SysUserId, edbInfo.EdbType, edbInfo.EdbInfoType)
+	button := data.GetEdbOpButton(this.SysUser, edbInfo.SysUserId, edbInfo.EdbType, edbInfo.EdbInfoType, haveOperaAuth)
 	if !button.OpButton {
 		br.Msg = "无权限操作"
 		br.IsSendEmail = false
@@ -2713,8 +2749,19 @@ func (this *EdbInfoController) EdbInfoMove() {
 		return
 	}
 
+	var haveOperaAuth bool
+	// 权限校验
+	{
+		haveOperaAuth, err = data_manage_permission.CheckEdbPermissionByEdbInfoId(edbInfo.IsJoinPermission, edbInfo.EdbInfoId, edbInfo.ClassifyId, this.SysUser.AdminId)
+		if err != nil {
+			br.Msg = err.Error()
+			br.ErrMsg = "校验指标权限失败,err:" + err.Error()
+			return
+		}
+	}
+
 	// 移动权限校验
-	button := data.GetEdbOpButton(this.SysUser, edbInfo.SysUserId, edbInfo.EdbType, edbInfo.EdbInfoType)
+	button := data.GetEdbOpButton(this.SysUser, edbInfo.SysUserId, edbInfo.EdbType, edbInfo.EdbInfoType, haveOperaAuth)
 	if !button.MoveButton {
 		br.Msg = "无权限操作"
 		br.IsSendEmail = false
@@ -2862,6 +2909,24 @@ func (this *EdbInfoController) EdbInfoDetail() {
 		br.ErrMsg = errMsg
 		return
 	}
+
+	// 权限校验
+	{
+		classifyMap := make(map[int]*data_manage.EdbClassifyIdItems)
+		for _, v := range classifyList {
+			classifyMap[v.ClassifyId] = v
+		}
+		if currClassify, ok := classifyMap[edbInfo.ClassifyId]; ok {
+			haveOperaAuth, err := data_manage_permission.CheckEdbPermission(edbInfo.IsJoinPermission, currClassify.IsJoinPermission, this.SysUser.AdminId, edbInfo.EdbInfoId, edbInfo.ClassifyId)
+			if err != nil {
+				br.Msg = err.Error()
+				br.ErrMsg = "校验指标权限失败,err:" + err.Error()
+				return
+			}
+			resp.HaveOperaAuth = haveOperaAuth
+		}
+	}
+
 	resp.EdbInfo = edbInfo
 	resp.ClassifyList = classifyList
 
@@ -3071,6 +3136,8 @@ func (this *EdbInfoController) EdbInfoFilterByEs() {
 		}
 	}
 
+	// 是否走ES
+	isEs := false
 	if keyWord != "" {
 		var keyWordArr []string
 		keyWordArr = append(keyWordArr, keyWord)
@@ -3085,6 +3152,7 @@ func (this *EdbInfoController) EdbInfoFilterByEs() {
 			// 允许添加预测指标的搜索
 			total, edbInfoList, err = elastic.SearchAddPredictEdbInfoData(utils.DATA_INDEX_NAME, keyWord, noPermissionEdbInfoIdList, startSize, pageSize)
 		}
+		isEs = true
 	} else {
 		var condition string
 		var pars []interface{}
@@ -3134,8 +3202,72 @@ func (this *EdbInfoController) EdbInfoFilterByEs() {
 
 	edbInfoListLen := len(edbInfoList)
 
+	classifyIdList := make([]int, 0)
 	for i := 0; i < edbInfoListLen; i++ {
 		edbInfoList[i].EdbNameAlias = edbInfoList[i].EdbName
+		classifyIdList = append(classifyIdList, edbInfoList[i].ClassifyId)
+	}
+
+	// 当前列表中的分类map
+	classifyMap := make(map[int]*data_manage.EdbClassify)
+	if edbInfoListLen > 0 {
+		classifyList, err := data_manage.GetEdbClassifyByIdList(classifyIdList)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range classifyList {
+			classifyMap[v.ClassifyId] = v
+		}
+
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+			return
+		}
+
+		// 如果是ES的话,需要重新查一下指标的信息,主要是为了把是否授权字段找出来
+		if isEs {
+			edbInfoIdList := make([]int, 0)
+			for i := 0; i < edbInfoListLen; i++ {
+				edbInfoIdList = append(edbInfoIdList, edbInfoList[i].EdbInfoId)
+				tmpEdbInfo := edbInfoList[i]
+				if currClassify, ok := classifyMap[tmpEdbInfo.ClassifyId]; ok {
+					edbInfoList[i].HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(tmpEdbInfo.IsJoinPermission, currClassify.IsJoinPermission, tmpEdbInfo.EdbInfoId, tmpEdbInfo.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+				}
+			}
+
+			tmpEdbList, err := data_manage.GetEdbInfoByIdList(edbInfoIdList)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取所有有权限的指标失败,Err:" + err.Error()
+				return
+			}
+			edbInfoMap := make(map[int]*data_manage.EdbInfo)
+			for _, v := range tmpEdbList {
+				edbInfoMap[v.EdbInfoId] = v
+			}
+
+			for i := 0; i < edbInfoListLen; i++ {
+				tmpEdbInfo, ok := edbInfoMap[edbInfoList[i].EdbInfoId]
+				if !ok {
+					continue
+				}
+				edbInfoList[i].IsJoinPermission = tmpEdbInfo.IsJoinPermission
+			}
+		}
+
+		// 权限校验
+		for i := 0; i < edbInfoListLen; i++ {
+			tmpEdbInfoItem := edbInfoList[i]
+			if currClassify, ok := classifyMap[tmpEdbInfoItem.ClassifyId]; ok {
+				edbInfoList[i].HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(tmpEdbInfoItem.IsJoinPermission, currClassify.IsJoinPermission, tmpEdbInfoItem.EdbInfoId, tmpEdbInfoItem.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			}
+		}
 	}
 
 	for i := 0; i < edbInfoListLen; i++ {
@@ -3365,6 +3497,11 @@ func (this *ChartInfoController) EdbInfoData() {
 		br.Ret = 408
 		return
 	}
+
+	fullEdb := new(data_manage.EdbInfoFullClassify)
+	resp := new(data_manage.EdbInfoDataFullClassifyResp)
+	dataList := make([]*data_manage.EdbDataList, 0)
+
 	edbInfoId, _ := this.GetInt("EdbInfoId")
 	if edbInfoId <= 0 {
 		br.Msg = "参数错误"
@@ -3394,21 +3531,8 @@ func (this *ChartInfoController) EdbInfoData() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-	maxYear := 0
-	if edbInfo.LatestDate != "" {
-		latestDateT, _ := time.Parse(utils.FormatDate, edbInfo.LatestDate)
-		maxYear = latestDateT.Year()
-	}
-	dataList := make([]*data_manage.EdbDataList, 0)
-	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, maxYear)
-	dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfoId, startDate, endDate)
-	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
-	fullEdb := new(data_manage.EdbInfoFullClassify)
-	resp := new(data_manage.EdbInfoDataFullClassifyResp)
+
+	// 分类
 	classifyList, err, errMsg := data.GetFullClassifyByClassifyId(edbInfo.ClassifyId)
 	if err != nil {
 		br.Msg = err.Error()
@@ -3417,8 +3541,42 @@ func (this *ChartInfoController) EdbInfoData() {
 	}
 	fullEdb.EdbInfo = edbInfo
 	fullEdb.ClassifyList = classifyList
+
+	var currClassifyItem *data_manage.EdbClassifyIdItems
+	for _, v := range classifyList {
+		if v.ClassifyId == edbInfo.ClassifyId {
+			currClassifyItem = v
+		}
+	}
+	if currClassifyItem != nil {
+		haveOperaAuth, err := data_manage_permission.CheckEdbPermission(edbInfo.IsJoinPermission, currClassifyItem.IsJoinPermission, sysUser.AdminId, edbInfo.EdbInfoId, edbInfo.ClassifyId)
+		if err != nil {
+			br.Msg = err.Error()
+			br.ErrMsg = "校验指标权限失败,err:" + err.Error()
+			return
+		}
+		fullEdb.HaveOperaAuth = haveOperaAuth
+	}
 	resp.EdbInfo = fullEdb
-	resp.DataList = dataList
+
+	resp.DataList = make([]*data_manage.EdbDataList, 0)
+	// 数据获取
+	if fullEdb.HaveOperaAuth { // 有权限才获取数据
+		maxYear := 0
+		if edbInfo.LatestDate != "" {
+			latestDateT, _ := time.Parse(utils.FormatDate, edbInfo.LatestDate)
+			maxYear = latestDateT.Year()
+		}
+		startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, maxYear)
+		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfoId, startDate, endDate)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+
+		resp.DataList = dataList
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -3691,11 +3849,44 @@ func (this *EdbInfoController) RelationChartList() {
 		myChartMap[v.ChartInfoId] = v
 	}
 	listLen := len(list)
-	for i := 0; i < listLen; i++ {
-		if existItem, ok := myChartMap[list[i].ChartInfoId]; ok {
-			list[i].IsAdd = true
-			list[i].MyChartId = existItem.MyChartId
-			list[i].MyChartClassifyId = existItem.MyChartClassifyId
+
+	if listLen > 0 {
+		// 分类id
+		classifyIdList := make([]int, 0)
+		// 当前列表中的分类map
+		classifyMap := make(map[int]*data_manage.ChartClassify)
+		for _, v := range list {
+			classifyIdList = append(classifyIdList, v.ChartClassifyId)
+		}
+		classifyList, err := data_manage.GetChartClassifyByIdList(classifyIdList)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range classifyList {
+			classifyMap[v.ChartClassifyId] = v
+		}
+
+		// 已授权分类id
+		permissionChartIdList, permissionClassifyIdList, err := data_manage_permission.GetUserChartAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range list {
+			if existItem, ok := myChartMap[v.ChartInfoId]; ok {
+				v.IsAdd = true
+				v.MyChartId = existItem.MyChartId
+				v.MyChartClassifyId = existItem.MyChartClassifyId
+			}
+			// 权限
+			if currClassify, ok := classifyMap[v.ChartClassifyId]; ok {
+				v.HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(v.IsJoinPermission, currClassify.IsJoinPermission, v.ChartInfoId, v.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
+			}
 		}
 	}
 
@@ -3823,55 +4014,96 @@ func (this *EdbInfoController) RelationEdbList() {
 	}
 
 	edbList := make([]*data_manage.ChartEdbInfoMapping, 0)
-	for _, v := range list {
-		item := new(data_manage.ChartEdbInfoMapping)
-		item.EdbInfoId = v.EdbInfoId
-		item.SourceName = v.SourceName
-		item.Source = v.Source
-		item.EdbCode = v.EdbCode
-		item.EdbName = v.EdbName
-		item.EdbNameEn = v.EdbNameEn
-		item.Frequency = v.Frequency
-		item.FrequencyEn = data.GetFrequencyEn(v.Frequency)
-		if v.Unit != `无` {
-			item.Unit = v.Unit
-		}
-		item.UnitEn = v.UnitEn
-		item.StartDate = v.StartDate
-		item.EndDate = v.EndDate
-		item.ModifyTime = v.ModifyTime
-		item.IsAxis = 1
-		item.LeadValue = 0
-		item.LeadUnit = ""
-		item.ChartEdbMappingId = 0
-		item.ChartInfoId = 0
-		item.IsOrder = false
-		item.EdbInfoType = v.EdbInfoType
-		item.EdbInfoCategoryType = v.EdbInfoType
-		item.ChartStyle = ""
-		item.ChartColor = ""
-		item.ChartWidth = 0
-		item.MaxData = v.MaxValue
-		item.MinData = v.MinValue
-		item.LatestValue = v.LatestValue
-		item.LatestDate = v.LatestDate
-		item.UniqueCode = v.UniqueCode
-		item.ClassifyId = v.ClassifyId
-
-		dataList := make([]*data_manage.EdbDataList, 0)
-		if v.EdbInfoType == 0 {
-			dataList, err = data_manage.GetEdbDataList(v.Source, v.SubSource, v.EdbInfoId, "", "")
-		} else {
-			_, dataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(v.EdbInfoId, "", "", false)
+
+	if len(list) > 0 {
+
+		// 当前的分类
+		classifyMap := make(map[int]*data_manage.EdbClassify)
+		{
+			classifyIdList := make([]int, 0)
+			for _, v := range list {
+				classifyIdList = append(classifyIdList, v.ClassifyId)
+			}
+			classifyList, err := data_manage.GetEdbClassifyByIdList(classifyIdList)
+			if err != nil {
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+					return
+				}
+			}
+
+			for _, v := range classifyList {
+				classifyMap[v.ClassifyId] = v
+			}
 		}
+
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
 		if err != nil {
 			br.Msg = "获取失败"
-			br.Msg = "获取失败,Err:" + err.Error()
+			br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
 			return
 		}
 
-		item.DataList = dataList
-		edbList = append(edbList, item)
+		for _, v := range list {
+			item := new(data_manage.ChartEdbInfoMapping)
+			item.EdbInfoId = v.EdbInfoId
+			item.SourceName = v.SourceName
+			item.Source = v.Source
+			item.EdbCode = v.EdbCode
+			item.EdbName = v.EdbName
+			item.EdbNameEn = v.EdbNameEn
+			item.Frequency = v.Frequency
+			item.FrequencyEn = data.GetFrequencyEn(v.Frequency)
+			if v.Unit != `无` {
+				item.Unit = v.Unit
+			}
+			item.UnitEn = v.UnitEn
+			item.StartDate = v.StartDate
+			item.EndDate = v.EndDate
+			item.ModifyTime = v.ModifyTime
+			item.IsAxis = 1
+			item.LeadValue = 0
+			item.LeadUnit = ""
+			item.ChartEdbMappingId = 0
+			item.ChartInfoId = 0
+			item.IsOrder = false
+			item.EdbInfoType = v.EdbInfoType
+			item.EdbInfoCategoryType = v.EdbInfoType
+			item.ChartStyle = ""
+			item.ChartColor = ""
+			item.ChartWidth = 0
+			item.MaxData = v.MaxValue
+			item.MinData = v.MinValue
+			item.LatestValue = v.LatestValue
+			item.LatestDate = v.LatestDate
+			item.UniqueCode = v.UniqueCode
+			item.ClassifyId = v.ClassifyId
+
+			dataList := make([]*data_manage.EdbDataList, 0)
+			// 指标权限
+			if currClassify, ok := classifyMap[v.ClassifyId]; ok {
+				item.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(v.IsJoinPermission, currClassify.IsJoinPermission, v.EdbInfoId, v.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			}
+
+			// 有权限则获取数据
+			if item.HaveOperaAuth {
+				if v.EdbInfoType == 0 {
+					dataList, err = data_manage.GetEdbDataList(v.Source, v.SubSource, v.EdbInfoId, "", "")
+				} else {
+					_, dataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(v.EdbInfoId, "", "", false)
+				}
+				if err != nil {
+					br.Msg = "获取失败"
+					br.Msg = "获取失败,Err:" + err.Error()
+					return
+				}
+			}
+
+			item.DataList = dataList
+			edbList = append(edbList, item)
+		}
 	}
 
 	page = paging.GetPaging(currentIndex, pageSize, dataCount)
@@ -3883,192 +4115,6 @@ func (this *EdbInfoController) RelationEdbList() {
 	br.Data = resp
 }
 
-// MoveEdbChartList
-// @Title 获取指标/图表创建人列表数据接口
-// @Description 获取指标/图表创建人列表数据接口
-// @Param   PageSize   query   int  true       "每页数据条数"
-// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
-// @Param   Source   query   int  false       "来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库"
-// @Param   Keyword   query   string  false       "关键字,code或者名称"
-// @Param   Classify   query   string  false       "分类id"
-// @Param   UserId   query   int  false       "创建人id"
-// @Success 200 {object} data_manage.ChartListResp
-// @router /edb_chart/list [get]
-func (this *EdbInfoController) MoveEdbChartList() {
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		this.Data["json"] = br
-		this.ServeJSON()
-	}()
-	sysUser := this.SysUser
-	if sysUser == nil {
-		br.Msg = "请登录"
-		br.ErrMsg = "请登录,SysUser Is Empty"
-		br.Ret = 408
-		return
-	}
-
-	source, _ := this.GetInt("Source")
-	if source <= 0 || source > 5 {
-		br.Msg = "错误的来源"
-		br.IsSendEmail = false
-		return
-	}
-
-	userId, _ := this.GetInt("UserId")
-	keyword := this.GetString("Keyword")
-	classify := this.GetString("Classify")
-	pageSize, _ := this.GetInt("PageSize")
-	currentIndex, _ := this.GetInt("CurrentIndex")
-
-	var startSize int
-	if pageSize <= 0 {
-		pageSize = utils.PageSize20
-	}
-	if currentIndex <= 0 {
-		currentIndex = 1
-	}
-	startSize = paging.StartIndex(currentIndex, pageSize)
-	resp := data_manage.MoveEdbChartListResp{}
-	var total int
-	page := paging.GetPaging(currentIndex, pageSize, total)
-	defaultList := make([]data_manage.MoveEdbChartList, 0)
-	resp.List = defaultList
-	resp.Paging = page
-	// 没有传入条件,那就默认自动返回
-	if userId <= 0 && keyword == `` && classify == `` {
-		br.Ret = 200
-		br.Success = true
-		br.Msg = "获取成功"
-		br.Data = resp
-		return
-	}
-
-	list, total, err := data.GetMoveEdbChartList(source, userId, keyword, classify, startSize, pageSize)
-	if err != nil {
-		//br.Success = true
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
-	if list == nil {
-		list = defaultList
-	}
-
-	page = paging.GetPaging(currentIndex, pageSize, total)
-	resp.Paging = page
-	resp.List = list
-	br.Ret = 200
-	br.Success = true
-	br.Msg = "获取成功"
-	br.Data = resp
-}
-
-// MoveEdbChartUser
-// @Title 指标/图表创建人变更接口
-// @Description 指标/图表创建人变更接口
-// @Param   PageSize   query   int  true       "每页数据条数"
-// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
-// @Param   EdbInfoId   query   int  true       "指标id"
-// @Param   IsShowMe   query   bool  true       "是否只看我的,true、false"
-// @Success 200 {object} data_manage.ChartListResp
-// @router /edb_chart/change_user [post]
-func (this *EdbInfoController) MoveEdbChartUser() {
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		this.Data["json"] = br
-		this.ServeJSON()
-	}()
-	sysUser := this.SysUser
-	if sysUser == nil {
-		br.Msg = "请登录"
-		br.ErrMsg = "请登录,SysUser Is Empty"
-		br.Ret = 408
-		return
-	}
-
-	var req data_manage.MoveEdbChartReq
-	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
-	if err != nil {
-		br.Msg = "参数解析异常!"
-		br.ErrMsg = "参数解析失败,Err:" + err.Error()
-		return
-	}
-
-	if req.Source <= 0 || req.Source > 5 {
-		br.Msg = "错误的来源"
-		br.IsSendEmail = false
-		return
-	}
-
-	if len(req.DataIdList) <= 0 {
-		br.Msg = "请勾选数据项"
-		br.IsSendEmail = false
-		return
-	}
-	if req.NewUserId <= 0 {
-		br.Msg = "请选择新的创建人"
-		br.IsSendEmail = false
-		return
-	}
-
-	err, errMsg := data.MoveEdbChart(req.Source, req.NewUserId, req.DataIdList)
-	if err != nil {
-		//br.Success = true
-		br.Msg = "获取失败"
-		if errMsg != `` {
-			br.Msg = errMsg
-		}
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
-	br.Ret = 200
-	br.IsAddLog = true
-	br.Success = true
-	br.Msg = "修改成功"
-}
-
-// EdbChartClassifyList
-// @Title 获取指标/图表分类列表数据接口
-// @Description 获取指标/图表分类列表数据接口
-// @Param   Source   query   int  false       "来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库"
-// @Success 200 {object} data_manage.ChartListResp
-// @router /edb_chart/classify [get]
-func (this *EdbInfoController) EdbChartClassifyList() {
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		this.Data["json"] = br
-		this.ServeJSON()
-	}()
-	sysUser := this.SysUser
-	if sysUser == nil {
-		br.Msg = "请登录"
-		br.ErrMsg = "请登录,SysUser Is Empty"
-		br.Ret = 408
-		return
-	}
-
-	source, _ := this.GetInt("Source")
-	if source <= 0 || source > 5 {
-		br.Msg = "错误的来源"
-		br.IsSendEmail = false
-		return
-	}
-
-	list, err := data.GetEdbChartClassifyList(source)
-	if err != nil {
-		//br.Success = true
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
-
-	br.Ret = 200
-	br.Success = true
-	br.Msg = "获取成功"
-	br.Data = list
-}
-
 // EdbInfoDataTb
 // @Title 获取指标数据同比值
 // @Description 获取指标数据
@@ -4368,7 +4414,7 @@ func (this *EdbInfoController) TraceEdbInfo() {
 		return
 	}
 
-	resp, err := data.TraceEdbInfoByEdbInfoId(edbInfo.EdbInfoId)
+	resp, err := data.TraceEdbInfoByEdbInfoId(edbInfo.EdbInfoId, this.SysUser.AdminId)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.Msg = "获取失败,Err:" + err.Error()
@@ -4443,6 +4489,8 @@ func (this *EdbInfoController) AllEdbInfoByEs() {
 		}
 	}
 
+	// 是否走ES
+	isEs := false
 	if keyWord != "" {
 		var keyWordArr []string
 		keyWordArr = append(keyWordArr, keyWord)
@@ -4452,6 +4500,7 @@ func (this *EdbInfoController) AllEdbInfoByEs() {
 
 		// 普通的搜索
 		total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, -1, frequency, noPermissionEdbInfoIdList)
+		isEs = true
 	} else {
 		var condition string
 		var pars []interface{}
@@ -4501,8 +4550,73 @@ func (this *EdbInfoController) AllEdbInfoByEs() {
 
 	edbInfoListLen := len(edbInfoList)
 
+	classifyIdList := make([]int, 0)
 	for i := 0; i < edbInfoListLen; i++ {
 		edbInfoList[i].EdbNameAlias = edbInfoList[i].EdbName
+		classifyIdList = append(classifyIdList, edbInfoList[i].ClassifyId)
+	}
+
+	// 当前列表中的分类map
+	classifyMap := make(map[int]*data_manage.EdbClassify)
+	if edbInfoListLen > 0 {
+		classifyList, err := data_manage.GetEdbClassifyByIdList(classifyIdList)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range classifyList {
+			classifyMap[v.ClassifyId] = v
+		}
+
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+			return
+		}
+
+		// 如果是ES的话,需要重新查一下指标的信息,主要是为了把是否授权字段找出来
+		if isEs {
+			edbInfoIdList := make([]int, 0)
+			for i := 0; i < edbInfoListLen; i++ {
+				edbInfoIdList = append(edbInfoIdList, edbInfoList[i].EdbInfoId)
+				tmpEdbInfo := edbInfoList[i]
+				if currClassify, ok := classifyMap[tmpEdbInfo.ClassifyId]; ok {
+					edbInfoList[i].HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(tmpEdbInfo.IsJoinPermission, currClassify.IsJoinPermission, tmpEdbInfo.EdbInfoId, tmpEdbInfo.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+				}
+			}
+
+			tmpEdbList, err := data_manage.GetEdbInfoByIdList(edbInfoIdList)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+				return
+			}
+			edbInfoMap := make(map[int]*data_manage.EdbInfo)
+			for _, v := range tmpEdbList {
+				edbInfoMap[v.EdbInfoId] = v
+			}
+
+			for i := 0; i < edbInfoListLen; i++ {
+				tmpEdbInfo, ok := edbInfoMap[edbInfoList[i].EdbInfoId]
+				if !ok {
+					continue
+				}
+				edbInfoList[i].IsJoinPermission = tmpEdbInfo.IsJoinPermission
+			}
+		}
+
+		// 权限校验
+		for i := 0; i < edbInfoListLen; i++ {
+			tmpEdbInfoItem := edbInfoList[i]
+			if currClassify, ok := classifyMap[tmpEdbInfoItem.ClassifyId]; ok {
+				edbInfoList[i].HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(tmpEdbInfoItem.IsJoinPermission, currClassify.IsJoinPermission, tmpEdbInfoItem.EdbInfoId, tmpEdbInfoItem.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			}
+		}
+
 	}
 
 	for i := 0; i < edbInfoListLen; i++ {
@@ -5025,9 +5139,45 @@ func (this *EdbInfoController) EdbChartList() {
 	if len(list) == 0 {
 		list = make([]*data_manage.EdbInfoList, 0)
 	} else {
+		classifyIdList := make([]int, 0)
 		for _, v := range list {
-			v.Button = data.GetEdbOpButton(sysUser, v.SysUserId, v.EdbType, v.EdbInfoType)
+			classifyIdList = append(classifyIdList, v.ClassifyId)
+		}
+
+		// 指标权限
+		{
+			// 当前的分类
+			classifyMap := make(map[int]*data_manage.EdbClassify)
+			classifyList, err := data_manage.GetEdbClassifyByIdList(classifyIdList)
+			if err != nil {
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+					return
+				}
+			}
+
+			for _, v := range classifyList {
+				classifyMap[v.ClassifyId] = v
+			}
+
+			// 获取所有有权限的指标和分类
+			permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+				return
+			}
+
+			for _, v := range list {
+				if currClassify, ok := classifyMap[v.ClassifyId]; ok {
+					v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(v.IsJoinPermission, currClassify.IsJoinPermission, v.EdbInfoId, v.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+
+					v.Button = data.GetEdbOpButton(sysUser, v.SysUserId, v.EdbType, v.EdbInfoType, v.HaveOperaAuth)
+				}
+			}
 		}
+
 		page = paging.GetPaging(currentIndex, pageSize, int(dataCount))
 	}
 
@@ -5083,8 +5233,20 @@ func (this *EdbInfoController) Modify() {
 		br.ErrMsg = "获取指标信息失败, Err:" + err.Error()
 		return
 	}
+
+	var haveOperaAuth bool
+	// 权限校验
+	{
+		haveOperaAuth, err = data_manage_permission.CheckEdbPermissionByEdbInfoId(edbInfo.EdbInfoId, edbInfo.ClassifyId, edbInfo.IsJoinPermission, this.SysUser.AdminId)
+		if err != nil {
+			br.Msg = err.Error()
+			br.ErrMsg = "校验指标权限失败,err:" + err.Error()
+			return
+		}
+	}
+
 	// 编辑权限校验
-	button := data.GetEdbOpButton(this.SysUser, edbInfo.SysUserId, edbInfo.EdbType, edbInfo.EdbInfoType)
+	button := data.GetEdbOpButton(this.SysUser, edbInfo.SysUserId, edbInfo.EdbType, edbInfo.EdbInfoType, haveOperaAuth)
 	if !button.OpButton {
 		br.Msg = "无权限操作"
 		return

+ 98 - 14
controllers/data_manage/edb_info_calculate.go

@@ -6,6 +6,7 @@ import (
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
@@ -236,11 +237,28 @@ func (this *ChartInfoController) CalculateDetail() {
 		br.ErrMsg = errMsg
 		return
 	}
+
 	fullEdb.EdbInfo = edbInfo
 	fullEdb.ClassifyList = classifyList
 
+	var currClassifyItem *data_manage.EdbClassifyIdItems
+	for _, v := range classifyList {
+		if v.ClassifyId == edbInfo.ClassifyId {
+			currClassifyItem = v
+		}
+	}
+	if currClassifyItem != nil {
+		haveOperaAuth, err := data_manage_permission.CheckEdbPermission(edbInfo.IsJoinPermission, currClassifyItem.IsJoinPermission, sysUser.AdminId, edbInfo.EdbInfoId, edbInfo.ClassifyId)
+		if err != nil {
+			br.Msg = err.Error()
+			br.ErrMsg = "校验指标权限失败,err:" + err.Error()
+			return
+		}
+		fullEdb.HaveOperaAuth = haveOperaAuth
+	}
+
 	// 拟合残差计算相关系数
-	if edbInfo.Source == utils.DATA_SOURCE_CALCULATE_NHCC {
+	if fullEdb.HaveOperaAuth && edbInfo.Source == utils.DATA_SOURCE_CALCULATE_NHCC {
 		var aEdbInfo, bEdbInfo *data_manage.EdbInfoCalculateDetail
 		for _, v := range calculateList {
 			if v.FromTag == "A" {
@@ -2197,15 +2215,50 @@ func (this *ChartInfoController) CalculateMultiChoice() {
 
 	resp := new(data_manage.CalculateMultiChoiceResp)
 
-	for _, info := range list {
-		searchItem := data_manage.EdbInfoBase{
-			Frequency:  info.Frequency,
-			Unit:       info.Unit,
-			EdbName:    info.EdbName,
-			EdbInfoId:  info.EdbInfoId,
-			ClassifyId: info.ClassifyId,
+	if len(list) > 0 {
+		// 当前列表中的分类map
+		classifyMap := make(map[int]*data_manage.EdbClassify)
+		{
+			classifyIdList := make([]int, 0)
+			for _, info := range list {
+				classifyIdList = append(classifyIdList, info.ClassifyId)
+			}
+			classifyList, err := data_manage.GetEdbClassifyByIdList(classifyIdList)
+			if err != nil {
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+					return
+				}
+			}
+
+			for _, v := range classifyList {
+				classifyMap[v.ClassifyId] = v
+			}
+		}
+
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+			return
+		}
+		for _, info := range list {
+			var haveOperaAuth bool
+			if currClassify, ok := classifyMap[info.ClassifyId]; ok {
+				haveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(info.IsJoinPermission, currClassify.IsJoinPermission, info.EdbInfoId, info.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			}
+			searchItem := data_manage.EdbInfoBase{
+				Frequency:     info.Frequency,
+				Unit:          info.Unit,
+				EdbName:       info.EdbName,
+				EdbInfoId:     info.EdbInfoId,
+				ClassifyId:    info.ClassifyId,
+				HaveOperaAuth: haveOperaAuth,
+			}
+			searchItemList = append(searchItemList, searchItem)
 		}
-		searchItemList = append(searchItemList, searchItem)
 	}
 
 	resp.SearchItem = searchItemList
@@ -2300,18 +2353,44 @@ func (this *ChartInfoController) CalculateMultiSearch() {
 	page := paging.GetPaging(currentIndex, pageSize, total)
 	resp := new(data_manage.CalculateMultiEdbSearchResp)
 
-	edbList, e := data_manage.GetEdbInfoListByCondition(condition, pars, startSize, pageSize)
+	edbList, e := data_manage.GetEdbInfoListByCondition(condition, pars, startSize, pageSize, "")
 	if e != nil {
 		br.Msg = "获取指标列表失败"
 		br.ErrMsg = "获取指标列表失败,Err:" + e.Error()
 		return
 	}
 
-	for _, v := range edbList {
-		edbIdArr = append(edbIdArr, v.EdbInfoId)
-	}
+	if len(edbList) > 0 {
+		classifyIdList := make([]int, 0)
+		for _, v := range edbList {
+			edbIdArr = append(edbIdArr, v.EdbInfoId)
+			classifyIdList = append(classifyIdList, v.ClassifyId)
+		}
+
+		// 当前列表中的分类map
+		classifyMap := make(map[int]*data_manage.EdbClassify)
+		{
+			classifyList, err := data_manage.GetEdbClassifyByIdList(classifyIdList)
+			if err != nil {
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+					return
+				}
+			}
+			for _, v := range classifyList {
+				classifyMap[v.ClassifyId] = v
+			}
+		}
+
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+			return
+		}
 
-	if len(edbIdArr) > 0 {
 		list, err := data_manage.GetEdbInfoByIdList(edbIdArr)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取指标列表失败"
@@ -2319,6 +2398,10 @@ func (this *ChartInfoController) CalculateMultiSearch() {
 			return
 		}
 		for _, info := range list {
+			var haveOperaAuth bool
+			if currClassify, ok := classifyMap[info.ClassifyId]; ok {
+				haveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(info.IsJoinPermission, currClassify.IsJoinPermission, info.EdbInfoId, info.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			}
 			searchItem := data_manage.CalculateMultiEdbSearchItem{
 				Frequency:       info.Frequency,
 				Unit:            info.Unit,
@@ -2329,6 +2412,7 @@ func (this *ChartInfoController) CalculateMultiSearch() {
 				SysUserId:       info.SysUserId,
 				EndDate:         info.EndDate,
 				EndValue:        info.EndValue,
+				HaveOperaAuth:   haveOperaAuth,
 			}
 			searchItemList = append(searchItemList, searchItem)
 		}

+ 20 - 2
controllers/data_manage/excel/custom_analysis.go

@@ -8,6 +8,7 @@ import (
 	"eta/eta_api/models/data_manage/excel/request"
 	"eta/eta_api/models/data_manage/excel/response"
 	"eta/eta_api/services"
+	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/services/data/excel"
 	"eta/eta_api/utils"
 	"strconv"
@@ -66,6 +67,14 @@ func (c *CustomAnalysisController) ExcelByName() {
 		return
 	}
 
+	// 数据权限
+	haveOperaAuth, err := data_manage_permission.CheckExcelPermissionByExcelInfoId(excelDetail.ExcelInfoId, excelDetail.ExcelClassifyId, excelDetail.IsJoinPermission, c.SysUser.AdminId)
+	if err != nil {
+		br.Msg = "获取ETA表格失败"
+		br.ErrMsg = "获取ETA表格权限失败,Err:" + err.Error()
+		return
+	}
+
 	resp.IsFind = true
 	resp.ExcelInfo = response.FindExcelInfo{
 		ExcelInfoId:     excelDetail.ExcelInfoId,
@@ -81,7 +90,8 @@ func (c *CustomAnalysisController) ExcelByName() {
 		Sort:            excelDetail.Sort,
 		ModifyTime:      excelDetail.ModifyTime,
 		CreateTime:      excelDetail.CreateTime,
-		Button:          excel.GetExcelInfoOpButton(sysUser, excelDetail.SysUserId, excelDetail.Source),
+		Button:          excel.GetExcelInfoOpButton(sysUser, excelDetail.SysUserId, excelDetail.Source, haveOperaAuth),
+		HaveOperaAuth:   true,
 	}
 
 	if excelDetail != nil {
@@ -402,6 +412,13 @@ func (c *CustomAnalysisController) BaseExcelDetail() {
 		return
 	}
 
+	// 数据权限
+	haveOperaAuth, err := data_manage_permission.CheckExcelPermissionByExcelInfoId(excelDetail.ExcelInfoId, excelDetail.ExcelClassifyId, excelDetail.IsJoinPermission, c.SysUser.AdminId)
+	if err != nil {
+		br.Msg = "获取ETA表格失败"
+		br.ErrMsg = "获取ETA表格权限失败,Err:" + err.Error()
+		return
+	}
 
 	resp.IsFind = true
 	resp.ExcelInfo = response.FindExcelInfo{
@@ -418,7 +435,8 @@ func (c *CustomAnalysisController) BaseExcelDetail() {
 		Sort:            excelDetail.Sort,
 		ModifyTime:      excelDetail.ModifyTime,
 		CreateTime:      excelDetail.CreateTime,
-		Button:          excel.GetExcelInfoOpButton(sysUser, excelDetail.SysUserId, excelDetail.Source),
+		Button:          excel.GetExcelInfoOpButton(sysUser, excelDetail.SysUserId, excelDetail.Source, haveOperaAuth),
+		HaveOperaAuth:   true,
 	}
 	if markStatus.Status == 0 {
 		resp.ExcelInfo.CanEdit = true

+ 174 - 3
controllers/data_manage/excel/excel_classify.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_api/models/data_manage/excel"
 	"eta/eta_api/models/data_manage/excel/request"
 	response2 "eta/eta_api/models/data_manage/excel/response"
+	"eta/eta_api/services/data/data_manage_permission"
 	excel2 "eta/eta_api/services/data/excel"
 	"eta/eta_api/utils"
 	"fmt"
@@ -40,6 +41,12 @@ func (this *ExcelClassifyController) List() {
 	}
 	//只看我的
 	isShowMe, _ := this.GetBool("IsShowMe")
+	// 自定义分析只看自己的
+	if source == utils.CUSTOM_ANALYSIS_TABLE {
+		br = AnalysisClassifyList(this)
+		return
+	}
+
 	showUserId := 0
 	if isShowMe {
 		showUserId = this.SysUser.AdminId
@@ -51,6 +58,11 @@ func (this *ExcelClassifyController) List() {
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
+	// 分类map
+	classifyMap := make(map[int]*excel.ExcelClassifyItems)
+	for _, v := range classifyList {
+		classifyMap[v.ExcelClassifyId] = v
+	}
 
 	// 获取二级分类
 	// 获取三级分类
@@ -62,12 +74,28 @@ func (this *ExcelClassifyController) List() {
 		return
 	}
 
+	// 获取所有有权限的指标和分类
+	permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserExcelAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+		return
+	}
+
 	ExcelInfoMap := make(map[int][]*excel.ExcelClassifyItems)
 	for _, v := range allExcelInfo {
+		// 数据权限
+		if classifyInfo, ok := classifyMap[v.ExcelClassifyId]; ok {
+			v.HaveOperaAuth = data_manage_permission.CheckExcelPermissionByPermissionIdList(v.IsJoinPermission, classifyInfo.IsJoinPermission, v.ExcelInfoId, v.ExcelClassifyId, permissionEdbIdList, permissionClassifyIdList)
+		}
+
 		ExcelInfoMap[v.ExcelClassifyId] = append(ExcelInfoMap[v.ExcelClassifyId], v)
 	}
-	classifyMap := make(map[int][]*excel.ExcelClassifyItems)
+
+	classifyListMap := make(map[int][]*excel.ExcelClassifyItems)
 	for _, v := range classifyList {
+		// 数据权限
+		v.HaveOperaAuth = data_manage_permission.CheckExcelClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ExcelClassifyId, permissionClassifyIdList)
 		if existItems, ok := ExcelInfoMap[v.ExcelClassifyId]; ok {
 			v.Children = existItems
 		}
@@ -75,12 +103,108 @@ func (this *ExcelClassifyController) List() {
 
 	for _, v := range classifyList {
 		if v.ParentId > 0 {
-			classifyMap[v.ParentId] = append(classifyMap[v.ParentId], v)
+			classifyListMap[v.ParentId] = append(classifyListMap[v.ParentId], v)
 		}
 	}
 	//组装三级分类
 	for key, classify := range classifyList {
-		subList, ok := classifyMap[classify.ExcelClassifyId]
+		subList, ok := classifyListMap[classify.ExcelClassifyId]
+		if ok {
+			classifyList[key].Children = append(classifyList[key].Children, subList...)
+			sort.Slice(classifyList[key].Children, func(i, j int) bool {
+				return excel.ExcelClassifyItemBySort(classifyList[key].Children[i], classifyList[key].Children[j])
+			})
+		}
+	}
+
+	nodeAll := make([]*excel.ExcelClassifyItems, 0)
+	for _, v := range classifyList {
+		if v.ParentId == 0 {
+			sort.Slice(v.Children, func(i, j int) bool { return excel.ExcelClassifyItemBySort(v.Children[i], v.Children[j]) })
+			nodeAll = append(nodeAll, v)
+		}
+	}
+
+	resp := response2.ExcelClassifyListResp{
+		AllNodes: nodeAll,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+func AnalysisClassifyList(this *ExcelClassifyController) (br *models.BaseResponse) {
+	br = new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	source, _ := this.GetInt("Source")
+	if source <= 0 {
+		source = utils.EXCEL_DEFAULT
+	}
+	//只看我的
+	showUserId := this.SysUser.AdminId
+
+	classifyList, err := excel.GetExcelClassifyBySource(source)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	// 分类map
+	classifyMap := make(map[int]*excel.ExcelClassifyItems)
+	for _, v := range classifyList {
+		classifyMap[v.ExcelClassifyId] = v
+	}
+
+	// 获取二级分类
+	// 获取三级分类
+	// 根据来源获取所有excel表格(无内容)
+	allExcelInfo, err := excel.GetNoContentExcelInfoAll(source, showUserId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取表格信息失败,Err:" + err.Error()
+		return
+	}
+
+	// 获取所有有权限的指标和分类
+	permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserExcelAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+		return
+	}
+
+	ExcelInfoMap := make(map[int][]*excel.ExcelClassifyItems)
+	for _, v := range allExcelInfo {
+		// 数据权限
+		if classifyInfo, ok := classifyMap[v.ExcelClassifyId]; ok {
+			v.HaveOperaAuth = data_manage_permission.CheckExcelPermissionByPermissionIdList(v.IsJoinPermission, classifyInfo.IsJoinPermission, v.ExcelInfoId, v.ExcelClassifyId, permissionEdbIdList, permissionClassifyIdList)
+		}
+
+		ExcelInfoMap[v.ExcelClassifyId] = append(ExcelInfoMap[v.ExcelClassifyId], v)
+	}
+
+	classifyListMap := make(map[int][]*excel.ExcelClassifyItems)
+	for _, v := range classifyList {
+		// 数据权限
+		v.HaveOperaAuth = data_manage_permission.CheckExcelClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ExcelClassifyId, permissionClassifyIdList)
+		if existItems, ok := ExcelInfoMap[v.ExcelClassifyId]; ok {
+			v.Children = existItems
+		}
+	}
+
+	for _, v := range classifyList {
+		if v.ParentId > 0 {
+			classifyListMap[v.ParentId] = append(classifyListMap[v.ParentId], v)
+		}
+	}
+	//组装三级分类
+	for key, classify := range classifyList {
+		subList, ok := classifyListMap[classify.ExcelClassifyId]
 		if ok {
 			classifyList[key].Children = append(classifyList[key].Children, subList...)
 			sort.Slice(classifyList[key].Children, func(i, j int) bool {
@@ -96,6 +220,10 @@ func (this *ExcelClassifyController) List() {
 			nodeAll = append(nodeAll, v)
 		}
 	}
+
+	// 自定义分析只看自己的分类
+	nodeAll = removeNodesWithAnalysisClassify(nodeAll, this.SysUser.AdminId)
+
 	resp := response2.ExcelClassifyListResp{
 		AllNodes: nodeAll,
 	}
@@ -103,6 +231,45 @@ func (this *ExcelClassifyController) List() {
 	br.Success = true
 	br.Msg = "获取成功"
 	br.Data = resp
+
+	return
+}
+
+// removeNodesWithAnalysisClassify
+// @Description:  自定义分析只看自己的分类,所以需要移除分类
+// @author: Roc
+// @datetime 2024-04-09 13:46:51
+// @param nodes []*excel.ExcelClassifyItems
+// @param adminId int
+// @return []*excel.ExcelClassifyItems
+func removeNodesWithAnalysisClassify(nodes []*excel.ExcelClassifyItems, adminId int) []*excel.ExcelClassifyItems {
+	var newListNode []*excel.ExcelClassifyItems
+
+	for _, node := range nodes {
+		if node.Children != nil {
+			node.Children = removeNodesWithAnalysisClassify(node.Children, adminId)
+		}
+
+		// 如果是ETA表格,那么就保留
+		if node.ExcelInfoId > 0 {
+			newListNode = append(newListNode, node)
+			continue
+		}
+
+		// 如果是公共分类,且名下的ETA表格不为空,那么就保留
+		if node.SysUserId == 0 && node.Children != nil && len(node.Children) > 0 {
+			newListNode = append(newListNode, node)
+			continue
+		}
+
+		// 如果是自己的分类,那么就保留
+		if node.SysUserId == adminId {
+			newListNode = append(newListNode, node)
+			continue
+		}
+	}
+
+	return newListNode
 }
 
 // ExcelClassifyItems
@@ -251,6 +418,10 @@ func (this *ExcelClassifyController) AddExcelClassify() {
 		br.ErrMsg = "保存分类失败,Err:" + err.Error()
 		return
 	}
+	// 继承分类权限
+	{
+		go data_manage_permission.InheritParentClassify(6, source, classify.ExcelClassifyId, classify.ParentId, classify.ExcelClassifyName)
+	}
 	br.Ret = 200
 	br.Msg = "保存成功"
 	br.Success = true

+ 68 - 23
controllers/data_manage/excel/excel_info.go

@@ -11,6 +11,7 @@ import (
 	"eta/eta_api/models/data_manage/excel/response"
 	"eta/eta_api/services"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/data/data_manage_permission"
 	excel2 "eta/eta_api/services/data/excel"
 	"eta/eta_api/services/excel"
 	"eta/eta_api/utils"
@@ -397,9 +398,47 @@ func (c *ExcelInfoController) List() {
 		return
 	}
 
-	if list == nil || len(list) <= 0 || (err != nil && err.Error() == utils.ErrNoRow()) {
+	lenList := len(list)
+	if list == nil || lenList <= 0 || (err != nil && err.Error() == utils.ErrNoRow()) {
 		list = make([]*excel3.MyExcelInfoList, 0)
 	}
+
+	if lenList > 0 {
+		classifyIdList := make([]int, 0)
+		for _, v := range list {
+			classifyIdList = append(classifyIdList, v.ExcelClassifyId)
+		}
+		classifyMap := make(map[int]*excel3.ExcelClassify)
+
+		// 分类信息
+		{
+			classifyList, err := excel3.GetClassifyByIdList(classifyIdList)
+			if err != nil {
+				br.Msg = "获取表格列表信息失败"
+				br.ErrMsg = "获取表格分类列表数据失败,Err:" + err.Error()
+				return
+			}
+			for _, v := range classifyList {
+				classifyMap[v.ExcelClassifyId] = v
+			}
+		}
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserExcelAndClassifyPermissionList(c.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range list {
+			// 数据权限
+			if classifyInfo, ok := classifyMap[v.ExcelClassifyId]; ok {
+				v.HaveOperaAuth = data_manage_permission.CheckExcelPermissionByPermissionIdList(v.IsJoinPermission, classifyInfo.IsJoinPermission, v.ExcelInfoId, v.ExcelClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			}
+		}
+
+	}
+
 	// 总数据量
 	dataCount, err := excel3.GetExcelListCountByCondition(condition, pars)
 	if err != nil && err.Error() != utils.ErrNoRow() {
@@ -448,7 +487,7 @@ func (c *ExcelInfoController) Detail() {
 	}
 
 	// 获取数据详情
-	excelDetail, errMsg, err := excel2.GetExcelDetailInfoByExcelInfoId(excelInfoId)
+	excelDetail, errMsg, err := excel2.GetExcelDetailInfoByExcelInfoId(excelInfoId, c.SysUser.AdminId)
 	if err != nil {
 		br.Msg = errMsg
 		br.ErrMsg = err.Error()
@@ -469,7 +508,7 @@ func (c *ExcelInfoController) Detail() {
 	}
 
 	// excel表格按钮权限
-	excelDetail.Button = excel2.GetExcelInfoOpButton(sysUser, excelDetail.SysUserId, excelDetail.Source)
+	excelDetail.Button = excel2.GetExcelInfoOpButton(sysUser, excelDetail.SysUserId, excelDetail.Source, excelDetail.HaveOperaAuth)
 
 	br.Ret = 200
 	br.Success = true
@@ -601,7 +640,14 @@ func (c *ExcelInfoController) Edit() {
 
 	// 操作权限校验
 	{
-		button := excel2.GetExcelInfoOpButton(sysUser, excelInfo.SysUserId, excelInfo.Source)
+		// 数据权限
+		haveOperaAuth, err := data_manage_permission.CheckExcelPermissionByExcelInfoId(excelInfo.ExcelInfoId, excelInfo.ExcelClassifyId, excelInfo.IsJoinPermission, c.SysUser.AdminId)
+		if err != nil {
+			br.Msg = "获取ETA表格失败"
+			br.ErrMsg = "获取ETA表格权限失败,Err:" + err.Error()
+			return
+		}
+		button := excel2.GetExcelInfoOpButton(sysUser, excelInfo.SysUserId, excelInfo.Source, haveOperaAuth)
 		if !button.OpButton {
 			br.Msg = "无操作权限"
 			br.Msg = "无操作权限"
@@ -1877,7 +1923,7 @@ func (c *ExcelInfoController) Refresh() {
 	}
 
 	// 获取数据详情
-	excelDetail, errMsg, err := excel2.GetExcelDetailInfoByExcelInfoId(excelInfoId)
+	excelDetail, errMsg, err := excel2.GetExcelDetailInfoByExcelInfoId(excelInfoId, c.SysUser.AdminId)
 	if err != nil {
 		br.Msg = errMsg
 		br.ErrMsg = err.Error()
@@ -1886,9 +1932,8 @@ func (c *ExcelInfoController) Refresh() {
 
 	// 操作权限校验
 	{
-		button := excel2.GetExcelInfoOpButton(sysUser, excelDetail.SysUserId, excelDetail.Source)
+		button := excel2.GetExcelInfoOpButton(sysUser, excelDetail.SysUserId, excelDetail.Source, excelDetail.HaveOperaAuth)
 		if !button.RefreshButton {
-			br.Msg = "无操作权限"
 			br.Msg = "无操作权限"
 			br.IsSendEmail = false
 			return
@@ -2296,13 +2341,13 @@ func decompressZip(src string) error {
 // @Param	request	body request.MarkEditSandbox true "type json string"
 // @Success 200 标记成功 ;202 标记成功
 // @router /excel_info/mark [post]
-func (this *ExcelInfoController) MarkEditStatus() {
+func (c *ExcelInfoController) MarkEditStatus() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
-		this.Data["json"] = br
-		this.ServeJSON()
+		c.Data["json"] = br
+		c.ServeJSON()
 	}()
-	sysUser := this.SysUser
+	sysUser := c.SysUser
 	if sysUser == nil {
 		br.Msg = "请登录"
 		br.ErrMsg = "请登录,SysUser Is Empty"
@@ -2310,7 +2355,7 @@ func (this *ExcelInfoController) MarkEditStatus() {
 		return
 	}
 	var req request.MarkEditExcel
-	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
 	if err != nil {
 		br.Msg = "参数解析异常!"
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
@@ -2350,16 +2395,16 @@ func (this *ExcelInfoController) MarkEditStatus() {
 // @Param	request	body excel3.BatchRefreshExcelReq true "type json string"
 // @Success Ret=200 刷新成功
 // @router /excel_info/table/batch_refresh [post]
-func (this *ExcelInfoController) BatchRefresh() {
+func (c *ExcelInfoController) BatchRefresh() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		if br.ErrMsg == "" {
 			br.IsSendEmail = false
 		}
-		this.Data["json"] = br
-		this.ServeJSON()
+		c.Data["json"] = br
+		c.ServeJSON()
 	}()
-	sysUser := this.SysUser
+	sysUser := c.SysUser
 	if sysUser == nil {
 		br.Msg = "请登录"
 		br.ErrMsg = "请登录,SysUser Is Empty"
@@ -2367,7 +2412,7 @@ func (this *ExcelInfoController) BatchRefresh() {
 		return
 	}
 	var req excel3.BatchRefreshExcelReq
-	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
 	if err != nil {
 		br.Msg = "参数解析异常!"
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
@@ -2381,7 +2426,7 @@ func (this *ExcelInfoController) BatchRefresh() {
 	}
 
 	// 获取表格关联的指标IDs
-	edbIds, e := excel2.GetEdbIdsFromExcelCodes(req.ExcelCodes)
+	edbIds, e := excel2.GetEdbIdsFromExcelCodes(req.ExcelCodes, sysUser.AdminId)
 	if e != nil {
 		br.Msg = "刷新失败"
 		br.ErrMsg = "获取表格关联的指标IDs失败, Err: " + e.Error()
@@ -2416,13 +2461,13 @@ func (this *ExcelInfoController) BatchRefresh() {
 // @Param	request	body excel3.BatchRefreshExcelReq true "type json string"
 // @Success Ret=200 刷新成功
 // @router /excel_info/table/batch_refresh/result [post]
-func (this *ExcelInfoController) GetBatchChartRefreshResult() {
+func (c *ExcelInfoController) GetBatchChartRefreshResult() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
-		this.Data["json"] = br
-		this.ServeJSON()
+		c.Data["json"] = br
+		c.ServeJSON()
 	}()
-	sysUser := this.SysUser
+	sysUser := c.SysUser
 	if sysUser == nil {
 		br.Msg = "请登录"
 		br.ErrMsg = "请登录,SysUser Is Empty"
@@ -2430,7 +2475,7 @@ func (this *ExcelInfoController) GetBatchChartRefreshResult() {
 		return
 	}
 	var req excel3.BatchRefreshExcelReq
-	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
 	if err != nil {
 		br.Msg = "参数解析异常!"
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()

+ 54 - 12
controllers/data_manage/excel/mixed_table.go

@@ -6,6 +6,7 @@ import (
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/data_manage/excel/request"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/data/data_manage_permission"
 	excel2 "eta/eta_api/services/data/excel"
 	"eta/eta_api/utils"
 	"fmt"
@@ -424,20 +425,61 @@ func (c *ExcelInfoController) GetBaseEdbInfo() {
 		br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
 		return
 	}
+
 	list := make([]*data_manage.BaseEdbNameItem, 0)
-	for _, v := range edbInfoList {
-		tmp := new(data_manage.BaseEdbNameItem)
-
-		tmp.EdbInfoId = v.EdbInfoId
-		tmp.EdbInfoType = v.EdbInfoType
-		tmp.EdbCode = v.EdbCode
-		tmp.EdbName = v.EdbName
-		tmp.Source = v.Source
-		tmp.SourceName = v.SourceName
-		tmp.Frequency = v.Frequency
-		tmp.Unit = v.Unit
-		list = append(list, tmp)
+
+	if len(edbInfoList) > 0 {
+		classifyIdList := make([]int, 0)
+		for _, v := range edbInfoList {
+			classifyIdList = append(classifyIdList, v.ClassifyId)
+		}
+		// 指标权限
+		{
+			// 当前的分类
+			classifyMap := make(map[int]*data_manage.EdbClassify)
+			classifyList, err := data_manage.GetEdbClassifyByIdList(classifyIdList)
+			if err != nil {
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+					return
+				}
+			}
+
+			for _, v := range classifyList {
+				classifyMap[v.ClassifyId] = v
+			}
+
+			// 获取所有有权限的指标和分类
+			permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(c.SysUser.AdminId, 0, 0)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+				return
+			}
+
+			for _, v := range edbInfoList {
+				tmp := new(data_manage.BaseEdbNameItem)
+
+				// 指标权限
+				if currClassify, ok := classifyMap[v.ClassifyId]; ok {
+					tmp.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(v.IsJoinPermission, currClassify.IsJoinPermission, v.EdbInfoId, v.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+				}
+
+				tmp.EdbInfoId = v.EdbInfoId
+				tmp.EdbInfoType = v.EdbInfoType
+				tmp.EdbCode = v.EdbCode
+				tmp.EdbName = v.EdbName
+				tmp.Source = v.Source
+				tmp.SourceName = v.SourceName
+				tmp.Frequency = v.Frequency
+				tmp.Unit = v.Unit
+				list = append(list, tmp)
+			}
+		}
+
 	}
+
 	resp := data_manage.BaseEdbInfoResp{
 		List: list,
 	}

+ 3 - 3
controllers/data_manage/future_good/future_good_chart_classify.go

@@ -56,7 +56,7 @@ func (this *FutureGoodChartClassifyController) ChartClassifyList() {
 			return
 		}
 		// 移除没有权限的图表
-		allNodes := data.HandleNoPermissionChart(resp.AllNodes, noPermissionChartIdMap)
+		allNodes := data.HandleNoPermissionChart(resp.AllNodes, noPermissionChartIdMap, this.SysUser.AdminId)
 		resp.AllNodes = allNodes
 
 		br.Ret = 200
@@ -97,7 +97,7 @@ func (this *FutureGoodChartClassifyController) ChartClassifyList() {
 	}
 
 	// 移除没有权限的图表
-	allNodes := data.HandleNoPermissionChart(rootList, noPermissionChartIdMap)
+	allNodes := data.HandleNoPermissionChart(rootList, noPermissionChartIdMap, this.SysUser.AdminId)
 	resp.AllNodes = allNodes
 
 	br.Ret = 200
@@ -450,7 +450,7 @@ func (this *FutureGoodChartClassifyController) DeleteChartClassify() {
 			return
 		}
 		//图表操作权限
-		ok := data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+		ok := data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 		if !ok {
 			br.Msg = "没有该图表的操作权限"
 			br.ErrMsg = "没有该图表的操作权限"

+ 84 - 5
controllers/data_manage/future_good/future_good_chart_info.go

@@ -10,6 +10,7 @@ import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/services"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/data/data_manage_permission"
 	future_goodServ "eta/eta_api/services/data/future_good"
 	etaTrialService "eta/eta_api/services/eta_trial"
 	"eta/eta_api/utils"
@@ -653,7 +654,7 @@ func (this *FutureGoodChartInfoController) ChartInfoEdit() {
 	}
 
 	//图表操作权限
-	ok := data.CheckOpChartPermission(sysUser, chartItem.SysUserId)
+	ok := data.CheckOpChartPermission(sysUser, chartItem.SysUserId, true)
 	if !ok {
 		br.Msg = "没有该图表的操作权限"
 		br.ErrMsg = "没有该图表的操作权限"
@@ -1397,7 +1398,7 @@ func getFutureGoodChartInfo(chartInfo *data_manage.ChartInfoView, chartType, dat
 	}
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	chartInfo.Button.IsEdit = chartInfo.IsEdit
 	chartInfo.Button.IsCopy = true
 	//判断是否需要展示英文标识
@@ -1495,6 +1496,72 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	resp = new(data_manage.ChartInfoDetailFromUniqueCodeResp)
 
 	adminId := sysUser.AdminId
+	// 指标数据map
+	edbClassifyPermissionMap := make(map[int]data_manage_permission.EdbClassifyPermission)
+	defer func() {
+		if isOk {
+			resp.ChartInfo.HaveOperaAuth = true
+
+			// 指标权限
+			{
+				classifyMap := make(map[int]*data_manage.EdbClassify)
+				// 分类
+				{
+					classifyIdList := make([]int, 0)
+					for _, v := range resp.EdbInfoList {
+						classifyIdList = append(classifyIdList, v.ClassifyId)
+					}
+					classifyList, tmpErr := data_manage.GetEdbClassifyByIdList(classifyIdList)
+					if tmpErr != nil {
+						errMsg = "获取分类列表失败,Err:" + tmpErr.Error()
+						return
+					}
+					for _, v := range classifyList {
+						classifyMap[v.ClassifyId] = v
+					}
+				}
+
+				// 指标
+				if len(edbClassifyPermissionMap) < 0 {
+					edbInfoIdList := make([]int, 0)
+					for _, v := range resp.EdbInfoList {
+						edbInfoIdList = append(edbInfoIdList, v.EdbInfoId)
+					}
+					edbInfoList, tmpErr := data_manage.GetEdbInfoByIdList(edbInfoIdList)
+					if tmpErr != nil {
+						errMsg = "获取指标列表失败,Err:" + tmpErr.Error()
+						return
+					}
+					for _, v := range edbInfoList {
+						edbClassifyPermissionMap[v.EdbInfoId] = data_manage_permission.EdbClassifyPermission{
+							ClassifyId:       v.ClassifyId,
+							IsJoinPermission: v.IsJoinPermission,
+							EdbInfoId:        v.EdbInfoId,
+						}
+					}
+				}
+
+				// 获取所有有权限的指标和分类
+				permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUser.AdminId, 0, 0)
+				if err != nil {
+					errMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+					return
+				}
+
+				for _, v := range resp.EdbInfoList {
+					// 数据权限
+					edbItem, ok := edbClassifyPermissionMap[v.EdbInfoId]
+					if !ok {
+						continue
+					}
+
+					if currClassify, ok := classifyMap[edbItem.ClassifyId]; ok {
+						v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(edbItem.IsJoinPermission, currClassify.IsJoinPermission, edbItem.EdbInfoId, edbItem.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+					}
+				}
+			}
+		}
+	}()
 
 	//判断是否存在缓存,如果存在缓存,那么直接从缓存中获取
 	key := data.GetChartInfoDataKey(chartInfo.ChartInfoId)
@@ -1646,7 +1713,7 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	}
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	chartInfo.Button.IsEdit = chartInfo.IsEdit
 	chartInfo.Button.IsCopy = true
 	//判断是否需要展示英文标识
@@ -1659,6 +1726,7 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
 
 	resp.ChartInfo = chartInfo
+
 	resp.EdbInfoList = edbList
 	resp.XEdbIdValue = xEdbIdValue
 	resp.YDataList = yDataList
@@ -1666,6 +1734,15 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	resp.BarChartInfo = barConfig
 	resp.Status = true
 
+	// 遍历到校验map
+	for _, v := range edbList {
+		edbClassifyPermissionMap[v.EdbInfoId] = data_manage_permission.EdbClassifyPermission{
+			ClassifyId:       v.ClassifyId,
+			IsJoinPermission: v.IsJoinPermission,
+			EdbInfoId:        v.EdbInfoId,
+		}
+	}
+
 	// 将数据加入缓存
 	if utils.Re == nil {
 		data, _ := json.Marshal(resp)
@@ -2099,7 +2176,7 @@ func (this *FutureGoodChartInfoController) BaseChartInfoDetailFromUniqueCode() {
 		}
 
 		//图表操作权限
-		chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+		chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 		chartInfo.Button.IsEdit = chartInfo.IsEdit
 		chartInfo.Button.IsCopy = true
 		//判断是否需要展示英文标识
@@ -2225,6 +2302,8 @@ func (this *FutureGoodChartInfoController) ChartInfoSearchByEs() {
 		for _, v := range searchList {
 			tmp := new(data_manage.ChartInfoMore)
 			tmp.ChartInfo = *v
+			// 图表数据权限
+			tmp.HaveOperaAuth = true
 			//判断是否需要展示英文标识
 			if edbTmpList, ok := chartEdbMap[v.ChartInfoId]; ok {
 				tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, edbTmpList, v.Source, v.ChartType)
@@ -2905,7 +2984,7 @@ func (this *FutureGoodChartInfoController) PreviewBarChartInfo() {
 	}
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	chartInfo.Button.IsEdit = chartInfo.IsEdit
 	chartInfo.Button.IsCopy = true
 	//判断是否需要展示英文标识

+ 81 - 4
controllers/data_manage/future_good/future_good_profit_chart_info.go

@@ -9,6 +9,7 @@ import (
 	"eta/eta_api/models/data_manage/future_good/response"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/data/data_manage_permission"
 	future_goodServ "eta/eta_api/services/data/future_good"
 	"eta/eta_api/utils"
 	"fmt"
@@ -412,7 +413,7 @@ func (this *FutureGoodChartInfoController) ProfitChartInfoEdit() {
 	}
 
 	//图表操作权限
-	ok := data.CheckOpChartPermission(sysUser, chartItem.SysUserId)
+	ok := data.CheckOpChartPermission(sysUser, chartItem.SysUserId, true)
 	if !ok {
 		br.Msg = "没有该图表的操作权限"
 		br.ErrMsg = "没有该图表的操作权限"
@@ -957,7 +958,7 @@ func (this *FutureGoodChartInfoController) PreviewProfitChartInfo() {
 	}
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	chartInfo.Button.IsEdit = chartInfo.IsEdit
 	chartInfo.Button.IsCopy = true
 	//判断是否需要展示英文标识
@@ -1073,7 +1074,7 @@ func getFutureGoodProfitChartInfo(chartInfo *data_manage.ChartInfoView, sysUser
 	}
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	chartInfo.Button.IsEdit = chartInfo.IsEdit
 	chartInfo.Button.IsCopy = true
 	//判断是否需要展示英文标识
@@ -1108,6 +1109,73 @@ func GetFutureGoodProfitChartInfoDetailFromUniqueCode(chartInfo *data_manage.Cha
 
 	adminId := sysUser.AdminId
 
+	// 指标数据map
+	edbClassifyPermissionMap := make(map[int]data_manage_permission.EdbClassifyPermission)
+	defer func() {
+		if isOk {
+			resp.ChartInfo.HaveOperaAuth = true
+
+			// 指标权限
+			{
+				classifyMap := make(map[int]*data_manage.EdbClassify)
+				// 分类
+				{
+					classifyIdList := make([]int, 0)
+					for _, v := range resp.EdbInfoList {
+						classifyIdList = append(classifyIdList, v.ClassifyId)
+					}
+					classifyList, tmpErr := data_manage.GetEdbClassifyByIdList(classifyIdList)
+					if tmpErr != nil {
+						errMsg = "获取分类列表失败,Err:" + tmpErr.Error()
+						return
+					}
+					for _, v := range classifyList {
+						classifyMap[v.ClassifyId] = v
+					}
+				}
+
+				// 指标
+				if len(edbClassifyPermissionMap) < 0 {
+					edbInfoIdList := make([]int, 0)
+					for _, v := range resp.EdbInfoList {
+						edbInfoIdList = append(edbInfoIdList, v.EdbInfoId)
+					}
+					edbInfoList, tmpErr := data_manage.GetEdbInfoByIdList(edbInfoIdList)
+					if tmpErr != nil {
+						errMsg = "获取指标列表失败,Err:" + tmpErr.Error()
+						return
+					}
+					for _, v := range edbInfoList {
+						edbClassifyPermissionMap[v.EdbInfoId] = data_manage_permission.EdbClassifyPermission{
+							ClassifyId:       v.ClassifyId,
+							IsJoinPermission: v.IsJoinPermission,
+							EdbInfoId:        v.EdbInfoId,
+						}
+					}
+				}
+
+				// 获取所有有权限的指标和分类
+				permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUser.AdminId, 0, 0)
+				if err != nil {
+					errMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+					return
+				}
+
+				for _, v := range resp.EdbInfoList {
+					// 数据权限
+					edbItem, ok := edbClassifyPermissionMap[v.EdbInfoId]
+					if !ok {
+						continue
+					}
+
+					if currClassify, ok := classifyMap[edbItem.ClassifyId]; ok {
+						v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(edbItem.IsJoinPermission, currClassify.IsJoinPermission, edbItem.EdbInfoId, edbItem.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+					}
+				}
+			}
+		}
+	}()
+
 	//判断是否存在缓存,如果存在缓存,那么直接从缓存中获取
 	key := data.GetChartInfoDataKey(chartInfo.ChartInfoId)
 	if utils.Re == nil && isCache {
@@ -1248,7 +1316,7 @@ func GetFutureGoodProfitChartInfoDetailFromUniqueCode(chartInfo *data_manage.Cha
 	}
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	chartInfo.Button.IsEdit = chartInfo.IsEdit
 	chartInfo.Button.IsCopy = true
 	//判断是否需要展示英文标识
@@ -1271,6 +1339,15 @@ func GetFutureGoodProfitChartInfoDetailFromUniqueCode(chartInfo *data_manage.Cha
 	}
 	resp.Status = true
 
+	// 遍历到校验map
+	for _, v := range edbList {
+		edbClassifyPermissionMap[v.EdbInfoId] = data_manage_permission.EdbClassifyPermission{
+			ClassifyId:       v.ClassifyId,
+			IsJoinPermission: v.IsJoinPermission,
+			EdbInfoId:        v.EdbInfoId,
+		}
+	}
+
 	// 将数据加入缓存
 	if utils.Re == nil {
 		data, _ := json.Marshal(resp)

+ 2 - 2
controllers/data_manage/line_equation/line_chart_classify.go

@@ -101,7 +101,7 @@ func (this *LineEquationChartClassifyController) ChartClassifyList() {
 	}
 
 	// 移除没有权限的图表
-	allNodes := data.HandleNoPermissionChart(rootList, noPermissionChartIdMap)
+	allNodes := data.HandleNoPermissionChart(rootList, noPermissionChartIdMap, this.SysUser.AdminId)
 	resp.AllNodes = allNodes
 
 	br.Ret = 200
@@ -457,7 +457,7 @@ func (this *LineEquationChartClassifyController) DeleteChartClassify() {
 			return
 		}
 		//图表操作权限
-		ok := data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+		ok := data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 		if !ok {
 			br.Msg = "没有该图表的操作权限"
 			br.ErrMsg = "没有该图表的操作权限"

+ 133 - 2
controllers/data_manage/line_equation/line_chart_info.go

@@ -9,6 +9,7 @@ import (
 	"eta/eta_api/models/data_manage/line_equation/response"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/services/data/line_equation"
 	"eta/eta_api/utils"
 	"fmt"
@@ -829,7 +830,7 @@ func (this *LineEquationChartInfoController) Detail() {
 	}
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	//判断是否需要展示英文标识
 	chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, []*data_manage.ChartEdbInfoMapping{}, chartInfo.Source, chartInfo.ChartType)
 	//chartInfo.UnitEn = edbInfoMappingA.UnitEn
@@ -844,6 +845,58 @@ func (this *LineEquationChartInfoController) Detail() {
 		IsSetName: chartInfo.IsSetName,
 	}
 
+	chartInfo.HaveOperaAuth = true
+	// 指标权限
+	{
+		edbClassifyPermissionMap := make(map[int]data_manage_permission.EdbClassifyPermission)
+		classifyMap := make(map[int]*data_manage.EdbClassify)
+		// 分类
+		{
+			classifyIdList := make([]int, 0)
+			for _, v := range edbList {
+				classifyIdList = append(classifyIdList, v.ClassifyId)
+			}
+			classifyList, tmpErr := data_manage.GetEdbClassifyByIdList(classifyIdList)
+			if tmpErr != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取分类列表失败,Err:" + tmpErr.Error()
+				return
+			}
+			for _, v := range classifyList {
+				classifyMap[v.ClassifyId] = v
+			}
+		}
+
+		// 遍历到校验map
+		for _, v := range edbList {
+			edbClassifyPermissionMap[v.EdbInfoId] = data_manage_permission.EdbClassifyPermission{
+				ClassifyId:       v.ClassifyId,
+				IsJoinPermission: v.IsJoinPermission,
+				EdbInfoId:        v.EdbInfoId,
+			}
+		}
+
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range edbList {
+			// 数据权限
+			edbItem, ok := edbClassifyPermissionMap[v.EdbInfoId]
+			if !ok {
+				continue
+			}
+
+			if currClassify, ok := classifyMap[edbItem.ClassifyId]; ok {
+				v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(edbItem.IsJoinPermission, currClassify.IsJoinPermission, edbItem.EdbInfoId, edbItem.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			}
+		}
+	}
+
 	resp := new(data_manage.ChartInfoDetailResp)
 	resp.ChartInfo = chartInfo
 	resp.EdbInfoList = edbList
@@ -1150,6 +1203,73 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 
 	adminId := sysUser.AdminId
 
+	// 指标数据map
+	edbClassifyPermissionMap := make(map[int]data_manage_permission.EdbClassifyPermission)
+	defer func() {
+		if isOk {
+			resp.ChartInfo.HaveOperaAuth = true
+
+			// 指标权限
+			{
+				classifyMap := make(map[int]*data_manage.EdbClassify)
+				// 分类
+				{
+					classifyIdList := make([]int, 0)
+					for _, v := range resp.EdbInfoList {
+						classifyIdList = append(classifyIdList, v.ClassifyId)
+					}
+					classifyList, tmpErr := data_manage.GetEdbClassifyByIdList(classifyIdList)
+					if tmpErr != nil {
+						errMsg = "获取分类列表失败,Err:" + tmpErr.Error()
+						return
+					}
+					for _, v := range classifyList {
+						classifyMap[v.ClassifyId] = v
+					}
+				}
+
+				// 指标
+				if len(edbClassifyPermissionMap) < 0 {
+					edbInfoIdList := make([]int, 0)
+					for _, v := range resp.EdbInfoList {
+						edbInfoIdList = append(edbInfoIdList, v.EdbInfoId)
+					}
+					edbInfoList, tmpErr := data_manage.GetEdbInfoByIdList(edbInfoIdList)
+					if tmpErr != nil {
+						errMsg = "获取指标列表失败,Err:" + tmpErr.Error()
+						return
+					}
+					for _, v := range edbInfoList {
+						edbClassifyPermissionMap[v.EdbInfoId] = data_manage_permission.EdbClassifyPermission{
+							ClassifyId:       v.ClassifyId,
+							IsJoinPermission: v.IsJoinPermission,
+							EdbInfoId:        v.EdbInfoId,
+						}
+					}
+				}
+
+				// 获取所有有权限的指标和分类
+				permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUser.AdminId, 0, 0)
+				if err != nil {
+					errMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+					return
+				}
+
+				for _, v := range resp.EdbInfoList {
+					// 数据权限
+					edbItem, ok := edbClassifyPermissionMap[v.EdbInfoId]
+					if !ok {
+						continue
+					}
+
+					if currClassify, ok := classifyMap[edbItem.ClassifyId]; ok {
+						v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(edbItem.IsJoinPermission, currClassify.IsJoinPermission, edbItem.EdbInfoId, edbItem.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+					}
+				}
+			}
+		}
+	}()
+
 	//判断是否存在缓存,如果存在缓存,那么直接从缓存中获取
 	key := data.GetChartInfoDataKey(chartInfo.ChartInfoId)
 	if utils.Re == nil && isCache {
@@ -1263,7 +1383,7 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	}
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	//判断是否需要展示英文标识
 	chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, []*data_manage.ChartEdbInfoMapping{}, chartInfo.Source, chartInfo.ChartType)
 	//chartInfo.UnitEn = edbInfoMappingA.UnitEn
@@ -1288,6 +1408,15 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	resp.DataResp = resultResp
 	resp.Status = true
 
+	// 遍历到校验map
+	for _, v := range edbList {
+		edbClassifyPermissionMap[v.EdbInfoId] = data_manage_permission.EdbClassifyPermission{
+			ClassifyId:       v.ClassifyId,
+			IsJoinPermission: v.IsJoinPermission,
+			EdbInfoId:        v.EdbInfoId,
+		}
+	}
+
 	// 将数据加入缓存
 	if utils.Re == nil {
 		d, _ := json.Marshal(resp)
@@ -1508,6 +1637,8 @@ func (this *LineEquationChartInfoController) SearchByEs() {
 		for _, v := range searchList {
 			tmp := new(data_manage.ChartInfoMore)
 			tmp.ChartInfo = *v
+			// 图表数据权限
+			tmp.HaveOperaAuth = true
 			//判断是否需要展示英文标识
 			if _, ok := chartEdbMap[v.ChartInfoId]; ok {
 				tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, []*data_manage.ChartEdbInfoMapping{}, v.Source, v.ChartType)

+ 133 - 2
controllers/data_manage/line_feature/chart_info.go

@@ -10,6 +10,7 @@ import (
 	"eta/eta_api/models/data_manage/line_feature/response"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/data/data_manage_permission"
 	lineFeatureServ "eta/eta_api/services/data/line_feature"
 	"eta/eta_api/utils"
 	"fmt"
@@ -1920,7 +1921,7 @@ func (this *LineFeaturesChartInfoController) Detail() {
 	}
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	//判断是否需要展示英文标识
 	chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, []*data_manage.ChartEdbInfoMapping{}, chartInfo.Source, chartInfo.ChartType)
 	//chartInfo.UnitEn = edbInfoMappingA.UnitEn
@@ -1935,6 +1936,58 @@ func (this *LineFeaturesChartInfoController) Detail() {
 		IsSetName: chartInfo.IsSetName,
 	}
 
+	chartInfo.HaveOperaAuth = true
+	// 指标权限
+	{
+		edbClassifyPermissionMap := make(map[int]data_manage_permission.EdbClassifyPermission)
+		classifyMap := make(map[int]*data_manage.EdbClassify)
+		// 分类
+		{
+			classifyIdList := make([]int, 0)
+			for _, v := range edbList {
+				classifyIdList = append(classifyIdList, v.ClassifyId)
+			}
+			classifyList, tmpErr := data_manage.GetEdbClassifyByIdList(classifyIdList)
+			if tmpErr != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取分类列表失败,Err:" + tmpErr.Error()
+				return
+			}
+			for _, v := range classifyList {
+				classifyMap[v.ClassifyId] = v
+			}
+		}
+
+		// 遍历到校验map
+		for _, v := range edbList {
+			edbClassifyPermissionMap[v.EdbInfoId] = data_manage_permission.EdbClassifyPermission{
+				ClassifyId:       v.ClassifyId,
+				IsJoinPermission: v.IsJoinPermission,
+				EdbInfoId:        v.EdbInfoId,
+			}
+		}
+
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range edbList {
+			// 数据权限
+			edbItem, ok := edbClassifyPermissionMap[v.EdbInfoId]
+			if !ok {
+				continue
+			}
+
+			if currClassify, ok := classifyMap[edbItem.ClassifyId]; ok {
+				v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(edbItem.IsJoinPermission, currClassify.IsJoinPermission, edbItem.EdbInfoId, edbItem.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			}
+		}
+	}
+
 	resp := new(data_manage.ChartInfoDetailResp)
 	resp.ChartInfo = chartInfo
 	resp.EdbInfoList = edbList
@@ -2247,6 +2300,73 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 
 	adminId := sysUser.AdminId
 
+	// 指标数据map
+	edbClassifyPermissionMap := make(map[int]data_manage_permission.EdbClassifyPermission)
+	defer func() {
+		if isOk {
+			resp.ChartInfo.HaveOperaAuth = true
+
+			// 指标权限
+			{
+				classifyMap := make(map[int]*data_manage.EdbClassify)
+				// 分类
+				{
+					classifyIdList := make([]int, 0)
+					for _, v := range resp.EdbInfoList {
+						classifyIdList = append(classifyIdList, v.ClassifyId)
+					}
+					classifyList, tmpErr := data_manage.GetEdbClassifyByIdList(classifyIdList)
+					if tmpErr != nil {
+						errMsg = "获取分类列表失败,Err:" + tmpErr.Error()
+						return
+					}
+					for _, v := range classifyList {
+						classifyMap[v.ClassifyId] = v
+					}
+				}
+
+				// 指标
+				if len(edbClassifyPermissionMap) < 0 {
+					edbInfoIdList := make([]int, 0)
+					for _, v := range resp.EdbInfoList {
+						edbInfoIdList = append(edbInfoIdList, v.EdbInfoId)
+					}
+					edbInfoList, tmpErr := data_manage.GetEdbInfoByIdList(edbInfoIdList)
+					if tmpErr != nil {
+						errMsg = "获取指标列表失败,Err:" + tmpErr.Error()
+						return
+					}
+					for _, v := range edbInfoList {
+						edbClassifyPermissionMap[v.EdbInfoId] = data_manage_permission.EdbClassifyPermission{
+							ClassifyId:       v.ClassifyId,
+							IsJoinPermission: v.IsJoinPermission,
+							EdbInfoId:        v.EdbInfoId,
+						}
+					}
+				}
+
+				// 获取所有有权限的指标和分类
+				permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUser.AdminId, 0, 0)
+				if err != nil {
+					errMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+					return
+				}
+
+				for _, v := range resp.EdbInfoList {
+					// 数据权限
+					edbItem, ok := edbClassifyPermissionMap[v.EdbInfoId]
+					if !ok {
+						continue
+					}
+
+					if currClassify, ok := classifyMap[edbItem.ClassifyId]; ok {
+						v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(edbItem.IsJoinPermission, currClassify.IsJoinPermission, edbItem.EdbInfoId, edbItem.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+					}
+				}
+			}
+		}
+	}()
+
 	//判断是否存在缓存,如果存在缓存,那么直接从缓存中获取
 	key := data.GetChartInfoDataKey(chartInfo.ChartInfoId)
 	if utils.Re == nil && isCache {
@@ -2395,7 +2515,7 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	}
 
 	//图表操作权限
-	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 	//判断是否需要展示英文标识
 	chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, []*data_manage.ChartEdbInfoMapping{}, chartInfo.Source, chartInfo.ChartType)
 	//chartInfo.UnitEn = edbInfoMappingA.UnitEn
@@ -2420,6 +2540,15 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	resp.DataResp = resultResp
 	resp.Status = true
 
+	// 遍历到校验map
+	for _, v := range edbList {
+		edbClassifyPermissionMap[v.EdbInfoId] = data_manage_permission.EdbClassifyPermission{
+			ClassifyId:       v.ClassifyId,
+			IsJoinPermission: v.IsJoinPermission,
+			EdbInfoId:        v.EdbInfoId,
+		}
+	}
+
 	// 将数据加入缓存
 	if utils.Re == nil {
 		d, _ := json.Marshal(resp)
@@ -2640,6 +2769,8 @@ func (this *LineFeaturesChartInfoController) SearchByEs() {
 		for _, v := range searchList {
 			tmp := new(data_manage.ChartInfoMore)
 			tmp.ChartInfo = *v
+			// 图表数据权限
+			tmp.HaveOperaAuth = true
 			//判断是否需要展示英文标识
 			if _, ok := chartEdbMap[v.ChartInfoId]; ok {
 				tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, []*data_manage.ChartEdbInfoMapping{}, v.Source, v.ChartType)

+ 2 - 2
controllers/data_manage/line_feature/classify.go

@@ -101,7 +101,7 @@ func (this *LineFeaturesChartClassifyController) ChartClassifyList() {
 	}
 
 	// 移除没有权限的图表
-	allNodes := data.HandleNoPermissionChart(rootList, noPermissionChartIdMap)
+	allNodes := data.HandleNoPermissionChart(rootList, noPermissionChartIdMap, this.SysUser.AdminId)
 	resp.AllNodes = allNodes
 
 	br.Ret = 200
@@ -457,7 +457,7 @@ func (this *LineFeaturesChartClassifyController) DeleteChartClassify() {
 			return
 		}
 		//图表操作权限
-		ok := data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+		ok := data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
 		if !ok {
 			br.Msg = "没有该图表的操作权限"
 			br.ErrMsg = "没有该图表的操作权限"

+ 213 - 15
controllers/data_manage/my_chart.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
@@ -132,6 +133,39 @@ func (this *MyChartController) ChartList() {
 	listLen := len(list)
 	chartEdbMap := make(map[int][]*data_manage.ChartEdbInfoMapping)
 	if listLen > 0 {
+		// 分类id
+		classifyIdList := make([]int, 0)
+		// 当前列表中的分类map
+		classifyMap := make(map[int]*data_manage.ChartClassify)
+		for _, v := range list {
+			classifyIdList = append(classifyIdList, v.ChartClassifyId)
+		}
+		classifyList, err := data_manage.GetChartClassifyByIdList(classifyIdList)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range classifyList {
+			classifyMap[v.ChartClassifyId] = v
+		}
+
+		// 已授权分类id
+		permissionChartIdList, permissionClassifyIdList, err := data_manage_permission.GetUserChartAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+			return
+		}
+
+		// 权限
+		for k, chartViewInfo := range list {
+			if currClassify, ok := classifyMap[chartViewInfo.ChartClassifyId]; ok {
+				list[k].HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(chartViewInfo.IsJoinPermission, currClassify.IsJoinPermission, chartViewInfo.ChartInfoId, chartViewInfo.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
+			}
+		}
+
 		chartInfoIds := ""
 		for _, v := range list {
 			chartInfoIds += strconv.Itoa(v.ChartInfoId) + ","
@@ -1283,15 +1317,51 @@ func (this *MyChartController) MyChartList() {
 	}
 
 	listLen := len(list)
-	for i := 0; i < listLen; i++ {
-		//判断是否需要展示英文标识
-		if edbTmpList, ok := chartEdbMap[list[i].ChartInfoId]; ok {
-			list[i].IsEnChart = data.CheckIsEnChart(list[i].ChartNameEn, edbTmpList, list[i].Source, list[i].ChartType)
+	if listLen > 0 {
+		// 分类id
+		classifyIdList := make([]int, 0)
+		// 当前列表中的分类map
+		classifyMap := make(map[int]*data_manage.ChartClassify)
+		for _, v := range list {
+			classifyIdList = append(classifyIdList, v.ChartClassifyId)
 		}
-		if _, ok := myChartMap[list[i].ChartInfoId]; ok {
-			list[i].IsAdd = true
+		classifyList, err := data_manage.GetChartClassifyByIdList(classifyIdList)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range classifyList {
+			classifyMap[v.ChartClassifyId] = v
 		}
+
+		// 已授权分类id
+		permissionChartIdList, permissionClassifyIdList, err := data_manage_permission.GetUserChartAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+			return
+		}
+
+		// 权限
+		for i, chartViewInfo := range list {
+			//判断是否需要展示英文标识
+			if edbTmpList, ok := chartEdbMap[list[i].ChartInfoId]; ok {
+				list[i].IsEnChart = data.CheckIsEnChart(list[i].ChartNameEn, edbTmpList, list[i].Source, list[i].ChartType)
+			}
+			if _, ok := myChartMap[list[i].ChartInfoId]; ok {
+				list[i].IsAdd = true
+			}
+
+			// 数据权限
+			if currClassify, ok := classifyMap[chartViewInfo.ChartClassifyId]; ok {
+				list[i].HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(chartViewInfo.IsJoinPermission, currClassify.IsJoinPermission, chartViewInfo.ChartInfoId, chartViewInfo.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
+			}
+		}
+
 	}
+
 	resp := new(data_manage.MyChartListResp)
 	if list == nil || len(list) <= 0 || (err != nil && err.Error() == utils.ErrNoRow()) {
 		items := make([]*data_manage.MyChartList, 0)
@@ -1502,10 +1572,44 @@ func (this *MyChartController) ChartRecommendList() {
 		myChartMap[v.ChartInfoId] = v.ChartInfoId
 	}
 	listLen := len(list)
-	for i := 0; i < listLen; i++ {
-		if _, ok := myChartMap[list[i].ChartInfoId]; ok {
-			list[i].IsAdd = true
+
+	if listLen > 0 {
+		// 分类id
+		classifyIdList := make([]int, 0)
+		// 当前列表中的分类map
+		classifyMap := make(map[int]*data_manage.ChartClassify)
+		for _, v := range list {
+			classifyIdList = append(classifyIdList, v.ChartClassifyId)
+		}
+		classifyList, err := data_manage.GetChartClassifyByIdList(classifyIdList)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range classifyList {
+			classifyMap[v.ChartClassifyId] = v
+		}
+
+		// 已授权分类id
+		permissionChartIdList, permissionClassifyIdList, err := data_manage_permission.GetUserChartAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+			return
+		}
+		// 权限
+		for k, chartViewInfo := range list {
+			if currClassify, ok := classifyMap[chartViewInfo.ChartClassifyId]; ok {
+				list[k].HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(chartViewInfo.IsJoinPermission, currClassify.IsJoinPermission, chartViewInfo.ChartInfoId, chartViewInfo.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
+			}
+
+			if _, ok := myChartMap[list[k].ChartInfoId]; ok {
+				list[k].IsAdd = true
+			}
 		}
+
 	}
 
 	resp := new(data_manage.ChartRecommendListResp)
@@ -1565,9 +1669,43 @@ func (this *MyChartController) MyChartSearch() {
 		return
 	}
 	listLen := len(list)
-	for i := 0; i < listLen; i++ {
-		list[i].IsAdd = true
+
+	if listLen > 0 {
+		// 分类id
+		classifyIdList := make([]int, 0)
+		// 当前列表中的分类map
+		classifyMap := make(map[int]*data_manage.ChartClassify)
+		for _, v := range list {
+			classifyIdList = append(classifyIdList, v.ChartClassifyId)
+		}
+		classifyList, err := data_manage.GetChartClassifyByIdList(classifyIdList)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range classifyList {
+			classifyMap[v.ChartClassifyId] = v
+		}
+
+		// 已授权分类id
+		permissionChartIdList, permissionClassifyIdList, err := data_manage_permission.GetUserChartAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+			return
+		}
+		// 权限
+		for k, chartViewInfo := range list {
+			if currClassify, ok := classifyMap[chartViewInfo.ChartClassifyId]; ok {
+				list[k].HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(chartViewInfo.IsJoinPermission, currClassify.IsJoinPermission, chartViewInfo.ChartInfoId, chartViewInfo.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
+			}
+			list[k].IsAdd = true
+		}
+
 	}
+
 	resp := new(data_manage.MyChartSearchListResp)
 	if list == nil {
 		list = make([]*data_manage.MyChartList, 0)
@@ -1636,11 +1774,71 @@ func (this *MyChartController) MyChartSearchByEs() {
 		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
 		return
 	}
-	if len(list) <= 0 {
+
+	lenList := len(list)
+	if lenList <= 0 {
 		list = make([]*data_manage.MyChartList, 0)
-	}
-	for _, v := range list {
-		v.IsAdd = true
+	} else {
+		// 分类id
+		classifyIdList := make([]int, 0)
+		// 图表id
+		chartInfoIdList := make([]int, 0)
+
+		// 当前列表中的分类map
+		chartClassifyMap := make(map[int]*data_manage.ChartClassify)
+		// 当前列表中的图表map
+		chartInfoMap := make(map[int]*data_manage.ChartInfo)
+		for _, v := range list {
+			classifyIdList = append(classifyIdList, v.ChartClassifyId)
+			chartInfoIdList = append(chartInfoIdList, v.ChartInfoId)
+		}
+
+		// 分类
+		{
+			classifyList, err := data_manage.GetChartClassifyByIdList(classifyIdList)
+			if err != nil {
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+					return
+				}
+			}
+			for _, tmpClassifyInfo := range classifyList {
+				chartClassifyMap[tmpClassifyInfo.ChartClassifyId] = tmpClassifyInfo
+			}
+		}
+
+		// 图表
+		{
+			tmpChartList, err := data_manage.GetChartInfoByIdList(chartInfoIdList)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取所有有权限的图表失败,Err:" + err.Error()
+				return
+			}
+			for _, tmpChartInfo := range tmpChartList {
+				chartInfoMap[tmpChartInfo.ChartInfoId] = tmpChartInfo
+			}
+		}
+
+		// 已授权分类id
+		permissionChartIdList, permissionClassifyIdList, err := data_manage_permission.GetUserChartAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+			return
+		}
+		// 权限
+		for k, tmpChartViewInfo := range list {
+			list[k].IsAdd = true
+			chartViewInfo, ok := chartInfoMap[tmpChartViewInfo.ChartInfoId]
+			if !ok {
+				continue
+			}
+			if currClassify, ok := chartClassifyMap[chartViewInfo.ChartClassifyId]; ok {
+				list[k].HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(chartViewInfo.IsJoinPermission, currClassify.IsJoinPermission, chartViewInfo.ChartInfoId, chartViewInfo.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
+			}
+		}
 	}
 
 	page := paging.GetPaging(currentIndex, pageSize, int(total))

+ 335 - 270
controllers/data_manage/predict_edb_classify.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/utils"
 	"sort"
 )
@@ -22,109 +23,109 @@ type PredictEdbClassifyController struct {
 // @Param   IsOnlyMe   query   bool  false       "是否只看我的"
 // @Success 200 {object} data_manage.EdbClassifyListResp
 // @router /predict_classify/list [get]
-func (this *PredictEdbClassifyController) List() {
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		this.Data["json"] = br
-		this.ServeJSON()
-	}()
-
-	isOnlyMe, _ := this.GetBool("IsOnlyMe")
-
-	rootList, err := data_manage.GetEdbClassifyByParentId(0, 1)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取数据失败,Err:" + err.Error()
-		return
-	}
-	// 获取当前账号的不可见指标
-	obj := data_manage.EdbInfoNoPermissionAdmin{}
-	confList, err := obj.GetAllListByAdminId(this.SysUser.AdminId)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
-		return
-	}
-	noPermissionEdbInfoIdMap := make(map[int]bool)
-	for _, v := range confList {
-		noPermissionEdbInfoIdMap[v.EdbInfoId] = true
-	}
-
-	allEdbInfo, err := data_manage.GetPredictEdbInfoAll(1)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取数据失败,Err:" + err.Error()
-		return
-	}
-	edbInfoMap := make(map[int][]*data_manage.EdbClassifyItems)
-	for _, v := range allEdbInfo {
-		// 如果指标不可见,那么就不返回该指标
-		if _, ok := noPermissionEdbInfoIdMap[v.EdbInfoId]; ok {
-			continue
-		}
-		button := data.GetPredictEdbOpButton(this.SysUser, v.SysUserId)
-		button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
-		button.OpButton = false
-		button.DeleteButton = false
-		v.Button = button
-		if isOnlyMe {
-			if v.SysUserId == this.SysUser.AdminId {
-				edbInfoMap[v.ClassifyId] = append(edbInfoMap[v.ClassifyId], v)
-			}
-		} else {
-			edbInfoMap[v.ClassifyId] = append(edbInfoMap[v.ClassifyId], v)
-		}
-	}
-	rootChildMap := make(map[int][]*data_manage.EdbClassifyItems)
-	for _, v := range rootList {
-		button := data.GetPredictEdbClassifyOpButton(this.SysUser, v.SysUserId)
-		v.Button = button
-
-		rootChildMap[v.ParentId] = append(rootChildMap[v.ParentId], v)
-		if existItems, ok := edbInfoMap[v.ClassifyId]; ok {
-			v.Children = existItems
-		} else {
-			items := make([]*data_manage.EdbClassifyItems, 0)
-			v.Children = items
-		}
-	}
-	nodeAll := make([]*data_manage.EdbClassifyItems, 0)
-	for _, v := range rootList {
-		nodeAll = append(nodeAll, v)
-	}
-
-	// 是否允许添加分类
-	canOpClassify := true
-
-	// 如果不是 超管 或者 ficc管理员 或者 ficc研究员,那么就没有权限
-	//if !utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RESEARCHR, utils.ROLE_TYPE_CODE_FICC_RESEARCHR}, this.SysUser.RoleTypeCode) {
-	//	canOpClassify = false
-	//}
-
-	language := `CN`
-	// 指标显示的语言
-	{
-		configDetail, _ := system.GetConfigDetailByCode(this.SysUser.AdminId, system.PredictEdbLanguageVar)
-		if configDetail != nil {
-			language = configDetail.ConfigValue
-		} else {
-			configDetail, _ = system.GetDefaultConfigDetailByCode(system.PredictEdbLanguageVar)
-			if configDetail != nil {
-				language = configDetail.ConfigValue
-			}
-		}
-	}
-
-	resp := data_manage.EdbClassifyListResp{
-		AllNodes:      nodeAll,
-		CanOpClassify: canOpClassify,
-		Language:      language,
-	}
-	br.Ret = 200
-	br.Success = true
-	br.Msg = "获取成功"
-	br.Data = resp
-}
+//func (this *PredictEdbClassifyController) List() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//
+//	isOnlyMe, _ := this.GetBool("IsOnlyMe")
+//
+//	rootList, err := data_manage.GetEdbClassifyByParentId(0, 1)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+//		return
+//	}
+//	// 获取当前账号的不可见指标
+//	obj := data_manage.EdbInfoNoPermissionAdmin{}
+//	confList, err := obj.GetAllListByAdminId(this.SysUser.AdminId)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+//		return
+//	}
+//	noPermissionEdbInfoIdMap := make(map[int]bool)
+//	for _, v := range confList {
+//		noPermissionEdbInfoIdMap[v.EdbInfoId] = true
+//	}
+//
+//	allEdbInfo, err := data_manage.GetPredictEdbInfoAll(1)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+//		return
+//	}
+//	edbInfoMap := make(map[int][]*data_manage.EdbClassifyItems)
+//	for _, v := range allEdbInfo {
+//		// 如果指标不可见,那么就不返回该指标
+//		if _, ok := noPermissionEdbInfoIdMap[v.EdbInfoId]; ok {
+//			continue
+//		}
+//		button := data.GetPredictEdbOpButton(this.SysUser, v.SysUserId)
+//		button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
+//		button.OpButton = false
+//		button.DeleteButton = false
+//		v.Button = button
+//		if isOnlyMe {
+//			if v.SysUserId == this.SysUser.AdminId {
+//				edbInfoMap[v.ClassifyId] = append(edbInfoMap[v.ClassifyId], v)
+//			}
+//		} else {
+//			edbInfoMap[v.ClassifyId] = append(edbInfoMap[v.ClassifyId], v)
+//		}
+//	}
+//	rootChildMap := make(map[int][]*data_manage.EdbClassifyItems)
+//	for _, v := range rootList {
+//		button := data.GetPredictEdbClassifyOpButton(this.SysUser, v.SysUserId)
+//		v.Button = button
+//
+//		rootChildMap[v.ParentId] = append(rootChildMap[v.ParentId], v)
+//		if existItems, ok := edbInfoMap[v.ClassifyId]; ok {
+//			v.Children = existItems
+//		} else {
+//			items := make([]*data_manage.EdbClassifyItems, 0)
+//			v.Children = items
+//		}
+//	}
+//	nodeAll := make([]*data_manage.EdbClassifyItems, 0)
+//	for _, v := range rootList {
+//		nodeAll = append(nodeAll, v)
+//	}
+//
+//	// 是否允许添加分类
+//	canOpClassify := true
+//
+//	// 如果不是 超管 或者 ficc管理员 或者 ficc研究员,那么就没有权限
+//	//if !utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RESEARCHR, utils.ROLE_TYPE_CODE_FICC_RESEARCHR}, this.SysUser.RoleTypeCode) {
+//	//	canOpClassify = false
+//	//}
+//
+//	language := `CN`
+//	// 指标显示的语言
+//	{
+//		configDetail, _ := system.GetConfigDetailByCode(this.SysUser.AdminId, system.PredictEdbLanguageVar)
+//		if configDetail != nil {
+//			language = configDetail.ConfigValue
+//		} else {
+//			configDetail, _ = system.GetDefaultConfigDetailByCode(system.PredictEdbLanguageVar)
+//			if configDetail != nil {
+//				language = configDetail.ConfigValue
+//			}
+//		}
+//	}
+//
+//	resp := data_manage.EdbClassifyListResp{
+//		AllNodes:      nodeAll,
+//		CanOpClassify: canOpClassify,
+//		Language:      language,
+//	}
+//	br.Ret = 200
+//	br.Success = true
+//	br.Msg = "获取成功"
+//	br.Data = resp
+//}
 
 // Items
 // @Title 获取所有预测指标分类接口-不包含指标
@@ -181,7 +182,28 @@ func (this *PredictEdbClassifyController) Add() {
 		return
 	}
 
-	button := data.GetPredictEdbClassifyOpButton(this.SysUser, 0)
+	haveOperaAuth := true
+
+	if req.ParentId > 0 {
+		parentClassify, err := data_manage.GetEdbClassifyById(req.ParentId)
+		if err != nil {
+			br.Msg = "获取父级分类失败"
+			br.ErrMsg = "获取父级分类失败,Err:" + err.Error()
+			return
+		}
+
+		// 已授权分类id
+		permissionClassifyIdList, err := data_manage_permission.GetUserEdbClassifyPermissionList(this.SysUser.AdminId, parentClassify.ClassifyId)
+		if err != nil {
+			br.Msg = "添加失败"
+			br.ErrMsg = "获取父级分类失败,Err:" + err.Error()
+			return
+		}
+		// 数据权限
+		haveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(parentClassify.IsJoinPermission, parentClassify.ClassifyId, permissionClassifyIdList)
+	}
+
+	button := data.GetPredictEdbClassifyOpButton(this.SysUser, 0, haveOperaAuth)
 	if !button.AddButton {
 		br.Msg = "不允许添加分类"
 		br.IsSendEmail = false
@@ -505,156 +527,156 @@ func (this *PredictEdbClassifyController) Move() {
 // @Param   IsOnlyMe   query   bool  false       "是否只看我的"
 // @Success 200 {object} data_manage.EdbClassifyListResp
 // @router /predict_classify/list/v2 [get]
-func (this *PredictEdbClassifyController) ListV2() {
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		this.Data["json"] = br
-		this.ServeJSON()
-	}()
-
-	isOnlyMe, _ := this.GetBool("IsOnlyMe")
-
-	rootList, err := data_manage.GetEdbClassifyByParentId(0, 1)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取数据失败,Err:" + err.Error()
-		return
-	}
-	// 获取当前账号的不可见指标
-	obj := data_manage.EdbInfoNoPermissionAdmin{}
-	confList, err := obj.GetAllListByAdminId(this.SysUser.AdminId)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
-		return
-	}
-	noPermissionEdbInfoIdMap := make(map[int]bool)
-	for _, v := range confList {
-		noPermissionEdbInfoIdMap[v.EdbInfoId] = true
-	}
-
-	allEdbInfo, err := data_manage.GetPredictEdbInfoAll(1)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取数据失败,Err:" + err.Error()
-		return
-	}
-	edbInfoMap := make(map[int][]*data_manage.EdbClassifyItems)
-	for _, v := range allEdbInfo {
-		// 如果指标不可见,那么就不返回该指标
-		if _, ok := noPermissionEdbInfoIdMap[v.EdbInfoId]; ok {
-			continue
-		}
-		button := data.GetPredictEdbOpButton(this.SysUser, v.SysUserId)
-		button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
-		button.OpButton = false
-		button.DeleteButton = false
-		v.Button = button
-		if isOnlyMe {
-			if v.SysUserId == this.SysUser.AdminId {
-				edbInfoMap[v.ClassifyId] = append(edbInfoMap[v.ClassifyId], v)
-			}
-		} else {
-			edbInfoMap[v.ClassifyId] = append(edbInfoMap[v.ClassifyId], v)
-		}
-	}
-	rootTwoList, err := data_manage.GetEdbClassifyByParentIdTwo(1)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取数据失败,Err:" + err.Error()
-		return
-	}
-	classifyAll, err := data_manage.GetEdbClassifyAllV2(1)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取数据失败,Err:" + err.Error()
-		return
-	}
-	rootTwoMap := make(map[int][]*data_manage.EdbClassifyItems)
-	for _, v := range rootTwoList {
-		button := data.GetPredictEdbClassifyOpButton(this.SysUser, v.SysUserId)
-		v.Button = button
-		rootTwoMap[v.ParentId] = append(rootTwoMap[v.ParentId], v)
-	}
-	rootTwoChildMap := make(map[int][]*data_manage.EdbClassifyItems)
-	for _, v := range classifyAll {
-		button := data.GetPredictEdbClassifyOpButton(this.SysUser, v.SysUserId)
-		v.Button = button
-		if v.Level == 3 {
-			rootTwoChildMap[v.ParentId] = append(rootTwoChildMap[v.ParentId], v)
-		}
-	}
-
-	nodeAll := make([]*data_manage.EdbClassifyItems, 0)
-	for _, v := range rootList {
-		button := data.GetPredictEdbClassifyOpButton(this.SysUser, v.SysUserId)
-		v.Button = button
-
-		if existItems, ok := rootTwoMap[v.ClassifyId]; ok {
-			v.Children = existItems
-			for _, item := range existItems {
-				item.Button = button
-
-				if existItems, ok := rootTwoChildMap[item.ClassifyId]; ok {
-					item.Children = existItems
-					for _, existItem := range existItems {
-						if _, ok := noPermissionEdbInfoIdMap[existItem.EdbInfoId]; ok {
-							continue
-						}
-						button := data.GetPredictEdbClassifyOpButton(this.SysUser, v.SysUserId)
-						button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
-						existItem.Button = button
-						if isOnlyMe {
-							if existItem.SysUserId == this.SysUser.AdminId {
-								edbInfoMap[existItem.ClassifyId] = append(edbInfoMap[v.ClassifyId], v)
-							}
-						} else {
-							edbInfoMap[v.ClassifyId] = append(edbInfoMap[v.ClassifyId], v)
-						}
-					}
-				} else {
-					items := make([]*data_manage.EdbClassifyItems, 0)
-					item.Children = items
-				}
-			}
-		} else {
-			items := make([]*data_manage.EdbClassifyItems, 0)
-			v.Children = items
-		}
-		nodeAll = append(nodeAll, v)
-	}
-
-	// 是否允许添加一级分类
-	canOpClassify := true
-	button := data.GetPredictEdbClassifyOpButton(this.SysUser, 0)
-	if !button.AddButton {
-		canOpClassify = false
-	}
-
-	language := `CN`
-	// 指标显示的语言
-	{
-		configDetail, _ := system.GetConfigDetailByCode(this.SysUser.AdminId, system.PredictEdbLanguageVar)
-		if configDetail != nil {
-			language = configDetail.ConfigValue
-		} else {
-			configDetail, _ = system.GetDefaultConfigDetailByCode(system.PredictEdbLanguageVar)
-			if configDetail != nil {
-				language = configDetail.ConfigValue
-			}
-		}
-	}
-
-	resp := data_manage.EdbClassifyListResp{
-		AllNodes:      nodeAll,
-		CanOpClassify: canOpClassify,
-		Language:      language,
-	}
-	br.Ret = 200
-	br.Success = true
-	br.Msg = "获取成功"
-	br.Data = resp
-}
+//func (this *PredictEdbClassifyController) ListV2() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//
+//	isOnlyMe, _ := this.GetBool("IsOnlyMe")
+//
+//	rootList, err := data_manage.GetEdbClassifyByParentId(0, 1)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+//		return
+//	}
+//	// 获取当前账号的不可见指标
+//	obj := data_manage.EdbInfoNoPermissionAdmin{}
+//	confList, err := obj.GetAllListByAdminId(this.SysUser.AdminId)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+//		return
+//	}
+//	noPermissionEdbInfoIdMap := make(map[int]bool)
+//	for _, v := range confList {
+//		noPermissionEdbInfoIdMap[v.EdbInfoId] = true
+//	}
+//
+//	allEdbInfo, err := data_manage.GetPredictEdbInfoAll(1)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+//		return
+//	}
+//	edbInfoMap := make(map[int][]*data_manage.EdbClassifyItems)
+//	for _, v := range allEdbInfo {
+//		// 如果指标不可见,那么就不返回该指标
+//		if _, ok := noPermissionEdbInfoIdMap[v.EdbInfoId]; ok {
+//			continue
+//		}
+//		button := data.GetPredictEdbOpButton(this.SysUser, v.SysUserId)
+//		button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
+//		button.OpButton = false
+//		button.DeleteButton = false
+//		v.Button = button
+//		if isOnlyMe {
+//			if v.SysUserId == this.SysUser.AdminId {
+//				edbInfoMap[v.ClassifyId] = append(edbInfoMap[v.ClassifyId], v)
+//			}
+//		} else {
+//			edbInfoMap[v.ClassifyId] = append(edbInfoMap[v.ClassifyId], v)
+//		}
+//	}
+//	rootTwoList, err := data_manage.GetEdbClassifyByParentIdTwo(1)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+//		return
+//	}
+//	classifyAll, err := data_manage.GetEdbClassifyAllV2(1)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+//		return
+//	}
+//	rootTwoMap := make(map[int][]*data_manage.EdbClassifyItems)
+//	for _, v := range rootTwoList {
+//		button := data.GetPredictEdbClassifyOpButton(this.SysUser, v.SysUserId)
+//		v.Button = button
+//		rootTwoMap[v.ParentId] = append(rootTwoMap[v.ParentId], v)
+//	}
+//	rootTwoChildMap := make(map[int][]*data_manage.EdbClassifyItems)
+//	for _, v := range classifyAll {
+//		button := data.GetPredictEdbClassifyOpButton(this.SysUser, v.SysUserId)
+//		v.Button = button
+//		if v.Level == 3 {
+//			rootTwoChildMap[v.ParentId] = append(rootTwoChildMap[v.ParentId], v)
+//		}
+//	}
+//
+//	nodeAll := make([]*data_manage.EdbClassifyItems, 0)
+//	for _, v := range rootList {
+//		button := data.GetPredictEdbClassifyOpButton(this.SysUser, v.SysUserId)
+//		v.Button = button
+//
+//		if existItems, ok := rootTwoMap[v.ClassifyId]; ok {
+//			v.Children = existItems
+//			for _, item := range existItems {
+//				item.Button = button
+//
+//				if existItems, ok := rootTwoChildMap[item.ClassifyId]; ok {
+//					item.Children = existItems
+//					for _, existItem := range existItems {
+//						if _, ok := noPermissionEdbInfoIdMap[existItem.EdbInfoId]; ok {
+//							continue
+//						}
+//						button := data.GetPredictEdbClassifyOpButton(this.SysUser, v.SysUserId)
+//						button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
+//						existItem.Button = button
+//						if isOnlyMe {
+//							if existItem.SysUserId == this.SysUser.AdminId {
+//								edbInfoMap[existItem.ClassifyId] = append(edbInfoMap[v.ClassifyId], v)
+//							}
+//						} else {
+//							edbInfoMap[v.ClassifyId] = append(edbInfoMap[v.ClassifyId], v)
+//						}
+//					}
+//				} else {
+//					items := make([]*data_manage.EdbClassifyItems, 0)
+//					item.Children = items
+//				}
+//			}
+//		} else {
+//			items := make([]*data_manage.EdbClassifyItems, 0)
+//			v.Children = items
+//		}
+//		nodeAll = append(nodeAll, v)
+//	}
+//
+//	// 是否允许添加一级分类
+//	canOpClassify := true
+//	button := data.GetPredictEdbClassifyOpButton(this.SysUser, 0)
+//	if !button.AddButton {
+//		canOpClassify = false
+//	}
+//
+//	language := `CN`
+//	// 指标显示的语言
+//	{
+//		configDetail, _ := system.GetConfigDetailByCode(this.SysUser.AdminId, system.PredictEdbLanguageVar)
+//		if configDetail != nil {
+//			language = configDetail.ConfigValue
+//		} else {
+//			configDetail, _ = system.GetDefaultConfigDetailByCode(system.PredictEdbLanguageVar)
+//			if configDetail != nil {
+//				language = configDetail.ConfigValue
+//			}
+//		}
+//	}
+//
+//	resp := data_manage.EdbClassifyListResp{
+//		AllNodes:      nodeAll,
+//		CanOpClassify: canOpClassify,
+//		Language:      language,
+//	}
+//	br.Ret = 200
+//	br.Success = true
+//	br.Msg = "获取成功"
+//	br.Data = resp
+//}
 
 // SimpleList
 // @Title 单层分类列表
@@ -708,24 +730,56 @@ func (this *PredictEdbClassifyController) SimpleList() {
 			return
 		}
 
-		for _, v := range allEdbInfo {
-			// 如果指标不可见,那么就不返回该指标
-			if _, ok := noPermissionEdbInfoIdMap[v.EdbInfoId]; ok {
-				continue
+		if len(allEdbInfo) > 0 {
+			// 查询当前分类信息
+			currClassify, err := data_manage.GetEdbClassifyById(parentId)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取当前分类信息失败,Err:" + err.Error()
+				return
+			}
+			// 获取所有有权限的指标和分类
+			permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+				return
+			}
+
+			for _, v := range allEdbInfo {
+				// 如果指标不可见,那么就不返回该指标
+				if _, ok := noPermissionEdbInfoIdMap[v.EdbInfoId]; ok {
+					continue
+				}
+				// 数据权限
+				v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(v.IsJoinPermission, currClassify.IsJoinPermission, v.EdbInfoId, v.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+				// 按钮权限
+				button := data.GetPredictEdbOpButton(this.SysUser, v.SysUserId, v.HaveOperaAuth)
+				button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
+				button.OpButton = false
+				button.DeleteButton = false
+				v.Button = button
+				v.ParentId = parentId
+				v.Children = make([]*data_manage.EdbClassifyItems, 0)
+				nodeAll = append(nodeAll, v)
 			}
-			button := data.GetPredictEdbOpButton(this.SysUser, v.SysUserId)
-			button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
-			button.OpButton = false
-			button.DeleteButton = false
-			v.Button = button
-			v.Children = make([]*data_manage.EdbClassifyItems, 0)
-			v.ParentId = parentId
-			nodeAll = append(nodeAll, v)
 		}
+
 	}
 	if len(rootList) > 0 {
+		// 已授权分类id
+		permissionClassifyIdList, err := data_manage_permission.GetUserEdbClassifyPermissionList(this.SysUser.AdminId, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+			return
+		}
+
 		for _, v := range rootList {
-			button := data.GetPredictEdbClassifyOpButton(this.SysUser, v.SysUserId)
+			// 数据权限
+			v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ClassifyId, permissionClassifyIdList)
+			// 按钮权限
+			button := data.GetPredictEdbClassifyOpButton(this.SysUser, v.SysUserId, v.HaveOperaAuth)
 			v.Button = button
 			v.Children = make([]*data_manage.EdbClassifyItems, 0)
 			nodeAll = append(nodeAll, v)
@@ -739,7 +793,7 @@ func (this *PredictEdbClassifyController) SimpleList() {
 
 	// 是否允许添加一级分类
 	canOpClassify := true
-	button := data.GetPredictEdbClassifyOpButton(this.SysUser, 0)
+	button := data.GetPredictEdbClassifyOpButton(this.SysUser, 0, true)
 	if !button.AddButton {
 		canOpClassify = false
 	}
@@ -790,8 +844,19 @@ func (this *PredictEdbClassifyController) ClassifyTree() {
 	var sortList data_manage.EdbClassifyItemList
 
 	if len(allList) > 0 {
+		// 已授权分类id
+		permissionClassifyIdList, err := data_manage_permission.GetUserEdbClassifyPermissionList(this.SysUser.AdminId, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+			return
+		}
+
 		for k, v := range allList {
-			button := data.GetPredictEdbClassifyOpButton(this.SysUser, v.SysUserId)
+			// 数据权限
+			v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ClassifyId, permissionClassifyIdList)
+			// 按钮权限
+			button := data.GetPredictEdbClassifyOpButton(this.SysUser, v.SysUserId, v.HaveOperaAuth)
 			allList[k].Button = button
 		}
 		nodeAll = data.GetClassifyTreeRecursive(allList, 0)
@@ -801,7 +866,7 @@ func (this *PredictEdbClassifyController) ClassifyTree() {
 	}
 	// 是否允许添加一级分类
 	canOpClassify := true
-	button := data.GetPredictEdbClassifyOpButton(this.SysUser, 0)
+	button := data.GetPredictEdbClassifyOpButton(this.SysUser, 0, true)
 	if !button.AddButton {
 		canOpClassify = false
 	}

+ 268 - 43
controllers/data_manage/predict_edb_info.go

@@ -8,6 +8,7 @@ import (
 	"eta/eta_api/models/data_manage/request"
 	"eta/eta_api/models/data_manage/response"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/services/elastic"
 	"eta/eta_api/utils"
 	"fmt"
@@ -127,6 +128,44 @@ func (this *PredictEdbInfoController) EdbChartList() {
 	if list == nil || len(list) <= 0 || (err != nil && err.Error() == utils.ErrNoRow()) {
 		list = make([]*data_manage.EdbInfoList, 0)
 	} else {
+		classifyIdList := make([]int, 0)
+		for _, v := range list {
+			classifyIdList = append(classifyIdList, v.ClassifyId)
+		}
+
+		// 指标权限
+		{
+			// 当前的分类
+			classifyMap := make(map[int]*data_manage.EdbClassify)
+			classifyList, err := data_manage.GetEdbClassifyByIdList(classifyIdList)
+			if err != nil {
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+					return
+				}
+			}
+
+			for _, v := range classifyList {
+				classifyMap[v.ClassifyId] = v
+			}
+
+			// 获取所有有权限的指标和分类
+			permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+				return
+			}
+
+			for _, v := range list {
+				if currClassify, ok := classifyMap[v.ClassifyId]; ok {
+					v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(v.IsJoinPermission, currClassify.IsJoinPermission, v.EdbInfoId, v.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+					v.Button = data.GetEdbOpButton(sysUser, v.SysUserId, v.EdbType, v.EdbInfoType, v.HaveOperaAuth)
+				}
+			}
+		}
+
 		page = paging.GetPaging(currentIndex, pageSize, int(dataCount))
 	}
 
@@ -408,6 +447,23 @@ func (this *PredictEdbInfoController) List() {
 		return
 	}
 
+	// 权限校验
+	{
+		classifyMap := make(map[int]*data_manage.EdbClassifyIdItems)
+		for _, v := range classifyList {
+			classifyMap[v.ClassifyId] = v
+		}
+		if currClassify, ok := classifyMap[edbInfoItem.ClassifyId]; ok {
+			haveOperaAuth, err := data_manage_permission.CheckEdbPermission(edbInfoItem.IsJoinPermission, currClassify.IsJoinPermission, this.SysUser.AdminId, edbInfoItem.EdbInfoId, edbInfoItem.ClassifyId)
+			if err != nil {
+				br.Msg = err.Error()
+				br.ErrMsg = "校验指标权限失败,err:" + err.Error()
+				return
+			}
+			edbInfoItem.HaveOperaAuth = haveOperaAuth
+		}
+	}
+
 	resp.Paging = page
 	resp.Item = edbInfoItem
 	resp.ClassifyList = classifyList
@@ -698,8 +754,20 @@ func (this *PredictEdbInfoController) Edit() {
 		br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
 		return
 	}
+
+	var haveOperaAuth bool
+	// 数据权限校验
+	{
+		haveOperaAuth, err = data_manage_permission.CheckEdbPermissionByEdbInfoId(edbInfo.EdbInfoId, edbInfo.ClassifyId, edbInfo.IsJoinPermission, this.SysUser.AdminId)
+		if err != nil {
+			br.Msg = err.Error()
+			br.ErrMsg = "校验指标权限失败,err:" + err.Error()
+			return
+		}
+	}
+
 	// 编辑权限校验
-	button := data.GetPredictEdbOpButton(this.SysUser, edbInfo.SysUserId)
+	button := data.GetPredictEdbOpButton(this.SysUser, edbInfo.SysUserId, haveOperaAuth)
 	if !button.OpButton {
 		br.Msg = "无权限操作"
 		br.IsSendEmail = false
@@ -984,6 +1052,25 @@ func (this *PredictEdbInfoController) Detail() {
 		return
 	}
 
+	edbInfoFull := new(response.EdbInfoFull)
+	edbInfoFull.EdbInfo = edbInfo
+	// 权限校验
+	{
+		classifyMap := make(map[int]*data_manage.EdbClassifyIdItems)
+		for _, v := range classifyList {
+			classifyMap[v.ClassifyId] = v
+		}
+		if currClassify, ok := classifyMap[edbInfo.ClassifyId]; ok {
+			haveOperaAuth, err := data_manage_permission.CheckEdbPermission(edbInfo.IsJoinPermission, currClassify.IsJoinPermission, this.SysUser.AdminId, edbInfo.EdbInfoId, edbInfo.ClassifyId)
+			if err != nil {
+				br.Msg = err.Error()
+				br.ErrMsg = "校验指标权限失败,err:" + err.Error()
+				return
+			}
+			edbInfoFull.HaveOperaAuth = haveOperaAuth
+		}
+	}
+
 	// 拟合残差计算相关系数
 	var correlationStr string
 	if edbInfo.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_NHCC {
@@ -1028,7 +1115,7 @@ func (this *PredictEdbInfoController) Detail() {
 	}
 
 	resp := response.PredictEdbInfo{
-		EdbInfo:        *edbInfo,
+		EdbInfoFull:    edbInfoFull,
 		RuleType:       ruleType,
 		FixedValue:     fixedValue,
 		CalculateList:  calculateList,
@@ -1109,6 +1196,8 @@ func (this *PredictEdbInfoController) FilterByEs() {
 		}
 	}
 
+	// 是否走ES
+	isEs := false
 	if keyWord != "" {
 		var keyWordArr []string
 		keyWordArr = append(keyWordArr, keyWord)
@@ -1120,6 +1209,7 @@ func (this *PredictEdbInfoController) FilterByEs() {
 		} else {
 			total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, 1, frequency, noPermissionEdbInfoIdList)
 		}
+		isEs = true
 	} else {
 		var condition string
 		var pars []interface{}
@@ -1168,8 +1258,73 @@ func (this *PredictEdbInfoController) FilterByEs() {
 
 	edbInfoListLen := len(edbInfoList)
 
+	classifyIdList := make([]int, 0)
 	for i := 0; i < edbInfoListLen; i++ {
 		edbInfoList[i].EdbNameAlias = edbInfoList[i].EdbName
+		classifyIdList = append(classifyIdList, edbInfoList[i].ClassifyId)
+	}
+
+	// 当前列表中的分类map
+	classifyMap := make(map[int]*data_manage.EdbClassify)
+	if edbInfoListLen > 0 {
+		classifyList, err := data_manage.GetEdbClassifyByIdList(classifyIdList)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range classifyList {
+			classifyMap[v.ClassifyId] = v
+		}
+
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+			return
+		}
+
+		// 如果是ES的话,需要重新查一下指标的信息,主要是为了把是否授权字段找出来
+		if isEs {
+			edbInfoIdList := make([]int, 0)
+			for i := 0; i < edbInfoListLen; i++ {
+				edbInfoIdList = append(edbInfoIdList, edbInfoList[i].EdbInfoId)
+				tmpEdbInfo := edbInfoList[i]
+				if currClassify, ok := classifyMap[tmpEdbInfo.ClassifyId]; ok {
+					edbInfoList[i].HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(tmpEdbInfo.IsJoinPermission, currClassify.IsJoinPermission, tmpEdbInfo.EdbInfoId, tmpEdbInfo.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+				}
+			}
+
+			tmpEdbList, err := data_manage.GetEdbInfoByIdList(edbInfoIdList)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+				return
+			}
+			edbInfoMap := make(map[int]*data_manage.EdbInfo)
+			for _, v := range tmpEdbList {
+				edbInfoMap[v.EdbInfoId] = v
+			}
+
+			for i := 0; i < edbInfoListLen; i++ {
+				tmpEdbInfo, ok := edbInfoMap[edbInfoList[i].EdbInfoId]
+				if !ok {
+					continue
+				}
+				edbInfoList[i].IsJoinPermission = tmpEdbInfo.IsJoinPermission
+			}
+		}
+
+		// 权限校验
+		for i := 0; i < edbInfoListLen; i++ {
+			tmpEdbInfo := edbInfoList[i]
+			if currClassify, ok := classifyMap[tmpEdbInfo.ClassifyId]; ok {
+				edbInfoList[i].HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(tmpEdbInfo.IsJoinPermission, currClassify.IsJoinPermission, tmpEdbInfo.EdbInfoId, tmpEdbInfo.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			}
+		}
+
 	}
 
 	for i := 0; i < edbInfoListLen; i++ {
@@ -1306,6 +1461,7 @@ func (this *PredictEdbInfoController) DataList() {
 	if dateType == 5 {
 		isTimeBetween = true
 	}
+	fullEdb := new(response.EdbInfoFull)
 
 	// 获取预测指标信息
 	edbInfo, err := data_manage.GetEdbInfoById(edbInfoId)
@@ -1314,6 +1470,29 @@ func (this *PredictEdbInfoController) DataList() {
 		br.ErrMsg = "获取预测指标信息失败,Err:" + err.Error()
 		return
 	}
+	fullEdb.EdbInfo = edbInfo
+	classifyList, err, errMsg := data.GetFullClassifyByClassifyId(edbInfo.ClassifyId)
+	if err != nil {
+		br.Msg = err.Error()
+		br.ErrMsg = errMsg
+		return
+	}
+	var currClassifyItem *data_manage.EdbClassifyIdItems
+	for _, v := range classifyList {
+		if v.ClassifyId == edbInfo.ClassifyId {
+			currClassifyItem = v
+			break
+		}
+	}
+	if currClassifyItem != nil {
+		fullEdb.HaveOperaAuth, err = data_manage_permission.CheckEdbPermission(edbInfo.IsJoinPermission, currClassifyItem.IsJoinPermission, sysUser.AdminId, edbInfo.EdbInfoId, edbInfo.ClassifyId)
+		if err != nil {
+			br.Msg = err.Error()
+			br.ErrMsg = "校验指标权限失败,err:" + err.Error()
+			return
+		}
+	}
+
 	maxYear := 0
 	if edbInfo.LatestDate != "" {
 		latestDateT, _ := time.Parse(utils.FormatDate, edbInfo.LatestDate)
@@ -1330,44 +1509,43 @@ func (this *PredictEdbInfoController) DataList() {
 		endDate = ""
 	}
 	// 按钮校验
-	button := data.GetPredictEdbOpButton(this.SysUser, edbInfo.SysUserId)
+	button := data.GetPredictEdbOpButton(this.SysUser, edbInfo.SysUserId, fullEdb.HaveOperaAuth)
 	button.AddButton = false
 
-	dataList, _, _, err, _ := data.GetPredictDataListByPredictEdbInfo(edbInfo, startDate, endDate, isTimeBetween)
-	//lenDataList := len(dataList)
-	//if lenDataList > 0 {
-	//	tmpValue := dataList[lenDataList-1]
-	//
-	//	// 如果最大值 小于 预测值,那么将预测值作为最大值数据返回
-	//	if edbInfo.MaxValue < tmpValue.Value {
-	//		edbInfo.MaxValue = tmpValue.Value
-	//	}
-	//
-	//	// 如果最小值 大于 预测值,那么将预测值作为最小值数据返回
-	//	if edbInfo.MinValue > tmpValue.Value {
-	//		edbInfo.MinValue = tmpValue.Value
-	//	}
-	//}
-
-	// 季节性图、公历、农历处理
-	resultDataList, err := data.GetChartDataList(dataList, chartType, calendar, edbInfo.LatestDate, startDate)
-	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
-	classifyList, err, errMsg := data.GetFullClassifyByClassifyId(edbInfo.ClassifyId)
-	if err != nil {
-		br.Msg = err.Error()
-		br.ErrMsg = errMsg
-		return
-	}
 	resp := response.PredictEdbInfoDataResp{
-		EdbInfo:      edbInfo,
-		DataList:     resultDataList,
+		EdbInfo:      fullEdb,
 		Button:       button,
 		ClassifyList: classifyList,
 	}
+
+	if fullEdb.HaveOperaAuth {
+		dataList, _, _, err, _ := data.GetPredictDataListByPredictEdbInfo(edbInfo, startDate, endDate, isTimeBetween)
+		//lenDataList := len(dataList)
+		//if lenDataList > 0 {
+		//	tmpValue := dataList[lenDataList-1]
+		//
+		//	// 如果最大值 小于 预测值,那么将预测值作为最大值数据返回
+		//	if edbInfo.MaxValue < tmpValue.Value {
+		//		edbInfo.MaxValue = tmpValue.Value
+		//	}
+		//
+		//	// 如果最小值 大于 预测值,那么将预测值作为最小值数据返回
+		//	if edbInfo.MinValue > tmpValue.Value {
+		//		edbInfo.MinValue = tmpValue.Value
+		//	}
+		//}
+
+		// 季节性图、公历、农历处理
+		resultDataList, err := data.GetChartDataList(dataList, chartType, calendar, edbInfo.LatestDate, startDate)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+
+		resp.DataList = resultDataList
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -1736,8 +1914,20 @@ func (this *PredictEdbInfoController) Modify() {
 		br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
 		return
 	}
+
+	var haveOperaAuth bool
+	// 数据权限校验
+	{
+		haveOperaAuth, err = data_manage_permission.CheckEdbPermissionByEdbInfoId(edbInfo.EdbInfoId, edbInfo.ClassifyId, edbInfo.IsJoinPermission, this.SysUser.AdminId)
+		if err != nil {
+			br.Msg = err.Error()
+			br.ErrMsg = "校验指标权限失败,err:" + err.Error()
+			return
+		}
+	}
+
 	// 编辑权限校验
-	button := data.GetPredictEdbOpButton(this.SysUser, edbInfo.SysUserId)
+	button := data.GetPredictEdbOpButton(this.SysUser, edbInfo.SysUserId, haveOperaAuth)
 	if !button.OpButton {
 		br.Msg = "无权限操作"
 		br.IsSendEmail = false
@@ -1880,17 +2070,52 @@ func (this *PredictEdbInfoController) ClassifyEdbInfoItems() {
 	}
 
 	list := make([]*data_manage.EdbClassifyItems, 0)
-	for _, v := range allEdbInfo {
-		// 如果指标不可见,那么就不返回该指标
-		if _, ok := noPermissionEdbInfoIdMap[v.EdbInfoId]; ok {
-			continue
+
+	edbInfoNum := len(allEdbInfo)
+	if edbInfoNum > 0 {
+		classifyIdList := make([]int, 0)
+		for _, v := range allEdbInfo {
+			classifyIdList = append(classifyIdList, v.ClassifyId)
+		}
+
+		classifyList, err := data_manage.GetEdbClassifyByIdList(classifyIdList)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分类数据失败,Err:" + err.Error()
+			return
 		}
 
-		button := data.GetEdbOpButton(this.SysUser, v.SysUserId, v.EdbType, utils.EDB_INFO_TYPE)
-		button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
-		v.Button = button
+		// 分类map
+		classifyMap := make(map[int]*data_manage.EdbClassify)
+		for _, v := range classifyList {
+			classifyMap[v.ClassifyId] = v
+		}
 
-		list = append(list, v)
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range allEdbInfo {
+			// 如果指标不可见,那么就不返回该指标
+			if _, ok := noPermissionEdbInfoIdMap[v.EdbInfoId]; ok {
+				continue
+			}
+
+			// 数据权限
+			if classifyInfo, ok := classifyMap[v.ClassifyId]; ok {
+				v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(v.IsJoinPermission, classifyInfo.IsJoinPermission, v.EdbInfoId, v.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			}
+
+			button := data.GetEdbOpButton(this.SysUser, v.SysUserId, v.EdbType, utils.EDB_INFO_TYPE, v.HaveOperaAuth)
+			button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
+			v.Button = button
+
+			list = append(list, v)
+		}
 	}
 
 	resp := new(data_manage.ClassifyEdbInfoListResp)

+ 1 - 1
controllers/data_stat/edb_source_stat.go

@@ -592,7 +592,7 @@ func (this *EdbSourceStatController) EdbUpdateStat() {
 		baseCond := " and index_code in (" + utils.GetOrmInReplace(len(edbCodeList)) + ")"
 		var basePars []interface{}
 		basePars = append(basePars, edbCodeList)
-		indexList, tErr := data_manage.GetMysteelChemicalIndexList(baseCond, basePars, 0, 1000)
+		indexList, tErr := data_manage.GetMysteelChemicalIndexList(baseCond, basePars, 0, 1000, "")
 		if tErr != nil {
 			br.Msg = "获取初始指标信息失败"
 			br.ErrMsg = "获取初始指标信息失败,Err:" + tErr.Error()

+ 86 - 0
controllers/message.go

@@ -0,0 +1,86 @@
+package controllers
+
+import (
+	"eta/eta_api/models"
+	"eta/eta_api/models/data_manage/data_manage_permission"
+	"eta/eta_api/models/report_approve"
+	"fmt"
+)
+
+// MessageController
+// @Description: 消息控制器
+type MessageController struct {
+	BaseAuthController
+}
+
+// UnReadMessageNum
+// @Title 获取未读取的消息数量
+// @Description 获取未读取的消息数量
+// @Success 200 {object} data_manage_permission.MessageDetailListResp
+// @router /unread/num [get]
+func (c *MessageController) UnReadMessageNum() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var unReadReportNum, unReadDataPermissionNum int
+
+	// 获取报告审批消息
+	{
+		cond := fmt.Sprintf(` AND %s = ?`, report_approve.ReportApproveMessageCols.ReceiveUserId)
+		pars := make([]interface{}, 0)
+		pars = append(pars, sysUser.AdminId)
+
+		messageOb := new(report_approve.ReportApproveMessage)
+
+		// 未读消息数
+		cond += fmt.Sprintf(` AND %s = ?`, report_approve.ReportApproveMessageCols.IsRead)
+		pars = append(pars, 0)
+		unreadTotal, e := messageOb.GetCountByCondition(cond, pars)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取审批消息列表总数失败, Err: " + e.Error()
+			return
+		}
+		unReadReportNum = unreadTotal
+	}
+
+	// 获取资产消息
+	{
+		cond := fmt.Sprintf(` AND %s = ?`, data_manage_permission.DataPermissionMessageCols.ReceiveUserId)
+		pars := make([]interface{}, 0)
+		pars = append(pars, sysUser.AdminId)
+
+		messageOb := new(data_manage_permission.DataPermissionMessage)
+		// 未读消息数
+		cond += fmt.Sprintf(` AND %s = ?`, data_manage_permission.DataPermissionMessageCols.IsRead)
+		pars = append(pars, 0)
+		unreadTotal, e := messageOb.GetCountByCondition(cond, pars)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取资产消息列表总数失败, Err: " + e.Error()
+			return
+		}
+		unReadDataPermissionNum = unreadTotal
+	}
+
+	// 汇总数
+	num := unReadReportNum + unReadDataPermissionNum
+
+	br.Data = num
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 37 - 0
models/data_manage/chart_classify.go

@@ -20,6 +20,7 @@ type ChartClassify struct {
 	UniqueCode        string    `description:"唯一编码"`
 	Sort              int       `description:"排序字段,越小越靠前,默认值:10"`
 	Source            int       `description:"1:ETA图库;2:商品价格曲线"`
+	IsJoinPermission  int       `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
 }
 
 func AddChartClassify(item *ChartClassify) (lastId int64, err error) {
@@ -148,6 +149,8 @@ type ChartClassifyItems struct {
 	SeasonEndDate       string `description:"季节性图开始日期"`
 	Children            []*ChartClassifyItems
 	Button              ChartClassifyItemsButton `description:"按钮权限"`
+	IsJoinPermission    int                      `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	HaveOperaAuth       bool                     `description:"是否有数据权限,默认:false"`
 }
 
 // ChartClassifyItemsButton 操作按钮
@@ -325,3 +328,37 @@ func GetChartClassifyByParentIdAndName(parentId int, classifyName string, classi
 	err = o.Raw(sql, parentId, classifyName, classifyId).QueryRow(&item)
 	return
 }
+
+// GetChartClassifyByIdList
+// @Description:  根据分类ID列表获取分类
+// @author: Roc
+// @datetime 2024-04-01 13:21:48
+// @param classifyId []int
+// @return items []*ChartClassify
+// @return err error
+func GetChartClassifyByIdList(classifyIdList []int) (items []*ChartClassify, err error) {
+	num := len(classifyIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM chart_classify WHERE chart_classify_id in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, classifyIdList).QueryRows(&items)
+
+	return
+}
+
+// GetChartClassifyBySourceAndIsJoinPermission
+// @Description: 根据分类类型和是否涉密获取分类列表
+// @author: Roc
+// @datetime 2024-03-29 10:30:21
+// @param source int
+// @param isJoinPermission int
+// @return items []*ChartClassify
+// @return err error
+func GetChartClassifyBySourceAndIsJoinPermission(source, isJoinPermission int) (items []*ChartClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM chart_classify WHERE source = ? AND is_join_permission = ? `
+	_, err = o.Raw(sql, source, isJoinPermission).QueryRows(&items)
+	return
+}

+ 7 - 7
models/data_manage/chart_edb_mapping.go

@@ -46,7 +46,7 @@ func AddChartEdbMapping(items []*ChartEdbMapping) (err error) {
 func GetChartEdbMappingList(chartInfoId int) (list []*ChartEdbInfoMapping, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT a.*,b.source_name,b.source,b.sub_source,b.classify_id,b.edb_code,b.edb_name,b.edb_name_en,b.frequency,b.unit,b.unit_en,b.start_date,
-b.end_date,b.modify_time,b.latest_date,b.latest_value,b.unique_code,b.edb_info_type AS edb_info_category_type,b.edb_type,
+b.end_date,b.modify_time,b.latest_date,b.latest_value,b.unique_code,b.edb_info_type AS edb_info_category_type,b.edb_type,b.is_join_permission,
 a.is_convert, a.convert_type, a.convert_value, a.convert_unit, a.convert_en_unit 
              FROM chart_edb_mapping AS a
 			 INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
@@ -58,7 +58,7 @@ a.is_convert, a.convert_type, a.convert_value, a.convert_unit, a.convert_en_unit
 
 func GetChartEdbMappingListByChartInfoIds(chartInfoIds string) (list []*ChartEdbInfoMapping, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT a.*,b.source_name,b.source,b.sub_source,b.edb_code,b.edb_name,b.edb_name_en,b.frequency,b.unit,b.unit_en,b.start_date,b.end_date,b.modify_time,b.latest_date,b.latest_value,b.unique_code,b.edb_info_type AS edb_info_category_type,b.edb_type
+	sql := ` SELECT a.*,b.source_name,b.source,b.sub_source,b.edb_code,b.edb_name,b.edb_name_en,b.frequency,b.unit,b.unit_en,b.start_date,b.end_date,b.modify_time,b.latest_date,b.latest_value,b.unique_code,b.edb_info_type AS edb_info_category_type,b.edb_type,b.classify_id,b.is_join_permission
              FROM chart_edb_mapping AS a
 			 INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
 			 WHERE chart_info_id in (` + chartInfoIds + `) 
@@ -69,7 +69,7 @@ func GetChartEdbMappingListByChartInfoIds(chartInfoIds string) (list []*ChartEdb
 
 func GetChartEdbMappingListByEdbInfoId(edbInfoStr string) (list []*ChartEdbInfoMapping, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT edb_info_id,source_name,source,sub_source,edb_code,edb_name,edb_name_en,frequency,unit,unit_en,start_date,end_date,modify_time,latest_date,latest_value,unique_code,edb_info_type AS edb_info_category_type,max_value,min_value,edb_type
+	sql := ` SELECT edb_info_id,source_name,source,sub_source,edb_code,edb_name,edb_name_en,frequency,unit,unit_en,start_date,end_date,modify_time,latest_date,latest_value,unique_code,edb_info_type AS edb_info_category_type,max_value,min_value,edb_type,classify_id,is_join_permission
              FROM edb_info
 			 WHERE edb_info_id IN(` + edbInfoStr + `)
 			ORDER BY FIELD(edb_info_id,` + edbInfoStr + `)
@@ -85,7 +85,7 @@ func GetChartEdbMappingListByEdbInfoIdList(edbIdList []int) (list []*ChartEdbInf
 		return
 	}
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT edb_info_id,source_name,source,sub_source,edb_code,edb_name,edb_name_en,frequency,unit,unit_en,start_date,end_date,modify_time,latest_date,latest_value,unique_code,edb_info_type AS edb_info_category_type,max_value,min_value,edb_type
+	sql := ` SELECT edb_info_id,source_name,source,sub_source,edb_code,edb_name,edb_name_en,frequency,unit,unit_en,start_date,end_date,modify_time,latest_date,latest_value,unique_code,edb_info_type AS edb_info_category_type,max_value,min_value,edb_type,classify_id,is_join_permission
              FROM edb_info
 			 WHERE edb_info_id IN(` + utils.GetOrmInReplace(num) + `)
 			ORDER BY FIELD(edb_info_id,` + utils.GetOrmInReplace(num) + `)
@@ -101,7 +101,7 @@ func GetChartEdbMappingListByIdList(chartInfoIdList []int) (list []*ChartEdbInfo
 		return
 	}
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT a.*,b.source_name,b.source,b.sub_source,b.edb_code,b.edb_name,b.edb_name_en,b.frequency,b.unit,b.unit_en,b.start_date,b.end_date,b.modify_time,b.latest_date,b.latest_value,b.unique_code,b.edb_info_type,b.edb_type AS edb_info_category_type
+	sql := ` SELECT a.*,b.source_name,b.source,b.sub_source,b.edb_code,b.edb_name,b.edb_name_en,b.frequency,b.unit,b.unit_en,b.start_date,b.end_date,b.modify_time,b.latest_date,b.latest_value,b.unique_code,b.edb_info_type,b.edb_type AS edb_info_category_type,b.classify_id,b.is_join_permission
              FROM chart_edb_mapping AS a
 			 INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
 			 WHERE chart_info_id in (` + utils.GetOrmInReplace(num) + `) 
@@ -145,7 +145,7 @@ func GetEtaEdbChartEdbMapping(chartInfoId int) (item *ChartEdbInfoMapping, err e
 	o := orm.NewOrmUsingDB("data")
 	aField := `a.chart_edb_mapping_id,a.chart_info_id,a.edb_info_id,a.create_time,a.modify_time,a.unique_code,a.max_data,a.min_data,a.is_order,a.is_axis,a.edb_info_type,a.lead_value,a.lead_unit,a.chart_style,a.chart_color,a.predict_chart_color,a.chart_width,a.source as mapping_source`
 
-	sql := ` SELECT ` + aField + `,b.source_name,b.source,b.sub_source,b.edb_code,b.edb_name,b.edb_name_en,b.frequency,b.unit,b.unit_en,b.start_date,b.end_date,b.modify_time,b.latest_date,b.latest_value,b.unique_code,b.edb_info_type AS edb_info_category_type
+	sql := ` SELECT ` + aField + `,b.source_name,b.source,b.sub_source,b.edb_code,b.edb_name,b.edb_name_en,b.frequency,b.unit,b.unit_en,b.start_date,b.end_date,b.modify_time,b.latest_date,b.latest_value,b.unique_code,b.edb_info_type AS edb_info_category_type,b.classify_id,b.is_join_permission
              FROM chart_edb_mapping AS a
 			 INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
 			 WHERE a.chart_info_id=? AND a.source = ?
@@ -193,7 +193,7 @@ func GetChartEdbMappingListV2(chartInfoId int) (list []*ChartEdbInfoMapping, err
 // GetChartEdbMappingByEdbInfoId 根据指标id获取edb_mapping
 func GetChartEdbMappingByEdbInfoId(edbInfoId int) (item *ChartEdbInfoMapping, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT edb_info_id,source_name,classify_id,source,sub_source,edb_code,edb_name,edb_name_en,frequency,unit,unit_en,start_date,end_date,modify_time,latest_date,latest_value,unique_code,edb_info_type AS edb_info_category_type,edb_type,max_value,min_value
+	sql := ` SELECT edb_info_id,source_name,classify_id,source,sub_source,edb_code,edb_name,edb_name_en,frequency,unit,unit_en,start_date,end_date,modify_time,latest_date,latest_value,unique_code,edb_info_type AS edb_info_category_type,edb_type,max_value,min_value,is_join_permission
              FROM edb_info
 			 WHERE edb_info_id = ? limit 1`
 	err = o.Raw(sql, edbInfoId).QueryRow(&item)

+ 65 - 4
models/data_manage/chart_info.go

@@ -54,11 +54,13 @@ type ChartInfo struct {
 	MarkersAreas      string `description:"标识区"`
 	Unit              string `description:"中文单位名称"`
 	UnitEn            string `description:"英文单位名称"`
+	IsJoinPermission  int    `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
 }
 
 type ChartInfoMore struct {
 	ChartInfo
-	IsEnChart bool `description:"是否展示英文标识"`
+	IsEnChart     bool `description:"是否展示英文标识"`
+	HaveOperaAuth bool `description:"是否有数据权限,默认:false"`
 }
 
 func AddChartInfo(item *ChartInfo) (lastId int64, err error) {
@@ -497,6 +499,8 @@ type ChartEdbInfoMapping struct {
 	ConvertValue        float64 `description:"数据转换值"`
 	ConvertUnit         string  `description:"数据转换单位"`
 	ConvertEnUnit       string  `description:"数据转换单位"`
+	IsJoinPermission    int     `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	HaveOperaAuth       bool    `description:"是否有数据权限,默认:false"`
 }
 
 type QuarterData struct {
@@ -1452,6 +1456,8 @@ type ChartInfoView struct {
 	Instructions      string          `description:"图表说明"`
 	MarkersLines      string          `description:"标识线"`
 	MarkersAreas      string          `description:"标识区"`
+	IsJoinPermission  int             `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	HaveOperaAuth     bool            `description:"是否有数据权限,默认:false"`
 }
 
 type ChartViewButton struct {
@@ -1566,12 +1572,47 @@ func GetChartInfoListGroupByUserId(edbIdList []string) (items []*ChartInfo, err
 		return
 	}
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM chart_info WHERE chart_info_id in (` + utils.GetOrmInReplace(num) + `) GROUP BY sys_user_id `
+	sql := ` SELECT * FROM chart_info WHERE chart_info_id in (` + utils.GetOrmInReplace(num) + `) ORDER BY chart_info_id desc `
 
 	_, err = o.Raw(sql, edbIdList).QueryRows(&items)
 	return
 }
 
+// GetChartInfoListByChartIdList
+// @Description: 根据图表id列表获取列表信息
+// @param edbIdList
+// @return items
+// @return err
+func GetChartInfoListByChartIdList(charIdList []string) (items []*ChartInfo, err error) {
+	num := len(charIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM chart_info WHERE chart_info_id in (` + utils.GetOrmInReplace(num) + `) ORDER BY chart_info_id desc `
+
+	_, err = o.Raw(sql, charIdList).QueryRows(&items)
+	return
+}
+
+// GetChartInfoListByUserId
+// @Description: 根据图表id列表获取列表信息
+// @param userIdList []int
+// @param source int
+// @return items
+// @return err
+func GetChartInfoListByUserId(userIdList []int, source int) (items []*ChartInfo, err error) {
+	num := len(userIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM chart_info WHERE source = ? AND  sys_user_id in (` + utils.GetOrmInReplace(num) + `) ORDER BY chart_info_id desc `
+
+	_, err = o.Raw(sql, source, userIdList).QueryRows(&items)
+	return
+}
+
 // ModifyChartInfoUserIdByCodeList 根据指标code列表修改创建人
 func ModifyChartInfoUserIdByCodeList(edbIdList []string, userId int, userName string) (err error) {
 	num := len(edbIdList)
@@ -1584,6 +1625,26 @@ func ModifyChartInfoUserIdByCodeList(edbIdList []string, userId int, userName st
 	return
 }
 
+// ModifyChartInfoUserIdByOldUserId
+// @Description:  根据旧的用户id修改创建人
+// @author: Roc
+// @datetime 2024-03-25 19:14:59
+// @param oldUserId int
+// @param userId int
+// @param userName string
+// @return err error
+func ModifyChartInfoUserIdByOldUserId(oldUserIdList []int, userId int, userName string) (err error) {
+	num := len(oldUserIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE chart_info SET sys_user_id=?,sys_user_real_name=? WHERE sys_user_id in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, userId, userName, oldUserIdList).Exec()
+
+	return
+}
+
 // BarChartInfoReq 柱方图预览请求数据
 type BarChartInfoReq struct {
 	EdbInfoIdList []BarChartInfoEdbItemReq `description:"指标信息"`
@@ -1909,7 +1970,7 @@ type RollingCorrelationChartDataResp struct {
 func GetChartInfoAllByClassifyId(source, classifyId int) (items []*ChartClassifyItems, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT chart_info_id,chart_classify_id,chart_name AS chart_classify_name,chart_name_en AS chart_classify_name_en,
-             unique_code,sys_user_id,sys_user_real_name,date_type,start_date,end_date,chart_type,calendar,season_start_date,season_end_date
+             unique_code,sys_user_id,sys_user_real_name,date_type,start_date,end_date,chart_type,calendar,season_start_date,season_end_date,is_join_permission
             FROM chart_info WHERE chart_classify_id = ? AND source = ?  ORDER BY sort asc,create_time DESC `
 	_, err = o.Raw(sql, classifyId, source).QueryRows(&items)
 	return
@@ -1939,7 +2000,7 @@ func GetChartInfoByAdminIdAndClassify(sourceList []int, adminId, classifyId int)
 
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT chart_info_id,chart_classify_id,chart_name AS chart_classify_name,
-             unique_code,sys_user_id,sys_user_real_name,date_type,start_date,end_date,chart_type,calendar,season_start_date,season_end_date
+             unique_code,sys_user_id,sys_user_real_name,date_type,start_date,end_date,chart_type,calendar,season_start_date,season_end_date,is_join_permission
             FROM chart_info where source in (` + utils.GetOrmInReplace(num) + `)  AND sys_user_id = ? AND chart_classify_id = ? ORDER BY sort asc,create_time ASC `
 	_, err = o.Raw(sql, sourceList, adminId, classifyId).QueryRows(&items)
 	return

+ 976 - 0
models/data_manage/data_manage_permission/chart.go

@@ -0,0 +1,976 @@
+package data_manage_permission
+
+import (
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strconv"
+	"time"
+)
+
+// ChartInfoPermission
+// @Description: 图表信息权限表
+type ChartInfoPermission struct {
+	ChartInfoPermissionId int64     `json:"chart_info_permission_id" orm:"column(chart_info_permission_id);pk"`
+	ChartInfoId           int32     `json:"chart_info_id"` // 图表id
+	Source                int32     `json:"source"`        // 1:ETA图库;2:商品价格曲线;3:相关性图
+	SysUserId             int32     `json:"sys_user_id"`   // 系统用户id
+	ModifyTime            time.Time `json:"modify_time"`   // 变更时间
+	CreateTime            time.Time `json:"create_time"`   // 关系建立时间
+}
+
+// ChartClassifyPermission
+// @Description: 图表分类权限表
+type ChartClassifyPermission struct {
+	ChartClassifyPermissionId int64     `json:"chart_classify_permission_id" orm:"column(chart_classify_permission_id);pk"`
+	ChartClassifyId           int32     `json:"chart_classify_id"` // 分类id
+	Source                    int32     `json:"source"`            // 分类来源: 1-图库; 2-商品价格曲线; 3-相关性图表; 6-拟合方程图表; 7-统计特征
+	SysUserId                 int32     `json:"sys_user_id"`       // 系统用户id
+	ModifyTime                time.Time `json:"modify_time"`       // 变更时间
+	CreateTime                time.Time `json:"create_time"`       // 关系建立时间
+}
+
+// SetIsPermissionByChartClassifyIdList
+// @Description: 设置图表分类是否涉密
+// @author: Roc
+// @datetime 2024-04-01 10:53:23
+// @param classifyIdList []int
+// @param chartClassifySource int
+// @return err error
+func SetIsPermissionByChartClassifyIdList(classifyIdList []int, chartClassifySource int) (err error) {
+	num := len(classifyIdList)
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	//// 获取已经配置涉密的分类权限
+	//chartClassifyList := make([]*ChartClassify, 0)
+	//sql := `SELECT * FROM chart_classify WHERE is_join_permission = ? `
+	//_, err = o.Raw(sql, 1).QueryRows(&chartClassifyList)
+	//if err != nil {
+	//	return
+	//}
+	//chartClassifyMap := make(map[int]*ChartClassify)
+	//for _, v := range chartClassifyList {
+	//	chartClassifyMap[v.ClassifyId] = v
+	//}
+
+	// 先将所有已经设置了涉密的分类设置为不涉密
+	sql := `UPDATE chart_classify SET is_join_permission=?,modify_time=now() WHERE is_join_permission = 1 AND source = ?`
+	_, err = o.Raw(sql, 0, chartClassifySource).Exec()
+	if err != nil {
+		return
+	}
+
+	if num > 0 {
+		// 将对应的分类设置为涉密
+		sql = `UPDATE chart_classify SET is_join_permission=?,modify_time=now() WHERE source = ? AND chart_classify_id in (` + utils.GetOrmInReplace(num) + `) `
+		_, err = o.Raw(sql, 1, chartClassifySource, classifyIdList).Exec()
+		if err != nil {
+			return
+		}
+	}
+
+	return
+}
+
+// SetPermissionByChartIdList
+// @Description: 根据图表ID列表设置图表的用户权限
+// @author: Roc
+// @datetime 2024-04-01 10:26:17
+// @param chartIdList []string
+// @param userIdList []int
+// @param source int
+// @return err error
+func SetPermissionByChartIdList(chartIdList []string, userIdList []int, source int) (err error) {
+	chartNum := len(chartIdList)
+	if chartNum <= 0 {
+		return
+	}
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 获取已经配置的图表权限用户
+	chartInfoPermissionList := make([]*ChartInfoPermission, 0)
+	sql := `SELECT * FROM chart_info_permission WHERE source = ? AND chart_info_id in (` + utils.GetOrmInReplace(chartNum) + `) `
+	_, err = o.Raw(sql, source, chartIdList).QueryRows(&chartInfoPermissionList)
+	if err != nil {
+		return
+	}
+	chartInfoPermissionMap := make(map[string]*ChartInfoPermission)
+	for _, v := range chartInfoPermissionList {
+		chartInfoPermissionMap[fmt.Sprint(v.ChartInfoId, "_", v.SysUserId)] = v
+	}
+
+	// 标记图表是否纳入权限管控
+	{
+		// 默认 标记图表为纳入权限管控
+		isJoinPermission := 1
+		// 用户不选的情况下,说明是要给这些图表移除权限管控
+		if len(userIdList) <= 0 {
+			// 标记图表为不纳入权限管控
+			isJoinPermission = 0
+		}
+		sql = `UPDATE chart_info SET is_join_permission=?,modify_time=now() WHERE source = ? AND chart_info_id in (` + utils.GetOrmInReplace(chartNum) + `) `
+		_, err = o.Raw(sql, isJoinPermission, source, chartIdList).Exec()
+		if err != nil {
+			return
+		}
+	}
+
+	// 待添加的配置项
+	addList := make([]*ChartInfoPermission, 0)
+
+	// 遍历待配置的图表和用户,筛选出需要添加的配置项
+	for _, chartInfoIdStr := range chartIdList {
+		chartInfoId, tmpErr := strconv.ParseInt(chartInfoIdStr, 10, 64)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, userId := range userIdList {
+			key := fmt.Sprint(chartInfoId, "_", userId)
+			if _, ok := chartInfoPermissionMap[key]; ok {
+				// 如果存在那么就移除,说明不需要处理了
+				delete(chartInfoPermissionMap, key)
+			} else {
+				// 如果不存在,那么就添加
+				addList = append(addList, &ChartInfoPermission{
+					//PermissionId: 0,
+					ChartInfoId: int32(chartInfoId),
+					SysUserId:   int32(userId),
+					Source:      int32(source),
+					ModifyTime:  time.Now(),
+					CreateTime:  time.Now(),
+				})
+			}
+		}
+	}
+
+	// 添加待配置项
+	if len(addList) > 0 {
+		_, err = o.InsertMulti(500, addList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 移除废弃的配置项
+	{
+		// 待移除的配置项
+		deletePermissionIdList := make([]int64, 0)
+		for _, v := range chartInfoPermissionMap {
+			deletePermissionIdList = append(deletePermissionIdList, v.ChartInfoPermissionId)
+		}
+
+		deletePermissionIdNum := len(deletePermissionIdList)
+		if deletePermissionIdNum > 0 {
+			sql = "DELETE FROM chart_info_permission WHERE chart_info_permission_id in (" + utils.GetOrmInReplace(deletePermissionIdNum) + ")"
+			_, err = o.Raw(sql, deletePermissionIdList).Exec()
+			if err != nil {
+				return
+			}
+		}
+	}
+
+	return
+}
+
+// SetPermissionByChartClassifyIdList
+// @Description: 根据图表分类ID列表设置分类的用户权限
+// @author: Roc
+// @datetime 2024-03-28 14:53:04
+// @param classifyIdList []int
+// @param userIdList []int
+// @return err error
+func SetPermissionByChartClassifyIdList(classifyIdList []int, userIdList []int, classifyType int) (err error) {
+	userNum := len(userIdList)
+	if userNum <= 0 {
+		return
+	}
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 获取当前选择用户已经配置的图表分类权限
+	classifyPermissionList := make([]*ChartClassifyPermission, 0)
+	sql := `SELECT * FROM chart_classify_permission WHERE source = ? AND sys_user_id in (` + utils.GetOrmInReplace(userNum) + `) `
+	_, err = o.Raw(sql, classifyType, userIdList).QueryRows(&classifyPermissionList)
+	if err != nil {
+		return
+	}
+	classifyPermissionMap := make(map[string]*ChartClassifyPermission)
+	for _, v := range classifyPermissionList {
+		classifyPermissionMap[fmt.Sprint(v.ChartClassifyId, "_", v.SysUserId)] = v
+	}
+
+	// 待添加的配置项
+	addList := make([]*ChartClassifyPermission, 0)
+
+	// 遍历待配置的图表和用户,筛选出需要添加的配置项
+	for _, userId := range userIdList {
+		for _, classifyId := range classifyIdList {
+			key := fmt.Sprint(classifyId, "_", userId)
+			if _, ok := classifyPermissionMap[key]; ok {
+				// 如果存在那么就移除,说明不需要处理了
+				delete(classifyPermissionMap, key)
+			} else {
+				// 如果不存在,那么就提那家
+				addList = append(addList, &ChartClassifyPermission{
+					//PermissionId: 0,
+					ChartClassifyId: int32(classifyId),
+					Source:          int32(classifyType),
+					SysUserId:       int32(userId),
+					ModifyTime:      time.Now(),
+					CreateTime:      time.Now(),
+				})
+			}
+		}
+	}
+
+	// 添加待配置项
+	if len(addList) > 0 {
+		_, err = o.InsertMulti(500, addList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 移除废弃的配置项
+	{
+		// 获取移除的配置项
+		deletePermissionIdList := make([]int64, 0)
+		for _, v := range classifyPermissionMap {
+			deletePermissionIdList = append(deletePermissionIdList, v.ChartClassifyPermissionId)
+		}
+
+		deletePermissionIdNum := len(deletePermissionIdList)
+		if deletePermissionIdNum > 0 {
+			sql = "DELETE FROM chart_classify_permission WHERE chart_classify_permission_id in (" + utils.GetOrmInReplace(deletePermissionIdNum) + ")"
+			_, err = o.Raw(sql, deletePermissionIdList).Exec()
+			if err != nil {
+				return
+			}
+		}
+	}
+
+	return
+}
+
+// GetPermissionChartClassifyIdListByUserId
+// @Description: 根据用户ID获取已经配置的分类id列表
+// @author: Roc
+// @datetime 2024-03-29 16:24:46
+// @param userId int
+// @param classifyType int
+// @return chartClassifyIdList []int
+// @return err error
+func GetPermissionChartClassifyIdListByUserId(userId int, classifyType int) (chartClassifyIdList []int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT chart_classify_id FROM chart_classify_permission WHERE source = ? AND sys_user_id = ? `
+	_, err = o.Raw(sql, classifyType, userId).QueryRows(&chartClassifyIdList)
+
+	return
+}
+
+// GetPermissionUserIdListByChartId
+// @Description: 根据图表ID获取已经配置的用户id列表
+// @author: Roc
+// @datetime 2024-03-29 16:24:46
+// @param dataId int
+// @param source int
+// @return chartIdList []int
+// @return err error
+func GetPermissionUserIdListByChartId(dataId int, source int) (userIdList []int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT sys_user_id FROM chart_info_permission WHERE source = ? AND chart_info_id= ? `
+	_, err = o.Raw(sql, source, dataId).QueryRows(&userIdList)
+
+	return
+}
+
+// GetPermissionUserIdListByChartClassifyId
+// @Description: 根据图表分类ID获取已经配置的用户id列表
+// @author: Roc
+// @datetime 2024-03-29 16:24:46
+// @param classifyId int
+// @param source int
+// @return userIdList []int
+// @return err error
+func GetPermissionUserIdListByChartClassifyId(classifyId int, source int) (userIdList []int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT sys_user_id FROM chart_classify_permission WHERE source = ? AND chart_classify_id= ? `
+	_, err = o.Raw(sql, source, classifyId).QueryRows(&userIdList)
+
+	return
+}
+
+// GetPermissionChartIdList
+// @Description: 获取用户权限的图表列表
+// @author: Roc
+// @datetime 2024-03-28 16:50:47
+// @param userId int
+// @param chartInfoId int
+// @return idList []int
+// @return err error
+func GetPermissionChartIdList(userId, chartInfoId int) (idList []int, err error) {
+	pars := []interface{}{userId}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT chart_info_id FROM chart_info_permission WHERE sys_user_id = ? `
+	if chartInfoId > 0 {
+		sql += ` AND chart_info_id = ? `
+		pars = append(pars, chartInfoId)
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&idList)
+
+	return
+}
+
+// GetPermissionChartClassifyIdList
+// @Description: 获取用户权限的图表分类列表
+// @author: Roc
+// @datetime 2024-03-28 16:50:47
+// @param userId int
+// @param classifyId int
+// @return idList []int
+// @return err error
+func GetPermissionChartClassifyIdList(userId, classifyId int) (idList []int, err error) {
+	pars := []interface{}{userId}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT chart_classify_id FROM chart_classify_permission WHERE sys_user_id = ? `
+	if classifyId > 0 {
+		sql += ` AND chart_classify_id = ? `
+		pars = append(pars, classifyId)
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&idList)
+
+	return
+}
+
+// InheritParentClassifyByChartClassifyId
+// @Description: 继承父级分类的图表权限信息
+// @author: Roc
+// @datetime 2024-04-07 21:02:51
+// @param dataSource int
+// @param chartSource int
+// @param classifyId int
+// @param parentClassifyId int
+// @param classifyName string
+// @param uniqueCode string
+// @return err error
+func InheritParentClassifyByChartClassifyId(dataSource, chartSource, classifyId, parentClassifyId int, classifyName, uniqueCode string) (err error) {
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 将对应的分类设置为涉密
+	sql := `UPDATE chart_classify SET is_join_permission=?,modify_time=now() WHERE source = ? AND chart_classify_id = ? `
+	_, err = o.Raw(sql, 1, chartSource, classifyId).Exec()
+	if err != nil {
+		return
+	}
+
+	// 添加未授权记录
+	{
+		// 获取父级未授权的用户记录
+		var parentRecordItems []*ChartInfoClassifyPermissionNoAuthRecord
+		sql = `SELECT * FROM data_permission_classify_no_auth_record WHERE classify_id = ? AND source = ? AND sub_source = ? ORDER BY data_permission_classify_no_auth_record_id desc LIMIT ?,? `
+		_, err = o.Raw(sql, parentClassifyId, dataSource, chartSource).QueryRows(&parentRecordItems)
+
+		addNoAuthRecordItems := make([]*ChartInfoClassifyPermissionNoAuthRecord, 0)
+		for _, v := range parentRecordItems {
+			addNoAuthRecordItems = append(addNoAuthRecordItems, &ChartInfoClassifyPermissionNoAuthRecord{
+				ChartInfoClassifyPermissionNoAuthRecordId: 0,
+				Source:       v.Source,
+				OpUniqueCode: uniqueCode,
+				ClassifyId:   fmt.Sprint(classifyId),
+				ClassifyName: classifyName,
+				SysUserId:    v.SysUserId,
+				CreateTime:   time.Now(),
+			})
+		}
+
+		// 添加待配置项
+		if len(addNoAuthRecordItems) > 0 {
+			_, err = o.InsertMulti(500, addNoAuthRecordItems)
+			if err != nil {
+				return
+			}
+		}
+
+	}
+
+	// 添加授权记录
+	{
+		// 获取父级分类已经授权的用户
+		parentClassifyPermissionList := make([]*ChartClassifyPermission, 0)
+		sql = `SELECT * FROM chart_classify_permission WHERE source = ? AND chart_classify_id = ? `
+		_, err = o.Raw(sql, chartSource, parentClassifyId).QueryRows(&parentClassifyPermissionList)
+		if err != nil {
+			return
+		}
+
+		addList := make([]*ChartClassifyPermission, 0)
+		for _, v := range parentClassifyPermissionList {
+			// 如果不存在,那么就提那家
+			addList = append(addList, &ChartClassifyPermission{
+				//PermissionId: 0,
+				ChartClassifyId: int32(classifyId),
+				Source:          int32(chartSource),
+				SysUserId:       v.SysUserId,
+				ModifyTime:      time.Now(),
+				CreateTime:      time.Now(),
+			})
+		}
+		// 添加待配置项
+		if len(addList) > 0 {
+			_, err = o.InsertMulti(500, addList)
+			if err != nil {
+				return
+			}
+		}
+	}
+
+	return
+}
+
+// ChartInfoPermissionNoAuthRecord
+// @Description: 图表数据权限未授权记录表
+type ChartInfoPermissionNoAuthRecord struct {
+	ChartInfoPermissionNoAuthRecordId int64     `json:"chart_info_permission_no_auth_record_id"  orm:"column(chart_info_permission_no_auth_record_id);pk"` // 资产数据操作记录id
+	OpUniqueCode                      string    `json:"op_unique_code"`                                                                                    // 操作的唯一编码,主要是记录统一操作的日志
+	Source                            int32     `json:"source"`                                                                                            // 1:ETA图库;2:商品价格曲线;3:相关性图
+	ChartInfoId                       int32     `json:"chart_info_id"`                                                                                     // 指标id
+	ChartName                         string    `json:"chart_name"`                                                                                        // 图表名称
+	SysUserId                         int32     `json:"sys_user_id"`                                                                                       // 系统用户id
+	CreateTime                        time.Time `json:"create_time"`                                                                                       // 创建时间
+}
+
+// AddChartInfoPermissionNoAuthRecordBySourceAndDataIdList
+// @Description: 添加未授权用户记录
+// @author: Roc
+// @datetime 2024-04-07 15:25:49
+// @param source int
+// @param chartSource int
+// @param dataList []DataItem
+// @param noAuthUserIdList []int 未授权用户
+// @param authUserIdList []int 已授权用户
+// @param uniqueCode
+// @param content string
+// @param opUserId int
+// @return err error
+func AddChartInfoPermissionNoAuthRecordBySourceAndDataIdList(source, chartSource int, dataList []DataItem, noAuthUserIdList, authUserIdList []int, uniqueCode, title, content string, opUserId int) (err error) {
+	num := len(dataList)
+	if num <= 0 {
+		return
+	}
+	dataIdList := make([]int, 0)
+	for _, v := range dataList {
+		dataIdList = append(dataIdList, v.DataId)
+	}
+	userNum := len(noAuthUserIdList)
+	if userNum <= 0 {
+		return
+	}
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 根据指标获取已经存在的未授权记录
+	var existList []*ChartInfoPermissionNoAuthRecord
+	sql := `SELECT * FROM chart_info_permission_no_auth_record WHERE  source = ? AND chart_info_id in (` + utils.GetOrmInReplace(num) + `)`
+	_, err = o.Raw(sql, chartSource, dataIdList).QueryRows(&existList)
+	if err != nil {
+		return
+	}
+
+	// 已经标记了的数据
+	existMap := make(map[int32]map[string]*ChartInfoPermissionNoAuthRecord)
+	for _, v := range existList {
+		tmpUserExistMap, ok := existMap[v.SysUserId]
+		if !ok {
+			tmpUserExistMap = make(map[string]*ChartInfoPermissionNoAuthRecord)
+		}
+
+		key := fmt.Sprint(v.Source, "_", v.ChartInfoId)
+		tmpUserExistMap[key] = v
+		existMap[v.SysUserId] = tmpUserExistMap
+	}
+
+	addMessageList := make([]*DataPermissionMessage, 0)
+	addRecordList := make([]*ChartInfoPermissionNoAuthRecord, 0)
+	for _, userId := range noAuthUserIdList {
+		isAdd := false
+
+		tmpUserExistMap, userExistOk := existMap[int32(userId)]
+
+		for _, dataItem := range dataList {
+			// 判断是否已经存在,已经存在就过滤
+			if userExistOk {
+				key := fmt.Sprint(chartSource, "_", dataItem.DataId)
+				_, ok := tmpUserExistMap[key]
+				if ok {
+					continue
+				}
+			}
+
+			isAdd = true
+			addRecordList = append(addRecordList, &ChartInfoPermissionNoAuthRecord{
+				ChartInfoPermissionNoAuthRecordId: 0,
+				OpUniqueCode:                      uniqueCode,
+				Source:                            int32(chartSource),
+				ChartInfoId:                       int32(dataItem.DataId),
+				ChartName:                         dataItem.DataName,
+				SysUserId:                         int32(userId),
+				CreateTime:                        time.Now(),
+			})
+		}
+
+		// 有记录的话,需要添加消息
+		if isAdd {
+			addMessageList = append(addMessageList, &DataPermissionMessage{
+				DataPermissionMessageId: 0,
+				SendUserId:              int32(opUserId),
+				ReceiveUserId:           int32(userId),
+				Content:                 title,
+				Remark:                  content,
+				OpType:                  3,
+				Source:                  int32(source),
+				SubSource:               int32(chartSource),
+				OpUniqueCode:            uniqueCode,
+				IsRead:                  0,
+				CreateTime:              time.Now(),
+				ModifyTime:              time.Now(),
+			})
+		}
+	}
+
+	// 添加消息
+	if len(addMessageList) > 0 {
+		_, err = o.InsertMulti(500, addMessageList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 添加记录
+	if len(addRecordList) > 0 {
+		_, err = o.InsertMulti(500, addRecordList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 已经授权了的用户,需要删除未授权记录
+	authUserIdNum := len(authUserIdList)
+	if authUserIdNum > 0 {
+		sql = `DELETE FROM chart_info_permission_no_auth_record WHERE  source = ? AND sys_user_id in (` + utils.GetOrmInReplace(authUserIdNum) + `) AND chart_info_id in (` + utils.GetOrmInReplace(num) + `)`
+		_, err = o.Raw(sql, chartSource, authUserIdList, dataIdList).Exec()
+	}
+
+	return
+}
+
+// DeleteChartInfoPermissionNoAuthRecordBySourceAndDataIdList
+// @Description: 根据来源和数据id列表删除记录
+// @author: Roc
+// @datetime 2024-04-07 14:47:37
+// @param chartSource int
+// @param dataIdList []string
+// @return err error
+func DeleteChartInfoPermissionNoAuthRecordBySourceAndDataIdList(chartSource int, dataIdList []string) (err error) {
+	num := len(dataIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+
+	sql := `DELETE FROM chart_info_permission_no_auth_record WHERE source = ? AND chart_info_id in (` + utils.GetOrmInReplace(num) + `)`
+	_, err = o.Raw(sql, chartSource, dataIdList).Exec()
+
+	return
+}
+
+func GetChartInfoDataPermissionNoAuthRecordListByUserId(userId int32, chartSource, startSize, pageSize int) (total int, items []*DataPermissionNoAuthRecord, err error) {
+	o := orm.NewOrmUsingDB("data")
+
+	// 获取总数
+	sql := `SELECT count(1) AS total FROM chart_info_permission_no_auth_record WHERE sys_user_id = ? AND source = ? `
+	err = o.Raw(sql, userId, chartSource).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql = `SELECT chart_info_permission_no_auth_record_id as data_permission_no_auth_record_id,op_unique_code,source as sub_source,chart_info_id as data_id,chart_name as data_name,sys_user_id,create_time FROM chart_info_permission_no_auth_record WHERE sys_user_id = ? AND source = ? ORDER BY chart_info_permission_no_auth_record_id desc LIMIT ?,? `
+	_, err = o.Raw(sql, userId, chartSource, startSize, pageSize).QueryRows(&items)
+
+	return
+}
+
+type ChartInfoClassifyPermissionNoAuthRecord struct {
+	ChartInfoClassifyPermissionNoAuthRecordId int64     `json:"chart_info_classify_permission_no_auth_record_id" orm:"column(chart_info_classify_permission_no_auth_record_id);pk"` // 资产分类数据操作记录id
+	Source                                    int32     `json:"source"`                                                                                                             // 子来源 :ETA表格中的各种表格类型,以及图表的来源(这个是后续的扩展方向)
+	OpUniqueCode                              string    `json:"op_unique_code"`                                                                                                     // 操作的唯一编码,主要是记录统一操作的日志
+	ClassifyId                                string    `json:"classify_id"`                                                                                                        // 图表资产分类id
+	ClassifyName                              string    `json:"classify_name"`                                                                                                      // 图表资产分类名称
+	SysUserId                                 int32     `json:"sys_user_id"`                                                                                                        // 系统用户id
+	CreateTime                                time.Time `json:"create_time"`                                                                                                        // 创建时间
+}
+
+// AddChartInfoClassifyNoAuthRecordBySourceAndClassifyIdList
+// @Description: 根据分类添加用户分类未授权记录
+// @author: Roc
+// @datetime 2024-04-07 16:44:21
+// @param source int
+// @param chartSource int
+// @param classifyInfoList []ClassifyDataItem
+// @param noAuthUserIdList []int
+// @param uniqueCode string
+// @param content string
+// @param opUserId int
+// @return err error
+func AddChartInfoClassifyNoAuthRecordBySourceAndClassifyIdList(source, chartSource int, classifyInfoList []ClassifyDataItem, noAuthUserIdList []int, uniqueCode, title, content string, opUserId int) (err error) {
+	num := len(classifyInfoList)
+	if num <= 0 {
+		return
+	}
+	// 分类id
+	classifyIdList := make([]int, 0)
+	for _, v := range classifyInfoList {
+		classifyIdList = append(classifyIdList, v.ClassifyId)
+	}
+
+	userNum := len(noAuthUserIdList)
+	if userNum <= 0 {
+		return
+	}
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 根据分类获取已经存在的未授权记录
+	var existList []*ChartInfoClassifyPermissionNoAuthRecord
+	sql := `SELECT * FROM chart_info_classify_permission_no_auth_record WHERE source = ? AND classify_id in (` + utils.GetOrmInReplace(num) + `)`
+	_, err = o.Raw(sql, chartSource, classifyIdList).QueryRows(&existList)
+	if err != nil {
+		return
+	}
+
+	// 已经标记了的数据
+	existMap := make(map[int32]map[string]*ChartInfoClassifyPermissionNoAuthRecord)
+	for _, v := range existList {
+		tmpUserExistMap, ok := existMap[v.SysUserId]
+		if !ok {
+			tmpUserExistMap = make(map[string]*ChartInfoClassifyPermissionNoAuthRecord)
+		}
+
+		key := fmt.Sprint(v.Source, "_", v.ClassifyId)
+		tmpUserExistMap[key] = v
+		existMap[v.SysUserId] = tmpUserExistMap
+	}
+
+	addMessageList := make([]*DataPermissionMessage, 0)
+	addRecordList := make([]*ChartInfoClassifyPermissionNoAuthRecord, 0)
+	for _, userId := range noAuthUserIdList {
+		isAdd := false
+
+		tmpUserExistMap, userExistOk := existMap[int32(userId)]
+
+		for _, dataItem := range classifyInfoList {
+			// 判断是否已经存在,已经存在就过滤
+			if userExistOk {
+				key := fmt.Sprint(chartSource, "_", dataItem.ClassifyId)
+				_, ok := tmpUserExistMap[key]
+				if ok {
+					continue
+				}
+			}
+
+			isAdd = true
+			addRecordList = append(addRecordList, &ChartInfoClassifyPermissionNoAuthRecord{
+				ChartInfoClassifyPermissionNoAuthRecordId: 0,
+				Source:       int32(chartSource),
+				OpUniqueCode: uniqueCode,
+				ClassifyId:   fmt.Sprint(dataItem.ClassifyId),
+				ClassifyName: dataItem.ClassifyName,
+				SysUserId:    int32(userId),
+				CreateTime:   time.Now(),
+			})
+		}
+
+		// 有记录的话,需要添加消息
+		if isAdd {
+			addMessageList = append(addMessageList, &DataPermissionMessage{
+				DataPermissionMessageId: 0,
+				SendUserId:              int32(opUserId),
+				ReceiveUserId:           int32(userId),
+				Content:                 title,
+				Remark:                  content,
+				OpType:                  4,
+				Source:                  int32(source),
+				SubSource:               int32(chartSource),
+				OpUniqueCode:            uniqueCode,
+				IsRead:                  0,
+				CreateTime:              time.Now(),
+				ModifyTime:              time.Now(),
+			})
+		}
+	}
+
+	// 添加消息
+	if len(addMessageList) > 0 {
+		_, err = o.InsertMulti(500, addMessageList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 添加记录
+	if len(addRecordList) > 0 {
+		_, err = o.InsertMulti(500, addRecordList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 移除已经公开了的分类权限,需要删除未授权记录
+	authUserIdNum := len(classifyIdList)
+	if authUserIdNum > 0 {
+		sql = `DELETE FROM chart_info_classify_permission_no_auth_record WHERE source = ? AND classify_id not in (` + utils.GetOrmInReplace(num) + `)`
+		_, err = o.Raw(sql, chartSource, classifyIdList).Exec()
+	}
+
+	return
+}
+
+// AddChartInfoClassifyNoAuthRecordBySourceAndUserIdList
+// @Description: 根据用户添加用户分类未授权记录
+// @author: Roc
+// @datetime 2024-04-07 20:12:44
+// @param source int
+// @param chartSource int
+// @param noAuthClassifyMap map[int]ClassifyDataItem
+// @param configUserIdList []int
+// @param uniqueCode string
+// @param content string
+// @param opUserId int
+// @return err error
+func AddChartInfoClassifyNoAuthRecordBySourceAndUserIdList(source, chartSource int, noAuthClassifyMap map[int]ClassifyDataItem, configUserIdList []int, uniqueCode, title, content string, opUserId int) (err error) {
+	// 当前配置用户
+	configUserNum := len(configUserIdList)
+	if configUserNum <= 0 {
+		return
+	}
+
+	//// 总共的涉密分类
+	//noAuthClassifyInfoNum := len(noAuthClassifyMap)
+	//if noAuthClassifyInfoNum <= 0 {
+	//	return
+	//}
+
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 根据当前配置用户获取已经存在的未授权记录
+	var existList []*ChartInfoClassifyPermissionNoAuthRecord
+	sql := `SELECT * FROM chart_info_classify_permission_no_auth_record WHERE source = ? AND sys_user_id in (` + utils.GetOrmInReplace(configUserNum) + `)`
+	_, err = o.Raw(sql, chartSource, configUserIdList).QueryRows(&existList)
+	if err != nil {
+		return
+	}
+
+	// 已经标记了的数据
+	existMap := make(map[int32]map[string]*ChartInfoClassifyPermissionNoAuthRecord)
+	delRecordIdMap := make(map[int64]int64)
+	for _, v := range existList {
+		tmpUserExistMap, ok := existMap[v.SysUserId]
+		if !ok {
+			tmpUserExistMap = make(map[string]*ChartInfoClassifyPermissionNoAuthRecord)
+		}
+
+		tmpUserExistMap[v.ClassifyId] = v
+		existMap[v.SysUserId] = tmpUserExistMap
+
+		// 已经配置了的记录id
+		delRecordIdMap[v.ChartInfoClassifyPermissionNoAuthRecordId] = v.ChartInfoClassifyPermissionNoAuthRecordId
+	}
+
+	addMessageList := make([]*DataPermissionMessage, 0)
+	addRecordList := make([]*ChartInfoClassifyPermissionNoAuthRecord, 0)
+	for _, userId := range configUserIdList {
+		isAdd := false
+
+		tmpUserExistMap, userExistOk := existMap[int32(userId)]
+
+		for _, dataItem := range noAuthClassifyMap {
+			// 判断是否已经存在,已经存在就过滤
+			if userExistOk {
+				key := fmt.Sprint(dataItem.ClassifyId)
+				tmpUserRecord, ok := tmpUserExistMap[key]
+				if ok {
+					delete(delRecordIdMap, tmpUserRecord.ChartInfoClassifyPermissionNoAuthRecordId)
+					continue
+				}
+			}
+
+			isAdd = true
+			addRecordList = append(addRecordList, &ChartInfoClassifyPermissionNoAuthRecord{
+				ChartInfoClassifyPermissionNoAuthRecordId: 0,
+				Source:       int32(chartSource),
+				OpUniqueCode: uniqueCode,
+				ClassifyId:   fmt.Sprint(dataItem.ClassifyId),
+				ClassifyName: dataItem.ClassifyName,
+				SysUserId:    int32(userId),
+				CreateTime:   time.Now(),
+			})
+		}
+
+		// 有记录的话,需要添加消息
+		if isAdd {
+			addMessageList = append(addMessageList, &DataPermissionMessage{
+				DataPermissionMessageId: 0,
+				SendUserId:              int32(opUserId),
+				ReceiveUserId:           int32(userId),
+				Content:                 content,
+				Remark:                  content,
+				OpType:                  4,
+				Source:                  int32(source),
+				SubSource:               int32(chartSource),
+				OpUniqueCode:            uniqueCode,
+				IsRead:                  0,
+				CreateTime:              time.Now(),
+				ModifyTime:              time.Now(),
+			})
+		}
+	}
+
+	// 添加消息
+	if len(addMessageList) > 0 {
+		_, err = o.InsertMulti(500, addMessageList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 添加记录
+	if len(addRecordList) > 0 {
+		_, err = o.InsertMulti(500, addRecordList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 需要删除未授权记录
+	delRecordIdNum := len(delRecordIdMap)
+	if delRecordIdNum > 0 {
+		delRecordIdList := make([]int64, 0)
+		for _, v := range delRecordIdMap {
+			delRecordIdList = append(delRecordIdList, v)
+		}
+		sql = `DELETE FROM chart_info_classify_permission_no_auth_record WHERE chart_info_classify_permission_no_auth_record_id in (` + utils.GetOrmInReplace(delRecordIdNum) + `) `
+		_, err = o.Raw(sql, delRecordIdList).Exec()
+	}
+
+	return
+}
+
+// DeleteChartInfoClassifyNoAuthRecordBySourceAndClassifyIdList
+// @Description: 根据来源和删除分类授权记录
+// @author: Roc
+// @datetime 2024-04-07 14:47:37
+// @param chartSource int
+// @return err error
+func DeleteChartInfoClassifyNoAuthRecordBySourceAndClassifyIdList(chartSource int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+
+	sql := `DELETE FROM chart_info_classify_permission_no_auth_record WHERE source = ?`
+	_, err = o.Raw(sql, chartSource).Exec()
+
+	return
+}
+
+// GetChartInfoDataPermissionClassifyNoAuthRecordListByUserId
+// @Description: 根据用户获取未授权的资产分类记录
+// @author: Roc
+// @datetime 2024-04-07 20:14:49
+// @param userId int
+// @param source int
+// @param subSource int
+// @param startSize int
+// @param pageSize int
+// @return total int
+// @return items []*DataPermissionClassifyNoAuthRecord
+// @return err error
+func GetChartInfoDataPermissionClassifyNoAuthRecordListByUserId(userId int32, chartSource, startSize, pageSize int) (total int, items []*DataPermissionClassifyNoAuthRecord, err error) {
+	o := orm.NewOrmUsingDB("data")
+
+	// 获取总数
+	sql := `SELECT count(1) AS total FROM chart_info_classify_permission_no_auth_record WHERE sys_user_id = ? AND source = ? `
+	err = o.Raw(sql, userId, chartSource).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql = `SELECT chart_info_classify_permission_no_auth_record_id as data_permission_classify_no_auth_record_id,source as sub_source,op_unique_code,classify_id,classify_name,sys_user_id,create_time  FROM chart_info_classify_permission_no_auth_record WHERE sys_user_id = ? AND source = ? ORDER BY chart_info_classify_permission_no_auth_record_id desc LIMIT ?,? `
+	_, err = o.Raw(sql, userId, chartSource, startSize, pageSize).QueryRows(&items)
+
+	return
+}

+ 489 - 0
models/data_manage/data_manage_permission/classify_no_auth_record.go

@@ -0,0 +1,489 @@
+package data_manage_permission
+
+import (
+	"errors"
+	"eta/eta_api/utils"
+	"time"
+)
+
+// DataPermissionClassifyNoAuthRecord
+// @Description: 资产分类数据权限未授权记录表
+type DataPermissionClassifyNoAuthRecord struct {
+	DataPermissionClassifyNoAuthRecordId int64     `json:"data_permission_classify_no_auth_record_id" orm:"column(data_permission_classify_no_auth_record_id);pk"` // 资产分类数据操作记录id
+	Source                               int32     `json:"source"`                                                                                                 // 数据来源,1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格
+	SubSource                            int32     `json:"sub_source"`                                                                                             // 子来源 :ETA表格中的各种表格类型,以及图表的来源(这个是后续的扩展方向)
+	OpUniqueCode                         string    `json:"op_unique_code"`                                                                                         // 操作的唯一编码,主要是记录统一操作的日志
+	ClassifyId                           string    `json:"classify_id"`                                                                                            // 资产分类id(指标、图表、表格)
+	ClassifyName                         string    `json:"classify_name"`                                                                                          // 资产分类名称(指标、图表、表格)
+	SysUserId                            int32     `json:"sys_user_id"`                                                                                            // 系统用户id
+	CreateTime                           time.Time `json:"create_time"`                                                                                            // 创建时间
+}
+
+type ClassifyDataItem struct {
+	ClassifyId   int    // 资产分类id(指标、图表、表格)
+	ClassifyName string // 资产名称(指标、图表、表格)
+}
+
+//
+//// AddClassifyNoAuthRecordBySourceAndClassifyIdList
+//// @Description: 根据分类添加用户分类未授权记录
+//// @author: Roc
+//// @datetime 2024-04-07 16:44:21
+//// @param source int
+//// @param subSource int
+//// @param classifyInfoList []ClassifyDataItem
+//// @param noAuthUserIdList []int
+//// @param uniqueCode string
+//// @param content string
+//// @param opUserId int
+//// @return err error
+//func AddClassifyNoAuthRecordBySourceAndClassifyIdList(source, subSource int, classifyInfoList []ClassifyDataItem, noAuthUserIdList []int, uniqueCode, content string, opUserId int) (err error) {
+//	num := len(classifyInfoList)
+//	if num <= 0 {
+//		return
+//	}
+//	// 分类id
+//	classifyIdList := make([]int, 0)
+//	for _, v := range classifyInfoList {
+//		classifyIdList = append(classifyIdList, v.ClassifyId)
+//	}
+//
+//	userNum := len(noAuthUserIdList)
+//	if userNum <= 0 {
+//		return
+//	}
+//	o, err := orm.NewOrmUsingDB("data").Begin()
+//	if err != nil {
+//		return
+//	}
+//	defer func() {
+//		if err != nil {
+//			_ = o.Rollback()
+//		} else {
+//			_ = o.Commit()
+//		}
+//	}()
+//
+//	// 根据分类获取已经存在的未授权记录
+//	var existList []*DataPermissionClassifyNoAuthRecord
+//	sql := `SELECT * FROM data_permission_classify_no_auth_record WHERE source = ? AND sub_source = ? AND classify_id in (` + utils.GetOrmInReplace(num) + `)`
+//	_, err = o.Raw(sql, source, subSource, classifyIdList).QueryRows(&existList)
+//	if err != nil {
+//		return
+//	}
+//
+//	// 已经标记了的数据
+//	existMap := make(map[int32]map[string]*DataPermissionClassifyNoAuthRecord)
+//	for _, v := range existList {
+//		tmpUserExistMap, ok := existMap[v.SysUserId]
+//		if !ok {
+//			tmpUserExistMap = make(map[string]*DataPermissionClassifyNoAuthRecord)
+//		}
+//
+//		key := fmt.Sprint(v.Source, "_", v.SubSource, "_", v.ClassifyId)
+//		tmpUserExistMap[key] = v
+//		existMap[v.SysUserId] = tmpUserExistMap
+//	}
+//
+//	addMessageList := make([]*DataPermissionMessage, 0)
+//	addRecordList := make([]*DataPermissionClassifyNoAuthRecord, 0)
+//	for _, userId := range noAuthUserIdList {
+//		isAdd := false
+//
+//		tmpUserExistMap, userExistOk := existMap[int32(userId)]
+//
+//		for _, dataItem := range classifyInfoList {
+//			// 判断是否已经存在,已经存在就过滤
+//			if userExistOk {
+//				key := fmt.Sprint(source, "_", subSource, "_", dataItem.ClassifyId)
+//				_, ok := tmpUserExistMap[key]
+//				if ok {
+//					continue
+//				}
+//			}
+//
+//			isAdd = true
+//			addRecordList = append(addRecordList, &DataPermissionClassifyNoAuthRecord{
+//				DataPermissionClassifyNoAuthRecordId: 0,
+//				Source:                               int32(source),
+//				SubSource:                            int32(subSource),
+//				OpUniqueCode:                         uniqueCode,
+//				ClassifyId:                           fmt.Sprint(dataItem.ClassifyId),
+//				ClassifyName:                         dataItem.ClassifyName,
+//				SysUserId:                            int32(userId),
+//				CreateTime:                           time.Now(),
+//			})
+//		}
+//
+//		// 有记录的话,需要添加消息
+//		if isAdd {
+//			addMessageList = append(addMessageList, &DataPermissionMessage{
+//				DataPermissionMessageId: 0,
+//				SendUserId:              int32(opUserId),
+//				ReceiveUserId:           int32(userId),
+//				Content:                 content,
+//				Remark:                  content,
+//				OpType:                  4,
+//				Source:                  int32(source),
+//				SubSource:               int32(subSource),
+//				OpUniqueCode:            uniqueCode,
+//				IsRead:                  0,
+//				CreateTime:              time.Now(),
+//				ModifyTime:              time.Now(),
+//			})
+//		}
+//	}
+//
+//	// 添加消息
+//	if len(addMessageList) > 0 {
+//		_, err = o.InsertMulti(500, addMessageList)
+//		if err != nil {
+//			return
+//		}
+//	}
+//
+//	// 添加记录
+//	if len(addRecordList) > 0 {
+//		_, err = o.InsertMulti(500, addRecordList)
+//		if err != nil {
+//			return
+//		}
+//	}
+//
+//	// 移除已经公开了的分类权限,需要删除未授权记录
+//	authUserIdNum := len(classifyIdList)
+//	if authUserIdNum > 0 {
+//		sql = `DELETE FROM data_permission_classify_no_auth_record WHERE source = ? AND sub_source = ? AND classify_id not in (` + utils.GetOrmInReplace(num) + `)`
+//		_, err = o.Raw(sql, source, subSource, classifyIdList).Exec()
+//	}
+//
+//	return
+//}
+//
+//// AddClassifyNoAuthRecordBySourceAndUserIdList
+//// @Description: 根据用户添加用户分类未授权记录
+//// @author: Roc
+//// @datetime 2024-04-07 20:12:44
+//// @param source int
+//// @param subSource int
+//// @param noAuthClassifyMap map[int]ClassifyDataItem
+//// @param configUserIdList []int
+//// @param uniqueCode string
+//// @param content string
+//// @param opUserId int
+//// @return err error
+//func AddClassifyNoAuthRecordBySourceAndUserIdList(source, subSource int, noAuthClassifyMap map[int]ClassifyDataItem, configUserIdList []int, uniqueCode, content string, opUserId int) (err error) {
+//	// 当前配置用户
+//	configUserNum := len(configUserIdList)
+//	if configUserNum <= 0 {
+//		return
+//	}
+//
+//	//// 总共的涉密分类
+//	//noAuthClassifyInfoNum := len(noAuthClassifyMap)
+//	//if noAuthClassifyInfoNum <= 0 {
+//	//	return
+//	//}
+//
+//	o, err := orm.NewOrmUsingDB("data").Begin()
+//	if err != nil {
+//		return
+//	}
+//	defer func() {
+//		if err != nil {
+//			_ = o.Rollback()
+//		} else {
+//			_ = o.Commit()
+//		}
+//	}()
+//
+//	// 根据当前配置用户获取已经存在的未授权记录
+//	var existList []*DataPermissionClassifyNoAuthRecord
+//	sql := `SELECT * FROM data_permission_classify_no_auth_record WHERE source = ? AND sub_source = ? AND sys_user_id in (` + utils.GetOrmInReplace(configUserNum) + `)`
+//	_, err = o.Raw(sql, source, subSource, configUserIdList).QueryRows(&existList)
+//	if err != nil {
+//		return
+//	}
+//
+//	// 已经标记了的数据
+//	existMap := make(map[int32]map[string]*DataPermissionClassifyNoAuthRecord)
+//	delRecordIdMap := make(map[int64]int64)
+//	for _, v := range existList {
+//		tmpUserExistMap, ok := existMap[v.SysUserId]
+//		if !ok {
+//			tmpUserExistMap = make(map[string]*DataPermissionClassifyNoAuthRecord)
+//		}
+//
+//		tmpUserExistMap[v.ClassifyId] = v
+//		existMap[v.SysUserId] = tmpUserExistMap
+//
+//		// 已经配置了的记录id
+//		delRecordIdMap[v.DataPermissionClassifyNoAuthRecordId] = v.DataPermissionClassifyNoAuthRecordId
+//	}
+//
+//	addMessageList := make([]*DataPermissionMessage, 0)
+//	addRecordList := make([]*DataPermissionClassifyNoAuthRecord, 0)
+//	for _, userId := range configUserIdList {
+//		isAdd := false
+//
+//		tmpUserExistMap, userExistOk := existMap[int32(userId)]
+//
+//		for _, dataItem := range noAuthClassifyMap {
+//			// 判断是否已经存在,已经存在就过滤
+//			if userExistOk {
+//				key := fmt.Sprint(dataItem.ClassifyId)
+//				tmpUserRecord, ok := tmpUserExistMap[key]
+//				if ok {
+//					delete(delRecordIdMap, tmpUserRecord.DataPermissionClassifyNoAuthRecordId)
+//					continue
+//				}
+//			}
+//
+//			isAdd = true
+//			addRecordList = append(addRecordList, &DataPermissionClassifyNoAuthRecord{
+//				DataPermissionClassifyNoAuthRecordId: 0,
+//				Source:                               int32(source),
+//				SubSource:                            int32(subSource),
+//				OpUniqueCode:                         uniqueCode,
+//				ClassifyId:                           fmt.Sprint(dataItem.ClassifyId),
+//				ClassifyName:                         dataItem.ClassifyName,
+//				SysUserId:                            int32(userId),
+//				CreateTime:                           time.Now(),
+//			})
+//		}
+//
+//		// 有记录的话,需要添加消息
+//		if isAdd {
+//			addMessageList = append(addMessageList, &DataPermissionMessage{
+//				DataPermissionMessageId: 0,
+//				SendUserId:              int32(opUserId),
+//				ReceiveUserId:           int32(userId),
+//				Content:                 content,
+//				Remark:                  content,
+//				OpType:                  4,
+//				Source:                  int32(source),
+//				SubSource:               int32(subSource),
+//				OpUniqueCode:            uniqueCode,
+//				IsRead:                  0,
+//				CreateTime:              time.Now(),
+//				ModifyTime:              time.Now(),
+//			})
+//		}
+//	}
+//
+//	// 添加消息
+//	if len(addMessageList) > 0 {
+//		_, err = o.InsertMulti(500, addMessageList)
+//		if err != nil {
+//			return
+//		}
+//	}
+//
+//	// 添加记录
+//	if len(addRecordList) > 0 {
+//		_, err = o.InsertMulti(500, addRecordList)
+//		if err != nil {
+//			return
+//		}
+//	}
+//
+//	// 需要删除未授权记录
+//	delRecordIdNum := len(delRecordIdMap)
+//	if delRecordIdNum > 0 {
+//		delRecordIdList := make([]int64, 0)
+//		for _, v := range delRecordIdMap {
+//			delRecordIdList = append(delRecordIdList, v)
+//		}
+//		sql = `DELETE FROM data_permission_classify_no_auth_record WHERE data_permission_classify_no_auth_record_id in (` + utils.GetOrmInReplace(delRecordIdNum) + `) `
+//		_, err = o.Raw(sql, delRecordIdList).Exec()
+//	}
+//
+//	return
+//}
+//
+//// DeleteClassifyNoAuthRecordBySourceAndClassifyIdList
+//// @Description: 根据来源和删除分类授权记录
+//// @author: Roc
+//// @datetime 2024-04-07 14:47:37
+//// @param source int
+//// @param subSource int
+//// @return err error
+//func DeleteClassifyNoAuthRecordBySourceAndClassifyIdList(source, subSource int) (err error) {
+//	o := orm.NewOrmUsingDB("data")
+//
+//	sql := `DELETE FROM data_permission_classify_no_auth_record WHERE source = ? AND sub_source = ?`
+//	_, err = o.Raw(sql, source, subSource).Exec()
+//
+//	return
+//}
+//
+//// GetDataPermissionClassifyNoAuthRecordListByUserId
+//// @Description: 根据用户获取未授权的资产分类记录
+//// @author: Roc
+//// @datetime 2024-04-07 20:14:49
+//// @param userId int
+//// @param source int
+//// @param subSource int
+//// @param startSize int
+//// @param pageSize int
+//// @return total int
+//// @return items []*DataPermissionClassifyNoAuthRecord
+//// @return err error
+//func GetDataPermissionClassifyNoAuthRecordListByUserId(userId, source, subSource int32, startSize, pageSize int) (total int, items []*DataPermissionClassifyNoAuthRecord, err error) {
+//	o := orm.NewOrmUsingDB("data")
+//
+//	// 获取总数
+//	sql := `SELECT count(1) AS total FROM data_permission_classify_no_auth_record WHERE sys_user_id = ? AND source = ? AND sub_source = ? `
+//	err = o.Raw(sql, userId, source, subSource).QueryRow(&total)
+//	if err != nil {
+//		return
+//	}
+//
+//	sql = `SELECT * FROM data_permission_classify_no_auth_record WHERE sys_user_id = ? AND source = ? AND sub_source = ? ORDER BY data_permission_classify_no_auth_record_id desc LIMIT ?,? `
+//	_, err = o.Raw(sql, userId, source, subSource, startSize, pageSize).QueryRows(&items)
+//
+//	return
+//}
+
+// AddClassifyNoAuthRecordBySourceAndClassifyIdList
+// @Description: 根据分类添加用户分类未授权记录
+// @author: Roc
+// @datetime 2024-04-07 16:44:21
+// @param source int
+// @param subSource int
+// @param classifyInfoList []ClassifyDataItem
+// @param noAuthUserIdList []int
+// @param uniqueCode string
+// @param content string
+// @param opUserId int
+// @return err error
+func AddClassifyNoAuthRecordBySourceAndClassifyIdList(source, subSource int, classifyInfoList []ClassifyDataItem, noAuthUserIdList []int, uniqueCode, title, content string, opUserId int) (err error) {
+	switch source {
+	case 3, 4:
+		edbClassifyType := 0
+		if source == 4 {
+			edbClassifyType = 1
+		}
+		err = AddEdbInfoClassifyNoAuthRecordBySourceAndClassifyIdList(source, edbClassifyType, classifyInfoList, noAuthUserIdList, uniqueCode, title, content, opUserId)
+	case 5:
+		//图库
+		chartSource := utils.CHART_SOURCE_DEFAULT
+		err = AddChartInfoClassifyNoAuthRecordBySourceAndClassifyIdList(source, chartSource, classifyInfoList, noAuthUserIdList, uniqueCode, title, content, opUserId)
+
+	case 6:
+		// ETA表格
+		err = AddExcelInfoClassifyNoAuthRecordBySourceAndClassifyIdList(source, subSource, classifyInfoList, noAuthUserIdList, uniqueCode, title, content, opUserId)
+
+	default:
+		err = errors.New("错误的source")
+		return
+	}
+
+	return
+}
+
+// AddClassifyNoAuthRecordBySourceAndUserIdList
+// @Description: 根据用户添加用户分类未授权记录
+// @author: Roc
+// @datetime 2024-04-07 20:12:44
+// @param source int
+// @param subSource int
+// @param noAuthClassifyMap map[int]ClassifyDataItem
+// @param configUserIdList []int
+// @param uniqueCode string
+// @param content string
+// @param opUserId int
+// @return err error
+func AddClassifyNoAuthRecordBySourceAndUserIdList(source, subSource int, noAuthClassifyMap map[int]ClassifyDataItem, configUserIdList []int, uniqueCode, title, content string, opUserId int) (err error) {
+	switch source {
+	case 3, 4:
+		edbClassifyType := 0
+		if source == 4 {
+			edbClassifyType = 1
+		}
+		err = AddEdbInfoClassifyNoAuthRecordBySourceAndUserIdList(source, edbClassifyType, noAuthClassifyMap, configUserIdList, uniqueCode, title, content, opUserId)
+	case 5:
+		//图库
+		chartSource := utils.CHART_SOURCE_DEFAULT
+		err = AddChartInfoClassifyNoAuthRecordBySourceAndUserIdList(source, chartSource, noAuthClassifyMap, configUserIdList, uniqueCode, title, content, opUserId)
+
+	case 6:
+		// ETA表格
+		err = AddExcelInfoClassifyNoAuthRecordBySourceAndUserIdList(source, subSource, noAuthClassifyMap, configUserIdList, uniqueCode, title, content, opUserId)
+
+	default:
+		err = errors.New("错误的source")
+		return
+	}
+
+	return
+}
+
+// DeleteClassifyNoAuthRecordBySourceAndClassifyIdList
+// @Description: 根据来源和删除分类授权记录
+// @author: Roc
+// @datetime 2024-04-07 14:47:37
+// @param source int
+// @param subSource int
+// @return err error
+func DeleteClassifyNoAuthRecordBySourceAndClassifyIdList(source, subSource int) (err error) {
+	switch source {
+	case 3, 4:
+		edbClassifyType := 0
+		if source == 4 {
+			edbClassifyType = 1
+		}
+		err = DeleteEdbInfoClassifyNoAuthRecordBySourceAndClassifyIdList(edbClassifyType)
+	case 5:
+		//图库
+		chartSource := utils.CHART_SOURCE_DEFAULT
+		err = DeleteChartInfoClassifyNoAuthRecordBySourceAndClassifyIdList(chartSource)
+
+	case 6:
+		// ETA表格
+		err = DeleteExcelInfoClassifyNoAuthRecordBySourceAndClassifyIdList(subSource)
+
+	default:
+		err = errors.New("错误的source")
+		return
+	}
+
+	return
+}
+
+// GetDataPermissionClassifyNoAuthRecordListByUserId
+// @Description: 根据用户获取未授权的资产分类记录
+// @author: Roc
+// @datetime 2024-04-07 20:14:49
+// @param userId int
+// @param source int
+// @param subSource int
+// @param startSize int
+// @param pageSize int
+// @return total int
+// @return items []*DataPermissionClassifyNoAuthRecord
+// @return err error
+func GetDataPermissionClassifyNoAuthRecordListByUserId(userId, source, subSource int32, startSize, pageSize int) (total int, items []*DataPermissionClassifyNoAuthRecord, err error) {
+	switch source {
+	case 3, 4:
+		edbClassifyType := 0
+		if source == 4 {
+			edbClassifyType = 1
+		}
+		total, items, err = GetEdbInfoDataPermissionClassifyNoAuthRecordListByUserId(userId, edbClassifyType, startSize, pageSize)
+	case 5:
+		//图库
+		chartSource := utils.CHART_SOURCE_DEFAULT
+		total, items, err = GetChartInfoDataPermissionClassifyNoAuthRecordListByUserId(userId, chartSource, startSize, pageSize)
+
+	case 6:
+		// ETA表格
+		total, items, err = GetExcelInfoDataPermissionClassifyNoAuthRecordListByUserId(userId, subSource, startSize, pageSize)
+
+	default:
+		err = errors.New("错误的source")
+		return
+	}
+
+	return
+}

+ 989 - 0
models/data_manage/data_manage_permission/edb.go

@@ -0,0 +1,989 @@
+package data_manage_permission
+
+import (
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strconv"
+	"time"
+)
+
+// EdbInfoPermission
+// @Description: 指标权限表
+type EdbInfoPermission struct {
+	EdbInfoPermissionId int64     `json:"edb_info_permission_id" orm:"column(edb_info_permission_id);pk"`
+	EdbInfoId           int32     `json:"edb_info_id"`   // 指标id
+	EdbInfoType         int32     `json:"edb_info_type"` // 指标类型,0:普通指标,1:预测指标
+	SysUserId           int32     `json:"sys_user_id"`   // 系统用户id
+	ModifyTime          time.Time `json:"modify_time"`   // 变更时间
+	CreateTime          time.Time `json:"create_time"`   // 关系建立时间
+}
+
+// EdbClassifyPermission
+// @Description: 指标分类权限表
+type EdbClassifyPermission struct {
+	EdbClassifyPermissionId int64     `json:"edb_classify_permission_id" orm:"column(edb_classify_permission_id);pk"`
+	EdbClassifyId           int32     `json:"edb_classify_id"`   // 分类id
+	EdbClassifyType         int32     `json:"edb_classify_type"` // 分类类型,0:普通指标分类,1:预测指标分类
+	SysUserId               int32     `json:"sys_user_id"`       // 系统用户id
+	ModifyTime              time.Time `json:"modify_time"`       // 变更时间
+	CreateTime              time.Time `json:"create_time"`       // 关系建立时间
+}
+
+// SetIsPermissionEdbChartByEdbClassifyIdList
+// @Description: 设置指标分类是否涉密
+// @author: Roc
+// @datetime 2024-03-27 14:15:42
+// @param classifyIdList []int
+func SetIsPermissionEdbChartByEdbClassifyIdList(classifyIdList []int, classifyType int) (err error) {
+	num := len(classifyIdList)
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	//// 获取已经配置涉密的分类权限
+	//edbClassifyList := make([]*EdbClassify, 0)
+	//sql := `SELECT * FROM edb_classify WHERE is_join_permission = ? `
+	//_, err = o.Raw(sql, 1).QueryRows(&edbClassifyList)
+	//if err != nil {
+	//	return
+	//}
+	//edbClassifyMap := make(map[int]*EdbClassify)
+	//for _, v := range edbClassifyList {
+	//	edbClassifyMap[v.ClassifyId] = v
+	//}
+
+	// 先将所有已经设置了涉密的分类设置为不涉密
+	sql := `UPDATE edb_classify SET is_join_permission=?,modify_time=now() WHERE is_join_permission = 1 AND classify_type = ?`
+	_, err = o.Raw(sql, 0, classifyType).Exec()
+	if err != nil {
+		return
+	}
+
+	if num > 0 {
+		// 将对应的分类设置为涉密
+		sql = `UPDATE edb_classify SET is_join_permission=?,modify_time=now() WHERE classify_type = ? AND classify_id in (` + utils.GetOrmInReplace(num) + `) `
+		_, err = o.Raw(sql, 1, classifyType, classifyIdList).Exec()
+		if err != nil {
+			return
+		}
+	}
+
+	return
+}
+
+// SetPermissionByEdbIdList
+// @Description: 根据指标ID列表设置指标的用户权限
+// @author: Roc
+// @datetime 2024-03-27 14:03:42
+// @param edbIdList []string
+// @param userIdList []int
+// @param chartInfoType int
+// @return err error
+func SetPermissionByEdbIdList(edbIdList []string, userIdList []int, edbInfoType int) (err error) {
+	edbNum := len(edbIdList)
+	if edbNum <= 0 {
+		return
+	}
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 获取已经配置的指标权限用户
+	edbInfoPermissionList := make([]*EdbInfoPermission, 0)
+	sql := `SELECT * FROM edb_info_permission WHERE edb_info_type = ? AND edb_info_id in (` + utils.GetOrmInReplace(edbNum) + `) `
+	_, err = o.Raw(sql, edbInfoType, edbIdList).QueryRows(&edbInfoPermissionList)
+	if err != nil {
+		return
+	}
+	edbInfoPermissionMap := make(map[string]*EdbInfoPermission)
+	for _, v := range edbInfoPermissionList {
+		edbInfoPermissionMap[fmt.Sprint(v.EdbInfoId, "_", v.SysUserId)] = v
+	}
+
+	// 标记指标是否纳入权限管控
+	{
+		// 默认 标记指标为纳入权限管控
+		isJoinPermission := 1
+		// 用户不选的情况下,说明是要给这些指标移除权限管控
+		if len(userIdList) <= 0 {
+			// 标记指标为不纳入权限管控
+			isJoinPermission = 0
+		}
+		sql = `UPDATE edb_info SET is_join_permission=?,modify_time=now() WHERE edb_info_type = ? AND edb_info_id in (` + utils.GetOrmInReplace(edbNum) + `) `
+		_, err = o.Raw(sql, isJoinPermission, edbInfoType, edbIdList).Exec()
+		if err != nil {
+			return
+		}
+	}
+
+	// 待添加的配置项
+	addList := make([]*EdbInfoPermission, 0)
+
+	// 遍历待配置的指标和用户,筛选出需要添加的配置项
+	for _, edbInfoIdStr := range edbIdList {
+		edbInfoId, tmpErr := strconv.ParseInt(edbInfoIdStr, 10, 64)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, userId := range userIdList {
+			key := fmt.Sprint(edbInfoId, "_", userId)
+			if _, ok := edbInfoPermissionMap[key]; ok {
+				// 如果存在那么就移除,说明不需要处理了
+				delete(edbInfoPermissionMap, key)
+			} else {
+				// 如果不存在,那么就添加
+				addList = append(addList, &EdbInfoPermission{
+					//PermissionId: 0,
+					EdbInfoId:   int32(edbInfoId),
+					SysUserId:   int32(userId),
+					EdbInfoType: int32(edbInfoType),
+					ModifyTime:  time.Now(),
+					CreateTime:  time.Now(),
+				})
+			}
+		}
+	}
+
+	// 添加待配置项
+	if len(addList) > 0 {
+		_, err = o.InsertMulti(500, addList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 移除废弃的配置项
+	{
+		// 待移除的配置项
+		deletePermissionIdList := make([]int64, 0)
+		for _, v := range edbInfoPermissionMap {
+			deletePermissionIdList = append(deletePermissionIdList, v.EdbInfoPermissionId)
+		}
+
+		deletePermissionIdNum := len(deletePermissionIdList)
+		if deletePermissionIdNum > 0 {
+			sql = "DELETE FROM edb_info_permission WHERE edb_info_permission_id in (" + utils.GetOrmInReplace(deletePermissionIdNum) + ")"
+			_, err = o.Raw(sql, deletePermissionIdList).Exec()
+			if err != nil {
+				return
+			}
+		}
+	}
+
+	return
+}
+
+// SetPermissionByEdbClassifyIdList
+// @Description: 根据指标分类ID列表设置分类的用户权限
+// @author: Roc
+// @datetime 2024-03-28 14:53:04
+// @param classifyIdList []int
+// @param userIdList []int
+// @return err error
+func SetPermissionByEdbClassifyIdList(classifyIdList []int, userIdList []int, classifyType int) (err error) {
+	userNum := len(userIdList)
+	if userNum <= 0 {
+		return
+	}
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 获取当前选择用户已经配置的指标分类权限
+	classifyPermissionList := make([]*EdbClassifyPermission, 0)
+	sql := `SELECT * FROM edb_classify_permission WHERE edb_classify_type = ? AND sys_user_id in (` + utils.GetOrmInReplace(userNum) + `) `
+	_, err = o.Raw(sql, classifyType, userIdList).QueryRows(&classifyPermissionList)
+	if err != nil {
+		return
+	}
+	classifyPermissionMap := make(map[string]*EdbClassifyPermission)
+	for _, v := range classifyPermissionList {
+		classifyPermissionMap[fmt.Sprint(v.EdbClassifyId, "_", v.SysUserId)] = v
+	}
+
+	// 待添加的配置项
+	addList := make([]*EdbClassifyPermission, 0)
+
+	// 遍历待配置的指标和用户,筛选出需要添加的配置项
+	for _, userId := range userIdList {
+		for _, classifyId := range classifyIdList {
+			key := fmt.Sprint(classifyId, "_", userId)
+			if _, ok := classifyPermissionMap[key]; ok {
+				// 如果存在那么就移除,说明不需要处理了
+				delete(classifyPermissionMap, key)
+			} else {
+				// 如果不存在,那么就提那家
+				addList = append(addList, &EdbClassifyPermission{
+					//PermissionId: 0,
+					EdbClassifyId:   int32(classifyId),
+					EdbClassifyType: int32(classifyType),
+					SysUserId:       int32(userId),
+					ModifyTime:      time.Now(),
+					CreateTime:      time.Now(),
+				})
+			}
+		}
+	}
+
+	// 添加待配置项
+	if len(addList) > 0 {
+		_, err = o.InsertMulti(500, addList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 移除废弃的配置项
+	{
+		// 获取移除的配置项
+		deletePermissionIdList := make([]int64, 0)
+		for _, v := range classifyPermissionMap {
+			deletePermissionIdList = append(deletePermissionIdList, v.EdbClassifyPermissionId)
+		}
+
+		deletePermissionIdNum := len(deletePermissionIdList)
+		if deletePermissionIdNum > 0 {
+			sql = "DELETE FROM edb_classify_permission WHERE edb_classify_permission_id in (" + utils.GetOrmInReplace(deletePermissionIdNum) + ")"
+			_, err = o.Raw(sql, deletePermissionIdList).Exec()
+			if err != nil {
+				return
+			}
+		}
+	}
+
+	return
+}
+
+// GetPermissionEdbClassifyIdListByUserId
+// @Description: 根据用户ID获取已经配置的分类id列表
+// @author: Roc
+// @datetime 2024-03-29 16:24:46
+// @param userId int
+// @param classifyType int
+// @return edbClassifyIdList []int
+// @return err error
+func GetPermissionEdbClassifyIdListByUserId(userId int, classifyType int) (edbClassifyIdList []int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT edb_classify_id FROM edb_classify_permission WHERE edb_classify_type = ? AND sys_user_id = ? `
+	_, err = o.Raw(sql, classifyType, userId).QueryRows(&edbClassifyIdList)
+
+	return
+}
+
+// GetPermissionUserIdListByEdbId
+// @Description: 根据指标ID获取已经配置的用户id列表
+// @author: Roc
+// @datetime 2024-03-29 16:24:46
+// @param dataId int
+// @param edbInfoType int
+// @return userIdList []int
+// @return err error
+func GetPermissionUserIdListByEdbId(dataId int, edbInfoType int) (userIdList []int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT sys_user_id FROM edb_info_permission WHERE edb_info_type = ? AND edb_info_id= ? `
+	_, err = o.Raw(sql, edbInfoType, dataId).QueryRows(&userIdList)
+
+	return
+}
+
+// GetPermissionUserIdListByEdbClassifyId
+// @Description: 根据指标分类ID获取已经配置的用户id列表
+// @author: Roc
+// @datetime 2024-03-29 16:24:46
+// @param classifyId int
+// @param edbClassifyType int
+// @return userIdList []int
+// @return err error
+func GetPermissionUserIdListByEdbClassifyId(classifyId int, edbClassifyType int) (userIdList []int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT sys_user_id FROM edb_classify_permission WHERE edb_classify_type = ? AND edb_classify_id= ? `
+	_, err = o.Raw(sql, edbClassifyType, classifyId).QueryRows(&userIdList)
+
+	return
+}
+
+// GetPermissionEdbIdList
+// @Description: 获取用户权限的指标列表
+// @author: Roc
+// @datetime 2024-03-28 16:50:47
+// @param userId int
+// @param edbInfoId int
+// @return idList []int
+// @return err error
+func GetPermissionEdbIdList(userId, edbInfoId int) (idList []int, err error) {
+	pars := []interface{}{userId}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT edb_info_id FROM edb_info_permission WHERE sys_user_id = ? `
+	if edbInfoId > 0 {
+		sql += ` AND edb_info_id = ? `
+		pars = append(pars, edbInfoId)
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&idList)
+
+	return
+}
+
+// GetPermissionEdbClassifyIdList
+// @Description: 获取用户权限的指标分类列表
+// @author: Roc
+// @datetime 2024-03-28 16:50:47
+// @param userId int
+// @param classifyId int
+// @return idList []int
+// @return err error
+func GetPermissionEdbClassifyIdList(userId, classifyId int) (idList []int, err error) {
+	pars := []interface{}{userId}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT edb_classify_id FROM edb_classify_permission WHERE sys_user_id = ? `
+	if classifyId > 0 {
+		sql += ` AND edb_classify_id = ? `
+		pars = append(pars, classifyId)
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&idList)
+
+	return
+}
+
+// InheritParentClassifyByEdbClassifyId
+// @Description: 继承父级分类的指标权限信息
+// @author: Roc
+// @datetime 2024-04-07 21:02:51
+// @param source int
+// @param classifyType int
+// @param classifyId int
+// @param parentClassifyId int
+// @param classifyName string
+// @param uniqueCode string
+// @return err error
+func InheritParentClassifyByEdbClassifyId(source, classifyType, classifyId, parentClassifyId int, classifyName, uniqueCode string) (err error) {
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 将对应的分类设置为涉密
+	sql := `UPDATE edb_classify SET is_join_permission=?,modify_time=now() WHERE classify_type = ? AND classify_id = ? `
+	_, err = o.Raw(sql, 1, classifyType, classifyId).Exec()
+	if err != nil {
+		return
+	}
+
+	// 添加未授权记录
+	{
+		// 获取父级未授权的用户记录
+		var parentRecordItems []*EdbInfoClassifyPermissionNoAuthRecord
+		sql = `SELECT * FROM edb_info_classify_permission_no_auth_record WHERE classify_id = ? AND edb_classify_type = ? ORDER BY edb_info_classify_permission_no_auth_record_id desc LIMIT ?,? `
+		_, err = o.Raw(sql, parentClassifyId, source, classifyType).QueryRows(&parentRecordItems)
+
+		addNoAuthRecordItems := make([]*EdbInfoClassifyPermissionNoAuthRecord, 0)
+		for _, v := range parentRecordItems {
+			addNoAuthRecordItems = append(addNoAuthRecordItems, &EdbInfoClassifyPermissionNoAuthRecord{
+				EdbInfoClassifyPermissionNoAuthRecordId: 0,
+				EdbClassifyType:                         v.EdbClassifyType,
+				OpUniqueCode:                            uniqueCode,
+				ClassifyId:                              fmt.Sprint(classifyId),
+				ClassifyName:                            classifyName,
+				SysUserId:                               v.SysUserId,
+				CreateTime:                              time.Now(),
+			})
+		}
+
+		// 添加待配置项
+		if len(addNoAuthRecordItems) > 0 {
+			_, err = o.InsertMulti(500, addNoAuthRecordItems)
+			if err != nil {
+				return
+			}
+		}
+
+	}
+
+	// 添加授权记录
+	{
+		// 获取父级分类已经授权的用户
+		parentClassifyPermissionList := make([]*EdbClassifyPermission, 0)
+		sql = `SELECT * FROM edb_classify_permission WHERE edb_classify_type = ? AND edb_classify_id = ? `
+		_, err = o.Raw(sql, classifyType, parentClassifyId).QueryRows(&parentClassifyPermissionList)
+		if err != nil {
+			return
+		}
+
+		addList := make([]*EdbClassifyPermission, 0)
+		for _, v := range parentClassifyPermissionList {
+			// 如果不存在,那么就提那家
+			addList = append(addList, &EdbClassifyPermission{
+				//PermissionId: 0,
+				EdbClassifyId:   int32(classifyId),
+				EdbClassifyType: int32(classifyType),
+				SysUserId:       v.SysUserId,
+				ModifyTime:      time.Now(),
+				CreateTime:      time.Now(),
+			})
+		}
+		// 添加待配置项
+		if len(addList) > 0 {
+			_, err = o.InsertMulti(500, addList)
+			if err != nil {
+				return
+			}
+		}
+	}
+
+	return
+}
+
+// EdbInfoPermissionNoAuthRecord
+// @Description: 指标数据权限未授权记录表
+type EdbInfoPermissionNoAuthRecord struct {
+	EdbInfoPermissionNoAuthRecordId int64     `json:"edb_info_permission_no_auth_record_id"  orm:"column(edb_info_permission_no_auth_record_id);pk"` // 资产数据操作记录id
+	OpUniqueCode                    string    `json:"op_unique_code"`                                                                                // 操作的唯一编码,主要是记录统一操作的日志
+	EdbInfoType                     int32     `json:"edb_info_type"`                                                                                 // 指标类型,0:普通指标,1:预测指标
+	EdbInfoId                       int32     `json:"edb_info_id"`                                                                                   // 指标id
+	EdbCode                         string    `json:"edb_code"`                                                                                      // 指标编码
+	EdbName                         string    `json:"edb_name"`                                                                                      // 指标名称
+	SysUserId                       int32     `json:"sys_user_id"`                                                                                   // 系统用户id
+	CreateTime                      time.Time `json:"create_time"`                                                                                   // 创建时间
+}
+
+// AddEdbInfoPermissionNoAuthRecordBySourceAndDataIdList
+// @Description: 添加未授权用户记录
+// @author: Roc
+// @datetime 2024-04-07 15:25:49
+// @param source int
+// @param edbInfoType int
+// @param dataList []DataItem
+// @param noAuthUserIdList []int 未授权用户
+// @param authUserIdList []int 已授权用户
+// @param uniqueCode
+// @param content string
+// @param opUserId int
+// @return err error
+func AddEdbInfoPermissionNoAuthRecordBySourceAndDataIdList(source, edbInfoType int, dataList []DataItem, noAuthUserIdList, authUserIdList []int, uniqueCode, title, content string, opUserId int) (err error) {
+	num := len(dataList)
+	if num <= 0 {
+		return
+	}
+	dataIdList := make([]int, 0)
+	for _, v := range dataList {
+		dataIdList = append(dataIdList, v.DataId)
+	}
+	userNum := len(noAuthUserIdList)
+	if userNum <= 0 {
+		return
+	}
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 根据指标获取已经存在的未授权记录
+	var existList []*EdbInfoPermissionNoAuthRecord
+	sql := `SELECT * FROM edb_info_permission_no_auth_record WHERE  edb_info_type = ? AND edb_info_id in (` + utils.GetOrmInReplace(num) + `)`
+	_, err = o.Raw(sql, edbInfoType, dataIdList).QueryRows(&existList)
+	if err != nil {
+		return
+	}
+
+	// 已经标记了的数据
+	existMap := make(map[int32]map[string]*EdbInfoPermissionNoAuthRecord)
+	for _, v := range existList {
+		tmpUserExistMap, ok := existMap[v.SysUserId]
+		if !ok {
+			tmpUserExistMap = make(map[string]*EdbInfoPermissionNoAuthRecord)
+		}
+
+		key := fmt.Sprint(v.EdbInfoType, "_", v.EdbInfoId)
+		tmpUserExistMap[key] = v
+		existMap[v.SysUserId] = tmpUserExistMap
+	}
+
+	addMessageList := make([]*DataPermissionMessage, 0)
+	addRecordList := make([]*EdbInfoPermissionNoAuthRecord, 0)
+	for _, userId := range noAuthUserIdList {
+		isAdd := false
+
+		tmpUserExistMap, userExistOk := existMap[int32(userId)]
+
+		for _, dataItem := range dataList {
+			// 判断是否已经存在,已经存在就过滤
+			if userExistOk {
+				key := fmt.Sprint(edbInfoType, "_", dataItem.DataId)
+				_, ok := tmpUserExistMap[key]
+				if ok {
+					continue
+				}
+			}
+
+			isAdd = true
+			addRecordList = append(addRecordList, &EdbInfoPermissionNoAuthRecord{
+				EdbInfoPermissionNoAuthRecordId: 0,
+				OpUniqueCode:                    uniqueCode,
+				EdbInfoType:                     int32(edbInfoType),
+				EdbInfoId:                       int32(dataItem.DataId),
+				EdbCode:                         dataItem.DataCode,
+				EdbName:                         dataItem.DataName,
+				SysUserId:                       int32(userId),
+				CreateTime:                      time.Now(),
+			})
+		}
+
+		// 有记录的话,需要添加消息
+		if isAdd {
+			addMessageList = append(addMessageList, &DataPermissionMessage{
+				DataPermissionMessageId: 0,
+				SendUserId:              int32(opUserId),
+				ReceiveUserId:           int32(userId),
+				Content:                 title,
+				Remark:                  content,
+				OpType:                  3,
+				Source:                  int32(source),
+				SubSource:               int32(edbInfoType),
+				OpUniqueCode:            uniqueCode,
+				IsRead:                  0,
+				CreateTime:              time.Now(),
+				ModifyTime:              time.Now(),
+			})
+		}
+	}
+
+	// 添加消息
+	if len(addMessageList) > 0 {
+		_, err = o.InsertMulti(500, addMessageList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 添加记录
+	if len(addRecordList) > 0 {
+		_, err = o.InsertMulti(500, addRecordList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 已经授权了的用户,需要删除未授权记录
+	authUserIdNum := len(authUserIdList)
+	if authUserIdNum > 0 {
+		sql = `DELETE FROM edb_info_permission_no_auth_record WHERE  edb_info_type = ? AND sys_user_id in (` + utils.GetOrmInReplace(authUserIdNum) + `) AND edb_info_id in (` + utils.GetOrmInReplace(num) + `)`
+		_, err = o.Raw(sql, edbInfoType, authUserIdList, dataIdList).Exec()
+	}
+
+	return
+}
+
+// DeleteEdbInfoPermissionNoAuthRecordBySourceAndDataIdList
+// @Description: 根据来源和数据id列表删除记录
+// @author: Roc
+// @datetime 2024-04-07 14:47:37
+// @param source int
+// @param subSource int
+// @param dataIdList []string
+// @return err error
+func DeleteEdbInfoPermissionNoAuthRecordBySourceAndDataIdList(edbInfoType int, dataIdList []string) (err error) {
+	num := len(dataIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+
+	sql := `DELETE FROM edb_info_permission_no_auth_record WHERE edb_info_type = ? AND edb_info_id in (` + utils.GetOrmInReplace(num) + `)`
+	_, err = o.Raw(sql, edbInfoType, dataIdList).Exec()
+
+	return
+}
+
+// GetEdbInfoDataPermissionNoAuthRecordListByUserId
+// @Description: 获取明细数据
+// @author: Roc
+// @datetime 2024-04-10 14:23:15
+// @param userId int32
+// @param edbInfoType int32
+// @param startSize int
+// @param pageSize int
+// @return total int
+// @return items []*DataPermissionNoAuthRecord
+// @return err error
+func GetEdbInfoDataPermissionNoAuthRecordListByUserId(userId int32, edbInfoType, startSize, pageSize int) (total int, items []*DataPermissionNoAuthRecord, err error) {
+	o := orm.NewOrmUsingDB("data")
+
+	// 获取总数
+	sql := `SELECT count(1) AS total FROM edb_info_permission_no_auth_record WHERE sys_user_id = ? AND edb_info_type = ? `
+	err = o.Raw(sql, userId, edbInfoType).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql = `SELECT edb_info_permission_no_auth_record_id as data_permission_no_auth_record_id,op_unique_code,edb_info_type as sub_source,edb_info_id as data_id,edb_code as data_code,edb_name as data_name,sys_user_id,create_time FROM edb_info_permission_no_auth_record WHERE sys_user_id = ? AND edb_info_type = ? ORDER BY edb_info_permission_no_auth_record_id desc LIMIT ?,? `
+	_, err = o.Raw(sql, userId, edbInfoType, startSize, pageSize).QueryRows(&items)
+
+	return
+}
+
+type EdbInfoClassifyPermissionNoAuthRecord struct {
+	EdbInfoClassifyPermissionNoAuthRecordId int64     `json:"edb_info_classify_permission_no_auth_record_id" orm:"column(edb_info_classify_permission_no_auth_record_id);pk"` // 资产分类数据操作记录id
+	EdbClassifyType                         int32     `json:"edb_classify_type"`                                                                                              // 子来源 :ETA表格中的各种表格类型,以及图表的来源(这个是后续的扩展方向)
+	OpUniqueCode                            string    `json:"op_unique_code"`                                                                                                 // 操作的唯一编码,主要是记录统一操作的日志
+	ClassifyId                              string    `json:"classify_id"`                                                                                                    // 资产分类id(指标、图表、表格)
+	ClassifyName                            string    `json:"classify_name"`                                                                                                  // 资产分类名称(指标、图表、表格)
+	SysUserId                               int32     `json:"sys_user_id"`                                                                                                    // 系统用户id
+	CreateTime                              time.Time `json:"create_time"`                                                                                                    // 创建时间
+}
+
+// AddEdbInfoClassifyNoAuthRecordBySourceAndClassifyIdList
+// @Description: 根据分类添加用户分类未授权记录
+// @author: Roc
+// @datetime 2024-04-07 16:44:21
+// @param source int
+// @param edbClassifyType int
+// @param classifyInfoList []ClassifyDataItem
+// @param noAuthUserIdList []int
+// @param uniqueCode string
+// @param content string
+// @param opUserId int
+// @return err error
+func AddEdbInfoClassifyNoAuthRecordBySourceAndClassifyIdList(source, edbClassifyType int, classifyInfoList []ClassifyDataItem, noAuthUserIdList []int, uniqueCode, title, content string, opUserId int) (err error) {
+	num := len(classifyInfoList)
+	if num <= 0 {
+		return
+	}
+	// 分类id
+	classifyIdList := make([]int, 0)
+	for _, v := range classifyInfoList {
+		classifyIdList = append(classifyIdList, v.ClassifyId)
+	}
+
+	userNum := len(noAuthUserIdList)
+	if userNum <= 0 {
+		return
+	}
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 根据分类获取已经存在的未授权记录
+	var existList []*EdbInfoClassifyPermissionNoAuthRecord
+	sql := `SELECT * FROM edb_info_classify_permission_no_auth_record WHERE edb_classify_type = ? AND classify_id in (` + utils.GetOrmInReplace(num) + `)`
+	_, err = o.Raw(sql, edbClassifyType, classifyIdList).QueryRows(&existList)
+	if err != nil {
+		return
+	}
+
+	// 已经标记了的数据
+	existMap := make(map[int32]map[string]*EdbInfoClassifyPermissionNoAuthRecord)
+	for _, v := range existList {
+		tmpUserExistMap, ok := existMap[v.SysUserId]
+		if !ok {
+			tmpUserExistMap = make(map[string]*EdbInfoClassifyPermissionNoAuthRecord)
+		}
+
+		key := fmt.Sprint(v.EdbClassifyType, "_", v.ClassifyId)
+		tmpUserExistMap[key] = v
+		existMap[v.SysUserId] = tmpUserExistMap
+	}
+
+	addMessageList := make([]*DataPermissionMessage, 0)
+	addRecordList := make([]*EdbInfoClassifyPermissionNoAuthRecord, 0)
+	for _, userId := range noAuthUserIdList {
+		isAdd := false
+
+		tmpUserExistMap, userExistOk := existMap[int32(userId)]
+
+		for _, dataItem := range classifyInfoList {
+			// 判断是否已经存在,已经存在就过滤
+			if userExistOk {
+				key := fmt.Sprint(edbClassifyType, "_", dataItem.ClassifyId)
+				_, ok := tmpUserExistMap[key]
+				if ok {
+					continue
+				}
+			}
+
+			isAdd = true
+			addRecordList = append(addRecordList, &EdbInfoClassifyPermissionNoAuthRecord{
+				EdbInfoClassifyPermissionNoAuthRecordId: 0,
+				EdbClassifyType:                         int32(edbClassifyType),
+				OpUniqueCode:                            uniqueCode,
+				ClassifyId:                              fmt.Sprint(dataItem.ClassifyId),
+				ClassifyName:                            dataItem.ClassifyName,
+				SysUserId:                               int32(userId),
+				CreateTime:                              time.Now(),
+			})
+		}
+
+		// 有记录的话,需要添加消息
+		if isAdd {
+			addMessageList = append(addMessageList, &DataPermissionMessage{
+				DataPermissionMessageId: 0,
+				SendUserId:              int32(opUserId),
+				ReceiveUserId:           int32(userId),
+				Content:                 title,
+				Remark:                  content,
+				OpType:                  4,
+				Source:                  int32(source),
+				SubSource:               int32(edbClassifyType),
+				OpUniqueCode:            uniqueCode,
+				IsRead:                  0,
+				CreateTime:              time.Now(),
+				ModifyTime:              time.Now(),
+			})
+		}
+	}
+
+	// 添加消息
+	if len(addMessageList) > 0 {
+		_, err = o.InsertMulti(500, addMessageList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 添加记录
+	if len(addRecordList) > 0 {
+		_, err = o.InsertMulti(500, addRecordList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 移除已经公开了的分类权限,需要删除未授权记录
+	authUserIdNum := len(classifyIdList)
+	if authUserIdNum > 0 {
+		sql = `DELETE FROM edb_info_classify_permission_no_auth_record WHERE edb_classify_type = ? AND classify_id not in (` + utils.GetOrmInReplace(num) + `)`
+		_, err = o.Raw(sql, edbClassifyType, classifyIdList).Exec()
+	}
+
+	return
+}
+
+// AddEdbInfoClassifyNoAuthRecordBySourceAndUserIdList
+// @Description: 根据用户添加用户分类未授权记录
+// @author: Roc
+// @datetime 2024-04-07 20:12:44
+// @param source int
+// @param edbClassifyType int
+// @param noAuthClassifyMap map[int]ClassifyDataItem
+// @param configUserIdList []int
+// @param uniqueCode string
+// @param content string
+// @param opUserId int
+// @return err error
+func AddEdbInfoClassifyNoAuthRecordBySourceAndUserIdList(source, edbClassifyType int, noAuthClassifyMap map[int]ClassifyDataItem, configUserIdList []int, uniqueCode, title, content string, opUserId int) (err error) {
+	// 当前配置用户
+	configUserNum := len(configUserIdList)
+	if configUserNum <= 0 {
+		return
+	}
+
+	//// 总共的涉密分类
+	//noAuthClassifyInfoNum := len(noAuthClassifyMap)
+	//if noAuthClassifyInfoNum <= 0 {
+	//	return
+	//}
+
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 根据当前配置用户获取已经存在的未授权记录
+	var existList []*EdbInfoClassifyPermissionNoAuthRecord
+	sql := `SELECT * FROM edb_info_classify_permission_no_auth_record WHERE edb_classify_type = ? AND sys_user_id in (` + utils.GetOrmInReplace(configUserNum) + `)`
+	_, err = o.Raw(sql, edbClassifyType, configUserIdList).QueryRows(&existList)
+	if err != nil {
+		return
+	}
+
+	// 已经标记了的数据
+	existMap := make(map[int32]map[string]*EdbInfoClassifyPermissionNoAuthRecord)
+	delRecordIdMap := make(map[int64]int64)
+	for _, v := range existList {
+		tmpUserExistMap, ok := existMap[v.SysUserId]
+		if !ok {
+			tmpUserExistMap = make(map[string]*EdbInfoClassifyPermissionNoAuthRecord)
+		}
+
+		tmpUserExistMap[v.ClassifyId] = v
+		existMap[v.SysUserId] = tmpUserExistMap
+
+		// 已经配置了的记录id
+		delRecordIdMap[v.EdbInfoClassifyPermissionNoAuthRecordId] = v.EdbInfoClassifyPermissionNoAuthRecordId
+	}
+
+	addMessageList := make([]*DataPermissionMessage, 0)
+	addRecordList := make([]*EdbInfoClassifyPermissionNoAuthRecord, 0)
+	for _, userId := range configUserIdList {
+		isAdd := false
+
+		tmpUserExistMap, userExistOk := existMap[int32(userId)]
+
+		for _, dataItem := range noAuthClassifyMap {
+			// 判断是否已经存在,已经存在就过滤
+			if userExistOk {
+				key := fmt.Sprint(dataItem.ClassifyId)
+				tmpUserRecord, ok := tmpUserExistMap[key]
+				if ok {
+					delete(delRecordIdMap, tmpUserRecord.EdbInfoClassifyPermissionNoAuthRecordId)
+					continue
+				}
+			}
+
+			isAdd = true
+			addRecordList = append(addRecordList, &EdbInfoClassifyPermissionNoAuthRecord{
+				EdbInfoClassifyPermissionNoAuthRecordId: 0,
+				EdbClassifyType:                         int32(edbClassifyType),
+				OpUniqueCode:                            uniqueCode,
+				ClassifyId:                              fmt.Sprint(dataItem.ClassifyId),
+				ClassifyName:                            dataItem.ClassifyName,
+				SysUserId:                               int32(userId),
+				CreateTime:                              time.Now(),
+			})
+		}
+
+		// 有记录的话,需要添加消息
+		if isAdd {
+			addMessageList = append(addMessageList, &DataPermissionMessage{
+				DataPermissionMessageId: 0,
+				SendUserId:              int32(opUserId),
+				ReceiveUserId:           int32(userId),
+				Content:                 title,
+				Remark:                  content,
+				OpType:                  4,
+				Source:                  int32(source),
+				SubSource:               int32(edbClassifyType),
+				OpUniqueCode:            uniqueCode,
+				IsRead:                  0,
+				CreateTime:              time.Now(),
+				ModifyTime:              time.Now(),
+			})
+		}
+	}
+
+	// 添加消息
+	if len(addMessageList) > 0 {
+		_, err = o.InsertMulti(500, addMessageList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 添加记录
+	if len(addRecordList) > 0 {
+		_, err = o.InsertMulti(500, addRecordList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 需要删除未授权记录
+	delRecordIdNum := len(delRecordIdMap)
+	if delRecordIdNum > 0 {
+		delRecordIdList := make([]int64, 0)
+		for _, v := range delRecordIdMap {
+			delRecordIdList = append(delRecordIdList, v)
+		}
+		sql = `DELETE FROM edb_info_classify_permission_no_auth_record WHERE edb_info_classify_permission_no_auth_record_id in (` + utils.GetOrmInReplace(delRecordIdNum) + `) `
+		_, err = o.Raw(sql, delRecordIdList).Exec()
+	}
+
+	return
+}
+
+// DeleteEdbInfoClassifyNoAuthRecordBySourceAndClassifyIdList
+// @Description: 根据来源和删除分类授权记录
+// @author: Roc
+// @datetime 2024-04-07 14:47:37
+// @param source int
+// @param edbClassifyType int
+// @return err error
+func DeleteEdbInfoClassifyNoAuthRecordBySourceAndClassifyIdList(edbClassifyType int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+
+	sql := `DELETE FROM edb_info_classify_permission_no_auth_record WHERE edb_classify_type = ?`
+	_, err = o.Raw(sql, edbClassifyType).Exec()
+
+	return
+}
+
+// GetEdbInfoDataPermissionClassifyNoAuthRecordListByUserId
+// @Description: 根据用户获取未授权的资产分类记录
+// @author: Roc
+// @datetime 2024-04-07 20:14:49
+// @param userId int
+// @param source int
+// @param subSource int
+// @param startSize int
+// @param pageSize int
+// @return total int
+// @return items []*DataPermissionClassifyNoAuthRecord
+// @return err error
+func GetEdbInfoDataPermissionClassifyNoAuthRecordListByUserId(userId int32, edbClassifyType, startSize, pageSize int) (total int, items []*DataPermissionClassifyNoAuthRecord, err error) {
+	o := orm.NewOrmUsingDB("data")
+
+	// 获取总数
+	sql := `SELECT count(1) AS total FROM edb_info_classify_permission_no_auth_record WHERE sys_user_id = ? AND edb_classify_type = ? `
+	err = o.Raw(sql, userId, edbClassifyType).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql = `SELECT edb_info_classify_permission_no_auth_record_id as data_permission_classify_no_auth_record_id,edb_classify_type as sub_source,op_unique_code,classify_id,classify_name,sys_user_id,create_time  FROM edb_info_classify_permission_no_auth_record WHERE sys_user_id = ? AND edb_classify_type = ? ORDER BY edb_info_classify_permission_no_auth_record_id desc LIMIT ?,? `
+	_, err = o.Raw(sql, userId, edbClassifyType, startSize, pageSize).QueryRows(&items)
+
+	return
+}

+ 973 - 0
models/data_manage/data_manage_permission/excel.go

@@ -0,0 +1,973 @@
+package data_manage_permission
+
+import (
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strconv"
+	"time"
+)
+
+type ExcelInfoPermission struct {
+	ExcelInfoPermissionId int64     `json:"excel_info_permission_id" orm:"column(excel_info_permission_id);pk"`
+	ExcelInfoId           int32     `json:"excel_info_id"` // ETA表格id
+	Source                int32     `json:"source"`        // 表格来源,1:excel插件的表格,2:自定义表格,3:混合表格,4:自定义分析,默认:1
+	SysUserId             int32     `json:"sys_user_id"`   // 系统用户id
+	ModifyTime            time.Time `json:"modify_time"`   // 变更时间
+	CreateTime            time.Time `json:"create_time"`   // 关系建立时间
+}
+
+type ExcelClassifyPermission struct {
+	ExcelClassifyPermissionId int64     `json:"excel_classify_permission_id" orm:"column(excel_classify_permission_id);pk"`
+	ExcelClassifyId           int32     `json:"excel_classify_id"` // 分类id
+	Source                    int32     `json:"source"`            // 表格来源,1:excel插件的表格,2:自定义表格,3:混合表格,4:自定义分析,默认:1
+	SysUserId                 int32     `json:"sys_user_id"`       // 系统用户id
+	ModifyTime                time.Time `json:"modify_time"`       // 变更时间
+	CreateTime                time.Time `json:"create_time"`       // 关系建立时间
+}
+
+// SetIsPermissionByExcelClassifyIdList
+// @Description: 设置表格分类是否涉密
+// @author: Roc
+// @datetime 2024-04-01 10:53:23
+// @param classifyIdList []int
+// @param excelClassifySource int
+// @return err error
+func SetIsPermissionByExcelClassifyIdList(classifyIdList []int, excelClassifySource int) (err error) {
+	num := len(classifyIdList)
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	//// 获取已经配置涉密的分类权限
+	//excelClassifyList := make([]*ExcelClassify, 0)
+	//sql := `SELECT * FROM excel_classify WHERE is_join_permission = ? `
+	//_, err = o.Raw(sql, 1).QueryRows(&excelClassifyList)
+	//if err != nil {
+	//	return
+	//}
+	//excelClassifyMap := make(map[int]*ExcelClassify)
+	//for _, v := range excelClassifyList {
+	//	excelClassifyMap[v.ClassifyId] = v
+	//}
+
+	// 先将所有已经设置了涉密的分类设置为不涉密
+	sql := `UPDATE excel_classify SET is_join_permission=?,modify_time=now() WHERE is_join_permission = 1 AND source = ?`
+	_, err = o.Raw(sql, 0, excelClassifySource).Exec()
+	if err != nil {
+		return
+	}
+
+	if num > 0 {
+		// 将对应的分类设置为涉密
+		sql = `UPDATE excel_classify SET is_join_permission=?,modify_time=now() WHERE source = ? AND excel_classify_id in (` + utils.GetOrmInReplace(num) + `) `
+		_, err = o.Raw(sql, 1, excelClassifySource, classifyIdList).Exec()
+		if err != nil {
+			return
+		}
+	}
+
+	return
+}
+
+// SetPermissionByExcelIdList
+// @Description: 根据表格ID列表设置表格的用户权限
+// @author: Roc
+// @datetime 2024-04-01 10:26:17
+// @param excelIdList []string
+// @param userIdList []int
+// @param source int
+// @return err error
+func SetPermissionByExcelIdList(excelIdList []string, userIdList []int, source int) (err error) {
+	excelNum := len(excelIdList)
+	if excelNum <= 0 {
+		return
+	}
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 获取已经配置的表格权限用户
+	excelInfoPermissionList := make([]*ExcelInfoPermission, 0)
+	sql := `SELECT * FROM excel_info_permission WHERE source = ? AND excel_info_id in (` + utils.GetOrmInReplace(excelNum) + `) `
+	_, err = o.Raw(sql, source, excelIdList).QueryRows(&excelInfoPermissionList)
+	if err != nil {
+		return
+	}
+	excelInfoPermissionMap := make(map[string]*ExcelInfoPermission)
+	for _, v := range excelInfoPermissionList {
+		excelInfoPermissionMap[fmt.Sprint(v.ExcelInfoId, "_", v.SysUserId)] = v
+	}
+
+	// 标记表格是否纳入权限管控
+	{
+		// 默认 标记表格为纳入权限管控
+		isJoinPermission := 1
+		// 用户不选的情况下,说明是要给这些表格移除权限管控
+		if len(userIdList) <= 0 {
+			// 标记表格为不纳入权限管控
+			isJoinPermission = 0
+		}
+		sql = `UPDATE excel_info SET is_join_permission=?,modify_time=now() WHERE source = ? AND excel_info_id in (` + utils.GetOrmInReplace(excelNum) + `) `
+		_, err = o.Raw(sql, isJoinPermission, source, excelIdList).Exec()
+		if err != nil {
+			return
+		}
+	}
+
+	// 待添加的配置项
+	addList := make([]*ExcelInfoPermission, 0)
+
+	// 遍历待配置的表格和用户,筛选出需要添加的配置项
+	for _, excelInfoIdStr := range excelIdList {
+		excelInfoId, tmpErr := strconv.ParseInt(excelInfoIdStr, 10, 64)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, userId := range userIdList {
+			key := fmt.Sprint(excelInfoId, "_", userId)
+			if _, ok := excelInfoPermissionMap[key]; ok {
+				// 如果存在那么就移除,说明不需要处理了
+				delete(excelInfoPermissionMap, key)
+			} else {
+				// 如果不存在,那么就添加
+				addList = append(addList, &ExcelInfoPermission{
+					//PermissionId: 0,
+					ExcelInfoId: int32(excelInfoId),
+					SysUserId:   int32(userId),
+					Source:      int32(source),
+					ModifyTime:  time.Now(),
+					CreateTime:  time.Now(),
+				})
+			}
+		}
+	}
+
+	// 添加待配置项
+	if len(addList) > 0 {
+		_, err = o.InsertMulti(500, addList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 移除废弃的配置项
+	{
+		// 待移除的配置项
+		deletePermissionIdList := make([]int64, 0)
+		for _, v := range excelInfoPermissionMap {
+			deletePermissionIdList = append(deletePermissionIdList, v.ExcelInfoPermissionId)
+		}
+
+		deletePermissionIdNum := len(deletePermissionIdList)
+		if deletePermissionIdNum > 0 {
+			sql = "DELETE FROM excel_info_permission WHERE excel_info_permission_id in (" + utils.GetOrmInReplace(deletePermissionIdNum) + ")"
+			_, err = o.Raw(sql, deletePermissionIdList).Exec()
+			if err != nil {
+				return
+			}
+		}
+	}
+
+	return
+}
+
+// SetPermissionByExcelClassifyIdList
+// @Description: 根据表格分类ID列表设置分类的用户权限
+// @author: Roc
+// @datetime 2024-03-28 14:53:04
+// @param classifyIdList []int
+// @param userIdList []int
+// @return err error
+func SetPermissionByExcelClassifyIdList(classifyIdList []int, userIdList []int, classifyType int) (err error) {
+	userNum := len(userIdList)
+	if userNum <= 0 {
+		return
+	}
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 获取当前选择用户已经配置的表格分类权限
+	classifyPermissionList := make([]*ExcelClassifyPermission, 0)
+	sql := `SELECT * FROM excel_classify_permission WHERE source = ? AND sys_user_id in (` + utils.GetOrmInReplace(userNum) + `) `
+	_, err = o.Raw(sql, classifyType, userIdList).QueryRows(&classifyPermissionList)
+	if err != nil {
+		return
+	}
+	classifyPermissionMap := make(map[string]*ExcelClassifyPermission)
+	for _, v := range classifyPermissionList {
+		classifyPermissionMap[fmt.Sprint(v.ExcelClassifyId, "_", v.SysUserId)] = v
+	}
+
+	// 待添加的配置项
+	addList := make([]*ExcelClassifyPermission, 0)
+
+	// 遍历待配置的表格和用户,筛选出需要添加的配置项
+	for _, userId := range userIdList {
+		for _, classifyId := range classifyIdList {
+			key := fmt.Sprint(classifyId, "_", userId)
+			if _, ok := classifyPermissionMap[key]; ok {
+				// 如果存在那么就移除,说明不需要处理了
+				delete(classifyPermissionMap, key)
+			} else {
+				// 如果不存在,那么就提那家
+				addList = append(addList, &ExcelClassifyPermission{
+					//PermissionId: 0,
+					ExcelClassifyId: int32(classifyId),
+					Source:          int32(classifyType),
+					SysUserId:       int32(userId),
+					ModifyTime:      time.Now(),
+					CreateTime:      time.Now(),
+				})
+			}
+		}
+	}
+
+	// 添加待配置项
+	if len(addList) > 0 {
+		_, err = o.InsertMulti(500, addList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 移除废弃的配置项
+	{
+		// 获取移除的配置项
+		deletePermissionIdList := make([]int64, 0)
+		for _, v := range classifyPermissionMap {
+			deletePermissionIdList = append(deletePermissionIdList, v.ExcelClassifyPermissionId)
+		}
+
+		deletePermissionIdNum := len(deletePermissionIdList)
+		if deletePermissionIdNum > 0 {
+			sql = "DELETE FROM excel_classify_permission WHERE excel_classify_permission_id in (" + utils.GetOrmInReplace(deletePermissionIdNum) + ")"
+			_, err = o.Raw(sql, deletePermissionIdList).Exec()
+			if err != nil {
+				return
+			}
+		}
+	}
+
+	return
+}
+
+// GetPermissionExcelClassifyIdListByUserId
+// @Description: 根据用户ID获取已经配置的分类id列表
+// @author: Roc
+// @datetime 2024-03-29 16:24:46
+// @param userId int
+// @param classifyType int
+// @return excelClassifyIdList []int
+// @return err error
+func GetPermissionExcelClassifyIdListByUserId(userId int, classifyType int) (excelClassifyIdList []int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT excel_classify_id FROM excel_classify_permission WHERE source = ? AND sys_user_id = ? `
+	_, err = o.Raw(sql, classifyType, userId).QueryRows(&excelClassifyIdList)
+
+	return
+}
+
+// GetPermissionUserIdListByExcelId
+// @Description: 根据表格ID获取已经配置的用户id列表
+// @author: Roc
+// @datetime 2024-03-29 16:24:46
+// @param dataId int
+// @param source int
+// @return userIdList []int
+// @return err error
+func GetPermissionUserIdListByExcelId(dataId int, source int) (userIdList []int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT sys_user_id FROM excel_info_permission WHERE source = ? AND excel_info_id= ? `
+	_, err = o.Raw(sql, source, dataId).QueryRows(&userIdList)
+
+	return
+}
+
+// GetPermissionUserIdListByExcelClassifyId
+// @Description: 根据表格分类ID获取已经配置的用户id列表
+// @author: Roc
+// @datetime 2024-03-29 16:24:46
+// @param classifyId int
+// @param source int
+// @return userIdList []int
+// @return err error
+func GetPermissionUserIdListByExcelClassifyId(classifyId int, source int) (userIdList []int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT sys_user_id FROM excel_classify_permission WHERE source = ? AND excel_classify_id= ? `
+	_, err = o.Raw(sql, source, classifyId).QueryRows(&userIdList)
+
+	return
+}
+
+// GetPermissionExcelIdList
+// @Description: 获取用户权限的表格列表
+// @author: Roc
+// @datetime 2024-03-28 16:50:47
+// @param userId int
+// @param excelInfoId int
+// @return idList []int
+// @return err error
+func GetPermissionExcelIdList(userId, excelInfoId int) (idList []int, err error) {
+	pars := []interface{}{userId}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT excel_info_id FROM excel_info_permission WHERE sys_user_id = ? `
+	if excelInfoId > 0 {
+		sql += ` AND excel_info_id = ? `
+		pars = append(pars, excelInfoId)
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&idList)
+
+	return
+}
+
+// GetPermissionExcelClassifyIdList
+// @Description: 获取用户权限的表格分类列表
+// @author: Roc
+// @datetime 2024-03-28 16:50:47
+// @param userId int
+// @param classifyId int
+// @return idList []int
+// @return err error
+func GetPermissionExcelClassifyIdList(userId, classifyId int) (idList []int, err error) {
+	pars := []interface{}{userId}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT excel_classify_id FROM excel_classify_permission WHERE sys_user_id = ? `
+	if classifyId > 0 {
+		sql += ` AND excel_classify_id = ? `
+		pars = append(pars, classifyId)
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&idList)
+
+	return
+}
+
+// InheritParentClassifyByExcelClassifyId
+// @Description: 继承父级分类的ETA表格权限信息
+// @author: Roc
+// @datetime 2024-04-07 21:02:51
+// @param dataSource int
+// @param excelSource int
+// @param classifyId int
+// @param parentClassifyId int
+// @param classifyName string
+// @param uniqueCode string
+// @return err error
+func InheritParentClassifyByExcelClassifyId(dataSource, excelSource, classifyId, parentClassifyId int, classifyName, uniqueCode string) (err error) {
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 将对应的分类设置为涉密
+	sql := `UPDATE excel_classify SET is_join_permission=?,modify_time=now() WHERE source = ? AND excel_classify_id = ? `
+	_, err = o.Raw(sql, 1, excelSource, classifyId).Exec()
+	if err != nil {
+		return
+	}
+
+	// 添加未授权记录
+	{
+		// 获取父级未授权的用户记录
+		var parentRecordItems []*ExcelInfoClassifyPermissionNoAuthRecord
+		sql = `SELECT * FROM data_permission_classify_no_auth_record WHERE classify_id = ? AND source = ? AND sub_source = ? ORDER BY data_permission_classify_no_auth_record_id desc LIMIT ?,? `
+		_, err = o.Raw(sql, parentClassifyId, dataSource, excelSource).QueryRows(&parentRecordItems)
+
+		addNoAuthRecordItems := make([]*ExcelInfoClassifyPermissionNoAuthRecord, 0)
+		for _, v := range parentRecordItems {
+			addNoAuthRecordItems = append(addNoAuthRecordItems, &ExcelInfoClassifyPermissionNoAuthRecord{
+				ExcelInfoClassifyPermissionNoAuthRecordId: 0,
+				Source:       v.Source,
+				OpUniqueCode: uniqueCode,
+				ClassifyId:   fmt.Sprint(classifyId),
+				ClassifyName: classifyName,
+				SysUserId:    v.SysUserId,
+				CreateTime:   time.Now(),
+			})
+		}
+
+		// 添加待配置项
+		if len(addNoAuthRecordItems) > 0 {
+			_, err = o.InsertMulti(500, addNoAuthRecordItems)
+			if err != nil {
+				return
+			}
+		}
+
+	}
+
+	// 添加授权记录
+	{
+		// 获取父级分类已经授权的用户
+		parentClassifyPermissionList := make([]*ExcelClassifyPermission, 0)
+		sql = `SELECT * FROM excel_classify_permission WHERE source = ? AND excel_classify_id = ? `
+		_, err = o.Raw(sql, excelSource, parentClassifyId).QueryRows(&parentClassifyPermissionList)
+		if err != nil {
+			return
+		}
+
+		addList := make([]*ExcelClassifyPermission, 0)
+		for _, v := range parentClassifyPermissionList {
+			// 如果不存在,那么就提那家
+			addList = append(addList, &ExcelClassifyPermission{
+				//PermissionId: 0,
+				ExcelClassifyId: int32(classifyId),
+				Source:          int32(excelSource),
+				SysUserId:       v.SysUserId,
+				ModifyTime:      time.Now(),
+				CreateTime:      time.Now(),
+			})
+		}
+		// 添加待配置项
+		if len(addList) > 0 {
+			_, err = o.InsertMulti(500, addList)
+			if err != nil {
+				return
+			}
+		}
+	}
+
+	return
+}
+
+// ExcelInfoPermissionNoAuthRecord
+// @Description: ETA表格数据权限未授权记录表
+type ExcelInfoPermissionNoAuthRecord struct {
+	ExcelInfoPermissionNoAuthRecordId int64     `json:"excel_info_permission_no_auth_record_id"  orm:"column(excel_info_permission_no_auth_record_id);pk"` // 资产数据操作记录id
+	OpUniqueCode                      string    `json:"op_unique_code"`                                                                                    // 操作的唯一编码,主要是记录统一操作的日志
+	Source                            int32     `json:"source"`                                                                                            // 表格来源,1:excel插件的表格,2:自定义表格,3:混合表格,4:自定义分析,默认:1
+	ExcelInfoId                       int32     `json:"excel_info_id"`                                                                                     // 指标id
+	ExcelName                         string    `json:"excel_name"`                                                                                        // 图表名称
+	SysUserId                         int32     `json:"sys_user_id"`                                                                                       // 系统用户id
+	CreateTime                        time.Time `json:"create_time"`                                                                                       // 创建时间
+}
+
+// AddExcelInfoPermissionNoAuthRecordBySourceAndDataIdList
+// @Description: 添加未授权用户记录
+// @author: Roc
+// @datetime 2024-04-07 15:25:49
+// @param source int
+// @param excelSource int
+// @param dataList []DataItem
+// @param noAuthUserIdList []int 未授权用户
+// @param authUserIdList []int 已授权用户
+// @param uniqueCode
+// @param content string
+// @param opUserId int
+// @return err error
+func AddExcelInfoPermissionNoAuthRecordBySourceAndDataIdList(source, excelSource int, dataList []DataItem, noAuthUserIdList, authUserIdList []int, title, uniqueCode, content string, opUserId int) (err error) {
+	num := len(dataList)
+	if num <= 0 {
+		return
+	}
+	dataIdList := make([]int, 0)
+	for _, v := range dataList {
+		dataIdList = append(dataIdList, v.DataId)
+	}
+	userNum := len(noAuthUserIdList)
+	if userNum <= 0 {
+		return
+	}
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 根据指标获取已经存在的未授权记录
+	var existList []*ExcelInfoPermissionNoAuthRecord
+	sql := `SELECT * FROM excel_info_permission_no_auth_record WHERE  source = ? AND excel_info_id in (` + utils.GetOrmInReplace(num) + `)`
+	_, err = o.Raw(sql, excelSource, dataIdList).QueryRows(&existList)
+	if err != nil {
+		return
+	}
+
+	// 已经标记了的数据
+	existMap := make(map[int32]map[string]*ExcelInfoPermissionNoAuthRecord)
+	for _, v := range existList {
+		tmpUserExistMap, ok := existMap[v.SysUserId]
+		if !ok {
+			tmpUserExistMap = make(map[string]*ExcelInfoPermissionNoAuthRecord)
+		}
+
+		key := fmt.Sprint(v.Source, "_", v.ExcelInfoId)
+		tmpUserExistMap[key] = v
+		existMap[v.SysUserId] = tmpUserExistMap
+	}
+
+	addMessageList := make([]*DataPermissionMessage, 0)
+	addRecordList := make([]*ExcelInfoPermissionNoAuthRecord, 0)
+	for _, userId := range noAuthUserIdList {
+		isAdd := false
+
+		tmpUserExistMap, userExistOk := existMap[int32(userId)]
+
+		for _, dataItem := range dataList {
+			// 判断是否已经存在,已经存在就过滤
+			if userExistOk {
+				key := fmt.Sprint(excelSource, "_", dataItem.DataId)
+				_, ok := tmpUserExistMap[key]
+				if ok {
+					continue
+				}
+			}
+
+			isAdd = true
+			addRecordList = append(addRecordList, &ExcelInfoPermissionNoAuthRecord{
+				ExcelInfoPermissionNoAuthRecordId: 0,
+				OpUniqueCode:                      uniqueCode,
+				Source:                            int32(excelSource),
+				ExcelInfoId:                       int32(dataItem.DataId),
+				ExcelName:                         dataItem.DataName,
+				SysUserId:                         int32(userId),
+				CreateTime:                        time.Now(),
+			})
+		}
+
+		// 有记录的话,需要添加消息
+		if isAdd {
+			addMessageList = append(addMessageList, &DataPermissionMessage{
+				DataPermissionMessageId: 0,
+				SendUserId:              int32(opUserId),
+				ReceiveUserId:           int32(userId),
+				Content:                 title,
+				Remark:                  content,
+				OpType:                  3,
+				Source:                  int32(source),
+				SubSource:               int32(excelSource),
+				OpUniqueCode:            uniqueCode,
+				IsRead:                  0,
+				CreateTime:              time.Now(),
+				ModifyTime:              time.Now(),
+			})
+		}
+	}
+
+	// 添加消息
+	if len(addMessageList) > 0 {
+		_, err = o.InsertMulti(500, addMessageList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 添加记录
+	if len(addRecordList) > 0 {
+		_, err = o.InsertMulti(500, addRecordList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 已经授权了的用户,需要删除未授权记录
+	authUserIdNum := len(authUserIdList)
+	if authUserIdNum > 0 {
+		sql = `DELETE FROM excel_info_permission_no_auth_record WHERE  source = ? AND sys_user_id in (` + utils.GetOrmInReplace(authUserIdNum) + `) AND excel_info_id in (` + utils.GetOrmInReplace(num) + `)`
+		_, err = o.Raw(sql, excelSource, authUserIdList, dataIdList).Exec()
+	}
+
+	return
+}
+
+// DeleteExcelInfoPermissionNoAuthRecordBySourceAndDataIdList
+// @Description: 根据来源和数据id列表删除记录
+// @author: Roc
+// @datetime 2024-04-07 14:47:37
+// @param excelSource int
+// @param dataIdList []string
+// @return err error
+func DeleteExcelInfoPermissionNoAuthRecordBySourceAndDataIdList(excelSource int, dataIdList []string) (err error) {
+	num := len(dataIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+
+	sql := `DELETE FROM excel_info_permission_no_auth_record WHERE source = ? AND excel_info_id in (` + utils.GetOrmInReplace(num) + `)`
+	_, err = o.Raw(sql, excelSource, dataIdList).Exec()
+
+	return
+}
+
+func GetExcelInfoDataPermissionNoAuthRecordListByUserId(userId, excelSource int32, startSize, pageSize int) (total int, items []*DataPermissionNoAuthRecord, err error) {
+	o := orm.NewOrmUsingDB("data")
+
+	// 获取总数
+	sql := `SELECT count(1) AS total FROM excel_info_permission_no_auth_record WHERE sys_user_id = ? AND source = ? `
+	err = o.Raw(sql, userId, excelSource).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql = `SELECT excel_info_permission_no_auth_record_id as data_permission_no_auth_record_id,op_unique_code,source as sub_source,excel_info_id as data_id,excel_name as data_name,sys_user_id,create_time FROM excel_info_permission_no_auth_record WHERE sys_user_id = ? AND source = ? ORDER BY excel_info_permission_no_auth_record_id desc LIMIT ?,? `
+	_, err = o.Raw(sql, userId, excelSource, startSize, pageSize).QueryRows(&items)
+
+	return
+}
+
+type ExcelInfoClassifyPermissionNoAuthRecord struct {
+	ExcelInfoClassifyPermissionNoAuthRecordId int64     `json:"excel_info_classify_permission_no_auth_record_id" orm:"column(excel_info_classify_permission_no_auth_record_id);pk"` // 资产分类数据操作记录id
+	Source                                    int32     `json:"source"`                                                                                                             // 子来源 :ETA表格中的各种表格类型,以及图表的来源(这个是后续的扩展方向)
+	OpUniqueCode                              string    `json:"op_unique_code"`                                                                                                     // 操作的唯一编码,主要是记录统一操作的日志
+	ClassifyId                                string    `json:"classify_id"`                                                                                                        // ETA表格资产分类id
+	ClassifyName                              string    `json:"classify_name"`                                                                                                      // ETA表格资产分类名称
+	SysUserId                                 int32     `json:"sys_user_id"`                                                                                                        // 系统用户id
+	CreateTime                                time.Time `json:"create_time"`                                                                                                        // 创建时间
+}
+
+// AddExcelInfoClassifyNoAuthRecordBySourceAndClassifyIdList
+// @Description: 根据分类添加用户分类未授权记录
+// @author: Roc
+// @datetime 2024-04-07 16:44:21
+// @param source int
+// @param excelSource int
+// @param classifyInfoList []ClassifyDataItem
+// @param noAuthUserIdList []int
+// @param uniqueCode string
+// @param content string
+// @param opUserId int
+// @return err error
+func AddExcelInfoClassifyNoAuthRecordBySourceAndClassifyIdList(source, excelSource int, classifyInfoList []ClassifyDataItem, noAuthUserIdList []int, uniqueCode, title, content string, opUserId int) (err error) {
+	num := len(classifyInfoList)
+	if num <= 0 {
+		return
+	}
+	// 分类id
+	classifyIdList := make([]int, 0)
+	for _, v := range classifyInfoList {
+		classifyIdList = append(classifyIdList, v.ClassifyId)
+	}
+
+	userNum := len(noAuthUserIdList)
+	if userNum <= 0 {
+		return
+	}
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 根据分类获取已经存在的未授权记录
+	var existList []*ExcelInfoClassifyPermissionNoAuthRecord
+	sql := `SELECT * FROM excel_info_classify_permission_no_auth_record WHERE source = ? AND classify_id in (` + utils.GetOrmInReplace(num) + `)`
+	_, err = o.Raw(sql, excelSource, classifyIdList).QueryRows(&existList)
+	if err != nil {
+		return
+	}
+
+	// 已经标记了的数据
+	existMap := make(map[int32]map[string]*ExcelInfoClassifyPermissionNoAuthRecord)
+	for _, v := range existList {
+		tmpUserExistMap, ok := existMap[v.SysUserId]
+		if !ok {
+			tmpUserExistMap = make(map[string]*ExcelInfoClassifyPermissionNoAuthRecord)
+		}
+
+		key := fmt.Sprint(v.Source, "_", v.ClassifyId)
+		tmpUserExistMap[key] = v
+		existMap[v.SysUserId] = tmpUserExistMap
+	}
+
+	addMessageList := make([]*DataPermissionMessage, 0)
+	addRecordList := make([]*ExcelInfoClassifyPermissionNoAuthRecord, 0)
+	for _, userId := range noAuthUserIdList {
+		isAdd := false
+
+		tmpUserExistMap, userExistOk := existMap[int32(userId)]
+
+		for _, dataItem := range classifyInfoList {
+			// 判断是否已经存在,已经存在就过滤
+			if userExistOk {
+				key := fmt.Sprint(excelSource, "_", dataItem.ClassifyId)
+				_, ok := tmpUserExistMap[key]
+				if ok {
+					continue
+				}
+			}
+
+			isAdd = true
+			addRecordList = append(addRecordList, &ExcelInfoClassifyPermissionNoAuthRecord{
+				ExcelInfoClassifyPermissionNoAuthRecordId: 0,
+				Source:       int32(excelSource),
+				OpUniqueCode: uniqueCode,
+				ClassifyId:   fmt.Sprint(dataItem.ClassifyId),
+				ClassifyName: dataItem.ClassifyName,
+				SysUserId:    int32(userId),
+				CreateTime:   time.Now(),
+			})
+		}
+
+		// 有记录的话,需要添加消息
+		if isAdd {
+			addMessageList = append(addMessageList, &DataPermissionMessage{
+				DataPermissionMessageId: 0,
+				SendUserId:              int32(opUserId),
+				ReceiveUserId:           int32(userId),
+				Content:                 title,
+				Remark:                  content,
+				OpType:                  4,
+				Source:                  int32(source),
+				SubSource:               int32(excelSource),
+				OpUniqueCode:            uniqueCode,
+				IsRead:                  0,
+				CreateTime:              time.Now(),
+				ModifyTime:              time.Now(),
+			})
+		}
+	}
+
+	// 添加消息
+	if len(addMessageList) > 0 {
+		_, err = o.InsertMulti(500, addMessageList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 添加记录
+	if len(addRecordList) > 0 {
+		_, err = o.InsertMulti(500, addRecordList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 移除已经公开了的分类权限,需要删除未授权记录
+	authUserIdNum := len(classifyIdList)
+	if authUserIdNum > 0 {
+		sql = `DELETE FROM excel_info_classify_permission_no_auth_record WHERE source = ? AND classify_id not in (` + utils.GetOrmInReplace(num) + `)`
+		_, err = o.Raw(sql, excelSource, classifyIdList).Exec()
+	}
+
+	return
+}
+
+// AddExcelInfoClassifyNoAuthRecordBySourceAndUserIdList
+// @Description: 根据用户添加用户分类未授权记录
+// @author: Roc
+// @datetime 2024-04-07 20:12:44
+// @param source int
+// @param excelSource int
+// @param noAuthClassifyMap map[int]ClassifyDataItem
+// @param configUserIdList []int
+// @param uniqueCode string
+// @param content string
+// @param opUserId int
+// @return err error
+func AddExcelInfoClassifyNoAuthRecordBySourceAndUserIdList(source, excelSource int, noAuthClassifyMap map[int]ClassifyDataItem, configUserIdList []int, uniqueCode, title, content string, opUserId int) (err error) {
+	// 当前配置用户
+	configUserNum := len(configUserIdList)
+	if configUserNum <= 0 {
+		return
+	}
+
+	//// 总共的涉密分类
+	//noAuthClassifyInfoNum := len(noAuthClassifyMap)
+	//if noAuthClassifyInfoNum <= 0 {
+	//	return
+	//}
+
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 根据当前配置用户获取已经存在的未授权记录
+	var existList []*ExcelInfoClassifyPermissionNoAuthRecord
+	sql := `SELECT * FROM excel_info_classify_permission_no_auth_record WHERE source = ? AND sys_user_id in (` + utils.GetOrmInReplace(configUserNum) + `)`
+	_, err = o.Raw(sql, excelSource, configUserIdList).QueryRows(&existList)
+	if err != nil {
+		return
+	}
+
+	// 已经标记了的数据
+	existMap := make(map[int32]map[string]*ExcelInfoClassifyPermissionNoAuthRecord)
+	delRecordIdMap := make(map[int64]int64)
+	for _, v := range existList {
+		tmpUserExistMap, ok := existMap[v.SysUserId]
+		if !ok {
+			tmpUserExistMap = make(map[string]*ExcelInfoClassifyPermissionNoAuthRecord)
+		}
+
+		tmpUserExistMap[v.ClassifyId] = v
+		existMap[v.SysUserId] = tmpUserExistMap
+
+		// 已经配置了的记录id
+		delRecordIdMap[v.ExcelInfoClassifyPermissionNoAuthRecordId] = v.ExcelInfoClassifyPermissionNoAuthRecordId
+	}
+
+	addMessageList := make([]*DataPermissionMessage, 0)
+	addRecordList := make([]*ExcelInfoClassifyPermissionNoAuthRecord, 0)
+	for _, userId := range configUserIdList {
+		isAdd := false
+
+		tmpUserExistMap, userExistOk := existMap[int32(userId)]
+
+		for _, dataItem := range noAuthClassifyMap {
+			// 判断是否已经存在,已经存在就过滤
+			if userExistOk {
+				key := fmt.Sprint(dataItem.ClassifyId)
+				tmpUserRecord, ok := tmpUserExistMap[key]
+				if ok {
+					delete(delRecordIdMap, tmpUserRecord.ExcelInfoClassifyPermissionNoAuthRecordId)
+					continue
+				}
+			}
+
+			isAdd = true
+			addRecordList = append(addRecordList, &ExcelInfoClassifyPermissionNoAuthRecord{
+				ExcelInfoClassifyPermissionNoAuthRecordId: 0,
+				Source:       int32(excelSource),
+				OpUniqueCode: uniqueCode,
+				ClassifyId:   fmt.Sprint(dataItem.ClassifyId),
+				ClassifyName: dataItem.ClassifyName,
+				SysUserId:    int32(userId),
+				CreateTime:   time.Now(),
+			})
+		}
+
+		// 有记录的话,需要添加消息
+		if isAdd {
+			addMessageList = append(addMessageList, &DataPermissionMessage{
+				DataPermissionMessageId: 0,
+				SendUserId:              int32(opUserId),
+				ReceiveUserId:           int32(userId),
+				Content:                 title,
+				Remark:                  content,
+				OpType:                  4,
+				Source:                  int32(source),
+				SubSource:               int32(excelSource),
+				OpUniqueCode:            uniqueCode,
+				IsRead:                  0,
+				CreateTime:              time.Now(),
+				ModifyTime:              time.Now(),
+			})
+		}
+	}
+
+	// 添加消息
+	if len(addMessageList) > 0 {
+		_, err = o.InsertMulti(500, addMessageList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 添加记录
+	if len(addRecordList) > 0 {
+		_, err = o.InsertMulti(500, addRecordList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 需要删除未授权记录
+	delRecordIdNum := len(delRecordIdMap)
+	if delRecordIdNum > 0 {
+		delRecordIdList := make([]int64, 0)
+		for _, v := range delRecordIdMap {
+			delRecordIdList = append(delRecordIdList, v)
+		}
+		sql = `DELETE FROM excel_info_classify_permission_no_auth_record WHERE excel_info_classify_permission_no_auth_record_id in (` + utils.GetOrmInReplace(delRecordIdNum) + `) `
+		_, err = o.Raw(sql, delRecordIdList).Exec()
+	}
+
+	return
+}
+
+// DeleteExcelInfoClassifyNoAuthRecordBySourceAndClassifyIdList
+// @Description: 根据来源和删除分类授权记录
+// @author: Roc
+// @datetime 2024-04-07 14:47:37
+// @param source int
+// @param excelSource int
+// @return err error
+func DeleteExcelInfoClassifyNoAuthRecordBySourceAndClassifyIdList(excelSource int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+
+	sql := `DELETE FROM excel_info_classify_permission_no_auth_record WHERE source = ?`
+	_, err = o.Raw(sql, excelSource).Exec()
+
+	return
+}
+
+// GetExcelInfoDataPermissionClassifyNoAuthRecordListByUserId
+// @Description: 根据用户获取未授权的资产分类记录
+// @author: Roc
+// @datetime 2024-04-07 20:14:49
+// @param userId int
+// @param source int
+// @param subSource int
+// @param startSize int
+// @param pageSize int
+// @return total int
+// @return items []*DataPermissionClassifyNoAuthRecord
+// @return err error
+func GetExcelInfoDataPermissionClassifyNoAuthRecordListByUserId(userId, excelSource int32, startSize, pageSize int) (total int, items []*DataPermissionClassifyNoAuthRecord, err error) {
+	o := orm.NewOrmUsingDB("data")
+
+	// 获取总数
+	sql := `SELECT count(1) AS total FROM excel_info_classify_permission_no_auth_record WHERE sys_user_id = ? AND source = ? `
+	err = o.Raw(sql, userId, excelSource).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql = `SELECT excel_info_classify_permission_no_auth_record_id as data_permission_classify_no_auth_record_id,source as sub_source,op_unique_code,classify_id,classify_name,sys_user_id,create_time  FROM excel_info_classify_permission_no_auth_record WHERE sys_user_id = ? AND source = ? ORDER BY excel_info_classify_permission_no_auth_record_id desc LIMIT ?,? `
+	_, err = o.Raw(sql, userId, excelSource, startSize, pageSize).QueryRows(&items)
+
+	return
+}

+ 152 - 0
models/data_manage/data_manage_permission/message.go

@@ -0,0 +1,152 @@
+package data_manage_permission
+
+import (
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+	"time"
+)
+
+// DataPermissionMessage
+// @Description: 数据权限变更消息表
+type DataPermissionMessage struct {
+	DataPermissionMessageId int64     `json:"data_permission_message_id" orm:"column(data_permission_message_id);pk"`
+	SendUserId              int32     `json:"send_user_id"`    // 发送人ID
+	ReceiveUserId           int32     `json:"receive_user_id"` // 接收者ID
+	Content                 string    `json:"content"`         // 消息内容
+	Remark                  string    `json:"remark"`          // 备注信息
+	OpType                  int32     `json:"op_type"`         // 操作类型,1:单个资产转移,2:资产模块转移,3:资产授权,4:资产分类授权
+	Source                  int32     `description:"来源id"`
+	SubSource               int32     `description:"子来源id"`
+	OpUniqueCode            string    `json:"op_unique_code"` // 操作编码
+	IsRead                  int32     `json:"is_read"`        // 是否已读:0-未读;1-已读
+	CreateTime              time.Time `json:"create_time"`    // 创建时间
+	ModifyTime              time.Time `json:"modify_time"`    // 修改时间
+}
+
+var DataPermissionMessageCols = struct {
+	DataPermissionMessageId string
+	SendUserId              string
+	ReceiveUserId           string
+	Content                 string
+	Remark                  string
+	OpType                  string
+	Source                  string
+	SubSource               string
+	OpUniqueCode            string
+	IsRead                  string
+	CreateTime              string
+	ModifyTime              string
+}{
+	DataPermissionMessageId: "data_permission_message_id",
+	SendUserId:              "send_user_id",
+	ReceiveUserId:           "receive_user_id",
+	Content:                 "content",
+	Remark:                  "remark",
+	OpType:                  "op_type",
+	Source:                  "source",
+	SubSource:               "sub_source",
+	OpUniqueCode:            "op_unique_code",
+	IsRead:                  "is_read",
+	CreateTime:              "create_time",
+	ModifyTime:              "modify_time",
+}
+
+func (m *DataPermissionMessage) TableName() string {
+	return "data_permission_message"
+}
+
+func (m *DataPermissionMessage) PrimaryId() string {
+	return DataPermissionMessageCols.DataPermissionMessageId
+}
+
+func (m *DataPermissionMessage) Create() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	id, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.DataPermissionMessageId = id
+	return
+}
+
+func (m *DataPermissionMessage) CreateMulti(items []*DataPermissionMessage) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.InsertMulti(500, items)
+	return
+}
+
+func (m *DataPermissionMessage) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(m, cols...)
+	return
+}
+
+func (m *DataPermissionMessage) Del() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	_, err = o.Raw(sql, m.DataPermissionMessageId).Exec()
+	return
+}
+
+func (m *DataPermissionMessage) MultiDel(menuIds []int) (err error) {
+	if len(menuIds) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.PrimaryId(), utils.GetOrmInReplace(len(menuIds)))
+	_, err = o.Raw(sql, menuIds).Exec()
+	return
+}
+
+func (m *DataPermissionMessage) GetItemById(id int) (item *DataPermissionMessage, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+func (m *DataPermissionMessage) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func (m *DataPermissionMessage) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*DataPermissionMessage, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// FormatDataPermissionMessage2Item 格式化消息
+func FormatDataPermissionMessage2Item(origin *DataPermissionMessage) (item *DataPermissionMessageItem) {
+	item = &DataPermissionMessageItem{
+		DataPermissionMessageId: origin.DataPermissionMessageId,
+		SendUserId:              origin.SendUserId,
+		ReceiveUserId:           origin.ReceiveUserId,
+		Content:                 origin.Content,
+		Remark:                  origin.Remark,
+		OpType:                  origin.OpType,
+		Source:                  origin.Source,
+		SubSource:               origin.SubSource,
+		OpUniqueCode:            origin.OpUniqueCode,
+		IsRead:                  origin.IsRead,
+		CreateTime:              utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime),
+		ModifyTime:              utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime),
+	}
+	return
+}

+ 103 - 0
models/data_manage/data_manage_permission/move.go

@@ -0,0 +1,103 @@
+package data_manage_permission
+
+import (
+	"eta/eta_api/utils"
+	"github.com/beego/beego/v2/client/orm"
+)
+
+// ModifyDataUserIdByOldUserId
+// @Description:  根据旧用户id修改新用户id
+// @author: Roc
+// @datetime 2024-03-25 17:59:32
+// @param oldUserId int
+// @param userId int
+// @return err error
+func ModifyDataUserIdByOldUserId(oldUserIdList []int, userId int, userName string, isMoveManual, isMoveMysteelChemical, isMoveEdb, isMovePredictEdb, isMoveChart, isMoveExcel bool) (err error) {
+	num := len(oldUserIdList)
+	if num <= 0 {
+		return
+	}
+
+	if userId <= 0 {
+		return
+	}
+
+	// 手工指标库
+	if isMoveManual {
+		edbTo, tmpErr := orm.NewOrmUsingDB("edb").Begin()
+		if tmpErr != nil {
+			return
+		}
+		defer func() {
+			if err != nil {
+				_ = edbTo.Rollback()
+			} else {
+				_ = edbTo.Commit()
+			}
+		}()
+		sql := `UPDATE edbinfo SET user_id=? WHERE user_id in (` + utils.GetOrmInReplace(num) + `) `
+		_, err = edbTo.Raw(sql, userId, oldUserIdList).Exec()
+		if err != nil {
+			return
+		}
+	}
+
+	// ETA指标库
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 钢联化工数据库
+	if isMoveMysteelChemical {
+		sql := `UPDATE base_from_mysteel_chemical_index SET sys_user_id=?,sys_user_real_name=? WHERE sys_user_id in (` + utils.GetOrmInReplace(num) + `)  `
+		_, err = o.Raw(sql, userId, userName, oldUserIdList).Exec()
+		if err != nil {
+			return
+		}
+	}
+
+	// ETA指标库
+	if isMoveEdb {
+		sql := `UPDATE edb_info SET sys_user_id=?,sys_user_real_name=? WHERE sys_user_id in (` + utils.GetOrmInReplace(num) + `) and edb_info_type = ?`
+		_, err = o.Raw(sql, userId, userName, oldUserIdList, 0).Exec()
+		if err != nil {
+			return
+		}
+	}
+	// 预测指标
+	if isMovePredictEdb {
+		sql := `UPDATE edb_info SET sys_user_id=?,sys_user_real_name=? WHERE sys_user_id in (` + utils.GetOrmInReplace(num) + `) and edb_info_type = ?`
+		_, err = o.Raw(sql, userId, userName, oldUserIdList, 1).Exec()
+		if err != nil {
+			return
+		}
+	}
+
+	// ETA表格
+	if isMoveChart {
+		sql := `UPDATE chart_info SET sys_user_id=?,sys_user_real_name=? WHERE sys_user_id in (` + utils.GetOrmInReplace(num) + `) `
+		_, err = o.Raw(sql, userId, userName, oldUserIdList).Exec()
+		if err != nil {
+			return
+		}
+	}
+
+	// ETA表格
+	if isMoveExcel {
+		sql := `UPDATE excel_info SET sys_user_id=?,sys_user_real_name=? WHERE is_delete=0 AND sys_user_id in (` + utils.GetOrmInReplace(num) + `) `
+		_, err = o.Raw(sql, userId, userName, oldUserIdList).Exec()
+		if err != nil {
+			return
+		}
+	}
+
+	return
+}

+ 85 - 0
models/data_manage/data_manage_permission/move_record.go

@@ -0,0 +1,85 @@
+package data_manage_permission
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// DataPermissionMoveRecord
+// @Description: 数据资产转移记录表
+type DataPermissionMoveRecord struct {
+	DataPermissionMoveRecordId int64     `json:"data_permission_move_record_id" orm:"column(data_permission_move_record_id);pk"` // 数据操作记录id
+	Source                     int32     `json:"source"`                                                                         // 数据来源,1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格
+	SubSource                  int32     `json:"sub_source"`                                                                     // 子来源 :ETA表格中的各种表格类型,以及图表的来源(这个是后续的扩展方向)
+	OpUniqueCode               string    `json:"op_unique_code"`                                                                 // 操作的唯一编码,主要是记录统一操作的日志
+	DataId                     string    `json:"data_id"`                                                                        // 资产id(指标、图表、表格)
+	DataCode                   string    `json:"data_code"`                                                                      // 资产code(指标、图表、表格)
+	DataName                   string    `json:"data_name"`                                                                      // 资产名称(指标、图表、表格)
+	OriginalUserId             int32     `json:"original_user_id"`                                                               // 原创建人id
+	OriginalUserName           string    `json:"original_user_name"`                                                             // 原创建人名称
+	NewUserId                  int32     `json:"new_user_id"`                                                                    // 新创建人id
+	NewUserName                string    `json:"new_user_name"`                                                                  // 新创建人名称
+	CreateTime                 time.Time `json:"create_time"`                                                                    // 创建时间
+}
+
+// AddDataPermissionMoveRecord
+// @Description: 添加资产转移的操作记录
+// @param dataPermissionMoveRecordList
+// @param dataPermissionMessage
+// @return err
+func AddDataPermissionMoveRecord(dataPermissionMoveRecordList []*DataPermissionMoveRecord, dataPermissionMessage *DataPermissionMessage) (err error) {
+	num := len(dataPermissionMoveRecordList)
+	if num <= 0 {
+		return
+	}
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// 添加操作记录
+	_, err = o.InsertMulti(500, dataPermissionMoveRecordList)
+	if err != nil {
+		return
+	}
+
+	// 添加消息通知
+	_, err = o.Insert(dataPermissionMessage)
+
+	return
+}
+
+// GetDataPermissionMoveRecordListByOpUniqueCode
+// @Description: 根据操作唯一编码获取操作记录
+// @author: Roc
+// @datetime 2024-04-07 20:15:22
+// @param opUniqueCode string
+// @param source int
+// @param subSource int
+// @param startSize int
+// @param pageSize int
+// @return total int
+// @return items []*DataPermissionMoveRecord
+// @return err error
+func GetDataPermissionMoveRecordListByOpUniqueCode(opUniqueCode string, source, subSource, startSize, pageSize int) (total int, items []*DataPermissionMoveRecord, err error) {
+	o := orm.NewOrmUsingDB("data")
+
+	// 获取总数
+	sql := `SELECT count(1) AS total FROM data_permission_move_record WHERE op_unique_code = ? AND source = ? AND sub_source = ? `
+	err = o.Raw(sql, opUniqueCode, source, subSource).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql = `SELECT * FROM data_permission_move_record WHERE op_unique_code = ? AND source = ? AND sub_source = ? ORDER BY data_permission_move_record_id desc LIMIT ?,? `
+	_, err = o.Raw(sql, opUniqueCode, source, subSource, startSize, pageSize).QueryRows(&items)
+
+	return
+}

+ 316 - 0
models/data_manage/data_manage_permission/no_auth_record.go

@@ -0,0 +1,316 @@
+package data_manage_permission
+
+import (
+	"errors"
+	"eta/eta_api/utils"
+	"time"
+)
+
+// DataPermissionNoAuthRecord
+// @Description: 资产数据权限设置记录表
+type DataPermissionNoAuthRecord struct {
+	DataPermissionNoAuthRecordId int64     `json:"data_permission_no_auth_record_id" orm:"column(data_permission_no_auth_record_id);pk"` // 资产数据操作记录id
+	Source                       int32     `json:"source"`                                                                               // 数据来源,1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格
+	SubSource                    int32     `json:"sub_source"`                                                                           // 子来源 :ETA表格中的各种表格类型,以及图表的来源(这个是后续的扩展方向)
+	OpUniqueCode                 string    `json:"op_unique_code"`                                                                       // 操作的唯一编码,主要是记录统一操作的日志
+	DataId                       string    `json:"data_id"`                                                                              // 资产id(指标、图表、表格)
+	DataCode                     string    `json:"data_code"`                                                                            // 资产code(指标、图表、表格)
+	DataName                     string    `json:"data_name"`                                                                            // 资产名称(指标、图表、表格)
+	SysUserId                    int32     `json:"sys_user_id"`                                                                          // 系统用户id
+	CreateTime                   time.Time `json:"create_time"`                                                                          // 创建时间
+}
+
+type DataItem struct {
+	DataId   int    `json:"data_id"`   // 资产id(指标、图表、表格)
+	DataCode string `json:"data_code"` // 资产code(指标、图表、表格)
+	DataName string `json:"data_name"` // 资产名称(指标、图表、表格)
+}
+
+// AddRecordBySourceAndDataIdList
+// @Description: 添加未授权用户记录
+// @author: Roc
+// @datetime 2024-04-07 15:25:49
+// @param source int
+// @param subSource int
+// @param dataList []DataItem
+// @param noAuthUserIdList []int 未授权用户
+// @param authUserIdList []int 已授权用户
+// @param uniqueCode
+// @param content string
+// @param opUserId int
+// @return err error
+func AddRecordBySourceAndDataIdList(source, subSource int, dataList []DataItem, noAuthUserIdList, authUserIdList []int, uniqueCode, title, content string, opUserId int) (err error) {
+	switch source {
+	case 3, 4:
+		edbInfoType := 0
+		if source == 4 {
+			edbInfoType = 1
+		}
+		err = AddEdbInfoPermissionNoAuthRecordBySourceAndDataIdList(source, edbInfoType, dataList, noAuthUserIdList, authUserIdList, uniqueCode, title, content, opUserId)
+
+	case 5:
+		//图库
+		chartSource := utils.CHART_SOURCE_DEFAULT
+		err = AddChartInfoPermissionNoAuthRecordBySourceAndDataIdList(source, chartSource, dataList, noAuthUserIdList, authUserIdList, uniqueCode, title, content, opUserId)
+
+	case 6:
+		// ETA表格
+		err = AddExcelInfoPermissionNoAuthRecordBySourceAndDataIdList(source, subSource, dataList, noAuthUserIdList, authUserIdList, uniqueCode, title, content, opUserId)
+
+	default:
+		return errors.New("错误的source")
+	}
+	return
+}
+
+// AddRecordBySourceAndDataIdList
+// @Description: 添加未授权用户记录
+// @author: Roc
+// @datetime 2024-04-07 15:25:49
+// @param source int
+// @param subSource int
+// @param dataList []DataItem
+// @param noAuthUserIdList []int 未授权用户
+// @param authUserIdList []int 已授权用户
+// @param uniqueCode
+// @param content string
+// @param opUserId int
+// @return err error
+//func AddRecordBySourceAndDataIdList(source, subSource int, dataList []DataItem, noAuthUserIdList, authUserIdList []int, uniqueCode, content string, opUserId int) (err error) {
+//	num := len(dataList)
+//	if num <= 0 {
+//		return
+//	}
+//	dataIdList := make([]string, 0)
+//	for _, v := range dataList {
+//		dataIdList = append(dataIdList, v.DataId)
+//	}
+//	userNum := len(noAuthUserIdList)
+//	if userNum <= 0 {
+//		return
+//	}
+//	o, err := orm.NewOrmUsingDB("data").Begin()
+//	if err != nil {
+//		return
+//	}
+//	defer func() {
+//		if err != nil {
+//			_ = o.Rollback()
+//		} else {
+//			_ = o.Commit()
+//		}
+//	}()
+//
+//	// 根据指标获取已经存在的未授权记录
+//	var existList []*DataPermissionNoAuthRecord
+//	sql := `SELECT * FROM data_permission_no_auth_record WHERE source = ? AND sub_source = ? AND data_id in (` + utils.GetOrmInReplace(num) + `)`
+//	_, err = o.Raw(sql, source, subSource, dataIdList).QueryRows(&existList)
+//	if err != nil {
+//		return
+//	}
+//
+//	// 已经标记了的数据
+//	existMap := make(map[int32]map[string]*DataPermissionNoAuthRecord)
+//	for _, v := range existList {
+//		tmpUserExistMap, ok := existMap[v.SysUserId]
+//		if !ok {
+//			tmpUserExistMap = make(map[string]*DataPermissionNoAuthRecord)
+//		}
+//
+//		key := fmt.Sprint(v.Source, "_", v.SubSource, "_", v.DataId)
+//		tmpUserExistMap[key] = v
+//		existMap[v.SysUserId] = tmpUserExistMap
+//	}
+//
+//	addMessageList := make([]*DataPermissionMessage, 0)
+//	addRecordList := make([]*DataPermissionNoAuthRecord, 0)
+//	for _, userId := range noAuthUserIdList {
+//		isAdd := false
+//
+//		tmpUserExistMap, userExistOk := existMap[int32(userId)]
+//
+//		for _, dataItem := range dataList {
+//			// 判断是否已经存在,已经存在就过滤
+//			if userExistOk {
+//				key := fmt.Sprint(source, "_", subSource, "_", dataItem.DataId)
+//				_, ok := tmpUserExistMap[key]
+//				if ok {
+//					continue
+//				}
+//			}
+//
+//			isAdd = true
+//			addRecordList = append(addRecordList, &DataPermissionNoAuthRecord{
+//				DataPermissionNoAuthRecordId: 0,
+//				Source:                       int32(source),
+//				SubSource:                    int32(subSource),
+//				OpUniqueCode:                 uniqueCode,
+//				DataId:                       dataItem.DataId,
+//				DataCode:                     dataItem.DataCode,
+//				DataName:                     dataItem.DataName,
+//				SysUserId:                    int32(userId),
+//				CreateTime:                   time.Now(),
+//			})
+//		}
+//
+//		// 有记录的话,需要添加消息
+//		if isAdd {
+//			addMessageList = append(addMessageList, &DataPermissionMessage{
+//				DataPermissionMessageId: 0,
+//				SendUserId:              int32(opUserId),
+//				ReceiveUserId:           int32(userId),
+//				Content:                 content,
+//				Remark:                  content,
+//				OpType:                  3,
+//				Source:                  int32(source),
+//				SubSource:               int32(subSource),
+//				OpUniqueCode:            uniqueCode,
+//				IsRead:                  0,
+//				CreateTime:              time.Now(),
+//				ModifyTime:              time.Now(),
+//			})
+//		}
+//	}
+//
+//	// 添加消息
+//	if len(addMessageList) > 0 {
+//		_, err = o.InsertMulti(500, addMessageList)
+//		if err != nil {
+//			return
+//		}
+//	}
+//
+//	// 添加记录
+//	if len(addRecordList) > 0 {
+//		_, err = o.InsertMulti(500, addRecordList)
+//		if err != nil {
+//			return
+//		}
+//	}
+//
+//	// 已经授权了的用户,需要删除未授权记录
+//	authUserIdNum := len(authUserIdList)
+//	if authUserIdNum > 0 {
+//		sql = `DELETE FROM data_permission_no_auth_record WHERE  source = ? AND sub_source = ? AND sys_user_id in (` + utils.GetOrmInReplace(authUserIdNum) + `) AND data_id in (` + utils.GetOrmInReplace(num) + `)`
+//		_, err = o.Raw(sql, source, subSource, authUserIdList, dataIdList).Exec()
+//	}
+//
+//	return
+//}
+
+// DeleteRecordBySourceAndDataIdList
+// @Description: 根据来源和数据id列表删除记录
+// @author: Roc
+// @datetime 2024-04-07 14:47:37
+// @param source int
+// @param subSource int
+// @param dataIdList []string
+// @return err error
+func DeleteRecordBySourceAndDataIdList(source, subSource int, dataIdList []string) (err error) {
+	switch source {
+	case 3, 4:
+		edbInfoType := 0
+		if source == 4 {
+			edbInfoType = 1
+		}
+		err = DeleteEdbInfoPermissionNoAuthRecordBySourceAndDataIdList(edbInfoType, dataIdList)
+	case 5:
+		//图库
+		chartSource := utils.CHART_SOURCE_DEFAULT
+		err = DeleteChartInfoPermissionNoAuthRecordBySourceAndDataIdList(chartSource, dataIdList)
+
+	case 6:
+		// ETA表格
+		err = DeleteExcelInfoPermissionNoAuthRecordBySourceAndDataIdList(subSource, dataIdList)
+
+	default:
+		return errors.New("错误的source")
+	}
+	return
+}
+
+// DeleteRecordBySourceAndDataIdList
+// @Description: 根据来源和数据id列表删除记录
+// @author: Roc
+// @datetime 2024-04-07 14:47:37
+// @param source int
+// @param subSource int
+// @param dataIdList []string
+// @return err error
+//func DeleteRecordBySourceAndDataIdList(source, subSource int, dataIdList []string) (err error) {
+//	num := len(dataIdList)
+//	if num <= 0 {
+//		return
+//	}
+//	o := orm.NewOrmUsingDB("data")
+//
+//	sql := `DELETE FROM data_permission_no_auth_record WHERE source = ? AND sub_source = ? AND data_id in (` + utils.GetOrmInReplace(num) + `)`
+//	_, err = o.Raw(sql, source, subSource, dataIdList).Exec()
+//
+//	return
+//}
+
+// GetDataPermissionNoAuthRecordListByUserId
+// @Description: 根据用户获取未授权的资产记录
+// @author: Roc
+// @datetime 2024-04-07 20:15:01
+// @param userId int
+// @param source int
+// @param subSource int
+// @param startSize int
+// @param pageSize int
+// @return total int
+// @return items []*DataPermissionNoAuthRecord
+// @return err error
+//func GetDataPermissionNoAuthRecordListByUserId(userId, source, subSource int32, startSize, pageSize int) (total int, items []*DataPermissionNoAuthRecord, err error) {
+//	o := orm.NewOrmUsingDB("data")
+//
+//	// 获取总数
+//	sql := `SELECT count(1) AS total FROM data_permission_no_auth_record WHERE sys_user_id = ? AND source = ? AND sub_source = ? `
+//	err = o.Raw(sql, userId, source, subSource).QueryRow(&total)
+//	if err != nil {
+//		return
+//	}
+//
+//	sql = `SELECT * FROM data_permission_no_auth_record WHERE sys_user_id = ? AND source = ? AND sub_source = ? ORDER BY data_permission_no_auth_record_id desc LIMIT ?,? `
+//	_, err = o.Raw(sql, userId, source, subSource, startSize, pageSize).QueryRows(&items)
+//
+//	return
+//}
+
+// GetDataPermissionNoAuthRecordListByUserId
+// @Description: 根据用户获取未授权的资产记录
+// @author: Roc
+// @datetime 2024-04-07 20:15:01
+// @param userId int
+// @param source int
+// @param subSource int
+// @param startSize int
+// @param pageSize int
+// @return total int
+// @return items []*DataPermissionNoAuthRecord
+// @return err error
+func GetDataPermissionNoAuthRecordListByUserId(userId, source, subSource int32, startSize, pageSize int) (total int, items []*DataPermissionNoAuthRecord, err error) {
+	switch source {
+	case 3, 4:
+		edbInfoType := 0
+		if source == 4 {
+			edbInfoType = 1
+		}
+		total, items, err = GetEdbInfoDataPermissionNoAuthRecordListByUserId(userId, edbInfoType, startSize, pageSize)
+	case 5:
+		//图库
+		chartSource := utils.CHART_SOURCE_DEFAULT
+		total, items, err = GetChartInfoDataPermissionNoAuthRecordListByUserId(userId, chartSource, startSize, pageSize)
+
+	case 6:
+		// ETA表格
+		total, items, err = GetExcelInfoDataPermissionNoAuthRecordListByUserId(userId, subSource, startSize, pageSize)
+
+	default:
+		err = errors.New("错误的source")
+		return
+	}
+
+	return
+}

+ 89 - 0
models/data_manage/data_manage_permission/req_and_resp.go

@@ -0,0 +1,89 @@
+package data_manage_permission
+
+import "github.com/rdlucklib/rdluck_tools/paging"
+
+// MoveEdbChartReq 转移指标/图表的请求
+type MoveEdbChartReq struct {
+	Source       int      `description:"来源id"`
+	SubSource    int      `description:"子来源id"`
+	DataIdList   []string `description:"指标/图表唯一id列表"`
+	NoDataIdList []string `description:"指标/图表唯一id列表"`
+	NewUserId    int      `description:"新的创建人id"`
+	IsSelectAll  bool     `description:"是否选择所有指标"`
+	ClassifyId   string   `description:"分类id,支持多选,用英文,隔开"`
+	Keyword      string   `description:"关键字"`
+	UserId       int      `description:"旧的创建人id"`
+}
+
+// MoveAllEdbChartReq 转移所有的指标/图表的请求
+type MoveAllEdbChartReq struct {
+	Source    []int `description:"来源id"`
+	OldUserId []int `description:"旧的创建人id"`
+	NewUserId int   `description:"新的创建人id"`
+}
+
+// SetDataIsPermissionReq
+// @Description: 设置数据分类权限请求
+type SetDataIsPermissionReq struct {
+	Source         int   `description:"来源id"`
+	SubSource      int   `description:"子来源id"`
+	ClassifyIdList []int `description:"指标/图表/表格分类唯一id列表,如果为空,说明要给这些指标移除权限管控"`
+}
+
+// SetEdbChartPermissionReq
+// @Description: 设置数据权限请求
+type SetEdbChartPermissionReq struct {
+	Source       int      `description:"来源id"`
+	SubSource    int      `description:"子来源id"`
+	UserId       int      `description:"用户筛选"`
+	DataIdList   []string `description:"指标/图表/表格唯一id列表"`
+	NoDataIdList []string `description:"指标/图表/表格唯一id列表"`
+	UserList     []int    `description:"赋权用户id列表,如果为空,说明要给这些指标移除权限管控"`
+	IsSelectAll  bool     `description:"是否选择所有指标"`
+	ClassifyId   string   `description:"分类id,支持多选,用英文,隔开"`
+	Keyword      string   `description:"关键字"`
+}
+
+// SetEdbChartClassifyPermissionReq
+// @Description: 设置数据分类权限请求
+type SetEdbChartClassifyPermissionReq struct {
+	Source         int   `description:"来源id"`
+	SubSource      int   `description:"子来源id"`
+	UserList       []int `description:"赋权用户id列表,如果为空,说明要给这些数据分类移除权限管控"`
+	ClassifyIdList []int `description:"指标/图表/表格分类唯一id列表"`
+}
+
+// DataPermissionMessageItem
+// @Description: 数据权限变更消息结构体
+type DataPermissionMessageItem struct {
+	DataPermissionMessageId int64  `orm:"column(data_permission_message_id);pk"`
+	SendUserId              int32  // 发送人ID
+	ReceiveUserId           int32  // 接收者ID
+	Content                 string // 消息内容
+	Remark                  string // 备注信息
+	OpType                  int32  // 操作类型,1:单个资产转移,2:资产模块转移,3:资产授权,4:资产分类授权
+	Source                  int32  `description:"来源id"`
+	SubSource               int32  `description:"子来源id"`
+	OpUniqueCode            string // 操作编码
+	IsRead                  int32  // 是否已读:0-未读;1-已读
+	CreateTime              string // 创建时间
+	ModifyTime              string // 修改时间
+}
+
+// DataPermissionMessageListResp 资产数据列表响应体
+type DataPermissionMessageListResp struct {
+	List        []*DataPermissionMessageItem
+	Paging      *paging.PagingItem `description:"分页数据"`
+	UnreadTotal int                `description:"消息未读数"`
+}
+
+// DataPermissionMessageReadReq 资产数据消息已读请求体
+type DataPermissionMessageReadReq struct {
+	MessageId int `description:"资产数据消息ID"`
+}
+
+// MessageDetailListResp 消息详情
+type MessageDetailListResp struct {
+	Paging *paging.PagingItem
+	List   interface{}
+}

+ 75 - 37
models/data_manage/edb_classify.go

@@ -9,19 +9,20 @@ import (
 )
 
 type EdbClassify struct {
-	ClassifyId      int       `orm:"column(classify_id);pk"`
-	ClassifyType    uint8     `description:"分类类型,0:普通指标分类,1:预测指标分类"`
-	ClassifyName    string    `description:"分类名称"`
-	ParentId        int       `description:"父级id"`
-	RootId          int       `description:"顶级id"`
-	HasData         int       `description:"是否含有指标数据"`
-	CreateTime      time.Time `description:"创建时间"`
-	ModifyTime      time.Time `description:"修改时间"`
-	SysUserId       int       `description:"创建人id"`
-	SysUserRealName string    `description:"创建人姓名"`
-	Level           int       `description:"层级"`
-	UniqueCode      string    `description:"唯一编码"`
-	Sort            int       `description:"排序字段,越小越靠前,默认值:10"`
+	ClassifyId       int       `orm:"column(classify_id);pk"`
+	ClassifyType     uint8     `description:"分类类型,0:普通指标分类,1:预测指标分类"`
+	ClassifyName     string    `description:"分类名称"`
+	ParentId         int       `description:"父级id"`
+	RootId           int       `description:"顶级id"`
+	HasData          int       `description:"是否含有指标数据"`
+	CreateTime       time.Time `description:"创建时间"`
+	ModifyTime       time.Time `description:"修改时间"`
+	SysUserId        int       `description:"创建人id"`
+	SysUserRealName  string    `description:"创建人姓名"`
+	Level            int       `description:"层级"`
+	UniqueCode       string    `description:"唯一编码"`
+	Sort             int       `description:"排序字段,越小越靠前,默认值:10"`
+	IsJoinPermission int       `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
 }
 
 func AddEdbClassify(item *EdbClassify) (lastId int64, err error) {
@@ -179,33 +180,37 @@ func GetAllEdbClassifyByType(classifyType int) (items []*EdbClassifyItems, err e
 }
 
 type EdbClassifyItems struct {
-	ClassifyId      int `description:"分类id"`
-	EdbInfoId       int `description:"指标id"`
-	ClassifyName    string
-	ClassifyNameEn  string
-	ParentId        int
-	RootId          int    `description:"顶级id"`
-	Level           int    `description:"层级"`
-	Sort            int    `description:"排序字段,越小越靠前,默认值:10"`
-	UniqueCode      string `description:"唯一编码"`
-	Source          int    `description:"来源id"`
-	SourceName      string `description:"来源名称"`
-	SysUserId       int    `description:"创建人id"`
-	SysUserRealName string `description:"创建人姓名"`
-	StartDate       string
-	EdbCode         string
-	EdbType         int `description:"指标类型:1:基础指标,2:计算指标"`
-	Children        []*EdbClassifyItems
-	Button          EdbClassifyItemsButton `description:"操作权限"`
+	ClassifyId       int `description:"分类id"`
+	EdbInfoId        int `description:"指标id"`
+	ClassifyName     string
+	ClassifyNameEn   string
+	ParentId         int
+	RootId           int    `description:"顶级id"`
+	Level            int    `description:"层级"`
+	Sort             int    `description:"排序字段,越小越靠前,默认值:10"`
+	UniqueCode       string `description:"唯一编码"`
+	Source           int    `description:"来源id"`
+	SourceName       string `description:"来源名称"`
+	SysUserId        int    `description:"创建人id"`
+	SysUserRealName  string `description:"创建人姓名"`
+	StartDate        string
+	EdbCode          string
+	EdbType          int `description:"指标类型:1:基础指标,2:计算指标"`
+	Children         []*EdbClassifyItems
+	Button           EdbClassifyItemsButton `description:"操作权限"`
+	IsJoinPermission int                    `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	HaveOperaAuth    bool                   `description:"是否有数据权限"`
 }
 
 type EdbClassifyIdItems struct {
-	ClassifyId   int `description:"分类id"`
-	ClassifyName string
-	UniqueCode   string `description:"唯一编码"`
-	ParentId     int    `description:"父级分类id"`
-	Level        int    `description:"层级"`
-	RootId       int    `description:"顶级分类id"`
+	ClassifyId       int `description:"分类id"`
+	ClassifyName     string
+	UniqueCode       string `description:"唯一编码"`
+	ParentId         int    `description:"父级分类id"`
+	Level            int    `description:"层级"`
+	RootId           int    `description:"顶级分类id"`
+	IsJoinPermission int    `description:"是否加入权限管控,0:不加入;1:加入;默认:0" json:"-"`
+	HaveOperaAuth    bool   `description:"是否有该数据权限,默认:false"`
 }
 
 type EdbClassifyItemList []*EdbClassifyItems
@@ -552,3 +557,36 @@ func GetEdbClassifyByParentIdAndName(parentId int, classifyName string, classify
 	err = o.Raw(sql, parentId, classifyName, classifyId).QueryRow(&item)
 	return
 }
+
+// GetEdbClassifyByIdList
+// @Description: 根据分类id列表获取分类列表
+// @author: Roc
+// @datetime 2024-03-29 10:30:21
+// @param classifyId int
+// @return item *EdbClassify
+// @return err error
+func GetEdbClassifyByIdList(classifyIdList []int) (item []*EdbClassify, err error) {
+	num := len(classifyIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_classify WHERE classify_id in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, classifyIdList).QueryRows(&item)
+	return
+}
+
+// GetEdbClassifyByClassifyTypeAndIsJoinPermission
+// @Description: 根据分类类型和是否涉密获取分类列表
+// @author: Roc
+// @datetime 2024-03-29 10:30:21
+// @param classifyType int
+// @param isJoinPermission int
+// @return items []*EdbClassify
+// @return err error
+func GetEdbClassifyByClassifyTypeAndIsJoinPermission(classifyType, isJoinPermission int) (items []*EdbClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_classify WHERE   classify_type = ? AND is_join_permission = ? `
+	_, err = o.Raw(sql, classifyType, isJoinPermission).QueryRows(&items)
+	return
+}

+ 95 - 32
models/data_manage/edb_info.go

@@ -58,12 +58,14 @@ type EdbInfo struct {
 	IndicatorCode    string  `description:"指标代码"`
 	StockCode        string  `description:"证券代码"`
 	Extra            string  `description:"指标额外配置"`
+	IsJoinPermission int     `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
 }
 
 type EdbInfoFullClassify struct {
 	*EdbInfo
 	CorrelationStr string `description:"相关性系数字符串"`
 	ClassifyList   []*EdbClassifyIdItems
+	HaveOperaAuth  bool `description:"是否有数据权限,默认:false"`
 }
 
 func AddEdbInfo(item *EdbInfo) (lastId int64, err error) {
@@ -73,14 +75,15 @@ func AddEdbInfo(item *EdbInfo) (lastId int64, err error) {
 }
 
 type BaseEdbNameItem struct {
-	EdbInfoId   int    `description:"指标id"`
-	EdbInfoType int    `description:"指标类型,0:普通指标,1:预测指标"`
-	SourceName  string `description:"来源名称"`
-	Source      int    `description:"来源id"`
-	EdbCode     string `description:"指标编码"`
-	EdbName     string `description:"指标名称"`
-	Frequency   string `description:"频率"`
-	Unit        string `description:"单位"`
+	EdbInfoId     int    `description:"指标id"`
+	EdbInfoType   int    `description:"指标类型,0:普通指标,1:预测指标"`
+	SourceName    string `description:"来源名称"`
+	Source        int    `description:"来源id"`
+	EdbCode       string `description:"指标编码"`
+	EdbName       string `description:"指标名称"`
+	Frequency     string `description:"频率"`
+	Unit          string `description:"单位"`
+	HaveOperaAuth bool   `description:"是否有数据权限,默认:false"`
 }
 
 type BaseEdbInfoResp struct {
@@ -352,6 +355,8 @@ type EdbInfoList struct {
 	IndicatorCode    string                  `description:"指标代码"`
 	StockCode        string                  `description:"证券代码"`
 	NoUpdate         int8                    `description:"是否停止更新,0:继续更新;1:停止更新"`
+	IsJoinPermission int                     `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	HaveOperaAuth    bool                    `description:"是否有数据权限,默认:false"`
 }
 
 type EdbDataInsertConfigItem struct {
@@ -1522,13 +1527,21 @@ func GetEdbInfoByConditionCount(condition string, pars []interface{}) (count int
 }
 
 // GetEdbInfoListByCondition 根据条件获取指标列表数据
-func GetEdbInfoListByCondition(condition string, pars []interface{}, startSize, pageSize int) (items []*EdbInfoList, err error) {
+func GetEdbInfoListByCondition(condition string, pars []interface{}, startSize, pageSize int, orderDesc string) (items []*EdbInfoList, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM edb_info WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
-	sql += ` ORDER BY edb_info_id ASC LIMIT ?,? `
+
+	if orderDesc == `` {
+		orderDesc = ` ASC `
+	}
+
+	sql += ` ORDER BY edb_info_id `
+	sql += orderDesc
+	sql += ` LIMIT ?,? `
+
 	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
 	return
 }
@@ -1558,6 +1571,41 @@ func GetEdbInfoListGroupByUserId(edbIdList []string) (items []*EdbInfo, err erro
 	return
 }
 
+// GetEdbInfoListByEdbInfoId
+// @Description: 根据指标id列表获取列表信息
+// @param edbIdList
+// @return items
+// @return err
+func GetEdbInfoListByEdbInfoId(edbIdList []string) (items []*EdbInfo, err error) {
+	num := len(edbIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_info WHERE edb_info_id in (` + utils.GetOrmInReplace(num) + `) `
+
+	_, err = o.Raw(sql, edbIdList).QueryRows(&items)
+	return
+}
+
+// GetEdbInfoListByUserId
+// @Description: 根据指标id列表获取列表信息
+// @param userIdList []int
+// @param edbInfoType int
+// @return items
+// @return err
+func GetEdbInfoListByUserId(userIdList []int, edbInfoType int) (items []*EdbInfo, err error) {
+	num := len(userIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_info WHERE edb_info_type = ? AND sys_user_id in (` + utils.GetOrmInReplace(num) + `) `
+
+	_, err = o.Raw(sql, edbInfoType, userIdList).QueryRows(&items)
+	return
+}
+
 // ModifyEdbInfoUserIdByCodeList 根据指标code列表修改创建人
 func ModifyEdbInfoUserIdByCodeList(edbIdList []string, userId int, userName string) (err error) {
 	num := len(edbIdList)
@@ -1570,6 +1618,26 @@ func ModifyEdbInfoUserIdByCodeList(edbIdList []string, userId int, userName stri
 	return
 }
 
+// ModifyEdbInfoUserIdByOldUserId
+// @Description:  根据旧用户id修改新用户id
+// @author: Roc
+// @datetime 2024-03-25 19:17:09
+// @param edbIdList []string
+// @param userId int
+// @param userName string
+// @return err error
+func ModifyEdbInfoUserIdByOldUserId(oldUserIdList []int, edbInfoType, userId int, userName string) (err error) {
+	num := len(oldUserIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE edb_info SET sys_user_id=?,sys_user_real_name=? WHERE sys_user_id in (` + utils.GetOrmInReplace(num) + `) and edb_info_type = ?`
+	_, err = o.Raw(sql, userId, userName, oldUserIdList, edbInfoType).Exec()
+
+	return
+}
+
 // MoveEdbChartList 图表/指标信息
 type MoveEdbChartList struct {
 	DataId         string `description:"指标/图表唯一id"`
@@ -1586,22 +1654,16 @@ type MoveEdbChartListResp struct {
 	List   []MoveEdbChartList
 }
 
-// MoveEdbChartReq 转移指标/图表的请求
-type MoveEdbChartReq struct {
-	Source     int      `description:"来源id"`
-	DataIdList []string `description:"指标/图表唯一id列表"`
-	NewUserId  int      `description:"新的创建人id"`
-}
-
 type EdbChartClassifyResp struct {
 	List []*EdbChartClassify
 }
 
 type EdbChartClassify struct {
-	ClassifyId   int
-	ClassifyName string
-	ParentId     int
-	Child        []*EdbChartClassify
+	ClassifyId       int
+	ClassifyName     string
+	ParentId         int
+	IsJoinPermission int `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	Child            []*EdbChartClassify
 }
 
 // EdbInfoDataSeasonalResp 指标季节性数据返回
@@ -1620,7 +1682,7 @@ type SetEdbDataInsertConfigReq struct {
 // GetEdbInfoByClassifyId 用于分类展示
 func GetEdbInfoByClassifyId(classifyId, edbInfoType, adminId int) (items []*EdbClassifyItems, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT edb_info_id,classify_id,edb_name_source AS classify_name,edb_name_en AS classify_name_en,unique_code,source_name,source,sys_user_id,sys_user_real_name,start_date,edb_code,edb_type, sort FROM edb_info WHERE classify_id = ? AND edb_info_type = ?`
+	sql := ` SELECT edb_info_id,classify_id,edb_name_source AS classify_name,edb_name_en AS classify_name_en,unique_code,source_name,source,sys_user_id,sys_user_real_name,start_date,edb_code,edb_type, sort,is_join_permission FROM edb_info WHERE classify_id = ? AND edb_info_type = ?`
 
 	pars := []interface{}{classifyId, edbInfoType}
 	// 如果筛选了用户id
@@ -1663,16 +1725,17 @@ func GetEdbInfoAndClassifyListByEdbIdList(edbIdList []int) (items []*EdbAndClass
 
 // TraceEdbInfoResp 指标追溯数据返回
 type TraceEdbInfoResp struct {
-	EdbInfoId   int                `description:"指标id"`
-	EdbInfoType int                `description:"指标类型: 0-普通指标; 1-预测指标"`
-	EdbName     string             `description:"指标名称"`
-	EdbType     int                `description:"指标类型: 1-基础指标; 2-计算指标"`
-	RuleTitle   string             `description:"指标规则"`
-	UniqueCode  string             `description:"唯一编码"`
-	ClassifyId  int                `description:"分类ID"`
-	Child       []TraceEdbInfoResp `description:"下级来源"`
-	IsStop      int8               `description:"是否终止"`
-	EdbInfo     *EdbInfo           `description:"指标信息" json:"-"`
+	EdbInfoId     int                `description:"指标id"`
+	EdbInfoType   int                `description:"指标类型: 0-普通指标; 1-预测指标"`
+	EdbName       string             `description:"指标名称"`
+	EdbType       int                `description:"指标类型: 1-基础指标; 2-计算指标"`
+	RuleTitle     string             `description:"指标规则"`
+	UniqueCode    string             `description:"唯一编码"`
+	ClassifyId    int                `description:"分类ID"`
+	Child         []TraceEdbInfoResp `description:"下级来源"`
+	IsStop        int8               `description:"是否终止"`
+	EdbInfo       *EdbInfo           `description:"指标信息" json:"-"`
+	HaveOperaAuth bool               `description:"是否有数据权限,默认:false"`
 }
 
 // BeforeAndAfterDateDataResp 前后几期数据

+ 7 - 5
models/data_manage/edb_info_calculate.go

@@ -162,11 +162,12 @@ func DeleteCalculateData(edbInfoId int) (err error) {
 }
 
 type EdbInfoBase struct {
-	EdbInfoId  int    `description:"指标id"`
-	EdbName    string `description:"指标名称"`
-	Frequency  string `description:"频度"`
-	Unit       string `description:"单位"`
-	ClassifyId int    `description:"分类id"`
+	EdbInfoId     int    `description:"指标id"`
+	EdbName       string `description:"指标名称"`
+	Frequency     string `description:"频度"`
+	Unit          string `description:"单位"`
+	ClassifyId    int    `description:"分类id"`
+	HaveOperaAuth bool   `description:"是否有数据权限,默认:false"`
 }
 
 type CalculateEdbInfoItem struct {
@@ -607,4 +608,5 @@ type CalculateMultiEdbSearchItem struct {
 	SysUserRealName string
 	EndValue        float64 `description:"数据的最新值(预测日期的最新值)"`
 	EndDate         string  `description:"终止日期"`
+	HaveOperaAuth   bool    `description:"是否有数据权限,默认:false"`
 }

+ 56 - 0
models/data_manage/excel/excel_classify.go

@@ -1,6 +1,7 @@
 package excel
 
 import (
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"time"
@@ -20,6 +21,7 @@ type ExcelClassify struct {
 	IsDelete          int       `description:"排序字段,越小越靠前,默认值:10"`
 	CreateTime        time.Time `description:"创建时间"`
 	ModifyTime        time.Time `description:"修改时间"`
+	IsJoinPermission  int       `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
 }
 
 // AddExcelClassify 添加excel分类
@@ -49,6 +51,39 @@ func GetExcelClassifyById(classifyId int) (item *ExcelClassify, err error) {
 	return
 }
 
+// GetExcelClassifyByIdList
+// @Description: 根据分类id列表获取所有分类信息
+// @author: Roc
+// @datetime 2024-04-07 16:24:04
+// @param classifyIdList []int
+// @return items []*ExcelClassify
+// @return err error
+func GetExcelClassifyByIdList(classifyIdList []int) (items []*ExcelClassify, err error) {
+	num := len(classifyIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM excel_classify WHERE excel_classify_id in (` + utils.GetOrmInReplace(num) + `) AND is_delete=0 `
+	_, err = o.Raw(sql, classifyIdList).QueryRows(&items)
+	return
+}
+
+// GetExcelClassifyBySourceAndIsJoinPermission
+// @Description: 根据分类id列表获取所有分类信息
+// @author: Roc
+// @datetime 2024-04-07 16:24:04
+// @param classifyIdList []int
+// @return items []*ExcelClassify
+// @return err error
+func GetExcelClassifyBySourceAndIsJoinPermission(source, isJoinPermission int) (items []*ExcelClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM excel_classify WHERE source = ? AND is_join_permission = ? `
+	_, err = o.Raw(sql, source, isJoinPermission).QueryRows(&items)
+
+	return
+}
+
 func GetChildClassifyById(classifyId int) (items []*ExcelClassify, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM excel_classify WHERE parent_id=? AND is_delete=0 `
@@ -95,6 +130,8 @@ type ExcelClassifyItems struct {
 	SysUserRealName   string `description:"创建人姓名"`
 	StartDate         string `description:"自定义开始日期"`
 	Children          []*ExcelClassifyItems
+	IsJoinPermission  int  `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	HaveOperaAuth     bool `description:"是否有数据权限"`
 }
 
 func GetExcelClassifyByCondition(condition string, pars []interface{}) (item *ExcelClassify, err error) {
@@ -170,3 +207,22 @@ func GetExcelClassifyViewById(classifyId int) (item *ExcelClassifyView, err erro
 func ExcelClassifyItemBySort(p1, p2 *ExcelClassifyItems) bool {
 	return p1.Sort < p2.Sort
 }
+
+// GetClassifyByIdList
+// @Description: 根据分类ID列表获取分类列表
+// @author: Roc
+// @datetime 2024-04-02 19:40:30
+// @param classifyIdList []int
+// @return items []*ExcelClassify
+// @return err error
+func GetClassifyByIdList(classifyIdList []int) (items []*ExcelClassify, err error) {
+	num := len(classifyIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM excel_classify WHERE excel_classify_id in (` + utils.GetOrmInReplace(num) + `) AND is_delete=0 `
+	_, err = o.Raw(sql, classifyIdList).QueryRows(&items)
+
+	return
+}

+ 132 - 34
models/data_manage/excel/excel_info.go

@@ -1,6 +1,7 @@
 package excel
 
 import (
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"time"
@@ -8,21 +9,22 @@ import (
 
 // ExcelInfo excel表格详情表
 type ExcelInfo struct {
-	ExcelInfoId     int       `orm:"column(excel_info_id);pk"`
-	Source          int       `description:"表格来源,1:excel插件的表格,2:自定义表格,3:混合表格,4:自定义分析,默认:1"`
-	ExcelType       int       `description:"表格类型,1:指标列,2:日期列,默认:1"`
-	ExcelName       string    `description:"表格名称"`
-	UniqueCode      string    `description:"表格唯一编码"`
-	ExcelClassifyId int       `description:"表格分类id"`
-	SysUserId       int       `description:"操作人id"`
-	SysUserRealName string    `description:"操作人真实姓名"`
-	Content         string    `description:"表格内容"`
-	ExcelImage      string    `description:"表格图片"`
-	FileUrl         string    `description:"表格下载地址"`
-	Sort            int       `description:"排序字段,数字越小越排前面"`
-	IsDelete        int       `description:"是否删除,0:未删除,1:已删除"`
-	ModifyTime      time.Time `description:"最近修改日期"`
-	CreateTime      time.Time `description:"创建日期"`
+	ExcelInfoId      int       `orm:"column(excel_info_id);pk"`
+	Source           int       `description:"表格来源,1:excel插件的表格,2:自定义表格,3:混合表格,4:自定义分析,默认:1"`
+	ExcelType        int       `description:"表格类型,1:指标列,2:日期列,默认:1"`
+	ExcelName        string    `description:"表格名称"`
+	UniqueCode       string    `description:"表格唯一编码"`
+	ExcelClassifyId  int       `description:"表格分类id"`
+	SysUserId        int       `description:"操作人id"`
+	SysUserRealName  string    `description:"操作人真实姓名"`
+	Content          string    `description:"表格内容"`
+	ExcelImage       string    `description:"表格图片"`
+	FileUrl          string    `description:"表格下载地址"`
+	Sort             int       `description:"排序字段,数字越小越排前面"`
+	IsDelete         int       `description:"是否删除,0:未删除,1:已删除"`
+	ModifyTime       time.Time `description:"最近修改日期"`
+	CreateTime       time.Time `description:"创建日期"`
+	IsJoinPermission int       `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
 }
 
 // Update 更新 excel表格基础信息
@@ -33,19 +35,21 @@ func (excelInfo *ExcelInfo) Update(cols []string) (err error) {
 }
 
 type MyExcelInfoList struct {
-	ExcelInfoId     int       `orm:"column(excel_info_id);pk"`
-	Source          int       `description:"表格来源,1:excel插件的表格,2:自定义表格,默认:1"`
-	ExcelType       int       `description:"表格类型,1:指标列,2:日期列,默认:1"`
-	ExcelName       string    `description:"表格名称"`
-	UniqueCode      string    `description:"表格唯一编码"`
-	ExcelClassifyId int       `description:"表格分类id"`
-	SysUserId       int       `description:"操作人id"`
-	SysUserRealName string    `description:"操作人真实姓名"`
-	ExcelImage      string    `description:"表格图片"`
-	FileUrl         string    `description:"表格下载地址"`
-	Sort            int       `description:"排序字段,数字越小越排前面"`
-	ModifyTime      time.Time `description:"最近修改日期"`
-	CreateTime      time.Time `description:"创建日期"`
+	ExcelInfoId      int       `orm:"column(excel_info_id);pk"`
+	Source           int       `description:"表格来源,1:excel插件的表格,2:自定义表格,默认:1"`
+	ExcelType        int       `description:"表格类型,1:指标列,2:日期列,默认:1"`
+	ExcelName        string    `description:"表格名称"`
+	UniqueCode       string    `description:"表格唯一编码"`
+	ExcelClassifyId  int       `description:"表格分类id"`
+	SysUserId        int       `description:"操作人id"`
+	SysUserRealName  string    `description:"操作人真实姓名"`
+	ExcelImage       string    `description:"表格图片"`
+	FileUrl          string    `description:"表格下载地址"`
+	Sort             int       `description:"排序字段,数字越小越排前面"`
+	ModifyTime       time.Time `description:"最近修改日期"`
+	CreateTime       time.Time `description:"创建日期"`
+	IsJoinPermission int       `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	HaveOperaAuth    bool      `description:"是否有数据权限"`
 }
 
 // AddExcelInfo 新增表格
@@ -122,7 +126,7 @@ func EditExcelInfo(excelInfo *ExcelInfo, updateExcelInfoParams []string, excelEd
 func GetExcelInfoAll() (items []*ExcelClassifyItems, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT excel_info_id,excel_classify_id,excel_name AS excel_classify_name,
-             unique_code,sys_user_id,sys_user_real_name,start_date
+             unique_code,sys_user_id,sys_user_real_name,is_join_permission
             FROM excel_info where is_delete=0 ORDER BY sort asc,create_time ASC `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
@@ -132,7 +136,7 @@ func GetExcelInfoAll() (items []*ExcelClassifyItems, err error) {
 func GetNoContentExcelInfoAll(source, userId int) (items []*ExcelClassifyItems, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT excel_info_id,excel_classify_id,excel_name AS excel_classify_name,
-             unique_code,sys_user_id,sys_user_real_name,sort
+             unique_code,sys_user_id,sys_user_real_name,sort,is_join_permission
             FROM excel_info where is_delete=0 AND source = ?  `
 
 	pars := []interface{}{source}
@@ -187,6 +191,19 @@ func GetExcelInfoCountByCondition(condition string, pars []interface{}) (count i
 	return
 }
 
+func GetNoContentExcelInfoListByCondition(condition string, pars []interface{}, startSize, pageSize int) (items []*ExcelClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT excel_info_id,excel_classify_id,excel_name AS excel_classify_name,
+             unique_code,sys_user_id,sys_user_real_name,sort,is_join_permission FROM excel_info WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+
+	sql += ` AND is_delete=0 ORDER BY excel_info_id DESC LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
 func GetExcelInfoByCondition(condition string, pars []interface{}) (item *ExcelInfo, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE 1=1 AND is_delete=0 `
@@ -308,7 +325,7 @@ func GetExcelInfoByClassifyIdAndName(classifyId int, excelName string) (item *Ex
 // GetNoContentExcelListByCondition 获取没有content的excel表格列表数据
 func GetNoContentExcelListByCondition(condition string, pars []interface{}, startSize, pageSize int) (item []*MyExcelInfoList, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT excel_info_id,source,excel_type,excel_name,unique_code,excel_classify_id,sys_user_id,sys_user_real_name,excel_image,file_url,sort,create_time,modify_time
+	sql := ` SELECT excel_info_id,source,excel_type,excel_name,unique_code,excel_classify_id,sys_user_id,sys_user_real_name,excel_image,file_url,sort,create_time,modify_time,is_join_permission
 FROM excel_info WHERE 1=1 AND is_delete=0 `
 	if condition != "" {
 		sql += condition
@@ -332,7 +349,7 @@ func GetExcelListCountByCondition(condition string, pars []interface{}) (count i
 // GetExcelViewInfoByExcelInfoId 根据excelInfoId 获取ETA表格详情
 func GetExcelViewInfoByExcelInfoId(excelInfoId int) (item *MyExcelInfoList, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT excel_info_id,source,excel_type,excel_name,unique_code,excel_classify_id,sys_user_id,sys_user_real_name,excel_image,file_url,sort,create_time,modify_time FROM excel_info WHERE excel_info_id = ? AND is_delete=0 `
+	sql := ` SELECT excel_info_id,source,excel_type,excel_name,unique_code,excel_classify_id,sys_user_id,sys_user_real_name,excel_image,file_url,sort,create_time,modify_time,is_join_permission FROM excel_info WHERE excel_info_id = ? AND is_delete=0 `
 	err = o.Raw(sql, excelInfoId).QueryRow(&item)
 	return
 }
@@ -357,7 +374,7 @@ func UpdateExcelInfoClassifyId(classifyId, excelInfoId int) (err error) {
 // GetNoContentExcelInfoByName 根据名称 获取eta表格详情
 func GetNoContentExcelInfoByName(excelName string, source int) (item *MyExcelInfoList, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT excel_info_id,source,excel_type,excel_name,unique_code,excel_classify_id,sys_user_id,sys_user_real_name,excel_image,file_url,sort,create_time,modify_time 
+	sql := ` SELECT excel_info_id,source,excel_type,excel_name,unique_code,excel_classify_id,sys_user_id,sys_user_real_name,excel_image,file_url,sort,create_time,modify_time,is_join_permission 
  FROM excel_info WHERE excel_name = ? AND source = ? AND is_delete=0 `
 	err = o.Raw(sql, excelName, source).QueryRow(&item)
 
@@ -367,12 +384,21 @@ func GetNoContentExcelInfoByName(excelName string, source int) (item *MyExcelInf
 // GetNoContentExcelInfoByUniqueCode 根据unique_code来获取excel表格详情
 func GetNoContentExcelInfoByUniqueCode(uniqueCode string) (item *MyExcelInfoList, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT excel_info_id,source,excel_type,excel_name,unique_code,excel_classify_id,sys_user_id,sys_user_real_name,excel_image,file_url,sort,create_time,modify_time 
+	sql := ` SELECT excel_info_id,source,excel_type,excel_name,unique_code,excel_classify_id,sys_user_id,sys_user_real_name,excel_image,file_url,sort,create_time,modify_time,is_join_permission 
  FROM excel_info WHERE unique_code=? AND is_delete=0 `
 	err = o.Raw(sql, uniqueCode).QueryRow(&item)
 	return
 }
 
+// GetNoContentExcelInfoByExcelId 根据表格id来获取excel表格详情
+func GetNoContentExcelInfoByExcelId(excelInfoId int) (item *MyExcelInfoList, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT excel_info_id,source,excel_type,excel_name,unique_code,excel_classify_id,sys_user_id,sys_user_real_name,excel_image,file_url,sort,create_time,modify_time,is_join_permission 
+ FROM excel_info WHERE excel_info_id=? AND is_delete=0 `
+	err = o.Raw(sql, excelInfoId).QueryRow(&item)
+	return
+}
+
 // AddExcelInfoAndSheet 新增excel
 func AddExcelInfoAndSheet(excelInfo *ExcelInfo, sheetParamsList []AddExcelSheetParams) (err error) {
 	o, err := orm.NewOrmUsingDB("data").Begin()
@@ -525,3 +551,75 @@ func GetExcelMaxSortByClassifyId(classifyId int, source int) (sort int, err erro
 	err = o.Raw(sql, classifyId, source).QueryRow(&sort)
 	return
 }
+
+// GetNoContentExcelListByExcelInfoIdList
+// @Description: 根据ETA表格ID列表获取列表信息
+// @param excelInfoIdList []string
+// @return items
+// @return err
+func GetNoContentExcelListByExcelInfoIdList(excelInfoIdList []string) (items []*MyExcelInfoList, err error) {
+	num := len(excelInfoIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM excel_info WHERE excel_info_id in (` + utils.GetOrmInReplace(num) + `) order by excel_info_id DESC `
+	_, err = o.Raw(sql, excelInfoIdList).QueryRows(&items)
+
+	return
+}
+
+// GetNoContentExcelListByUserId
+// @Description: 根据ETA表格ID列表获取列表信息
+// @param userIdList []int
+// @return items
+// @return err
+func GetNoContentExcelListByUserId(userIdList []int) (items []*MyExcelInfoList, err error) {
+	num := len(userIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM excel_info WHERE excel_info_id in (` + utils.GetOrmInReplace(num) + `) order by excel_info_id DESC `
+	_, err = o.Raw(sql, userIdList).QueryRows(&items)
+
+	return
+}
+
+// ModifyExcelInfoUserIdByCodeList
+// @Description: 根据编码列表修改表格信息
+// @author: Roc
+// @datetime 2024-03-26 14:16:30
+// @param excelIdList []string
+// @param userId int
+// @param userName string
+// @return err error
+func ModifyExcelInfoUserIdByCodeList(excelIdList []string, userId int, userName string) (err error) {
+	num := len(excelIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE excel_info SET sys_user_id=?,sys_user_real_name=? WHERE excel_info_id in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, userId, userName, excelIdList).Exec()
+	return
+}
+
+// ModifyExcelInfoUserIdByOldUserId
+// @Description:  根据旧的用户id修改创建人
+// @author: Roc
+// @datetime 2024-03-25 19:14:59
+// @param oldUserId int
+// @param userId int
+// @param userName string
+// @return err error
+func ModifyExcelInfoUserIdByOldUserId(oldUserIdList []int, userId int, userName string) (err error) {
+	num := len(oldUserIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE excel_info SET sys_user_id=?,sys_user_real_name=? WHERE is_delete=0 AND sys_user_id in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, userId, userName, oldUserIdList).Exec()
+	return
+}

+ 10 - 7
models/data_manage/excel/request/excel_info.go

@@ -97,13 +97,16 @@ type TableDataReq struct {
 
 // EdbInfoData 自定义表格的数据
 type EdbInfoData struct {
-	EdbInfoId    int             `description:"指标ID"`
-	Tag          string          `description:"标签"`
-	EdbName      string          `description:"指标名称"`
-	EdbAliasName string          `description:"指标别名"`
-	Frequency    string          `description:"频度"`
-	Unit         string          `description:"单位"`
-	Data         []ManualDataReq `description:"单元格数据列表"`
+	EdbInfoId        int             `description:"指标ID"`
+	Tag              string          `description:"标签"`
+	EdbName          string          `description:"指标名称"`
+	EdbAliasName     string          `description:"指标别名"`
+	Frequency        string          `description:"频度"`
+	Unit             string          `description:"单位"`
+	ClassifyId       int             `description:"所属分类" json:"-"`
+	IsJoinPermission int             `description:"是否加入权限管控,0:不加入;1:加入;默认:0" json:"-"`
+	HaveOperaAuth    bool            `description:"是否有数据权限,默认:false"`
+	Data             []ManualDataReq `description:"单元格数据列表"`
 }
 
 // ManualDataReq 自定义表格的单元格数据

+ 21 - 19
models/data_manage/excel/response/excel_info.go

@@ -56,25 +56,27 @@ type TableDetailResp struct {
 
 // ExcelInfoDetail excel表格详情(前端使用)
 type ExcelInfoDetail struct {
-	ExcelInfoId     int                   `orm:"column(excel_info_id);pk"`
-	Source          int                   `description:"表格来源,1:excel插件的表格,2:自定义表格,默认:1"`
-	ExcelType       int                   `description:"表格类型,1:指标列,2:日期列,默认:1"`
-	ExcelName       string                `description:"表格名称"`
-	UniqueCode      string                `description:"表格唯一编码"`
-	ExcelClassifyId int                   `description:"表格分类id"`
-	SysUserId       int                   `description:"操作人id"`
-	SysUserRealName string                `description:"操作人真实姓名"`
-	Content         string                `description:"表格内容"`
-	ExcelImage      string                `description:"表格图片"`
-	FileUrl         string                `description:"表格下载地址"`
-	Sort            int                   `description:"排序字段,数字越小越排前面"`
-	IsDelete        int                   `description:"是否删除,0:未删除,1:已删除"`
-	ModifyTime      time.Time             `description:"最近修改日期"`
-	CreateTime      time.Time             `description:"创建日期"`
-	TableData       interface{}           `description:"表格内容"`
-	Button          ExcelInfoDetailButton `description:"操作权限"`
-	CanEdit         bool                  `description:"是否可编辑"`
-	Editor          string                `description:"编辑人"`
+	ExcelInfoId      int                   `orm:"column(excel_info_id);pk"`
+	Source           int                   `description:"表格来源,1:excel插件的表格,2:自定义表格,默认:1"`
+	ExcelType        int                   `description:"表格类型,1:指标列,2:日期列,默认:1"`
+	ExcelName        string                `description:"表格名称"`
+	UniqueCode       string                `description:"表格唯一编码"`
+	ExcelClassifyId  int                   `description:"表格分类id"`
+	SysUserId        int                   `description:"操作人id"`
+	SysUserRealName  string                `description:"操作人真实姓名"`
+	Content          string                `description:"表格内容"`
+	ExcelImage       string                `description:"表格图片"`
+	FileUrl          string                `description:"表格下载地址"`
+	Sort             int                   `description:"排序字段,数字越小越排前面"`
+	IsDelete         int                   `description:"是否删除,0:未删除,1:已删除"`
+	ModifyTime       time.Time             `description:"最近修改日期"`
+	CreateTime       time.Time             `description:"创建日期"`
+	TableData        interface{}           `description:"表格内容"`
+	Button           ExcelInfoDetailButton `description:"操作权限"`
+	CanEdit          bool                  `description:"是否可编辑"`
+	Editor           string                `description:"编辑人"`
+	IsJoinPermission int                   `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	HaveOperaAuth    bool                  `description:"是否有数据权限"`
 }
 
 // ExcelInfoDetailButton 操作按钮

+ 1 - 0
models/data_manage/excel/response/sheet.go

@@ -30,4 +30,5 @@ type FindExcelInfo struct {
 	Button          ExcelInfoDetailButton `description:"操作权限"`
 	CanEdit         bool                  `description:"是否可编辑"`
 	Editor          string                `description:"编辑人"`
+	HaveOperaAuth   bool                  `description:"是否有数据权限,默认:false"`
 }

+ 3 - 1
models/data_manage/my_chart.go

@@ -327,6 +327,8 @@ type MyChartList struct {
 	IsEnChart           bool   `description:"是否展示英文标识"`
 	Disabled            int    `description:"是否禁用,0:启用,1:禁用,默认:0"`
 	Source              int    `description:"1:ETA图库;2:商品价格曲线"`
+	IsJoinPermission    int    `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	HaveOperaAuth       bool   `description:"是否有数据权限,默认:false"`
 }
 
 type MyChartListResp struct {
@@ -337,7 +339,7 @@ type MyChartListResp struct {
 func GetMyChartListByCondition(condition string, pars []interface{}, startSize, pageSize int) (item []*MyChartList, err error) {
 	o := orm.NewOrmUsingDB("data")
 
-	field := `a.my_chart_id,c.admin_id,c.sort,c.create_time as c_ctime,b.chart_info_id,b.chart_name,b.chart_name_en,b.chart_classify_id,b.sys_user_id,b.sys_user_real_name,b.unique_code,b.create_time,b.modify_time,b.date_type,b.start_date,b.end_date,b.is_set_name,b.edb_info_ids,b.chart_type,b.calendar,b.season_start_date,b.season_end_date,b.chart_image,b.edb_end_date,b.disabled,b.source `
+	field := `a.my_chart_id,c.admin_id,c.sort,c.create_time as c_ctime,b.chart_info_id,b.chart_name,b.chart_name_en,b.chart_classify_id,b.sys_user_id,b.sys_user_real_name,b.unique_code,b.create_time,b.modify_time,b.date_type,b.start_date,b.end_date,b.is_set_name,b.edb_info_ids,b.chart_type,b.calendar,b.season_start_date,b.season_end_date,b.chart_image,b.edb_end_date,b.disabled,b.source,b.is_join_permission `
 	//MyChartClassifyName string `description:"分类名称,多个用英文逗号分割"`
 	//MyChartClassifyId   string `description:"分类id,多个用英文逗号分割"`
 	sql := ` SELECT * FROM ( SELECT ` + field + ` FROM my_chart AS a

+ 63 - 2
models/data_manage/mysteel_chemical_index.go

@@ -281,15 +281,22 @@ func GetMysteelChemicalIndexCount(condition string, pars []interface{}) (count i
 }
 
 // GetMysteelChemicalIndexList 根据分类id获取钢联化工频度数据列表
-func GetMysteelChemicalIndexList(condition string, pars []interface{}, startSize, pageSize int) (items []*BaseFromMysteelChemicalIndex, err error) {
+func GetMysteelChemicalIndexList(condition string, pars []interface{}, startSize, pageSize int, orderDesc string) (items []*BaseFromMysteelChemicalIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM base_from_mysteel_chemical_index WHERE 1=1 `
 
 	if condition != "" {
 		sql += condition
 	}
-	sql += ` ORDER BY base_from_mysteel_chemical_index_id ASC LIMIT ?,? `
+
+	if orderDesc == `` {
+		orderDesc = ` ASC `
+	}
+	sql += ` ORDER BY base_from_mysteel_chemical_index_id `
+	sql += orderDesc
+	sql += ` LIMIT ?,? `
 	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+
 	return
 }
 
@@ -301,8 +308,42 @@ func GetMysteelChemicalIndexListGroupByUserId(edbIdList []string) (items []*Base
 	}
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM base_from_mysteel_chemical_index WHERE base_from_mysteel_chemical_index_id in (` + utils.GetOrmInReplace(num) + `) GROUP BY sys_user_id `
+	_, err = o.Raw(sql, edbIdList).QueryRows(&items)
 
+	return
+}
+
+// GetMysteelChemicalIndexListByIndexId
+// @Description: 根据指标id列表获取列表信息
+// @param edbIdList
+// @return items
+// @return err
+func GetMysteelChemicalIndexListByIndexId(edbIdList []string) (items []*BaseFromMysteelChemicalIndex, err error) {
+	num := len(edbIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_mysteel_chemical_index WHERE base_from_mysteel_chemical_index_id in (` + utils.GetOrmInReplace(num) + `) `
 	_, err = o.Raw(sql, edbIdList).QueryRows(&items)
+
+	return
+}
+
+// GetMysteelChemicalIndexListByUserId
+// @Description: 根据用户id列表获取列表信息
+// @param userIdList
+// @return items
+// @return err
+func GetMysteelChemicalIndexListByUserId(userIdList []int) (items []*BaseFromMysteelChemicalIndex, err error) {
+	num := len(userIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_mysteel_chemical_index WHERE sys_user_id in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, userIdList).QueryRows(&items)
+
 	return
 }
 
@@ -318,6 +359,26 @@ func ModifyMysteelChemicalIndexUserIdByCodeList(edbIdList []string, userId int,
 	return
 }
 
+// ModifyMysteelChemicalIndexUserIdByOldUserId
+// @Description: 根据旧用户id修改新用户id
+// @author: Roc
+// @datetime 2024-03-25 17:59:08
+// @param oldUserId int
+// @param userId int
+// @param userName string
+// @return err error
+func ModifyMysteelChemicalIndexUserIdByOldUserId(oldUserIdList []int, userId int, userName string) (err error) {
+	num := len(oldUserIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE base_from_mysteel_chemical_index SET sys_user_id=?,sys_user_real_name=? WHERE sys_user_id in (` + utils.GetOrmInReplace(num) + `)  `
+	_, err = o.Raw(sql, userId, userName, oldUserIdList).Exec()
+
+	return
+}
+
 // GetMysteelChemicalIndexAdminList 获取所有指标创建人
 func GetMysteelChemicalIndexAdminList() (list []int, err error) {
 	o := orm.NewOrmUsingDB("data")

+ 7 - 2
models/data_manage/response/predit_edb_info.go

@@ -19,15 +19,20 @@ type PredictEdbInfoListResp struct {
 
 // PredictEdbInfoDataResp 预测指标数据返回
 type PredictEdbInfoDataResp struct {
-	EdbInfo      *data_manage.EdbInfo
+	EdbInfo      *EdbInfoFull
 	Button       data_manage.EdbClassifyItemsButton
 	DataList     interface{}
 	ClassifyList []*data_manage.EdbClassifyIdItems `description:"父级分类列表"`
 }
 
+type EdbInfoFull struct {
+	*data_manage.EdbInfo
+	HaveOperaAuth bool `description:"是否有数据权限,默认:false"`
+}
+
 // PredictEdbInfo 预测指标详情
 type PredictEdbInfo struct {
-	data_manage.EdbInfo
+	*EdbInfoFull
 	RuleType       int                                   `description:"预测规则,1:最新,2:固定值,3:同比,4:同差,5:环比,6:环差,7:N期移动均值,8:N期段线性外推值"`
 	FixedValue     float64                               `description:"固定值"`
 	CalculateList  []*data_manage.EdbInfoCalculateDetail `description:"关联指标"`

+ 29 - 0
models/db.go

@@ -6,6 +6,7 @@ import (
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/data_manage/chart_theme"
 	"eta/eta_api/models/data_manage/cross_variety"
+	"eta/eta_api/models/data_manage/data_manage_permission"
 	"eta/eta_api/models/data_manage/edb_refresh"
 	"eta/eta_api/models/data_manage/excel"
 	future_good2 "eta/eta_api/models/data_manage/future_good"
@@ -190,6 +191,9 @@ func init() {
 	// 语音识别
 	initSpeechRecognition()
 
+	// 初始化数据资产权限的一些表
+	initDataMangePerMission()
+
 	// 初始化部分数据表变量(直接init会有顺序问题=_=!)
 	data_manage.InitEdbSourceVar()
 }
@@ -566,3 +570,28 @@ func initSpeechRecognition() {
 		new(speech_recognition.SpeechRecognitionTagMapping), // 语音识别-标签关联表
 	)
 }
+
+// initDataMangePerMission
+// @Description: 初始化数据资产权限的一些表
+// @author: Roc
+// @datetime 2024-03-27 14:03:11
+func initDataMangePerMission() {
+	orm.RegisterModel(
+		new(data_manage_permission.EdbInfoPermission),                       // 指标权限表
+		new(data_manage_permission.EdbClassifyPermission),                   // 指标分类权限表
+		new(data_manage_permission.ChartInfoPermission),                     // 图表权限表
+		new(data_manage_permission.ChartClassifyPermission),                 // 图表分类权限表
+		new(data_manage_permission.ExcelInfoPermission),                     // ETA表格权限表
+		new(data_manage_permission.ExcelClassifyPermission),                 // ETA表格分类权限表
+		new(data_manage_permission.DataPermissionMessage),                   // 数据权限变更消息表
+		new(data_manage_permission.DataPermissionMoveRecord),                // 数据资产转移记录表
+		new(data_manage_permission.EdbInfoPermissionNoAuthRecord),           // 指标资产数据未授权分类记录表
+		new(data_manage_permission.ChartInfoPermissionNoAuthRecord),         // 图表资产数据未授权分类记录表
+		new(data_manage_permission.ExcelInfoPermissionNoAuthRecord),         // ETA表格资产数据未授权分类记录表
+		new(data_manage_permission.EdbInfoClassifyPermissionNoAuthRecord),   // 指标资产分类数据未授权分类记录表
+		new(data_manage_permission.ChartInfoClassifyPermissionNoAuthRecord), // 图表资产分类数据未授权分类记录表
+		new(data_manage_permission.ExcelInfoClassifyPermissionNoAuthRecord), // ETA表格资产分类数据未授权分类记录表
+		new(data_manage_permission.DataPermissionClassifyNoAuthRecord),      // 资产分类数据权限未授权记录表
+		new(data_manage_permission.DataPermissionNoAuthRecord),              // 资产数据权限设置记录表
+	)
+}

+ 51 - 0
models/target.go

@@ -1433,6 +1433,38 @@ func GetEdbinfoListByCodeListGroupByUserId(edbCodeList []string) (items []*Edbin
 	return
 }
 
+// GetEdbinfoListByCodeListByCodeIdList
+// @Description: 根据指标code列表获取列表信息
+// @param edbCodeList
+// @return items
+// @return err
+func GetEdbinfoListByCodeListByCodeIdList(edbCodeList []string) (items []*Edbinfo, err error) {
+	num := len(edbCodeList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("edb")
+	sql := `SELECT * FROM edbinfo WHERE TRADE_CODE in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, edbCodeList).QueryRows(&items)
+	return
+}
+
+// GetEdbinfoListByCodeListByUserId
+// @Description: 根据用户id列表获取指标列表信息
+// @param userIdList
+// @return items
+// @return err
+func GetEdbinfoListByCodeListByUserId(userIdList []int) (items []*Edbinfo, err error) {
+	num := len(userIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("edb")
+	sql := `SELECT * FROM edbinfo WHERE user_id in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, userIdList).QueryRows(&items)
+	return
+}
+
 // ModifyEdbinfoUserIdByCodeList 根据指标code列表修改创建人
 func ModifyEdbinfoUserIdByCodeList(edbCodeList []string, userId int) (err error) {
 	num := len(edbCodeList)
@@ -1445,6 +1477,25 @@ func ModifyEdbinfoUserIdByCodeList(edbCodeList []string, userId int) (err error)
 	return
 }
 
+// ModifyEdbinfoUserIdByOldUserId
+// @Description:  根据旧用户id修改新用户id
+// @author: Roc
+// @datetime 2024-03-25 17:59:32
+// @param oldUserId int
+// @param userId int
+// @return err error
+func ModifyEdbinfoUserIdByOldUserId(oldUserIdList []int, userId int) (err error) {
+	num := len(oldUserIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("edb")
+	sql := `UPDATE edbinfo SET user_id=? WHERE user_id in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, userId, oldUserIdList).Exec()
+
+	return
+}
+
 func GetEdbInfoAdminList() (list []int, err error) {
 	sql := `SELECT user_id FROM edbinfo GROUP BY user_id `
 	o := orm.NewOrmUsingDB("edb")

+ 144 - 45
routers/commentsRouter.go

@@ -511,6 +511,141 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"],
+        beego.ControllerComments{
+            Method: "MoveAllEdbChartUser",
+            Router: `/edb_chart/all/change_user`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"],
+        beego.ControllerComments{
+            Method: "MoveEdbChartUser",
+            Router: `/edb_chart/change_user`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"],
+        beego.ControllerComments{
+            Method: "EdbChartClassifyList",
+            Router: `/edb_chart/classify`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"],
+        beego.ControllerComments{
+            Method: "SetPermissionEdbChartClassifyIsPermission",
+            Router: `/edb_chart/classify/permission/is_permission/set`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"],
+        beego.ControllerComments{
+            Method: "SetEdbChartClassifyPermission",
+            Router: `/edb_chart/classify/permission/set`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"],
+        beego.ControllerComments{
+            Method: "GetEdbChartClassifyPermission",
+            Router: `/edb_chart/classify/permission/show_by_user`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"],
+        beego.ControllerComments{
+            Method: "SecretEdbChartClassifyList",
+            Router: `/edb_chart/classify/secret`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"],
+        beego.ControllerComments{
+            Method: "MoveEdbChartCount",
+            Router: `/edb_chart/count`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"],
+        beego.ControllerComments{
+            Method: "MoveEdbChartList",
+            Router: `/edb_chart/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"],
+        beego.ControllerComments{
+            Method: "GetEdbChartNoPermission",
+            Router: `/edb_chart/no_classify_permission/show_by_data`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"],
+        beego.ControllerComments{
+            Method: "SetEdbChartPermission",
+            Router: `/edb_chart/permission/set`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"],
+        beego.ControllerComments{
+            Method: "GetEdbChartPermission",
+            Router: `/edb_chart/permission/show_by_data`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"],
+        beego.ControllerComments{
+            Method: "MessageDetail",
+            Router: `/message/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"],
+        beego.ControllerComments{
+            Method: "MessageList",
+            Router: `/message/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/data_manage_permission:DataMangePermissionController"],
+        beego.ControllerComments{
+            Method: "MessageRead",
+            Router: `/message/read`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/excel:CustomAnalysisController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/excel:CustomAnalysisController"],
         beego.ControllerComments{
             Method: "Add",
@@ -2815,33 +2950,6 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
-        beego.ControllerComments{
-            Method: "MoveEdbChartUser",
-            Router: `/edb_chart/change_user`,
-            AllowHTTPMethods: []string{"post"},
-            MethodParams: param.Make(),
-            Filters: nil,
-            Params: nil})
-
-    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
-        beego.ControllerComments{
-            Method: "EdbChartClassifyList",
-            Router: `/edb_chart/classify`,
-            AllowHTTPMethods: []string{"get"},
-            MethodParams: param.Make(),
-            Filters: nil,
-            Params: nil})
-
-    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
-        beego.ControllerComments{
-            Method: "MoveEdbChartList",
-            Router: `/edb_chart/list`,
-            AllowHTTPMethods: []string{"get"},
-            MethodParams: param.Make(),
-            Filters: nil,
-            Params: nil})
-
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
         beego.ControllerComments{
             Method: "QueryEdbDataTable",
@@ -4192,24 +4300,6 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:PredictEdbClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:PredictEdbClassifyController"],
-        beego.ControllerComments{
-            Method: "List",
-            Router: `/predict_classify/list`,
-            AllowHTTPMethods: []string{"get"},
-            MethodParams: param.Make(),
-            Filters: nil,
-            Params: nil})
-
-    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:PredictEdbClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:PredictEdbClassifyController"],
-        beego.ControllerComments{
-            Method: "ListV2",
-            Router: `/predict_classify/list/v2`,
-            AllowHTTPMethods: []string{"get"},
-            MethodParams: param.Make(),
-            Filters: nil,
-            Params: nil})
-
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:PredictEdbClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:PredictEdbClassifyController"],
         beego.ControllerComments{
             Method: "Move",
@@ -6694,6 +6784,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers:MessageController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:MessageController"],
+        beego.ControllerComments{
+            Method: "UnReadMessageNum",
+            Router: `/unread/num`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers:OutLinkController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:OutLinkController"],
         beego.ControllerComments{
             Method: "AllList",

+ 7 - 0
routers/router.go

@@ -13,6 +13,7 @@ import (
 	"eta/eta_api/controllers/data_manage"
 	"eta/eta_api/controllers/data_manage/correlation"
 	"eta/eta_api/controllers/data_manage/cross_variety"
+	"eta/eta_api/controllers/data_manage/data_manage_permission"
 	"eta/eta_api/controllers/data_manage/excel"
 	future_good2 "eta/eta_api/controllers/data_manage/future_good"
 	"eta/eta_api/controllers/data_manage/line_equation"
@@ -164,6 +165,7 @@ func init() {
 				&data_manage.BaseFromNationalStatisticsController{},
 				&data_manage.JiaYueEdbSourceController{},
 				&data_manage.ChartThemeController{},
+				&data_manage_permission.DataMangePermissionController{},
 			),
 		),
 		web.NSNamespace("/my_chart",
@@ -358,6 +360,11 @@ func init() {
 				&speech_recognition.SpeechRecognitionTagMenuController{},
 			),
 		),
+		web.NSNamespace("/message",
+			web.NSInclude(
+				&controllers.MessageController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 61 - 8
services/data/chart_classify.go

@@ -3,6 +3,7 @@ package data
 import (
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/system"
+	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/utils"
 	"fmt"
 	"strconv"
@@ -21,14 +22,16 @@ func chartClassifyHaveChild(allNode []*data_manage.ChartClassifyItems, node *dat
 	return
 }
 
-func ChartClassifyItemsMakeTree(sysUser *system.Admin, allNode []*data_manage.ChartClassifyItems, node *data_manage.ChartClassifyItems) {
-	button := GetChartClassifyOpButton(sysUser, node.SysUserId)
+func ChartClassifyItemsMakeTree(sysUser *system.Admin, allNode []*data_manage.ChartClassifyItems, node *data_manage.ChartClassifyItems, permissionClassifyIdList []int) {
+	node.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(node.IsJoinPermission, node.ChartClassifyId, permissionClassifyIdList)
+	button := GetChartClassifyOpButton(sysUser, node.SysUserId, node.HaveOperaAuth)
 	node.Button = button
 
 	childs, _ := chartClassifyHaveChild(allNode, node) //判断节点是否有子节点并返回
 	if len(childs) > 0 {
 		for _, child := range childs {
-			childButton := GetChartClassifyOpButton(sysUser, child.SysUserId)
+			child.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(child.IsJoinPermission, child.ChartClassifyId, permissionClassifyIdList)
+			childButton := GetChartClassifyOpButton(sysUser, child.SysUserId, child.HaveOperaAuth)
 			if child.Level == 3 {
 				childButton.AddButton = false //第三级的话,默认图表都是没有添加按钮的
 			}
@@ -36,10 +39,12 @@ func ChartClassifyItemsMakeTree(sysUser *system.Admin, allNode []*data_manage.Ch
 			//node.Children = append(node.Children, child)
 		}
 		node.Children = append(node.Children, childs[0:]...) //添加子节点
-		for _, v := range childs {                           //查询子节点的子节点,并添加到子节点
+		for _, v := range childs {
+			v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ChartClassifyId, permissionClassifyIdList)
+			//查询子节点的子节点,并添加到子节点
 			_, has := chartClassifyHaveChild(allNode, v)
 			if has {
-				ChartClassifyItemsMakeTree(sysUser, allNode, v) //递归添加节点
+				ChartClassifyItemsMakeTree(sysUser, allNode, v, permissionClassifyIdList) //递归添加节点
 			} else {
 				childrenArr := make([]*data_manage.ChartClassifyItems, 0)
 				v.Children = childrenArr
@@ -107,7 +112,12 @@ func FixChartClassifySysUserId() {
 }
 
 // GetChartClassifyOpButton 获取ETA图库分类的操作权限
-func GetChartClassifyOpButton(sysUser *system.Admin, belongUserId int) (button data_manage.ChartClassifyItemsButton) {
+func GetChartClassifyOpButton(sysUser *system.Admin, belongUserId int, haveOperaAuth bool) (button data_manage.ChartClassifyItemsButton) {
+	// 没有数据权限就直接返回
+	if !haveOperaAuth {
+		return
+	}
+
 	//ficc管理员和超管和ficc研究员有权限创建和管理分类,可以编辑分类名称(分类名称不允许重复),可以拖动分类,改变分类顺序,可以拖动分类下模型,改变顺序,可以删除分类,若分类下有预测指标,则不允许删除;
 	//if utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RESEARCHR, utils.ROLE_TYPE_CODE_FICC_RESEARCHR}, sysUser.RoleTypeCode) {
 	button.AddButton = true
@@ -130,7 +140,11 @@ func GetCanOpChartClassify(roleTypeCode string) (canOpClassify bool) {
 }
 
 // GetChartOpButton 获取ETA图库的操作权限
-func GetChartOpButton(sysUser *system.Admin, belongUserId int) (button data_manage.ChartClassifyItemsButton) {
+func GetChartOpButton(sysUser *system.Admin, belongUserId int, haveOperaAuth bool) (button data_manage.ChartClassifyItemsButton) {
+	// 数据权限判断
+	if !haveOperaAuth {
+		return
+	}
 	//预测指标的添加人对该预测指标有全部操作权限,ficc管理员、超管对所有预测指标有全部操作权限;
 	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN || sysUser.AdminId == belongUserId || sysUser.PredictEdbPermission == 1 {
 		button.AddButton = true
@@ -143,7 +157,9 @@ func GetChartOpButton(sysUser *system.Admin, belongUserId int) (button data_mana
 }
 
 // HandleNoPermissionChart 图表列表返回,将没有权限的图表移除
-func HandleNoPermissionChart(allNodes []*data_manage.ChartClassifyItems, noPermissionChartIdMap map[int]bool) (newAllNodes []*data_manage.ChartClassifyItems) {
+func HandleNoPermissionChart(allNodes []*data_manage.ChartClassifyItems, noPermissionChartIdMap map[int]bool, sysUserId int) (newAllNodes []*data_manage.ChartClassifyItems) {
+	// 涉及分类id
+	classifyIdList := make([]int, 0)
 	// 移除没有权限的图表
 	newAllNodes = make([]*data_manage.ChartClassifyItems, 0)
 	for _, node := range allNodes {
@@ -158,11 +174,48 @@ func HandleNoPermissionChart(allNodes []*data_manage.ChartClassifyItems, noPermi
 					continue
 				}
 				tmpNodeList = append(tmpNodeList, chartInfo)
+				classifyIdList = append(classifyIdList, chartInfo.ChartClassifyId)
 			}
 		}
 
 		tmpNodeInfo.Children = tmpNodeList
 		newAllNodes = append(newAllNodes, &tmpNodeInfo)
+		classifyIdList = append(classifyIdList, node.ChartClassifyId)
+	}
+
+	// 数据权限
+	if len(classifyIdList) > 0 {
+		// 图表分类
+		chartClassifyList, err := data_manage.GetChartClassifyByIdList(classifyIdList)
+		if err != nil {
+			return
+		}
+
+		chartClassifyMap := make(map[int]*data_manage.ChartClassify)
+		for _, v := range chartClassifyList {
+			chartClassifyMap[v.ChartClassifyId] = v
+		}
+
+		// 已授权分类id
+		permissionChartIdList, permissionClassifyIdList, err := data_manage_permission.GetUserChartAndClassifyPermissionList(sysUserId, 0, 0)
+		if err != nil {
+			return
+		}
+
+		for _, node := range newAllNodes {
+			if node.Children != nil {
+				for _, chartInfo := range node.Children {
+					if currClassify, ok := chartClassifyMap[chartInfo.ChartClassifyId]; ok {
+						chartInfo.HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(chartInfo.IsJoinPermission, currClassify.IsJoinPermission, chartInfo.ChartInfoId, chartInfo.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
+					}
+				}
+			}
+
+			if currClassify, ok := chartClassifyMap[node.ChartClassifyId]; ok {
+				node.HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(node.IsJoinPermission, currClassify.IsJoinPermission, node.ChartInfoId, node.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
+			}
+
+		}
 	}
 
 	return

+ 24 - 2
services/data/chart_info.go

@@ -8,6 +8,7 @@ import (
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/alarm_msg"
+	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/shopspring/decimal"
@@ -273,7 +274,11 @@ func GetChartInfoDataKey(chartInfoId int) string {
 }
 
 // CheckOpChartPermission 判断图表操作权限
-func CheckOpChartPermission(sysUser *system.Admin, createUserId int) (ok bool) {
+func CheckOpChartPermission(sysUser *system.Admin, createUserId int, haveOperaAuth bool) (ok bool) {
+	// 没有数据权限,那么直接返回
+	if !haveOperaAuth {
+		return
+	}
 	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
 		ok = true
 	}
@@ -470,6 +475,7 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 		item.ConvertValue = v.ConvertValue
 		item.ConvertUnit = v.ConvertUnit
 		item.ConvertEnUnit = v.ConvertEnUnit
+		item.IsJoinPermission = v.IsJoinPermission
 
 		var startDateReal string
 		var diffSeconds int64
@@ -2427,8 +2433,24 @@ func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin) (cha
 	}
 	req.ExtraConfig = extraConfig
 
+	// 权限
+	var haveOperaAuth bool
+	{
+		// 已授权分类id
+		permissionChartIdList, permissionClassifyIdList, tmpErr := data_manage_permission.GetUserChartAndClassifyPermissionList(sysUser.AdminId, chartItem.ChartInfoId, chartItem.ChartClassifyId)
+		if tmpErr != nil {
+			if errMsg == `` {
+				errMsg = "获取失败!"
+			}
+			err = errors.New("获取已授权分类id数据失败,Err:" + tmpErr.Error())
+			return
+		}
+		haveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(chartItem.IsJoinPermission, chartClassify.IsJoinPermission, chartItem.ChartInfoId, chartItem.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
+
+	}
+
 	//图表操作权限
-	ok := CheckOpChartPermission(sysUser, chartItem.SysUserId)
+	ok := CheckOpChartPermission(sysUser, chartItem.SysUserId, haveOperaAuth)
 	if !ok {
 		errMsg = "没有该图表的操作权限"
 		err = errors.New(errMsg)

+ 1 - 1
services/data/correlation/chart_info.go

@@ -1003,7 +1003,7 @@ func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin) (cha
 	}
 
 	// 图表操作权限
-	ok := data.CheckOpChartPermission(sysUser, chartItem.SysUserId)
+	ok := data.CheckOpChartPermission(sysUser, chartItem.SysUserId, true)
 	if !ok {
 		errMsg = "没有该图表的操作权限"
 		err = errors.New(errMsg)

+ 1 - 1
services/data/cross_variety/chart.go

@@ -852,7 +852,7 @@ func EditChartInfo(req request.EditChartReq, sysUser *system.Admin) (chartItem *
 	}
 
 	// 图表操作权限
-	ok := data.CheckOpChartPermission(sysUser, chartItem.SysUserId)
+	ok := data.CheckOpChartPermission(sysUser, chartItem.SysUserId, true)
 	if !ok {
 		errMsg = "没有该图表的操作权限"
 		err = errors.New(errMsg)

+ 155 - 0
services/data/data_manage_permission/chart.go

@@ -0,0 +1,155 @@
+package data_manage_permission
+
+import (
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_manage/data_manage_permission"
+	"eta/eta_api/utils"
+	"fmt"
+)
+
+// CheckChartPermissionByPermissionIdList
+// @Description: 检查ETA图库(只包含ETA图库,不包含统计分析等模块)权限
+// @author: Roc
+// @datetime 2024-03-28 16:12:08
+// @param chartIsJoinPermission int
+// @param chartClassifyIsJoinPermission int
+// @param chartInfoId int
+// @param chartClassifyId int
+// @param permissionChartInfoIdList []int
+// @param permissionChartClassifyIdList []int
+// @return hasAuth bool
+func CheckChartPermissionByPermissionIdList(chartIsJoinPermission, chartClassifyIsJoinPermission, chartInfoId, chartClassifyId int, permissionChartInfoIdList, permissionChartClassifyIdList []int) (hasAuth bool) {
+	//hasAuth = true
+
+	// 判断 分类是否纳入权限管控
+	if chartClassifyIsJoinPermission == 1 {
+		// 不属于已授权的分类,那么就无权限
+		if !utils.InArrayByInt(permissionChartClassifyIdList, chartClassifyId) {
+			return false
+		}
+	}
+
+	// 判断 指标是否纳入权限管控
+	if chartIsJoinPermission == 1 {
+		// 不属于已授权的指标,那么就无权限
+		if !utils.InArrayByInt(permissionChartInfoIdList, chartInfoId) {
+			return false
+		}
+	}
+
+	hasAuth = true
+
+	return
+}
+
+// CheckChartClassifyPermissionByPermissionIdList
+// @Description: 检查EDB分类权限
+// @author: Roc
+// @datetime 2024-03-29 14:35:19
+// @param chartClassifyIsJoinPermission int
+// @param chartClassifyId int
+// @param permissionChartClassifyIdList []int
+// @return hasAuth bool
+func CheckChartClassifyPermissionByPermissionIdList(chartClassifyIsJoinPermission, chartClassifyId int, permissionChartClassifyIdList []int) (hasAuth bool) {
+	// 判断 分类是否纳入权限管控
+	if chartClassifyIsJoinPermission == 1 {
+		// 不属于已授权的分类,那么就无权限
+		if !utils.InArrayByInt(permissionChartClassifyIdList, chartClassifyId) {
+			return
+		}
+	}
+
+	hasAuth = true
+
+	return
+}
+
+// GetUserChartAndClassifyPermissionList
+// @Description: 根据用户获取已经授权指标ID列表和指标分类ID列表
+// @author: Roc
+// @datetime 2024-03-28 17:20:36
+// @param userId int
+// @param chartInfoId int 如果传递了chartInfoId,则只返回该chartInfoId的权限列表(其实也就是为了判断是否存在该指标权限了,目的是为了少获取数据)
+// @param classifyId int  classifyId,则只返回该classifyId的权限列表(其实也就是为了判断是否存在该指标分类权限了,目的是为了少获取数据)
+// @return chartIdList []int
+// @return classifyIdList []int
+// @return err error
+func GetUserChartAndClassifyPermissionList(userId, chartInfoId, classifyId int) (chartIdList, classifyIdList []int, err error) {
+	// 获取有权限的指标ID列表
+	chartIdList, err = data_manage_permission.GetPermissionChartIdList(userId, chartInfoId)
+	if err != nil {
+		fmt.Println("获取授权指标列表失败, err:", err)
+		return
+	}
+
+	// 获取有权限的指标分类ID列表
+	classifyIdList, err = data_manage_permission.GetPermissionChartClassifyIdList(userId, classifyId)
+	if err != nil {
+		fmt.Println("获取授权指标分类列表失败, err:", err)
+		return
+	}
+
+	return
+}
+
+// GetUserChartClassifyPermissionList
+// @Description: 根据用户获取已经授权指标分类ID列表
+// @author: Roc
+// @datetime 2024-03-28 17:20:36
+// @param userId int
+// @param classifyId int  classifyId,则只返回该classifyId的权限列表(其实也就是为了判断是否存在该指标分类权限了,目的是为了少获取数据)
+// @return classifyIdList []int
+// @return err error
+func GetUserChartClassifyPermissionList(userId, classifyId int) (classifyIdList []int, err error) {
+	// 获取有权限的指标分类ID列表
+	classifyIdList, err = data_manage_permission.GetPermissionChartClassifyIdList(userId, classifyId)
+	if err != nil {
+		fmt.Println("获取授权指标分类列表失败, err:", err)
+		return
+	}
+
+	return
+}
+
+// CheckChartPermissionByChartInfoId
+// @Description: 根据指标id和指标分类id,检查EDB指标(含预测指标)权限(方法内部自己获取所有的指标和指标分类权限,不用额外传递)
+// @author: Roc
+// @datetime 2024-03-29 13:28:06
+// @param chartInfoId int
+// @param chartClassifyId int
+// @param chartIsJoinPermission int
+// @param userId int
+// @return hasAuth bool
+// @return err error
+func CheckChartPermissionByChartInfoId(chartInfoId, chartClassifyId, chartIsJoinPermission, userId int) (hasAuth bool, err error) {
+	currClassify, err := data_manage.GetChartClassifyById(chartClassifyId)
+	if err != nil {
+		return
+	}
+	if currClassify != nil {
+		return CheckChartPermission(chartIsJoinPermission, currClassify.IsJoinPermission, userId, chartInfoId, chartClassifyId)
+	}
+
+	return
+}
+
+// CheckChartPermission
+// @Description: 检查EDB指标(含预测指标)权限(方法内部自己获取所有的指标和指标分类权限,不用额外传递)
+// @author: Roc
+// @datetime 2024-03-28 16:12:08
+// @param chartIsJoinPermission int
+// @param chartClassifyIsJoinPermission int
+// @param chartInfoId int
+// @param chartClassifyId int
+// @return hasAuth bool
+func CheckChartPermission(chartIsJoinPermission, chartClassifyIsJoinPermission, userId, chartInfoId, chartClassifyId int) (hasAuth bool, err error) {
+	chartIdList, classifyIdList, err := GetUserChartAndClassifyPermissionList(userId, chartInfoId, chartClassifyId)
+	if err != nil {
+		fmt.Println("GetUserChartAndClassifyPermissionList err:", err)
+		return
+	}
+
+	hasAuth = CheckChartPermissionByPermissionIdList(chartIsJoinPermission, chartClassifyIsJoinPermission, chartInfoId, chartClassifyId, chartIdList, classifyIdList)
+
+	return
+}

+ 1365 - 0
services/data/data_manage_permission/data_move.go

@@ -0,0 +1,1365 @@
+package data_manage_permission
+
+import (
+	"encoding/json"
+	"eta/eta_api/models"
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_manage/data_manage_permission"
+	"eta/eta_api/models/data_manage/excel"
+	"eta/eta_api/models/system"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/uuid"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// GetEdbChartClassifyList
+// @Description: 获取数据权限那边的分类列表
+// @author: Roc
+// @datetime 2024-04-01 09:46:29
+// @param source int
+// @param subSource int
+// @return resp data_manage.EdbChartClassifyResp
+// @return err error
+func GetEdbChartClassifyList(source, subSource int) (resp data_manage.EdbChartClassifyResp, err error) {
+	switch source {
+	case 1: //手工数据指标
+		list, e := models.GetEdbdataClassify(0)
+		if e != nil {
+			err = e
+			return
+		}
+
+		for _, v := range list {
+			item := data_manage.EdbChartClassify{
+				ClassifyId:   v.ClassifyId,
+				ClassifyName: v.ClassifyName,
+				ParentId:     v.ParentId,
+			}
+			for _, v2 := range v.Child {
+				child := data_manage.EdbChartClassify{
+					ClassifyId:   v2.ClassifyId,
+					ClassifyName: v2.ClassifyName,
+					ParentId:     v2.ParentId,
+				}
+				item.Child = append(item.Child, &child)
+			}
+			resp.List = append(resp.List, &item)
+		}
+
+	case 2: //钢联化工数据库
+		rootList, e := data_manage.GetBaseFromMysteelChemicalClassifyByParentId(0)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = e
+			return
+		}
+
+		classifyAll, e := data_manage.GetAllBaseFromMysteelChemicalClassify()
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = e
+			return
+		}
+
+		rootChildMap := make(map[int][]*data_manage.BaseFromMysteelChemicalClassifyItems)
+		for _, v := range classifyAll {
+			rootChildMap[v.ParentId] = append(rootChildMap[v.ParentId], v)
+		}
+		nodeAll := make([]*data_manage.BaseFromMysteelChemicalClassifyItems, 0)
+
+		for _, v := range rootList {
+			if existItems, ok := rootChildMap[v.BaseFromMysteelChemicalClassifyId]; ok {
+				v.Children = existItems
+			} else {
+				items := make([]*data_manage.BaseFromMysteelChemicalClassifyItems, 0)
+				v.Children = items
+			}
+			nodeAll = append(nodeAll, v)
+		}
+
+		for _, v := range nodeAll {
+			item := data_manage.EdbChartClassify{
+				ClassifyId:   v.BaseFromMysteelChemicalClassifyId,
+				ClassifyName: v.ClassifyName,
+				ParentId:     v.ParentId,
+			}
+			for _, v2 := range v.Children {
+				child := data_manage.EdbChartClassify{
+					ClassifyId:   v2.BaseFromMysteelChemicalClassifyId,
+					ClassifyName: v2.ClassifyName,
+					ParentId:     v2.ParentId,
+				}
+				item.Child = append(item.Child, &child)
+			}
+			resp.List = append(resp.List, &item)
+		}
+
+	case 3:
+		//ETA指标库
+		//rootList, e := data_manage.GetEdbClassifyByParentId(0, 0)
+		//if e != nil && e.Error() != utils.ErrNoRow() {
+		//	err = e
+		//	return
+		//}
+
+		// 考虑到后面可以会迭代到10层, 这里直接用递归处理
+		classifyAll, e := data_manage.GetAllEdbClassifyByType(0)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = e
+			return
+		}
+		resp.List = GetEdbMenuTreeRecursive(classifyAll, 0)
+
+	case 4:
+		//ETA预测指标
+		// 考虑到后面可以会迭代到10层, 这里直接用递归
+		classifyAll, e := data_manage.GetAllEdbClassifyByType(1)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = e
+			return
+		}
+		resp.List = GetEdbMenuTreeRecursive(classifyAll, 0)
+	case 5: //图库
+		// 考虑到后面可以会迭代到10层, 这里直接用递归处理
+		classifyAll, e := data_manage.GetAllChartClassifyItemsBySource(1)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = e
+			return
+		}
+		resp.List = GetChartMenuTreeRecursive(classifyAll, 0)
+
+	// 将数据加入缓存
+	//if utils.Re == nil {
+	//	utils.Rc.Delete(key)
+	//}
+	case 6:
+		// ETA表格
+		// 考虑到后面可以会迭代到10层, 这里直接用递归处理
+		classifyAll, e := excel.GetExcelClassifyBySourceOrderByLevel(subSource)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = e
+			return
+		}
+		resp.List = GetExcelMenuTreeRecursive(classifyAll, 0)
+	default:
+		return
+	}
+
+	return
+}
+
+// GetEdbMenuTreeRecursive 递归指标库菜单树
+func GetEdbMenuTreeRecursive(list []*data_manage.EdbClassifyItems, parentId int) []*data_manage.EdbChartClassify {
+	res := make([]*data_manage.EdbChartClassify, 0)
+	for _, v := range list {
+		t := new(data_manage.EdbChartClassify)
+		t.ClassifyId = v.ClassifyId
+		t.ClassifyName = v.ClassifyName
+		t.ParentId = v.ParentId
+		t.IsJoinPermission = v.IsJoinPermission
+		if v.ParentId == parentId {
+			t.Child = GetEdbMenuTreeRecursive(list, v.ClassifyId)
+			res = append(res, t)
+		}
+	}
+	return res
+}
+
+// GetChartMenuTreeRecursive 递归指标库菜单树
+func GetChartMenuTreeRecursive(list []*data_manage.ChartClassifyItems, parentId int) []*data_manage.EdbChartClassify {
+	res := make([]*data_manage.EdbChartClassify, 0)
+	for _, v := range list {
+		t := new(data_manage.EdbChartClassify)
+		t.ClassifyId = v.ChartClassifyId
+		t.ClassifyName = v.ChartClassifyName
+		t.ParentId = v.ParentId
+		t.IsJoinPermission = v.IsJoinPermission
+		if v.ParentId == parentId {
+			t.Child = GetChartMenuTreeRecursive(list, v.ChartClassifyId)
+			res = append(res, t)
+		}
+	}
+	return res
+}
+
+// GetExcelMenuTreeRecursive
+// @Description: 递归ETA表格菜单树
+// @author: Roc
+// @datetime 2024-03-27 10:30:32
+// @param list []*data_manage.ChartClassifyItems
+// @param parentId int
+// @return []*data_manage.EdbChartClassify
+func GetExcelMenuTreeRecursive(list []*excel.ExcelClassifyItems, parentId int) []*data_manage.EdbChartClassify {
+	res := make([]*data_manage.EdbChartClassify, 0)
+	for _, v := range list {
+		t := new(data_manage.EdbChartClassify)
+		t.ClassifyId = v.ExcelClassifyId
+		t.ClassifyName = v.ExcelClassifyName
+		t.ParentId = v.ParentId
+		t.IsJoinPermission = v.IsJoinPermission
+		if v.ParentId == parentId {
+			t.Child = GetExcelMenuTreeRecursive(list, v.ExcelClassifyId)
+			res = append(res, t)
+		}
+	}
+	return res
+}
+
+// GetMoveEdbChartList 获取待转移的指标/图表列表
+// @param source 来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格
+func GetMoveEdbChartList(source, subSource, userId int, keyword, classify string, startSize, pageSize int) (list []data_manage.MoveEdbChartList, total int, err error) {
+	var condition string
+	var pars []interface{}
+	switch source {
+	case 1: //手工数据指标
+		if keyword != "" {
+			condition += ` AND (a.SEC_NAME LIKE ? OR a.TRADE_CODE like ? ) `
+			pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+		}
+		if userId > 0 {
+			condition += ` AND a.user_id = ? `
+			pars = append(pars, userId)
+		}
+
+		if classify != "" {
+			condition += ` AND a.classify_id IN (` + classify + `) `
+		}
+
+		total, err = models.GetEdbinfoListCount(condition, pars, "", 0)
+		if err != nil {
+			return
+		}
+		tmpList, tmpErr := models.GetEdbinfoList(condition, pars, startSize, pageSize, "", 0)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		if len(tmpList) > 0 {
+			adminIdList := make([]int, 0)
+			for _, v := range tmpList {
+				adminIdList = append(adminIdList, v.UserId)
+			}
+			adminList, tmpErr := system.GetAdminListByIdListWithoutEnable(adminIdList)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			adminMap := make(map[int]string)
+			for _, adminInfo := range adminList {
+				adminMap[adminInfo.AdminId] = adminInfo.RealName
+			}
+
+			for _, v := range tmpList {
+				list = append(list, data_manage.MoveEdbChartList{
+					DataId:         v.TradeCode,
+					Code:           v.TradeCode,
+					Name:           v.SecName,
+					ClassifyName:   v.ClassifyName,
+					CreateUserId:   v.UserId,
+					CreateUserName: adminMap[v.UserId],
+				})
+			}
+		}
+
+	case 2: //钢联化工数据库
+		if keyword != `` {
+			condition += " AND (index_name like ? OR index_code like ? OR sys_user_real_name like ? ) "
+			pars = utils.GetLikeKeywordPars(pars, keyword, 3)
+		}
+		if userId > 0 {
+			condition += ` AND sys_user_id = ? `
+			pars = append(pars, userId)
+		}
+
+		if classify != "" {
+			condition += ` AND base_from_mysteel_chemical_classify_id IN (` + classify + `) `
+		}
+
+		total, err = data_manage.GetMysteelChemicalIndexCount(condition, pars)
+		if err != nil {
+			return
+		}
+		tmpList, tmpErr := data_manage.GetMysteelChemicalIndexList(condition, pars, startSize, pageSize, "DESC")
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		for _, v := range tmpList {
+			list = append(list, data_manage.MoveEdbChartList{
+				DataId: strconv.Itoa(v.BaseFromMysteelChemicalIndexId),
+				Code:   v.IndexCode,
+				Name:   v.IndexName,
+				//ClassifyName: v.,
+				CreateUserId:   v.SysUserId,
+				CreateUserName: v.SysUserRealName,
+			})
+		}
+	case 3, 4: //ETA指标库、ETA预测指标
+		if keyword != `` {
+			condition += " AND (edb_code like ? OR edb_name like ? OR sys_user_real_name like ? ) "
+			pars = utils.GetLikeKeywordPars(pars, keyword, 3)
+		}
+		if userId > 0 {
+			condition += ` AND sys_user_id = ? `
+			pars = append(pars, userId)
+		}
+		if classify != "" {
+			condition += ` AND classify_id IN (` + classify + `) `
+		}
+
+		edbInfoType := 0 //ETA指标库
+		if source == 4 { //ETA预测指标
+			edbInfoType = 1
+		}
+		condition += ` AND edb_info_type = ? `
+		pars = append(pars, edbInfoType)
+
+		total, err = data_manage.GetEdbInfoByConditionCount(condition, pars)
+		if err != nil {
+			return
+		}
+		tmpList, tmpErr := data_manage.GetEdbInfoListByCondition(condition, pars, startSize, pageSize, "DESC")
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		for _, v := range tmpList {
+			list = append(list, data_manage.MoveEdbChartList{
+				DataId: strconv.Itoa(v.EdbInfoId),
+				Code:   v.EdbCode,
+				Name:   v.EdbName,
+				//ClassifyName: v.,
+				CreateUserId:   v.SysUserId,
+				CreateUserName: v.SysUserRealName,
+			})
+		}
+	case 5: //图库
+
+		// 只展示eta图库
+		condition += ` AND source = ? `
+		pars = append(pars, utils.CHART_SOURCE_DEFAULT)
+
+		// 关键字搜索
+		if keyword != `` {
+			condition += " AND (chart_name like ?  OR sys_user_real_name like ? ) "
+			pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+		}
+		if userId > 0 {
+			condition += ` AND sys_user_id = ? `
+			pars = append(pars, userId)
+		}
+		if classify != "" {
+			condition += ` AND chart_classify_id IN (` + classify + `) `
+		}
+
+		total, err = data_manage.GetChartInfoCountByCondition(condition, pars)
+		if err != nil {
+			return
+		}
+		tmpList, tmpErr := data_manage.GetChartInfoListByCondition(condition, pars, startSize, pageSize)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		// 获取所有的图表分类
+		firstClassifyList, tmpErr := data_manage.GetChartClassifyByParentId(0, 1)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		firstClassifyNameMap := make(map[int]string)
+		for _, v := range firstClassifyList {
+			firstClassifyNameMap[v.ChartClassifyId] = v.ChartClassifyName
+		}
+		secondClassList, tmpErr := data_manage.GetChartClassifyAll(1)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		secondClassifyNameMap := make(map[int]string)
+		for _, v := range secondClassList {
+			firstName := firstClassifyNameMap[v.ParentId]
+			if firstName != `` {
+				firstName = firstName + " / "
+			}
+			secondClassifyNameMap[v.ChartClassifyId] = firstName + v.ChartClassifyName
+		}
+
+		for _, v := range tmpList {
+			list = append(list, data_manage.MoveEdbChartList{
+				DataId:         strconv.Itoa(v.ChartInfoId),
+				Name:           v.ChartName,
+				ClassifyName:   secondClassifyNameMap[v.ChartClassifyId],
+				CreateUserId:   v.SysUserId,
+				CreateUserName: v.SysUserRealName,
+			})
+		}
+	case 6: //ETA表格
+		if keyword != `` {
+			condition += " AND (excel_name like ?  OR sys_user_real_name like ? ) "
+			pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+		}
+		if userId > 0 {
+			condition += ` AND sys_user_id = ? `
+			pars = append(pars, userId)
+		}
+		if classify != "" {
+			condition += ` AND excel_classify_id IN (` + classify + `) `
+		}
+
+		condition += " AND source = ? "
+		pars = append(pars, subSource)
+
+		total, err = excel.GetExcelInfoCountByCondition(condition, pars)
+		if err != nil {
+			return
+		}
+		tmpList, tmpErr := excel.GetNoContentExcelInfoListByCondition(condition, pars, startSize, pageSize)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		// 获取所有的图表分类
+		firstClassifyList, tmpErr := excel.GetExcelClassifyByParentId(0, subSource)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		firstClassifyNameMap := make(map[int]string)
+		for _, v := range firstClassifyList {
+			firstClassifyNameMap[v.ExcelClassifyId] = v.ExcelClassifyName
+		}
+		secondClassList, tmpErr := excel.GetExcelClassifyBySource(subSource)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		secondClassifyNameMap := make(map[int]string)
+		for _, v := range secondClassList {
+			firstName := firstClassifyNameMap[v.ParentId]
+			if firstName != `` {
+				firstName = firstName + " / "
+			}
+			secondClassifyNameMap[v.ExcelClassifyId] = firstName + v.ExcelClassifyName
+		}
+
+		for _, v := range tmpList {
+			list = append(list, data_manage.MoveEdbChartList{
+				DataId:         strconv.Itoa(v.ExcelInfoId),
+				Name:           v.ExcelClassifyName,
+				ClassifyName:   secondClassifyNameMap[v.ExcelClassifyId],
+				CreateUserId:   v.SysUserId,
+				CreateUserName: v.SysUserRealName,
+			})
+		}
+	default:
+		return
+	}
+
+	return
+}
+
+// MoveEdbChart 转移指标/图表创建人
+// @param source 来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格
+func MoveEdbChart(source, subSource, oldUserId, newUserId int, isSelectAll bool, dataId, noDataId []string, keyword, classify string, opUserId int) (err error, errMsg string) {
+	adminInfo, err := system.GetSysAdminById(newUserId)
+	if err != nil {
+		return
+	}
+
+	// 如果勾选全部数据,那么
+	if isSelectAll {
+		// 找出不要的指标ID列表
+		noDataIdMap := make(map[string]string, 0)
+		for _, v := range noDataId {
+			noDataIdMap[v] = v
+		}
+
+		// 需要转义的指标/图表ID列表
+		dataId = make([]string, 0)
+		// 获取所有指标/图表
+		list, _, tmpErr := GetMoveEdbChartList(source, subSource, oldUserId, keyword, classify, 0, 100000)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range list {
+			if _, ok := noDataIdMap[v.DataId]; !ok {
+				dataId = append(dataId, v.DataId)
+			}
+		}
+	}
+
+	// 操作记录
+	dataPermissionMoveRecordList := make([]*data_manage_permission.DataPermissionMoveRecord, 0)
+	uniqueCode := uuid.NewUUID().Hex32()
+	title := `资产转移`
+	content := `资产转入`
+
+	switch source {
+	case 1: //手工数据指标
+		content += `(手工指标数据)`
+		tmpList, tmpErr := models.GetEdbinfoListByCodeListByCodeIdList(dataId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		if len(tmpList) > 0 {
+			for _, v := range tmpList {
+				//if v.UserId == newUserId {
+				//	errMsg = "新创建人不可和原创建人一致"
+				//	err = errors.New(errMsg)
+				//	return
+				//}
+
+				// 操作记录
+				dataPermissionMoveRecordList = append(dataPermissionMoveRecordList, &data_manage_permission.DataPermissionMoveRecord{
+					DataPermissionMoveRecordId: 0,
+					Source:                     int32(source),
+					SubSource:                  int32(subSource),
+					OpUniqueCode:               uniqueCode,
+					DataId:                     v.TradeCode,
+					DataCode:                   v.TradeCode,
+					DataName:                   v.SecName,
+					OriginalUserId:             int32(v.UserId),
+					OriginalUserName:           v.UserName,
+					NewUserId:                  int32(adminInfo.AdminId),
+					NewUserName:                adminInfo.RealName,
+					CreateTime:                 time.Now(),
+				})
+			}
+			// 修改创建人
+			err = models.ModifyEdbinfoUserIdByCodeList(dataId, newUserId)
+		}
+
+	case 2: //钢联化工数据库
+		content += `(钢联化工数据库)`
+		tmpList, tmpErr := data_manage.GetMysteelChemicalIndexListByIndexId(dataId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		if len(tmpList) > 0 {
+			for _, v := range tmpList {
+				//if v.SysUserId == newUserId {
+				//	errMsg = "新创建人不可和原创建人一致"
+				//	err = errors.New(errMsg)
+				//	return
+				//}
+				// 操作记录
+				dataPermissionMoveRecordList = append(dataPermissionMoveRecordList, &data_manage_permission.DataPermissionMoveRecord{
+					DataPermissionMoveRecordId: 0,
+					Source:                     int32(source),
+					SubSource:                  int32(subSource),
+					OpUniqueCode:               uniqueCode,
+					DataId:                     fmt.Sprint(v.BaseFromMysteelChemicalIndexId),
+					DataCode:                   v.IndexCode,
+					DataName:                   v.IndexName,
+					OriginalUserId:             int32(v.SysUserId),
+					OriginalUserName:           v.SysUserRealName,
+					NewUserId:                  int32(adminInfo.AdminId),
+					NewUserName:                adminInfo.RealName,
+					CreateTime:                 time.Now(),
+				})
+			}
+			// 修改创建人
+			err = data_manage.ModifyMysteelChemicalIndexUserIdByCodeList(dataId, adminInfo.AdminId, adminInfo.RealName)
+		}
+
+	case 3, 4: //ETA指标库、ETA预测指标
+		if source == 3 {
+			content += `(ETA指标库)`
+		} else {
+			content += `(ETA预测指标)`
+		}
+		tmpList, tmpErr := data_manage.GetEdbInfoListByEdbInfoId(dataId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		if len(tmpList) > 0 {
+			for _, v := range tmpList {
+				//if v.SysUserId == newUserId {
+				//	errMsg = "新创建人不可和原创建人一致"
+				//	err = errors.New(errMsg)
+				//	return
+				//}
+				// 操作记录
+				dataPermissionMoveRecordList = append(dataPermissionMoveRecordList, &data_manage_permission.DataPermissionMoveRecord{
+					DataPermissionMoveRecordId: 0,
+					Source:                     int32(source),
+					SubSource:                  int32(subSource),
+					OpUniqueCode:               uniqueCode,
+					DataId:                     fmt.Sprint(v.EdbInfoId),
+					DataCode:                   v.EdbCode,
+					DataName:                   v.EdbName,
+					OriginalUserId:             int32(v.SysUserId),
+					OriginalUserName:           v.SysUserRealName,
+					NewUserId:                  int32(adminInfo.AdminId),
+					NewUserName:                adminInfo.RealName,
+					CreateTime:                 time.Now(),
+				})
+			}
+			// 修改创建人
+			err = data_manage.ModifyEdbInfoUserIdByCodeList(dataId, adminInfo.AdminId, adminInfo.RealName)
+
+			// 移除当前用户的不可操作权限
+			{
+				obj := data_manage.EdbInfoNoPermissionAdmin{}
+				for _, v := range dataId {
+					edbInfoId, _ := strconv.Atoi(v)
+					go obj.DeleteByEdbInfoIdAndAdminId(edbInfoId, adminInfo.AdminId)
+				}
+			}
+		}
+	case 5: //图库
+		content += `(ETA图库)`
+		// 只展示eta图库
+		subSource = utils.CHART_SOURCE_DEFAULT
+
+		tmpList, tmpErr := data_manage.GetChartInfoListByChartIdList(dataId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		if len(tmpList) > 0 {
+			for _, v := range tmpList {
+				//if v.SysUserId == newUserId {
+				//	errMsg = "新创建人不可和原创建人一致"
+				//	err = errors.New(errMsg)
+				//	return
+				//}
+				// 操作记录
+				dataPermissionMoveRecordList = append(dataPermissionMoveRecordList, &data_manage_permission.DataPermissionMoveRecord{
+					DataPermissionMoveRecordId: 0,
+					Source:                     int32(source),
+					SubSource:                  int32(subSource),
+					OpUniqueCode:               uniqueCode,
+					DataId:                     fmt.Sprint(v.ChartInfoId),
+					DataCode:                   fmt.Sprint(v.ChartInfoId),
+					DataName:                   v.ChartName,
+					OriginalUserId:             int32(v.SysUserId),
+					OriginalUserName:           v.SysUserRealName,
+					NewUserId:                  int32(adminInfo.AdminId),
+					NewUserName:                adminInfo.RealName,
+					CreateTime:                 time.Now(),
+				})
+			}
+			// 修改创建人
+			err = data_manage.ModifyChartInfoUserIdByCodeList(dataId, adminInfo.AdminId, adminInfo.RealName)
+		}
+	case 6: // ETA表格
+		content += `(ETA表格)`
+		tmpList, tmpErr := excel.GetNoContentExcelListByExcelInfoIdList(dataId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		if len(tmpList) > 0 {
+			for _, v := range tmpList {
+				//if v.SysUserId == newUserId {
+				//	errMsg = "新创建人不可和原创建人一致"
+				//	err = errors.New(errMsg)
+				//	return
+				//}
+				// 操作记录
+				dataPermissionMoveRecordList = append(dataPermissionMoveRecordList, &data_manage_permission.DataPermissionMoveRecord{
+					DataPermissionMoveRecordId: 0,
+					Source:                     int32(source),
+					SubSource:                  int32(subSource),
+					OpUniqueCode:               uniqueCode,
+					DataId:                     fmt.Sprint(v.ExcelInfoId),
+					DataCode:                   fmt.Sprint(v.ExcelInfoId),
+					DataName:                   v.ExcelName,
+					OriginalUserId:             int32(v.SysUserId),
+					OriginalUserName:           v.SysUserRealName,
+					NewUserId:                  int32(adminInfo.AdminId),
+					NewUserName:                adminInfo.RealName,
+					CreateTime:                 time.Now(),
+				})
+			}
+			// 修改创建人
+			err = excel.ModifyExcelInfoUserIdByCodeList(dataId, adminInfo.AdminId, adminInfo.RealName)
+		}
+	default:
+		return
+	}
+
+	// 转移失败了那么就直接返回了
+	if err != nil {
+		return
+	}
+
+	// 添加资产转移的记录
+	dataPermissionMessage := &data_manage_permission.DataPermissionMessage{
+		DataPermissionMessageId: 0,
+		SendUserId:              int32(opUserId),
+		ReceiveUserId:           int32(adminInfo.AdminId),
+		Content:                 title,
+		Remark:                  content,
+		OpType:                  1,
+		Source:                  int32(source),
+		SubSource:               int32(subSource),
+		OpUniqueCode:            uniqueCode,
+		IsRead:                  0,
+		CreateTime:              time.Now(),
+		ModifyTime:              time.Now(),
+	}
+	tmpErr := data_manage_permission.AddDataPermissionMoveRecord(dataPermissionMoveRecordList, dataPermissionMessage)
+	// 失败的话,日志记录
+	if tmpErr != nil {
+		// 序列化结构体为 JSON 数据
+		recordListJsonBytes, tmpErr2 := json.Marshal(dataPermissionMoveRecordList)
+		if tmpErr2 != nil {
+			utils.FileLog.Error(fmt.Sprintf("添加资产转移的记录失败:%s;list转json失败:;操作记录:%+v;消息记录:%+v", tmpErr.Error(), dataPermissionMoveRecordList, dataPermissionMessage))
+			return
+		}
+		// 序列化结构体为 JSON 数据
+		messageJsonBytes, tmpErr2 := json.Marshal(dataPermissionMessage)
+		if tmpErr2 != nil {
+			utils.FileLog.Error(fmt.Sprintf("添加资产转移的记录失败:%s;message转json失败:;操作记录:%+v;消息记录:%+v", tmpErr.Error(), dataPermissionMoveRecordList, dataPermissionMessage))
+			return
+		}
+		utils.FileLog.Error(fmt.Sprintf("添加资产转移的记录失败:%s;操作记录:%s;消息记录:%s", tmpErr.Error(), string(recordListJsonBytes), string(messageJsonBytes)))
+	}
+
+	return
+}
+
+// MoveAllEdbChartOld
+// @Description: 通过原创建人转移指标/图表创建人
+// @author: Roc
+// @datetime 2024-03-26 15:11:12
+// @param sourceList []int 1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格
+// @param oldUserId []int
+// @param userId int
+// @param opUserId int
+// @return err error
+// @return errMsg string
+func MoveAllEdbChartOld(sourceList, oldUserIdList []int, userId, opUserId int) (err error, errMsg string) {
+	adminInfo, err := system.GetSysAdminById(userId)
+	if err != nil {
+		return
+	}
+
+	// 操作记录
+	dataPermissionMoveRecordList := make([]*data_manage_permission.DataPermissionMoveRecord, 0)
+	uniqueCode := uuid.NewUUID().Hex32()
+	title := `资产转移`
+	content := `资产转入`
+	sourceStrList := make([]string, 0)
+
+	for _, source := range sourceList {
+		switch source {
+		case 1: //手工数据指标
+			sourceStrList = append(sourceStrList, "手工指标数据")
+			tmpList, tmpErr := models.GetEdbinfoListByCodeListByUserId(oldUserIdList)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			if len(tmpList) > 0 {
+				for _, v := range tmpList {
+					// 操作记录
+					dataPermissionMoveRecordList = append(dataPermissionMoveRecordList, &data_manage_permission.DataPermissionMoveRecord{
+						DataPermissionMoveRecordId: 0,
+						Source:                     int32(source),
+						SubSource:                  0,
+						OpUniqueCode:               uniqueCode,
+						DataId:                     v.TradeCode,
+						DataCode:                   v.TradeCode,
+						DataName:                   v.SecName,
+						OriginalUserId:             int32(v.UserId),
+						OriginalUserName:           v.UserName,
+						NewUserId:                  int32(adminInfo.AdminId),
+						NewUserName:                adminInfo.RealName,
+						CreateTime:                 time.Now(),
+					})
+				}
+				// 修改创建人
+				err = models.ModifyEdbinfoUserIdByOldUserId(oldUserIdList, userId)
+			}
+
+		case 2: //钢联化工数据库
+			sourceStrList = append(sourceStrList, "钢联化工数据库")
+			tmpList, tmpErr := data_manage.GetMysteelChemicalIndexListByUserId(oldUserIdList)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			if len(tmpList) > 0 {
+				for _, v := range tmpList {
+					//if v.SysUserId == newUserId {
+					//	errMsg = "新创建人不可和原创建人一致"
+					//	err = errors.New(errMsg)
+					//	return
+					//}
+					// 操作记录
+					dataPermissionMoveRecordList = append(dataPermissionMoveRecordList, &data_manage_permission.DataPermissionMoveRecord{
+						DataPermissionMoveRecordId: 0,
+						Source:                     int32(source),
+						SubSource:                  0,
+						OpUniqueCode:               uniqueCode,
+						DataId:                     fmt.Sprint(v.BaseFromMysteelChemicalIndexId),
+						DataCode:                   v.IndexCode,
+						DataName:                   v.IndexName,
+						OriginalUserId:             int32(v.SysUserId),
+						OriginalUserName:           v.SysUserRealName,
+						NewUserId:                  int32(adminInfo.AdminId),
+						NewUserName:                adminInfo.RealName,
+						CreateTime:                 time.Now(),
+					})
+				}
+				// 修改创建人
+				err = data_manage.ModifyMysteelChemicalIndexUserIdByOldUserId(oldUserIdList, adminInfo.AdminId, adminInfo.RealName)
+			}
+
+		case 3: //ETA指标库
+			sourceStrList = append(sourceStrList, "ETA指标库")
+			edbInfoType := 0
+			tmpList, tmpErr := data_manage.GetEdbInfoListByUserId(oldUserIdList, edbInfoType)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			if len(tmpList) > 0 {
+				for _, v := range tmpList {
+					// 操作记录
+					dataPermissionMoveRecordList = append(dataPermissionMoveRecordList, &data_manage_permission.DataPermissionMoveRecord{
+						DataPermissionMoveRecordId: 0,
+						Source:                     int32(source),
+						SubSource:                  int32(edbInfoType),
+						OpUniqueCode:               uniqueCode,
+						DataId:                     fmt.Sprint(v.EdbInfoId),
+						DataCode:                   v.EdbCode,
+						DataName:                   v.EdbName,
+						OriginalUserId:             int32(v.SysUserId),
+						OriginalUserName:           v.SysUserRealName,
+						NewUserId:                  int32(adminInfo.AdminId),
+						NewUserName:                adminInfo.RealName,
+						CreateTime:                 time.Now(),
+					})
+				}
+				// 修改创建人
+				err = data_manage.ModifyEdbInfoUserIdByOldUserId(oldUserIdList, edbInfoType, adminInfo.AdminId, adminInfo.RealName)
+			}
+
+		case 4: //ETA预测指标
+			sourceStrList = append(sourceStrList, "ETA预测指标")
+
+			edbInfoType := 1
+			tmpList, tmpErr := data_manage.GetEdbInfoListByUserId(oldUserIdList, edbInfoType)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			if len(tmpList) > 0 {
+				for _, v := range tmpList {
+					// 操作记录
+					dataPermissionMoveRecordList = append(dataPermissionMoveRecordList, &data_manage_permission.DataPermissionMoveRecord{
+						DataPermissionMoveRecordId: 0,
+						Source:                     int32(source),
+						SubSource:                  int32(edbInfoType),
+						OpUniqueCode:               uniqueCode,
+						DataId:                     fmt.Sprint(v.EdbInfoId),
+						DataCode:                   v.EdbCode,
+						DataName:                   v.EdbName,
+						OriginalUserId:             int32(v.SysUserId),
+						OriginalUserName:           v.SysUserRealName,
+						NewUserId:                  int32(adminInfo.AdminId),
+						NewUserName:                adminInfo.RealName,
+						CreateTime:                 time.Now(),
+					})
+				}
+				// 修改创建人
+				err = data_manage.ModifyEdbInfoUserIdByOldUserId(oldUserIdList, edbInfoType, adminInfo.AdminId, adminInfo.RealName)
+			}
+		case 5: //ETA图库
+			sourceStrList = append(sourceStrList, "ETA图库")
+			// 只展示eta图库
+			subSource := utils.CHART_SOURCE_DEFAULT
+
+			tmpList, tmpErr := data_manage.GetChartInfoListByUserId(oldUserIdList, subSource)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			if len(tmpList) > 0 {
+				for _, v := range tmpList {
+					// 操作记录
+					dataPermissionMoveRecordList = append(dataPermissionMoveRecordList, &data_manage_permission.DataPermissionMoveRecord{
+						DataPermissionMoveRecordId: 0,
+						Source:                     int32(source),
+						SubSource:                  int32(subSource),
+						OpUniqueCode:               uniqueCode,
+						DataId:                     fmt.Sprint(v.ChartInfoId),
+						DataCode:                   fmt.Sprint(v.ChartInfoId),
+						DataName:                   v.ChartName,
+						OriginalUserId:             int32(v.SysUserId),
+						OriginalUserName:           v.SysUserRealName,
+						NewUserId:                  int32(adminInfo.AdminId),
+						NewUserName:                adminInfo.RealName,
+						CreateTime:                 time.Now(),
+					})
+				}
+				// 修改创建人
+				err = data_manage.ModifyChartInfoUserIdByOldUserId(oldUserIdList, adminInfo.AdminId, adminInfo.RealName)
+			}
+		case 6: // ETA表格
+			sourceStrList = append(sourceStrList, "ETA表格")
+			tmpList, tmpErr := excel.GetNoContentExcelListByUserId(oldUserIdList)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			if len(tmpList) > 0 {
+				for _, v := range tmpList {
+					// 操作记录
+					dataPermissionMoveRecordList = append(dataPermissionMoveRecordList, &data_manage_permission.DataPermissionMoveRecord{
+						DataPermissionMoveRecordId: 0,
+						Source:                     int32(source),
+						SubSource:                  int32(v.Source),
+						OpUniqueCode:               uniqueCode,
+						DataId:                     fmt.Sprint(v.ExcelInfoId),
+						DataCode:                   fmt.Sprint(v.ExcelInfoId),
+						DataName:                   v.ExcelName,
+						OriginalUserId:             int32(v.SysUserId),
+						OriginalUserName:           v.SysUserRealName,
+						NewUserId:                  int32(adminInfo.AdminId),
+						NewUserName:                adminInfo.RealName,
+						CreateTime:                 time.Now(),
+					})
+				}
+				// 修改创建人
+				err = excel.ModifyExcelInfoUserIdByOldUserId(oldUserIdList, adminInfo.AdminId, adminInfo.RealName)
+			}
+		default:
+		}
+
+		// 转移失败了那么就直接返回了
+		if err != nil {
+			return
+		}
+	}
+
+	content += fmt.Sprintf("(%s)", strings.Join(sourceStrList, ","))
+
+	// 添加资产转移的记录
+	dataPermissionMessage := &data_manage_permission.DataPermissionMessage{
+		DataPermissionMessageId: 0,
+		SendUserId:              int32(opUserId),
+		ReceiveUserId:           int32(adminInfo.AdminId),
+		Content:                 title,
+		Remark:                  content,
+		OpType:                  2,
+		OpUniqueCode:            uniqueCode,
+		IsRead:                  0,
+		CreateTime:              time.Now(),
+		ModifyTime:              time.Now(),
+	}
+	tmpErr := data_manage_permission.AddDataPermissionMoveRecord(dataPermissionMoveRecordList, dataPermissionMessage)
+	// 失败的话,日志记录
+	if tmpErr != nil {
+		// 序列化结构体为 JSON 数据
+		recordListJsonBytes, tmpErr2 := json.Marshal(dataPermissionMoveRecordList)
+		if tmpErr2 != nil {
+			utils.FileLog.Error(fmt.Sprintf("添加资产转移的记录失败:%s;list转json失败:;操作记录:%+v;消息记录:%+v", tmpErr.Error(), dataPermissionMoveRecordList, dataPermissionMessage))
+			return
+		}
+		// 序列化结构体为 JSON 数据
+		messageJsonBytes, tmpErr2 := json.Marshal(dataPermissionMessage)
+		if tmpErr2 != nil {
+			utils.FileLog.Error(fmt.Sprintf("添加资产转移的记录失败:%s;message转json失败:;操作记录:%+v;消息记录:%+v", tmpErr.Error(), dataPermissionMoveRecordList, dataPermissionMessage))
+			return
+		}
+		utils.FileLog.Error(fmt.Sprintf("添加资产转移的记录失败:%s;操作记录:%s;消息记录:%s", tmpErr.Error(), string(recordListJsonBytes), string(messageJsonBytes)))
+	}
+
+	return
+}
+
+// MoveAllEdbChart
+// @Description: 通过原创建人转移指标/图表创建人
+// @author: Roc
+// @datetime 2024-03-26 15:11:12
+// @param sourceList []int 1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格
+// @param oldUserId []int
+// @param userId int
+// @param opUserId int
+// @return err error
+// @return errMsg string
+func MoveAllEdbChart(sourceList, oldUserIdList []int, userId, opUserId int) (err error, errMsg string) {
+	adminInfo, err := system.GetSysAdminById(userId)
+	if err != nil {
+		return
+	}
+
+	// 操作记录
+	dataPermissionMoveRecordList := make([]*data_manage_permission.DataPermissionMoveRecord, 0)
+	uniqueCode := uuid.NewUUID().Hex32()
+	title := `资产转移`
+	content := `资产转入`
+	sourceStrList := make([]string, 0)
+
+	var isMoveManual, isMoveMysteelChemical, isMoveEdb, isMovePredictEdb, isMoveChart, isMoveExcel bool
+
+	// 遍历需要转移的模块,1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格,并找出当前需要转移的资产
+	for _, source := range sourceList {
+		switch source {
+		case 1: //手工数据指标
+			sourceStrList = append(sourceStrList, "手工指标数据")
+			tmpList, tmpErr := models.GetEdbinfoListByCodeListByUserId(oldUserIdList)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			if len(tmpList) > 0 {
+				for _, v := range tmpList {
+					// 操作记录
+					dataPermissionMoveRecordList = append(dataPermissionMoveRecordList, &data_manage_permission.DataPermissionMoveRecord{
+						DataPermissionMoveRecordId: 0,
+						Source:                     int32(source),
+						SubSource:                  0,
+						OpUniqueCode:               uniqueCode,
+						DataId:                     v.TradeCode,
+						DataCode:                   v.TradeCode,
+						DataName:                   v.SecName,
+						OriginalUserId:             int32(v.UserId),
+						OriginalUserName:           v.UserName,
+						NewUserId:                  int32(adminInfo.AdminId),
+						NewUserName:                adminInfo.RealName,
+						CreateTime:                 time.Now(),
+					})
+				}
+				isMoveManual = true
+			}
+
+		case 2: //钢联化工数据库
+			sourceStrList = append(sourceStrList, "钢联化工数据库")
+			tmpList, tmpErr := data_manage.GetMysteelChemicalIndexListByUserId(oldUserIdList)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			if len(tmpList) > 0 {
+				for _, v := range tmpList {
+					//if v.SysUserId == newUserId {
+					//	errMsg = "新创建人不可和原创建人一致"
+					//	err = errors.New(errMsg)
+					//	return
+					//}
+					// 操作记录
+					dataPermissionMoveRecordList = append(dataPermissionMoveRecordList, &data_manage_permission.DataPermissionMoveRecord{
+						DataPermissionMoveRecordId: 0,
+						Source:                     int32(source),
+						SubSource:                  0,
+						OpUniqueCode:               uniqueCode,
+						DataId:                     fmt.Sprint(v.BaseFromMysteelChemicalIndexId),
+						DataCode:                   v.IndexCode,
+						DataName:                   v.IndexName,
+						OriginalUserId:             int32(v.SysUserId),
+						OriginalUserName:           v.SysUserRealName,
+						NewUserId:                  int32(adminInfo.AdminId),
+						NewUserName:                adminInfo.RealName,
+						CreateTime:                 time.Now(),
+					})
+				}
+				isMoveMysteelChemical = true
+			}
+
+		case 3: //ETA指标库
+			sourceStrList = append(sourceStrList, "ETA指标库")
+			edbInfoType := 0
+			tmpList, tmpErr := data_manage.GetEdbInfoListByUserId(oldUserIdList, edbInfoType)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			if len(tmpList) > 0 {
+				for _, v := range tmpList {
+					// 操作记录
+					dataPermissionMoveRecordList = append(dataPermissionMoveRecordList, &data_manage_permission.DataPermissionMoveRecord{
+						DataPermissionMoveRecordId: 0,
+						Source:                     int32(source),
+						SubSource:                  int32(edbInfoType),
+						OpUniqueCode:               uniqueCode,
+						DataId:                     fmt.Sprint(v.EdbInfoId),
+						DataCode:                   v.EdbCode,
+						DataName:                   v.EdbName,
+						OriginalUserId:             int32(v.SysUserId),
+						OriginalUserName:           v.SysUserRealName,
+						NewUserId:                  int32(adminInfo.AdminId),
+						NewUserName:                adminInfo.RealName,
+						CreateTime:                 time.Now(),
+					})
+				}
+				isMoveEdb = true
+			}
+
+		case 4: //ETA预测指标
+			sourceStrList = append(sourceStrList, "ETA预测指标")
+
+			edbInfoType := 1
+			tmpList, tmpErr := data_manage.GetEdbInfoListByUserId(oldUserIdList, edbInfoType)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			if len(tmpList) > 0 {
+				for _, v := range tmpList {
+					// 操作记录
+					dataPermissionMoveRecordList = append(dataPermissionMoveRecordList, &data_manage_permission.DataPermissionMoveRecord{
+						DataPermissionMoveRecordId: 0,
+						Source:                     int32(source),
+						SubSource:                  int32(edbInfoType),
+						OpUniqueCode:               uniqueCode,
+						DataId:                     fmt.Sprint(v.EdbInfoId),
+						DataCode:                   v.EdbCode,
+						DataName:                   v.EdbName,
+						OriginalUserId:             int32(v.SysUserId),
+						OriginalUserName:           v.SysUserRealName,
+						NewUserId:                  int32(adminInfo.AdminId),
+						NewUserName:                adminInfo.RealName,
+						CreateTime:                 time.Now(),
+					})
+				}
+				isMovePredictEdb = true
+			}
+		case 5: //ETA图库
+			sourceStrList = append(sourceStrList, "ETA图库")
+			// 只展示eta图库
+			subSource := utils.CHART_SOURCE_DEFAULT
+
+			tmpList, tmpErr := data_manage.GetChartInfoListByUserId(oldUserIdList, subSource)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			if len(tmpList) > 0 {
+				for _, v := range tmpList {
+					// 操作记录
+					dataPermissionMoveRecordList = append(dataPermissionMoveRecordList, &data_manage_permission.DataPermissionMoveRecord{
+						DataPermissionMoveRecordId: 0,
+						Source:                     int32(source),
+						SubSource:                  int32(subSource),
+						OpUniqueCode:               uniqueCode,
+						DataId:                     fmt.Sprint(v.ChartInfoId),
+						DataCode:                   fmt.Sprint(v.ChartInfoId),
+						DataName:                   v.ChartName,
+						OriginalUserId:             int32(v.SysUserId),
+						OriginalUserName:           v.SysUserRealName,
+						NewUserId:                  int32(adminInfo.AdminId),
+						NewUserName:                adminInfo.RealName,
+						CreateTime:                 time.Now(),
+					})
+				}
+				isMoveChart = true
+			}
+		case 6: // ETA表格
+			sourceStrList = append(sourceStrList, "ETA表格")
+			tmpList, tmpErr := excel.GetNoContentExcelListByUserId(oldUserIdList)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			if len(tmpList) > 0 {
+				for _, v := range tmpList {
+					// 操作记录
+					dataPermissionMoveRecordList = append(dataPermissionMoveRecordList, &data_manage_permission.DataPermissionMoveRecord{
+						DataPermissionMoveRecordId: 0,
+						Source:                     int32(source),
+						SubSource:                  int32(v.Source),
+						OpUniqueCode:               uniqueCode,
+						DataId:                     fmt.Sprint(v.ExcelInfoId),
+						DataCode:                   fmt.Sprint(v.ExcelInfoId),
+						DataName:                   v.ExcelName,
+						OriginalUserId:             int32(v.SysUserId),
+						OriginalUserName:           v.SysUserRealName,
+						NewUserId:                  int32(adminInfo.AdminId),
+						NewUserName:                adminInfo.RealName,
+						CreateTime:                 time.Now(),
+					})
+				}
+				isMoveExcel = true
+			}
+		default:
+		}
+	}
+
+	// 修改创建人
+	err = data_manage_permission.ModifyDataUserIdByOldUserId(oldUserIdList, adminInfo.AdminId, adminInfo.RealName, isMoveManual, isMoveMysteelChemical, isMoveEdb, isMovePredictEdb, isMoveChart, isMoveExcel)
+	// 转移失败了那么就直接返回了
+	if err != nil {
+		return
+	}
+
+	// 添加资产转移的记录
+	content += fmt.Sprintf("(%s)", strings.Join(sourceStrList, ","))
+	dataPermissionMessage := &data_manage_permission.DataPermissionMessage{
+		DataPermissionMessageId: 0,
+		SendUserId:              int32(opUserId),
+		ReceiveUserId:           int32(adminInfo.AdminId),
+		Content:                 title,
+		Remark:                  content,
+		OpType:                  2,
+		OpUniqueCode:            uniqueCode,
+		IsRead:                  0,
+		CreateTime:              time.Now(),
+		ModifyTime:              time.Now(),
+	}
+	tmpErr := data_manage_permission.AddDataPermissionMoveRecord(dataPermissionMoveRecordList, dataPermissionMessage)
+	// 失败的话,日志记录
+	if tmpErr != nil {
+		// 序列化结构体为 JSON 数据
+		recordListJsonBytes, tmpErr2 := json.Marshal(dataPermissionMoveRecordList)
+		if tmpErr2 != nil {
+			utils.FileLog.Error(fmt.Sprintf("添加资产转移的记录失败:%s;list转json失败:;操作记录:%+v;消息记录:%+v", tmpErr.Error(), dataPermissionMoveRecordList, dataPermissionMessage))
+			return
+		}
+		// 序列化结构体为 JSON 数据
+		messageJsonBytes, tmpErr2 := json.Marshal(dataPermissionMessage)
+		if tmpErr2 != nil {
+			utils.FileLog.Error(fmt.Sprintf("添加资产转移的记录失败:%s;message转json失败:;操作记录:%+v;消息记录:%+v", tmpErr.Error(), dataPermissionMoveRecordList, dataPermissionMessage))
+			return
+		}
+		utils.FileLog.Error(fmt.Sprintf("添加资产转移的记录失败:%s;操作记录:%s;消息记录:%s", tmpErr.Error(), string(recordListJsonBytes), string(messageJsonBytes)))
+	}
+
+	return
+}
+
+// GetMoveEdbChartCount 获取待转移的指标/图表列表
+// @param userId 用户
+// @param countType 来源 :1:设置资产权限;2:设置数据权限
+func GetMoveEdbChartCount(userId, countType int) (sourceMap map[int]int, err error) {
+	sourceMap = make(map[int]int)
+	{
+		// 手工数据指标
+		var condition string
+		var pars []interface{}
+
+		if userId > 0 {
+			condition += ` AND a.user_id = ? `
+			pars = append(pars, userId)
+		}
+
+		total, tmpErr := models.GetEdbinfoListCount(condition, pars, "", 0)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		sourceMap[1] = total
+	}
+
+	{
+		// 钢联化工数据库
+		var condition string
+		var pars []interface{}
+		if userId > 0 {
+			condition += ` AND sys_user_id = ? `
+			pars = append(pars, userId)
+		}
+
+		total, tmpErr := data_manage.GetMysteelChemicalIndexCount(condition, pars)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		sourceMap[2] = total
+	}
+
+	{
+		// ETA指标库
+		var condition string
+		var pars []interface{}
+		if userId > 0 {
+			condition += ` AND sys_user_id = ? `
+			pars = append(pars, userId)
+		}
+		//ETA指标库
+		condition += ` AND edb_info_type = ? `
+		pars = append(pars, 0)
+
+		total, tmpErr := data_manage.GetEdbInfoByConditionCount(condition, pars)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		sourceMap[3] = total
+	}
+
+	{
+		// ETA预测指标库
+		var condition string
+		var pars []interface{}
+		if userId > 0 {
+			condition += ` AND sys_user_id = ? `
+			pars = append(pars, userId)
+		}
+
+		//ETA预测指标
+		condition += ` AND edb_info_type = ? `
+		pars = append(pars, 1)
+
+		total, tmpErr := data_manage.GetEdbInfoByConditionCount(condition, pars)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		sourceMap[4] = total
+	}
+
+	{
+		// 图库
+		var condition string
+		var pars []interface{}
+
+		if userId > 0 {
+			condition += ` AND sys_user_id = ? `
+			pars = append(pars, userId)
+		}
+
+		total, tmpErr := data_manage.GetChartInfoCountByCondition(condition, pars)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		sourceMap[5] = total
+	}
+
+	{
+		// ETA表格
+		var condition string
+		var pars []interface{}
+
+		condition += ` AND is_delete = 0 `
+
+		if userId > 0 {
+			condition += ` AND sys_user_id = ? `
+			pars = append(pars, userId)
+		}
+
+		switch countType {
+		case 2:
+			condition += ` AND source in (2,3) `
+		default:
+			condition += ` AND source in (2,3,4) `
+		}
+
+		total, tmpErr := excel.GetExcelInfoCountByCondition(condition, pars)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		sourceMap[6] = total
+	}
+
+	return
+}

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

@@ -0,0 +1,161 @@
+package data_manage_permission
+
+import (
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_manage/data_manage_permission"
+	"eta/eta_api/utils"
+	"fmt"
+)
+
+type EdbClassifyPermission struct {
+	ClassifyId       int `description:"分类id"`
+	IsJoinPermission int `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	EdbInfoId        int `orm:"column(edb_info_id);pk"`
+}
+
+// CheckEdbPermissionByPermissionIdList
+// @Description: 检查EDB指标(含预测指标)权限
+// @author: Roc
+// @datetime 2024-03-28 16:12:08
+// @param edbIsJoinPermission int
+// @param edbClassifyIsJoinPermission int
+// @param edbInfoId int
+// @param edbClassifyId int
+// @param permissionEdbInfoIdList []int
+// @param permissionEdbClassifyIdList []int
+// @return hasAuth bool
+func CheckEdbPermissionByPermissionIdList(edbIsJoinPermission, edbClassifyIsJoinPermission, edbInfoId, edbClassifyId int, permissionEdbInfoIdList, permissionEdbClassifyIdList []int) (hasAuth bool) {
+	//hasAuth = true
+
+	// 判断 分类是否纳入权限管控
+	if edbClassifyIsJoinPermission == 1 {
+		// 不属于已授权的分类,那么就无权限
+		if !utils.InArrayByInt(permissionEdbClassifyIdList, edbClassifyId) {
+			return false
+		}
+	}
+
+	// 判断 指标是否纳入权限管控
+	if edbIsJoinPermission == 1 {
+		// 不属于已授权的指标,那么就无权限
+		if !utils.InArrayByInt(permissionEdbInfoIdList, edbInfoId) {
+			return false
+		}
+	}
+
+	hasAuth = true
+
+	return
+}
+
+// CheckEdbClassifyPermissionByPermissionIdList
+// @Description: 检查EDB分类权限
+// @author: Roc
+// @datetime 2024-03-29 14:35:19
+// @param edbClassifyIsJoinPermission int
+// @param edbClassifyId int
+// @param permissionEdbClassifyIdList []int
+// @return hasAuth bool
+func CheckEdbClassifyPermissionByPermissionIdList(edbClassifyIsJoinPermission, edbClassifyId int, permissionEdbClassifyIdList []int) (hasAuth bool) {
+	// 判断 分类是否纳入权限管控
+	if edbClassifyIsJoinPermission == 1 {
+		// 不属于已授权的分类,那么就无权限
+		if !utils.InArrayByInt(permissionEdbClassifyIdList, edbClassifyId) {
+			return
+		}
+	}
+
+	hasAuth = true
+
+	return
+}
+
+// GetUserEdbAndClassifyPermissionList
+// @Description: 根据用户获取已经授权指标ID列表和指标分类ID列表
+// @author: Roc
+// @datetime 2024-03-28 17:20:36
+// @param userId int
+// @param edbInfoId int 如果传递了edbInfoId,则只返回该edbInfoId的权限列表(其实也就是为了判断是否存在该指标权限了,目的是为了少获取数据)
+// @param classifyId int  classifyId,则只返回该classifyId的权限列表(其实也就是为了判断是否存在该指标分类权限了,目的是为了少获取数据)
+// @return edbIdList []int
+// @return classifyIdList []int
+// @return err error
+func GetUserEdbAndClassifyPermissionList(userId, edbInfoId, classifyId int) (edbIdList, classifyIdList []int, err error) {
+	// 获取有权限的指标ID列表
+	edbIdList, err = data_manage_permission.GetPermissionEdbIdList(userId, edbInfoId)
+	if err != nil {
+		fmt.Println("获取授权指标列表失败, err:", err)
+		return
+	}
+
+	// 获取有权限的指标分类ID列表
+	classifyIdList, err = data_manage_permission.GetPermissionEdbClassifyIdList(userId, classifyId)
+	if err != nil {
+		fmt.Println("获取授权指标分类列表失败, err:", err)
+		return
+	}
+
+	return
+}
+
+// GetUserEdbClassifyPermissionList
+// @Description: 根据用户获取已经授权指标分类ID列表
+// @author: Roc
+// @datetime 2024-03-28 17:20:36
+// @param userId int
+// @param classifyId int  classifyId,则只返回该classifyId的权限列表(其实也就是为了判断是否存在该指标分类权限了,目的是为了少获取数据)
+// @return classifyIdList []int
+// @return err error
+func GetUserEdbClassifyPermissionList(userId, classifyId int) (classifyIdList []int, err error) {
+	// 获取有权限的指标分类ID列表
+	classifyIdList, err = data_manage_permission.GetPermissionEdbClassifyIdList(userId, classifyId)
+	if err != nil {
+		fmt.Println("获取授权指标分类列表失败, err:", err)
+		return
+	}
+
+	return
+}
+
+// CheckEdbPermissionByEdbInfoId
+// @Description: 根据指标id和指标分类id,检查EDB指标(含预测指标)权限(方法内部自己获取所有的指标和指标分类权限,不用额外传递)
+// @author: Roc
+// @datetime 2024-03-29 13:28:06
+// @param edbInfoId int
+// @param edbClassifyId int
+// @param edbIsJoinPermission int
+// @param userId int
+// @return hasAuth bool
+// @return err error
+func CheckEdbPermissionByEdbInfoId(edbInfoId, edbClassifyId, edbIsJoinPermission, userId int) (hasAuth bool, err error) {
+	currClassify, err := data_manage.GetEdbClassifyById(edbClassifyId)
+	if err != nil {
+		return
+	}
+	if currClassify != nil {
+		return CheckEdbPermission(edbIsJoinPermission, currClassify.IsJoinPermission, userId, edbInfoId, edbClassifyId)
+	}
+
+	return
+}
+
+// CheckEdbPermission
+// @Description: 检查EDB指标(含预测指标)权限(方法内部自己获取所有的指标和指标分类权限,不用额外传递)
+// @author: Roc
+// @datetime 2024-03-28 16:12:08
+// @param edbIsJoinPermission int
+// @param edbClassifyIsJoinPermission int
+// @param edbInfoId int
+// @param edbClassifyId int
+// @return hasAuth bool
+func CheckEdbPermission(edbIsJoinPermission, edbClassifyIsJoinPermission, userId, edbInfoId, edbClassifyId int) (hasAuth bool, err error) {
+	edbIdList, classifyIdList, err := GetUserEdbAndClassifyPermissionList(userId, edbInfoId, edbClassifyId)
+	if err != nil {
+		fmt.Println("GetUserEdbAndClassifyPermissionList err:", err)
+		return
+	}
+
+	hasAuth = CheckEdbPermissionByPermissionIdList(edbIsJoinPermission, edbClassifyIsJoinPermission, edbInfoId, edbClassifyId, edbIdList, classifyIdList)
+
+	return
+}

+ 715 - 0
services/data/data_manage_permission/edb_permission.go

@@ -0,0 +1,715 @@
+package data_manage_permission
+
+import (
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_manage/data_manage_permission"
+	"eta/eta_api/models/data_manage/excel"
+	"eta/eta_api/models/system"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/uuid"
+	"strings"
+)
+
+// SetEdbChartPermission
+// @Description:  单独给资产(指标、图表、ETA表格)设置权限
+// @author: Roc
+// @datetime 2024-03-27 10:52:32
+// @param source int
+// @param subSource int
+// @param userId int
+// @param authUserList []int
+// @param isSelectAll bool
+// @param dataId []string
+// @param noDataId []string
+// @param keyword string
+// @param classify string
+// @param opUserId int 操作人
+// @return err error
+// @return errMsg string
+func SetEdbChartPermission(source, subSource, userId int, authUserList []int, isSelectAll bool, dataIdList, noDataIdList []string, keyword, classify string, opUserId int) (err error, errMsg string) {
+	// 如果勾选全部数据,那么
+	if isSelectAll {
+		// 找出不要的指标ID列表
+		noDataIdMap := make(map[string]string, 0)
+		for _, v := range noDataIdList {
+			noDataIdMap[v] = v
+		}
+
+		// 需要转义的指标/图表ID列表
+		dataIdList = make([]string, 0)
+		// 获取所有指标/图表
+		list, _, tmpErr := GetMoveEdbChartList(source, subSource, userId, keyword, classify, 0, 100000)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range list {
+			if _, ok := noDataIdMap[v.DataId]; !ok {
+				dataIdList = append(dataIdList, v.DataId)
+			}
+		}
+	}
+
+	if len(authUserList) <= 0 {
+		// 说明是取消权限管控
+	}
+
+	uniqueCode := uuid.NewUUID().Hex32()
+	title := `数据权限变更`
+	content := `数据权限`
+	dataList := make([]data_manage_permission.DataItem, 0)
+
+	switch source {
+	case 3, 4:
+		//ETA指标库、ETA预测指标
+		if source == 3 {
+			content += `(ETA指标库)`
+		} else {
+			content += `(ETA预测指标)`
+		}
+
+		tmpList, tmpErr := data_manage.GetEdbInfoListByEdbInfoId(dataIdList)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		dataIdList = make([]string, 0)
+		if len(tmpList) > 0 {
+			for _, v := range tmpList {
+				dataList = append(dataList, data_manage_permission.DataItem{
+					DataId:   v.EdbInfoId,
+					DataCode: v.EdbCode,
+					DataName: v.EdbName,
+				})
+				dataIdList = append(dataIdList, fmt.Sprint(v.EdbInfoId))
+			}
+			// 重新设置权限
+			edbInfoType := 0
+			if source == 4 {
+				edbInfoType = 1
+			}
+			err = data_manage_permission.SetPermissionByEdbIdList(dataIdList, authUserList, edbInfoType)
+		}
+
+	case 5:
+		//图库
+		content += `(ETA图库)`
+		tmpList, tmpErr := data_manage.GetChartInfoListByChartIdList(dataIdList)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		if len(tmpList) > 0 {
+			dataIdList = make([]string, 0)
+			for _, v := range tmpList {
+				dataList = append(dataList, data_manage_permission.DataItem{
+					DataId:   v.ChartInfoId,
+					DataCode: fmt.Sprint(v.ChartInfoId),
+					DataName: v.ChartName,
+				})
+				dataIdList = append(dataIdList, fmt.Sprint(v.ChartInfoId))
+			}
+
+			// 重新设置权限
+			chartSource := utils.CHART_SOURCE_DEFAULT
+			err = data_manage_permission.SetPermissionByChartIdList(dataIdList, authUserList, chartSource)
+		}
+
+	case 6:
+		// ETA表格
+		content += `(ETA表格)`
+		tmpList, tmpErr := excel.GetNoContentExcelListByExcelInfoIdList(dataIdList)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		if len(tmpList) > 0 {
+			dataIdList = make([]string, 0)
+			for _, v := range tmpList {
+				dataList = append(dataList, data_manage_permission.DataItem{
+					DataId:   v.ExcelInfoId,
+					DataCode: fmt.Sprint(v.ExcelInfoId),
+					DataName: v.ExcelName,
+				})
+				dataIdList = append(dataIdList, fmt.Sprint(v.ExcelInfoId))
+			}
+
+			// 重新设置权限
+			err = data_manage_permission.SetPermissionByExcelIdList(dataIdList, authUserList, subSource)
+		}
+	default:
+		return
+	}
+
+	if err != nil {
+		return
+	}
+
+	var authRecordErr error
+	defer func() {
+		if authRecordErr != nil {
+			utils.FileLog.Error(fmt.Sprintf("记录未设置记录资产权限的记录失败:%s;source:%d;sub_source:%d;数据ID列表:%s;授权人列表:%v", authRecordErr.Error(), source, subSource, strings.Join(dataIdList, ","), authUserList))
+
+		}
+	}()
+
+	// 获取所有在用的用户
+	cond := ` AND enabled = 1`
+	pars := make([]interface{}, 0)
+
+	adminList, authRecordErr := system.GetSysAdminList(cond, pars, []string{}, "")
+	if authRecordErr != nil {
+		return
+	}
+
+	// 如果没有授权人,那么就删除未授权记录
+	if len(authUserList) < 0 {
+		authRecordErr = data_manage_permission.DeleteRecordBySourceAndDataIdList(source, subSource, dataIdList)
+		return
+	}
+
+	userIdMap := make(map[int]int)
+	for _, tmpUserId := range authUserList {
+		userIdMap[tmpUserId] = tmpUserId
+	}
+
+	noAuthUserIdList := make([]int, 0)
+	for _, v := range adminList {
+		if _, ok := userIdMap[v.AdminId]; !ok {
+			noAuthUserIdList = append(noAuthUserIdList, v.AdminId)
+		}
+	}
+
+	content += "已关闭"
+
+	// 添加未授权记录
+	authRecordErr = data_manage_permission.AddRecordBySourceAndDataIdList(source, subSource, dataList, noAuthUserIdList, authUserList, uniqueCode, title, content, opUserId)
+
+	return
+}
+
+// SetDataClassifyIsPermission
+// @Description:  设置资产(指标、图表、ETA表格)分类是否涉密
+// @author: Roc
+// @datetime 2024-03-27 10:52:32
+// @param source int
+// @param subSource int
+// @param dataId []string
+// @param opUserId int 操作人id
+// @return err error
+// @return errMsg string
+func SetDataClassifyIsPermission(source, subSource int, classifyIdList []int, opUserId int) (err error, errMsg string) {
+	uniqueCode := uuid.NewUUID().Hex32()
+	title := `数据权限变更`
+	content := `分类权限`
+	classifyDataList := make([]data_manage_permission.ClassifyDataItem, 0)
+
+	switch source {
+	case 3, 4:
+		//ETA指标库、ETA预测指标
+		if source == 3 {
+			content += `(ETA指标库)`
+		} else {
+			content += `(ETA预测指标)`
+		}
+		{
+			// 分类信息
+			classifyInfoList, tmpErr := data_manage.GetEdbClassifyByIdList(classifyIdList)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			for _, v := range classifyInfoList {
+				classifyDataList = append(classifyDataList, data_manage_permission.ClassifyDataItem{
+					ClassifyId:   v.ClassifyId,
+					ClassifyName: v.ClassifyName,
+				})
+			}
+		}
+
+		// 重新设置权限
+		classifyType := 0
+		if source == 4 {
+			classifyType = 1
+		}
+		err = data_manage_permission.SetIsPermissionEdbChartByEdbClassifyIdList(classifyIdList, classifyType)
+
+	case 5:
+		//图库
+		content += `(ETA图库)`
+		{
+			// 分类信息
+			classifyInfoList, tmpErr := data_manage.GetChartClassifyByIdList(classifyIdList)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			for _, v := range classifyInfoList {
+				classifyDataList = append(classifyDataList, data_manage_permission.ClassifyDataItem{
+					ClassifyId:   v.ChartClassifyId,
+					ClassifyName: v.ChartClassifyName,
+				})
+			}
+		}
+
+		// 重新设置权限
+		chartClassifySource := utils.CHART_SOURCE_DEFAULT
+		err = data_manage_permission.SetIsPermissionByChartClassifyIdList(classifyIdList, chartClassifySource)
+
+	case 6:
+		// ETA表格
+		content += `(ETA表格)`
+		{
+			// 分类信息
+			classifyInfoList, tmpErr := excel.GetExcelClassifyByIdList(classifyIdList)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			for _, v := range classifyInfoList {
+				classifyDataList = append(classifyDataList, data_manage_permission.ClassifyDataItem{
+					ClassifyId:   v.ExcelClassifyId,
+					ClassifyName: v.ExcelClassifyName,
+				})
+			}
+		}
+		// 重新设置权限
+		err = data_manage_permission.SetIsPermissionByExcelClassifyIdList(classifyIdList, subSource)
+
+	default:
+		return
+	}
+	if err != nil {
+		return
+	}
+
+	var authRecordErr error
+	defer func() {
+		if authRecordErr != nil {
+			utils.FileLog.Error(fmt.Sprintf("记录未设置记录资产权限的记录失败:%s;source:%d;sub_source:%d;分类ID列表:%v", authRecordErr.Error(), source, subSource, classifyIdList))
+
+		}
+	}()
+
+	// 如果没有涉密的分类,那么就移除所有删除未授权记录
+	if len(classifyIdList) <= 0 {
+		authRecordErr = data_manage_permission.DeleteClassifyNoAuthRecordBySourceAndClassifyIdList(source, subSource)
+		return
+	}
+
+	// 获取所有在用的用户
+	cond := ` AND enabled = 1`
+	pars := make([]interface{}, 0)
+
+	adminList, authRecordErr := system.GetSysAdminList(cond, pars, []string{}, "")
+	if authRecordErr != nil {
+		return
+	}
+	noAuthUserIdList := make([]int, 0)
+	for _, v := range adminList {
+		noAuthUserIdList = append(noAuthUserIdList, v.AdminId)
+	}
+
+	content += "已关闭"
+	// 添加未授权记录
+	authRecordErr = data_manage_permission.AddClassifyNoAuthRecordBySourceAndClassifyIdList(source, subSource, classifyDataList, noAuthUserIdList, uniqueCode, title, content, opUserId)
+
+	return
+}
+
+// SetEdbChartClassifyPermission
+// @Description: 给用户设置涉密分类的权限
+// @author: Roc
+// @datetime 2024-03-28 14:22:30
+// @param source int
+// @param subSource int
+// @param authUserList []int
+// @param classifyIdList []int
+// @param opUserId int 操作人id
+// @return err error
+// @return errMsg string
+func SetEdbChartClassifyPermission(source, subSource int, authUserList []int, classifyIdList []int, opUserId int) (err error, errMsg string) {
+	uniqueCode := uuid.NewUUID().Hex32()
+	title := `数据权限变更`
+	content := `分类权限`
+	secretClassifyInfoList := make([]data_manage_permission.ClassifyDataItem, 0)
+
+	if len(classifyIdList) <= 0 {
+		// 说明是取消权限管控
+	}
+
+	// 先获取所有的涉密分类,然后根据用户去判断那些分类给权限了
+
+	switch source {
+	case 3, 4: //ETA指标库、ETA预测指标
+
+		//ETA指标库、ETA预测指标
+		if source == 3 {
+			content += `(ETA指标库)`
+		} else {
+			content += `(ETA预测指标)`
+		}
+
+		classifyType := 0
+		if source == 4 {
+			classifyType = 1
+		}
+
+		{
+			// 获取已经设置加密的分类信息
+			classifyInfoList, tmpErr := data_manage.GetEdbClassifyByClassifyTypeAndIsJoinPermission(classifyType, 1)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			for _, v := range classifyInfoList {
+				secretClassifyInfoList = append(secretClassifyInfoList, data_manage_permission.ClassifyDataItem{
+					ClassifyId:   v.ClassifyId,
+					ClassifyName: v.ClassifyName,
+				})
+			}
+		}
+		// 重新设置权限
+		err = data_manage_permission.SetPermissionByEdbClassifyIdList(classifyIdList, authUserList, classifyType)
+	case 5:
+		subSource = utils.CHART_SOURCE_DEFAULT
+		//图库
+		content += `(ETA图库)`
+		{
+			// 分类信息
+			classifyInfoList, tmpErr := data_manage.GetChartClassifyBySourceAndIsJoinPermission(subSource, 1)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			for _, v := range classifyInfoList {
+				secretClassifyInfoList = append(secretClassifyInfoList, data_manage_permission.ClassifyDataItem{
+					ClassifyId:   v.ChartClassifyId,
+					ClassifyName: v.ChartClassifyName,
+				})
+			}
+		}
+
+		// 重新设置权限
+		err = data_manage_permission.SetPermissionByChartClassifyIdList(classifyIdList, authUserList, subSource)
+	case 6:
+		// ETA表格
+		content += `(ETA表格)`
+		{
+			// 分类信息
+			classifyInfoList, tmpErr := excel.GetExcelClassifyBySourceAndIsJoinPermission(subSource, 1)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			for _, v := range classifyInfoList {
+				secretClassifyInfoList = append(secretClassifyInfoList, data_manage_permission.ClassifyDataItem{
+					ClassifyId:   v.ExcelClassifyId,
+					ClassifyName: v.ExcelClassifyName,
+				})
+			}
+		}
+
+		err = data_manage_permission.SetPermissionByExcelClassifyIdList(classifyIdList, authUserList, subSource)
+	default:
+		return
+	}
+
+	if err != nil {
+		return
+	}
+
+	var authRecordErr error
+	defer func() {
+		if authRecordErr != nil {
+			utils.FileLog.Error(fmt.Sprintf("记录未设置记录资产权限的记录失败:%s;source:%d;sub_source:%d;分类ID列表:%v", authRecordErr.Error(), source, subSource, classifyIdList))
+
+		}
+	}()
+
+	content += "已关闭"
+
+	authClassifyIdMap := make(map[int]int)
+	for _, v := range classifyIdList {
+		authClassifyIdMap[v] = v
+	}
+
+	noAuthClassifyMap := make(map[int]data_manage_permission.ClassifyDataItem)
+	for _, classifyInfo := range secretClassifyInfoList {
+		if _, ok := authClassifyIdMap[classifyInfo.ClassifyId]; !ok {
+			noAuthClassifyMap[classifyInfo.ClassifyId] = classifyInfo
+		}
+	}
+
+	// 添加未授权记录
+	authRecordErr = data_manage_permission.AddClassifyNoAuthRecordBySourceAndUserIdList(source, subSource, noAuthClassifyMap, authUserList, uniqueCode, title, content, opUserId)
+
+	return
+}
+
+// GetEdbChartClassifyIdListPermissionByUserId
+// @Description: 根据用户id获取已经配置的分类id列表
+// @author: Roc
+// @datetime 2024-03-29 16:26:10
+// @param source int
+// @param subSource int
+// @param userId int
+// @return idList []int
+// @return err error
+func GetEdbChartClassifyIdListPermissionByUserId(source, subSource, userId int) (idList []int, err error) {
+	switch source {
+	case 3, 4: //ETA指标库、ETA预测指标
+		//tmpList, tmpErr := data_manage.GetEdbInfoListGroupByUserId(dataId)
+		//if tmpErr != nil {
+		//	err = tmpErr
+		//	return
+		//}
+		//if len(tmpList) > 0 {
+		//}
+		// 重新设置权限
+		classifyType := 0
+		if source == 4 {
+			classifyType = 1
+		}
+		idList, err = data_manage_permission.GetPermissionEdbClassifyIdListByUserId(userId, classifyType)
+	case 5:
+		//图库
+		chartClassifySource := utils.CHART_SOURCE_DEFAULT
+		idList, err = data_manage_permission.GetPermissionChartClassifyIdListByUserId(userId, chartClassifySource)
+	case 6:
+		// ETA表格
+		idList, err = data_manage_permission.GetPermissionExcelClassifyIdListByUserId(userId, subSource)
+	default:
+		return
+	}
+	return
+}
+
+// GetUserIdListPermissionByDataId
+// @Description: 根据资产(指标、图表、表格)id获取已经配置的用户id
+// @author: Roc
+// @datetime 2024-03-29 16:26:10
+// @param source int
+// @param subSource int
+// @param dataId int
+// @return idList []int
+// @return err error
+func GetUserIdListPermissionByDataId(source, subSource, dataId int) (idList []int, err error) {
+	switch source {
+	case 3, 4:
+		// ETA指标库、ETA预测指标
+		edbInfoType := 0
+		if source == 4 {
+			edbInfoType = 1
+		}
+		idList, err = data_manage_permission.GetPermissionUserIdListByEdbId(dataId, edbInfoType)
+	case 5:
+		// 图库
+		chartClassifySource := utils.CHART_SOURCE_DEFAULT
+		idList, err = data_manage_permission.GetPermissionUserIdListByChartId(dataId, chartClassifySource)
+	case 6:
+		// ETA表格
+		idList, err = data_manage_permission.GetPermissionUserIdListByExcelId(dataId, subSource)
+	default:
+		return
+	}
+	return
+}
+
+// GetUserIdListNoPermissionByDataId
+// @Description: 根据资产(指标、图表、表格)id获取没有该资产分类权限的用户id
+// @author: Roc
+// @datetime 2024-03-29 16:26:10
+// @param source int
+// @param subSource int
+// @param dataId int
+// @return idList []int
+// @return err error
+func GetUserIdListNoPermissionByDataId(source, subSource, dataId int) (idList []int, err error) {
+	// 已经授权的用户map
+	authIdList := make([]int, 0)
+
+	switch source {
+	case 3, 4:
+		// ETA指标库、ETA预测指标
+		edbInfoType := 0
+		if source == 4 {
+			edbInfoType = 1
+		}
+
+		// 获取指标
+		edbInfoItem, tmpErr := data_manage.GetEdbInfoById(dataId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		// 获取分类
+		classifyItem, tmpErr := data_manage.GetEdbClassifyById(edbInfoItem.ClassifyId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		// 判断分类是否涉密,不涉密就直接返回
+		if classifyItem.IsJoinPermission == 0 {
+			return
+		}
+
+		// 获取已经配置分类权限的用户ID列表
+		authIdList, err = data_manage_permission.GetPermissionUserIdListByEdbClassifyId(dataId, edbInfoType)
+	case 5:
+		// 图库
+
+		// 获取图表
+		chartInfoItem, tmpErr := data_manage.GetChartInfoById(dataId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		// 获取分类
+		classifyItem, tmpErr := data_manage.GetChartClassifyById(chartInfoItem.ChartClassifyId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		// 判断分类是否涉密,不涉密就直接返回
+		if classifyItem.IsJoinPermission == 0 {
+			return
+		}
+
+		chartClassifySource := utils.CHART_SOURCE_DEFAULT
+		authIdList, err = data_manage_permission.GetPermissionUserIdListByChartClassifyId(dataId, chartClassifySource)
+	case 6:
+		// ETA表格
+
+		// 获取图表
+		excelInfoItem, tmpErr := excel.GetNoContentExcelInfoByExcelId(dataId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		// 获取分类
+		classifyItem, tmpErr := excel.GetExcelClassifyById(excelInfoItem.ExcelClassifyId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		// 判断分类是否涉密,不涉密就直接返回
+		if classifyItem.IsJoinPermission == 0 {
+			return
+		}
+
+		authIdList, err = data_manage_permission.GetPermissionUserIdListByExcelClassifyId(dataId, subSource)
+	default:
+		return
+	}
+
+	// 已经授权的用户map
+	authUserIdMap := make(map[int]int)
+	for _, v := range authIdList {
+		authUserIdMap[v] = v
+	}
+
+	// 获取所有在用的用户
+	cond := ` AND enabled = 1`
+	pars := make([]interface{}, 0)
+
+	adminList, authRecordErr := system.GetSysAdminList(cond, pars, []string{}, "")
+	if authRecordErr != nil {
+		return
+	}
+
+	for _, v := range adminList {
+		if _, ok := authUserIdMap[v.AdminId]; !ok {
+			idList = append(idList, v.AdminId)
+		}
+	}
+
+	return
+}
+
+// InheritParentClassify
+// @Description: 继承父级分类的涉密权限
+// @author: Roc
+// @datetime 2024-04-07 21:09:16
+// @param source int
+// @param subSource int
+// @param classifyId int
+// @param parentClassifyId int
+// @param classifyName string
+func InheritParentClassify(source, subSource, classifyId, parentClassifyId int, classifyName string) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(fmt.Sprintf("继承父级分类失败:%s;source:%d;sub_source:%d;分类ID列表:%v", err.Error(), source, subSource, classifyId))
+			utils.FileLog.Error(fmt.Sprintf("继承父级分类失败:%s;source:%d;sub_source:%d;分类ID列表:%v", err.Error(), source, subSource, classifyId))
+		}
+	}()
+
+	// 一级分类不用继承
+	if parentClassifyId <= 0 {
+		return
+	}
+	uniqueCode := uuid.NewUUID().Hex32()
+	switch source {
+	case 3, 4:
+		//ETA指标库、ETA预测指标
+		// 分类信息
+		parentClassifyInfo, tmpErr := data_manage.GetEdbClassifyById(parentClassifyId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		// 没有标记涉密那么就忽略
+		if parentClassifyInfo.IsJoinPermission == 0 {
+			return
+		}
+
+		// 重新设置权限
+		classifyType := 0
+		if source == 4 {
+			classifyType = 1
+		}
+
+		err = data_manage_permission.InheritParentClassifyByEdbClassifyId(source, classifyType, classifyId, parentClassifyId, classifyName, uniqueCode)
+
+	case 5:
+		//图库
+		// 分类信息
+		parentClassifyInfo, tmpErr := data_manage.GetChartClassifyById(parentClassifyId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		// 没有标记涉密那么就忽略
+		if parentClassifyInfo.IsJoinPermission == 0 {
+			return
+		}
+
+		// 重新设置权限
+		chartClassifySource := utils.CHART_SOURCE_DEFAULT
+		err = data_manage_permission.InheritParentClassifyByChartClassifyId(source, chartClassifySource, classifyId, parentClassifyId, classifyName, uniqueCode)
+
+	case 6:
+		// ETA表格
+
+		// 分类信息
+		parentClassifyInfo, tmpErr := excel.GetExcelClassifyById(parentClassifyId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		// 没有标记涉密那么就忽略
+		if parentClassifyInfo.IsJoinPermission == 0 {
+			return
+		}
+
+		// 重新设置权限
+		err = data_manage_permission.InheritParentClassifyByExcelClassifyId(source, subSource, classifyId, parentClassifyId, classifyName, uniqueCode)
+
+	default:
+		return
+	}
+}

+ 155 - 0
services/data/data_manage_permission/excel.go

@@ -0,0 +1,155 @@
+package data_manage_permission
+
+import (
+	"eta/eta_api/models/data_manage/data_manage_permission"
+	"eta/eta_api/models/data_manage/excel"
+	"eta/eta_api/utils"
+	"fmt"
+)
+
+// CheckExcelPermissionByPermissionIdList
+// @Description: 检查ETA图库(只包含ETA图库,不包含统计分析等模块)权限
+// @author: Roc
+// @datetime 2024-03-28 16:12:08
+// @param excelIsJoinPermission int
+// @param excelClassifyIsJoinPermission int
+// @param excelInfoId int
+// @param excelClassifyId int
+// @param permissionExcelInfoIdList []int
+// @param permissionExcelClassifyIdList []int
+// @return hasAuth bool
+func CheckExcelPermissionByPermissionIdList(excelIsJoinPermission, excelClassifyIsJoinPermission, excelInfoId, excelClassifyId int, permissionExcelInfoIdList, permissionExcelClassifyIdList []int) (hasAuth bool) {
+	//hasAuth = true
+
+	// 判断 分类是否纳入权限管控
+	if excelClassifyIsJoinPermission == 1 {
+		// 不属于已授权的分类,那么就无权限
+		if !utils.InArrayByInt(permissionExcelClassifyIdList, excelClassifyId) {
+			return false
+		}
+	}
+
+	// 判断 指标是否纳入权限管控
+	if excelIsJoinPermission == 1 {
+		// 不属于已授权的指标,那么就无权限
+		if !utils.InArrayByInt(permissionExcelInfoIdList, excelInfoId) {
+			return false
+		}
+	}
+
+	hasAuth = true
+
+	return
+}
+
+// CheckExcelClassifyPermissionByPermissionIdList
+// @Description: 检查EDB分类权限
+// @author: Roc
+// @datetime 2024-03-29 14:35:19
+// @param excelClassifyIsJoinPermission int
+// @param excelClassifyId int
+// @param permissionExcelClassifyIdList []int
+// @return hasAuth bool
+func CheckExcelClassifyPermissionByPermissionIdList(excelClassifyIsJoinPermission, excelClassifyId int, permissionExcelClassifyIdList []int) (hasAuth bool) {
+	// 判断 分类是否纳入权限管控
+	if excelClassifyIsJoinPermission == 1 {
+		// 不属于已授权的分类,那么就无权限
+		if !utils.InArrayByInt(permissionExcelClassifyIdList, excelClassifyId) {
+			return
+		}
+	}
+
+	hasAuth = true
+
+	return
+}
+
+// GetUserExcelAndClassifyPermissionList
+// @Description: 根据用户获取已经授权指标ID列表和指标分类ID列表
+// @author: Roc
+// @datetime 2024-03-28 17:20:36
+// @param userId int
+// @param excelInfoId int 如果传递了excelInfoId,则只返回该excelInfoId的权限列表(其实也就是为了判断是否存在该指标权限了,目的是为了少获取数据)
+// @param classifyId int  classifyId,则只返回该classifyId的权限列表(其实也就是为了判断是否存在该指标分类权限了,目的是为了少获取数据)
+// @return excelIdList []int
+// @return classifyIdList []int
+// @return err error
+func GetUserExcelAndClassifyPermissionList(userId, excelInfoId, classifyId int) (excelIdList, classifyIdList []int, err error) {
+	// 获取有权限的指标ID列表
+	excelIdList, err = data_manage_permission.GetPermissionExcelIdList(userId, excelInfoId)
+	if err != nil {
+		fmt.Println("获取授权指标列表失败, err:", err)
+		return
+	}
+
+	// 获取有权限的指标分类ID列表
+	classifyIdList, err = data_manage_permission.GetPermissionExcelClassifyIdList(userId, classifyId)
+	if err != nil {
+		fmt.Println("获取授权指标分类列表失败, err:", err)
+		return
+	}
+
+	return
+}
+
+// GetUserExcelClassifyPermissionList
+// @Description: 根据用户获取已经授权指标分类ID列表
+// @author: Roc
+// @datetime 2024-03-28 17:20:36
+// @param userId int
+// @param classifyId int  classifyId,则只返回该classifyId的权限列表(其实也就是为了判断是否存在该指标分类权限了,目的是为了少获取数据)
+// @return classifyIdList []int
+// @return err error
+func GetUserExcelClassifyPermissionList(userId, classifyId int) (classifyIdList []int, err error) {
+	// 获取有权限的指标分类ID列表
+	classifyIdList, err = data_manage_permission.GetPermissionExcelClassifyIdList(userId, classifyId)
+	if err != nil {
+		fmt.Println("获取授权指标分类列表失败, err:", err)
+		return
+	}
+
+	return
+}
+
+// CheckExcelPermissionByExcelInfoId
+// @Description: 根据指标id和指标分类id,检查EDB指标(含预测指标)权限(方法内部自己获取所有的指标和指标分类权限,不用额外传递)
+// @author: Roc
+// @datetime 2024-03-29 13:28:06
+// @param excelInfoId int
+// @param excelClassifyId int
+// @param excelIsJoinPermission int
+// @param userId int
+// @return hasAuth bool
+// @return err error
+func CheckExcelPermissionByExcelInfoId(excelInfoId, excelClassifyId, excelIsJoinPermission, userId int) (hasAuth bool, err error) {
+	currClassify, err := excel.GetExcelClassifyById(excelClassifyId)
+	if err != nil {
+		return
+	}
+	if currClassify != nil {
+		return CheckExcelPermission(excelIsJoinPermission, currClassify.IsJoinPermission, userId, excelInfoId, excelClassifyId)
+	}
+
+	return
+}
+
+// CheckExcelPermission
+// @Description: 检查EDB指标(含预测指标)权限(方法内部自己获取所有的指标和指标分类权限,不用额外传递)
+// @author: Roc
+// @datetime 2024-03-28 16:12:08
+// @param excelIsJoinPermission int
+// @param excelClassifyIsJoinPermission int
+// @param excelInfoId int
+// @param excelClassifyId int
+// @return hasAuth bool
+func CheckExcelPermission(excelIsJoinPermission, excelClassifyIsJoinPermission, userId, excelInfoId, excelClassifyId int) (hasAuth bool, err error) {
+	excelIdList, classifyIdList, err := GetUserExcelAndClassifyPermissionList(userId, excelInfoId, excelClassifyId)
+	if err != nil {
+		fmt.Println("GetUserExcelAndClassifyPermissionList err:", err)
+		return
+	}
+
+	hasAuth = CheckExcelPermissionByPermissionIdList(excelIsJoinPermission, excelClassifyIsJoinPermission, excelInfoId, excelClassifyId, excelIdList, classifyIdList)
+
+	return
+}

+ 152 - 0
services/data/data_manage_permission/message.go

@@ -0,0 +1,152 @@
+package data_manage_permission
+
+import (
+	"eta/eta_api/models/data_manage/data_manage_permission"
+	"eta/eta_api/utils"
+)
+
+type MessageDetailItem struct {
+	DataPermissionMoveRecordId int64  ` orm:"column(data_permission_move_record_id);pk"` // 数据操作记录id
+	Source                     int32  // 数据来源,1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格
+	SubSource                  int32  // 子来源 :ETA表格中的各种表格类型,以及图表的来源(这个是后续的扩展方向)
+	OpUniqueCode               string // 操作的唯一编码,主要是记录统一操作的日志
+	DataId                     string // 资产id(指标、图表、表格)
+	DataCode                   string // 资产code(指标、图表、表格)
+	DataName                   string // 资产名称(指标、图表、表格)
+	OriginalUserId             int32  // 原创建人id
+	OriginalUserName           string // 原创建人名称
+	NewUserId                  int32  // 新创建人id
+	NewUserName                string // 新创建人名称
+	CreateTime                 string
+}
+
+// GetMessageDetail
+// @Description: 获取消息详情
+// @author: Roc
+// @datetime 2024-04-07 10:07:06
+// @param messageInfo *data_manage_permission.DataPermissionMessage
+// @param source int
+// @param subSource int
+// @param startSize int
+// @param pageSize int
+// @return resp interface{}
+// @return err error
+func GetMessageDetail(messageInfo *data_manage_permission.DataPermissionMessage, source, subSource, startSize, pageSize int) (total int, resp interface{}, err error) {
+	switch messageInfo.OpType {
+	// 操作类型,1:单个资产转移,2:资产模块转移,3:资产授权,4:资产分类授权
+	case 1, 2:
+		tmpTotal, list, tmpErr := data_manage_permission.GetDataPermissionMoveRecordListByOpUniqueCode(messageInfo.OpUniqueCode, source, subSource, startSize, pageSize)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		total = tmpTotal
+		resp, err = formatMessageDetailItemByDataPermissionMoveRecord(list)
+	case 3:
+		tmpTotal, list, tmpErr := data_manage_permission.GetDataPermissionNoAuthRecordListByUserId(messageInfo.ReceiveUserId, messageInfo.Source, messageInfo.SubSource, startSize, pageSize)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		total = tmpTotal
+		resp, err = formatMessageDetailItemByDataPermissionNoAuthRecord(list)
+	case 4:
+		tmpTotal, list, tmpErr := data_manage_permission.GetDataPermissionClassifyNoAuthRecordListByUserId(messageInfo.ReceiveUserId, messageInfo.Source, messageInfo.SubSource, startSize, pageSize)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		total = tmpTotal
+		resp, err = formatMessageDetailItemByDataPermissionClassifyNoAuthRecord(list)
+
+	}
+
+	return
+}
+
+// formatMessageDetailItemByDataPermissionMoveRecord
+// @Description: 根据转移指标权限数据格式化列表数据
+// @author: Roc
+// @datetime 2024-04-07 20:20:09
+// @param items []*data_manage_permission.DataPermissionMoveRecord
+// @return resp []*MessageDetailItem
+// @return err error
+func formatMessageDetailItemByDataPermissionMoveRecord(items []*data_manage_permission.DataPermissionMoveRecord) (resp []*MessageDetailItem, err error) {
+	resp = make([]*MessageDetailItem, 0)
+	for _, v := range items {
+		resp = append(resp, &MessageDetailItem{
+			DataPermissionMoveRecordId: v.DataPermissionMoveRecordId,
+			Source:                     v.Source,
+			SubSource:                  v.SubSource,
+			OpUniqueCode:               v.OpUniqueCode,
+			DataId:                     v.DataId,
+			DataCode:                   v.DataCode,
+			DataName:                   v.DataName,
+			OriginalUserId:             v.OriginalUserId,
+			OriginalUserName:           v.OriginalUserName,
+			NewUserId:                  v.NewUserId,
+			NewUserName:                v.NewUserName,
+			CreateTime:                 utils.TimeTransferString(utils.FormatDateTime, v.CreateTime),
+		})
+	}
+
+	return
+}
+
+// formatMessageDetailItemByDataPermissionNoAuthRecord
+// @Description: 根据资产授权数据权限格式化列表数据
+// @author: Roc
+// @datetime 2024-04-07 20:20:00
+// @param items []*data_manage_permission.DataPermissionNoAuthRecord
+// @return resp []*MessageDetailItem
+// @return err error
+func formatMessageDetailItemByDataPermissionNoAuthRecord(items []*data_manage_permission.DataPermissionNoAuthRecord) (resp []*MessageDetailItem, err error) {
+	resp = make([]*MessageDetailItem, 0)
+	for _, v := range items {
+		resp = append(resp, &MessageDetailItem{
+			DataPermissionMoveRecordId: v.DataPermissionNoAuthRecordId,
+			Source:                     v.Source,
+			SubSource:                  v.SubSource,
+			OpUniqueCode:               v.OpUniqueCode,
+			DataId:                     v.DataId,
+			DataCode:                   v.DataCode,
+			DataName:                   v.DataName,
+			//OriginalUserId:             v.OriginalUserId,
+			//OriginalUserName:           v.OriginalUserName,
+			//NewUserId:                  v.NewUserId,
+			//NewUserName:                v.NewUserName,
+			CreateTime: utils.TimeTransferString(utils.FormatDateTime, v.CreateTime),
+		})
+	}
+
+	return
+}
+
+// formatMessageDetailItemByDataPermissionClassifyNoAuthRecord
+// @Description: 根据资产分类授权数据权限格式化列表数据
+// @author: Roc
+// @datetime 2024-04-07 20:19:39
+// @param items []*data_manage_permission.DataPermissionClassifyNoAuthRecord
+// @return resp []*MessageDetailItem
+// @return err error
+func formatMessageDetailItemByDataPermissionClassifyNoAuthRecord(items []*data_manage_permission.DataPermissionClassifyNoAuthRecord) (resp []*MessageDetailItem, err error) {
+	resp = make([]*MessageDetailItem, 0)
+	for _, v := range items {
+		resp = append(resp, &MessageDetailItem{
+			DataPermissionMoveRecordId: v.DataPermissionClassifyNoAuthRecordId,
+			Source:                     v.Source,
+			SubSource:                  v.SubSource,
+			OpUniqueCode:               v.OpUniqueCode,
+			DataId:                     v.ClassifyId,
+			DataCode:                   v.ClassifyId,
+			DataName:                   v.ClassifyName,
+			//OriginalUserId:             v.OriginalUserId,
+			//OriginalUserName:           v.OriginalUserName,
+			//NewUserId:                  v.NewUserId,
+			//NewUserName:                v.NewUserName,
+			CreateTime: utils.TimeTransferString(utils.FormatDateTime, v.CreateTime),
+		})
+	}
+
+	return
+}

+ 99 - 13
services/data/edb_classify.go

@@ -8,6 +8,7 @@ import (
 	"eta/eta_api/models/data_manage/excel"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/alarm_msg"
+	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/services/data_stat"
 	"eta/eta_api/utils"
 	"fmt"
@@ -85,6 +86,8 @@ func GetFullClassifyByClassifyId(targetClassifyId int) (targetList []*data_manag
 		targetItem.UniqueCode = targetClassify.UniqueCode
 		targetItem.Level = targetClassify.Level
 		targetItem.ClassifyName = targetClassify.ClassifyName
+		targetItem.ClassifyName = targetClassify.ClassifyName
+		targetItem.IsJoinPermission = targetClassify.IsJoinPermission
 		targetList = append(targetList, targetItem)
 		return
 	}
@@ -116,6 +119,7 @@ func GetFullClassifyByClassifyId(targetClassifyId int) (targetList []*data_manag
 				targetItem.UniqueCode = v.UniqueCode
 				targetItem.Level = v.Level
 				targetItem.ClassifyName = v.ClassifyName
+				targetItem.IsJoinPermission = v.IsJoinPermission
 				targetList = append(targetList, targetItem)
 			}
 		}
@@ -164,6 +168,7 @@ func GetChildClassifyByClassifyId(targetClassifyId int) (targetList []*data_mana
 				targetItem.UniqueCode = v.UniqueCode
 				targetItem.Level = v.Level
 				targetItem.ClassifyName = v.ClassifyName
+				targetItem.IsJoinPermission = v.IsJoinPermission
 				targetList = append(targetList, targetItem)
 			}
 		}
@@ -306,6 +311,16 @@ func AddEdbClassify(classifyName string, parentId, level int, classifyType uint8
 		errMsg = "保存分类失败"
 		return
 	}
+
+	// 继承分类权限
+	{
+		source := 3
+		if classifyType == 1 {
+			source = 4
+		}
+		go data_manage_permission.InheritParentClassify(source, int(classifyType), int(newId), classifyInfo.ParentId, classifyInfo.ClassifyName)
+	}
+
 	if parentId == 0 { //一级目录的rootId等于自己本身
 		classifyInfo.ClassifyId = int(newId)
 		classifyInfo.RootId = int(newId)
@@ -329,15 +344,25 @@ func EditEdbClassify(classifyId int, classifyName string, sysUser *system.Admin)
 
 	// 权限校验
 	{
+		// 已授权分类id
+		permissionClassifyIdList, tmpErr := data_manage_permission.GetUserEdbClassifyPermissionList(sysUser.AdminId, classifyId)
+		if tmpErr != nil {
+			errMsg = "保存失败"
+			err = errors.New("获取已授权分类id数据失败,Err:" + tmpErr.Error())
+			return
+		}
+		// 数据权限
+		haveOperaAuth := data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(item.IsJoinPermission, item.ClassifyId, permissionClassifyIdList)
+
 		if item.ClassifyType == 0 { // 普通指标
-			button := GetEdbClassifyOpButton(sysUser, item.SysUserId)
+			button := GetEdbClassifyOpButton(sysUser, item.SysUserId, haveOperaAuth)
 			if !button.OpButton {
 				errMsg = "无操作权限"
 				err = errors.New(errMsg)
 				return
 			}
 		} else if item.ClassifyType == 1 { // 预测指标
-			button := GetPredictEdbClassifyOpButton(sysUser, item.SysUserId)
+			button := GetPredictEdbClassifyOpButton(sysUser, item.SysUserId, haveOperaAuth)
 			if !button.OpButton {
 				errMsg = "无操作权限"
 				err = errors.New(errMsg)
@@ -382,17 +407,27 @@ func DeleteCheck(classifyId, edbInfoId int, sysUser *system.Admin) (deleteStatus
 			err = tmpErr
 			return
 		}
+		// 已授权分类id
+		permissionClassifyIdList, tmpErr := data_manage_permission.GetUserEdbClassifyPermissionList(sysUser.AdminId, classifyId)
+		if tmpErr != nil {
+			errMsg = "删除检测失败"
+			err = errors.New("获取已授权分类id数据失败,Err:" + tmpErr.Error())
+			return
+		}
 		// 权限校验
 		{
+			// 数据权限
+			haveOperaAuth := data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(item.IsJoinPermission, item.ClassifyId, permissionClassifyIdList)
+
 			if item.ClassifyType == 0 { // 普通指标
-				button := GetEdbClassifyOpButton(sysUser, item.SysUserId)
+				button := GetEdbClassifyOpButton(sysUser, item.SysUserId, haveOperaAuth)
 				if !button.DeleteButton {
 					errMsg = "无操作权限"
 					err = errors.New(errMsg)
 					return
 				}
 			} else if item.ClassifyType == 1 { // 预测指标
-				button := GetPredictEdbClassifyOpButton(sysUser, item.SysUserId)
+				button := GetPredictEdbClassifyOpButton(sysUser, item.SysUserId, haveOperaAuth)
 				if !button.DeleteButton {
 					errMsg = "无操作权限"
 					err = errors.New(errMsg)
@@ -534,17 +569,27 @@ func Delete(classifyId, edbInfoId int, sysUser *system.Admin, requestBody, reque
 			err = tmpErr
 			return
 		}
+		// 已授权分类id
+		permissionClassifyIdList, tmpErr := data_manage_permission.GetUserEdbClassifyPermissionList(sysUser.AdminId, classifyId)
+		if tmpErr != nil {
+			errMsg = "删除失败"
+			err = errors.New("获取已授权分类id数据失败,Err:" + tmpErr.Error())
+			return
+		}
 		// 权限校验
 		{
+			// 数据权限
+			haveOperaAuth := data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(item.IsJoinPermission, item.ClassifyId, permissionClassifyIdList)
+
 			if item.ClassifyType == 0 { // 普通指标
-				button := GetEdbClassifyOpButton(sysUser, item.SysUserId)
+				button := GetEdbClassifyOpButton(sysUser, item.SysUserId, haveOperaAuth)
 				if !button.DeleteButton {
 					errMsg = "无操作权限"
 					err = errors.New(errMsg)
 					return
 				}
 			} else if item.ClassifyType == 1 { // 预测指标
-				button := GetPredictEdbClassifyOpButton(sysUser, item.SysUserId)
+				button := GetPredictEdbClassifyOpButton(sysUser, item.SysUserId, haveOperaAuth)
 				if !button.DeleteButton {
 					errMsg = "无操作权限"
 					err = errors.New(errMsg)
@@ -811,15 +856,25 @@ func MoveEdbClassify(req data_manage.MoveEdbClassifyReq, sysUser *system.Admin,
 
 		// 权限校验
 		{
+			// 已授权分类id
+			permissionClassifyIdList, tmpErr := data_manage_permission.GetUserEdbClassifyPermissionList(sysUser.AdminId, classifyId)
+			if tmpErr != nil {
+				errMsg = "移动失败"
+				err = errors.New("获取已授权分类id数据失败,Err:" + tmpErr.Error())
+				return
+			}
+			// 数据权限
+			haveOperaAuth := data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(edbClassifyInfo.IsJoinPermission, edbClassifyInfo.ClassifyId, permissionClassifyIdList)
+
 			if edbClassifyInfo.ClassifyType == 0 { // 普通指标
-				button := GetEdbClassifyOpButton(sysUser, edbClassifyInfo.SysUserId)
+				button := GetEdbClassifyOpButton(sysUser, edbClassifyInfo.SysUserId, haveOperaAuth)
 				if !button.MoveButton {
 					errMsg = "无操作权限"
 					err = errors.New(errMsg)
 					return
 				}
 			} else if edbClassifyInfo.ClassifyType == 1 { // 预测指标
-				button := GetPredictEdbClassifyOpButton(sysUser, edbClassifyInfo.SysUserId)
+				button := GetPredictEdbClassifyOpButton(sysUser, edbClassifyInfo.SysUserId, haveOperaAuth)
 				if !button.MoveButton {
 					errMsg = "无操作权限"
 					err = errors.New(errMsg)
@@ -845,8 +900,20 @@ func MoveEdbClassify(req data_manage.MoveEdbClassifyReq, sysUser *system.Admin,
 			err = errors.New(errMsg)
 			return
 		}
+
+		var haveOperaAuth bool
+		// 权限校验
+		{
+			haveOperaAuth, err = data_manage_permission.CheckEdbPermissionByEdbInfoId(edbInfo.EdbInfoId, edbInfo.ClassifyId, edbInfo.IsJoinPermission, sysUser.AdminId)
+			if err != nil {
+				errMsg = "移动失败"
+				err = errors.New("获取指标权限信息失败,Err:" + err.Error())
+				return
+			}
+		}
+
 		// 移动权限校验
-		button := GetEdbOpButton(sysUser, edbInfo.SysUserId, edbInfo.EdbType, edbInfo.EdbInfoType)
+		button := GetEdbOpButton(sysUser, edbInfo.SysUserId, edbInfo.EdbType, edbInfo.EdbInfoType, haveOperaAuth)
 		if !button.MoveButton {
 			errMsg = "无操作权限"
 			err = errors.New(errMsg)
@@ -1186,7 +1253,11 @@ func moveEdbClassify(parentEdbClassifyInfo, edbClassifyInfo, prevClassify, nextC
 }
 
 // GetEdbOpButton 获取ETA指标的操作权限
-func GetEdbOpButton(sysUser *system.Admin, belongUserId, edbType, edbInfoType int) (button data_manage.EdbClassifyItemsButton) {
+func GetEdbOpButton(sysUser *system.Admin, belongUserId, edbType, edbInfoType int, haveOperaAuth bool) (button data_manage.EdbClassifyItemsButton) {
+	// 没有数据权限就直接返回
+	if !haveOperaAuth {
+		return
+	}
 	//2、用户对于自己添加的分类,有权限编辑、移动和删除该分类;
 	//3、ficc管理员和超管对所有分类有编辑、移动和删除权限;
 	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN || sysUser.AdminId == belongUserId || sysUser.EdbPermission == 1 {
@@ -1206,7 +1277,12 @@ func GetEdbOpButton(sysUser *system.Admin, belongUserId, edbType, edbInfoType in
 }
 
 // GetEdbClassifyOpButton 获取ETA指标分类的操作权限
-func GetEdbClassifyOpButton(sysUser *system.Admin, belongUserId int) (button data_manage.EdbClassifyItemsButton) {
+func GetEdbClassifyOpButton(sysUser *system.Admin, belongUserId int, haveOperaAuth bool) (button data_manage.EdbClassifyItemsButton) {
+	// 没有数据权限就直接返回
+	if !haveOperaAuth {
+		return
+	}
+
 	//ficc管理员和超管和ficc研究员有权限创建和管理分类,可以编辑分类名称(分类名称不允许重复),可以拖动分类,改变分类顺序,可以拖动分类下模型,改变顺序,可以删除分类,若分类下有预测指标,则不允许删除;
 	//if utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RESEARCHR, utils.ROLE_TYPE_CODE_FICC_RESEARCHR}, sysUser.RoleTypeCode) {
 	button.AddButton = true
@@ -1219,7 +1295,12 @@ func GetEdbClassifyOpButton(sysUser *system.Admin, belongUserId int) (button dat
 }
 
 // GetPredictEdbOpButton 获取ETA预测指标的操作权限
-func GetPredictEdbOpButton(sysUser *system.Admin, belongUserId int) (button data_manage.EdbClassifyItemsButton) {
+func GetPredictEdbOpButton(sysUser *system.Admin, belongUserId int, haveOperaAuth bool) (button data_manage.EdbClassifyItemsButton) {
+	// 没有数据权限就直接返回
+	if !haveOperaAuth {
+		return
+	}
+
 	//预测指标的添加人对该预测指标有全部操作权限,ficc管理员、超管对所有预测指标有全部操作权限;
 	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN || sysUser.AdminId == belongUserId || sysUser.PredictEdbPermission == 1 {
 		button.AddButton = true
@@ -1234,7 +1315,12 @@ func GetPredictEdbOpButton(sysUser *system.Admin, belongUserId int) (button data
 }
 
 // GetPredictEdbClassifyOpButton 获取ETA预测指标分类的操作权限
-func GetPredictEdbClassifyOpButton(sysUser *system.Admin, belongUserId int) (button data_manage.EdbClassifyItemsButton) {
+func GetPredictEdbClassifyOpButton(sysUser *system.Admin, belongUserId int, haveOperaAuth bool) (button data_manage.EdbClassifyItemsButton) {
+	// 没有数据权限就直接返回
+	if !haveOperaAuth {
+		return
+	}
+
 	//ficc管理员和超管和ficc研究员有权限创建和管理分类,可以编辑分类名称(分类名称不允许重复),可以拖动分类,改变分类顺序,可以拖动分类下模型,改变顺序,可以删除分类,若分类下有预测指标,则不允许删除;
 	//if utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RESEARCHR, utils.ROLE_TYPE_CODE_FICC_RESEARCHR}, sysUser.RoleTypeCode) {
 	button.AddButton = true

+ 44 - 576
services/data/edb_info.go

@@ -5,8 +5,8 @@ import (
 	"errors"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
-	"eta/eta_api/models/system"
 	"eta/eta_api/services/alarm_msg"
+	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/services/elastic"
 	"eta/eta_api/utils"
 	"fmt"
@@ -1718,544 +1718,6 @@ func getRefreshEdbInfoListByIds(edbInfoIdList []int) (newBaseEdbInfoArr, newBase
 	return
 }
 
-// GetMoveEdbChartList 获取待转移的指标/图表列表
-// @param source 来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库
-func GetMoveEdbChartList(source, userId int, keyword, classify string, startSize, pageSize int) (list []data_manage.MoveEdbChartList, total int, err error) {
-	var condition string
-	var pars []interface{}
-	switch source {
-	case 1: //手工数据指标
-		if keyword != "" {
-			condition += ` AND (a.SEC_NAME LIKE ? OR a.TRADE_CODE like ? ) `
-			pars = utils.GetLikeKeywordPars(pars, keyword, 2)
-		}
-		if userId > 0 {
-			condition += ` AND a.user_id = ? `
-			pars = append(pars, userId)
-		}
-
-		if classify != "" {
-			condition += ` AND a.classify_id IN (` + classify + `) `
-		}
-
-		total, err = models.GetEdbinfoListCount(condition, pars, "", 0)
-		if err != nil {
-			return
-		}
-		tmpList, tmpErr := models.GetEdbinfoList(condition, pars, startSize, pageSize, "", 0)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-
-		if len(tmpList) > 0 {
-			adminIdList := make([]int, 0)
-			for _, v := range tmpList {
-				adminIdList = append(adminIdList, v.UserId)
-			}
-			adminList, tmpErr := system.GetAdminListByIdListWithoutEnable(adminIdList)
-			if tmpErr != nil {
-				err = tmpErr
-				return
-			}
-			adminMap := make(map[int]string)
-			for _, adminInfo := range adminList {
-				adminMap[adminInfo.AdminId] = adminInfo.RealName
-			}
-
-			for _, v := range tmpList {
-				list = append(list, data_manage.MoveEdbChartList{
-					DataId:         v.TradeCode,
-					Code:           v.TradeCode,
-					Name:           v.SecName,
-					ClassifyName:   v.ClassifyName,
-					CreateUserId:   v.UserId,
-					CreateUserName: adminMap[v.UserId],
-				})
-			}
-		}
-
-	case 2: //钢联化工数据库
-		if keyword != `` {
-			condition += " AND (index_name like ? OR index_code like ? OR sys_user_real_name like ? ) "
-			pars = utils.GetLikeKeywordPars(pars, keyword, 3)
-		}
-		if userId > 0 {
-			condition += ` AND sys_user_id = ? `
-			pars = append(pars, userId)
-		}
-
-		if classify != "" {
-			condition += ` AND base_from_mysteel_chemical_classify_id IN (` + classify + `) `
-		}
-
-		total, err = data_manage.GetMysteelChemicalIndexCount(condition, pars)
-		if err != nil {
-			return
-		}
-		tmpList, tmpErr := data_manage.GetMysteelChemicalIndexList(condition, pars, startSize, pageSize)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-
-		for _, v := range tmpList {
-			list = append(list, data_manage.MoveEdbChartList{
-				DataId: strconv.Itoa(v.BaseFromMysteelChemicalIndexId),
-				Code:   v.IndexCode,
-				Name:   v.IndexName,
-				//ClassifyName: v.,
-				CreateUserId:   v.SysUserId,
-				CreateUserName: v.SysUserRealName,
-			})
-		}
-	case 3, 4: //ETA指标库、ETA预测指标
-		if keyword != `` {
-			condition += " AND (edb_code like ? OR edb_name like ? OR sys_user_real_name like ? ) "
-			pars = utils.GetLikeKeywordPars(pars, keyword, 3)
-		}
-		if userId > 0 {
-			condition += ` AND sys_user_id = ? `
-			pars = append(pars, userId)
-		}
-		if classify != "" {
-			condition += ` AND classify_id IN (` + classify + `) `
-		}
-
-		edbInfoType := 0 //ETA指标库
-		if source == 4 { //ETA预测指标
-			edbInfoType = 1
-		}
-		condition += ` AND edb_info_type = ? `
-		pars = append(pars, edbInfoType)
-
-		total, err = data_manage.GetEdbInfoByConditionCount(condition, pars)
-		if err != nil {
-			return
-		}
-		tmpList, tmpErr := data_manage.GetEdbInfoListByCondition(condition, pars, startSize, pageSize)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-
-		for _, v := range tmpList {
-			list = append(list, data_manage.MoveEdbChartList{
-				DataId: strconv.Itoa(v.EdbInfoId),
-				Code:   v.EdbCode,
-				Name:   v.EdbName,
-				//ClassifyName: v.,
-				CreateUserId:   v.SysUserId,
-				CreateUserName: v.SysUserRealName,
-			})
-		}
-	case 5: //图库
-		if keyword != `` {
-			condition += " AND (chart_name like ?  OR sys_user_real_name like ? ) "
-			pars = utils.GetLikeKeywordPars(pars, keyword, 2)
-		}
-		if userId > 0 {
-			condition += ` AND sys_user_id = ? `
-			pars = append(pars, userId)
-		}
-		if classify != "" {
-			condition += ` AND chart_classify_id IN (` + classify + `) `
-		}
-
-		total, err = data_manage.GetChartInfoCountByCondition(condition, pars)
-		if err != nil {
-			return
-		}
-		tmpList, tmpErr := data_manage.GetChartInfoListByCondition(condition, pars, startSize, pageSize)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-
-		// 获取所有的图表分类
-		firstClassifyList, tmpErr := data_manage.GetChartClassifyByParentId(0, 1)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-		firstClassifyNameMap := make(map[int]string)
-		for _, v := range firstClassifyList {
-			firstClassifyNameMap[v.ChartClassifyId] = v.ChartClassifyName
-		}
-		secondClassList, tmpErr := data_manage.GetChartClassifyAll(1)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-		secondClassifyNameMap := make(map[int]string)
-		for _, v := range secondClassList {
-			firstName := firstClassifyNameMap[v.ParentId]
-			if firstName != `` {
-				firstName = firstName + " / "
-			}
-			secondClassifyNameMap[v.ChartClassifyId] = firstName + v.ChartClassifyName
-		}
-
-		for _, v := range tmpList {
-			list = append(list, data_manage.MoveEdbChartList{
-				DataId:         strconv.Itoa(v.ChartInfoId),
-				Name:           v.ChartName,
-				ClassifyName:   secondClassifyNameMap[v.ChartClassifyId],
-				CreateUserId:   v.SysUserId,
-				CreateUserName: v.SysUserRealName,
-			})
-		}
-	default:
-		return
-	}
-
-	return
-}
-
-// MoveEdbChart 转移指标/图表创建人
-// @param source 来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库
-func MoveEdbChart(source, userId int, dataId []string) (err error, errMsg string) {
-	adminInfo, err := system.GetSysAdminById(userId)
-	if err != nil {
-		return
-	}
-	switch source {
-	case 1: //手工数据指标
-		tmpList, tmpErr := models.GetEdbinfoListByCodeListGroupByUserId(dataId)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-
-		if len(tmpList) > 0 {
-			for _, v := range tmpList {
-				if v.UserId == userId {
-					errMsg = "新创建人不可和原创建人一致"
-					err = errors.New(errMsg)
-					return
-				}
-			}
-			// 修改创建人
-			err = models.ModifyEdbinfoUserIdByCodeList(dataId, userId)
-		}
-
-	case 2: //钢联化工数据库
-		tmpList, tmpErr := data_manage.GetMysteelChemicalIndexListGroupByUserId(dataId)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-		if len(tmpList) > 0 {
-			for _, v := range tmpList {
-				if v.SysUserId == userId {
-					errMsg = "新创建人不可和原创建人一致"
-					err = errors.New(errMsg)
-					return
-				}
-			}
-			// 修改创建人
-			err = data_manage.ModifyMysteelChemicalIndexUserIdByCodeList(dataId, adminInfo.AdminId, adminInfo.RealName)
-		}
-	case 3, 4: //ETA指标库、ETA预测指标
-		tmpList, tmpErr := data_manage.GetEdbInfoListGroupByUserId(dataId)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-		if len(tmpList) > 0 {
-			for _, v := range tmpList {
-				if v.SysUserId == userId {
-					errMsg = "新创建人不可和原创建人一致"
-					err = errors.New(errMsg)
-					return
-				}
-			}
-			// 修改创建人
-			err = data_manage.ModifyEdbInfoUserIdByCodeList(dataId, adminInfo.AdminId, adminInfo.RealName)
-
-			// 移除当前用户的不可操作权限
-			{
-				obj := data_manage.EdbInfoNoPermissionAdmin{}
-				for _, v := range dataId {
-					edbInfoId, _ := strconv.Atoi(v)
-					go obj.DeleteByEdbInfoIdAndAdminId(edbInfoId, adminInfo.AdminId)
-				}
-			}
-		}
-	case 5: //图库
-		tmpList, tmpErr := data_manage.GetChartInfoListGroupByUserId(dataId)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-		if len(tmpList) > 0 {
-			for _, v := range tmpList {
-				if v.SysUserId == userId {
-					errMsg = "新创建人不可和原创建人一致"
-					err = errors.New(errMsg)
-					return
-				}
-			}
-			// 修改创建人
-			err = data_manage.ModifyChartInfoUserIdByCodeList(dataId, adminInfo.AdminId, adminInfo.RealName)
-		}
-	default:
-		return
-	}
-
-	return
-}
-
-func GetEdbChartClassifyList(source int) (resp data_manage.EdbChartClassifyResp, err error) {
-	switch source {
-	case 1: //手工数据指标
-		list, e := models.GetEdbdataClassify(0)
-		if e != nil {
-			err = e
-			return
-		}
-
-		for _, v := range list {
-			item := data_manage.EdbChartClassify{
-				ClassifyId:   v.ClassifyId,
-				ClassifyName: v.ClassifyName,
-				ParentId:     v.ParentId,
-			}
-			for _, v2 := range v.Child {
-				child := data_manage.EdbChartClassify{
-					ClassifyId:   v2.ClassifyId,
-					ClassifyName: v2.ClassifyName,
-					ParentId:     v2.ParentId,
-				}
-				item.Child = append(item.Child, &child)
-			}
-			resp.List = append(resp.List, &item)
-		}
-
-	case 2: //钢联化工数据库
-		rootList, e := data_manage.GetBaseFromMysteelChemicalClassifyByParentId(0)
-		if e != nil && e.Error() != utils.ErrNoRow() {
-			err = e
-			return
-		}
-
-		classifyAll, e := data_manage.GetAllBaseFromMysteelChemicalClassify()
-		if e != nil && e.Error() != utils.ErrNoRow() {
-			err = e
-			return
-		}
-
-		rootChildMap := make(map[int][]*data_manage.BaseFromMysteelChemicalClassifyItems)
-		for _, v := range classifyAll {
-			rootChildMap[v.ParentId] = append(rootChildMap[v.ParentId], v)
-		}
-		nodeAll := make([]*data_manage.BaseFromMysteelChemicalClassifyItems, 0)
-
-		for _, v := range rootList {
-			if existItems, ok := rootChildMap[v.BaseFromMysteelChemicalClassifyId]; ok {
-				v.Children = existItems
-			} else {
-				items := make([]*data_manage.BaseFromMysteelChemicalClassifyItems, 0)
-				v.Children = items
-			}
-			nodeAll = append(nodeAll, v)
-		}
-
-		for _, v := range nodeAll {
-			item := data_manage.EdbChartClassify{
-				ClassifyId:   v.BaseFromMysteelChemicalClassifyId,
-				ClassifyName: v.ClassifyName,
-				ParentId:     v.ParentId,
-			}
-			for _, v2 := range v.Children {
-				child := data_manage.EdbChartClassify{
-					ClassifyId:   v2.BaseFromMysteelChemicalClassifyId,
-					ClassifyName: v2.ClassifyName,
-					ParentId:     v2.ParentId,
-				}
-				item.Child = append(item.Child, &child)
-			}
-			resp.List = append(resp.List, &item)
-		}
-
-	case 3: //ETA指标库
-		//rootList, e := data_manage.GetEdbClassifyByParentId(0, 0)
-		//if e != nil && e.Error() != utils.ErrNoRow() {
-		//	err = e
-		//	return
-		//}
-
-		// 考虑到后面可以会迭代到10层, 这里直接用递归处理
-		classifyAll, e := data_manage.GetAllEdbClassifyByType(0)
-		if e != nil && e.Error() != utils.ErrNoRow() {
-			err = e
-			return
-		}
-		resp.List = GetEdbMenuTreeRecursive(classifyAll, 0)
-
-		//rootChildMap := make(map[int][]*data_manage.EdbClassifyItems)
-		//for _, v := range classifyAll {
-		//	rootChildMap[v.ParentId] = append(rootChildMap[v.ParentId], v)
-		//}
-		//nodeAll := make([]*data_manage.EdbClassifyItems, 0)
-		//for _, v := range rootList {
-		//	if existItems, ok := rootChildMap[v.ClassifyId]; ok {
-		//		v.Children = existItems
-		//	} else {
-		//		items := make([]*data_manage.EdbClassifyItems, 0)
-		//		v.Children = items
-		//	}
-		//	nodeAll = append(nodeAll, v)
-		//}
-		//
-		//for _, v := range nodeAll {
-		//	item := data_manage.EdbChartClassify{
-		//		ClassifyId:   v.ClassifyId,
-		//		ClassifyName: v.ClassifyName,
-		//		ParentId:     v.ParentId,
-		//	}
-		//	for _, v2 := range v.Children {
-		//		child := data_manage.EdbChartClassify{
-		//			ClassifyId:   v2.ClassifyId,
-		//			ClassifyName: v2.ClassifyName,
-		//			ParentId:     v2.ParentId,
-		//		}
-		//		item.Child = append(item.Child, &child)
-		//	}
-		//	resp.List = append(resp.List, &item)
-		//}
-	case 4: //ETA预测指标
-		// 考虑到后面可以会迭代到10层, 这里直接用递归
-		classifyAll, e := data_manage.GetAllEdbClassifyByType(1)
-		if e != nil && e.Error() != utils.ErrNoRow() {
-			err = e
-			return
-		}
-		resp.List = GetEdbMenuTreeRecursive(classifyAll, 0)
-
-		//rootList, e := data_manage.GetEdbClassifyByParentId(0, 1)
-		//if e != nil && e.Error() != utils.ErrNoRow() {
-		//	err = e
-		//	return
-		//}
-		//nodeAll := make([]*data_manage.EdbClassifyItems, 0)
-		//for _, v := range rootList {
-		//	nodeAll = append(nodeAll, v)
-		//}
-		//
-		//for _, v := range nodeAll {
-		//	item := data_manage.EdbChartClassify{
-		//		ClassifyId:   v.ClassifyId,
-		//		ClassifyName: v.ClassifyName,
-		//		ParentId:     v.ParentId,
-		//	}
-		//	for _, v2 := range v.Children {
-		//		child := data_manage.EdbChartClassify{
-		//			ClassifyId:   v2.ClassifyId,
-		//			ClassifyName: v2.ClassifyName,
-		//			ParentId:     v2.ParentId,
-		//		}
-		//		item.Child = append(item.Child, &child)
-		//	}
-		//	resp.List = append(resp.List, &item)
-		//}
-	case 5: //图库
-
-		//判断是否存在缓存,如果存在缓存,那么直接从缓存中获取
-		//key := utils.CACHE_CHART_CLASSIFY
-		//if utils.Re == nil {
-		//	if utils.Re == nil && utils.Rc.IsExist(key) {
-		//		rep := new(data_manage.ChartClassifyListResp)
-		//		if data, err1 := utils.Rc.RedisBytes(key); err1 == nil {
-		//			e := json.Unmarshal(data, &rep)
-		//			if e == nil && rep != nil {
-		//				for _, v := range rep.AllNodes {
-		//					item := data_manage.EdbChartClassify{
-		//						ClassifyId:   v.ChartClassifyId,
-		//						ClassifyName: v.ChartClassifyName,
-		//						ParentId:     v.ParentId,
-		//					}
-		//					for _, v2 := range v.Children {
-		//						child := data_manage.EdbChartClassify{
-		//							ClassifyId:   v2.ChartClassifyId,
-		//							ClassifyName: v2.ChartClassifyName,
-		//							ParentId:     v2.ParentId,
-		//						}
-		//						item.Child = append(item.Child, &child)
-		//					}
-		//					resp.List = append(resp.List, &item)
-		//				}
-		//				fmt.Println("source redis")
-		//				return
-		//			}
-		//		}
-		//	}
-		//}
-
-		// 考虑到后面可以会迭代到10层, 这里直接用递归处理
-		classifyAll, e := data_manage.GetAllChartClassifyItemsBySource(1)
-		if e != nil && e.Error() != utils.ErrNoRow() {
-			err = e
-			return
-		}
-		resp.List = GetChartMenuTreeRecursive(classifyAll, 0)
-
-		//rootList, e := data_manage.GetChartClassifyByParentIdFromETA(0)
-		//if e != nil && e.Error() != utils.ErrNoRow() {
-		//	err = e
-		//	return
-		//}
-		//
-		//classifyAll, e := data_manage.GetChartClassifyAllFromETA()
-		//if e != nil && e.Error() != utils.ErrNoRow() {
-		//	err = e
-		//	return
-		//}
-		//
-		//rootChildMap := make(map[int][]*data_manage.ChartClassifyItems)
-		//for _, v := range classifyAll {
-		//	rootChildMap[v.ParentId] = append(rootChildMap[v.ParentId], v)
-		//}
-		//nodeAll := make([]*data_manage.ChartClassifyItems, 0)
-		//for _, v := range rootList {
-		//	if existItems, ok := rootChildMap[v.ChartClassifyId]; ok {
-		//		v.Children = existItems
-		//	} else {
-		//		items := make([]*data_manage.ChartClassifyItems, 0)
-		//		v.Children = items
-		//	}
-		//	nodeAll = append(nodeAll, v)
-		//}
-		//
-		//for _, v := range nodeAll {
-		//	item := data_manage.EdbChartClassify{
-		//		ClassifyId:   v.ChartClassifyId,
-		//		ClassifyName: v.ChartClassifyName,
-		//		ParentId:     v.ParentId,
-		//	}
-		//	for _, v2 := range v.Children {
-		//		child := data_manage.EdbChartClassify{
-		//			ClassifyId:   v2.ChartClassifyId,
-		//			ClassifyName: v2.ChartClassifyName,
-		//			ParentId:     v2.ParentId,
-		//		}
-		//		item.Child = append(item.Child, &child)
-		//	}
-		//	resp.List = append(resp.List, &item)
-		//}
-
-		// 将数据加入缓存
-		//if utils.Re == nil {
-		//	utils.Rc.Delete(key)
-		//}
-
-	default:
-		return
-	}
-
-	return
-}
-
 // EdbInfoAdd 添加指标到指标库
 func EdbInfoAdd(source, subSource, classifyId int, edbCode, edbName, frequency, unit, startDate, endDate string, sysUserId int, sysUserRealName string) (edbInfo *data_manage.EdbInfo, err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true
@@ -2410,7 +1872,7 @@ func EdbInfoAdd(source, subSource, classifyId int, edbCode, edbName, frequency,
 }
 
 // TraceEdbInfoByEdbInfoId 指标追溯
-func TraceEdbInfoByEdbInfoId(edbInfoId int) (traceEdbInfo data_manage.TraceEdbInfoResp, err error) {
+func TraceEdbInfoByEdbInfoId(edbInfoId, sysUserId int) (traceEdbInfo data_manage.TraceEdbInfoResp, err error) {
 	edbInfo, err := data_manage.GetEdbInfoById(edbInfoId)
 	if err != nil {
 		return
@@ -2439,6 +1901,7 @@ func TraceEdbInfoByEdbInfoId(edbInfoId int) (traceEdbInfo data_manage.TraceEdbIn
 	for _, v := range findIdMap {
 		edbInfoIdList = append(edbInfoIdList, v)
 	}
+	classifyIdList := make([]int, 0)
 	edbInfoList, err := data_manage.GetEdbInfoByIdList(edbInfoIdList)
 	if err != nil {
 		return
@@ -2446,8 +1909,42 @@ func TraceEdbInfoByEdbInfoId(edbInfoId int) (traceEdbInfo data_manage.TraceEdbIn
 	edbInfoMap := make(map[int]*data_manage.EdbInfo)
 	for _, tmpEdbInfo := range edbInfoList {
 		edbInfoMap[tmpEdbInfo.EdbInfoId] = tmpEdbInfo
+		classifyIdList = append(classifyIdList, tmpEdbInfo.ClassifyId)
+	}
+
+	// 指标权限Map
+	edbInfoIdPermissionMap := make(map[int]bool)
+	// 指标权限
+	{
+		// 当前的分类
+		classifyMap := make(map[int]*data_manage.EdbClassify)
+		classifyList, tmpErr := data_manage.GetEdbClassifyByIdList(classifyIdList)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range classifyList {
+			classifyMap[v.ClassifyId] = v
+		}
+
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, tmpErr := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUserId, 0, 0)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		for _, v := range edbInfoMap {
+			if currClassify, ok := classifyMap[v.ClassifyId]; ok {
+				edbInfoIdPermissionMap[v.EdbInfoId] = data_manage_permission.CheckEdbPermissionByPermissionIdList(v.IsJoinPermission, currClassify.IsJoinPermission, v.EdbInfoId, v.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			}
+		}
 	}
-	traceEdbInfo, err = handleTraceEdbInfo(traceEdbInfo, 0, edbInfoMap, edbMappingMap)
+
+	traceEdbInfo, err = handleTraceEdbInfo(traceEdbInfo, 0, edbInfoMap, edbMappingMap, edbInfoIdPermissionMap)
+
+	// 权限校验
+
 	return
 }
 
@@ -2564,7 +2061,7 @@ func traceEdbInfoByEdbInfoId(edbInfoId int, traceEdbInfo data_manage.TraceEdbInf
 	return
 }
 
-func handleTraceEdbInfo(traceEdbInfoResp data_manage.TraceEdbInfoResp, parentEdbInfoId int, edbInfoMap map[int]*data_manage.EdbInfo, edbMappingMap map[int][]*data_manage.EdbInfoCalculateMappingInfo) (newTraceEdbInfoResp data_manage.TraceEdbInfoResp, err error) {
+func handleTraceEdbInfo(traceEdbInfoResp data_manage.TraceEdbInfoResp, parentEdbInfoId int, edbInfoMap map[int]*data_manage.EdbInfo, edbMappingMap map[int][]*data_manage.EdbInfoCalculateMappingInfo, edbInfoIdPermissionMap map[int]bool) (newTraceEdbInfoResp data_manage.TraceEdbInfoResp, err error) {
 	edbInfo, ok := edbInfoMap[traceEdbInfoResp.EdbInfoId]
 	if !ok {
 		err = errors.New("指标异常")
@@ -2585,12 +2082,15 @@ func handleTraceEdbInfo(traceEdbInfoResp data_manage.TraceEdbInfoResp, parentEdb
 
 	if traceEdbInfoResp.Child != nil && len(traceEdbInfoResp.Child) > 0 {
 		for k, v := range traceEdbInfoResp.Child {
-			traceEdbInfoResp.Child[k], err = handleTraceEdbInfo(v, traceEdbInfoResp.EdbInfoId, edbInfoMap, edbMappingMap)
+			traceEdbInfoResp.Child[k], err = handleTraceEdbInfo(v, traceEdbInfoResp.EdbInfoId, edbInfoMap, edbMappingMap, edbInfoIdPermissionMap)
 			if err != nil {
 				return
 			}
 		}
 	}
+	// 指标权限
+	traceEdbInfoResp.HaveOperaAuth, _ = edbInfoIdPermissionMap[traceEdbInfoResp.EdbInfoId]
+
 	newTraceEdbInfoResp = traceEdbInfoResp
 
 	return
@@ -2810,7 +2310,7 @@ func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []da
 }
 
 // GetEdbChartAdminList
-// @param source 来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库
+// @param source 来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格
 func GetEdbChartAdminList(source int) (list []int, err error) {
 	switch source {
 	case 1: //手工数据指标
@@ -2867,38 +2367,6 @@ func EdbInfoReplace(oldEdbInfo, newEdbInfo *data_manage.EdbInfo, sysAdminId int,
 	return
 }
 
-// GetEdbMenuTreeRecursive 递归指标库菜单树
-func GetEdbMenuTreeRecursive(list []*data_manage.EdbClassifyItems, parentId int) []*data_manage.EdbChartClassify {
-	res := make([]*data_manage.EdbChartClassify, 0)
-	for _, v := range list {
-		t := new(data_manage.EdbChartClassify)
-		t.ClassifyId = v.ClassifyId
-		t.ClassifyName = v.ClassifyName
-		t.ParentId = v.ParentId
-		if v.ParentId == parentId {
-			t.Child = GetEdbMenuTreeRecursive(list, v.ClassifyId)
-			res = append(res, t)
-		}
-	}
-	return res
-}
-
-// GetChartMenuTreeRecursive 递归指标库菜单树
-func GetChartMenuTreeRecursive(list []*data_manage.ChartClassifyItems, parentId int) []*data_manage.EdbChartClassify {
-	res := make([]*data_manage.EdbChartClassify, 0)
-	for _, v := range list {
-		t := new(data_manage.EdbChartClassify)
-		t.ClassifyId = v.ChartClassifyId
-		t.ClassifyName = v.ChartClassifyName
-		t.ParentId = v.ParentId
-		if v.ParentId == parentId {
-			t.Child = GetChartMenuTreeRecursive(list, v.ChartClassifyId)
-			res = append(res, t)
-		}
-	}
-	return res
-}
-
 func GetTerminalFromBaseIndex(source int, edbCode string) (terminalCode string, sourceIndexName string, err error) {
 	tbName := GetBaseIndexTableName(source)
 	if tbName != "" {

+ 62 - 9
services/data/excel/excel_info.go

@@ -9,6 +9,7 @@ import (
 	"eta/eta_api/models/data_manage/excel/response"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/shopspring/decimal"
@@ -20,7 +21,7 @@ import (
 )
 
 // GetExcelDetailInfoByExcelInfoId 根据表格id获取表格详情
-func GetExcelDetailInfoByExcelInfoId(excelInfoId int) (excelDetail response.ExcelInfoDetail, errMsg string, err error) {
+func GetExcelDetailInfoByExcelInfoId(excelInfoId, sysUserId int) (excelDetail response.ExcelInfoDetail, errMsg string, err error) {
 	errMsg = `获取失败`
 	//获取eta表格信息
 	excelInfo, err := excel.GetExcelInfoById(excelInfoId)
@@ -33,11 +34,11 @@ func GetExcelDetailInfoByExcelInfoId(excelInfoId int) (excelDetail response.Exce
 		return
 	}
 
-	return formatExcelInfo2Detail(excelInfo)
+	return formatExcelInfo2Detail(excelInfo, sysUserId)
 }
 
 // GetExcelDetailInfoByUnicode 根据表格编码获取表格详情
-func GetExcelDetailInfoByUnicode(unicode string) (excelDetail response.ExcelInfoDetail, errMsg string, err error) {
+func GetExcelDetailInfoByUnicode(unicode string, sysUserId int) (excelDetail response.ExcelInfoDetail, errMsg string, err error) {
 	errMsg = `获取失败`
 	// 获取eta表格信息
 	excelInfo, err := excel.GetExcelInfoByUnicode(unicode)
@@ -50,10 +51,17 @@ func GetExcelDetailInfoByUnicode(unicode string) (excelDetail response.ExcelInfo
 		return
 	}
 
-	return formatExcelInfo2Detail(excelInfo)
+	return formatExcelInfo2Detail(excelInfo, sysUserId)
 }
 
-func formatExcelInfo2Detail(excelInfo *excel.ExcelInfo) (excelDetail response.ExcelInfoDetail, errMsg string, err error) {
+func formatExcelInfo2Detail(excelInfo *excel.ExcelInfo, sysUserId int) (excelDetail response.ExcelInfoDetail, errMsg string, err error) {
+	// 数据权限
+	haveOperaAuth, err := data_manage_permission.CheckExcelPermissionByExcelInfoId(excelInfo.ExcelInfoId, excelInfo.ExcelClassifyId, excelInfo.IsJoinPermission, sysUserId)
+	if err != nil {
+		err = errors.New("获取表格权限信息失败,Err" + err.Error())
+		return
+	}
+
 	excelDetail = response.ExcelInfoDetail{
 		ExcelInfoId:     excelInfo.ExcelInfoId,
 		Source:          excelInfo.Source,
@@ -71,10 +79,16 @@ func formatExcelInfo2Detail(excelInfo *excel.ExcelInfo) (excelDetail response.Ex
 		ModifyTime:      excelInfo.ModifyTime,
 		CreateTime:      excelInfo.CreateTime,
 		TableData:       nil,
+		HaveOperaAuth:   haveOperaAuth,
+	}
+
+	// 无权限,不需要返回数据
+	if !haveOperaAuth {
+		return
 	}
 
 	switch excelInfo.Source {
-	case utils.TIME_TABLE: // 自定义表格
+	case utils.TIME_TABLE: // 时间序列表格
 		var tableDataConfig TableDataConfig
 		err = json.Unmarshal([]byte(excelDetail.Content), &tableDataConfig)
 		if err != nil {
@@ -86,6 +100,39 @@ func formatExcelInfo2Detail(excelInfo *excel.ExcelInfo) (excelDetail response.Ex
 			err = errors.New("获取最新的表格数据失败,Err:" + tmpErr.Error())
 			return
 		}
+
+		if len(result.EdbInfoIdList) > 0 {
+			classifyIdList := make([]int, 0)
+			for _, v := range result.Data {
+				classifyIdList = append(classifyIdList, v.ClassifyId)
+			}
+
+			classifyMap := make(map[int]*data_manage.EdbClassify)
+
+			classifyList, tmpErr := data_manage.GetEdbClassifyByIdList(classifyIdList)
+			if tmpErr != nil {
+				err = errors.New("获取分类列表失败,Err:" + tmpErr.Error())
+				return
+			}
+
+			for _, v := range classifyList {
+				classifyMap[v.ClassifyId] = v
+			}
+
+			// 获取所有有权限的指标和分类
+			permissionEdbIdList, permissionClassifyIdList, tmpErr := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUserId, 0, 0)
+			if err != nil {
+				err = errors.New("获取所有有权限的指标和分类失败,Err:" + tmpErr.Error())
+				return
+			}
+
+			for i, v := range result.Data {
+				if currClassify, ok := classifyMap[v.ClassifyId]; ok {
+					result.Data[i].HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(v.IsJoinPermission, currClassify.IsJoinPermission, v.EdbInfoId, v.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+				}
+			}
+		}
+
 		excelDetail.TableData = result
 	case utils.MIXED_TABLE: // 混合表格
 		var result request.MixedTableReq
@@ -110,7 +157,11 @@ func formatExcelInfo2Detail(excelInfo *excel.ExcelInfo) (excelDetail response.Ex
 }
 
 // GetExcelInfoOpButton 获取ETA表格的操作权限
-func GetExcelInfoOpButton(sysUser *system.Admin, belongUserId, source int) (button response.ExcelInfoDetailButton) {
+func GetExcelInfoOpButton(sysUser *system.Admin, belongUserId, source int, haveOperaAuth bool) (button response.ExcelInfoDetailButton) {
+	// 如果没有数据权限,那么直接返回
+	if !haveOperaAuth {
+		return
+	}
 	//非管理员角色查看其他用户创建的表格,可刷新、另存为、下载表格;
 	button.RefreshButton = true
 	button.CopyButton = true
@@ -764,6 +815,8 @@ func GetDataByTableDataConfig(tableDataConfig TableDataConfig) (resultResp reque
 			tmpEdbInfoData.EdbName = edbInfo.EdbName
 			tmpEdbInfoData.Frequency = edbInfo.Frequency
 			tmpEdbInfoData.Unit = edbInfo.Unit
+			tmpEdbInfoData.ClassifyId = edbInfo.ClassifyId
+			tmpEdbInfoData.IsJoinPermission = edbInfo.IsJoinPermission
 		}
 
 		for index, dateTime := range sortDateTimeList {
@@ -1284,12 +1337,12 @@ func calculate(calculateFormula string, TagMap map[string]float64) (calVal, errM
 }
 
 // GetEdbIdsFromExcelCodes 获取表格中的指标IDs
-func GetEdbIdsFromExcelCodes(excelCodes []string) (edbIds []int, err error) {
+func GetEdbIdsFromExcelCodes(excelCodes []string, sysUserId int) (edbIds []int, err error) {
 	edbIds = make([]int, 0)
 	edbIdExist := make(map[int]bool)
 	for _, v := range excelCodes {
 		// 表格详情
-		detail, msg, e := GetExcelDetailInfoByUnicode(v)
+		detail, msg, e := GetExcelDetailInfoByUnicode(v, sysUserId)
 		if e != nil {
 			err = fmt.Errorf("GetExcelDetailInfoByExcelInfoId err: %s, errMsg: %s", e.Error(), msg)
 			return

+ 19 - 2
services/data/excel/excel_op.go

@@ -6,6 +6,7 @@ import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/services"
 	"eta/eta_api/services/alarm_msg"
+	"eta/eta_api/services/data/data_manage_permission"
 	excel "eta/eta_api/services/excel"
 	"eta/eta_api/utils"
 	"fmt"
@@ -20,7 +21,15 @@ func Delete(excelInfo *excelModel.ExcelInfo, sysUser *system.Admin) (err error,
 
 	// 操作权限校验
 	{
-		button := GetExcelInfoOpButton(sysUser, excelInfo.SysUserId, excelInfo.Source)
+		// 数据权限
+		haveOperaAuth, tmpErr := data_manage_permission.CheckExcelPermissionByExcelInfoId(excelInfo.ExcelInfoId, excelInfo.ExcelClassifyId, excelInfo.IsJoinPermission, sysUser.AdminId)
+		if err != nil {
+			errMsg = "获取ETA表格权限失败"
+			err = errors.New("获取ETA表格权限失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		button := GetExcelInfoOpButton(sysUser, excelInfo.SysUserId, excelInfo.Source, haveOperaAuth)
 		if !button.DeleteButton {
 			errMsg = "无操作权限"
 			err = errors.New(errMsg)
@@ -87,7 +96,15 @@ func Copy(oldExcelInfoId, excelClassifyId int, excelName string, sysUser *system
 
 	// 操作权限校验
 	{
-		button := GetExcelInfoOpButton(sysUser, oldExcelInfo.SysUserId, oldExcelInfo.Source)
+		// 数据权限
+		haveOperaAuth, tmpErr := data_manage_permission.CheckExcelPermissionByExcelInfoId(excelInfo.ExcelInfoId, excelInfo.ExcelClassifyId, excelInfo.IsJoinPermission, sysUser.AdminId)
+		if err != nil {
+			errMsg = "获取ETA表格权限失败"
+			err = errors.New("获取ETA表格权限失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		button := GetExcelInfoOpButton(sysUser, oldExcelInfo.SysUserId, oldExcelInfo.Source, haveOperaAuth)
 		if !button.CopyButton {
 			errMsg = "无操作权限"
 			err = errors.New(errMsg)

+ 1 - 1
services/data/line_feature/chart_info.go

@@ -575,7 +575,7 @@ func EditChartInfo(req data_manage.EditChartInfoReq, edbInfoMapping *data_manage
 	}
 
 	// 图表操作权限
-	ok := data.CheckOpChartPermission(sysUser, chartItem.SysUserId)
+	ok := data.CheckOpChartPermission(sysUser, chartItem.SysUserId, true)
 	if !ok {
 		errMsg = "没有该图表的操作权限"
 		err = errors.New(errMsg)

+ 13 - 2
services/data/predict_edb_info.go

@@ -6,6 +6,7 @@ import (
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/data_manage/request"
 	"eta/eta_api/models/system"
+	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/shopspring/decimal"
@@ -452,13 +453,23 @@ func MovePredictEdbInfo(edbInfoId, classifyId, prevEdbInfoId, nextEdbInfoId int,
 		return
 	}
 
+	var haveOperaAuth bool
+	// 权限校验
+	{
+		haveOperaAuth, err = data_manage_permission.CheckEdbPermissionByEdbInfoId(edbInfo.EdbInfoId, edbInfo.ClassifyId, edbInfo.IsJoinPermission, sysUser.AdminId)
+		if err != nil {
+			errMsg = "移动失败"
+			err = errors.New("校验指标权限失败,Err:" + err.Error())
+			return
+		}
+	}
+
 	// 移动权限校验
-	button := GetEdbOpButton(sysUser, edbInfo.SysUserId, edbInfo.EdbType, edbInfo.EdbInfoType)
+	button := GetEdbOpButton(sysUser, edbInfo.SysUserId, edbInfo.EdbType, edbInfo.EdbInfoType, haveOperaAuth)
 	if !button.MoveButton {
 		errMsg = "无权限操作"
 		err = nil
 		return
-		return
 	}
 
 	//如果改变了分类,那么移动该指标数据