RuleDriven是QuickFlow中最复杂功能最强大的一个活动,一直没有给大家介绍,本篇文章就来讲解下RuleDriven活动的使用以及相关的角色提供程序自定义和邮件模板配置。
RuleDriven跟GroupTask一样,都是用来给多个用户分配任务的,它们的区别是:
1)用RuleDriven之前,必须定义流程级别的角色,然后设置RuleDriven引用某个角色
2)RuleDriven可以设置多个Action,多个OutingRule(退出规则),只要任意一个OutingRule满足,活动即结束
3)RuleDriven可以设置任务超时邮件,任务超时时间,任务超时后可以发送某个邮件。
下面我们来看一个简单的示例:一个一步审批的流程,经理审批,可以选择批准和拒绝。
Step1)定义流程级别的角色
在网站中添加一个组,名称为ManagerGroup
打开QuickflowDesigner,点击根上的RoleDefinition属性,弹出流程角色定义窗口,添加一个类型为SPGroupRoleDefinition,名称为ManagerRole的角色,
设置对应的GroupName为ManagerGroup,如下图:
备注:其中的DeptInherits表示部门继承,在部门继承情况下,即使组中有多个用户,任务分配时,只会分配给跟流程启动人部门(AD或UserProfile中的部门)相同的那个用户。
用这个功能可以实现如下场景的需求:多部门情况下的“部门经理审批”,每个部门经理只审批本部门员工提交的申请。
QuickFlow支持三种类型的角色定义:
StaticUserRoleDefinition,静态用户角色,这种角色中的用户是固定的,直接将用户账号写到角色定义中
SPGroupRoleDefinition, 用户组角色,角色用户对应到SharePoint的用户组
CustomRoleDefinition,自定义用户角色,可以通过实现一个接口定义角色用户机制,在本文后面会讲述如何扩展角色用户机制
Step2)添加RuleDriven,关联角色
拖拽一个RoleDriven活动,画线连接Start活动和ruleDriven活动,设置其RoleReference属性为ManagerRole.
然后拖拽两个label活动,名称分别为 同意,拒绝
备注:Lable活动没有任何功能,只是作为流程图上的一个显示元素,是一个虚拟的节点。
Step3)编辑Action
双击ruleDriven活动,弹出编辑窗口,切换到Actions标签,添加两个审批动作:同意,拒绝,然后单击 Generate OutRules按钮
备注:Generate OutRules 会自动按照Action生成对应的OutingRule
Step4)编辑OutingRule
切换到OutingRule标签,可以看到已经自动生成了两个OutingRule。分别设置同意,角色规则的Target为同意和拒绝活动
备注:我们要理解下OutingRule的语义,比如“同意”,默认生成的规则是“至少一个审批结果是同意的即结束活动”,然后转向Target指定的下一个活动。
如果要表达所有人的审批结果都是“同意”,则可以用规则“所有人的审批结果都是同意才结束活动”,如下图:
EnaluateMode可以选择All,AtLeast, AtMost,当选择All时Count属性就没有意义了。
Step5)编辑任务提醒邮件
切换到NotificationMail标签,默认情况下RuleDriven始终会按照默认邮件模板的内容来发送提醒邮件,默认邮件模板的修改见下面的介绍。
我们也可以选择不采用默认邮件模板,取消 Use Default Mail Template复选框,就可以在Subject和Body中输入内容了。如果要在邮件内容中嵌入工作流变量,可以用[%变量名%]的形式,如果要嵌入列表项字段,可以用[%list:字段名%]的形式。
Step6)编辑超时提醒邮件
首先切换到Properties标签,通过Duration属性指定任务超时时间
如果为设置Duration值,则ruleDriven不考虑超时逻辑
然后切换到Duration Mail标签,即可编辑超时提醒邮件
备注:任务超时后,所有未处理的任务都会被自动删除,然后发送超时邮件给相应的操作人,这个超时机制是采用WF默认的Delay活动实现的,实际运行时
时间会有超微的误差。
Step7)完成编辑,发布流程
关闭RuleDriven属性编辑窗口,可以看到ruleDriven自动生成了两条线连接下面两个活动。
用RuleDriven是不需要自己画线的,如果不小心把线删除了,可以用右键菜单中的 Generate Lines重新生成线.
QuickFlow如何自定义角色提供程序
只要实现一个IRoleUserProvider即可。IRoleUserProvider的定义如下:
/// <summary> /// 用户角色提供程序,提供工作流需要的角色和用户信息 /// </summary> public interface IRoleUserProvider { /// <summary> /// 按照用户ID获取用户 /// </summary> /// <param name="web"></param> /// <param name="userId"></param> /// <returns></returns> User GetUser(SPWeb web, int userId); User GetUser(SPWeb web, string account); /// <summary> /// 获取角色用户 /// </summary> /// <param name="web"></param> /// <param name="roleName"></param> /// <returns></returns> IList<User> GetRoleUsers(SPWeb web, string roleName); /// <summary> /// 获取角色属于某部门的用户 /// </summary> /// <param name="web"></param> /// <param name="roleName"></param> /// <param name="dept"></param> /// <returns></returns> IList<User> GetRoleUsers(SPWeb web, string roleName, string dept); /// <summary> /// 获取用户拥有的所有角色 /// </summary> /// <param name="web"></param> /// <param name="userId"></param> /// <returns></returns> string[] GetUserRoles(SPWeb web, int userId); }
将实现此接口的程序集部署到GAC中,然后打开C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\LAYOUTS\QuickFlow目录下的global.config文件,修改CustomRoleUserProvider为自定义的角色提供程序的全名即可。
<GlobalConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <CustomRoleUserProvider>QuickFlow.Core.SPRoleUserProvider,QuickFlow, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ec1e0fe6e1745628</CustomRoleUserProvider> <!--任务代理配置 --> <!--<TaskDelegationProvider>QuickFlow.Core.DefaultTaskDelegationProvider,QuickFlow, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ec1e0fe6e1745628</TaskDelegationProvider>--> <!--if DelegationListSiteUrl is empty, system will use current site--> <!--<DelegationListSiteUrl>http://codeartserver:81/sites/s1</DelegationListSiteUrl>--> <DelegationListUrl>Lists/QuickFlowDelegation</DelegationListUrl> <!--是否对任务启用特殊权限--> <EnableSpecialPermissions>false</EnableSpecialPermissions> <!--具有任务管理权限的组--> <WorkflowAdminGroup>WorkflowAdmin</WorkflowAdminGroup> <EventReceivers> <Receiver Enabled="false" Name="Exception" Type="QuickFlow.EventBus.ExceptionEventReceiver,QuickFlow, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ec1e0fe6e1745628" /> <Receiver Enabled="true" Name="Tracing" Type="QuickFlow.EventBus.TracingEventReceiver,QuickFlow, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ec1e0fe6e1745628" /> </EventReceivers> </GlobalConfiguration>
如何修改默认邮件提醒模板
在C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\LAYOUTS\QuickFlow目录下有两个xml文件,
NotificationMailTemplate.config和DurationMailTemplate.config,修改这两个文件及可以控制默认提醒邮件的内容。
<?xml version="1.0" encoding="utf-8"?> <MailTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Enabled>true</Enabled> <DefaultTemplate>true</DefaultTemplate> <Subject>Workflow task received</Subject> <Body> <![CDATA[ Dear [%global:taskUser%]:<br/> You have a new workflow task. <br/> Item title:[%list:Title%] <br/> Item Created by:[%list:Author%] <br/> Created by:[%list:Author%] <br/> <a href="[%global:taskUrl%]">click here to edit the task</a> <br/> <a href="[%global:webUrl%]">click here to access the site</a> <br/> ]]> </Body> <MailCategory>TaskNotification</MailCategory> </MailTemplate>
_custom.config文件
更新QuickFlow安装包时,NotificationMailTemplate.config和DurationMailTemplate.config会被覆盖成默认内容。为了避免这个问题。可以使用
NotificationMailTemplate_custom.config和DurationMailTemplate_custom.config文件,复制默认的config文件,修改文件名,然后把自定义的邮件模板放到这两个文件中即可
邮件模板支持如下标签
标签 | 作用 |
[%d:fieldName%] or [%list:fieldName%] or [%datafield:fieldName%] |
获取列表字段(DataField)值 |
[%t:fieldName%] or [%task:fieldName%] |
获取任务字段(TaskField) |
[%v:variableName%] or [%variable:variableName%] or [%variable%] |
获取工作流变量 |
[%ctx:taskUrl%] or [%global:taskUrl%] | 获取任务编辑表单路径 |
[%ctx:weburl%] | 获取当前网站URL |
[%ctx:taskuser%] | 获取任务用户名 |
[%ctx:taskuseraccount%] | 获取任务用户账号 |
[%ctx:originator%] | 获取流程发起人名称 |
[%ctx:taskoutcome%] | 获取任务输出(用于单任务活动) |
[%ctx:taskoutcomes%] | 获取任务输出集合, “,”间隔 (用于多任务活动) |
[%ctx:taskactions%] | 获取任务动作集合, “,”间隔 |
[%ctx:tasktitle%] | 获取任务标题 |