浏览代码

fix:图表收藏接口

Roc 4 月之前
父节点
当前提交
bf17f6ede7

+ 65 - 81
controllers/data_manage/edb_collect.go → controllers/data_manage/collect_chart.go

@@ -14,8 +14,8 @@ import (
 	"time"
 )
 
-// EdbCollectController 指标收藏
-type EdbCollectController struct {
+// ChartCollectController 图表收藏
+type ChartCollectController struct {
 	controllers.BaseAuthController
 }
 
@@ -25,10 +25,10 @@ type EdbCollectController struct {
 // @Param   PageSize		query	int		false	"每页数据量"
 // @Param   CurrentIndex	query	int		false	"页码"
 // @Param   ClassifyId		query	int		false	"分类ID"
-// @Param   Keyword			query	string	false	"搜索关键词:指标ID/指标名称"
+// @Param   Keyword			query	string	false	"搜索关键词:图表ID/图表名称"
 // @Success Ret=200 保存成功
-// @router /edb_collect/list [get]
-func (this *EdbCollectController) List() {
+// @router /chart_collect/list [get]
+func (this *ChartCollectController) List() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		if br.ErrMsg == "" {
@@ -44,9 +44,9 @@ func (this *EdbCollectController) List() {
 		br.Ret = 408
 		return
 	}
-	//resp := new(response.EdbInfoChartListResp)
-	resp := new(data_manage.CollectEdbInfoListResp)
-	resp.List = make([]*data_manage.CollectEdbInfoItem, 0)
+	//resp := new(response.ChartInfoChartListResp)
+	resp := new(data_manage.CollectChartInfoListResp)
+	resp.List = make([]*data_manage.CollectChartInfoItem, 0)
 
 	// 分页
 	pageSize, _ := this.GetInt("PageSize")
@@ -71,7 +71,7 @@ func (this *EdbCollectController) List() {
 	// 分类筛选
 	classifyId, _ := this.GetInt("ClassifyId")
 	if classifyId > 0 {
-		classifyIds, e := data.GetEdbCollectClassifyChildIds(classifyId, sysUser.AdminId, true)
+		classifyIds, e := data.GetChartCollectClassifyChildIds(classifyId, sysUser.AdminId, true)
 		if e != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = fmt.Sprintf("获取子分类IDs失败, %v", e)
@@ -85,44 +85,24 @@ func (this *EdbCollectController) List() {
 			br.Msg = "获取成功"
 			return
 		}
-		cond += fmt.Sprintf(` AND a.edb_collect_classify_id IN (%s) `, utils.GetOrmInReplace(len(classifyIds)))
+		cond += fmt.Sprintf(` AND a.chart_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 ?)`)
+		cond += fmt.Sprintf(` AND (b.chart_code LIKE ? OR b.chart_name LIKE ?)`)
 		pars = append(pars, kw, kw)
 	}
 
-	// 获取指标列表
-	dataCount, e := data_manage.GetCollectEdbInfoCount(cond, pars)
+	// 获取图表列表
+	dataCount, e := data_manage.GetCollectChartInfoCount(cond, pars)
 	if e != nil {
 		br.Msg = "获取失败"
-		br.ErrMsg = fmt.Sprintf("获取收藏指标总数失败, %v", e)
+		br.ErrMsg = fmt.Sprintf("获取收藏图表总数失败, %v", e)
 		return
 	}
 	if dataCount == 0 {
@@ -133,14 +113,14 @@ func (this *EdbCollectController) List() {
 		br.Msg = "获取成功"
 		return
 	}
-	list, e := data_manage.GetCollectEdbInfoPageList(cond, pars, startSize, pageSize)
+	list, e := data_manage.GetCollectChartInfoPageList(cond, pars, startSize, pageSize)
 	if e != nil {
 		br.Msg = "获取失败"
-		br.ErrMsg = fmt.Sprintf("获取收藏指标列表失败, %v", e)
+		br.ErrMsg = fmt.Sprintf("获取收藏图表列表失败, %v", e)
 		return
 	}
 	for _, v := range list {
-		resp.List = append(resp.List, data_manage.FormatEdbInfo2CollectItem(v))
+		resp.List = append(resp.List, data_manage.FormatChartInfo2CollectItem(v))
 	}
 	sort.Slice(resp.List, func(i, j int) bool {
 		return resp.List[i].Sort < resp.List[j].Sort
@@ -158,10 +138,10 @@ func (this *EdbCollectController) List() {
 // Collect
 // @Title 新增收藏
 // @Description 新增收藏
-// @Param	request	body data_manage.EdbCollectReq true "type json string"
+// @Param	request	body data_manage.ChartCollectReq true "type json string"
 // @Success Ret=200 保存成功
-// @router /edb_collect/collect [post]
-func (this *EdbCollectController) Collect() {
+// @router /chart_collect/collect [post]
+func (this *ChartCollectController) Collect() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		if br.ErrMsg == "" {
@@ -177,54 +157,58 @@ func (this *EdbCollectController) Collect() {
 		br.Ret = 408
 		return
 	}
-	var req data_manage.EdbCollectReq
+	var req data_manage.ChartCollectReq
 	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 = "请选择指标"
+	if req.ChartInfoId <= 0 {
+		br.Msg = "请选择图表"
 		return
 	}
 
-	edbItem, e := data_manage.GetEdbInfoById(req.EdbInfoId)
+	chartItem, e := data_manage.GetChartInfoById(req.ChartInfoId)
 	if e != nil {
 		if utils.IsErrNoRow(e) {
-			br.Msg = "指标不存在, 请刷新页面"
+			br.Msg = "图表不存在, 请刷新页面"
 			return
 		}
 		br.Msg = "操作失败"
-		br.ErrMsg = fmt.Sprintf("获取指标信息失败: %v", e)
+		br.ErrMsg = fmt.Sprintf("获取图表信息失败: %v", e)
+		return
+	}
+	if chartItem.ChartInfoId <= 0 {
+		br.Msg = "图表不存在, 请刷新页面"
+		br.IsSendEmail = false
 		return
 	}
 
-	collectOb := new(data_manage.EdbCollect)
+	collectOb := new(data_manage.ChartCollect)
 
 	// 待添加的分类配置
-	addList := make([]*data_manage.EdbCollect, 0)
+	addList := make([]*data_manage.ChartCollect, 0)
 	for _, classifyId := range req.ClassifyIdList {
-		addList = append(addList, &data_manage.EdbCollect{
-			EdbCollectClassifyId: classifyId,
-			EdbInfoId:            req.EdbInfoId,
-			EdbCode:              edbItem.EdbCode,
-			SysUserId:            sysUser.AdminId,
-			SysRealName:          sysUser.RealName,
-			CreateTime:           time.Now().Local(),
-			ModifyTime:           time.Now().Local(),
+		addList = append(addList, &data_manage.ChartCollect{
+			ChartCollectClassifyId: classifyId,
+			ChartInfoId:            req.ChartInfoId,
+			SysUserId:              sysUser.AdminId,
+			SysRealName:            sysUser.RealName,
+			CreateTime:             time.Now().Local(),
+			ModifyTime:             time.Now().Local(),
 		})
 
 	}
 
-	cond := fmt.Sprintf(" %s = ? AND %s = ?", collectOb.Cols().SysUserId, collectOb.Cols().EdbInfoId)
+	cond := fmt.Sprintf(" %s = ? AND %s = ?", collectOb.Cols().SysUserId, collectOb.Cols().ChartInfoId)
 	pars := make([]interface{}, 0)
-	pars = append(pars, sysUser.AdminId, req.EdbInfoId)
+	pars = append(pars, sysUser.AdminId, req.ChartInfoId)
 
 	// 清除原有保存收藏配置,并新增保存收藏
 	e = collectOb.RemoveAndCreateMulti(cond, pars, addList)
 	if e != nil {
 		br.Msg = "操作失败"
-		br.ErrMsg = fmt.Sprintf("新增指标收藏失败: %v", e)
+		br.ErrMsg = fmt.Sprintf("新增图表收藏失败: %v", e)
 		return
 	}
 
@@ -236,10 +220,10 @@ func (this *EdbCollectController) Collect() {
 // CancelCollect
 // @Title 取消收藏
 // @Description 取消收藏
-// @Param	request	body data_manage.EdbCollectReq true "type json string"
+// @Param	request	body data_manage.ChartCollectReq true "type json string"
 // @Success Ret=200 保存成功
-// @router /edb_collect/cancel_collect [post]
-func (this *EdbCollectController) CancelCollect() {
+// @router /chart_collect/cancel_collect [post]
+func (this *ChartCollectController) CancelCollect() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		if br.ErrMsg == "" {
@@ -255,14 +239,14 @@ func (this *EdbCollectController) CancelCollect() {
 		br.Ret = 408
 		return
 	}
-	var req data_manage.EdbCollectReq
+	var req data_manage.ChartCollectReq
 	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 = "请选择指标"
+	if req.ChartInfoId <= 0 {
+		br.Msg = "请选择图表"
 		return
 	}
 	if req.ClassifyId <= 0 {
@@ -271,10 +255,10 @@ func (this *EdbCollectController) CancelCollect() {
 	}
 
 	// 取消收藏
-	collectOb := new(data_manage.EdbCollect)
-	cond := fmt.Sprintf("%s = ? AND %s = ? AND %s = ?", collectOb.Cols().SysUserId, collectOb.Cols().EdbCollectClassifyId, collectOb.Cols().EdbInfoId)
+	collectOb := new(data_manage.ChartCollect)
+	cond := fmt.Sprintf("%s = ? AND %s = ? AND %s = ?", collectOb.Cols().SysUserId, collectOb.Cols().ChartCollectClassifyId, collectOb.Cols().ChartInfoId)
 	pars := make([]interface{}, 0)
-	pars = append(pars, sysUser.AdminId, req.ClassifyId, req.EdbInfoId)
+	pars = append(pars, sysUser.AdminId, req.ClassifyId, req.ChartInfoId)
 	if e := collectOb.RemoveByCondition(cond, pars); e != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = fmt.Sprintf("取消收藏失败: %v", e)
@@ -289,9 +273,9 @@ func (this *EdbCollectController) CancelCollect() {
 // Move
 // @Title 移动收藏
 // @Description 移动收藏
-// @Success 200 {object} data_manage.EdbCollectMoveReq
-// @router /edb_collect/move [post]
-func (this *EdbCollectController) Move() {
+// @Success 200 {object} data_manage.ChartCollectMoveReq
+// @router /chart_collect/move [post]
+func (this *ChartCollectController) Move() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		if br.ErrMsg == "" {
@@ -308,7 +292,7 @@ func (this *EdbCollectController) Move() {
 		return
 	}
 
-	var req data_manage.EdbCollectMoveReq
+	var req data_manage.ChartCollectMoveReq
 	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
 		br.Msg = "参数解析异常!"
 		br.ErrMsg = fmt.Sprintf("参数解析失败, %v", e)
@@ -316,16 +300,16 @@ func (this *EdbCollectController) Move() {
 	}
 
 	var newSort int
-	if req.PrevEdbInfoId <= 0 {
-		firstOne, err := data_manage.GetEdbCollectSort(sysUser.AdminId, req.ClassifyId, 0)
+	if req.PrevChartInfoId <= 0 {
+		firstOne, err := data_manage.GetChartCollectSort(sysUser.AdminId, req.ClassifyId, 0)
 		if err != nil {
 			br.Msg = "获取数据失败!"
 			br.ErrMsg = "获取数据失败,GetMyChartClassifyMapping,Err:" + err.Error()
 			return
 		}
 		newSort = firstOne.Sort - 1
-	} else if req.NextEdbInfoId <= 0 {
-		lastOne, err := data_manage.GetEdbCollectSort(sysUser.AdminId, req.ClassifyId, 1)
+	} else if req.NextChartInfoId <= 0 {
+		lastOne, err := data_manage.GetChartCollectSort(sysUser.AdminId, req.ClassifyId, 1)
 		if err != nil {
 			br.Msg = "获取数据失败!"
 			br.ErrMsg = "获取数据失败,GetMyChartClassifyMapping,Err:" + err.Error()
@@ -333,13 +317,13 @@ func (this *EdbCollectController) Move() {
 		}
 		newSort = lastOne.Sort + 1
 	} else {
-		preMapItem, err := data_manage.GetEdbCollectByEdbInfoId(sysUser.AdminId, req.PrevEdbInfoId, req.ClassifyId)
+		preMapItem, err := data_manage.GetChartCollectByChartInfoId(sysUser.AdminId, req.PrevChartInfoId, req.ClassifyId)
 		if err != nil {
 			br.Msg = "获取数据失败!"
 			br.ErrMsg = "获取数据失败,GetMyChartClassifyMapping,Err:" + err.Error()
 			return
 		}
-		nextMapItem, err := data_manage.GetEdbCollectByEdbInfoId(sysUser.AdminId, req.NextEdbInfoId, req.ClassifyId)
+		nextMapItem, err := data_manage.GetChartCollectByChartInfoId(sysUser.AdminId, req.NextChartInfoId, req.ClassifyId)
 		if err != nil {
 			br.Msg = "获取数据失败!"
 			br.ErrMsg = "获取数据失败,GetMyChartClassifyMapping,Err:" + err.Error()
@@ -355,12 +339,12 @@ func (this *EdbCollectController) Move() {
 			updateSortStr = `sort + 1`
 		}
 		if updateSortStr != `` {
-			_ = data_manage.UpdateEdbCollectSortByClassifyId(req.ClassifyId, preMapItem.Sort, preMapItem.EdbCollectId, updateSortStr)
+			_ = data_manage.UpdateChartCollectSortByClassifyId(req.ClassifyId, preMapItem.Sort, preMapItem.ChartCollectId, updateSortStr)
 		}
 	}
-	if e := data_manage.UpdateEdbCollectMove(newSort, sysUser.AdminId, req.EdbInfoId, req.ClassifyId); e != nil {
+	if e := data_manage.UpdateChartCollectMove(newSort, sysUser.AdminId, req.ChartInfoId, req.ClassifyId); e != nil {
 		br.Msg = "操作失败"
-		br.ErrMsg = fmt.Sprintf("更新指标收藏失败, %v", e)
+		br.ErrMsg = fmt.Sprintf("更新图表收藏失败, %v", e)
 		return
 	}
 

+ 59 - 60
controllers/data_manage/edb_collect_classify.go → controllers/data_manage/collect_chart_classify.go

@@ -14,18 +14,18 @@ import (
 	"time"
 )
 
-// EdbCollectClassifyController 指标收藏分类
-type EdbCollectClassifyController struct {
+// ChartCollectClassifyController 图表收藏分类
+type ChartCollectClassifyController struct {
 	controllers.BaseAuthController
 }
 
 // List
-// @Title 分类列表-含指标
-// @Description 分类列表-含指标
+// @Title 分类列表-含图表
+// @Description 分类列表-含图表
 // @Param   ParentId  query  int  false  "父级ID"
-// @Success 200 {object} data_manage.EdbCollectClassifyListItem
-// @router /edb_collect/classify/list [get]
-func (this *EdbCollectClassifyController) List() {
+// @Success 200 {object} data_manage.ChartCollectClassifyListItem
+// @router /chart_collect/classify/list [get]
+func (this *ChartCollectClassifyController) List() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		if br.ErrMsg == "" {
@@ -43,9 +43,9 @@ func (this *EdbCollectClassifyController) List() {
 	}
 	parentId, _ := this.GetInt("ParentId")
 
-	resp := make([]*data_manage.EdbCollectClassifyListItem, 0)
+	resp := make([]*data_manage.ChartCollectClassifyListItem, 0)
 	// 查询分类
-	classifyOb := new(data_manage.EdbCollectClassify)
+	classifyOb := new(data_manage.ChartCollectClassify)
 	{
 		cond := fmt.Sprintf(" AND %s = ? AND %s = ?", classifyOb.Cols().ParentId, classifyOb.Cols().SysUserId)
 		pars := make([]interface{}, 0)
@@ -57,9 +57,9 @@ func (this *EdbCollectClassifyController) List() {
 			return
 		}
 		for _, v := range list {
-			resp = append(resp, &data_manage.EdbCollectClassifyListItem{
+			resp = append(resp, &data_manage.ChartCollectClassifyListItem{
 				NodeType:     1,
-				ClassifyId:   v.EdbCollectClassifyId,
+				ClassifyId:   v.ChartCollectClassifyId,
 				ClassifyName: v.ClassifyName,
 				ParentId:     v.ParentId,
 				Level:        v.Level,
@@ -69,23 +69,22 @@ func (this *EdbCollectClassifyController) List() {
 		}
 	}
 
-	// 查询分类下收藏的指标
+	// 查询分类下收藏的图表
 	{
-		list, e := data_manage.GetCollectEdbInfoByClassifyId(parentId)
+		list, e := data_manage.GetCollectChartInfoByClassifyId(parentId)
 		if e != nil {
 			br.Msg = "获取失败"
-			br.ErrMsg = fmt.Sprintf("获取分类下指标失败, %v", e)
+			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,
+			resp = append(resp, &data_manage.ChartCollectClassifyListItem{
+				NodeType:    2,
+				ChartInfoId: v.ChartInfoId,
+				ChartName:   v.ChartName,
+				ParentId:    parentId,
+				Sort:        v.Sort,
+				UniqueCode:  v.UniqueCode,
 			})
 		}
 	}
@@ -102,9 +101,9 @@ func (this *EdbCollectClassifyController) List() {
 // Tree
 // @Title 分类树
 // @Description 分类树
-// @Success 200 {object} data_manage.EdbCollectClassifyItem
-// @router /edb_collect/classify/tree [get]
-func (this *EdbCollectClassifyController) Tree() {
+// @Success 200 {object} data_manage.ChartCollectClassifyItem
+// @router /chart_collect/classify/tree [get]
+func (this *ChartCollectClassifyController) Tree() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		if br.ErrMsg == "" {
@@ -122,7 +121,7 @@ func (this *EdbCollectClassifyController) Tree() {
 	}
 
 	// 获取所有分类
-	classifyOb := new(data_manage.EdbCollectClassify)
+	classifyOb := new(data_manage.ChartCollectClassify)
 	cond := fmt.Sprintf(" AND %s = ?", classifyOb.Cols().SysUserId)
 	pars := make([]interface{}, 0)
 	pars = append(pars, sysUser.AdminId)
@@ -132,11 +131,11 @@ func (this *EdbCollectClassifyController) Tree() {
 		br.ErrMsg = fmt.Sprintf("获取分类列表失败, %v", e)
 		return
 	}
-	items := make([]*data_manage.EdbCollectClassifyItem, 0)
+	items := make([]*data_manage.ChartCollectClassifyItem, 0)
 	for _, v := range list {
 		items = append(items, v.Format2Item())
 	}
-	tree := data.GetEdbCollectClassifyTreeRecursive(items, 0)
+	tree := data.GetChartCollectClassifyTreeRecursive(items, 0)
 
 	br.Data = tree
 	br.Ret = 200
@@ -147,10 +146,10 @@ func (this *EdbCollectClassifyController) Tree() {
 // Add
 // @Title 新增分类
 // @Description 新增分类
-// @Param	request	body data_manage.EdbCollectClassifyAddReq true "type json string"
+// @Param	request	body data_manage.ChartCollectClassifyAddReq true "type json string"
 // @Success Ret=200 保存成功
-// @router /edb_collect/classify/add [post]
-func (this *EdbCollectClassifyController) Add() {
+// @router /chart_collect/classify/add [post]
+func (this *ChartCollectClassifyController) Add() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		if br.ErrMsg == "" {
@@ -166,7 +165,7 @@ func (this *EdbCollectClassifyController) Add() {
 		br.Ret = 408
 		return
 	}
-	var req data_manage.EdbCollectClassifyAddReq
+	var req data_manage.ChartCollectClassifyAddReq
 	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
 		br.Msg = "参数解析异常"
 		br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
@@ -177,7 +176,7 @@ func (this *EdbCollectClassifyController) Add() {
 		br.Msg = "请输入名称"
 		return
 	}
-	classifyOb := new(data_manage.EdbCollectClassify)
+	classifyOb := new(data_manage.ChartCollectClassify)
 
 	// 校验分类名称
 	//{
@@ -232,11 +231,11 @@ func (this *EdbCollectClassifyController) Add() {
 		return
 	}
 	if req.ParentId > 0 {
-		classifyOb.LevelPath = fmt.Sprintf("%s,%d", levelPath, classifyOb.EdbCollectClassifyId)
+		classifyOb.LevelPath = fmt.Sprintf("%s,%d", levelPath, classifyOb.ChartCollectClassifyId)
 		classifyOb.RootId = rootId
 	} else {
-		classifyOb.LevelPath = fmt.Sprint(classifyOb.EdbCollectClassifyId)
-		classifyOb.RootId = classifyOb.EdbCollectClassifyId
+		classifyOb.LevelPath = fmt.Sprint(classifyOb.ChartCollectClassifyId)
+		classifyOb.RootId = classifyOb.ChartCollectClassifyId
 	}
 	if e = classifyOb.Update([]string{classifyOb.Cols().LevelPath, classifyOb.Cols().RootId}); e != nil {
 		br.Msg = "操作失败"
@@ -253,10 +252,10 @@ func (this *EdbCollectClassifyController) Add() {
 // Edit
 // @Title 编辑分类
 // @Description 编辑分类
-// @Param	request	body data_manage.EdbCollectClassifyEditReq true "type json string"
+// @Param	request	body data_manage.ChartCollectClassifyEditReq true "type json string"
 // @Success Ret=200 保存成功
-// @router /edb_collect/classify/edit [post]
-func (this *EdbCollectClassifyController) Edit() {
+// @router /chart_collect/classify/edit [post]
+func (this *ChartCollectClassifyController) Edit() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		if br.ErrMsg == "" {
@@ -272,7 +271,7 @@ func (this *EdbCollectClassifyController) Edit() {
 		br.Ret = 408
 		return
 	}
-	var req data_manage.EdbCollectClassifyEditReq
+	var req data_manage.ChartCollectClassifyEditReq
 	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
 		br.Msg = "参数解析异常"
 		br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
@@ -288,7 +287,7 @@ func (this *EdbCollectClassifyController) Edit() {
 		return
 	}
 
-	classifyOb := new(data_manage.EdbCollectClassify)
+	classifyOb := new(data_manage.ChartCollectClassify)
 	classifyItem, e := classifyOb.GetItemById(req.ClassifyId)
 	if e != nil {
 		if utils.IsErrNoRow(e) {
@@ -334,10 +333,10 @@ func (this *EdbCollectClassifyController) Edit() {
 // Remove
 // @Title 删除分类
 // @Description 删除分类
-// @Param	request	body data_manage.EdbCollectClassifyRemoveReq true "type json string"
+// @Param	request	body data_manage.ChartCollectClassifyRemoveReq true "type json string"
 // @Success 200 string "操作成功"
-// @router /edb_collect/classify/remove [post]
-func (this *EdbCollectClassifyController) Remove() {
+// @router /chart_collect/classify/remove [post]
+func (this *ChartCollectClassifyController) Remove() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		if br.ErrMsg == "" {
@@ -353,7 +352,7 @@ func (this *EdbCollectClassifyController) Remove() {
 		br.Ret = 408
 		return
 	}
-	var req data_manage.EdbCollectClassifyRemoveReq
+	var req data_manage.ChartCollectClassifyRemoveReq
 	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
 		br.Msg = "参数解析异常"
 		br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
@@ -364,7 +363,7 @@ func (this *EdbCollectClassifyController) Remove() {
 		return
 	}
 
-	classifyOb := new(data_manage.EdbCollectClassify)
+	classifyOb := new(data_manage.ChartCollectClassify)
 	_, e := classifyOb.GetItemById(req.ClassifyId)
 	if e != nil {
 		if utils.IsErrNoRow(e) {
@@ -379,7 +378,7 @@ func (this *EdbCollectClassifyController) Remove() {
 	}
 
 	// 获取子分类IDs
-	classifyIds, e := data.GetEdbCollectClassifyChildIds(req.ClassifyId, sysUser.AdminId, true)
+	classifyIds, e := data.GetChartCollectClassifyChildIds(req.ClassifyId, sysUser.AdminId, true)
 	if e != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = fmt.Sprintf("获取子分类IDs失败, %v", e)
@@ -392,7 +391,7 @@ func (this *EdbCollectClassifyController) Remove() {
 		return
 	}
 
-	// 移除所有子分类以及子分类所收藏的指标
+	// 移除所有子分类以及子分类所收藏的图表
 	if e = classifyOb.RemoveClassifyAndCollect(classifyIds); e != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = fmt.Sprintf("移除分类及收藏失败, %v", e)
@@ -407,10 +406,10 @@ func (this *EdbCollectClassifyController) Remove() {
 // Move
 // @Title 移动分类
 // @Description 移动分类
-// @Param	request	body data_manage.EdbCollectClassifyMoveReq true "type json string"
+// @Param	request	body data_manage.ChartCollectClassifyMoveReq true "type json string"
 // @Success 200 string "操作成功"
-// @router /edb_collect/classify/move [post]
-func (this *EdbCollectClassifyController) Move() {
+// @router /chart_collect/classify/move [post]
+func (this *ChartCollectClassifyController) Move() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		if br.ErrMsg == "" {
@@ -426,14 +425,14 @@ func (this *EdbCollectClassifyController) Move() {
 		br.Ret = 408
 		return
 	}
-	var req data_manage.EdbCollectClassifyMoveReq
+	var req data_manage.ChartCollectClassifyMoveReq
 	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
 		br.Msg = "参数解析异常!"
 		br.ErrMsg = fmt.Sprintf("参数解析失败, %v", e)
 		return
 	}
 
-	classifyOb := new(data_manage.EdbCollectClassify)
+	classifyOb := new(data_manage.ChartCollectClassify)
 	item, e := classifyOb.GetItemById(req.ClassifyId)
 	if e != nil {
 		if utils.IsErrNoRow(e) {
@@ -448,7 +447,7 @@ func (this *EdbCollectClassifyController) Move() {
 	updateCol := make([]string, 0)
 	//如果有传入 上一个兄弟节点分类id
 	if req.PrevClassifyId > 0 {
-		prevClassify, err := data_manage.GetEdbCollectClassifyById(sysUser.AdminId, req.PrevClassifyId)
+		prevClassify, err := data_manage.GetChartCollectClassifyById(sysUser.AdminId, req.PrevClassifyId)
 		if err != nil {
 			br.Msg = "移动失败"
 			br.ErrMsg = "获取上一个兄弟节点分类信息失败,Err:" + err.Error()
@@ -458,7 +457,7 @@ func (this *EdbCollectClassifyController) Move() {
 		//如果是移动在两个兄弟节点之间
 		if req.NextClassifyId > 0 {
 			//下一个兄弟节点
-			nextClassify, err := data_manage.GetEdbCollectClassifyById(sysUser.AdminId, req.NextClassifyId)
+			nextClassify, err := data_manage.GetChartCollectClassifyById(sysUser.AdminId, req.NextClassifyId)
 			if err != nil {
 				br.Msg = "移动失败"
 				br.ErrMsg = "获取下一个兄弟节点分类信息失败,Err:" + err.Error()
@@ -468,13 +467,13 @@ func (this *EdbCollectClassifyController) Move() {
 			if prevClassify.Sort == nextClassify.Sort || prevClassify.Sort == item.Sort {
 				//变更兄弟节点的排序
 				updateSortStr := `sort + 2`
-				_ = data_manage.UpdateEdbCollectClassifySortByClassifyId(sysUser.AdminId, prevClassify.EdbCollectClassifyId, prevClassify.Sort, updateSortStr)
+				_ = data_manage.UpdateChartCollectClassifySortByClassifyId(sysUser.AdminId, prevClassify.ChartCollectClassifyId, prevClassify.Sort, updateSortStr)
 			} else {
 				//如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
 				if nextClassify.Sort-prevClassify.Sort == 1 {
 					//变更兄弟节点的排序
 					updateSortStr := `sort + 1`
-					_ = data_manage.UpdateEdbCollectClassifySortByClassifyId(sysUser.AdminId, 0, prevClassify.Sort, updateSortStr)
+					_ = data_manage.UpdateChartCollectClassifySortByClassifyId(sysUser.AdminId, 0, prevClassify.Sort, updateSortStr)
 				}
 			}
 		}
@@ -483,7 +482,7 @@ func (this *EdbCollectClassifyController) Move() {
 		item.ModifyTime = time.Now()
 		updateCol = append(updateCol, "Sort", "ModifyTime")
 	} else {
-		firstClassify, err := data_manage.GetFirstEdbCollectClassifyByAdminId(sysUser.AdminId)
+		firstClassify, err := data_manage.GetFirstChartCollectClassifyByAdminId(sysUser.AdminId)
 		if err != nil && !utils.IsErrNoRow(err) {
 			br.Msg = "移动失败"
 			br.ErrMsg = "获取获取当前账号下的排序第一条的分类信息失败,Err:" + err.Error()
@@ -491,9 +490,9 @@ func (this *EdbCollectClassifyController) Move() {
 		}
 
 		//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
-		if firstClassify != nil && firstClassify.EdbCollectClassifyId > 0 && firstClassify.Sort == 0 {
+		if firstClassify != nil && firstClassify.ChartCollectClassifyId > 0 && firstClassify.Sort == 0 {
 			updateSortStr := ` sort + 1 `
-			_ = data_manage.UpdateEdbCollectClassifySortByClassifyId(sysUser.AdminId, firstClassify.EdbCollectClassifyId-1, 0, updateSortStr)
+			_ = data_manage.UpdateChartCollectClassifySortByClassifyId(sysUser.AdminId, firstClassify.ChartCollectClassifyId-1, 0, updateSortStr)
 		}
 
 		item.Sort = 0 //那就是排在第一位

+ 365 - 0
models/data_manage/collect_chart.go

@@ -0,0 +1,365 @@
+package data_manage
+
+import (
+	"eta_gn/eta_api/global"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// ChartCollect 图表收藏
+type ChartCollect struct {
+	ChartCollectId         int       `gorm:"primaryKey;autoIncrement;column:chart_collect_id;type:int(10) unsigned;not null"`
+	ChartCollectClassifyId int       `gorm:"index:idx_classify_id;column:chart_collect_classify_id;type:int(10) unsigned;not null;default:0"` // 图表收藏分类ID
+	ChartInfoId            int       `gorm:"column:chart_info_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"`                                                                // 更新时间
+}
+
+func (m *ChartCollect) TableName() string {
+	return "chart_collect"
+}
+
+type ChartCollectCols struct {
+	PrimaryId              string
+	ChartCollectClassifyId string
+	ChartInfoId            string
+	SysUserId              string
+	SysRealName            string
+	Sort                   string
+	CreateTime             string
+	ModifyTime             string
+}
+
+func (m *ChartCollect) Cols() ChartCollectCols {
+	return ChartCollectCols{
+		PrimaryId:              "chart_collect_id",
+		ChartCollectClassifyId: "chart_collect_classify_id",
+		ChartInfoId:            "chart_info_id",
+		SysUserId:              "sys_user_id",
+		SysRealName:            "sys_real_name",
+		Sort:                   "sort",
+		CreateTime:             "create_time",
+		ModifyTime:             "modify_time",
+	}
+}
+
+func (m *ChartCollect) Create() (err error) {
+	err = global.DmSQL["data"].Create(m).Error
+	return
+}
+
+func (m *ChartCollect) CreateMulti(items []*ChartCollect) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	err = global.DmSQL["data"].CreateInBatches(items, utils.MultiAddNum).Error
+	return
+}
+
+func (m *ChartCollect) Update(cols []string) (err error) {
+	err = global.DmSQL["data"].Select(cols).Updates(m).Error
+	return
+}
+
+func (m *ChartCollect) Remove() (err error) {
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
+	err = global.DmSQL["data"].Exec(sql, m.ChartCollectId).Error
+	return
+}
+
+func (m *ChartCollect) MultiRemove(ids []int) (err error) {
+	if len(ids) == 0 {
+		return
+	}
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
+	err = global.DmSQL["data"].Exec(sql, ids).Error
+	return
+}
+
+func (m *ChartCollect) RemoveByCondition(condition string, pars []interface{}) (err error) {
+	if condition == "" {
+		return
+	}
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s`, m.TableName(), condition)
+	err = global.DmSQL["data"].Exec(sql, pars...).Error
+	return
+}
+
+// RemoveAndCreateMulti
+// @Description: 清除原有配置并新增收藏
+// @receiver m
+// @param delCondition
+// @param delPars
+// @param items
+// @return err
+func (m *ChartCollect) RemoveAndCreateMulti(delCondition string, delPars []interface{}, items []*ChartCollect) (err error) {
+	to := global.DmSQL["data"].Begin()
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	// 先删除
+	{
+		if delCondition == "" {
+			return
+		}
+		sql := fmt.Sprintf(`DELETE FROM %s WHERE %s`, m.TableName(), delCondition)
+		err = to.Exec(sql, delPars...).Error
+		if err != nil {
+			return
+		}
+	}
+
+	if len(items) == 0 {
+		return
+	}
+	err = to.CreateInBatches(items, utils.MultiAddNum).Error
+
+	return
+}
+
+func (m *ChartCollect) GetItemById(id int) (item *ChartCollect, err error) {
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
+	err = global.DmSQL["data"].Raw(sql, id).First(&item).Error
+	return
+}
+
+func (m *ChartCollect) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *ChartCollect, err error) {
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
+	err = global.DmSQL["data"].Raw(sql, pars...).First(&item).Error
+	return
+}
+
+func (m *ChartCollect) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = global.DmSQL["data"].Raw(sql, pars...).Scan(&count).Error
+	return
+}
+
+func (m *ChartCollect) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*ChartCollect, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	err = global.DmSQL["data"].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+func (m *ChartCollect) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*ChartCollect, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	pars = append(pars, startSize, pageSize)
+	err = global.DmSQL["data"].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+// GetCollectChartInfoByClassifyId 获取分类下收藏的图表信息
+func GetCollectChartInfoByClassifyId(classifyId int) (items []*ChartInfo, err error) {
+	sql := `SELECT b.* FROM chart_collect AS a JOIN chart_info AS b ON a.chart_info_id = b.chart_info_id WHERE a.chart_collect_classify_id = ? ORDER BY a.sort ASC`
+	err = global.DmSQL["data"].Raw(sql, classifyId).Find(&items).Error
+	return
+}
+
+// ChartCollectReq 加入/取消收藏
+type ChartCollectReq struct {
+	ClassifyId     int   `description:"分类ID"`
+	ClassifyIdList []int `description:"分类ID列表"`
+	ChartInfoId    int   `description:"图表ID"`
+}
+
+// GetCollectChartInfoCount 获取收藏的图表信息总数
+func GetCollectChartInfoCount(condition string, pars []interface{}) (total int64, err error) {
+	sql := fmt.Sprintf(`SELECT COUNT(1) AS ct FROM (
+	  SELECT b.chart_info_id FROM chart_collect AS a JOIN chart_info AS b ON a.chart_info_id = b.chart_info_id
+	  WHERE 1=1 %s
+	  GROUP BY b.chart_info_id
+	) AS sub`, condition)
+	err = global.DmSQL["data"].Raw(sql, pars...).Scan(&total).Error
+	return
+}
+
+// GetCollectChartInfoPageList 获取收藏的图表信息列表-分页
+func GetCollectChartInfoPageList(condition string, pars []interface{}, startSize, pageSize int) (list []*CollectChartInfoQuery, err error) {
+	sql := fmt.Sprintf(`SELECT b."chart_info_id",
+       WM_CONCAT(DISTINCT a."chart_collect_classify_id") AS "collect_classify_id",
+MAX(a.create_time) as collect_time,
+MAX(b."chart_name") "chart_name",
+MAX(b."chart_type") "chart_type",
+MAX(b."source") "source",
+MAX(b."chart_classify_id") "chart_classify_id",
+MAX(b."create_time") "create_time",
+MAX(b."unique_code") "unique_code",
+MAX(b."chart_image") "chart_image",
+MAX(b."modify_time") "modify_time",
+MAX(a."sort") AS "sort"
+ FROM chart_collect AS a JOIN chart_info AS b ON a.chart_info_id = b.chart_info_id
+	  WHERE 1=1 %s
+	  GROUP BY b.chart_info_id
+ORDER BY collect_time DESC LIMIT ?,?`, condition)
+	pars = append(pars, startSize, pageSize)
+	err = global.DmSQL["data"].Raw(sql, pars...).Scan(&list).Error
+	return
+}
+
+// GetUserAllCollectChartInfoIdList
+// @Description: 获取用户所有收藏的图表id列表
+// @author: Roc
+// @datetime 2024-11-28 15:27:52
+// @param userId int
+// @return list []int
+// @return err error
+func GetUserAllCollectChartInfoIdList(userId int) (list []int, err error) {
+	sql := `SELECT chart_info_id FROM chart_collect WHERE 1=1 AND sys_user_id = ? GROUP BY chart_info_id`
+	err = global.DmSQL["data"].Raw(sql, userId).Scan(&list).Error
+	return
+}
+
+type CollectChartInfoQuery struct {
+	ChartInfo
+	CollectClassifyIdStr string    `gorm:"column:collect_classify_id" description:"收藏分类ID"`
+	CollectTime          time.Time `gorm:"column:collect_time" description:"收藏时间"`
+}
+
+// CollectChartInfoItem 收藏列表图表信息
+type CollectChartInfoItem struct {
+	ChartInfoId           int    `description:"图表ID"`
+	ChartInfoType         int    `description:"图表类型:0-普通图表; 1-预测图表"`
+	ChartType             int    `description:"图表类型:1-基础图表; 2-计算图表"`
+	Source                int    `description:"来源ID"`
+	SourceName            string `description:"来源名称"`
+	ChartName             string `description:"图表名称"`
+	Frequency             string `description:"频率"`
+	Unit                  string `description:"单位"`
+	UniqueCode            string `description:"唯一编码"`
+	ChartImage            string `description:"图表图片"`
+	ClassifyId            int    `description:"图表分类ID"`
+	CollectClassifyIdList []int  `description:"收藏分类ID列表"`
+	CollectTime           string `description:"收藏时间"`
+	CreateTime            string `description:"创建时间"`
+	Sort                  int    `description:"排序"`
+}
+
+func FormatChartInfo2CollectItem(origin *CollectChartInfoQuery) (item *CollectChartInfoItem) {
+	item = new(CollectChartInfoItem)
+	item.ChartInfoId = origin.ChartInfoId
+	item.ChartType = origin.ChartType
+	item.Source = origin.Source
+	item.ChartName = origin.ChartName
+	item.Unit = origin.Unit
+	item.UniqueCode = origin.UniqueCode
+	item.ChartImage = origin.ChartImage
+	item.ClassifyId = origin.ChartClassifyId
+	collectClassifyIdList := make([]int, 0)
+	if origin.CollectClassifyIdStr != `` {
+		collectClassifyIdStrList := strings.Split(origin.CollectClassifyIdStr, ",")
+		for _, v := range collectClassifyIdStrList {
+			collectClassifyId, tmpErr := strconv.Atoi(v)
+			if tmpErr == nil {
+				collectClassifyIdList = append(collectClassifyIdList, collectClassifyId)
+			}
+		}
+	}
+	item.CollectClassifyIdList = collectClassifyIdList
+	item.CollectTime = origin.CollectTime.Format(utils.FormatDateTime)
+	item.CreateTime = origin.CreateTime.Format(utils.FormatDateTime)
+	item.Sort = origin.Sort
+	return
+}
+
+// CollectChartInfoListResp 收藏图表分页列表相应
+type CollectChartInfoListResp struct {
+	Paging *paging.PagingItem
+	List   []*CollectChartInfoItem
+}
+
+// ChartCollectMoveReq 移动收藏
+type ChartCollectMoveReq struct {
+	ChartInfoId     int `description:"收藏的图表ID(分类下图表ID唯一)"`
+	PrevChartInfoId int `description:"前一个收藏的图表ID"`
+	NextChartInfoId int `description:"后一个收藏的图表ID"`
+	ClassifyId      int `description:"当前分类ID"`
+}
+
+func GetChartCollectSort(adminId, classifyId, sort int) (item *ChartCollect, err error) {
+	sql := ` SELECT * FROM chart_collect WHERE 1=1 AND sys_user_id = ? AND chart_collect_classify_id = ? `
+	if sort == 1 {
+		sql += ` ORDER BY sort DESC, chart_collect_id ASC LIMIT 1 `
+	} else {
+		sql += ` ORDER BY sort ASC, chart_collect_id DESC LIMIT 1 `
+	}
+	err = global.DmSQL["data"].Raw(sql, adminId, classifyId).First(&item).Error
+	return
+}
+
+func GetChartCollectByChartInfoId(adminId, chartInfoId, classifyId int) (item *ChartCollect, err error) {
+	sql := `SELECT * FROM chart_collect WHERE sys_user_id = ? AND chart_info_id = ? AND chart_collect_classify_id=? `
+	err = global.DmSQL["data"].Raw(sql, adminId, chartInfoId, classifyId).First(&item).Error
+	return
+}
+
+func UpdateChartCollectSortByClassifyId(classifyId, nowSort int, prevMyChartClassifyMappingId int, updateSort string) (err error) {
+	sql := ` update chart_collect set sort = ` + updateSort + ` WHERE chart_collect_classify_id = ?  `
+	if prevMyChartClassifyMappingId > 0 {
+		sql += ` AND ( sort > ? or ( chart_collect_id < ? and sort=? )) `
+	}
+	err = global.DmSQL["data"].Exec(sql, classifyId, nowSort, prevMyChartClassifyMappingId, nowSort).Error
+	return
+}
+
+func UpdateChartCollectMove(sort, adminId, chartInfoId, myChartClassifyId int) (err error) {
+	sql := ` UPDATE chart_collect SET sort = ?,modify_time=NOW() WHERE sys_user_id=? AND chart_info_id=? AND chart_collect_classify_id=? `
+	err = global.DmSQL["data"].Exec(sql, sort, adminId, chartInfoId, myChartClassifyId).Error
+	return
+}
+
+// ChartCollectItem 图表收藏信息
+type ChartCollectItem struct {
+	ChartCollectId         int       `gorm:"primaryKey;autoIncrement;column:chart_collect_id;type:int(10) unsigned;not null"`
+	ChartCollectClassifyId int       `gorm:"index:idx_classify_id;column:chart_collect_classify_id;type:int(10) unsigned;not null;default:0"` // 图表收藏分类ID
+	ChartInfoId            int       `gorm:"column:chart_info_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"`                                   // 创建人姓名
+	ClassifyName           string    `gorm:"column:classify_name;type:varchar(255);not null;default:''"`                                      // 分类名称
+	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"`                                                                // 更新时间
+}
+
+func (m *ChartCollect) GetItemsByUserIdAndChartInfoIdList(userId int, chartInfoIdList []int) (items []*ChartCollectItem, err error) {
+	if len(chartInfoIdList) <= 0 {
+		return
+	}
+	sql := `SELECT a.*,b.classify_name FROM chart_collect  AS a
+    JOIN chart_collect_classify b on a.chart_collect_classify_id = b.chart_collect_classify_id
+    WHERE a.sys_user_id = ? AND a.chart_info_id in (?)  ORDER BY a.chart_collect_id DESC `
+	err = global.DmSQL["data"].Raw(sql, userId, chartInfoIdList).Find(&items).Error
+
+	return
+}

+ 280 - 0
models/data_manage/collect_chart_classify.go

@@ -0,0 +1,280 @@
+package data_manage
+
+import (
+	"eta_gn/eta_api/global"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"strings"
+	"time"
+)
+
+// ChartCollectClassify 图表收藏分类
+type ChartCollectClassify struct {
+	ChartCollectClassifyId int       `gorm:"primaryKey;autoIncrement;column:chart_collect_classify_id;type:int(10) unsigned;not null"`
+	ClassifyName           string    `gorm:"column:classify_name;type:varchar(255);not null;default:''"`     // 分类名称
+	ParentId               int       `gorm:"column:parent_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
+	SysUserRealName        string    `gorm:"column:sys_user_real_name;type:varchar(128);not null"`           // 创建人姓名
+	UniqueCode             string    `gorm:"unique;column:unique_code;type:varchar(64);not null;default:''"` // 唯一编码
+	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"`                               // 修改时间
+}
+
+func (m *ChartCollectClassify) TableName() string {
+	return "chart_collect_classify"
+}
+
+type ChartCollectClassifyCols struct {
+	PrimaryId       string
+	ClassifyName    string
+	ParentId        string
+	SysUserId       string
+	SysUserRealName string
+	UniqueCode      string
+	Level           string
+	Sort            string
+	RootId          string
+	LevelPath       string
+	CreateTime      string
+	ModifyTime      string
+}
+
+func (m *ChartCollectClassify) Cols() ChartCollectClassifyCols {
+	return ChartCollectClassifyCols{
+		PrimaryId:       "chart_collect_classify_id",
+		ClassifyName:    "classify_name",
+		ParentId:        "parent_id",
+		SysUserId:       "sys_user_id",
+		SysUserRealName: "sys_user_real_name",
+		UniqueCode:      "unique_code",
+		Level:           "level",
+		Sort:            "sort",
+		RootId:          "root_id",
+		LevelPath:       "level_path",
+		CreateTime:      "create_time",
+		ModifyTime:      "modify_time",
+	}
+}
+
+func (m *ChartCollectClassify) Create() (err error) {
+	err = global.DmSQL["data"].Create(m).Error
+	return
+}
+
+func (m *ChartCollectClassify) CreateMulti(items []*ChartCollectClassify) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	err = global.DmSQL["data"].CreateInBatches(items, utils.MultiAddNum).Error
+	return
+}
+
+func (m *ChartCollectClassify) Update(cols []string) (err error) {
+	err = global.DmSQL["data"].Select(cols).Updates(m).Error
+	return
+}
+
+func (m *ChartCollectClassify) Remove() (err error) {
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
+	err = global.DmSQL["data"].Exec(sql, m.ChartCollectClassifyId).Error
+	return
+}
+
+func (m *ChartCollectClassify) MultiRemove(ids []int) (err error) {
+	if len(ids) == 0 {
+		return
+	}
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
+	err = global.DmSQL["data"].Exec(sql, ids).Error
+	return
+}
+
+func (m *ChartCollectClassify) RemoveByCondition(condition string, pars []interface{}) (err error) {
+	if condition == "" {
+		return
+	}
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s`, m.TableName(), condition)
+	err = global.DmSQL["data"].Exec(sql, pars...).Error
+	return
+}
+
+func (m *ChartCollectClassify) GetItemById(id int) (item *ChartCollectClassify, err error) {
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
+	err = global.DmSQL["data"].Raw(sql, id).First(&item).Error
+	return
+}
+
+func (m *ChartCollectClassify) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *ChartCollectClassify, err error) {
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
+	err = global.DmSQL["data"].Raw(sql, pars...).First(&item).Error
+	return
+}
+
+func (m *ChartCollectClassify) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = global.DmSQL["data"].Raw(sql, pars...).Scan(&count).Error
+	return
+}
+
+func (m *ChartCollectClassify) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*ChartCollectClassify, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	err = global.DmSQL["data"].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+func (m *ChartCollectClassify) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*ChartCollectClassify, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	pars = append(pars, startSize, pageSize)
+	err = global.DmSQL["data"].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+func (m *ChartCollectClassify) GetSortMax(parentId int) (sort int, err error) {
+	sql := fmt.Sprintf(`SELECT COALESCE(MAX(%s), 0) FROM %s WHERE %s = ?`, m.Cols().Sort, m.TableName(), m.Cols().ParentId)
+	err = global.DmSQL["data"].Raw(sql, parentId).Scan(&sort).Error
+	return
+}
+
+// ChartCollectClassifyItem 图表收藏分类
+type ChartCollectClassifyItem struct {
+	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     []*ChartCollectClassifyItem `description:"子分类"`
+}
+
+func (m *ChartCollectClassify) Format2Item() (item *ChartCollectClassifyItem) {
+	item = new(ChartCollectClassifyItem)
+	item.ClassifyId = m.ChartCollectClassifyId
+	item.ClassifyName = m.ClassifyName
+	item.ParentId = m.ParentId
+	item.Level = m.Level
+	item.Sort = m.Sort
+	item.LevelPath = m.LevelPath
+	item.UniqueCode = m.UniqueCode
+	//item.Children = make([]*ChartCollectClassifyItem, 0)
+	return
+}
+
+// ChartCollectClassifyListItem 图表收藏分类列表
+type ChartCollectClassifyListItem struct {
+	NodeType     int                             `description:"类型: 1-分类; 2-图表"`
+	ClassifyId   int                             `description:"分类ID"`
+	ClassifyName string                          `description:"分类名称"`
+	ChartInfoId  int                             `description:"图表ID"`
+	ChartCode    string                          `description:"图表编码"`
+	ChartName    string                          `description:"图表名称"`
+	ParentId     int                             `description:"父级ID"`
+	Level        int                             `description:"层级"`
+	Sort         int                             `description:"排序"`
+	UniqueCode   string                          `description:"唯一编码, 图表的话用indexCode"`
+	Children     []*ChartCollectClassifyListItem `description:"子分类"`
+}
+
+// ChartCollectClassifyAddReq 新增分类
+type ChartCollectClassifyAddReq struct {
+	ClassifyName string `description:"分类名称"`
+	ParentId     int    `description:"父级ID"`
+	Level        int    `description:"层级"`
+}
+
+// ChartCollectClassifyEditReq 编辑分类
+type ChartCollectClassifyEditReq struct {
+	ClassifyId   int    `description:"分类ID"`
+	ClassifyName string `description:"分类名称"`
+}
+
+// ChartCollectClassifyRemoveReq 删除分类
+type ChartCollectClassifyRemoveReq struct {
+	ClassifyId int `description:"分类ID"`
+}
+
+// RemoveClassifyAndCollect 移除分类及收藏
+func (m *ChartCollectClassify) 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(ChartCollect)
+	sql = fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, collectOb.TableName(), collectOb.Cols().ChartCollectClassifyId, utils.GetOrmInReplace(len(classifyIds)))
+	e = tx.Exec(sql, classifyIds).Error
+	if e != nil {
+		err = fmt.Errorf("remove collect err: %v", e)
+		return
+	}
+	return
+}
+
+// ChartCollectClassifyMoveReq 移动分类
+type ChartCollectClassifyMoveReq struct {
+	ClassifyId     int `description:"分类ID"`
+	PrevClassifyId int `description:"上一个兄弟节点分类ID"`
+	NextClassifyId int `description:"下一个兄弟节点分类ID"`
+}
+
+// GetChartCollectClassifyById 获取分类
+func GetChartCollectClassifyById(adminId, classifyId int) (item *ChartCollectClassify, err error) {
+	sql := `SELECT * FROM chart_collect_classify WHERE sys_user_id = ? AND chart_collect_classify_id = ? `
+	err = global.DmSQL["data"].Raw(sql, adminId, classifyId).First(&item).Error
+	return
+}
+
+// GetFirstChartCollectClassifyByAdminId 获取当前账号下,排序第一条的分类数据
+func GetFirstChartCollectClassifyByAdminId(adminId int) (item *ChartCollectClassify, err error) {
+	sql := `SELECT * FROM chart_collect_classify WHERE sys_user_id = ? ORDER BY sort ASC, chart_collect_classify_id ASC LIMIT 1`
+	err = global.DmSQL["data"].Raw(sql, adminId).First(&item).Error
+	return
+}
+
+// UpdateChartCollectClassifySortByClassifyId 更新排序
+func UpdateChartCollectClassifySortByClassifyId(adminId, classifyId, nowSort int, updateSort string) (err error) {
+	sql := fmt.Sprintf(`UPDATE chart_collect_classify SET sort = %d WHERE sys_user_id = ? and sort > ? `, updateSort)
+	if classifyId > 0 {
+		sql += ` OR ( chart_collect_classify_id > ` + fmt.Sprint(classifyId) + ` AND sort = ` + fmt.Sprint(nowSort) + `)`
+	}
+	err = global.DmSQL["data"].Exec(sql, adminId, nowSort).Error
+	return
+}

+ 90 - 0
routers/commentsRouter.go

@@ -2833,6 +2833,96 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectClassifyController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectClassifyController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/chart_collect/classify/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectClassifyController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectClassifyController"],
+        beego.ControllerComments{
+            Method: "Edit",
+            Router: `/chart_collect/classify/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectClassifyController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectClassifyController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/chart_collect/classify/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectClassifyController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectClassifyController"],
+        beego.ControllerComments{
+            Method: "Move",
+            Router: `/chart_collect/classify/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectClassifyController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectClassifyController"],
+        beego.ControllerComments{
+            Method: "Remove",
+            Router: `/chart_collect/classify/remove`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectClassifyController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectClassifyController"],
+        beego.ControllerComments{
+            Method: "Tree",
+            Router: `/chart_collect/classify/tree`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectController"],
+        beego.ControllerComments{
+            Method: "CancelCollect",
+            Router: `/chart_collect/cancel_collect`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectController"],
+        beego.ControllerComments{
+            Method: "Collect",
+            Router: `/chart_collect/collect`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/chart_collect/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartCollectController"],
+        beego.ControllerComments{
+            Method: "Move",
+            Router: `/chart_collect/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartFrameworkController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:ChartFrameworkController"],
         beego.ControllerComments{
             Method: "Add",

+ 2 - 0
routers/router.go

@@ -167,6 +167,8 @@ func init() {
 				&data_manage.ChartInfoShareController{},
 				&data_manage.ChartPublicController{},
 				&data_manage.ChartPublicClassifyController{},
+				&data_manage.ChartCollectController{},
+				&data_manage.ChartCollectClassifyController{},
 			),
 			web.NSNamespace("/data_approve",
 				web.NSInclude(

+ 58 - 0
services/data/collect_chart.go

@@ -0,0 +1,58 @@
+package data
+
+import (
+	"eta_gn/eta_api/models/data_manage"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"strconv"
+	"strings"
+)
+
+// GetChartCollectClassifyTreeRecursive 递归获取分类树形结构
+func GetChartCollectClassifyTreeRecursive(list []*data_manage.ChartCollectClassifyItem, parentId int) []*data_manage.ChartCollectClassifyItem {
+	res := make([]*data_manage.ChartCollectClassifyItem, 0)
+	for _, v := range list {
+		if v.ParentId == parentId {
+			t := GetChartCollectClassifyTreeRecursive(list, v.ClassifyId)
+			if len(t) > 0 {
+				v.Children = t
+			}
+			res = append(res, v)
+		}
+	}
+	return res
+}
+
+// GetChartCollectClassifyChildIds 获取分类的子分类IDs
+func GetChartCollectClassifyChildIds(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.ChartCollectClassify)
+	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.ChartCollectClassifyId] {
+			continue
+		}
+		pathArr := strings.Split(v.LevelPath, ",")
+		if len(pathArr) > 0 && utils.InArrayByStr(pathArr, strClassifyId) {
+			classifyIds = append(classifyIds, v.ChartCollectClassifyId)
+			exists[v.ChartCollectClassifyId] = true
+		}
+	}
+	return
+}