private static IWfTransitionDescriptor CreateMainStreamActivities(IWfActivity activityToAppend, IWfActivity startActivity, IWfActivity endActivity, IWfTransitionDescriptor entryTransition, WfControlOperationType operationType)
        {
            bool useOriginal = true;
            IWfTransitionDescriptor resultTransition = null;

            if (activityToAppend.Process.MainStream != null)
            {
                IWfActivityDescriptor startActDesp = startActivity.GetMainStreamActivityDescriptor();
                IWfActivityDescriptor endActDesp = endActivity.GetMainStreamActivityDescriptor();

                if (startActDesp != null && endActDesp != null)
                {
                    WfCopyMainStreamContext context = new WfCopyMainStreamContext(startActDesp, endActivity.Descriptor, entryTransition, true);

                    FillCopyContext(context.StartActivityDescriptor, endActDesp, context, operationType);

                    resultTransition = context.StartActivityDescriptor.GenerateCopiedActivitiesDescriptors(activityToAppend.Process, activityToAppend.Descriptor, context, operationType);
                    useOriginal = false;
                }
            }

            if (useOriginal)
                OriginalCreateMainStreamActivities(activityToAppend, startActivity, endActivity, entryTransition, operationType);

            return resultTransition;
        }
예제 #2
0
		public WfControlNextStep(IWfActivity toActivity)
		{
			toActivity.NullCheck("toActivity");

			this.ActivityDescriptor = toActivity.Descriptor;
			this._Candidates = toActivity.Candidates.GetSelectedAssignees();
		}
        public WfClientAuthorizationInfo GetAuthorizationInfo(IWfProcess process, IWfActivity originalActivity, WfClientUser user)
        {
            string userID = user.IsNotNullOrEmpty() ? user.ID : string.Empty;
            string originalActivityID = originalActivity != null ? originalActivity.ID : string.Empty;

            return GetAuthorizationInfo(process, originalActivityID, userID);
        }
        protected WfAddAndEditActivityExecutorBase(IWfActivity operatorActivity, IWfActivity targetActivity, WfActivityDescriptorCreateParams createParams, WfControlOperationType operationType)
            : base(operatorActivity, targetActivity, operationType)
        {
            createParams.NullCheck("createParams");

            this.CreateParams = createParams;
        }
		public WfAddApproverExecutor(IWfActivity operatorActivity, IWfActivity targetActivity, WfAssigneeCollection assignees)
			: base(operatorActivity, targetActivity, WfControlOperationType.AddApprover)
		{
			assignees.NullCheck("assingees");

			this.Assignees.CopyFrom(assignees);
		}
		public WfAdminDeleteActivityExecutor(IWfActivity operatorActivity, IWfActivityDescriptor targetActivityDescriptor, bool syncMSObject) :
			base(operatorActivity, WfControlOperationType.AdminDeleteActivity)
		{
			targetActivityDescriptor.NullCheck("targetActivityDescriptor");

			this._TargetActivityDescriptor = targetActivityDescriptor;
			this._SyncMainStreamObject = syncMSObject;
		}
        /// <summary>
        /// 历史实现规则。当流程不存在MainStream属性时,采用从当前流程活动中爬出来
        /// </summary>
        /// <param name="activityToAppend"></param>
        /// <param name="startActivity"></param>
        /// <param name="endActivity"></param>
        /// <param name="operationType"></param>
        private static void OriginalCreateMainStreamActivities(IWfActivity activityToAppend, IWfActivity startActivity, IWfActivity endActivity, IWfTransitionDescriptor entryTransition, WfControlOperationType operationType)
        {
            WfCopyMainStreamContext context = new WfCopyMainStreamContext(startActivity.Descriptor, endActivity.Descriptor, entryTransition, false);

            FillCopyContext(context.StartActivityDescriptor, endActivity.Descriptor, context, operationType);

            context.StartActivityDescriptor.GenerateCopiedActivitiesDescriptors(activityToAppend.Process, activityToAppend.Descriptor, context, operationType);
        }
