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); } } } }
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); }