Explorar el Código

Merge branch 'feature/eta_1.9.8' into debug

hsun hace 7 meses
padre
commit
8158e8648e

+ 541 - 5
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"
@@ -413,12 +419,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 +454,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 +462,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 +627,519 @@ 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
+				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.Children = make([]*excelModel.ExcelClassifyItems, 0)
+					sharedUserClassify[v.CreateUserId] = us
+				}
+				item.Level = 3
+				item.ParentId = sharedUserClassify[v.CreateUserId].ExcelClassifyId
+				item.PermissionType = v.PermissionType
+				sharedUserClassify[v.CreateUserId].Children = append(sharedUserClassify[v.CreateUserId].Children, item)
+			}
+		}
+		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.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 = "获取成功"
+}

+ 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 DESC`
+	_, 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
+}

+ 14 - 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:"是否有数据权限"`
+	PermissionType    int  `description:"权限类型: 权限类型: 0-全部; 1-查看; 2-编辑"`
+	HasShare          bool `description:"是否已共享: true-是; false-否"`
 }
 
 func GetExcelClassifyByCondition(condition string, pars []interface{}) (item *ExcelClassify, err error) {
@@ -226,3 +233,10 @@ 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
+}

+ 10 - 8
models/data_manage/excel/excel_info.go

@@ -793,12 +793,14 @@ func GetChildExcelInfoByParentId(parentId int) (items []*ExcelInfo, err error) {
 
 // ExcelInfoDetailButton 操作按钮
 type ExcelInfoDetailButton struct {
-	RefreshButton    bool `description:"是否可刷新"`
-	CopyButton       bool `description:"是否可另存为"`
-	DownloadButton   bool `description:"是否可下载"`
-	OpButton         bool `description:"是否可编辑"`
-	DeleteButton     bool `description:"是否可删除"`
-	OpEdbButton      bool `description:"是否可生成指标"`
-	RefreshEdbButton bool `description:"是否可刷新指标"`
-	OpWorkerButton   bool `description:"是否修改协作人"`
+	RefreshButton     bool `description:"是否可刷新"`
+	CopyButton        bool `description:"是否可另存为"`
+	DownloadButton    bool `description:"是否可下载"`
+	OpButton          bool `description:"是否可编辑"`
+	DeleteButton      bool `description:"是否可删除"`
+	OpEdbButton       bool `description:"是否可生成指标"`
+	RefreshEdbButton  bool `description:"是否可刷新指标"`
+	OpWorkerButton    bool `description:"是否修改协作人"`
+	RenameButton      bool `description:"是否可以重命名"`
+	//CancelShareButton bool `description:"是否可以取消共享"`
 }

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

@@ -163,3 +163,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",

+ 38 - 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,40 @@ 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 len(permissionType) == 0 {
+		return
+	}
+
+	// 管理员/所属人所有权限
+	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.RenameButton = 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.RenameButton = true
+		}
+	}
+	return
+}