158 lines
5.0 KiB
Go
158 lines
5.0 KiB
Go
package servers
|
||
|
||
import (
|
||
"WiiCITMS/process/hr"
|
||
"context"
|
||
"encoding/json"
|
||
"fmt"
|
||
|
||
"github.com/mark3labs/mcp-go/mcp"
|
||
"github.com/mark3labs/mcp-go/server"
|
||
)
|
||
|
||
// HROrgAITools 组织架构查询工具(AI专用)
|
||
var HROrgAITools = []server.ServerTool{
|
||
// 获取单个组织的详细信息(AI专用)
|
||
{
|
||
Tool: mcp.NewTool(
|
||
"getOrganizationForAI",
|
||
mcp.WithDescription("获取单个组织的详细信息,适用于AI查询组织结构"),
|
||
mcp.WithString("orgGuid", mcp.Required(), mcp.Description("组织ID")),
|
||
mcp.WithBoolean("includePositions", mcp.Description("是否包含岗位信息,默认false")),
|
||
),
|
||
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||
orgGuid := request.GetString("orgGuid", "")
|
||
if orgGuid == "" {
|
||
return nil, fmt.Errorf("组织ID不能为空")
|
||
}
|
||
|
||
includePositions := request.GetBool("includePositions", false)
|
||
|
||
org, proc := hr.GetOrganizationForAI(orgGuid, includePositions)
|
||
if proc.IsError() {
|
||
return mcp.NewToolResultText(""), proc.Error
|
||
}
|
||
|
||
repStr, err := json.Marshal(org)
|
||
if err != nil {
|
||
return mcp.NewToolResultText(""), err
|
||
}
|
||
return mcp.NewToolResultText(string(repStr)), nil
|
||
},
|
||
},
|
||
// 获取组织树结构(AI专用)
|
||
{
|
||
Tool: mcp.NewTool(
|
||
"getOrganizationTreeForAI",
|
||
mcp.WithDescription("获取组织树结构,适用于AI查询完整组织架构"),
|
||
mcp.WithString("rootOrgGuid", mcp.Description("根组织ID,不指定则获取所有顶级组织")),
|
||
mcp.WithBoolean("includeStaff", mcp.Description("是否包含员工信息,默认false")),
|
||
mcp.WithBoolean("includeDetails", mcp.Description("是否包含详细信息,默认true")),
|
||
mcp.WithNumber("maxDepth", mcp.Description("最大深度,0表示不限制")),
|
||
),
|
||
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||
params := hr.AIOrganizationTreeRequest{
|
||
RootOrgGuid: request.GetString("rootOrgGuid", ""),
|
||
IncludeStaff: request.GetBool("includeStaff", false),
|
||
IncludeDetails: request.GetBool("includeDetails", true),
|
||
MaxDepth: request.GetInt("maxDepth", 0),
|
||
}
|
||
|
||
tree, proc := hr.GetOrganizationTreeForAI(params)
|
||
if proc.IsError() {
|
||
return mcp.NewToolResultText(""), proc.Error
|
||
}
|
||
|
||
repStr, err := json.Marshal(tree)
|
||
if err != nil {
|
||
return mcp.NewToolResultText(""), err
|
||
}
|
||
return mcp.NewToolResultText(string(repStr)), nil
|
||
},
|
||
},
|
||
// 获取组织成员(AI专用)
|
||
{
|
||
Tool: mcp.NewTool(
|
||
"getOrganizationMembers",
|
||
mcp.WithDescription("获取组织成员列表,适用于AI查询部门成员"),
|
||
mcp.WithString("orgGuid", mcp.Required(), mcp.Description("组织ID")),
|
||
),
|
||
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||
orgGuid := request.GetString("orgGuid", "")
|
||
if orgGuid == "" {
|
||
return nil, fmt.Errorf("组织ID不能为空")
|
||
}
|
||
|
||
members, proc := hr.GetOrganizationMembers(orgGuid)
|
||
if proc.IsError() {
|
||
return mcp.NewToolResultText(""), proc.Error
|
||
}
|
||
|
||
repStr, err := json.Marshal(members)
|
||
if err != nil {
|
||
return mcp.NewToolResultText(""), err
|
||
}
|
||
return mcp.NewToolResultText(string(repStr)), nil
|
||
},
|
||
},
|
||
// 获取组织完整路径(AI专用)
|
||
{
|
||
Tool: mcp.NewTool(
|
||
"getFullOrganizationPath",
|
||
mcp.WithDescription("获取组织的完整路径,适用于AI了解组织层级关系"),
|
||
mcp.WithString("orgGuid", mcp.Required(), mcp.Description("组织ID")),
|
||
),
|
||
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||
orgGuid := request.GetString("orgGuid", "")
|
||
if orgGuid == "" {
|
||
return nil, fmt.Errorf("组织ID不能为空")
|
||
}
|
||
|
||
path, proc := hr.GetFullOrganizationPath(orgGuid)
|
||
if proc.IsError() {
|
||
return mcp.NewToolResultText(""), proc.Error
|
||
}
|
||
|
||
result := map[string]string{
|
||
"path": path,
|
||
}
|
||
|
||
repStr, err := json.Marshal(result)
|
||
if err != nil {
|
||
return mcp.NewToolResultText(""), err
|
||
}
|
||
return mcp.NewToolResultText(string(repStr)), nil
|
||
},
|
||
},
|
||
// 获取所有组织列表(AI专用,扁平结构)
|
||
{
|
||
Tool: mcp.NewTool(
|
||
"getAllOrganizations",
|
||
mcp.WithDescription("获取所有组织的扁平列表,适用于AI全面了解公司组织"),
|
||
mcp.WithBoolean("includeDetails", mcp.Description("是否包含详细信息,默认false")),
|
||
),
|
||
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||
// 获取参数
|
||
includeDetails := request.GetBool("includeDetails", false)
|
||
|
||
// 创建空参数对象,只传递includeDetails
|
||
params := hr.AIOrganizationTreeRequest{
|
||
IncludeDetails: includeDetails,
|
||
}
|
||
|
||
// 使用GetOrganizationTreeForAI并传递params参数
|
||
orgs, proc := hr.GetOrganizationTreeForAI(params)
|
||
if proc.IsError() {
|
||
return mcp.NewToolResultText(""), proc.Error
|
||
}
|
||
|
||
// 转换为JSON并返回
|
||
repStr, err := json.Marshal(orgs)
|
||
if err != nil {
|
||
return mcp.NewToolResultText(""), err
|
||
}
|
||
return mcp.NewToolResultText(string(repStr)), nil
|
||
},
|
||
},
|
||
}
|