会签其实就是几个人同时审批一件东西,例如,公司各部门领导共同审批一份公司文件等。
业务:
一组人共同审批一件东西,如果其中有一人不同意,则其他没有审批的成员就不用审批了,审批任务也自动取消;如果同意,则等待其他人的审批信息到来;如果全部成员都审批结束,则流程继续往下面走。
思路:
审批业务是一个典型的公司业务流程,用工作流实现当然是首选,又由于审批流程随时可能后退,所以状态机当然是最好的选择。
问题:
会签的人员列表往往是不确定的,并且参与人员的个数也是不确定的。这就让我们必然想到使用ReplicatorActivity 活动来实现,因为他可以绑定一个任务列表,并根据列表中实体个数来对审批工作进行复制,这就为我们解决了人员列表不确定的上面来了。但问题又是状态机工作流根本不让使用ReplicatorActivity 活动。
取舍:
1、使用状态机,但不使用ReplicatorActivity,困难是人员列表的不确定性如何灵活地使用状态机实现;
2、使用顺序工作流,使用ReplicatorActivity,困难是没有状态机那么灵活的状态跳转机制;
方案:有三种实现方式供大家参考
第一种:主流程使用状态机,会签工作使用顺序流,主流程使用InvokeWorkflowActivity 启动会签子流程,会签工作完成后,把结果通知主流程,主流程则继续运行。通知方法:当子流程运行结束时,使用CallExternalMethodActivity 调用外部函数,外部函数负责激活主流程。
外部方法形如下面代码:
public void CompleteCountersign(Guid pInstanceId, Guid instanceId, SureType sureType)
{
if (SureType.Agree == sureType)
{
FileApprovalService fileApprovalService = HostHelper.WFRuntime.GetService<FileApprovalService>();
fileApprovalService.RaiseAgreeEvent(pInstanceId);
}
else if (SureType.Disagree == sureType)
{
FileApprovalService fileApprovalService = HostHelper.WFRuntime.GetService<FileApprovalService>();
fileApprovalService.RaiseDisagreeEvent(pInstanceId);
}
ManualWorkflowSchedulerService manualWFSchedulerService = HostHelper.WFRuntime.GetService<ManualWorkflowSchedulerService>();
manualWFSchedulerService.RunWorkflow(pInstanceId);
}
这种方法的缺点是要维护主流程和子工作流的关系。
第二种:使用状态机,状态机中记录成员列表,每一个人来审批时,都先把自己从列表中删除,然后判断列表中是否还有人,如果没有人,继续状态机进入下一状态,如果还有人,则停留在本地。
缺点:这种方法不够灵活,比如,有一个人临时不参加审批操作了,是无法去掉的。
第三种:把人员列表从工作流中解脱出来。状态机接受两个事件,一个是正常审批事件,一个是审批流程结束事件。当触发审批事件之前,先判断该任务是否为最后一个任务,如果不是,则触发正常审批事件,如果是,则触发审批结束事件。
这样做也不乏灵活性,如果有一个人临时不参加审批了,就在流程外面把该人从流程中去掉就好了。

浙公网安备 33010602011771号