瀏覽代碼

指标收藏

hsun 6 月之前
父節點
當前提交
97304c9fa5

+ 5 - 5
controllers/base_auth.go

@@ -226,11 +226,11 @@ func (c *BaseAuthController) Prepare() {
 			for _, s := range apis {
 				apiMap[s] = true
 			}
-			//if !apiMap[uri] {
-			//	c.JSON(models.BaseResponse{Ret: 403, Msg: "无权访问!", ErrMsg: "无权访问!"}, false, false)
-			//	c.StopRun()
-			//	return
-			//}
+			if !apiMap[uri] {
+				c.JSON(models.BaseResponse{Ret: 403, Msg: "无权访问!", ErrMsg: "无权访问!"}, false, false)
+				c.StopRun()
+				return
+			}
 		} else {
 			c.JSON(models.BaseResponse{Ret: 408, Msg: "请求异常,请联系客服!", ErrMsg: "POST之外的请求,暂不支持"}, false, false)
 			c.StopRun()

+ 276 - 6
controllers/data_manage/edb_collect.go

@@ -5,7 +5,12 @@ import (
 	"eta_gn/eta_api/controllers"
 	"eta_gn/eta_api/models"
 	"eta_gn/eta_api/models/data_manage"
+	"eta_gn/eta_api/services/data"
+	"eta_gn/eta_api/utils"
 	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strings"
+	"time"
 )
 
 // EdbCollectController 指标收藏
@@ -13,10 +18,205 @@ type EdbCollectController struct {
 	controllers.BaseAuthController
 }
 
+// List
+// @Title 收藏列表-分页
+// @Description 收藏列表-分页
+// @Param   PageSize		query	int		false	"每页数据量"
+// @Param   CurrentIndex	query	int		false	"页码"
+// @Param   ClassifyId		query	int		false	"分类ID"
+// @Param   Keyword			query	string	false	"搜索关键词:指标ID/指标名称"
+// @Success Ret=200 保存成功
+// @router /edb_collect/list [get]
+func (this *EdbCollectController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	//resp := new(response.EdbInfoChartListResp)
+	resp := new(data_manage.CollectEdbInfoListResp)
+	resp.List = make([]*data_manage.CollectEdbInfoItem, 0)
+
+	// 分页
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	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)
+
+	// 当前用户
+	var cond string
+	var pars []interface{}
+	cond += ` AND a.sys_user_id = ?`
+	pars = append(pars, sysUser.AdminId)
+
+	// 分类筛选
+	classifyId, _ := this.GetInt("ClassifyId")
+	if classifyId > 0 {
+		classifyIds, e := data.GetEdbCollectClassifyChildIds(classifyId, sysUser.AdminId, true)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = fmt.Sprintf("获取子分类IDs失败, %v", e)
+			return
+		}
+		if len(classifyIds) == 0 {
+			resp.Paging = page
+			br.Data = resp
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "获取成功"
+			return
+		}
+		cond += fmt.Sprintf(` AND a.edb_collect_classify_id IN (%s) `, utils.GetOrmInReplace(len(classifyIds)))
+		pars = append(pars, classifyIds)
+	}
+
+	// 获取当前账号的不可见指标
+	{
+		obj := data_manage.EdbInfoNoPermissionAdmin{}
+		list, e := obj.GetAllListByAdminId(sysUser.AdminId)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取不可见指标配置数据失败,Err:" + e.Error()
+			return
+		}
+		var edbIds []int
+		for _, v := range list {
+			edbIds = append(edbIds, v.EdbInfoId)
+		}
+		edbLen := len(edbIds)
+		if edbLen > 0 {
+			cond += fmt.Sprintf(` AND a.edb_info_id NOT IN (%s)`, utils.GetOrmInReplace(edbLen))
+			pars = append(pars, edbIds)
+		}
+	}
+
+	// 关键词搜索
+	keywords := this.GetString("Keyword")
+	keywords = strings.TrimSpace(keywords)
+	if keywords != "" {
+		kw := fmt.Sprint("%", keywords, "%")
+		cond += fmt.Sprintf(` AND (b.edb_code LIKE ? OR b.edb_name LIKE ?)`)
+		pars = append(pars, kw, kw)
+	}
+
+	// 获取指标列表
+	dataCount, e := data_manage.GetCollectEdbInfoCount(cond, pars)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("获取收藏指标总数失败, %v", e)
+		return
+	}
+	if dataCount == 0 {
+		resp.Paging = page
+		br.Data = resp
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
+	list, e := data_manage.GetCollectEdbInfoPageList(cond, pars, startSize, pageSize)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("获取收藏指标列表失败, %v", e)
+		return
+	}
+	for _, v := range list {
+		resp.List = append(resp.List, data_manage.FormatEdbInfo2CollectItem(v))
+	}
+
+	// 指标权限
+	//{
+	//	var edbClassifyIds []int
+	//	for _, v := range list {
+	//		edbClassifyIds = append(edbClassifyIds, v.ClassifyId)
+	//	}
+	//	classifyMap := make(map[int]*data_manage.EdbClassify)
+	//	classifyList, e := data_manage.GetEdbClassifyByIdList(edbClassifyIds)
+	//	if e != nil {
+	//		br.Msg = "获取失败"
+	//		br.ErrMsg = fmt.Sprintf("获取指标分类列表失败, %v", e)
+	//		return
+	//	}
+	//	for _, v := range classifyList {
+	//		classifyMap[v.ClassifyId] = v
+	//	}
+	//
+	//	// 获取所有有权限的指标和分类
+	//	authEdbIds, authEdbClassifyIds, e := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUser.AdminId, 0, 0)
+	//	if e != nil {
+	//		br.Msg = "获取失败"
+	//		br.ErrMsg = fmt.Sprintf("获取有权限的指标和分类失败, %v", e)
+	//		return
+	//	}
+	//
+	//	// 已被供应商暂停的指标编码
+	//	stopIndexCodes := make(map[string]bool)
+	//	{
+	//		var indexCodes []string
+	//		for _, v := range list {
+	//			if v.Source == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
+	//				indexCodes = append(indexCodes, v.EdbCode)
+	//			}
+	//		}
+	//		if len(indexCodes) > 0 {
+	//			stopIndexes, e := data_manage.GetNotIsSupplierStopIndexByCodeList(indexCodes, 1)
+	//			if e != nil {
+	//				br.Msg = "获取失败"
+	//				br.ErrMsg = fmt.Sprintf("获取供应商停更的指标失败, %v", e)
+	//				return
+	//			}
+	//			for _, v := range stopIndexes {
+	//				stopIndexCodes[v.IndexCode] = true
+	//			}
+	//		}
+	//	}
+	//
+	//	for _, v := range list {
+	//		// 权限按钮
+	//		if c, ok := classifyMap[v.ClassifyId]; ok {
+	//			v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(v.IsJoinPermission, c.IsJoinPermission, v.EdbInfoId, v.ClassifyId, authEdbIds, authEdbClassifyIds)
+	//			v.Button = data.GetEdbOpButton(sysUser, v.SysUserId, v.EdbType, v.EdbInfoType, v.HaveOperaAuth)
+	//		}
+	//		// 供应商停用
+	//		if v.Source == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
+	//			if _, ok := stopIndexCodes[v.EdbCode]; ok {
+	//				v.IsSupplierStop = 1
+	//			}
+	//		}
+	//	}
+	//}
+	page = paging.GetPaging(currentIndex, pageSize, int(dataCount))
+	resp.Paging = page
+	//resp.List = list
+
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
 // Collect
