Example #1
0
        /// <summary>
        /// 把XML节点转换为ActivityEntity实体对象
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        internal ActivityEntity ConvertXmlActivityNodeToActivityEntity(XmlNode node)
        {
            var nodeType = (ActivityTypeEnum)Enum.Parse(typeof(ActivityTypeEnum), XMLHelper.GetXmlAttribute(node, "nodeType"));

            ActivityEntity entity = new ActivityEntity();

            entity.ActivityName = XMLHelper.GetXmlAttribute(node, "label");

            entity.ActivityCode = XMLHelper.GetXmlAttribute(node, "nodeName");
            if (entity.ActivityName.IsMissing())
            {
                //开始结束节点label为“”
                entity.ActivityName = entity.ActivityCode;
            }
            entity.ActivityID   = XMLHelper.GetXmlAttribute(node, "id");
            entity.ProcessUid   = ProcessEntity.ProcessUid;
            entity.IsAppoint    = XMLHelper.GetXmlAttribute(node, "isAppoint").ToBool();
            entity.ActivityType = nodeType;
            //单据模板
            entity.BillTemplate = XMLHelper.GetXmlAttribute(node, "billTemplate");

            if (entity.ActivityType == ActivityTypeEnum.SubProcessNode)             //sub process node
            {
                //子流程节点
                string subProcess = XMLHelper.GetXmlAttribute(node, "subProcess");
                entity.SubProcess = subProcess;
            }
            else if (entity.ActivityType == ActivityTypeEnum.TaskNode)
            {
                entity.ApproverMethod = (ApproverMethodEnum)Enum.Parse(typeof(ApproverMethodEnum), XMLHelper.GetXmlAttribute(node, "approverMethod"));
            }
            else if (entity.ActivityType == ActivityTypeEnum.SignNode)      //multiple instance node
            {
                string passRate = XMLHelper.GetXmlAttribute(node, "passRate");
                entity.PassRate = Convert.ToInt16(passRate);
            }
            else if (entity.ActivityType == ActivityTypeEnum.TimerNode)
            {
                entity.Expiration = Convert.ToInt32(XMLHelper.GetXmlAttribute(node, "expiration"));
            }
            else if (entity.ActivityType == ActivityTypeEnum.GatewayNode)
            {
                string gateway   = XMLHelper.GetXmlAttribute(node, "gateway");
                string direction = XMLHelper.GetXmlAttribute(node, "direction");
                entity.GatewaySplitJoinType = (GatewaySplitJoinTypeEnum)Enum.Parse(typeof(GatewaySplitJoinTypeEnum), gateway);
                entity.GatewayDirectionType = (GatewayDirectionEnum)Enum.Parse(typeof(GatewayDirectionEnum), direction);
            }
            //字段权限以及审批人
            if (nodeType != ActivityTypeEnum.StartNode && nodeType != ActivityTypeEnum.EndNode && nodeType != ActivityTypeEnum.GatewayNode)
            {
                //获取可操作字段
                entity.FieldItems = GetActivityDataItems(entity.ActivityID);
                //获取审批人
                entity.Performers = GetActivityPerformers(entity.ActivityID);
            }
            entity.NoticeApplicant = XMLHelper.GetXmlAttribute(node, "noticeApplicant").ToBool();
            entity.NoticeApprover  = XMLHelper.GetXmlAttribute(node, "noticeApprover").ToBool();

            entity.IsMail    = XMLHelper.GetXmlAttribute(node, "isMail").ToBool();
            entity.IsMessage = XMLHelper.GetXmlAttribute(node, "isMessage").ToBool();

            //获取节点的操作列表
            //XmlNode actionsNode = node.SelectSingleNode("Actions");
            //if (actionsNode != null)
            //{
            //    XmlNodeList xmlActionList = actionsNode.ChildNodes;
            //    List<ActionEntity> actionList = new List<ActionEntity>();
            //    foreach (XmlNode element in xmlActionList)
            //    {
            //        actionList.Add(ConvertXmlActionNodeToActionEntity(element));
            //    }
            //    entity.ActionList = actionList;
            //}

            return(entity);
        }
