或者更准确地说 - 有没有办法从后续迭代中移除参与者,如果它被删除"在第一次迭代?
我的意思......
例如,有一些并行工作流程。我选择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);
...
但问题是,在修改阶段,发起人可以再次发送批准。然后将再次创建排除参与者的任务。
有没有办法去&#34;标记&#34;这些参与者,以便将来没有为他们创建任务?
我将非常感谢这些信息。谢谢大家。
答案 0 :(得分:1)
您可以从受理人列表中删除此人。当您完成任务时,请使用下面的代码从列表中删除人员使用javascript ,如果您使用bpm:assignees进行关联。
bpm_assignees.remove(person); //其中,person是当前登录的人。
您可以使用nodeService删除java中的关联。
答案 1 :(得分:0)
解决方案可以表示如下。
在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);
}
}
}
}
之后,可以在运行时删除参与者的任务,并且在重新提交后不会生成这些参与者任务。