Esempio n. 1
0
        /// <summary>
        /// 适用于流程第二步已指定人员的,自动执行
        /// </summary>
        /// <param name="fTask"></param>
        public static void AutoExecute(Task fTask)
        {
            XmlSerializer xs = new XmlSerializer(typeof(TaskContext));

            if (!string.IsNullOrEmpty(fTask.Context))
            {
                StringReader sr      = new StringReader(fTask.Context);
                TaskContext  content = xs.Deserialize(sr) as TaskContext;
                if (content.SwitchRules.Length > 0)
                {
                    TaskContextSwitchRuleNextAction[] arrs = content.SwitchRules[0].NextActions;
                    if (arrs.Length > 0)
                    {
                        string route = arrs[0].Name;
                        Aim.WorkFlow.WFService.Task taskS = Aim.WorkFlow.WorkFlow.ServiceClient.GetTaskByTaskId(fTask.ID);
                        SubmitTask("", fTask.WorkflowInstanceID, fTask.BookmarkName, GetApprovalResult(taskS, fTask.ID, fTask.WorkflowInstanceID, route));;
                    }
                }
            }
        }
Esempio n. 2
0
        protected void Page_Load(object sender, EventArgs e)
        {
            switch (this.RequestActionString.ToLower())
            {
            case "submittask":
                Aim.WorkFlow.WFService.Task task = Aim.WorkFlow.WorkFlow.ServiceClient.GetTaskByTaskId(this.RequestData["TaskId"].ToString());
                Aim.WorkFlow.WorkFlow.SubmitTask("", task.WorkflowInstanceID, task.BookmarkName, GetApprovalResult(task));
                PageState.Add("message", "提交成功!");
                break;

            case "savetask":
                Aim.WorkFlow.Task tas = Aim.WorkFlow.Task.Find(this.RequestData["TaskId"].ToString());
                tas.Description = this.RequestData["Opinion"].ToString();
                tas.SaveAndFlush();
                break;

            case "getusers":
                GetNextUsers(this.RequestData["TemplateId"].ToString(), this.RequestData["FlowInstanceId"].ToString(), this.RequestData["Name"].ToString(), this.RequestData["CurrentName"].ToString());
                break;

            case "getbackusers":
                Aim.WorkFlow.Task[] tks = Aim.WorkFlow.Task.FindAllByProperties(Aim.WorkFlow.Task.Prop_WorkflowInstanceID, this.RequestData["FlowInstanceId"].ToString(), Aim.WorkFlow.Task.Prop_ApprovalNodeName, this.RequestData["TaskName"].ToString());
                if (tks != null && tks.Length == 1)    //打回情况一个人的时候有效,多人的话,还是从之前配置里取
                {
                    this.PageState.Add("NextUserIds", tks[0].OwnerId);
                    this.PageState.Add("NextUserNames", tks[0].Owner);
                }
                break;

            default:
                if (this.RequestData["TaskId"] != null && !string.IsNullOrEmpty(this.RequestData["TaskId"].ToString()))
                {
                    Aim.WorkFlow.Task             fTask    = Aim.WorkFlow.Task.Find(this.RequestData["TaskId"].ToString());
                    Aim.WorkFlow.WorkflowInstance instance = WorkflowInstance.Find(fTask.WorkflowInstanceID);
                    this.PageState.Add("InstanceId", fTask.WorkflowInstanceID);
                    this.PageState.Add("TemplateId", instance.WorkflowTemplateID);
                    FlowInstanceId = instance.ID;
                    FormUrl        = instance.RelateUrl;
                    FlowDefineId   = instance.WorkflowTemplateID;
                    Title          = fTask.WorkFlowName + "->" + fTask.ApprovalNodeName;
                    XmlSerializer xs = new XmlSerializer(typeof(TaskContext));
                    if (!string.IsNullOrEmpty(fTask.Context))
                    {
                        /*Aim.WorkFlow.WorkflowTemplate temp = Aim.WorkFlow.WorkflowTemplate.Find(instance.WorkflowTemplateID);
                         * XmlDocument doc = new XmlDocument();
                         * doc.LoadXml(temp.XAML);
                         * XmlElement root = doc.DocumentElement;
                         * string nameSpace = root.NamespaceURI;
                         * XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
                         * nsmgr.AddNamespace("ns", nameSpace);
                         * nsmgr.AddNamespace("x", "http://schemas.microsoft.com/winfx/2006/xaml");
                         * nsmgr.AddNamespace("bwa", "clr-namespace:BPM.WF.Activities;assembly=BPM.WF");
                         * XmlNode currentNode = root.SelectSingleNode("//*[contains(@ApprovalNodeConfig,'" + fTask.ApprovalNodeName + "')]", nsmgr);*/
                        StringReader sr      = new StringReader(fTask.Context);
                        TaskContext  content = xs.Deserialize(sr) as TaskContext;
                        if (content.SwitchRules.Length > 0)
                        {
                            TaskContextSwitchRuleNextAction[] arrs = content.SwitchRules[0].NextActions;
                            string comboxdataText = "['{0}','{1}'],";
                            if (arrs.Length > 0)
                            {
                                int first = 0;
                                foreach (TaskContextSwitchRuleNextAction ar in arrs)
                                {
                                    //GetNextRoute(currentNode, nsmgr, ar.Name)
                                    NextStep += string.Format(comboxdataText, ar.Name, ar.Name);
                                    if (first == 0)
                                    {
                                        GetNextUsers(instance.WorkflowTemplateID, fTask.WorkflowInstanceID, ar.Name, fTask.ApprovalNodeName);
                                    }
                                    first++;
                                }
                            }
                            else
                            {
                                NextStep += string.Format("['','{0}'],", "结束");
                            }
                        }
                        else
                        {
                            NextStep += string.Format("['','{0}'],", "结束");
                        }
                    }
                    else
                    {
                        NextStep += string.Format("['','{0}'],", "结束");
                    }
                    NextStep = NextStep.TrimEnd(',');
                    Aim.WorkFlow.Task[] tasks = Aim.WorkFlow.Task.FindAllByProperty("CreatedTime", "WorkflowInstanceID", fTask.WorkflowInstanceID);
                    this.PageState.Add("Tasks", JsonHelper.GetJsonString(tasks));
                    this.PageState.Add("Task", fTask);
                }
                break;
            }
        }
