WiiCITMS/servers/hrOrgPositionTools.go

578 lines
19 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"
)
// 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
},
},
}