Skip to content

接口名称

人员类型管理API(租户令牌)- IFeishuTenantV3EmployeeType

功能描述

飞书人员类型是通讯录中一种特殊的用户属性字段,用于标记用户的身份类型。当前接口使用租户令牌访问,适用于租户应用场景。使用通讯录API,可以对人员类型资源进行增删改查操作。人员类型可以灵活标记用户的身份,如正式员工、实习生、外包人员、顾问等。

参考文档

https://open.feishu.cn/document/server-docs/contact-v3/employee_type_enum/overview

函数列表

函数名称功能描述认证方式HTTP 方法
CreateEmployeeTypeAsync创建人员类型租户令牌POST
UpdateEmployeeTypeAsync更新人员类型信息租户令牌PUT
GetEmployeeTypesAsync获取人员类型列表租户令牌GET
DeleteEmployeeTypeByIdAsync删除指定人员类型租户令牌DELETE

函数详细内容

函数名称:创建人员类型

函数签名

csharp
Task<FeishuApiResult<EmployeeTypeEnumResult>?> CreateEmployeeTypeAsync(
    [Body] EmployeeTypeEnumRequest groupInfoRequest,
    CancellationToken cancellationToken = default);

认证:租户令牌

参数

参数名类型必填说明
groupInfoRequestEmployeeTypeEnumRequest✅ 必填人员类型创建请求体

响应

json
{
  "code": 0,
  "msg": "success",
  "data": {
    "enum": {
      "enum_id": "enum_1234567890",
      "content": "远程办公人员",
      "enum_type": 2,
      "enum_status": 1,
      "i18n_content": [
        {
          "locale": "zh_cn",
          "text": "远程办公人员"
        },
        {
          "locale": "en_us",
          "text": "Remote Worker"
        }
      ]
    }
  }
}

说明

  • 新增一个自定义的人员类型,用于标记用户的身份类型
  • enum_type固定取值为2,表示自定义类型
  • enum_status为1表示激活状态,为2表示未激活状态
  • 支持多语言配置,适应国际化需求
  • 系统内置的正式、实习、外包、劳务、顾问五个选项不支持重新创建

代码示例

javascript
// 创建新的远程办公人员类型
const createEmployeeTypeRequest = {
  content: "远程办公人员",
  enum_type: 2, // 固定为2,表示自定义类型
  enum_status: 1, // 1:激活 2:未激活
  i18n_content: [
    {
      locale: "zh_cn",
      text: "远程办公人员"
    },
    {
      locale: "en_us",
      text: "Remote Worker"
    },
    {
      locale: "ja_jp",
      text: "リモートワーカー"
    }
  ]
};

const result = await feishuTenantV3EmployeeType.createEmployeeTypeAsync(createEmployeeTypeRequest);

if (result.code === 0) {
  const employeeEnum = result.data.enum;
  console.log("人员类型创建成功:");
  console.log(`- 类型ID: ${employeeEnum.enum_id}`);
  console.log(`- 类型名称: ${employeeEnum.content}`);
  console.log(`- 类型状态: ${employeeEnum.enum_status === 1 ? '激活' : '未激活'}`);
  console.log(`- 类型分类: ${employeeEnum.enum_type === 2 ? '自定义类型' : '内置类型'}`);
  
  // 显示多语言配置
  if (employeeEnum.i18n_content && employeeEnum.i18n_content.length > 0) {
    console.log("\n多语言配置:");
    employeeEnum.i18n_content.forEach(item => {
      console.log(`  ${item.locale}: ${item.text}`);
    });
  }
  
  // 存储类型ID供后续使用
  const newEnumId = employeeEnum.enum_id;
  console.log(`\n新创建的人员类型ID: ${newEnumId},可用于用户管理`);
} else {
  console.error("创建人员类型失败:", result.msg);
  
  // 错误处理
  switch (result.code) {
    case 400:
      console.log("请求参数错误,可能类型名称重复或格式不正确");
      break;
    case 403:
      console.log("权限不足,无法创建人员类型");
      break;
    case 409:
      console.log("类型已存在,请使用不同的名称");
      break;
    default:
      console.log("创建失败,请稍后重试");
  }
}