예제 #8
0
        protected WfTransition(SerializationInfo info, StreamingContext context)
        {
			this._ID = info.GetString("ID");
            this._FromActivity = (WfActivityBase)info.GetValue("FromActivity", typeof(WfActivityBase));
            this._ToActivity = (WfActivityBase)info.GetValue("ToActivity", typeof(WfActivityBase));
			this._IsAborted = info.GetBoolean("IsAborted");
			this._StartTime = info.GetDateTime("StartTime");
        }
        public WfCirculateExecutor(IWfActivity operatorActivity,
                                IWfActivity targetActivity,
                                IEnumerable<IUser> circulators)
            : base(operatorActivity, targetActivity, WfControlOperationType.Circulate)
        {
            circulators.NullCheck("circulators");

            this.Circulators = circulators;
        }
		public WfStartBranchProcessExecutor(IWfActivity operatorActivity, IWfActivity ownerActivity, IWfBranchProcessTemplateDescriptor template)
			: base(operatorActivity, WfControlOperationType.StartBranchProcess)
		{
			ownerActivity.NullCheck("ownerActivity");
			template.NullCheck("template");

			this.OwnerActivity = ownerActivity;
			this.BranchTransferParams = new WfBranchProcessTransferParams(template);
		}
예제 #11
0
		public WfControlNextStep(IWfTransitionDescriptor transition, IWfActivity toActivity)
		{
			transition.NullCheck("transition");
			toActivity.NullCheck("toActivity");

			this.ActivityDescriptor = toActivity.Descriptor;
			this._Candidates = toActivity.Candidates.GetSelectedAssignees();;
			this.TransitionDescriptor = transition;
		}
        protected WfActivityRelativeExecutorBase(IWfActivity operatorActivity, IWfActivity targetActivity, WfControlOperationType operationType) :
            base(operatorActivity, operationType)
        {
            targetActivity.NullCheck("targetActivity");
            TargetActivity = targetActivity;

            if (OperatorActivity == null)
                OperatorActivity = targetActivity;
        }
        /// <summary>
        /// 在指定的活动点之后,添加从startActivity与endActivity之间复制出来的
        /// </summary>
        /// <param name="activityToAppend">复制的活动需要添加到哪一个活动之后</param>
        /// <param name="startActivity">需要复制的活动的起始点</param>
        /// <param name="endActivity">需要复制的活动的终止点</param>
        /// <param name="entryTransition"></param>
        /// <param name="operationType">操作类型</param>
        /// <returns>返回的第一个Clone活动的出线</returns>
        public IWfTransitionDescriptor CopyMainStreamActivities(IWfActivity activityToAppend, IWfActivity startActivity, IWfActivity endActivity, IWfTransitionDescriptor entryTransition, WfControlOperationType operationType)
        {
            activityToAppend.NullCheck("activityToAppend");

            //沈峥注释,和WfMoveToExecutor中,是否按退回线进行的判断进行匹配
            ExceptionHelper.TrueThrow(startActivity.Status == WfActivityStatus.NotRunning, "退件时所指定活动必须是已执行过的活动");

            //沈峥重构后的实现
            return CreateMainStreamActivities(activityToAppend, startActivity, endActivity, entryTransition, operationType);
        }
		public WfPauseProcessExecutor(IWfActivity operatorActivity, IWfProcess pauseProcess)
			: base(operatorActivity, WfControlOperationType.PauseProcess)
		{
			pauseProcess.NullCheck("pauseProcess");

			this.PauseProcess = pauseProcess;

			if (OperatorActivity == null)
				OperatorActivity = PauseProcess.CurrentActivity;
		}
		public WfAsyncCancelProcessExecutor(IWfActivity operatorActivity, IWfProcess process)
			: base(operatorActivity, WfControlOperationType.AsyncCancelProcess)
		{
			process.NullCheck("process");

			this.Process = process;

			if (this.OperatorActivity == null)
				this.OperatorActivity = process.CurrentActivity;
		}
		public WfResumeProcessExecutor(IWfActivity operatorActivity, IWfProcess resumeProcess)
			: base(operatorActivity, WfControlOperationType.ResumeProcess)
		{
			resumeProcess.NullCheck("resumeProcess");

			this.ResumeProcess = resumeProcess;

			if (OperatorActivity == null)
				OperatorActivity = ResumeProcess.CurrentActivity;
		}
예제 #17
0
        /// <summary>
        /// 得到某个流程实例点的送阅人
        /// </summary>
        /// <param name="activity"></param>
        /// <returns></returns>
        public static OguDataCollection <IUser> GetActivityCirculators(IWfActivity activity)
        {
            OguDataCollection <IUser> result = new OguDataCollection <IUser>();

            if (activity != null)
            {
                result = activity.Context.GetValue("circulators", result);
            }

            return(result);
        }
예제 #18
0
        private static IWfActivity GetDefaultActivity()
        {
            IWfActivity result = null;

            if (WfClientContext.Current.CurrentActivity != null)
            {
                result = WfClientContext.Current.CurrentActivity.ApprovalRootActivity;
            }

            return(result);
        }
