博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Captaris Workflow开发系列(四)

Posted on 2008-05-26 10:02  不规则几何图形  阅读(868)  评论(7)    收藏  举报

4           Teamplate的扩展开发

4.1               为什么要进行扩展开发

为什么要扩展开发,也就时Teamplate的局限性,首先Teamplate在流程角色定义上表现过于简单,跟客户需求相比它没有对流程管理员、流程发起人,流程参与人等角色有明确定义,而且Teamplate提供的标准任务列表控件功能又过于简单,在流程监控,权限控制以及过滤查询方面的功能都不能满足客户的需求,而且又没有流程的流转日志记录,所有上面所描述的这些都是我们进行自定义扩展开发的原因。

4.2               扩展开发的主要工作成果

a)         任务列表User Control

任务列表User Control主要是针对Teamplate提供的TaskList控件的一些不足所做的开发,它在保持原控件功能基础上补充了如下功能:基于用户的区域性动态加载特定的语言资源,目前支持中英文界面、实现了任务列表的过滤功能、实现了流程管理员/发起人/参与人对流程的监控、在任务列表中显示定制的业务数据、对各种角色的权限进行控制、并且扩展了用户对Teamplate用户视图的定制功能。

User Control的应用说明:

TaskList User Control 的属性列表:

属性名称

属性类型

属性说明

SessionToken

string

用户Token,可以不设置

ViewType

string

视图类型具体说明参考下文

ShowTaskProperties

bool

是否显示任务属性按钮

ShowViewProperties

bool

是否显示视图属性按钮

ShowProcessColumn

bool

是否显示列表中的Process

ShowFormNoColumn

bool

是否显示列表中的Process

bool

可以定义列表中的每一列是否显示

ShowDueDateColumn

bool

是否显示列表中的Process

ShowDetailColumn

bool

是否显示列表中的Detail

DetailColumnTitle

string

定制Detail列标题

ShowFilter

bool

是否显示过滤框

PageSize

int

列表中每页显示记录条数

ViewType (视图类型)说明:

对应视图

1

Inbox(待办任务)

2

Outbox(已办任务)

3

Overdue(过期任务)

4

Urgent(紧急任务)

5

其它自定义视图

其它自定义视图

Sample:采购模块的任务列表

<uc1:TaskListCtrl id=TaskListCtrl1 ViewType="6" PageSize=10 ShowCategoryColumn=false ShowCompletionDateColumn=false ShowDetailColumn=true DetailColumnTitle="Supplier" runat="server"></uc1:TaskListCtrl>

b)        审批控件User Control

审批控件主要功能包括:审批要素和日志的保存、审批日志的显示等功能;

Approve User Control的属性列表:

属性名称

属性类型

属性说明

CurrentUser

string

当前登录用户,必须设置

PID

Int

任务ProcessID,必须设置

TID

Int

任务TaskID,必须设置

IsResponsibl

bool

是否任务的责任人,只读

IsApproveTask

bool

是否审批任务,必须设置

IsReady

bool

任务状态是否为Ready,只读

审批控件的补充说明:审批控件根据IsResponsiblIsApproveTaskIsReady三个属性判断是否显示审批的四个要素,只有当当前用户又是责任人,又是一个审批任务,并且当前状态又为Ready时,审批控件才可以审批,否则只显示审批日志供用户查看

