Files
aiform_dev/docs/N8N_CODE_PREPARE_DOCUMENT_SKIP_SQL.js

114 lines
4.0 KiB
JavaScript
Raw Permalink Normal View History

// ============================================================================
// n8n Code Node: Подготовка параметров для SQL при пропуске документа
// ============================================================================
// Входные данные: массив с объектом [{ propertyName: {...}, body: {...} }]
// Выходные данные: { $1: jsonb_payload, $2: claim_id_string }
// ============================================================================
// Получаем входные данные
const inputData = $input.all();
if (!inputData || inputData.length === 0) {
return [{
json: {
error: "Нет входных данных",
$1: null,
$2: null
}
}];
}
// Берём первый элемент
// Если это массив - берём первый элемент массива
// Если это объект - используем его напрямую
let firstItem = inputData[0].json;
if (Array.isArray(firstItem)) {
firstItem = firstItem[0];
}
// Извлекаем данные
const propertyName = firstItem.propertyName || {};
const body = firstItem.body || {};
// Извлекаем claim_id (приоритет: body -> propertyName)
const claim_id = body.claim_id || propertyName.claim_id || null;
if (!claim_id) {
return [{
json: {
error: "claim_id не найден",
$1: null,
$2: null,
debug: {
body_keys: Object.keys(body),
propertyName_keys: Object.keys(propertyName)
}
}
}];
}
// Формируем payload для $1 (jsonb)
// SQL ищет данные в разных местах: p->>'document_type', p->'body'->>'document_type', p->'edit_fields_raw'->'body'->>'document_type'
const payload = {
// ✅ Основные идентификаторы (в корне для быстрого доступа)
session_id: body.session_id || propertyName.session_id,
claim_id: claim_id,
unified_id: body.unified_id || propertyName.unified_id,
contact_id: body.contact_id || propertyName.contact_id,
phone: body.phone || propertyName.phone,
// ✅ Информация о пропущенном документе (в корне для быстрого доступа)
document_type: body.document_type,
document_name: body.document_name || body.document_type,
group_index: body.group_index ? parseInt(body.group_index) : (body.group_index || null),
// ✅ Метаданные пропуска
skipped: body.skipped,
action: body.action,
skip_timestamp: body.skip_timestamp || new Date().toISOString(),
// ✅ Данные из propertyName (для сохранения в payload)
problem_description: propertyName.description || propertyName.problem_description,
email: propertyName.email,
// ✅ Данные из body (для совместимости)
form_id: body.form_id,
stage: body.stage,
client_ip: body.client_ip,
// ✅ Поля для совместимости с существующим SQL (SQL ищет данные здесь)
body: {
document_type: body.document_type,
document_name: body.document_name || body.document_type,
group_index: body.group_index ? parseInt(body.group_index) : (body.group_index || null),
session_id: body.session_id,
claim_id: claim_id,
unified_id: body.unified_id,
contact_id: body.contact_id,
phone: body.phone
},
edit_fields_raw: {
propertyName: propertyName,
body: body
},
edit_fields_parsed: {
propertyName: propertyName,
body: body
}
};
// Возвращаем параметры для SQL
return [{
json: {
$1: payload, // JSONB payload для SQL (будет передан как $1::jsonb)
$2: claim_id, // TEXT claim_id для SQL (будет передан как $2::text)
// Дополнительные поля для отладки
claim_id: claim_id,
document_type: body.document_type,
document_name: body.document_name,
group_index: body.group_index
}
}];