Esempio n. 1
0
        /// <summary>
        /// 流转时,设置目标节点的状态,包括启动分支流程等操作。
        /// </summary>
        /// <param name="nextActivity"></param>
        /// <param name="transferParams"></param>
        private void ExecuteNextActivityActionsAndSetStatus(WfActivityBase nextActivity, WfTransferParams transferParams)
        {
            PrepareActivityAssigneesFromTransferParams(nextActivity, transferParams);

            CalculateActivityCompleteTime(nextActivity.Descriptor);

            FillAclInContext(this.SearchID, nextActivity);

            //启动分支流程
            transferParams.BranchTransferParams.ForEach(b => nextActivity.StartupBranchProcesses(b));

            if (transferParams.BranchTransferParams.Count == 0 &&
                    WfRuntime.ProcessContext.TargetActivityCanMoveTo &&
                    nextActivity.Descriptor.IsConditionActivity == false)
            {
                nextActivity.Status = WfActivityStatus.Running;
            }
            else
            {
                nextActivity.Status = WfActivityStatus.Pending;
            }

            WfRuntime.ProcessContext.ResetContextByProcess(this);
            RegisterAndPrepareActions(nextActivity.EnterActions);

            if (nextActivity.Descriptor.ActivityType == WfActivityType.CompletedActivity)
            {
                nextActivity.Status = WfActivityStatus.Completed;

                this.Status = WfProcessStatus.Completed;
                this.EndTime = DateTime.Now;

                WfRuntime.ProcessContext.ResetContextByProcess(this);

                this._ElapsedActivities.Add(nextActivity);

                RegisterAndPrepareActions(nextActivity.LeaveActions);
                RegisterAndPrepareActions(this.CompleteProcessActions);

                ExecuteNextSerialProcess(this.EntryInfo);
            }

            SyncUrlsInAssigneesFromTasks(nextActivity, WfRuntime.ProcessContext.MoveToUserTasks);

            this.ProcessPendingActivity();
        }