Browse Source

eta 2.1.6

zwxi 6 months ago
parent
commit
23870f546e

+ 103 - 2
controllers/data_manage/chart_classify.go

@@ -260,6 +260,7 @@ func (this *ChartClassifyController) ChartClassifyItems() {
 		this.ServeJSON()
 	}()
 
+	level, _ := this.GetInt(`Level`)
 	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_DEFAULT)
 	if err != nil {
 		br.Msg = "获取失败"
@@ -285,7 +286,7 @@ func (this *ChartClassifyController) ChartClassifyItems() {
 	nodeAll := make([]*data_manage.ChartClassifyItems, 0)
 	for k := range rootList {
 		rootNode := rootList[k]
-		data.ChartClassifyItemsMakeTree(this.SysUser, classifyAll, rootNode, permissionClassifyIdList)
+		data.ChartClassifyItemsMakeTree(this.SysUser, classifyAll, rootNode, permissionClassifyIdList, level)
 		nodeAll = append(nodeAll, rootNode)
 	}
 
@@ -395,7 +396,7 @@ func (this *ChartClassifyController) EditChartClassify() {
 	}
 
 	// 编辑图表分类
-	_, err, errMsg, isSendEmail := data.EditChartClassify(req.ChartClassifyId, utils.CHART_SOURCE_DEFAULT, req.ChartClassifyName, this.Lang, this.SysUser)
+	_, err, errMsg, isSendEmail := data.EditChartClassifyV2(req.ChartClassifyId, req.ParentId, utils.CHART_SOURCE_DEFAULT, req.ChartClassifyName, this.Lang)
 	if err != nil {
 		br.Msg = errMsg
 		br.ErrMsg = "保存分类失败,Err:" + err.Error()
@@ -1034,3 +1035,103 @@ func (this *ChartClassifyController) ChartClassifyChartListV2() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// ChartClassifyChartListV3
+// @Title 根据图表分类获取图表列表-包含分类和图表
+// @Description 根据图表分类获取图表列表接口-包含分类和图表
+// @Param   IsShowMe   query   bool  true       "是否只看我的,true、false"
+// @Param   ChartClassifyId   query   bool  true       "图片分类id"
+// @Success 200 {object} data_manage.ChartClassifyListResp
+// @router /chart_classify/chart/listV2 [get]
+func (this *ChartClassifyController) ChartClassifyChartListV3() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		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(data_manage.ChartClassifyListResp)
+
+	chartClassifyId, _ := this.GetInt("ChartClassifyId")
+	if chartClassifyId < 0 {
+		br.Msg = "参数错误"
+		return
+	}
+
+	// 获取当前账号的不可见指标
+	noPermissionChartIdMap := make(map[int]bool)
+	{
+		obj := data_manage.EdbInfoNoPermissionAdmin{}
+		confList, err := obj.GetAllChartListByAdminId(this.SysUser.AdminId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range confList {
+			noPermissionChartIdMap[v.ChartInfoId] = true
+		}
+	}
+
+	isShowMe, _ := this.GetBool("IsShowMe")
+	if isShowMe {
+		allChartInfo, err := data_manage.GetChartClassifyAndInfoByParentIdForMe(chartClassifyId, sysUser.AdminId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取数据失败,Err:" + err.Error()
+			return
+		}
+		// 移除没有权限的图表
+		allNodes := data.HandleNoPermissionChart(allChartInfo, noPermissionChartIdMap, this.SysUser.AdminId)
+		resp.AllNodes = allNodes
+
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+		fmt.Println("source my classify")
+		return
+	}
+
+	allChartInfo, err := data_manage.GetChartClassifyAndInfoByParentId(chartClassifyId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+
+	//allChartInfo, err := data_manage.GetChartInfoAllByClassifyId(utils.CHART_SOURCE_DEFAULT, chartClassifyId)
+	//if err != nil && err.Error() != utils.ErrNoRow() {
+	//	br.Msg = "获取失败"
+	//	br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+	//	return
+	//}
+	// 移除没有权限的图表
+	allNodes := data.HandleNoPermissionChart(allChartInfo, noPermissionChartIdMap, this.SysUser.AdminId)
+
+	for k, item := range allNodes {
+		item.Button = data.GetChartOpButton(this.SysUser, item.SysUserId, item.HaveOperaAuth)
+		if item.ChartInfoId > 0 {
+			item.Button.AddButton = false
+			item.Button.OpButton = false
+			item.Button.DeleteButton = false
+			item.Button.MoveButton = true
+		}
+		allNodes[k] = item
+	}
+
+	resp.AllNodes = allNodes
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 492 - 2
controllers/data_manage/chart_info.go

@@ -18,6 +18,7 @@ import (
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"os"
 	"os/exec"
+	"sort"
 	"strconv"
 	"strings"
 	"time"
@@ -959,7 +960,6 @@ func (this *ChartInfoController) ChartInfoDetail() {
 	var err error
 	chartInfo := new(data_manage.ChartInfoView)
 	chartInfo.HaveOperaAuth = true
-
 	if chartInfoId > 0 {
 		chartInfo, err = data_manage.GetChartInfoViewById(chartInfoId)
 		if err != nil {
@@ -1184,6 +1184,26 @@ func (this *ChartInfoController) ChartInfoDetail() {
 		IsSetName: chartInfo.IsSetName,
 	}
 
+	// 图表当前分类的分类树
+	classifyLevels := make([]string, 0)
+	{
+		list, e := data_manage.GetChartClassifyAllBySource(utils.CHART_SOURCE_DEFAULT)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = fmt.Sprintf("获取图表分类失败, Err: %v", e)
+			return
+		}
+		parents := data.GetChartClassifyParentRecursive(list, chartInfo.ChartClassifyId)
+		sort.Slice(parents, func(i, j int) bool {
+			return parents[i].Level < parents[i].Level
+		})
+		for _, v := range parents {
+			classifyLevels = append(classifyLevels, v.UniqueCode)
+		}
+	}
+
+	resp.ClassifyLevels = classifyLevels
+
 	resp.ChartInfo = chartInfo
 	resp.BarChartInfo = barConfig
 	br.Ret = 200
@@ -1508,7 +1528,6 @@ func (this *ChartInfoController) ChartInfoDetailV2() {
 	}
 
 	resp := new(data_manage.ChartInfoDetailResp)
-
 	// 图表数据权限
 	{
 		// 图表分类
@@ -1722,6 +1741,26 @@ func (this *ChartInfoController) ChartInfoDetailV2() {
 		resp.EdbInfoList = mappingList
 	}
 
+	// 图表当前分类的分类树
+	classifyLevels := make([]string, 0)
+	{
+		list, e := data_manage.GetChartClassifyAllBySource(utils.CHART_SOURCE_DEFAULT)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = fmt.Sprintf("获取图表分类失败, Err: %v", e)
+			return
+		}
+		parents := data.GetChartClassifyParentRecursive(list, chartInfo.ChartClassifyId)
+		sort.Slice(parents, func(i, j int) bool {
+			return parents[i].Level < parents[i].Level
+		})
+		for _, v := range parents {
+			classifyLevels = append(classifyLevels, v.UniqueCode)
+		}
+	}
+
+	resp.ClassifyLevels = classifyLevels
+	
 	//图表操作权限
 	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, chartInfo.HaveOperaAuth)
 	chartInfo.Button = data_manage.ChartViewButton{
@@ -4522,3 +4561,454 @@ func (this *ChartInfoController) ChartInfoImgSetBySvg() {
 	br.Data = resp
 	return
 }
+
+// @Title ETA图表列表接口
+// @Description ETA图表列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   ChartClassifyId   query   int  true       "分类id"
+// @Param   KeyWord   query   string  true       "搜索关键词"
+// @Param   IsShowMe   query   bool  true       "是否只看我的,true、false"
+// @Success 200 {object} data_manage.ChartListResp
+// @router /chart/list [get]
+func (this *ChartInfoController) ChartList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	subClassify, _ := this.GetBool("SubClassify")
+
+	chartClassifyIdsStr := this.GetString("ChartClassifyIds")
+	chartClassifyIds := strings.Split(chartClassifyIdsStr, ",")
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	keyWord := this.GetString("KeyWord")
+	sysUserIds := this.GetString("SysUserIds")
+	chartTypeIds := this.GetString("ChartTypeIds")
+
+	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 condition string
+	var pars []interface{}
+
+	// 普通图表
+	condition += ` AND source = ? `
+	pars = append(pars, utils.CHART_SOURCE_DEFAULT)
+
+	if len(chartClassifyIdsStr) > 0 {
+		if !subClassify {
+			chartClassifyId, err := data_manage.GetChartClassifyByIdsNoSubClassify(chartClassifyIds)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取图表信息失败"
+				br.ErrMsg = "获取信息失败,GetChartClassify,Err:" + err.Error()
+				return
+			}
+			condition += " AND chart_classify_id IN(" + chartClassifyId + ") "
+			//pars = append(pars, chartClassifyId)
+		} else {
+			//chartClassifyId, err := data_manage.GetChartClassifyByIds(chartClassifyIds)
+			//if err != nil && err.Error() != utils.ErrNoRow() {
+			//	br.Msg = "获取图表信息失败"
+			//	br.ErrMsg = "获取信息失败,GetChartClassify,Err:" + err.Error()
+			//	return
+			//}
+			//condition += " AND chart_classify_id IN(" + chartClassifyId + ") "
+			//pars = append(pars, chartClassifyId)
+
+			list, e := data_manage.GetChartClassifyAllBySource(utils.CHART_SOURCE_DEFAULT)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = fmt.Sprintf("获取图表分类失败, Err: %v", e)
+				return
+			}
+			finalClassifyIds := make([]int, 0)
+			parents := data.GetChartClassifyChildrenRecursiveByParentIds(list, chartClassifyIds)
+			sort.Slice(parents, func(i, j int) bool {
+				return parents[i].Level < parents[i].Level
+			})
+			for _, v := range parents {
+				finalClassifyIds = append(finalClassifyIds, v.ChartClassifyId)
+			}
+
+			condition += " AND chart_classify_id IN(" + utils.GetOrmInReplace(len(finalClassifyIds)) + ") "
+			pars = append(pars, finalClassifyIds)
+		}
+	}
+	if keyWord != "" {
+		condition += ` AND  ( chart_name LIKE '%` + keyWord + `%' OR chart_name_en LIKE '%` + keyWord + `%' )`
+	}
+	if sysUserIds != "" {
+		adminIds := strings.Split(sysUserIds, ",")
+		if len(adminIds) == 0 {
+			br.Msg = "请选择正确的创建人"
+			return
+		}
+		adminIdsSlice := make([]int, 0)
+		for _, adminId := range adminIds {
+			adminIdInt, e := strconv.Atoi(adminId)
+			if e != nil {
+				br.Msg = "请选择正确的创建人"
+				return
+			}
+			adminIdsSlice = append(adminIdsSlice, adminIdInt)
+		}
+		condition += "  AND sys_user_id in (" + utils.GetOrmInReplace(len(adminIds)) + ") "
+		pars = append(pars, adminIdsSlice)
+	}
+	if chartTypeIds != "" {
+		chartTypeIdList := strings.Split(chartTypeIds, ",")
+		condition += "  AND chart_type in (" + utils.GetOrmInReplace(len(chartTypeIdList)) + ") "
+		pars = append(pars, chartTypeIdList)
+	}
+
+	//只看我的
+	//isShowMe, _ := this.GetBool("IsShowMe")
+	//if isShowMe {
+	//	condition += ` AND sys_user_id = ? `
+	//	pars = append(pars, sysUser.AdminId)
+	//}
+
+	// 获取当前账号的不可见指标
+	noPermissionChartIdList := make([]int, 0)
+	{
+		obj := data_manage.EdbInfoNoPermissionAdmin{}
+		confList, err := obj.GetAllChartListByAdminId(this.SysUser.AdminId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range confList {
+			noPermissionChartIdList = append(noPermissionChartIdList, v.ChartInfoId)
+		}
+	}
+
+	lenNoPermissionChartIdList := len(noPermissionChartIdList)
+	if lenNoPermissionChartIdList > 0 {
+		condition += ` AND chart_info_id not in (` + utils.GetOrmInReplace(lenNoPermissionChartIdList) + `) `
+		pars = append(pars, noPermissionChartIdList)
+	}
+
+	//获取图表信息
+	list, err := data_manage.GetChartListByCondition(condition, pars, startSize, pageSize)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Success = true
+		br.Msg = "获取图表信息失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+
+	myChartList, err := data_manage.GetMyChartListByAdminId(sysUser.AdminId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取图表信息失败"
+		br.ErrMsg = "获取我的图表信息失败,Err:" + err.Error()
+		return
+	}
+	myChartMap := make(map[int]*data_manage.MyChartView)
+	for _, v := range myChartList {
+		myChartMap[v.ChartInfoId] = v
+	}
+	listLen := len(list)
+	chartEdbMap := make(map[int][]*data_manage.ChartEdbInfoMapping)
+	if listLen > 0 {
+		// 分类id
+		classifyIdList := make([]int, 0)
+		// 当前列表中的分类map
+		classifyMap := make(map[int]*data_manage.ChartClassify)
+		for _, v := range list {
+			classifyIdList = append(classifyIdList, v.ChartClassifyId)
+		}
+		classifyList, err := data_manage.GetChartClassifyByIdList(classifyIdList)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range classifyList {
+			classifyMap[v.ChartClassifyId] = v
+		}
+
+		// 已授权分类id
+		permissionChartIdList, permissionClassifyIdList, err := data_manage_permission.GetUserChartAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+			return
+		}
+
+		// 权限
+		for k, chartViewInfo := range list {
+			if currClassify, ok := classifyMap[chartViewInfo.ChartClassifyId]; ok {
+				list[k].HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(chartViewInfo.IsJoinPermission, currClassify.IsJoinPermission, chartViewInfo.ChartInfoId, chartViewInfo.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
+			}
+		}
+
+		chartInfoIds := ""
+		for _, v := range list {
+			chartInfoIds += strconv.Itoa(v.ChartInfoId) + ","
+		}
+		if chartInfoIds != "" {
+			chartInfoIds = strings.Trim(chartInfoIds, ",")
+			//判断是否需要展示英文标识
+			edbList, e := data_manage.GetChartEdbMappingListByChartInfoIds(chartInfoIds)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取图表,指标信息失败,Err:" + e.Error()
+				return
+			}
+			for _, v := range edbList {
+				chartEdbMap[v.ChartInfoId] = append(chartEdbMap[v.ChartInfoId], v)
+			}
+		}
+	}
+
+	listTmp, err := data_manage.GetChartTypeList()
+	if err != nil {
+		br.Msg = "获取图表类型失败"
+		br.ErrMsg = "获取图表类型失败,Err:" + err.Error()
+		return
+	}
+	//遍历list,将id和name组成map
+	chartTypeMap := make(map[int]data_manage.ChartType)
+	for _, v := range listTmp {
+		chartTypeMap[v.ChartTypeId] = v
+	}
+
+	for i := 0; i < listLen; i++ {
+		//判断是否需要展示英文标识
+		if edbTmpList, ok := chartEdbMap[list[i].ChartInfoId]; ok {
+			list[i].IsEnChart = data.CheckIsEnChart(list[i].ChartNameEn, edbTmpList, list[i].Source, list[i].ChartType)
+		}
+
+		if existItem, ok := myChartMap[list[i].ChartInfoId]; ok {
+			list[i].IsAdd = true
+			list[i].MyChartId = existItem.MyChartId
+			list[i].MyChartClassifyId = existItem.MyChartClassifyId
+		}
+		list[i].ChartTypeName = chartTypeMap[list[i].ChartType].ChartTypeName
+		list[i].ChartTypeNameEn = chartTypeMap[list[i].ChartType].ChartTypeNameEn
+	}
+
+	resp := new(data_manage.ChartListResp)
+	if list == nil || len(list) <= 0 || (err != nil && err.Error() == utils.ErrNoRow()) {
+		items := make([]*data_manage.ChartInfoView, 0)
+		resp.Paging = page
+		resp.List = items
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
+
+	dataCount, err := data_manage.GetChartListCountByCondition(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取指标信息失败"
+		br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
+		return
+	}
+	page = paging.GetPaging(currentIndex, pageSize, dataCount)
+	resp.Paging = page
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// ModifyChartList
+// @Title 批量修改图表
+// @Description 批量修改图表
+// @Param   SysUserIds   query   string  true       "根据创建人查询"
+// @Param   ChartClassifyIds   query   string  true       "图片分类id"
+// @Success 200 {object} models.ChartClassifyListResp
+// @router /modify/chartList [post]
+func (this *ChartInfoController) ModifyChartList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req data_manage.ModifyChartListReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if !req.SelectAll && req.ChartInfoIds == "" {
+		br.Msg = "请选择图表"
+		return
+	}
+	if req.ChartClassifyId < 0 {
+		br.Msg = "请选择新分类"
+		return
+	}
+
+	var chartIds []int
+
+	if req.SelectAll {
+		//根据查询条件筛选
+		chartClassifyIds := strings.Split(req.ChartClassifyIds, ",")
+		sysUserIds := req.SysUserIds
+		keyword := req.KeyWord
+		chartTypeIdsStr := req.ChartTypeIds
+
+		condition := " AND source = ? "
+		pars := make([]interface{}, 0)
+		pars = append(pars, utils.CHART_SOURCE_DEFAULT)
+
+		if len(chartClassifyIds) > 0 {
+			if !req.SubClassify {
+				chartClassifyId, err := data_manage.GetChartClassifyByIdsNoSubClassify(chartClassifyIds)
+				if err != nil && err.Error() != utils.ErrNoRow() {
+					br.Msg = "获取图表信息失败"
+					br.ErrMsg = "获取信息失败,GetChartClassify,Err:" + err.Error()
+					return
+				}
+				condition += " AND chart_classify_id IN(" + chartClassifyId + ") "
+				//pars = append(pars, chartClassifyId)
+			} else {
+				//chartClassifyId, err := data_manage.GetChartClassifyByIds(chartClassifyIds)
+				//if err != nil && err.Error() != utils.ErrNoRow() {
+				//	br.Msg = "获取图表信息失败"
+				//	br.ErrMsg = "获取信息失败,GetChartClassify,Err:" + err.Error()
+				//	return
+				//}
+				//condition += " AND chart_classify_id IN(" + chartClassifyId + ") "
+				//pars = append(pars, chartClassifyId)
+
+				list, e := data_manage.GetChartClassifyAllBySource(utils.CHART_SOURCE_DEFAULT)
+				if e != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = fmt.Sprintf("获取图表分类失败, Err: %v", e)
+					return
+				}
+				finalClassifyIds := make([]int, 0)
+				parents := data.GetChartClassifyChildrenRecursiveByParentIds(list, chartClassifyIds)
+				sort.Slice(parents, func(i, j int) bool {
+					return parents[i].Level < parents[i].Level
+				})
+				for _, v := range parents {
+					finalClassifyIds = append(finalClassifyIds, v.ChartClassifyId)
+				}
+
+				condition += " AND chart_classify_id IN(" + utils.GetOrmInReplace(len(finalClassifyIds)) + ") "
+				pars = append(pars, finalClassifyIds)
+			}
+		}
+
+		if sysUserIds != "" {
+			adminIds := strings.Split(sysUserIds, ",")
+			if len(adminIds) == 0 {
+				br.Msg = "请选择正确的创建人"
+				return
+			}
+			adminIdsSlice := make([]int, 0)
+			for _, adminId := range adminIds {
+				adminIdInt, e := strconv.Atoi(adminId)
+				if e != nil {
+					br.Msg = "请选择正确的创建人"
+					return
+				}
+				adminIdsSlice = append(adminIdsSlice, adminIdInt)
+			}
+			condition += "  AND sys_user_id in (" + utils.GetOrmInReplace(len(adminIds)) + ") "
+			pars = append(pars, adminIdsSlice)
+		}
+
+		if keyword != "" {
+			condition = " AND chart_name LIKE ? "
+			pars = append(pars, utils.GetLikeKeyword(keyword))
+		}
+
+		if chartTypeIdsStr != "" {
+			chartTypeIds := strings.Split(chartTypeIdsStr, ",")
+			if len(chartTypeIds) == 0 {
+				br.Msg = "请选择正确的图表类型"
+				return
+			}
+			condition += " AND chart_type IN(" + utils.GetOrmInReplace(len(chartTypeIds)) + ") "
+			pars = append(pars, chartTypeIds)
+		}
+
+		allChartInfo, err := data_manage.GetChartInfoItemsByCondition(condition, pars)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+			return
+		}
+		// 判断是否超过100 个
+		if len(allChartInfo) > 100 {
+			br.Msg = "最多只能选择100个图表"
+			return
+		}
+		for _, v := range allChartInfo {
+			chartIds = append(chartIds, v.ChartInfoId)
+		}
+	} else {
+		chartIdStr := strings.Split(req.ChartInfoIds, ",")
+		if len(chartIdStr) == 0 {
+			br.Msg = "请选择正确的图表"
+			return
+		}
+		for _, id := range chartIdStr {
+			tmp, e := strconv.Atoi(id)
+			if e != nil {
+				br.Msg = "请选择正确的分类"
+				return
+			}
+			chartIds = append(chartIds, tmp)
+		}
+		// 判断是否超过100 个
+		if len(chartIds) > 100 {
+			br.Msg = "最多只能选择100个图表"
+			return
+		}
+	}
+
+	if len(chartIds) == 0 {
+		br.Msg = "请选择正确的图表"
+		return
+	}
+
+	err = data_manage.UpdateChartClassifyIdByChartInfoId(chartIds, req.ChartClassifyId)
+	if err != nil {
+		br.Msg = "更新失败"
+		br.ErrMsg = "更新图表分类失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 23 - 6
controllers/data_manage/my_chart.go

@@ -11,6 +11,7 @@ import (
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"sort"
 	"strconv"
 	"strings"
 	"time"
@@ -69,15 +70,31 @@ func (this *MyChartController) ChartList() {
 	condition += ` AND source = ? `
 	pars = append(pars, utils.CHART_SOURCE_DEFAULT)
 
+	chartClassifyIds := make([]int, 0)
 	if chartClassifyId > 0 {
-		chartClassifyId, err := data_manage.GetChartClassify(chartClassifyId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
-			br.Msg = "获取图表信息失败"
-			br.ErrMsg = "获取信息失败,GetChartClassify,Err:" + err.Error()
+
+		list, e := data_manage.GetChartClassifyAllBySource(utils.CHART_SOURCE_DEFAULT)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = fmt.Sprintf("获取图表分类失败, Err: %v", e)
 			return
 		}
-		condition += " AND chart_classify_id IN(" + chartClassifyId + ") "
-		//pars = append(pars, chartClassifyId)
+		parents := data.GetChartClassifyChildrenRecursive(list, chartClassifyId)
+		sort.Slice(parents, func(i, j int) bool {
+			return parents[i].Level < parents[i].Level
+		})
+		for _, v := range parents {
+			chartClassifyIds = append(chartClassifyIds, v.ChartClassifyId)
+		}
+
+		//chartClassifyId, err := data_manage.GetChartClassify(chartClassifyId)
+		//if err != nil && err.Error() != utils.ErrNoRow() {
+		//	br.Msg = "获取图表信息失败"
+		//	br.ErrMsg = "获取信息失败,GetChartClassify,Err:" + err.Error()
+		//	return
+		//}
+		condition += " AND chart_classify_id IN(" + utils.GetOrmInReplace(len(chartClassifyIds)) + ") "
+		pars = append(pars, chartClassifyIds)
 	}
 	if keyWord != "" {
 		condition += ` AND  ( chart_name LIKE '%` + keyWord + `%' OR chart_name_en LIKE '%` + keyWord + `%' )`

+ 106 - 0
models/data_manage/chart_classify.go

@@ -77,6 +77,7 @@ func GetChartClassifyEnCount(chartClassifyNameEn string, parentId, source int) (
 type EditChartClassifyReq struct {
 	ChartClassifyName string `description:"分类名称"`
 	ChartClassifyId   int    `description:"分类id"`
+	ParentId          int    `description:"父级分类id"`
 }
 
 func GetChartClassifyById(classifyId int) (item *ChartClassify, err error) {
@@ -206,6 +207,7 @@ type ChartClassifyItems struct {
 	Button              ChartClassifyItemsButton `description:"按钮权限"`
 	IsJoinPermission    int                      `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
 	HaveOperaAuth       bool                     `description:"是否有数据权限,默认:false"`
+	Disable             bool                     `description:"勾选是否禁用"`
 }
 
 // ChartClassifyItemsButton 操作按钮
@@ -463,3 +465,107 @@ func GetChartClassifyAllBySource(source int) (items []*ChartClassifyItems, err e
 	_, err = o.Raw(sql, source).QueryRows(&items)
 	return
 }
+
+// GetChartClassifyAndInfoByParentId
+func GetChartClassifyAndInfoByParentId(parentId int) (items []*ChartClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT
+	0 AS chart_info_id,
+	chart_classify_id,
+	chart_classify_name,
+	chart_classify_name_en,
+	parent_id,
+	create_time,
+	modify_time,
+	sys_user_id,
+	sys_user_real_name,
+	sort,
+	level,
+	unique_code
+FROM
+	chart_classify 
+WHERE
+	parent_id = ? and source = 1 UNION ALL
+SELECT
+	chart_info_id,
+	chart_classify_id,
+	chart_name AS chart_classify_name,
+	chart_name_en AS chart_classify_name_en,
+	0 AS parent_id,
+	create_time,
+	modify_time,
+	sys_user_id,
+	sys_user_real_name,
+	sort,
+	0 AS level,
+	unique_code
+FROM
+	chart_info 
+WHERE
+	chart_classify_id = ? AND source = 1
+ORDER BY
+	sort ASC,
+	chart_classify_id ASC`
+	_, err = o.Raw(sql, parentId, parentId).QueryRows(&items)
+	return
+}
+
+// GetChartClassifyAndInfoByParentId
+func GetChartClassifyAndInfoByParentIdForMe(parentId, adminId int) (items []*ChartClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT
+	0 AS chart_info_id,
+	chart_classify_id,
+	chart_classify_name,
+	chart_classify_name_en,
+	parent_id,
+	create_time,
+	modify_time,
+	sys_user_id,
+	sys_user_real_name,
+	sort,
+	level,
+	unique_code
+FROM
+	chart_classify 
+WHERE
+	parent_id = ? and source = 1 UNION ALL
+SELECT
+	chart_info_id,
+	chart_classify_id,
+	chart_name AS chart_classify_name,
+	chart_name_en AS chart_classify_name_en,
+	0 AS parent_id,
+	create_time,
+	modify_time,
+	sys_user_id,
+	sys_user_real_name,
+	sort,
+	0 AS level,
+	unique_code
+FROM
+	chart_info 
+WHERE
+	chart_classify_id = ? AND chart_type = 1 AND sys_user_id = ?
+ORDER BY
+	sort ASC,
+	chart_classify_id ASC`
+	_, err = o.Raw(sql, parentId, parentId, adminId).QueryRows(&items)
+	return
+}
+
+func GetChartClassifiesById(chartClassifyId int) (items []*ChartClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `
+    SELECT *
+    FROM chart_classify
+    WHERE chart_classify_id = ? 
+    OR parent_id = ?
+    OR parent_id IN (
+        SELECT chart_classify_id
+        FROM chart_classify
+        WHERE parent_id = ?
+    );`
+	_,err = o.Raw(sql, chartClassifyId, chartClassifyId, chartClassifyId).QueryRows(&items)
+	return
+}

+ 32 - 0
models/data_manage/chart_info.go

@@ -1970,6 +1970,8 @@ type ChartInfoView struct {
 	ForumChartInfoId  int             `description:"社区的图表ID"`
 	ChartAlias        string          `description:"图表别名"`
 	DateTypeNum       int             `description:"date_type=25(N月前)时的N值,其他类型N值可复用此字段"`
+	ChartTypeName     string          `description:"图表类型名称"`
+	ChartTypeNameEn   string          `description:"英文图表类型名称"`
 }
 
 type ChartViewButton struct {
@@ -2880,3 +2882,33 @@ func getThsHfEdbDataListMinAndMaxByMongo(source, subSource, edbInfoId int, start
 	maxData = result.MaxValue
 	return
 }
+
+// ModifyChartListReq 批量编辑图表请求参数
+type ModifyChartListReq struct {
+	SelectAll        bool
+	SubClassify      bool `description:"是否关联图表子分类"`
+	ChartClassifyIds string
+	SysUserIds       string
+	KeyWord          string
+	ChartInfoIds     string `description:"图表ID"`
+	ChartClassifyId  int    `description:"新图表分类"`
+	ChartTypeIds     string
+}
+
+func GetChartInfoItemsByCondition(condition string, pars []interface{}) (item []*ChartInfo, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM chart_info WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+// UpdateChartClassifyIdByChartInfoId 根据图表分类ID
+func UpdateChartClassifyIdByChartInfoId(chartInfoIds []int, classifyId int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` update chart_info set chart_classify_id = ? WHERE chart_info_id in (` + utils.GetOrmInReplace(len(chartInfoIds)) + `) `
+	_, err = o.Raw(sql, classifyId, chartInfoIds).Exec()
+	return
+}

+ 30 - 0
models/data_manage/my_chart.go

@@ -971,3 +971,33 @@ func GetMyChartClassifyIdAndNum(cond string, pars []interface{}) (items []*MyCha
 	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
+
+func GetChartClassifyByIds(chartClassifyIds []string) (chart_classify_ids string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT GROUP_CONCAT(DISTINCT t.chart_classify_id) AS chart_classify_ids
+FROM (
+    SELECT chart_classify_id
+    FROM chart_classify
+    WHERE chart_classify_id IN (` + utils.GetOrmInReplace(len(chartClassifyIds)) + `)
+    OR parent_id IN (` + utils.GetOrmInReplace(len(chartClassifyIds)) + `)
+    OR parent_id IN (
+        SELECT chart_classify_id
+        FROM chart_classify
+        WHERE parent_id IN (` + utils.GetOrmInReplace(len(chartClassifyIds)) + `)
+    )
+) AS t;`
+	err = o.Raw(sql, chartClassifyIds, chartClassifyIds, chartClassifyIds).QueryRow(&chart_classify_ids)
+	return
+}
+
+func GetChartClassifyByIdsNoSubClassify(chartClassifyIds []string) (chart_classify_ids string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT GROUP_CONCAT(DISTINCT t.chart_classify_id) AS chart_classify_ids
+FROM (
+    SELECT chart_classify_id
+    FROM chart_classify
+    WHERE chart_classify_id IN (` + utils.GetOrmInReplace(len(chartClassifyIds)) + `)
+) AS t;`
+	err = o.Raw(sql, chartClassifyIds).QueryRow(&chart_classify_ids)
+	return
+}

+ 27 - 0
routers/commentsRouter.go

@@ -2815,6 +2815,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartClassifyController"],
+        beego.ControllerComments{
+            Method: "ChartClassifyChartListV3",
+            Router: `/chart_classify/chart/listV2`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartClassifyController"],
         beego.ControllerComments{
             Method: "DeleteChartClassify",
@@ -2977,6 +2986,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"],
+        beego.ControllerComments{
+            Method: "ChartList",
+            Router: `/chart/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"],
         beego.ControllerComments{
             Method: "ChartInfoAdd",
@@ -3436,6 +3454,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"],
+        beego.ControllerComments{
+            Method: "ModifyChartList",
+            Router: `/modify/chartList`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"],
         beego.ControllerComments{
             Method: "MultipleGraphConfigSaveChart",

+ 175 - 9
services/data/chart_classify.go

@@ -23,18 +23,25 @@ func chartClassifyHaveChild(allNode []*data_manage.ChartClassifyItems, node *dat
 	return
 }
 
-func ChartClassifyItemsMakeTree(sysUser *system.Admin, allNode []*data_manage.ChartClassifyItems, node *data_manage.ChartClassifyItems, permissionClassifyIdList []int) {
+func ChartClassifyItemsMakeTree(sysUser *system.Admin, allNode []*data_manage.ChartClassifyItems, node *data_manage.ChartClassifyItems, permissionClassifyIdList []int, level int) {
 	node.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(node.IsJoinPermission, node.ChartClassifyId, permissionClassifyIdList)
 	button := GetChartClassifyOpButton(sysUser, node.SysUserId, node.HaveOperaAuth)
 	node.Button = button
-
+	node.Disable = true
+	if node.Level == level {
+		node.Disable = false
+	}
 	childs, _ := chartClassifyHaveChild(allNode, node) //判断节点是否有子节点并返回
 	if len(childs) > 0 {
 		for _, child := range childs {
 			child.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(child.IsJoinPermission, child.ChartClassifyId, permissionClassifyIdList)
 			childButton := GetChartClassifyOpButton(sysUser, child.SysUserId, child.HaveOperaAuth)
-			if child.Level == 3 {
-				childButton.AddButton = false //第三级的话,默认图表都是没有添加按钮的
+			if child.Level == 6 {
+				childButton.AddButton = false //第六级的话,默认图表都是没有添加按钮的
+			}
+			child.Disable = true
+			if child.Level == level {
+				child.Disable = false
 			}
 			child.Button = childButton
 			//node.Children = append(node.Children, child)
@@ -45,15 +52,23 @@ func ChartClassifyItemsMakeTree(sysUser *system.Admin, allNode []*data_manage.Ch
 			//查询子节点的子节点,并添加到子节点
 			_, has := chartClassifyHaveChild(allNode, v)
 			if has {
-				ChartClassifyItemsMakeTree(sysUser, allNode, v, permissionClassifyIdList) //递归添加节点
+				ChartClassifyItemsMakeTree(sysUser, allNode, v, permissionClassifyIdList, level) //递归添加节点
 			} else {
-				childrenArr := make([]*data_manage.ChartClassifyItems, 0)
-				v.Children = childrenArr
+				if level > 0 {
+					v.Children = nil
+				} else {
+					childrenArr := make([]*data_manage.ChartClassifyItems, 0)
+					v.Children = childrenArr
+				}
 			}
 		}
 	} else {
-		childrenArr := make([]*data_manage.ChartClassifyItems, 0)
-		node.Children = childrenArr
+		if level > 0 {
+			node.Children = nil
+		} else {
+			childrenArr := make([]*data_manage.ChartClassifyItems, 0)
+			node.Children = childrenArr
+		}
 	}
 }
 
@@ -962,3 +977,154 @@ func GetChartClassifyParentRecursive(list []*data_manage.ChartClassifyItems, cla
 	}
 	return res
 }
+
+// 修改图表分类,可以修改父级
+func EditChartClassifyV2(chartClassifyId, praentId, source int, chartClassifyName, lang string) (classifyInfo *data_manage.ChartClassify, err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+	errMsg = "保存失败"
+
+	// 获取分类信息
+	classifyInfo, err = data_manage.GetChartClassifyById(chartClassifyId)
+	if err != nil {
+		return
+	}
+
+	if praentId != classifyInfo.ParentId {
+		parentClassifyInfo, e := data_manage.GetChartClassifyById(praentId)
+		if e != nil {
+			err = e
+			return
+		}
+		if classifyInfo.Level != parentClassifyInfo.Level - 1 {
+			err = errors.New("父级分类层级异常")
+		}
+	}
+
+	// 分类来源校验
+	if classifyInfo.Source != source {
+		errMsg = "图表分类异常"
+		err = errors.New(fmt.Sprintf("图表分类来源异常,修改来源:%d,分类来源:%d", source, classifyInfo.Source))
+		isSendEmail = false
+		return
+	}
+
+
+	// 需要变更的字段
+	updateCols := make([]string, 0)
+
+	if praentId != classifyInfo.ParentId {
+		classifyInfo.ParentId = praentId
+		classifyInfo.ModifyTime = time.Now()
+		updateCols = append(updateCols, "ParentId")
+	}
+
+	// 语言版本校验
+	switch lang {
+	case utils.EnLangVersion:
+		if classifyInfo.ChartClassifyNameEn != chartClassifyName {
+			count, tmpErr := data_manage.GetChartClassifyEnCount(chartClassifyName, classifyInfo.ParentId, source)
+			if tmpErr != nil {
+				errMsg = "判断名称是否已存在失败"
+				err = errors.New("判断名称是否已存在失败,Err:" + tmpErr.Error())
+				return
+			}
+			if count > 0 {
+				errMsg = "分类名称已存在,请重新输入"
+				err = errors.New(errMsg)
+				isSendEmail = false
+				return
+			}
+
+			classifyInfo.ChartClassifyNameEn = chartClassifyName
+			classifyInfo.ModifyTime = time.Now()
+			updateCols = append(updateCols, "ChartClassifyNameEn", "ModifyTime")
+		}
+	default:
+		if classifyInfo.ChartClassifyName != chartClassifyName {
+			count, tmpErr := data_manage.GetChartClassifyCount(chartClassifyName, classifyInfo.ParentId, source)
+			if tmpErr != nil {
+				errMsg = "判断名称是否已存在失败"
+				err = errors.New("判断名称是否已存在失败,Err:" + tmpErr.Error())
+				return
+			}
+			if count > 0 {
+				errMsg = "分类名称已存在,请重新输入"
+				err = errors.New(errMsg)
+				isSendEmail = false
+				return
+			}
+
+			classifyInfo.ChartClassifyName = chartClassifyName
+			classifyInfo.ModifyTime = time.Now()
+			updateCols = append(updateCols, "ChartClassifyName", "ModifyTime")
+		}
+	}
+
+	if len(updateCols) > 0 {
+		err = classifyInfo.Update(updateCols)
+	}
+
+	return
+}
+
+// RemoveNotChartClassifyItemsMakeTree
+// @Description: 过滤名下没有自己图表的分类,并生成树形结构
+// @author: Roc
+// @datetime 2024-09-11 16:59:39
+// @param node *data_manage.ChartClassifyItems
+// @param selfChartClassifyIdList []int
+// @return isSelf bool
+func RemoveNotChartClassifyItemsMakeTree(node *data_manage.ChartClassifyItems, selfChartClassifyIdList []int) (isSelf bool) {
+	if utils.InArrayByInt(selfChartClassifyIdList, node.ChartClassifyId) {
+		return true
+	}
+
+	childrenList := make([]*data_manage.ChartClassifyItems, 0)
+	for _, child := range node.Children {
+		if tmpIsSelf := RemoveNotChartClassifyItemsMakeTree(child, selfChartClassifyIdList); tmpIsSelf {
+			childrenList = append(childrenList, child)
+			isSelf = tmpIsSelf
+		}
+	}
+	node.Children = childrenList
+
+	return
+}
+
+// GetChartClassifyChildrenRecursive 根据父目录递归子级目录
+func GetChartClassifyChildrenRecursive(list []*data_manage.ChartClassifyItems, parentId int) []*data_manage.ChartClassifyItems {
+	var res []*data_manage.ChartClassifyItems
+
+	for _, v := range list {
+		if v.ParentId == parentId {
+			// 递归调用以获取更深层次的子级
+			children := GetChartClassifyChildrenRecursive(list, v.ChartClassifyId)
+			// 将当前节点和所有子节点添加到结果中
+			res = append(res, v)
+			res = append(res, children...)
+		} else if v.ChartClassifyId == parentId {
+			// 将当前节点添加到结果中
+			res = append(res, v)
+		}
+	}
+	return res
+}
+
+// GetChartClassifyChildrenRecursiveByParentIds 根据父目录递归子级目录
+func GetChartClassifyChildrenRecursiveByParentIds(list []*data_manage.ChartClassifyItems, parentIds []string) []*data_manage.ChartClassifyItems {
+	var res []*data_manage.ChartClassifyItems
+
+	for _, v := range list {
+		for _, id := range parentIds {
+			parentId, _ := strconv.Atoi(id)
+			if v.ParentId == parentId || v.ChartClassifyId == parentId {
+				// 递归调用以获取更深层次的子级
+				children := GetChartClassifyChildrenRecursive(list, v.ChartClassifyId)
+				// 将当前节点和所有子节点添加到结果中
+				res = append(res, v)
+				res = append(res, children...)
+			}
+		}
+	}
+	return res
+}