函数名称:更新人员类型信息

函数签名

csharp
Task<FeishuApiResult<EmployeeTypeEnumResult>?> UpdateEmployeeTypeAsync(
    [Path] string enum_id,
    [Body] EmployeeTypeEnumRequest groupInfoRequest,
    CancellationToken cancellationToken = default);

认证:租户令牌

参数

参数名类型必填说明
enum_idstring✅ 必填人员类型的选项ID
groupInfoRequestEmployeeTypeEnumRequest✅ 必填人员类型更新请求体

响应

json
{
  "code": 0,
  "msg": "success",
  "data": {
    "enum": {
      "enum_id": "enum_1234567890",
      "content": "混合办公人员",
      "enum_type": 2,
      "enum_status": 1,
      "i18n_content": [
        {
          "locale": "zh_cn",
          "text": "混合办公人员"
        },
        {
          "locale": "en_us",
          "text": "Hybrid Worker"
        }
      ]
    }
  }
}

说明

  • 更新指定的自定义人员类型信息
  • enum_id可以通过创建接口返回值获取,也可以通过查询接口获取
  • 只能更新自定义类型,系统内置类型不允许修改
  • 更新后的类型信息会立即生效,影响相关用户的属性显示

代码示例

javascript
// 更新人员类型,修改名称和多语言配置
const updateEmployeeTypeRequest = {
  content: "混合办公人员",
  enum_type: 2, // 保持为自定义类型
  enum_status: 1, // 保持激活状态
  i18n_content: [
    {
      locale: "zh_cn",
      text: "混合办公人员"
    },
    {
      locale: "en_us",
      text: "Hybrid Worker"
    },
    {
      locale: "ja_jp",
      text: "ハイブリッドワーカー"
    }
  ]
};

const result = await feishuTenantV3EmployeeType.updateEmployeeTypeAsync(
  "enum_1234567890", // 要更新的人员类型ID
  updateEmployeeTypeRequest
);

if (result.code === 0) {
  const employeeEnum = result.data.enum;
  console.log("人员类型更新成功:");
  console.log(`- 类型ID: ${employeeEnum.enum_id}`);
  console.log(`- 新名称: ${employeeEnum.content}`);
  console.log(`- 状态: ${employeeEnum.enum_status === 1 ? '激活' : '未激活'}`);
  
  // 显示更新后的多语言配置
  if (employeeEnum.i18n_content && employeeEnum.i18n_content.length > 0) {
    console.log("\n更新后的多语言配置:");
    employeeEnum.i18n_content.forEach(item => {
      console.log(`  ${item.locale}: ${item.text}`);
    });
  }
  
  console.log("✓ 类型信息已更新,相关用户的属性显示将同步更新");
} else {
  console.error("更新人员类型失败:", result.msg);
  
  // 错误处理
  switch (result.code) {
    case 400:
      console.log("请求参数错误,可能是类型名称重复或格式不正确");
      break;
    case 403:
      console.log("权限不足,无法更新人员类型");
      break;
    case 404:
      console.log("人员类型不存在或已被删除");
      break;
    case 409:
      console.log("尝试更新内置类型或名称冲突");
      break;
    default:
      console.log("更新失败,请稍后重试");
  }
}

// 临时禁用人员类型(不删除,只是停用)
async function temporarilyDisableEmployeeType(enumId) {
  console.log(`准备临时禁用人员类型 ${enumId}...`);
  
  const disableRequest = {
    content: "(已禁用)类型名称", // 保留原内容供参考
    enum_type: 2,
    enum_status: 2, // 设置为未激活状态
    i18n_content: [
      {
        locale: "zh_cn",
        text: "(已禁用)类型名称"
      }
    ]
  };
  
  const result = await feishuTenantV3EmployeeType.updateEmployeeTypeAsync(enumId, disableRequest);
  
  if (result.code === 0) {
    console.log("✓ 人员类型已临时禁用");
    console.log("类型不再可用于新用户配置,但现有用户的属性保持不变");
  } else {
    console.error("禁用人员类型失败:", result.msg);
  }
}

函数名称:获取人员类型列表

函数签名