예제 #19
0
        private static int FindTargetActivityIndex(IWfActivity currentActivity)
        {
            int targetIndex = currentActivity.Process.ElapsedActivities.Count - 1;

            if (currentActivity.Descriptor.ActivityType == WfActivityType.CompletedActivity)
            {
                targetIndex--;
            }

            return(targetIndex);
        }
예제 #20
0
        protected WfActivityRelativeExecutorBase(IWfActivity operatorActivity, IWfActivity targetActivity, WfControlOperationType operationType) :
            base(operatorActivity, operationType)
        {
            targetActivity.NullCheck("targetActivity");
            TargetActivity = targetActivity;

            if (OperatorActivity == null)
            {
                OperatorActivity = targetActivity;
            }
        }
		public WfExitMaintainingStatusExecutor(IWfActivity operatorActivity, IWfProcess process, bool autoProcessPendingActivity)
			: base(operatorActivity, WfControlOperationType.ExitMaintainingStatus)
		{
			process.NullCheck("process");

			this.Process = process;
			this.AutoProcessPendingActivity = autoProcessPendingActivity;

			if (this.OperatorActivity == null)
				this.OperatorActivity = process.CurrentActivity;
		}
		public WfCancelProcessExecutor(IWfActivity operatorActivity, IWfProcess cancelProcess, bool cancelAllBranchProcesses)
			: base(operatorActivity, WfControlOperationType.CancelProcess)
		{
			cancelProcess.NullCheck("cancelProcess");

			this.CancelProcess = cancelProcess;
			this.CancelAllBranchProcesses = cancelAllBranchProcesses;

			if (OperatorActivity == null)
				OperatorActivity = CancelProcess.CurrentActivity;
		}
        public override void PrepareAction(WfActionParams actionParams)
        {
            IWfActivity currentActivity = WfRuntime.ProcessContext.CurrentActivity;

            if (currentActivity != null)
            {
                //找到当前流程所有的待办,然后转为已办
                UserTaskCollection currentProcessTasks =
                    UserTaskAdapter.Instance.LoadUserTasks(builder => builder.AppendItem("PROCESS_ID",
                                                                                         currentActivity.Process.ID));

                WfRuntime.ProcessContext.DeletedUserTasks.CopyFromNotExistedTaskID(currentProcessTasks);

                UserTaskCollection toAccomplishedTasks = new UserTaskCollection();

                currentProcessTasks.ForEach(u =>
                {
                    if (u.Status == TaskStatus.Ban)
                    {
                        toAccomplishedTasks.Add(u);
                    }
                });

                UserTaskCollection userTasksInContext = RemoveTasksInContext(actionParams);

                //将上下文中的待办转到已办中
                userTasksInContext.ForEach(t => toAccomplishedTasks.Add(t));

                //将上下文中标记为已删除的从准备转已办的记录中删除
                toAccomplishedTasks.RemoveExistedTasks(WfRuntime.ProcessContext.DeletedUserTasks);

                //将待办转到已办中,便于事后恢复
                toAccomplishedTasks.ForEach(u => LeaveActivityUserTaskAction.ChangeUserTaskToAccomplishedTasks(currentActivity, u));

                WfRuntime.ProcessContext.AccomplishedUserTasks.CopyFromNotExistedTaskID(toAccomplishedTasks);

                //暂时对当前活动的处理人发送通知
                UserTaskCollection notifyTasks = BuildUserNotifiesFromActivity(currentActivity);
                AppendResourcesToNotifiers(currentActivity, notifyTasks, currentActivity.Descriptor.Process.CancelEventReceivers);

                foreach (UserTask task in notifyTasks)
                {
                    task.Status    = TaskStatus.Yue;
                    task.TaskTitle = Translator.Translate(Define.DefaultCulture,
                                                          currentActivity.Process.Descriptor.Properties.GetValue("DefaultCancelTaskPrefix", "流程被取消:")) + task.TaskTitle;
                }

                WfRuntime.ProcessContext.NotifyUserTasks.CopyFrom(notifyTasks);

                WfRuntime.ProcessContext.Acl.CopyFrom(notifyTasks.ToAcl());
                WfRuntime.ProcessContext.AbortedProcesses.AddOrReplace(currentActivity.Process);
                WfRuntime.ProcessContext.FireCancelProcessPrepareAction();
            }
        }
예제 #24
0
        public WfClientProcessInfo GetProcessInfoByActivityID(string activityID, WfClientUser user)
        {
            activityID.CheckStringIsNullOrEmpty("activityID");

            OperationContext.Current.FillContextToOguServiceContext();

            IWfProcess  process  = WfRuntime.GetProcessByActivityID(activityID);
            IWfActivity activity = process.Activities[activityID];

            return(process.ToClientProcessInfo(activity, user).FillCurrentOpinion(activity, user));
        }
