API Survey Processing Workflow
1. Обзор workflow
Workflow для обработки опросов с различными статусами (planned, active, processing).
| Название | api-survey-processing |
|---|---|
| База данных | PostgreSQL (surveys, companies, managers, employees) |
| Основной webhook | POST /processing/survey |
| Основные операции | Обновление статусов опросов, отправка email уведомлений |
2. POST /processing/survey
Центральный обработчик опросов, управляющий их жизненным циклом.
Цепочка выполнения:
-
Webhook (processing/survey)
Принимает POST-запрос с параметрами:
query.surveyId- ID опросаquery.status- текущий статус опроса
Пример запроса:
{ "query": { "surveyId": "49", "status": "processing" } } -
If
Проверяет, что статус не равен "processing":
Условие: $json.query.status != "processing"Это защита от повторной обработки.
-
Ветка 1 (status != processing):
-
get survey data
Получает основные данные опроса:
SELECT "surveyId", "auditory", "respondents", "status", "start_date", "end_date", "type", "groupIndex", "companyId" FROM surveys WHERE "surveyId" = $1;
-
get survey data
-
Ветка 2 (status == processing):
-
get survey "processing"
Проверяет, можно ли обрабатывать опрос:
SELECT "surveyId", "auditory", "respondents", "status", "start_date", "end_date", "type", "groupIndex", "companyId" FROM surveys WHERE "surveyId" = $1 AND "processing" <= 0;Защита от параллельной обработки.
-
get survey "processing"
-
If serveys>
Проверяет, что данные опроса не пустые:
Условие: $json != null -
make sql code
Генерирует SQL-запросы в зависимости от статуса опроса:
Логика работы:
- planned → active: обновляет статус, устанавливает даты
- active → processing: меняет статус, сбрасывает счетчик обработки
- processing → completed: завершает опрос
Пример для статуса "planned":
UPDATE "surveys" SET "status" = 'active', "start_date" = '{start_date}', "end_date" = '{end_date}' WHERE "surveyId" = {surveyId} RETURNING "surveyId", "token" AS "survey_token", "status", "start_date", "end_date";Дополнительные SQL:
- Запрос данных компании
- Запрос менеджеров компании
- Запрос респондентов (для planned)
-
Switch
Разделяет поток по значению switch:
- start_surveys - начало опроса
- end_surveys - завершение активной фазы
- processing_surveys - обработка результатов
-
Ветка start_surveys:
-
update_survey
Обновляет статус опроса на "active":
{{ $json.survey_sql }} -
get_respondents
Получает список респондентов:
SELECT "userId", "token", "email", "subscribe", "companyId" FROM "employees" WHERE "userId" IN (...) OR "departmentId" IN (...); -
Code
Подсчитывает респондентов:
return { "users_total": len(data), "respondents": [item['json']['userId'] for item in data] } -
Code1
Рассчитывает дни опроса и форматирует дату окончания:
# Пример вывода: { "days_count": 14, "end_date_description": "15 мая 2024 года в 18:00 (UTC+3)" } -
subscribe check
Проверяет подписку респондента:
Условие: $json.subscribe == true -
EMAIL to respondents
Отправляет email с приглашением:
POST https://api.beta.rusender.ru/api/v1/external-mails/send-by-template Параметры: email, token, survey_token, days_count, end_date_description
-
update_survey
-
Ветка end_surveys:
-
update_survey
Обновляет статус на "processing":
UPDATE "surveys" SET "status" = 'processing', "processing" = 0 WHERE "surveyId" = {surveyId} RETURNING "surveyId", "token" AS "survey_token", "status"; -
Split departments
Разделяет departmentIds для дальнейшей обработки.
-
Execute Workflow
Запускает внешний workflow (api-ai-syncdata).
-
update_survey
-
Ветка processing_surveys:
-
update_survey
Завершает опрос:
UPDATE "surveys" SET "status" = 'completed' WHERE "surveyId" = {surveyId} RETURNING "surveyId", "token" AS "survey_token", "status"; -
Postgres1
Рассчитывает процент завершения:
SELECT total_respondents_count, current_respondents_count, ROUND((current_respondents_count * 100.0 / total_respondents_count)) AS completion_percentage FROM surveys WHERE "surveyId" = $1; -
Postgres2
Считает AI-данные:
SELECT COUNT(*) AS "survey_ai" FROM raw_ai_data WHERE "surveyId" = $1; -
Edit Fields
Форматирует статистику:
"survey-respondents": "12 из 50 (24%)" -
Switch2
Проверяет подписку менеджера:
Условие: $json.subscribe == true -
EMAIL to respondents1
Отправляет отчет менеджеру:
POST https://api.beta.rusender.ru/api/v1/external-mails/send-by-template Параметры: email, firstName, lastName, token, survey-respondents, survey_ai
-
update_survey
Особенности:
- Автоматический переход между статусами опроса
- Защита от параллельной обработки (processing counter)
- Интеграция с email-сервисом для уведомлений
- Поддержка разных сценариев для каждого статуса