以下是一个基于 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