代码改变世界

SharePoint Designer + InfoPath 可循环回退工作流

2012-01-29 15:46  空新蔡  阅读(1549)  评论(5编辑  收藏  举报

实现可以循环回退的工作流,我们使用到Task Action->Start Custom Task Process(点击可见前一篇描叙Custom Task)

使用到Task Behavior Action->Append Task.

故名思意 Append Task 表示给某某用户追加一个任务,追加什么Task呢,追加当前Task.

它会给追加的用户在本任务完成但未结束的时候添加一个相同的任务,但是新产生的任务的生命周期

和父Task(姑且这么称呼)生命周期不太一样。它会重复父Task的三个阶段

Before a Task is Assigned -> When a Task Pending -> When a Task Completes。

那么append task 后整个生命周期变为:

When the Task Process Starts-> When the Task Process is Running -> Before a Task is Assigned

-> When a Task Pending -> When a Task Completes -> (Before a Task is Assigned

-> When a Task Pending -> When a Task Completes ->)Check the Completion Conditions ->

When the Task Process Completes

那么这中间的过程不是等同于一个循环嘛,于是我们的循环可回退流程便可以实现了。

 

我的流程 Requester提交申请-》TSG Queue指派一个Owner-》 TSG Handler Confirm Request-》

Support Manger Approval –》CTO Approval –》CFO Approval 

首先我们还是先建一个流程,添加Start Custom Task Process活动。 

设置好三个选项信息,设置第一个任务的用户为TSG Queue,此项为SharePoint User Group. 

然后点击Task Title: [POR][TSG Queue Pick Up]进入定制页面 

我们可以添加需要的Task Form Fields, Task Outcome.

添加一个工作流变量 CurrentProcess. 用来记录现在按照流程来到了哪一个步骤。在When the Task Process Starts中给它赋初值"TSGQueue"

添加一个记录操作的工作流变量ProcessResult

然后在When a Task Completes里面,当TSG Queue完成任务后,我们判断该task的outcome为“Assign TSG Owner”, 然后给 TSG Owner 追加一个任务,于是下一步会给TSG Owner分配一个任务。  

然后记录下ProcessResult=“Assgin TSG Owner”

 

进行下一次Before a Task is Assigned-> When a Task Pending -> When a Task Completes循环

那我们需要在Before a Task is Assigned 设置CurrentProcess.

在Before a Task is Assigned中添加判断

通过前文提到的两个变量,当该循环步骤第二次循环的时候,我们设置CurrentProcess=”TSGHandler”,然后在 When a Task Completes里写下: 

然后接下来都和第一步是一个故事了。

Before a Task is Assigned里添加逻辑: 

When a Task Completes添加逻辑 

那么当Manager审批通过时如上步骤所示,给CTO Append a task.

那么当Manager 拒绝的时候给前一步用户Handler Append a task.

 

最后主要SharePoint Designer逻辑步骤如下:

Before a Task is Assigned里添加逻辑: 

When a Task Completes添加逻辑:

CTO同Manager CFO. 

 

写了这么多,其实实现循环并不难,甚至可以根据你的逻辑任意跳转,只要你逻辑正确,递归正确,实现循环回退是很容易的事。

另外因为每个task毕竟不太一样,你可以通过定制InfoPath Form来实现,比如InfoPath信息以及按钮的显示隐藏,在合适的时间甚至不同的task title。这样你的Task也会是不一样的。

 

 最后我们一直忽略了这循环体中间的一步When a Task Pending。我们是不是该做些什么咧。

那么这里其实可以很方便的发送邮件,并且多个task只要设置这里一个发送就好,十分方便。

 本流程设计非最终版本 可以精简 本文目的只是为了说明该方法可行性