99 lines
3.1 KiB
MySQL
99 lines
3.1 KiB
MySQL
|
|
-- ============================================================================
|
|||
|
|
-- 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;
|
|||
|
|
|