0

또는 더 정확하게 말하면, 첫 번째 반복에서 "삭제"된 경우 후속 반복에서 참가자를 제거 할 수있는 방법이 있습니까?작업을 삭제하는 방법은 무엇입니까?

의미 ...

예를 들어, 일부 병렬 워크 플로우가 있습니다. 나는 10 참가자를 선택하고이 비즈니스 프로세스를 시작했습니다. 따라서 10 작업이 각 참가자마다 하나씩 만들어졌습니다. 그런데 몇 명의 참가자를 삭제하기로 결정했습니다.

내가 아는 한, 나는 그 일을 제거 할 수 없다. 그러나 WebScript를 사용하여 이러한 작업을 완료 할 수 있습니다. 예를 들면 다음과 같습니다.

... 
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); 
... 

그러나 문제는 개정의 단계에서 개시 다시 승인을 보낼 수 있다는 것입니다 : 나는 workflowIdtaskId 알고있다. 그런 다음 제외 된 참가자의 작업이 다시 만들어집니다.

이러한 참가자를 "표시"할 수있는 방법이 없으므로 이후에 작업이 만들어지지 않았습니까?

정보에 대해 매우 감사드립니다. 모두에게 감사드립니다.

+1

작업 흐름 변수에서 작업을 완료 한 후에 참가자를 제거 할 수 있어야 다음 작업을 수행 할 필요가 없습니다. –

+0

주셔서 감사합니다. 좋은 생각, 나는 그것을 시도하고 알려드립니다. –

답변

0

솔루션은 다음과 같이 나타낼 수 있습니다.

WebScript에서는 작업 속성을 업데이트하고 해당 작업을 완료해야합니다. 작업에 속성 (소유자였다) 제외 된 참가자에 대한 참조와 함께 새로운 속성을 추가 : 작업의 complete 이벤트가 리스너를 추가

... 
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); 
... 

하십시오. 리스너에서

... 
workflowService.endTask(taskId, null); 
... 

을하는 기준 제외 된 참가자에게 새로운 속성을 찾을 :이 청취자는 WebScript에서이 호출 후 작동합니다. 그런 다음 다시 변수 bpm_assigneesbpm_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); 
      }    
     } 
    } 
} 

을가 런타임에서 참가자의 작업을 삭제하는 것이 가능하게된다 그 후 이들 참가자들에게 다시 제출 후 작업이 생성되지 않습니다.

1

위임자 목록에서 해당 사용자를 삭제할 수 있습니다. 다음 작업을 완료하면 아래 코드를 사용하여 자바 스크립트을 사용하여 목록에서 사람을 삭제할 수 있습니다. bpm : associees for assignees를 사용하는 경우.

bpm_assignees.remove (person); // 사람이 현재 로그인 한 사람입니다.

java에서 연결 제거에 nodeService를 사용할 수 있습니다.

+2

나는 같은 것을 입력하려고합니다. –

+0

답변 해 주셔서 감사합니다. 나는 그것을 시도하고 알려 드리겠습니다. –

+0

@Muralidharan Deenathayalan - 답변을 쓸 수도 있습니다. 귀하의 도움에 감사드립니다. –