本节包括以下主题:

# 在流程中如何调用自己的Dll的代码

在流程中如何调用自己Dll中的代码,比如,调用dll中的代码来设置处理人。

引用自己的dll不在每个流程上设置,而是在系统管理模块统一设置。

引用dll

在Server根目下,创建UserDll文件夹,把要调用的dll放在UserDll目录下。

在系统管理→可编程性设置要调用的dll,如图:

Image

在流程上调用dll

Image

# 流程在做的过程Dll要更新怎么办

我们把要调用的dll放到UserDll子目录了,流程在做的过程中,dll要更新怎么办呢?

UserDll子目录下支持动态更新,我们只需把新的dll替换掉旧的dll,然后打开调用dll的流程,重新保存即可应用新的dll。

无需动态更新的dll也可放在根目录下,放在根目录下的dll只加载一次更省空间。

# 如何在自己Dll中访问表单字段

首先,在自己的项目上,添加项目引用YZSoft.Wordkflow。

Image

在自己的函数中,使用引用项目中的WorkflowExecutionContext:

Image

使用C#节点,在流程上调用自己的函数:

Image

# 使用C#代码发起流程

流程流转过程中,希望使用C#代码发起流程,拖出任务节点并切换成C#代码节点:

Image

在C#代码节点,右键属性,书写发起流程的代码:

Image

示例代码:

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