예제 #25
0
        protected IWfActivity GetDefaultActivity()
        {
            IWfActivity result = null;

            if (WfClientContext.Current.OriginalActivity != null)
            {
                result = WfClientContext.Current.OriginalActivity.ApprovalRootActivity;
            }

            return(result);
        }
예제 #26
0
        internal IWfActivity InnerMoveTo(WfTransferParamsBase transferParams)
        {
            ExceptionHelper.FalseThrow <ArgumentNullException>(transferParams != null, "transferParams");

            //如果流程没有启动,且一个点都没有,则自动设为运行状态
            if (this.Status == WfProcessStatus.NotRunning && this.Activities.Count == 0)
            {
                this.Status = WfProcessStatus.Running;
            }
            else
            if (this.Status == WfProcessStatus.Completed)                     //如果流程已经结束,那么流程状态应该变为运行状态
            {
                this.Status = WfProcessStatus.Running;
            }

            CheckProcessRunningStatus();
            CheckActivityMoveToCondition();

            IWfActivity activity = null;

            //生成下一个新的活动点
            if (transferParams.NextActivityDescriptor is IWfAnchorActivityDescriptor)
            {
                activity = this.Factory.CreateAnchorActivity(this, (WfBranchesTransferParams)transferParams);
            }
            else
            {
                activity = this.Factory.CreateActivity(this, transferParams.NextActivityDescriptor);
            }

            activity.Operator = transferParams.Operator;

            //当前点与新的活动点连接,并设置好相关指针
            if (CurrentActivity != null)
            {
                ((WfActivityBase)CurrentActivity).ConnectToNextActivity(activity);
                ((WfActivityBase)CurrentActivity).Status = WfActivityStatus.Completed;
            }

            //加入点集合并设置好新的活动点
            Activities.Add(activity);

            activity.Assignees.CopyFrom(transferParams.Receivers);

            ///设置的
            if (transferParams.FromTransitionDescriptor != null)
            {
                activity.Context["FromTransitionDescriptor"] = transferParams.FromTransitionDescriptor.Key;
            }

            DoComplete(activity);

            return(activity);
        }
		public WfAdminDeleteTransitionExecutor(IWfActivity operatorActivity, IWfProcessDescriptor processDescriptor, IWfTransitionDescriptor targetTransitionDescriptor, bool syncMSObject) :
			base(operatorActivity, WfControlOperationType.AdminDeleteTransition)
		{
			processDescriptor.NullCheck("processDescriptor");
			targetTransitionDescriptor.NullCheck("targetTransitionDescriptor");

			this._TargetTransitionDescriptor = targetTransitionDescriptor;
			this._ProcessDescriptor = processDescriptor;

			this._SyncMainStreamObject = syncMSObject;
		}
예제 #28
0
        private static void ValidateAggressProcessBTransitions(IWfActivity activityB, int count)
        {
            Assert.AreEqual(2, activityB.Descriptor.ToTransitions.Count,
                            string.Format("第{0}次退回。B的衍生线必须也是两根,BC和BA", count));

            WfTransitionDescriptor transitionBC = (WfTransitionDescriptor)activityB.Descriptor.ToTransitions.Find(t => t.ToActivity.GetAssociatedActivity().Key == "C");
            WfTransitionDescriptor transitionBA = (WfTransitionDescriptor)activityB.Descriptor.ToTransitions.Find(t => t.ToActivity.GetAssociatedActivity().Key == "A");

            Assert.IsNotNull(transitionBC);
            Assert.IsNotNull(transitionBA);
        }
예제 #29
0
        public WfEditPropertiesExecutorBase(IWfActivity operatorActivity, IWfProcess process, T descriptor, bool syncMSObject, WfControlOperationType operationType)
            : base(operatorActivity, operationType)
        {
            process.NullCheck("process");
            descriptor.NullCheck("descriptor");

            this._Process              = process;
            this._Descriptor           = descriptor;
            this._SyncMainStreamObject = syncMSObject;

            descriptor.SyncPropertiesToFields();
        }