-// @Title 新增指标接口
-// @Description 新增指标接口
-// @Param	request	body data_manage.AddEdbInfoReq true "type json string"
+// @Title 新增收藏
+// @Description 新增收藏
+// @Param	request	body data_manage.EdbCollectReq true "type json string"
 // @Success Ret=200 保存成功
 // @router /edb_collect/collect [post]
 func (this *EdbCollectController) Collect() {
@@ -35,12 +235,63 @@ func (this *EdbCollectController) Collect() {
 		br.Ret = 408
 		return
 	}
-	var req data_manage.AddEdbInfoReq
+	var req data_manage.EdbCollectReq
 	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
 		br.Msg = "参数解析异常"
 		br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
 		return
 	}
+	if req.EdbInfoId <= 0 {
+		br.Msg = "请选择指标"
+		return
+	}
+	if req.ClassifyId <= 0 {
+		br.Msg = "请选择分类"
+		return
+	}
+
+	edbItem, e := data_manage.GetEdbInfoById(req.EdbInfoId)
+	if e != nil {
+		if utils.IsErrNoRow(e) {
+			br.Msg = "指标不存在, 请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("获取指标信息失败: %v", e)
+		return
+	}
+
+	// 校验是否重复添加至同一个分类
+	collectOb := new(data_manage.EdbCollect)
+	{
+		cond := fmt.Sprintf(" AND %s = ? AND %s = ? AND %s = ?", collectOb.Cols().SysUserId, collectOb.Cols().EdbCollectClassifyId, collectOb.Cols().EdbInfoId)
+		pars := make([]interface{}, 0)
+		pars = append(pars, sysUser.AdminId, req.ClassifyId, req.EdbInfoId)
+		total, e := collectOb.GetCountByCondition(cond, pars)
+		if e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("获取分类下同指标失败, %v", e)
+			return
+		}
+		if total > 0 {
+			br.Msg = "该指标已收藏至该分类,请勿重复收藏"
+			return
+		}
+	}
+
+	// 保存收藏
+	collectOb.EdbCollectClassifyId = req.ClassifyId
+	collectOb.EdbInfoId = edbItem.EdbInfoId
+	collectOb.EdbCode = edbItem.EdbCode
+	collectOb.SysUserId = sysUser.AdminId
+	collectOb.SysRealName = sysUser.RealName
+	collectOb.CreateTime = time.Now().Local()
+	collectOb.ModifyTime = time.Now().Local()
+	if e = collectOb.Create(); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("新增指标收藏失败: %v", e)
+		return
+	}
 
 	br.Ret = 200
 	br.Success = true
