Example #1
0
        internal WfTransitionInstance CreateTransitionInstanceObject(WfProcessInstance processInstance,
                                                                     string transitionId,
                                                                     WfActivityInstance fromActivityInstance,
                                                                     WfActivityInstance toActivityInstance,
                                                                     TransitionTypeEnum transitionType,
                                                                     TransitionFlyingTypeEnum flyingType,
                                                                     WfAppRunner runner,
                                                                     int conditionParseResult)
        {
            var entity = new WfTransitionInstance();

            entity.Fid              = UUIDUtils.Fid;
            entity.ProcessUid       = processInstance.ProcessUid;
            entity.ProcessInsUid    = processInstance.Fid;
            entity.TransitionNodeId = transitionId;
            entity.TransitionType   = transitionType.ToString();// WfTransitionInstanceType.Forward;
            entity.JumpType         = (int)flyingType;

            //构造活动节点数据
            entity.SourceActivityInsUid   = fromActivityInstance.Fid;
            entity.SourceActivityNodeId   = fromActivityInstance.NodeId;
            entity.SourceActivityNodeType = fromActivityInstance.ActivityType;
            entity.SourceActivityNodeName = fromActivityInstance.ActivityName;
            entity.TargetActivityInsUid   = toActivityInstance.Fid;
            entity.TargetActivityNodeId   = toActivityInstance.NodeId;
            entity.TargetActivityNodeType = toActivityInstance.ActivityType;
            entity.TargetActivityNodeName = toActivityInstance.ActivityName;

            entity.WalkState = conditionParseResult;
            //entity.CreatedByUserID = runner.UserID;
            //entity.CreatedByUserName = runner.UserName;
            //entity.CreatedDateTime = System.DateTime.Now;

            return(entity);
        }
Example #2
0
        public bool TurnTask(string taskId, WfAppRunner runner)
        {
            TaskManager tim  = new TaskManager(_dataAccessor, _loggerFactory);
            WfTask      task = tim.GetTask(taskId);

            if (task == null)
            {
                throw new FapException("任务不存在");
            }

            Performer turner                 = runner.Turners[0];
            ActivityInstanceManager aim      = new ActivityInstanceManager(_dataAccessor, _loggerFactory);
            WfActivityInstance      activity = aim.GetByFid(task.ActivityInsUid);

            activity.AssignedToUserIds   = activity.AssignedToUserIds.Replace(runner.UserId, turner.UserId);
            activity.AssignedToUserNames = activity.AssignedToUserNames.Replace(runner.UserName, turner.UserName);
            aim.Update(activity);

            task.ExecutorEmpUid  = turner.UserId;
            task.ExecutorEmpName = turner.UserName;
            task.UpdateBy        = runner.UserId;
            task.UpdateName      = runner.UserName;
            task.UpdateDate      = DateTimeUtils.CurrentDateStr;
            tim.Update(task);

            TaskAdviceManager tam = new TaskAdviceManager(_dataAccessor, _applicationContext, _loggerFactory);

            tam.RecordWhenTurnTask(runner.ProcessUid, runner.CurrNodeId, runner.Comment, turner.UserId, turner.UserName);


            return(true);
        }
Example #3
0
        private async Task SendProgress(string nextStepId,
                                        string assignToUserIds,
                                        string assignToUserNames,
                                        JsonModel jsonModel,
                                        WfProcessInstance processInstance,
                                        WfProcess process,
                                        WfActivityInstance currActIns)
        {
            var nextAct = process.GetActivity(nextStepId);

            if (nextAct == null)
            {
                jsonModel.statusCode = 300;
                jsonModel.message    = $"流程 {process.Name}的节点 {nextStepId} 找不到!";
                return;
            }

            var nextActInstance = CreateActivityInstance(process,
                                                         processInstance,
                                                         nextAct,
                                                         WfActivityState.Running,
                                                         assignToUserIds,
                                                         assignToUserNames);

            nextActInstance.PreActInstanceId = currActIns.Id;
            processInstance.CurrActivityName = nextActInstance.ActivityName;
            await WfActivityInstanceRepository.SaveAsync(nextActInstance);
        }
Example #4
0
        public GatewayExecutedResult CompleteAutomaticlly(WfProcessInstance processInstance,
                                                          string transitionGUID,
                                                          WfActivityInstance fromActivityInstance)
        {
            var gatewayActivityInstance = base.CreateActivityInstanceObject(base.GatewayActivity, processInstance);

            gatewayActivityInstance.DirectionType = GatewayDirectionEnum.OrSplit.ToString();

            base.InsertActivityInstance(gatewayActivityInstance);

            base.CompleteActivityInstance(gatewayActivityInstance.Fid);

            gatewayActivityInstance.ActivityState = ActivityStateEnum.Completed.ToString();
            base.GatewayActivityInstance          = gatewayActivityInstance;

            //写节点转移实例数据
            base.InsertTransitionInstance(processInstance,
                                          transitionGUID,
                                          fromActivityInstance,
                                          gatewayActivityInstance,
                                          TransitionTypeEnum.Forward,
                                          TransitionFlyingTypeEnum.NotFlying);

            GatewayExecutedResult result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Successed);

            return(result);
        }
