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