예제 #30
0
        private static IWfActivity FindClonedRootActivity(IWfActivity clondedActivity)
        {
            IWfActivity result  = clondedActivity;
            IWfProcess  process = clondedActivity.Process;

            while (result != null && result.Descriptor.ClonedKey.IsNotEmpty())
            {
                result = process.Activities.Find(act => string.Compare(clondedActivity.Descriptor.ClonedKey, act.Descriptor.Key, true) == 0);
            }

            return(result);
        }
        public WfClientProcessInfo ReplaceAssignees(string activityID, WfClientUser originalUser, List <WfClientUser> targetUsers, WfClientRuntimeContext runtimeContext)
        {
            OperationContext.Current.FillContextToOguServiceContext();

            IWfProcess  process        = WfRuntime.GetProcessByActivityID(activityID);
            IWfActivity targetActivity = process.Activities[activityID];

            ExecuteExecutor(process, runtimeContext,
                            (p) => new WfReplaceAssigneesExecutor(targetActivity, targetActivity, (IUser)originalUser.ToOguObject(), targetUsers.ToOguObjects <WfClientUser, IUser>()));

            return(process.ToClientProcessInfo(runtimeContext.Operator).FillCurrentOpinion(process.CurrentActivity, runtimeContext.Operator));
        }
예제 #32
0
        public WfRestoreProcessExecutor(IWfActivity operatorActivity, IWfProcess restoreProcess)
            : base(operatorActivity, WfControlOperationType.RestoreProcess)
        {
            restoreProcess.NullCheck("restoreProcess");

            this.Process = restoreProcess;

            if (OperatorActivity == null)
            {
                OperatorActivity = Process.CurrentActivity;
            }
        }
예제 #33
0
        public WfPauseProcessExecutor(IWfActivity operatorActivity, IWfProcess pauseProcess)
            : base(operatorActivity, WfControlOperationType.PauseProcess)
        {
            pauseProcess.NullCheck("pauseProcess");

            this.PauseProcess = pauseProcess;

            if (OperatorActivity == null)
            {
                OperatorActivity = PauseProcess.CurrentActivity;
            }
        }
 internal void CreateWfResource(IWfActivity wfactivity)
 {
     if (wfactivity.Type == ActdefType.INTERACTION)
     {
         Actdef defineOject = wfactivity.GetDefineOject() as Actdef;
         if (StringHelper.IsNull(defineOject.ParticipantId))
         {
             throw new WfException("The Actdef (" + defineOject.Id + "-" + defineOject.Name + ") Participant cannot be null");
         }
         WfFactory.GetWfResource(wfactivity, defineOject.ParticipantId);
     }
 }
        public WfAsyncCancelProcessExecutor(IWfActivity operatorActivity, IWfProcess process)
            : base(operatorActivity, WfControlOperationType.AsyncCancelProcess)
        {
            process.NullCheck("process");

            this.Process = process;

            if (this.OperatorActivity == null)
            {
                this.OperatorActivity = process.CurrentActivity;
            }
        }
예제 #36
0
        internal static void AppendResourcesToNotifiers(IWfActivity currentActivity, UserTaskCollection notifyTasks, WfResourceDescriptorCollection resources)
        {
            foreach (IUser user in resources.ToUsers())
            {
                UserTask task = BuildOneUserNotifyFromActivity(currentActivity);

                task.SendToUserID   = user.ID;
                task.SendToUserName = user.DisplayName;

                notifyTasks.Add(task);
            }
        }
예제 #37
0
        private void executor_AfterModifyWorkflow(WfExecutorDataContext dataContext)
        {
            if (this.OriginalActivity == null)
            {
                OriginalActivity = dataContext.CurrentProcess.CurrentActivity;
            }

            if (this._OriginalCurrentActivity == null)
            {
                this._OriginalCurrentActivity = dataContext.CurrentProcess.CurrentActivity;
            }
        }
예제 #38
0
        internal static UserTaskCollection BuildUserNotifiesFromActivity(IWfActivity activity)
        {
            UserTaskCollection tasks = BuildUserTasksFromActivity(activity, TaskStatus.Yue);

            foreach (UserTask task in tasks)
            {
                task.Level = TaskLevel.Low;
                task.Url   = GenerateNotifyUrl(task, activity);
            }

            return(tasks);
        }