Example #5
0
        /// <summary>
        /// 创建活动任务转移实例数据
        /// </summary>
        /// <param name="toActivity">活动</param>
        /// <param name="processInstance">流程实例</param>
        /// <param name="fromActivityInstance">开始活动实例</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">跳跃类型</param>
        /// <param name="activityResource">活动资源</param>
        /// <param name="session">会话</param>
        internal override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity,
                                                                    WfProcessInstance processInstance,
                                                                    WfActivityInstance fromActivityInstance,
                                                                    string transitionGUID,
                                                                    TransitionTypeEnum transitionType,
                                                                    TransitionFlyingTypeEnum flyingType)
        {
            //实例化Activity
            var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, AppRunner);

            //进入运行状态
            toActivityInstance.ActivityState       = ActivityStateEnum.Ready.ToString();
            toActivityInstance.AssignedToUserIds   = GenerateActivityAssignedUserIDs(toActivity.Performers);
            toActivityInstance.AssignedToUserNames = GenerateActivityAssignedUserNames(toActivity.Performers);

            //插入活动实例数据
            base.ActivityInstanceManager.Insert(toActivityInstance);

            //插入任务数据
            base.CreateNewTask(toActivityInstance, toActivity);

            //插入转移数据
            InsertTransitionInstance(processInstance,
                                     transitionGUID,
                                     fromActivityInstance,
                                     toActivityInstance,
                                     transitionType,
                                     flyingType,
                                     AppRunner);
        }
        /// <summary>
        /// 检查活动实例是否可以完成
        /// </summary>
        /// <param name="activityInsUid"></param>
        /// <returns></returns>
        internal bool IsComplete(string activityInsUid)
        {
            WfActivityInstance wfActivityInstance = _dataAccessor.Get <WfActivityInstance>(activityInsUid, false);
            string             activityType       = wfActivityInstance.ActivityType;
            string             method             = wfActivityInstance.ApproverMethod;

            //检查是否当前节点已经审批完成,否则不查找下一级节点
            if ((activityType == WfActivityType.TaskNode || activityType == WfActivityType.TimerNode) && method == ApproverMethodEnum.Queue.ToString())
            {
                //队列中存在等待状态的 即为未完成
                DynamicParameters param = new DynamicParameters();
                param.Add("ActivityInsUid", activityInsUid);
                int count = _dataAccessor.Count("WfTask", $"ActivityInsUid=@ActivityInsUid and TaskState='{WfTaskState.Waiting}'", param);
                return(count > 0 ? false : true);
            }
            else if (activityType == WfActivityType.SignNode)
            {
                //会签,检查通过率
                DynamicParameters param = new DynamicParameters();
                param.Add("ActivityInsUid", activityInsUid);
                int totalCount    = _dataAccessor.Count("WfTask", $"ActivityInsUid=@ActivityInsUid", param);
                int completeCount = _dataAccessor.Count("WfTask", $"ActivityInsUid=@ActivityInsUid and TaskState='{WfTaskState.Completed}'", param);
                if (completeCount / totalCount * 100 >= wfActivityInstance.PassingRate)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            return(true);
        }
        /// <summary>
        /// 更新活动节点的Token数目
        /// </summary>
        /// <param name="activityId"></param>
        /// <param name="runner"></param>
        /// <param name="wfLinqDataContext"></param>
        internal void IncreaseTokensHad(string activityInsId, WfAppRunner runner)
        {
            WfActivityInstance activityInstance = GetByFid(activityInsId);

            activityInstance.TokensHad += 1;
            Update(activityInstance);
        }
        /// <summary>
        /// 根据主节点复制子节点
        /// </summary>
        /// <param name="main"></param>
        /// <returns></returns>
        internal WfActivityInstance CreateActivityInstanceObject(WfActivityInstance main)
        {
            WfActivityInstance instance = new WfActivityInstance();

            instance.Fid                 = UUIDUtils.Fid;
            instance.ActivityName        = main.ActivityName;
            instance.ActivityType        = main.ActivityType;
            instance.DirectionType       = main.DirectionType;
            instance.ProcessInsUid       = main.ProcessInsUid;
            instance.AppName             = main.AppName;
            instance.BillUid             = main.BillUid;
            instance.ProcessState        = main.ProcessState;
            instance.AppEmpUid           = main.AppEmpUid;
            instance.TokensRequired      = 1;
            instance.TokensHad           = 1;
            instance.AssignedToUserIds   = main.AssignedToUserIds;
            instance.AssignedToUserNames = main.AssignedToUserNames;
            instance.ActivityState       = main.ActivityState;
            instance.CanRenewInstance    = 0;
            instance.StartTime           = DateTimeUtils.CurrentDateTimeStr;
            instance.NodeId              = main.NodeId;
            instance.NodeName            = main.NodeName;
            instance.BusinessUid         = main.BusinessUid;
            instance.AppStartTime        = main.AppStartTime;

            return(instance);
        }
Example #9
0
        /// <summary>
        /// OrJoin合并时的节点完成方法
        /// 1. 如果有满足条件的OrJoin前驱转移,则会重新生成新的OrJoin节点实例
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="fromActivityInstance">起始活动实例</param>
        /// <param name="activityResource">活动资源</param>
        /// <param name="session">会话</param>
        public GatewayExecutedResult CompleteAutomaticlly(WfProcessInstance processInstance,
                                                          string transitionGUID,
                                                          WfActivityInstance fromActivityInstance)
        {
            //检查是否有运行中的合并节点实例
            WfActivityInstance joinNode = base.ActivityInstanceManager.GetActivityInstanceRunning(
                processInstance.Fid,
                base.GatewayActivity.ActivityID);

            int tokensRequired = 0;
            int tokensHad      = 0;

            if (joinNode == null)
            {
                var joinActivityInstance = base.CreateActivityInstanceObject(base.GatewayActivity, processInstance);

                //计算总需要的Token数目
                joinActivityInstance.TokensRequired = GetTokensRequired(processInstance.Fid);
                joinActivityInstance.TokensHad      = 1;
                tokensRequired = joinActivityInstance.TokensRequired;

                //进入运行状态
                joinActivityInstance.ActivityState = ActivityStateEnum.Running.ToString();
                //joinActivityInstance.DirectionType =GatewayDirectionEnum.AndJoin.ToString();

                base.InsertActivityInstance(joinActivityInstance);
                base.InsertTransitionInstance(processInstance,
                                              transitionGUID,
                                              fromActivityInstance,
                                              joinActivityInstance,
                                              TransitionTypeEnum.Forward,
                                              TransitionFlyingTypeEnum.NotFlying);
            }
            else
            {
                //更新节点的活动实例属性
                base.GatewayActivityInstance = joinNode;
                tokensRequired = base.GatewayActivityInstance.TokensRequired;
                tokensHad      = base.GatewayActivityInstance.TokensHad;
                //更新Token数目
                base.ActivityInstanceManager.IncreaseTokensHad(base.GatewayActivityInstance.Fid, base._runner);
                base.InsertTransitionInstance(processInstance,
                                              transitionGUID,
                                              fromActivityInstance,
                                              joinNode,
                                              TransitionTypeEnum.Forward,
                                              TransitionFlyingTypeEnum.NotFlying);
            }
            if ((tokensHad + 1) == tokensRequired)
            {
                //如果达到完成节点的Token数,则设置该节点状态为完成
                base.CompleteActivityInstance(base.GatewayActivityInstance.Fid);
                base.GatewayActivityInstance.ActivityState = ActivityStateEnum.Completed.ToString();
            }

            GatewayExecutedResult result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Successed);

            return(result);
        }
