/// <summary> /// 更新流程变量 /// </summary> /// <param name="sn">流程SN</param> /// <param name="nvcDataFields">要更新的变量</param> public static void UpdateProcessDataFields(string sn, string currentUser, CDataFields dataFields) { using (Connection conn = new Connection()) { try { ConnectionSetup conSetup = GetConnectionSetup(); conn.Open(conSetup); conn.RevertUser(); conn.ImpersonateUser(currentUser); WorklistItem listItem = conn.OpenWorklistItem(sn); SetDataFields(listItem, dataFields); listItem.ProcessInstance.Update(); } catch { throw; } finally { try { conn.RevertUser(); } catch { } if (conn != null) { conn.Close(); } } } }
/// <summary> /// 更新流程变量 /// </summary> /// <param name="sn">流程实例ID</param> /// <param name="nvcDataFields">要获取的变量的List</param> /// <returns>变量的List</returns> public static void GetProcessDataFields(int procInstID, CDataFields dataFields) { using (Connection conn = new Connection()) { try { ConnectionSetup conSetup = GetConnectionSetup(); conn.Open(conSetup); ProcessInstance procInst = conn.OpenProcessInstance(procInstID); GetDataFields(procInst, dataFields); } catch { throw; } finally { try { conn.RevertUser(); } catch { } if (conn != null) { conn.Close(); } } } }
public static bool UpdateDataFieldsByWorkflowId(int wfId, NameValueCollection nvcDataFields) { using (Connection conn = new Connection()) { bool result = false; try { conn.Open(K2ServerName, GetConnString()); conn.RevertUser(); conn.ImpersonateUser(@"Founder\zybpmadmin"); ProcessInstance inst = conn.OpenProcessInstance(wfId); for (int i = 0; i < nvcDataFields.Count; i++) { inst.DataFields[nvcDataFields.GetKey(i)].Value = nvcDataFields[i]; } inst.Update(); result = true; } catch { throw; } finally { conn.Close(); } return(result); } }
public static bool GetActivityDataField(string sn, string fieldName, string UserAccount, out string value) { using (Connection conn = new Connection()) { try { conn.Open(K2ServerName, GetConnString()); conn.RevertUser(); conn.ImpersonateUser(UserAccount); WorklistItem wlItem = conn.OpenWorklistItem(sn); value = wlItem.ActivityInstanceDestination.DataFields[fieldName].Value.ToString(); return(true); } catch { value = ""; return(false); } finally { conn.Close(); } } }
/// <summary> /// strat process instance /// </summary> /// <param name="processName">process full name</param> /// <param name="folio">process folio</param> /// <param name="nvcDataFields">process data fields</param> /// <returns>start process instance successfully or not</returns> public static bool StartProcess(string processName, string folio, NameValueCollection nvcDataFields) { using (Connection conn = new Connection()) { bool result = false; try { conn.Open(K2ServerName, GetConnString()); conn.RevertUser(); conn.ImpersonateUser(CurrentUser); ProcessInstance procInst = conn.CreateProcessInstance(processName); if (nvcDataFields != null) { for (int i = 0; i < nvcDataFields.Count; i++) { procInst.DataFields[nvcDataFields.GetKey(i)].Value = nvcDataFields[i]; } } procInst.Folio = folio; conn.StartProcessInstance(procInst); result = true; } catch { throw; } finally { conn.Close(); } return(result); } }
public static void Sleep(string sn, int second) { SourceCode.Workflow.Client.Connection con = new Connection(); try { ConnectionSetup conSetup = GetConnectionSetup(); con.Open(conSetup); con.ImpersonateUser(_CurrentUser); SourceCode.Workflow.Client.WorklistItem listItem = con.OpenWorklistItem(sn); listItem.Sleep(true, second); } catch (Exception ex) { // TODO: throw? throw ex; } finally { try { con.RevertUser(); } catch { throw; } if (con != null) { con.Close(); } } }
public static bool ApproveProcess(string sn, string action, string currentUser) { using (Connection conn = new Connection()) { bool result = false; try { conn.Open(K2ServerName, GetConnString()); conn.RevertUser(); conn.ImpersonateUser(currentUser); WorklistItem wlItem = conn.OpenWorklistItem(sn); wlItem.Actions[action].Execute(); result = true; } catch { throw; } finally { conn.Close(); } return(result); } }
/// <summary> /// /// </summary> /// <param name="sn"></param> /// <param name="FieldNames"></param> /// <returns></returns> public static Dictionary <string, string> GetDataField(string sn, string[] FieldNames, string UserAccount) { using (Connection conn = new Connection()) { try { conn.Open(K2ServerName, GetConnString()); conn.RevertUser(); conn.ImpersonateUser(UserAccount); WorklistItem wlItem = wlItem = conn.OpenWorklistItem(sn); Dictionary <string, string> dictionary = new Dictionary <string, string>(); foreach (string fieldName in FieldNames) { dictionary.Add(fieldName, wlItem.ProcessInstance.DataFields[fieldName].Value.ToString()); } return(dictionary); } catch { throw; } finally { conn.Close(); } } }
/// <summary> /// 加签 /// </summary> /// <param name="sn"></param> /// <param name="Account"></param> /// <param name="nextUser"></param> public static void ForwardToNextApprover(string sn, string Account, string nextUser) { using (Connection conn = new Connection()) { try { conn.Open(K2ServerName, GetConnString()); conn.RevertUser(); conn.ImpersonateUser(Account); WorklistItem wli = conn.OpenWorklistItem(sn); string addApproversBy = wli.ActivityInstanceDestination.DataFields["AddApproversBy"].Value.ToString(); addApproversBy += Account + ";"; wli.ActivityInstanceDestination.DataFields["AddApproversBy"].Value = addApproversBy; wli.Actions["更新"].Execute(); wli.Redirect(nextUser); } catch { throw; } finally { conn.Close(); } } }
/// <summary> /// 获取反加签处理人 /// </summary> /// <param name="sn"></param> /// <param name="Account"></param> public static string GetBackToPreApproverUser(string sn, string Account) { using (Connection conn = new Connection()) { try { conn.Open(K2ServerName, GetConnString()); conn.RevertUser(); conn.ImpersonateUser(Account); WorklistItem wli = conn.OpenWorklistItem(sn); string addApproversBy = wli.ActivityInstanceDestination.DataFields["AddApproversBy"].Value.ToString(); string[] arrPreApprovers = addApproversBy.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); string lastPreApprover = arrPreApprovers[arrPreApprovers.Length - 1]; return(lastPreApprover); } catch { return(""); } finally { conn.Close(); } } }
/// <summary> /// 审批流程 /// </summary> /// <param name="sn">流程SN,必选</param> /// <param name="action">流程操作,为空则默认执行第0个操作</param> /// <param name="folio">流程编码,可选</param> /// <param name="dataFields">流程变量,必选</param> public static void ExecuteProcess(string sn, string action, string folio, string currentUser, CDataFields dataFields) { using (Connection conn = new Connection()) { try { ConnectionSetup conSetup = GetConnectionSetup(); conn.Open(conSetup); conn.RevertUser(); conn.ImpersonateUser(currentUser); SourceCode.Workflow.Client.WorklistItem listItem = conn.OpenWorklistItem(sn); SetDataFields(listItem, dataFields); if (!string.IsNullOrEmpty(folio)) { listItem.ProcessInstance.Folio = folio; } if (!string.IsNullOrEmpty(action)) { listItem.Actions[action].Execute(); } else { listItem.Actions[0].Execute(); } } catch { // TODO: throw? throw; } finally { try { conn.RevertUser(); } catch { } if (conn != null) { conn.Close(); } } } }
/// <summary> /// 发起流程 /// </summary> /// <param name="processName">流程名称:Project\Process1</param> /// <param name="folio">流程编码</param> /// <param name="nvcDataFields">流程变量</param> /// <returns>流程实例ID</returns> public static int StartProcess(string processName, string currentUser, string folio, CDataFields dataFields) { using (Connection conn = new Connection()) { int procInstID = -1; try { ConnectionSetup conSetup = GetConnectionSetup(); conn.Open(conSetup); conn.RevertUser(); conn.ImpersonateUser(currentUser); ProcessInstance procInst = conn.CreateProcessInstance(processName); SetDataFields(procInst, dataFields); if (string.IsNullOrEmpty(folio)) { folio = System.DateTime.Now.ToString(); } procInst.Folio = folio; conn.StartProcessInstance(procInst); procInstID = procInst.ID; } catch { throw; } finally { try { conn.RevertUser(); } catch { } if (conn != null) { conn.Close(); } } return(procInstID); } }
public ResultModel ReAssign(string sn, int assignFrom, int assignTo, out string activityName, out string processCode, out int procInstID) { Connection k2Connect = null; WorklistItem workList = null; ResultModel jr = new ResultModel() { Code = ResultCode.Fail }; activityName = string.Empty; processCode = string.Empty; procInstID = 0; try { k2Connect = new Connection(); k2Connect.Open(ConfigurationManager.AppSettings["K2Server"], ConfigurationManager.AppSettings["K2LoginString"]); k2Connect.ImpersonateUser(SecurityLable(assignFrom.ToString())); workList = k2Connect.OpenWorklistItem(sn); if (workList != null) { workList.Redirect(SecurityLable(assignTo.ToString())); jr.Code = ResultCode.Sucess; jr.Msg = ""; activityName = workList.ActivityInstanceDestination.Name; processCode = workList.ProcessInstance.DataFields["ProcessCode"].Value.ToString(); procInstID = workList.ProcessInstance.ID; } } catch (Exception ex) { jr.Msg = ex.Message; } finally { if (workList != null) { if (workList.Status == WorklistStatus.Open) { try { k2Connect.RevertUser(); workList.Release(); } catch { } } } if (k2Connect != null) { k2Connect.Close(); } } return(jr); }
public static void GetSCFProcessInfo(string sn, ref string FormID, ref string ProcessID, ref string activityName, ref string approveXML) { using (Connection conn = new Connection()) { try { conn.Open(K2ServerName, GetConnString()); conn.RevertUser(); conn.ImpersonateUser(CurrentUser); WorklistItem wlItem = conn.OpenWorklistItem(sn); //edit by lee 2011-06-15 FormID = wlItem.ProcessInstance.Folio; ProcessID = wlItem.ProcessInstance.ID.ToString(); //ProcessID = wlItem.ProcessInstance.DataFields["ProcessID"].Value.ToString(); //if (wlItem.ProcessInstance.DataFields["ApprovalXML"] != null) // approveXML = wlItem.ProcessInstance.DataFields["ApprovalXML"].Value.ToString(); activityName = wlItem.ActivityInstanceDestination.Name; //添加获取自定义流程XML方法 //foreach (DataField dataField in wlItem.ProcessInstance.DataFields) //{ // if (dataField.Name == "ApprovalXML") // { // approveXML = dataField.Value.ToString(); // break; // } //} if (wlItem.ProcessInstance.DataFields.Count > 0) { approveXML = wlItem.ProcessInstance.DataFields[0].Value.ToString(); } else { approveXML = string.Empty; } } catch { throw; } finally { conn.Close(); } } }
/// <summary> /// update some data field of the current process /// </summary> /// <param name="sm">update some data field</param> /// <param name="list">new data field value</param> /// <returns>is success</returns> public static bool UpdateDataFields(string sn, NameValueCollection nvcDataFields, string currentUser) { using (Connection conn = new Connection()) { bool result = false; try { conn.Open(K2ServerName, GetConnString()); conn.RevertUser(); if (currentUser == "") { conn.ImpersonateUser(CurrentUser); } else { conn.ImpersonateUser(currentUser); } //WorklistItem wlItem = wlItem = conn.OpenWorklistItem(sn); //for (int i = 0; i < nvcDataFields.Count; i++) //{ // wlItem.ProcessInstance.DataFields[nvcDataFields.GetKey(i)].Value = nvcDataFields[i]; //} //wlItem.ProcessInstance.Update(); ProcessInstance inst = conn.OpenProcessInstance(Convert.ToInt32(sn.Split('_')[0])); for (int i = 0; i < nvcDataFields.Count; i++) { inst.DataFields[nvcDataFields.GetKey(i)].Value = nvcDataFields[i]; } inst.Update(); result = true; } catch { throw; } finally { conn.Close(); } return(result); } }
public static void Delegate(string sn, string targetUser) { SourceCode.Workflow.Client.Connection con = new Connection(); try { ConnectionSetup conSetup = GetConnectionSetup(); con.Open(conSetup); con.ImpersonateUser(_CurrentUser); SourceCode.Workflow.Client.WorklistItem listItem = con.OpenWorklistItem(sn); listItem.Release(); Destination dest = new Destination(); dest.DestinationType = DestinationType.User; for (int i = 0; i < listItem.Actions.Count; i++) { dest.AllowedActions.Add(listItem.Actions[i].Name); } dest.Name = targetUser; listItem.Delegate(dest); DBManager.AddWorkListLog(_CurrentUser, targetUser, listItem.SerialNumber, listItem.ProcessInstance.ID, listItem.ActivityInstanceDestination.ID, "Delegate", _CurrentUser); } catch (Exception ex) { // TODO: throw? throw ex; } finally { try { con.RevertUser(); } catch { throw; } if (con != null) { con.Close(); } } }
//impersonating another user samples public static void ImpersonateSamples() { //we will wrap the connection into a using statement to ensure it is disposed properly using (Connection K2Conn = new Connection()) { //you must first establish a connection with the current credentials (or specific credentials) before you can impersonate K2Conn.Open("[servername]"); //once you have connected to K2, you can impersonate another user, PROVIDED that the connected account //has the "Impersonate" permission on the K2 environment K2Conn.ImpersonateUser("[securityLabelName]:[username]"); //example: K2Conn.ImpersonateUser("K2:domain\username"); //now that you have impersonated a user, you can perform actiosn on behalf of that user. here we will retrieve that user's worklist Worklist K2WL = K2Conn.OpenWorklist(); //do something with the impersonated user's worklist //when you are done impersonating, you can revert to the original user account K2Conn.RevertUser(); } }
public static void Approve(string sn, string action, NameValueCollection dataFields) { SourceCode.Workflow.Client.Connection con = new Connection(); try { ConnectionSetup conSetup = GetConnectionSetup(); con.Open(conSetup); con.ImpersonateUser(_CurrentUser); SourceCode.Workflow.Client.WorklistItem listItem = con.OpenWorklistItem(sn); listItem.Release(); if (dataFields != null) { for (int i = 0; i < dataFields.Count; i++) { string key = dataFields.GetKey(i).ToString(); string value = dataFields[key].ToString(); listItem.ProcessInstance.DataFields[key].Value = value; } } listItem.Actions[action].Execute(); } catch (Exception ex) { // TODO: throw? throw ex; } finally { try { con.RevertUser(); } catch { } if (con != null) { con.Close(); } } }
/// <summary> /// approve process instance /// </summary> /// <param name="sn">serial number</param> /// <param name="action">approval action</param> /// <returns>approve process instance successfully or not</returns> public static bool ApproveProcess(string sn, string action) { using (Connection conn = new Connection()) { bool result = false; try { conn.Open(K2ServerName, GetConnString()); conn.RevertUser(); conn.ImpersonateUser(CurrentUser); WorklistItem wlItem = conn.OpenWorklistItem(sn); wlItem.Actions[action].Execute(); result = true; } catch (Exception ex) { if (ex.Message.StartsWith("24411")) { return(false); } else if (ex.Message.StartsWith("26030")) { return(false); } else { throw; } } finally { conn.Close(); } return(result); } }
/// <summary> /// get value of data field of current process /// </summary> /// <param name="sn">serial number</param> /// <param name="FieldName">name of the data field</param> /// <returns>value of the specified data field</returns> public static string GetDataField(string sn, string FieldName) { using (Connection conn = new Connection()) { try { conn.Open(K2ServerName, GetConnString()); conn.RevertUser(); conn.ImpersonateUser(CurrentUser); WorklistItem wlItem = wlItem = conn.OpenWorklistItem(sn); return(wlItem.ProcessInstance.DataFields[FieldName].Value.ToString()); } catch { throw; } finally { conn.Close(); } } }
public static Worklist GetWorklistItem(string account) { using (Connection conn = new Connection()) { Worklist wlt = null; try { conn.Open(K2ServerName, GetConnString()); conn.RevertUser(); conn.ImpersonateUser(account); wlt = conn.OpenWorklist(); } catch { throw; } finally { conn.Close(); } return(wlt); } }
/// <summary> /// 根据流水号 和 员工AD账号返回WorklistItem /// </summary> /// <param name="sn"></param> /// <returns></returns> public static WorklistItem GetWorklistItemWithSN(string sn, string Account) { using (Connection conn = new Connection()) { WorklistItem retitem = null; try { conn.Open(K2ServerName, GetConnString()); conn.RevertUser(); conn.ImpersonateUser(Account); retitem = conn.OpenWorklistItem(sn); } catch { throw; } finally { conn.Close(); } return(retitem); } }
public static void GetProcessInfo(string sn, ref string processId, ref string viewFlow) { using (Connection conn = new Connection()) { try { conn.Open(K2ServerName, GetConnString()); conn.RevertUser(); conn.ImpersonateUser(CurrentUser); WorklistItem wlItem = conn.OpenWorklistItem(sn); processId = wlItem.ProcessInstance.ID.ToString(); viewFlow = wlItem.ProcessInstance.ViewFlow; } catch { throw; } finally { conn.Close(); } } }
/// <summary> /// 挂起 /// </summary> /// <param name="sn"></param> /// <param name="sourceUser"></param> /// <param name="second"></param> public static void SleepWorkListItem(string sn, string sourceUser, int second) { using (Connection conn = new Connection()) { try { ConnectionSetup conSetup = GetConnectionSetup(); conn.Open(conSetup); conn.ImpersonateUser(sourceUser); SourceCode.Workflow.Client.WorklistItem listItem = conn.OpenWorklistItem(sn); listItem.Sleep(true, second); } catch { // TODO: throw? throw; } finally { try { conn.RevertUser(); } catch { throw; } if (conn != null) { conn.Close(); } } } }
public static void Redirect(string sn, string targetUser) { SourceCode.Workflow.Client.Connection con = new Connection(); try { ConnectionSetup conSetup = GetConnectionSetup(); con.Open(conSetup); con.ImpersonateUser(_CurrentUser); SourceCode.Workflow.Client.WorklistItem listItem = con.OpenWorklistItem(sn); listItem.Release(); listItem.Redirect(targetUser); DBManager.AddWorkListLog(_CurrentUser, targetUser, listItem.SerialNumber, listItem.ProcessInstance.ID, listItem.ActivityInstanceDestination.ID, "Redirect", _CurrentUser); } catch (Exception ex) { // TODO: throw? throw ex; } finally { try { con.RevertUser(); } catch { throw; } if (con != null) { con.Close(); } } }
/// <summary> /// 任务移交 /// </summary> /// <param name="sn">任务SN</param> /// <param name="sourceUser">源用户</param> /// <param name="targetUser">目标用户</param> public static void RedirectWorkListItem(string sn, string sourceUser, string targetUser) { using (Connection conn = new Connection()) { try { ConnectionSetup conSetup = GetConnectionSetup(); conn.Open(conSetup); conn.ImpersonateUser(sourceUser); SourceCode.Workflow.Client.WorklistItem listItem = conn.OpenWorklistItem(sn); listItem.Redirect(targetUser); } catch (Exception ex) { // TODO: throw? throw ex; } finally { try { conn.RevertUser(); } catch { throw; } if (conn != null) { conn.Close(); } } } }
/// <summary> /// 转签 /// </summary> /// <param name="sn"></param> /// <param name="Account"></param> /// <param name="nextUser"></param> public static void ForwardToNextApprover_Change(string sn, string Account, string nextUser) { using (Connection conn = new Connection()) { try { conn.Open(K2ServerName, GetConnString()); conn.RevertUser(); conn.ImpersonateUser(Account); WorklistItem wli = conn.OpenWorklistItem(sn); wli.Actions["更新"].Execute(); wli.Redirect(nextUser); } catch { throw; } finally { conn.Close(); } } }
/// <summary> /// 供代理服务使用 /// </summary> public static void DelegateWorkList() { try { //删除已经过期的代理规则 K2DBHelper.DeleteExpiredDelegations(); //获取有效的代理规则 DataTable DelegationRules = K2DBHelper.GetActiveDelegations().Tables[0]; if (DelegationRules != null && DelegationRules.Rows.Count > 0) { using (Connection conn = new Connection()) { try { ConnectionSetup conSetup = GetConnectionSetup(); conn.Open(conSetup); foreach (DataRow DelegateRule in DelegationRules.Rows) { //获取被代理人的WorkList conn.ImpersonateUser(DelegateRule["FromUserAD"].ToString()); Worklist delegateFromWorkList = conn.OpenWorklist(); if (delegateFromWorkList != null && delegateFromWorkList.Count > 0) { foreach (WorklistItem listItem in delegateFromWorkList) { //选择状态为Available和Open状态的任务 if (listItem.Status == WorklistStatus.Available || listItem.Status == WorklistStatus.Open) { //获取该任务的主流程实例ID int parentProcInstID = K2DBHelper.GetRootParentsID(listItem.ProcessInstance.ID); //获取该任务的主流程实例 ProcessInstance inst = conn.OpenProcessInstance(parentProcInstID); //代理规则中设置的主流程的名称 string delagetionType = DelegateRule["ProcessFullName"].ToString(); //如果代理规则设置的流程名称为All或等主流程的名称 if (delagetionType.Equals("ALL", StringComparison.InvariantCultureIgnoreCase) || delagetionType.Equals(inst.FullName, StringComparison.InvariantCultureIgnoreCase)) { bool ContainsTargetUser = false; string targetUserSL = SecurityLabelName + ":" + DelegateRule["ToUserAD"].ToString(); //重置任务状态为Available,只有Available状态下的任务才有权限代理 listItem.Release(); //判断该任务是否已经代理给targetUser foreach (Destination destuser in listItem.DelegatedUsers) { if (destuser.Name.Equals(targetUserSL, StringComparison.InvariantCultureIgnoreCase)) { ContainsTargetUser = true; break; } } if (!ContainsTargetUser) { //如果该任务是其它人代理给sourceUser的,则sourceUser不能再次代理给targetUser,即禁止传递代理 DataTable DelegationLog = K2DBHelper.GetDelegationsLog(listItem.SerialNumber).Tables[0]; foreach (DataRow dr in DelegationLog.Rows) { if (DelegateRule["FromUserAD"].ToString().Equals(dr["ToUser"].ToString(), StringComparison.InvariantCultureIgnoreCase)) { ContainsTargetUser = true; break; } } } if (!ContainsTargetUser) { Destination dest = new Destination(); dest.DestinationType = DestinationType.User; for (int i = 0; i < listItem.Actions.Count; i++) { dest.AllowedActions.Add(listItem.Actions[i].Name); } dest.Name = targetUserSL; //任务代理 listItem.Delegate(dest); //Todo:给代理人邮件 //Todo:添加代理历史记录 K2DBHelper.AddDelegationsLog(listItem.ProcessInstance.ID, parentProcInstID, listItem.SerialNumber, DelegateRule["FromUserAD"].ToString(), DelegateRule["ToUserAD"].ToString(), "Server"); } } } } } conn.RevertUser(); } } catch { // TODO: throw? throw; } finally { try { conn.RevertUser(); } catch { throw; } if (conn != null) { conn.Close(); } } } } } catch { // TODO: throw? throw; } }
/// <summary> /// 委托代办 /// </summary> /// <param name="sn"></param> /// <param name="sourceUser"></param> /// <param name="targetUser"></param> public static string DelegateWorkListItem(string sn, string sourceUser, string targetUser) { using (Connection conn = new Connection()) { string result = ""; bool ContainsTargetUser = false; try { string targetUserSL = SecurityLabelName + ":" + targetUser; ConnectionSetup conSetup = GetConnectionSetup(); conn.Open(conSetup); conn.ImpersonateUser(sourceUser); SourceCode.Workflow.Client.WorklistItem listItem = conn.OpenWorklistItem(sn); //重置任务状态为Available,只有Available状态下的任务才有权限代理 listItem.Release(); //判断该任务是否已经代理给targetUser foreach (Destination destuser in listItem.DelegatedUsers) { if (destuser.Name.Equals(targetUserSL, StringComparison.InvariantCultureIgnoreCase)) { ContainsTargetUser = true; result = "任务不能重复代理给[" + targetUser + "]"; break; } } if (!ContainsTargetUser) { //如果该任务是其它人代理给sourceUser的,则sourceUser不能再次代理给targetUser,即禁止传递代理 DataTable DelegationLog = K2DBHelper.GetDelegationsLog(listItem.SerialNumber).Tables[0]; foreach (DataRow dr in DelegationLog.Rows) { if (sourceUser.Equals(dr["ToUser"].ToString(), StringComparison.InvariantCultureIgnoreCase)) { ContainsTargetUser = true; result = "该任务由[" + dr["FromUser"].ToString() + "]代理给[" + sourceUser + "]"; break; } } } if (!ContainsTargetUser) { Destination dest = new Destination(); dest.DestinationType = DestinationType.User; for (int i = 0; i < listItem.Actions.Count; i++) { dest.AllowedActions.Add(listItem.Actions[i].Name); } dest.Name = targetUserSL; //代理任务 listItem.Delegate(dest); //Todo:给代理人邮件 //Todo:添加代理历史记录 int parentProcInstID = K2DBHelper.GetRootParentsID(listItem.ProcessInstance.ID); K2DBHelper.AddDelegationsLog(listItem.ProcessInstance.ID, parentProcInstID, sn, sourceUser, targetUser, sourceUser); result = "任务代理成功"; } return(result); } catch { // TODO: throw? throw; } finally { try { conn.RevertUser(); } catch { throw; } if (conn != null) { conn.Close(); } } } }
public ResultModel ReAssign(string sn, int assignFrom, int assignTo, out string activityName, out string processCode, out int procInstID) { Connection k2Connect = null; WorklistItem workList = null; ResultModel jr = new ResultModel() { Code = ResultCode.Fail }; activityName = string.Empty; processCode = string.Empty; procInstID = 0; try { k2Connect = new Connection(); k2Connect.Open(ConfigurationManager.AppSettings["K2Server"], ConfigurationManager.AppSettings["K2LoginString"]); k2Connect.ImpersonateUser(SecurityLable(assignFrom.ToString())); workList = k2Connect.OpenWorklistItem(sn); if (workList != null ) { workList.Redirect(SecurityLable(assignTo.ToString())); jr.Code = ResultCode.Sucess; jr.Msg = ""; activityName = workList.ActivityInstanceDestination.Name; processCode = workList.ProcessInstance.DataFields["ProcessCode"].Value.ToString(); procInstID = workList.ProcessInstance.ID; } } catch (Exception ex) { jr.Msg = ex.Message; } finally { if (workList != null) { if (workList.Status == WorklistStatus.Open) { try { k2Connect.RevertUser(); workList.Release(); } catch { } } } if (k2Connect != null) k2Connect.Close(); } return jr; }
public ResultModel StartProcess(string processName, int loginId, string objectId, string folio, Dictionary<string, string> dataFields,out int procInstId) { Connection k2Connect = null; WorklistItem workList = null; ResultModel jr = new ResultModel() { Code = ResultCode.Fail }; procInstId = 0; try { k2Connect = new Connection(); k2Connect.Open(ConfigurationManager.AppSettings["K2Server"], ConfigurationManager.AppSettings["K2LoginString"]); k2Connect.ImpersonateUser(SecurityLable(loginId.ToString())); //创建实例 ProcessInstance ProcessInst = k2Connect.CreateProcessInstance(processName); if (!string.IsNullOrEmpty(folio)) { ProcessInst.Folio = folio; } #region //赋值datafields foreach (string key in dataFields.Keys) { if (ProcessInst.DataFields[key] != null) { ProcessInst.DataFields[key].Value = dataFields[key]; } } #endregion k2Connect.StartProcessInstance(ProcessInst); procInstId = ProcessInst.ID; jr.Code = ResultCode.Sucess; jr.Msg = procInstId.ToString(); } catch (Exception ex) { jr.Msg = ex.Message; } finally { if (workList != null) { if (workList.Status == WorklistStatus.Open) { try { k2Connect.RevertUser(); workList.Release(); } catch { } } } if (k2Connect != null) k2Connect.Close(); } return jr; //var result = (new K2Service.K2Service()).StartProcess(processCode, loginId, objectId, folio, jsonData, ConfigurationManager.AppSettings["APIKEY"]); }
public ResultModel ApproveK2Process(string sn, int loginId, string actionString, string memo, Dictionary<string, string> dataFields, out string activityName, out string processCode, out int procInstID) { Connection k2Connect = null; WorklistItem workList = null; ResultModel jr = new ResultModel() { Code = ResultCode.Fail }; activityName = string.Empty; processCode = string.Empty; procInstID = 0; try { k2Connect = new Connection(); k2Connect.Open(ConfigurationManager.AppSettings["K2Server"], ConfigurationManager.AppSettings["K2LoginString"]); k2Connect.ImpersonateUser(SecurityLable(loginId.ToString())); workList = k2Connect.OpenWorklistItem(sn); if (workList != null) { #region 更新Datafield if (dataFields != null && dataFields.Count > 0) { ProcessInstance CurrentProcessInst = workList.ProcessInstance; //更新Datafields foreach (string key in dataFields.Keys) { if (CurrentProcessInst.DataFields[key] != null) { if (CurrentProcessInst.DataFields[key].Value.ToString() != dataFields[key]) { CurrentProcessInst.DataFields[key].Value = dataFields[key]; } } } } #endregion #region 审批任务 //批量审批没有actionString,默认第一个操作 if (string.IsNullOrEmpty(actionString)) { if (workList.Actions[0].Name == REJECTACTION) { workList.GotoActivity("流程未通过"); } else if (workList.Actions[0].Name == UNDOACTION) { workList.GotoActivity("流程撤销"); } else { workList.Actions[0].Execute(); } } else { //执行匹配的操作 if (actionString == UNDOACTION) { workList.GotoActivity("流程撤销"); } else if (actionString == REJECTACTION) { workList.GotoActivity("流程未通过"); } else { bool isExcute = false; for (int i = 0; i < workList.Actions.Count; i++) { if (workList.Actions[i].Name == actionString) { workList.Actions[i].Execute(); isExcute = true; break; } } if (!isExcute) { jr.Code = ResultCode.Fail; jr.Msg = string.Format("Action:{0}错误", actionString); return jr; } } } #endregion jr.Code = ResultCode.Sucess; jr.Msg = ""; activityName = workList.ActivityInstanceDestination.Name; processCode = workList.ProcessInstance.DataFields["ProcessCode"].Value.ToString(); procInstID = workList.ProcessInstance.ID; } } catch (Exception ex) { jr.Msg = ex.Message; } finally { if (workList != null) { if (workList.Status == WorklistStatus.Open) { try { k2Connect.RevertUser(); workList.Release(); } catch { } } } if (k2Connect != null) k2Connect.Close(); } return jr; }
public ContinuationAction MessageReceived(ListenerContext e) { // You can inherit from MessageExtendedInformation if you wish, // the likely scenario for this is if you support plugins yourself. var extended = e.ReceivedInformation.Message.GetExtendedInformation <MessageExtendedInformation>(); var replyExtended = extended.Invert(null); string workflowName; if (extended.Message.Title.StartsWith("START: ", StringComparison.OrdinalIgnoreCase)) { workflowName = extended.Message.Title.Substring(7).Trim(); } else { return(ContinuationAction.Continue); // Allow other plugins to execute. } // Get the message body. string body; try { using (var bodyStream = e.ReceivedInformation.Message.OpenView(new ContentType("text/plain"))) { if (bodyStream != null) { // Another plugin may have moved the position within the stream. bodyStream.Seek(0, System.IO.SeekOrigin.Begin); using (var sr = new StreamReader(bodyStream)) { body = sr.ReadToEnd().Trim(); } } else { body = string.Empty; } } } catch { // TODO: Logging etc. return(ContinuationAction.Continue); // Allow other plugins to execute. } // TODO: Get data from the body somehow. // You can also look into attachments for e.g. InfoPath forms: // e.ReceivedInformation.Message.Attachments try { var con = new Connection(); var cs = new ConnectionSetup(); cs.ParseConnectionString(_k2ServerConnectionString); try { Exception lastException = null; con.Open(cs); // AlternateIdentities are identities with the same email // address, most likely due badly configured claims. for (var i = 0; i < e.AlternateIdentities.Length; i++) { var alt = e.AlternateIdentities[i]; string fqn; // Search for a FQN in the identity. if (alt.TryGetValue("Fqn", out fqn)) { try { con.RevertUser(); con.ImpersonateUser(fqn); var pi = con.CreateProcessInstance(workflowName); // TODO: Set data in the workflow. con.StartProcessInstance(pi); // Tell the user the workflow was started. _destination.ReplyTo(e.ReceivedInformation.Message, new MessageBodyReader("text/plain", "Workflow started"), replyExtended); e.ReceivedInformation.Commit(); // Indicate we were able to handle the message. return(ContinuationAction.Halt); // Stop other plugins from executing. } catch (Exception ex) { // TODO: Logging etc. // This isn't nessecarily a complete failure, // one of the other alternate identities may be // able to action this. lastException = ex; } } } string message; if (lastException != null) { // Identities exist, but the user likely doesn't have rights. message = lastException.ToString(); } else { // No identities exist. message = "Could not find a K2 user for your email address."; } message = "The workflow could not be started: " + message; // Respond with the error. _destination.ReplyTo(e.ReceivedInformation.Message, new MessageBodyReader("text/plain", message), replyExtended); e.ReceivedInformation.Commit(); // Indicate we were able to handle the message. return(ContinuationAction.Halt); // Stop other plugins from executing. } finally { if (con != null) { con.Close(); con.Dispose(); } } } catch { // TODO: Logging etc. return(ContinuationAction.Continue); // Allow other plugins to execute. } }
public DataTable GetWorklistItems(Dictionary<string, object> properties, Dictionary<string, object> parameters) { bool impersonate = false; string impersonateUser = ""; ConnectionSetup connectSetup = new ConnectionSetup(); connectSetup.ConnectionString = _connectionString; if (properties.ContainsKey("UserName")) { if (!(string.IsNullOrEmpty(properties["UserName"].ToString()))) { connectSetup.ConnectionString = _connectionstringImpersonate; impersonateUser = properties["UserName"].ToString(); impersonate = true; } else connectSetup.ConnectionString = _connectionString; } WorklistCriteria criteria = null; if (properties.Count > 0) criteria = GetWorklistCriteria(properties); Connection cnn = new Connection(); try { cnn.Open(connectSetup); if (impersonate) cnn.ImpersonateUser(impersonateUser); DataTable dt = GetResultTable(); Worklist worklist; if ((criteria != null) && (criteria.Filters.GetLength(0) > 0)) worklist = cnn.OpenWorklist(criteria); else worklist = cnn.OpenWorklist(); foreach (WorklistItem item in worklist) { DataRow row = dt.NewRow(); row["AllocatedUser"] = item.AllocatedUser; row["Data"] = item.Data; row["ID"] = item.ID; row["Link"] = "<hyperlink><link>" + HttpUtility.HtmlEncode(item.Data) + "</link><display>Open</display></hyperlink>"; row["SerialNumber"] = item.SerialNumber; row["Status"] = item.Status; row["ActivityID"] = item.ActivityInstanceDestination.ActID; row["ActivityInstanceID"] = item.ActivityInstanceDestination.ActInstID; row["ActivityName"] = item.ActivityInstanceDestination.Name; row["Priority"] = item.ActivityInstanceDestination.Priority; row["StartDate"] = item.EventInstance.StartDate; row["ActivityInstanceDestinationID"] = item.ActivityInstanceDestination.ID; row["ProcessInstanceID"] = item.ProcessInstance.ID; row["ProcessFullName"] = item.ProcessInstance.FullName; row["ProcessName"] = item.ProcessInstance.Name; row["Folio"] = item.ProcessInstance.Folio; row["EventInstanceName"] = item.EventInstance.Name; dt.Rows.Add(row); } if (impersonate) cnn.RevertUser(); cnn.Close(); cnn.Dispose(); return dt; } catch (Exception ex) { throw ex; } }