Esempio n. 3
0
        public ApprovalResult GetApprovalResult(Aim.WorkFlow.WFService.Task task)
        {
            ApprovalResult result = new ApprovalResult()
            {
                Task   = task,
                TaskId = this.RequestData["TaskId"].ToString(),

                ApprovalDateTime = DateTime.Now,

                Opinion = ApprovalOpinion.意,

                //Comment = ""
            };

            /// 设定跳过后续哪些节点.

            /*List<ApprovalNodeSkipInfo> approvalNodeSkipInfos = new List<ApprovalNodeSkipInfo>();
             *
             * if (checkBox1.IsChecked.HasValue && checkBox1.IsChecked.Value)
             *  approvalNodeSkipInfos.Add(new ApprovalNodeSkipInfo() { ApprovalNodeContextName = "经理审批", CanBeSkipped = true });
             *
             * if (checkBox2.IsChecked.HasValue && checkBox2.IsChecked.Value)
             *  approvalNodeSkipInfos.Add(new ApprovalNodeSkipInfo() { ApprovalNodeContextName = "主管审批", CanBeSkipped = true });
             *
             * result.ApprovalNodeSkipInfoList = approvalNodeSkipInfos.ToArray();
             */
            /// 设定选中的流转节点
            if (this.RequestData["Route"] != null && this.RequestData["Route"].ToString() != "")
            {
                result.SwitchRules = new KeyValuePair_V2[]
                {
                    new KeyValuePair_V2()
                    {
                        Key   = task.ApprovalNodeName,
                        Value = this.RequestData["Route"].ToString()
                    }
                };
                /// 设定指定流转节点的审批人员的信息.
                List <ApprovalNodeContext> approvalNodeContexts         = new List <ApprovalNodeContext>();
                ApprovalNodeContext        specifiedApprovalNodeContext = new ApprovalNodeContext();
                specifiedApprovalNodeContext.Name = this.RequestData["NextNodeName"] == null ? "" : this.RequestData["NextNodeName"].ToString();

                if (this.RequestData["UserType"] != null)
                {
                    if (this.RequestData["UserType"].ToString() != "ADAccount" && this.RequestData["UserIds"].ToString() != "")//如果是组或者角色
                    {
                        string[] grpIds = this.RequestData["UserIds"].ToString().Split(',');
                        List <ApprovalUnitContext> approvalUnitContexts = new List <ApprovalUnitContext>();
                        foreach (string groupId in grpIds)
                        {
                            string cou   = @"select count(*) from (select distinct ParentDeptName from View_SysUserGroup where 
ChildDeptName=(Select Name from SysRole where RoleID='{0}')) a";
                            string sql   = "";
                            int    count = DataHelper.QueryValue <int>(string.Format(cou, groupId));
                            IList <EasyDictionary> lists = null;
                            //判断角色的唯一性,多部门角色需要对应到部门
                            if (count > 1)
                            {
                                sql = @"select distinct UserID,UserName Name from View_SysUserGroup where ChildDeptName in (Select Name from SysRole where RoleID='{0}') 
and (select top 1 Path+'.'+DeptId from View_SysUserGroup where UserID='{1}') like '%'+Path+'%'";
                                if (this.RequestData.Get("StartUserId") != null && this.RequestData.Get <string>("StartUserId") != "")
                                {
                                    sql = string.Format(sql, groupId, this.RequestData.Get("StartUserId"));
                                }
                                else
                                {
                                    sql = string.Format(sql, groupId, this.UserInfo.UserID);
                                }
                                lists = DataHelper.QueryDictList(sql);
                            }
                            else if (count == 1)
                            {
                                sql   = "select UserId,UserName Name from View_SysUserGroup where ChildDeptName=(Select Name from SysRole where RoleID='{0}')";
                                sql   = string.Format(sql, groupId);
                                lists = DataHelper.QueryDictList(sql);
                            }
                            if (lists.Count == 0)
                            {
                                throw new Exception("缺少角色" + this.RequestData["UserNames"] + "的人员!");
                            }
                            foreach (EasyDictionary ed in lists)
                            {
                                approvalUnitContexts.Add(new ApprovalUnitContext()
                                {
                                    Approver = new Approver()
                                    {
                                        Value = ed["UserID"].ToString(), Name = ed["Name"].ToString()
                                    }
                                });
                            }
                        }
                        specifiedApprovalNodeContext.ApprovalUnitContexts = approvalUnitContexts.ToArray();
                        approvalNodeContexts.Add(specifiedApprovalNodeContext);
                        result.SpecifiedApprovalNodeContexts = approvalNodeContexts.ToArray();
                    }
                }
                else if (this.RequestData["UserIds"] != null && this.RequestData["UserIds"].ToString().Trim() != "")
                {
                    string userIds   = this.RequestData["UserIds"].ToString().TrimEnd(',');
                    string userNames = this.RequestData["UserNames"].ToString().TrimEnd(',');
                    LoadFromConfigString(specifiedApprovalNodeContext, userIds, userNames);
                    approvalNodeContexts.Add(specifiedApprovalNodeContext);
                    result.SpecifiedApprovalNodeContexts = approvalNodeContexts.ToArray();
                }

                /*List<ApprovalNodeContext> approvalNodeContexts = new List<ApprovalNodeContext>();
                 *
                 * ApprovalNodeContext specifiedApprovalNodeContext = new ApprovalNodeContext();
                 * specifiedApprovalNodeContext.Name = this.RequestData["RouteName"].ToString();
                 *
                 * string userIds = this.RequestData["UserIds"].ToString().TrimEnd(',');
                 * string userNames = this.RequestData["UserNames"].ToString().TrimEnd(',');
                 * LoadFromConfigString(specifiedApprovalNodeContext, userIds,userNames);
                 * approvalNodeContexts.Add(specifiedApprovalNodeContext);
                 * result.SpecifiedApprovalNodeContexts = approvalNodeContexts.ToArray();*/
            }

            return(result);
        }
