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,只读 |
审批控件的补充说明:审批控件根据IsResponsibl、IsApproveTask、IsReady三个属性判断是否显示审批的四个要素,只有当当前用户又是责任人,又是一个审批任务,并且当前状态又为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);
}
浙公网安备 33010602011771号