Example #10
0
 /// <summary>
 /// 插入任务数据
 /// </summary>
 /// <param name="activity"></param>
 /// <param name="performer"></param>
 /// <param name="runner"></param>
 internal void Insert(WfActivityInstance activity,
                      Performer performer,
                      int sort,
                      string taskState = "Handling",
                      bool isSignTask  = false)
 {
     Insert(activity, performer.UserId, performer.UserName,
            sort, taskState, isSignTask);
 }
Example #11
0
 /// <summary>
 /// 创建工作项及转移数据
 /// </summary>
 /// <param name="toActivity">活动</param>
 /// <param name="processInstance">流程实例</param>
 /// <param name="fromActivityInstance">起始活动实例</param>
 /// <param name="transitionGUID">转移GUID</param>
 /// <param name="transitionType">转移类型</param>
 /// <param name="flyingType">跳跃类型</param>
 /// <param name="activityResource">活动资源</param>
 /// <param name="session">Session</param>
 internal virtual void CreateActivityTaskTransitionInstance(ActivityEntity toActivity,
                                                            WfProcessInstance processInstance,
                                                            WfActivityInstance fromActivityInstance,
                                                            String transitionGUID,
                                                            TransitionTypeEnum transitionType,
                                                            TransitionFlyingTypeEnum flyingType
                                                            )
 {
 }
Example #12
0
        /// <summary>
        /// 创建节点对象
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="activity">活动</param>
        /// <param name="runner">执行者</param>
        protected WfActivityInstance CreateActivityInstanceObject(ActivityEntity activity,
                                                                  WfProcessInstance processInstance,
                                                                  WfAppRunner runner)
        {
            WfActivityInstance entity = ActivityInstanceManager.CreateActivityInstanceObject(
                processInstance,
                activity,
                runner);

            return(entity);
        }
