Files
crm.clientright.ru/aiform_dev2/docs/SQL_DOCUMENTS_META_STRUCTURE.md
Fedor 01c4fe80b5 chore: snapshot current working tree changes
Save all currently accumulated repository changes as a backup snapshot for Gitea so no local work is lost.
2026-03-26 14:19:01 +03:00

2.8 KiB
Raw Blame History

Структура documents_meta в SQL запросах

Текущая структура после OCR объединения

После обработки файлов OCR возвращает объединённые документы со следующей структурой:

{
  "documents_meta": [
    {
      "field_name": "uploads[0][0]",
      "field_label": "Договор или заказ",
      "file_id": "clientright/0/1764167196926.pdf",
      "file_name": "1764167196926.pdf",
      "original_file_name": "1764167196926.pdf",
      "uploaded_at": "2025-11-26T14:44:51.430Z",
      "files_count": 2,    // ✅ Новое поле: сколько файлов было объединено
      "pages": 4            // ✅ Новое поле: сколько страниц в объединённом PDF
    }
  ]
}

Как SQL обрабатывает эту структуру

1. Сохранение в clpr_claim_documents

SQL использует jsonb_to_recordset для извлечения только нужных полей:

CROSS JOIN LATERAL jsonb_to_recordset(
  COALESCE(partial.p->'documents_meta', '[]'::jsonb)
) AS doc(
  field_name text, 
  file_id text, 
  file_name text, 
  original_file_name text, 
  uploaded_at text
)

Важно: field_label, files_count, pages не извлекаются, но это нормально - они не нужны в таблице clpr_claim_documents.

2. Сохранение в payload->'documents_meta'

Полный JSON сохраняется в payload через jsonb_build_object:

jsonb_build_object(
  'claim_id', partial.claim_id_str,
  'documents_meta', COALESCE(partial.p->'documents_meta', '[]'::jsonb),
  ...
)

Результат: Все поля (field_label, files_count, pages) сохраняются в payload->'documents_meta' в полном объёме.

Проверка сохранения

После выполнения SQL запроса можно проверить:

SELECT 
  payload->'documents_meta'->0->>'field_label' AS field_label,
  payload->'documents_meta'->0->>'files_count' AS files_count,
  payload->'documents_meta'->0->>'pages' AS pages
FROM clpr_claims
WHERE payload->>'claim_id' = 'bddb6815-8e17-4d54-a721-5e94382942c7';

Должны вернуться:

  • field_label: "Договор или заказ"
  • files_count: "2"
  • pages: "4"

Вывод

SQL запрос работает правильно - дополнительные поля сохраняются в payload->'documents_meta' и доступны для использования в дальнейших операциях.

Не нужно менять SQL - текущая структура достаточна для работы.