c)        审批日志和关系保存对象(ProcessRelationLog

这个类主要实现审批日志和关系的保存;

对象成员:

属性:

属性名称

属性类型

属性说明

ProcessID

string

Process ID,必须设置

TaskID

string

Task ID,必须设置

LogonName

string

用户登录名,必须设置

UserID

string

用户ID,只读

DisplayName

string

用户的显示名

Type

string

关系类型,必须设置

Source

string

流程发起人

FormNo

string

流程刘水号

Dept

string

部门信息

Category

string

类别

Description

string

描述

Detail

string

细节内容

Others

string

其它业务信息

补充说明:从Source起往下的属性是用于保存流程的业务信息,如果客户有需要,可选择相应的属性保存,不需要的属性允许为空,可不予理会。

方法:

方法名称

属性说明

AddTaskRelation

保存任务关系

WriteLog

写日志

Sample:下面的这个例子是我们在做精量项目时使用的一个调用工作流流转程序的基类,在这个基类当中的流程流转方法中我加入了写日志和任务关系的代码(代码中突出显示的部分),做为本文的最后一个Sample,请大家仔细研究。

namespace Workflow.Web

{

     ///<summary>

     /// GenericWorkflow 的摘要说明。

    
///</summary>

     public class GenericWorkflow : System.Web.UI.Page

     {

           public GenericWorkflow ()

           {

           }

           protected void LoadBindingData(BProcess process)

           {

                BProcess pro = null;

                try

                {

                     if(process == null)

                     {

                           pro = this.LoadProcess();

                     }

                     else

                     {

                           pro = process;

                     }

                     this.LoadData(pro);

                }

                catch(Exception ex)

                {

                     throw ex;

                }

                finally

                {

                     if(process == null && pro != null)

                     {

                           pro.Dispose();

                           pro = null;

                     }

                }

           }

           protected BProcess LoadProcess()

           {

                int taskId;

                int processId;

                string token;

                BProcess process = new BProcess();

                try

                {

                     taskId = Convert.ToInt32(Request.QueryString["TID"]);

                     processId = Convert.ToInt32(Request.QueryString["PID"]);

                     token = Request.QueryString["token"];

                     if (token==null || taskId==0)

                     {

                           throw new Exception("Error, Invalid process id or token!");

                     }

                     process.SetSessionToken(token);

                     process.Load(processId);

                }

                catch(Exception ex)

                {

                     throw ex;

                }

                return process;

           }

           protected virtual void LoadData(BProcess process)

           {

           }

           protected void CompleteTask(System.Web.UI.Page page)

           {

                int taskId = Convert.ToInt32(Request.QueryString["TID"]);

                int processId = Convert.ToInt32(Request.QueryString["PID"]);

                string token = Request.QueryString["TOKEN"];

                BProcess process = null;

                ProcessRelationLog relationlog = new ProcessRelationLog();

                try

                {

                     process = new BProcess();

                     process.SetSessionToken(token);

                     process.Load(processId);

                     this.SaveBindingData(process);

                     process.WorkflowAdvance(taskId, null);

                     this.SaveRelationLog(relationlog, process);

                }

                finally

                {

                     if(process != null)

                     {

                           process.Dispose();

                           process = null;

                     }

                }

           }

           //由继承的窗体完成关系和日志信息的赋值

           protected virtual void SaveRelationLog(ProcessRelationLog relationlog, BProcess process)

           {

                relationlog.AddTaskRelation();

                relationlog.WriteLog();

           }

           protected void SaveBindingData(BProcess process)

           {

                BProcess pro = null;

                try

                {

                     if(process == null)

                     {

                           pro = this.LoadProcess();

                     }

                     else

                     {

                           pro = process;

                     }

                     this.SaveData(pro);

                }

                catch(Exception ex)

                {

                     throw ex;

                }

                finally

                {

                     if(process == null && pro != null)

                     {

                           pro.Dispose();

                           pro = null;

                     }

                }

           }

           protected virtual void SaveData(BProcess process)

           {

           }

           protected void closeWindow(System.Web.UI.Page page)

           {

                string client;

                client = page.Request.ServerVariables["HTTP_USER_AGENT"];

                int index = client.IndexOf("Windows CE", 0);

                if(index == -1)

                {

                     this.RegisterClientScriptBlock("tpCloseAndReloadParentWindow","<script language=JavaScript> opener.window.location.replace(opener.window.location.href); window.close();</script>");

                }

           }

     }

}

//使用这个基类例子代码片断

           protected override void SaveRelationLog(TeamplateLib.ProcessRelationLog relationlog, BProcess process)

           {

                relationlog.TaskID =Request.QueryString["TID"].ToString();

                relationlog.ProcessID = Request.QueryString["PID"].ToString();

                relationlog.LogonName = this.CurrentUser;

                relationlog.DisplayName = this.ApproveControl1.lblApproverDisName.Text;

                relationlog.Type = "Actor";

                relationlog.Source = process.GetTextValue("Common","Root/Request/RequestBy");

                relationlog.Dept = process.GetTextValue("Common","Root/Request/Dept");

                relationlog.FormNo ="Purchase Request";

                relationlog.Detail =process.GetTextValue("Common","Root/Request/Supplier");

                relationlog.Description =process.GetTextValue("Common","Root/Request/Description");

                switch (this.ApproveControl1.ddlApproveStatus.SelectedValue)

                {

                     case "1":

                           relationlog.ApproveStatus = "Approved";

                           break;

                     case "2":

                           relationlog.ApproveStatus = "Declined";

                           break;

                     case "3":

                           relationlog.ApproveStatus = "Cancelled";

                           break;

                }         

                relationlog.ApproveComment = this.ApproveControl1.txtComment.Text;

                relationlog.ApproveRemark = this.ApproveControl1.txtApproveRemark.Text;

                base.SaveRelationLog (relationlog, process);

           }