public static void ExecuteReplace(ReplaceAssigneeHelperData rahd)
        {
            rahd.NullCheck("错误:传入参数为空");

            //取原始待办人
            IUser originalUser = (IUser)OguBase.CreateWrapperObject(rahd.OriginalUserID, SchemaType.Users);

            //取目的待办人
            List<IUser> targetUsers = new List<IUser>();
            foreach (string userID in rahd.TargetUsersID)
            {
                IUser targetUser = (IUser)OguBase.CreateWrapperObject(userID, SchemaType.Users);
                targetUsers.Add(targetUser);
            }

            //获取用户任务
            UserTaskCollection tasks = UserTaskAdapter.Instance.LoadUserTasks(
                                        build => build.AppendItem("TASK_GUID", rahd.TaskID, "="));
			(tasks.Count > 0).FalseThrow("指定的任务ID'{0}'不存在!", rahd.TaskID);

            //取出Activity
			string activityID = tasks[0].ActivityID;
            //待办人替换处理
            try
            {
                IWfProcess process = WfRuntime.GetProcessByActivityID(activityID);

                IWfActivity activity = process.Activities[activityID];

                //创建Executor并执行
                WfReplaceAssigneesExecutor replaceExec = new WfReplaceAssigneesExecutor(activity, activity,
                                                                    originalUser, targetUsers);
                replaceExec.Execute();
            }
            catch 
            {
                
            }
        } 
        protected void changeCandidates_ExecuteStep(object data)
        {
            ChangeAssigneesParam cap = JSONSerializerExecute.Deserialize<ChangeAssigneesParam>(data);

            IWfProcess process = WfRuntime.GetProcessByProcessID(cap.ProcessID);

            CheckPermission(process);

            foreach (IWfActivity activity in process.Activities)
            {
                if (activity.Status != WfActivityStatus.Completed && activity.Status != WfActivityStatus.Aborted)
                {
                    if (activity.Candidates.Contains(cap.OriginalUser.ID))
                    {
                        WfReplaceAssigneesExecutor executor = new WfReplaceAssigneesExecutor(null, activity, cap.OriginalUser, cap.Users);

                        executor.ExecuteNotPersist();
                    }
                }
            }

            WfRuntime.PersistWorkflows();
        }
        protected void changeAssignees_ExecuteStep(object data)
        {
            ChangeAssigneesParam cap = JSONSerializerExecute.Deserialize<ChangeAssigneesParam>(data);

            IWfProcess process = WfRuntime.GetProcessByProcessID(cap.ProcessID);

            CheckPermission(process);

            WfReplaceAssigneesExecutor executor = new WfReplaceAssigneesExecutor(null, process.CurrentActivity, null, cap.Users);

            executor.Execute();
        }
		public int DisplaceUserInProcess(string processID, string userID, string[] displacingUserIDArray)
		{
			IUser originalUser = OguMechanismFactory.GetMechanism().GetObjects<IUser>(SearchOUIDType.Guid, userID).FirstOrDefault();

			OguObjectCollection<IUser> displacingUsers = OguMechanismFactory.GetMechanism().GetObjects<IUser>(SearchOUIDType.Guid, displacingUserIDArray);

			List<IUser> distinctUsers = new List<IUser>();

			foreach (IUser user in displacingUsers)
			{
				if (distinctUsers.Exists(u => u.ID == user.ID) == false)
					distinctUsers.Add(user);
			}

			IWfProcess process = WfRuntime.GetProcessByProcessID(processID);

			int result = 0;

			foreach (IWfActivity activity in process.Activities)
			{
				bool needReplace = false;

				if (activity.Status != WfActivityStatus.Completed && activity.Status != WfActivityStatus.Aborted)
				{
					if (activity.Status == WfActivityStatus.Running || activity.Status == WfActivityStatus.Pending)
						needReplace = activity.Assignees.Contains(originalUser.ID);
					else
						needReplace = activity.Candidates.Contains(originalUser.ID);

					if (needReplace)
					{
						WfReplaceAssigneesExecutor executor = new WfReplaceAssigneesExecutor(null, activity, originalUser, distinctUsers);

						executor.ExecuteNotPersist();
						result++;
					}
				}
			}

			using (TransactionScope scope = TransactionScopeFactory.Create())
			{
				WfReplaceAssigneesExecutor.DoUserTaskOperations();
				WfRuntime.PersistWorkflows();

				scope.Complete();
			}

			return result;
		}