动态为人员设置身份
本文档介绍如何使用 C# 脚本动态为人员授予或解除身份。
使用场景
当需要根据业务逻辑动态管理人员身份时,例如:
- 新增数据后,根据字段值自动为相关人员授予身份
- 审批通过后,自动为申请人授予特定身份
- 数据状态变更时,自动调整相关人员身份
- 批量人员身份管理
实现方式
示例场景
新增数据后,根据数据中的负责人字段(responsiblepersons,人员ID多选)有值,则将这些人员自动授予"院系管理员"身份。
示例代码
using System;
using System.Linq;
using System.Collections.Generic;
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;
using Chameleon.SDK.Models.Request.Account;
public class ChameleonCSharpScript
{
public async Task<object> ExecuteAsync(ComponentContext context, ChameleonSDK sdk)
{
var obj = context.Request?.List?.FirstOrDefault();
if (obj == null)
return "";
var responsiblepersons = Convert.ToString(obj["responsiblepersons"]).Split(',',StringSplitOptions.RemoveEmptyEntries);
if (responsiblepersons.Length > 0)
{
var request = new AssignProfileRequest
{
// 院系管理员身份ID
ProfileId = "1d67a344-f5fa-4180-8a9b-a113f761eb8d",
UserIds = responsiblepersons
};
await sdk.AccountHelper.AssignProfileAsync(request);
}
return "1";
}
}
API 说明
ChameleonSDK 提供了动态管理人员身份的 API。
授予身份
为指定人员授予身份:
sdk.AccountHelper.AssignProfileAsync(request)
解除身份
为指定人员 解除身份:
sdk.AccountHelper.RemoveProfileAsync(request)
请求模型定义
public class AssignProfileRequest
{
public string ProfileId { get; set; }
public string[] UserIds { get; set; }
}
参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| ProfileId | string | 身份ID,可从系统身份授权界面中获取 |
| UserIds | string[] | 用户ID数组,支持批量操作 |
扩展示例
示例1:根据条件授予不同身份
public async Task<object> ExecuteAsync(ComponentContext context, ChameleonSDK sdk)
{
var obj = context.Request?.List?.FirstOrDefault();
if (obj == null)
return "";
var userIds = Convert.ToString(obj["userids"]).Split(',', StringSplitOptions.RemoveEmptyEntries);
var level = Convert.ToString(obj["level"]);
if (userIds.Length > 0)
{
// 根据等级授予不同身份
string profileId = level switch
{
"高级" => "高级管理员身份ID",
"中级" => "中级管理员身份ID",
_ => "普通用户身份ID"
};
var request = new AssignProfileRequest
{
ProfileId = profileId,
UserIds = userIds
};
await sdk.AccountHelper.AssignProfileAsync(request);
}
return "1";
}
示例2:身份变更(先解除旧身份,再授予新身份)
public async Task<object> ExecuteAsync(ComponentContext context, ChameleonSDK sdk)
{
var obj = context.Request?.List?.FirstOrDefault();
if (obj == null)
return "";
var userIds = Convert.ToString(obj["userids"]).Split(',', StringSplitOptions.RemoveEmptyEntries);
var oldProfileId = Convert.ToString(obj["oldprofileid"]);
var newProfileId = Convert.ToString(obj["newprofileid"]);
if (userIds.Length > 0)
{
// 先解除旧身份
if (!string.IsNullOrEmpty(oldProfileId))
{
var removeRequest = new AssignProfileRequest
{
ProfileId = oldProfileId,
UserIds = userIds
};
await sdk.AccountHelper.RemoveProfileAsync(removeRequest);
}
// 再授予新身份
if (!string.IsNullOrEmpty(newProfileId))
{
var assignRequest = new AssignProfileRequest
{
ProfileId = newProfileId,
UserIds = userIds
};
await sdk.AccountHelper.AssignProfileAsync(assignRequest);
}
}
return "1";
}
示例3:审批通过后自动授予身份
public async Task<object> ExecuteAsync(ComponentContext context, ChameleonSDK sdk)
{
var obj = context.Request?.List?.FirstOrDefault();
if (obj == null)
return "";
var approvalStatus = Convert.ToString(obj["approvalstatus"]);
var applicantId = Convert.ToString(obj["applicantid"]);
// 审批通过后自动授予身份
if (approvalStatus == "已通过" && !string.IsNullOrEmpty(applicantId))
{
var request = new AssignProfileRequest
{
ProfileId = "特定身份ID",
UserIds = new string[] { applicantId }
};
await sdk.AccountHelper.AssignProfileAsync(request);
}
return "1";
}
关键点说明
1. 获取身份ID
- 身份ID可从系统管理 > 身份授权界面中获取
- 建议将常用的身份ID配置在系统参数中,便于维护
2. 异步方法调用
- SDK 的身份管理 API 是异步方法
- 脚本方法签名需要改为
async Task<object> ExecuteAsync - 使用
await关键字等待异步操作完成
3. 返回值说明
- 返回
"1"表示脚本执行成功 - 返回空字符串或错误消息表示执行失败
4. 数据格式
- 人员ID多选 字段存储格式为逗号分隔的字符串
- 使用
Split()方法解析时,建议使用StringSplitOptions.RemoveEmptyEntries去除空值
注意事项
- 权限要求:执行脚本的用户需要有身份管理的权限
- 身份ID有效性:确保使用的身份ID在系统中存在且有效
- 用户ID有效性:确保用户ID在系统中存在
- 幂等性:重复授予同一身份不会报错,但建议做好去重处理
- 事务处理:如果涉及多个身份操作,建议考虑失败回滚机制
常见问题
Q: 如何获取身份ID?
A: 进入系统管理 > 身份授权界面,在身份列表中可以看到每个身份的ID。
Q: 授予身份后,用户需要重新登录吗?
A: 不需要,身份授予后会立即生效。
Q: 可以批量操作多个身份吗?
A: 可以,多次调用 AssignProfileAsync 或 RemoveProfileAsync 即可。