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

578 lines
19 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"
)
// HROrgPositionTools 组织与岗位相关工具
var HROrgPositionTools = []server.ServerTool{
// 查询组织列表(增强版)
{
Tool: mcp.NewTool(
"queryOrganizations",
mcp.WithDescription("查询组织列表,支持更多查询条件"),
mcp.WithString("organizationName", mcp.Description("组织名称,模糊查询")),
mcp.WithString("parentGuid", mcp.Description("父组织ID可选")),
mcp.WithBoolean("includeChildren", 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.QueryOrganizationsRequest{
OrganizationName: request.GetString("organizationName", ""),
ParentGuid: request.GetString("parentGuid", ""),
IncludeChildren: request.GetBool("includeChildren", false),
Limit: request.GetInt("limit", 20),
Offset: request.GetInt("offset", 0),
}
rep, proc := hr.QueryOrganizations(params)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(rep)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 获取组织树
{
Tool: mcp.NewTool(
"getOrganizationTree",
mcp.WithDescription("获取组织树结构"),
mcp.WithString("rootOrgGuid", mcp.Description("根组织ID不指定则获取所有顶级组织的树")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
rootOrgGuid := request.GetString("rootOrgGuid", "")
rep, proc := hr.GetOrganizationTree(rootOrgGuid)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(rep)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 获取组织详情
{
Tool: mcp.NewTool(
"getOrganization",
mcp.WithDescription("根据ID获取组织详情"),
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不能为空")
}
rep, proc := hr.GetOrganizationByID(orgGuid)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(rep)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 创建组织(增强版)
{
Tool: mcp.NewTool(
"createOrganizationExt",
mcp.WithDescription("创建组织(增强版)"),
mcp.WithString("organizationName", mcp.Required(), mcp.Description("组织名称")),
mcp.WithString("parentGuid", mcp.Description("父组织ID可选")),
mcp.WithNumber("organizationType", mcp.Required(), mcp.Description("组织类型1-公司2-部门3-团队")),
mcp.WithString("description", mcp.Description("组织描述,可选")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
name := request.GetString("organizationName", "")
if name == "" {
return nil, fmt.Errorf("组织名称不能为空")
}
orgType := request.GetInt("organizationType", 0)
if orgType <= 0 {
return nil, fmt.Errorf("无效的组织类型")
}
params := hr.CreateOrganizationRequest{
OrganizationName: name,
ParentGuid: request.GetString("parentGuid", ""),
OrganizationType: orgType,
Description: request.GetString("description", ""),
}
rep, proc := hr.CreateOrganization(params)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(rep)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 更新组织
{
Tool: mcp.NewTool(
"updateOrganization",
mcp.WithDescription("更新组织信息"),
mcp.WithString("orgGuid", mcp.Required(), mcp.Description("组织ID")),
mcp.WithString("organizationName", mcp.Description("组织名称,可选")),
mcp.WithString("parentGuid", mcp.Description("父组织ID可选")),
mcp.WithNumber("organizationType", mcp.Description("组织类型1-公司2-部门3-团队,可选")),
mcp.WithString("description", mcp.Description("组织描述,可选")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
orgGuid := request.GetString("orgGuid", "")
if orgGuid == "" {
return nil, fmt.Errorf("组织ID不能为空")
}
params := hr.CreateOrganizationRequest{
OrganizationName: request.GetString("organizationName", ""),
ParentGuid: request.GetString("parentGuid", ""),
OrganizationType: request.GetInt("organizationType", 0),
Description: request.GetString("description", ""),
}
rep, proc := hr.UpdateOrganization(orgGuid, params)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(rep)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 删除组织
{
Tool: mcp.NewTool(
"deleteOrganization",
mcp.WithDescription("删除组织(逻辑删除)"),
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不能为空")
}
proc := hr.DeleteOrganization(orgGuid)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
return mcp.NewToolResultText("删除成功"), nil
},
},
// 创建岗位
{
Tool: mcp.NewTool(
"createPosition",
mcp.WithDescription("创建岗位"),
mcp.WithString("positionName", mcp.Required(), mcp.Description("岗位名称")),
mcp.WithString("positionCode", mcp.Required(), mcp.Description("岗位代码")),
mcp.WithString("description", mcp.Description("岗位描述,可选")),
mcp.WithNumber("level", mcp.Description("岗位级别,可选")),
mcp.WithNumber("categoryId", mcp.Description("岗位类别ID可选")),
mcp.WithString("categoryName", mcp.Description("岗位类别名称,可选")),
mcp.WithBoolean("isManagement", mcp.Description("是否管理岗位默认false")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
name := request.GetString("positionName", "")
if name == "" {
return nil, fmt.Errorf("岗位名称不能为空")
}
code := request.GetString("positionCode", "")
if code == "" {
return nil, fmt.Errorf("岗位代码不能为空")
}
params := hr.CreatePositionRequest{
PositionName: name,
PositionCode: code,
Description: request.GetString("description", ""),
Level: request.GetInt("level", 0),
CategoryID: request.GetInt("categoryId", 0),
CategoryName: request.GetString("categoryName", ""),
IsManagement: request.GetBool("isManagement", false),
}
rep, proc := hr.CreatePosition(params)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(rep)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 查询岗位
{
Tool: mcp.NewTool(
"queryPositions",
mcp.WithDescription("查询岗位列表"),
mcp.WithString("query", mcp.Description("搜索关键词,可选")),
mcp.WithString("positionName", mcp.Description("岗位名称,模糊查询")),
mcp.WithString("positionCode", mcp.Description("岗位代码,精确查询")),
mcp.WithNumber("categoryId", mcp.Description("岗位类别ID筛选")),
mcp.WithNumber("level", mcp.Description("岗位级别,筛选")),
mcp.WithBoolean("isManagement", mcp.Description("是否管理岗位,筛选")),
// mcp.WithNumber("status", mcp.Description("状态:-1-所有1-启用0-禁用")),
mcp.WithNumber("limit", mcp.Description("分页参数,每页数量")),
mcp.WithNumber("offset", mcp.Description("分页参数,偏移量")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
// 确保至少有一个参数
query := request.GetString("query", "")
params := hr.QueryPositionsRequest{
PositionName: request.GetString("positionName", query), // 如果positionName不存在使用query作为名称搜索
PositionCode: request.GetString("positionCode", ""),
CategoryID: request.GetInt("categoryId", 0),
Level: request.GetInt("level", 0),
IsManagement: request.GetBool("isManagement", false),
// Status: request.GetInt("status", -1),
Limit: request.GetInt("limit", 20),
Offset: request.GetInt("offset", 0),
}
rep, proc := hr.QueryPositions(params)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(rep)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 获取岗位详情
{
Tool: mcp.NewTool(
"getPosition",
mcp.WithDescription("获取岗位详情"),
mcp.WithString("positionGuid", mcp.Required(), mcp.Description("岗位ID")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
positionGuid := request.GetString("positionGuid", "")
if positionGuid == "" {
return nil, fmt.Errorf("岗位ID不能为空")
}
rep, proc := hr.GetPositionByID(positionGuid)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(rep)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 更新岗位
{
Tool: mcp.NewTool(
"updatePosition",
mcp.WithDescription("更新岗位信息"),
mcp.WithString("positionGuid", mcp.Required(), mcp.Description("岗位ID")),
mcp.WithString("positionName", mcp.Description("岗位名称,可选")),
mcp.WithString("positionCode", mcp.Description("岗位代码,可选")),
mcp.WithString("description", mcp.Description("岗位描述,可选")),
mcp.WithNumber("level", mcp.Description("岗位级别,可选")),
mcp.WithNumber("categoryId", mcp.Description("岗位类别ID可选")),
mcp.WithString("categoryName", mcp.Description("岗位类别名称,可选")),
mcp.WithBoolean("isManagement", mcp.Description("是否管理岗位,可选")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
positionGuid := request.GetString("positionGuid", "")
if positionGuid == "" {
return nil, fmt.Errorf("岗位ID不能为空")
}
params := hr.CreatePositionRequest{
PositionName: request.GetString("positionName", ""),
PositionCode: request.GetString("positionCode", ""),
Description: request.GetString("description", ""),
Level: request.GetInt("level", 0),
CategoryID: request.GetInt("categoryId", 0),
CategoryName: request.GetString("categoryName", ""),
IsManagement: request.GetBool("isManagement", false),
}
rep, proc := hr.UpdatePosition(positionGuid, params)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(rep)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 更改岗位状态
{
Tool: mcp.NewTool(
"changePositionStatus",
mcp.WithDescription("更改岗位状态(启用/禁用)"),
mcp.WithString("positionGuid", mcp.Required(), mcp.Description("岗位ID")),
mcp.WithNumber("status", mcp.Required(), mcp.Description("状态1-启用0-禁用")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
positionGuid := request.GetString("positionGuid", "")
if positionGuid == "" {
return nil, fmt.Errorf("岗位ID不能为空")
}
status := request.GetInt("status", -1)
if status != 0 && status != 1 {
return nil, fmt.Errorf("无效的状态值必须为0或1")
}
rep, proc := hr.ChangePositionStatus(positionGuid, status)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(rep)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 删除岗位
{
Tool: mcp.NewTool(
"deletePosition",
mcp.WithDescription("删除岗位(逻辑删除)"),
mcp.WithString("positionGuid", mcp.Required(), mcp.Description("岗位ID")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
positionGuid := request.GetString("positionGuid", "")
if positionGuid == "" {
return nil, fmt.Errorf("岗位ID不能为空")
}
proc := hr.DeletePosition(positionGuid)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
return mcp.NewToolResultText("删除成功"), nil
},
},
// 为组织分配岗位
{
Tool: mcp.NewTool(
"assignPositionToOrg",
mcp.WithDescription("为组织分配岗位"),
mcp.WithString("organizationGuid", mcp.Required(), mcp.Description("组织ID")),
mcp.WithString("positionGuid", mcp.Required(), mcp.Description("岗位ID")),
mcp.WithNumber("headCount", mcp.Description("岗位编制人数默认1")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
orgGuid := request.GetString("organizationGuid", "")
if orgGuid == "" {
return nil, fmt.Errorf("组织ID不能为空")
}
positionGuid := request.GetString("positionGuid", "")
if positionGuid == "" {
return nil, fmt.Errorf("岗位ID不能为空")
}
params := hr.AssignPositionToOrgRequest{
OrganizationGuid: orgGuid,
PositionGuid: positionGuid,
HeadCount: request.GetInt("headCount", 1),
}
rep, proc := hr.AssignPositionToOrg(params)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(rep)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 更新组织岗位编制人数
{
Tool: mcp.NewTool(
"updateOrgPositionHeadCount",
mcp.WithDescription("更新组织岗位编制人数"),
mcp.WithString("relationGuid", mcp.Required(), mcp.Description("组织岗位关系ID")),
mcp.WithNumber("headCount", mcp.Required(), mcp.Description("岗位编制人数")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
relationGuid := request.GetString("relationGuid", "")
if relationGuid == "" {
return nil, fmt.Errorf("组织岗位关系ID不能为空")
}
headCount := request.GetInt("headCount", 0)
if headCount <= 0 {
return nil, fmt.Errorf("编制人数必须大于0")
}
rep, proc := hr.UpdateOrgPositionHeadCount(relationGuid, headCount)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(rep)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 移除组织岗位
{
Tool: mcp.NewTool(
"removePositionFromOrg",
mcp.WithDescription("从组织中移除岗位"),
mcp.WithString("relationGuid", mcp.Required(), mcp.Description("组织岗位关系ID")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
relationGuid := request.GetString("relationGuid", "")
if relationGuid == "" {
return nil, fmt.Errorf("组织岗位关系ID不能为空")
}
proc := hr.RemovePositionFromOrg(relationGuid)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
return mcp.NewToolResultText("移除成功"), nil
},
},
// 查询组织的岗位列表
{
Tool: mcp.NewTool(
"queryPositionsByOrg",
mcp.WithDescription("查询组织的岗位列表"),
mcp.WithString("organizationGuid", mcp.Required(), mcp.Description("组织ID")),
mcp.WithNumber("limit", mcp.Description("分页参数,每页数量")),
mcp.WithNumber("offset", mcp.Description("分页参数,偏移量")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
orgGuid := request.GetString("organizationGuid", "")
if orgGuid == "" {
return nil, fmt.Errorf("组织ID不能为空")
}
params := hr.QueryOrgPositionRequest{
Limit: request.GetInt("limit", 20),
Offset: request.GetInt("offset", 0),
}
rep, proc := hr.QueryPositionsByOrg(orgGuid, params)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(rep)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 查询拥有指定岗位的组织列表
{
Tool: mcp.NewTool(
"queryOrgsByPosition",
mcp.WithDescription("查询拥有指定岗位的组织列表"),
mcp.WithString("positionGuid", mcp.Required(), mcp.Description("岗位ID")),
mcp.WithNumber("limit", mcp.Description("分页参数,每页数量")),
mcp.WithNumber("offset", mcp.Description("分页参数,偏移量")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
positionGuid := request.GetString("positionGuid", "")
if positionGuid == "" {
return nil, fmt.Errorf("岗位ID不能为空")
}
params := hr.QueryOrgPositionRequest{
Limit: request.GetInt("limit", 20),
Offset: request.GetInt("offset", 0),
}
rep, proc := hr.QueryOrgsByPosition(positionGuid, params)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(rep)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
// 获取组织岗位关系详情
{
Tool: mcp.NewTool(
"getPositionOrgRelation",
mcp.WithDescription("获取组织岗位关系详情"),
mcp.WithString("relationGuid", mcp.Required(), mcp.Description("组织岗位关系ID")),
),
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
relationGuid := request.GetString("relationGuid", "")
if relationGuid == "" {
return nil, fmt.Errorf("组织岗位关系ID不能为空")
}
rep, proc := hr.GetPositionOrgRelation(relationGuid)
if proc.IsError() {
return mcp.NewToolResultText(""), proc.Error
}
repStr, err := json.Marshal(rep)
if err != nil {
return mcp.NewToolResultText(""), err
}
return mcp.NewToolResultText(string(repStr)), nil
},
},
}