public NSRoutingInfo CreateParallelRoutingInfo(Guid taskId, Guid instanceId, string groupName) { var routingInfo = SqlDbContext.NsRoutingInfos.FirstOrDefault(p => p.InstanceId == instanceId && p.GroupName == groupName); if (routingInfo == null) { routingInfo = new NSRoutingInfo(); routingInfo.GroupName = groupName; routingInfo.Id = Guid.NewGuid(); routingInfo.InstanceId = instanceId; routingInfo.TaskId = taskId; routingInfo.Finshed = false; routingInfo.GroupCounter = 1; SqlDbContext.NsRoutingInfos.Add(routingInfo); return(routingInfo); } else { if (routingInfo.Finshed == true) { routingInfo.Finshed = false; routingInfo.GroupCounter = 1; return(routingInfo); } else { int counter = routingInfo.GroupCounter + 1; routingInfo.GroupCounter = counter; return(routingInfo); } } }
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 void CreateRoutingInfo(NSRoutingInfo routing) { SqlDbContext.NsRoutingInfos.Add(routing); }
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; } }