Skip to main content

动态添加&编辑人员

本文档介绍如何使用 C# 脚本动态添加和编辑人员信息。

使用场景​

当需要通过脚本动态管理人员信息时,例如:

  • 批量导入人员数据
  • 从外部系统同步人员信息
  • 根据业务逻辑自动创建人员账号
  • 批量更新人员信息

实现方式​

方式一:使用 ChameleonSDK API(推荐)​

在微服务或脚本中,可以通过 ChameleonSDK 提供的 API 来添加和编辑人员。

示例:批量添加人员​

以下示例演示如何批量添加3个人员:

using System;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Chameleon.Common;
using Chameleon.Common.Context;
using Chameleon.Common.Exceptions;
using Chameleon.Common.Models;
using Chameleon.Database;
using Chameleon.SDK;

public class ChameleonCSharpScript
{
public async Task<object> ExecuteAsync(ComponentContext context, ChameleonSDK sdk)
{
var list = new List<ObjectData>();

for (int i = 0; i < 3; i++)
{
var obj = new ObjectData();
obj["name"] = $"sdk_add_{i}";
obj["number"] = $"sdk_add_{i}";
obj["email"] = $"sdk_add_{i}@chameleon.com";
list.Add(obj);
}

await sdk.UserInformationHelper.BatchAddUserInformationsAsync(list);

return null;
}
}

方式二:通过 OpenAPI 调用​

也可以通过 HTTP 方式调用系统的 OpenAPI 来添加人员。详情请参考 Open API 文档。

API 说明​

批量添加人员​

await sdk.UserInformationHelper.BatchAddUserInformationsAsync(list);

参数说明:

参数类型说明
listList<ObjectData>人员数据列表

ObjectData 必填字段:

字段名类型说明
namestring人员姓名
numberstring人员编号(工号)
emailstring邮箱地址(用于登录)

批量编辑人员​

await sdk.UserInformationHelper.BatchUpdateUserInformationsAsync(list);

参数说明:

参数类型说明
listList<ObjectData>人员数据列表,必须包含 _id 字段

扩展示例​

示例1:从外部数据源批量导入人员​

public async Task<object> ExecuteAsync(ComponentContext context, ChameleonSDK sdk)
{
// 假设从外部API获取人员数据
var externalUsers = await GetExternalUsers();

var list = new List<ObjectData>();

foreach (var user in externalUsers)
{
var obj = new ObjectData();
obj["name"] = user.Name;
obj["number"] = user.EmployeeId;
obj["email"] = user.Email;
obj["mobile"] = user.Mobile;
obj["department"] = user.Department;
list.Add(obj);
}

await sdk.UserInformationHelper.BatchAddUserInformationsAsync(list);

return null;
}

示例2:批量编辑人员信息​

public async Task<object> ExecuteAsync(ComponentContext context, ChameleonSDK sdk)
{
var list = new List<ObjectData>();

// 编辑已存在的人员,需要提供 _id
var obj1 = new ObjectData();
obj1["_id"] = "user_id_1";
obj1["mobile"] = "13800138000";
obj1["department"] = "技术部";
list.Add(obj1);

var obj2 = new ObjectData();
obj2["_id"] = "user_id_2";
obj2["mobile"] = "13900139000";
obj2["department"] = "市场部";
list.Add(obj2);

await sdk.UserInformationHelper.BatchUpdateUserInformationsAsync(list);

return null;
}

示例3:根据表单数据添加人员​

public async Task<object> ExecuteAsync(ComponentContext context, ChameleonSDK sdk)
{
var formData = context.Request?.List?.FirstOrDefault();

if (formData == null)
return null;

var list = new List<ObjectData>();

var obj = new ObjectData();
obj["name"] = Convert.ToString(formData["name"]);
obj["number"] = Convert.ToString(formData["number"]);
obj["email"] = Convert.ToString(formData["email"]);
obj["mobile"] = Convert.ToString(formData["mobile"]);
obj["department"] = Convert.ToString(formData["department"]);
list.Add(obj);

await sdk.UserInformationHelper.BatchAddUserInformationsAsync(list);

return null;
}

示例4:条件判断后添加人员​

public async Task<object> ExecuteAsync(ComponentContext context, ChameleonSDK sdk)
{
var formData = context.Request?.List?.FirstOrDefault();

if (formData == null)
return null;

var email = Convert.ToString(formData["email"]);

// 检查邮箱是否已存在
var existingUser = await sdk.UserInformationHelper.GetUserByEmailAsync(email);

if (existingUser != null)
{
// 如果已存在,更新信息
var updateList = new List<ObjectData>();
var updateObj = new ObjectData();
updateObj["_id"] = existingUser["_id"].ToString();
updateObj["name"] = Convert.ToString(formData["name"]);
updateObj["mobile"] = Convert.ToString(formData["mobile"]);
updateList.Add(updateObj);

await sdk.UserInformationHelper.BatchUpdateUserInformationsAsync(updateList);
}
else
{
// 如果不存在,添加新人员
var addList = new List<ObjectData>();
var addObj = new ObjectData();
addObj["name"] = Convert.ToString(formData["name"]);
addObj["number"] = Convert.ToString(formData["number"]);
addObj["email"] = email;
addObj["mobile"] = Convert.ToString(formData["mobile"]);
addList.Add(addObj);

await sdk.UserInformationHelper.BatchAddUserInformationsAsync(addList);
}

return null;
}

关键点说明​

1. 异步方法​

  • SDK 的人员管理 API 是异步方法
  • 脚本方法签名需要改为 async Task<object> ExecuteAsync
  • 使用 await 关键字等待异步操作完成

2. 必填字段​

添加人员时,以下字段为必填:

  • name - 人员姓名
  • number - 人员编号
  • email - 邮箱地址

3. 编辑人员​

编辑人员时,必须提供 _id 字段来标识要编辑的人员。

4. 批量操作​

  • API 支持批量操作,可以一次性添加或编辑多个人员
  • 建议单次操作不超过100条数据,避免超时

注意事项​

  1. 邮箱唯一性:邮箱地址在系统中必须唯一,重复添加会报错
  2. 人员编号唯一性:人员编号在系统中必须唯一
  3. 权限要求:执行脚本的用户需要有人员管理的权限
  4. 数据验证:添加前建议验证数据的完整性和有效性
  5. 错误处理:批量操作中如果某条数据失败,会影响整个批次的执行
  6. 性能考虑:大批量添加时,建议分批次处理

常见问题​

Q: 添加人员后,用户如何登录?​

A: 用户可以使用邮箱地址作为账号登录系统。初始密码需要通过其他方式设置或通知用户。

Q: 可以添加自定义字段吗?​

A: 可以,在 ObjectData 中添加自定义字段即可。这些字段会存储在人员的扩展信息中。

Q: 如何判断人员是否已存在?​

A: 可以通过邮箱或人员编号查询人员信息,判断是否已存在。

Q: 批量操作失败如何处理?​

A: 建议使用 try-catch 捕获异常,记录失败的数据,便于后续重试。

相关文档​