@@ -50,7 +301,7 @@ func (this *EdbCollectController) Collect() {
 // CancelCollect
 // @Title 取消收藏
 // @Description 取消收藏
-// @Param	request	body data_manage.AddEdbInfoReq true "type json string"
+// @Param	request	body data_manage.EdbCollectReq true "type json string"
 // @Success Ret=200 保存成功
 // @router /edb_collect/cancel_collect [post]
 func (this *EdbCollectController) CancelCollect() {
@@ -69,12 +320,31 @@ func (this *EdbCollectController) CancelCollect() {
 		br.Ret = 408
 		return
 	}
-	var req data_manage.AddEdbInfoReq
+	var req data_manage.EdbCollectReq
 	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
 		br.Msg = "参数解析异常"
 		br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
 		return
 	}
+	if req.EdbInfoId <= 0 {
+		br.Msg = "请选择指标"
+		return
+	}
+	if req.ClassifyId <= 0 {
+		br.Msg = "请选择分类"
+		return
+	}
+
+	// 取消收藏
+	collectOb := new(data_manage.EdbCollect)
+	cond := fmt.Sprintf("%s = ? AND %s = ? AND %s = ?", collectOb.Cols().SysUserId, collectOb.Cols().EdbCollectClassifyId, collectOb.Cols().EdbInfoId)
+	pars := make([]interface{}, 0)
+	pars = append(pars, sysUser.AdminId, req.ClassifyId, req.EdbInfoId)
+	if e := collectOb.RemoveByCondition(cond, pars); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("取消收藏失败: %v", e)
+		return
+	}
 
 	br.Ret = 200
 	br.Success = true

+ 221 - 52
controllers/data_manage/edb_collect_classify.go

