Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
 public void CreateRoutingInfo(NSRoutingInfo routing)
 {
     SqlDbContext.NsRoutingInfos.Add(routing);
 }
Exemplo n.º 4
0
        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;
            }
        }