1.7.2. Контроллер экрана редактирования договора
Перейдите на вкладку Controller и замените ее содержимое на следующий код:
package com.company.demo.web.contract;
import com.company.demo.entity.Contract;
import com.haulmont.bpm.entity.ProcAttachment;
import com.haulmont.bpm.gui.procactions.ProcActionsFrame;
import com.haulmont.cuba.gui.app.core.file.FileDownloadHelper;
import com.haulmont.cuba.gui.components.AbstractEditor;
import com.haulmont.cuba.gui.components.Table;
import javax.inject.Inject;
public class ContractEdit extends AbstractEditor<Contract> {
private static final String PROCESS_CODE = "contractApproval";
@Inject
private ProcActionsFrame procActionsFrame;
@Inject
private Table<ProcAttachment> attachmentsTable;
@Override
protected void postInit() {
FileDownloadHelper.initGeneratedColumn(attachmentsTable, "file");
initProcActionsFrame();
}
private void initProcActionsFrame() {
procActionsFrame.initializer()
.setBeforeStartProcessPredicate(this::commit)
.setAfterStartProcessListener(() -> {
showNotification(getMessage("processStarted"), NotificationType.HUMANIZED);
close(COMMIT_ACTION_ID);
})
.setBeforeCompleteTaskPredicate(this::commit)
.setAfterCompleteTaskListener(() -> {
showNotification(getMessage("taskCompleted"), NotificationType.HUMANIZED);
close(COMMIT_ACTION_ID);
})
.init(PROCESS_CODE, getItem());
}
}
Сохраните изменения, нажав кнопку OK.
Рассмотрим код контроллера более подробно.
ProcActionsFrame
- это стандартный фрейм для отображения кнопок доступных в данный момент процессных действий. Во время инициализации фрейма по двум параметрам (код процесса и сущность) ищется связанный экезмпляр ProcInstance
. Если процесс не находится, то создается новый ProcInstance
, и фрейм отображает кнопку запуска процесса. Если связанный с сущностью процесс найден, то проверяется, имеется ли незавершенная процессная задача для текущего пользователя, и если да, то отображаются кнопки завершения данной задачи. Подробнее о ProcActionsFrame см. ProcActionsFrame.
В контроллере редактора договора инициализация фрейма процессных действий происходит в методе initProcActionsFrame()
. Самая важная часть метода - вызов init(PROCESS_CODE, getItem())
. Константа PROCESS_CODE
хранит код процесса (contractApproval
- это значение мы видели при равертывании процесса, см. Развертывание модели процесса). Второй аргумент getItem()
- текущий договор.
Во время инициализации фрейма мы также объявили дополнительную логику, связанную с процессными действиями:
-
setBeforeStartProcessPredicate
добавляет проверку, выполняемую перед запуском процесса. Выполняется коммит экрана, если коммит не проходит успешно, процесс не запускается -
setAfterStartProcessListener
отображает уведомление и закрывает редактор договора после запуска процесса -
setBeforeCompleteTaskPredicate
вызывает коммит редактора договора перед выполнением процессного действия. В случае неуспешного коммита, процессное действие не выполняется -
setAfterCompleteTaskListener
отображает уведомление и закрывает редактор договора после завершения процессного действия.