Browse Source

Merge branch 'feature/eta_1.9.8'

hsun 7 months ago
parent
commit
1832028fff

+ 551 - 6
controllers/data_manage/excel/custom_analysis.go

@@ -4,13 +4,19 @@ import (
 	"encoding/json"
 	"eta/eta_api/controllers"
 	"eta/eta_api/models"
+	excelPermissionModel "eta/eta_api/models/data_manage/data_manage_permission"
 	excelModel "eta/eta_api/models/data_manage/excel"
 	"eta/eta_api/models/data_manage/excel/request"
 	"eta/eta_api/models/data_manage/excel/response"
+	"eta/eta_api/models/system"
 	"eta/eta_api/services"
 	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/services/data/excel"
+	excel2 "eta/eta_api/services/data/excel"
 	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"sort"
 	"strconv"
 	"strings"
 	"time"
@@ -53,7 +59,7 @@ func (c *CustomAnalysisController) ExcelByName() {
 
 	excelName = utils.TrimLRStr(excelName)
 	// 获取数据详情
-	excelDetail, err := excelModel.GetNoContentExcelInfoByName(excelName, utils.CUSTOM_ANALYSIS_TABLE)
+	excelDetail, err := excelModel.GetNoContentExcelInfoByName(excelName, utils.CUSTOM_ANALYSIS_TABLE, sysUser.AdminId)
 	if err != nil {
 		if err.Error() == utils.ErrNoRow() {
 			br.Ret = 200
@@ -173,6 +179,9 @@ func (c *CustomAnalysisController) Add() {
 		condition += " AND excel_name=? "
 		pars = append(pars, req.ExcelName)
 
+		condition += " AND sys_user_id = ? "
+		pars = append(pars, sysUser.AdminId)
+
 		count, err := excelModel.GetExcelInfoCountByCondition(condition, pars)
 		if err != nil {
 			br.Msg = "判断表格名称是否存在失败"
@@ -413,12 +422,25 @@ func (c *CustomAnalysisController) BaseExcelDetail() {
 	}
 
 	// 数据权限
-	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()
+	//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
+	//}
+
+	// 自定义分析权限与其他表格略有差别...
+	permissions, e := excelPermissionModel.GetExcelPermissionByExcelIdAndUserId(excelDetail.ExcelInfoId, sysUser.AdminId)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("获取表格权限失败, %v", e)
 		return
 	}
+	var permissionType []int
+	for _, v := range permissions {
+		permissionType = append(permissionType, v.PermissionType)
+	}
+	opButton := excel.GetCustomAnalysisOpButton(sysUser, excelDetail.SysUserId, permissionType)
 
 	resp.IsFind = true
 	resp.ExcelInfo = response.FindExcelInfo{
@@ -435,7 +457,7 @@ func (c *CustomAnalysisController) BaseExcelDetail() {
 		Sort:            excelDetail.Sort,
 		ModifyTime:      excelDetail.ModifyTime,
 		CreateTime:      excelDetail.CreateTime,
-		Button:          excel.GetExcelInfoOpButton(sysUser, excelDetail.SysUserId, excelDetail.Source, haveOperaAuth),
+		Button:          opButton,
 		HaveOperaAuth:   true,
 	}
 	if markStatus.Status == 0 {
@@ -443,6 +465,7 @@ func (c *CustomAnalysisController) BaseExcelDetail() {
 	} else {
 		resp.ExcelInfo.Editor = markStatus.Editor
 	}
+
 	if excelDetail != nil {
 		sheetList, err := excelModel.GetAllSheetItemList(excelDetail.ExcelInfoId)
 		if err != nil {
@@ -607,3 +630,525 @@ func (c *CustomAnalysisController) ExcelDataList() {
 	br.Msg = "获取成功"
 	br.Data = sheetList
 }
+
+// ClassifyList
+// @Title 分类列表
+// @Description 分类列表
+// @Param   IsShare  query  bool  false  "是否共享表格: true-是; false-否(默认)"
+// @Success 200 {object} response.ExcelClassifyListResp
+// @router /excel_classify/list [get]
+func (c *CustomAnalysisController) ClassifyList() {
+	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
+	}
+
+	source := utils.CUSTOM_ANALYSIS_TABLE
+	isShare, _ := c.GetBool("IsShare")
+
+	resp := new(response.ExcelClassifyListResp)
+
+	// 查询我分享的/分享给我的表格
+	excels, e := excelPermissionModel.GetAdminAuthExcelInfoPermission(source, sysUser.AdminId, "")
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("获取我分享的/分享给我的表格失败, %v", e)
+		return
+	}
+	hasShareMap := make(map[int]bool) // 是否已分享标记
+	for _, v := range excels {
+		if v.CreateUserId == sysUser.AdminId {
+			hasShareMap[int(v.ExcelInfoId)] = true
+		}
+	}
+
+	// 共享
+	if isShare {
+		shareExcel := new(excelModel.ExcelClassifyItems)
+		shareExcel.ExcelClassifyId = excelModel.CustomAnalysisMenuShareId
+		shareExcel.ExcelClassifyName = "我共享的"
+		shareExcel.Level = 1
+		shareExcel.Sort = 1
+		shareExcel.UniqueCode = fmt.Sprintf("SHARE%d", shareExcel.ExcelClassifyId)
+		shareExcel.HaveOperaAuth = true
+		shareExcel.Children = make([]*excelModel.ExcelClassifyItems, 0)
+
+		sharedExcel := new(excelModel.ExcelClassifyItems)
+		sharedExcel.ExcelClassifyId = excelModel.CustomAnalysisMenuSharedId
+		sharedExcel.ExcelClassifyName = "收到共享"
+		sharedExcel.Level = 1
+		sharedExcel.Sort = 2
+		sharedExcel.UniqueCode = fmt.Sprintf("SHARED%d", sharedExcel.ExcelClassifyId)
+		sharedExcel.HaveOperaAuth = true
+		sharedExcel.Children = make([]*excelModel.ExcelClassifyItems, 0)
+
+		// 收到共享细分目录
+		sharedUserClassify := make(map[int]*excelModel.ExcelClassifyItems)
+		adminIdName := make(map[int]string)
+		{
+			adminOb := new(system.Admin)
+			adminList, e := adminOb.GetItemsByCondition(``, make([]interface{}, 0), []string{}, "")
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = fmt.Sprintf("获取用户列表失败, %v", e)
+				return
+			}
+			for _, v := range adminList {
+				adminIdName[v.AdminId] = v.RealName
+			}
+		}
+
+		sortUser := make([]int, 0) // 分享人目录排序
+		shareExists := make(map[int]bool)
+		for _, v := range excels {
+			item := new(excelModel.ExcelClassifyItems)
+			item.ExcelInfoId = int(v.ExcelInfoId)
+			item.ExcelClassifyName = v.ExcelName
+			item.UniqueCode = v.UniqueCode
+			item.HaveOperaAuth = true
+			item.HasShare = hasShareMap[int(v.ExcelInfoId)]
+			// 我共享的
+			if v.CreateUserId == sysUser.AdminId && !shareExists[int(v.ExcelInfoId)] {
+				shareExists[int(v.ExcelInfoId)] = true
+				item.Level = 2
+				item.ParentId = shareExcel.ExcelClassifyId
+				item.ShowShareBtn = true
+				shareExcel.Children = append(shareExcel.Children, item)
+				continue
+			}
+
+			// 收到共享
+			if int(v.SysUserId) == sysUser.AdminId {
+				if adminIdName[v.CreateUserId] == "" {
+					// 分享人用户不存在, 那么不显示该分类
+					continue
+				}
+				if !utils.InArrayByInt(sortUser, v.CreateUserId) {
+					sortUser = append(sortUser, v.CreateUserId)
+				}
+				if sharedUserClassify[v.CreateUserId] == nil {
+					us := new(excelModel.ExcelClassifyItems)
+					us.ExcelClassifyId = v.CreateUserId // 用户ID作为分类ID
+					us.ExcelClassifyName = fmt.Sprintf("%s的表格", adminIdName[v.CreateUserId])
+					us.Level = 2
+					us.UniqueCode = fmt.Sprintf("%d-%d", sharedExcel.ExcelClassifyId, v.CreateUserId)
+					us.HaveOperaAuth = true
+					us.ShowShareBtn = false
+					us.Children = make([]*excelModel.ExcelClassifyItems, 0)
+					sharedUserClassify[v.CreateUserId] = us
+				}
+				item.Level = 3
+				item.ParentId = sharedUserClassify[v.CreateUserId].ExcelClassifyId
+				sharedUserClassify[v.CreateUserId].Children = append(sharedUserClassify[v.CreateUserId].Children, item)
+			}
+		}
+		// 按照分享人第一次分享时间降序=_=!, 查询的时候是升序, 这里反过来
+		for i, j := 0, len(sortUser)-1; i < j; i, j = i+1, j-1 {
+			sortUser[i], sortUser[j] = sortUser[j], sortUser[i]
+		}
+		for _, v := range sortUser {
+			if sharedUserClassify[v] != nil {
+				sharedExcel.Children = append(sharedExcel.Children, sharedUserClassify[v])
+			}
+		}
+
+		resp.AllNodes = make([]*excelModel.ExcelClassifyItems, 0)
+		resp.AllNodes = append(resp.AllNodes, shareExcel, sharedExcel)
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+		return
+	}
+
+	// 我的表格
+	classifyList, err := excelModel.GetAdminExcelClassifyBySource(source, sysUser.AdminId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	classifyMap := make(map[int]*excelModel.ExcelClassifyItems)
+	for _, v := range classifyList {
+		v.HaveOperaAuth = true
+		classifyMap[v.ExcelClassifyId] = v
+	}
+	allExcelInfo, err := excelModel.GetNoContentExcelInfoAll(source, sysUser.AdminId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取表格信息失败,Err:" + err.Error()
+		return
+	}
+
+	excelInfoMap := make(map[int][]*excelModel.ExcelClassifyItems)
+	for _, v := range allExcelInfo {
+		v.HaveOperaAuth = true
+		v.ShowShareBtn = true
+		v.HasShare = hasShareMap[v.ExcelInfoId]
+		excelInfoMap[v.ExcelClassifyId] = append(excelInfoMap[v.ExcelClassifyId], v)
+	}
+
+	classifyListMap := make(map[int][]*excelModel.ExcelClassifyItems)
+	for _, v := range classifyList {
+		if v.ParentId > 0 {
+			classifyListMap[v.ParentId] = append(classifyListMap[v.ParentId], v)
+		}
+		if existItems, ok := excelInfoMap[v.ExcelClassifyId]; ok {
+			v.Children = existItems
+		}
+	}
+	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 {
+				return excelModel.ExcelClassifyItemBySort(classifyList[key].Children[i], classifyList[key].Children[j])
+			})
+		}
+	}
+
+	nodeAll := make([]*excelModel.ExcelClassifyItems, 0)
+	for _, v := range classifyList {
+		if v.ParentId == 0 {
+			sort.Slice(v.Children, func(i, j int) bool {
+				return excelModel.ExcelClassifyItemBySort(v.Children[i], v.Children[j])
+			})
+			nodeAll = append(nodeAll, v)
+		}
+	}
+
+	resp.AllNodes = nodeAll
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// List
+// @Title 自定义分析列表
+// @Description ETA表格列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   ExcelClassifyId   query   int  true       "分类id"
+// @Param   Keyword   query   string  true       "搜索关键词"
+// @Param   IsShare  query  bool  false  "是否共享表格: true-是; false-否(默认)"
+// @Success 200 {object} response.ExcelListResp
+// @router /excel/list [get]
+func (c *CustomAnalysisController) List() {
+	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
+	}
+
+	excelClassifyId, _ := c.GetInt("ExcelClassifyId")
+	pageSize, _ := c.GetInt("PageSize")
+	currentIndex, _ := c.GetInt("CurrentIndex")
+	keyword := c.GetString("Keyword")
+	keyword = strings.TrimSpace(keyword)
+	adminId := sysUser.AdminId
+	isShare, _ := c.GetBool("IsShare")
+	source := utils.CUSTOM_ANALYSIS_TABLE
+
+	var condition string
+	var pars []interface{}
+	condition += " AND source = ?"
+	pars = append(pars, source)
+	// 共享的
+	//hasShareMap := make(map[int]bool)
+	if isShare {
+		if keyword != "" {
+			keyword = fmt.Sprint("%", keyword, "%")
+		}
+		// 查询我分享的/分享给我的表格
+		excels, e := excelPermissionModel.GetAdminAuthExcelInfoPermission(source, adminId, keyword)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = fmt.Sprintf("获取我分享的/分享给我的表格失败, %v", e)
+			return
+		}
+
+		var excelIds, shareIds, sharedIds, userIds []int
+		for _, v := range excels {
+			id := int(v.ExcelInfoId)
+			// 无分类ID
+			if excelClassifyId <= 0 && !utils.InArrayByInt(excelIds, id) {
+				excelIds = append(excelIds, id)
+				continue
+			}
+			// 用户分类
+			if excelClassifyId == v.CreateUserId {
+				userIds = append(userIds, id)
+				continue
+			}
+			// 我共享的
+			if excelClassifyId == excelModel.CustomAnalysisMenuShareId && v.CreateUserId == sysUser.AdminId {
+				shareIds = append(shareIds, id)
+				//hasShareMap[id] = true
+				continue
+			}
+			// 收到共享
+			if excelClassifyId == excelModel.CustomAnalysisMenuSharedId && int(v.SysUserId) == sysUser.AdminId {
+				sharedIds = append(sharedIds, id)
+				continue
+			}
+		}
+		if excelClassifyId > 0 {
+			switch excelClassifyId {
+			case excelModel.CustomAnalysisMenuShareId: // 我共享的
+				excelIds = shareIds
+			case excelModel.CustomAnalysisMenuSharedId: // 收到共享
+				excelIds = sharedIds
+			default: // 用户目录
+				excelIds = userIds
+			}
+		}
+		if len(excelIds) == 0 {
+			page := paging.GetPaging(currentIndex, pageSize, 0)
+			resp := response.ExcelListResp{
+				Paging: page,
+				List:   make([]*excelModel.MyExcelInfoList, 0),
+			}
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "获取成功"
+			br.Data = resp
+			return
+		}
+
+		condition += fmt.Sprintf(` AND excel_info_id IN (%s)`, utils.GetOrmInReplace(len(excelIds)))
+		pars = append(pars, excelIds)
+
+	} else {
+		condition += ` AND sys_user_id = ?`
+		pars = append(pars, adminId)
+	}
+
+	// 筛选分类
+	if !isShare && excelClassifyId > 0 {
+		_, err := excelModel.GetExcelClassifyById(excelClassifyId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取表格信息失败"
+			br.ErrMsg = "获取信息失败,GetExcelClassify,Err:" + err.Error()
+			return
+		}
+
+		childClassify, e, _ := excel2.GetChildClassifyByClassifyId(excelClassifyId, source)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分类信息失败, GetEdbClassify,Err:" + e.Error()
+			return
+		}
+		if len(childClassify) == 0 {
+			condition += " AND excel_classify_id = ? "
+			pars = append(pars, excelClassifyId)
+		} else {
+			classifyIds := []int{excelClassifyId}
+			for _, v := range childClassify {
+				classifyIds = append(classifyIds, v.ExcelClassifyId)
+			}
+			condition += fmt.Sprintf(` AND excel_classify_id IN (%s) `, utils.GetOrmInReplace(len(classifyIds)))
+			pars = append(pars, classifyIds)
+		}
+	}
+	if keyword != "" {
+		condition += ` AND (excel_name LIKE ?)`
+		pars = utils.GetLikeKeywordPars(pars, keyword, 1)
+	}
+
+	// 获取表格信息
+	var total int
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+	list, err := excelModel.GetNoContentExcelListByCondition(condition, pars, startSize, pageSize)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Success = true
+		br.Msg = "获取表格信息失败"
+		br.ErrMsg = "获取表格信息失败,Err:" + err.Error()
+		return
+	}
+	for _, v := range list {
+		v.HaveOperaAuth = true
+		//v.Button.CancelShareButton = hasShareMap[v.ExcelInfoId]
+	}
+
+	// 总数据量
+	dataCount, err := excelModel.GetExcelListCountByCondition(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取表格列表信息失败"
+		br.ErrMsg = "获取表格列表数据总数失败,Err:" + err.Error()
+		return
+	}
+	page = paging.GetPaging(currentIndex, pageSize, dataCount)
+
+	resp := response.ExcelListResp{
+		Paging: page,
+		List:   list,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// Share
+// @Title 分享表格
+// @Description 分享表格
+// @Param	request	body request.ShareExcelInfoReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /excel/share [post]
+func (c *CustomAnalysisController) Share() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg != "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	var req request.ShareExcelInfoReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	if req.ExcelInfoId <= 0 {
+		br.Msg = "请选择表格"
+		return
+	}
+
+	excelInfo, e := excelModel.GetExcelInfoById(req.ExcelInfoId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "表格不存在, 请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("获取表格失败, %v", e)
+		return
+	}
+	if excelInfo.SysUserId != sysUser.AdminId {
+		br.Msg = "无权操作"
+		br.ErrMsg = fmt.Sprintf("无权设置表格权限, ExcelInfoId: %d, SysAdminId: %d", req.ExcelInfoId, sysUser.AdminId)
+		return
+	}
+
+	source := utils.CUSTOM_ANALYSIS_TABLE
+	newPermissions := make([]*excelPermissionModel.ExcelInfoPermission, 0)
+	for _, v := range req.ViewUserIds {
+		newPermissions = append(newPermissions, &excelPermissionModel.ExcelInfoPermission{
+			ExcelInfoId:    int32(req.ExcelInfoId),
+			Source:         int32(source),
+			SysUserId:      int32(v),
+			CreateTime:     time.Now().Local(),
+			ModifyTime:     time.Now().Local(),
+			PermissionType: 1,
+		})
+	}
+	for _, v := range req.EditUserIds {
+		newPermissions = append(newPermissions, &excelPermissionModel.ExcelInfoPermission{
+			ExcelInfoId:    int32(req.ExcelInfoId),
+			Source:         int32(source),
+			SysUserId:      int32(v),
+			CreateTime:     time.Now().Local(),
+			ModifyTime:     time.Now().Local(),
+			PermissionType: 2,
+		})
+	}
+	if e := excelPermissionModel.ClearAndSetExcelInfoPermission(source, req.ExcelInfoId, newPermissions); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("设置表格权限失败, %v", e)
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// ShareDetail
+// @Title 分享表格-详情
+// @Description 分享表格-详情
+// @Param   ExcelInfoId  query  int  true  "表格ID"
+// @Success 200 {object} response.ShareExcelInfoDetail
+// @router /excel/share_detail [get]
+func (c *CustomAnalysisController) ShareDetail() {
+	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
+	}
+	excelInfoId, _ := c.GetInt("ExcelInfoId")
+	if excelInfoId <= 0 {
+		br.Msg = "请选择表格"
+		return
+	}
+
+	permissions, e := excelPermissionModel.GetExcelPermissionBySourceAndId(excelInfoId, utils.CUSTOM_ANALYSIS_TABLE)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("获取表格权限失败, %v", e)
+		return
+	}
+	resp := new(response.ShareExcelInfoDetail)
+	resp.ExcelInfoId = excelInfoId
+	for _, v := range permissions {
+		if v.PermissionType == 1 {
+			resp.ViewUserIds = append(resp.ViewUserIds, int(v.SysUserId))
+		}
+		if v.PermissionType == 2 {
+			resp.EditUserIds = append(resp.EditUserIds, int(v.SysUserId))
+		}
+	}
+
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 18 - 5
controllers/data_manage/excel/excel_classify.go

@@ -392,11 +392,24 @@ func (this *ExcelClassifyController) AddExcelClassify() {
 	}
 
 	// 获取同级分类下存在同名分类的数量
-	count, err := excel.GetExcelClassifyCount(req.ExcelClassifyName, req.ParentId, source)
-	if err != nil {
-		br.Msg = "判断名称是否已存在失败"
-		br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error()
-		return
+	var count int
+	if source == utils.CUSTOM_ANALYSIS_TABLE {
+		// 自定义分析分类私有化了
+		ct, e := excel.GetCustomAnalysisExcelClassifyCount(req.ExcelClassifyName, req.ParentId, source, this.SysUser.AdminId)
+		if e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("获取自定义分析同级分类下同名分类失败, %v", e)
+			return
+		}
+		count = ct
+	} else {
+		ct, e := excel.GetExcelClassifyCount(req.ExcelClassifyName, req.ParentId, source)
+		if e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("获取同级分类下同名分类失败, %v", e)
+			return
+		}
+		count = ct
 	}
 	if count > 0 {
 		br.Msg = "分类名称已存在,请重新输入"

+ 15 - 11
controllers/data_manage/excel/excel_info.go

@@ -128,6 +128,12 @@ func (c *ExcelInfoController) Add() {
 	condition += " AND excel_name=? "
 	pars = append(pars, req.ExcelName)
 
+	// 自定义分析私有化了
+	if req.Source == utils.CUSTOM_ANALYSIS_TABLE {
+		condition += ` AND sys_user_id = ? `
+		pars = append(pars, sysUser.AdminId)
+	}
+
 	// 获取分类下是否存在该表格名称
 	count, err := excel3.GetExcelInfoCountByCondition(condition, pars)
 	if err != nil {
@@ -728,7 +734,6 @@ func (c *ExcelInfoController) Detail() {
 		excelDetail.ExcelSourceEn = strings.Join(sourceNameEnList, ",")
 	}
 
-
 	// excel表格按钮权限
 	if excelDetail.Source != utils.BALANCE_TABLE {
 		excelDetail.Button = excel2.GetExcelInfoOpButton(sysUser, excelDetail.SysUserId, excelDetail.Source, excelDetail.HaveOperaAuth)
@@ -1857,9 +1862,9 @@ func (c *ExcelInfoController) GetFirstEdbData() {
 	br.Success = true
 	br.Msg = "获取成功"
 	br.Data = response.TableDataItem{
-		EdbInfoId: edbInfoId,
-		Data:      dataList,
-		ExcelSource: excelSource,
+		EdbInfoId:     edbInfoId,
+		Data:          dataList,
+		ExcelSource:   excelSource,
 		ExcelSourceEn: excelSourceEn,
 	}
 }
@@ -1936,9 +1941,9 @@ func (c *ExcelInfoController) GetOtherEdbData() {
 	br.Success = true
 	br.Msg = "获取成功"
 	br.Data = response.TableDataItem{
-		EdbInfoId: req.EdbInfoId,
-		Data:      dataList,
-		ExcelSource: excelSource,
+		EdbInfoId:     req.EdbInfoId,
+		Data:          dataList,
+		ExcelSource:   excelSource,
 		ExcelSourceEn: excelSourceEn,
 	}
 }
@@ -2914,7 +2919,6 @@ func (c *ExcelInfoController) GetBatchChartRefreshResult() {
 	br.Success = true
 }
 
-
 // GetBatchChartRefreshResult
 // @Title 获取批量刷新表格结果
 // @Description 获取批量刷新表格结果
@@ -2935,7 +2939,7 @@ func (c *ExcelInfoController) GetEdbSource() {
 		return
 	}
 	edbInfoId, _ := c.GetInt("EdbInfoId")
-	if edbInfoId <= 0  {
+	if edbInfoId <= 0 {
 		br.Msg = "请选择指标"
 		br.ErrMsg = "请选择指标"
 		br.IsSendEmail = false
@@ -2951,7 +2955,7 @@ func (c *ExcelInfoController) GetEdbSource() {
 	excelSourceEn := strings.Join(sourceNameEnList, ",")
 
 	var resp struct {
-		ExcelSource string `description:"表格来源"`
+		ExcelSource   string `description:"表格来源"`
 		ExcelSourceEn string `description:"表格来源(英文)"`
 	}
 
@@ -2961,4 +2965,4 @@ func (c *ExcelInfoController) GetEdbSource() {
 	br.Data = resp
 	br.Ret = 200
 	br.Success = true
-}
+}

+ 78 - 5
models/data_manage/data_manage_permission/excel.go

@@ -10,11 +10,12 @@ import (
 
 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"`   // 关系建立时间
+	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"`     // 关系建立时间
+	PermissionType        int       `json:"permission_type"` // 权限类型: 0-默认; 1-查看; 2-编辑
 }
 
 type ExcelClassifyPermission struct {
@@ -971,3 +972,75 @@ func GetExcelInfoDataPermissionClassifyNoAuthRecordListByUserId(userId, excelSou
 
 	return
 }
+
+// ExcelInfoPermissionAdminAuth 含创建人的表格权限
+type ExcelInfoPermissionAdminAuth struct {
+	ExcelInfoPermission
+	ExcelName    string `json:"excel_name"`     // 表格名称
+	UniqueCode   string `json:"unique_code"`    // 唯一编码
+	CreateUserId int    `json:"create_user_id"` // 创建人ID
+}
+
+// GetAdminAuthExcelInfoPermission 获取用户有权限的表格
+func GetAdminAuthExcelInfoPermission(source, adminId int, keywords string) (items []*ExcelInfoPermissionAdminAuth, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT a.*, b.sys_user_id AS create_user_id, b.excel_name, b.unique_code FROM excel_info_permission AS a
+		JOIN excel_info AS b ON a.excel_info_id = b.excel_info_id
+		WHERE a.source = ? AND (b.sys_user_id = ? OR a.sys_user_id = ?)`
+	var pars []interface{}
+	pars = append(pars, source, adminId, adminId)
+	if keywords != "" {
+		sql += ` AND b.excel_name LIKE ?`
+		pars = append(pars, keywords)
+	}
+	sql += ` ORDER BY a.create_time ASC`
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func ClearAndSetExcelInfoPermission(source, excelInfoId int, permissions []*ExcelInfoPermission) (err error) {
+	if excelInfoId <= 0 {
+		return
+	}
+	tx, e := orm.NewOrmUsingDB("data").Begin()
+	if e != nil {
+		err = fmt.Errorf("orm begin err: %v", e)
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	sql := `DELETE FROM excel_info_permission WHERE excel_info_id = ? AND source = ?`
+	_, e = tx.Raw(sql, excelInfoId, source).Exec()
+	if e != nil {
+		err = fmt.Errorf("clear permission err: %v", e)
+		return
+	}
+	if len(permissions) > 0 {
+		_, e = tx.InsertMulti(500, permissions)
+		if e != nil {
+			err = fmt.Errorf("insert permissions err: %v", e)
+			return
+		}
+	}
+	return
+}
+
+func GetExcelPermissionBySourceAndId(excelId, source int) (items []*ExcelInfoPermission, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM excel_info_permission WHERE source = ? AND excel_info_id = ?`
+	_, err = o.Raw(sql, source, excelId).QueryRows(&items)
+	return
+}
+
+func GetExcelPermissionByExcelIdAndUserId(excelId, userId int) (items []*ExcelInfoPermission, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM excel_info_permission WHERE excel_info_id = ? AND sys_user_id = ?`
+	_, err = o.Raw(sql, excelId, userId).QueryRows(&items)
+	return
+}

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

@@ -7,6 +7,11 @@ import (
 	"time"
 )
 
+const (
+	CustomAnalysisMenuShareId  = 9000000 // 自定义分析目录ID-我共享的
+	CustomAnalysisMenuSharedId = 8000000 // 自定义分析目录ID-收到共享
+)
+
 // ExcelClassify excel表格分类
 type ExcelClassify struct {
 	ExcelClassifyId   int       `orm:"column(excel_classify_id);pk"`
@@ -132,6 +137,8 @@ type ExcelClassifyItems struct {
 	Children          []*ExcelClassifyItems
 	IsJoinPermission  int  `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
 	HaveOperaAuth     bool `description:"是否有数据权限"`
+	HasShare          bool `description:"是否已共享: true-是; false-否"`
+	ShowShareBtn      bool `description:"是否显示共享按钮: true-是; false-否"`
 }
 
 func GetExcelClassifyByCondition(condition string, pars []interface{}) (item *ExcelClassify, err error) {
@@ -226,3 +233,24 @@ func GetClassifyByIdList(classifyIdList []int) (items []*ExcelClassify, err erro
 
 	return
 }
+
+func GetAdminExcelClassifyBySource(source, adminId int) (items []*ExcelClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM excel_classify WHERE source = ? AND sys_user_id = ? AND is_delete = 0 ORDER BY sort ASC, excel_classify_id ASC;`
+	_, err = o.Raw(sql, source, adminId).QueryRows(&items)
+	return
+}
+
+func GetExcelClassifyModelBySource(source int) (items []*ExcelClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM excel_classify WHERE source = ? AND is_delete = 0 ORDER BY sort ASC, excel_classify_id ASC`
+	_, err = o.Raw(sql, source).QueryRows(&items)
+	return
+}
+
+func GetCustomAnalysisExcelClassifyCount(classifyName string, parentId, source, adminId int) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT COUNT(1) AS count FROM excel_classify WHERE parent_id = ? AND source = ? AND excel_classify_name = ? AND is_delete = 0 AND sys_user_id = ?`
+	err = o.Raw(sql, parentId, source, classifyName, adminId).QueryRow(&count)
+	return
+}

+ 14 - 4
models/data_manage/excel/excel_info.go

@@ -452,11 +452,11 @@ func UpdateExcelInfoClassifyId(classifyId, excelInfoId int) (err error) {
 }
 
 // GetNoContentExcelInfoByName 根据名称 获取eta表格详情
-func GetNoContentExcelInfoByName(excelName string, source int) (item *MyExcelInfoList, err error) {
+func GetNoContentExcelInfoByName(excelName string, source, adminId 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,update_user_id,update_user_real_name 
- FROM excel_info WHERE excel_name = ? AND source = ? AND is_delete=0 `
-	err = o.Raw(sql, excelName, source).QueryRow(&item)
+ FROM excel_info WHERE excel_name = ? AND source = ? AND is_delete=0 AND sys_user_id = ? `
+	err = o.Raw(sql, excelName, source, adminId).QueryRow(&item)
 
 	return
 }
@@ -672,7 +672,7 @@ func GetNoContentExcelListByUserId(userIdList []int) (items []*MyExcelInfoList,
 		return
 	}
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM excel_info WHERE excel_info_id in (` + utils.GetOrmInReplace(num) + `) order by excel_info_id DESC `
+	sql := ` SELECT * FROM excel_info WHERE sys_user_id in (` + utils.GetOrmInReplace(num) + `) order by excel_info_id DESC `
 	_, err = o.Raw(sql, userIdList).QueryRows(&items)
 
 	return
@@ -803,3 +803,13 @@ type ExcelInfoDetailButton struct {
 	RefreshEdbButton bool `description:"是否可刷新指标"`
 	OpWorkerButton   bool `description:"是否修改协作人"`
 }
+
+func UpdateExcelInfoClassifyIdByIds(classifyId int, excelIds []int) (err error) {
+	if len(excelIds) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`UPDATE excel_info SET excel_classify_id = ? WHERE excel_info_id IN (%s)`, utils.GetOrmInReplace(len(excelIds)))
+	_, err = o.Raw(sql, classifyId, excelIds).Exec()
+	return
+}

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

@@ -153,3 +153,10 @@ type SaveExcelInfoWorkerReq struct {
 	ExcelInfoId int    `description:"ETA表格ID"`
 	SysUserIds  string `description:"协作人ID 用英文逗号拼接"`
 }
+
+// ShareExcelInfoReq 分享表格请求
+type ShareExcelInfoReq struct {
+	ExcelInfoId int   `description:"表格ID"`
+	ViewUserIds []int `description:"查看权限用户IDs"`
+	EditUserIds []int `description:"编辑权限用户IDs"`
+}

+ 7 - 0
models/data_manage/excel/response/excel_info.go

@@ -111,3 +111,10 @@ type BalanceTableVersionListItem struct {
 type BalanceTableVersionListResp struct {
 	List []*BalanceTableVersionListItem
 }
+
+// ShareExcelInfoDetail 分享表格详情
+type ShareExcelInfoDetail struct {
+	ExcelInfoId int   `description:"表格ID"`
+	ViewUserIds []int `description:"查看权限用户IDs"`
+	EditUserIds []int `description:"编辑权限用户IDs"`
+}

+ 36 - 0
routers/commentsRouter.go

@@ -934,6 +934,33 @@ func init() {
             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: "List",
+            Router: `/excel/list`,
+            AllowHTTPMethods: []string{"get"},
+            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: "Share",
+            Router: `/excel/share`,
+            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: "ShareDetail",
+            Router: `/excel/share_detail`,
+            AllowHTTPMethods: []string{"get"},
+            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: "ExcelByName",
@@ -943,6 +970,15 @@ func init() {
             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: "ClassifyList",
+            Router: `/excel_classify/list`,
+            AllowHTTPMethods: []string{"get"},
+            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: "Save",

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

@@ -687,6 +687,7 @@ func MoveEdbChart(source, subSource, oldUserId, newUserId int, isSelectAll bool,
 			err = tmpErr
 			return
 		}
+		var customAnalysisIds []int
 		if len(tmpList) > 0 {
 			for _, v := range tmpList {
 				//if v.SysUserId == newUserId {
@@ -709,9 +710,21 @@ func MoveEdbChart(source, subSource, oldUserId, newUserId int, isSelectAll bool,
 					NewUserName:                adminInfo.RealName,
 					CreateTime:                 time.Now(),
 				})
+
+				if v.Source == utils.CUSTOM_ANALYSIS_TABLE {
+					customAnalysisIds = append(customAnalysisIds, v.ExcelInfoId)
+				}
 			}
 			// 修改创建人
 			err = excel.ModifyExcelInfoUserIdByCodeList(dataId, adminInfo.AdminId, adminInfo.RealName)
+			if err != nil {
+				return
+			}
+
+			// 由于自定义分析表分类私有化, 如果转移的是自定义分析表, 那么需要将excel转移至未分类下
+			if len(customAnalysisIds) > 0 {
+				err = MoveCustomAnalysisExcel2DefaultClassify(customAnalysisIds, adminInfo.AdminId, adminInfo.RealName)
+			}
 		}
 	default:
 		return
@@ -1034,6 +1047,7 @@ func MoveAllEdbChart(sourceList, oldUserIdList []int, userId, opUserId int) (err
 	sourceStrList := make([]string, 0)
 
 	var isMoveManual, isMoveMysteelChemical, isMoveEdb, isMovePredictEdb, isMoveChart, isMoveExcel bool
+	var customAnalysisIds []int
 
 	// 遍历需要转移的模块,1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格,并找出当前需要转移的资产
 	for _, source := range sourceList {
@@ -1211,6 +1225,10 @@ func MoveAllEdbChart(sourceList, oldUserIdList []int, userId, opUserId int) (err
 						NewUserName:                adminInfo.RealName,
 						CreateTime:                 time.Now(),
 					})
+
+					if v.Source == utils.CUSTOM_ANALYSIS_TABLE {
+						customAnalysisIds = append(customAnalysisIds, v.ExcelInfoId)
+					}
 				}
 				isMoveExcel = true
 			}
@@ -1225,6 +1243,15 @@ func MoveAllEdbChart(sourceList, oldUserIdList []int, userId, opUserId int) (err
 		return
 	}
 
+	// 由于自定义分析表分类私有化, 如果转移的含自定义分析表, 那么需要将excel转移至未分类下
+	if len(customAnalysisIds) > 0 {
+		err = MoveCustomAnalysisExcel2DefaultClassify(customAnalysisIds, adminInfo.AdminId, adminInfo.RealName)
+		if err != nil {
+			err = fmt.Errorf("MoveCustomAnalysisExcel2DefaultClassify, err: %v", err)
+			return
+		}
+	}
+
 	// 添加资产转移的记录
 	content += fmt.Sprintf("(%s)", strings.Join(sourceStrList, ","))
 	dataPermissionMessage := &data_manage_permission.DataPermissionMessage{
@@ -1412,3 +1439,53 @@ func afterMoveManualEdb(tmpList []*models.Edbinfo, adminInfo *system.Admin, opUs
 	obj := models.EdbinfoOpRecord{}
 	_ = obj.MulCreate(recordList)
 }
+
+// MoveCustomAnalysisExcel2DefaultClassify 移动表格至用户未分类目录下
+func MoveCustomAnalysisExcel2DefaultClassify(excelIds []int, adminId int, realName string) (err error) {
+	if len(excelIds) == 0 {
+		return
+	}
+	var moveClassifyId int
+	// 查询默认分类
+	cond := ` AND excel_classify_name = ? AND sys_user_id = ?`
+	pars := make([]interface{}, 0)
+	pars = append(pars, "未分类", adminId)
+	classify, e := excel.GetExcelClassifyByCondition(cond, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = fmt.Errorf("获取默认分类失败, %v", e)
+		return
+	}
+	if classify != nil {
+		moveClassifyId = classify.ExcelClassifyId
+	}
+
+	// 新增一个新的分类
+	if classify == nil {
+		classifyNew := &excel.ExcelClassify{
+			ExcelClassifyName: "未分类",
+			Source:            utils.CUSTOM_ANALYSIS_TABLE,
+			SysUserId:         adminId,
+			SysUserRealName:   realName,
+			Level:             1,
+			UniqueCode:        utils.MD5(utils.EXCEL_DATA_PREFIX + "_" + strconv.FormatInt(time.Now().UnixNano(), 10)),
+			CreateTime:        time.Now(),
+			ModifyTime:        time.Now(),
+		}
+		if _, e = excel.AddExcelClassify(classifyNew); e != nil {
+			err = fmt.Errorf("新增默认分类失败, %v", e)
+			return
+		}
+		moveClassifyId = classifyNew.ExcelClassifyId
+	}
+	if moveClassifyId <= 0 {
+		err = fmt.Errorf("移动分类ID有误")
+		return
+	}
+
+	// 更新表格分类ID
+	if e = excel.UpdateExcelInfoClassifyIdByIds(moveClassifyId, excelIds); e != nil {
+		err = fmt.Errorf("移动多表格分类失败, %v", e)
+		return
+	}
+	return
+}

+ 35 - 2
services/data/excel/excel_info.go

@@ -531,7 +531,7 @@ func GetExcelEdbBatchRefreshKey(source string, primaryId, subId int) string {
 }
 
 // GetEdbSourceByEdbInfoIdList 获取关联指标的来源
-func GetEdbSourceByEdbInfoIdList(edbInfoIdList []int) (sourceNameList, sourceNameEnList []string,err error) {
+func GetEdbSourceByEdbInfoIdList(edbInfoIdList []int) (sourceNameList, sourceNameEnList []string, err error) {
 	sourceNameList = make([]string, 0)
 	sourceNameEnList = make([]string, 0)
 	sourceMap := make(map[int]string)
@@ -580,4 +580,37 @@ func GetEdbSourceByEdbInfoIdList(edbInfoIdList []int) (sourceNameList, sourceNam
 		sourceNameEnList = append(sourceNameEnList, conf[models.BusinessConfCompanyName])
 	}
 	return
-}
+}
+
+// GetCustomAnalysisOpButton 获取自定义分析按钮权限
+func GetCustomAnalysisOpButton(sysUser *system.Admin, belongUserId int, permissionType []int) (button excel.ExcelInfoDetailButton) {
+	// 管理员/所属人所有权限
+	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN || sysUser.AdminId == belongUserId {
+		button.RefreshButton = true
+		button.CopyButton = true
+		button.DownloadButton = true
+
+		button.OpEdbButton = true
+		button.RefreshEdbButton = true
+		button.OpButton = true
+		button.DeleteButton = true
+		return
+	}
+
+	// 非管理员-被分享人
+	for _, v := range permissionType {
+		if v == 1 {
+			button.RefreshButton = true
+			button.CopyButton = true
+			button.DownloadButton = true
+		}
+		if v == 2 {
+			button.OpEdbButton = true
+			button.RefreshEdbButton = true
+			button.OpButton = true
+			button.CopyButton = true
+			button.DownloadButton = true
+		}
+	}
+	return
+}