Как получить идентификатор экземпляра процесса в контроллере?

Моя среда:

Alfresco Share v5.2.d (r134641-b15, Aikau 1.0.101.3, Spring Surf 5.2.d, Spring WebScripts 6.13, Freemarker 2.3.20-alfresco с исправлениями, Rhino 1.7R4-alfresco с исправлениями, Yui 2.9.0-alfresco -20141223)

Alfresco Community v5.2.0 (r134428-b13) схема 10005

Когда я запускаю рабочий процесс, я могу назначить исполнителей — список пользователей, которые будут участвовать в бизнес-процессе. Мне нужно получить список всех этих пользователей и отобразить этот список на экране reviewTask.

Для отображения этих данных у меня есть собственный шаблон FreeMarker. Из этого шаблона я назову свой веб-скрипт.

Для взаимодействия с репозиторием через REST я использую Web Script Framework MVC — контроллер, выполняющий логику получения списка пользователей и шаблона FreeMarker для ответа JSON.

Мне предложили прекрасную идею, как это может быть сделано. Но я столкнулся с некоторой проблемой.

Допустим, я запустил несколько экземпляров бизнес-процесса. В консоли рабочего процесса я вижу следующее:

id: activiti$1801 , desc: DESCRIPTION_1 , start date: Sun Mar 12 19:19:09 GST 2017 , def: activiti$activitiParallelReview v1
id: activiti$2005 , desc: DESCRIPTION_2 , start date: Sun Mar 12 20:11:57 GST 2017 , def: activiti$activitiParallelReview v1
id: activiti$2138 , desc: DESCRIPTION_3 , start date: Sun Mar 12 20:12:55 GST 2017 , def: activiti$activitiParallelReview v1

Таким образом, у меня есть три идентификатора:

activiti$1801
activiti$2005
activiti$2138

Эти идентификаторы доступны мне только в Workflow Console.

Как я могу получить эти идентификаторы в контроллере?

Могу ли я, например, написать класс, который будет вызываться Activiti? Скажем,

public class SomeListener implements TaskListener {
...
    @Override
    public void notify(DelegateTask task) {
        ...
        String taskId = task.getId();
        ...
    }
}   

Затем прикрепите его к событию завершения некоторой задачи и передайте идентификатор контроллеру.

Это правильный путь?..

Буду очень благодарен за информацию. Спасибо всем.


Я написал класс, который реализует ExecutionListener интерфейс. Затем добавил его как прослушиватель при переходе от mswf:submitParallelReviewTask к mswf:activitiReviewTask.

Все свойства, которые мне нужны, я могу получить здесь (спасибо Gagravarr за его ответ):

public class PropertiesReceiver implements ExecutionListener {
    private static final long serialVersionUID = 1L;
    private static Log logger = LogFactory.getLog(PropertiesReceiver.class);

    @Override
    public void notify(DelegateExecution delegateExecution) throws Exception {
        // TODO Auto-generated method stub
        String processInstanceId = delegateExecution.getProcessInstanceId();
        logger.debug("processInstanceId == " + processInstanceId);

        ActivitiScriptNodeList assignees = 
                (ActivitiScriptNodeList) delegateExecution.getVariable("bpm_assignees"); 
        for (ActivitiScriptNode personNode : assignees) {
            String username = (String) personNode.getProperties().get("cm:userName");
            logger.debug("username == " + username);
        }
    }
}

alfrescotomcat-stdout.2017-03-13.log:

...
2017-03-13 11:03:12,244  DEBUG [mswf.bpm.PropertiesReceiver] [http-apr-8080-exec-3] processInstanceId == 26205
2017-03-13 11:03:12,248  DEBUG [mswf.bpm.PropertiesReceiver] [http-apr-8080-exec-3] username == first
2017-03-13 11:03:12,250  DEBUG [mswf.bpm.PropertiesReceiver] [http-apr-8080-exec-3] username == second
...

Но это отдельный проект, упакованный в AMP-файл.


Хорошо, по-другому. Я могу получить идентификатор экземпляра процесса в ScriptExecutionListener:

execution.getProcessInstanceId();

И вызовите Alfresco REST API со стороны общего доступа, чтобы получить всю необходимую мне информацию. (Спасибо Мартину Эхе).

Например, этот вызов позволяет получить всех исполнителей:

http://localhost:8080/alfresco/api/-default-/public/workflow/versions/1/processes/26205/variables

,где 26205 == id экземпляра процесса.

Но где я должен сохранить этот идентификатор, чтобы получить к нему доступ из Share? Можно ли добавить аспект в модель рабочего процесса и правильно ли это?..


person Community    schedule 12.03.2017    source источник
comment
Написать делегата рабочего процесса на Java? Это будет вызвано Activiti при запуске рабочего процесса или при переходе, чтобы выполнить вашу пользовательскую логику, и он знает, что это за рабочий процесс.   -  person Gagravarr    schedule 12.03.2017
comment
вы можете получить его, используя API-интерфейс шаблона freemarker, который предоставляет сведения о задаче текущего пользователя.   -  person vikash    schedule 13.03.2017


Ответы (1)


Пожалуйста, попробуйте это.

public JSONObject test(String userName) {


        JSONObject allTasks = new JSONObject();

        companyHome = repository.getCompanyHome();
        try {
            List<WorkflowTask> wft=serviceRegistry.getWorkflowService().getAssignedTasks(userName,WorkflowTaskState.IN_PROGRESS );

                JSONArray ja = new JSONArray();
                System.out.println("WF sizes = "+wft.size());
                for (WorkflowTask  temp : wft) {
                    JSONObject userWFDetails = new JSONObject();

                    userWFDetails.put("taskId", temp.getId());
                    userWFDetails.put("taskDesc", temp.getDescription());
                    userWFDetails.put("wfInstanceId", temp.getPath().getInstance().getId());

                    System.out.println("wf tasks-"+temp);
                    System.out.println("task id-"+temp.getId());
                    System.out.println("wf instance id-"+temp.getPath().getInstance().getId());
                    System.out.println("wf path id-"+temp.getPath().getId());
                    ja.put(userWFDetails);
                }           
                allTasks.put("userTasksDetails", ja);
            } catch (Exception e) {
            e.printStackTrace();
        }
        return allTasks;
    }

передать свое имя пользователя. и вы получите все детали задачи пользователя. сведения об экземпляре рабочего процесса в формате json.

person vikash    schedule 21.03.2017