@@ -5,6 +5,7 @@ import (
 	"eta_gn/eta_api/controllers"
 	"eta_gn/eta_api/models"
 	"eta_gn/eta_api/models/data_manage"
+	"eta_gn/eta_api/services/data"
 	"eta_gn/eta_api/utils"
 	"fmt"
 	"sort"
@@ -18,6 +19,131 @@ type EdbCollectClassifyController struct {
 	controllers.BaseAuthController
 }
 
+// List
+// @Title 分类列表-含指标
+// @Description 分类列表-含指标
+// @Param   ParentId  query  int  false  "父级ID"
+// @Success 200 {object} data_manage.EdbCollectClassifyListItem
+// @router /edb_collect/classify/list [get]
+func (this *EdbCollectClassifyController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	parentId, _ := this.GetInt("ParentId")
+
+	resp := make([]*data_manage.EdbCollectClassifyListItem, 0)
+	// 查询分类
+	classifyOb := new(data_manage.EdbCollectClassify)
+	{
+		cond := fmt.Sprintf(" AND %s = ? AND %s = ?", classifyOb.Cols().ParentId, classifyOb.Cols().SysUserId)
+		pars := make([]interface{}, 0)
+		pars = append(pars, parentId, sysUser.AdminId)
+		list, e := classifyOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC", classifyOb.Cols().Sort))
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = fmt.Sprintf("获取子分类失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			resp = append(resp, &data_manage.EdbCollectClassifyListItem{
+				NodeType:     1,
+				ClassifyId:   v.EdbCollectClassifyId,
+				ClassifyName: v.ClassifyName,
+				ParentId:     v.ParentId,
+				Level:        v.Level,
+				Sort:         v.Sort,
+				UniqueCode:   v.UniqueCode,
+			})
+		}
+	}
+
+	// 查询分类下收藏的指标
+	{
+		list, e := data_manage.GetCollectEdbInfoByClassifyId(parentId)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = fmt.Sprintf("获取分类下指标失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			resp = append(resp, &data_manage.EdbCollectClassifyListItem{
+				NodeType:   2,
+				EdbInfoId:  v.EdbInfoId,
+				EdbCode:    v.EdbCode,
+				EdbName:    v.EdbName,
+				ParentId:   parentId,
+				Sort:       v.Sort,
+				UniqueCode: v.UniqueCode,
+			})
+		}
+	}
+	sort.Slice(resp, func(i, j int) bool {
+		return resp[i].Sort < resp[j].Sort
+	})
+
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// Tree
+// @Title 分类树
+// @Description 分类树
+// @Success 200 {object} data_manage.EdbCollectClassifyItem
+// @router /edb_collect/classify/tree [get]
+func (this *EdbCollectClassifyController) Tree() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	// 获取所有分类
+	classifyOb := new(data_manage.EdbCollectClassify)
+	cond := fmt.Sprintf(" AND %s = ?", classifyOb.Cols().SysUserId)
+	pars := make([]interface{}, 0)
+	pars = append(pars, sysUser.AdminId)
+	list, e := classifyOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC, %s ASC", classifyOb.Cols().ParentId, classifyOb.Cols().Sort))
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("获取分类列表失败, %v", e)
+		return
+	}
+	items := make([]*data_manage.EdbCollectClassifyItem, 0)
+	for _, v := range list {
+		items = append(items, v.Format2Item())
+	}
+	tree := data.GetEdbCollectClassifyTreeRecursive(items, 0)
+
+	br.Data = tree
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
 // Add
 // @Title 新增分类
 // @Description 新增分类
@@ -205,13 +331,13 @@ func (this *EdbCollectClassifyController) Edit() {
 	br.Msg = "操作成功"
 }
 
