Skip to main content
Теперь ядро: логическая функция , загружающая шаблон и запись, заполняет плейсхолдеры, и сохраняет новый документ . Однажды мы напишем бизнес-логику как обработчик, а затем выявим его через несколько триггеров. В этой главе выводятся две из них — ИИ инструмент и действие рабочего процесса.

Помощник рендеринга

Держите чистую логику в своем собственном файле, так что легко отсоединить тест. Это преобразует запись в токены {{dot.path}} и подставляет их.
Поскольку этот файл не имеет побочных эффектов, вы можете прочитать его быстрыми модульными тестами (yarn test:unit). См. раздел Тестирование.

Обработчик

Обработчик использует CoreApiClient для чтения и записи данных CRM. Он загружает шаблон, загружает целевую запись, заполняет тело и создает document.
loadRecordValues запускает другой запрос для персона против компании и flattens результат — см. load-record-values.ts.

Расскажите об этом как инструменте и действии рабочего процесса

Один “defineLogicFunction” может иметь несколько триггеров. Здесь toolTriggerSettings делает его вызываемым агентами ИИ, а workflowActionTriggerSettings превращает его в шаг в визуальном конструкторе рабочих процессов. Оба описывают свои входные данные схемой JSON.
Входная схема — это обычная схема JSON, описывающая templateId и recordId — см. generate-document-input.schema.ts.

Предоставить доступ

Логические функции выполняются под ролью приложения. Ему нужно читать шаблоны и записи и создавать документы, поэтому разрешите это в src/roles/default-role.ts:
UPLOAD_FILE позволяет функции загрузить сгенерированный PDF в следующем разделе. Смотрите Roles для получения более четких разрешений.

Прикрепить настоящий PDF-файл

Поля отображаемого текста полезны, но пользователи хотят иметь настоящий документ. Давайте сгенерируем PDF и храним его в записи в качестве загружаемого файла. Сначала поставьте объект document поле FILES для удержания PDF. Приложения загружают файлы в собственные файловые поля, поэтому это поле определяет маршрут загрузки:
Введите, что PDF. Приложение — это настоящий проект Node, поэтому вы можете добавить любой нужный пакет npm и импортировать его, как и где угодно ещё. Мы используем pdf-lib для рисования PDF и marked для разбора тела Markdown — CLI устанавливает их во время работы функции:
Полный помощник generate-document-pdf.ts. Он анализирует Markdown в токены с marked. exer, затем расположите их с помощью pdf-lib: настоящие заголовки, черный/курсив пробег, пуля и нумерованные списки, blockquotes and rules — отполированный, многостраничный A4 рендеринг самого шаблона вместо стенки текста.
Отполированный, продаваемый файл PDF

Сгенерированный PDF: реальная типография и форматирование разметки, отрисовка тела шаблона.

Встроенные шрифты pdf-lib используют кодировку WinAnsi, поэтому западноевропейские символы с диакритикой отображаются “из коробки”; вспомогательная функция отображает типографские кавычки и тире и отбрасывает символы, которые она не может закодировать. Отображение нелатинских скриптов (китайский, арабский, кириллица) означало бы встраивание шрифта Unicode.
Затем загрузите его и сохраните ссылку на запись. uploadFile маршруты байт в поле файлы, принадлежащее приложению; возвращается id, что вы сохраните:
Сгенерированный документ теперь поддерживает загрузку PDF:
Документ записи с созданным PDF файлом

Сгенерированный PDF, хранится в поле File документа.

uploadFile только цели app-owned полей файлов (поэтому для загрузки всегда требуется приложение, которое владеет полем и флаг роли UPLOAD_FILE). Поэтому PDF опирается на собственное поле file (file) — тот же шаблон, что и call-recorder app используется для записей.
После этого шага: у каждого сгенерированного документа есть реальный, загружаемый PDF. Но ничего не может вызвать генератор из пользовательского интерфейса — для этого нам нужен HTTP маршрут.

Далее: HTTP-маршруты →

Сервис функции по HTTP и рендеринг документов как веб-страниц.