Esempio n. 4
0
        public static ApprovalResult GetApprovalResult(Aim.WorkFlow.WFService.Task task, string taskId, string winstanceId, string route)
        {
            ApprovalResult result = new ApprovalResult()
            {
                Task   = task,
                TaskId = task.ID,

                ApprovalDateTime = DateTime.Now,

                Opinion = ApprovalOpinion.意,

                //Comment = ""
            };

            /// 设定跳过后续哪些节点.

            /*List<ApprovalNodeSkipInfo> approvalNodeSkipInfos = new List<ApprovalNodeSkipInfo>();
             *
             * if (checkBox1.IsChecked.HasValue && checkBox1.IsChecked.Value)
             *  approvalNodeSkipInfos.Add(new ApprovalNodeSkipInfo() { ApprovalNodeContextName = "经理审批", CanBeSkipped = true });
             *
             * if (checkBox2.IsChecked.HasValue && checkBox2.IsChecked.Value)
             *  approvalNodeSkipInfos.Add(new ApprovalNodeSkipInfo() { ApprovalNodeContextName = "主管审批", CanBeSkipped = true });
             *
             * result.ApprovalNodeSkipInfoList = approvalNodeSkipInfos.ToArray();
             */
            /// 设定选中的流转节点
            if (route != "")
            {
                result.SwitchRules = new KeyValuePair_V2[]
                {
                    new KeyValuePair_V2()
                    {
                        Key   = task.ApprovalNodeName,
                        Value = route
                    }
                };
                WorkflowInstance ins = WorkflowInstance.Find(winstanceId);
                Aim.WorkFlow.WorkflowTemplate temp = Aim.WorkFlow.WorkflowTemplate.Find(ins.WorkflowTemplateID);
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(temp.XAML);
                XmlElement          root      = doc.DocumentElement;
                string              nameSpace = root.NamespaceURI;
                XmlNamespaceManager nsmgr     = new XmlNamespaceManager(doc.NameTable);
                nsmgr.AddNamespace("ns", nameSpace);
                nsmgr.AddNamespace("x", "http://schemas.microsoft.com/winfx/2006/xaml");
                nsmgr.AddNamespace("bwa", "clr-namespace:BPM.WF.Activities;assembly=BPM.WF");

                string  current     = "ApprovalNode Name=\"" + task.ApprovalNodeName + "\"";
                XmlNode currentNode = root.SelectSingleNode("//*[contains(@ApprovalNodeConfig,'" + current + "')]", nsmgr);
                //XmlNode node = root.SelectSingleNode("//*[@x:Key='" + nextName + "']", nsmgr);
                XmlNode node                = currentNode.NextSibling.SelectSingleNode("ns:FlowSwitch/ns:FlowStep[@x:Key='" + route + "']", nsmgr);
                string  nextUserIds         = "";
                string  nextUserNames       = "";
                string  nextUserAccountType = "";
                string  nextNodeName        = "";
                string  content             = "ApprovalNode Name=\"" + route + "\"";
                if (root.SelectSingleNode("//*[contains(@ApprovalNodeConfig,'" + content + "')]", nsmgr) != null)//直接路由
                {
                    string      config = System.Web.HttpUtility.HtmlDecode(root.SelectSingleNode("//*[contains(@ApprovalNodeConfig,'" + content + "')]", nsmgr).Attributes["ApprovalNodeConfig"].InnerXml);
                    XmlDocument docC   = new XmlDocument();
                    docC.LoadXml(config);
                    nextNodeName = docC.DocumentElement.Attributes["Name"].InnerText.ToString();
                    if (docC.DocumentElement.SelectSingleNode("ApprovalUnits") != null && docC.DocumentElement.SelectSingleNode("ApprovalUnits").ChildNodes.Count > 0)
                    {
                        XmlNodeList list = docC.DocumentElement.SelectSingleNode("ApprovalUnits").ChildNodes;
                        foreach (XmlNode chd in list)
                        {
                            nextUserIds        += chd.ChildNodes[0].Attributes["Value"].InnerText + ",";
                            nextUserNames      += chd.ChildNodes[0].Attributes["Name"].InnerText + ",";
                            nextUserAccountType = chd.ChildNodes[0].Attributes["Type"].InnerText;
                        }
                    }
                }
                nextUserIds   = nextUserIds.TrimEnd(',');
                nextUserNames = nextUserNames.TrimEnd(',');
                /// 设定指定流转节点的审批人员的信息.
                List <ApprovalNodeContext> approvalNodeContexts         = new List <ApprovalNodeContext>();
                ApprovalNodeContext        specifiedApprovalNodeContext = new ApprovalNodeContext();
                specifiedApprovalNodeContext.Name = nextNodeName;

                if (nextUserAccountType != "ADAccount" && nextUserIds != "")//如果是组或者角色
                {
                    string[] grpIds = nextUserIds.Split(',');
                    List <ApprovalUnitContext> approvalUnitContexts = new List <ApprovalUnitContext>();
                    foreach (string groupId in grpIds)
                    {
                        string cou   = @"select count(*) from (select distinct ParentDeptName from View_SysUserGroup where 
ChildDeptName=(Select Name from SysRole where RoleID='{0}')) a";
                        string sql   = "";
                        int    count = DataHelper.QueryValue <int>(string.Format(cou, groupId));
                        IList <EasyDictionary> lists = null;
                        //判断角色的唯一性,多部门角色需要对应到部门
                        if (count > 1)
                        {
                            sql   = @"select distinct UserID,UserName Name from View_SysUserGroup where ChildDeptName in (Select Name from SysRole where RoleID='{0}') 
and (select top 1 Path+'.'+DeptId from View_SysUserGroup where UserID='{1}') like '%'+Path+'%'";
                            sql   = string.Format(sql, groupId, task.OwnerId);
                            lists = DataHelper.QueryDictList(sql);
                        }
                        else if (count == 1)
                        {
                            sql   = "select UserId,UserName Name from View_SysUserGroup where ChildDeptName=(Select Name from SysRole where RoleID='{0}')";
                            sql   = string.Format(sql, groupId);
                            lists = DataHelper.QueryDictList(sql);
                        }
                        if (lists.Count == 0)
                        {
                            throw new Exception("缺少角色" + nextUserNames + "的人员!");
                        }
                        foreach (EasyDictionary ed in lists)
                        {
                            approvalUnitContexts.Add(new ApprovalUnitContext()
                            {
                                Approver = new Approver()
                                {
                                    Value = ed["UserID"].ToString(), Name = ed["Name"].ToString()
                                }
                            });
                        }
                    }
                    specifiedApprovalNodeContext.ApprovalUnitContexts = approvalUnitContexts.ToArray();
                    approvalNodeContexts.Add(specifiedApprovalNodeContext);
                    result.SpecifiedApprovalNodeContexts = approvalNodeContexts.ToArray();
                }
                else if (nextUserIds.Trim() != "")
                {
                    LoadFromConfigString(specifiedApprovalNodeContext, nextUserIds, nextUserNames);
                    approvalNodeContexts.Add(specifiedApprovalNodeContext);
                    result.SpecifiedApprovalNodeContexts = approvalNodeContexts.ToArray();
                }

                /*List<ApprovalNodeContext> approvalNodeContexts = new List<ApprovalNodeContext>();
                 *
                 * ApprovalNodeContext specifiedApprovalNodeContext = new ApprovalNodeContext();
                 * specifiedApprovalNodeContext.Name = this.RequestData["RouteName"].ToString();
                 *
                 * string userIds = this.RequestData["UserIds"].ToString().TrimEnd(',');
                 * string userNames = this.RequestData["UserNames"].ToString().TrimEnd(',');
                 * LoadFromConfigString(specifiedApprovalNodeContext, userIds,userNames);
                 * approvalNodeContexts.Add(specifiedApprovalNodeContext);
                 * result.SpecifiedApprovalNodeContexts = approvalNodeContexts.ToArray();*/
            }

            return(result);
        }