예제 #39
0
        private void InitOriginalActivityByResourceID(string resourceID, string processID)
        {
            if (processID.IsNotEmpty())
            {
                IWfProcess process = WfRuntime.GetProcessByProcessID(processID);

                process.NullCheck <WfRuntimeException>("不能找到ID为'{0}'的流程", processID);

                OriginalActivity = process.CurrentActivity;
                this._OriginalCurrentActivity = OriginalActivity;
            }
        }
        /// <summary>
        /// 写打开表单的日志
        /// </summary>
        /// <param name="currentActivity"></param>
        /// <param name="logOpType"></param>
        private static void WriteOpenFormLog(IWfActivity currentActivity, MCS.Library.SOA.DataObjects.OperationType logOpType)
        {
            if (currentActivity != null)
            {
                UserOperationLog log = UserOperationLog.FromActivity(currentActivity);

                log.OperationType = logOpType;
                log.OperationName = EnumItemDescriptionAttribute.GetDescription(logOpType);

                UserOperationLogAdapter.Instance.Update(log);
            }
        }
		public WfStartBranchProcessExecutor(IWfActivity operatorActivity, IWfActivity ownerActivity, WfBranchProcessTransferParams branchTransferParams)
			: base(operatorActivity, WfControlOperationType.StartBranchProcess)
		{
			ownerActivity.NullCheck("ownerActivity");
			branchTransferParams.NullCheck("branchTransferParams");

			this.OwnerActivity = ownerActivity;
			this.BranchTransferParams = branchTransferParams;

			if (this.OperatorActivity == null)
				this.OperatorActivity = ownerActivity;
		}
예제 #42
0
        private static string GenerateNotifyUrl(UserTask task, IWfActivity activity)
        {
            NameValueCollection uriParams = UriHelper.GetUriParamsCollection(task.Url);

            uriParams.Clear();
            uriParams["resourceID"] = activity.Process.ResourceID;
            uriParams["processID"]  = activity.Process.ID;
            uriParams["_op"]        = "notifyDialog";
            uriParams["taskID"]     = task.TaskID;

            return(UriHelper.CombineUrlParams(task.Url, false, uriParams));
        }
예제 #43
0
        internal static UserTaskCollection BuildUserNotifiesFromActivity(IWfActivity activity)
        {
            UserTaskCollection tasks = BuildUserTasksFromActivity(activity, TaskStatus.Yue);

            foreach (UserTask task in tasks)
            {
                task.Level = TaskLevel.Low;
                task.Url = GenerateNotifyUrl(task, activity);
            }

            return tasks;
        }
예제 #44
0
        public void ReturnTwiceThenWithdrawTwiceTest()
        {
            IWfActivity activityD = ReturnExecutorTestHelper.PrepareAndMoveToSpecialActivity();

            int originalActivityCount = activityD.Process.Activities.Count;

            Assert.AreEqual("D", activityD.Descriptor.Key);
            ReturnExecutorTestHelper.OutputMainStream(activityD.Process);
            ReturnExecutorTestHelper.OutputEveryActivities(activityD.Process);

            //第一次退回
            ReturnExecutorTestHelper.ExecuteReturnOperation(activityD, "A");

            Console.WriteLine("第一次退回后");
            ReturnExecutorTestHelper.OutputMainStream(activityD.Process);
            ReturnExecutorTestHelper.OutputEveryActivities(activityD.Process);

            WfProcessTestCommon.MoveToNextDefaultActivity(activityD.Process);   //B1
            WfProcessTestCommon.MoveToNextDefaultActivity(activityD.Process);   //C1
            WfProcessTestCommon.MoveToNextDefaultActivity(activityD.Process);   //D1

            Assert.AreEqual("D", activityD.Process.CurrentActivity.Descriptor.AssociatedActivityKey);

            //在B的出线C和E之间选择E
            activityD.Process.ApplicationRuntimeParameters["IsCLine"] = false;

            //第二次退回
            ReturnExecutorTestHelper.ExecuteReturnOperation(activityD, "A");

            Console.WriteLine("第二次退回后");
            ReturnExecutorTestHelper.OutputMainStream(activityD.Process);
            ReturnExecutorTestHelper.OutputEveryActivities(activityD.Process);

            IWfProcess process = process = DoWithdrawExecutor(activityD.Process);

            Console.WriteLine("第一组撤回之后");
            ReturnExecutorTestHelper.OutputMainStream(process);
            ReturnExecutorTestHelper.OutputEveryActivities(process);

            process = DoWithdrawExecutor(activityD.Process);    //C1;
            process = DoWithdrawExecutor(activityD.Process);    //B1
            process = DoWithdrawExecutor(activityD.Process);    //A1

            process = DoWithdrawExecutor(activityD.Process);

            Console.WriteLine("第二组撤回之后");
            ReturnExecutorTestHelper.OutputMainStream(process);
            ReturnExecutorTestHelper.OutputEveryActivities(process);

            Assert.AreEqual(originalActivityCount, process.Activities.Count, "撤回后与退件前的活动数一样");
            Assert.AreEqual(originalActivityCount, process.Descriptor.Activities.Count, "撤回后与退件前的活动数一样");
        }
        private void PrepareNotifyTasks(IWfActivity originalActivity)
        {
            UserTaskCollection notifyTasks = BuildUserNotifiesFromActivity(originalActivity);

            foreach (UserTask task in notifyTasks)
            {
                task.Status    = TaskStatus.Yue;
                task.TaskTitle = Translator.Translate(Define.DefaultCulture,
                                                      originalActivity.Process.Descriptor.Properties.GetValue("DefaultWithtrawTaskPrefix", "流程被撤回:")) + task.TaskTitle;
            }

            WfRuntime.ProcessContext.NotifyUserTasks.CopyFrom(notifyTasks);
        }
