Browse Source

system: deptTree

Yi 1 week ago
parent
commit
ae39dcf40a

+ 1 - 1
go.mod

@@ -3,7 +3,7 @@ module kpt-pasture
 go 1.17
 
 require (
-	gitee.com/xuyiping_admin/go_proto v0.0.0-20250523062919-b893047f10c8
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20250526035313-54b0f5e98983
 	gitee.com/xuyiping_admin/pkg v0.0.0-20250514071642-f92d2ac9a85d
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/eclipse/paho.mqtt.golang v1.4.3

+ 2 - 0
go.sum

@@ -111,6 +111,8 @@ gitee.com/xuyiping_admin/go_proto v0.0.0-20250523054938-90895b21e2e6 h1:g/L5Dr4b
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250523054938-90895b21e2e6/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250523062919-b893047f10c8 h1:j8gu75Sg2xvbC+dZ0UGFQMcNnU8AmBQ41KRgHXOcPik=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250523062919-b893047f10c8/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250526035313-54b0f5e98983 h1:KWF+5I/HFeT27kiqn9DNhQrV4kIC9uxas9aalU7/LAE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250526035313-54b0f5e98983/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/pkg v0.0.0-20241108060137-caea58c59f5b h1:w05MxH7yqveRlaRbxHhbif5YjPrJFodRPfOjYhXn7Zk=
 gitee.com/xuyiping_admin/pkg v0.0.0-20241108060137-caea58c59f5b/go.mod h1:8tF25X6pE9WkFCczlNAC0K2mrjwKvhhp02I7o0HtDxY=
 gitee.com/xuyiping_admin/pkg v0.0.0-20250514071642-f92d2ac9a85d h1:vBXmMRggF7mZVPGRDgavZ87igJgkezwX0a3v1/XtIMQ=

+ 9 - 0
http/handler/system/dept.go

@@ -72,3 +72,12 @@ func DepCreateOrUpdate(c *gin.Context) {
 		Data: &operationPb.Success{Success: true},
 	})
 }
+
+func DeptTree(c *gin.Context) {
+	res, err := middleware.Dependency(c).StoreEventHub.OpsService.SystemDeptTree(c)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	ginutil.JSONResp(c, res)
+}

+ 2 - 1
http/route/system_api.go

@@ -43,12 +43,13 @@ func SystemAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		systemRoute.POST("/menu/list", system.SearchSystemMenuList)
 		systemRoute.DELETE("/menu/:id", system.DeleteSystemMenu)
 		systemRoute.POST("/menu/createOrUpdate", system.CreatedOrUpdateSystemMenu)
-		systemRoute.POST("/menu/tree", system.GetSystemMenuTree)
+		systemRoute.GET("/menu/tree", system.GetSystemMenuTree)
 
 		// 系统部门
 		systemRoute.POST("/dept/list", system.DeptList)
 		systemRoute.DELETE("/dept/:id", system.DepIsShow)
 		systemRoute.POST("/dept/createOrUpdate", system.DepCreateOrUpdate)
+		systemRoute.GET("/dept/tree", system.DeptTree)
 
 		// 登录用户的相关接口
 		systemRoute.GET("/user/menu", system.GetUserMenu)

+ 52 - 0
model/system_dept.go

@@ -1,6 +1,8 @@
 package model
 
 import (
+	"sort"
+
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
 )
 
@@ -52,3 +54,53 @@ func (s SystemDeptSlice) ToPB(systemUserList []*SystemUser) []*pasturePb.SearchD
 	}
 	return res
 }
+
+func (s SystemDeptSlice) ToTree() []*pasturePb.DeptTreeData {
+	res := make([]*pasturePb.DeptTreeData, len(s))
+	if 0 == len(s) {
+		return res
+	}
+	// 正排序
+	sort.Slice(s, func(i, j int) bool {
+		return s[i].ParentId < s[j].ParentId
+	})
+
+	for i, v := range s {
+		res[i] = &pasturePb.DeptTreeData{
+			Id:       int32(v.Id),
+			ParentId: int32(v.ParentId),
+			Name:     v.Name,
+
+			Children: make([]*pasturePb.DeptTreeData, 0),
+		}
+	}
+	// 构建树
+	return deptBuildTree(res)
+}
+
+func deptBuildTree(deptTreeList []*pasturePb.DeptTreeData) []*pasturePb.DeptTreeData {
+	tree := make([]*pasturePb.DeptTreeData, 0)
+	for _, dept := range deptTreeList {
+		if dept.ParentId == 0 {
+			tree = append(tree, dept)
+		} else {
+			parent := deptFindByID(deptTreeList, dept.ParentId)
+			if parent != nil {
+				parent.Children = append(parent.Children, dept)
+			}
+		}
+	}
+	return tree
+}
+
+func deptFindByID(menuTreeList []*pasturePb.DeptTreeData, id int32) *pasturePb.DeptTreeData {
+	for _, v := range menuTreeList {
+		if id == v.Id {
+			return v
+		}
+		if child := deptFindByID(v.Children, id); child != nil {
+			return child
+		}
+	}
+	return nil
+}

