Explorar o código

Merge branch 'feature/eta_forum3_chart_classify' into debug

# Conflicts:
#	services/data/chart_classify.go
xyxie hai 1 mes
pai
achega
223ed4ad10

+ 122 - 5
controllers/data_manage/chart_classify.go

@@ -8,6 +8,7 @@ import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
 	"eta/eta_api/services/data/data_manage_permission"
+	"eta/eta_api/services/eta_forum"
 	"eta/eta_api/utils"
 	"fmt"
 	"time"
@@ -381,7 +382,7 @@ func (this *ChartClassifyController) AddChartClassify() {
 	}
 
 	// 新增图表分类
-	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, req.ParentId, req.Level, utils.CHART_SOURCE_DEFAULT, this.Lang, this.SysUser)
+	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, req.ParentId, req.Level, utils.CHART_SOURCE_DEFAULT, req.IsSelected, this.Lang, this.SysUser)
 	if err != nil {
 		br.Msg = errMsg
 		br.ErrMsg = "添加分类失败,Err:" + err.Error()
@@ -426,7 +427,7 @@ func (this *ChartClassifyController) EditChartClassify() {
 	}
 
 	// 编辑图表分类
-	_, err, errMsg, isSendEmail := data.EditChartClassifyV2(req.ChartClassifyId, req.ParentId, utils.CHART_SOURCE_DEFAULT, req.ChartClassifyName, this.Lang)
+	classifyInfo, isDeleteForumChart, err, errMsg, isSendEmail := data.EditChartClassifyV2(req.ChartClassifyId, req.ParentId, utils.CHART_SOURCE_DEFAULT, req.ChartClassifyName, req.IsSelected, this.Lang)
 	if err != nil {
 		br.Msg = errMsg
 		br.ErrMsg = "保存分类失败,Err:" + err.Error()
@@ -434,6 +435,11 @@ func (this *ChartClassifyController) EditChartClassify() {
 		return
 	}
 
+	// 移除精选后,删除所有的图表
+	if isDeleteForumChart {
+		go eta_forum.ChartInfoDeleteBatch(classifyInfo, this.SysUser)
+	}
+
 	br.Ret = 200
 	br.Msg = "保存成功"
 	br.Success = true
@@ -1095,7 +1101,7 @@ func (this *ChartClassifyController) ChartClassifyChartListV3() {
 		br.Msg = "参数错误"
 		return
 	}
-
+	
 	// 获取当前账号的不可见指标
 	noPermissionChartIdMap := make(map[int]bool)
 	{
@@ -1111,9 +1117,11 @@ func (this *ChartClassifyController) ChartClassifyChartListV3() {
 		}
 	}
 	var allNodes []*data_manage.ChartClassifyItems
+	// 获取是否精选资源标识
+	isSelected, _ := this.GetInt("IsSelected")
 	isShowMe, _ := this.GetBool("IsShowMe")
 	if isShowMe {
-		allChartInfo, err := data_manage.GetChartClassifyAndInfoByParentIdForMe(chartClassifyId, sysUser.AdminId)
+		allChartInfo, err := data_manage.GetChartClassifyAndInfoByParentIdForMe(chartClassifyId, sysUser.AdminId, isSelected)
 		if err != nil && !utils.IsErrNoRow(err) {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -1136,7 +1144,7 @@ func (this *ChartClassifyController) ChartClassifyChartListV3() {
 		//fmt.Println("source my classify")
 		//return
 	} else {
-		allChartInfo, err := data_manage.GetChartClassifyAndInfoByParentId(chartClassifyId)
+		allChartInfo, err := data_manage.GetChartClassifyAndInfoByParentId(chartClassifyId, isSelected)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -1194,3 +1202,112 @@ func (this *ChartClassifyController) ChartClassifyChartListV3() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// SetChartClassifyResourceStatus
+// @Title 一键从资源库上架/下架
+// @Description 一键从资源库上架/下架
+// @Param   ChartClassifyId   query   bool  true       "图片分类id"
+// @Param   ResourceStatus   query   bool  true       "资源状态"
+// @Success 200 {object} models.BaseResponse
+// @router /chart_classify/resource_status [post]
+func (this *ChartClassifyController) SetChartClassifyResourceStatus() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	chartClassifyId, _ := this.GetInt("ChartClassifyId")
+	if chartClassifyId <= 0 {
+		br.Msg = "参数错误"
+		return
+	}
+	resourceStatus, _ := this.GetInt("ResourceStatus")
+	if resourceStatus <= 0 {
+		br.Msg = "参数错误"
+		return
+	}
+
+	chartClassifyInfo, err := data_manage.GetChartClassifyById(chartClassifyId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
+		return
+	}
+	if resourceStatus == utils.ChartClassifyResourceStatusDown {
+		errMsg, err := eta_forum.SetChartClassifyResourceStatusDown(chartClassifyInfo, this.SysUser)
+		if err != nil {
+			if errMsg != "" {
+				br.Msg = errMsg
+				br.ErrMsg = err.Error()
+				return
+			}
+			br.Msg = "操作失败"
+			br.ErrMsg = err.Error()
+			return
+		}
+	} else if resourceStatus == utils.ChartClassifyResourceStatusUp {
+		errMsg, err := eta_forum.SetChartClassifyResourceStatusUp(chartClassifyInfo, this.SysUser)
+		if err != nil {
+			if errMsg != "" {
+				br.Msg = errMsg
+				br.ErrMsg = err.Error()
+				return
+			}
+			br.Msg = "操作失败"
+			br.ErrMsg = err.Error()
+			return
+		}
+	}
+	
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+
+// 一键更新至资源库
+// @Title 一键更新至资源库
+// @Description 一键更新至资源库
+// @Param   ChartClassifyId   query   bool  true       "图片分类id"
+// @Success 200 {object} models.BaseResponse
+// @router /chart_classify/forum_chart/update [post]
+func (this *ChartClassifyController) UpdateChartClassifyResource() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	chartClassifyId, _ := this.GetInt("ChartClassifyId")
+	if chartClassifyId <= 0 {
+		br.Msg = "参数错误"
+		return
+	}
+	
+	chartClassifyInfo, err := data_manage.GetChartClassifyById(chartClassifyId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
+		return
+	}
+	if chartClassifyInfo.Source != utils.CHART_SOURCE_DEFAULT {
+		br.Msg = "分类来源错误"
+		return
+	}
+	if chartClassifyInfo.IsSelected != utils.ChartClassifyIsSelected {
+		br.Msg = "该分类不是精选分类"
+		return
+	}
+
+	err = eta_forum.ChartInfoSaveBatch(chartClassifyInfo, this.SysUser)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = err.Error()
+		return
+	}
+	
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

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

@@ -263,7 +263,7 @@ func (this *CorrelationChartClassifyController) AddChartClassify() {
 	}
 
 	// 新增图表分类
-	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, req.ParentId, req.Level, utils.CHART_SOURCE_CORRELATION, this.Lang, this.SysUser)
+	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, req.ParentId, req.Level, utils.CHART_SOURCE_CORRELATION, 0,this.Lang, this.SysUser)
 	if err != nil {
 		br.Msg = errMsg
 		br.ErrMsg = "添加分类失败,Err:" + err.Error()

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

@@ -203,7 +203,7 @@ func (this *FutureGoodChartClassifyController) AddChartClassify() {
 	}
 
 	// 新增图表分类
-	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, 0, req.Level, utils.CHART_SOURCE_FUTURE_GOOD, this.Lang, this.SysUser)
+	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, 0, req.Level, utils.CHART_SOURCE_FUTURE_GOOD, 0, this.Lang, this.SysUser)
 	if err != nil {
 		br.Msg = errMsg
 		br.ErrMsg = "添加分类失败,Err:" + err.Error()

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

@@ -208,7 +208,7 @@ func (this *LineEquationChartClassifyController) AddChartClassify() {
 	}
 
 	// 新增图表分类
-	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, req.ParentId, req.Level, utils.CHART_SOURCE_LINE_EQUATION, this.Lang, this.SysUser)
+	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, req.ParentId, req.Level, utils.CHART_SOURCE_LINE_EQUATION, 0, this.Lang, this.SysUser)
 	if err != nil {
 		br.Msg = errMsg
 		br.ErrMsg = "添加分类失败,Err:" + err.Error()

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

@@ -208,7 +208,7 @@ func (this *LineFeaturesChartClassifyController) AddChartClassify() {
 	}
 
 	// 新增图表分类
-	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, req.ParentId, req.Level, utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, this.Lang, this.SysUser)
+	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, req.ParentId, req.Level, utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, 0, this.Lang, this.SysUser)
 	if err != nil {
 		br.Msg = errMsg
 		br.ErrMsg = "添加分类失败,Err:" + err.Error()

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

@@ -262,7 +262,7 @@ func (this *RangeChartClassifyController) AddChartClassify() {
 	}
 
 	// 新增图表分类
-	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, req.ParentId, req.Level, utils.CHART_SOURCE_RANGE_ANALYSIS, this.Lang, this.SysUser)
+	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, req.ParentId, req.Level, utils.CHART_SOURCE_RANGE_ANALYSIS, 0, this.Lang, this.SysUser)
 	if err != nil {
 		br.Msg = errMsg
 		br.ErrMsg = "添加分类失败,Err:" + err.Error()

+ 1 - 1
controllers/trade_analysis/warehouse_classify.go

@@ -219,7 +219,7 @@ func (this *WarehouseClassifyController) AddChartClassify() {
 	}
 
 	// 新增图表分类
-	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, req.ParentId, req.Level, utils.CHART_SOURCE_TRADE_ANALYSIS_PROCESS, this.Lang, this.SysUser)
+	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, req.ParentId, req.Level, utils.CHART_SOURCE_TRADE_ANALYSIS_PROCESS, 0, this.Lang, this.SysUser)
 	if err != nil {
 		br.Msg = errMsg
 		br.ErrMsg = "添加分类失败,Err:" + err.Error()

+ 60 - 9
models/data_manage/chart_classify.go

@@ -40,6 +40,7 @@ type AddChartClassifyReq struct {
 	ChartClassifyName string `description:"分类名称"`
 	ParentId          int    `description:"父级id,第一级传0"`
 	Level             int    `description:"层级,第一级传0,其余传上一级的层级"`
+	IsSelected        int    `description:"是否精选资源,0:否;1:是"`
 }
 
 // GetChartClassifyCount
@@ -80,6 +81,7 @@ type EditChartClassifyReq struct {
 	ChartClassifyName string `description:"分类名称"`
 	ChartClassifyId   int    `description:"分类id"`
 	ParentId          int    `description:"父级分类id"`
+	IsSelected        int    `description:"是否精选资源,0:否;1:是"`
 }
 
 func GetChartClassifyById(classifyId int) (item *ChartClassify, err error) {
@@ -272,6 +274,7 @@ type ChartClassifyItems struct {
 	IsJoinPermission    int                      `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
 	HaveOperaAuth       bool                     `description:"是否有数据权限,默认:false"`
 	Disable             bool                     `description:"勾选是否禁用"`
+	IsSelected          int                      `description:"是否精选资源,0:否;1:是"`
 }
 
 // ChartClassifyItemsButton 操作按钮
@@ -350,6 +353,16 @@ func GetChartClassifyByCondition(condition string, pars []interface{}) (item *Ch
 	return
 }
 
+func GetChartClassifyListByCondition(condition string, pars []interface{}) (items []*ChartClassify, err error) {
+	o := global.DbMap[utils.DbNameIndex]
+	sql := ` SELECT * FROM chart_classify WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars...).Find(&items).Error
+	return
+}
+
 // MoveChartClassifyReq 移动图表分类请求参数
 type MoveChartClassifyReq struct {
 	ClassifyId       int `description:"分类id"`
@@ -563,6 +576,13 @@ func GetChartClassifyAllBySource(source int) (items []*ChartClassifyItems, err e
 	return
 }
 
+// GetChartClassifyInfoSelectedBySource 获取所有的精选目录
+func GetChartClassifyInfoSelectedBySource(source int) (items []*ChartClassify, err error) {
+	sql := ` SELECT * FROM chart_classify WHERE source = ? AND is_selected = ? ORDER BY parent_id ASC, sort ASC, chart_classify_id ASC`
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, source, utils.ChartClassifyIsSelected).Find(&items).Error
+	return
+}
+
 // GetChartClassifyIdListByAdminId
 // @Description: 根据用户id和指标类型获取其关联的所有指标分类id列表
 // @author: Roc
@@ -582,7 +602,11 @@ func GetChartClassifyIdListByAdminId(adminId, source int) (chartClassifyIdList [
 }
 
 // GetChartClassifyAndInfoByParentId
-func GetChartClassifyAndInfoByParentId(parentId int) (items []*ChartClassifyItems, err error) {
+func GetChartClassifyAndInfoByParentId(parentId int, isSelected int) (items []*ChartClassifyItems, err error) {
+	where := ""
+	if isSelected == utils.ChartClassifyIsSelected {
+		where = " AND is_selected = 1"
+	}
 	sql := ` SELECT
 	0 AS chart_info_id,
 	chart_classify_id,
@@ -603,11 +627,12 @@ func GetChartClassifyAndInfoByParentId(parentId int) (items []*ChartClassifyItem
 	0 as chart_type,
 	'' as calendar,
 	'' as season_start_date,
-	'' as season_end_date
+	'' as season_end_date,
+	is_selected
 FROM
 	chart_classify 
 WHERE
-	parent_id = ? and source = 1 UNION ALL
+	parent_id = ? and source = 1` + where + ` UNION ALL
 SELECT
 	chart_info_id,
 	chart_classify_id,
@@ -628,7 +653,8 @@ SELECT
 	chart_type,
 	calendar,
 	season_start_date,
-	season_end_date
+	season_end_date,
+	0 as is_selected
 FROM
 	chart_info 
 WHERE
@@ -641,7 +667,11 @@ ORDER BY
 }
 
 // GetChartClassifyAndInfoByParentId
-func GetChartClassifyAndInfoByParentIdForMe(parentId, adminId int) (items []*ChartClassifyItems, err error) {
+func GetChartClassifyAndInfoByParentIdForMe(parentId, adminId, isSelected int) (items []*ChartClassifyItems, err error) {
+	where := ""
+	if isSelected == utils.ChartClassifyIsSelected {
+		where = " AND is_selected = 1"
+	}
 	sql := ` SELECT
 	0 AS chart_info_id,
 	chart_classify_id,
@@ -654,11 +684,12 @@ func GetChartClassifyAndInfoByParentIdForMe(parentId, adminId int) (items []*Cha
 	sys_user_real_name,
 	sort,
 	level,
-	unique_code
+	unique_code,
+	is_selected
 FROM
 	chart_classify 
 WHERE
-	parent_id = ? and source = 1 UNION ALL
+	parent_id = ? and source = 1` + where + ` UNION ALL
 SELECT
 	chart_info_id,
 	chart_classify_id,
@@ -671,7 +702,8 @@ SELECT
 	sys_user_real_name,
 	sort,
 	0 AS level,
-	unique_code
+	unique_code,
+	0 as is_selected
 FROM
 	chart_info 
 WHERE
@@ -679,7 +711,7 @@ WHERE
 ORDER BY
 	sort ASC,
 	chart_classify_id ASC`
-	err = global.DbMap[utils.DbNameIndex].Raw(sql, parentId, parentId, adminId).Find(&items).Error
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, parentId, parentId, adminId, isSelected).Find(&items).Error
 	return
 }
 
@@ -703,3 +735,22 @@ func GetChartClassifyByLevelPath(levelPath string) (items []*ChartClassify, err
 	err = global.DbMap[utils.DbNameIndex].Raw(sql).Find(&items).Error
 	return
 }
+
+func UpdateChartClassifyIsSelected(source int, isSelected int, levelPath string) (err error) {
+	sql := `UPDATE chart_classify SET is_selected = ? WHERE source = ? AND level_path LIKE '` + levelPath + `%'`
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, isSelected, source).Error
+	return
+}
+
+func UpdateChartClassifyResourceStatus(source int, resourceStatus int, levelPath string) (err error) {
+	sql := `UPDATE chart_classify SET resource_status = ? WHERE source = ? AND level_path LIKE '` + levelPath + `%'`
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, resourceStatus, source).Error
+	return
+}
+
+// 查询存在已经上架的图表的分类
+func GetChartClassifyHasUpChartBySource(source int, levelPath string) (count int, err error) {
+	sql := `SELECT count(1) FROM chart_info WHERE source = ? AND resource_status = ? and chart_classify_id in (SELECT chart_classify_id FROM chart_classify WHERE level_path like '` + levelPath + `%')`
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, source, utils.ChartClassifyResourceStatusUp).Scan(&count).Error
+	return
+}

+ 5 - 3
models/data_manage/chart_info.go

@@ -62,6 +62,7 @@ type ChartInfo struct {
 	ForumChartInfoId  int    `description:"社区的图表ID"`
 	ChartAlias        string `description:"图表别名"`
 	DateTypeNum       int    `description:"date_type=25(N月前)时的N值,其他N值可复用此字段"`
+	ResourceStatus    int    `description:"资源状态,0默认, 1上架,2下架"`
 }
 
 // AreaExtraConf 面积图配置
@@ -378,14 +379,15 @@ func ModifyChartInfo(item *EditChartInfoReq) (err error) {
 	err = o.Exec(sql, item.ChartName, item.ChartClassifyId, item.ChartInfoId).Error
 	return
 }
-func SetForumChartInfoId(chartInfoId, forumChartInfoId int) (err error) {
+func SetForumChartInfoId(chartInfoId, forumChartInfoId int, resourceStatus int) (err error) {
 	o := global.DbMap[utils.DbNameIndex]
 	sql := ` UPDATE  chart_info
 			SET
               forum_chart_info_id=?,
-			  modify_time = NOW()
+			  modify_time = NOW(),
+			  resource_status = ?
 			WHERE chart_info_id = ?`
-	err = o.Exec(sql, forumChartInfoId, chartInfoId).Error
+	err = o.Exec(sql, forumChartInfoId, resourceStatus, chartInfoId).Error
 	return
 }
 

+ 18 - 0
routers/commentsRouter.go

@@ -3373,6 +3373,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: "UpdateChartClassifyResource",
+            Router: `/chart_classify/forum_chart/update`,
+            AllowHTTPMethods: []string{"post"},
+            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: "ChartClassifyItems",
@@ -3400,6 +3409,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: "SetChartClassifyResourceStatus",
+            Router: `/chart_classify/resource_status`,
+            AllowHTTPMethods: []string{"post"},
+            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: "AddManualClassify",

+ 81 - 7
services/data/chart_classify.go

@@ -5,6 +5,7 @@ import (
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data/data_manage_permission"
+	"eta/eta_api/services/eta_forum"
 	"eta/eta_api/utils"
 	"fmt"
 	"strconv"
@@ -270,7 +271,7 @@ func HandleNoPermissionChart(allNodes []*data_manage.ChartClassifyItems, noPermi
 // @return err error
 // @return errMsg string
 // @return isSendEmail bool
-func AddChartClassify(chartClassifyName string, parentId, level, source int, lang string, sysUser *system.Admin) (classifyInfo *data_manage.ChartClassify, err error, errMsg string, isSendEmail bool) {
+func AddChartClassify(chartClassifyName string, parentId, level, source int, isSelected int, lang string, sysUser *system.Admin) (classifyInfo *data_manage.ChartClassify, err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true
 	errMsg = "保存分类失败"
 
@@ -324,6 +325,7 @@ func AddChartClassify(chartClassifyName string, parentId, level, source int, lan
 		}
 		rootId = parentClassify.RootId
 		levelPath = parentClassify.LevelPath
+		isSelected = parentClassify.IsSelected
 	}
 
 	classifyInfo = new(data_manage.ChartClassify)
@@ -341,7 +343,7 @@ func AddChartClassify(chartClassifyName string, parentId, level, source int, lan
 	classifyInfo.Sort = maxSort + 1
 	classifyInfo.Source = source
 	classifyInfo.RootId = rootId
-
+	classifyInfo.IsSelected = isSelected
 	newId, err := data_manage.AddChartClassify(classifyInfo)
 	if err != nil {
 		return
@@ -366,6 +368,9 @@ 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)
+		if isSelected == utils.ChartClassifyIsSelected { // 如果分类设置为精选资源,则需要同步到ETA资源库
+			go eta_forum.ChartClassifySave(classifyInfo.ChartClassifyId)
+		}
 	}
 
 	return
@@ -634,6 +639,7 @@ func moveChartClassify(parentChartClassifyInfo, chartClassifyInfo, prevClassify,
 		oldParentId := chartClassifyInfo.ParentId
 		oldLevelPath := chartClassifyInfo.LevelPath
 		oldLevel := chartClassifyInfo.Level
+		oldSelected := chartClassifyInfo.IsSelected
 		var classifyIds []int
 		if oldParentId != parentClassifyId {
 			//更新子分类对应的level
@@ -800,6 +806,14 @@ func moveChartClassify(parentChartClassifyInfo, chartClassifyInfo, prevClassify,
 					return
 				}
 			}
+			if source == utils.CHART_SOURCE_DEFAULT {
+				if err = updateChildClassifySelection(chartClassifyInfo, parentChartClassifyInfo, oldSelected); err != nil {
+					errMsg = "移动失败"
+					err = errors.New("更新子目录精选标识失败,Err:" + err.Error())
+					return
+				}
+				go eta_forum.ChartClassifySaveBatch(chartClassifyInfo.Source)
+			}
 		}
 	} else {
 		if chartInfo == nil {
@@ -1044,8 +1058,35 @@ func GetChartClassifyParentRecursive(list []*data_manage.ChartClassifyItems, cla
 	return res
 }
 
+// 新增处理子分类精选状态的函数
+func updateChildClassifySelection(classifyInfo *data_manage.ChartClassify, parentClassifyInfo *data_manage.ChartClassify, oldSelected int) error {
+	// 处理一级目录
+	if classifyInfo.ParentId == 0 {
+		if oldSelected != classifyInfo.IsSelected {
+			return data_manage.UpdateChartClassifyIsSelected(
+				classifyInfo.Source,
+				classifyInfo.IsSelected,
+				classifyInfo.LevelPath,
+			)
+		}
+		return nil
+	}else {
+		// 处理二级及以上目录
+		if classifyInfo.IsSelected != parentClassifyInfo.IsSelected {
+			return data_manage.UpdateChartClassifyIsSelected(
+				classifyInfo.Source,
+				parentClassifyInfo.IsSelected,
+				classifyInfo.LevelPath,
+			)
+		}
+	}
+
+	
+	return nil
+}
+
 // 修改图表分类,可以修改父级
-func EditChartClassifyV2(chartClassifyId, parentId, source int, chartClassifyName, lang string) (classifyInfo *data_manage.ChartClassify, err error, errMsg string, isSendEmail bool) {
+func EditChartClassifyV2(chartClassifyId, parentId, source int, chartClassifyName string, isSelected int, lang string) (classifyInfo *data_manage.ChartClassify, isDeleteForumChart bool, err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true
 	errMsg = "保存失败"
 
@@ -1054,18 +1095,37 @@ func EditChartClassifyV2(chartClassifyId, parentId, source int, chartClassifyNam
 	if err != nil {
 		return
 	}
+	oldSelected := classifyInfo.IsSelected
 	var parentClassifyInfo *data_manage.ChartClassify
+	parentClassifyInfo, err= data_manage.GetChartClassifyById(parentId)
+	if err != nil {
+		return
+	}
 	if parentId != classifyInfo.ParentId {
-		parentClassifyInfo, err= data_manage.GetChartClassifyById(parentId)
-		if err != nil {
-			return
-		}
 		if classifyInfo.Level != parentClassifyInfo.Level + 1 {
 			err = errors.New("父级分类层级异常")
 			return
 		}
 	}
 
+	// 判断取消精选的情况
+	if classifyInfo.Source == utils.CHART_SOURCE_DEFAULT && parentId == 0 && oldSelected == 1 && isSelected == 0 {
+		// 取消精选,如果存在已经上架的分类,则提示用户下架所有的分类
+		count, e := data_manage.GetChartClassifyHasUpChartBySource(classifyInfo.Source, classifyInfo.LevelPath)
+		if e != nil {
+			errMsg = "查询是否存在已经上架的分类失败"
+			err = fmt.Errorf("查询是否存在已经上架的分类失败,Err:%w", e)
+			isSendEmail = false
+			return
+		}
+		if count > 0 {
+			errMsg = "该分类已经上架的分类,请先下架所有的分类,再取消精选"
+			err = fmt.Errorf("",errMsg)
+			return
+		}
+		isDeleteForumChart = true
+	}
+
 	// 分类来源校验
 	if classifyInfo.Source != source {
 		errMsg = "图表分类异常"
@@ -1083,6 +1143,10 @@ func EditChartClassifyV2(chartClassifyId, parentId, source int, chartClassifyNam
 		classifyInfo.ModifyTime = time.Now()
 		updateCols = append(updateCols, "ParentId")
 	}
+	if isSelected != classifyInfo.IsSelected && classifyInfo.Source == utils.CHART_SOURCE_DEFAULT && classifyInfo.ParentId == 0 {
+		classifyInfo.IsSelected = isSelected
+		updateCols = append(updateCols, "IsSelected")
+	}
 
 	// 语言版本校验
 	switch lang {
@@ -1137,6 +1201,16 @@ func EditChartClassifyV2(chartClassifyId, parentId, source int, chartClassifyNam
 			return
 		}
 	}
+	// 如果是精选目录,则需要同步到ETA资源库
+	if classifyInfo.Source == utils.CHART_SOURCE_DEFAULT {
+		// 如果当前目录的精选标识发生变化,需要同步更新子目录的精选标识
+		if err = updateChildClassifySelection(classifyInfo, parentClassifyInfo, oldSelected); err != nil {
+			errMsg = "修改分类失败"
+			err = fmt.Errorf("更新子目录精选标识失败,Err:%w", err)
+			return
+		}
+		go eta_forum.ChartClassifySaveBatch(classifyInfo.Source)
+	}
 
 	return
 }

+ 1 - 1
services/data/cross_variety/chart.go

@@ -644,7 +644,7 @@ func AddChartInfo(req request.AddChartReq, sysUser *system.Admin, lang string) (
 		// 分类没有,需要创建新的分类,那么err置空
 		err = nil
 
-		_, err, errMsg, isSendEmail = data.AddChartClassify(sysUser.RealName, 0, 1, source, lang, sysUser)
+		_, err, errMsg, isSendEmail = data.AddChartClassify(sysUser.RealName, 0, 1, source, 0, lang, sysUser)
 		if err != nil {
 			return
 		}

+ 80 - 0
services/eta_forum/chart_classify.go

@@ -0,0 +1,80 @@
+package eta_forum
+
+import (
+	"encoding/json"
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/utils"
+	"fmt"
+)
+
+// ChartClassifySave 上传图表分类信息
+func ChartClassifySave(chartClassifyId int) (err error) {
+	if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
+		return
+	}
+	//查询分类信息
+	chartClassifyInfo, err := data_manage.GetChartClassifyById(chartClassifyId)
+	if err != nil {
+		if utils.IsErrNoRow(err) {
+			err = fmt.Errorf("分类不存在")
+			return
+		}
+		err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
+		return
+	}
+	if chartClassifyInfo.IsSelected != utils.ChartClassifyIsSelected {
+		return
+	}
+
+	reqJson, err := json.Marshal(chartClassifyInfo) 
+	if err != nil {
+		err = fmt.Errorf("参数解析异常,Err:" + err.Error())
+		return
+	}
+	respItem, err := ChartClassifySaveLib(string(reqJson))
+	if err != nil {
+		err = fmt.Errorf("上传图表分类信息失败,Err:" + err.Error())
+		return
+	}
+	if respItem.Ret != 200 {
+		err = fmt.Errorf("上传图表分类信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
+		return
+	}
+	return
+}
+
+type ChartClassifySaveBatchReq struct {
+	List []*data_manage.ChartClassify
+}
+
+//批量上传图表分类信息
+func ChartClassifySaveBatch(source int) (err error) {
+	if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
+		return
+	}
+
+	//查询分类信息
+	chartClassifyList, err := data_manage.GetChartClassifyInfoSelectedBySource(source)
+	if err != nil {
+		err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
+		return
+	}
+	req := ChartClassifySaveBatchReq{
+		List: chartClassifyList,
+	}
+	reqJson, err := json.Marshal(req)
+	if err != nil {
+		err = fmt.Errorf("参数解析异常,Err:" + err.Error())
+		return
+	}
+	respItem, err := ChartClassifySaveBatchLib(string(reqJson))
+	if err != nil {
+		err = fmt.Errorf("上传图表分类信息失败,Err:" + err.Error())
+		return
+	}	
+	if respItem.Ret != 200 {
+		err = fmt.Errorf("上传图表分类信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
+		return
+	}
+	return
+}

+ 307 - 2
services/eta_forum/eta_forum_hub.go

@@ -8,6 +8,8 @@ import (
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/utils"
 	"fmt"
+	"strconv"
+	"time"
 )
 
 type UploadChartToForumReq struct {
@@ -161,7 +163,7 @@ func UploadChart(chartInfoId int, description string, uploaderInfo *system.Admin
 
 	if respItem.Data != nil && respItem.Data.ChartInfoId != 0 {
 		// 更新社区返回的图表ID
-		err = data_manage.SetForumChartInfoId(chartInfoId, respItem.Data.ChartInfoId)
+		err = data_manage.SetForumChartInfoId(chartInfoId, respItem.Data.ChartInfoId, utils.ChartClassifyResourceStatusUp)
 		if err != nil {
 			errMsg = "更新图表ID失败"
 			err = fmt.Errorf("更新图表ID失败,Err:" + err.Error())
@@ -438,7 +440,7 @@ func DeleteChart(chartInfoId int) (err error, errMsg string) {
 	}
 
 	// 更新社区返回的图表ID
-	err = data_manage.SetForumChartInfoId(chartInfoId, 0)
+	err = data_manage.SetForumChartInfoId(chartInfoId, 0, utils.ChartClassifyResourceStatusDown)
 	if err != nil {
 		errMsg = "撤回失败"
 		err = fmt.Errorf("更新图表ID失败,Err:" + err.Error())
@@ -570,3 +572,306 @@ func ChartThemeTypeSave(theme *chart_theme.ChartThemeType) (err error) {
 	}
 	return
 }
+
+// ChartBatchUpdate 批量更新图表信息
+func ChartBatchUpdate(chartClassifyId int) (err error) {
+	if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
+		return
+	}
+	var tmpErr []error
+	deleteCache := true
+	cacheKey := "eta_forum_task:EtaForumChartUpdateByClassifyId:" + strconv.Itoa(chartClassifyId)
+	defer func() {
+		if deleteCache {
+			_ = utils.Rc.Delete(cacheKey)
+		}
+		stack := ""
+		if err != nil {
+			stack = fmt.Sprintln(stack + err.Error())
+		}
+		if len(tmpErr) > 0 {
+			for _, v := range tmpErr {
+				stack = fmt.Sprintln(stack + v.Error())
+			}
+		}
+		if stack != "" {
+			utils.FileLog.Error("批量更新资源库图表信息失败"+"<br/>"+stack)
+			go alarm_msg.SendAlarmMsg("批量更新资源库图表信息失败"+"<br/>"+stack, 3)
+		}
+	}()
+	if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
+		deleteCache = false
+		err = fmt.Errorf("系统处理中,请稍后重试!")
+		return
+	}
+	// 获取当前分类以及子分类下的所有图表ID
+	chartClassifyInfo, err := data_manage.GetChartClassifyById(chartClassifyId)
+	if err != nil {
+		return
+	}
+	chartClassifyInfoList, err := data_manage.GetChartClassifyByLevelPath(chartClassifyInfo.LevelPath)
+	if err != nil {
+		return
+	}
+	chartClassifyIdList := make([]string, 0)
+	for _, v := range chartClassifyInfoList {
+		chartClassifyIdList = append(chartClassifyIdList, strconv.Itoa(v.ChartClassifyId))
+	}
+	// 设置缓存判断处理中则不更新
+	condition := " and forum_chart_info_id > 0 and source=1 and chart_classify_id in ?"
+	// 查询需要更新的图表信息总数
+	total, err := data_manage.GetChartInfoCountByCondition(condition, []interface{}{chartClassifyIdList})
+	if err != nil {
+		return
+	}
+	if total == 0 {
+		return
+	}
+	// 更新图表数据
+	offset := 0
+	pageSize := 100
+	success := 0
+
+	// 循环更新100个图表数据
+	for i := 0; offset < total; i++ {
+		// 查询需要更新的图表信息
+		chartInfos, e := data_manage.GetChartInfoListByCondition(condition, []interface{}{chartClassifyIdList}, offset, pageSize)
+		if e != nil {
+			err = fmt.Errorf("查询需要更新的图表信息失败: %v", e)
+			return
+		}
+		// 循环更新图表数据
+		for _, chartInfo := range chartInfos {
+			// 更新图表数据
+			er, msg := UpdateChart(chartInfo.ChartInfoId)
+			if er != nil {
+				er = fmt.Errorf("图表ID %d, 更新图表数据失败: %s, %v", chartInfo.ChartInfoId, msg, er)
+				tmpErr = append(tmpErr, er)
+				continue
+			}
+			success += 1
+		}
+
+		offset = (i + 1) * pageSize
+	}
+	fmt.Println("更新图表数据完成, 更新图表数据总数:", success)
+	return
+}
+
+// 批量上传图表分类信息
+func ChartInfoSaveBatch(chartClassifyInfo *data_manage.ChartClassify, sysUser *system.Admin) (err error) {
+	if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
+		return
+	}
+	var tmpErr []error
+	deleteCache := true
+	cacheKey := "eta_forum_task:ChartInfoSaveBatch:" + strconv.Itoa(chartClassifyInfo.ChartClassifyId)
+	defer func() {
+		if deleteCache {
+			_ = utils.Rc.Delete(cacheKey)
+		}
+		stack := ""
+		if err != nil {
+			stack = fmt.Sprintln(stack + err.Error())
+		}
+		if len(tmpErr) > 0 {
+			for _, v := range tmpErr {
+				stack = fmt.Sprintln(stack + v.Error())
+			}
+		}
+		if stack != "" {
+			utils.FileLog.Error("批量上传资源库图表信息失败"+"<br/>"+stack)
+			go alarm_msg.SendAlarmMsg("批量上传资源库图表信息失败"+"<br/>"+stack, 3)
+		}
+	}()
+	if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
+		deleteCache = false
+		err = fmt.Errorf("系统处理中,请稍后重试!")
+		return
+	}
+	classifyCondition := " AND source=? and is_selected=1 and resource_status=1 and level_path like '" + chartClassifyInfo.LevelPath + "%'"
+	var classifyPars []interface{}
+	classifyPars = append(classifyPars, chartClassifyInfo.Source)
+	classifyList, err := data_manage.GetChartClassifyListByCondition(classifyCondition, classifyPars)
+	if err != nil {
+		return
+	}
+	chartClassifyIdList := make([]string, 0)
+	for _, v := range classifyList {
+		chartClassifyIdList = append(chartClassifyIdList, strconv.Itoa(v.ChartClassifyId))
+	}
+	// 批量上传图表信息
+	condition := " and source=1 and chart_classify_id in ?"
+	// 查询需要更新的图表信息总数
+	total, err := data_manage.GetChartInfoCountByCondition(condition, []interface{}{chartClassifyIdList})
+	if err != nil {
+		return
+	}
+	if total == 0 {
+		return
+	}
+
+	// 批量上传图表信息
+	offset := 0
+	pageSize := 100
+	success := 0
+
+	// 循环更新100个图表数据
+	for i := 0; offset < total; i++ {
+		// 查询需要更新的图表信息
+		chartInfos, e := data_manage.GetChartInfoListByCondition(condition, []interface{}{chartClassifyIdList}, offset, pageSize)
+		if e != nil {
+			err = fmt.Errorf("查询需要更新的图表信息失败: %v", e)
+			return
+		}
+		// 循环更新图表数据
+		for _, chartInfo := range chartInfos {
+			var er error
+			var msg string
+			if chartInfo.ForumChartInfoId == 0 {
+				// 更新图表数据
+				er, msg = UploadChart(chartInfo.ChartInfoId, "", sysUser)
+			}else if chartInfo.ForumChartInfoId > 0 {
+				// 更新图表数据
+				er, msg = UpdateChart(chartInfo.ChartInfoId)
+			}
+
+			if er != nil {
+				er = fmt.Errorf("图表ID %d, 更新图表数据失败: %s, %v", chartInfo.ChartInfoId, msg, er)
+				tmpErr = append(tmpErr, er)
+				continue
+			}
+			success += 1
+		}
+
+		offset = (i + 1) * pageSize
+	}
+	fmt.Println("更新图表数据完成, 更新图表数据总数:", success)
+	return
+}
+
+// 批量删除资源库图表信息
+func ChartInfoDeleteBatch(chartClassifyInfo *data_manage.ChartClassify, sysUser *system.Admin) (err error) {
+	if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
+		return
+	}
+	var tmpErr []error
+	deleteCache := true
+	cacheKey := "eta_forum_task:ChartInfoDeleteBatch:" + strconv.Itoa(chartClassifyInfo.ChartClassifyId)
+	defer func() {
+		if deleteCache {
+			_ = utils.Rc.Delete(cacheKey)
+		}
+		stack := ""
+		if err != nil {
+			stack = fmt.Sprintln(stack + err.Error())
+		}
+		if len(tmpErr) > 0 {
+			for _, v := range tmpErr {
+				stack = fmt.Sprintln(stack + v.Error())
+			}
+		}
+		if stack != "" {
+			utils.FileLog.Error("批量删除资源库图表信息失败"+"<br/>"+stack)
+			go alarm_msg.SendAlarmMsg("批量删除资源库图表信息失败"+"<br/>"+stack, 3)
+		}
+	}()
+	if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
+		deleteCache = false
+		err = fmt.Errorf("系统处理中,请稍后重试!")
+		return
+	}
+	// 查询所有子分类
+	chartClassifyInfoList, err := data_manage.GetChartClassifyByLevelPath(chartClassifyInfo.LevelPath)
+	if err != nil {
+		return
+	}
+	chartClassifyIdList := make([]string, 0)
+	for _, v := range chartClassifyInfoList {
+		chartClassifyIdList = append(chartClassifyIdList, strconv.Itoa(v.ChartClassifyId))
+	}
+	// 批量删除图表信息
+	condition := "source=? and chart_classify_id in ?"
+	total, err := data_manage.GetChartInfoCountByCondition(condition, []interface{}{chartClassifyInfo.Source, chartClassifyIdList})
+	if err != nil {
+		return
+	}	
+	if total == 0 {
+		return
+	}
+	
+	offset := 0
+	pageSize := 100
+	success := 0
+
+	// 循环更新100个图表数据
+	for i := 0; offset < total; i++ {
+		// 查询需要更新的图表信息
+		chartInfos, e := data_manage.GetChartInfoListByCondition(condition, []interface{}{chartClassifyInfo.Source, chartClassifyIdList}, offset, pageSize)
+		if e != nil {
+			err = fmt.Errorf("查询需要更新的图表信息失败: %v", e)
+			return
+		}
+		// 循环更新图表数据
+		for _, chartInfo := range chartInfos {
+			// 删除图表数据
+			er, msg := DeleteChart(chartInfo.ChartInfoId)
+			if er != nil {
+				er = fmt.Errorf("图表ID %d, 删除图表数据失败: %s, %v", chartInfo.ChartInfoId, msg, er)
+				tmpErr = append(tmpErr, er)
+				continue
+			}
+			success += 1
+		}
+
+		offset = (i + 1) * pageSize
+	}
+	fmt.Println("删除图表数据完成, 删除图表数据总数:", success)
+	return	
+}
+
+// 修改分类状态,一键上架至资源库
+func SetChartClassifyResourceStatusUp(chartClassifyInfo *data_manage.ChartClassify, sysUser *system.Admin) (errMsg string, err error) {
+	if chartClassifyInfo.ResourceStatus == utils.ChartClassifyResourceStatusUp {
+		errMsg = "分类状态已为已上架, 无需重复操作"
+		err = fmt.Errorf("%s", errMsg)
+		return
+	}
+	// 判断是否是精选资源
+	if chartClassifyInfo.IsSelected != utils.ChartClassifyIsSelected {
+		errMsg = "分类状态已为已上架, 无需重复操作"
+		err = fmt.Errorf("%s", errMsg)
+		return
+	}
+	// 查询分类下的所有图表信息
+	err = data_manage.UpdateChartClassifyResourceStatus(chartClassifyInfo.Source, utils.ChartClassifyResourceStatusUp, chartClassifyInfo.LevelPath)
+	if err != nil {
+		errMsg = "更新分类状态失败"
+		err = fmt.Errorf("更新分类状态失败,Err:%w", err)
+		return
+	}
+
+	go ChartInfoSaveBatch(chartClassifyInfo, sysUser)
+	
+	return
+}
+
+// 修改分类,一键从资源库下架
+func SetChartClassifyResourceStatusDown(chartClassifyInfo *data_manage.ChartClassify, sysUser *system.Admin) (errMsg string, err error) {
+	if chartClassifyInfo.ResourceStatus == utils.ChartClassifyResourceStatusDown {
+		errMsg = "分类状态已为已下架, 无需重复操作"
+		err = fmt.Errorf("%s", errMsg)
+		return
+	}
+	// 查询分类下的所有图表信息
+	err = data_manage.UpdateChartClassifyResourceStatus(chartClassifyInfo.Source, utils.ChartClassifyResourceStatusDown, chartClassifyInfo.LevelPath)
+	if err != nil {
+		errMsg = "更新分类状态失败"
+		err = fmt.Errorf("更新分类状态失败,Err:%w", err)
+		return
+	}
+
+	go ChartInfoDeleteBatch(chartClassifyInfo, sysUser)
+	
+	return
+}

+ 20 - 1
services/eta_forum/eta_forum_hub_lib.go

@@ -189,7 +189,26 @@ func GroupDeleteLib(req string) (resp *models.BaseResponse, err error) {
 	return
 }
 
-// post
+// ChartClassifySaveLib 上传图表分类信息
+func ChartClassifySaveLib(req string) (resp *models.BaseResponse, err error) {
+	_, resultByte, err := post(req, "/v1/chart_classify/save")
+	err = json.Unmarshal(resultByte, &resp)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// ChartClassifySaveBatchLib 批量上传图表分类信息
+func ChartClassifySaveBatchLib(req string) (resp *models.BaseResponse, err error) {
+	_, resultByte, err := post(req, "/v1/chart_classify/batch_save")
+	err = json.Unmarshal(resultByte, &resp)
+	if err != nil {
+		return
+	}
+	return
+}
+
 func post(paramStr string, urlStr string) (resp *models.BaseResponse, result []byte, err error) {
 	if utils.ETA_FORUM_HUB_URL == "" {
 		err = fmt.Errorf("ETA社区桥接服务地址为空")

+ 8 - 0
utils/constants.go

@@ -574,3 +574,11 @@ const (
 	DbNameAI          = "eta_ai"
 	DbNameWeekly      = "weekly_report"
 )
+
+// 图表分类设置精选资源分类
+const (
+	ChartClassifyIsSelected = 1 // 图表分类设置精选资源分类
+	ChartClassifyResourceStatusUp = 1 // 图表分类上架状态
+	ChartClassifyResourceStatusDown = 2 // 图表分类下架状态
+	ChartClassifyResourceStatusDefault = 0 // 图表分类默认状态
+)