Создать вложение из процесса BPM

Задача: с помощью процесса создать вложение файла для некоторого объекта системы

В пользовательской задаче есть переменная типа file-description (io.jmix.bpm.entity.FileDescription), которая позволяет выбрать файл из системы.
Далее необходимо создать объект Attachment и в него прописать параметры выбранного файла. Но в Attachment описание файла содержится типом FileRef (io.jmix.core.FileRef). и при попытке присвоить туда переменную процесса получаем закономерную ошибку:
image

Вопрос: как решается подобная задача (создать вложение из процесса) ?

Как вы уже заметили, если сохранить файл из InputDialog формы, то файл сохранится в байтовом массиве в объекте специального типа io.jmix.bpm.entity.FileDescription. У нас есть задачка на добавление комментария, чтобы сделать этот тип более понятным для пользователя.

Чтобы получить FileRef нужно где-то явно сделать преобразование FileDescription в FileRef. Если сущность Attachment у вас создаётся выделенной сервис таской, то можно это преобразование сделать прямо в этой сервис таске.

Либо можно отдельной сервис-таской преобразовать FileDescription в FileRef, положить FileRef в переменные процесса и дальше уже работать с переменной FileRef (использовать её в дата-тасках и т.п.).

Screenshot 2023-07-18 at 12.27.49

import io.jmix.bpm.entity.FileDescription;
import io.jmix.core.FileRef;
import io.jmix.core.FileStorage;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

@Component
public class ProcessFileManager {

    private FileStorage fileStorage;

    public ProcessFileManager(FileStorage fileStorage) {
        this.fileStorage = fileStorage;
    }

    public FileRef saveFileToFileStorage2(FileDescription fileDescription) throws IOException {
        try (InputStream is = new ByteArrayInputStream(fileDescription.getFileContent())) {
            FileRef fileRef = fileStorage.saveStream(fileDescription.getFileName(), is);
            return fileRef;
        }
    }
}

Проект, демонстрирующий данный подход: bpm-file.zip (128.1 КБ)

Третий вариант - использовать Jmix screen форму вместо Input Dialog и в этой форме сразу создавать процессную переменную с типом FileRef.