ソースを参照

Merge branch 'dev/1.4.1' into sandbox_merge

hsun 1 年間 前
コミット
0f349e38af

+ 36 - 6
controllers/classify.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"hongze/hz_eta_api/models"
+	"hongze/hz_eta_api/models/system"
 	"hongze/hz_eta_api/services"
 	"hongze/hz_eta_api/utils"
 	"time"
@@ -32,20 +33,35 @@ func (this *ClassifyController) Add() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
+
+	// 获取系统菜单, 如果没有对应的字段的特殊处理项, 则忽略必填
+	menus, e := system.GetSysMenuItemsByCondition("", make([]interface{}, 0), []string{}, ``)
+	if e != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "获取菜单列表失败, Err: " + e.Error()
+		return
+	}
+	menuMap := make(map[string]bool)
+	for _, m := range menus {
+		if m.ButtonCode != "" {
+			menuMap[m.ButtonCode] = true
+		}
+	}
+
 	if req.ClassifyName == "" {
 		br.Msg = "分类名称不可为空"
 		return
 	}
-	if req.ParentId != 0 && req.ShowType == 0 {
+	if menuMap[system.MenuSpecialHandleClassifyShowType] && req.ParentId != 0 && req.ShowType == 0 {
 		br.Msg = "展示类型不可为空"
 		return
 	}
-	if len(req.MenuList) > 0 && req.ParentId != 0 {
+	if menuMap[system.MenuSpecialHandleClassifyChildMenu] && len(req.MenuList) > 0 && req.ParentId != 0 {
 		br.Msg = "非一级分类不可添加子目录"
 		return
 	}
 
-	if (req.ShowType == 1 || req.ShowType == 3) && req.YbRightBanner == "" && req.ParentId == 0 { //当一级报告分类为列表、品种时,增加“报告合集配图”的配置项
+	if menuMap[system.MenuSpecialHandleClassifyReportImgs] && (req.ShowType == 1 || req.ShowType == 3) && req.YbRightBanner == "" && req.ParentId == 0 { //当一级报告分类为列表、品种时,增加“报告合集配图”的配置项
 		br.Msg = "报告合集配图不可为空"
 		return
 	}
@@ -345,6 +361,21 @@ func (this *ClassifyController) Edit() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
+
+	// 获取系统菜单, 如果没有对应的字段的特殊处理项, 则忽略必填
+	menus, e := system.GetSysMenuItemsByCondition("", make([]interface{}, 0), []string{}, ``)
+	if e != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "获取菜单列表失败, Err: " + e.Error()
+		return
+	}
+	menuMap := make(map[string]bool)
+	for _, m := range menus {
+		if m.ButtonCode != "" {
+			menuMap[m.ButtonCode] = true
+		}
+	}
+
 	if req.ClassifyId <= 0 {
 		br.Msg = "参数错误"
 		return
@@ -353,7 +384,7 @@ func (this *ClassifyController) Edit() {
 		br.Msg = "分类名称不可为空"
 		return
 	}
-	if req.ParentId != 0 && req.ShowType == 0 {
+	if menuMap[system.MenuSpecialHandleClassifyShowType] && req.ParentId != 0 && req.ShowType == 0 {
 		br.Msg = "展示类型不可为空"
 		return
 	}
@@ -361,8 +392,7 @@ func (this *ClassifyController) Edit() {
 		br.Msg = "上级分类不能选择自己"
 		return
 	}
-
-	if (req.ShowType == 1 || req.ShowType == 3) && req.YbRightBanner == "" && req.ParentId == 0 { //当一级报告分类为列表、品种时,增加“报告合集配图”的配置项
+	if menuMap[system.MenuSpecialHandleClassifyReportImgs] && (req.ShowType == 1 || req.ShowType == 3) && req.YbRightBanner == "" && req.ParentId == 0 { //当一级报告分类为列表、品种时,增加“报告合集配图”的配置项
 		br.Msg = "报告合集配图不可为空"
 		return
 	}

+ 22 - 2
controllers/sandbox/sandbox.go

@@ -9,6 +9,7 @@ import (
 	"hongze/hz_eta_api/models/sandbox"
 	"hongze/hz_eta_api/models/sandbox/request"
 	"hongze/hz_eta_api/models/sandbox/response"
+	"hongze/hz_eta_api/models/system"
 	sandboxService "hongze/hz_eta_api/services/sandbox"
 	"hongze/hz_eta_api/utils"
 )
@@ -325,11 +326,30 @@ func (this *SandboxController) Save() {
 		return
 	}
 
+	// 获取系统菜单, 如果没有对应的字段的特殊处理项, 则忽略必填
+	menus, e := system.GetSysMenuItemsByCondition("", make([]interface{}, 0), []string{}, ``)
+	if e != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "获取菜单列表失败, Err: " + e.Error()
+		return
+	}
+	menuMap := make(map[string]bool)
+	for _, m := range menus {
+		if m.ButtonCode != "" {
+			menuMap[m.ButtonCode] = true
+		}
+	}
+	ignoreVariety := false
+	if !menuMap[system.MenuSpecialHandleSandboxVariety] {
+		ignoreVariety = true
+		return
+	}
+
 	var sandboxInfo *sandbox.Sandbox
 	var errMsg string
 	if req.SandboxVersionCode == `` {
 		//新增沙盘
-		sandboxInfo, err = sandboxService.AddSandbox(req, sysUser.AdminId, sysUser.RealName)
+		sandboxInfo, err = sandboxService.AddSandbox(req, sysUser.AdminId, sysUser.RealName, ignoreVariety)
 	} else {
 		////更新当前编辑中的状态缓存
 		//err = sandboxService.UpdateSandboxEditMark(req.SandboxId, sysUser.AdminId, 1)
@@ -339,7 +359,7 @@ func (this *SandboxController) Save() {
 		//}
 
 		//编辑沙盘
-		sandboxInfo, err, errMsg = sandboxService.UpdateSandbox(req, sysUser.AdminId, sysUser.RealName)
+		sandboxInfo, err, errMsg = sandboxService.UpdateSandbox(req, sysUser.AdminId, sysUser.RealName, ignoreVariety)
 	}
 	if err != nil {
 		br.Msg = "保存失败!"

+ 208 - 2
controllers/sys_role.go

@@ -248,7 +248,8 @@ func (this *SysRoleController) ListSysRole() {
 	br.Data = resp
 }
 
-// @Title 角色设置权限-菜单列表
+// SysRoleMenusList
+// @Title 角色设置权限-菜单列表-CRM14.1弃用
 // @Description 角色设置权限-菜单列表
 // @Param   RoleId   query   int  true       "角色Id"
 // @Success 200 {object} system.SysRoleListResp
@@ -313,7 +314,8 @@ func (this *SysRoleController) SysRoleMenusList() {
 	br.Data = resp
 }
 
-// @Title 角色设置权限
+// SysRoleMenusAdd
+// @Title 角色设置权限-CRM14.1弃用
 // @Description 角色设置权限
 // @Param	request	body system.RoleMenusAddReq true "type json string"
 // @Success 200 {object} system.SysRoleListResp
@@ -453,3 +455,207 @@ func (this *SysRoleController) AllSysRole() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// SysRoleMenuAuthList
+// @Title 角色设置权限-菜单列表
+// @Description 角色设置权限-菜单列表
+// @Param   RoleId   query   int  true       "角色Id"
+// @Success 200 {object} system.SysRoleListResp
+// @router /role/menu/auth_list [get]
+func (this *SysRoleController) SysRoleMenuAuthList() {
+	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"
+		return
+	}
+	resp := new(system.SysMenuListResp)
+	resp.ChoiceList = make([]int, 0)
+	resp.HalfChoiceList = make([]int, 0)
+	resp.List = make([]*system.SysMenuItem, 0)
+
+	// 角色勾选的权限
+	roleId, _ := this.GetInt("RoleId", 0)
+	if roleId > 0 {
+		relates, e := system.GetSysRoleMenuByRoleId(roleId)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取角色关联菜单失败, Err: " + e.Error()
+			return
+		}
+		for _, r := range relates {
+			if r.Type == 1 {
+				resp.HalfChoiceList = append(resp.HalfChoiceList, r.MenuId)
+				continue
+			}
+			resp.ChoiceList = append(resp.ChoiceList, r.MenuId)
+		}
+	}
+
+	order := `sort ASC, create_time DESC, menu_id DESC`
+	list, e := system.GetSysMenuItemsByCondition("", make([]interface{}, 0), []string{}, order)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取菜单列表失败, Err: " + e.Error()
+		return
+	}
+
+	items := make([]*system.SysMenuItem, 0)
+	for _, v := range list {
+		t := &system.SysMenuItem{
+			MenuId:       v.MenuId,
+			ParentId:     v.ParentId,
+			Name:         v.Name,
+			Sort:         v.Sort,
+			Path:         v.Path,
+			PathName:     v.PathName,
+			IconPath:     v.IconPath,
+			Component:    v.Component,
+			Hidden:       v.Hidden,
+			HiddenLayout: v.HiddenLayout,
+			Level:        v.Level,
+			MenuType:     v.MenuType,
+			ButtonCode:   v.ButtonCode,
+			Children:     make([]*system.SysMenuItem, 0),
+		}
+		items = append(items, t)
+	}
+
+	// 递归返回树形结构
+	items = services.GetMenuTreeRecursive(items, 0)
+
+	resp.List = items
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// SysRoleMenuAuthSave
+// @Title 角色设置权限-保存
+// @Description 角色设置权限-保存
+// @Param	request	body RoleMenusSaveReq true "type json string"
+// @Success 200 {object} system.SysRoleListResp
+// @router /role/menu/auth_save [post]
+func (this *SysRoleController) SysRoleMenuAuthSave() {
+	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
+	}
+
+	type RoleMenusSaveReq struct {
+		RoleId      int   `description:"角色ID"`
+		MenuIds     []int `description:"菜单IDs"`
+		HalfMenuIds []int `description:"半选菜单IDs-仅供前端回显用的"`
+	}
+	var req RoleMenusSaveReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.RoleId <= 0 {
+		br.Msg = "参数有误"
+		return
+	}
+	if len(req.MenuIds) == 0 {
+		br.Msg = "请选择菜单"
+		return
+	}
+	if len(req.HalfMenuIds) == 0 {
+		br.Msg = "请选择菜单"
+		return
+	}
+
+	items := make([]*system.SysRoleMenu, 0)
+	for _, v := range req.MenuIds {
+		t := new(system.SysRoleMenu)
+		t.MenuId = v
+		t.RoleId = req.RoleId
+		items = append(items, t)
+	}
+	for _, v := range req.HalfMenuIds {
+		t := new(system.SysRoleMenu)
+		t.MenuId = v
+		t.Type = 1
+		t.RoleId = req.RoleId
+		items = append(items, t)
+	}
+	if e := system.CreateMultiSysRoleMenu(req.RoleId, items); e != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存角色菜单权限失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "设置成功"
+}
+
+// ButtonList
+// @Title 角色-按钮权限列表
+// @Description 角色-按钮权限列表
+// @Param   RoleId   query   int  true       "角色Id"
+// @Success 200 {object} system.SysRoleListResp
+// @router /role/menu/buttons [get]
+func (this *SysRoleController) ButtonList() {
+	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
+	}
+
+	roleId := sysUser.RoleId
+	list, e := system.GetMenuButtonsByRoleId(roleId)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取角色按钮权限失败, Err: " + e.Error()
+		return
+	}
+
+	buttonList := make([]*system.SysMenuButtonResp, 0)
+	for _, v := range list {
+		tmp := new(system.SysMenuButtonResp)
+		tmp.MenuId = v.MenuId
+		tmp.ParentId = v.ParentId
+		tmp.MenuType = v.MenuType
+		tmp.Name = v.Name
+		tmp.ButtonCode = v.ButtonCode
+		buttonList = append(buttonList, tmp)
+	}
+
+	br.Data = buttonList
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 107 - 5
models/system/sys_menu.go

@@ -1,6 +1,56 @@
 package system
 
-import "github.com/beego/beego/v2/client/orm"
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+	"time"
+)
+
+// 需要特殊处理的菜单字段项
+const (
+	MenuSpecialHandleClassifyChildMenu  = "classifyList:cnClassify:childMenu"
+	MenuSpecialHandleClassifyShowType   = "classifyList:cnClassify:showType"
+	MenuSpecialHandleClassifyReportImgs = "classifyList:cnClassify:reportImgs"
+	MenuSpecialHandleSandboxVariety     = "sandbox:variety"
+)
+
+type SysMenu struct {
+	MenuId       int       `orm:"column(menu_id);pk"`
+	ParentId     int       `description:"父级菜单ID"`
+	Name         string    `description:"菜单名称或者按钮名称"`
+	RootId       int       `description:"顶层菜单ID"`
+	Sort         string    `description:"排序"`
+	Path         string    `description:"路由地址"`
+	PathName     string    `description:"路由名称"`
+	IconPath     string    `description:"菜单图标地址"`
+	Component    int       `description:"组件路径"`
+	Hidden       int       `description:"是否隐藏:1-隐藏 0-显示"`
+	HiddenLayout int       `description:"是否隐藏layout:1-隐藏 0-显示"`
+	Level        int       `description:"菜单等级:1-2-3"`
+	IsLevel      int       `description:"是否为多级菜单:1,只有一级;2,有多级"`
+	LevelPath    string    `description:"兼容以前menu表的字段"`
+	MenuType     int       `description:"菜单类型: 0-菜单; 1-按钮; 2-字段(需要特殊处理)"`
+	ButtonCode   string    `description:"按钮/菜单唯一标识"`
+	CreateTime   time.Time `description:"创建时间"`
+	ModifyTime   time.Time `description:"更新时间"`
+}
+
+// GetSysMenuItemsByCondition 获取菜单列表
+func GetSysMenuItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*SysMenu, err error) {
+	o := orm.NewOrm()
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM sys_menu WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
 
 type MenuList struct {
 	MenuId    int          `description:"导航唯一标识"`
@@ -52,22 +102,74 @@ func GetMenuByParentId(roleId, parentId int) (items []*ChildMenu, err error) {
 // GetMenuListByRoleIds 根据管理员多个角色查询菜单ID
 func GetMenuListByRoleIds(roleIds string) (items []*MenuList, err error) {
 	sql := ` SELECT DISTINCT a.* FROM sys_menu AS a
-			INNER JOIN sys_role_menu AS b ON a.menu_id=b.menu_id
+			INNER JOIN sys_role_menu AS b ON a.menu_id=b.menu_id AND b.type = 0
 			INNER JOIN sys_role AS c ON b.role_id=c.role_id
-			WHERE c.role_id in (`+roleIds+`)
+			WHERE c.role_id in (` + roleIds + `)
 			AND a.parent_id=0 
             ORDER BY sort ASC `
 	_, err = orm.NewOrm().Raw(sql).QueryRows(&items)
 	return
 }
+
 // GetMenuByParentIdRoleIds 根据管理员多个角色查询子菜单ID
 func GetMenuByParentIdRoleIds(roleIds string, parentId int) (items []*ChildMenu, err error) {
 	sql := ` SELECT DISTINCT a.* FROM sys_menu AS a
-			INNER JOIN sys_role_menu AS b ON a.menu_id=b.menu_id
+			INNER JOIN sys_role_menu AS b ON a.menu_id=b.menu_id AND b.type = 0
 			INNER JOIN sys_role AS c ON b.role_id=c.role_id
-			WHERE c.role_id in (`+roleIds+`)
+			WHERE c.role_id in (` + roleIds + `)
 			AND a.parent_id=? 
             ORDER BY a.sort ASC`
 	_, err = orm.NewOrm().Raw(sql, parentId).QueryRows(&items)
 	return
 }
+
+// GetMenuButtonsByRoleId 获取角色按钮菜单
+func GetMenuButtonsByRoleId(roleId int) (items []*SysMenu, err error) {
+	sql := `SELECT
+				r.*
+			FROM
+				sys_menu AS r
+			JOIN sys_role_menu AS rm ON r.menu_id = rm.menu_id AND rm.type = 0
+			WHERE
+				rm.role_id = ? AND r.menu_type = 1
+			ORDER BY
+				r.sort ASC,
+				r.create_time DESC`
+	_, err = orm.NewOrm().Raw(sql, roleId).QueryRows(&items)
+	return
+}
+
+// SysMenuButtonResp 按钮菜单响应体
+type SysMenuButtonResp struct {
+	MenuId     int    `description:"菜单ID"`
+	ParentId   int    `description:"父级菜单ID"`
+	Name       string `description:"菜单名称或者按钮名称"`
+	MenuType   int    `description:"菜单类型: 0-菜单; 1-按钮"`
+	ButtonCode string `description:"按钮唯一标识"`
+}
+
+// SysMenuListResp ETA商家菜单列表响应体
+type SysMenuListResp struct {
+	ChoiceList     []int          `description:"已选菜单"`
+	HalfChoiceList []int          `description:"半选菜单-方便前端回显用的"`
+	List           []*SysMenuItem `description:"菜单列表"`
+}
+
+// SysMenuItem ETA商家菜单
+type SysMenuItem struct {
+	MenuId       int
+	ParentId     int            `description:"父级菜单ID"`
+	Name         string         `description:"菜单名称或者按钮名称"`
+	RootId       int            `description:"顶层菜单ID"`
+	Sort         string         `description:"排序"`
+	Path         string         `description:"路由地址"`
+	PathName     string         `description:"路由名称"`
+	IconPath     string         `description:"菜单图标地址"`
+	Component    int            `description:"组件路径"`
+	Hidden       int            `description:"是否隐藏:1-隐藏 0-显示"`
+	HiddenLayout int            `description:"是否隐藏layout:1-隐藏 0-显示"`
+	Level        int            `description:"菜单等级:1-2-3"`
+	MenuType     int            `description:"菜单类型: 0-菜单; 1-按钮; 2-字段(需要特殊处理)"`
+	ButtonCode   string         `description:"按钮/菜单唯一标识"`
+	Children     []*SysMenuItem `description:"子菜单"`
+}

+ 44 - 1
models/system/sys_role.go

@@ -152,7 +152,7 @@ func GetRoleMenuByParentId(parentId int) (items []*RoleMenu, err error) {
 func GetCheckListRoleMenu(roleId, parentId int) (items []*RoleMenuList, err error) {
 	sql := ` SELECT b.menu_id FROM sys_role_menu AS a
 				INNER JOIN sys_menu AS b ON a.menu_id=b.menu_id
-				WHERE a.role_id=?
+				WHERE a.role_id=? AND a.type = 0
 				AND b.parent_id=? `
 	_, err = orm.NewOrm().Raw(sql, roleId, parentId).QueryRows(&items)
 	return
@@ -175,6 +175,7 @@ type SysRoleMenu struct {
 	RoleMenuId int `orm:"column(role_menu_id);pk" description:"关联id"`
 	RoleId     int
 	MenuId     int
+	Type       int `description:"类型:0-全选;1-半选(此字段仅用于前端的回显)"`
 }
 
 func AddSysRoleMenu(item *SysRoleMenu) (lastId int64, err error) {
@@ -183,6 +184,36 @@ func AddSysRoleMenu(item *SysRoleMenu) (lastId int64, err error) {
 	return
 }
 
+// CreateMultiSysRoleMenu 删除并新增角色权限
+func CreateMultiSysRoleMenu(roleId int, items []*SysRoleMenu) (err error) {
+	if roleId == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	tx, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	sql := `DELETE FROM sys_role_menu WHERE role_id = ?`
+	_, err = tx.Raw(sql, roleId).Exec()
+	if err != nil {
+		return
+	}
+
+	if len(items) > 0 {
+		_, err = tx.InsertMulti(len(items), items)
+	}
+	return
+}
+
 func GetSysRoleAll(levelFlag bool) (items []*SysRoleItem, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM sys_role WHERE 1=1`
@@ -208,3 +239,15 @@ func GetEnglishAuthRoleIds(roleCodes []string) (roleIds []int, err error) {
 	_, err = o.Raw(sql, roleCodes).QueryRows(&roleIds)
 	return
 }
+
+// GetSysRoleMenuByRoleId 获取角色关联菜单
+func GetSysRoleMenuByRoleId(roleId int) (items []*SysRoleMenu, err error) {
+	sql := `SELECT
+				*
+			FROM
+				sys_role_menu
+			WHERE
+				role_id = ?`
+	_, err = orm.NewOrm().Raw(sql, roleId).QueryRows(&items)
+	return
+}

+ 27 - 0
routers/commentsRouter.go

@@ -5911,6 +5911,33 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_eta_api/controllers:SysRoleController"] = append(beego.GlobalControllerRouter["hongze/hz_eta_api/controllers:SysRoleController"],
+        beego.ControllerComments{
+            Method: "SysRoleMenuAuthList",
+            Router: `/role/menu/auth_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_eta_api/controllers:SysRoleController"] = append(beego.GlobalControllerRouter["hongze/hz_eta_api/controllers:SysRoleController"],
+        beego.ControllerComments{
+            Method: "SysRoleMenuAuthSave",
+            Router: `/role/menu/auth_save`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_eta_api/controllers:SysRoleController"] = append(beego.GlobalControllerRouter["hongze/hz_eta_api/controllers:SysRoleController"],
+        beego.ControllerComments{
+            Method: "ButtonList",
+            Router: `/role/menu/buttons`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_eta_api/controllers:SysRoleController"] = append(beego.GlobalControllerRouter["hongze/hz_eta_api/controllers:SysRoleController"],
         beego.ControllerComments{
             Method: "SysRoleMenusList",

+ 21 - 11
services/sandbox/sandbox.go

@@ -15,17 +15,22 @@ import (
 )
 
 // AddSandbox 新增沙盘
-func AddSandbox(req request.AddAndEditSandbox, opUserId int, opUserName string) (sandboxInfo *sandbox.Sandbox, err error) {
+func AddSandbox(req request.AddAndEditSandbox, opUserId int, opUserName string, ignoreVariety bool) (sandboxInfo *sandbox.Sandbox, err error) {
 	// 获取产品权限详情
-	chartPermissionInfo, err := company.GetChartPermissionListById(req.ChartPermissionId)
-	if err != nil {
-		return
+	var permissionName string
+	if !ignoreVariety {
+		chartPermissionInfo, e := company.GetChartPermissionListById(req.ChartPermissionId)
+		if e != nil {
+			err = e
+			return
+		}
+		permissionName = chartPermissionInfo.PermissionName
 	}
 	//沙盘主表信息
 	sandboxInfo = &sandbox.Sandbox{
 		Name:                utils.TrimStr(req.Name),
 		ChartPermissionId:   req.ChartPermissionId,
-		ChartPermissionName: chartPermissionInfo.PermissionName,
+		ChartPermissionName: permissionName,
 		CurrVersion:         1,
 		Code:                GenerateCode(),
 		Content:             req.Content,
@@ -68,7 +73,7 @@ func AddSandbox(req request.AddAndEditSandbox, opUserId int, opUserName string)
 }
 
 // UpdateSandbox 更新沙盘
-func UpdateSandbox(req request.AddAndEditSandbox, opUserId int, opUserName string) (sandboxInfo *sandbox.Sandbox, err error, errMsg string) {
+func UpdateSandbox(req request.AddAndEditSandbox, opUserId int, opUserName string, ignoreVariety bool) (sandboxInfo *sandbox.Sandbox, err error, errMsg string) {
 	// 获取沙盘版本信息
 	sandboxVersion, err := sandbox.GetSandboxVersionBySandboxVersionCode(req.SandboxVersionCode)
 	if err != nil {
@@ -107,16 +112,21 @@ func UpdateSandbox(req request.AddAndEditSandbox, opUserId int, opUserName strin
 	}
 
 	// 获取产品权限详情
-	chartPermissionInfo, err := company.GetChartPermissionListById(req.ChartPermissionId)
-	if err != nil {
-		return
+	var permissionName string
+	if !ignoreVariety {
+		chartPermissionInfo, e := company.GetChartPermissionListById(req.ChartPermissionId)
+		if e != nil {
+			err = e
+			return
+		}
+		permissionName = chartPermissionInfo.PermissionName
 	}
 
 	//如果只更新了沙盘名称,那么只去修改最新版本的沙盘名称,而不去累计版本
 	if isUpdateName == true && isUpdateContent == false {
 		sandboxInfo.Name = utils.TrimStr(req.Name)
 		sandboxInfo.ChartPermissionId = req.ChartPermissionId
-		sandboxInfo.ChartPermissionName = chartPermissionInfo.PermissionName
+		sandboxInfo.ChartPermissionName = permissionName
 		sandboxInfo.Content = req.Content
 		sandboxInfo.PicUrl = utils.TrimStr(req.PicUrl)
 		sandboxInfo.OpUserId = opUserId
@@ -155,7 +165,7 @@ func UpdateSandbox(req request.AddAndEditSandbox, opUserId int, opUserName strin
 	} else {
 		sandboxInfo.Name = utils.TrimStr(req.Name)
 		sandboxInfo.ChartPermissionId = req.ChartPermissionId
-		sandboxInfo.ChartPermissionName = chartPermissionInfo.PermissionName
+		sandboxInfo.ChartPermissionName = permissionName
 		sandboxInfo.CurrVersion = sandboxInfo.CurrVersion + 1
 		sandboxInfo.Content = req.Content
 		sandboxInfo.PicUrl = utils.TrimStr(req.PicUrl)

+ 12 - 0
services/system.go

@@ -108,3 +108,15 @@ func CheckRaiAdmin(adminId int) (isRai bool, err error) {
 	}
 	return
 }
+
+// GetMenuTreeRecursive 递归菜单树
+func GetMenuTreeRecursive(list []*system.SysMenuItem, parentId int) []*system.SysMenuItem {
+	res := make([]*system.SysMenuItem, 0)
+	for _, v := range list {
+		if v.ParentId == parentId {
+			v.Children = GetMenuTreeRecursive(list, v.MenuId)
+			res = append(res, v)
+		}
+	}
+	return res
+}