コード例 #1
0
        /// <summary>
        /// 获取流程变量
        /// </summary>
        /// <param name="sn">流程SN</param>
        /// <param name="FieldNames">要获取的变量的List</param>
        /// <returns>变量的List</returns>
        public static void GetProcessDataFields(string sn, string currentUser, CDataFields dataFields)
        {
            using (Connection conn = new Connection())
            {
                try
                {
                    ConnectionSetup conSetup = GetConnectionSetup();
                    conn.Open(conSetup);
                    conn.ImpersonateUser(currentUser);
                    WorklistItem listItem = conn.OpenWorklistItem(sn);
                    GetDataFields(listItem, dataFields);
                }
                catch
                {
                    throw;
                }
                finally
                {
                    try
                    {
                        conn.RevertUser();
                    }
                    catch
                    { }

                    if (conn != null)
                    {
                        conn.Close();
                    }
                }
            }
        }
コード例 #2
0
        /// <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();
                    }
                }
            }
        }
コード例 #3
0
        public string UpdateProcessApproveChain(int parentrocInstID, string processApproveChain)
        {
            try
            {
                CDataFields dataFields = new CDataFields("ProcessApprovalChain", processApproveChain, "XF");

                K2Helper.UpdateProcessDataFields(parentrocInstID, dataFields);
                return("Sucess");
            }
            catch (Exception ex)
            {
                K2DBHelper.RecoreErrorProfile(ex, "K2HelperWS.UpdateProcessApproveChain", "");
                return(ex.Message);
            }
        }
コード例 #4
0
        //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");
        }
コード例 #5
0
 private static void GetDataFields(WorklistItem listItem, CDataFields dataFields)
 {
     if (dataFields != null && dataFields.DataFieldLists != null && dataFields.DataFieldLists.Count > 0)
     {
         foreach (CDataField dataField in dataFields.DataFieldLists)
         {
             string key = dataField.Key;
             if (dataField.Type == "DF")
             {
                 dataField.Value = listItem.ProcessInstance.DataFields[key].Value.ToString();
             }
             else if (dataField.Type == "XF")
             {
                 dataField.Value = listItem.ProcessInstance.XmlFields[key].Value;
             }
         }
     }
 }
コード例 #6
0
        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);
            }
        }
コード例 #7
0
 private static void SetDataFields(ProcessInstance procInst, CDataFields dataFields)
 {
     if (dataFields != null && dataFields.DataFieldLists != null && dataFields.DataFieldLists.Count > 0)
     {
         foreach (CDataField dataField in dataFields.DataFieldLists)
         {
             string key   = dataField.Key;
             string value = dataField.Value;
             if (dataField.Type == "DF")
             {
                 procInst.DataFields[key].Value = value;
             }
             else if (dataField.Type == "XF")
             {
                 procInst.XmlFields[key].Value = value;
             }
         }
     }
 }
コード例 #8
0
        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);
            }
        }
コード例 #9
0
        public string StartProcess(string procName, string user, string folio, string processApproveChain, string infoSource, string key)
        {
            int ProcInstID = -1;

            try
            {
                CDataFields dataFields = new CDataFields("ProcessApprovalChain", processApproveChain, "XF");

                //发起流程
                ProcInstID = K2Helper.StartProcess(procName, user, folio, dataFields);

                //更新用以标识用户是否可以取回任务的DataField
                K2Helper.UpdateProcessDataFields(ProcInstID, new CDataFields("CallBackProcInstID", ProcInstID.ToString(), "DF"));

                K2DBHelper.AddBusinessInfo(ProcInstID, procName, folio, processApproveChain, user, infoSource, key);
                K2DBHelper.AddApproveLog(ProcInstID, ProcInstID, "Submit", processApproveChain, user);
            }
            catch (Exception ex)
            {
                K2DBHelper.RecoreErrorProfile(ex, "K2HelperWS.StartProcess", user);
                return(ex.Message);
            }
            return(ProcInstID.ToString());
        }
コード例 #10
0
        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");
        }
コード例 #11
0
        /// <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);
            }
        }
コード例 #12
0
        /// <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();
                    }
                }
            }
        }