示例#1
0
        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));

                UserTaskCollection toAccomplishedTasks = new UserTaskCollection();
                UserTaskCollection toDeletedTasks      = new UserTaskCollection();

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

                WfRuntime.ProcessContext.DeletedUserTasks.CopyFromNotExistedTaskID(toDeletedTasks);

                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();
            }
        }
        public override void PrepareAction(WfActionParams actionParams)
        {
            if (WfRuntime.ProcessContext.OriginalActivity != null)
            {
                IWfActivity originalActivity = WfRuntime.ProcessContext.OriginalActivity;

                //找到当前环节所有的待办,然后转为已办
                UserTaskCollection currentActTasks =
                    UserTaskAdapter.Instance.LoadUserTasks(builder =>
                        {
                            builder.AppendItem("ACTIVITY_ID", originalActivity.ID);
                            builder.AppendItem("STATUS", (int)TaskStatus.Ban);
                        });

                //从上下文中找到需要转已办的记录
                currentActTasks.CopyFrom(WfRuntime.ProcessContext.MoveToUserTasks.FindAll(
                    u => string.Compare(u.ActivityID, originalActivity.ID, true) == 0));

                currentActTasks.Sort((u1, u2) => u1.Level - u2.Level);

                if (currentActTasks.Count == 0)
                {
                    UserTaskCollection preparedUserTasks = (UserTaskCollection)originalActivity.Context["UserTasks"];

                    if (preparedUserTasks != null)
                    {
                        WfRuntime.ProcessContext.MoveToUserTasks.CopyFrom(preparedUserTasks);
                        currentActTasks = preparedUserTasks;
                    }
                }

                currentActTasks.ForEach(u =>
                {
                    if (u.Status == TaskStatus.Ban)
                        ChangeUserTaskToAccomplishedTasks(originalActivity, u);
                    else
                        WfRuntime.ProcessContext.DeletedUserTasks.Add(u);
                });

                UserTaskCollection notifyTasks = new UserTaskCollection();

                AppendResourcesToNotifiers(originalActivity, notifyTasks, originalActivity.Descriptor.LeaveEventReceivers);

                foreach (UserTask task in notifyTasks)
                {
                    task.Status = TaskStatus.Yue;
                    task.TaskTitle = Translator.Translate(Define.DefaultCulture,
                        originalActivity.Process.Descriptor.Properties.GetValue("DefaultLeaveTaskPrefix", "离开活动:")) + task.TaskTitle;

                    task.Context["ExtraOperationType"] = WfControlSubOperationType.Leave;
                }

                WfRuntime.ProcessContext.Acl.CopyFrom(notifyTasks.ToAcl());
                WfRuntime.ProcessContext.NotifyUserTasks.CopyFrom(notifyTasks);

                WfRuntime.ProcessContext.FireLeaveActivityPrepareAction();
            }
        }
        public override void PrepareAction(WfActionParams actionParams)
        {
            IWfActivity currentActivity = WfRuntime.ProcessContext.CurrentActivity;

            if (currentActivity != null)
            {
                if (WfRuntime.ProcessContext.TargetActivityCanMoveTo && currentActivity.Status == WfActivityStatus.Running)
                {
                    UserTaskCollection userTasks = BuildUserTasksFromActivity(currentActivity);

                    UserTaskCollection notifyTasks = new UserTaskCollection();

                    AppendResourcesToNotifiers(currentActivity, notifyTasks, currentActivity.Descriptor.EnterEventReceivers);

                    foreach (UserTask task in notifyTasks)
                    {
                        task.Status    = TaskStatus.Yue;
                        task.TaskTitle = task.TaskTitle;
                        task.Context["ExtraOperationType"] = WfControlSubOperationType.Enter;
                    }

                    WfRuntime.ProcessContext.Acl.CopyFrom(notifyTasks.ToAcl());

                    //当从数据库中加载流程时,LoadingType为DataLoadingType.External。
                    if (CanAutoSendUserTask(currentActivity))
                    {
                        WfRuntime.ProcessContext.MoveToUserTasks.CopyFrom(userTasks);
                        WfRuntime.ProcessContext.NotifyUserTasks.CopyFrom(notifyTasks);
                    }
                    else
                    {
                        currentActivity.Context["UserTasks"]   = userTasks;
                        currentActivity.Context["NotifyTasks"] = notifyTasks;
                    }

                    if (currentActivity.Status == WfActivityStatus.Completed)
                    {
                        WfRuntime.ProcessContext.ClosedProcesses.AddOrReplace(currentActivity.Process);
                    }
                }
                else
                {
                    WfRuntime.ProcessContext.PendingActivities.Add(currentActivity);
                }

                WfRuntime.ProcessContext.FireEnterActivityPrepareAction();
            }
        }
		public override void PrepareAction(WfActionParams actionParams)
		{
			IWfActivity currentActivity = WfRuntime.ProcessContext.CurrentActivity;

			if (currentActivity != null)
			{
				if (WfRuntime.ProcessContext.TargetActivityCanMoveTo && currentActivity.Status == WfActivityStatus.Running)
				{
					UserTaskCollection userTasks = BuildUserTasksFromActivity(currentActivity);

					UserTaskCollection notifyTasks = new UserTaskCollection();

					AppendResourcesToNotifiers(currentActivity, notifyTasks, currentActivity.Descriptor.EnterEventReceivers);

					foreach (UserTask task in notifyTasks)
					{
						task.Status = TaskStatus.Yue;
						task.TaskTitle = task.TaskTitle;
                        task.Context["ExtraOperationType"] = WfControlSubOperationType.Enter;
					}

					WfRuntime.ProcessContext.Acl.CopyFrom(notifyTasks.ToAcl());

					//当从数据库中加载流程时,LoadingType为DataLoadingType.External。
					if (CanAutoSendUserTask(currentActivity))
					{
						WfRuntime.ProcessContext.MoveToUserTasks.CopyFrom(userTasks);
						WfRuntime.ProcessContext.NotifyUserTasks.CopyFrom(notifyTasks);
					}
					else
					{
						currentActivity.Context["UserTasks"] = userTasks;
						currentActivity.Context["NotifyTasks"] = notifyTasks;
					}

					if (currentActivity.Status == WfActivityStatus.Completed)
						WfRuntime.ProcessContext.ClosedProcesses.AddOrReplace(currentActivity.Process);
				}
				else
				{
					WfRuntime.ProcessContext.PendingActivities.Add(currentActivity);
				}

				WfRuntime.ProcessContext.FireEnterActivityPrepareAction();
			}
		}
        public override void PrepareAction(WfActionParams actionParams)
        {
            IWfActivity currentActivity = WfRuntime.ProcessContext.CurrentActivity;

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

                foreach (UserTask task in notifyTasks)
                {
                    task.Status    = TaskStatus.Yue;
                    task.TaskTitle = Translator.Translate(Define.DefaultCulture,
                                                          currentActivity.Process.Descriptor.Properties.GetValue("DefaultCompleteTaskPrefix", "流程已办结:")) + task.TaskTitle;
                }

                WfRuntime.ProcessContext.NotifyUserTasks.CopyFrom(notifyTasks);
                WfRuntime.ProcessContext.Acl.CopyFrom(notifyTasks.ToAcl());
            }
        }
        public override void PrepareAction(WfActionParams actionParams)
        {
            if (WfRuntime.ProcessContext.OriginalActivity != null)
            {
                IWfActivity originalActivity = WfRuntime.ProcessContext.OriginalActivity;

                //找到当前环节所有的待办,然后转为已办
                UserTaskCollection currentActTasks =
                    UserTaskAdapter.Instance.LoadUserTasks(builder =>
                {
                    builder.AppendItem("ACTIVITY_ID", originalActivity.ID);
                    builder.AppendItem("STATUS", (int)TaskStatus.Ban);
                });

                //从上下文中找到需要转已办的记录
                currentActTasks.CopyFrom(WfRuntime.ProcessContext.MoveToUserTasks.FindAll(
                                             u => string.Compare(u.ActivityID, originalActivity.ID, true) == 0));

                currentActTasks.Sort((u1, u2) => u1.Level - u2.Level);

                if (currentActTasks.Count == 0)
                {
                    UserTaskCollection preparedUserTasks = (UserTaskCollection)originalActivity.Context["UserTasks"];

                    if (preparedUserTasks != null)
                    {
                        WfRuntime.ProcessContext.MoveToUserTasks.CopyFrom(preparedUserTasks);
                        currentActTasks = preparedUserTasks;
                    }
                }

                currentActTasks.ForEach(u =>
                {
                    if (u.Status == TaskStatus.Ban)
                    {
                        ChangeUserTaskToAccomplishedTasks(originalActivity, u);
                    }
                    else
                    {
                        WfRuntime.ProcessContext.DeletedUserTasks.Add(u);
                    }
                });

                UserTaskCollection notifyTasks = new UserTaskCollection();

                AppendResourcesToNotifiers(originalActivity, notifyTasks, originalActivity.Descriptor.LeaveEventReceivers);

                foreach (UserTask task in notifyTasks)
                {
                    task.Status    = TaskStatus.Yue;
                    task.TaskTitle = Translator.Translate(Define.DefaultCulture,
                                                          originalActivity.Process.Descriptor.Properties.GetValue("DefaultLeaveTaskPrefix", "离开活动:")) + task.TaskTitle;

                    task.Context["ExtraOperationType"] = WfControlSubOperationType.Leave;
                }

                WfRuntime.ProcessContext.Acl.CopyFrom(notifyTasks.ToAcl());
                WfRuntime.ProcessContext.NotifyUserTasks.CopyFrom(notifyTasks);

                WfRuntime.ProcessContext.FireLeaveActivityPrepareAction();
            }
        }