跳到主要内容

C#脚本设置流程发起参数

本文档介绍如何使用 C# 脚本设置工作流发起参数,实现管理员代为发起工作流的场景。

业务场景​

工作流发起审批默认以当前登录用户为发起人进行发起。但在某些场景下,需要管理员代为发起工作流,而流程审批希望以列表上某行数据的员工字段为发起人进行发起(审批以发起人的组织关系进行审批)。

接口配置​

典型的流程配置如下:

流程说明:

  1. 开始节点 - 流程入口
  2. C# 脚本组件 - 设置发起参数(发起人、业务数据ID等)
  3. 发起流程组件 - 根据参数发起审批流程
  4. 结束组件 - 流程结束

示例代码​

以下示例演示如何设置流程发起参数:

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;
}
}

参数说明​

必填参数​

参数类型说明
BizDataIdsstring当前选中行数据ID
MetaObjectIdstring当前数据所在对象ID
WorkflowLaunchUserIdstring发起人用户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;
}

注意事项​

  1. 参数必填:BizDataIds、MetaObjectId、WorkflowLaunchUserId 三个参数必须设置
  2. 用户ID有效性:确保发起人用户ID在系统中存在
  3. 权限要求:执行脚本的用户需要有发起流程的权限
  4. 数据一致性:确保业务数据ID和对象ID匹配
  5. 异步方法:如果需要查询数据,使用异步方法 ExecuteAsync

常见问题​

Q: 如何获取对象ID?​

A: 可以在实体配置页面查看对象ID,或者通过 API 查询获取。

Q: 可以指定多个发起人吗?​

A: 不可以,一个流程只能有一个发起人。如果需要多个发起人,需要发起多个流程。

Q: 发起人必须是系统用户吗?​

A: 是的,发起人必须是系统中存在的用户。

Q: 如何处理批量发起?​

A: 在发起流程组件中配置循环,为每条数据分别发起流程。

相关文档​