Skip to main content

动态为人员设置身份

本文档介绍如何使用 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; }
}

参数说明:

参数类型说明
ProfileIdstring身份ID,可从系统身份授权界面中获取
UserIdsstring[]用户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 去除空值

注意事项​

  1. 权限要求:执行脚本的用户需要有身份管理的权限
  2. 身份ID有效性:确保使用的身份ID在系统中存在且有效
  3. 用户ID有效性:确保用户ID在系统中存在
  4. 幂等性:重复授予同一身份不会报错,但建议做好去重处理
  5. 事务处理:如果涉及多个身份操作,建议考虑失败回滚机制

常见问题​

Q: 如何获取身份ID?​

A: 进入系统管理 > 身份授权界面,在身份列表中可以看到每个身份的ID。

Q: 授予身份后,用户需要重新登录吗?​

A: 不需要,身份授予后会立即生效。

Q: 可以批量操作多个身份吗?​

A: 可以,多次调用 AssignProfileAsync 或 RemoveProfileAsync 即可。

相关文档​