Roc 4 月之前
父节点
当前提交
5c2019217a

+ 7 - 7
controllers/data_manage/chart_classify.go

@@ -89,21 +89,21 @@ func (this *ChartClassifyController) ChartClassifyListV2() {
 		}
 	}
 
-	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_DEFAULT)
+	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_DEFAULT, this.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
 
-	classifyAll, err := data_manage.GetChartClassifyAll(utils.CHART_SOURCE_DEFAULT)
+	classifyAll, err := data_manage.GetChartClassifyAll(utils.CHART_SOURCE_DEFAULT, this.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
 
-	allChartInfo, err := data_manage.GetChartInfoAll([]int{utils.CHART_SOURCE_DEFAULT})
+	allChartInfo, err := data_manage.GetChartInfoAll([]int{utils.CHART_SOURCE_DEFAULT}, this.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
@@ -162,13 +162,13 @@ func (this *ChartClassifyController) ChartClassifyListV2() {
 
 // getChartClassifyListForMe 获取我创建的图表
 func getChartClassifyListForMe(adminInfo system.Admin, resp *data_manage.ChartClassifyListResp) (errMsg string, err error) {
-	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_DEFAULT)
+	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_DEFAULT, adminInfo.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		errMsg = "获取失败"
 		return
 	}
 
-	classifyAll, err := data_manage.GetChartClassifyAll(utils.CHART_SOURCE_DEFAULT)
+	classifyAll, err := data_manage.GetChartClassifyAll(utils.CHART_SOURCE_DEFAULT, adminInfo.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		errMsg = "获取失败"
 		return
@@ -221,14 +221,14 @@ func (this *ChartClassifyController) ChartClassifyItems() {
 		this.ServeJSON()
 	}()
 
-	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_DEFAULT)
+	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_DEFAULT, this.SysUser.AdminId)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
 
-	classifyAll, err := data_manage.GetChartClassifyAll(utils.CHART_SOURCE_DEFAULT)
+	classifyAll, err := data_manage.GetChartClassifyAll(utils.CHART_SOURCE_DEFAULT, this.SysUser.AdminId)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()

+ 2 - 2
controllers/data_manage/correlation/correlation_chart_classify.go

@@ -60,7 +60,7 @@ func (this *CorrelationChartClassifyController) ChartClassifyList() {
 
 	nodeAll := make([]*data_manage.ChartClassifyItems, 0)
 	// 查询分类节点
-	rootList, err := data_manage.GetChartClassifyByParentId(parentId, utils.CHART_SOURCE_CORRELATION)
+	rootList, err := data_manage.GetChartClassifyByParentId(parentId, utils.CHART_SOURCE_CORRELATION, this.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -154,7 +154,7 @@ func (this *CorrelationChartClassifyController) ChartClassifyItems() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_CORRELATION)
+	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_CORRELATION, this.SysUser.AdminId)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()

+ 2 - 2
controllers/data_manage/cross_variety/classify.go

@@ -53,14 +53,14 @@ func (c *ClassifyController) List() {
 		source = utils.CHART_SOURCE_CROSS_HEDGING
 	}
 
-	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_CROSS_HEDGING)
+	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_CROSS_HEDGING, c.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
 
