lihong557

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::
定义
会签其实就是几个人同时审批一件东西,例如,公司各部门领导共同审批一份公司文件等。
业务
一组人共同审批一件东西,如果其中有一人不同意,则其他没有审批的成员就不用审批了,审批任务也自动取消;如果同意,则等待其他人的审批信息到来;如果全部成员都审批结束,则流程继续往下面走。
思路
审批业务是一个典型的公司业务流程,用工作流实现当然是首选,又由于审批流程随时可能后退,所以状态机当然是最好的选择。
问题
会签的人员列表往往是不确定的,并且参与人员的个数也是不确定的。这就让我们必然想到使用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);
        }
这种方法的缺点是要维护主流程和子工作流的关系。

第二种:使用状态机,状态机中记录成员列表,每一个人来审批时,都先把自己从列表中删除,然后判断列表中是否还有人,如果没有人,继续状态机进入下一状态,如果还有人,则停留在本地。
缺点:这种方法不够灵活,比如,有一个人临时不参加审批操作了,是无法去掉的。

第三种:把人员列表从工作流中解脱出来。状态机接受两个事件,一个是正常审批事件,一个是审批流程结束事件。当触发审批事件之前,先判断该任务是否为最后一个任务,如果不是,则触发正常审批事件,如果是,则触发审批结束事件。
这样做也不乏灵活性,如果有一个人临时不参加审批了,就在流程外面把该人从流程中去掉就好了。








posted on 2008-01-24 14:02  抛物线  阅读(2264)  评论(3)    收藏  举报