动态添加&编辑人员
本文档介绍如何使用 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);
参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| list | List<ObjectData> | 人员数据列表 |
ObjectData 必填字段:
| 字段名 | 类型 | 说明 |
|---|---|---|
| name | string | 人员姓名 |
| number | string | 人员编号(工号) |
| string | 邮箱地址(用于登录) |
批量编辑人员
await sdk.UserInformationHelper.BatchUpdateUserInformationsAsync(list);
参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| list | List<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条数据,避免超时
注意事项
- 邮箱唯一性:邮箱地址在系统中必须唯一,重复添加会报错
- 人员编号唯一性:人员编号在系统中必须唯一
- 权限要求:执行脚本的用户需要有人员管理的权限
- 数据验证:添加前建议验证数据的完整性和有效性
- 错误处理:批量操作中如果某条数据失败,会影响整个批次的执行
- 性能考虑:大批量添加时,建议分批次处理
常见问题
Q: 添加人员后,用户如何登录?
A: 用户可以使用邮箱地址作为账号登录系统。初始密码需要通过其他方式设置或通知用户。
Q: 可以添加自定义字段吗?
A: 可以,在 ObjectData 中添加自定义字段即可。这些字段会存储在人员的扩展信息中。
Q: 如何判断人员是否已存在?
A: 可以通过邮箱或人员编号查询人员信息,判断是否已存在。
Q: 批量操作失败如何处理?
A: 建议使用 try-catch 捕获异常,记录失败的数据,便于后续重试。