+ 1 - 0
module/backend/interface.go

@@ -93,6 +93,7 @@ type SystemService interface {
 	SearchSystemDeptList(ctx context.Context, req *pasturePb.SearchDeptRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchDeptResponse, error)
 	SystemDepDelete(ctx context.Context, id int64) error
 	SystemDeptCreateOrUpdate(ctx context.Context, req *pasturePb.SearchDeptRequest) error
+	SystemDeptTree(ctx context.Context) (*pasturePb.DeptTreeResponse, error)
 
 	// SearchUserPastureList 用户相关牧场列表
 	SearchUserPastureList(ctx context.Context) (*pasturePb.SystemUserPastureListResponse, error)

+ 0 - 188
module/backend/system_service.go

@@ -504,191 +504,3 @@ func (s *StoreEntry) SystemRoleList(ctx context.Context) (*pasturePb.GetRoleList
 		Data: model.SystemRoleSlice(systemRoleList).ToPB(),
 	}, nil
 }
-
-// CreateOrUpdateSystemMenu 添加或者更新系统菜单权限
-func (s *StoreEntry) CreateOrUpdateSystemMenu(ctx context.Context, req *pasturePb.SearchMenuRequest) error {
-	if req.Id > 0 {
-		systemMenu := &model.SystemMenu{Id: int64(req.Id)}
-		if err := s.DB.Model(&model.SystemMenu{}).First(systemMenu).Error; err != nil {
-			if !errors.Is(err, gorm.ErrRecordNotFound) {
-				return xerr.WithStack(err)
-			}
-		}
-	}
-
-	if err := s.DB.Model(&model.SystemMenu{}).Where(map[string]interface{}{
-		"id": req.Id,
-	}).Assign(map[string]interface{}{
-		"name":             req.Name,
-		"path":             req.Path,
-		"title":            req.Title,
-		"menu_type":        req.MenuType,
-		"parent_id":        req.ParentId,
-		"frame_src":        req.FrameSrc,
-		"frame_loading":    model.BooleanToIsShow(req.FrameLoading),
-		"keepalive":        model.BooleanToIsShow(req.Keepalive),
-		"hidden_tag":       model.BooleanToIsShow(req.HiddenTag),
-		"show_link":        model.BooleanToIsShow(req.ShowLink),
-		"show_parent":      model.BooleanToIsShow(req.ShowParent),
-		"icon":             req.Icon,
-		"component":        req.Component,
-		"redirect":         req.Redirect,
-		"auths":            req.Auths,
-		"rank":             req.Rank,
-		"extra_icon":       req.ExtraIcon,
-		"enter_transition": req.EnterTransition,
-		"leave_transition": req.LeaveTransition,
-		"active_path":      req.ActivePath,
-		"is_delete":        pasturePb.IsShow_Ok,
-		"is_show":          pasturePb.IsShow_Ok,
-	}).FirstOrCreate(&model.SystemMenu{}).Error; err != nil {
-		return xerr.WithStack(err)
-	}
-	return nil
-}
-
-func (s *StoreEntry) SystemMenuTree(ctx context.Context) (*pasturePb.SystemMenuTreeResponse, error) {
-	systemMenuList := make([]*model.SystemMenu, 0)
-	if err := s.DB.Model(new(model.SystemMenu)).Where("is_delete = ?", pasturePb.IsShow_Ok).
-		Where("is_show = ?", pasturePb.IsShow_Ok).Find(&systemMenuList).Error; err != nil {
-		return nil, xerr.WithStack(err)
-	}
-	return &pasturePb.SystemMenuTreeResponse{
-		Code: http.StatusOK,
-		Msg:  "ok",
-		Data: model.SystemMenuSlice(systemMenuList).ToPB(),
-	}, nil
-}
-
-// SearchSystemMenuList 菜单列表查询
-func (s *StoreEntry) SearchSystemMenuList(ctx context.Context, req *pasturePb.SearchMenuRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchMenuResponse, error) {
-	systemMenuList := make([]*model.SystemMenu, 0)
-	var count int64 = 0
-
-	if err := s.DB.Model(new(model.SystemMenu)).
-		Where("is_delete = ? ", operationPb.IsShow_OK).
-		Order("parent_id").Count(&count).
-		Find(&systemMenuList).Error; err != nil {
-		return nil, xerr.WithStack(err)
-	}
-
-	return &pasturePb.SearchMenuResponse{
-		Code: http.StatusOK,
-		Msg:  "ok",
-		Data: &pasturePb.SearchMenuData{
-			Page:     pagination.Page,
-			Total:    int32(count),
-			PageSize: pagination.PageSize,
-			List:     model.SystemMenuSlice(systemMenuList).ToPB(),
-		},
-	}, nil
-}
-
-// DeleteSystemMenu 删除系统菜单
-func (s *StoreEntry) DeleteSystemMenu(ctx context.Context, menuId int64) error {
-	systemMenu := &model.SystemMenu{Id: menuId}
-	if err := s.DB.First(systemMenu).Error; err != nil {
-		if errors.Is(err, gorm.ErrRecordNotFound) {
-			return xerr.Custom("该数据不存在")
-		}
-		return xerr.WithStack(err)
-	}
-
-	if err := s.DB.Model(systemMenu).Update("is_delete", pasturePb.IsShow_No).Error; err != nil {
-		return xerr.WithStack(err)
-	}
-	return nil
-}
-
-func (s *StoreEntry) SearchSystemDeptList(ctx context.Context, req *pasturePb.SearchDeptRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchDeptResponse, error) {
-	deptList := make([]*model.SystemDept, 0)
-	var count int64 = 0
-	pref := s.DB.Model(new(model.SystemDept)).Where("is_delete = ?", operationPb.IsShow_OK)
-	if req.Name != "" {
-		pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
-	}
-
-	if req.IsShow > 0 {
-		pref.Where("is_show = ?", req.IsShow)
-	}
-
-	if err := pref.Order("sort desc").
-		Count(&count).
-		Limit(int(pagination.PageSize)).
-		Offset(int(pagination.PageOffset)).
-		Find(&deptList).Error; err != nil {
-		return nil, xerr.WithStack(err)
-	}
-
-	systemUserList, _ := s.SystemUserList(ctx)
-
-	return &pasturePb.SearchDeptResponse{
-		Code: http.StatusOK,
-		Msg:  "ok",
-		Data: &pasturePb.DeptData{
-			List:     model.SystemDeptSlice(deptList).ToPB(systemUserList),
-			Total:    int32(count),
-			PageSize: pagination.PageSize,
-			Page:     pagination.Page,
-		},
-	}, nil
-}
-
-func (s *StoreEntry) SystemDepDelete(ctx context.Context, id int64) error {
-	dept := &model.SystemDept{Id: id}
-	if err := s.DB.First(dept).Error; err != nil {
-		return xerr.WithStack(err)
-	}
-
-	if dept.IsShow == pasturePb.IsShow_No {
-		return nil
-	}
-	if err := s.DB.Model(dept).Update("is_delete", operationPb.IsShow_NO).Error; err != nil {
-		return xerr.WithStack(err)
-	}
-	return nil
-}
-
-func (s *StoreEntry) SystemDeptCreateOrUpdate(ctx context.Context, req *pasturePb.SearchDeptRequest) error {
-	if req.Id > 0 {
-		barn := &model.SystemDept{Id: int64(req.Id)}
-		if err := s.DB.Model(&model.SystemDept{}).First(barn).Error; err != nil {
-			if !errors.Is(err, gorm.ErrRecordNotFound) {
-				return xerr.WithStack(err)
-			}
-		}
-	}
-	if err := s.DB.Model(&model.SystemDept{}).Where(map[string]interface{}{
-		"id": req.Id,
-	}).Assign(map[string]interface{}{
-		"name":      req.Name,
-		"sort":      req.Sort,
-		"parent_id": req.ParentId,
-		"remarks":   req.Remarks,
-		"is_delete": operationPb.IsShow_OK,
-		"is_show":   req.IsShow,
-		"dept_type": pasturePb.Depth_Department,
-		"leader_id": req.LeaderId,
-	}).FirstOrCreate(&model.SystemDept{}).Error; err != nil {
-		return xerr.WithStack(err)
-	}
-	return nil
-}
-
-func (s *StoreEntry) SearchUserPastureList(ctx context.Context) (*pasturePb.SystemUserPastureListResponse, error) {
-	currentUser, err := s.GetCurrentSystemUser(ctx)
-	if err != nil {
-		return nil, xerr.WithStack(err)
-	}
-
-	farmList, err := s.FindPastureList(ctx, currentUser.PastureIds)
-	if err != nil {
-		return nil, xerr.WithStack(err)
-	}
-
-	return &pasturePb.SystemUserPastureListResponse{
-		Code: http.StatusOK,
-		Msg:  "ok",
-		Data: model.AppPastureListSlice(farmList).ToPB(),
-	}, err
-}

