WiiCITMS/servers/hrPermissionTools.go

408 lines
12 KiB
Go
Raw Normal View History

2025-11-07 14:14:34 +08:00
package servers
import (
"WiiCITMS/process/hr"
"context"
"encoding/json"
"fmt"
"github.com/mark3labs/mcp-go/mcp"
"github.com/mark3labs/mcp-go/server"
)
// HRPermissionTools 权限管理工具
var HRPermissionTools = []server.ServerTool{
// 初始化系统权限
{
Tool: mcp.NewTool(
"initSystemPermissions",
mcp.WithDescription("初始化系统预定义权限"),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
proc := hr.InitSystemPermissions()
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
return mcp.NewToolResultText("初始化系统权限成功"), nil
},
},
// 创建权限
{
Tool: mcp.NewTool(
"createPermission",
mcp.WithDescription("创建权限,在创建权限前应该先查询所需的权限是否已经存在,存在则不创建"),
mcp.WithNumber("permissionId", mcp.Required(), mcp.Description("权限ID")),
mcp.WithString("permissionName", mcp.Required(), mcp.Description("权限名称")),
mcp.WithString("permissionCode", mcp.Required(), mcp.Description("权限代码")),
mcp.WithString("description", mcp.Description("权限描述")),
mcp.WithNumber("category", mcp.Description("权限分类")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
permId := request.GetInt("permissionId", 0)
if permId <= 0 {
return nil, fmt.Errorf("权限ID必须大于0")
}
name := request.GetString("permissionName", "")
if name == "" {
return nil, fmt.Errorf("权限名称不能为空")
}
code := request.GetString("permissionCode", "")
if code == "" {
return nil, fmt.Errorf("权限代码不能为空")
}
params := hr.CreatePermissionRequest{
PermissionID: permId,
PermissionName: name,
PermissionCode: code,
Description: request.GetString("description", ""),
Category: request.GetInt("category", 0),
}
perm, proc := hr.CreatePermission(params)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(perm)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 更新权限
{
Tool: mcp.NewTool(
"updatePermission",
mcp.WithDescription("更新权限"),
mcp.WithString("permissionGuid", mcp.Required(), mcp.Description("权限GUID")),
mcp.WithNumber("permissionId", mcp.Description("权限ID")),
mcp.WithString("permissionName", mcp.Description("权限名称")),
mcp.WithString("permissionCode", mcp.Description("权限代码")),
mcp.WithString("description", mcp.Description("权限描述")),
mcp.WithNumber("category", mcp.Description("权限分类")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
permGuid := request.GetString("permissionGuid", "")
if permGuid == "" {
return nil, fmt.Errorf("权限GUID不能为空")
}
params := hr.CreatePermissionRequest{
PermissionID: request.GetInt("permissionId", 0),
PermissionName: request.GetString("permissionName", ""),
PermissionCode: request.GetString("permissionCode", ""),
Description: request.GetString("description", ""),
Category: request.GetInt("category", 0),
}
perm, proc := hr.UpdatePermission(permGuid, params)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(perm)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 查询权限列表
{
Tool: mcp.NewTool(
"queryPermissions",
mcp.WithDescription("查询现在已经存在的权限列表"),
mcp.WithString("permissionName", mcp.Description("权限名称,模糊查询")),
mcp.WithString("permissionCode", mcp.Description("权限代码,精确查询")),
mcp.WithNumber("category", mcp.Description("权限分类")),
mcp.WithNumber("limit", mcp.Description("分页参数,每页数量")),
mcp.WithNumber("offset", mcp.Description("分页参数,偏移量")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
params := hr.QueryPermissionRequest{
PermissionName: request.GetString("permissionName", ""),
PermissionCode: request.GetString("permissionCode", ""),
Category: request.GetInt("category", 0),
Limit: request.GetInt("limit", 20),
Offset: request.GetInt("offset", 0),
}
perms, proc := hr.QueryPermissions(params)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(perms)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 获取权限详情
{
Tool: mcp.NewTool(
"getPermission",
mcp.WithDescription("获取权限详情"),
mcp.WithString("permissionGuid", mcp.Required(), mcp.Description("权限GUID")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
permGuid := request.GetString("permissionGuid", "")
if permGuid == "" {
return nil, fmt.Errorf("权限GUID不能为空")
}
perm, proc := hr.GetPermissionByID(permGuid)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(perm)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 删除权限
{
Tool: mcp.NewTool(
"deletePermission",
mcp.WithDescription("删除权限"),
mcp.WithString("permissionGuid", mcp.Required(), mcp.Description("权限GUID")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
permGuid := request.GetString("permissionGuid", "")
if permGuid == "" {
return nil, fmt.Errorf("权限GUID不能为空")
}
proc := hr.DeletePermission(permGuid)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
return mcp.NewToolResultText("删除权限成功"), nil
},
},
// 为岗位分配权限
{
Tool: mcp.NewTool(
"assignPermissionToPosition",
mcp.WithDescription("为岗位分配权限"),
mcp.WithString("positionGuid", mcp.Required(), mcp.Description("岗位GUID")),
mcp.WithString("permissionGuid", mcp.Required(), mcp.Description("权限GUID")),
mcp.WithNumber("grantType", mcp.Description("授权类型0-直接授权1-继承授权")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
posGuid := request.GetString("positionGuid", "")
if posGuid == "" {
return nil, fmt.Errorf("岗位GUID不能为空")
}
permGuid := request.GetString("permissionGuid", "")
if permGuid == "" {
return nil, fmt.Errorf("权限GUID不能为空")
}
params := hr.PositionPermissionRequest{
PositionGuid: posGuid,
PermissionGuid: permGuid,
GrantType: request.GetInt("grantType", 0),
}
relation, proc := hr.AssignPermissionToPosition(params)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(relation)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 从岗位中移除权限
{
Tool: mcp.NewTool(
"removePermissionFromPosition",
mcp.WithDescription("从岗位中移除权限"),
mcp.WithString("relationGuid", mcp.Required(), mcp.Description("关系GUID")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
relGuid := request.GetString("relationGuid", "")
if relGuid == "" {
return nil, fmt.Errorf("关系GUID不能为空")
}
proc := hr.RemovePermissionFromPosition(relGuid)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
return mcp.NewToolResultText("移除权限成功"), nil
},
},
// 查询岗位的权限列表
{
Tool: mcp.NewTool(
"queryPositionPermissions",
mcp.WithDescription("查询岗位的权限列表"),
mcp.WithString("positionGuid", mcp.Required(), mcp.Description("岗位GUID")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
posGuid := request.GetString("positionGuid", "")
if posGuid == "" {
return nil, fmt.Errorf("岗位GUID不能为空")
}
perms, proc := hr.QueryPositionPermissions(posGuid)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(perms)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 检查岗位是否拥有特定权限
{
Tool: mcp.NewTool(
"hasPermission",
mcp.WithDescription("检查岗位是否拥有特定权限"),
mcp.WithString("positionGuid", mcp.Required(), mcp.Description("岗位GUID")),
mcp.WithNumber("permissionId", mcp.Required(), mcp.Description("权限ID")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
posGuid := request.GetString("positionGuid", "")
if posGuid == "" {
return nil, fmt.Errorf("岗位GUID不能为空")
}
permId := request.GetInt("permissionId", 0)
if permId <= 0 {
return nil, fmt.Errorf("权限ID必须大于0")
}
hasPermission, proc := hr.HasPermission(posGuid, permId)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
result := map[string]bool{
"hasPermission": hasPermission,
}
repStr, err := json.Marshal(result)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 检查员工是否拥有特定权限
{
Tool: mcp.NewTool(
"checkStaffPermission",
mcp.WithDescription("检查员工是否拥有特定权限"),
mcp.WithString("staffGuid", mcp.Required(), mcp.Description("员工GUID")),
mcp.WithNumber("permissionId", mcp.Required(), mcp.Description("权限ID")),
mcp.WithString("organizationGuid", mcp.Description("相关组织GUID可选")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
staffGuid := request.GetString("staffGuid", "")
if staffGuid == "" {
return nil, fmt.Errorf("员工GUID不能为空")
}
permId := request.GetInt("permissionId", 0)
if permId <= 0 {
return nil, fmt.Errorf("权限ID必须大于0")
}
params := hr.CheckPermissionRequest{
StaffGuid: staffGuid,
PermissionID: permId,
OrganizationGuid: request.GetString("organizationGuid", ""),
}
hasPermission, proc := hr.CheckStaffPermission(params)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
result := map[string]bool{
"hasPermission": hasPermission,
}
repStr, err := json.Marshal(result)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 获取员工的所有权限
{
Tool: mcp.NewTool(
"getPermissionsByStaff",
mcp.WithDescription("获取员工的所有权限"),
mcp.WithString("staffGuid", mcp.Required(), mcp.Description("员工GUID")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
staffGuid := request.GetString("staffGuid", "")
if staffGuid == "" {
return nil, fmt.Errorf("员工GUID不能为空")
}
perms, proc := hr.GetPermissionsByStaff(staffGuid)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(perms)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 检查员工是否是系统管理员
{
Tool: mcp.NewTool(
"isSystemAdmin",
mcp.WithDescription("检查员工是否是系统管理员"),
mcp.WithString("staffGuid", mcp.Required(), mcp.Description("员工GUID")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
staffGuid := request.GetString("staffGuid", "")
if staffGuid == "" {
return nil, fmt.Errorf("员工GUID不能为空")
}
isAdmin, proc := hr.IsSystemAdmin(staffGuid)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
result := map[string]bool{
"isSystemAdmin": isAdmin,
}
repStr, err := json.Marshal(result)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
}