RuleDriven是QuickFlow中最复杂功能最强大的一个活动,一直没有给大家介绍,本篇文章就来讲解下RuleDriven活动的使用以及相关的角色提供程序自定义和邮件模板配置。

RuleDriven跟GroupTask一样,都是用来给多个用户分配任务的,它们的区别是:

1)用RuleDriven之前,必须定义流程级别的角色,然后设置RuleDriven引用某个角色

2)RuleDriven可以设置多个Action,多个OutingRule(退出规则),只要任意一个OutingRule满足,活动即结束

3)RuleDriven可以设置任务超时邮件,任务超时时间,任务超时后可以发送某个邮件。

下面我们来看一个简单的示例:一个一步审批的流程,经理审批,可以选择批准和拒绝。

Step1)定义流程级别的角色

在网站中添加一个组,名称为ManagerGroup

image

打开QuickflowDesigner,点击根上的RoleDefinition属性,弹出流程角色定义窗口,添加一个类型为SPGroupRoleDefinition,名称为ManagerRole的角色,

设置对应的GroupName为ManagerGroup,如下图:

image

备注:其中的DeptInherits表示部门继承,在部门继承情况下,即使组中有多个用户,任务分配时,只会分配给跟流程启动人部门(AD或UserProfile中的部门)相同的那个用户。

用这个功能可以实现如下场景的需求:多部门情况下的“部门经理审批”,每个部门经理只审批本部门员工提交的申请。

QuickFlow支持三种类型的角色定义:

StaticUserRoleDefinition,静态用户角色,这种角色中的用户是固定的,直接将用户账号写到角色定义中

SPGroupRoleDefinition, 用户组角色,角色用户对应到SharePoint的用户组

CustomRoleDefinition,自定义用户角色,可以通过实现一个接口定义角色用户机制,在本文后面会讲述如何扩展角色用户机制

image

Step2)添加RuleDriven,关联角色

拖拽一个RoleDriven活动,画线连接Start活动和ruleDriven活动,设置其RoleReference属性为ManagerRole.

image

然后拖拽两个label活动,名称分别为 同意,拒绝

image

备注:Lable活动没有任何功能,只是作为流程图上的一个显示元素,是一个虚拟的节点。

Step3)编辑Action

双击ruleDriven活动,弹出编辑窗口,切换到Actions标签,添加两个审批动作:同意,拒绝,然后单击 Generate OutRules按钮

image

备注:Generate OutRules 会自动按照Action生成对应的OutingRule

Step4)编辑OutingRule

切换到OutingRule标签,可以看到已经自动生成了两个OutingRule。分别设置同意,角色规则的Target为同意和拒绝活动

image

备注:我们要理解下OutingRule的语义,比如“同意”,默认生成的规则是“至少一个审批结果是同意的即结束活动”,然后转向Target指定的下一个活动。

如果要表达所有人的审批结果都是“同意”,则可以用规则“所有人的审批结果都是同意才结束活动”,如下图:

image

EnaluateMode可以选择All,AtLeast, AtMost,当选择All时Count属性就没有意义了。

Step5)编辑任务提醒邮件

切换到NotificationMail标签,默认情况下RuleDriven始终会按照默认邮件模板的内容来发送提醒邮件,默认邮件模板的修改见下面的介绍。

我们也可以选择不采用默认邮件模板,取消 Use Default Mail Template复选框,就可以在Subject和Body中输入内容了。如果要在邮件内容中嵌入工作流变量,可以用[%变量名%]的形式,如果要嵌入列表项字段,可以用[%list:字段名%]的形式。

image image

Step6)编辑超时提醒邮件

首先切换到Properties标签,通过Duration属性指定任务超时时间

如果为设置Duration值,则ruleDriven不考虑超时逻辑

image

然后切换到Duration Mail标签,即可编辑超时提醒邮件

image

备注:任务超时后,所有未处理的任务都会被自动删除,然后发送超时邮件给相应的操作人,这个超时机制是采用WF默认的Delay活动实现的,实际运行时

时间会有超微的误差。

Step7)完成编辑,发布流程

关闭RuleDriven属性编辑窗口,可以看到ruleDriven自动生成了两条线连接下面两个活动。

image

用RuleDriven是不需要自己画线的,如果不小心把线删除了,可以用右键菜单中的 Generate Lines重新生成线.

image

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%] 获取任务标题
   
posted on 2010-01-21 22:59  jianyi  阅读(2374)  评论(35编辑  收藏  举报