예제 #46
0
        internal void ConnectToNextActivity(IWfActivity nextActivity)
        {
            IWfTransitionDescriptor transDescriptor =
                this.Descriptor.ToTransitions.GetTransitionByToActivity(nextActivity.Descriptor.Key);

            WfTransition transition = new WfTransition(transDescriptor);

            transition.FromActivity = this;
            transition.ToActivity   = nextActivity;

            this._ToTransition = transition;
            ((WfActivityBase)nextActivity)._FromTransition = transition;
        }
예제 #47
0
        private WfActivityCollection DoWithdraw(IWfActivity destinationActivity)
        {
            WfActivityCollection deletedActivities = new WfActivityCollection();

            while (string.Compare(this.CurrentActivity.ID, destinationActivity.ID, true) != 0)
            {
                deletedActivities.Add(this.LastActivity);

                Activities.Remove(this.LastActivity);
            }

            return(deletedActivities);
        }
예제 #48
0
        public WfCancelProcessExecutor(IWfActivity operatorActivity, IWfProcess cancelProcess, bool cancelAllBranchProcesses)
            : base(operatorActivity, WfControlOperationType.CancelProcess)
        {
            cancelProcess.NullCheck("cancelProcess");

            this.CancelProcess            = cancelProcess;
            this.CancelAllBranchProcesses = cancelAllBranchProcesses;

            if (OperatorActivity == null)
            {
                OperatorActivity = CancelProcess.CurrentActivity;
            }
        }
		public WfAdminAddActivityExecutor(IWfActivity operatorActivity,
			IWfProcess process,
			IWfActivityDescriptor fromActivityDesp,
			IWfActivityDescriptor newActivityDesp,
			bool syncMSObject)
			: base(operatorActivity, process, newActivityDesp, syncMSObject, WfControlOperationType.AdminAddActivity)
		{
			this._FromActivityDescriptor = fromActivityDesp;

			newActivityDesp.NullCheck("newActivityDesp");

			this._NewActivityDescriptor = newActivityDesp;
		}
예제 #50
0
        public static void LoadActions(IWfActivity activity)
        {
            WfActivityConfigurationElement activityElement = WfActivitySettings.GetConfig().Activities[activity.Descriptor.ActivityType.ToString()];

            if (WfRuntime.Parameters.AutoloadActions && activityElement != null)
            {
                activity.LeaveActions.CopyFrom(activityElement.GetLeaveActions());
                activity.EnterActions.CopyFrom(activityElement.GetEnterActions());

                activity.WithdrawActions.CopyFrom(activityElement.GetWithdrawActions());
                activity.BeWithdrawnActions.CopyFrom(activityElement.GetBeWithdrawnActions());
            }
        }
예제 #51
0
        /// <summary>
        /// 在当前活动之前插入活动。当前活动不能是起始点。
        /// </summary>
        /// <param name="actDesp"></param>
        public IWfActivity InsertBefore(IWfActivityDescriptor actDesp)
        {
            this.Descriptor.InsertBefore(actDesp);

            IWfActivity newActivity = CreateActivityInstance(actDesp, this.Process);

            if (newActivity.Descriptor.ActivityType == WfActivityType.InitialActivity)
            {
                ((WfProcess)this.Process).InitialActivity = newActivity;
            }

            return(newActivity);
        }
		protected void SetReadOnlyScene(IWfActivity activity)
		{
			string scene = activity.Descriptor.InheritedReadOnlyScene;

			if (scene.IsNullOrEmpty())
			{
				if (SceneInfo != null)
					scene = SceneInfo.ReadOnlySceneID;
			}

			if (scene.IsNotEmpty())
				OnSetScene(scene);
		}
예제 #53
0
        private static IWfActivity FindRelativeActivityByKey(IWfActivity currentActivity, string key)
        {
            IWfActivity result = null;

            IWfActivityDescriptor actDesp = FindAssociatedActivityByKey(currentActivity.Descriptor, key);

            if (actDesp != null)
            {
                result = actDesp.Instance;
            }

            return(result);
        }
