在上2篇博客中,我们有了工作流定义的列表,也有了关联表单和启动表单,现在就是开始开发这个通用工作流的时刻了。
工作流的基本构成就是:一个While循环控制工作流的运转,While里的Task Replicator用来创建审批任务,至于应该创建哪一级的审批人,我们使用一个Step变量来控制。当Step==0时,表示需要提交者修改内容后重新提交。
首先,我们先来看看这个工作流的逻辑图:
这是一个简单的逻辑图示,最终的工作流图会有所不同。从这个图中可以看出,我们是用代码在控制流程的流转。
当Step为0时,表示需要提交者修改内容后,重新提交。
当Step>0时,TaskReplicator(一个Replicator里放置一个TaskActivity)就创建这步的所有审批人,并且根据审批类型为投票还是并行来做结束判断。
Code部分,根据Task的返回结果是通过还是拒绝,来决定Step++还是Step--。
如果Step>总步骤数,那么流程结束。While退出。
在这里,TaskReplicator的任务表单,我们都用同一个命名为Task1的User Control。而重新提交我们用命名为Task0的User Control。因为Task0会有稍许不同,Task0会直接提供修改原始List的表单,而不需要用户回到原始List中去做修改。
有了这个逻辑关系图,我们来看看具体的工作流程图和一些关键代码:
与逻辑图中稍许不同的就是,我们在Resubmit后加了一个Terminate Activity,这是为了让提交者可以终止掉这个流程。While循环后的Code Activity则是为了记录一些日志。
有了上面的这个工作流程图,剩下的就需要一些变量来控制流程的流转了。比较重要的变量如下:
Codepublicboolfinished=false;//While循环的结束条件publicbooltask_passed=false;//TaskReplicator是否是“通过”privateintstep=1;//当前的步骤privateintstep_total=0;//总步骤privatestringworkflow_name=string.Empty;//工作流名称,用于去配置表中读取工作流定义privateintvote=0;//用于投票类型的审批,当前投票通过的百分比publicboolterminate=false;//用户是否终止提交工作流
有了这些变量,我们就可以设置While的结束条件,If-Else的分支条件了。
重新提交If-Else这个分支的提交为step==0。工作流终止If-Else的分支条件为terminate。
1. 工作流的Activated事件:读取工作流的定义,设置TaskReplicator的InitChildData为第一步的所有审批人。
CodeInitDatadata=WorkflowDataSerializer.DeserializeFromXmlString(workflowProperties.InitiationData);
workflow_name=data.WorkflowName;
SPListItemworkflow=GetWorkflow(workflowProperties.Web,workflow_name);
step_total=int.Parse(workflow["步骤数"].ToString());
SubmitterComments=data.SubmitterComments;
user=data.InitUser;
days=data.ApproveDays;
replicatorTask.InitialChildData=GetWorkflowStepSettings(workflowProperties.Web,workflow_name,step);
workflow_name是从工作流的InitiationData中读取(这里用了一个反序列化来获得工作流启动时保存的对象数据)
2. taskReplicator的Initialized事件:做一些初始化工作,在这里不对InitChildData做任何赋值。
task_passed=false;//设置为未通过状态vote=0;//设置投票通过比例为0taskPropertiesList=newList();//用于记录所有用户处理过的任务信息
3. taskReplicator的ChildInitialized事件:创建该步骤对应的Task
CodeTaskActivityactivity=e.ActivityasTaskActivity;
activity.TaskProperties=newSPWorkflowTaskProperties();
activity.TaskProperties.DueDate=DateTime.Now.AddDays(days);
activity.TaskProperties.ExtendedProperties["SubmitterComments"]=SubmitterComments;
activity.TaskProperties.ExtendedProperties["ReviewComments"]=ReviewComments;
WorkflowReviewerSettingsitem=e.InstanceDataasWorkflowReviewerSettings;
activity.TaskProperties.AssignedTo=item.DomainAccount;
activity.TaskProperties.Title="请审批"+user+"的请假单";
activity.TaskProperties.TaskType=1;
4. taskReplicator的Until结束条件:判断投票结果是否通过。
CodeSPListItemspitem=GetWorkflowStep(workflowProperties.Web,workflow_name,step);stringtype=spitem["审批类型"].ToString();switch(type)
{case"并行":intcount=0;foreach(SPWorkflowTaskPropertiestaskPropinthis.taskPropertiesList)
{stringstatus=taskProp.ExtendedProperties["TaskStatus"]asstring;switch(status)
{case"Approved":
count++;break;case"Rejected":
e.Result=true;
step--;return;
}
}
task_passed=count==replicatorTask.InitialChildData.Count;break;case"投票":intvote_passed=int.Parse(spitem["投票通过比例"].ToString());if(taskPropertiesList.Count==replicatorTask.InitialChildData.Count&&vote
{
e.Result=true;
step--;return;
}
task_passed=vote>=vote_passed;break;
}if(task_passed)
{
step++;
}
e.Result=task_passed;
5. taskReplicator的ChildCompleted事件:把用户处理过的任务信息保存下来,以便在Until事件中使用
CodeTaskActivityactivity=e.ActivityasTaskActivity;
ReviewComments+=PersonSayComment(activity.TaskProperties);
SubmitterComments=activity.TaskProperties.ExtendedProperties["SubmitterComments"]asstring;
WorkflowReviewerSettingsitem=e.InstanceDataasWorkflowReviewerSettings;stringstatus=activity.TaskProperties.ExtendedProperties["TaskStatus"]asstring;if(!string.IsNullOrEmpty(status)&&status=="Approved")vote+=item.VoteRatio;
taskPropertiesList.Add(activity.TaskProperties);
6. CodeActivity1设置While循环结束的条件,并且对taskReplicator进行重新赋值
finished=step>step_total;if(!finished&&step>0)
{
replicatorTask.InitialChildData=GetWorkflowStepSettings(workflowProperties.Web,workflow_name,step);
}
有了上面这些并不复杂的代码,我们就有了运转一个通用工作流的能力。工作流发布到SharePoint上就可以开始使用了。
接下来,下一节来看看这个工作流的具体运转情况。
在BI,SharePoint,工作流领域,我们服务过众多的国际国内大企业:
1. 西门子中国:BI项目与SharePoint门户
2. Nokia:BI项目与SharePoint门户
3. 中国人寿:BI & 工作流
4. 与狼共舞:BI门户
5. 玫琳凯:BI项目
6. 美国微软:BI项目
等等
java多级审批流程_[SharePoint 工作流] 如何设计一个通用的多级多审核工作流程(三):工作流开发...