zoukankan      html  css  js  c++  java
  • QuickFlow教程(5): RuleDriven活动,角色提供程序自定义,邮件模板

    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%] 获取任务标题
       
  • 相关阅读:
    qrcode在手机上不显示的问题
    css 文本溢出省略号
    css解决字段不换行
    vue小程序ref和v-for结合使用得到ref数组的一些问题
    Nginx CORS 跨域资源共享问题
    基于k8s使用helm安装Jenkins
    nginx通过自定义http header 进行服务转发
    基于Kubernetes部署nacos配置中心
    基于Centos 7.8 和Kubeadm部署k8s高可用集群
    Jenkins学习以及配置
  • 原文地址:https://www.cnblogs.com/jianyi0115/p/1653722.html
Copyright © 2011-2022 走看看