本节包括以下主题:
- 在流程中如何调用自己的Dll的代码
- 流程在做的过程Dll要更新怎么办
- 如何在自己Dll中访问表单字段
- 使用C#代码发起流程
- 如何在自己的Dll中访问数据库
- 如何在流程事件中访问相关信息
- 第三方系统如何发送信号到BPM系统
- 使用C#代码设置全局变量
# 在流程中如何调用自己的Dll的代码
在流程中如何调用自己Dll中的代码,比如,调用dll中的代码来设置处理人。
引用自己的dll不在每个流程上设置,而是在系统管理模块统一设置。
引用dll
在Server根目下,创建UserDll文件夹,把要调用的dll放在UserDll目录下。
在系统管理→可编程性设置要调用的dll,如图:
在流程上调用dll
# 流程在做的过程Dll要更新怎么办
我们把要调用的dll放到UserDll子目录了,流程在做的过程中,dll要更新怎么办呢?
UserDll子目录下支持动态更新,我们只需把新的dll替换掉旧的dll,然后打开调用dll的流程,重新保存即可应用新的dll。
无需动态更新的dll也可放在根目录下,放在根目录下的dll只加载一次更省空间。
# 如何在自己Dll中访问表单字段
首先,在自己的项目上,添加项目引用YZSoft.Wordkflow。
在自己的函数中,使用引用项目中的WorkflowExecutionContext:
使用C#节点,在流程上调用自己的函数:
# 使用C#代码发起流程
流程流转过程中,希望使用C#代码发起流程,拖出任务节点并切换成C#代码节点:
在C#代码节点,右键属性,书写发起流程的代码:
示例代码:
var processId = "f8008f1b-743e-44e7-a7a8-9927a554a808";
var uid = "99199";
var user = Context.OrgService.GetUserAsync(uid).Result;
var owner = Context.OrgService.GetUserDefaultPositionAsync(uid).Result;
var formData = new
{
采购原因 = "123",
采购明细 = new object[]
{
new {物品名称="潜水推进器",单价=11,数量=1,小计=11},
new {物品名称="空气推进器",单价=22,数量=2,小计=44},
}
};
var processInstance = Context.WorkflowExecuteService.StartProcessInstanceAsync(processId, "提交", builder =>
{
builder
.Context(context => context.LoginUser = user)
.UseFormData(formData)
.ProcessInstance(processInstance => processInstance.UseOwner(owner))
.UseComments("提交意见");
}).Result;
Context.FormRootRow["子流程流水号"] = processInstance.SerialNum;
# 如何在自己的Dll中访问数据库
示例代码:
var dataSourceInstance = await context.DataSourceService.GetDbContextFromDataSourceIdAsync<IDataSource>(DataSourceId);
DbConnection connection = await dataSource.GetOpenConnectionAsync<DbConnection>();
using (var cmd = connection.CreateCommand())
{
cmd.Connection = connection;
......
}
# 如何在流程事件中访问相关信息
事件类型提示
流程定义时,事件界面增加事件类型提示。
例如在流程属性->事件->OnReturnToInitiator中,提示为:
参数: ReturnToInitiatorEvent @event
访问代码示范:@event.WorkflowExecutionContext.OptTaskInstance.ExecutionPointer.Activity.Name //退回发起步骤名称
流程执行类别属性
在流程上下文WorkflowExecutionContext中,增加本次执行的类别属性:ExecutionType
事件中访问代码示范:@event.WorkflowExecutionContext.ExecutionType
退回重填: TaskInstanceOperationReturnToInitiator
退回: TaskInstanceOperationReturn
拒绝: TaskInstanceOperationReject 、ProcessInstanceOperationReject//通常在审批时在任务上拒绝,管理员也可能针对流程实例上拒绝
WorkflowExecutionContext同时增加了2个属性,可快速判断是退回还是拒绝
IsExecutionTypeReturn
IsExecutionTypeReject
所有的ExecutionType如下:
public enum WorkflowExecutionType
{
Unspecified, //未指定(初始值),实际运行时不应该出现
StartProcessInstance, //启动流程实例
StartBoundaryEvent, //边界事件触发而执行
StartEventSubProcess, //事件子流程触发而执行
ExecuteContinue, //从saga事务断点处继续执行
TaskInstanceApprove, //常规审批
TaskInstanceInformSubmit, //知会提交
TaskInstanceCounterSignSubmit, //会签用户提交
TaskInstanceAdditionalSignSubmit, //加签用户提交
TaskInstanceTimeout, //超时处理
ProcessInstanceOperationInform, //知会
ProcessInstanceOperationReject, //拒绝
ProcessInstanceOperationTakeBackToInitiator, //取回重填
ProcessInstanceOperationAbort, //撤销
ProcessInstanceOperationDelete, //删除
ProcessInstanceOperationClear, //从垃圾箱删除任务
ProcessInstanceOperationHandover, //申请移交(离职移交)
TaskInstanceOperationPickupShareTask, //获取共享任务
TaskInstanceOperationPutbackShareTask, //放回共享任务
TaskInstanceOperationInform, //发起知会
TaskInstanceOperationRemind, //催办
TaskInstanceOperationTransfer, //委托
TaskInstanceOperationChangeOwner, //改变处理人
TaskInstanceOperationAssignOwner, //设置处理人
TaskInstanceOperationHandover, //任务移交
TaskInstanceOperationReject, //拒绝
TaskInstanceOperationCounterSign, //发起加签
TaskInstanceOperationTakeBack, //取回重签
TaskInstanceOperationReturnToInitiator, //退回重填
TaskInstanceOperationReturn, //退回某步
RestoreRejectedProcessInstance, //恢复拒绝的申请
RestoreAbortedProcessInstance, //恢复撤销的申请
RestoreDeletedProcessInstance, //恢复删除的申请
# 第三方系统如何发送信号到BPM系统
外部系统访问BPM很简单,例如发信号:
var client = YiezClientFactory.Create(new YiezOptions
{
Endpoint = "https://localhost:6001",
ClientKey = "system",
ClientSecret = "6YmtHPNi0Ks6u8yzz6fGglhdoGzsSloz",
});
//发送信号
await client.WorkflowExecuteService.SignalAsync(new SendSignalRequest
{
SignalName = "signal123",
SignalKey = "signalKey123",
Uid = "99199"
});
更多可参考安装包中,demo目录下的演示代码。
# 使用C#代码设置全局变量
流程中用C#代码设置全局变量,如库存:
await Context.ServiceProvider.GetRequiredService<WorkflowGlobalVariableService>().SetAsync("库存", 30);