审批流程需求分析与建模

一个简单的场景

我们先看一个简单的审批流程,请假流程:

  • 员工填写请假申请,包括请假天数,理由等,将请假申请提交给部门经理
  • 部门经理审批,如果审批结束(批准或者不批准),流程结束,如果需要员工修改申请,退回给员工进行修改。
    这里,我们简化了流程,没有将诸如审批结果通知员工等作为一个环节进行描述,不管这个流程是否合理,我们用它作为起点,开始我们的需求分析。

可以有多种方式描述上面的流程,顺序流程图、BPMN图、状态图等等,这些图都可以准确描述上面的流程,这里我们使用状态图进行描述:

从图中可以看出,流程有四个状态:“开始”、“请假申请”、“部门经理审批”和“结束”,状态之间有一个或者多个的条件转移,也就是当某个条件满足,一个状态可以转移到下一个状态。我们在需求分析阶段需要做的是,如何将这些驱动状态转移的动作模型化,为软件的设计提出具体的要求。

分析

流程所处的状态我们可以用字符串进行描述,但如何描述状态转移的条件呢? “提交申请”本身是一个动作,如果在计算机界面操作,可能是一个提交按钮,如果通过邮件发送申请,可能是接收邮件的一个消息触发,我们需要把这个动作模型化,可以将每个状态转换都设置为一个bool变量,如果这个变量为真,就进行状态转换。这个流程涉及四个转换:

  • 开始->请假申请,可以定义变量IsStart,如果为真,则代表流程状态从“开始”转换到“请假申请”。
  • 请假申请->部门经理审批,可以定义变量IsSubmit,如果为真,则代表流程状态从“请假申请”转换到“部门经理审批”。
  • 部门经理审批->请假申请,可以定义变量NeedModify,如果为真,则代表流程状态从“部门经理审批”转换到“请假申请”。
  • 部门经理审批->结束,可以定义变量IsFinished,如果为真,则代表流程状态从“部门经理审批”转换到“结束”。

从上面四个转换可以看出,每个“转换”包括起始状态、目标状态和转换状态变量三个属性,转换状态变量是由外部输入决定的。这时,我们可以建立需求分析模型了。

初步的分析模型

我们将流程的模型定义为ProcessModel,流程的实例定义为Process,每个ProcessModel中包含若干的StateNode,其中由一个开始节点(StartNode)和一个结束节点(EndNode),其它的节点为执行节点(ExecNode),节点之间通过转换链接(StateTransfer)连接在一起,每个转换链接包含一个转换条件(TransferCondition),如果转换条件成立,状态发生转移。我们可以用下面的类图表示这个分析模型:

分析模型的改进

这个模型似乎可以描述上面的场景了,我们手工创建一下这个模型的实例:

  • 我们创建一个ProcessModel,名称为“请假管理”
  • 这个ProcessModel中包括四个StateNode:StartNode,SubmitNode,ApproveNode和EndNode, 分别对应“开始”、“请假申请”、“部门经理审批”和“结束”。
  • 这个ProcessModel种包括四个状态转移,名称为:StartToSubmit,SubmitToApprove,ApproveToEnd,ApproveToSubmit,分别对应上面所说的四种状态转移。这里的问题是TransferCondition的定义,在分析中,我们有四个变量,IsStart,IsSubmit,NeedModify,IsFinished,这四个变量应该在定义TransferCondition中出现,比如IstStart==true。现在的问题是我们的模型中没有这四个变量的位置,也就是说,模型中缺少转换时条件变量的描述。我们对模型进行一下修改,增加这部分内容。

我们增加了流程相关的变量,在这个变量表中,我们可以定义IsStart,IsSubmit,NeedModify和IsFinisshed,流程在运行时,可以从外部接收这些变量的值,并保存在变量表中。在StateTransfer中可以使用这些变量定义条件转换的状态,并根据当前的值判断是否进行状态转换。

在ProcessModel中还增加了三个方法:

  • Init:初始化流程
  • GetCurrentState:获取流程的当前状态
  • Go: 传入变量,驱动流程。

分析模型的进一步验证

现在,我们用更复杂一些的请假流程来验证分析模型。

我们可以将上面的流程简化为下面的状态转移表,增加了一个传入变量请假时间(Days):

开始节点 结束节点 转移条件
Start Submit IsStart=true
Submit ManagerApprove Days<=3&&IsSubmit=true
Submit GMApprove Days>3&&IsSubmit=true
ManagerApprove End IsApproved=true
ManagerApproved Submit NeedModify=true
GMApprove End IsApproved=true
GMApprove Submit NeedModify=true

现在看分析模型可以符合目前的需求。

异步编程

从版本5.0开始,C#引入了async/await的异步编程模式,大大简化了异步编程的难度,使我们摆脱了回调函数、事件等传统的方式,可以使用类似同步编程的方式进行异步编程

Read More