Example #13
0
        public GatewayExecutedResult CompleteAutomaticlly(WfProcessInstance processInstance,
                                                          string transitionGUID,
                                                          WfActivityInstance fromActivityInstance)
        {
            GatewayExecutedResult result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Unknown);

            bool canRenewInstance = false;

            //检查是否有运行中的合并节点实例
            WfActivityInstance joinNode = base.ActivityInstanceManager.GetActivityInstanceRunning(
                processInstance.Fid,
                base.GatewayActivity.ActivityID);

            if (joinNode == null)
            {
                canRenewInstance = true;
            }
            else
            {
                //判断是否可以激活下一步节点
                canRenewInstance = (joinNode.CanRenewInstance == 1);
                if (!canRenewInstance)
                {
                    result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.FallBehindOfXOrJoin);
                    return(result);
                }
            }

            if (canRenewInstance)
            {
                var gatewayActivityInstance = base.CreateActivityInstanceObject(base.GatewayActivity, processInstance);

                gatewayActivityInstance.DirectionType = GatewayDirectionEnum.XOrJoin.ToString();

                base.InsertActivityInstance(gatewayActivityInstance);

                base.CompleteActivityInstance(gatewayActivityInstance.Fid);

                gatewayActivityInstance.ActivityState = ActivityStateEnum.Completed.ToString();
                base.GatewayActivityInstance          = gatewayActivityInstance;

                //写节点转移实例数据
                base.InsertTransitionInstance(processInstance,
                                              transitionGUID,
                                              fromActivityInstance,
                                              gatewayActivityInstance,
                                              TransitionTypeEnum.Forward,
                                              TransitionFlyingTypeEnum.NotFlying);

                result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Successed);
            }
            return(result);
        }
        /// <summary>
        /// 创建活动任务转移数据
        /// </summary>
        /// <param name="toActivity">目的活动</param>
        /// <param name="processInstance">流程实例</param>
        /// <param name="fromActivityInstance">来源活动实例</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">飞跃类型</param>
        /// <param name="activityResource">活动资源</param>
        /// <param name="session">会话</param>
        internal override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity,
                                                                    WfProcessInstance processInstance,
                                                                    WfActivityInstance fromActivityInstance,
                                                                    string transitionGUID,
                                                                    TransitionTypeEnum transitionType,
                                                                    TransitionFlyingTypeEnum flyingType)
        {
            //实例化Activity
            var toActivityInstance = CreateActivityInstanceObject(toActivity, processInstance, AppRunner);

            //进入运行状态
            toActivityInstance.ActivityState     = ActivityStateEnum.Ready.ToString();
            toActivityInstance.AssignedToUserIds = GenerateActivityAssignedUserIDs(
                toActivity.Performers);
            toActivityInstance.AssignedToUserNames = GenerateActivityAssignedUserNames(
                toActivity.Performers);

            //插入活动实例数据
            base.ActivityInstanceManager.Insert(toActivityInstance);

            //插入任务数据
            base.CreateNewTask(toActivityInstance, toActivity);

            //插入转移数据
            InsertTransitionInstance(processInstance,
                                     transitionGUID,
                                     fromActivityInstance,
                                     toActivityInstance,
                                     transitionType,
                                     flyingType, AppRunner);

            //启动子流程
            WfExecutedResult startedResult = null;
            var subProcessNode             = (SubProcessNode)toActivity.Node;

            subProcessNode.ActivityInstance = fromActivityInstance;
            WfAppRunner subRunner = CopyActivityForwardRunner(AppRunner,
                                                              new Performer()
            {
                UserId   = AppRunner.UserId,
                UserName =
                    AppRunner.UserName
            }, subProcessNode);

            var runtimeInstance = WfRuntimeManagerFactory.CreateRuntimeInstanceStartup(subRunner, _serviceProvider,
                                                                                       processInstance,
                                                                                       subProcessNode,
                                                                                       ref startedResult);

            runtimeInstance.OnWfProcessExecuted += runtimeInstance_OnWfProcessStarted;
            runtimeInstance.Execute();
        }
Example #15
0
        /// <summary>
        /// 重新生成任务(只限于会签多实例下的子节点)
        /// </summary>
        /// <param name="source"></param>
        /// <param name="instance"></param>
        internal void Renew(WfActivityInstance sourceActivity,
                            WfActivityInstance newInstance,
                            string taskState = "Handling",
                            bool isSignTask  = false)
        {
            var performer = new Performer()
            {
                UserId   = sourceActivity.AssignedToUserIds,
                UserName = sourceActivity.AssignedToUserNames
            };

            Insert(newInstance, performer, 1, taskState, isSignTask);
        }
Example #16
0
        /// <summary>
        /// 插入任务数据
        /// </summary>
        /// <param name="activity"></param>
        /// <param name="performers"></param>
        /// <param name="wfLinqDataContext"></param>
        internal void Insert(WfActivityInstance activity,
                             IList <Performer> performers,
                             string taskState = "Handling",
                             bool isSignTask  = false)
        {
            int i = 0;

            foreach (Performer performer in performers)
            {
                i++;
                Insert(activity, performer, i, taskState, isSignTask);
            }
        }
        /// <summary>
        /// 活动实例完成
        /// </summary>
        /// <param name="activityInsUid"></param>
        /// <param name="runner"></param>
        internal void Complete(string activityInsUid,
                               WfAppRunner runner, bool isLogic = true)
        {
            WfActivityInstance activityInstance = _dataAccessor.Get <WfActivityInstance>(activityInsUid, false);

            activityInstance.ActivityState = WfActivityInstanceState.Completed;
            activityInstance.ApproveState  = runner.ApproveState;
            activityInstance.EndTime       = DateTimeUtils.CurrentDateTimeStr;

            _dataAccessor.Update <WfActivityInstance>(activityInstance);
            #region 活动节点完成逻辑

            #endregion
        }