Example #2
0
        /// <summary>
        /// 创建跳转Transition实体对象
        /// </summary>
        /// <param name="sourceActivity">来源节点</param>
        /// <param name="targetActivity">目标节点</param>
        /// <returns>转移实体</returns>
        public static TransitionEntity CreateJumpforwardEmptyTransition(ActivityEntity sourceActivity, ActivityEntity targetActivity)
        {
            TransitionEntity transition = new TransitionEntity();

            transition.TransitionID     = string.Empty;
            transition.SourceActivity   = sourceActivity;
            transition.SourceActivityID = sourceActivity.ActivityID;
            transition.TargetActivity   = targetActivity;
            transition.TargetActivityID = targetActivity.ActivityID;
            transition.DirectionType    = TransitionDirectionTypeEnum.Forward;

            return(transition);
        }
 /// <summary>
 /// 根据网关类型获取下一步节点列表的抽象方法
 /// </summary>
 /// <param name="transition">转移</param>
 /// <param name="activity">活动</param>
 /// <param name="conditionKeyValuePair">条件kv对</param>
 /// <param name="scheduleStatus">匹配类型</param>
 /// <returns></returns>
 internal abstract NextActivityComponent GetNextActivityListFromGateway(TransitionEntity transition,
                                                                        ActivityEntity activity,
                                                                        out NextActivityMatchedType scheduleStatus);
Example #4
0
        /// <summary>
        /// 获取下一步节点列表
        /// </summary>
        /// <param name="processInstanceID"></param>
        /// <param name="fromTransition"></param>
        /// <param name="currentGatewayActivity"></param>
        /// <param name="conditionKeyValuePair"></param>
        /// <returns></returns>
        internal override NextActivityComponent GetNextActivityListFromGateway(TransitionEntity fromTransition,
                                                                               ActivityEntity currentGatewayActivity,
                                                                               out NextActivityMatchedType resultType)
        {
            NextActivityComponent child            = null;
            NextActivityComponent gatewayComponent = null;

            resultType = NextActivityMatchedType.Unknown;
            var transitionList = this.ProcessModel.GetForwardTransitionList(currentGatewayActivity.ActivityID).ToList();

            if (currentGatewayActivity.GatewayDirectionType == GatewayDirectionEnum.AndSplit)
            {
                //判读连线上的条件是否都满足,如果都满足才可以取出后续节点列表
                //获取AndSplit的每一条后续连线上的To节点
                foreach (TransitionEntity transition in transitionList)
                {
                    child = GetNextActivityListFromGatewayCore(transition,
                                                               out resultType);

                    gatewayComponent = AddChildToGatewayComponent(fromTransition, currentGatewayActivity, gatewayComponent, child);
                }

                if (gatewayComponent == null)
                {
                    resultType = NextActivityMatchedType.WaitingForSplitting;
                }
            }
            else if (currentGatewayActivity.GatewayDirectionType == GatewayDirectionEnum.OrSplit)
            {
                //获取OrSplit的,满足条件的后续连线上的To节点
                foreach (TransitionEntity transition in transitionList)
                {
                    child = GetNextActivityListFromGatewayCore(transition,
                                                               out resultType);

                    gatewayComponent = AddChildToGatewayComponent(fromTransition, currentGatewayActivity, gatewayComponent, child);


                    if (gatewayComponent == null)
                    {
                        resultType = NextActivityMatchedType.NoneTransitionMatchedToSplit;
                    }
                }
            }
            else if (currentGatewayActivity.GatewayDirectionType == GatewayDirectionEnum.XOrSplit)
            {
                //按连线定义的优先级排序
                transitionList.Sort(new TransitionPriorityCompare());

                //获取XOrSplit的,第一条满足条件的后续连线上的To节点
                foreach (TransitionEntity transition in transitionList)
                {
                    child = GetNextActivityListFromGatewayCore(transition,
                                                               out resultType);

                    gatewayComponent = AddChildToGatewayComponent(fromTransition, currentGatewayActivity, gatewayComponent, child);
                    //退出循环
                    break;
                }

                if (gatewayComponent == null)
                {
                    resultType = NextActivityMatchedType.NoneTransitionMatchedToSplit;
                }
            }
            else if (currentGatewayActivity.GatewayDirectionType == GatewayDirectionEnum.ComplexSplit)
            {
                resultType = NextActivityMatchedType.Failed;
                throw new Exception("ComplexSplit 没有具体实现!");
            }
            else
            {
                resultType = NextActivityMatchedType.Failed;
                throw new Exception("Split 分支节点的类型不明确!");
            }

            return(gatewayComponent);
        }