-	allChartInfo, err := data_manage.GetChartInfoAll([]int{source})
+	allChartInfo, err := data_manage.GetChartInfoAll([]int{source}, c.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()

+ 248 - 0
controllers/data_manage/edb_info.go

@@ -4594,3 +4594,251 @@ func (this *EdbInfoController) ChartImageSetBySvg() {
 	br.Success = true
 	br.Msg = "保存成功"
 }
+
+// EdbInfoFilterByEs
+// @Title 指标筛选接口
+// @Description 指标筛选接口
+// @Param   KeyWord   query   string  false       "搜索关键词:指标ID/指标名称"
+// @Param   FilterSource   query   int  false       "搜索来源:1:其他搜索,2:累计值转月值搜索,3:变频,4:基础指标,5:同比"
+// @Param   Frequency   query   string  false       "频度"
+// @Param   IsAddPredictEdb   query   bool  false       "是否查询添加预测指标"
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   EdbType   query   int  false       "指标类型:0-基础和计算;1-基础指标;2-计算指标;3-衍生指标"
+// @Param   EdbAuth   query   int  false       "指标权限:0-全部;1-我的;2-公共"
+// @Param   EdbCollect   query   int  false       "指标收藏状态:0-全部;1-已收藏"
+// @Success 200 {object} data_manage.EdbInfoList
+// @router /edb_info/batch_move [get]
+func (this *EdbInfoController) BatchMoveEdb() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	// TODO 移动指标
+	var err error
+	req := data_manage.EsEdbReq{}
+	err = this.ParseForm(&req)
+	if err != nil {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误"
+		return
+	}
+	var total int64
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	keyWord := this.GetString("KeyWord")
+	keyWord = strings.TrimSpace(keyWord) //移除字符串首尾空格
+	filterSource, _ := this.GetInt("FilterSource")
+	if filterSource <= 0 {
+		filterSource = 1
+	}
+	//指标来源
+	source, _ := this.GetInt("Source")
+
+	frequency := this.GetString("Frequency") //频度
+
+	//isAddPredictEdb, _ := this.GetBool("IsAddPredictEdb") //是否查询添加预测指标
+
+	// 指标类型数组:1-基础指标;2-计算指标;3-预测指标
+	edbTypeList := make([]int, 0)
+	edbInfoType := -1                            // 指标范围
+	edbTypeStr := this.GetString("EdbType", "0") // 指标类型:0-基础和计算;1-基础指标;2-计算指标;3-预测指标
+	{
+		if edbTypeStr == `` || edbTypeStr == `0` {
+			edbTypeList = []int{1, 2}
+			edbInfoType = 0
+		} else {
+			var hasEdb, hasPredictEdb bool
+			tmpEdbTypeList := strings.Split(edbTypeStr, `,`)
+			for _, v := range tmpEdbTypeList {
+				edbType, err := strconv.Atoi(v)
+				if err != nil {
+					br.Msg = "EdbType异常"
+					br.ErrMsg = "EdbType异常,Err:" + err.Error()
+					return
+				}
+
+				// 指标类型
+				switch edbType {
+				case 1, 2:
+					hasEdb = true
+					edbTypeList = append(edbTypeList, edbType)
+				case 3:
+					hasPredictEdb = true
+					edbTypeList = []int{1, 2}
+				}
+			}
+
+			// 只有数据查看和指标加工
+			if hasEdb && !hasPredictEdb {
+				edbInfoType = 0
+			} else if !hasEdb && hasPredictEdb {
+				// 只有预测指标
+				edbInfoType = 1
+			}
+		}
+	}
+
+	edbAuth, _ := this.GetInt("EdbAuth", 0) // 指标权限范围,0-全部;1-我的;2-公共
+
+	edbCollect, _ := this.GetInt("EdbCollect", 0) // 指标收藏状态:0-全部;1-已收藏
+
+	var edbInfoList []*data_manage.EdbInfoList
+
+	// 无权限指标 和 无权限指标分类id(只考虑)
+	noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, err := data_manage_permission.GetUserAllEdbAndClassifyNoPermissionListV2(this.SysUser.AdminId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+		return
+	}
+
+	// 收藏的指标id
+	collectEdbInfoIdList := make([]int, 0)
+	if edbCollect == 1 {
+		collectEdbInfoIdList, err = data_manage.GetUserAllCollectEdbInfoIdList(this.SysUser.AdminId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取收藏指标配置数据失败,Err:" + err.Error()
+			return
+		}
+	}
+
+	var keyWordArr []string
+	keyWordArr = append(keyWordArr, keyWord)
+
+	newKeyWord := strings.Split(keyWord, " ")
+	keyWordArr = append(keyWordArr, newKeyWord...)
+
+	sortMap := make(map[string]string)
+	// 如果没有搜索关键词,则默认根据指标编码倒序排序
+	if keyWord == `` {
+		sortMap["EdbInfoId"] = `desc`
+	}
+
+	// 普通的搜索
+	total, edbInfoList, err = elastic.SearchEdbInfoData(keyWord, startSize, pageSize, filterSource, source, frequency, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, collectEdbInfoIdList, edbTypeList, edbInfoType, edbAuth, this.SysUser.AdminId, sortMap)
+
+	if err != nil {
+		edbInfoList = make([]*data_manage.EdbInfoList, 0)
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, int(total))
+
+	edbInfoListLen := len(edbInfoList)
+
+	classifyIdList := make([]int, 0)
+	for i := 0; i < edbInfoListLen; i++ {
+		edbInfoList[i].ConvertToResp()
+		edbInfoList[i].EdbNameAlias = edbInfoList[i].EdbName
+		classifyIdList = append(classifyIdList, edbInfoList[i].ClassifyId)
+	}
+
+	// 当前列表中的分类map
+	classifyMap := make(map[int]*data_manage.EdbClassify)
+	if edbInfoListLen > 0 {
+		classifyList, err := data_manage.GetEdbClassifyByIdList(classifyIdList)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range classifyList {
+			classifyMap[v.ClassifyId] = v
+		}
+
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+			return
+		}
+
+		// 因为是ES查找的,所以需要重新查一下指标的信息,主要是为了把是否授权字段找出来
+		{
+			edbInfoIdList := make([]int, 0)
+			for i := 0; i < edbInfoListLen; i++ {
+				edbInfoIdList = append(edbInfoIdList, edbInfoList[i].EdbInfoId)
+				tmpEdbInfo := edbInfoList[i]
+				if currClassify, ok := classifyMap[tmpEdbInfo.ClassifyId]; ok {
+					edbInfoList[i].HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(tmpEdbInfo.IsJoinPermission, currClassify.IsJoinPermission, tmpEdbInfo.EdbInfoId, tmpEdbInfo.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+				}
+			}
+
+			tmpEdbList, err := data_manage.GetEdbInfoByIdList(edbInfoIdList)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取所有有权限的指标失败,Err:" + err.Error()
+				return
+			}
+			edbInfoMap := make(map[int]*data_manage.EdbInfo)
+			for _, v := range tmpEdbList {
+				edbInfoMap[v.EdbInfoId] = v
+			}
+
+			for i := 0; i < edbInfoListLen; i++ {
+				tmpEdbInfo, ok := edbInfoMap[edbInfoList[i].EdbInfoId]
+				if !ok {
+					continue
+				}
+				edbInfoList[i].IsJoinPermission = tmpEdbInfo.IsJoinPermission
+			}
+		}
+
+		// 权限校验
+		for i := 0; i < edbInfoListLen; i++ {
+			tmpEdbInfoItem := edbInfoList[i]
+			if currClassify, ok := classifyMap[tmpEdbInfoItem.ClassifyId]; ok {
+				edbInfoList[i].HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(tmpEdbInfoItem.IsJoinPermission, currClassify.IsJoinPermission, tmpEdbInfoItem.EdbInfoId, tmpEdbInfoItem.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			}
+		}
+	}
+
+	for i := 0; i < edbInfoListLen; i++ {
+		for j := 0; j < edbInfoListLen; j++ {
+			if (edbInfoList[i].EdbNameAlias == edbInfoList[j].EdbNameAlias) &&
+				(edbInfoList[i].EdbInfoId != edbInfoList[j].EdbInfoId) &&
+				!(strings.Contains(edbInfoList[i].EdbName, edbInfoList[i].SourceName)) {
+				edbInfoList[i].EdbName = edbInfoList[i].EdbName + "(" + edbInfoList[i].SourceName + ")"
+			}
+		}
+	}
+	//新增搜索词记录
+	{
+		searchKeyword := new(data_manage.SearchKeyword)
+		searchKeyword.KeyWord = keyWord
+		searchKeyword.CreateTime = time.Now()
+		go data_manage.AddSearchKeyword(searchKeyword)
+	}
+
+	// 不返回无权限的指标
+	respList := make([]*data_manage.EdbInfoList, 0)
+	for _, v := range edbInfoList {
+		if v.HaveOperaAuth {
+			respList = append(respList, v)
+		}
+	}
+
+	resp := data_manage.EdbInfoFilterDataResp{
+		Paging: page,
+		List:   respList,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 160 - 10
controllers/data_manage/edb_public.go

@@ -226,7 +226,35 @@ func (c *EdbPublicController) Save() {
 		br.IsSendEmail = false
 	}
 
-	// TODO 校验是否存在已公开的指标
+	// 待处理的资产
+	dataPublicItemList := make([]dataApproveSerice.SetDataPublicItem, 0)
+
+	// 校验是否重复存在已公开、已提交的指标
+	{
+		edbInfoIdList := make([]int, 0)
+		for _, item := range req.EdbInfoList {
+			edbInfoIdList = append(edbInfoIdList, item.EdbInfoId)
+
+			dataPublicItemList = append(dataPublicItemList, dataApproveSerice.SetDataPublicItem{
+				DataId:     item.EdbInfoId,
+				ClassifyId: item.ClassifyId,
+			})
+		}
+
+		list, err := data_manage.GetEdbInfoByIdList(edbInfoIdList)
+		if err != nil {
+			br.Msg = "保存失败!"
+			br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range list {
+			if v.PublicStatus != utils.EdbPublicDefault {
+				br.Msg = `选择指标中存在已经公开/提交审批的指标,请仅选择未公开指标!`
+				br.IsSendEmail = false
+				return
+			}
+		}
+	}
 
 	// 校验是否开启了审批流
 	opening, e := dataApproveSerice.CheckOpenApprove(dataApproveSerice.DataTypeEdb)
@@ -245,7 +273,7 @@ func (c *EdbPublicController) Save() {
 			br.ErrMsg = "获取商家配置失败, Err: " + e.Error()
 			return
 		}
-		ignoreEdbApproveUserIdList := strings.Split(businessConf.ConfKey, `,`)
+		ignoreEdbApproveUserIdList := strings.Split(businessConf.ConfVal, `,`)
 		if utils.InArrayByStr(ignoreEdbApproveUserIdList, strconv.Itoa(c.SysUser.AdminId)) {
 			isIgnoreApprove = true
 		}
@@ -263,20 +291,142 @@ func (c *EdbPublicController) Save() {
 	}
 	title += `公开审批`
 
+	// 没开启审批流、或者无需审批
+	if !opening || isIgnoreApprove {
+		err = dataApproveSerice.UpdatePublicByDataList(dataApproveSerice.DataTypeEdb, dataApproveSerice.DataApproveStatePass, dataPublicItemList)
+	} else {
+
+		_, err = dataApproveSerice.SubmitDataApprove(dataApproveSerice.DataTypeEdb, dataPublicItemList, title, strings.TrimSpace(req.Description), c.SysUser.AdminId, c.SysUser.RealName)
+		if err != nil {
+			br.Msg = "提交审批失败"
+			br.ErrMsg = "提交审批失败, Err: " + err.Error()
+			return
+		}
+	}
+
+	if err != nil {
+		br.Msg = "编辑失败"
+		br.ErrMsg = "编辑失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+}
+
+// Cancel
+// @Title 撤销指标公开
+// @Description 撤销指标公开
+// @Param   EdbInfoId   query   int  true       "指标id"
+// @Success 200 {object} data_manage.EdbInfo
+// @router /edb_info/public/cancel [post]
+func (c *EdbPublicController) Cancel() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	// TODO 单个指标撤销的时候,需要校验状态,然后撤销
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	edbInfoId, _ := c.GetInt("EdbInfoId")
+	if edbInfoId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误"
+		return
+	}
+
+	var req request.SetEdbPublicReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if len(req.EdbInfoList) <= 0 {
+		br.Msg = `请选择指标`
+		br.IsSendEmail = false
+	}
+
 	// 待处理的资产
-	dataPubliItemList := make([]dataApproveSerice.SetDataPublicItem, 0)
-	for _, item := range req.EdbInfoList {
-		dataPubliItemList = append(dataPubliItemList, dataApproveSerice.SetDataPublicItem{
-			DataId:     item.EdbInfoId,
-			ClassifyId: item.ClassifyId,
-		})
+	dataPublicItemList := make([]dataApproveSerice.SetDataPublicItem, 0)
+
+	// 校验是否重复存在已公开、已提交的指标
+	{
+		edbInfoIdList := make([]int, 0)
+		for _, item := range req.EdbInfoList {
+			edbInfoIdList = append(edbInfoIdList, item.EdbInfoId)
+
+			dataPublicItemList = append(dataPublicItemList, dataApproveSerice.SetDataPublicItem{
+				DataId:     item.EdbInfoId,
+				ClassifyId: item.ClassifyId,
+			})
+		}
+
+		list, err := data_manage.GetEdbInfoByIdList(edbInfoIdList)
+		if err != nil {
+			br.Msg = "保存失败!"
+			br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range list {
+			if v.PublicStatus != utils.EdbPublicDefault {
+				br.Msg = `选择指标中存在已经公开/提交审批的指标,请仅选择未公开指标!`
+				br.IsSendEmail = false
+				return
+			}
+		}
+	}
+
+	// 校验是否开启了审批流
+	opening, e := dataApproveSerice.CheckOpenApprove(dataApproveSerice.DataTypeEdb)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "校验指标公开是否开启审批流失败, Err: " + e.Error()
+		return
+	}
+
+	// 是否忽略审批
+	var isIgnoreApprove bool
+	{
+		businessConf, e := models.GetBusinessConfByKey(models.IgnoreEdbApproveUserId)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取商家配置失败, Err: " + e.Error()
+			return
+		}
+		ignoreEdbApproveUserIdList := strings.Split(businessConf.ConfVal, `,`)
+		if utils.InArrayByStr(ignoreEdbApproveUserIdList, strconv.Itoa(c.SysUser.AdminId)) {
+			isIgnoreApprove = true
+		}
+	}
+
+	edbInfo, err := data_manage.GetEdbInfoById(req.EdbInfoList[0].EdbInfoId)
+	if err != nil {
+		br.Msg = "获取指标失败"
+		br.ErrMsg = "获取指标失败:" + err.Error()
+		return
 	}
+	title := edbInfo.EdbName
+	if len(req.EdbInfoList) > 1 {
+		title += `等指标`
+	}
+	title += `公开审批`
+
 	// 没开启审批流、或者无需审批
 	if !opening || isIgnoreApprove {
-		err = dataApproveSerice.UpdatePublicByDataList(dataApproveSerice.DataTypeEdb, dataApproveSerice.DataApproveStatePass, dataPubliItemList)
+		err = dataApproveSerice.UpdatePublicByDataList(dataApproveSerice.DataTypeEdb, dataApproveSerice.DataApproveStatePass, dataPublicItemList)
 	} else {
 
-		_, err = dataApproveSerice.SubmitDataApprove(dataApproveSerice.DataTypeEdb, dataPubliItemList, title, strings.TrimSpace(req.Description), c.SysUser.AdminId, c.SysUser.RealName)
+		_, err = dataApproveSerice.SubmitDataApprove(dataApproveSerice.DataTypeEdb, dataPublicItemList, title, strings.TrimSpace(req.Description), c.SysUser.AdminId, c.SysUser.RealName)
 		if err != nil {
 			br.Msg = "提交审批失败"
 			br.ErrMsg = "提交审批失败, Err: " + err.Error()

+ 4 - 4
controllers/data_manage/future_good/future_good_chart_classify.go

@@ -66,14 +66,14 @@ func (this *FutureGoodChartClassifyController) ChartClassifyList() {
 		return
 	}
 
-	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_FUTURE_GOOD)
+	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_FUTURE_GOOD, this.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
 
-	allChartInfo, err := data_manage.GetChartInfoAll([]int{utils.CHART_SOURCE_FUTURE_GOOD, utils.CHART_SOURCE_FUTURE_GOOD_PROFIT})
+	allChartInfo, err := data_manage.GetChartInfoAll([]int{utils.CHART_SOURCE_FUTURE_GOOD, utils.CHART_SOURCE_FUTURE_GOOD_PROFIT}, this.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
@@ -107,7 +107,7 @@ func (this *FutureGoodChartClassifyController) ChartClassifyList() {
 
 // getChartClassifyListForMe 获取我创建的图表
 func getChartClassifyListForMe(adminInfo system.Admin, resp *data_manage.ChartClassifyListResp) (errMsg string, err error) {
-	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_FUTURE_GOOD)
+	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_FUTURE_GOOD, adminInfo.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		errMsg = "获取失败"
 		return
@@ -149,7 +149,7 @@ func (this *FutureGoodChartClassifyController) ChartClassifyItems() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_FUTURE_GOOD)
+	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_FUTURE_GOOD, this.SysUser.AdminId)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()

+ 4 - 4
controllers/data_manage/line_equation/line_chart_classify.go

@@ -63,14 +63,14 @@ func (this *LineEquationChartClassifyController) ChartClassifyList() {
 
 	source := utils.CHART_SOURCE_LINE_EQUATION
 
-	rootList, err := data_manage.GetChartClassifyByParentId(0, source)
+	rootList, err := data_manage.GetChartClassifyByParentId(0, source, this.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
 
-	allChartInfo, err := data_manage.GetChartInfoAll([]int{source})
+	allChartInfo, err := data_manage.GetChartInfoAll([]int{source}, this.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
@@ -112,7 +112,7 @@ func (this *LineEquationChartClassifyController) ChartClassifyList() {
 // getChartClassifyListForMe 获取我创建的图表
 func getChartClassifyListForMe(adminInfo system.Admin, resp *data_manage.ChartClassifyListResp) (errMsg string, err error) {
 	// 获取所有的分类
-	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_LINE_EQUATION)
+	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_LINE_EQUATION, adminInfo.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		errMsg = "获取失败"
 		return
@@ -154,7 +154,7 @@ func (this *LineEquationChartClassifyController) ChartClassifyItems() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_LINE_EQUATION)
+	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_LINE_EQUATION, this.SysUser.AdminId)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()

+ 4 - 4
controllers/data_manage/line_feature/classify.go

@@ -63,14 +63,14 @@ func (this *LineFeaturesChartClassifyController) ChartClassifyList() {
 
 	source := utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION
 
-	rootList, err := data_manage.GetChartClassifyByParentId(0, source)
+	rootList, err := data_manage.GetChartClassifyByParentId(0, source, this.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
 
-	allChartInfo, err := data_manage.GetChartInfoAll([]int{utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE, utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY})
+	allChartInfo, err := data_manage.GetChartInfoAll([]int{utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE, utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY}, this.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
@@ -112,7 +112,7 @@ func (this *LineFeaturesChartClassifyController) ChartClassifyList() {
 // getChartClassifyListForMe 获取我创建的图表
 func getChartClassifyListForMe(adminInfo system.Admin, resp *data_manage.ChartClassifyListResp) (errMsg string, err error) {
 	// 获取所有的分类
-	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION)
+	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, adminInfo.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		errMsg = "获取失败"
 		return
@@ -154,7 +154,7 @@ func (this *LineFeaturesChartClassifyController) ChartClassifyItems() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION)
+	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, this.SysUser.AdminId)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()

+ 2 - 2
controllers/data_manage/range_analysis/chart_classify.go

@@ -59,7 +59,7 @@ func (this *RangeChartClassifyController) ChartClassifyList() {
 
 	nodeAll := make([]*data_manage.ChartClassifyItems, 0)
 	// 查询分类节点
-	rootList, err := data_manage.GetChartClassifyByParentId(parentId, utils.CHART_SOURCE_RANGE_ANALYSIS)
+	rootList, err := data_manage.GetChartClassifyByParentId(parentId, utils.CHART_SOURCE_RANGE_ANALYSIS, this.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -153,7 +153,7 @@ func (this *RangeChartClassifyController) ChartClassifyItems() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_RANGE_ANALYSIS)
+	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_RANGE_ANALYSIS, this.SysUser.AdminId)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()

+ 345 - 18
controllers/fix.go

@@ -16,28 +16,36 @@ import (
 // @author: Roc
 // @datetime 2024-12-02 09:29:56
 func init() {
-	// ### 1、先修复分类完整路径
-	//initFixClassifyPath()
+	// ### 1、先修复指标分类完整路径
+	//initFixEdbClassifyPath()
 
 	// ### 2、再修复个人分类、删除不存在指标的分类
 	// ### 2.1 数据加工
-	//initFixSelfClassify(utils.EdbClassifyTypeCalculate)
+	//initFixSelfEdbClassify(utils.EdbClassifyTypeCalculate)
 	//
 	//// ### 2.2 衍生指标
-	//initFixSelfClassify(utils.EdbClassifyTypePredict)
+	//initFixSelfEdbClassify(utils.EdbClassifyTypePredict)
 	//
 
-	// ### 3、修复ES数据
+	// 开始图表数据了
+
+	// ### 3、修复图表分类完整路径
+	//initFixChartClassifyPath()
+
+	// ### 4、修复图表分类完整路径
+	//initFixSelfChartClassify()
+
+	// ### 5、修复ES数据
 	//initEs()
 
 	//fmt.Println("修复完成")
 }
 
-// initFixClassifyPath
+// initFixEdbClassifyPath
 // @Description: 修复分类完整路径
 // @author: Roc
 // @datetime 2024-11-26 15:40:57
-func initFixClassifyPath() {
+func initFixEdbClassifyPath() {
 	allList := make([]*data_manage.EdbClassifyItems, 0)
 	allList, e := data_manage.GetEdbClassifyByClassifyTypes([]int{utils.EdbClassifyTypeBase, utils.EdbClassifyTypePredict, utils.EdbClassifyTypeCalculate}, 0)
 	if e != nil {
@@ -53,12 +61,12 @@ func initFixClassifyPath() {
 	sort.Sort(sortList)
 
 	for _, v := range sortList {
-		updatePath(v, "", "")
+		updateEdbPath(v, "", "")
 	}
 	fmt.Println("修复分类路径完成")
 }
 
-func updatePath(item *data_manage.EdbClassifyItems, classifyNamePath, classifyIdPath string) {
+func updateEdbPath(item *data_manage.EdbClassifyItems, classifyNamePath, classifyIdPath string) {
 	if classifyNamePath == `` {
 		classifyNamePath = item.ClassifyName
 		classifyIdPath = fmt.Sprint(item.ClassifyId)
@@ -72,16 +80,16 @@ func updatePath(item *data_manage.EdbClassifyItems, classifyNamePath, classifyId
 	}
 	if item.Children != nil {
 		for _, v := range item.Children {
-			updatePath(v, classifyNamePath, classifyIdPath)
+			updateEdbPath(v, classifyNamePath, classifyIdPath)
 		}
 	}
 }
 
-// initFixUserClassify
+// initFixSelfEdbClassify
 // @Description: initFixUserClassify
 // @author: Roc
 // @datetime 2024-11-29 16:57:54
-func initFixSelfClassify(classifyType int) {
+func initFixSelfEdbClassify(classifyType int) {
 	// 指标数据明细
 	condition := ` AND edb_info_type = 0 and edb_type = 2 `
 	if classifyType == utils.EdbClassifyTypePredict {
@@ -165,7 +173,7 @@ func initFixSelfClassify(classifyType int) {
 	for userId, sysUserName := range edbUserMap {
 		classifyRelationMap := make(map[int]int)
 		for _, v := range nodeAll {
-			createNewClassify(userId, 0, 0, 0, sysUserName, ``, ``, v, classifyRelationMap)
+			createNewEdbClassify(userId, 0, 0, 0, sysUserName, ``, ``, v, classifyRelationMap)
 		}
 		userClassifyIdMap[userId] = classifyRelationMap
 	}
@@ -193,11 +201,11 @@ func initFixSelfClassify(classifyType int) {
 	}
 
 	// ##### 3、开始删除没有指标的分类
-	deleteNullClassify(classifyType)
+	deleteNullEdbClassify(classifyType)
 	return
 }
 
-func deleteNullClassify(classifyType int) {
+func deleteNullEdbClassify(classifyType int) {
 	// 指标列表数据
 	condition := ` AND edb_info_type = 0 and edb_type = 2 `
 	if classifyType == utils.EdbClassifyTypePredict {
@@ -273,7 +281,7 @@ func deleteNullClassify(classifyType int) {
 	}
 }
 
-// createNewClassify
+// createNewEdbClassify
 // @Description: 创建分类
 // @author: Roc
 // @datetime 2024-11-29 17:57:47
@@ -286,7 +294,7 @@ func deleteNullClassify(classifyType int) {
 // @param parentClassifyIdPath string
 // @param node *data_manage.EdbClassifyItems
 // @param classifyRelationMap map[int]int
-func createNewClassify(userId, parentId, rootId, level int, sysUserName, parentClassifyNamePath, parentClassifyIdPath string, node *data_manage.EdbClassifyItems, classifyRelationMap map[int]int) {
+func createNewEdbClassify(userId, parentId, rootId, level int, sysUserName, parentClassifyNamePath, parentClassifyIdPath string, node *data_manage.EdbClassifyItems, classifyRelationMap map[int]int) {
 	var classifyNamePath, classifyIdPath string
 
 	if parentId > 0 {
@@ -343,12 +351,331 @@ func createNewClassify(userId, parentId, rootId, level int, sysUserName, parentC
 		return
 	}
 	for _, child := range node.Children {
-		createNewClassify(userId, classifyInfo.ClassifyId, rootId, level, sysUserName, classifyNamePath, classifyInfo.ClassifyIdPath, child, classifyRelationMap)
+		createNewEdbClassify(userId, classifyInfo.ClassifyId, rootId, level, sysUserName, classifyNamePath, classifyInfo.ClassifyIdPath, child, classifyRelationMap)
+	}
+
+	return
+}
+
+// initFixChartClassifyPath
+// @Description: 修复图表分类完整路径
+// @author: Roc
+// @datetime 2024-11-26 15:40:57
+func initFixChartClassifyPath() {
+	fmt.Println("开始修复图表分类路径,请稍等...")
+	allList := make([]*data_manage.ChartClassifyItems, 0)
+	allList, e := data_manage.GetAllChartClassify()
+	if e != nil {
+		fmt.Println("获取分类失败", e)
+		return
+	}
+
+	allList = data.GetChartClassifyTreeRecursive(allList, 0)
+	//根据sort值排序
+
+	for _, v := range allList {
+		updateChartPath(v, "", "")
+	}
+	fmt.Println("修复图表分类路径完成")
+}
+
+// initFixSelfChartClassify
+// @Description: 修复用户图表分类信息
+// @author: Roc
+// @datetime 2024-11-29 16:57:54
+func initFixSelfChartClassify() {
+	fmt.Println("修复用户图表分类信息开始,请稍后...")
+	// 图表数据明细
+	condition := ``
+
+	pars := make([]interface{}, 0)
+	chartList, err := data_manage.GetChartListByCondition(condition, pars, 0, 1000000)
+	if err != nil {
+		fmt.Println("查找用户图表列表数据失败", err.Error())
+		return
+	}
+
+	chartClassifyIdMap := make(map[int]bool)
+	classifyIdList := make([]int, 0)
+
+	edbUserMap := make(map[int]string)
+
+	for _, v := range chartList {
+		if _, ok := chartClassifyIdMap[v.ChartClassifyId]; !ok {
+			classifyIdList = append(classifyIdList, v.ChartClassifyId)
+			chartClassifyIdMap[v.ChartClassifyId] = true
+		}
+
+		edbUserMap[v.SysUserId] = v.SysUserRealName
+	}
+
+	// 获取所有图表的分类
+	classifyList, err := data_manage.GetAllChartClassify()
+	if err != nil {
+		fmt.Println("获取图表分类失败", err.Error())
+		return
+	}
+
+	hasClassifyIdStrList := make([]string, 0)
+	for _, v := range classifyList {
+		// 判断当前分类id是否加到指标中,如果加进去了,那么才处理
+		_, ok := chartClassifyIdMap[v.ChartClassifyId]
+		if !ok {
+			continue
+		}
+		hasClassifyIdStrList = append(hasClassifyIdStrList, v.ChartClassifyIdPath)
+	}
+	classifyIdStrList := strings.Split(strings.Join(hasClassifyIdStrList, ","), ",")
+	classifyIdMap := make(map[string]bool)
+	for _, v := range classifyIdStrList {
+		classifyIdMap[v] = true
+	}
+	newClassifyList := make([]*data_manage.ChartClassifyItems, 0)
+	newClassifyMap := make(map[string]bool)
+	for _, v := range classifyList {
+		classifyIdStr := fmt.Sprint(v.ChartClassifyId)
+
+		// 是否在关联指标的map里面,如果不在的话,那么就过滤
+		_, ok := classifyIdMap[classifyIdStr]
+		if !ok {
+			continue
+		}
+
+		// 是否已经加到需要关联指标分类的map里面,如果已经在了,那么也过滤
+		_, ok = newClassifyMap[classifyIdStr]
+		if ok {
+			continue
+		}
+
+		newClassifyMap[classifyIdStr] = true
+		newClassifyList = append(newClassifyList, v)
 	}
 
+	rootList, err := data_manage.GetAllChartClassifyByParentId(0)
+	nodeAll := make([]*data_manage.ChartClassifyItems, 0)
+	for k := range rootList {
+		rootNode := rootList[k]
+		data.ChartClassifyItemsMakeTreeV2(newClassifyList, rootNode)
+		nodeAll = append(nodeAll, rootNode)
+	}
+
+	// 创建新的分类
+	// [用户id][原分类id][新分类id]
+	userClassifyIdMap := make(map[int]map[int]int)
+	for userId, sysUserName := range edbUserMap {
+		classifyRelationMap := make(map[int]int)
+		for _, v := range nodeAll {
+			createNewChartClassify(userId, 0, 0, 0, sysUserName, ``, ``, v, classifyRelationMap)
+		}
+		userClassifyIdMap[userId] = classifyRelationMap
+	}
+
+	// ##### 第二步,图表数据迁移
+
+	// 指标数据迁移
+	for _, v := range chartList {
+		userClassifyMap, ok := userClassifyIdMap[v.SysUserId]
+		if !ok {
+			fmt.Println("找不到该用户所属的分类,userId:", v.SysUserId)
+			continue
+		}
+
+		newClassifyId, ok := userClassifyMap[v.ChartClassifyId]
+		if !ok {
+			fmt.Println("找不到该用户所属的图表分类,classifyId:", v.ChartClassifyId)
+			continue
+		}
+		// 开始迁移指标数据
+		err = data_manage.UpdateClassifyIdByChartInfoId(v.ChartInfoId, newClassifyId)
+		if err != nil {
+			fmt.Println("图表数据迁移失败", err.Error())
+		}
+	}
+
+	// ##### 3、开始删除没有图表的分类
+	deleteNullChartClassify()
+
+	fmt.Println("修复用户图表分类信息完成")
 	return
 }
 
+func deleteNullChartClassify() {
+	// 图表数据明细
+	condition := ``
+
+	pars := make([]interface{}, 0)
+	chartList, err := data_manage.GetChartListByCondition(condition, pars, 0, 1000000)
+	if err != nil {
+		fmt.Println("查找指标加工数据失败", err.Error())
+		return
+	}
+
+	chartClassifyIdMap := make(map[int]bool)
+	classifyIdList := make([]int, 0)
+
+	for _, v := range chartList {
+		if _, ok := chartClassifyIdMap[v.ChartClassifyId]; !ok {
+			classifyIdList = append(classifyIdList, v.ChartClassifyId)
+			chartClassifyIdMap[v.ChartClassifyId] = true
+		}
+	}
+
+	// 获取所有数据加工的分类
+	classifyList, err := data_manage.GetAllChartClassify()
+	if err != nil {
+		fmt.Println("获取数据加工分类失败", err.Error())
+		return
+	}
+
+	// 存在图表的分类
+	hasEdbClassifyList := make([]*data_manage.ChartClassifyItems, 0)
+	for _, v := range classifyList {
+		if _, ok := chartClassifyIdMap[v.ChartClassifyId]; ok {
+			hasEdbClassifyList = append(hasEdbClassifyList, v)
+		}
+	}
+
+	// 待删除的分类id集合
+	deleteClassifyIdMap := make(map[int]int)
+	// 全部的分类id集合
+	for _, v := range classifyList {
+		deleteClassifyIdMap[v.ChartClassifyId] = v.ChartClassifyId
+	}
+
+	// 存在指标的的分类id集合
+	hasClassifyIdStrList := make([]string, 0)
+	for _, v := range hasEdbClassifyList {
+		hasClassifyIdStrList = append(hasClassifyIdStrList, v.ChartClassifyIdPath)
+	}
+	classifyIdStrList := strings.Split(strings.Join(hasClassifyIdStrList, ","), ",")
+	for _, v := range classifyIdStrList {
+		classifyId, err := strconv.Atoi(v)
+		if err != nil {
+			fmt.Println("分类字符串转int失败,", err.Error())
+			return
+		}
+		delete(deleteClassifyIdMap, classifyId)
+	}
+
+	// 删除空分类
+	if len(deleteClassifyIdMap) > 0 {
+		deleteClassifyIdList := make([]int, 0)
+		for _, v := range deleteClassifyIdMap {
+			deleteClassifyIdList = append(deleteClassifyIdList, v)
+		}
+
+		err = data_manage.DelChartClassifyByIdList(deleteClassifyIdList)
+		if err != nil {
+			fmt.Println("删除空分类失败", err.Error())
+			return
+		}
+	}
+}
+
+// createNewChartClassify
+// @Description: 创建图表分类
+// @author: Roc
+// @datetime 2024-11-29 17:57:47
+// @param userId int
+// @param parentId int
+// @param rootId int
+// @param level int
+// @param sysUserName string
+// @param parentClassifyNamePath string
+// @param parentClassifyIdPath string
+// @param node *data_manage.EdbClassifyItems
+// @param classifyRelationMap map[int]int
+func createNewChartClassify(userId, parentId, rootId, level int, sysUserName, parentClassifyNamePath, parentClassifyIdPath string, node *data_manage.ChartClassifyItems, classifyRelationMap map[int]int) {
+	var classifyNamePath, classifyIdPath string
+
+	if parentId > 0 {
+		classifyNamePath = fmt.Sprint(parentClassifyNamePath, "|", node.ChartClassifyName)
+		classifyIdPath = fmt.Sprint(parentClassifyIdPath, ",")
+	} else {
+		classifyNamePath = node.ChartClassifyName
+	}
+
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	classifyInfo := &data_manage.ChartClassify{
+		ChartClassifyId:   0,
+		ChartClassifyName: node.ChartClassifyName,
+		ParentId:          parentId,
+		HasData:           1,
+		CreateTime:        time.Now(),
+		ModifyTime:        time.Now(),
+		SysUserId:         userId,
+		SysUserRealName:   sysUserName,
+		Level:             level + 1,
+		UniqueCode:        utils.MD5(utils.CHART_PREFIX + "_" + timestamp),
+		Sort:              node.Sort,
+		Source:            node.Source,
+		//IsJoinPermission:      0,
+		ChartClassifyNameEn:   node.ChartClassifyNameEn,
+		RootId:                rootId,
+		ChartClassifyNamePath: classifyNamePath,
+		ChartClassifyIdPath:   "",
+	}
+	_, err := data_manage.AddChartClassify(classifyInfo)
+	if err != nil {
+		fmt.Println("创建分类失败:", err.Error())
+		return
+	}
+
+	updateCols := []string{"ChartClassifyIdPath"}
+	// 更改分类id完整路径path
+	classifyInfo.ChartClassifyIdPath = fmt.Sprint(classifyIdPath, classifyInfo.ChartClassifyId)
+
+	if rootId <= 0 {
+		rootId = classifyInfo.ChartClassifyId
+		classifyInfo.RootId = classifyInfo.ChartClassifyId
+		updateCols = append(updateCols, "RootId")
+	}
+
+	_ = classifyInfo.Update(updateCols)
+
+	classifyRelationMap[node.ChartClassifyId] = classifyInfo.ChartClassifyId
+
+	level = classifyInfo.Level
+
+	if node.Children == nil {
+		return
+	}
+	if len(node.Children) <= 0 {
+		return
+	}
+	for _, child := range node.Children {
+		createNewChartClassify(userId, classifyInfo.ChartClassifyId, rootId, level, sysUserName, classifyNamePath, classifyInfo.ChartClassifyIdPath, child, classifyRelationMap)
+	}
+
+	return
+}
+
+// updateChartPath
+// @Description: 更新图表分类的完整路径
+// @author: Roc
+// @datetime 2024-12-09 10:30:16
+// @param item *data_manage.ChartClassifyItems
+// @param classifyNamePath string
+// @param classifyIdPath string
+func updateChartPath(item *data_manage.ChartClassifyItems, classifyNamePath, classifyIdPath string) {
+	if classifyNamePath == `` {
+		classifyNamePath = item.ChartClassifyName
+		classifyIdPath = fmt.Sprint(item.ChartClassifyId)
+	} else {
+		classifyNamePath = fmt.Sprint(classifyNamePath, "|", item.ChartClassifyName)
+		classifyIdPath = fmt.Sprint(classifyIdPath, ",", item.ChartClassifyId)
+	}
+	err := data_manage.UpdateChartClassify(item.ChartClassifyId, classifyNamePath, classifyIdPath)
+	if err != nil {
+		fmt.Println(item.ChartClassifyId, ";更新失败", err)
+	}
+	if item.Children != nil {
+		for _, v := range item.Children {
+			updateChartPath(v, classifyNamePath, classifyIdPath)
+		}
+	}
+}
+
 // initEs
 // @Description: 修复ES中的指标和图表数据
 // @author: Roc

+ 100 - 19
models/data_manage/chart_classify.go

@@ -8,21 +8,23 @@ import (
 )
 
 type ChartClassify struct {
-	ChartClassifyId     int       `orm:"column(chart_classify_id);pk" gorm:"primaryKey" `
-	ChartClassifyName   string    `description:"分类名称"`
-	ParentId            int       `description:"父级id"`
-	HasData             int       `description:"是否含有指标数据"`
-	CreateTime          time.Time `description:"创建时间"`
-	ModifyTime          time.Time `description:"修改时间"`
-	SysUserId           int       `description:"创建人id"`
-	SysUserRealName     string    `description:"创建人姓名"`
-	Level               int       `description:"层级"`
-	UniqueCode          string    `description:"唯一编码"`
-	Sort                int       `description:"排序字段,越小越靠前,默认值:10"`
-	Source              int       `description:"1:ETA图库;2:商品价格曲线"`
-	IsJoinPermission    int       `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
-	ChartClassifyNameEn string    `description:"英文分类名称"`
-	RootId              int       `description:"顶级ID"`
+	ChartClassifyId       int       `orm:"column(chart_classify_id);pk" gorm:"primaryKey" `
+	ChartClassifyName     string    `description:"分类名称"`
+	ParentId              int       `description:"父级id"`
+	HasData               int       `description:"是否含有指标数据"`
+	CreateTime            time.Time `description:"创建时间"`
+	ModifyTime            time.Time `description:"修改时间"`
+	SysUserId             int       `description:"创建人id"`
+	SysUserRealName       string    `description:"创建人姓名"`
+	Level                 int       `description:"层级"`
+	UniqueCode            string    `description:"唯一编码"`
+	Sort                  int       `description:"排序字段,越小越靠前,默认值:10"`
+	Source                int       `description:"1:ETA图库;2:商品价格曲线"`
+	IsJoinPermission      int       `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	ChartClassifyNameEn   string    `description:"英文分类名称"`
+	RootId                int       `description:"顶级ID"`
+	ChartClassifyNamePath string    `description:"分类名称的完整路径,格式为:父级分类名称|当前分类名称"`
+	ChartClassifyIdPath   string    `description:"分类的完整路径,格式为:父级ID,当前ID"`
 }
 
 func AddChartClassify(item *ChartClassify) (lastId int64, err error) {
@@ -102,9 +104,13 @@ type DeleteChartClassifyReq struct {
 
 // GetChartClassifyByParentId
 // @param source int 1:ETA图库;2:商品价格曲线;3:相关性图表
-func GetChartClassifyByParentId(parentId, source int) (items []*ChartClassifyItems, err error) {
+func GetChartClassifyByParentId(parentId, source, sysUserId int) (items []*ChartClassifyItems, err error) {
 	o := global.DmSQL["data"]
-	sql := ` SELECT * FROM chart_classify WHERE parent_id=? AND source = ? order by sort asc,chart_classify_id asc`
+	sql := ` SELECT * FROM chart_classify WHERE parent_id=? AND source = ? `
+	if sysUserId > 0 {
+		sql += fmt.Sprintf(` AND sys_user_id = %d `, sysUserId)
+	}
+	sql += `  order by sort asc,chart_classify_id asc `
 	err = o.Raw(sql, parentId, source).Scan(&items).Error
 
 	return
@@ -112,14 +118,42 @@ func GetChartClassifyByParentId(parentId, source int) (items []*ChartClassifyIte
 
 // GetChartClassifyAll
 // @param source int 1:ETA图库;2:商品价格曲线;3:相关性图表
-func GetChartClassifyAll(source int) (items []*ChartClassifyItems, err error) {
+func GetChartClassifyAll(source, sysUserId int) (items []*ChartClassifyItems, err error) {
 	o := global.DmSQL["data"]
-	sql := ` SELECT * FROM chart_classify WHERE parent_id<>0 AND source = ? order by sort asc,chart_classify_id asc`
+	sql := ` SELECT * FROM chart_classify WHERE parent_id<>0 AND source = ?`
+	if sysUserId > 0 {
+		sql += fmt.Sprintf(` AND sys_user_id = %d `, sysUserId)
+	}
+	sql += ` order by sort asc,chart_classify_id asc `
 	err = o.Raw(sql, source).Scan(&items).Error
 
 	return
 }
 
+// GetAllChartClassify
+// @Description: 获取所有类型的图表分类
+// @author: Roc
+// @datetime 2024-12-09 10:11:46
+// @return items []*ChartClassifyItems
+// @return err error
+func GetAllChartClassify() (items []*ChartClassifyItems, err error) {
+	o := global.DmSQL["data"]
+	sql := ` SELECT * FROM chart_classify order by sort asc,chart_classify_id asc`
+	err = o.Raw(sql).Scan(&items).Error
+
+	return
+}
+
+// GetChartClassifyByParentId
+// @param source int 1:ETA图库;2:商品价格曲线;3:相关性图表
+func GetAllChartClassifyByParentId(parentId int) (items []*ChartClassifyItems, err error) {
+	o := global.DmSQL["data"]
+	sql := ` SELECT * FROM chart_classify WHERE parent_id=?  order by sort asc,chart_classify_id asc`
+	err = o.Raw(sql, parentId).Scan(&items).Error
+
+	return
+}
+
 type ChartClassifyItems struct {
 	ChartClassifyId     int `description:"分类id"`
 	ChartInfoId         int `description:"指标id"`
@@ -144,6 +178,7 @@ type ChartClassifyItems struct {
 	Button              ChartClassifyItemsButton `gorm:"-" description:"按钮权限"`
 	IsJoinPermission    int                      `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
 	HaveOperaAuth       bool                     `description:"是否有数据权限,默认:false"`
+	ChartClassifyIdPath string                   `description:"分类的完整路径,格式为:父级ID,当前ID"`
 }
 
 // ChartClassifyItemsButton 操作按钮
@@ -388,3 +423,49 @@ func DeleteChartClassifyByIds(ids []int) (err error) {
 	err = o.Exec(sql, ids).Error
 	return
 }
+
+// UpdateChartClassify
+// @Description: 更新图表分类的基础信息
+// @author: Roc
+// @datetime 2024-12-09 10:29:51
+// @param classifyId int
+// @param classifyNamePath string
+// @param classifyIdPath string
+// @return err error
+func UpdateChartClassify(classifyId int, classifyNamePath, classifyIdPath string) (err error) {
+	sql := `UPDATE chart_classify SET chart_classify_name_path = ?,chart_classify_id_path = ? WHERE chart_classify_id = ?`
+
+	err = global.DmSQL["data"].Exec(sql, classifyNamePath, classifyIdPath, classifyId).Error
+
+	return
+}
+
+// UpdateClassifyIdByChartInfoId
+// @Description: 根据图表id更新所属分类id
+// @author: Roc
+// @datetime 2024-11-29 17:54:44
+// @param edbInfoId int
+// @param edbClassifyId int
+// @return err error
+func UpdateClassifyIdByChartInfoId(chartInfoId, chartClassifyId int) (err error) {
+	sql := ` UPDATE chart_info SET chart_classify_id = ? WHERE  chart_info_id=? `
+	err = global.DmSQL["data"].Exec(sql, chartClassifyId, chartInfoId).Error
+	return
+}
+
+// DelChartClassifyByIdList
+// @Description: 根据id删除图表分类
+// @author: Roc
+// @datetime 2024-12-02 09:27:26
+// @param idList []int
+// @return err error
+func DelChartClassifyByIdList(idList []int) (err error) {
+	num := len(idList)
+	if num <= 0 {
+		return
+	}
+	sql := `DELETE  FROM chart_classify  WHERE chart_classify_id IN (?) `
+	err = global.DmSQL["data"].Exec(sql, idList).Error
+
+	return
+}

+ 8 - 2
models/data_manage/chart_info.go

@@ -87,7 +87,7 @@ type ChartInfoItem struct {
 
 // GetChartInfoAll 用于分类展示
 // @param source int 1:ETA图库;2:商品价格曲线
-func GetChartInfoAll(sourceList []int) (items []*ChartClassifyItems, err error) {
+func GetChartInfoAll(sourceList []int, sysUserId int) (items []*ChartClassifyItems, err error) {
 	num := len(sourceList)
 	if num <= 0 {
 		return
@@ -96,7 +96,13 @@ func GetChartInfoAll(sourceList []int) (items []*ChartClassifyItems, err error)
 	o := global.DmSQL["data"]
 	sql := ` SELECT chart_info_id,chart_classify_id,chart_name AS chart_classify_name,chart_name_en AS chart_classify_name_en,
              unique_code,sys_user_id,sys_user_real_name,date_type,start_date,end_date,chart_type,calendar,season_start_date,season_end_date,source
-            FROM chart_info WHERE source in (` + utils.GetOrmInReplace(num) + `)  ORDER BY sort asc,chart_info_id ASC `
+            FROM chart_info WHERE source in (` + utils.GetOrmInReplace(num) + `)  `
+
+	if sysUserId > 0 {
+		sql += ` AND sys_user_id = ? `
+	}
+
+	sql += ` ORDER BY sort asc,chart_info_id ASC `
 	err = o.Raw(sql, sourceList).Scan(&items).Error
 
 	return

+ 6 - 0
models/data_manage/edb_info.go

@@ -2130,3 +2130,9 @@ func UpdateClassifyIdByEdbInfoId(edbInfoId, edbClassifyId int) (err error) {
 	err = global.DmSQL["data"].Exec(sql, edbClassifyId, edbInfoId).Error
 	return
 }
+
+// SetEdbInfoImageReq 设置指标图片
+type EsEdbReq struct {
+	KeyWord  string `description:"关键字" form:"KeyWord"`
+	ImageUrl string `description:"指标图片地址" form:"ImageUrl"`
+}

+ 7 - 0
models/data_manage/request/edb_public.go

@@ -13,6 +13,13 @@ type SetEdbPublicReq struct {
 	Description string               `description:"备注"`
 }
 
+// CancelEdbPublicReq
+// @Description: 撤销指标公开的请求
+type CancelEdbPublicReq struct {
+	EdbInfoId   int    `description:"待设置的指标"`
+	Description string `description:"备注"`
+}
+
 type SetEdbPublicEdbReq struct {
 	EdbInfoId  int `description:"指标id列表"`
 	ClassifyId int `description:"公共分类id"`

+ 18 - 0
routers/commentsRouter.go

@@ -3832,6 +3832,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "BatchMoveEdb",
+            Router: `/edb_info/batch_move`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbInfoController"],
         beego.ControllerComments{
             Method: "EdbChartList",
@@ -4435,6 +4444,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbPublicController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbPublicController"],
+        beego.ControllerComments{
+            Method: "Cancel",
+            Router: `/edb_info/public/cancel`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbPublicController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbPublicController"],
         beego.ControllerComments{
             Method: "ListByEs",

+ 59 - 25
services/data/chart_classify.go

@@ -57,6 +57,40 @@ func ChartClassifyItemsMakeTree(sysUser *system.Admin, allNode []*data_manage.Ch
 	}
 }
 
+func ChartClassifyItemsMakeTreeV2(allNode []*data_manage.ChartClassifyItems, node *data_manage.ChartClassifyItems) {
+	//node.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(node.IsJoinPermission, node.ChartClassifyId, permissionClassifyIdList)
+	//button := GetChartClassifyOpButton(sysUser, node.SysUserId, node.HaveOperaAuth)
+	//node.Button = button
+
+	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 //第三级的话,默认图表都是没有添加按钮的
+		//}
+		//child.Button = childButton
+		//node.Children = append(node.Children, child)
+		//}
+		node.Children = append(node.Children, childs[0:]...) //添加子节点
+		for _, v := range childs {
+			//v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ChartClassifyId, permissionClassifyIdList)
+			//查询子节点的子节点,并添加到子节点
+			_, has := chartClassifyHaveChild(allNode, v)
+			if has {
+				ChartClassifyItemsMakeTreeV2(allNode, v) //递归添加节点
+			} else {
+				childrenArr := make([]*data_manage.ChartClassifyItems, 0)
+				v.Children = childrenArr
+			}
+		}
+	} else {
+		childrenArr := make([]*data_manage.ChartClassifyItems, 0)
+		node.Children = childrenArr
+	}
+}
+
 // GetChartClassifyOpButton 获取ETA图库分类的操作权限
 func GetChartClassifyOpButton(sysUser *system.Admin, belongUserId int, haveOperaAuth bool) (button data_manage.ChartClassifyItemsButton) {
 	// 没有数据权限就直接返回
@@ -175,26 +209,26 @@ func AddChartClassify(chartClassifyName string, parentId, level, source int, lan
 	isSendEmail = true
 	errMsg = "保存分类失败"
 
-	// 校验分类名称相同的数量
-	{
-		var count int
-		switch lang {
-		case utils.EnLangVersion:
-			count, err = data_manage.GetChartClassifyEnCount(chartClassifyName, parentId, source)
-		default:
-			count, err = data_manage.GetChartClassifyCount(chartClassifyName, parentId, source)
-		}
-		if err != nil {
-			errMsg = "判断名称是否已存在失败"
-			return
-		}
-		if count > 0 {
-			errMsg = "分类名称已存在,请重新输入"
-			err = errors.New(errMsg)
-			isSendEmail = false
-			return
-		}
-	}
+	// 校验分类名称相同的数量(eta2.3,图表名称允许重复)
+	//{
+	//	var count int
+	//	switch lang {
+	//	case utils.EnLangVersion:
+	//		count, err = data_manage.GetChartClassifyEnCount(chartClassifyName, parentId, source)
+	//	default:
+	//		count, err = data_manage.GetChartClassifyCount(chartClassifyName, parentId, source)
+	//	}
+	//	if err != nil {
+	//		errMsg = "判断名称是否已存在失败"
+	//		return
+	//	}
+	//	if count > 0 {
+	//		errMsg = "分类名称已存在,请重新输入"
+	//		err = errors.New(errMsg)
+	//		isSendEmail = false
+	//		return
+	//	}
+	//}
 
 	if level > 6 {
 		errMsg = `最高只支持添加6级分类`
@@ -236,7 +270,7 @@ func AddChartClassify(chartClassifyName string, parentId, level, source int, lan
 	classifyInfo.SysUserRealName = sysUser.RealName
 	classifyInfo.Level = level + 1
 	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-	classifyInfo.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
+	classifyInfo.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
 	classifyInfo.Sort = maxSort + 1
 	classifyInfo.Source = source
 	classifyInfo.RootId = rootId
@@ -254,10 +288,10 @@ func AddChartClassify(chartClassifyName string, parentId, level, source int, lan
 		}
 	}
 
-	// 目前只有ETA图库需要继承分类权限
-	if classifyInfo.Source == utils.CHART_SOURCE_DEFAULT {
-		go data_manage_permission.InheritParentClassify(5, classifyInfo.Source, classifyInfo.ChartClassifyId, classifyInfo.ParentId, classifyInfo.ChartClassifyName)
-	}
+	//// 目前只有ETA图库需要继承分类权限
+	//if classifyInfo.Source == utils.CHART_SOURCE_DEFAULT {
+	//	go data_manage_permission.InheritParentClassify(5, classifyInfo.Source, classifyInfo.ChartClassifyId, classifyInfo.ParentId, classifyInfo.ChartClassifyName)
+	//}
 
 	return
 }

+ 2 - 2
services/data/data_manage_permission/data_move.go

@@ -296,7 +296,7 @@ func GetMoveEdbChartList(source, subSource, userId int, keyword, classify string
 		}
 
 		// 获取所有的图表分类
-		firstClassifyList, tmpErr := data_manage.GetChartClassifyByParentId(0, 1)
+		firstClassifyList, tmpErr := data_manage.GetChartClassifyByParentId(0, 1, userId)
 		if tmpErr != nil {
 			err = tmpErr
 			return
@@ -307,7 +307,7 @@ func GetMoveEdbChartList(source, subSource, userId int, keyword, classify string
 			firstClassifyNameMap[v.ChartClassifyId] = v.ChartClassifyName
 			firstClassifyNameEnMap[v.ChartClassifyId] = v.ChartClassifyNameEn
 		}
-		secondClassList, tmpErr := data_manage.GetChartClassifyAll(1)
+		secondClassList, tmpErr := data_manage.GetChartClassifyAll(1, userId)
 		if tmpErr != nil {
 			err = tmpErr
 			return

+ 1 - 1
services/edb_info_replace.go

@@ -84,7 +84,7 @@ func DealReplaceEdbCache() {
 func ReplaceEdbInExcel(oldEdbInfo, newEdbInfo *data_manage.EdbInfo) (err error) {
 	defer func() {
 		if err != nil {
-			go alarm_msg.SendAlarmMsg("替换表格中的指标失败提醒,errmsg:"+err.Error(), 3)
+			go alarm_msg.SendAlarmMsg("替换表格中的指标失败提醒,errMsg:"+err.Error(), 3)
 		}
 	}()
 	//查询和指标相关的时间序列表格和混合表格