Browse Source

system: user update

Yi 1 week ago
parent
commit
8d6441da87

+ 1 - 1
go.mod

@@ -3,7 +3,7 @@ module kpt-pasture
 go 1.17
 
 require (
-	gitee.com/xuyiping_admin/go_proto v0.0.0-20250526035313-54b0f5e98983
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20250526084133-ef8acddd1868
 	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

+ 8 - 0
go.sum

@@ -113,6 +113,14 @@ gitee.com/xuyiping_admin/go_proto v0.0.0-20250523062919-b893047f10c8 h1:j8gu75Sg
 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/go_proto v0.0.0-20250526062319-25f58c4f9504 h1:0CUkSlzaAkVhwqWFdGRimK9WdycyDpeDPiMg6M2pBLI=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250526062319-25f58c4f9504/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250526073830-beed24bc2e26 h1:XzWzg5AXdJYJeiS+jwfqapmIbrJ92ETi/qZ3iqjrC4c=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250526073830-beed24bc2e26/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250526081009-3766cd67d900 h1:+QN7wEwmtLwY89R3iE6kMLgp/jS1QgsPczJdZUCoFe8=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250526081009-3766cd67d900/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250526084133-ef8acddd1868 h1:JTXSBH8VO9uUweNyEy5o/OngSJ4xx2WmYVBn+/1vp1w=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250526084133-ef8acddd1868/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=

+ 1 - 1
http/handler/system/user.go

@@ -48,7 +48,7 @@ func UserCreateOrUpdate(c *gin.Context) {
 
 	if err := valid.ValidateStruct(&req,
 		valid.Field(&req.Name, valid.Required),
-		valid.Field(&req.DeptId, valid.Required),
+		valid.Field(&req.DepthList, valid.Required),
 		valid.Field(&req.Mobile, valid.Required),
 		valid.Field(&req.Password, valid.Required),
 	); err != nil {

+ 3 - 1
http/handler/test.go

@@ -117,7 +117,9 @@ func NeckRingOriginalAsync(c *gin.Context) {
 }
 
 func PastureInit(c *gin.Context) {
-	if err := middleware.BackendOperation(c).OpsService.PastureInit(c); err != nil {
+	pastureIdStr := c.Param("pasture_id")
+	pastureId, _ := strconv.Atoi(pastureIdStr)
+	if err := middleware.BackendOperation(c).OpsService.PastureInit(c, int64(pastureId)); err != nil {
 		apierr.ClassifiedAbort(c, err)
 		return
 	}

+ 22 - 7
model/system_dept.go

@@ -8,22 +8,37 @@ import (
 
 type SystemDept struct {
 	Id        int64                 `json:"id"`
+	PastureId int64                 `json:"pastureId"`
 	Name      string                `json:"name"`
 	Remarks   string                `json:"remarks"`
-	DeptType  pasturePb.Depth_Kind  `json:"dept_type"`
-	LeaderId  int64                 `json:"leader_id"`
-	ParentId  int64                 `json:"parent_id"`
+	DeptType  pasturePb.Depth_Kind  `json:"deptType"`
+	LeaderId  int64                 `json:"leaderId"`
+	ParentId  int64                 `json:"parentId"`
 	Sort      int32                 `json:"sort"`
-	IsShow    pasturePb.IsShow_Kind `json:"is_show"`
-	IsDelete  pasturePb.IsShow_Kind `json:"is_delete"`
-	CreatedAt int64                 `json:"created_at"`
-	UpdatedAt int64                 `json:"updated_at"`
+	IsShow    pasturePb.IsShow_Kind `json:"isShow"`
+	IsDelete  pasturePb.IsShow_Kind `json:"isDelete"`
+	CreatedAt int64                 `json:"createdAt"`
+	UpdatedAt int64                 `json:"updatedAt"`
 }
 
 func (s *SystemDept) TableName() string {
 	return "system_dept"
 }
 
+func NewSystemDeptInit(pasture *AppPastureList) *SystemDept {
+	return &SystemDept{
+		PastureId: pasture.Id,
+		Name:      pasture.Name,
+		Remarks:   "",
+		DeptType:  pasturePb.Depth_Company,
+		LeaderId:  0,
+		ParentId:  0,
+		Sort:      0,
+		IsShow:    pasturePb.IsShow_Ok,
+		IsDelete:  pasturePb.IsShow_No,
+	}
+}
+
 type SystemDeptSlice []*SystemDept
 
 func (s SystemDeptSlice) ToPB(systemUserList []*SystemUser) []*pasturePb.SearchDeptRequest {

+ 37 - 17
model/system_user.go

@@ -1,7 +1,9 @@
 package model
 
 import (
+	"fmt"
 	"net/http"
+	"strings"
 	"time"
 
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
@@ -10,14 +12,13 @@ import (
 
 type SystemUser struct {
 	Id              int64                  `json:"id"`
-	PastureId       int64                  `json:"pastureId"`
 	Name            string                 `json:"name"`
 	NickName        string                 `json:"nickName"`
 	Mobile          string                 `json:"mobile"`
 	Password        string                 `json:"password"`
 	Avatar          string                 `json:"avatar"`
-	RoleId          int64                  `json:"roleId"`
-	DeptId          int64                  `json:"deptId"`
+	RoleIds         string                 `json:"roleIds"`
+	DeptIds         string                 `json:"deptIds"`
 	IndicatorsKinds string                 `json:"indicatorsKinds"`
 	Gender          pasturePb.Genders_Kind `json:"gender"`
 	PastureIds      string                 `json:"pastureIds"`
@@ -60,20 +61,41 @@ type UserModel struct {
 type SystemUserSlice []*SystemUser
 
 func (s SystemUserSlice) ToPB(deptList []*SystemDept, roleList []*SystemRole) []*pasturePb.SearchUserRequest {
+	deptMap := make(map[string]*SystemDept)
+	for _, v := range deptList {
+		deptMap[fmt.Sprintf("%d", v.Id)] = v
+	}
+	roleMap := make(map[string]*SystemRole)
+	for _, v := range roleList {
+		roleMap[fmt.Sprintf("%d", v.Id)] = v
+	}
+
 	res := make([]*pasturePb.SearchUserRequest, len(s))
 	for i, v := range s {
-		deptName := ""
-		for _, d := range deptList {
-			if v.DeptId == d.Id {
-				deptName = d.Name
-				break
+		userDeptList := make([]*pasturePb.IdName, 0)
+		if v.DeptIds != "" {
+			deptIds := strings.Split(v.DeptIds, ",")
+			for _, d := range deptIds {
+				if de, ok := deptMap[d]; ok {
+					userDeptList = append(userDeptList, &pasturePb.IdName{
+						Id:   int32(de.Id),
+						Name: de.Name,
+					})
+				}
+
 			}
 		}
-		roleName := ""
-		for _, r := range roleList {
-			if v.RoleId == r.Id {
-				roleName += r.Name
-				break
+
+		userRoleList := make([]*pasturePb.IdName, 0)
+		if v.RoleIds != "" {
+			roleIds := strings.Split(v.RoleIds, ",")
+			for _, r := range roleIds {
+				if ro, ok := roleMap[r]; ok {
+					userRoleList = append(userRoleList, &pasturePb.IdName{
+						Id:   int32(ro.Id),
+						Name: ro.Name,
+					})
+				}
 			}
 		}
 
@@ -87,10 +109,8 @@ func (s SystemUserSlice) ToPB(deptList []*SystemDept, roleList []*SystemRole) []
 			IsShow:          v.IsShow,
 			IsDelete:        v.IsDelete,
 			Remarks:         v.Remarks,
-			DeptId:          int32(v.DeptId),
-			DeptName:        deptName,
-			RoleId:          int32(v.RoleId),
-			RoleName:        roleName,
+			DepthList:       userDeptList,
+			RoleList:        userRoleList,
 			CreatedAtFormat: time.Unix(v.CreatedAt, 0).Local().Format(LayoutTime),
 			UpdatedAtFormat: time.Unix(v.UpdatedAt, 0).Local().Format(LayoutTime),
 		}

+ 1 - 1
model/work_order_master.go

@@ -67,7 +67,7 @@ func NewWorkOrderMaster(
 			}
 
 			for _, depId := range req.ExecDepartmental {
-				if int64(depId) != vv.DeptId {
+				if !strings.Contains(vv.DeptIds, fmt.Sprintf("%d", depId)) {
 					continue
 				}
 				execPersonNames = append(execPersonNames, vv.Name)

+ 1 - 1
module/backend/interface.go

@@ -361,7 +361,7 @@ type TestService interface {
 	UpdateCowPen(ctx context.Context, pagination *pasturePb.PaginationModel) error
 	TestDataWaring(ctx context.Context, userId int64) error
 	NeckRingOriginalAsync(ctx context.Context, pastureId int64, pagination *pasturePb.PaginationModel) error
-	PastureInit(ctx context.Context) error
+	PastureInit(ctx context.Context, pastureId int64) error
 	AdmissionAge(ctx context.Context) error
 	CalvingAge(ctx context.Context) error
 }

+ 81 - 29
module/backend/system_service.go

@@ -7,6 +7,8 @@ import (
 	"kpt-pasture/model"
 	"kpt-pasture/util"
 	"net/http"
+	"strconv"
+	"strings"
 	"time"
 
 	"gitee.com/xuyiping_admin/pkg/logger/zaplog"
@@ -44,12 +46,19 @@ func (s *StoreEntry) Login(ctx context.Context, req *pasturePb.SearchUserRequest
 		return nil, xerr.Customf("该账号已被删除,请联系管理员")
 	}
 
-	systemRole := &model.SystemRole{Id: systemUser.RoleId}
-	if err := s.DB.Where("is_show = ? and is_delete = ?", pasturePb.IsShow_Ok, pasturePb.IsShow_Ok).
-		First(systemRole).Error; err != nil {
+	systemRoleList := make([]*model.SystemRole, 0)
+	if err := s.DB.Model(new(model.SystemRole)).
+		Where("is_show = ? and is_delete = ?", pasturePb.IsShow_Ok, pasturePb.IsShow_Ok).
+		Where("id IN ?", strings.Split(systemUser.RoleIds, ",")).
+		Find(&systemRoleList).Error; err != nil {
 		zaplog.Error("Login", zap.Any("systemRole", err))
 	}
 
+	roleNameList := make([]string, 0)
+	for _, role := range systemRoleList {
+		roleNameList = append(roleNameList, role.Name)
+	}
+
 	jwtToken := jwt.NewJWTTokenGen(s.Cfg.AppName, s.Cfg.JwtTokenKeyConfig.PrivateKey)
 	token, err := jwtToken.GenerateToken(systemUser.Name, s.Cfg.JwtExpireTime)
 	if err != nil {
@@ -73,7 +82,7 @@ func (s *StoreEntry) Login(ctx context.Context, req *pasturePb.SearchUserRequest
 			Expires:      expires,
 			RefreshToken: token,
 			Username:     systemUser.Name,
-			Roles:        []string{systemRole.Name},
+			Roles:        roleNameList,
 			Avatar:       systemUser.Avatar,
 			FarmId:       farmList[0].FarmId,
 		},
@@ -101,8 +110,18 @@ func (s *StoreEntry) SearchSystemUserList(ctx context.Context, req *pasturePb.Se
 		pref.Where("mobile = ?", req.Mobile)
 	}
 
-	if req.DeptId > 0 {
-		pref.Where("dept_id = ?", req.DeptId)
+	if req.DepthId > 0 {
+		systemDept := &model.SystemDept{}
+		if err = s.DB.Model(new(model.SystemDept)).Where("id = ?", req.DepthId).
+			Where("is_delete = ?", operationPb.IsShow_OK).
+			First(systemDept).Error; err != nil {
+			return nil, xerr.Custom("部门信息错误")
+		}
+
+		pref.Where("pasture_id = ?", systemDept.PastureId)
+		if systemDept.DeptType == pasturePb.Depth_Department {
+			pref.Where("dept_id = ?", req.DepthId)
+		}
 	}
 
 	if req.IsShow > 0 {
@@ -113,7 +132,7 @@ func (s *StoreEntry) SearchSystemUserList(ctx context.Context, req *pasturePb.Se
 		Count(&count).
 		Limit(int(pagination.PageSize)).
 		Offset(int(pagination.PageOffset)).
-		Find(&systemUserList).Debug().Error; err != nil {
+		Find(&systemUserList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
 
@@ -154,14 +173,15 @@ func (s *StoreEntry) DeleteSystemUser(ctx context.Context, userId int64) error {
 	systemUser := &model.SystemUser{
 		Id: userId,
 	}
-	if err := s.DB.First(systemUser).Error; err != nil {
+	if err := s.DB.Model(new(model.SystemUser)).First(systemUser).Error; err != nil {
 		if errors.Is(err, gorm.ErrRecordNotFound) {
 			return xerr.Custom("该用户不存在")
 		}
 		return xerr.WithStack(err)
 	}
 
-	if err := s.DB.Model(systemUser).Update("is_delete", operationPb.IsShow_NO).Error; err != nil {
+	if err := s.DB.Model(systemUser).
+		Update("is_delete", operationPb.IsShow_NO).Error; err != nil {
 		return xerr.WithStack(err)
 	}
 	return nil
@@ -169,9 +189,7 @@ func (s *StoreEntry) DeleteSystemUser(ctx context.Context, userId int64) error {
 
 // IsShowSystemUser 用户是否启用
 func (s *StoreEntry) IsShowSystemUser(ctx context.Context, userId int64) error {
-	systemUser := &model.SystemUser{
-		Id: userId,
-	}
+	systemUser := &model.SystemUser{Id: userId}
 	if err := s.DB.First(systemUser).Error; err != nil {
 		if errors.Is(err, gorm.ErrRecordNotFound) {
 			return xerr.Custom("该用户不存在")
@@ -194,12 +212,14 @@ func (s *StoreEntry) SystemUserCreateOrUpdate(ctx context.Context, req *pastureP
 	systemUser := &model.SystemUser{}
 	if req.Id > 0 {
 		systemUser.Id = int64(req.Id)
-		if err := s.DB.First(systemUser).Error; err != nil {
+		if err := s.DB.Model(new(model.SystemUser)).First(systemUser).Error; err != nil {
 			return xerr.WithStack(err)
 		}
 		req.Password = systemUser.Password
 	} else {
-		if err := s.DB.Where("name = ?", req.Name).First(systemUser).Error; err != nil {
+		if err := s.DB.Model(new(model.SystemUser)).
+			Where("name = ?", req.Name).
+			First(systemUser).Error; err != nil {
 			if !errors.Is(err, gorm.ErrRecordNotFound) {
 				return xerr.WithStack(err)
 			}
@@ -208,15 +228,26 @@ func (s *StoreEntry) SystemUserCreateOrUpdate(ctx context.Context, req *pastureP
 		}
 	}
 
-	if err := s.DB.Model(&model.SystemUser{}).Where(map[string]interface{}{
-		"id": req.Id,
-	}).Assign(map[string]interface{}{
+	deptIds := ""
+	if len(req.DepthList) > 0 {
+		for _, dept := range req.DepthList {
+			deptIds += fmt.Sprintf("%d,", dept.Id)
+		}
+	}
+	if len(deptIds) > 0 {
+		deptIds = strings.TrimRight(deptIds, ",")
+	}
+
+	if err := s.DB.Model(&model.SystemUser{}).
+		Where(map[string]interface{}{
+			"id": req.Id,
+		}).Assign(map[string]interface{}{
 		"name":      req.Name,
 		"nick_name": req.NickName,
 		"mobile":    req.Mobile,
 		"gender":    req.Gender,
 		"password":  req.Password,
-		"dept_id":   req.DeptId,
+		"dept_ids":  deptIds,
 		"remarks":   req.Remarks,
 		"is_delete": operationPb.IsShow_OK,
 		"is_show":   req.IsShow,
@@ -253,13 +284,19 @@ func (s *StoreEntry) SystemUserRole(ctx context.Context, userId int64) (*pasture
 		return nil, xerr.WithStack(err)
 	}
 
+	roleIds := make([]int32, 0)
+	if len(systemUser.RoleIds) > 0 {
+		roleIdsString := strings.Split(systemUser.RoleIds, ",")
+		for _, r := range roleIdsString {
+			r1, _ := strconv.Atoi(r)
+			roleIds = append(roleIds, int32(r1))
+		}
+	}
 	return &pasturePb.SystemUserRoleResponse{
 		Code: http.StatusOK,
 		Msg:  "ok",
 		Data: &pasturePb.UserRoleData{
-			RoleIds: []int32{
-				int32(systemUser.RoleId),
-			},
+			RoleIds: roleIds,
 		},
 	}, nil
 }
@@ -273,16 +310,28 @@ func (s *StoreEntry) SystemUserRoleSave(ctx context.Context, req *pasturePb.Syst
 		return xerr.WithStack(err)
 	}
 
-	// todo 用户觉得绑定单个还是多少q
-	systemRole := &model.SystemRole{Id: int64(req.RoleIds[0])}
-	if err := s.DB.First(systemRole).Error; err != nil {
+	systemRoleList := make([]*model.SystemRole, 0)
+	if err := s.DB.Model(new(model.SystemRole)).
+		Where("is_delete = ?", pasturePb.IsShow_Ok).
+		Where("id IN ?", req.RoleIds).
+		Find(&systemRoleList).Error; err != nil {
 		if errors.Is(err, gorm.ErrRecordNotFound) {
 			return xerr.Custom("该角色不存在")
 		}
 		return xerr.WithStack(err)
 	}
+
+	roleIdsStr := ""
+	for _, systemRole := range systemRoleList {
+		roleIdsStr += fmt.Sprintf("%d,", systemRole.Id)
+	}
+
+	if len(roleIdsStr) > 0 {
+		roleIdsStr = strings.TrimRight(roleIdsStr, ",")
+	}
+
 	if err := s.DB.Model(systemUser).
-		Update("role_id", systemRole.Id).Error; err != nil {
+		Update("role_ids", roleIdsStr).Error; err != nil {
 		return xerr.WithStack(err)
 	}
 	return nil
@@ -295,12 +344,15 @@ func (s *StoreEntry) GetSystemUserMenu(ctx context.Context) (*pasturePb.SystemUs
 	if err != nil {
 		return nil, xerr.Custom("该用户数据不存在")
 	}
-	if systemUser.RoleId <= 0 {
+	if len(systemUser.RoleIds) <= 0 {
 		return nil, xerr.Custom("该用户没有角色")
 	}
+
+	roleIds := strings.Split(systemUser.RoleIds, ",")
 	// 获取用户角色数据
-	systemRole := &model.SystemRole{}
-	if err = s.DB.Where("id = ?", systemUser.RoleId).First(systemRole).Error; err != nil {
+	systemRoleList := make([]*model.SystemRole, 0)
+	if err = s.DB.Where("id IN ?", roleIds).
+		Find(&systemRoleList).Error; err != nil {
 		if errors.Is(err, gorm.ErrRecordNotFound) {
 			return nil, xerr.Custom("该用户角色不存在")
 		}
@@ -311,7 +363,7 @@ func (s *StoreEntry) GetSystemUserMenu(ctx context.Context) (*pasturePb.SystemUs
 	if err = s.DB.Table(fmt.Sprintf("%s as a", new(model.SystemRoleMenu).TableName())).
 		Select("b.*").
 		Joins("LEFT JOIN system_menu AS b ON a.menu_id = b.id").
-		Where("a.role_id = ? and b.is_delete = ?", systemRole.Id, pasturePb.IsShow_Ok).
+		Where("a.role_id IN ? and b.is_delete = ?", roleIds, pasturePb.IsShow_Ok).
 		Find(&systemMenuList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}

+ 19 - 3
module/backend/system_service_more.go

@@ -6,6 +6,7 @@ import (
 	"fmt"
 	"kpt-pasture/model"
 	"net/http"
+	"strings"
 
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
 	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
@@ -111,7 +112,8 @@ func (s *StoreEntry) DeleteSystemMenu(ctx context.Context, menuId int64) error {
 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)
+	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, "%"))
 	}
@@ -202,9 +204,23 @@ func (s *StoreEntry) SearchUserPastureList(ctx context.Context) (*pasturePb.Syst
 }
 
 func (s *StoreEntry) SystemDeptTree(ctx context.Context) (*pasturePb.DeptTreeResponse, error) {
+	currentUser, err := s.GetCurrentSystemUser(ctx)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	pastureIdsStr := currentUser.PastureIds
+	if pastureIdsStr == "" {
+		return nil, xerr.Customf("请先将该用户绑定牧场!谢谢!")
+	}
+
+	pastureIds := strings.Split(pastureIdsStr, ",")
 	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 {
+	if err = s.DB.Model(new(model.SystemDept)).
+		Where("is_delete = ?", pasturePb.IsShow_Ok).
+		Where("is_show = ?", pasturePb.IsShow_Ok).
+		Where("pasture_id IN ?", pastureIds).
+		Find(&systemDeptList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
 	return &pasturePb.DeptTreeResponse{

File diff suppressed because it is too large
+ 36 - 1484
module/backend/test_service.go


Some files were not shown because too many files changed in this diff