csharp
Task<FeishuApiPageListResult<EmployeeTypeEnum>?> GetEmployeeTypesAsync(
    [Query("page_size")] int? page_size = 10,
    [Query("page_token")] string? page_token = null,
    CancellationToken cancellationToken = default);

认证:租户令牌

参数

参数名类型必填说明
page_sizeint?⚪ 可选分页大小,默认10,最大50
page_tokenstring⚪ 可选分页标记,首次请求不填

响应

json
{
  "code": 0,
  "msg": "success",
  "data": {
    "items": [
      {
        "enum_id": "enum_1001",
        "content": "正式",
        "enum_type": 1,
        "enum_status": 1
      },
      {
        "enum_id": "enum_1002", 
        "content": "实习",
        "enum_type": 1,
        "enum_status": 1
      },
      {
        "enum_id": "enum_1234567890",
        "content": "远程办公人员",
        "enum_type": 2,
        "enum_status": 1
      }
    ],
    "page_token": "next_page_token",
    "has_more": false
  }
}

说明

  • 查询当前租户下所有的人员类型信息
  • 包括系统内置类型和自定义类型
  • 返回选项ID、类型、编号以及内容等基本信息
  • 支持分页查询,适合获取大量人员类型

代码示例

javascript
// 获取所有人员类型
async function getAllEmployeeTypes() {
  let hasMore = true;
  let pageToken = null;
  const allTypes = [];
  let pageCount = 0;

  while (hasMore) {
    pageCount++;
    console.log(`正在获取第 ${pageCount} 页人员类型数据...`);
    
    const result = await feishuTenantV3EmployeeType.getEmployeeTypesAsync(
      50, // 每页获取更多数据
      pageToken
    );

    if (result.code === 0) {
      const types = result.data.items;
      allTypes.push(...types);
      hasMore = result.data.has_more;
      pageToken = result.data.page_token;
      
      console.log(`第 ${pageCount} 页获取到 ${types.length} 个人员类型`);
    } else {
      console.error(`第 ${pageCount} 页获取失败:`, result.msg);
      break;
    }
  }

  return allTypes;
}

// 分析人员类型结构
async function analyzeEmployeeTypes() {
  console.log("正在分析人员类型结构...");
  
  const types = await getAllEmployeeTypes();
  
  if (types.length === 0) {
    console.log("未找到任何人员类型");
    return;
  }

  console.log(`\n=== 人员类型概览 ===`);
  console.log(`总类型数: ${types.length}`);
  
  // 按类型分类统计
  const builtinTypes = types.filter(t => t.enum_type === 1);
  const customTypes = types.filter(t => t.enum_type === 2);
  
  console.log(`内置类型: ${builtinTypes.length}`);
  console.log(`自定义类型: ${customTypes.length}`);
  
  // 按状态分类统计
  const activeTypes = types.filter(t => t.enum_status === 1);
  const inactiveTypes = types.filter(t => t.enum_status === 2);
  
  console.log(`激活类型: ${activeTypes.length}`);
  console.log(`未激活类型: ${inactiveTypes.length}`);
  
  // 显示所有类型
  console.log(`\n=== 人员类型详细列表 ===`);
  
  console.log("\n【内置类型】(系统预置,不可删除):");
  builtinTypes.forEach(type => {
    const status = type.enum_status === 1 ? '✓ 激活' : '✗ 未激活';
    console.log(`├─ ${type.content} (${type.enum_id}) [${status}]`);
  });
  
  if (customTypes.length > 0) {
    console.log("\n【自定义类型】(用户创建,可管理):");
    customTypes.forEach(type => {
      const status = type.enum_status === 1 ? '✓ 激活' : '✗ 未激活';
      console.log(`├─ ${type.content} (${type.enum_id}) [${status}]`);
    });
  }
  
  // 统计分析
  console.log(`\n=== 使用建议 ===`);
  
  if (customTypes.length === 0) {
    console.log("📝 建议:当前没有自定义人员类型,可以根据企业需要创建专门的类型");
    console.log("   例如:远程办公人员、兼职人员、合作伙伴等");
  } else {
    const activeCustomTypes = customTypes.filter(t => t.enum_status === 1);
    console.log(`📊 当前有 ${activeCustomTypes.length} 个激活的自定义类型可用`);
  }
  
  if (inactiveTypes.length > 0) {
    console.log(`⚠️  注意:有 ${inactiveTypes.length} 个未激活的类型,考虑是否需要激活或删除`);
  }
  
  return types;
}

