Przeglądaj źródła

Merge branch 'feature/eta1.6.7_permission' of eta_server/eta_api into master

xyxie 1 rok temu
rodzic
commit
24d5946c25

+ 268 - 0
controllers/chart_permission.go

@@ -0,0 +1,268 @@
+package controllers
+
+import (
+	"encoding/json"
+	"eta/eta_api/models"
+	"eta/eta_api/services"
+	"eta/eta_api/utils"
+)
+
+// ChartPermissionController 品种列表
+type ChartPermissionController struct {
+	BaseAuthController
+}
+
+// List
+// @Title 品种列表
+// @Description 品种列表
+// @Param   Keyword  query  string  false  "关键词"
+// @Success 200 Ret=200 操作成功
+// @router /list [get]
+func (this *ChartPermissionController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	cond := ` and product_id=1`
+	pars := make([]interface{}, 0)
+	list, e := services.GetChartPermissionList(cond, pars)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取品种列表失败, Err: " + e.Error()
+		return
+	}
+
+	// 品种树
+	resp := make([]*models.ChartPermissionItem, 0)
+	childMap := make(map[int][]*models.ChartPermissionItem)
+
+	for _, v := range list {
+		t := new(models.ChartPermissionItem)
+		t.PermissionId = v.ChartPermissionId
+		t.PermissionName = v.PermissionName
+		t.ParentId = v.ParentId
+		t.IsPublic = v.IsPublic
+		t.Enabled = v.Enabled
+		t.Sort = v.Sort
+		t.CreateTime = v.CreatedTime.Format(utils.FormatDateTime)
+		t.Child = make([]*models.ChartPermissionItem, 0)
+		if v.ParentId == 0 {
+			resp = append(resp, t)
+			continue
+		}
+		if v.ParentId > 0 {
+			if childMap[v.ParentId] == nil {
+				childMap[v.ParentId] = make([]*models.ChartPermissionItem, 0)
+			}
+			childMap[v.ParentId] = append(childMap[v.ParentId], t)
+		}
+	}
+	for _, r := range resp {
+		r.Child = childMap[r.PermissionId]
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// Add
+// @Title 新增品种列表
+// @Description 新增品种列表
+// @Param  request body models.PermissionAddReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /add [post]
+func (this *ChartPermissionController) Add() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req models.PermissionAddReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if req.PermissionName == "" {
+		br.Msg = "请输入品种名称"
+		return
+	}
+	e, msg := services.AddChartPermission(req)
+	if e != nil {
+		br.Msg = msg
+		br.ErrMsg = "新增品种失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// Edit
+// @Title 编辑品种
+// @Description 编辑品种
+// @Param	request	body models.PermissionEditReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /edit [post]
+func (this *ChartPermissionController) Edit() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req models.PermissionEditReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if req.PermissionId <= 0 {
+		br.Msg = "请选择要编辑的品种"
+		return
+	}
+
+	if req.PermissionName == "" {
+		br.Msg = "请输入品种名称"
+		return
+	}
+
+	e, msg := services.EditChartPermission(req)
+	if e != nil {
+		br.Msg = msg
+		br.ErrMsg = "编辑品种失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// Move
+// @Title 移动品种
+// @Description 移动品种
+// @Param	request	body models.PermissionMoveReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /move [post]
+func (this *ChartPermissionController) Move() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req models.PermissionMoveReq
+	// todo 限制修改一级品种
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+
+	if req.PermissionId == 0 {
+		br.Msg = "请选择要移动的品种"
+		return
+	}
+	e, msg := services.MoveChartPermission(req)
+	if e != nil {
+		br.Msg = msg
+		br.ErrMsg = "移动品种失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// SetEnabled
+// @Title 启用/禁用品种
+// @Description 启用/禁用品种
+// @Param	request	body models.PermissionEnabledReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /enabled/set [post]
+func (this *ChartPermissionController) SetEnabled() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req models.PermissionEnabledReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if req.PermissionId <= 0 {
+		br.Msg = "请选择要编辑的品种"
+		return
+	}
+	if req.Enabled != 0 && req.Enabled != 1 {
+		br.Msg = "请选择正确的启用禁用状态"
+		return
+	}
+
+	e, msg := services.SetEnabledChartPermission(req)
+	if e != nil {
+		br.Msg = msg
+		br.ErrMsg = "编辑品种失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 212 - 81
controllers/classify.go

@@ -4,11 +4,9 @@ import (
 	"encoding/json"
 	"eta/eta_api/models"
 	"eta/eta_api/models/report_approve"
-	"eta/eta_api/models/system"
 	"eta/eta_api/services"
 	"eta/eta_api/utils"
 	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"time"
 )
 
@@ -37,7 +35,7 @@ func (this *ClassifyController) Add() {
 	}
 
 	// 获取系统菜单, 如果没有对应的字段的特殊处理项, 则忽略必填
-	menus, e := system.GetSysMenuItemsByCondition(` AND hidden = 0`, make([]interface{}, 0), []string{}, ``)
+	/*menus, e := system.GetSysMenuItemsByCondition(` AND hidden = 0`, make([]interface{}, 0), []string{}, ``)
 	if e != nil {
 		br.Msg = "保存失败"
 		br.ErrMsg = "获取菜单列表失败, Err: " + e.Error()
@@ -48,13 +46,13 @@ func (this *ClassifyController) Add() {
 		if m.ButtonCode != "" {
 			menuMap[m.ButtonCode] = true
 		}
-	}
+	}*/
 
 	if req.ClassifyName == "" {
 		br.Msg = "分类名称不可为空"
 		return
 	}
-	if menuMap[system.MenuSpecialHandleClassifyShowType] && req.ParentId != 0 && req.ShowType == 0 {
+	/*if menuMap[system.MenuSpecialHandleClassifyShowType] && req.ParentId != 0 && req.ShowType == 0 {
 		br.Msg = "展示类型不可为空"
 		return
 	}
@@ -65,7 +63,7 @@ func (this *ClassifyController) Add() {
 	if menuMap[system.MenuSpecialHandleClassifyReportImgs] && (req.ShowType == 1 || req.ShowType == 3) && req.YbRightBanner == "" && req.ParentId == 0 { //当一级报告分类为列表、品种时,增加“报告合集配图”的配置项
 		br.Msg = "报告合集配图不可为空"
 		return
-	}
+	}*/
 
 	item, err := models.GetClassifyByName(req.ClassifyName, req.ParentId)
 	if err != nil && err.Error() != utils.ErrNoRow() {
@@ -77,13 +75,25 @@ func (this *ClassifyController) Add() {
 		br.Msg = "分类名称:" + req.ClassifyName + "已存在"
 		return
 	}
+
 	nowTime := time.Now().Local()
 	classify := new(models.Classify)
+
+	maxSort, e := classify.GetMaxSort()
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "查询品种排序失败, Err: " + e.Error()
+		return
+	}
 	classify.ClassifyName = req.ClassifyName
 	classify.ParentId = req.ParentId
 	classify.CreateTime = nowTime
 	classify.ModifyTime = nowTime
-	classify.Abstract = req.Abstract
+	classify.Sort = maxSort + 1
+	classify.Enabled = 1
+	classify.ShowType = 1 //默认列表格式
+	classify.IsShow = 1
+	/*classify.Abstract = req.Abstract
 	classify.Descript = req.Descript
 	classify.Abstract = req.Abstract
 	classify.Descript = req.Descript
@@ -98,7 +108,7 @@ func (this *ClassifyController) Add() {
 	classify.ShowType = req.ShowType
 	classify.HasTeleconference = req.HasTeleconference
 	classify.VipTitle = req.VipTitle
-	classify.Sort = req.Sort
+
 	classify.IsShow = req.IsShow
 	classify.YbFiccSort = req.YbFiccSort
 	classify.YbFiccIcon = req.YbFiccIcon
@@ -156,7 +166,7 @@ func (this *ClassifyController) Add() {
 				return
 			}
 		}
-	}
+	}*/
 	err = models.AddClassify(classify)
 	if err != nil {
 		br.Msg = "新增失败"
@@ -165,7 +175,7 @@ func (this *ClassifyController) Add() {
 	}
 
 	// 一级分类-新增子目录
-	if classify.ParentId == 0 && len(req.MenuList) > 0 {
+	/*if classify.ParentId == 0 && len(req.MenuList) > 0 {
 		menus := make([]*models.ClassifyMenu, 0)
 		for i := range req.MenuList {
 			menus = append(menus, &models.ClassifyMenu{
@@ -190,6 +200,18 @@ func (this *ClassifyController) Add() {
 			br.ErrMsg = "新增子目录关联失败, Err:" + e.Error()
 			return
 		}
+	}*/
+	//获取报告分类权限列表
+	if classify.ParentId > 0 { //二级分类才能修改权限
+		err = models.EditChartPermissionSearchKeyWordMappingMulti(req.ClassifyName, req.ChartPermissionIdList)
+		if err != nil {
+			br.Msg = "修改分类权限失败"
+			br.ErrMsg = "修改分类权限失败,Err:" + err.Error()
+			return
+		}
+		go func() {
+			_ = services.EditClassifyChartPermissionSync(req.ClassifyName)
+		}()
 	}
 
 	// 新增关联了电话会的二级分类时, 同步FICC活动分类
@@ -386,7 +408,7 @@ func (this *ClassifyController) Edit() {
 	}
 
 	// 获取系统菜单, 如果没有对应的字段的特殊处理项, 则忽略必填
-	menus, e := system.GetSysMenuItemsByCondition(` AND hidden = 0`, make([]interface{}, 0), []string{}, ``)
+	/*menus, e := system.GetSysMenuItemsByCondition(` AND hidden = 0`, make([]interface{}, 0), []string{}, ``)
 	if e != nil {
 		br.Msg = "保存失败"
 		br.ErrMsg = "获取菜单列表失败, Err: " + e.Error()
@@ -397,7 +419,7 @@ func (this *ClassifyController) Edit() {
 		if m.ButtonCode != "" {
 			menuMap[m.ButtonCode] = true
 		}
-	}
+	}*/
 
 	if req.ClassifyId <= 0 {
 		br.Msg = "参数错误"
@@ -407,7 +429,7 @@ func (this *ClassifyController) Edit() {
 		br.Msg = "分类名称不可为空"
 		return
 	}
-	if menuMap[system.MenuSpecialHandleClassifyShowType] && req.ParentId != 0 && req.ShowType == 0 {
+	/*if menuMap[system.MenuSpecialHandleClassifyShowType] && req.ParentId != 0 && req.ShowType == 0 {
 		br.Msg = "展示类型不可为空"
 		return
 	}
@@ -418,7 +440,7 @@ func (this *ClassifyController) Edit() {
 	if menuMap[system.MenuSpecialHandleClassifyReportImgs] && (req.ShowType == 1 || req.ShowType == 3) && req.YbRightBanner == "" && req.ParentId == 0 { //当一级报告分类为列表、品种时,增加“报告合集配图”的配置项
 		br.Msg = "报告合集配图不可为空"
 		return
-	}
+	}*/
 
 	item, err := models.GetClassifyById(req.ClassifyId)
 	if err != nil {
@@ -446,59 +468,78 @@ func (this *ClassifyController) Edit() {
 		br.Msg = "分类名称:" + req.ClassifyName + "已存在"
 		return
 	}
-
 	item.ClassifyName = req.ClassifyName
-	item.Abstract = req.Abstract
 	item.ParentId = req.ParentId
-	item.Descript = req.Descript
-	item.ReportAuthor = req.ReportAuthor
-	item.AuthorDescript = req.AuthorDescript
-	item.ColumnImgUrl = req.ColumnImgUrl
-	item.HeadImgUrl = req.HeadImgUrl
-	item.AvatarImgUrl = req.AvatarImgUrl
-	item.ReportImgUrl = req.ReportImgUrl
-	item.HomeImgUrl = req.HomeImgUrl
-	item.ClassifyLabel = req.ClassifyLabel
-	item.ShowType = req.ShowType
-	item.HasTeleconference = req.HasTeleconference
-	item.VipTitle = req.VipTitle
-	item.Sort = req.Sort
-	item.IsShow = req.IsShow
-	item.YbFiccSort = req.YbFiccSort
-	item.YbFiccIcon = req.YbFiccIcon
-	item.YbFiccPcIcon = req.YbFiccPcIcon
-	item.YbIconUrl = req.YbIconUrl
-	item.YbBgUrl = req.YbBgUrl
-	item.YbListImg = req.YbListImg
-	item.YbShareBgImg = req.YbShareBgImg
-	item.YbRightBanner = req.YbRightBanner
-	item.RelateTel = req.RelateTel
-	item.RelateVideo = req.RelateVideo
 	item.ModifyTime = time.Now().Local()
 	cols := make([]string, 0)
-	cols = append(cols, "ClassifyName", "Abstract", "ParentId", "Descript", "ReportAuthor", "AuthorDescript", "ColumnImgUrl",
-		"HeadImgUrl", "AvatarImgUrl", "ReportImgUrl", "HomeImgUrl", "ClassifyLabel", "ShowType", "HasTeleconference", "VipTitle", "Sort",
-		"IsShow", "YbFiccSort", "YbFiccIcon", "YbFiccPcIcon", "YbIconUrl", "YbBgUrl", "YbListImg", "YbShareBgImg", "YbRightBanner",
-		"RelateTel", "RelateVideo", "ModifyTime")
+	cols = append(cols, "ClassifyName", "ParentId", "ModifyTime")
 	if e := item.UpdateClassify(cols); e != nil {
 		br.Msg = "修改失败"
 		br.ErrMsg = "修改失败,Err:" + e.Error()
 		return
 	}
-	// 一级分类关联设置会强制修改二级分类的所有关联设置
-	if item.ParentId == 0 {
-		if e = models.UpdateChildClassifyRelateSetting(item.Id, req.RelateTel, req.RelateVideo); e != nil {
-			br.Msg = "更新二级分类关联设置失败"
-			br.ErrMsg = "更新二级分类关联设置失败, Err: " + e.Error()
+
+	/*
+		item.Abstract = req.Abstract
+		item.Descript = req.Descript
+		item.ReportAuthor = req.ReportAuthor
+		item.AuthorDescript = req.AuthorDescript
+		item.ColumnImgUrl = req.ColumnImgUrl
+		item.HeadImgUrl = req.HeadImgUrl
+		item.AvatarImgUrl = req.AvatarImgUrl
+		item.ReportImgUrl = req.ReportImgUrl
+		item.HomeImgUrl = req.HomeImgUrl
+		item.ClassifyLabel = req.ClassifyLabel
+		item.ShowType = req.ShowType
+		item.HasTeleconference = req.HasTeleconference
+		item.VipTitle = req.VipTitle
+		//	item.Sort = req.Sort
+		item.IsShow = req.IsShow
+		item.YbFiccSort = req.YbFiccSort
+		item.YbFiccIcon = req.YbFiccIcon
+		item.YbFiccPcIcon = req.YbFiccPcIcon
+		item.YbIconUrl = req.YbIconUrl
+		item.YbBgUrl = req.YbBgUrl
+		item.YbListImg = req.YbListImg
+		item.YbShareBgImg = req.YbShareBgImg
+		item.YbRightBanner = req.YbRightBanner
+		item.RelateTel = req.RelateTel
+		item.RelateVideo = req.RelateVideo
+		item.ModifyTime = time.Now().Local()
+		cols := make([]string, 0)
+		cols = append(cols, "ClassifyName", "Abstract", "ParentId", "Descript", "ReportAuthor", "AuthorDescript", "ColumnImgUrl",
+			"HeadImgUrl", "AvatarImgUrl", "ReportImgUrl", "HomeImgUrl", "ClassifyLabel", "ShowType", "HasTeleconference", "VipTitle", "Sort",
+			"IsShow", "YbFiccSort", "YbFiccIcon", "YbFiccPcIcon", "YbIconUrl", "YbBgUrl", "YbListImg", "YbShareBgImg", "YbRightBanner",
+			"RelateTel", "RelateVideo", "ModifyTime")
+		if e := item.UpdateClassify(cols); e != nil {
+			br.Msg = "修改失败"
+			br.ErrMsg = "修改失败,Err:" + e.Error()
 			return
 		}
-	}
-
+		// 一级分类关联设置会强制修改二级分类的所有关联设置
+		if item.ParentId == 0 {
+			if e = models.UpdateChildClassifyRelateSetting(item.Id, req.RelateTel, req.RelateVideo); e != nil {
+				br.Msg = "更新二级分类关联设置失败"
+				br.ErrMsg = "更新二级分类关联设置失败, Err: " + e.Error()
+				return
+			}
+		}
+	*/
 	// 为二级分类时, 更新父级分类是否含电话会字段
 	if req.ParentId > 0 {
+		//二级分类才能修改权限
+		err = models.EditChartPermissionSearchKeyWordMappingMulti(item.ClassifyName, req.ChartPermissionIdList)
+		if err != nil {
+			br.Msg = "修改分类权限失败"
+			br.ErrMsg = "修改分类权限失败,Err:" + err.Error()
+			return
+		}
 		go func() {
-			_ = services.UpdateParentClassifyHasTel(req.ClassifyId, req.ParentId, req.HasTeleconference)
+			_ = services.EditClassifyChartPermissionSync(item.ClassifyName)
 		}()
+		/*go func() {
+			_ = services.UpdateParentClassifyHasTel(req.ClassifyId, req.ParentId, req.HasTeleconference)
+		}()*/
 	}
 
 	// 更新报告分类名称/父级分类后
@@ -507,7 +548,7 @@ func (this *ClassifyController) Edit() {
 	}()
 
 	// 获取编辑前子目录列表
-	classifyId := item.Id
+	/*classifyId := item.Id
 	var menuCond string
 	var menuPars []interface{}
 	menuCond += ` AND classify_id = ?`
@@ -567,7 +608,7 @@ func (this *ClassifyController) Edit() {
 			br.ErrMsg = "新增子目录关联失败, Err:" + e.Error()
 			return
 		}
-	}
+	}*/
 
 	// 关联电话会选项被更改时, 同步FICC活动分类
 	//if originRelateTel != req.RelateTel {
@@ -675,8 +716,6 @@ func (this *ClassifyController) FindByIdClassify() {
 
 // @Title 获取分类列表
 // @Description 获取分类列表
-// @Param   PageSize   query   int  true       "每页数据条数"
-// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   KeyWord   query   string  true       "检索关键词"
 // @Param   CompanyType   query   string  false       "产品类型,枚举值:'ficc','权益';不传默认返回全部"
 // @Param   HideDayWeek   query   int  false       "是否隐藏晨周报"
@@ -688,32 +727,22 @@ func (this *ClassifyController) ListClassify() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	pageSize, _ := this.GetInt("PageSize")
-	currentIndex, _ := this.GetInt("CurrentIndex")
+
 	keyWord := this.GetString("KeyWord")
 	companyType := this.GetString("CompanyType")
 	hideDayWeek, _ := this.GetInt("HideDayWeek")
+
+	reqEnabled, _ := this.GetInt("Enabled", -1)
 	// 商家不隐藏晨周报
 	if utils.BusinessCode != utils.BusinessCodeRelease {
 		hideDayWeek = 0
 	}
-
-	var startSize int
-	if pageSize <= 0 {
-		pageSize = utils.PageSize20
-	}
-	if currentIndex <= 0 {
-		currentIndex = 1
+	enabled := -1
+	if reqEnabled == 1 {
+		enabled = reqEnabled
 	}
 
-	startSize = utils.StartIndex(currentIndex, pageSize)
-	list, err := models.GetClassifyList(startSize, pageSize, keyWord, companyType, hideDayWeek)
-	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
-	total, err := models.GetClassifyListCount(keyWord, companyType, hideDayWeek)
+	list, err := models.GetClassifyList(keyWord, companyType, hideDayWeek, enabled)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -727,8 +756,7 @@ func (this *ClassifyController) ListClassify() {
 	parentIdLen := len(parentIds)
 	if parentIdLen == 0 {
 		resp := &models.ClassifyListResp{
-			List:   list,
-			Paging: paging.GetPaging(currentIndex, pageSize, 0),
+			List: list,
 		}
 		br.Data = resp
 		br.Ret = 200
@@ -757,7 +785,7 @@ func (this *ClassifyController) ListClassify() {
 	}
 
 	// 获取子分类
-	children, e := models.GetClassifyChildByParentIds(parentIds, keyWord)
+	children, e := models.GetClassifyChildByParentIds(parentIds, keyWord, enabled)
 	if e != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取子分类失败"
@@ -787,16 +815,29 @@ func (this *ClassifyController) ListClassify() {
 		}
 	}
 
+	// 查询分类绑定的权限
+	permissionList, _ := models.GetAllPermissionMapping()
+	classifyPermissionMap := make(map[string][]int, 0)
+	if len(permissionList) > 0 {
+		for _, v := range permissionList {
+			classifyPermissionMap[v.KeyWord] = append(classifyPermissionMap[v.KeyWord], v.ChartPermissionId)
+		}
+	}
 	// 二级分类
 	childrenMap := make(map[int][]*models.ClassifyItem, 0)
 	for i := range children {
+
 		if childrenMap[children[i].ParentId] == nil {
 			childrenMap[children[i].ParentId] = make([]*models.ClassifyItem, 0)
 		}
-		childrenMap[children[i].ParentId] = append(childrenMap[children[i].ParentId], &models.ClassifyItem{
+		tmp := &models.ClassifyItem{
 			Classify:       *children[i],
 			ClassifyMenuId: relateMap[children[i].Id],
-		})
+		}
+		if permissionIds, ok := classifyPermissionMap[children[i].ClassifyName]; ok {
+			tmp.ChartPermissionIdList = permissionIds
+		}
+		childrenMap[children[i].ParentId] = append(childrenMap[children[i].ParentId], tmp)
 	}
 
 	// 一级分类
@@ -805,10 +846,8 @@ func (this *ClassifyController) ListClassify() {
 		list[i].Child = childrenMap[list[i].Id]
 	}
 
-	page := paging.GetPaging(currentIndex, pageSize, total)
 	resp := new(models.ClassifyListResp)
 	resp.List = list
-	resp.Paging = page
 	br.Data = resp
 	br.Ret = 200
 	br.Success = true
@@ -900,7 +939,9 @@ func (this *ClassifyController) EditClassifyPermission() {
 		br.ErrMsg = "修改分类权限失败,Err:" + err.Error()
 		return
 	}
-
+	go func() {
+		_ = services.EditClassifyChartPermissionSync(classifyInfo.ClassifyName)
+	}()
 	// 是关联电话会二级分类修改了权限, 同步关联报告电话会的分类
 	//if classifyInfo.ParentId > 0 && classifyInfo.RelateTel == 1 {
 	//	go func() {
@@ -955,3 +996,93 @@ func (this *ClassifyController) TelListClassify() {
 	br.Success = true
 	br.Msg = "获取成功"
 }
+
+// Move
+// @Title 移动分类接口
+// @Description 移动分类
+// @Param	request	body models.ClassifyMoveReq true "type json string"
+// @Success 200 新增成功
+// @router /move [post]
+func (this *ClassifyController) Move() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.ClassifyMoveReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.ClassifyId <= 0 {
+		br.Msg = "请选择分类"
+		return
+	}
+	e, msg := services.MoveReportClassify(req)
+	if e != nil {
+		br.Msg = msg
+		br.ErrMsg = "移动分类失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// SetEnabled
+// @Title 启用/禁用分类接口
+// @Description 启用/禁用分类
+// @Param	request	body models.ClassifyMoveReq true "type json string"
+// @Success 200 新增成功
+// @router /enabled/set [post]
+func (this *ClassifyController) SetEnabled() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.ClassifySetEnabledReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.ClassifyId <= 0 {
+		br.Msg = "请选择分类"
+		return
+	}
+	if req.Enabled != 0 && req.Enabled != 1 {
+		br.Msg = "请选择正确的启用禁用状态"
+		return
+	}
+	item, err := models.GetClassifyById(req.ClassifyId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "分类不存在"
+			return
+		}
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		return
+	}
+	if item == nil {
+		br.Msg = "分类不存在"
+		return
+	}
+	ob := new(models.Classify)
+	//设置分类启用、禁用状态
+	err = ob.SetEnabled(req.ClassifyId, req.Enabled)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 8 - 1
controllers/company_permission.go

@@ -52,7 +52,7 @@ func (this *CompanyPermissionController) List() {
 
 	// FICC
 	if productId == utils.COMPANY_PRODUCT_FICC_ID || companyType == utils.COMPANY_PRODUCT_FICC_NAME {
-		for _, v := range utils.PermissionFiccClassifyArr {
+		/*for _, v := range utils.PermissionFiccClassifyArr {
 			checkList := make([]int, 0)
 			p := new(company.PermissionSetList)
 			p.ClassifyName = v
@@ -68,7 +68,14 @@ func (this *CompanyPermissionController) List() {
 			}
 			p.CheckList = checkList
 			resp.List = append(resp.List, p)
+		}*/
+		list, err := services.GetChartPermissionEnabledList()
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
+			return
 		}
+		resp.List = list
 		br.Ret = 200
 		br.Success = true
 		br.Msg = "获取成功"

+ 166 - 25
controllers/english_report/en_permission.go

@@ -2,10 +2,11 @@ package english_report
 
 import (
 	"encoding/json"
-	"fmt"
 	"eta/eta_api/controllers"
 	"eta/eta_api/models"
+	"eta/eta_api/services"
 	"eta/eta_api/utils"
+	"fmt"
 	"strings"
 	"time"
 )
@@ -44,17 +45,22 @@ func (this *EnPermissionController) Add() {
 		br.ErrMsg = "参数解析失败,Err:" + e.Error()
 		return
 	}
-	req.EnPermissionName = strings.TrimSpace(req.EnPermissionName)
-	if req.EnPermissionName == "" {
+	req.PermissionName = strings.TrimSpace(req.PermissionName)
+	if req.PermissionName == "" {
 		br.Msg = "请输入品种名称"
 		return
 	}
 
+	if req.Enabled != 1 && req.Enabled != 0 {
+		br.Msg = "请设置正确的状态"
+		return
+	}
+
 	// 重名校验
 	existOB := new(models.EnPermission)
 	existCond := fmt.Sprintf(` AND %s = ? AND %s = ?`, models.EnPermissionColumns.EnPermissionName, models.EnPermissionColumns.ParentId)
 	existPars := make([]interface{}, 0)
-	existPars = append(existPars, req.EnPermissionName, req.ParentId)
+	existPars = append(existPars, req.PermissionName, req.ParentId)
 	exist, e := existOB.GetItemByCondition(existCond, existPars)
 	if e != nil && e.Error() != utils.ErrNoRow() {
 		br.Msg = "操作失败"
@@ -65,12 +71,19 @@ func (this *EnPermissionController) Add() {
 		br.Msg = "品种名称已存在"
 		return
 	}
-
-	// 新增
+	// 获取最大的排序值
 	item := new(models.EnPermission)
-	item.EnPermissionName = req.EnPermissionName
+	maxSort, e := item.GetMaxSort()
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "查询品种排序失败, Err: " + e.Error()
+		return
+	}
+	// 新增
+	item.EnPermissionName = req.PermissionName
 	item.ParentId = req.ParentId
-	item.Sort = req.Sort
+	item.Sort = maxSort + 1
+	item.Enabled = req.Enabled
 	item.CreateTime = time.Now().Local()
 	item.ModifyTime = time.Now().Local()
 	if e = item.Create(); e != nil {
@@ -114,12 +127,12 @@ func (this *EnPermissionController) Edit() {
 		br.ErrMsg = "参数解析失败,Err:" + e.Error()
 		return
 	}
-	if req.EnPermissionId <= 0 {
+	if req.PermissionId <= 0 {
 		br.Msg = "参数有误"
 		return
 	}
-	req.EnPermissionName = strings.TrimSpace(req.EnPermissionName)
-	if req.EnPermissionName == "" {
+	req.PermissionName = strings.TrimSpace(req.PermissionName)
+	if req.PermissionName == "" {
 		br.Msg = "请输入品种名称"
 		return
 	}
@@ -128,7 +141,7 @@ func (this *EnPermissionController) Edit() {
 	ob := new(models.EnPermission)
 	existCond := fmt.Sprintf(` AND %s = ? AND %s = ? AND %s <> ?`, models.EnPermissionColumns.EnPermissionName, models.EnPermissionColumns.ParentId, models.EnPermissionColumns.EnPermissionId)
 	existPars := make([]interface{}, 0)
-	existPars = append(existPars, req.EnPermissionName, req.ParentId, req.EnPermissionId)
+	existPars = append(existPars, req.PermissionName, req.ParentId, req.PermissionId)
 	exist, e := ob.GetItemByCondition(existCond, existPars)
 	if e != nil && e.Error() != utils.ErrNoRow() {
 		br.Msg = "操作失败"
@@ -140,7 +153,7 @@ func (this *EnPermissionController) Edit() {
 		return
 	}
 
-	item, e := ob.GetItemById(req.EnPermissionId)
+	item, e := ob.GetItemById(req.PermissionId)
 	if e != nil {
 		if e.Error() == utils.ErrNoRow() {
 			br.Msg = "品种不存在, 请刷新页面"
@@ -151,11 +164,10 @@ func (this *EnPermissionController) Edit() {
 		return
 	}
 	originPid := item.ParentId
-	item.EnPermissionName = req.EnPermissionName
+	item.EnPermissionName = req.PermissionName
 	item.ParentId = req.ParentId
-	item.Sort = req.Sort
 	item.ModifyTime = time.Now().Local()
-	if e = item.Update([]string{"EnPermissionName", "ParentId", "Sort", "ModifyTime"}); e != nil {
+	if e = item.Update([]string{"EnPermissionName", "ParentId", "ModifyTime"}); e != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = "更新品种权限失败, Err: " + e.Error()
 		return
@@ -212,8 +224,8 @@ func (this *EnPermissionController) ParentList() {
 	resp := make([]*models.EnPermissionItem, 0)
 	for _, v := range list {
 		t := new(models.EnPermissionItem)
-		t.EnPermissionId = v.EnPermissionId
-		t.EnPermissionName = v.EnPermissionName
+		t.PermissionId = v.EnPermissionId
+		t.PermissionName = v.EnPermissionName
 		t.CnPermissionName = v.CnPermissionName
 		t.ParentId = v.ParentId
 		t.Sort = v.Sort
@@ -255,6 +267,8 @@ func (this *EnPermissionController) List() {
 	keyword := this.GetString("Keyword", "")
 	keyword = strings.TrimSpace(keyword)
 
+	enabled, _ := this.GetInt("Enabled", -1)
+
 	// 禁用指定报告、指定路演无权限的品种
 	reportId, _ := this.GetInt("ReportId", 0)
 	videoId, _ := this.GetInt("VideoId", 0)
@@ -297,9 +311,10 @@ func (this *EnPermissionController) List() {
 	childMap := make(map[int][]*models.EnPermissionItem)
 	for _, v := range list {
 		t := new(models.EnPermissionItem)
-		t.EnPermissionId = v.EnPermissionId
-		t.EnPermissionName = v.EnPermissionName
+		t.PermissionId = v.EnPermissionId
+		t.PermissionName = v.EnPermissionName
 		t.CnPermissionName = v.CnPermissionName
+		t.Enabled = v.Enabled
 		t.ParentId = v.ParentId
 		t.Sort = v.Sort
 		t.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
@@ -309,20 +324,24 @@ func (this *EnPermissionController) List() {
 			continue
 		}
 		if v.ParentId > 0 {
+			if v.Enabled == 0 && enabled == 1 {
+				continue
+			}
 			if childMap[v.ParentId] == nil {
 				childMap[v.ParentId] = make([]*models.EnPermissionItem, 0)
 			}
 			// 无权限则隐藏
-			if (reportId > 0 || videoId > 0) && !utils.InArrayByInt(limitIds, t.EnPermissionId) {
+			if (reportId > 0 || videoId > 0) && !utils.InArrayByInt(limitIds, t.PermissionId) {
 				continue
 			}
 			childMap[v.ParentId] = append(childMap[v.ParentId], t)
 		}
 	}
 	for _, r := range resp {
-		r.Child = childMap[r.EnPermissionId]
+		r.Child = childMap[r.PermissionId]
 	}
 
+	// todo 过滤禁用品种的一级分类,如果一级分类没有二级分类
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -357,13 +376,13 @@ func (this *EnPermissionController) Remove() {
 		br.ErrMsg = "参数解析失败,Err:" + e.Error()
 		return
 	}
-	if req.EnPermissionId <= 0 {
+	if req.PermissionId <= 0 {
 		br.Msg = "参数有误"
 		return
 	}
 
 	ob := new(models.EnPermission)
-	item, e := ob.GetItemById(req.EnPermissionId)
+	item, e := ob.GetItemById(req.PermissionId)
 	if e != nil {
 		if e.Error() == utils.ErrNoRow() {
 			br.Msg = "品种不存在, 请刷新页面"
@@ -377,7 +396,7 @@ func (this *EnPermissionController) Remove() {
 	// 校验是否有子品种
 	childCond := fmt.Sprintf(` AND %s = ?`, models.EnPermissionColumns.ParentId)
 	childPars := make([]interface{}, 0)
-	childPars = append(childPars, req.EnPermissionId)
+	childPars = append(childPars, req.PermissionId)
 	num, e := ob.GetCountByCondition(childCond, childPars)
 	if e != nil {
 		br.Msg = "操作失败"
@@ -418,3 +437,125 @@ func (this *EnPermissionController) Remove() {
 	br.Success = true
 	br.Msg = "操作成功"
 }
+
+// Move
+// @Title 移动品种权限
+// @Description 移动品种权限
+// @Param	request	body models.EnPermissionMoveReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /move [post]
+func (this *EnPermissionController) Move() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req models.EnPermissionMoveReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if req.PermissionId <= 0 {
+		br.Msg = "参数有误"
+		return
+	}
+
+	e, msg := services.MoveEnPermission(req)
+	if e != nil {
+		br.Msg = msg
+		br.ErrMsg = "移动品种失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// SetEnabled
+// @Title 启用/禁用品种
+// @Description 启用/禁用品种
+// @Param	request	body models.EnPermissionEnabledReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /enabled/set [post]
+func (this *EnPermissionController) SetEnabled() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req models.EnPermissionEnabledReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if req.PermissionId <= 0 {
+		br.Msg = "参数有误"
+		return
+	}
+
+	// 重名校验
+	ob := new(models.EnPermission)
+
+	item, e := ob.GetItemById(req.PermissionId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "品种不存在, 请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取品种权限失败, Err: " + e.Error()
+		return
+	}
+	item.Enabled = req.Enabled
+	item.ModifyTime = time.Now().Local()
+	if e = item.Update([]string{"Enabled", "ModifyTime"}); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "更新品种权限失败, Err: " + e.Error()
+		return
+	}
+
+	// 如果是一级品种被启用,则所有二级设置成启用, 如果一级品种被禁用,则所有二级设置成禁用
+	if item.ParentId == 0 {
+		if e = item.SetEnabled(item.EnPermissionId, req.Enabled); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "更新英文分类权限失败, Err: " + e.Error()
+			return
+		}
+	} else if item.ParentId > 0 && req.Enabled == 1 {
+		// 如果二级品种被启用,则他的上级品种设置成启用
+		if e = item.SetEnabledByPermissionId(item.ParentId, req.Enabled); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "更新英文分类权限失败, Err: " + e.Error()
+			return
+		}
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+	br.Data = item.EnPermissionId
+}

+ 193 - 67
controllers/english_report/english_classify.go

@@ -8,7 +8,6 @@ import (
 	"eta/eta_api/services"
 	"eta/eta_api/utils"
 	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"sort"
 	"time"
 )
@@ -33,46 +32,24 @@ func (this *EnglishReportController) ListClassify() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	pageSize, _ := this.GetInt("PageSize")
-	currentIndex, _ := this.GetInt("CurrentIndex")
-	keyWord := this.GetString("KeyWord")
 
-	var startSize int
-	if pageSize <= 0 {
-		pageSize = utils.PageSize20
-	}
-	if currentIndex <= 0 {
-		currentIndex = 1
+	keyWord := this.GetString("KeyWord")
+	reqEnabled, _ := this.GetInt("Enabled", -1)
+	enabled := -1
+	if reqEnabled == 1 {
+		enabled = reqEnabled
 	}
-
-	startSize = utils.StartIndex(currentIndex, pageSize)
-
-	page := paging.GetPaging(currentIndex, pageSize, 0)
 	resp := new(models.EnglishClassifyListResp)
 
 	// 处理一级分类分页的情况
-	rootList, err := models.GetEnglishClassifyRootId(startSize, pageSize, keyWord)
+	rootList, err := models.GetEnglishClassifyRootId(keyWord, enabled)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-	var ids []int
-	var rootIds []int
-	rootMap := make(map[int]struct{}, 0)
-	for _, v := range rootList {
-		rootIds = append(rootIds, v.Id)
-		rootMap[v.Id] = struct{}{}
-	}
-	total, err := models.GetEnglishClassifyListCount(keyWord)
-	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
-	if total == 0 {
+	if len(rootList) == 0 {
 		resp.List = make([]*models.EnglishClassifyList, 0)
-		resp.Paging = page
 
 		br.Data = resp
 		br.Ret = 200
@@ -80,10 +57,16 @@ func (this *EnglishReportController) ListClassify() {
 		br.Msg = "获取成功"
 		return
 	}
-	page = paging.GetPaging(currentIndex, pageSize, total)
+	var ids []int
+	var rootIds []int
+	rootMap := make(map[int]struct{}, 0)
+	for _, v := range rootList {
+		rootIds = append(rootIds, v.Id)
+		rootMap[v.Id] = struct{}{}
+	}
 
 	//获取相关的分类ID
-	idList, err := models.GetEnglishClassifyListByRootId(rootIds, keyWord)
+	idList, err := models.GetEnglishClassifyListByRootId(rootIds, keyWord, enabled)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -177,7 +160,6 @@ func (this *EnglishReportController) ListClassify() {
 	sort.Sort(sortList)
 
 	resp.List = sortList
-	resp.Paging = page
 
 	br.Data = resp
 	br.Ret = 200
@@ -191,17 +173,25 @@ func (this *EnglishReportController) ListClassify() {
 // @Param   ParentId   query   int  true       "父级Id 添加父级时为0"
 // @Param   Sort   query   string  false       "排序"
 // @Success 200 新增成功
-// @router /classify/add [get]
+// @router /classify/add [post]
 func (this *EnglishReportController) AddClassify() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	classifyName := this.GetString("ClassifyName")
-	parentId, _ := this.GetInt("ParentId")
-	sort, _ := this.GetInt("Sort")
-
+	//classifyName := this.GetString("ClassifyName")
+	//parentId, _ := this.GetInt("ParentId")
+	var req models.EnClassifyAddReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	classifyName := req.ClassifyName
+	parentId := req.ParentId
+	ob := new(models.EnglishClassify)
 	// 查新父级分类是否存在
 	rootId := 0
 	if parentId > 0 {
@@ -221,15 +211,23 @@ func (this *EnglishReportController) AddClassify() {
 			rootId = parentClassify.RootId
 		}
 	}
+	maxSort, e := ob.GetMaxSort()
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "查询品种排序失败, Err: " + e.Error()
+		return
+	}
 
+	nowTime := time.Now().Local()
 	item := &models.EnglishClassify{
 		ClassifyName: classifyName,
-		Sort:         sort,
+		Sort:         maxSort + 1,
 		ParentId:     parentId,
 		RootId:       rootId,
-		CreateTime:   time.Now(),
-		ModifyTime:   time.Now(),
+		CreateTime:   nowTime,
+		ModifyTime:   nowTime,
 		IsShow:       1,
+		Enabled:      1,
 	}
 	counts, err := models.GetEnglishClassifyCountsByName(classifyName, parentId)
 	if err != nil {
@@ -249,8 +247,8 @@ func (this *EnglishReportController) AddClassify() {
 		br.ErrMsg = "保存失败,Err:" + err.Error()
 		return
 	}
+	item.Id = int(newId)
 	if parentId == 0 { //一级目录的rootId等于自己本身
-		item.Id = int(newId)
 		item.RootId = int(newId)
 		err = item.UpdateEnglishClassify([]string{"RootId"})
 		if err != nil {
@@ -260,11 +258,28 @@ func (this *EnglishReportController) AddClassify() {
 		}
 	}
 
+	if item.ParentId != item.RootId && item.ParentId > 0 { //三级分类才能绑定品种权限
+		permissions := make([]*models.EnClassifyPermission, 0)
+		for _, p := range req.EnPermissions {
+			v := new(models.EnClassifyPermission)
+			v.EnPermissionId = p
+			v.EnClassifyId = item.Id
+			v.CreateTime = nowTime
+			permissions = append(permissions, v)
+		}
+		if e = models.CreateEnClassifyPermissions(permissions); e != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "更新分类品种权限失败, Err: " + e.Error()
+			return
+		}
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "新增成功"
 }
 
+// EditClassify
 // @Title 编辑分类
 // @Description 编辑分类接口
 // @Param   ClassifyId   int  true       "分类Id"
@@ -272,17 +287,25 @@ func (this *EnglishReportController) AddClassify() {
 // @Param   ParentId   query   int  true       "父级Id 添加父级时为0"
 // @Param   Sort   query   string  false       "排序"
 // @Success 200 保存成功
-// @router /classify/edit [get]
+// @router /classify/edit [post]
 func (this *EnglishReportController) EditClassify() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	classifyId, _ := this.GetInt("ClassifyId")
-	classifyName := this.GetString("ClassifyName")
-	parentId, _ := this.GetInt("ParentId")
-	sort, _ := this.GetInt("Sort")
+
+	var req models.EnClassifyEditReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	classifyId := req.ClassifyId
+	classifyName := req.ClassifyName
+	parentId := req.ParentId
+	//ob := new(models.EnglishClassify)
 
 	if parentId == classifyId {
 		br.Msg = "上级分类不能选择自己"
@@ -359,14 +382,24 @@ func (this *EnglishReportController) EditClassify() {
 	if parentId == 0 { //一级分类的顶级分类为自己的ID
 		rootId = oldItem.Id
 	}
+
+	/*maxSort, e := ob.GetMaxSortByParentId(parentId)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "查询品种排序失败, Err: " + e.Error()
+		return
+	}*/
+
+	nowTime := time.Now().Local()
+
 	item := &models.EnglishClassify{
 		Id:           oldItem.Id,
 		ClassifyName: classifyName,
-		Sort:         sort,
-		ParentId:     parentId,
-		RootId:       rootId,
-		ModifyTime:   time.Now(),
-		IsShow:       1,
+		//	Sort:         maxSort + 1,
+		ParentId:   parentId,
+		RootId:     rootId,
+		ModifyTime: nowTime,
+		IsShow:     1,
 	}
 	{
 		// 更新研报里的分类名称
@@ -389,6 +422,23 @@ func (this *EnglishReportController) EditClassify() {
 		br.ErrMsg = "保存失败,Err:" + err.Error()
 		return
 	}
+	// 更新权限
+	if item.ParentId != item.RootId && item.ParentId > 0 { //三级分类才能编辑品种
+		permissions := make([]*models.EnClassifyPermission, 0)
+		for _, p := range req.EnPermissions {
+			v := new(models.EnClassifyPermission)
+			v.EnPermissionId = p
+			v.EnClassifyId = req.ClassifyId
+			v.CreateTime = nowTime
+			permissions = append(permissions, v)
+		}
+		if e = models.ClearAndCreateEnClassifyPermissions(req.ClassifyId, permissions); e != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "更新分类品种权限失败, Err: " + e.Error()
+			return
+		}
+	}
+
 	err = models.UpdateEnglishReportClassifyByFirstSecondClassifyId(classifyId, parentId)
 	if err != nil {
 		br.Msg = "保存失败"
@@ -511,19 +561,8 @@ func (this *EnglishReportController) FistListClassify() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	pageSize, _ := this.GetInt("PageSize")
-	currentIndex, _ := this.GetInt("CurrentIndex")
-
-	var startSize int
-	if pageSize <= 0 {
-		pageSize = utils.PageSize20
-	}
-	if currentIndex <= 0 {
-		currentIndex = 1
-	}
 
-	startSize = utils.StartIndex(currentIndex, pageSize)
-	rootList, err := models.GetEnglishFirstClassifyList(startSize, pageSize)
+	rootList, err := models.GetEnglishFirstClassifyList()
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -535,12 +574,10 @@ func (this *EnglishReportController) FistListClassify() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-	page := paging.GetPaging(currentIndex, pageSize, total)
 	resp := new(models.EnglishClassifyListResp)
 
 	if total == 0 {
 		resp.List = make([]*models.EnglishClassifyList, 0)
-		resp.Paging = page
 
 		br.Data = resp
 		br.Ret = 200
@@ -583,7 +620,6 @@ func (this *EnglishReportController) FistListClassify() {
 	sort.Sort(sortList)
 
 	resp.List = sortList
-	resp.Paging = page
 
 	br.Data = resp
 	br.Ret = 200
@@ -644,3 +680,93 @@ func (this *EnglishClassifyController) PermissionEdit() {
 	br.Success = true
 	br.Msg = "操作成功"
 }
+
+// MoveClassify
+// @Title 移动分类接口
+// @Description 移动分类
+// @Param	request	body models.EnglishClassifyMoveReq true "type json string"
+// @Success 200 新增成功
+// @router /classify/move [post]
+func (this *EnglishReportController) MoveClassify() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.EnglishClassifyMoveReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.ClassifyId <= 0 {
+		br.Msg = "请选择分类"
+		return
+	}
+	e, msg := services.MoveEnglishReportClassify(req)
+	if e != nil {
+		br.Msg = msg
+		br.ErrMsg = "移动分类失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// SetEnabled
+// @Title 启用/禁用分类接口
+// @Description 启用/禁用分类
+// @Param	request	body models.ClassifyMoveReq true "type json string"
+// @Success 200 新增成功
+// @router /classify/enabled/set [post]
+func (this *EnglishReportController) SetEnabled() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.EnglishClassifySetEnabledReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.ClassifyId <= 0 {
+		br.Msg = "请选择分类"
+		return
+	}
+	if req.Enabled != 0 && req.Enabled != 1 {
+		br.Msg = "请选择正确的启用禁用状态"
+		return
+	}
+	item, err := models.GetEnglishReportClassifyById(req.ClassifyId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "分类不存在"
+			return
+		}
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		return
+	}
+	if item == nil {
+		br.Msg = "分类不存在"
+		return
+	}
+	ob := new(models.EnglishClassify)
+	//设置分类启用、禁用状态
+	err = ob.SetEnabled(req.ClassifyId, req.Enabled)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 44 - 32
controllers/report.go

@@ -584,22 +584,24 @@ func (this *ReportController) Add() {
 	}
 
 	//处理权限
-	if utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeSandbox {
-		go func() {
-			permissionItems, e := models.GetPermission(req.ClassifyNameSecond)
+	//if utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeSandbox {
+	go func() {
+		permissionItems, e := models.GetPermission(req.ClassifyNameSecond)
+		if e != nil {
+			alarm_msg.SendAlarmMsg("获取权限失败,Err:"+e.Error(), 3)
+			return
+		}
+		for _, v := range permissionItems {
+			e = models.AddChartPermissionChapterMapping(v.ChartPermissionId, newReportId)
 			if e != nil {
-				alarm_msg.SendAlarmMsg("获取权限失败,Err:"+e.Error(), 3)
+				alarm_msg.SendAlarmMsg("新增权限失败,Err:"+e.Error(), 3)
 				return
 			}
-			for _, v := range permissionItems {
-				e = models.AddChartPermissionChapterMapping(v.ChartPermissionId, newReportId)
-				if e != nil {
-					alarm_msg.SendAlarmMsg("新增权限失败,Err:"+e.Error(), 3)
-					return
-				}
-			}
-		}()
-	}
+		}
+		// 同步crm权限
+		_ = services.EditReportPermissionSync(newReportId, req.ClassifyNameSecond)
+	}()
+	//}
 
 	recordItem := &models.ReportStateRecord{
 		ReportId:   int(newReportId),
@@ -741,27 +743,29 @@ func (this *ReportController) Edit() {
 	}
 
 	//处理权限
-	if utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeSandbox {
-		go func() {
-			e := models.RemoveChartPermissionChapterMapping(req.ReportId)
-			if e != nil {
-				alarm_msg.SendAlarmMsg("修改删除报告权限失败,Err:"+e.Error(), 3)
-				return
-			}
-			permissionItems, e := models.GetPermission(req.ClassifyNameSecond)
+	//if utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeSandbox {
+	go func() {
+		e := models.RemoveChartPermissionChapterMapping(req.ReportId)
+		if e != nil {
+			alarm_msg.SendAlarmMsg("修改删除报告权限失败,Err:"+e.Error(), 3)
+			return
+		}
+		permissionItems, e := models.GetPermission(req.ClassifyNameSecond)
+		if e != nil {
+			alarm_msg.SendAlarmMsg("获取权限失败,Err:"+e.Error(), 3)
+			return
+		}
+		for _, v := range permissionItems {
+			e = models.AddChartPermissionChapterMapping(v.ChartPermissionId, req.ReportId)
 			if e != nil {
-				alarm_msg.SendAlarmMsg("获取权限失败,Err:"+e.Error(), 3)
+				alarm_msg.SendAlarmMsg("新增权限失败,Err:"+e.Error(), 3)
 				return
 			}
-			for _, v := range permissionItems {
-				e = models.AddChartPermissionChapterMapping(v.ChartPermissionId, req.ReportId)
-				if e != nil {
-					alarm_msg.SendAlarmMsg("新增权限失败,Err:"+e.Error(), 3)
-					return
-				}
-			}
-		}()
-	}
+		}
+		// 同步crm权限
+		_ = services.EditReportPermissionSync(req.ReportId, req.ClassifyNameSecond)
+	}()
+	//}
 
 	reportCode := utils.MD5(strconv.Itoa(int(req.ReportId)))
 	resp := new(models.EditResp)
@@ -1785,7 +1789,11 @@ func (this *ReportController) SetDayWeekReportUpdateRule() {
 		br.ErrMsg = "设置暂停时间失败, Err: " + err.Error()
 		return
 	}
-
+	// 同步到crm数据库
+	go func() {
+		var syncReq services.ChapterTypeSyncReq
+		_, _ = services.ReportChapterTypeSync(&syncReq)
+	}()
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -1840,6 +1848,10 @@ func (this *ReportController) SetDayWeekReportEnableRule() {
 		br.ErrMsg = "设置永久停更失败, Err: " + err.Error()
 		return
 	}
+	go func() {
+		var syncReq services.ChapterTypeSyncReq
+		_, _ = services.ReportChapterTypeSync(&syncReq)
+	}()
 
 	br.Ret = 200
 	br.Success = true

+ 239 - 57
controllers/report_chapter_type.go

@@ -2,8 +2,8 @@ package controllers
 
 import (
 	"encoding/json"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"eta/eta_api/models"
+	"eta/eta_api/services"
 	"eta/eta_api/utils"
 	"time"
 )
@@ -39,35 +39,29 @@ func (this *ReportChapterTypeController) List() {
 		br.Msg = "请选择报告类型"
 		return
 	}
-
-	pageSize, _ := this.GetInt("PageSize")
-	currentIndex, _ := this.GetInt("CurrentIndex")
-	var startSize int
-	if pageSize <= 0 {
-		pageSize = utils.PageSize20
-	}
-	if currentIndex <= 0 {
-		currentIndex = 1
-	}
-	startSize = paging.StartIndex(currentIndex, pageSize)
-
 	cond := ` AND research_type = ?`
 	pars := make([]interface{}, 0)
 	pars = append(pars, reportType)
-	total, e := models.GetReportChapterTypeCount(cond, pars)
+	list, e := models.GetReportChapterTypePageList(cond, pars)
 	if e != nil {
 		br.Msg = "获取失败"
-		br.ErrMsg = "获取报告章节列表总数失败, Err: " + e.Error()
+		br.ErrMsg = "获取报告章节列表失败, Err: " + e.Error()
 		return
 	}
-	list, e := models.GetReportChapterTypePageList(cond, pars, startSize, pageSize)
+	mappingList, e := models.GetChapterTypePermissionByResearchType(reportType)
 	if e != nil {
 		br.Msg = "获取失败"
-		br.ErrMsg = "获取报告章节列表失败, Err: " + e.Error()
+		br.ErrMsg = "获取章节类型权限列表失败, Err: " + e.Error()
 		return
 	}
+	mappingMap := make(map[int][]int)
+	for _, v := range mappingList {
+		mappingMap[v.ReportChapterTypeId] = append(mappingMap[v.ReportChapterTypeId], v.ChartPermissionId)
+	}
+
 	respList := make([]*models.ReportChapterTypeListItem, 0)
 	for i := range list {
+		permissionIds, _ := mappingMap[list[i].ReportChapterTypeId]
 		respList = append(respList, &models.ReportChapterTypeListItem{
 			ReportChapterTypeId:   list[i].ReportChapterTypeId,
 			ReportChapterTypeName: list[i].ReportChapterTypeName,
@@ -79,13 +73,13 @@ func (this *ReportChapterTypeController) List() {
 			WordsImage:            list[i].YbBottomIcon, // 此处的不一样
 			EditImgUrl:            list[i].EditImgUrl,
 			IsShow:                list[i].IsShow,
+			Enabled:               list[i].Enabled,
+			ChartPermissionIdList: permissionIds,
 		})
 	}
 
-	resp := new(models.ReportChapterTypePageListResp)
-	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := new(models.ReportChapterTypeListResp)
 	resp.List = respList
-	resp.Paging = page
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -144,38 +138,83 @@ func (this *ReportChapterTypeController) Add() {
 
 	nowTime := time.Now().Local()
 	item := new(models.ReportChapterType)
+	maxSort, e := item.GetMaxSort()
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取章节最大排序失败, Err:" + e.Error()
+		return
+	}
 	item.ReportChapterTypeName = req.ReportChapterTypeName
-	item.Sort = req.Sort
+	item.Sort = maxSort + 1
 	item.Enabled = 1
 	item.CreatedTime = nowTime
 	item.LastUpdatedTime = nowTime
 	item.ResearchType = req.ResearchType
-	item.ReportChapterTypeName = req.ReportChapterTypeName
-	item.SelectedImage = req.SelectedImage
-	item.UnselectedImage = req.UnselectedImage
-	item.PcSelectedImage = req.SelectedImage
-	item.PcUnselectedImage = req.UnselectedImage
-	item.EditImgUrl = req.EditImgUrl
 	item.IsSet = 0
-	item.YbIconUrl = req.UnselectedImage
-	item.YbBottomIcon = req.WordsImage
-	item.IsShow = req.IsShow
-	item.ReportChapterTypeThumb = req.EditImgUrl
-	item.BannerUrl = req.UnselectedImage
 	item.ReportChapterTypeKey = req.ReportChapterTypeName
 	item.TickerTitle = req.ReportChapterTypeName
+
 	if e = item.Create(); e != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = "新增报告章节失败, Err:" + e.Error()
 		return
 	}
 
+	// todo 更新章节权限
+	cond = ` and product_id=1`
+	pars = make([]interface{}, 0)
+	permissionList, e := services.GetChartPermissionList(cond, pars)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取品种列表失败, Err: " + e.Error()
+		return
+	}
+	permissionIdName := make(map[int]string)
+	for i := range permissionList {
+		permissionIdName[permissionList[i].ChartPermissionId] = permissionList[i].PermissionName
+	}
+
+	researchType := item.ResearchType
+	newPermissions := make([]*models.ReportChapterTypePermission, 0)       // 报告章节权限表(新)
+	newWeekPermissions := make([]*models.ChartPermissionChapterMapping, 0) // 报告章节权限表(老)
+	for i := range req.ChartPermissionIdList {
+		newPermissions = append(newPermissions, &models.ReportChapterTypePermission{
+			ReportChapterTypeId:   item.ReportChapterTypeId,
+			ReportChapterTypeName: item.ReportChapterTypeName,
+			ChartPermissionId:     req.ChartPermissionIdList[i],
+			PermissionName:        permissionIdName[req.ChartPermissionIdList[i]],
+			ResearchType:          researchType,
+			CreatedTime:           nowTime,
+		})
+		if researchType == utils.REPORT_TYPE_WEEK {
+			newWeekPermissions = append(newWeekPermissions, &models.ChartPermissionChapterMapping{
+				ChartPermissionId:   req.ChartPermissionIdList[i],
+				ReportChapterTypeId: item.ReportChapterTypeId,
+				ResearchType:        researchType,
+			})
+		}
+	}
+
+	// 设置权限
+	e = models.SetReportChapterTypePermission(item.ReportChapterTypeId, researchType, newPermissions, newWeekPermissions)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "设置章节类型权限失败, Err: " + e.Error()
+		return
+	}
 	// 清除小程序端的章节缓存
 	{
 		key := "hongze_yb:report_chapter_type:GetEffectTypeID"
 		_ = utils.Rc.Delete(key)
 	}
 
+	//todo 同步更新crm章节权限和章节类型
+	go func() {
+		var syncReq services.ChapterTypeSyncReq
+		syncReq.ResearchType = researchType
+		syncReq.ReportChapterTypeId = item.ReportChapterTypeId
+		_, _ = services.ReportChapterTypeSync(&syncReq)
+	}()
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -242,36 +281,54 @@ func (this *ReportChapterTypeController) Edit() {
 		return
 	}
 	originName := item.ReportChapterTypeName
+	//更新章节权限
+	// todo 更新章节权限
+	cond = ` and product_id=1`
+	pars = make([]interface{}, 0)
+	permissionList, e := services.GetChartPermissionList(cond, pars)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取品种列表失败, Err: " + e.Error()
+		return
+	}
+	permissionIdName := make(map[int]string)
+	nowTime := time.Now().Local()
+	for i := range permissionList {
+		permissionIdName[permissionList[i].ChartPermissionId] = permissionList[i].PermissionName
+	}
 
-	item.ReportChapterTypeName = req.ReportChapterTypeName
-	item.Sort = req.Sort
-	item.ResearchType = req.ResearchType
-	item.SelectedImage = req.SelectedImage
-	item.UnselectedImage = req.UnselectedImage
-	item.PcSelectedImage = req.SelectedImage
-	item.PcUnselectedImage = req.UnselectedImage
-	item.EditImgUrl = req.EditImgUrl
-	item.YbIconUrl = req.UnselectedImage
-	item.YbBottomIcon = req.WordsImage
-	item.IsShow = req.IsShow
-	item.ReportChapterTypeThumb = req.EditImgUrl
-	item.BannerUrl = req.UnselectedImage
-	item.ReportChapterTypeKey = req.ReportChapterTypeName
-	item.TickerTitle = req.ReportChapterTypeName
-	updateCols := []string{"ReportChapterTypeName", "Sort", "ResearchType", "SelectedImage", "UnselectedImage",
-		"PcSelectedImage", "PcUnselectedImage", "EditImgUrl", "YbIconUrl", "YbBottomIcon", "IsShow",
-		"ReportChapterTypeThumb", "BannerUrl", "ReportChapterTypeKey", "TickerTitle",
+	researchType := item.ResearchType
+	newPermissions := make([]*models.ReportChapterTypePermission, 0)       // 报告章节权限表(新)
+	newWeekPermissions := make([]*models.ChartPermissionChapterMapping, 0) // 报告章节权限表(老)
+	for i := range req.ChartPermissionIdList {
+		newPermissions = append(newPermissions, &models.ReportChapterTypePermission{
+			ReportChapterTypeId:   item.ReportChapterTypeId,
+			ReportChapterTypeName: item.ReportChapterTypeName,
+			ChartPermissionId:     req.ChartPermissionIdList[i],
+			PermissionName:        permissionIdName[req.ChartPermissionIdList[i]],
+			ResearchType:          researchType,
+			CreatedTime:           nowTime,
+		})
+		if researchType == utils.REPORT_TYPE_WEEK {
+			newWeekPermissions = append(newWeekPermissions, &models.ChartPermissionChapterMapping{
+				ChartPermissionId:   req.ChartPermissionIdList[i],
+				ReportChapterTypeId: item.ReportChapterTypeId,
+				ResearchType:        researchType,
+			})
+		}
 	}
-	if e = item.Update(updateCols); e != nil {
+
+	// 设置权限
+	e = models.SetReportChapterTypePermission(item.ReportChapterTypeId, researchType, newPermissions, newWeekPermissions)
+	if e != nil {
 		br.Msg = "操作失败"
-		br.ErrMsg = "更新报告章节失败, Err:" + e.Error()
+		br.ErrMsg = "设置章节类型权限失败, Err: " + e.Error()
 		return
 	}
-
 	// 更新研报章节表冗余
 	if originName != req.ReportChapterTypeName {
 		go func() {
-			_ = models.UpdateReportChapterTypeNameByTypeId(item.ReportChapterTypeId, req.ReportChapterTypeName)
+			_ = models.UpdateReportChapterTypeNameByTypeId(req.ReportChapterTypeId, req.ReportChapterTypeName)
 		}()
 	}
 
@@ -281,6 +338,12 @@ func (this *ReportChapterTypeController) Edit() {
 		_ = utils.Rc.Delete(key)
 	}
 
+	go func() {
+		var syncReq services.ChapterTypeSyncReq
+		syncReq.ResearchType = researchType
+		syncReq.ReportChapterTypeId = item.ReportChapterTypeId
+		_, _ = services.ReportChapterTypeSync(&syncReq)
+	}()
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -398,10 +461,12 @@ func (this *ReportChapterTypeController) AuthSetting() {
 		br.Msg = "章节不存在或已被删除"
 		return
 	}
-	permissionList, e := models.GetChartPermissionList()
+	cond := ` and product_id=1`
+	pars := make([]interface{}, 0)
+	permissionList, e := services.GetChartPermissionList(cond, pars)
 	if e != nil {
-		br.Msg = "操作失败"
-		br.ErrMsg = "获取权限列表失败, Err: " + e.Error()
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取品种列表失败, Err: " + e.Error()
 		return
 	}
 	permissionIdName := make(map[int]string)
@@ -500,3 +565,120 @@ func (this *ReportChapterTypeController) PermissionList() {
 	br.Msg = "获取成功"
 	br.Data = respList
 }
+
+// Move
+// @Title 移动章节类型
+// @Description 移动章节类型
+// @Param	request	body models.PermissionMoveReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /chapter_type/move [post]
+func (this *ReportChapterTypeController) Move() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req models.ReportChapterTypeMoveReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+
+	if req.ReportChapterTypeId == 0 {
+		br.Msg = "请选择要移动的章节类型"
+		return
+	}
+	e, msg := services.MoveReportChapterType(&req)
+	if e != nil {
+		br.Msg = msg
+		br.ErrMsg = "移动品种失败, Err: " + e.Error()
+		return
+	}
+	go func() {
+		var syncReq services.ChapterTypeSyncReq
+		_, _ = services.ReportChapterTypeSync(&syncReq)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// SetEnabled
+// @Title 设置启用/禁用
+// @Description 移动章节类型
+// @Param	request	body models.PermissionMoveReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /chapter_type/enabled/set [post]
+func (this *ReportChapterTypeController) SetEnabled() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req models.ReportChapterTypeEnabledReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+
+	if req.ReportChapterTypeId == 0 {
+		br.Msg = "请选择正确的章节类型"
+		return
+	}
+	if req.Enabled != 0 && req.Enabled != 1 {
+		br.Msg = "请选择正确的启用禁用状态"
+		return
+	}
+	ob := new(models.ReportChapterType)
+	item, err := models.GetReportChapterTypeById(req.ReportChapterTypeId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "章节不存在"
+			br.ErrMsg = "章节不存在, Err:" + err.Error()
+			return
+		}
+		br.Msg = "获取章节信息失败"
+		br.ErrMsg = "获取章节信息失败, Err:" + err.Error()
+		return
+	}
+	if item == nil {
+		br.Msg = "章节不存在"
+		return
+	}
+	//设置分类启用、禁用状态
+	err = ob.SetEnabled(req.ReportChapterTypeId, req.Enabled)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "设置报告章节状态失败, Err: " + err.Error()
+		return
+	}
+	go func() {
+		var syncReq services.ChapterTypeSyncReq
+		_, _ = services.ReportChapterTypeSync(&syncReq)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 195 - 27
models/chart_permission.go

@@ -1,44 +1,212 @@
 package models
 
 import (
+	"eta/eta_api/utils"
+	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
 
 // ChartPermission 报告权限表
 type ChartPermission struct {
-	ChartPermissionId   int       `orm:"column(chart_permission_id);pk" description:"问题ID"`
-	ChartPermissionName string    `description:"名称"`
-	PermissionName      string    `description:"权限名"`
-	Sort                int       `description:"排序"`
-	Enabled             int       `description:"是否可用"`
-	CreatedTime         time.Time `description:"创建时间"`
-	LastUpdatedTime     time.Time `description:"更新时间"`
-	TeleconferenceSort  int       `description:"电话会类型排序"`
-	Remark              string    `description:"备注"`
-	ClassifyName        string    `description:"分类名称"`
-	ProductName         string    `description:"产品名称"`
-	ProductId           int       `description:"产品ID"`
-	ImageURL            string    `description:"图片地址"`
-	ShowType            int       `description:"1:查研观向小程序展示"`
-	IsOther             int       `description:"是否是其他,用于查研观向小程序后台展示"`
-	IsReport            int       `description:"是否是报告,用于查研观向小程序前台报告展示"`
-	CygxAuth            int       `description:"是否是权限,用于查研观向小程序前台权限校验"`
-	YbImgUrl            string    `description:"研报小程序报告列表icon"`
-	PriceDrivenState    int       `description:"品种价格驱动开启状态 0-关闭 1-开启"`
+	ChartPermissionId     int       `orm:"column(chart_permission_id);pk" description:"问题ID" json:"chart_permission_id"`
+	ChartPermissionName   string    `description:"名称" json:"chart_permission_name"`
+	PermissionName        string    `description:"权限名" json:"permission_name"`
+	Sort                  int       `description:"排序" json:"sort"`
+	Enabled               int       `description:"是否可用" json:"enabled"`
+	CreatedTime           time.Time `description:"创建时间" json:"created_time"`
+	LastUpdatedTime       time.Time `description:"更新时间" json:"last_updated_time"`
+	TeleconferenceSort    int       `description:"电话会类型排序" json:"teleconference_sort"`
+	Remark                string    `description:"备注" json:"remark"`
+	ClassifyName          string    `description:"分类名称" json:"classify_name"`
+	ProductName           string    `description:"产品名称" json:"product_name"`
+	ProductId             int       `description:"产品ID" json:"product_id"`
+	ImageURL              string    `orm:"column(image_url);" description:"图片地址" json:"image_url"`
+	ShowType              int       `description:"1:查研观向小程序展示" json:"show_type"`
+	IsOther               int       `description:"是否是其他,用于查研观向小程序后台展示" json:"is_other"`
+	IsReport              int       `description:"是否是报告,用于查研观向小程序前台报告展示" json:"is_report"`
+	CygxAuth              int       `description:"是否是权限,用于查研观向小程序前台权限校验" json:"cygx_auth"`
+	PermissionType        int       `description:"1主观,2客观" json:"permission_type"`
+	YbImgUrl              string    `description:"研报小程序报告列表icon" json:"yb_img_url"`
+	ProductPermissionName string    `description:"种类权限名称" json:"product_permission_name"`
+	PriceDrivenState      int       `description:"品种价格驱动开启状态 0-关闭 1-开启" json:"price_driven_state"`
+	ImageUrlM             string    `description:"图片地址(查研观向移动端)" json:"image_url_m"`
+	ParentId              int       `description:"父级权限id" json:"parent_id"`
+	IsPublic              int       `description:"是否是公有权限1:公有权限,0私有权限" json:"is_public"`
+}
+
+type ChartPermissionItem struct {
+	PermissionId   int    `description:"品种权限ID"`
+	PermissionName string `description:"品种权限名称"`
+	ParentId       int    `description:"父级ID"`
+	IsPublic       int    `description:"是否是公有权限1:公有权限,0私有权限" `
+	Enabled        int    `description:"是否可用:1可用,0不可用" `
+	Sort           int    `description:"排序"`
+	CreateTime     string `description:"创建时间"`
+	Child          []*ChartPermissionItem
 }
 
 // Update 更新
-func (chartPermissionInfo *ChartPermission) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("weekly")
-	_, err = o.Update(chartPermissionInfo, cols...)
+func (c *ChartPermission) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	_, err = o.Update(c, cols...)
+	return
+}
+
+type PermissionAddReq struct {
+	PermissionName string `description:"品种权限名称"`
+	ParentId       int    `description:"父级ID"`
+	Enabled        int    `description:"是否可用 0禁用, 1启用"` //启用,禁用操作会关联二级品种
+	IsPublic       int    `description:"是否是公有权限1:公有权限,0私有权限"`
+}
+
+type PermissionEditReq struct {
+	PermissionId        int    `description:"品种权限Id"` // 如果ID存在,则是更新操作,否则是新增操作
+	PermissionName      string `description:"品种权限名称"`
+	ParentId            int    `description:"父级ID"`
+	Enabled             int    `description:"是否可用 0禁用, 1启用"` //启用,禁用操作会关联二级品种
+	IsPublic            int    `description:"是否是公有权限1:公有权限,0私有权限"`
+	PublicPermissionIds []int  `description:"公有权限的ID列表"` //一级品种没有公有私有属性
+}
+
+type PermissionEnabledReq struct {
+	PermissionId int `description:"品种权限Id"`        // 如果ID存在,则是更新操作,否则是新增操作
+	Enabled      int `description:"是否可用 0禁用, 1启用"` //启用,禁用操作会关联二级品种
+}
+
+type PermissionMoveReq struct {
+	PermissionId int `description:"品种id"`
+	//	ParentChartPermissionId int `description:"父级品种id"`
+	PrevPermissionId int `description:"上一个兄弟节点品种id"`
+	NextPermissionId int `description:"下一个兄弟节点品种id"`
+}
+
+func (c *ChartPermission) SetEnabled(id, enabled int) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	sql := ` UPDATE chart_permission SET enabled =?  WHERE id = ?`
+	_, err = to.Raw(sql, enabled, id).Exec()
+	if err != nil {
+		return
+	}
+	sql = ` UPDATE chart_permission SET enabled =?  WHERE parent_id = ?`
+	_, err = to.Raw(sql, enabled, id).Exec()
+	if err != nil {
+		return
+	}
+	return
+}
+
+// Create 新增权限
+func (c *ChartPermission) Create() (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	id, err := o.Insert(c)
+	if err != nil {
+		return
+	}
+	c.ChartPermissionId = int(id)
+	return
+}
+
+// SetIsPublic 更新公有私有权限
+func (c *ChartPermission) SetIsPublic(ids []int, parentId, isPublic int) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `update chart_permission set is_public=? WHERE parent_id = ?  and  chart_permission_id IN (` + utils.GetOrmInReplace(len(ids)) + `)`
+	_, err = o.Raw(sql, isPublic, parentId, ids).Exec()
+	return
+}
+
+// UpdatesByParentId 更新启动禁用
+func (c *ChartPermission) UpdateClassifyNameByParentId(parentId int, classifyName string) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `update chart_permission set classify_name=? WHERE parent_id = ?`
+	_, err = o.Raw(sql, classifyName, parentId).Exec()
+	return
+}
+
+// SetEnabledByParentId 更新启动禁用
+func (c *ChartPermission) SetEnabledByParentId(parentId, enabled int) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` UPDATE chart_permission SET enabled =?  WHERE parent_id = ?`
+	_, err = o.Raw(sql, enabled, parentId).Exec()
+	return
+}
+
+// SetEnabledByChartPermissionId 更新启动禁用
+func (c *ChartPermission) SetEnabledByChartPermissionId(chartPermissionId, enabled int) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` UPDATE chart_permission SET enabled =?  WHERE chart_permission_id = ?`
+	_, err = o.Raw(sql, enabled, chartPermissionId).Exec()
+	return
+}
+
+// GetItemById 查询品种
+func (c *ChartPermission) GetItemById(chartPermissionId int) (item *ChartPermission, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `select * from chart_permission WHERE chart_permission_id = ?`
+	err = o.Raw(sql, chartPermissionId).QueryRow(&item)
+	return
+}
+
+// GetItemsByCondition 查询列表
+func (c *ChartPermission) GetItemsByCondition(condition string, pars []interface{}) (items []*ChartPermission, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `select * from chart_permission WHERE 1=1 ` + condition + ` order by sort asc, chart_permission_id asc`
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// GetItemByCondition 查询列表
+func (c *ChartPermission) GetItemByCondition(condition string, pars []interface{}) (item *ChartPermission, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `select * from chart_permission WHERE 1=1 ` + condition
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+// UpdateChartPermissionSortByParentId 根据父类id更新排序
+func UpdateChartPermissionSortByParentId(parentId, chartPermissionId, nowSort int, updateSort string, productId int) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` update chart_permission set sort = ` + updateSort + ` WHERE parent_id=? AND product_id = ? AND (sort > ? `
+	if chartPermissionId > 0 {
+		sql += ` or ( chart_permission_id > ` + fmt.Sprint(chartPermissionId) + ` and sort = ` + fmt.Sprint(nowSort) + `))`
+	} else {
+		sql += `)`
+	}
+	_, err = o.Raw(sql, parentId, productId, nowSort).Exec()
+	return
+}
+
+// GetMaxSort 获取最大的排序值
+func (c *ChartPermission) GetMaxSort() (maxSort int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `select max(sort) from chart_permission `
+	err = o.Raw(sql).QueryRow(&maxSort)
+	return
+}
+
+// GetMaxSortByParentId 获取最大的排序值
+func (c *ChartPermission) GetMaxSortByParentId(parentId int) (maxSort int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `select max(sort) from chart_permission WHERE parent_id=? `
+	err = o.Raw(sql, parentId).QueryRow(&maxSort)
 	return
 }
 
-// GetChartPermissionList 获取品种权限列表
-func GetChartPermissionList() (list []*ChartPermission, err error) {
-	o := orm.NewOrmUsingDB("weekly")
-	sql := `SELECT * FROM chart_permission ORDER BY product_id ASC, sort ASC`
-	_, err = o.Raw(sql).QueryRows(&list)
+// GetFirstChartPermissionByParentId 获取当前父级分类下,且排序数相同 的排序第一条的数据
+func (c *ChartPermission) GetFirstChartPermissionByParentId(parentId int) (item *ChartPermission, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `select * from chart_permission WHERE parent_id=? ORDER BY sort ASC, chart_permission_id ASC LIMIT 1`
+	err = o.Raw(sql, parentId).QueryRow(&item)
 	return
 }

+ 130 - 43
models/classify.go

@@ -2,6 +2,7 @@ package models
 
 import (
 	"eta/eta_api/utils"
+	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"time"
@@ -39,38 +40,40 @@ type Classify struct {
 	RelateTel         int       `description:"是否在电话会中可选: 0-否; 1-是"`
 	RelateVideo       int       `description:"是否在路演视频中可选: 0-否; 1-是"`
 	IsMassSend        int       `description:"1:群发,0:非群发"`
+	Enabled           int       `description:"是否可用,1可用,0禁用"`
 }
 
 type ClassifyAddReq struct {
-	ClassifyName      string                 `description:"分类名称"`
-	ParentId          int                    `description:"父级分类id,没有父级分类传0"`
-	Abstract          string                 `description:"栏目简介"`
-	Descript          string                 `description:"分享描述"`
-	ReportAuthor      string                 `description:"栏目作者"`
-	AuthorDescript    string                 `description:"作者简介"`
-	ColumnImgUrl      string                 `description:"栏目配图"`
-	ReportImgUrl      string                 `description:"报告配图"`
-	HeadImgUrl        string                 `description:"头部banner"`
-	AvatarImgUrl      string                 `description:"头像"`
-	HomeImgUrl        string                 `description:"首页配图"`
-	ClassifyLabel     string                 `description:"分类标签"`
-	ShowType          int                    `description:"展示类型:1-列表 2-专栏"`
-	HasTeleconference int                    `description:"是否有电话会:0-否 1-是"`
-	VipTitle          string                 `description:"研究员头衔"`
-	Sort              int                    `description:"后台排序"`
-	IsShow            int                    `description:"是否在小程序显示:1-显示 0-隐藏"`
-	YbFiccSort        int                    `description:"小程序FICC页排序"`
-	YbFiccIcon        string                 `description:"小程序FICC页icon"`
-	YbFiccPcIcon      string                 `description:"小程序PC端FICC页背景图"`
-	YbIconUrl         string                 `description:"小程序已购页icon"`
-	YbBgUrl           string                 `description:"小程序已购详情背景图"`
-	YbListImg         string                 `description:"小程序研报列表封面图"`
-	YbShareBgImg      string                 `description:"小程序研报详情分享背景图"`
-	YbRightBanner     string                 `description:"Pc端详情页,右侧,报告合集背景图"`
-	MenuList          []*ClassifyMenuSaveReq `description:"子目录列表"`
-	ClassifyMenuId    int                    `description:"二级分类-子目录ID"`
-	RelateTel         int                    `description:"是否在电话会中可选: 0-否; 1-是"`
-	RelateVideo       int                    `description:"是否在路演视频中可选: 0-否; 1-是"`
+	ClassifyName          string `description:"分类名称"`
+	ParentId              int    `description:"父级分类id,没有父级分类传0"`
+	ChartPermissionIdList []int  `description:"权限id数组"`
+	/*Abstract              string                 `description:"栏目简介"`
+	Descript              string                 `description:"分享描述"`
+	ReportAuthor          string                 `description:"栏目作者"`
+	AuthorDescript        string                 `description:"作者简介"`
+	ColumnImgUrl          string                 `description:"栏目配图"`
+	ReportImgUrl          string                 `description:"报告配图"`
+	HeadImgUrl            string                 `description:"头部banner"`
+	AvatarImgUrl          string                 `description:"头像"`
+	HomeImgUrl            string                 `description:"首页配图"`
+	ClassifyLabel         string                 `description:"分类标签"`
+	ShowType              int                    `description:"展示类型:1-列表 2-专栏"`
+	HasTeleconference     int                    `description:"是否有电话会:0-否 1-是"`
+	VipTitle              string                 `description:"研究员头衔"`
+	Sort                  int                    `description:"后台排序"`
+	IsShow                int                    `description:"是否在小程序显示:1-显示 0-隐藏"`
+	YbFiccSort            int                    `description:"小程序FICC页排序"`
+	YbFiccIcon            string                 `description:"小程序FICC页icon"`
+	YbFiccPcIcon          string                 `description:"小程序PC端FICC页背景图"`
+	YbIconUrl             string                 `description:"小程序已购页icon"`
+	YbBgUrl               string                 `description:"小程序已购详情背景图"`
+	YbListImg             string                 `description:"小程序研报列表封面图"`
+	YbShareBgImg          string                 `description:"小程序研报详情分享背景图"`
+	YbRightBanner         string                 `description:"Pc端详情页,右侧,报告合集背景图"`
+	MenuList              []*ClassifyMenuSaveReq `description:"子目录列表"`
+	ClassifyMenuId        int                    `description:"二级分类-子目录ID"`
+	RelateTel             int                    `description:"是否在电话会中可选: 0-否; 1-是"`
+	RelateVideo           int                    `description:"是否在路演视频中可选: 0-否; 1-是"`*/
 }
 
 func GetClassifyByName(classifyName string, parentId int) (item *Classify, err error) {
@@ -140,8 +143,11 @@ func DeleteClassify(classifyId int) (err error) {
 // 修改分类
 func EditClassify(req *EditClassifyReq) (err error) {
 	o := orm.NewOrmUsingDB("rddp")
-	sql := `UPDATE classify SET classify_name = ?,abstract=?, parent_id= ?,descript=?,report_author=?,author_descript=?,column_img_url=?,head_img_url=?,avatar_img_url=?,report_img_url=?,home_img_url=?,classify_label=?,show_type=?,has_teleconference=?,vip_title=?,modify_time= NOW() WHERE id = ? `
-	_, err = o.Raw(sql, req.ClassifyName, req.Abstract, req.ParentId, req.Descript, req.ReportAuthor, req.AuthorDescript, req.ColumnImgUrl, req.HeadImgUrl, req.AvatarImgUrl, req.ReportImgUrl, req.HomeImgUrl, req.ClassifyLabel, req.ShowType, req.HasTeleconference, req.VipTitle, req.ClassifyId).Exec()
+	//sql := `UPDATE classify SET classify_name = ?,abstract=?, parent_id= ?,descript=?,report_author=?,author_descript=?,column_img_url=?,head_img_url=?,avatar_img_url=?,report_img_url=?,home_img_url=?,classify_label=?,show_type=?,has_teleconference=?,vip_title=?,modify_time= NOW() WHERE id = ? `
+	//_, err = o.Raw(sql, req.ClassifyName, req.Abstract, req.ParentId, req.Descript, req.ReportAuthor, req.AuthorDescript, req.ColumnImgUrl, req.HeadImgUrl, req.AvatarImgUrl, req.ReportImgUrl, req.HomeImgUrl, req.ClassifyLabel, req.ShowType, req.HasTeleconference, req.VipTitle, req.ClassifyId).Exec()
+	sql := `UPDATE classify SET classify_name = ?,parent_id= ?,modify_time= NOW() WHERE id = ? `
+	_, err = o.Raw(sql, req.ClassifyName, req.ParentId, req.ClassifyId).Exec()
+
 	return
 }
 
@@ -185,19 +191,20 @@ type ClassifyList struct {
 	YbRightBanner     string    `description:"Pc端详情页,右侧,报告合集背景图"`
 	RelateTel         int       `description:"是否在电话会中可选: 0-否; 1-是"`
 	RelateVideo       int       `description:"是否在路演视频中可选: 0-否; 1-是"`
+	Enabled           int       `description:"是否可用,1可用,0禁用"`
 	Child             []*ClassifyItem
 	ClassifyMenuList  []*ClassifyMenu
 }
 
 type ClassifyItem struct {
 	Classify
-	ClassifyMenuId   int `description:"二级分类-子目录ID"`
-	ClassifyMenuList []*ClassifyMenu
+	ClassifyMenuId        int `description:"二级分类-子目录ID"`
+	ClassifyMenuList      []*ClassifyMenu
+	ChartPermissionIdList []int `description:"绑定的权限ID"`
 }
 
 type ClassifyListResp struct {
-	List   []*ClassifyList
-	Paging *paging.PagingItem `description:"分页数据"`
+	List []*ClassifyList
 }
 
 type ClassifyPermissionListResp struct {
@@ -206,7 +213,7 @@ type ClassifyPermissionListResp struct {
 }
 
 // 获取分类列表
-func GetClassifyList(startSize, pageSize int, keyWord, companyType string, hideDayWeek int) (items []*ClassifyList, err error) {
+func GetClassifyList(keyWord, companyType string, hideDayWeek, enabled int) (items []*ClassifyList, err error) {
 	sql := ``
 	companyTypeSqlStr := ``
 	if companyType == "ficc" {
@@ -214,6 +221,9 @@ func GetClassifyList(startSize, pageSize int, keyWord, companyType string, hideD
 	} else if companyType == "权益" {
 		companyTypeSqlStr = " AND (id = 40 or parent_id = 40)  "
 	}
+	if enabled == 1 {
+		companyTypeSqlStr += ` AND enabled = 1 `
+	}
 	pars := make([]interface{}, 0)
 	if keyWord != "" {
 		sql = `SELECT * FROM (
@@ -224,17 +234,17 @@ func GetClassifyList(startSize, pageSize int, keyWord, companyType string, hideD
                    WHERE id IN( SELECT parent_id FROM classify
                    WHERE parent_id>0 ` + companyTypeSqlStr + `  AND classify_name LIKE ? )
                    )AS t
-                   ORDER BY sort ASC,create_time ASC
-                   LIMIT ?,? `
+                   ORDER BY sort ASC,create_time ASC`
 		pars = utils.GetLikeKeywordPars(pars, keyWord, 2)
 	} else {
 		sql = `SELECT * FROM classify WHERE parent_id=0 ` + companyTypeSqlStr
 		if hideDayWeek == 1 {
 			sql += ` AND classify_name <> '晨报' AND classify_name <> '周报' `
 		}
-		sql += ` ORDER BY sort ASC, create_time ASC LIMIT ?,? `
+
+		sql += ` ORDER BY sort ASC, create_time ASC`
 	}
-	pars = append(pars, startSize, pageSize)
+	pars = append(pars)
 
 	o := orm.NewOrmUsingDB("rddp")
 	_, err = o.Raw(sql, pars...).QueryRows(&items)
@@ -312,7 +322,7 @@ func GetClassifyChild(parentId int, keyWord string) (items []*Classify, err erro
 	return
 }
 
-func GetClassifyChildByParentIds(parentId []int, keyWord string) (items []*Classify, err error) {
+func GetClassifyChildByParentIds(parentId []int, keyWord string, enabled int) (items []*Classify, err error) {
 	parentIdLen := len(parentId)
 	if parentIdLen == 0 {
 		return
@@ -322,11 +332,16 @@ func GetClassifyChildByParentIds(parentId []int, keyWord string) (items []*Class
 	pars := make([]interface{}, 0)
 	pars = append(pars, parentId)
 	if keyWord != "" {
-		sql = `SELECT * FROM classify WHERE parent_id IN (` + utils.GetOrmInReplace(parentIdLen) + `) AND classify_name LIKE ? ORDER BY create_time ASC `
+		sql = `SELECT * FROM classify WHERE parent_id IN (` + utils.GetOrmInReplace(parentIdLen) + `) AND classify_name LIKE ? `
 		pars = append(pars, utils.GetLikeKeyword(keyWord))
 	} else {
-		sql = `SELECT * FROM classify WHERE parent_id IN (` + utils.GetOrmInReplace(parentIdLen) + `) ORDER BY create_time ASC `
+		sql = `SELECT * FROM classify WHERE parent_id IN (` + utils.GetOrmInReplace(parentIdLen) + `) `
 	}
+
+	if enabled == 1 {
+		sql += ` AND enabled=1 `
+	}
+	sql += ` ORDER BY create_time ASC `
 	_, err = o.Raw(sql, pars...).QueryRows(&items)
 
 	return
@@ -401,3 +416,75 @@ type RelateTelSecClassifyWithPermissions struct {
 	ClassifyName       string `description:"分类名称"`
 	ChartPermissionIds string `description:"权限IDs"`
 }
+
+// UpdateClassifySortByParentId 根据父类id更新排序
+func UpdateClassifySortByParentId(parentId, permissionId, nowSort int, updateSort string) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` update classify set sort = ` + updateSort + ` WHERE parent_id=? AND sort > ? `
+	if permissionId > 0 {
+		sql += ` or ( id > ` + fmt.Sprint(permissionId) + ` and sort = ` + fmt.Sprint(nowSort) + `)`
+	}
+	_, err = o.Raw(sql, parentId, nowSort).Exec()
+	return
+}
+
+// GetMaxSortByParentId 获取最大的排序值
+func (classifyInfo *Classify) GetMaxSortByParentId(parentId int) (maxSort int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT max(sort) AS sort FROM classify WHERE parent_id = ? `
+	err = o.Raw(sql, parentId).QueryRow(&maxSort)
+	return
+}
+
+// GetMaxSort 获取最大的排序值
+func (classifyInfo *Classify) GetMaxSort() (maxSort int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT max(sort) AS sort FROM classify`
+	err = o.Raw(sql).QueryRow(&maxSort)
+	return
+}
+
+// GetFirstClassifyByParentId 获取当前父级分类下,且排序数相同 的排序第一条的数据
+func (classifyInfo *Classify) GetFirstClassifyByParentId(parentId int) (item *Classify, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM classify WHERE parent_id = ? order by sort asc, id asc limit 1`
+	err = o.Raw(sql, parentId).QueryRow(&item)
+	return
+}
+
+type ClassifyMoveReq struct {
+	ClassifyId     int `description:"分类ID"`
+	PrevClassifyId int `description:"上一个兄弟节点分类id"`
+	NextClassifyId int `description:"下一个兄弟节点分类id"`
+}
+
+type ClassifySetEnabledReq struct {
+	ClassifyId int `description:"分类ID"`
+	Enabled    int `description:"是否可用,1可用,0禁用"`
+}
+
+func (classifyInfo *Classify) SetEnabled(id, enabled int) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	sql := ` UPDATE classify SET enabled =?  WHERE id = ?`
+	_, err = to.Raw(sql, enabled, id).Exec()
+	if err != nil {
+		return
+	}
+	sql = ` UPDATE classify SET enabled =?  WHERE parent_id = ?`
+	_, err = to.Raw(sql, enabled, id).Exec()
+	if err != nil {
+		return
+	}
+	return
+}

+ 9 - 9
models/company/company_permission.go

@@ -37,15 +37,15 @@ type PermissionSetItemType struct {
 }
 
 type PermissionSetList struct {
-	ClassifyName string `description:"分类"`
-	Items        []*PermissionSetItem
-	CheckList    []int
+	PermissionName string `description:"分类"`
+	Child          []*PermissionSetItem
+	CheckList      []int
 }
 
 type PermissionSetListType struct {
-	ClassifyName string `description:"分类"`
-	Items        []*PermissionSetItemType
-	CheckList    []int
+	PermissionName string `description:"分类"`
+	Child          []*PermissionSetItemType
+	CheckList      []int
 }
 
 type PermissionSetResp struct {
@@ -55,7 +55,7 @@ type PermissionSetResp struct {
 }
 
 func GetPermissionSetItems(productId int, classifyName string) (items []*PermissionSetItem, err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND classify_name=?  AND permission_type=0 ORDER BY sort ASC `
 	_, err = o.Raw(sql, productId, classifyName).QueryRows(&items)
 	return
@@ -95,7 +95,7 @@ type PermissionVarietyList struct {
 }
 
 func GetPermissionVarietyItems(productId int, classifyName string) (items []*PermissionVarietyItem, err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND classify_name=? GROUP BY permission_name ORDER BY sort ASC `
 	_, err = o.Raw(sql, productId, classifyName).QueryRows(&items)
 	return
@@ -103,7 +103,7 @@ func GetPermissionVarietyItems(productId int, classifyName string) (items []*Per
 
 // GetChartPermissionListById 根据权限id获取产品权限详情
 func GetChartPermissionListById(chartPermissionId int) (item *ChartPermission, err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := `SELECT * FROM chart_permission WHERE chart_permission_id =? `
 	err = o.Raw(sql, chartPermissionId).QueryRow(&item)
 	return

+ 12 - 1
models/en_classify_permission.go

@@ -1,9 +1,9 @@
 package models
 
 import (
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"eta/eta_api/utils"
 	"strings"
 	"time"
 )
@@ -128,6 +128,17 @@ func ClearAndCreateEnClassifyPermissions(classifyId int, permissions []*EnClassi
 	return
 }
 
+func CreateEnClassifyPermissions(permissions []*EnClassifyPermission) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	if len(permissions) > 0 {
+		if _, e := o.InsertMulti(len(permissions), permissions); e != nil {
+			err = fmt.Errorf("insert multi err: %s", e.Error())
+			return
+		}
+	}
+	return
+}
+
 type EnClassifyPermissionEditReq struct {
 	ClassifyId    int   `description:"分类ID"`
 	EnPermissions []int `description:"权限IDs"`

+ 75 - 7
models/en_permission.go

@@ -16,6 +16,7 @@ type EnPermission struct {
 	Sort             int       `description:"排序"`
 	CreateTime       time.Time `description:"创建时间"`
 	ModifyTime       time.Time `description:"修改时间"`
+	Enabled          int       `description:"是否可用,1可用,0禁用"`
 }
 
 var EnPermissionColumns = struct {
@@ -26,6 +27,7 @@ var EnPermissionColumns = struct {
 	Sort             string
 	CreateTime       string
 	ModifyTime       string
+	Enabled          string
 }{
 	EnPermissionId:   "en_permission_id",
 	EnPermissionName: "en_permission_name",
@@ -34,6 +36,7 @@ var EnPermissionColumns = struct {
 	Sort:             "sort",
 	CreateTime:       "create_time",
 	ModifyTime:       "modify_time",
+	Enabled:          "enabled",
 }
 
 func (m *EnPermission) TableName() string {
@@ -122,19 +125,26 @@ func (m *EnPermission) GetPageItemsByCondition(startSize, pageSize int, conditio
 }
 
 type EnPermissionAddReq struct {
-	EnPermissionName string `description:"品种权限名称"`
+	PermissionName   string `description:"品种权限名称"`
 	CnPermissionName string `description:"对应的中文权限名称"`
 	ParentId         int    `description:"父级ID"`
-	Sort             int    `description:"排序"`
+	Enabled          int    `description:"是否可用,1可用,0禁用"`
 }
 
 type EnPermissionEditReq struct {
-	EnPermissionId int `description:"英文品种权限ID"`
-	EnPermissionAddReq
+	PermissionId     int    `description:"英文品种权限ID"`
+	PermissionName   string `description:"品种权限名称"`
+	CnPermissionName string `description:"对应的中文权限名称"`
+	ParentId         int    `description:"父级ID"`
+}
+
+type EnPermissionEnabledReq struct {
+	PermissionId int `description:"英文品种权限ID"`
+	Enabled      int `description:"是否可用,1可用,0禁用"`
 }
 
 type EnPermissionRemoveReq struct {
-	EnPermissionId int `description:"英文品种权限ID"`
+	PermissionId int `description:"英文品种权限ID"`
 }
 
 type EnPermissionPageListResp struct {
@@ -143,13 +153,20 @@ type EnPermissionPageListResp struct {
 }
 
 type EnPermissionItem struct {
-	EnPermissionId   int    `description:"英文品种权限ID"`
-	EnPermissionName string `description:"品种权限名称"`
+	PermissionId     int    `description:"英文品种权限ID"`
+	PermissionName   string `description:"品种权限名称"`
 	CnPermissionName string `description:"对应的中文权限名称"`
 	ParentId         int    `description:"父级ID"`
 	Sort             int    `description:"排序"`
 	CreateTime       string `description:"创建时间"`
 	Child            []*EnPermissionItem
+	Enabled          int `description:"是否可用,1可用,0禁用"`
+}
+
+type EnPermissionMoveReq struct {
+	PermissionId     int `description:"品种id"`
+	PrevPermissionId int `description:"上一个兄弟节点品种id"`
+	NextPermissionId int `description:"下一个兄弟节点品种id"`
 }
 
 func GetEnPermissionUnionList(condition string, pars []interface{}) (items []*EnPermission, err error) {
@@ -203,3 +220,54 @@ func ClearEnPermissionsByPermissionId(permissionId int) (err error) {
 	}
 	return
 }
+
+// UpdateEnPermissionSortByParentId 根据父类id更新排序
+func UpdateEnPermissionSortByParentId(parentId, permissionId, nowSort int, updateSort string) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` update en_permission set sort = ` + updateSort + ` WHERE parent_id=? AND sort > ? `
+	if permissionId > 0 {
+		sql += ` or ( en_permission_id > ` + fmt.Sprint(permissionId) + ` and sort = ` + fmt.Sprint(nowSort) + `)`
+	}
+	_, err = o.Raw(sql, parentId, nowSort).Exec()
+	return
+}
+
+// GetMaxSortByParentId 获取最大的排序值
+func (m *EnPermission) GetMaxSortByParentId(parentId int) (maxSort int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := fmt.Sprintf(`SELECT max(%s) AS sort FROM %s WHERE %s = ? `, EnPermissionColumns.Sort, m.TableName(), EnPermissionColumns.ParentId)
+	err = o.Raw(sql, parentId).QueryRow(&maxSort)
+	return
+}
+
+// GetMaxSort 获取最大的排序值
+func (m *EnPermission) GetMaxSort() (maxSort int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := fmt.Sprintf(`SELECT max(%s) AS sort FROM %s`, EnPermissionColumns.Sort, m.TableName())
+	err = o.Raw(sql).QueryRow(&maxSort)
+	return
+}
+
+// GetFirstEnPermissionByParentId 获取当前父级分类下,且排序数相同 的排序第一条的数据
+func (m *EnPermission) GetFirstEnPermissionByParentId(parentId int) (item *EnPermission, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? order by sort asc, en_permission_id asc limit 1`, m.TableName(), EnPermissionColumns.ParentId)
+	err = o.Raw(sql, parentId).QueryRow(&item)
+	return
+}
+
+// SetEnabled 更新启动禁用
+func (m *EnPermission) SetEnabled(parentId, enabled int) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := fmt.Sprintf(`UPDATE %s SET %s = ?  WHERE %s = ?`, m.TableName(), EnPermissionColumns.Enabled, EnPermissionColumns.ParentId)
+	_, err = o.Raw(sql, enabled, parentId).Exec()
+	return
+}
+
+// SetEnabledByPermissionId 更新启动禁用
+func (m *EnPermission) SetEnabledByPermissionId(permissionId, enabled int) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := fmt.Sprintf(`UPDATE %s SET %s = ?  WHERE %s = ?`, m.TableName(), EnPermissionColumns.Enabled, EnPermissionColumns.EnPermissionId)
+	_, err = o.Raw(sql, enabled, permissionId).Exec()
+	return
+}

+ 58 - 0
models/english_classify.go

@@ -0,0 +1,58 @@
+package models
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+)
+
+// UpdateEnglishClassifySortByParentId 根据父类id更新排序
+func UpdateEnglishClassifySortByParentId(parentId, permissionId, nowSort int, updateSort string) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` update english_classify set sort = ` + updateSort + ` WHERE parent_id=? AND sort > ? `
+	if permissionId > 0 {
+		sql += ` or ( id > ` + fmt.Sprint(permissionId) + ` and sort = ` + fmt.Sprint(nowSort) + `)`
+	}
+	_, err = o.Raw(sql, parentId, nowSort).Exec()
+	return
+}
+
+// GetMaxSortByParentId 获取最大的排序值
+func (classifyInfo *EnglishClassify) GetMaxSortByParentId(parentId int) (maxSort int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT max(sort) AS sort FROM english_classify WHERE parent_id = ? `
+	err = o.Raw(sql, parentId).QueryRow(&maxSort)
+	return
+}
+
+// GetMaxSort 获取最大的排序值
+func (classifyInfo *EnglishClassify) GetMaxSort() (maxSort int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT max(sort) AS sort FROM english_classify`
+	err = o.Raw(sql).QueryRow(&maxSort)
+	return
+}
+
+// GetFirstClassifyByParentId 获取当前父级分类下,且排序数相同 的排序第一条的数据
+func (classifyInfo *EnglishClassify) GetFirstClassifyByParentId(parentId int) (item *Classify, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM english_classify WHERE parent_id = ? order by sort asc, id asc limit 1`
+	err = o.Raw(sql, parentId).QueryRow(&item)
+	return
+}
+
+type EnglishClassifyMoveReq struct {
+	ClassifyId     int `description:"分类ID"`
+	PrevClassifyId int `description:"上一个兄弟节点分类id"`
+	NextClassifyId int `description:"下一个兄弟节点分类id"`
+}
+
+type EnClassifyAddReq struct {
+	EnPermissions []int  `description:"权限IDs"`
+	ClassifyName  string `description:"分类名称"`
+	ParentId      int    `description:"父级分类id"`
+}
+
+type EnClassifyEditReq struct {
+	ClassifyId int `description:"分类ID"`
+	EnClassifyAddReq
+}

+ 55 - 37
models/english_report.go

@@ -422,63 +422,49 @@ type EnglishClassifyList struct {
 	IsShow        int       `description:"是否在小程序显示:1-显示 0-隐藏"`
 	//ClassifyType  int       `description:"分类类型:0英文报告,1英文线上路演"`
 	EnPermissions []int `description:"英文权限IDs"`
+	Enabled       int   `description:"是否可用,1可用,0禁用"`
 	Child         []*EnglishClassifyList
 }
 
 type EnglishClassifyListResp struct {
-	List   []*EnglishClassifyList
-	Paging *paging.PagingItem `description:"分页数据"`
+	List []*EnglishClassifyList
 }
 
 // GetEnglishClassifyRootId 获取一级分类列表
-func GetEnglishClassifyRootId(startSize, pageSize int, keyword string) (items []*EnglishClassifyList, err error) {
+func GetEnglishClassifyRootId(keyword string, enabled int) (items []*EnglishClassifyList, err error) {
 	sql := ``
 	o := orm.NewOrmUsingDB("rddp")
+	cond := ""
+	if enabled == 1 {
+		cond = " AND enabled=1 "
+	}
 	if keyword != "" {
 		sql = `SELECT * FROM (
 			                   SELECT * FROM english_classify
-                   WHERE parent_id=0 AND classify_name ?
+                   WHERE parent_id=0 ` + cond + ` AND classify_name LIKE ? 
                    UNION
                    SELECT * FROM english_classify
                    WHERE id IN(SELECT parent_id FROM english_classify
-                   WHERE parent_id>0 AND classify_name LIKE ?)
+                   WHERE parent_id>0 ` + cond + ` AND classify_name LIKE ? )
                    )AS t
-                   ORDER BY sort ASC,create_time ASC
-                   LIMIT ?,? `
-		_, err = o.Raw(sql, utils.GetLikeKeyword(keyword), utils.GetLikeKeyword(keyword), startSize, pageSize).QueryRows(&items)
+                   ORDER BY sort ASC,create_time ASC`
+		_, err = o.Raw(sql, utils.GetLikeKeyword(keyword), utils.GetLikeKeyword(keyword)).QueryRows(&items)
 	} else {
-		sql = `SELECT * FROM english_classify WHERE parent_id=0 ORDER BY sort ASC,create_time ASC LIMIT ?,? `
-		_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
+		sql = `SELECT * FROM english_classify WHERE parent_id=0 ` + cond + ` ORDER BY sort ASC,create_time ASC `
+		_, err = o.Raw(sql).QueryRows(&items)
 	}
 	return
 }
 
-func GetEnglishClassifyListCount(keyword string) (count int, err error) {
-	sqlCount := ``
-	o := orm.NewOrmUsingDB("rddp")
-	if keyword != "" {
-		sqlCount = `SELECT  COUNT(1) AS count FROM (
-               SELECT * FROM english_classify
-               WHERE parent_id=0 AND classify_name LIKE ?
-               UNION
-               SELECT * FROM english_classify
-               WHERE id IN(SELECT parent_id FROM english_classify
-               WHERE parent_id>0 AND classify_name LIKE ?)
-               )AS t `
-		err = o.Raw(sqlCount, utils.GetLikeKeyword(keyword), utils.GetLikeKeyword(keyword)).QueryRow(&count)
-	} else {
-		sqlCount = `SELECT COUNT(1) AS count FROM english_classify WHERE parent_id=0`
-		err = o.Raw(sqlCount).QueryRow(&count)
-	}
-
-	return
-}
-
-func GetEnglishClassifyListByRootId(rootIds []int, keyword string) (items []*EnglishClassifyList, err error) {
+func GetEnglishClassifyListByRootId(rootIds []int, keyword string, enabled int) (items []*EnglishClassifyList, err error) {
 	sql := ``
 	pars := make([]interface{}, 0)
 
 	o := orm.NewOrmUsingDB("rddp")
+	cond := ""
+	if enabled == 1 {
+		cond = " AND enabled=1 "
+	}
 	if keyword != "" {
 		sql = `SELECT
 	a.*
@@ -486,12 +472,12 @@ FROM
 	english_classify a
 	LEFT JOIN english_classify b ON a.root_id = b.id
 	LEFT JOIN english_classify c ON a.parent_id = c.id
-	WHERE a.parent_id>0 and a.classify_name LIKE ? and a.root_id IN (` + utils.GetOrmInReplace(len(rootIds)) + `)`
+	WHERE a.parent_id>0  ` + cond + ` and a.classify_name LIKE ? and a.root_id IN (` + utils.GetOrmInReplace(len(rootIds)) + `)`
 		pars = append(pars, utils.GetLikeKeyword(keyword))
 		pars = append(pars, rootIds)
 		_, err = o.Raw(sql, pars).QueryRows(&items)
 	} else {
-		sql = `SELECT * FROM english_classify WHERE parent_id>0 and root_id IN (` + utils.GetOrmInReplace(len(rootIds)) + `) `
+		sql = `SELECT * FROM english_classify WHERE parent_id>0  ` + cond + ` and root_id IN (` + utils.GetOrmInReplace(len(rootIds)) + `) `
 		_, err = o.Raw(sql, rootIds).QueryRows(&items)
 	}
 	return
@@ -548,6 +534,7 @@ type EnglishClassify struct {
 	ShowType      int       `description:"展示类型:1-列表 2-专栏"`
 	IsShow        int       `description:"是否在小程序显示:1-显示 0-隐藏"`
 	//ClassifyType  int       `description:"分类类型:0英文报告,1英文线上路演"`
+	Enabled int `description:"是否可用,1可用,0禁用"`
 }
 
 func AddEnglishClassify(item *EnglishClassify) (lastId int64, err error) {
@@ -621,10 +608,10 @@ func GetEnglishClassifyCountsByName(name string, parentId int) (count int, err e
 }
 
 // GetEnglishFirstClassifyList 获取一级、二级分类列表
-func GetEnglishFirstClassifyList(startSize, pageSize int) (items []*EnglishClassifyList, err error) {
+func GetEnglishFirstClassifyList() (items []*EnglishClassifyList, err error) {
 	o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT * FROM english_classify WHERE parent_id=0  ORDER BY sort ASC,create_time ASC LIMIT ?,? `
-	_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
+	sql := `SELECT * FROM english_classify WHERE parent_id=0  ORDER BY sort ASC,create_time`
+	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
 
@@ -895,3 +882,34 @@ func UpdateEnglishReportsStateBySecondIds(oldState, newState int, secondIds []in
 	_, err = o.Raw(sql, oldState, newState, secondIds).Exec()
 	return
 }
+
+type EnglishClassifySetEnabledReq struct {
+	ClassifyId int `description:"分类ID"`
+	Enabled    int `description:"是否可用,1可用,0禁用"`
+}
+
+func (classifyInfo *EnglishClassify) SetEnabled(id, enabled int) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	sql := ` UPDATE english_classify SET enabled =?  WHERE id = ?`
+	_, err = to.Raw(sql, enabled, id).Exec()
+	if err != nil {
+		return
+	}
+	sql = ` UPDATE english_classify SET enabled =?  WHERE parent_id = ? or root_id = ?`
+	_, err = to.Raw(sql, enabled, id, id).Exec()
+	if err != nil {
+		return
+	}
+	return
+}

+ 13 - 6
models/permission.go

@@ -13,15 +13,22 @@ type ChartPermissionSearchKeyWordMapping struct {
 }
 
 func GetPermission(classifyNameSecond string) (items []*ChartPermissionSearchKeyWordMapping, err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := `SELECT * FROM chart_permission_search_key_word_mapping AS a WHERE a.from='rddp' AND a.key_word=? `
 	_, err = o.Raw(sql, classifyNameSecond).QueryRows(&items)
 	return
 }
 
+func GetAllPermissionMapping() (items []*ChartPermissionSearchKeyWordMapping, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM chart_permission_search_key_word_mapping AS a WHERE a.from='rddp'`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
 // EditChartPermissionSearchKeyWordMappingMulti 修改报告报告权限(先删除原有的权限,再添加新的权限)
 func EditChartPermissionSearchKeyWordMappingMulti(keyword string, permissionIdList []int) (err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	to, err := o.Begin()
 	if err != nil {
 		return
@@ -59,14 +66,14 @@ func EditChartPermissionSearchKeyWordMappingMulti(keyword string, permissionIdLi
 func AddChartPermissionChapterMapping(chartPermissionId int, reportId int64) (err error) {
 	sql := `INSERT INTO chart_permission_chapter_mapping (chart_permission_id, report_chapter_type_id,research_type)
            VALUES(?,?,?)`
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	_, err = o.Raw(sql, chartPermissionId, reportId, "rddp").Exec()
 	return
 }
 
 func RemoveChartPermissionChapterMapping(reportId int64) (err error) {
 	sql := ` DELETE FROM chart_permission_chapter_mapping WHERE research_type=? AND report_chapter_type_id=? `
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	_, err = o.Raw(sql, "rddp", reportId).Exec()
 	return
 }
@@ -77,7 +84,7 @@ type ChartPermissionMappingIdName struct {
 }
 
 func GetChartPermissionNameFromMappingByKeyword(keyword string, source string) (list []*ChartPermissionMappingIdName, err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := " SELECT b.chart_permission_id AS permission_id,b.permission_name FROM chart_permission_search_key_word_mapping AS a INNER JOIN chart_permission AS b ON a.chart_permission_id = b.chart_permission_id WHERE a.`from` = ? AND a.key_word = ? "
 	_, err = o.Raw(sql, source, keyword).QueryRows(&list)
 
@@ -86,7 +93,7 @@ func GetChartPermissionNameFromMappingByKeyword(keyword string, source string) (
 
 // UpdateChartPermissionNameFromMappingByKeyword 根据关键词及来源更新新关键词
 func UpdateChartPermissionNameFromMappingByKeyword(newKeyword, keyword, source string) (err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := " UPDATE chart_permission_search_key_word_mapping SET key_word = ? WHERE key_word = ? AND `from` = ? "
 	_, err = o.Raw(sql, newKeyword, keyword, source).Exec()
 	return

+ 100 - 36
models/report_chapter_type.go

@@ -2,8 +2,8 @@ package models
 
 import (
 	"eta/eta_api/utils"
+	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"time"
 )
 
@@ -32,25 +32,25 @@ type ReportChapterType struct {
 	YbBottomIcon           string    `description:"研报小程序详情底部icon"`
 }
 
-func (item *ReportChapterType) Create() (err error) {
-	o := orm.NewOrmUsingDB("weekly")
-	id, err := o.Insert(item)
+func (r *ReportChapterType) Create() (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	id, err := o.Insert(r)
 	if err != nil {
 		return
 	}
-	item.ReportChapterTypeId = int(id)
+	r.ReportChapterTypeId = int(id)
 	return
 }
 
-func (item *ReportChapterType) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("weekly")
-	_, err = o.Update(item, cols...)
+func (r *ReportChapterType) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	_, err = o.Update(r, cols...)
 	return
 }
 
 // DeleteReportChapterType 删除章节类型及相关权限
 func DeleteReportChapterType(typeId int, reportType string) (err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	to, err := o.Begin()
 	if err != nil {
 		return
@@ -81,7 +81,7 @@ func DeleteReportChapterType(typeId int, reportType string) (err error) {
 
 // GetReportChapterTypeById 获取章节类型
 func GetReportChapterTypeById(reportChapterTypeId int) (item *ReportChapterType, err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT * FROM report_chapter_type WHERE report_chapter_type_id = ? `
 	err = o.Raw(sql, reportChapterTypeId).QueryRow(&item)
 	return
@@ -89,7 +89,7 @@ func GetReportChapterTypeById(reportChapterTypeId int) (item *ReportChapterType,
 
 // GetReportChapterTypeList 获取章节类型列表
 func GetReportChapterTypeList() (list []*ReportChapterType, err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT * FROM report_chapter_type WHERE enabled = 1 `
 	_, err = o.Raw(sql).QueryRows(&list)
 	return
@@ -97,7 +97,7 @@ func GetReportChapterTypeList() (list []*ReportChapterType, err error) {
 
 // GetReportChapterTypeListByResearchType 通过报告类型获取章节类型列表
 func GetReportChapterTypeListByResearchType(researchType string) (list []*ReportChapterType, err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT * FROM report_chapter_type WHERE research_type = ? AND enabled = 1`
 	_, err = o.Raw(sql, researchType).QueryRows(&list)
 	return
@@ -105,7 +105,7 @@ func GetReportChapterTypeListByResearchType(researchType string) (list []*Report
 
 // GetAllReportChapterTypeListByResearchType 通过报告类型获取章节类型列表
 func GetAllReportChapterTypeListByResearchType(researchType string) (list []*ReportChapterType, err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT * FROM report_chapter_type WHERE research_type = ?`
 	_, err = o.Raw(sql, researchType).QueryRows(&list)
 	return
@@ -113,7 +113,7 @@ func GetAllReportChapterTypeListByResearchType(researchType string) (list []*Rep
 
 // GetAllReportChapterTypeList 通过传入的条件获取所有的章节类型列表
 func GetAllReportChapterTypeList(condition string, pars []interface{}) (list []*ReportChapterType, err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT * FROM report_chapter_type WHERE 1=1 `
 	sql += condition
 	_, err = o.Raw(sql, pars).QueryRows(&list)
@@ -122,7 +122,7 @@ func GetAllReportChapterTypeList(condition string, pars []interface{}) (list []*
 
 // GetEnableReportChapterTypeList 获取未暂停的章节类型列表
 func GetEnableReportChapterTypeList(researchType string) (list []*ReportChapterType, err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT
 				*
 			FROM
@@ -151,7 +151,7 @@ type DayWeekReportPauseTime struct {
 
 // GetDayWeekReportPauseTimeList 获取晨报周报暂停时间
 func GetDayWeekReportPauseTimeList() (list []*DayWeekReportPauseTime, err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT research_type, MAX(a.pause_start_time) AS pause_start_time, MAX(a.pause_end_time) AS pause_end_time FROM report_chapter_type AS a WHERE a.is_set = 1 GROUP BY a.research_type`
 	_, err = o.Raw(sql).QueryRows(&list)
 	return
@@ -177,7 +177,7 @@ type SetDayWeekReportEnableUpdateRuleReq struct {
 
 // ResetDayWeekReportUpdateRule 重置章节类型的暂停时间
 func ResetDayWeekReportUpdateRule(researchType string) (err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := ` UPDATE report_chapter_type SET pause_start_time = null, pause_end_time = null, is_set = 0 WHERE research_type = ?`
 	_, err = o.Raw(sql, researchType).Exec()
 	return
@@ -185,7 +185,7 @@ func ResetDayWeekReportUpdateRule(researchType string) (err error) {
 
 // SetDayWeekReportUpdateRule 设置章节类型的暂停时间
 func SetDayWeekReportUpdateRule(researchType string, list []DayWeekReportUpdateRule) (err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	to, err := o.Begin()
 	if err != nil {
 		return
@@ -221,7 +221,7 @@ func SetDayWeekReportUpdateRule(researchType string, list []DayWeekReportUpdateR
 
 // SetDayWeekReportEnableUpdateRule 设置章节类型的禁用状态
 func SetDayWeekReportEnableUpdateRule(dayReportChapterTypeIdList, weekReportChapterTypeIdList []string) (err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	to, err := o.Begin()
 	if err != nil {
 		return
@@ -279,7 +279,7 @@ type StopUpdateReportChapterTypeResp struct {
 
 // GetStopUpdateReportChapterTypeListByResearchType 获取暂停更新章节类型列表
 func GetStopUpdateReportChapterTypeListByResearchType() (list []*ReportChapterType, err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT * FROM report_chapter_type WHERE is_set = 1 AND pause_end_time >= ? AND enabled = 1 `
 	_, err = o.Raw(sql, time.Now().Format(utils.FormatDate)).QueryRows(&list)
 	return
@@ -287,7 +287,7 @@ func GetStopUpdateReportChapterTypeListByResearchType() (list []*ReportChapterTy
 
 // GetDisableUpdateReportChapterTypeListByResearchType 获取停止更新的章节类型列表
 func GetDisableUpdateReportChapterTypeListByResearchType() (list []*ReportChapterType, err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT * FROM report_chapter_type WHERE enabled = 0`
 	_, err = o.Raw(sql).QueryRows(&list)
 	return
@@ -299,14 +299,13 @@ type UpdateReportChapterTypeResp struct {
 	Week []*ReportChapterType `description:"所有周报品种"`
 }
 
-type ReportChapterTypePageListResp struct {
-	List   []*ReportChapterTypeListItem
-	Paging *paging.PagingItem `description:"分页数据"`
+type ReportChapterTypeListResp struct {
+	List []*ReportChapterTypeListItem
 }
 
 // GetReportChapterTypeCount 获取章节类型总数
 func GetReportChapterTypeCount(condition string, pars []interface{}) (count int, err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT COUNT(1) FROM report_chapter_type WHERE 1 = 1 `
 	sql += condition
 	err = o.Raw(sql, pars).QueryRow(&count)
@@ -314,13 +313,12 @@ func GetReportChapterTypeCount(condition string, pars []interface{}) (count int,
 }
 
 // GetReportChapterTypePageList 获取章节类型列表
-func GetReportChapterTypePageList(condition string, pars []interface{}, startSize, pageSize int) (list []*ReportChapterType, err error) {
-	o := orm.NewOrmUsingDB("weekly")
+func GetReportChapterTypePageList(condition string, pars []interface{}) (list []*ReportChapterType, err error) {
+	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT * FROM report_chapter_type WHERE 1 = 1 `
 	sql += condition
 	sql += ` ORDER BY sort ASC, created_time DESC`
-	sql += ` LIMIT ?,?`
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	_, err = o.Raw(sql, pars).QueryRows(&list)
 	return
 }
 
@@ -336,31 +334,33 @@ type ReportChapterTypeListItem struct {
 	WordsImage            string `description:"带字的icon"`
 	EditImgUrl            string `description:"管理后台编辑时选用的图"`
 	IsShow                int    `description:"显示隐藏: 1-显示; 0-隐藏"`
+	ChartPermissionIdList []int  `description:"权限id数组"`
+	Enabled               int    `description:"是否可用,1可用,0禁用"`
 }
 
 // ReportChapterTypeAddReq 新增章节类型请求体
 type ReportChapterTypeAddReq struct {
 	ReportChapterTypeName string `description:"报告章节类型名称"`
-	Sort                  int    `description:"排序字段"`
 	ResearchType          string `description:"研报类型"`
-	SelectedImage         string `description:"选中时的icon"`
+	ChartPermissionIdList []int  `description:"权限id数组"`
+	/*SelectedImage         string `description:"选中时的icon"`
 	UnselectedImage       string `description:"未选中时的icon"`
 	WordsImage            string `description:"带字的icon"`
 	EditImgUrl            string `description:"管理后台编辑时选用的图"`
-	IsShow                int    `description:"显示隐藏: 1-显示; 0-隐藏"`
+	IsShow                int    `description:"显示隐藏: 1-显示; 0-隐藏"`*/
 }
 
 // ReportChapterTypeEditReq 编辑章节类型请求体
 type ReportChapterTypeEditReq struct {
 	ReportChapterTypeId   int    `description:"报告章节类型id"`
 	ReportChapterTypeName string `description:"报告章节类型名称"`
-	Sort                  int    `description:"排序字段"`
 	ResearchType          string `description:"研报类型"`
-	SelectedImage         string `description:"选中时的icon"`
+	ChartPermissionIdList []int  `description:"权限id数组"`
+	/*SelectedImage         string `description:"选中时的icon"`
 	UnselectedImage       string `description:"未选中时的icon"`
 	WordsImage            string `description:"带字的icon"`
 	EditImgUrl            string `description:"管理后台编辑时选用的图"`
-	IsShow                int    `description:"显示隐藏: 1-显示; 0-隐藏"`
+	IsShow                int    `description:"显示隐藏: 1-显示; 0-隐藏"`*/
 }
 
 // ReportChapterTypeDelReq 删除章节类型请求体
@@ -374,12 +374,76 @@ type ReportChapterTypeAuthSettingReq struct {
 	ChartPermissionIdList []int `description:"权限id数组"`
 }
 
+type ReportChapterTypeMoveReq struct {
+	ReportChapterTypeId int `description:"报告章节类型id"`
+	//	ParentChartPermissionId int `description:"父级品种id"`
+	PrevReportChapterTypeId int `description:"上一个兄弟节点报告章节类型id"`
+	NextReportChapterTypeId int `description:"下一个兄弟节点报告章节类型id"`
+}
+
+type ReportChapterTypeEnabledReq struct {
+	ReportChapterTypeId int `description:"报告章节类型id"`
+	Enabled             int `description:"是否可用,1可用,0禁用"`
+}
+
 // GetReportChapterTypeByCondition 获取章节类型
 func GetReportChapterTypeByCondition(condition string, pars []interface{}) (item *ReportChapterType, err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT * FROM report_chapter_type WHERE 1 = 1 `
 	sql += condition
 	sql += ` LIMIT 1`
 	err = o.Raw(sql, pars).QueryRow(&item)
 	return
 }
+
+// GetMaxSort 获取最大的排序值
+func (r *ReportChapterType) GetMaxSort() (maxSort int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT max(sort) AS sort FROM report_chapter_type`
+	err = o.Raw(sql).QueryRow(&maxSort)
+	return
+}
+
+// GetMaxSortByResearchType 获取最大的排序值
+func (r *ReportChapterType) GetMaxSortByResearchType(researchType string) (maxSort int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT max(sort) AS sort FROM report_chapter_type WHERE research_type = ?`
+	err = o.Raw(sql, researchType).QueryRow(&maxSort)
+	return
+}
+
+// UpdateReportChapterTypeSortByResearchType 根据父类id更新排序
+func UpdateReportChapterTypeSortByResearchType(researchType string, reportChapterTypeId, nowSort int, updateSort string) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` update report_chapter_type set sort = ` + updateSort + ` WHERE research_type=? AND sort > ?`
+	if reportChapterTypeId > 0 {
+		sql += ` or ( report_chapter_type_id > ` + fmt.Sprint(reportChapterTypeId) + ` and sort = ` + fmt.Sprint(nowSort) + `)`
+	}
+
+	_, err = o.Raw(sql, researchType, nowSort).Exec()
+	return
+}
+
+// GetFirstReportChapterTypeByParentId 获取当前父级分类下,且排序数相同 的排序第一条的数据
+func (r *ReportChapterType) GetFirstReportChapterTypeByResearchType(researchType string) (item *ReportChapterType, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` SELECT * FROM report_chapter_type WHERE 1 = 1 AND research_type = ? ORDER BY sort ASC, report_chapter_type_id ASC LIMIT 1`
+	err = o.Raw(sql, researchType).QueryRow(&item)
+	return
+}
+
+// GetReportChapterTypeById 获取章节类型
+func (r *ReportChapterType) GetReportChapterTypeById(reportChapterTypeId int) (item *ReportChapterType, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` SELECT * FROM report_chapter_type WHERE report_chapter_type_id = ?`
+	err = o.Raw(sql, reportChapterTypeId).QueryRow(&item)
+	return
+}
+
+// SetEnabled 更新启动禁用
+func (r *ReportChapterType) SetEnabled(id, enabled int) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` update report_chapter_type set enabled = ? WHERE report_chapter_type_id = ?`
+	_, err = o.Raw(sql, enabled, id).Exec()
+	return
+}

+ 10 - 2
models/report_chapter_type_permission.go

@@ -18,7 +18,7 @@ type ReportChapterTypePermission struct {
 
 // GetChapterTypePermissionByTypeIdAndResearchType 根据章节类型ID及研报类型获取章节类型权限列表
 func GetChapterTypePermissionByTypeIdAndResearchType(typeId int, researchType string) (list []*ReportChapterTypePermission, err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT * FROM report_chapter_type_permission WHERE report_chapter_type_id = ? AND research_type = ? ORDER BY chart_permission_id ASC `
 	_, err = o.Raw(sql, typeId, researchType).QueryRows(&list)
 	return
@@ -26,7 +26,7 @@ func GetChapterTypePermissionByTypeIdAndResearchType(typeId int, researchType st
 
 // SetReportChapterTypePermission 设置报告章节类型权限
 func SetReportChapterTypePermission(chapterTypeId int, researchType string, newPermissions []*ReportChapterTypePermission, newWeekPermissions []*ChartPermissionChapterMapping) (err error) {
-	o := orm.NewOrmUsingDB("weekly")
+	o := orm.NewOrmUsingDB("rddp")
 	to, err := o.Begin()
 	if err != nil {
 		return
@@ -73,3 +73,11 @@ func SetReportChapterTypePermission(chapterTypeId int, researchType string, newP
 	}
 	return
 }
+
+// GetChapterTypePermissionByResearchType 根据章节类型ID及研报类型获取章节类型权限列表
+func GetChapterTypePermissionByResearchType(researchType string) (list []*ReportChapterTypePermission, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` SELECT * FROM report_chapter_type_permission WHERE research_type = ? ORDER BY chart_permission_id ASC `
+	_, err = o.Raw(sql, researchType).QueryRows(&list)
+	return
+}

+ 119 - 2
routers/commentsRouter.go

@@ -4615,6 +4615,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"],
+        beego.ControllerComments{
+            Method: "SetEnabled",
+            Router: `/enabled/set`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"],
         beego.ControllerComments{
             Method: "List",
@@ -4624,6 +4633,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"],
+        beego.ControllerComments{
+            Method: "Move",
+            Router: `/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"],
         beego.ControllerComments{
             Method: "ParentList",
@@ -4907,7 +4925,7 @@ func init() {
         beego.ControllerComments{
             Method: "AddClassify",
             Router: `/classify/add`,
-            AllowHTTPMethods: []string{"get"},
+            AllowHTTPMethods: []string{"post"},
             MethodParams: param.Make(),
             Filters: nil,
             Params: nil})
@@ -4925,7 +4943,16 @@ func init() {
         beego.ControllerComments{
             Method: "EditClassify",
             Router: `/classify/edit`,
-            AllowHTTPMethods: []string{"get"},
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnglishReportController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnglishReportController"],
+        beego.ControllerComments{
+            Method: "SetEnabled",
+            Router: `/classify/enabled/set`,
+            AllowHTTPMethods: []string{"post"},
             MethodParams: param.Make(),
             Filters: nil,
             Params: nil})
@@ -4948,6 +4975,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnglishReportController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnglishReportController"],
+        beego.ControllerComments{
+            Method: "MoveClassify",
+            Router: `/classify/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnglishReportController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnglishReportController"],
         beego.ControllerComments{
             Method: "ClassifyIdDetail",
@@ -6361,6 +6397,51 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers:ChartPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ChartPermissionController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:ChartPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ChartPermissionController"],
+        beego.ControllerComments{
+            Method: "Edit",
+            Router: `/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:ChartPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ChartPermissionController"],
+        beego.ControllerComments{
+            Method: "SetEnabled",
+            Router: `/enabled/set`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:ChartPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ChartPermissionController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:ChartPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ChartPermissionController"],
+        beego.ControllerComments{
+            Method: "Move",
+            Router: `/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers:ClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ClassifyController"],
         beego.ControllerComments{
             Method: "Add",
@@ -6397,6 +6478,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers:ClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ClassifyController"],
+        beego.ControllerComments{
+            Method: "SetEnabled",
+            Router: `/enabled/set`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers:ClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ClassifyController"],
         beego.ControllerComments{
             Method: "FindByIdClassify",
@@ -6415,6 +6505,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers:ClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ClassifyController"],
+        beego.ControllerComments{
+            Method: "Move",
+            Router: `/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers:ClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ClassifyController"],
         beego.ControllerComments{
             Method: "ParentClassify",
@@ -7315,6 +7414,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers:ReportChapterTypeController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ReportChapterTypeController"],
+        beego.ControllerComments{
+            Method: "SetEnabled",
+            Router: `/chapter_type/enabled/set`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers:ReportChapterTypeController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ReportChapterTypeController"],
         beego.ControllerComments{
             Method: "List",
@@ -7324,6 +7432,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers:ReportChapterTypeController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ReportChapterTypeController"],
+        beego.ControllerComments{
+            Method: "Move",
+            Router: `/chapter_type/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers:ReportChapterTypeController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ReportChapterTypeController"],
         beego.ControllerComments{
             Method: "PermissionList",

+ 5 - 0
routers/router.go

@@ -344,6 +344,11 @@ func init() {
 				&data_source.DataSourceController{},
 			),
 		),
+		web.NSNamespace("/permission",
+			web.NSInclude(
+				&controllers.ChartPermissionController{},
+			),
+		),
 		web.NSNamespace("/speech_recognition",
 			web.NSInclude(
 				&speech_recognition.SpeechRecognitionCommonController{},

+ 478 - 0
services/chart_permission.go

@@ -0,0 +1,478 @@
+package services
+
+import (
+	"eta/eta_api/models"
+	"eta/eta_api/models/company"
+	"eta/eta_api/utils"
+	"fmt"
+	"time"
+)
+
+// 获取权限列表
+func GetChartPermissionList(cond string, pars []interface{}) (permissionList []*models.ChartPermission, err error) {
+	ob := new(models.ChartPermission)
+	permissionList, err = ob.GetItemsByCondition(cond, pars)
+	if err != nil {
+		err = fmt.Errorf("获取权限列表失败, Err: %s", err.Error())
+		return
+	}
+
+	return
+}
+
+// 新增权限
+func AddChartPermission(req models.PermissionAddReq) (err error, errMsg string) {
+	// 重名校验
+	ob := new(models.ChartPermission)
+	existCond := ` AND permission_name = ? AND parent_id = ?`
+	existPars := make([]interface{}, 0)
+	existPars = append(existPars, req.PermissionName, req.ParentId)
+	exist, e := ob.GetItemByCondition(existCond, existPars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		errMsg = "操作失败"
+		err = fmt.Errorf("获取重名品种权限失败, Err: " + e.Error())
+		return
+	}
+	if exist != nil && exist.ChartPermissionId > 0 {
+		errMsg = "品种名称已存在"
+		err = fmt.Errorf("品种名称已存在")
+		return
+	}
+
+	// 获取最大的排序值
+	maxSort, e := ob.GetMaxSort()
+	if e != nil {
+		errMsg = "查询品种排序失败"
+		err = fmt.Errorf("查询品种排序失败, Err: " + e.Error())
+		return
+	}
+	parentPermissionName := ""
+	if req.ParentId > 0 {
+		//查询父级是否存在
+		parent, e := ob.GetItemById(req.ParentId)
+		if e != nil {
+			errMsg = "查询父级品种失败"
+			err = fmt.Errorf("查询父级品种失败, Err: " + e.Error())
+			return
+		}
+		if parent.ChartPermissionId == 0 {
+			errMsg = "请选择正确的父级品种"
+			err = fmt.Errorf("请选择正确的父级品种")
+			return
+		}
+		if parent.ParentId != 0 {
+			errMsg = "只能选择一级品种作为父级品种"
+			err = fmt.Errorf("只能选择一级品种作为父级品种")
+			return
+		}
+		parentPermissionName = parent.PermissionName
+	} else {
+		parentPermissionName = req.PermissionName
+	}
+	// 新增
+	ob.ChartPermissionName = req.PermissionName
+	ob.PermissionName = req.PermissionName
+	ob.Remark = req.PermissionName
+	ob.ParentId = req.ParentId
+	ob.ProductId = 1
+	ob.IsPublic = req.IsPublic
+	ob.Enabled = req.Enabled
+	ob.Sort = maxSort + 1
+
+	ob.CreatedTime = time.Now()
+	ob.LastUpdatedTime = time.Now()
+	if ob.ProductId == 1 {
+		ob.ProductName = "ficc"
+	} else {
+		ob.ProductName = "权益"
+	}
+	ob.ProductPermissionName = ob.ProductName + ob.PermissionName
+	ob.ClassifyName = parentPermissionName
+	if e = ob.Create(); e != nil {
+		errMsg = "操作失败"
+		err = fmt.Errorf("新增品种权限失败, Err: " + e.Error())
+		return
+	}
+	if req.ParentId > 0 && req.Enabled == 1 {
+		//  更新父级品种的启用禁用
+		err = ob.SetEnabledByChartPermissionId(req.ParentId, req.Enabled)
+		if err != nil {
+			errMsg = "更新品种启用禁用状态失败"
+			err = fmt.Errorf("更新品种启用禁用状态失败, Err: " + err.Error())
+			return
+		}
+	}
+	// 同步本次变更的数据
+	go func() {
+		_, _ = ChartFiccPermissionSync()
+	}()
+	return
+}
+
+func EditChartPermission(req models.PermissionEditReq) (err error, errMsg string) {
+	//查询是否存在品种
+	ob := new(models.ChartPermission)
+	item, e := ob.GetItemById(req.PermissionId)
+	if e != nil {
+		errMsg = "查询品种信息失败"
+		err = fmt.Errorf("查询品种信息失败, Err: " + e.Error())
+		return
+	}
+	if item.ChartPermissionId == 0 {
+		errMsg = "请选择正确的品种"
+		err = fmt.Errorf("请选择正确的品种")
+		return
+	}
+	// 查询品种名称是否修改
+	if item.PermissionName != req.PermissionName {
+		existCond := ` AND permission_name = ? AND parent_id = ? AND chart_permission_id !=?`
+		existPars := make([]interface{}, 0)
+		existPars = append(existPars, req.PermissionName, item.ParentId, req.PermissionId)
+		exist, e := ob.GetItemByCondition(existCond, existPars)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			errMsg = "操作失败"
+			err = fmt.Errorf("获取重名品种权限失败, Err: " + e.Error())
+			return
+		}
+		if exist != nil && exist.ChartPermissionId > 0 {
+			errMsg = "品种名称已存在"
+			err = fmt.Errorf("品种名称已存在")
+			return
+		}
+	}
+
+	//判断父级品种是否存在
+	parentPermissionName := ""
+	if req.ParentId > 0 {
+		//查询父级是否存在
+		parent, e := ob.GetItemById(req.ParentId)
+		if e != nil {
+			errMsg = "查询父级品种失败"
+			err = fmt.Errorf("查询父级品种失败, Err: " + e.Error())
+			return
+		}
+		if parent.ChartPermissionId == 0 {
+			errMsg = "请选择正确的父级品种"
+			err = fmt.Errorf("请选择正确的父级品种")
+			return
+		}
+		if parent.ParentId != 0 {
+			errMsg = "只能选择一级品种作为父级品种"
+			err = fmt.Errorf("只能选择一级品种作为父级品种")
+			return
+		}
+		parentPermissionName = parent.PermissionName
+	} else {
+		parentPermissionName = req.PermissionName
+	}
+	updateCol := []string{"PermissionName", "IsPublic", "ParentId", "ClassifyName", "LastUpdatedTime", "ProductPermissionName"}
+	if item.ProductId == 1 {
+		item.Remark = req.PermissionName //remark 在权益品种中用来区分主客观
+		updateCol = append(updateCol, "Remark")
+	}
+	item.PermissionName = req.PermissionName
+	item.IsPublic = req.IsPublic
+	item.ParentId = req.ParentId
+	item.ClassifyName = parentPermissionName
+	item.ProductPermissionName = item.ProductName + item.PermissionName
+	item.LastUpdatedTime = time.Now()
+	err = item.Update(updateCol)
+	if err != nil {
+		errMsg = "更新失败"
+		err = fmt.Errorf("更新品种失败, Err: " + err.Error())
+		return
+	}
+
+	//判断是否是一级品种
+	if item.ParentId == 0 {
+		// 判断是否设置公有的二级品种
+		if len(req.PublicPermissionIds) > 0 {
+			// 更新二级品种的公有权限
+			err = ob.SetIsPublic(req.PublicPermissionIds, item.ChartPermissionId, 1)
+			if err != nil {
+				errMsg = "更新品种公有权限失败"
+				err = fmt.Errorf("更新品种公有权限失败, Err: " + err.Error())
+				return
+			}
+		}
+		// 更新二级的启动禁用
+		err = ob.UpdateClassifyNameByParentId(item.ChartPermissionId, req.PermissionName)
+		if err != nil {
+			errMsg = "更新品种启用禁用状态失败"
+			err = fmt.Errorf("更新品种启用禁用状态失败, Err: " + err.Error())
+			return
+		}
+	} else if item.ParentId > 0 {
+		if item.Enabled == 1 {
+			//  更新父级品种的启用禁用
+			err = ob.SetEnabledByChartPermissionId(item.ParentId, item.Enabled)
+			if err != nil {
+				errMsg = "更新品种启用禁用状态失败"
+				err = fmt.Errorf("更新品种启用禁用状态失败, Err: " + err.Error())
+				return
+			}
+		}
+	}
+	// 同步本次变更的数据
+	go func() {
+		_, _ = ChartFiccPermissionSync()
+	}()
+	return
+}
+
+// SetEnabledChartPermission  设置启用禁用
+func SetEnabledChartPermission(req models.PermissionEnabledReq) (err error, errMsg string) {
+	//查询是否存在品种
+	ob := new(models.ChartPermission)
+	item, e := ob.GetItemById(req.PermissionId)
+	if e != nil {
+		errMsg = "查询品种信息失败"
+		err = fmt.Errorf("查询品种信息失败, Err: " + e.Error())
+		return
+	}
+	if item.ChartPermissionId == 0 {
+		errMsg = "请选择正确的品种"
+		err = fmt.Errorf("请选择正确的品种")
+		return
+	}
+	// 查询品种名称是否修改
+	item.Enabled = req.Enabled
+	item.LastUpdatedTime = time.Now()
+	err = item.Update([]string{"Enabled", "LastUpdatedTime"})
+	if err != nil {
+		errMsg = "更新失败"
+		err = fmt.Errorf("更新品种失败, Err: " + err.Error())
+		return
+	}
+
+	//判断是否是一级品种
+	if item.ParentId == 0 {
+		// 判断是否设置公有的二级品种
+		// 更新二级的启动禁用
+		err = ob.SetEnabledByParentId(item.ChartPermissionId, req.Enabled)
+		if err != nil {
+			errMsg = "更新品种启用禁用状态失败"
+			err = fmt.Errorf("更新品种启用禁用状态失败, Err: " + err.Error())
+			return
+		}
+
+		//
+	} else if item.ParentId > 0 {
+		if req.Enabled == 1 {
+			//  更新父级品种的启用禁用
+			err = ob.SetEnabledByChartPermissionId(item.ParentId, req.Enabled)
+			if err != nil {
+				errMsg = "更新品种启用禁用状态失败"
+				err = fmt.Errorf("更新品种启用禁用状态失败, Err: " + err.Error())
+				return
+			}
+		}
+	}
+	// 同步本次变更的数据
+	go func() {
+		_, _ = ChartFiccPermissionSync()
+	}()
+	return
+}
+
+// MoveChartPermission 移动品种
+func MoveChartPermission(req models.PermissionMoveReq) (err error, errMsg string) {
+	ob := new(models.ChartPermission)
+	chartPermissionId := req.PermissionId
+	prevChartPermissionId := req.PrevPermissionId
+	nextChartPermissionId := req.NextPermissionId
+
+	//如果有传入 上一个兄弟节点分类id
+	var (
+		permissionInfo *models.ChartPermission
+		prevPermission *models.ChartPermission
+		nextPermission *models.ChartPermission
+
+		prevSort int
+		nextSort int
+	)
+
+	// 移动对象为分类, 判断权限
+	permissionInfo, err = ob.GetItemById(chartPermissionId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			errMsg = "当前品种不存在"
+			err = fmt.Errorf("获取品种信息失败,Err:" + err.Error())
+			return
+		}
+		errMsg = "移动失败"
+		err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
+		return
+	} else if permissionInfo.ChartPermissionId == 0 {
+		errMsg = "当前品种不存在"
+		err = fmt.Errorf("获取品种信息失败,Err:" + err.Error())
+		return
+	}
+
+	parentChartPermissionId := permissionInfo.ParentId
+	productId := permissionInfo.ProductId
+	if prevChartPermissionId > 0 {
+		prevPermission, err = ob.GetItemById(prevChartPermissionId)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取上一个兄弟节点分类信息失败,Err:" + err.Error())
+			return
+		}
+		prevSort = prevPermission.Sort
+	}
+
+	if nextChartPermissionId > 0 {
+		//下一个兄弟节点
+		nextPermission, err = ob.GetItemById(nextChartPermissionId)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取下一个兄弟节点分类信息失败,Err:" + err.Error())
+			return
+		}
+		nextSort = nextPermission.Sort
+	}
+
+	err, errMsg = moveChartPermission(permissionInfo, prevPermission, nextPermission, parentChartPermissionId, prevSort, nextSort, productId)
+	return
+}
+
+// moveChartPermission 移动指标分类
+func moveChartPermission(permissionInfo, prevPermission, nextPermission *models.ChartPermission, parentId, prevSort, nextSort, productId int) (err error, errMsg string) {
+	ob := new(models.ChartPermission)
+	updateCol := make([]string, 0)
+
+	//判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
+	if permissionInfo.ParentId != parentId {
+		errMsg = "移动失败"
+		err = fmt.Errorf("不支持目录层级变更")
+		return
+	}
+
+	if prevSort > 0 {
+		//如果是移动在两个兄弟节点之间
+		if nextSort > 0 {
+			//下一个兄弟节点
+			//如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
+			if prevSort == nextSort || prevSort == permissionInfo.Sort {
+				//变更兄弟节点的排序
+				updateSortStr := `sort + 2`
+
+				//变更分类
+				if prevPermission != nil {
+					_ = models.UpdateChartPermissionSortByParentId(parentId, prevPermission.ChartPermissionId, prevPermission.Sort, updateSortStr, productId)
+				} else {
+					_ = models.UpdateChartPermissionSortByParentId(parentId, 0, prevSort, updateSortStr, productId)
+				}
+
+			} else {
+				//如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
+				if nextSort-prevSort == 1 {
+					//变更兄弟节点的排序
+					updateSortStr := `sort + 1`
+
+					//变更分类
+					if prevPermission != nil {
+						_ = models.UpdateChartPermissionSortByParentId(parentId, prevPermission.ChartPermissionId, prevSort, updateSortStr, productId)
+					} else {
+						_ = models.UpdateChartPermissionSortByParentId(parentId, 0, prevSort, updateSortStr, productId)
+					}
+
+				}
+			}
+		}
+
+		permissionInfo.Sort = prevSort + 1
+		permissionInfo.LastUpdatedTime = time.Now()
+		updateCol = append(updateCol, "Sort", "LastUpdatedTime")
+	} else if prevPermission == nil && nextPermission == nil && parentId > 0 {
+		//处理只拖动到目录里,默认放到目录底部的情况
+		var maxSort int
+		maxSort, err = ob.GetMaxSortByParentId(parentId)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("查询组内排序信息失败,Err:" + err.Error())
+			return
+		}
+		permissionInfo.Sort = maxSort + 1 //那就是排在组内最后一位
+		permissionInfo.LastUpdatedTime = time.Now()
+		updateCol = append(updateCol, "Sort", "LastUpdatedTime")
+	} else {
+		// 拖动到父级分类的第一位
+		firstPermission, tmpErr := ob.GetFirstChartPermissionByParentId(parentId)
+		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
+		if firstPermission != nil && firstPermission.ChartPermissionId != 0 && firstPermission.Sort == 0 {
+			updateSortStr := ` sort + 1 `
+			_ = models.UpdateChartPermissionSortByParentId(parentId, firstPermission.ChartPermissionId-1, 0, updateSortStr, productId)
+		}
+
+		permissionInfo.Sort = 0 //那就是排在第一位
+		permissionInfo.LastUpdatedTime = time.Now()
+		updateCol = append(updateCol, "Sort", "LastUpdatedTime")
+	}
+
+	//更新
+	if len(updateCol) > 0 {
+		err = permissionInfo.Update(updateCol)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("修改失败,Err:" + err.Error())
+			return
+		}
+	}
+
+	// 同步本次变更的数据
+	go func() {
+		_, _ = ChartFiccPermissionSync()
+	}()
+	return
+}
+
+// GetChartPermissionEnabledList 查询已启用的FICC权限列表
+func GetChartPermissionEnabledList() (list []*company.PermissionSetList, err error) {
+	dataList, err := GetChartPermissionList(" AND enabled = 1", []interface{}{})
+	if err != nil {
+		return
+	}
+	//enabledList := make([]*models.ChartPermission, 0)
+	parentList := make([]*models.ChartPermission, 0)
+	enabledMap := make(map[int][]*company.PermissionSetItem)
+	listMap := make(map[int]*models.ChartPermission)
+	for _, v := range dataList {
+		listMap[v.ChartPermissionId] = v
+		if v.ParentId == 0 {
+			parentList = append(parentList, v)
+		}
+		if v.Enabled == 1 && v.ParentId > 0 && v.PermissionType == 0 {
+			//enabledList = append(enabledList, v)
+			item := &company.PermissionSetItem{
+				ChartPermissionId: v.ChartPermissionId,
+				PermissionName:    v.PermissionName,
+				PermissionType:    v.PermissionType,
+			}
+
+			enabledMap[v.ParentId] = append(enabledMap[v.ParentId], item)
+		}
+	}
+	for _, v := range parentList {
+		items, ok := enabledMap[v.ChartPermissionId]
+		if !ok {
+			continue
+		}
+		checkList := make([]int, 0)
+		p := new(company.PermissionSetList)
+		p.PermissionName = v.PermissionName
+		p.Child = items
+		if v.PermissionName == "宏观经济" {
+			checkList = append(checkList, 1)
+		}
+		p.CheckList = checkList
+		list = append(list, p)
+	}
+	return
+}

+ 206 - 0
services/chart_permission_sync.go

@@ -0,0 +1,206 @@
+package services
+
+import (
+	"encoding/json"
+	"eta/eta_api/services/alarm_msg"
+	"eta/eta_api/utils"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"strings"
+)
+
+type ChartPermissionResp struct {
+	Code   int    `json:"code" description:"状态码"`
+	Msg    string `json:"msg" description:"提示信息"`
+	ErrMsg string `json:"-" description:"错误信息,不用返回给前端,只是做日志记录"`
+}
+
+func crmEtaPost(url string, pars interface{}) (respBody []byte, err error) {
+	params, e := json.Marshal(pars)
+	if e != nil {
+		err = fmt.Errorf("data json marshal err: %s", e.Error())
+		return
+	}
+
+	body := ioutil.NopCloser(strings.NewReader(string(params)))
+	client := &http.Client{}
+	req, e := http.NewRequest("POST", url, body)
+	if e != nil {
+		err = fmt.Errorf("http create request err: %s", e.Error())
+		return
+	}
+
+	contentType := "application/json;charset=utf-8"
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("Authorization", utils.CrmEtaAuthorization)
+	resp, e := client.Do(req)
+	if e != nil {
+		err = fmt.Errorf("http client do err: %s", e.Error())
+		return
+	}
+	defer func() {
+		_ = resp.Body.Close()
+	}()
+	b, e := ioutil.ReadAll(resp.Body)
+	if e != nil {
+		err = fmt.Errorf("resp body read err: %s", e.Error())
+		return
+	}
+	if len(b) == 0 {
+		err = fmt.Errorf("resp body is empty")
+		return
+	}
+	// 生产环境解密, 注意有个坑前后的双引号
+	if utils.RunMode == "release" {
+		str := string(b)
+		str = strings.Trim(str, `"`)
+		b = utils.DesBase64Decrypt([]byte(str), utils.CrmEtaServerDes3Key)
+	}
+	respBody = b
+	return
+}
+
+func ChartFiccPermissionSync() (err error, errMsg string) {
+	defer func() {
+		if err != nil {
+			utils.FileLog.Info("同步品种权限数据失败, Err: " + err.Error() + errMsg)
+			alarm_msg.SendAlarmMsg("同步品种权限数据失败,Err:"+err.Error(), 3)
+		}
+	}()
+	if utils.CrmEtaServerUrl == "" {
+		return
+	}
+	url := fmt.Sprint(utils.CrmEtaServerUrl, "/api/crm/chart_permission/sync")
+	pars := make(map[string]interface{})
+	b, err := crmEtaPost(url, pars)
+	if err != nil {
+		errMsg = "同步品种失败"
+		err = fmt.Errorf("url:%s err: %s", url, err.Error())
+		return
+	}
+	//result := new(models.ResultData)
+	result := new(ChartPermissionResp)
+	if e := json.Unmarshal(b, &result); e != nil {
+		errMsg = "同步品种失败"
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	utils.FileLog.Info("%s", string(b))
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s, err: %s", string(b), result.ErrMsg)
+		errMsg = result.Msg
+		return
+	}
+	return
+}
+
+type EditClassifyPermissionReq struct {
+	Keyword string
+}
+
+// EditClassifyChartPermissionSync 设置报告分类权限
+func EditClassifyChartPermissionSync(keyword string) (err error) {
+	defer func() {
+		if err != nil {
+			utils.FileLog.Info("同步设置报告分类权限失败, Err: " + err.Error())
+			alarm_msg.SendAlarmMsg("同步设置报告分类权限失败,Err:"+err.Error(), 3)
+		}
+	}()
+	if utils.CrmEtaServerUrl == "" {
+		return
+	}
+	req := &EditClassifyPermissionReq{Keyword: keyword}
+	url := fmt.Sprint(utils.CrmEtaServerUrl, "/api/crm/chart_permission/classify/sync")
+	b, err := crmEtaPost(url, req)
+	if err != nil {
+		err = fmt.Errorf("url:%s err: %s", url, err.Error())
+		return
+	}
+	//result := new(models.ResultData)
+	result := new(ChartPermissionResp)
+	if e := json.Unmarshal(b, &result); e != nil {
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	utils.FileLog.Info("%s", string(b))
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s", string(b))
+		return
+	}
+	return
+}
+
+type EditReportPermissionSyncReq struct {
+	ReportId           int64  `description:"报告id"`
+	ClassifyNameSecond string `description:"二级分类名称"`
+}
+
+// EditReportPermissionSync 设置报告权限
+func EditReportPermissionSync(reportId int64, classifyNameSecond string) (err error) {
+	defer func() {
+		if err != nil {
+			utils.FileLog.Info("同步设置报告权限失败, Err: " + err.Error())
+			alarm_msg.SendAlarmMsg("同步设置报告权限失败,Err:"+err.Error(), 3)
+		}
+	}()
+	if utils.CrmEtaServerUrl == "" {
+		return
+	}
+	req := &EditReportPermissionSyncReq{ReportId: reportId, ClassifyNameSecond: classifyNameSecond}
+	url := fmt.Sprint(utils.CrmEtaServerUrl, "/api/crm/chart_permission/report/sync")
+	b, err := crmEtaPost(url, req)
+	if err != nil {
+		err = fmt.Errorf("url:%s err: %s", url, err.Error())
+		return
+	}
+	//result := new(models.ResultData)
+	result := new(ChartPermissionResp)
+	if e := json.Unmarshal(b, &result); e != nil {
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	utils.FileLog.Info("%s", string(b))
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s", string(b))
+		return
+	}
+	return
+}
+
+type EditKeywordPermissionSyncReq struct {
+	NewKeyword string
+	Keyword    string
+}
+
+// EditKeywordPermissionSync 设置报告权限分类名称
+func EditKeywordPermissionSync(newKeyword, keyword string) (err error) {
+	defer func() {
+		if err != nil {
+			utils.FileLog.Info("同步设置报告权限分类名称失败, Err: " + err.Error())
+			alarm_msg.SendAlarmMsg("同步设置报告权限分类名称失败,Err:"+err.Error(), 3)
+		}
+	}()
+	if utils.CrmEtaServerUrl == "" {
+		return
+	}
+	req := &EditKeywordPermissionSyncReq{NewKeyword: newKeyword, Keyword: keyword}
+	url := fmt.Sprint(utils.CrmEtaServerUrl, "/api/crm/chart_permission/keyword/sync")
+	b, err := crmEtaPost(url, req)
+	if err != nil {
+		err = fmt.Errorf("url:%s err: %s", url, err.Error())
+		return
+	}
+	//result := new(models.ResultData)
+	result := new(ChartPermissionResp)
+	if e := json.Unmarshal(b, &result); e != nil {
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	utils.FileLog.Info("%s", string(b))
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s", string(b))
+		return
+	}
+	return
+}

+ 179 - 0
services/classify.go

@@ -0,0 +1,179 @@
+package services
+
+import (
+	"eta/eta_api/models"
+	"eta/eta_api/utils"
+	"fmt"
+	"time"
+)
+
+// MoveReportClassify 移动分类
+func MoveReportClassify(req models.ClassifyMoveReq) (err error, errMsg string) {
+	classifyId := req.ClassifyId
+	prevClassifyId := req.PrevClassifyId
+	nextClassifyId := req.NextClassifyId
+
+	//如果有传入 上一个兄弟节点分类id
+	var (
+		classifyInfo *models.Classify
+		prevClassify *models.Classify
+		nextClassify *models.Classify
+
+		prevSort int
+		nextSort int
+	)
+
+	// 移动对象为分类, 判断权限
+	classifyInfo, err = models.GetClassifyById(classifyId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			errMsg = "分类不存在, 请刷新页面"
+			err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
+			return
+		}
+		errMsg = "移动失败"
+		err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
+		return
+	} else if classifyInfo.Id == 0 {
+		errMsg = "分类不存在, 请刷新页面"
+		err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
+		return
+	}
+
+	parentClassifyId := classifyInfo.ParentId
+	if prevClassifyId > 0 {
+		prevClassify, err = models.GetClassifyById(prevClassifyId)
+		if err != nil {
+			if err.Error() == utils.ErrNoRow() {
+				errMsg = "上一个分类不存在, 请刷新页面"
+				err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
+				return
+			}
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取上一个兄弟节点分类信息失败,Err:" + err.Error())
+			return
+		}
+		if prevClassify.ParentId != parentClassifyId {
+			errMsg = "禁止拖动到其他节点"
+			err = fmt.Errorf(errMsg)
+			return
+		}
+		prevSort = prevClassify.Sort
+	}
+
+	if nextClassifyId > 0 {
+		//下一个兄弟节点
+		nextClassify, err = models.GetClassifyById(nextClassifyId)
+		if err != nil {
+			if err.Error() == utils.ErrNoRow() {
+				errMsg = "下一个分类不存在, 请刷新页面"
+				err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
+				return
+			}
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取下一个兄弟节点分类信息失败,Err:" + err.Error())
+			return
+		}
+		if nextClassify.ParentId != parentClassifyId {
+			errMsg = "禁止拖动到其他节点"
+			err = fmt.Errorf(errMsg)
+			return
+		}
+		nextSort = nextClassify.Sort
+	}
+
+	err, errMsg = moveReportClassify(classifyInfo, prevClassify, nextClassify, parentClassifyId, prevSort, nextSort)
+	return
+}
+
+// moveReportClassify 移动分类
+func moveReportClassify(classifyInfo, prevClassify, nextClassify *models.Classify, parentId, prevSort, nextSort int) (err error, errMsg string) {
+	ob := new(models.Classify)
+	updateCol := make([]string, 0)
+
+	//判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
+	if classifyInfo.ParentId != parentId {
+		errMsg = "移动失败"
+		err = fmt.Errorf("不支持目录层级变更")
+		return
+	}
+
+	if prevSort > 0 {
+		//如果是移动在两个兄弟节点之间
+		if nextSort > 0 {
+			//下一个兄弟节点
+			//如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
+			if prevSort == nextSort || prevSort == classifyInfo.Sort {
+				//变更兄弟节点的排序
+				updateSortStr := `sort + 2`
+
+				//变更分类
+				if prevClassify != nil {
+					_ = models.UpdateClassifySortByParentId(parentId, prevClassify.Id, prevClassify.Sort, updateSortStr)
+				} else {
+					_ = models.UpdateClassifySortByParentId(parentId, 0, prevSort, updateSortStr)
+				}
+
+			} else {
+				//如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
+				if nextSort-prevSort == 1 {
+					//变更兄弟节点的排序
+					updateSortStr := `sort + 1`
+
+					//变更分类
+					if prevClassify != nil {
+						_ = models.UpdateClassifySortByParentId(parentId, prevClassify.Id, prevSort, updateSortStr)
+					} else {
+						_ = models.UpdateClassifySortByParentId(parentId, 0, prevSort, updateSortStr)
+					}
+
+				}
+			}
+		}
+
+		classifyInfo.Sort = prevSort + 1
+		classifyInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	} else if prevClassify == nil && nextClassify == nil && parentId > 0 {
+		//处理只拖动到目录里,默认放到目录底部的情况
+		var maxSort int
+		maxSort, err = ob.GetMaxSortByParentId(parentId)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("查询组内排序信息失败,Err:" + err.Error())
+			return
+		}
+		classifyInfo.Sort = maxSort + 1 //那就是排在组内最后一位
+		classifyInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	} else {
+		// 拖动到父级分类的第一位
+		firstPermission, tmpErr := ob.GetFirstClassifyByParentId(parentId)
+		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
+		if firstPermission != nil && firstPermission.Id != 0 && firstPermission.Sort == 0 {
+			updateSortStr := ` sort + 1 `
+			_ = models.UpdateClassifySortByParentId(parentId, firstPermission.Id-1, 0, updateSortStr)
+		}
+
+		classifyInfo.Sort = 0 //那就是排在第一位
+		classifyInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	}
+
+	//更新
+	if len(updateCol) > 0 {
+		err = classifyInfo.UpdateClassify(updateCol)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("修改失败,Err:" + err.Error())
+			return
+		}
+	}
+	return
+}

+ 169 - 0
services/english_classify.go

@@ -0,0 +1,169 @@
+package services
+
+import (
+	"eta/eta_api/models"
+	"eta/eta_api/utils"
+	"fmt"
+	"time"
+)
+
+// MoveEnglishReportClassify 移动分类
+func MoveEnglishReportClassify(req models.EnglishClassifyMoveReq) (err error, errMsg string) {
+	classifyId := req.ClassifyId
+	prevClassifyId := req.PrevClassifyId
+	nextClassifyId := req.NextClassifyId
+
+	//如果有传入 上一个兄弟节点分类id
+	var (
+		classifyInfo *models.EnglishClassify
+		prevClassify *models.EnglishClassify
+		nextClassify *models.EnglishClassify
+
+		prevSort int
+		nextSort int
+	)
+
+	// 移动对象为分类, 判断权限
+	classifyInfo, err = models.GetEnglishReportClassifyById(classifyId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			errMsg = "分类不存在, 请刷新页面"
+			err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
+			return
+		}
+		errMsg = "移动失败"
+		err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
+		return
+	} else if classifyInfo.Id == 0 {
+		errMsg = "分类不存在, 请刷新页面"
+		err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
+		return
+	}
+
+	parentClassifyId := classifyInfo.ParentId
+	if prevClassifyId > 0 {
+		prevClassify, err = models.GetEnglishReportClassifyById(prevClassifyId)
+		if err != nil {
+			if err.Error() == utils.ErrNoRow() {
+				errMsg = "上一个分类不存在, 请刷新页面"
+				err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
+				return
+			}
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取上一个兄弟节点分类信息失败,Err:" + err.Error())
+			return
+		}
+		prevSort = prevClassify.Sort
+	}
+
+	if nextClassifyId > 0 {
+		//下一个兄弟节点
+		nextClassify, err = models.GetEnglishReportClassifyById(nextClassifyId)
+		if err != nil {
+			if err.Error() == utils.ErrNoRow() {
+				errMsg = "下一个分类不存在, 请刷新页面"
+				err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
+				return
+			}
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取下一个兄弟节点分类信息失败,Err:" + err.Error())
+			return
+		}
+		nextSort = nextClassify.Sort
+	}
+
+	err, errMsg = moveEnglishReportClassify(classifyInfo, prevClassify, nextClassify, parentClassifyId, prevSort, nextSort)
+	return
+}
+
+// moveEnglishReportClassify 移动分类
+func moveEnglishReportClassify(classifyInfo, prevClassify, nextClassify *models.EnglishClassify, parentId, prevSort, nextSort int) (err error, errMsg string) {
+	ob := new(models.EnglishClassify)
+	updateCol := make([]string, 0)
+
+	//判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
+	if classifyInfo.ParentId != parentId {
+		errMsg = "移动失败"
+		err = fmt.Errorf("不支持目录层级变更")
+		return
+	}
+
+	if prevSort > 0 {
+		//如果是移动在两个兄弟节点之间
+		if nextSort > 0 {
+			//下一个兄弟节点
+			//如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
+			if prevSort == nextSort || prevSort == classifyInfo.Sort {
+				//变更兄弟节点的排序
+				updateSortStr := `sort + 2`
+
+				//变更分类
+				if prevClassify != nil {
+					_ = models.UpdateEnglishClassifySortByParentId(parentId, prevClassify.Id, prevClassify.Sort, updateSortStr)
+				} else {
+					_ = models.UpdateEnglishClassifySortByParentId(parentId, 0, prevSort, updateSortStr)
+				}
+
+			} else {
+				//如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
+				if nextSort-prevSort == 1 {
+					//变更兄弟节点的排序
+					updateSortStr := `sort + 1`
+
+					//变更分类
+					if prevClassify != nil {
+						_ = models.UpdateEnglishClassifySortByParentId(parentId, prevClassify.Id, prevSort, updateSortStr)
+					} else {
+						_ = models.UpdateEnglishClassifySortByParentId(parentId, 0, prevSort, updateSortStr)
+					}
+
+				}
+			}
+		}
+
+		classifyInfo.Sort = prevSort + 1
+		classifyInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	} else if prevClassify == nil && nextClassify == nil && parentId > 0 {
+		//处理只拖动到目录里,默认放到目录底部的情况
+		var maxSort int
+		maxSort, err = ob.GetMaxSortByParentId(parentId)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("查询组内排序信息失败,Err:" + err.Error())
+			return
+		}
+		classifyInfo.Sort = maxSort + 1 //那就是排在组内最后一位
+		classifyInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	} else {
+		// 拖动到父级分类的第一位
+		firstPermission, tmpErr := ob.GetFirstClassifyByParentId(parentId)
+		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
+		if firstPermission != nil && firstPermission.Id != 0 && firstPermission.Sort == 0 {
+			updateSortStr := ` sort + 1 `
+			_ = models.UpdateEnglishClassifySortByParentId(parentId, firstPermission.Id-1, 0, updateSortStr)
+		}
+
+		classifyInfo.Sort = 0 //那就是排在第一位
+		classifyInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	}
+
+	//更新
+	if len(updateCol) > 0 {
+		err = classifyInfo.UpdateEnglishClassify(updateCol)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("修改失败,Err:" + err.Error())
+			return
+		}
+	}
+	return
+}

+ 170 - 0
services/english_permission.go

@@ -0,0 +1,170 @@
+package services
+
+import (
+	"eta/eta_api/models"
+	"eta/eta_api/utils"
+	"fmt"
+	"time"
+)
+
+// MoveEnPermission 移动品种
+func MoveEnPermission(req models.EnPermissionMoveReq) (err error, errMsg string) {
+	ob := new(models.EnPermission)
+	permissionId := req.PermissionId
+	prevPermissionId := req.PrevPermissionId
+	nextPermissionId := req.NextPermissionId
+
+	//如果有传入 上一个兄弟节点分类id
+	var (
+		permissionInfo *models.EnPermission
+		prevPermission *models.EnPermission
+		nextPermission *models.EnPermission
+
+		prevSort int
+		nextSort int
+	)
+
+	// 移动对象为分类, 判断权限
+	permissionInfo, err = ob.GetItemById(permissionId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			errMsg = "品种不存在, 请刷新页面"
+			err = fmt.Errorf("获取品种信息失败,Err:" + err.Error())
+			return
+		}
+		errMsg = "移动失败"
+		err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
+		return
+	} else if permissionInfo.EnPermissionId == 0 {
+		errMsg = "品种不存在, 请刷新页面"
+		err = fmt.Errorf("获取品种信息失败,Err:" + err.Error())
+		return
+	}
+
+	parentPermissionId := permissionInfo.ParentId
+	if prevPermissionId > 0 {
+		prevPermission, err = ob.GetItemById(prevPermissionId)
+		if err != nil {
+			if err.Error() == utils.ErrNoRow() {
+				errMsg = "上一个品种不存在, 请刷新页面"
+				err = fmt.Errorf("获取品种信息失败,Err:" + err.Error())
+				return
+			}
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取上一个兄弟节点分类信息失败,Err:" + err.Error())
+			return
+		}
+		prevSort = prevPermission.Sort
+	}
+
+	if nextPermissionId > 0 {
+		//下一个兄弟节点
+		nextPermission, err = ob.GetItemById(nextPermissionId)
+		if err != nil {
+			if err.Error() == utils.ErrNoRow() {
+				errMsg = "下一个品种不存在, 请刷新页面"
+				err = fmt.Errorf("获取品种信息失败,Err:" + err.Error())
+				return
+			}
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取下一个兄弟节点分类信息失败,Err:" + err.Error())
+			return
+		}
+		nextSort = nextPermission.Sort
+	}
+
+	err, errMsg = moveEnPermission(permissionInfo, prevPermission, nextPermission, parentPermissionId, prevSort, nextSort)
+	return
+}
+
+// moveEnPermission 移动品种
+func moveEnPermission(permissionInfo, prevPermission, nextPermission *models.EnPermission, parentId, prevSort, nextSort int) (err error, errMsg string) {
+	ob := new(models.EnPermission)
+	updateCol := make([]string, 0)
+
+	//判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
+	if permissionInfo.ParentId != parentId {
+		errMsg = "移动失败"
+		err = fmt.Errorf("不支持目录层级变更")
+		return
+	}
+
+	if prevSort > 0 {
+		//如果是移动在两个兄弟节点之间
+		if nextSort > 0 {
+			//下一个兄弟节点
+			//如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
+			if prevSort == nextSort || prevSort == permissionInfo.Sort {
+				//变更兄弟节点的排序
+				updateSortStr := `sort + 2`
+
+				//变更分类
+				if prevPermission != nil {
+					_ = models.UpdateEnPermissionSortByParentId(parentId, prevPermission.EnPermissionId, prevPermission.Sort, updateSortStr)
+				} else {
+					_ = models.UpdateEnPermissionSortByParentId(parentId, 0, prevSort, updateSortStr)
+				}
+
+			} else {
+				//如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
+				if nextSort-prevSort == 1 {
+					//变更兄弟节点的排序
+					updateSortStr := `sort + 1`
+
+					//变更分类
+					if prevPermission != nil {
+						_ = models.UpdateEnPermissionSortByParentId(parentId, prevPermission.EnPermissionId, prevSort, updateSortStr)
+					} else {
+						_ = models.UpdateEnPermissionSortByParentId(parentId, 0, prevSort, updateSortStr)
+					}
+
+				}
+			}
+		}
+
+		permissionInfo.Sort = prevSort + 1
+		permissionInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	} else if prevPermission == nil && nextPermission == nil && parentId > 0 {
+		//处理只拖动到目录里,默认放到目录底部的情况
+		var maxSort int
+		maxSort, err = ob.GetMaxSortByParentId(parentId)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("查询组内排序信息失败,Err:" + err.Error())
+			return
+		}
+		permissionInfo.Sort = maxSort + 1 //那就是排在组内最后一位
+		permissionInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	} else {
+		// 拖动到父级分类的第一位
+		firstPermission, tmpErr := ob.GetFirstEnPermissionByParentId(parentId)
+		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
+		if firstPermission != nil && firstPermission.EnPermissionId != 0 && firstPermission.Sort == 0 {
+			updateSortStr := ` sort + 1 `
+			_ = models.UpdateEnPermissionSortByParentId(parentId, firstPermission.EnPermissionId-1, 0, updateSortStr)
+		}
+
+		permissionInfo.Sort = 0 //那就是排在第一位
+		permissionInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	}
+
+	//更新
+	if len(updateCol) > 0 {
+		err = permissionInfo.Update(updateCol)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("修改失败,Err:" + err.Error())
+			return
+		}
+	}
+	return
+}

+ 25 - 23
services/report.go

@@ -408,18 +408,18 @@ func UpdateReportEs(reportId int, publishState int) (err error) {
 			}
 		}
 	} else {
-		if utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeSandbox {
-			permissionList, tmpErr := models.GetChartPermissionNameFromMappingByKeyword(reportInfo.ClassifyNameSecond, "rddp")
-			if tmpErr != nil {
-				return
-			}
-			categoryArr := make([]string, 0)
-			for i := 0; i < len(permissionList); i++ {
-				categoryArr = append(categoryArr, permissionList[i].PermissionName)
-			}
-			aliasArr, _ := addCategoryAliasToArr(categoryArr)
-			categories = strings.Join(aliasArr, ",")
+		//if utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeSandbox {
+		permissionList, tmpErr := models.GetChartPermissionNameFromMappingByKeyword(reportInfo.ClassifyNameSecond, "rddp")
+		if tmpErr != nil {
+			return
+		}
+		categoryArr := make([]string, 0)
+		for i := 0; i < len(permissionList); i++ {
+			categoryArr = append(categoryArr, permissionList[i].PermissionName)
 		}
+		aliasArr, _ := addCategoryAliasToArr(categoryArr)
+		categories = strings.Join(aliasArr, ",")
+		//}
 	}
 
 	// 新增报告ES
@@ -985,20 +985,22 @@ func CreateNewReport(req models.AddReq, adminInfo *system.Admin) (newReportId in
 	}
 
 	// 处理权限
-	if utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeSandbox {
-		go func() {
-			permissionItems, e := models.GetPermission(req.ClassifyNameSecond)
+	//if utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeSandbox {
+	go func() {
+		permissionItems, e := models.GetPermission(req.ClassifyNameSecond)
+		if e != nil {
+			alarm_msg.SendAlarmMsg("获取权限失败,Err:"+err.Error(), 3)
+		}
+		for _, v := range permissionItems {
+			e = models.AddChartPermissionChapterMapping(v.ChartPermissionId, newReportId)
 			if e != nil {
-				alarm_msg.SendAlarmMsg("获取权限失败,Err:"+err.Error(), 3)
-			}
-			for _, v := range permissionItems {
-				e = models.AddChartPermissionChapterMapping(v.ChartPermissionId, newReportId)
-				if e != nil {
-					alarm_msg.SendAlarmMsg("新增权限失败,Err:"+err.Error(), 3)
-				}
+				alarm_msg.SendAlarmMsg("新增权限失败,Err:"+err.Error(), 3)
 			}
-		}()
-	}
+		}
+		// 同步crm权限
+		_ = EditReportPermissionSync(newReportId, req.ClassifyNameSecond)
+	}()
+	//}
 
 	reportCode = utils.MD5(strconv.Itoa(int(newReportId)))
 	//修改唯一编码

+ 153 - 0
services/report_chapter_type.go

@@ -0,0 +1,153 @@
+package services
+
+import (
+	"eta/eta_api/models"
+	"eta/eta_api/utils"
+	"fmt"
+	"time"
+)
+
+// MoveReportChapterType 移动报告章节
+func MoveReportChapterType(req *models.ReportChapterTypeMoveReq) (err error, errMsg string) {
+	ob := new(models.ReportChapterType)
+	reportChapterTypeId := req.ReportChapterTypeId
+	prevReportChapterTypeId := req.PrevReportChapterTypeId
+	nextReportChapterTypeId := req.NextReportChapterTypeId
+
+	//如果有传入 上一个兄弟节点分类id
+	var (
+		reportChapterType     *models.ReportChapterType
+		prevReportChapterType *models.ReportChapterType
+		nextReportChapterType *models.ReportChapterType
+
+		prevSort int
+		nextSort int
+	)
+
+	// 移动对象为分类, 判断权限
+	reportChapterType, err = ob.GetReportChapterTypeById(reportChapterTypeId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			errMsg = "当前报告章节不存在"
+			err = fmt.Errorf("获取报告章节信息失败,Err:" + err.Error())
+			return
+		}
+		errMsg = "移动失败"
+		err = fmt.Errorf("获取章节信息失败,Err:" + err.Error())
+		return
+	} else if reportChapterType.ReportChapterTypeId == 0 {
+		errMsg = "当前报告章节不存在"
+		err = fmt.Errorf("获取报告章节信息失败,Err:" + err.Error())
+		return
+	}
+
+	researchType := reportChapterType.ResearchType
+	if prevReportChapterTypeId > 0 {
+		prevReportChapterType, err = ob.GetReportChapterTypeById(prevReportChapterTypeId)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取上一个兄弟节点分类信息失败,Err:" + err.Error())
+			return
+		}
+		prevSort = prevReportChapterType.Sort
+	}
+
+	if nextReportChapterTypeId > 0 {
+		//下一个兄弟节点
+		nextReportChapterType, err = ob.GetReportChapterTypeById(nextReportChapterTypeId)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取下一个兄弟节点分类信息失败,Err:" + err.Error())
+			return
+		}
+		nextSort = nextReportChapterType.Sort
+	}
+
+	err, errMsg = moveReportChapterType(reportChapterType, prevReportChapterType, nextReportChapterType, researchType, prevSort, nextSort)
+	return
+}
+
+// moveReportChapterType 移动指标分类
+func moveReportChapterType(reportChapterType, prevReportChapterType, nextReportChapterType *models.ReportChapterType, researchType string, prevSort, nextSort int) (err error, errMsg string) {
+	ob := new(models.ReportChapterType)
+	updateCol := make([]string, 0)
+
+	if prevSort > 0 {
+		//如果是移动在两个兄弟节点之间
+		if nextSort > 0 {
+			//下一个兄弟节点
+			//如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
+			if prevSort == nextSort || prevSort == reportChapterType.Sort {
+				//变更兄弟节点的排序
+				updateSortStr := `sort + 2`
+
+				//变更分类
+				if prevReportChapterType != nil {
+					_ = models.UpdateReportChapterTypeSortByResearchType(researchType, prevReportChapterType.ReportChapterTypeId, prevReportChapterType.Sort, updateSortStr)
+				} else {
+					_ = models.UpdateReportChapterTypeSortByResearchType(researchType, 0, prevSort, updateSortStr)
+				}
+
+			} else {
+				//如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
+				if nextSort-prevSort == 1 {
+					//变更兄弟节点的排序
+					updateSortStr := `sort + 1`
+
+					//变更分类
+					if prevReportChapterType != nil {
+						_ = models.UpdateReportChapterTypeSortByResearchType(researchType, prevReportChapterType.ReportChapterTypeId, prevSort, updateSortStr)
+					} else {
+						_ = models.UpdateReportChapterTypeSortByResearchType(researchType, 0, prevSort, updateSortStr)
+					}
+
+				}
+			}
+		}
+
+		reportChapterType.Sort = prevSort + 1
+		reportChapterType.LastUpdatedTime = time.Now()
+		updateCol = append(updateCol, "Sort", "LastUpdatedTime")
+	} else if prevReportChapterType == nil && nextReportChapterType == nil && researchType != "" {
+		//处理只拖动到目录里,默认放到目录底部的情况
+		var maxSort int
+		maxSort, err = ob.GetMaxSortByResearchType(researchType)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("查询组内排序信息失败,Err:" + err.Error())
+			return
+		}
+		reportChapterType.Sort = maxSort + 1 //那就是排在组内最后一位
+		reportChapterType.LastUpdatedTime = time.Now()
+		updateCol = append(updateCol, "Sort", "LastUpdatedTime")
+	} else {
+		// 拖动到父级分类的第一位
+		firstReportChapterType, tmpErr := ob.GetFirstReportChapterTypeByResearchType(researchType)
+		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
+		if firstReportChapterType != nil && firstReportChapterType.ReportChapterTypeId != 0 && firstReportChapterType.Sort == 0 {
+			updateSortStr := ` sort + 1 `
+			_ = models.UpdateReportChapterTypeSortByResearchType(researchType, firstReportChapterType.ReportChapterTypeId-1, 0, updateSortStr)
+		}
+
+		reportChapterType.Sort = 0 //那就是排在第一位
+		reportChapterType.LastUpdatedTime = time.Now()
+		updateCol = append(updateCol, "Sort", "LastUpdatedTime")
+	}
+
+	//更新
+	if len(updateCol) > 0 {
+		err = reportChapterType.Update(updateCol)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("修改失败,Err:" + err.Error())
+			return
+		}
+	}
+	return
+}

+ 51 - 0
services/report_chapter_type_sync.go

@@ -0,0 +1,51 @@
+package services
+
+import (
+	"encoding/json"
+	"eta/eta_api/services/alarm_msg"
+	"eta/eta_api/utils"
+	"fmt"
+)
+
+type ChapterTypeSyncReq struct {
+	ReportChapterTypeId int    `description:"报告章节类型id"`
+	ResearchType        string `description:"研报类型"`
+}
+
+type ChapterTypeBaseResp struct {
+	Code   int    `json:"code" description:"状态码"`
+	Msg    string `json:"msg" description:"提示信息"`
+	ErrMsg string `json:"-" description:"错误信息,不用返回给前端,只是做日志记录"`
+}
+
+func ReportChapterTypeSync(pars *ChapterTypeSyncReq) (err error, errMsg string) {
+	defer func() {
+		if err != nil {
+			utils.FileLog.Info("同步章节权限数据失败, Err: " + err.Error() + errMsg)
+			alarm_msg.SendAlarmMsg("同步章节权限数据失败,Err:"+err.Error(), 3)
+		}
+	}()
+	if utils.CrmEtaServerUrl == "" {
+		return
+	}
+	url := fmt.Sprint(utils.CrmEtaServerUrl, "/api/crm/chapter_type/sync")
+	b, err := crmEtaPost(url, pars)
+	if err != nil {
+		errMsg = "操作失败"
+		err = fmt.Errorf("url:%s err: %s", url, err.Error())
+		return
+	}
+	result := new(ChapterTypeBaseResp)
+	if e := json.Unmarshal(b, &result); e != nil {
+		errMsg = "操作失败"
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	utils.FileLog.Info("%s", string(b))
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s, err: %s", string(b), result.ErrMsg)
+		errMsg = result.Msg
+		return
+	}
+	return
+}

+ 3 - 0
services/report_classify.go

@@ -88,6 +88,7 @@ func AfterUpdateClassifyNameOrParent(classifyId, parentId, originParentId int, o
 	// 二级分类-修改名称
 	if originName != classifyName && parentId > 0 {
 		// 更新关键词
+		// todo 更新crm里的权限关键词
 		if e := models.UpdateChartPermissionNameFromMappingByKeyword(classifyName, originName, "rddp"); e != nil {
 			err = fmt.Errorf("更新二级分类关键词失败, Err: %s", e.Error())
 			return
@@ -97,6 +98,8 @@ func AfterUpdateClassifyNameOrParent(classifyId, parentId, originParentId int, o
 			err = fmt.Errorf("更新报告表二级分类名称失败, Err: %s", e.Error())
 			return
 		}
+
+		_ = EditKeywordPermissionSync(classifyName, originName)
 		return
 	}