Example #18
0
        /// <summary>
        /// 创建退回类型的活动实例对象
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="backwardType">退回类型</param>
        /// <param name="backSrcActivityInstanceID">退回的活动实例ID</param>
        /// <param name="runner">登录用户</param>
        /// <returns></returns>
        protected WfActivityInstance CreateBackwardToActivityInstanceObject(WfProcessInstance processInstance, WfActivityInstance activityInstance,
                                                                            BackwardTypeEnum backwardType,
                                                                            string backSrcActivityInstanceID,
                                                                            WfAppRunner runner)
        {
            WfActivityInstance entity = ActivityInstanceManager.CreateBackwardActivityInstanceObject(
                processInstance,
                this.BackwardContext.BackwardToTaskActivity,
                activityInstance,
                backwardType,
                this.BackwardContext.BackwardToTaskActivity.ActivityID,
                runner);

            return(entity);
        }
Example #19
0
        /// <summary>
        /// 读取节点的上一步节点信息
        /// </summary>
        /// <param name="runningActivity">当前节点</param>
        /// <param name="hasPassedGatewayNode">是否经由路由节点</param>
        /// <returns></returns>
        internal List <WfActivityInstance> GetPreviousActivity(WfActivityInstance runningActivity,
                                                               bool isSendback,
                                                               out bool hasPassedGatewayNode)
        {
            hasPassedGatewayNode = false;
            var transitionList = GetTransitionList(runningActivity.ProcessInsUid).ToList();

            string backSrcActivityInstanceId = "";

            if (isSendback == true && runningActivity.BackSrcActivityId != null)
            {
                //节点时曾经发生退回的节点
                backSrcActivityInstanceId = runningActivity.BackSrcActivityId;
            }
            else
            {
                if (!string.IsNullOrWhiteSpace(runningActivity.MainActivityId))//如果是会签节点找到主节点ID
                {
                    backSrcActivityInstanceId = runningActivity.MainActivityId;
                }
                else
                {
                    backSrcActivityInstanceId = runningActivity.Fid;
                }
            }

            var aim = new ActivityInstanceManager(_dataAccessor, _loggerFactory);
            var runningTransitionList = transitionList.Where(o => o.TargetActivityInsUid == backSrcActivityInstanceId).ToList();

            List <WfActivityInstance> previousActivityList = new List <WfActivityInstance>();

            foreach (var entity in runningTransitionList)
            {
                //如果是逻辑节点,则继续查找
                if (entity.SourceActivityNodeType == WfActivityType.GatewayNode)
                {
                    GetPreviousOfGatewayActivity(transitionList, entity.SourceActivityNodeId, previousActivityList);
                    hasPassedGatewayNode = true;
                }
                else
                {
                    previousActivityList.Add(aim.GetByFid(entity.SourceActivityNodeId));
                }
            }
            return(previousActivityList);
        }
        /// <summary>
        /// 创建活动实例的对象
        /// </summary>
        /// <param name="activityEntity"></param>
        /// <param name="processInstance"></param>
        /// <returns></returns>
        internal WfActivityInstance CreateActivityInstanceObject(WfProcessInstance processIns,
                                                                 ActivityEntity activityEntity,
                                                                 WfAppRunner runner)
        {
            WfActivityInstance activity = new WfActivityInstance();

            activity.Fid                 = UUIDUtils.Fid;
            activity.ActivityName        = activityEntity.ActivityName;
            activity.ProcessUid          = processIns.ProcessUid;
            activity.ActivityType        = activityEntity.ActivityType.ToString();
            activity.ApproverMethod      = activityEntity.ApproverMethod.ToString();
            activity.DirectionType       = activityEntity.GatewayDirectionType.ToString();
            activity.ProcessInsUid       = processIns.Fid;
            activity.NodeId              = activityEntity.ActivityID;
            activity.NodeName            = activityEntity.ActivityCode;
            activity.AppName             = runner.AppName;
            activity.BillUid             = runner.BillUid;
            activity.TokensRequired      = 1;
            activity.TokensHad           = 1;
            activity.AssignedToUserIds   = runner.UserId;
            activity.AssignedToUserNames = runner.UserName;
            activity.ActivityState       = WfActivityInstanceState.Ready;
            activity.CanRenewInstance    = 0;
            activity.BusinessUid         = runner.BusinessUid;
            activity.AppEmpUid           = processIns.AppEmpUid;
            activity.AppStartTime        = processIns.StartTime;
            activity.ProcessState        = processIns.ProcessState;
            activity.StartTime           = DateTimeUtils.CurrentDateTimeStr;
            if (activityEntity.BillTemplate.IsMissing())
            {
                activity.FormTemplate = processIns.FormTemplateUid;
            }
            else
            {
                activity.FormTemplate = activityEntity.BillTemplate;
            }
            if (activityEntity.FieldItems != null && activityEntity.FieldItems.Any())
            {
                activity.FormPower = activityEntity.FieldItems.ToJson();
            }
            activity.PassingRate    = activityEntity.PassRate;
            activity.AutoExecTime   = DateTimeUtils.DateTimeFormat(DateTime.Now.AddMinutes(activityEntity.Expiration));
            activity.MessageSetting = $"{{'approver':{(activityEntity.NoticeApprover ? 1 : 0)},'applicant':{(activityEntity.NoticeApplicant ? 1 : 0)},'mail':{(activityEntity.IsMail ? 1 : 0)},'message':{(activityEntity.IsMessage ? 1 : 0)}}}";
            return(activity);
        }
