如何删除任务?
How to delete a task?
或者更准确地说 - 如果参与者在第一次迭代时是 "deleted",是否有办法从后续迭代中删除参与者?
我的意思是...
例如,有一些并行的工作流程。我选择了 10
位参与者并启动了此业务流程。因此,创建了 10
个任务,每个参与者一个。但后来我决定删除一些参与者。
据我所知,我无法删除该任务。但我可以通过使用 WebScript 来完成这些任务。例如,如下。我知道 workflowId
和 taskId
:
...
Map<String, String> templateArgs = req.getServiceMatch().getTemplateVars();
// String workflowId = templateArgs.get("workflowId");
String taskId = templateArgs.get("taskId");
Map<QName, Serializable> updatedProperties = new HashMap<>();
updatedProperties.put(TaskRemoverModel.REVIEW_OUTCOME_PROPERTY, "Approve");
updatedProperties.put(TaskRemoverModel.COMMENT_PROPERTY,
"The user was excluded from the list of participants.");
workflowService.updateTask(taskId, updatedProperties, null, null);
workflowService.endTask(taskId, null);
...
但问题是在修改阶段,发起人可以再次送审。然后将重新创建排除的参与者的任务。
有没有办法 "mark" 这些参与者,以便以后不为他们创建任务?
如果能提供信息,我将不胜感激。感谢大家。
您可以从 assignee.When 列表中删除您完成任务使用下面的代码从列表中删除人员 使用 java 脚本 ,如果您使用 bpm:assignees 进行关联。
bpm_assignees.remove(person); // 其中 person 是当前登录的人。
您可以使用 nodeService 删除 java 中的关联。
解决方案可以表示如下。
在 WebScript 中,需要更新任务属性并完成该任务。在任务属性中添加新的 属性 并引用被排除的参与者(谁是所有者):
...
Map<String, String> templateArgs = req.getServiceMatch().getTemplateVars();
String taskId = templateArgs.get("taskId");
Map<QName, Serializable> updatedProperties = new HashMap<>();
updatedProperties.put(TaskRemoverModel.WORKFLOW_CONFIRM_MODEL_CONFIRMOUTCOME_PROPERTY,
"Approve");
updatedProperties.put(TaskRemoverModel.WORKFLOW_MODEL_LASTCOMMENT_PROPERTY,
I18NUtil.getMessage("task.comment.excluded"));
WorkflowTask workflowTask = workflowService.getTaskById(taskId);
Iterator taskProperties = workflowTask.getProperties().entrySet().iterator();
while(taskProperties.hasNext()) {
Map.Entry taskProperty = (Map.Entry)taskProperties.next();
if(TaskRemoverModel.CONTENT_MODEL_OWNER_PROPERTY.toString().equals(
taskProperty.getKey().toString())) {
updatedProperties.put(TaskRemoverModel.TASK_WAS_EXCLUDED_SIGN,
personService.getPerson(taskProperty.getValue().toString()));
}
}
workflowService.updateTask(taskId, updatedProperties, null, null);
workflowService.endTask(taskId, null);
...
为任务的complete
事件添加监听器。此侦听器将在 WebScript 中的此调用后工作:
...
workflowService.endTask(taskId, null);
...
在侦听器中,找到这个新的 属性,其中引用了被排除的参与者。然后获取 bpm_assignees
的列表并从该列表中删除该参与者的引用并再次设置变量 bpm_assignees
:
public class TaskCompleteListener implements TaskListener {
private Map<Object, Object> registeredBeans =
Context.getProcessEngineConfiguration().getBeans();
private ServiceRegistry registry =
(ServiceRegistry) registeredBeans.get(
ActivitiConstants.SERVICE_REGISTRY_BEAN_KEY);
private WorkflowService workflowService = registry.getWorkflowService();
@Override
public void notify(DelegateTask delegateTask) {
WorkflowTask workflowTask =
workflowService.getTaskById("activiti$" + delegateTask.getId());
Map<QName, Serializable> taskProperties = workflowTask.getProperties();
Iterator iterator = taskProperties.entrySet().iterator();
while(iterator.hasNext()) {
Map.Entry taskProperty = (Map.Entry)iterator.next();
if(taskProperty.getKey().toString().equals(
ContractsApprovalModel.TASK_WAS_EXCLUDED_SIGN)) {
ActivitiScriptNodeList assignees =
(ActivitiScriptNodeList) delegateTask.getVariable("bpm_assignees");
for(ActivitiScriptNode personNode : assignees) {
if(personNode.getNodeRef().toString().equals(
taskProperty.getValue().toString())) {
assignees.remove(personNode);
}
}
delegateTask.setVariable("bpm_assignees", assignees);
}
}
}
}
之后可以在运行时删除参与者的任务,并且在为这些参与者重新提交后不会生成任务。
或者更准确地说 - 如果参与者在第一次迭代时是 "deleted",是否有办法从后续迭代中删除参与者?
我的意思是...
例如,有一些并行的工作流程。我选择了 10
位参与者并启动了此业务流程。因此,创建了 10
个任务,每个参与者一个。但后来我决定删除一些参与者。
据我所知,我无法删除该任务。但我可以通过使用 WebScript 来完成这些任务。例如,如下。我知道 workflowId
和 taskId
:
...
Map<String, String> templateArgs = req.getServiceMatch().getTemplateVars();
// String workflowId = templateArgs.get("workflowId");
String taskId = templateArgs.get("taskId");
Map<QName, Serializable> updatedProperties = new HashMap<>();
updatedProperties.put(TaskRemoverModel.REVIEW_OUTCOME_PROPERTY, "Approve");
updatedProperties.put(TaskRemoverModel.COMMENT_PROPERTY,
"The user was excluded from the list of participants.");
workflowService.updateTask(taskId, updatedProperties, null, null);
workflowService.endTask(taskId, null);
...
但问题是在修改阶段,发起人可以再次送审。然后将重新创建排除的参与者的任务。
有没有办法 "mark" 这些参与者,以便以后不为他们创建任务?
如果能提供信息,我将不胜感激。感谢大家。
您可以从 assignee.When 列表中删除您完成任务使用下面的代码从列表中删除人员 使用 java 脚本 ,如果您使用 bpm:assignees 进行关联。
bpm_assignees.remove(person); // 其中 person 是当前登录的人。
您可以使用 nodeService 删除 java 中的关联。
解决方案可以表示如下。
在 WebScript 中,需要更新任务属性并完成该任务。在任务属性中添加新的 属性 并引用被排除的参与者(谁是所有者):
...
Map<String, String> templateArgs = req.getServiceMatch().getTemplateVars();
String taskId = templateArgs.get("taskId");
Map<QName, Serializable> updatedProperties = new HashMap<>();
updatedProperties.put(TaskRemoverModel.WORKFLOW_CONFIRM_MODEL_CONFIRMOUTCOME_PROPERTY,
"Approve");
updatedProperties.put(TaskRemoverModel.WORKFLOW_MODEL_LASTCOMMENT_PROPERTY,
I18NUtil.getMessage("task.comment.excluded"));
WorkflowTask workflowTask = workflowService.getTaskById(taskId);
Iterator taskProperties = workflowTask.getProperties().entrySet().iterator();
while(taskProperties.hasNext()) {
Map.Entry taskProperty = (Map.Entry)taskProperties.next();
if(TaskRemoverModel.CONTENT_MODEL_OWNER_PROPERTY.toString().equals(
taskProperty.getKey().toString())) {
updatedProperties.put(TaskRemoverModel.TASK_WAS_EXCLUDED_SIGN,
personService.getPerson(taskProperty.getValue().toString()));
}
}
workflowService.updateTask(taskId, updatedProperties, null, null);
workflowService.endTask(taskId, null);
...
为任务的complete
事件添加监听器。此侦听器将在 WebScript 中的此调用后工作:
...
workflowService.endTask(taskId, null);
...
在侦听器中,找到这个新的 属性,其中引用了被排除的参与者。然后获取 bpm_assignees
的列表并从该列表中删除该参与者的引用并再次设置变量 bpm_assignees
:
public class TaskCompleteListener implements TaskListener {
private Map<Object, Object> registeredBeans =
Context.getProcessEngineConfiguration().getBeans();
private ServiceRegistry registry =
(ServiceRegistry) registeredBeans.get(
ActivitiConstants.SERVICE_REGISTRY_BEAN_KEY);
private WorkflowService workflowService = registry.getWorkflowService();
@Override
public void notify(DelegateTask delegateTask) {
WorkflowTask workflowTask =
workflowService.getTaskById("activiti$" + delegateTask.getId());
Map<QName, Serializable> taskProperties = workflowTask.getProperties();
Iterator iterator = taskProperties.entrySet().iterator();
while(iterator.hasNext()) {
Map.Entry taskProperty = (Map.Entry)iterator.next();
if(taskProperty.getKey().toString().equals(
ContractsApprovalModel.TASK_WAS_EXCLUDED_SIGN)) {
ActivitiScriptNodeList assignees =
(ActivitiScriptNodeList) delegateTask.getVariable("bpm_assignees");
for(ActivitiScriptNode personNode : assignees) {
if(personNode.getNodeRef().toString().equals(
taskProperty.getValue().toString())) {
assignees.remove(personNode);
}
}
delegateTask.setVariable("bpm_assignees", assignees);
}
}
}
}
之后可以在运行时删除参与者的任务,并且在为这些参与者重新提交后不会生成任务。