在上一篇教程中,讲解了如何结合QuickFlow定义工作流表单,本篇将讲解外部代码和工作流内部数据的交互。

很多业务场景下,工作流任务并不是直接发送给固定的一个组或者是固定的一个角色中的用户,哪些用户处理任务需要由上一步的用户动态的指定,或者是有UI层的代码按照逻辑进行计算出来。

QuickFlow的最新版本很好的支持了类似的需求。

最新发布的Build0914这个版本增加了以下功能:

1) 提供RuleDriven活动,实现角色任务分配,邮件提醒,超时自动结束任务,发送超时提醒邮件
2) 角色提供机制可扩展
3) 所有分配任务的活动都支持默认提醒邮件和自定义提醒邮件,邮件模板可统一管理,可以嵌入标签(大家可以在Layouts/QuickFlow下找到相应的邮件模板)
4)可以利用代码从外部向工作流传递操作人账号(或其他数据)

在以下的几篇教程中,将会一一讲解。
 

下面我们还是看本篇的内容。
 

假设我们要实现的需求如下:

经理审批的时候,可以输入下一步审批人的账号。
 

Step1:选中根,在工作流中添加一个变量NextApprover,类型为Names

image

Step2:在工作流对应的列表中添加一个文本类型的字段,名字为NextApprover

Step3:修改经理审批步骤对应的表单,处理ActionsButton的ActionExecuting事件。

Aspx:

<QFL:ListFormControl ID="ListFormControl2" runat="server">
        <uc1:DataView ID="DataView1" runat="server" />
        <br/>
        <table width="735" border="0" align="center" cellpadding="0" cellspacing="0" class="table_stroke">
            <tr>
            <td class="form-label" width="200px">
            审批意见
            </td>
                <td>
                    <QFL:TaskPanel runat="server" ID="task1">
                        <QFL:CommentTaskField runat="server" ID="body" />
                    </QFL:TaskPanel>
                </td>
            </tr>
            <tr>
                <td align="right" colspan="2" class="form-label">
                Next Approvor: <asp:TextBox runat="server" ID="txtNextApprovor" />
                    <QFC:ActionsButton ID="ActionsButton1" runat="server" 
                        onactionexecuting="ActionsButton1_ActionExecuting"></QFC:ActionsButton>
                    <input type="button" onclick="history.back()" value="返回" />
                </td>
            </tr>
        </table>
    </QFL:ListFormControl>
CodeFile:
protected void ActionsButton1_ActionExecuting(object sender, QuickFlow.UI.Controls.ActionEventArgs e)
    {
        QuickFlow.Core.WorkflowContext.Current.DataFields["NextApprovor"] = this.txtNextApprovor.Text;
    }
//注意:这儿操作的DataFields也就是上一步添加到列表中的NextApprovor字段,并不是工作流变量。
//当前版本外部代码并不能直接控制工作流变量,而只能通过列表字段向工作流中传数据。QuickFlow将工作流关联的SPListItem包装为DataFields

Step4:添加一个MultiTask活动,将其User属性绑定到工作流的NextApprovor变量

image

Step5:编写规则,将DataField转换为工作流变量

处理multiTask1活动的BeforeRule:

image

编写规则如下:

image

规则为:

this.NextApprovor = QuickFlow.NameCollection.FromString(this.WorkflowProperties.Item["NextApprovor"].ToString())
QuickFlow.Log.Debug(this.NextApprovor.Count) //C://QuickFlow.log.txt为对应的日志文件。

Step6:设计完成了,最后发布工作流到服务器。

image

看一下经理审批的UI:

image

 

最后要指出的是,本文中的示例一定要基于Quickflow的最新版本,请到以下地址下载:

http://quickflow.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=34627

需要分别下载QuickFlow.wsp和QuickFlowDesigner。

请确保在web.config中的<authorizedTypes>节点下添加:
<authorizedType Assembly="QuickFlow, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ec1e0fe6e1745628"
Namespace="QuickFlow" TypeName="*" Authorized="True" />

<authorizedType Assembly="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
Namespace="System*" TypeName="*" Authorized="True" />

 
后记:

本文介绍的方式是采用DataFields传值 ,DataFields其实是QF对ListItem的包装,然后利用规则将DataFields中的值转换为工作流变量的值。

在最新的QF版本中,支持外部代码直接给工作流变量赋值。
本文中的功能可以利用工作流变量+动态角色+RuleDriven更容易的实现,见:

 http://www.cnblogs.com/jianyi0115/archive/2010/01/28/1658822.html

 

 

posted on 2009-12-14 21:13  jianyi  阅读(3739)  评论(43编辑  收藏  举报