-// List
-// @Title 分类列表-含指标
-// @Description 分类列表-含指标
-// @Param   ParentId  query  int  false  "父级ID"
-// @Success 200 {object} data_manage.EdbCollectClassifyListItem
-// @router /edb_collect/classify/list [get]
-func (this *EdbCollectClassifyController) List() {
+// Remove
+// @Title 删除分类
+// @Description 删除分类
+// @Param	request	body data_manage.EdbCollectClassifyRemoveReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /edb_collect/classify/remove [post]
+func (this *EdbCollectClassifyController) Remove() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		if br.ErrMsg == "" {
@@ -227,60 +353,103 @@ func (this *EdbCollectClassifyController) List() {
 		br.Ret = 408
 		return
 	}
-	parentId, _ := this.GetInt("ParentId")
+	var req data_manage.EdbCollectClassifyRemoveReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常"
+		br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
+		return
+	}
+	if req.ClassifyId < 0 {
+		br.Msg = "请选择分类"
+		return
+	}
 
-	resp := make([]*data_manage.EdbCollectClassifyListItem, 0)
-	// 查询分类
 	classifyOb := new(data_manage.EdbCollectClassify)
-	{
-		cond := fmt.Sprintf(" AND %s = ? AND %s = ?", classifyOb.Cols().ParentId, classifyOb.Cols().SysUserId)
-		pars := make([]interface{}, 0)
-		pars = append(pars, parentId, sysUser.AdminId)
-		list, e := classifyOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC", classifyOb.Cols().Sort))
-		if e != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = fmt.Sprintf("获取子分类失败, %v", e)
+	_, e := classifyOb.GetItemById(req.ClassifyId)
+	if e != nil {
+		if utils.IsErrNoRow(e) {
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "操作成功"
 			return
 		}
-		for _, v := range list {
-			resp = append(resp, &data_manage.EdbCollectClassifyListItem{
-				NodeType:     1,
-				ClassifyId:   v.EdbCollectClassifyId,
-				ClassifyName: v.ClassifyName,
-				ParentId:     v.ParentId,
-				Level:        v.Level,
-				Sort:         v.Sort,
-				UniqueCode:   v.UniqueCode,
-			})
-		}
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("获取分类失败, %v", e)
+		return
 	}
 
-	// 查询分类下收藏的指标
-	{
-		list, e := data_manage.GetCollectEdbInfoByClassifyId(parentId)
-		if e != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = fmt.Sprintf("获取分类下指标失败, %v", e)
-			return
-		}
-		for _, v := range list {
-			resp = append(resp, &data_manage.EdbCollectClassifyListItem{
-				NodeType:   2,
-				EdbInfoId:  v.EdbInfoId,
-				EdbCode:    v.EdbCode,
-				EdbName:    v.EdbName,
-				ParentId:   parentId,
-				Sort:       v.Sort,
-				UniqueCode: v.UniqueCode,
-			})
+	// 获取子分类IDs
+	classifyIds, e := data.GetEdbCollectClassifyChildIds(req.ClassifyId, sysUser.AdminId, true)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("获取子分类IDs失败, %v", e)
+		return
+	}
+	if len(classifyIds) == 0 {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "操作成功"
+		return
+	}
+
+	// 移除所有子分类以及子分类所收藏的指标
+	if e = classifyOb.RemoveClassifyAndCollect(classifyIds); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("移除分类及收藏失败, %v", e)
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// TODO:Move
+// @Title 移动分类
+// @Description 移动分类
+// @Param	request	body data_manage.EdbCollectClassifyMoveReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /edb_collect/classify/move [post]
+func (this *EdbCollectClassifyController) Move() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
 		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
 	}
-	sort.Slice(resp, func(i, j int) bool {
-		return resp[i].Sort < resp[j].Sort
-	})
+	//var req data_manage.BaseFromThsHfClassifyMoveReq
+	//if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+	//	br.Msg = "参数解析异常"
+	//	br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
+	//	return
+	//}
+	//if req.ClassifyId <= 0 && req.ItemId <= 0 {
+	//	br.Msg = "请选择分类或指标"
+	//	return
+	//}
+	//
+	//err, errMsg := data.ThsHfMoveClassify(req, sysUser)
+	//if errMsg != `` {
+	//	br.Msg = errMsg
+	//	br.ErrMsg = errMsg
+	//	if err != nil {
+	//		br.ErrMsg = err.Error()
+	//	} else {
+	//		br.IsSendEmail = false
+	//	}
+	//	return
+	//}
 
-	br.Data = resp
 	br.Ret = 200
 	br.Success = true
-	br.Msg = "获取成功"
+	br.Msg = "操作成功"
 }

+ 82 - 5
models/data_manage/edb_collect.go

@@ -4,6 +4,7 @@ import (
 	"eta_gn/eta_api/global"
 	"eta_gn/eta_api/utils"
 	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
 	"strings"
 	"time"
 )
