Roc il y a 3 mois
Parent
commit
dc36b6e33e

+ 380 - 0
controllers/data_manage/edb_info_share.go

@@ -0,0 +1,380 @@
+package data_manage
+
+import (
+	"encoding/json"
+	"eta_gn/eta_api/controllers"
+	"eta_gn/eta_api/models"
+	"eta_gn/eta_api/models/data_manage"
+	"eta_gn/eta_api/models/data_manage/request"
+	"eta_gn/eta_api/models/data_manage/response"
+	"eta_gn/eta_api/services/data/data_manage_permission"
+	"eta_gn/eta_api/services/elastic"
+	"eta_gn/eta_api/utils"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strings"
+	"time"
+)
+
+// EdbInfoShareController 数据管理
+type EdbInfoShareController struct {
+	controllers.BaseAuthController
+}
+
+// UserList
+// @Title 获取指标设置共享的详情
+// @Description 获取指标详情接口
+// @Param   EdbInfoId   query   int  true       "指标id"
+// @Success 200 {object} data_manage.EdbInfo
+// @router /edb_info/share/user_list [get]
+func (c *EdbInfoShareController) UserList() {
+	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
+	}
+	edbInfoId, _ := c.GetInt("EdbInfoId")
+	if edbInfoId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误"
+		return
+	}
+	_, err := data_manage.GetEdbInfoById(edbInfoId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
+		return
+	}
+
+	//// TODO 权限校验
+	//{
+	//	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, c.SysUser.AdminId, edbInfo.EdbInfoId, edbInfo.ClassifyId)
+	//		if err != nil {
+	//			br.Msg = err.Error()
+	//			br.ErrMsg = "校验指标权限失败,err:" + err.Error()
+	//			return
+	//		}
+	//		resp.HaveOperaAuth = haveOperaAuth
+	//	}
+	//}
+
+	resp := response.EdbInfoShareUserResp{}
+
+	obj := data_manage.EdbInfoShare{}
+	list, err := obj.GetListByEdbInfoId(edbInfoId)
+	if err != nil {
+		br.Msg = `获取失败`
+		br.ErrMsg = `获取失败:` + err.Error()
+		return
+	}
+	resp.List = list
+	if len(list) > 0 {
+		resp.ShareType = list[0].ShareType
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// Save
+// @Title 保存指标指标设置共享的详情
+// @Description 获取指标详情接口
+// @Param	request	body request.SetEdbInfoShareReq true "type json string"
+// @Success 200 {object} data_manage.EdbInfo
+// @router /edb_info/share/save [post]
+func (c *EdbInfoShareController) Save() {
+	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 request.SetEdbInfoShareReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	resp := response.EdbInfoShareUserResp{}
+
+	obj := data_manage.EdbInfoShare{}
+	err = obj.SaveEdbInfoShare([]int{req.EdbInfoId}, req.UserIdList, req.ShareType)
+	if err != nil {
+		br.Msg = `保存失败`
+		br.ErrMsg = `保存失败:` + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+	br.Data = resp
+}
+
+// EdbInfoFilterByEs
+// @Title 指标筛选接口
+// @Description 指标筛选接口
+// @Param   KeyWord   query   string  false       "搜索关键词:指标ID/指标名称"
+// @Param   FilterSource   query   int  false       "搜索来源:1:其他搜索,2:累计值转月值搜索,3:变频,4:基础指标,5:同比"
+// @Param   Frequency   query   string  false       "频度"
+// @Param   IsAddPredictEdb   query   bool  false       "是否查询添加预测指标"
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   EdbType   query   int  false       "指标类型:0-基础和计算;1-基础指标;2-计算指标"
+// @Success 200 {object} data_manage.EdbInfoList
+// @router /edb_info/share [get]
+func (c *EdbInfoShareController) EdbInfoFilterByEs() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	pageSize, _ := c.GetInt("PageSize")
+	currentIndex, _ := c.GetInt("CurrentIndex")
+
+	var total int64
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	keyWord := c.GetString("KeyWord")
+	keyWord = strings.TrimSpace(keyWord) //移除字符串首尾空格
+	filterSource, _ := c.GetInt("FilterSource")
+	if filterSource <= 0 {
+		filterSource = 1
+	}
+	//指标来源
+	source, _ := c.GetInt("Source")
+
+	frequency := c.GetString("Frequency") //频度
+
+	isAddPredictEdb, _ := c.GetBool("IsAddPredictEdb") //是否查询添加预测指标
+
+	edbType, _ := c.GetInt("EdbType", 0) // 指标类型:0-基础和计算;1-基础指标;2-计算指标
+
+	var edbInfoList []*data_manage.EdbInfoList
+	var err error
+
+	// 无权限指标 和 无权限指标分类id
+	noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, err := data_manage_permission.GetUserAllEdbAndClassifyNoPermissionList(c.SysUser.AdminId, utils.EDB_INFO_TYPE, edbType)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+		return
+	}
+
+	// 是否走ES
+	isEs := false
+	if keyWord != "" {
+		var keyWordArr []string
+		keyWordArr = append(keyWordArr, keyWord)
+
+		newKeyWord := strings.Split(keyWord, " ")
+		keyWordArr = append(keyWordArr, newKeyWord...)
+
+		// 普通的搜索
+		if !isAddPredictEdb {
+			total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, 0, frequency, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, edbType)
+		} else {
+			// 允许添加预测指标的搜索
+			total, edbInfoList, err = elastic.SearchAddPredictEdbInfoData(utils.DATA_INDEX_NAME, keyWord, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, startSize, pageSize, edbType)
+		}
+		isEs = true
+	} else {
+		var condition string
+		var pars []interface{}
+		// 普通指标
+		condition += ` AND edb_info_type = ? `
+		pars = append(pars, 0)
+
+		// 无权限指标id
+		lenNoPermissionEdbInfoIdList := len(noPermissionEdbInfoIdList)
+		if lenNoPermissionEdbInfoIdList > 0 {
+			condition += ` AND edb_info_id  not in (` + utils.GetOrmInReplace(lenNoPermissionEdbInfoIdList) + `) `
+			pars = append(pars, noPermissionEdbInfoIdList)
+		}
+		// 无权限指标分类id
+		lenNoPermissionEdbClassifyIdList := len(noPermissionEdbClassifyIdList)
+		if lenNoPermissionEdbClassifyIdList > 0 {
+			condition += ` AND classify_id  not in (` + utils.GetOrmInReplace(lenNoPermissionEdbClassifyIdList) + `) `
+			pars = append(pars, noPermissionEdbClassifyIdList)
+		}
+
+		switch filterSource {
+		case 2:
+			condition += ` AND frequency='月度' `
+		case 3:
+			condition += ` AND frequency <> '日度' `
+		case 4:
+			condition += ` AND edb_type = 1 `
+		case 5:
+			condition += ` AND source = 6 ` //来源(同比值)
+		case 6:
+			condition += ` AND frequency != ? `
+			pars = append(pars, "年度")
+		}
+
+		//频度
+		if frequency != "" {
+			condition += ` AND frequency = ? `
+			pars = append(pars, frequency)
+		}
+
+		if source > 0 && filterSource != 5 {
+			condition += ` AND source = ? `
+			pars = append(pars, source)
+		}
+		// 查询只允许添加预测指标的搜索
+		if isAddPredictEdb {
+			condition += ` AND frequency in ("日度","周度","月度") `
+		}
+
+		// 基础指标/计算指标
+		if edbType > 0 {
+			condition += ` AND edb_type = ? `
+			pars = append(pars, edbType)
+		}
+
+		total, edbInfoList, err = data_manage.GetEdbInfoFilterList(condition, pars, startSize, pageSize)
+	}
+	if err != nil {
+		edbInfoList = make([]*data_manage.EdbInfoList, 0)
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, int(total))
+
+	edbInfoListLen := len(edbInfoList)
+
+	classifyIdList := make([]int, 0)
+	for i := 0; i < edbInfoListLen; i++ {
+		edbInfoList[i].ConvertToResp()
+		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(c.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++ {
+		for j := 0; j < edbInfoListLen; j++ {
+			if (edbInfoList[i].EdbNameAlias == edbInfoList[j].EdbNameAlias) &&
+				(edbInfoList[i].EdbInfoId != edbInfoList[j].EdbInfoId) &&
+				!(strings.Contains(edbInfoList[i].EdbName, edbInfoList[i].SourceName)) {
+				edbInfoList[i].EdbName = edbInfoList[i].EdbName + "(" + edbInfoList[i].SourceName + ")"
+			}
+		}
+	}
+	//新增搜索词记录
+	{
+		searchKeyword := new(data_manage.SearchKeyword)
+		searchKeyword.KeyWord = keyWord
+		searchKeyword.CreateTime = time.Now()
+		go data_manage.AddSearchKeyword(searchKeyword)
+	}
+
+	// 不返回无权限的指标
+	respList := make([]*data_manage.EdbInfoList, 0)
+	for _, v := range edbInfoList {
+		if v.HaveOperaAuth {
+			respList = append(respList, v)
+		}
+	}
+
+	resp := data_manage.EdbInfoFilterDataResp{
+		Paging: page,
+		List:   respList,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 93 - 0
models/data_manage/edb_info_share.go

@@ -0,0 +1,93 @@
+package data_manage
+
+import (
+	"eta_gn/eta_api/global"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"time"
+)
+
+// EdbInfoShare
+// @Description: 指标分享表
+type EdbInfoShare struct {
+	EdbInfoShareId int       `gorm:"primaryKey" `
+	EdbInfoId      int       `description:"指标id"`
+	SysUserId      int       `description:"sys_user_id"`
+	ShareType      int8      `description:"分享类型,1:仅查看;2:可编辑"`
+	CreateTime     time.Time `description:"创建时间"`
+}
+
+// TableName
+// @Description: 表名
+// @author: Roc
+// @receiver m
+// @datetime 2024-11-27 14:04:14
+// @return string
+func (m EdbInfoShare) TableName() string {
+	return `edb_info_share`
+}
+
+// GetListByEdbInfoId
+// @Description: 根据指标id获取分享用户列表
+// @author: Roc
+// @receiver m
+// @datetime 2024-11-27 15:39:17
+// @param edbInfoId int
+// @return items []*EdbInfoShare
+// @return err error
+func (m EdbInfoShare) GetListByEdbInfoId(edbInfoId int) (items []*EdbInfoShare, err error) {
+	sql := ` SELECT * FROM edb_info_share WHERE edb_info_id = ? ORDER BY edb_info_share_id ASC `
+	err = global.DmSQL["data"].Raw(sql, edbInfoId).Find(&items).Error
+
+	return
+}
+
+// SaveEdbInfoShare
+// @Description: 保存配置
+// @author: Roc
+// @receiver m
+// @datetime 2024-11-27 15:54:07
+// @param edbInfoIdList []int
+// @param userIdList []int
+// @param shareType int8
+// @return err error
+func (m EdbInfoShare) SaveEdbInfoShare(edbInfoIdList, userIdList []int, shareType int8) (err error) {
+	addList := make([]*EdbInfoShare, 0)
+	for _, edbInfoId := range edbInfoIdList {
+		for _, userId := range userIdList {
+			addList = append(addList, &EdbInfoShare{
+				EdbInfoShareId: 0,
+				EdbInfoId:      edbInfoId,
+				SysUserId:      userId,
+				ShareType:      shareType,
+				CreateTime:     time.Now(),
+			})
+		}
+	}
+
+	tx := global.DmSQL["data"].Begin()
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	// 先删除原来的配置,新增最新的配置
+	sql := fmt.Sprintf("DELETE FROM %s WHERE edb_info_id IN (?) ", m.TableName())
+	err = tx.Exec(sql, edbInfoIdList).Error
+	if err != nil {
+		return
+	}
+
+	// 批量添加新的配置
+	if len(addList) > 0 {
+		err = tx.CreateInBatches(addList, utils.MultiAddNum).Error
+		if err != nil {
+			return
+		}
+	}
+
+	return
+}

+ 23 - 0
models/data_manage/request/edb_info_share.go

@@ -0,0 +1,23 @@
+package request
+
+// SetEdbInfoShareReq
+// @Description: 设置指标分享人请求
+type SetEdbInfoShareReq struct {
+	EdbInfoId  int   `description:"指标id"`
+	UserIdList []int `description:"分享用户id列表,如果为空,说明要给该指标移除分享人"`
+	ShareType  int8  `description:"分享类型,1:仅查看;2:可编辑"`
+}
+
+// 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:"是否选择所有指标"`
+	Classify     string   `description:"分类id,支持多选,用英文,隔开"`
+	Keyword      string   `description:"关键字"`
+}

+ 10 - 0
models/data_manage/response/edb_info_share.go

@@ -0,0 +1,10 @@
+package response
+
+import "eta_gn/eta_api/models/data_manage"
+
+// EdbInfoShareUserResp
+// @Description: 获取指标分享用户列表
+type EdbInfoShareUserResp struct {
+	ShareType int8                        `description:"分享类型,1:仅查看;2:可编辑"`
+	List      []*data_manage.EdbInfoShare `description:"分享用户列表"`
+}

+ 27 - 0
routers/commentsRouter.go

@@ -4183,6 +4183,33 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbInfoShareController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbInfoShareController"],
+        beego.ControllerComments{
+            Method: "EdbInfoFilterByEs",
+            Router: `/edb_info/share`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbInfoShareController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbInfoShareController"],
+        beego.ControllerComments{
+            Method: "Save",
+            Router: `/edb_info/share/save`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbInfoShareController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbInfoShareController"],
+        beego.ControllerComments{
+            Method: "UserList",
+            Router: `/edb_info/share/user_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:FactorEdbSeriesController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:FactorEdbSeriesController"],
         beego.ControllerComments{
             Method: "Add",

+ 1 - 0
routers/router.go

@@ -160,6 +160,7 @@ func init() {
 				&data_manage.FactorEdbSeriesController{},
 				&data_manage.EdbCollectController{},
 				&data_manage.EdbCollectClassifyController{},
+				&data_manage.EdbInfoShareController{},
 			),
 		),
 		web.NSNamespace("/my_chart",