コード例 #1
0
        private static void GetFirstParalle(XElement template, Guid nodeId, ref XElement parallelStart)
        {
            // 查找子节点中的第一并发
            var custs = from c in template.Elements("Connections").First().Elements("Connection")
                        where c.Element("SinkID").Value == nodeId.ToString()
                        select c.Element("SourceID").Value;


            // 找到所有的父
            foreach (var item in custs)
            {
                // 获取节点名称
                var nodeInfos = from c in template.Elements("DesignerItems").Elements("DesignerItem")
                                where c.Element("ID").Value == item
                                select c;
                foreach (var nodeInfo in nodeInfos)
                {
                    Guid nextId = Guid.Parse(nodeInfo.Element("ID").Value);

                    if (nodeInfo.Element("BType").Value == "Process")
                    {
                        StandBookmark standardBookmark = new StandBookmark();
                        var           obj = (StandBookmark)JsonHelper.JsonToObject(nodeInfo.Element("Details").Value, standardBookmark);

                        // 如果遇到并发的起点,说明是并发内部的并发
                        if (!obj.IsParallel)
                        {
                            GetFirstParalle(template, nextId, ref parallelStart);
                        }
                        else
                        {
                            parallelStart = nodeInfo;
                            break;
                        }
                    }
                    else
                    {
                        GetFirstParalle(template, nextId, ref parallelStart);
                    }
                }
            }
        }
コード例 #2
0
        public string ValidateMsg(string submitMsg, TransInfoDto dto)
        {
            // 如果是以命令开头
            if (submitMsg.StartsWith("_"))
            {
                if (submitMsg == SubmitTypeEnum._SP.ToString())
                {
                    List <Guid> searchNodes = new List <Guid>();
                    var         nodeId      = Guid.Parse(XmlHelper.GetSafeValue(dto.Activity, ActivityConst.ID));
                    searchNodes.Add(nodeId);
                    Stack <string> parallelStarts       = new Stack <string>();
                    Stack <string> parallelEnds         = new Stack <string>();
                    bool?          stopParallelValidate = null;
                    // 检查是否有起始的节点
                    Action <XElement> next    = null;
                    Action <XElement> forward = null;

                    forward = (e) =>
                    {
                        var parentActivities = XmlHelper.GetAllForwardActivities(dto.TemplateXml, nodeId);
                        foreach (var parentActivity in parentActivities)
                        {
                            var id = Guid.Parse(XmlHelper.GetSafeValue(parentActivity, ActivityConst.ID));

                            string bType = XmlHelper.GetSafeValue(parentActivity, ActivityConst.TYPE);
                            if (bType == ActivityTypeEnum.Process.ToString())
                            {
                                StandBookmark bookmark = JsonHelper.JsonToT <StandBookmark>(XmlHelper.GetSafeValue(parentActivity, ActivityConst.DETAILS));
                                if (bookmark.IsParallel)
                                {
                                    if (parallelEnds.Contains(bookmark.GroupName))
                                    {
                                        parallelEnds.Pop();
                                    }
                                    else
                                    {
                                        if (parallelEnds.Count() == 0)
                                        {
                                            stopParallelValidate = true;
                                        }
                                    }
                                }
                            }
                            else if (bType == ActivityTypeEnum.Parallel.ToString())
                            {
                                var groupName = XmlHelper.GetSafeValue(parentActivity, ActivityConst.GROUPNAME);
                                if (parallelEnds.Contains(XmlHelper.GetSafeValue(parentActivity, ActivityConst.GROUPNAME)))
                                {
                                    parallelEnds.Push(groupName);
                                    break;
                                }
                            }

                            if (!stopParallelValidate.HasValue && !searchNodes.Contains(id))
                            {
                                searchNodes.Add(id);
                                forward(parentActivity);
                            }
                        }
                    };

                    forward(dto.Activity);

                    if (stopParallelValidate != true)
                    {
                        return("该节点不支持并发结束");
                    }
                    return(string.Empty);
                }
                else if (submitMsg.StartsWith(SubmitTypeEnum._BK.ToString()))
                {
                    if (submitMsg.Split(':').Count() == 2)
                    {
                        return(string.Empty);
                    }
                    else
                    {
                        return("退回必须要填写退回的节点名称!");
                    }
                }
                else if (submitMsg.StartsWith(SubmitTypeEnum._SB.ToString()) || submitMsg.StartsWith(SubmitTypeEnum._SP.ToString()))
                {
                    return(string.Empty);
                }
                else
                {
                    return("提交结构不合法!");
                }
            }

            return(string.Empty);
        }