- Исправлена потеря документов при обновлении черновика (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
99 lines
3.1 KiB
SQL
99 lines
3.1 KiB
SQL
-- ============================================================================
|
||
-- 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;
|
||
|