// 查找特定的人员类型
async function findEmployeeType(searchText) {
  console.log(`正在搜索包含 "${searchText}" 的人员类型...`);
  
  const types = await getAllEmployeeTypes();
  
  const matchedTypes = types.filter(type => 
    type.content.toLowerCase().includes(searchText.toLowerCase())
  );
  
  if (matchedTypes.length === 0) {
    console.log(`未找到包含 "${searchText}" 的人员类型`);
    return [];
  }
  
  console.log(`\n找到 ${matchedTypes.length} 个匹配的人员类型:`);
  matchedTypes.forEach((type, index) => {
    const typeCategory = type.enum_type === 1 ? "内置" : "自定义";
    const status = type.enum_status === 1 ? "激活" : "未激活";
    const editable = type.enum_type === 2 ? "可编辑" : "只读";
    
    console.log(`${index + 1}. ${type.content}`);
    console.log(`   ID: ${type.enum_id}`);
    console.log(`   类型: ${typeCategory} | 状态: ${status} | 权限: ${editable}`);
  });
  
  return matchedTypes;
}

// 检查类型是否存在
async function checkEmployeeTypeExists(content) {
  const types = await getAllEmployeeTypes();
  const exists = types.some(type => type.content === content);
  
  if (exists) {
    console.log(`人员类型 "${content}" 已存在`);
    const existingType = types.find(type => type.content === content);
    console.log(`ID: ${existingType.enum_id}`);
    console.log(`类型: ${existingType.enum_type === 1 ? '内置' : '自定义'}`);
    console.log(`状态: ${existingType.enum_status === 1 ? '激活' : '未激活'}`);
  } else {
    console.log(`人员类型 "${content}" 不存在,可以创建`);
  }
  
  return exists;
}

// 使用示例
analyzeEmployeeTypes();
findEmployeeType("实习");
checkEmployeeTypeExists("远程办公人员");

函数名称:删除指定人员类型

函数签名

csharp
Task<FeishuNullDataApiResult?> DeleteEmployeeTypeByIdAsync(
    [Path] string enum_id,
    CancellationToken cancellationToken = default);

认证:租户令牌

参数

参数名类型必填说明
enum_idstring✅ 必填自定义人员类型的选项ID

响应

json
{
  "code": 0,
  "msg": "success"
}

说明

  • 删除指定的自定义人员类型
  • 仅支持删除自定义的人员类型(enum_type = 2)
  • 默认包含的正式、实习、外包、劳务、顾问五个内置选项不支持删除
  • 删除前请确认没有用户正在使用该人员类型
  • 删除操作不可恢复,请谨慎操作

代码示例

