private static void StopAll(string groupName, XElement template, XElement nodeInfoPass, Guid taskId, Guid instancId, MainWorkflowUnitOfWork context, HashSet <Guid> parallelNodes) { // 查找父节点中的第一个节点 var custs = from c in template.Elements("Connections").First().Elements("Connection") where c.Element("SourceID").Value == nodeInfoPass.Element("ID").Value select c.Element("SinkID").Value; // 获取节点名称 var nodeInfoLinks = from c in template.Elements("DesignerItems").Elements("DesignerItem") where custs.Contains(c.Element("ID").Value) select c; foreach (var item in nodeInfoLinks) { if (item.Element("BType").Value == "Process") { if (!_parallelCount.Keys.Contains(taskId + groupName)) { _parallelCount.Add(taskId + groupName, nodeInfoLinks.Count()); } parallelNodes.Add(Guid.Parse(item.Element("ID").Value)); StopAll(groupName, template, item, taskId, instancId, context, parallelNodes); } else { if (item.Element("BType").Value == "Parallel" && item.Element("GroupName").Value == groupName) { _parallelCount[taskId + groupName] = _parallelCount[taskId + groupName] - 1; if (_parallelCount[taskId + groupName] == 0) { _parallelCount.Remove(taskId + groupName); // 查找下一个节点,所有父为Switch的下一个节点的 var childrenIds = from c in template.Elements("Connections").First().Elements("Connection") where c.Element("SourceID").Value == item.Element("ID").Value select c.Element("SinkID").Value; if (childrenIds.Count() == 0) { return; } var nodeInfos = from c in template.Elements("DesignerItems").Elements("DesignerItem") where childrenIds.Contains(c.Element("ID").Value) select c; foreach (var nodeInfo in nodeInfos) { NSNodeInfo nsNodeInfo = GetDefaultNSNodeInfo(nodeInfo, taskId, instancId); Routing(template, nodeInfo, nsNodeInfo, context, parallelNodes); } } } else { StopAll(groupName, template, nodeInfoPass, taskId, instancId, context, parallelNodes); } } } }
public void FinishActivity(NSNodeInfo node) { if (node != null) { // 修改状态 node.RunState = RunStateConst.END.ToString(); } }
public override void Routing(XElement templateInfo, XElement currentNode, NSNodeInfo node, MainWorkflowUnitOfWork context) { // 查询是否所有的节点都已经执行完成?? // 查找下一个节点,所有父为Switch的下一个节点的 var parentIds = from c in templateInfo.Elements("Connections").First().Elements("Connection") where c.Element("SinkID").Value == currentNode.Element("ID").Value select c.Element("SourceID").Value; // 查找是否已经存在了没有完成的计数器 NSNodeGroup alreadyExistGroup = context.NsNodeGroups.Where(p => p.TaskId == node.TaskId && p.InstanceId == node.InstanceId && p.Finshed == false || p.Finshed == null).FirstOrDefault(); if (alreadyExistGroup != null) { alreadyExistGroup.GroupCounter = ++alreadyExistGroup.GroupCounter; context.SetModified <NSNodeGroup>(alreadyExistGroup); } else { if (alreadyExistGroup == null) { alreadyExistGroup = new NSNodeGroup(); } alreadyExistGroup.Id = Guid.NewGuid(); alreadyExistGroup.GroupCounter = 1; alreadyExistGroup.GroupName = "Parallel"; alreadyExistGroup.TaskId = node.TaskId; alreadyExistGroup.InstanceId = node.InstanceId; alreadyExistGroup.Finshed = false; context.NsNodeGroups.Add(alreadyExistGroup); } if (parentIds.Count() == alreadyExistGroup.GroupCounter) { // 查找下一个节点,所有父为Switch的下一个节点的 var childrenIds = from c in templateInfo.Elements("Connections").First().Elements("Connection") where c.Element("SourceID").Value == currentNode.Element("ID").Value select c.Element("SinkID").Value; alreadyExistGroup.Finshed = true; if (childrenIds.Count() == 0) { return; } var nodeInfos = from c in templateInfo.Elements("DesignerItems").Elements("DesignerItem") where childrenIds.Contains(c.Element("ID").Value) select c; foreach (var item in nodeInfos) { RoutingTemplate(templateInfo, item, node, context, item.Element("EType").Value); } return; } }
public override void Routing(XElement templateInfo, XElement currentNode, NSNodeInfo node, MainWorkflowUnitOfWork context) { NSNodeInfo nsNodeInfo = new NSNodeInfo(); nsNodeInfo.Id = Guid.NewGuid(); nsNodeInfo.InstanceId = node.InstanceId; nsNodeInfo.TaskId = node.TaskId; nsNodeInfo.NodeName = currentNode.Element("Name").Value; nsNodeInfo.NodeId = Guid.Parse(currentNode.Element("ID").Value); nsNodeInfo.RunState = RunStateConst.RUNNING; nsNodeInfo.CreateTime = DateTime.Now; context.NSNodeInfos.Add(nsNodeInfo); }
public NSNodeInfo GetDefaultNSNodeInfo(XElement xElement, Guid taskId, Guid instanceId) { NSNodeInfo nsNodeInfo = new NSNodeInfo(); nsNodeInfo.Id = Guid.NewGuid(); nsNodeInfo.InstanceId = instanceId; nsNodeInfo.TaskId = taskId; nsNodeInfo.NodeName = xElement.Element("Name").Value; nsNodeInfo.NodeId = Guid.Parse(xElement.Element("ID").Value); nsNodeInfo.RunState = RunStateConst.RUNNING; nsNodeInfo.CreateTime = DateTime.Now; return(nsNodeInfo); }
public override void EndBuiness(TransInfoDto transInfoDto) { // 启动新流程,记录到流程的ID,任务ID等信息 IPersistence p = transInfoDto.Persistence; // 结束当前点状态 NSNodeInfo nsNodeInfo = p.GetActivityByID(transInfoDto.InstanceNodeId); NSInstanceInfo nsInstance = p.GetInsanceInfo(nsNodeInfo.InstanceId); NSTemplateInfo nsTemplate = p.GetTemplateInfo(nsInstance.TemplateId); p.FinishActivity(nsNodeInfo); //TODO: 产生新的节点,如果在回归之后继续执行逻辑,则要有全局的传递,以后在进行添加 var nextActivities = XmlHelper.GetAllNextActivities(nsTemplate.TemplateText, nsNodeInfo.NodeId); if (nextActivities != null) { new RoutingHost().RoutingFactory(nextActivities.ToList(), transInfoDto); } base.EndBuiness(transInfoDto); }
public override void Routing(XElement templateInfo, XElement currentNode, NSNodeInfo node, MainWorkflowUnitOfWork context) { // 查找下一个节点,所有父为Switch的下一个节点的 var childrenIds = from c in templateInfo.Elements("Connections").First().Elements("Connection") where c.Element("SourceID").Value == currentNode.Element("ID").Value&& c.Element("Condition").Value == node.SubmitResult select c.Element("SinkID").Value; if (childrenIds.Count() == 0) { return; } #warning 找到匹配的那个条件---条件待匹配 var nodeInfos = from c in templateInfo.Elements("DesignerItems").Elements("DesignerItem") where childrenIds.Contains(c.Element("ID").Value) select c; foreach (var item in nodeInfos) { RoutingTemplate(templateInfo, item, node, context, item.Element("EType").Value); } }
public override void StartBuiness(Dtos.TransInfoDto transInfoDto) { // 初始化 var activityInfo = JsonHelper.JsonToT <StandBookmark>(XmlHelper.GetSafeValue(transInfoDto.Activity, ActivityConst.DETAILS)); this.NodeID = activityInfo.NodeID; this.NodeDes = activityInfo.NodeDes; this.GroupName = activityInfo.GroupName; this.CanPersistence = activityInfo.CanPersistence; this.TransUserNo = activityInfo.TransUserNo; this.SubmitOptions = activityInfo.SubmitOptions; this.Name = activityInfo.Name; // 生成新节点 NSNodeInfo newActivity = new NSNodeInfo(); newActivity.Id = Guid.NewGuid(); newActivity.NodeName = activityInfo.Name; newActivity.NodeId = this.NodeID.Value; newActivity.InstanceId = transInfoDto.InstanceId; newActivity.ParentId = transInfoDto.ParentId; newActivity.RunState = EnumExt.RunStateConst.RUNNING; newActivity.SubmitOptions = SubmitOptions; newActivity.TaskId = transInfoDto.TaskId; newActivity.TransUserNo = TransUserNo; newActivity.CreateTime = DateTime.Now; newActivity.GroupName = GroupName; newActivity.NodeDes = NodeDes; // 保存节点 transInfoDto.Persistence.CreateActivity(newActivity); // 调用其他附属信息 base.StartBuiness(transInfoDto); }
/// <summary> /// 停止并发流程 /// </summary> /// <param name="template">模板</param> /// <param name="taskId">任务ID</param> /// <param name="nodeId">节点ID</param> public static void StopParallel(XElement template, Guid taskId, NSNodeInfo submitNodeInfo, MainWorkflowUnitOfWork context, Guid nodeId) { XElement parallelStart = null; // 获取对应的并发等待节点 GetFirstParalle(template, nodeId, ref parallelStart); if (parallelStart == null) { throw new Exception("没有找到并发起始节点"); } if (XmlHelper.HasValue(parallelStart, "GroupName")) { HashSet <Guid> parallelNodes = new HashSet <Guid>(); StopAll(parallelStart.Element("GroupName").Value, template, parallelStart, taskId, submitNodeInfo.InstanceId, context, parallelNodes); var stopNodeInfos = context.NSNodeInfos.Where(p => p.InstanceId == submitNodeInfo.InstanceId && parallelNodes.Contains(p.NodeId)); foreach (var nodeInfo in stopNodeInfos) { nodeInfo.RunState = "stop"; } context.SaveChanges(); } }
public override void StartBuiness(TransInfoDto transInfo) { // 启动新流程,记录到流程的ID,任务ID等信息 IPersistence p = transInfo.Persistence; SubRoutingBookmark submitRouting = JsonHelper.JsonToT <SubRoutingBookmark>(XmlHelper.GetSafeValue(transInfo.Activity, ActivityConst.DETAILS)); this.TemplateName = submitRouting.TemplateName; this.TemplateId = submitRouting.TemplateId; this.Name = submitRouting.Name; // 生成回归点 NSNodeInfo nsNodeInfo = new NSNodeInfo(); nsNodeInfo.Id = Guid.NewGuid(); nsNodeInfo.TaskId = transInfo.TaskId; nsNodeInfo.InstanceId = transInfo.InstanceId; nsNodeInfo.NodeName = this.Name; nsNodeInfo.ParentId = transInfo.ParentId; nsNodeInfo.RunState = EnumExt.RunStateConst.RUNNING; nsNodeInfo.CreateTime = DateTime.Now; nsNodeInfo.NodeId = Guid.Parse(XmlHelper.GetSafeValue(transInfo.Activity, ActivityConst.ID)); p.CreateActivity(nsNodeInfo); // 生成路由信息 NSRoutingInfo nsRoutingInfo = new NSRoutingInfo(); nsRoutingInfo.Id = Guid.NewGuid(); nsRoutingInfo.InstanceId = transInfo.InstanceId; nsRoutingInfo.ParentId = nsNodeInfo.Id; nsRoutingInfo.TaskId = transInfo.TaskId; nsRoutingInfo.GroupName = ActivityConst.GROUPNAME_INSTANCE; nsRoutingInfo.GroupCounter = 1; p.CreateRoutingInfo(nsRoutingInfo); // 流程实例信息 NSInstanceInfo insanceInfo = new NSInstanceInfo(); insanceInfo.InstanceName = submitRouting.TemplateName; insanceInfo.RunState = EnumExt.RunStateConst.RUNNING; insanceInfo.StartTime = DateTime.Now; insanceInfo.TemplateId = this.TemplateId; insanceInfo.Id = Guid.NewGuid(); insanceInfo.TaskId = transInfo.TaskId; insanceInfo.TemplateName = this.TemplateName; insanceInfo.ParentNodeId = nsNodeInfo.Id; p.CreateInstance(insanceInfo); TransInfoDto copyInfo = transInfo.GetCopyInfo(); copyInfo.InstanceId = insanceInfo.Id; copyInfo.TemplateXml = p.GetTemplateInfo(insanceInfo.TemplateId).TemplateText; // 生成子流程的第一个节点 var startActivities = XmlHelper.GetTemplateFirstActivity(XElement.Parse(copyInfo.TemplateXml)); if (startActivities != null) { new RoutingHost().RoutingFactory(startActivities.ToList(), copyInfo); } base.StartBuiness(transInfo); }
public virtual void Routing(XElement templateInfo, XElement currentNode, NSNodeInfo node, MainWorkflowUnitOfWork context) { }
protected void RoutingTemplate(XElement templateInfo, XElement currentNode, NSNodeInfo node, MainWorkflowUnitOfWork context, string nodeType) { TransDec.GetTransRouting(AllITrans, nodeType).Routing(templateInfo, currentNode, node, context); }
public Guid StartWorkflowInfo(StartInfo_DTO startInfo, ref string errorInfos) { try { HashSet <Guid> newActivities = new HashSet <Guid>(); NSTaskInfo nsTaskInfo = new NSTaskInfo(); nsTaskInfo.Id = Guid.NewGuid(); nsTaskInfo.TaskName = startInfo.TaskName; nsTaskInfo.TaskType = startInfo.TaskType; nsTaskInfo.RunState = RunStateConst.RUNNING; nsTaskInfo.CreateTime = DateTime.Now; NSInstanceInfo nsIntanceInfo = new NSInstanceInfo(); nsIntanceInfo.Id = Guid.NewGuid(); nsIntanceInfo.TaskId = nsTaskInfo.Id; nsIntanceInfo.StartTime = DateTime.Now; nsIntanceInfo.TemplateId = startInfo.TemplateId; nsIntanceInfo.TemplateName = startInfo.TemplateName; nsIntanceInfo.RunState = RunStateConst.RUNNING; // StartWorkflow TemplateRepository t = new TemplateRepository(Context); NSTemplateInfo templateInfo = t.Get(startInfo.TemplateId); if (templateInfo == null) { errorInfos = "模板不能为空!"; return(Guid.Empty); } string templateXML = templateInfo.TemplateText; XElement doc = XElement.Parse(templateInfo.TemplateText); var nodeInfos = from c in doc.Elements("DesignerItems").Elements("DesignerItem") where c.Element("BType").Value == "Start" select c; // start node var startNode = nodeInfos.First(); // start node id string id = startNode.Element("ID").Value; // start node next nodes var custs = from c in doc.Elements("Connections").First().Elements("Connection") where c.Element("SourceID").Value == id select c.Element("SinkID").Value; // get all nodes startnode link foreach (var item in custs) { // get nodeinfo var nodeInfo = from c in doc.Elements("DesignerItems").Elements("DesignerItem") where c.Element("ID").Value == item select c; // create node info if need if (TransRouting.CreateNodeInfo(nodeInfo.First())) { NSNodeInfo nsNodeInfo = new NSNodeInfo(); nsNodeInfo.Id = Guid.NewGuid(); nsNodeInfo.InstanceId = nsIntanceInfo.Id; nsNodeInfo.TaskId = nsTaskInfo.Id; nsNodeInfo.NodeId = Guid.Parse(item.ToString()); nsNodeInfo.NodeName = nodeInfo.First().Element("Name").Value; nsNodeInfo.NodeId = Guid.Parse(nodeInfo.First().Element("ID").Value); nsNodeInfo.RunState = RunStateConst.RUNNING; nsNodeInfo.CreateTime = DateTime.Now; Context.NSNodeInfos.Add(nsNodeInfo); } else { // only prepare taskid and instanceid NSNodeInfo nsNodeInfo = new NSNodeInfo(); nsNodeInfo.Id = Guid.NewGuid(); nsNodeInfo.InstanceId = nsIntanceInfo.Id; nsNodeInfo.TaskId = nsTaskInfo.Id; // running routting TransRouting.Routing(doc, nodeInfo.First(), nsNodeInfo, Context, newActivities); } } Context.NsInstanceInfos.Add(nsIntanceInfo); Context.NsTaskInfos.Add(nsTaskInfo); Context.SaveChanges(); errorInfos = string.Empty; return(nsTaskInfo.Id); } catch (Exception e) { errorInfos = e.ToString(); return(Guid.Empty); } return(Guid.Empty); }
public void CreateActivity(NSNodeInfo node) { SqlDbContext.NSNodeInfos.Add(node); }
public static void Routing(XElement templateInfo, XElement currentNode, NSNodeInfo node, MainWorkflowUnitOfWork context, HashSet <Guid> newActivities) { switch (currentNode.Element("BType").Value) { case "Decision": { // 查找下一个节点,所有父为Switch的下一个节点的 var childrenIds = from c in templateInfo.Elements("Connections").First().Elements("Connection") where c.Element("SourceID").Value == currentNode.Element("ID").Value&& c.Element("Condition").Value == node.SubmitResult select c.Element("SinkID").Value; if (childrenIds.Count() == 0) { return; } #warning 找到匹配的那个条件---条件待匹配 var nodeInfos = from c in templateInfo.Elements("DesignerItems").Elements("DesignerItem") where childrenIds.Contains(c.Element("ID").Value) select c; foreach (var item in nodeInfos) { Routing(templateInfo, item, node, context, newActivities); } } break; case "Parallel": { // 查询是否所有的节点都已经执行完成?? // 查找下一个节点,所有父为Switch的下一个节点的 var parentIds = from c in templateInfo.Elements("Connections").First().Elements("Connection") where c.Element("SinkID").Value == currentNode.Element("ID").Value select c.Element("SourceID").Value; // 查找是否已经存在了没有完成的计数器 NSNodeGroup alreadyExistGroup = context.NsNodeGroups.Where(p => p.TaskId == node.TaskId && p.InstanceId == node.InstanceId && p.Finshed == false || p.Finshed == null).FirstOrDefault(); if (alreadyExistGroup != null) { alreadyExistGroup.GroupCounter = ++alreadyExistGroup.GroupCounter; context.SetModified <NSNodeGroup>(alreadyExistGroup); } else { if (alreadyExistGroup == null) { alreadyExistGroup = new NSNodeGroup(); } alreadyExistGroup.Id = Guid.NewGuid(); alreadyExistGroup.GroupCounter = 1; alreadyExistGroup.GroupName = "Parallel"; alreadyExistGroup.TaskId = node.TaskId; alreadyExistGroup.InstanceId = node.InstanceId; alreadyExistGroup.Finshed = false; context.NsNodeGroups.Add(alreadyExistGroup); } if (parentIds.Count() == alreadyExistGroup.GroupCounter) { // 查找下一个节点,所有父为Switch的下一个节点的 var childrenIds = from c in templateInfo.Elements("Connections").First().Elements("Connection") where c.Element("SourceID").Value == currentNode.Element("ID").Value select c.Element("SinkID").Value; alreadyExistGroup.Finshed = true; if (childrenIds.Count() == 0) { return; } var nodeInfos = from c in templateInfo.Elements("DesignerItems").Elements("DesignerItem") where childrenIds.Contains(c.Element("ID").Value) select c; foreach (var item in nodeInfos) { Routing(templateInfo, item, node, context, newActivities); } return; } } break; case "Process": { NSNodeInfo nsNodeInfo = new NSNodeInfo(); nsNodeInfo.Id = Guid.NewGuid(); nsNodeInfo.InstanceId = node.InstanceId; nsNodeInfo.TaskId = node.TaskId; nsNodeInfo.NodeName = currentNode.Element("Name").Value; nsNodeInfo.NodeId = Guid.Parse(currentNode.Element("ID").Value); nsNodeInfo.RunState = RunStateConst.RUNNING; nsNodeInfo.CreateTime = DateTime.Now; context.NSNodeInfos.Add(nsNodeInfo); newActivities.Add(nsNodeInfo.NodeId); } break; case "SubRouting": { SubRoutingBookmark submitRoutingBookmark = new SubRoutingBookmark(); var dbPlugIn = DBFactory.GetPersistencePlugIn(); TransInfoDto tranInfoDto = new TransInfoDto(); tranInfoDto.InstanceId = node.InstanceId; tranInfoDto.TaskId = node.TaskId; //TODO:容易出错的地方,暂时没有处理的 tranInfoDto.TemplateXml = dbPlugIn.GetTemplateInfo(dbPlugIn.GetInsanceInfo(node.InstanceId).Id).TemplateText; tranInfoDto.ParentId = node.Id; submitRoutingBookmark.Start(tranInfoDto); return; // 生成第一节点 调用启动流程 NSNodeInfo parentNodeInfo = new NSNodeInfo(); parentNodeInfo.Id = Guid.NewGuid(); parentNodeInfo.InstanceId = node.InstanceId; parentNodeInfo.TaskId = node.TaskId; parentNodeInfo.NodeName = currentNode.Element("Name").Value; parentNodeInfo.NodeId = Guid.Parse(currentNode.Element("ID").Value); parentNodeInfo.RunState = RunStateConst.RUNNING; parentNodeInfo.CreateTime = DateTime.Now; context.NSNodeInfos.Add(parentNodeInfo); NSInstanceInfo instance = new NSInstanceInfo(); instance.InstanceName = ""; //读取的模板名称 instance.TaskId = node.TaskId; instance.TemplateId = Guid.NewGuid(); // 湖区模板ID instance.RunState = RunStateConst.RUNNING; instance.StartTime = DateTime.Now; instance.Id = Guid.NewGuid(); instance.TemplateId = JsonHelper.JsonToT <SubRoutingBookmark>(currentNode.Element("Details").Value).TemplateId; context.NsInstanceInfos.Add(instance); // 如果有个字段用来区分是子流程,那么就可以轻松的进行操作。 // 生成第一个点 var childTemplate = context.NSTemplateInfos.First(p => p.Id == instance.TemplateId); string templateXML = childTemplate.TemplateText; XElement doc = XElement.Parse(templateXML); var nodeInfos = from c in doc.Elements("DesignerItems").Elements("DesignerItem") where c.Element("BType").Value == "Start" select c; // start node var startNode = nodeInfos.First(); // start node id string id = startNode.Element("ID").Value; // start node next nodes var custs = from c in doc.Elements("Connections").First().Elements("Connection") where c.Element("SourceID").Value == id select c.Element("SinkID").Value; // get all nodes startnode link foreach (var item in custs) { // get nodeinfo var nodeInfo = from c in doc.Elements("DesignerItems").Elements("DesignerItem") where c.Element("ID").Value == item select c; // create node info if need if (TransRouting.CreateNodeInfo(nodeInfo.First())) { NSNodeInfo nsNodeInfo = new NSNodeInfo(); nsNodeInfo.Id = Guid.NewGuid(); nsNodeInfo.InstanceId = instance.Id; nsNodeInfo.TaskId = instance.TaskId; nsNodeInfo.NodeId = Guid.Parse(item.ToString()); nsNodeInfo.NodeName = nodeInfo.First().Element("Name").Value; nsNodeInfo.NodeId = Guid.Parse(nodeInfo.First().Element("ID").Value); nsNodeInfo.RunState = RunStateConst.RUNNING; nsNodeInfo.CreateTime = DateTime.Now; context.NSNodeInfos.Add(nsNodeInfo); } else { // only prepare taskid and instanceid NSNodeInfo nsNodeInfo = new NSNodeInfo(); nsNodeInfo.Id = Guid.NewGuid(); nsNodeInfo.InstanceId = instance.Id; nsNodeInfo.TaskId = instance.TaskId; // running routting TransRouting.Routing(doc, nodeInfo.First(), nsNodeInfo, context, newActivities); } } NSRoutingInfo routingInfo = new NSRoutingInfo(); routingInfo.InstanceId = instance.Id; routingInfo.TaskId = node.TaskId; routingInfo.Id = Guid.NewGuid(); routingInfo.ParentId = parentNodeInfo.Id; context.NsRoutingInfos.Add(routingInfo); } break; } }