Example #21
0
        /// <summary>
        /// 插入任务数据(创建任务)
        /// </summary>
        /// <param name="activity"></param>
        /// <param name="performerID"></param>
        /// <param name="performerName"></param>
        /// <param name="runnerID"></param>
        /// <param name="runnerName"></param>
        private void Insert(WfActivityInstance activityIns,
                            string performerID,
                            string performerName,
                            int sort,
                            string taskState = "Handling",
                            bool isSignTask  = false)
        {
            WfTask task = new WfTask();

            task.AppName          = activityIns.AppName;
            task.BillUid          = activityIns.BillUid;
            task.TaskName         = string.Format("{0}-{1}", activityIns.AppName, activityIns.NodeName);
            task.ActivityInsUid   = activityIns.Fid;
            task.ProcessUid       = activityIns.ProcessUid;
            task.ProcessInsUid    = activityIns.ProcessInsUid;
            task.NodeId           = activityIns.NodeId;
            task.NodeName         = activityIns.NodeName;
            task.TaskType         = WfTaskType.Manual;
            task.TaskActivityType = activityIns.ActivityType;
            task.ExecutorEmpUid   = performerID;
            task.ExecutorEmpName  = performerName;
            if ((activityIns.ActivityType == WfActivityType.TaskNode || activityIns.ActivityType == WfActivityType.TimerNode) && activityIns.ApproverMethod == ApproverMethodEnum.Queue.ToString() && sort > 1)
            {
                //当节点为普通节点审批方式为顺序完成的时候,第二个审批人需要等待
                taskState = WfTaskState.Waiting;
            }
            task.TaskState     = taskState; //1-办理状态
            task.TaskStartTime = DateTimeUtils.CurrentDateTimeStr;
            task.ApproverSort  = sort;
            task.RecordState   = 1;
            task.BusinessUid   = activityIns.BusinessUid;
            //task.BizName = activityInstance.BizName;
            task.AppEmpUid    = activityIns.AppEmpUid;
            task.AppStartTime = activityIns.AppStartTime;
            task.ProcessState = activityIns.ProcessState;
            task.IsSignTask   = isSignTask ? 1 : 0;
            //插入任务数据
            Insert(task);

            if (task.TaskState == WfTaskState.Handling)
            {
                SendMessage(activityIns, task);
            }
        }
Example #22
0
        /// <summary>
        /// 插入连线实例的方法
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="fromActivityInstance">来源活动实例</param>
        /// <param name="toActivityInstance">目的活动实例</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">飞跃类型</param>
        /// <param name="runner">运行者</param>
        /// <param name="session">会话</param>
        /// <returns></returns>
        internal virtual void InsertTransitionInstance(WfProcessInstance processInstance,
                                                       string transitionGUID,
                                                       WfActivityInstance fromActivityInstance,
                                                       WfActivityInstance toActivityInstance,
                                                       TransitionTypeEnum transitionType,
                                                       TransitionFlyingTypeEnum flyingType)
        {
            var tim = new TransitionInstanceManager(_serviceProvider);
            var transitionInstanceObject = tim.CreateTransitionInstanceObject(processInstance,
                                                                              transitionGUID,
                                                                              fromActivityInstance,
                                                                              toActivityInstance,
                                                                              transitionType,
                                                                              flyingType,
                                                                              _runner,
                                                                              (byte)ConditionParseResultEnum.Passed);

            tim.Insert(transitionInstanceObject);
        }
Example #23
0
        /// <summary>
        /// 由节点分配的人员信息生成PerformerList数据结构
        /// </summary>
        /// <param name="activityInstance">活动实例</param>
        /// <returns>人员列表</returns>
        protected PerformerList AntiGenerateActivityPerformerList(WfActivityInstance activityInstance)
        {
            var performerList = new PerformerList();

            if (!string.IsNullOrEmpty(activityInstance.AssignedToUserIds) &&
                !string.IsNullOrEmpty(activityInstance.AssignedToUserNames))
            {
                var assignedToUserIDs   = activityInstance.AssignedToUserIds.Split(',');
                var assignedToUserNames = activityInstance.AssignedToUserNames.Split(',');

                for (var i = 0; i < assignedToUserIDs.Length; i++)
                {
                    performerList.Add(new Performer {
                        UserId = assignedToUserIDs[i], UserName = assignedToUserNames[i]
                    });
                }
            }
            return(performerList);
        }