+ 215 - 0
module/backend/system_service_more.go

@@ -0,0 +1,215 @@
+package backend
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"kpt-pasture/model"
+	"net/http"
+
+	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
+	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
+	"gitee.com/xuyiping_admin/pkg/xerr"
+	"gorm.io/gorm"
+)
+
+// CreateOrUpdateSystemMenu 添加或者更新系统菜单权限
+func (s *StoreEntry) CreateOrUpdateSystemMenu(ctx context.Context, req *pasturePb.SearchMenuRequest) error {
+	if req.Id > 0 {
+		systemMenu := &model.SystemMenu{Id: int64(req.Id)}
+		if err := s.DB.Model(&model.SystemMenu{}).First(systemMenu).Error; err != nil {
+			if !errors.Is(err, gorm.ErrRecordNotFound) {
+				return xerr.WithStack(err)
+			}
+		}
+	}
+
+	if err := s.DB.Model(&model.SystemMenu{}).Where(map[string]interface{}{
+		"id": req.Id,
+	}).Assign(map[string]interface{}{
+		"name":             req.Name,
+		"path":             req.Path,
+		"title":            req.Title,
+		"menu_type":        req.MenuType,
+		"parent_id":        req.ParentId,
+		"frame_src":        req.FrameSrc,
+		"frame_loading":    model.BooleanToIsShow(req.FrameLoading),
+		"keepalive":        model.BooleanToIsShow(req.Keepalive),
+		"hidden_tag":       model.BooleanToIsShow(req.HiddenTag),
+		"show_link":        model.BooleanToIsShow(req.ShowLink),
+		"show_parent":      model.BooleanToIsShow(req.ShowParent),
+		"icon":             req.Icon,
+		"component":        req.Component,
+		"redirect":         req.Redirect,
+		"auths":            req.Auths,
+		"rank":             req.Rank,
+		"extra_icon":       req.ExtraIcon,
+		"enter_transition": req.EnterTransition,
+		"leave_transition": req.LeaveTransition,
+		"active_path":      req.ActivePath,
+		"is_delete":        pasturePb.IsShow_Ok,
+		"is_show":          pasturePb.IsShow_Ok,
+	}).FirstOrCreate(&model.SystemMenu{}).Error; err != nil {
+		return xerr.WithStack(err)
+	}
+	return nil
+}
+
+func (s *StoreEntry) SystemMenuTree(ctx context.Context) (*pasturePb.SystemMenuTreeResponse, error) {
+	systemMenuList := make([]*model.SystemMenu, 0)
+	if err := s.DB.Model(new(model.SystemMenu)).Where("is_delete = ?", pasturePb.IsShow_Ok).
+		Where("is_show = ?", pasturePb.IsShow_Ok).Find(&systemMenuList).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+	return &pasturePb.SystemMenuTreeResponse{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: model.SystemMenuSlice(systemMenuList).ToPB(),
+	}, nil
+}
+
+// SearchSystemMenuList 菜单列表查询
+func (s *StoreEntry) SearchSystemMenuList(ctx context.Context, req *pasturePb.SearchMenuRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchMenuResponse, error) {
+	systemMenuList := make([]*model.SystemMenu, 0)
+	var count int64 = 0
+
+	if err := s.DB.Model(new(model.SystemMenu)).
+		Where("is_delete = ? ", operationPb.IsShow_OK).
+		Order("parent_id").Count(&count).
+		Find(&systemMenuList).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	return &pasturePb.SearchMenuResponse{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: &pasturePb.SearchMenuData{
+			Page:     pagination.Page,
+			Total:    int32(count),
+			PageSize: pagination.PageSize,
+			List:     model.SystemMenuSlice(systemMenuList).ToPB(),
+		},
+	}, nil
+}
+
+// DeleteSystemMenu 删除系统菜单
+func (s *StoreEntry) DeleteSystemMenu(ctx context.Context, menuId int64) error {
+	systemMenu := &model.SystemMenu{Id: menuId}
+	if err := s.DB.First(systemMenu).Error; err != nil {
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return xerr.Custom("该数据不存在")
+		}
+		return xerr.WithStack(err)
+	}
+
+	if err := s.DB.Model(systemMenu).Update("is_delete", pasturePb.IsShow_No).Error; err != nil {
+		return xerr.WithStack(err)
+	}
+	return nil
+}
+
+func (s *StoreEntry) SearchSystemDeptList(ctx context.Context, req *pasturePb.SearchDeptRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchDeptResponse, error) {
+	deptList := make([]*model.SystemDept, 0)
+	var count int64 = 0
+	pref := s.DB.Model(new(model.SystemDept)).Where("is_delete = ?", operationPb.IsShow_OK)
+	if req.Name != "" {
+		pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
+	}
+
+	if req.IsShow > 0 {
+		pref.Where("is_show = ?", req.IsShow)
+	}
+
+	if err := pref.Order("sort desc").
+		Count(&count).
+		Limit(int(pagination.PageSize)).
+		Offset(int(pagination.PageOffset)).
+		Find(&deptList).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	systemUserList, _ := s.SystemUserList(ctx)
+
+	return &pasturePb.SearchDeptResponse{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: &pasturePb.DeptData{
+			List:     model.SystemDeptSlice(deptList).ToPB(systemUserList),
+			Total:    int32(count),
+			PageSize: pagination.PageSize,
+			Page:     pagination.Page,
+		},
+	}, nil
+}
+
+func (s *StoreEntry) SystemDepDelete(ctx context.Context, id int64) error {
+	dept := &model.SystemDept{Id: id}
+	if err := s.DB.First(dept).Error; err != nil {
+		return xerr.WithStack(err)
+	}
+
+	if dept.IsShow == pasturePb.IsShow_No {
+		return nil
+	}
+	if err := s.DB.Model(dept).Update("is_delete", operationPb.IsShow_NO).Error; err != nil {
+		return xerr.WithStack(err)
+	}
+	return nil
+}
+
+func (s *StoreEntry) SystemDeptCreateOrUpdate(ctx context.Context, req *pasturePb.SearchDeptRequest) error {
+	if req.Id > 0 {
+		barn := &model.SystemDept{Id: int64(req.Id)}
+		if err := s.DB.Model(&model.SystemDept{}).First(barn).Error; err != nil {
+			if !errors.Is(err, gorm.ErrRecordNotFound) {
+				return xerr.WithStack(err)
+			}
+		}
+	}
+	if err := s.DB.Model(&model.SystemDept{}).Where(map[string]interface{}{
+		"id": req.Id,
+	}).Assign(map[string]interface{}{
+		"name":      req.Name,
+		"sort":      req.Sort,
+		"parent_id": req.ParentId,
+		"remarks":   req.Remarks,
+		"is_delete": operationPb.IsShow_OK,
+		"is_show":   req.IsShow,
+		"dept_type": pasturePb.Depth_Department,
+		"leader_id": req.LeaderId,
+	}).FirstOrCreate(&model.SystemDept{}).Error; err != nil {
+		return xerr.WithStack(err)
+	}
+	return nil
+}
+
+func (s *StoreEntry) SearchUserPastureList(ctx context.Context) (*pasturePb.SystemUserPastureListResponse, error) {
+	currentUser, err := s.GetCurrentSystemUser(ctx)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	farmList, err := s.FindPastureList(ctx, currentUser.PastureIds)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	return &pasturePb.SystemUserPastureListResponse{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: model.AppPastureListSlice(farmList).ToPB(),
+	}, err
+}
+
+func (s *StoreEntry) SystemDeptTree(ctx context.Context) (*pasturePb.DeptTreeResponse, error) {
+	systemDeptList := make([]*model.SystemDept, 0)
+	if err := s.DB.Model(new(model.SystemDept)).Where("is_delete = ?", pasturePb.IsShow_Ok).
+		Where("is_show = ?", pasturePb.IsShow_Ok).Find(&systemDeptList).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+	return &pasturePb.DeptTreeResponse{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: model.SystemDeptSlice(systemDeptList).ToTree(),
+	}, nil
+}