在用K2.net 2003开发Workflow时,我们常常要封装一个K2ROM以对K2流程进行处理.下面就是一个K2流程要用到的最基本的一些操作.
using System;
using System.Collections;
using SourceCode.K2ROM;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace K2ROM


{

/**//// <summary>
/// Summary description for K2Helper.
/// </summary>
public class K2Helper

{
public K2Helper()

{
//
// TODO: Add constructor logic here
//
}


public static string GetConnectionString(string domain, string userName, string password)

{
return string.Format(@"[;];Authenication=Windows;Domain={0};User={1};Password={2}", domain, userName, "Dell1234");
}



/**//// <summary>
/// Authenication
/// </summary>
public static string ConnectionString = "[;];Authenication=Windows;Domain=mstech;User=administrator;Password=Satyam123241";



/**//// <summary>
/// Getting the K2 server name.
/// </summary>
public static string ServerName = ConfigurationManager.AppSettings["K2Server"].ToString();



/**//// <summary>
/// Start a process instance in k2 server.
/// </summary>
/// <param name="processName">Process name</param>
/// <param name="param">Process instance data,stored as a hashtable</param>
/// <returns>Return process instance</returns>
public static ProcessInstance StartProcessInstance(string processName, Hashtable param)

{
Connection con = new Connection();

con.Open(ServerName);
ProcessInstance instance = con.CreateProcessInstance(processName);
IDictionaryEnumerator list = param.GetEnumerator();
while (list.MoveNext())
instance.DataFields[list.Key.ToString()].Value = list.Value;
con.StartProcessInstance(instance);
con.Close();
return instance;

}

/**//// <summary>
/// Submit the result to K2 server.
/// </summary>
/// <param name="item">WorklistItem</param>
/// <param name="isSubmit">Stop or Finish</param>
/// <returns></returns>
public static bool UpdateWorkItem(WorklistItem item, bool isSubmit)

{
if (item == null)
throw new NullReferenceException("WorklitItem item is null!");

if (isSubmit)
item.Finish();
else
item.Update();
return true;
}



/**//// <summary>
/// Redirect the work item to specified person.
/// </summary>
/// <param name="item"></param>
/// <param name="userName"></param>
/// <returns></returns>
public static bool RedirectWorkItem(WorklistItem item, string userName)

{
if (item != null)

{
item.Redirect(userName);
return true;
}
return false;
}



/**//// <summary>
/// Get WorklistItem by serialnumber.
/// </summary>
/// <param name="serialNumber"></param>
/// <returns></returns>
public static WorklistItem GetWorkistItem(string serialNumber)

{
Connection con = new Connection();
con.Open(ServerName);

WorklistItem item = con.OpenWorklistItem(serialNumber, "ASP");
return item;

}


/**//// <summary>
/// Open a server item
/// </summary>
/// <param name="serialNumber"></param>
/// <returns></returns>
public static ServerItem GetServerItem(string serialNumber)

{
Connection con = new Connection();
con.Open(ServerName);
return con.OpenServerItem(serialNumber);
}



/**//// <summary>
/// convert worklist to dataset
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
public static DataTable GetWorklistDataTable(Worklist list)

{
if (list == null || list.Count == 0)
return null;
DataTable dt = CreatWorkListTable();
foreach (WorklistItem item in list)

{
DataRow dr = dt.NewRow();
dr["ProcInstID"] = item.ProcessInstance.ID;
dr["StartDate"] = item.ProcessInstance.StartDate;
dr["SerialNumber"] = item.SerialNumber;
//The id implement alternant opration between K2 DB and Location DB.
dr["WorkItemID"] = item.ProcessInstance.DataFields["WorkItemID"].Value.ToString();
dt.Rows.Add(dr);

}
return dt;
}


/**//// <summary>
/// Creat a datatable to store WorkList.
/// </summary>
/// <returns></returns>
public static DataTable CreatWorkListTable()

{
DataTable dt = new DataTable();
dt.Columns.Add("ProcInstID");
dt.Columns.Add("StartDate");
dt.Columns.Add("SerialNumber");
dt.Columns.Add("WorkItemID");
return dt;
}


/**//// <summary>
/// Get Worklist by criteria.
/// </summary>
/// <param name="criteria"></param>
/// <returns></returns>
public static Worklist GetWorklist(WorklistCriteria criteria)

{
Connection con = new Connection();
con.Open(ServerName);
return con.OpenWorklist(criteria);
}


/**//// <summary>
/// Get Worklist by process name.
/// </summary>
/// <param name="processName"></param>
/// <returns></returns>
public static Worklist GetWorklist(string processName)

{
WorklistCriteria criteria = new WorklistCriteria();
criteria.AddFilterField(WCField.ProcessName, WCCompare.Equal, processName);
return GetWorklist(criteria);
}


/**//// <summary>
/// Get Worklist by process name and activity name.
/// </summary>
/// <param name="processName"></param>
/// <param name="activityName"></param>
/// <returns></returns>
public static Worklist GetWorklist(string processName, string activityName)

{

WorklistCriteria criteria = new WorklistCriteria();
criteria.AddFilterField(WCField.ProcessName, WCCompare.Equal, processName);
criteria.AddFilterField(WCField.ActivityName, WCCompare.Equal, activityName);
return GetWorklist(criteria);
}


/**//// <summary>
/// Stop a process instance by process ID.
/// </summary>
/// <param name="ProcessID"></param>
/// <returns></returns>
public static bool StopProcessInstance(int ProcessID)

{
SourceCode.K2Mng.K2Manager mgr = K2Helper.GetK2Manager();
bool flag = mgr.StopProcessInstances(ProcessID);
mgr.Logout();
return flag;
}


/**//// <summary>
/// Access K2 service as admin.
/// </summary>
/// <returns></returns>
public static SourceCode.K2Mng.K2Manager GetK2Manager()

{
SourceCode.K2Mng.K2Manager mgr = new SourceCode.K2Mng.K2Manager();
try

{
mgr.Login(ConfigurationManager.AppSettings["K2Server"], int.Parse(ConfigurationManager.AppSettings["K2AdminPort"]), ConfigurationManager.AppSettings["K2AdminConnectionString"]);
}
catch (Exception ex)

{
throw new Exception("Access to K2 Server denied!", ex);
}
return mgr;
}
}
}

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义