Example #24
0
        /// <summary>
        /// 插入连线实例的方法
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="transitionId">转移ID</param>
        /// <param name="fromActivityInstance">起始活动实例</param>
        /// <param name="toActivityInstance">到达活动实例</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">跳跃类型</param>
        /// <param name="runner">执行者</param>
        /// <param name="session">Session</param>
        internal virtual void InsertTransitionInstance(WfProcessInstance processInstance,
                                                       String transitionId,
                                                       WfActivityInstance fromActivityInstance,
                                                       WfActivityInstance toActivityInstance,
                                                       TransitionTypeEnum transitionType,
                                                       TransitionFlyingTypeEnum flyingType,
                                                       WfAppRunner runner)
        {
            var tim = new TransitionInstanceManager(_dataAccessor, _loggerFactory);
            var transitionInstanceObject = tim.CreateTransitionInstanceObject(processInstance,
                                                                              transitionId,
                                                                              fromActivityInstance,
                                                                              toActivityInstance,
                                                                              transitionType,
                                                                              flyingType,
                                                                              runner,
                                                                              (byte)ConditionParseResultEnum.Passed);

            tim.Insert(transitionInstanceObject);
        }
Example #25
0
        /// <summary>
        /// 创建任务的虚方法
        /// 1. 对于自动执行的工作项,无需重写该方法
        /// 2. 对于人工执行的工作项,需要重写该方法,插入待办的任务数据
        /// </summary>
        /// <param name="activityResource">活动资源</param>
        /// <param name="activity">活动实例</param>
        internal virtual void CreateNewTask(WfActivityInstance toActivityInstance,
                                            ActivityEntity activity)
        {
            if (activity.Performers == null)
            {
                throw new WorkflowException("无法创建任务,流程流转下一步的办理人员不能为空!");
            }

            if (this.AppRunner.NextActivity != null && this.AppRunner.NextActivity.ActivityID == toActivityInstance.NodeId && (this.AppRunner.NextActivity.Performers?.Any() ?? false))
            {
                //采用指定审批人
                TaskManager.Insert(toActivityInstance,
                                   this.AppRunner.NextActivity.Performers);
            }
            else
            {
                //采用默认审批人
                TaskManager.Insert(toActivityInstance,
                                   activity.Performers);
            }
        }
Example #26
0
        /// <summary>
        /// 生成回退节点
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="process"></param>
        /// <param name="currActIns"></param>
        /// <returns></returns>
        private async Task FallBackProgress(WfProcessInstance processInstance,
                                            WfProcess process,
                                            WfActivityInstance currActIns,
                                            string backStepId)
        {
            var preActInstance = await WfActivityInstanceRepository.GetLatestActivityAsync(processInstance.Id, backStepId);

            var backActivity    = process.GetActivity(backStepId);
            var backActInstance = CreateActivityInstance(process,
                                                         processInstance,
                                                         backActivity,
                                                         WfActivityState.Running,
                                                         preActInstance.AssignToUserIds,
                                                         preActInstance.AssignToUserNames);

            backActInstance.PreActInstanceId       = preActInstance.PreActInstanceId;
            backActInstance.BackActivityInstanceId = currActIns.Id;
            processInstance.CurrActivityName       = backActInstance.ActivityName;
            currActIns.ActivityState = WfActivityState.Sendbacked;
            await WfActivityInstanceRepository.SaveAsync(backActInstance);
        }
        /// <summary>
        /// 创建活动实例的对象
        /// </summary>
        /// <param name="activityNode"></param>
        /// <param name="processInstance"></param>
        /// <returns></returns>
        internal WfActivityInstance CreateBackwardActivityInstanceObject(WfProcessInstance process,
                                                                         ActivityEntity activityNode,
                                                                         WfActivityInstance activity,
                                                                         BackwardTypeEnum backwardType,
                                                                         string backSrcActivityId,
                                                                         WfAppRunner runner)
        {
            WfActivityInstance instance = new WfActivityInstance();

            instance.Fid                 = UUIDUtils.Fid;
            instance.ActivityName        = activityNode.ActivityName;
            instance.ActivityType        = activityNode.ActivityType.ToString();
            instance.DirectionType       = activityNode.GatewayDirectionType.ToString();
            instance.ProcessInsUid       = process.Fid;
            instance.NodeId              = activityNode.ActivityID;
            instance.NodeName            = activityNode.ActivityName;
            instance.AppName             = activity.AppName;
            instance.BillUid             = activity.BillUid;
            instance.BackwardType        = backwardType.ToString();
            instance.BackSrcActivityId   = backSrcActivityId;
            instance.TokensRequired      = 1;
            instance.TokensHad           = 1;
            instance.AssignedToUserIds   = runner.UserId;
            instance.AssignedToUserNames = runner.UserName;
            instance.UpdateDate          = DateTimeUtils.CurrentDateTimeStr;
            instance.ActivityState       = WfActivityInstanceState.Ready;
            instance.CanRenewInstance    = 0;
            activity.BusinessUid         = process.BusinessUid;
            instance.AppEmpUid           = process.AppEmpUid;
            instance.StartTime           = process.StartTime;
            instance.ProcessState        = process.ProcessState;
            instance.StartTime           = DateTimeUtils.CurrentDateTimeStr;
            if (activityNode.FieldItems.Any())
            {
                instance.FormPower = activityNode.FieldItems.ToJson();
            }

            return(instance);
        }
