WiiCITMS/servers/hrStaffTools.go

236 lines
7.4 KiB
Go
Raw Permalink 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"
)
// HRStaffTools 员工管理工具
var HRStaffTools = []server.ServerTool{
// 创建员工并指定所属组织
{
Tool: mcp.NewTool(
"createStaffWithOrganization",
mcp.WithDescription("创建员工并指定所属组织"),
mcp.WithString("staffName", mcp.Required(), mcp.Description("员工姓名")),
mcp.WithString("affiliated", mcp.Required(), mcp.Description("所属组织GUID")),
mcp.WithNumber("staffType", mcp.Description("员工类型0-正式员工1-实习员工2-外包员工默认0")),
mcp.WithNumber("affiliatedType", mcp.Description("隶属关系类型0-主部门1-兼职部门默认0")),
mcp.WithString("account", mcp.Description("账号(可选)")),
mcp.WithString("userGuid", mcp.Description("SSO平台用户GUID可选")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
staffName := request.GetString("staffName", "")
if staffName == "" {
return nil, fmt.Errorf("员工姓名不能为空")
}
affiliated := request.GetString("affiliated", "")
if affiliated == "" {
return nil, fmt.Errorf("所属组织不能为空")
}
params := hr.CreateStaffWithOrganizationRequest{
StaffName: staffName,
Affiliated: affiliated,
StaffType: request.GetInt("staffType", 0),
AffiliatedType: request.GetInt("affiliatedType", 0),
Account: request.GetString("account", ""),
UserGuid: request.GetString("userGuid", ""),
}
staff, proc := hr.CreateStaffWithOrganization(params)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(staff)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 绑定SSO用户到员工
{
Tool: mcp.NewTool(
"bindStaff",
mcp.WithDescription("绑定SSO用户到员工"),
mcp.WithString("staffGuid", mcp.Required(), mcp.Description("员工GUID")),
mcp.WithString("account", mcp.Description("账号")),
mcp.WithString("userGuid", mcp.Description("SSO平台用户GUID")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
staffGuid := request.GetString("staffGuid", "")
if staffGuid == "" {
return nil, fmt.Errorf("员工GUID不能为空")
}
account := request.GetString("account", "")
userGuid := request.GetString("userGuid", "")
if account == "" && userGuid == "" {
return nil, fmt.Errorf("账号和用户GUID至少提供一个")
}
params := hr.BindStaffRequest{
StaffGuid: staffGuid,
Account: account,
UserGuid: userGuid,
}
staff, proc := hr.BindStaff(params)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(staff)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 解除员工与SSO用户的绑定
{
Tool: mcp.NewTool(
"unbindStaff",
mcp.WithDescription("解除员工与SSO用户的绑定"),
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不能为空")
}
staff, proc := hr.UnbindStaff(staffGuid)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(staff)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 获取员工详情
{
Tool: mcp.NewTool(
"getStaff",
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不能为空")
}
staffDetail, proc := hr.GetStaff(staffGuid)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(staffDetail)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 查询员工列表
{
Tool: mcp.NewTool(
"queryStaffs",
mcp.WithDescription("查询员工列表"),
mcp.WithString("staffName", mcp.Description("员工姓名,模糊匹配")),
mcp.WithString("account", mcp.Description("账号,精确匹配")),
mcp.WithString("userGuid", mcp.Description("SSO平台用户GUID")),
mcp.WithString("organizationGuid", mcp.Description("所属组织GUID")),
mcp.WithNumber("staffType", 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.QueryStaffRequest{
StaffName: request.GetString("staffName", ""),
Account: request.GetString("account", ""),
UserGuid: request.GetString("userGuid", ""),
OrganizationGuid: request.GetString("organizationGuid", ""),
StaffType: request.GetInt("staffType", 0),
Limit: request.GetInt("limit", 20),
Offset: request.GetInt("offset", 0),
}
staffs, proc := hr.QueryStaffs(params)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(staffs)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 根据SSO用户GUID获取员工
{
Tool: mcp.NewTool(
"getStaffByUserGuid",
mcp.WithDescription("根据SSO用户GUID获取员工"),
mcp.WithString("userGuid", mcp.Required(), mcp.Description("SSO平台用户GUID")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
userGuid := request.GetString("userGuid", "")
if userGuid == "" {
return nil, fmt.Errorf("用户GUID不能为空")
}
staffDetail, proc := hr.GetStaffByUserGuid(userGuid)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(staffDetail)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 根据账号获取员工
{
Tool: mcp.NewTool(
"getStaffByAccount",
mcp.WithDescription("根据账号获取员工"),
mcp.WithString("account", mcp.Required(), mcp.Description("账号")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
account := request.GetString("account", "")
if account == "" {
return nil, fmt.Errorf("账号不能为空")
}
staffDetail, proc := hr.GetStaffByAccount(account)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(staffDetail)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
}