K2现在的最新版本0807已经有了任务的代理功能,称之为Out-Of-Office,但是此版以前的版本都是没有提供的,而在我们所做的项目中一般都有这个需求,在这里我不会继承传统习惯把代码发出来,而是把我实现此功能的思路和核心的几句代码说一下,明白人会轻而易举的写出来(恩。。其实我也不是好人。。)。核心的代码如下:

Code
1
this.DeleteOutdateDelegation();
2
DataTable dt = this.GetDelegationList();
3
DataRowCollection rows = dt.Rows;
4
if (rows.Count < 1)
5

{
6
return;
7
}
8
using (Connection conn = this.OpenK2ClientConnection())
9

{
10
foreach (DataRow row in rows)
11
{
12
string from = row["From"].ToString();
13
string to = row["To"].ToString();
14
if (string.IsNullOrEmpty(from) || string.IsNullOrEmpty(to))
15
{
16
continue;
17
}
18
using (Impersonation.Impersonate(from, conn))
19
{
20
Worklist items = conn.OpenWorklist();
21
foreach (WorklistItem item in items)
22
{
23
item.Redirect(to);
24
Helper.SendMail(to, K2_TASKURL);
25
//Log.Write(LogType.Info, "任务" + item.ProcessInstance.Folio + "已从" + from + "转向" + to + "。");
26
System.Threading.Thread.Sleep(5000);
27
}
28
}
29
}
30
}
1) 先使用DeleteOutdateDelegation方法清除已经过期的代理信息(select 需要的字段 from 表 where 已过期)。
2) 使用GetDelegationList方法获取有效的代理信息(select 需要的字段 from 表 where 有效的)。
3) 循环判断每项代理信息的代理人和被代理人,模拟代理人将代理人的任务转发给被代理人,然后给被代理人发送邮件。
做过K2的知道,WorkflowManagementServer中有一个任务转移的方法RedirectWorklistItem(destination, "K2:" + to, procInstId, actInstDestId, itemID),我们一开始就是用的这个来实现转向,不过我们在项目进行中发现这个方法有时候有效有时候却没有效果,后来我用模拟用户然后用客户端的WorklistItem的Redirect来实现这个功能,使用正常。
这个模拟的类也很简单,代码在这里:
1
public class Impersonation : IDisposable
2

{
3
private Connection _conn = null;
4
private Impersonation(Connection conn)
5
{
6
_conn = conn;
7
}
8
public static Impersonation Impersonate(string userName, Connection conn)
9
{
10
conn.ImpersonateUser(userName);
11
return new Impersonation(conn);
12
}
13
public void Dispose()
14
{
15
_conn.RevertUser();
16
}
17
}
GetDelegationList和DeleteOutdateDelegation是对存储数据的执行,比如SQL,我们的项目一般是MOSS+K2的,所以我们的数据一般就存在MOSS的列表里。
就这么简单。当然有的东西有不一样的需求,比如有的客户只需要代理就可以了,有的客户还需要针对流程针对时间段代理,这些我们都可以很容易的实现,SQL语句罢了。
将这些代码放在一个自动执行的程序里就OK,比如Windows Services,当然象MOSS项目可以将他做到MOSS的计划任务里。