Example #28
0
        /// <summary>
        /// 创建新流程实例,根据流程模板
        /// </summary>
        /// <param name="runner"></param>
        /// <param name="func"></param>
        /// <param name="service"></param>
        /// <returns></returns>
        internal WfProcessInstance CreateProcessInstance(WfAppRunner runner, WfProcessInstance parentProcessInstance,
                                                         WfActivityInstance subProcessNode, Action <WfAppRunner, WfProcessInstance, WfProcess> func)
        {
            WfProcess         wfProcess         = _dataAccessor.Get <WfProcess>(runner.ProcessUid, false);
            WfProcessInstance wfProcessInstance = new WfProcessInstance();

            wfProcessInstance.Fid             = UUIDUtils.Fid;;
            wfProcessInstance.ProcessUid      = wfProcess.Fid;
            wfProcessInstance.BillUid         = runner.BillUid;
            wfProcessInstance.BizName         = runner.BillData.BillCode;//易标识
            wfProcessInstance.AppEmpUid       = runner.UserId;
            wfProcessInstance.AppEmpName      = runner.UserName;
            wfProcessInstance.StartTime       = DateTimeUtils.CurrentDateStr;
            wfProcessInstance.ProcessState    = WfProcessInstanceState.Running;
            wfProcessInstance.ProcessName     = wfProcess.ProcessName;
            wfProcessInstance.ProcessDesc     = wfProcess.Description;
            wfProcessInstance.IsHasForm       = 1;
            wfProcessInstance.BusinessUid     = runner.BusinessUid;
            wfProcessInstance.IsHandling      = 0; //未处理状态
            wfProcessInstance.MessageSetting  = wfProcess.MessageSetting;
            wfProcessInstance.FormTemplateUid = wfProcess.FormTemplateUid;
            wfProcessInstance.FormType        = wfProcess.FormType;
            wfProcessInstance.BillTable       = wfProcess.BillTable;
            if (parentProcessInstance != null)
            {
                //流程的Parent信息
                wfProcessInstance.ParentProcessInsUid  = parentProcessInstance.Fid;
                wfProcessInstance.ParentProcessUid     = parentProcessInstance.ProcessUid;
                wfProcessInstance.InvokeActivityInsUid = subProcessNode.Fid;
                wfProcessInstance.InvokeActivityUid    = subProcessNode.NodeId.ToInt();
            }
            if (func != null)
            {
                func(runner, wfProcessInstance, wfProcess);
            }

            return(wfProcessInstance);
        }
Example #29
0
        /// <summary>
        /// 结束节点活动及转移实例化,没有任务数据
        /// </summary>
        /// <param name="toActivity">当前Activity</param>
        /// <param name="processInstance">流程实例</param>
        /// <param name="fromActivityInstance">起始活动实例</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">跳跃类型</param>
        /// <param name="activityResource">活动资源</param>
        /// <param name="session">Session</param>
        internal override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity,
                                                                    WfProcessInstance processInstance,
                                                                    WfActivityInstance fromActivityInstance,
                                                                    string transitionGUID,
                                                                    TransitionTypeEnum transitionType,
                                                                    TransitionFlyingTypeEnum flyingType)
        {
            var toActivityInstance = base.CreateActivityInstanceObject(toActivity,
                                                                       processInstance, AppRunner);

            base.ActivityInstanceManager.Insert(toActivityInstance);

            base.ActivityInstanceManager.Complete(toActivityInstance.Fid,
                                                  AppRunner);

            //写节点转移实例数据
            base.InsertTransitionInstance(processInstance,
                                          transitionGUID,
                                          fromActivityInstance,
                                          toActivityInstance,
                                          transitionType,
                                          flyingType, AppRunner);
        }
        /// <summary>
        /// 创建运行时实例对象
        /// </summary>
        /// <param name="runner">执行者</param>
        /// <param name="result">结果对象</param>
        /// <returns>运行时实例对象</returns>
        public static WfRuntimeManager CreateRuntimeInstanceAppRunning(
            WfAppRunner runner, IServiceProvider serviceProvider,
            ref WfExecutedResult result)
        {
            //检查传人参数是否有效
            var rmins = new WfRuntimeManagerAppRunning(serviceProvider);

            rmins.WfExecutedResult = result = new WfExecutedResult();
            if (string.IsNullOrEmpty(runner.BillUid) ||
                runner.ProcessUid == null || runner.CurrActivityInsUid == null || runner.CurrProcessInsUid == null || runner.CurrWfTaskUid == null || runner.CurrNodeId == null)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.RunApp_ErrorArguments;
                result.Message       = "方法参数错误,无法运行流程!";
                return(rmins);
            }

            //传递runner变量
            rmins.AppRunner = runner;

            var aim = new ActivityInstanceManager(serviceProvider);
            WfActivityInstance wfActivityInstance = aim.GetByFid(runner.CurrActivityInsUid);

            if (wfActivityInstance.ActivityState == WfActivityInstanceState.Completed)
            {
                result.Status  = WfExecutedStatus.Exception;
                result.Message = "任务已经完成,不需要再审批。";
                return(rmins);
            }
            rmins.RunningActivityInstance = wfActivityInstance;
            rmins.ProcessModel            = new ProcessModel(serviceProvider, runner.ProcessUid, runner.BillUid);
            var tm = new TaskManager(serviceProvider);

            rmins.TaskView = tm.GetTask(runner.CurrWfTaskUid);
            return(rmins);
        }