fix: Исправление загрузки документов и SQL запросов

- Исправлена потеря документов при обновлении черновика (SQL объединяет вместо перезаписи)
- Исправлено определение типа документа (приоритет field_label над field_name)
- Исправлены дубликаты в documents_meta и documents_uploaded
- Добавлена передача group_index с фронтенда для правильного field_name
- Исправлены все документы в таблице clpr_claim_documents с правильными field_name
- Обновлены SQL запросы: claimsave и claimsave_final для нового флоу
- Добавлена поддержка multi-file upload для одного документа
- Исправлены дубликаты в списке загруженных документов на фронтенде

Файлы:
- SQL: SQL_CLAIMSAVE_FIXED_NEW_FLOW.sql, SQL_CLAIMSAVE_FINAL_FIXED_NEW_FLOW_WITH_UPLOADED.sql
- n8n: N8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js (поддержка group_index)
- Backend: documents.py (передача group_index в n8n)
- Frontend: StepWizardPlan.tsx (передача group_index, исправление дубликатов)
- Скрипты: fix_claim_documents_field_names.py, fix_documents_meta_duplicates.py

Результат: документы больше не теряются, имеют правильные типы и field_name
This commit is contained in:
AI Assistant
2025-11-26 19:54:51 +03:00
parent 1d6c9d1f52
commit 02689e65db
42 changed files with 8314 additions and 232 deletions

View File

@@ -0,0 +1,98 @@
-- ============================================================================
-- SQL для исправления field_name в таблице clpr_claim_documents
-- ============================================================================
-- Проблема: Все документы имеют одинаковый field_name (uploads[0][0])
-- Решение: Пересоздаём записи с правильными field_name на основе documents_uploaded
-- ============================================================================
-- Для конкретного claim_id
WITH claim_data AS (
SELECT
id,
payload
FROM clpr_claims
WHERE id::text = 'bddb6815-8e17-4d54-a721-5e94382942c7'
OR payload->>'claim_id' = 'bddb6815-8e17-4d54-a721-5e94382942c7'
ORDER BY updated_at DESC
LIMIT 1
),
-- Извлекаем documents_required для определения индексов
documents_required_array AS (
SELECT
jsonb_array_elements(payload->'documents_required') WITH ORDINALITY AS doc_req(doc, idx)
FROM claim_data
),
-- Извлекаем documents_uploaded с правильными индексами
documents_uploaded_mapped AS (
SELECT
doc_up.*,
(doc_req.idx - 1)::int AS group_index -- Индекс документа (0-based)
FROM claim_data,
jsonb_array_elements(payload->'documents_uploaded') AS doc_up,
documents_required_array doc_req
WHERE (doc_up->>'id' = doc_req.doc->>'id' OR doc_up->>'type' = doc_req.doc->>'id')
),
-- Удаляем старые записи
deleted_old AS (
DELETE FROM clpr_claim_documents
WHERE claim_id = (SELECT id::text FROM claim_data)
RETURNING claim_id, field_name, file_id
),
-- Вставляем новые записи с правильными field_name
inserted_new AS (
INSERT INTO clpr_claim_documents (
claim_id,
field_name,
file_id,
file_name,
original_file_name,
uploaded_at
)
SELECT
(SELECT id::text FROM claim_data) AS claim_id,
'uploads[' || group_index || '][0]' AS field_name,
doc_up->>'file_id' AS file_id,
doc_up->>'file_name' AS file_name,
doc_up->>'original_file_name' AS original_file_name,
COALESCE(
(doc_up->>'uploaded_at')::timestamptz,
now()
) AS uploaded_at
FROM documents_uploaded_mapped doc_up
WHERE doc_up->>'file_id' IS NOT NULL
AND doc_up->>'file_id' <> ''
ON CONFLICT (claim_id, field_name) DO UPDATE SET
file_id = EXCLUDED.file_id,
file_name = EXCLUDED.file_name,
original_file_name = EXCLUDED.original_file_name,
uploaded_at = EXCLUDED.uploaded_at
RETURNING claim_id, field_name, file_id, file_name
)
-- Возвращаем результат
SELECT
'Удалено старых записей' AS action,
COUNT(*) AS count
FROM deleted_old
UNION ALL
SELECT
'Вставлено новых записей' AS action,
COUNT(*) AS count
FROM inserted_new;
-- Проверка результата
SELECT
ccd.claim_id,
ccd.field_name,
ccd.file_id,
ccd.file_name,
ccd.original_file_name,
ccd.uploaded_at
FROM clpr_claim_documents ccd
WHERE ccd.claim_id = 'bddb6815-8e17-4d54-a721-5e94382942c7'
ORDER BY ccd.field_name;