javascript
// 安全删除人员类型(包含前置检查)
async function safeDeleteEmployeeType(enumId) {
  console.log(`准备删除人员类型 ${enumId}...`);
  
  // 第一步:获取人员类型信息
  const types = await getAllEmployeeTypes();
  const targetTypes = types.filter(t => t.enum_id === enumId);
  
  if (targetTypes.length === 0) {
    console.log("错误:人员类型不存在");
    return false;
  }
  
  const targetType = targetTypes[0];
  console.log(`类型名称: ${targetType.content}`);
  console.log(`类型分类: ${targetType.enum_type === 1 ? '内置类型' : '自定义类型'}`);
  console.log(`类型状态: ${targetType.enum_status === 1 ? '激活' : '未激活'}`);
  
  // 第二步:检查是否为内置类型
  if (targetType.enum_type === 1) {
    console.log("删除失败:内置类型不支持删除");
    console.log("受保护的内置类型:正式、实习、外包、劳务、顾问");
    return false;
  }
  
  // 第三步:确认删除信息
  console.log("删除确认:");
  console.log(`- 类型名称: ${targetType.content}`);
  console.log(`- 类型ID: ${targetType.enum_id}`);
  console.log(`- 类型分类: 自定义类型 ✓`);
  console.log(`- 可删除: ✓`);
  
  // 第四步:检查使用情况(模拟检查,实际需要查询用户使用情况)
  console.log("⚠️  重要提醒:删除前请确认没有用户正在使用此人员类型");
  console.log("如果已有用户使用此类型,建议先修改用户的类型,再删除此类型定义");
  
  // 第五步:执行删除
  console.log("正在执行删除操作...");
  
  const deleteResult = await feishuTenantV3EmployeeType.deleteEmployeeTypeByIdAsync(enumId);
  
  if (deleteResult.code === 0) {
    console.log("✓ 人员类型删除成功");
    console.log(`已删除类型: ${targetType.content} (${enumId})`);
    
    // 验证删除结果
    const verifyTypes = await getAllEmployeeTypes();
    const stillExists = verifyTypes.some(t => t.enum_id === enumId);
    
    if (!stillExists) {
      console.log("✓ 验证成功:类型已不存在");
    } else {
      console.log("⚠ 警告:删除成功但验证异常");
    }
    
    return true;
  } else {
    console.error("删除人员类型失败:", deleteResult.msg);
    
    // 错误处理
    switch (deleteResult.code) {
      case 400:
        console.log("请求参数错误,可能是类型ID不正确");
        break;
      case 403:
        console.log("权限不足,无法删除人员类型");
        break;
      case 404:
        console.log("人员类型不存在或已被删除");
        break;
      case 409:
        console.log("类型正在被使用或有依赖关系,无法删除");
        break;
      default:
        console.log("未知错误,请稍后重试");
    }
    
    return false;
  }
}

// 批量清理未使用的自定义人员类型
async function cleanupUnusedCustomTypes() {
  console.log("开始清理未使用的自定义人员类型...");
  
  const types = await getAllEmployeeTypes();
  const customTypes = types.filter(t => t.enum_type === 2);
  
  if (customTypes.length === 0) {
    console.log("没有找到自定义人员类型");
    return;
  }
  
  console.log(`找到 ${customTypes.length} 个自定义人员类型:`);
  customTypes.forEach(type => {
    const status = type.enum_status === 1 ? '激活' : '未激活';
    console.log(`- ${type.content} (${type.enum_id}) [${status}]`);
  });
  
  // 显示未激活的自定义类型
  const inactiveCustomTypes = customTypes.filter(t => t.enum_status === 2);
  
  if (inactiveCustomTypes.length > 0) {
    console.log(`\n发现 ${inactiveCustomTypes.length} 个未激活的自定义类型,建议删除:`);
    
    for (const inactiveType of inactiveCustomTypes) {
      console.log(`\n正在处理未激活类型: ${inactiveType.content}`);
      console.log(`ID: ${inactiveType.enum_id}`);
      
      // 确认删除
      const success = await safeDeleteEmployeeType(inactiveType.enum_id);
      if (success) {
        console.log(`✓ 已删除: ${inactiveType.content}`);
      } else {
        console.log(`✗ 删除失败: ${inactiveType.content}`);
      }
    }
  } else {
    console.log("没有未激活的自定义类型");
  }
  
  console.log("\n清理完成");
}

// 删除测试类型(演示用)
async function deleteTestTypes() {
  console.log("查找并删除测试用的人员类型...");
  
  const types = await getAllEmployeeTypes();
  const testTypes = types.filter(t => 
    t.enum_type === 2 && // 自定义类型
    (t.content.includes('测试') || t.content.includes('test') || t.content.includes('Test'))
  );
  
  if (testTypes.length === 0) {
    console.log("没有找到测试用的人员类型");
    return;
  }
  
  console.log(`找到 ${testTypes.length} 个测试类型:`);
  testTypes.forEach(type => {
    console.log(`- ${type.content} (${type.enum_id})`);
  });
  
  // 删除所有测试类型
  for (const testType of testTypes) {
    console.log(`\n正在删除测试类型: ${testType.content}`);
    await safeDeleteEmployeeType(testType.enum_id);
  }
  
  console.log("\n测试类型清理完成");
}

// 使用示例
// safeDeleteEmployeeType("enum_1234567890");
// cleanupUnusedCustomTypes();
// deleteTestTypes();