@@ -11,10 +12,11 @@ import (
 // EdbCollect 指标收藏
 type EdbCollect struct {
 	EdbCollectId         int       `gorm:"primaryKey;autoIncrement;column:edb_collect_id;type:int(10) unsigned;not null"`
-	EdbCollectClassifyId int       `gorm:"index:idx_classify_id;column:edb_collect_classify_id;type:int(10) unsigned;not null;default:0"` // 指标收藏分类Id
-	EdbInfoId            int       `gorm:"column:edb_info_id;type:int(10) unsigned;not null;default:0"`                                   // 指标Id
+	EdbCollectClassifyId int       `gorm:"index:idx_classify_id;column:edb_collect_classify_id;type:int(10) unsigned;not null;default:0"` // 指标收藏分类ID
+	EdbInfoId            int       `gorm:"column:edb_info_id;type:int(10) unsigned;not null;default:0"`                                   // 指标ID
 	EdbCode              string    `gorm:"column:edb_code;type:varchar(255);not null;default:''"`                                         // 指标编码
-	AdminId              int       `gorm:"index:idx_user_id;column:admin_id;type:int(10) unsigned;not null;default:0"`                    // 用户Id
+	SysUserId            int       `gorm:"column:sys_user_id;type:int(10) unsigned;not null;default:0"`                                   // 创建人ID
+	SysRealName          string    `gorm:"column:sys_real_name;type:int(10) unsigned;not null;default:0"`                                 // 创建人姓名
 	Sort                 int       `gorm:"column:sort;type:int(10);default:0"`                                                            // 排序
 	CreateTime           time.Time `gorm:"column:create_time;type:datetime"`                                                              // 创建时间
 	ModifyTime           time.Time `gorm:"column:modify_time;type:datetime"`                                                              // 更新时间
@@ -29,7 +31,8 @@ type EdbCollectCols struct {
 	EdbCollectClassifyId string
 	EdbInfoId            string
 	EdbCode              string
-	AdminId              string
+	SysUserId            string
+	SysRealName          string
 	Sort                 string
 	CreateTime           string
 	ModifyTime           string
@@ -41,7 +44,8 @@ func (m *EdbCollect) Cols() EdbCollectCols {
 		EdbCollectClassifyId: "edb_collect_classify_id",
 		EdbInfoId:            "edb_info_id",
 		EdbCode:              "edb_code",
-		AdminId:              "admin_id",
+		SysUserId:            "sys_user_id",
+		SysRealName:          "sys_real_name",
 		Sort:                 "sort",
 		CreateTime:           "create_time",
 		ModifyTime:           "modify_time",
@@ -147,3 +151,76 @@ func GetCollectEdbInfoByClassifyId(classifyId int) (items []*EdbInfo, err error)
 	err = global.DmSQL["data"].Raw(sql, classifyId).Find(&items).Error
 	return
 }
+
+// EdbCollectReq 加入/取消收藏
+type EdbCollectReq struct {
+	ClassifyId int `description:"分类ID"`
+	EdbInfoId  int `description:"指标ID"`
+}
+
+// GetCollectEdbInfoCount 获取收藏的指标信息总数
+func GetCollectEdbInfoCount(condition string, pars []interface{}) (total int64, err error) {
+	sql := fmt.Sprintf(`SELECT COUNT(1) AS ct FROM (
+	  SELECT b.* FROM edb_collect AS a JOIN edb_info AS b ON a.edb_info_id = b.edb_info_id
+	  WHERE 1=1 %s
+	  ORDER BY a.create_time DESC
+	) AS sub`, condition)
+	err = global.DmSQL["data"].Raw(sql, pars...).Scan(&total).Error
+	return
+}
+
+// GetCollectEdbInfoPageList 获取收藏的指标信息列表-分页
+func GetCollectEdbInfoPageList(condition string, pars []interface{}, startSize, pageSize int) (list []*CollectEdbInfoQuery, err error) {
+	sql := fmt.Sprintf(`SELECT b.*, a.edb_collect_classify_id AS collect_classify_id FROM edb_collect AS a JOIN edb_info AS b ON a.edb_info_id = b.edb_info_id
+	  WHERE 1=1 %s
+	  ORDER BY a.create_time DESC LIMIT ?,?`, condition)
+	pars = append(pars, startSize, pageSize)
+	err = global.DmSQL["data"].Raw(sql, pars...).Scan(&list).Error
+	return
+}
+
+type CollectEdbInfoQuery struct {
+	EdbInfo
+	CollectClassifyId int `gorm:"column:collect_classify_id" description:"收藏分类ID"`
+}
+
+// CollectEdbInfoItem 收藏列表指标信息
+type CollectEdbInfoItem struct {
+	EdbInfoId         int    `description:"指标ID"`
+	EdbInfoType       int    `description:"指标类型:0-普通指标; 1-预测指标"`
+	EdbType           int    `description:"指标类型:1-基础指标; 2-计算指标"`
+	Source            int    `description:"来源ID"`
+	SourceName        string `description:"来源名称"`
+	EdbCode           string `description:"指标编码"`
+	EdbName           string `description:"指标名称"`
+	Frequency         string `description:"频率"`
+	Unit              string `description:"单位"`
+	UniqueCode        string `description:"唯一编码"`
+	ChartImage        string `description:"图表图片"`
+	ClassifyId        int    `description:"指标分类ID"`
+	CollectClassifyId int    `description:"收藏分类ID"`
+}
+
+func FormatEdbInfo2CollectItem(origin *CollectEdbInfoQuery) (item *CollectEdbInfoItem) {
+	item = new(CollectEdbInfoItem)
+	item.EdbInfoId = origin.EdbInfoId
+	item.EdbInfoType = origin.EdbInfoType
+	item.EdbType = origin.EdbType
+	item.Source = origin.Source
+	item.SourceName = origin.SourceName
+	item.EdbCode = origin.EdbCode
+	item.EdbName = origin.EdbName
+	item.Frequency = origin.Frequency
+	item.Unit = origin.Unit
+	item.UniqueCode = origin.UniqueCode
+	item.ChartImage = origin.ChartImage
+	item.ClassifyId = origin.ClassifyId
+	item.CollectClassifyId = origin.CollectClassifyId
+	return
+}
+
+// CollectEdbInfoListResp 收藏指标分页列表相应
+type CollectEdbInfoListResp struct {
+	Paging *paging.PagingItem
+	List   []*CollectEdbInfoItem
+}

+ 50 - 10
models/data_manage/edb_collect_classify.go

@@ -19,9 +19,9 @@ type EdbCollectClassify struct {
 	Level                int       `gorm:"column:level;type:int(10) unsigned;not null;default:0"`          // 层级
 	Sort                 int       `gorm:"column:sort;type:int(10) unsigned;not null;default:0"`           // 排序
 	RootId               int       `gorm:"column:root_id;type:int(10) unsigned;not null;default:0"`        // 顶级Id
-	LevelPath            string    `gorm:"column:level_path;type:varchar(255);not null;default:''"`
-	CreateTime           time.Time `gorm:"column:create_time;type:datetime"` // 创建时间
-	ModifyTime           time.Time `gorm:"column:modify_time;type:datetime"` // 修改时间
+	LevelPath            string    `gorm:"column:level_path;type:varchar(255);not null;default:''"`        // 层级路径,逗号分隔
+	CreateTime           time.Time `gorm:"column:create_time;type:datetime"`                               // 创建时间
+	ModifyTime           time.Time `gorm:"column:modify_time;type:datetime"`                               // 修改时间
 }
 
 func (m *EdbCollectClassify) TableName() string {
@@ -161,12 +161,14 @@ func (m *EdbCollectClassify) GetSortMax(parentId int) (sort int, err error) {
 
 // EdbCollectClassifyItem 指标收藏分类
 type EdbCollectClassifyItem struct {
-	ClassifyId   int    `description:"收藏ID"`
-	ClassifyName string `description:"指标收藏分类ID"`
-	ParentId     int    `description:"指标ID"`
-	UniqueCode   string `description:"指标ID"`
-	Level        int    `description:"指标ID"`
-	Sort         int    `description:"指标ID"`
+	ClassifyId   int                       `description:"收藏ID"`
+	ClassifyName string                    `description:"指标收藏分类ID"`
+	ParentId     int                       `description:"指标ID"`
+	Level        int                       `description:"指标ID"`
+	Sort         int                       `description:"指标ID"`
+	LevelPath    string                    `description:"层级路径"`
+	UniqueCode   string                    `description:"唯一编码"`
+	Children     []*EdbCollectClassifyItem `description:"子分类"`
 }
 
 func (m *EdbCollectClassify) Format2Item() (item *EdbCollectClassifyItem) {
@@ -174,9 +176,11 @@ func (m *EdbCollectClassify) Format2Item() (item *EdbCollectClassifyItem) {
 	item.ClassifyId = m.EdbCollectClassifyId
 	item.ClassifyName = m.ClassifyName
 	item.ParentId = m.ParentId
-	item.UniqueCode = m.UniqueCode
 	item.Level = m.Level
 	item.Sort = m.Sort
+	item.LevelPath = m.LevelPath
+	item.UniqueCode = m.UniqueCode
+	//item.Children = make([]*EdbCollectClassifyItem, 0)
 	return
 }
 
@@ -207,3 +211,39 @@ type EdbCollectClassifyEditReq struct {
 	ClassifyId   int    `description:"分类ID"`
 	ClassifyName string `description:"分类名称"`
 }
+
+// EdbCollectClassifyRemoveReq 删除分类
+type EdbCollectClassifyRemoveReq struct {
+	ClassifyId int `description:"分类ID"`
+}
+
+// RemoveClassifyAndCollect 移除分类及收藏
+func (m *EdbCollectClassify) RemoveClassifyAndCollect(classifyIds []int) (err error) {
+	if len(classifyIds) == 0 {
+		return
+	}
+	tx := global.DmSQL["data"].Begin()
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(classifyIds)))
+	e := tx.Exec(sql, classifyIds).Error
+	if e != nil {
+		err = fmt.Errorf("remove classify err: %v", e)
+		return
+	}
+
+	collectOb := new(EdbCollect)
+	sql = fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, collectOb.TableName(), collectOb.Cols().EdbCollectClassifyId, utils.GetOrmInReplace(len(classifyIds)))
+	e = tx.Exec(sql, classifyIds).Error
+	if e != nil {
+		err = fmt.Errorf("remove collect err: %v", e)
+		return
+	}
+	return
+}

+ 36 - 0
routers/commentsRouter.go

@@ -3778,6 +3778,33 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectClassifyController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectClassifyController"],
+        beego.ControllerComments{
+            Method: "Move",
+            Router: `/edb_collect/classify/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectClassifyController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectClassifyController"],
+        beego.ControllerComments{
+            Method: "Remove",
+            Router: `/edb_collect/classify/remove`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectClassifyController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectClassifyController"],
+        beego.ControllerComments{
+            Method: "Tree",
+            Router: `/edb_collect/classify/tree`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectController"],
         beego.ControllerComments{
             Method: "CancelCollect",
@@ -3796,6 +3823,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/edb_collect/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbInfoController"],
         beego.ControllerComments{
             Method: "BaiinfoClassify",

+ 58 - 0
services/data/edb_collect.go

@@ -0,0 +1,58 @@
+package data
+
+import (
+	"eta_gn/eta_api/models/data_manage"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"strconv"
+	"strings"
+)
+
+// GetEdbCollectClassifyTreeRecursive 递归获取分类树形结构
+func GetEdbCollectClassifyTreeRecursive(list []*data_manage.EdbCollectClassifyItem, parentId int) []*data_manage.EdbCollectClassifyItem {
+	res := make([]*data_manage.EdbCollectClassifyItem, 0)
+	for _, v := range list {
+		if v.ParentId == parentId {
+			t := GetEdbCollectClassifyTreeRecursive(list, v.ClassifyId)
+			if len(t) > 0 {
+				v.Children = t
+			}
+			res = append(res, v)
+		}
+	}
+	return res
+}
+
+// GetEdbCollectClassifyChildIds 获取分类的子分类IDs
+func GetEdbCollectClassifyChildIds(classifyId, adminId int, selfInclude bool) (classifyIds []int, err error) {
+	// DM就不用FIND_IN_SET去查了, 从分类的LevelPath中遍历出来
+	exists := make(map[int]bool)
+	if selfInclude {
+		exists[classifyId] = true
+		classifyIds = append(classifyIds, classifyId)
+	}
+	classifyOb := new(data_manage.EdbCollectClassify)
+	cond := fmt.Sprintf(` AND %s = ?`, classifyOb.Cols().SysUserId)
+	pars := make([]interface{}, 0)
+	pars = append(pars, adminId)
+	list, e := classifyOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf(`%s ASC`, classifyOb.Cols().Sort))
+	if e != nil {
+		err = fmt.Errorf("获取用户收藏分类失败, %v", e)
+		return
+	}
+	strClassifyId := strconv.Itoa(classifyId)
+	for _, v := range list {
+		if v.LevelPath == "" {
+			continue
+		}
+		if exists[v.EdbCollectClassifyId] {
+			continue
+		}
+		pathArr := strings.Split(v.LevelPath, ",")
+		if len(pathArr) > 0 && utils.InArrayByStr(pathArr, strClassifyId) {
+			classifyIds = append(classifyIds, v.EdbCollectClassifyId)
+			exists[v.EdbCollectClassifyId] = true
+		}
+	}
+	return
+}