WiiCITMS/servers/hrPermissionTools.go
2025-11-07 14:14:34 +08:00

408 lines
12 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
},
},
}