C#脚本设置流程发起参数
本文档介绍如何使用 C# 脚本设置工作流发起参数,实 现管理员代为发起工作流的场景。
业务场景
工作流发起审批默认以当前登录用户为发起人进行发起。但在某些场景下,需要管理员代为发起工作流,而流程审批希望以列表上某行数据的员工字段为发起人进行发起(审批以发起人的组织关系进行审批)。
接口配置
典型的流程配置如下:
流程说明:
- 开始节点 - 流程入口
- C# 脚本组件 - 设置发起参数(发起人、业务数据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;
public class ChameleonCSharpScript
{
public string Execute(ComponentContext context, ChameleonSDK sdk)
{
var list = context.Request.List;
var first = list.First();
var stu = Convert.ToString(first["Student"]);
context.DicParam["BizDataIds"] = first._id;
context.DicParam["MetaObjectId"] = "00af14a3-0d4e-4aed-90e0-ee788c88e053";
context.DicParam["WorkflowLaunchUserId"] = stu;
return null;
}
}
参数说明
必填参数
| 参数 | 类型 | 说明 |
|---|---|---|
| BizDataIds | string | 当前选中行数据ID |
| MetaObjectId | string | 当前数据所在对象ID |
| WorkflowLaunchUserId | string | 发起人用户ID |
参数详解
BizDataIds(业务数据ID)
- 当前选中行的数据ID
- 可以从
context.Request.List中获取 - 如果是多选,可以传递多个ID(逗号分隔)
MetaObjectId(对象ID)
- 当前数据所在的实体对象ID
- 发起流程时需要指定对象ID
- 可以从实体配置中获取
WorkflowLaunchUserId(发起人用户ID)
- 指定流程的发起人
- 可以从列表行数据的字段中获取(如 Student 字段)
- 如果列表上未配置该字段,可以通过数据ID查询数据后获取
关键点说明
1. 获取当前数据
使用 context.Request.List 获取当前操作的数据列表,该属性已经将请求数据转化为组件适用的数据集合:
var list = context.Request.List;
var first = list.First(); // 获取第一行数据
2. 设置参数
通过 context.DicParam 字典设置发起参数:
context.DicParam["参数名"] = 参数值;
3. 发起人字段
可以从数据行中获取发起人字段值:
var userId = Convert.ToString(first["字段名"]);
扩展示例
示例1:从列表行数据获取发起人
public string Execute(ComponentContext context, ChameleonSDK sdk)
{
var list = context.Request.List;
var first = list.First();
// 从列表行数据获取发起人
var launchUserId = Convert.ToString(first["Employee"]);
context.DicParam["BizDataIds"] = first._id;
context.DicParam["MetaObjectId"] = "your-meta-object-id";
context.DicParam["WorkflowLaunchUserId"] = launchUserId;
return null;
}
示例2:通过查询获取发起人
如果列表上未配置发起人字段,可以通过数据ID查询数据后获取:
public async Task<object> ExecuteAsync(ComponentContext context, ChameleonSDK sdk)
{
var list = context.Request.List;
var first = list.First();
// 通过数据ID查询详细信息
var dataId = first._id;
var queryResult = await sdk.MetaObjectHelper.QueryOneAsync(new QueryOneRequest
{
MetaObjectId = "your-meta-object-id",
Id = dataId
});
// 从查询结果获取发起人
var launchUserId = Convert.ToString(queryResult["Employee"]);
context.DicParam["BizDataIds"] = dataId;
context.DicParam["MetaObjectId"] = "your-meta-object-id";
context.DicParam["WorkflowLaunchUserId"] = launchUserId;
return null;
}
示例3:批量发起多个流程
public string Execute(ComponentContext context, ChameleonSDK sdk)
{
var list = context.Request.List;
var metaObjectId = "your-meta-object-id";
// 为每一行数据设置发起参数
foreach (var item in list)
{
var launchUserId = Convert.ToString(item["Employee"]);
var bizDataId = item._id;
// 设置参数并发起流程
context.DicParam["BizDataIds"] = bizDataId;
context.DicParam["MetaObjectId"] = metaObjectId;
context.DicParam["WorkflowLaunchUserId"] = launchUserId;
// 注意:批量发起需要在发起流程组件中配置循环
}
return null;
}
示例4:条件判断设置发起人
public string Execute(ComponentContext context, ChameleonSDK sdk)
{
var list = context.Request.List;
var first = list.First();
// 根据条件设置不同的发起人
var type = Convert.ToString(first["Type"]);
string launchUserId;
if (type == "A类")
{
launchUserId = Convert.ToString(first["ManagerA"]);
}
else if (type == "B类")
{
launchUserId = Convert.ToString(first["ManagerB"]);
}
else
{
launchUserId = ChameleonContext.Current.UserId; // 默认当前用户
}
context.DicParam["BizDataIds"] = first._id;
context.DicParam["MetaObjectId"] = "your-meta-object-id";
context.DicParam["WorkflowLaunchUserId"] = launchUserId;
return null;
}
注意事项
- 参数必填:
BizDataIds、MetaObjectId、WorkflowLaunchUserId三个参数必须设置 - 用户ID有效性:确保发起人用户ID在系统中存在
- 权限要求:执行脚本的用户需要有发起流程的权限
- 数据一致性:确保业务数据ID和对象ID匹配
- 异步方法:如果需要查询数据 ,使用异步方法
ExecuteAsync
常见问题
Q: 如何获取对象ID?
A: 可以在实体配置页面查看对象ID,或者通过 API 查询获取。
Q: 可以指定多个发起人吗?
A: 不可以,一个流程只能有一个发起人。如果需要多个发起人,需要发起多个流程。
Q: 发起人必须是系统用户吗?
A: 是的,发起人必须是系统中存在的用户。
Q: 如何处理批量发起?
A: 在发起流程组件中配置循环,为每条数据分别发起流程。