예제 #54
0
        public static void LoadActions(IWfActivity activity)
        {
            WfActivityConfigurationElement activityElement = WfActivitySettings.GetConfig().Activities[activity.Descriptor.ActivityType.ToString()];

            if (WfRuntime.Parameters.AutoloadActions && activityElement != null)
            {
                activity.LeaveActions.CopyFrom(activityElement.GetLeaveActions());
                activity.EnterActions.CopyFrom(activityElement.GetEnterActions());

                activity.WithdrawActions.CopyFrom(activityElement.GetWithdrawActions());
                activity.BeWithdrawnActions.CopyFrom(activityElement.GetBeWithdrawnActions());
            }
        }
예제 #55
0
        public void CancelProcess(string processID, bool cancelAllBranchProcesses)
        {
            processID.CheckStringIsNullOrEmpty("processID");

            IWfProcess process = WfRuntime.GetProcessByProcessID(processID);

            IWfActivity currentActivity = process.CurrentActivity;

            //仅作废当前流程
            WfCancelProcessExecutor executor = new WfCancelProcessExecutor(process.CurrentActivity, process, cancelAllBranchProcesses);

            executor.Execute();
        }
        private void PrepareNotifyTasks(IWfActivity originalActivity)
        {
            UserTaskCollection notifyTasks = BuildUserNotifiesFromActivity(originalActivity);

            foreach (UserTask task in notifyTasks)
            {
                task.Status = TaskStatus.Yue;
                task.TaskTitle = Translator.Translate(Define.DefaultCulture, 
                    originalActivity.Process.Descriptor.Properties.GetValue("DefaultWithtrawTaskPrefix", "流程被撤回:")) + task.TaskTitle;
            }

            WfRuntime.ProcessContext.NotifyUserTasks.CopyFrom(notifyTasks);
        }
		protected void SetSceneByActivity(IWfActivity activity)
		{
			activity.NullCheck("activity");

			string scene = activity.Descriptor.InheritedScene;

			if (scene.IsNullOrEmpty())
			{
				if (SceneInfo != null)
					scene = SceneInfo.DefaultWorkflowSceneID;
			}

			if (scene.IsNotEmpty())
				OnSetScene(scene);
		}
		protected override IWfActivity PrepareInstanceActivity()
		{
			ExceptionHelper.TrueThrow(this.TargetActivity.Descriptor.ActivityType == WfActivityType.CompletedActivity, "不能在结束活动后添加活动");

			IWfProcess process = this.TargetActivity.Process;
			IWfActivityDescriptor newActDesp = PrepareActivityDescriptor(this.TargetActivity.Descriptor);

			IWfActivity newActivity = WfActivityBase.CreateActivityInstance(newActDesp, process);

			if (WfRuntime.ProcessContext != null)
				WfRuntime.ProcessContext.AffectedProcesses.AddOrReplace(process);

			this.AddedActivity = newActivity;

			return newActivity;
		}
		private void WriteAssignees(IWfActivity activity, WfSimulationContext context)
		{
			StringBuilder strB = new StringBuilder();

			foreach (WfAssignee assignee in activity.Assignees)
			{
				if (assignee.User != null)
				{
					if (strB.Length > 0)
						strB.AppendFormat(", ");

					strB.AppendFormat("{0}({1})", assignee.User.DisplayName, assignee.User.ID);
				}
			}

			if (strB.Length > 0)
				WriteTextInTag(context.Writer, "div", "流转给: {0}", strB.ToString());
		}
        /// <summary>
        /// 得到在当前活动的意见信息
        /// </summary>
        /// <param name="originalActivity"></param>
        /// <param name="user"></param>
        /// <returns></returns>
        public WfClientOpinion GetUserActivityOpinion(IWfActivity originalActivity, WfClientUser user)
        {
            WfClientOpinion opinion = null;

            if (originalActivity != null && user != null)
            {
                WhereSqlClauseBuilder builder = new WhereSqlClauseBuilder();

                builder.AppendItem("ACTIVITY_ID", originalActivity.ID);
                builder.AppendItem("ISSUE_PERSON_ID", user.ID);

                GenericOpinion serverOpinion = GenericOpinionAdapter.Instance.LoadByBuilder(builder).FirstOrDefault();

                if (serverOpinion != null)
                    WfClientOpinionConverter.Instance.ServerToClient(serverOpinion, ref opinion);
            }

            return opinion;
        }