您当前的位置: 首页 >> 生活 > >> 内容页

天天动态:flowscheme流程架构、flowinstance流程实例,flowform流程表单 ,用C#写一个流程审批

2023-05-17 17:53:29 来源:哔哩哔哩

以下是一个基于 flowscheme、flowinstance、flowform 的流程审批的 C# 示例:


(相关资料图)

首先,我们需要定义一个基本的流程结构,即 flowscheme(流程架构):

```csharp

public class FlowScheme

{

public int Id { get; set; }

public string Name { get; set; }

public string Description { get; set; }

public IList<FlowNode> Nodes { get; set; }

}

```

其中,`Nodes` 是一个包含所有流程节点的列表,`FlowNode` 则表示一个流程节点,包括节点的类型、状态、处理时限等信息。为了实现解耦合,我们可以为每一个节点定义一个代表其行为的类,比如:

```csharp

public abstract class FlowNodeHandler

{

public abstract void Execute(FlowNode node, FlowInstance instance, FlowForm form);

}

public class ApprovalNodeHandler : FlowNodeHandler

{

public override void Execute(FlowNode node, FlowInstance instance, FlowForm form)

{

// 处理审批节点的行为

}

}

public class NotifyNodeHandler : FlowNodeHandler

{

public override void Execute(FlowNode node, FlowInstance instance, FlowForm form)

{

// 处理通知节点的行为

}

}

```

这样,在执行流程时,我们就可以根据节点的类型调用对应的节点处理类,而不用关心具体的实现。

接下来,我们需要定义一个流程实例,即一个流程的运行状态:

```csharp

public class FlowInstance

{

public int Id { get; set; }

public int SchemeId { get; set; }

public int CurrentNodeId { get; set; }

public string Status { get; set; }

public DateTime? StartTime { get; set; }

public DateTime? EndTime { get; set; }

public IList<FlowNodeInstance> NodeInstances { get; set; }

}

```

`CurrentNodeId` 表示当前节点的 ID,`Status` 表示当前流程的状态(比如“进行中”、“已完成”等),`NodeInstances` 则包含了每个流程节点的运行状态,即 flowinstance(流程实例)。

最后,我们需要定义一个流程表单,即一份待审批的单据或文档:

```csharp

public class FlowForm

{

public int Id { get; set; }

// 包含单据的所有字段定义和数据

}

```

在流程执行期间,流程表单会作为节点处理类的参数传递,以便处理各种节点行为。例如,一个审批节点处理类的代码可能如下:

```csharp

public class ApprovalNodeHandler : FlowNodeHandler

{

public override void Execute(FlowNode node, FlowInstance instance, FlowForm form)

{

// 获取当前节点实例

var nodeInstance = instance.NodeInstances.SingleOrDefault(x => x.NodeId == node.Id);

// 判断该节点是否已处理,如果已经处理过则不需要再次处理

if (nodeInstance != null && nodeInstance.Status != "待处理")

{

return;

}

// 处理节点的业务逻辑,比如向指定的审批人发起审批请求,等待审批结果等

// 处理完成后更新节点实例的状态

if (nodeInstance == null)

{

nodeInstance = new FlowNodeInstance { NodeId = node.Id };

instance.NodeInstances.Add(nodeInstance);

}

nodeInstance.Status = "已处理";

nodeInstance.ProcessTime = DateTime.Now;

}

}

```

当需要执行某个节点时,我们只需根据节点类型调用对应的处理类即可,比如:

```csharp

var node = scheme.Nodes.SingleOrDefault(x => x.Id == instance.CurrentNodeId);

var handler = GetNodeHandler(node.Type);

handler.Execute(node, instance, form);

```

其中,`GetNodeHandler` 方法可以根据节点的类型获取对应的节点处理类,例如:

```csharp

private FlowNodeHandler GetNodeHandler(string type)

{

switch (type)

{

case "approval":

return new ApprovalNodeHandler();

case "notify":

return new NotifyNodeHandler();

// 其他流程节点处理类的定义

}

}

```

这样,我们就实现了一个基于 flowscheme、flowinstance、flowform 的简单流程审批,它与具体的单据解耦合,能够灵活地适应不同的业务场景。

关键词:
分享到:

Copyright   2015-2022 南极时尚网版权所有   备案号:粤ICP备2022077823号-13   联系邮箱: 317 493 128@qq.com