//edit by lee 2012-7-13 //public string ReStartProcess(string sn, string action, string currentUser, string processApproveChain, string infoSource) //{ // try // { // int parentProcInstID = K2DBHelper.GetRootParentsID(Convert.ToInt32(sn.Split('_')[0])); // CDataFields dataFields; // if (!string.IsNullOrEmpty(processApproveChain)) // { // ApprovalChainProcess process = SerializationHelper.Deserialize<ApprovalChainProcess>(processApproveChain); // process.ApprovalChainActivitys[0].ApprovalChainDestination[0].ActionResult = action; // process.ApprovalChainActivitys[0].ApprovalChainDestination[0].ActualUserID = currentUser; // dataFields = new CDataFields("ProcessApprovalChain", SerializationHelper.Serialize(process), "XF"); // K2Helper.UpdateProcessDataFields(parentProcInstID, dataFields); // } // else // { // return "Failed! processApproveChain is empty"; // } // //获取Approve流程中的Destinations // CDataFields dataFieldDestinations = new CDataFields("Destinations", "", "DF"); // K2Helper.GetProcessDataFields(sn, currentUser, dataFieldDestinations); // string xmlDestination = dataFieldDestinations.DataFieldLists[0].Value; // ApprovalChainDestination destinations = SerializationHelper.Deserialize<ApprovalChainDestination>(xmlDestination); // destinations.ActionResult = action; // destinations.ActualUserID = currentUser; // dataFieldDestinations.DataFieldLists[0].Value = SerializationHelper.Serialize(destinations); // K2Helper.ExecuteProcess(sn, "", "", currentUser, dataFieldDestinations); // //更新用以标识用户是否可以取回任务的DataField // K2Helper.UpdateProcessDataFields(parentProcInstID, new CDataFields("CallBackProcInstID", sn.Split('_')[0], "DF")); // K2DBHelper.AddApproveLog(parentProcInstID, Convert.ToInt32(sn.Split('_')[0]), action, processApproveChain, currentUser); // } // catch (Exception ex) // { // K2DBHelper.RecoreErrorProfile(ex, "K2HelperWS.ReStartProcess", currentUser); // return ex.Message; // } // return "Success"; //} public string ReStartProcess(string sn, string action, string currentUser, string processApproveChain, string infoSource) { try { int parentProcInstID = K2DBHelper.GetRootParentsID(Convert.ToInt32(sn.Split('_')[0])); CDataFields dataFields; if (!string.IsNullOrEmpty(processApproveChain)) { ApprovalChainProcess process = SerializationHelper.Deserialize <ApprovalChainProcess>(processApproveChain); process.ApprovalChainActivitys[0].ActionResult = action; process.ApprovalChainActivitys[0].ApprovalChainDestination[0].ActionResult = action; process.ApprovalChainActivitys[0].ApprovalChainDestination[0].ActualUserID = currentUser; process.ApprovalChainActivitys[0].ApprovalChainDestination[0].ApproveChainDestinationUsers[0].Executed = true; process.ApprovalChainActivitys[0].ApprovalChainDestination[0].ApproveChainDestinationUsers[0].ActionResult = action; dataFields = new CDataFields("ProcessApprovalChain", SerializationHelper.Serialize(process), "XF"); K2Helper.UpdateProcessDataFields(parentProcInstID, dataFields); } else { return("Failed! processApproveChain is empty"); } //获取Approve流程中的Destinations CDataFields dataFieldDestinations = new CDataFields("Destinations", "", "DF"); K2Helper.GetProcessDataFields(sn, currentUser, dataFieldDestinations); string xmlDestination = dataFieldDestinations.DataFieldLists[0].Value; ApprovalChainDestination destinations = SerializationHelper.Deserialize <ApprovalChainDestination>(xmlDestination); destinations.ActionResult = action; destinations.ActualUserID = currentUser; dataFieldDestinations.DataFieldLists[0].Value = SerializationHelper.Serialize(destinations); //K2Helper.ExecuteProcess(sn, "", "", currentUser, dataFieldDestinations); //更新用以标识用户是否可以取回任务的DataField K2Helper.UpdateProcessDataFields(parentProcInstID, new CDataFields("CallBackProcInstID", sn.Split('_')[0], "DF")); //edit by lee K2Helper.ExecuteProcess(sn, "", "", currentUser, dataFieldDestinations); K2DBHelper.AddApproveLog(parentProcInstID, Convert.ToInt32(sn.Split('_')[0]), action, processApproveChain, currentUser); } catch (Exception ex) { K2DBHelper.RecoreErrorProfile(ex, "K2HelperWS.ReStartProcess", currentUser); return(ex.Message); } return("Success"); }
public string GetOriginalApproveChain(string sn, string currentUser) { try { //更新用以标识用户是否可以取回任务的DataField int parentProcInstID = K2DBHelper.GetRootParentsID(Convert.ToInt32(sn.Split('_')[0])); K2Helper.UpdateProcessDataFields(parentProcInstID, new CDataFields("CallBackProcInstID", "0", "DF")); //获取Approve流程中的Destinations CDataFields dataFieldLists = new CDataFields("ProcessApprovalChain", "", "XF"); K2Helper.GetProcessDataFields(sn, currentUser, dataFieldLists); return(dataFieldLists.DataFieldLists[0].Value); } catch (Exception ex) { K2DBHelper.RecoreErrorProfile(ex, "K2HelperWS.GetOriginalApproveChain", currentUser); return(null); } }
public string GetCurrentActivityInfo(string sn, string currentUser) { try { //更新用以标识用户是否可以取回任务的DataField int parentProcInstID = K2DBHelper.GetRootParentsID(Convert.ToInt32(sn.Split('_')[0])); K2Helper.UpdateProcessDataFields(parentProcInstID, new CDataFields("CallBackProcInstID", "0", "DF")); //获取Approve流程中的节点信息 CDataFields dataFieldLists = new CDataFields("SubApprovalChain", "", "DF"); K2Helper.GetProcessDataFields(sn, currentUser, dataFieldLists); ApprovalChainActivity activity = SerializationHelper.Deserialize <ApprovalChainActivity>(dataFieldLists.DataFieldLists[0].Value); activity.ApprovalChainDestination = null; return(SerializationHelper.Serialize(activity)); } catch (Exception ex) { K2DBHelper.RecoreErrorProfile(ex, "K2HelperWS.GetCurrentActivityInfo", currentUser); return(null); } }
public string ExecuteProcess(string sn, string action, string currentUser, string activityXML) { try { int parentProcInstID = K2DBHelper.GetRootParentsID(Convert.ToInt32(sn.Split('_')[0])); //获取Approve流程中的Destinations CDataFields dataFieldDestinations = new CDataFields("Destinations", "", "DF"); //获取Approve流程中的节点信息 dataFieldDestinations.AddDataField(new CDataField("SubApprovalChain", "", "DF")); K2Helper.GetProcessDataFields(sn, currentUser, dataFieldDestinations); string xmlDestination = dataFieldDestinations.DataFieldLists[0].Value; string xmlActivity = dataFieldDestinations.DataFieldLists[1].Value; ApprovalChainDestination destinations = SerializationHelper.Deserialize <ApprovalChainDestination>(xmlDestination); ApprovalChainActivity activity = SerializationHelper.Deserialize <ApprovalChainActivity>(xmlActivity); //权重类型 string actionWeightType = activity.ActionWeightType; if (actionWeightType == "") { actionWeightType = "N"; } //如果权重类型是百分比的情况下并且执行的操作不是Approve,则默认操作为Decline if (actionWeightType.Equals(EnumActionWeightType.P.ToString(), StringComparison.CurrentCultureIgnoreCase) && !action.Equals("Approve", StringComparison.CurrentCultureIgnoreCase)) { action = "Decline"; } #region 如果执行的是退回到某个节点的操作 if (action.Equals("GoBack", StringComparison.CurrentCultureIgnoreCase)) { //当前审批节点ID string currentActivityID = destinations.ActivityID; //要退回到的节点ID并且是没有权重控制的情况下 string targetActivityID = K2DBHelper.GetTargetActivityID(currentActivityID); if (!string.IsNullOrEmpty(targetActivityID) && (actionWeightType.Equals(EnumActionWeightType.N.ToString()) || actionWeightType.Equals(EnumActionWeightType.R.ToString()))) { //获取原始审批链 string originalProcessApproveChain = K2DBHelper.GetProcessOriginalXMLValue(parentProcInstID); XmlDocument xmlProcess = new XmlDocument(); xmlProcess.LoadXml(originalProcessApproveChain); //获取要退回到的节点 XmlNode nodeActivity = xmlProcess.SelectSingleNode("/Process/Activity[ID='" + targetActivityID + "' and Status='Completed']"); if (nodeActivity != null) { while (true) { nodeActivity.SelectSingleNode("./Status").InnerText = "Available"; nodeActivity.SelectSingleNode("./ActionResult").InnerText = ""; XmlNodeList nodeListDestinations = nodeActivity.SelectNodes("./Destination"); foreach (XmlNode des in nodeListDestinations) { des.SelectSingleNode("./Status").InnerText = "Available"; des.SelectSingleNode("./ActionResult").InnerText = ""; des.SelectSingleNode("./ActualActionResult").InnerText = ""; //删除加签\会签信息 XmlNode nodeDestinationActivity = des.SelectSingleNode("./Activity"); if (nodeDestinationActivity != null) { des.RemoveChild(nodeDestinationActivity); } } if (nodeActivity.NextSibling != null && nodeActivity.NextSibling.Name.Equals("Activity", StringComparison.CurrentCultureIgnoreCase)) { nodeActivity = nodeActivity.NextSibling; } else { break; } } //更新原始审批链的状态 K2Helper.UpdateProcessDataFields(parentProcInstID, new CDataFields("ProcessApprovalChain", xmlProcess.OuterXml, "XF")); } else { //如果执行的是退回到某个节点的操作,但是没有配置退回到哪个节点,则退回到发起人 action = "Decline"; } } else { //如果执行的是退回到某个节点的操作,但是没有配置退回到哪个节点,则退回到发起人 action = "Decline"; } } #endregion //只有在执行同意操作并且(没有权重控制或在权重控制类型为R时)的前提下传递过来的activityXML才做为有效的加签、会签信息 if (action.Equals("Approve", StringComparison.CurrentCultureIgnoreCase) && !string.IsNullOrEmpty(activityXML) && (actionWeightType.Equals(EnumActionWeightType.N.ToString()) || actionWeightType.Equals(EnumActionWeightType.R.ToString()))) { destinations.AddActivity(SerializationHelper.Deserialize <ApprovalChainActivity>(activityXML)); } //只有在执行同意操作并且(没有权重控制或在权重控制类型为R时)的前提下传递过来的activityXML才做为有效的加签、会签信息 //if (action.Equals("Approve", StringComparison.CurrentCultureIgnoreCase) // && !string.IsNullOrEmpty(activityXML) // ) //{ // destinations.AddActivity(SerializationHelper.Deserialize<ApprovalChainActivity>(activityXML)); //} //修改User节点的状态,记录User的Action ApprovalChainDestinationUser user = destinations.ApproveChainDestinationUsers.Find(d => d.Account.Equals(currentUser, StringComparison.CurrentCultureIgnoreCase)); if (user != null) { user.Executed = true; user.ActionResult = action; } destinations.ActionResult = action; destinations.ActualUserID += ";" + currentUser; dataFieldDestinations = new CDataFields("Destinations", "", "DF"); dataFieldDestinations.DataFieldLists[0].Value = SerializationHelper.Serialize(destinations); // K2Helper.ExecuteProcess(sn, "", "", currentUser, dataFieldDestinations); //更新用以标识用户是否可以取回任务的DataField K2Helper.UpdateProcessDataFields(parentProcInstID, new CDataFields("CallBackProcInstID", sn.Split('_')[0], "DF")); //edit by lee K2Helper.ExecuteProcess(sn, "", "", currentUser, dataFieldDestinations); K2DBHelper.AddApproveLog(parentProcInstID, Convert.ToInt32(sn.Split('_')[0]), action, activityXML, currentUser); K2DBHelper.AddActSlot(Convert.ToInt32(sn.Split('_')[0]), parentProcInstID, activity.ID, activity.Name, currentUser, activity.Type); } catch (Exception ex) { K2DBHelper.RecoreErrorProfile(ex, "K2HelperWS.ExecuteProcess(SN=" + sn + ";action=" + action + ";currentUser="******";activityXML=" + activityXML + ")", currentUser); return(ex.Message); } return("Success"); }
/// <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(); } } } }