Files
crm.clientright.ru/ticket_form/fix_draft_bddb6815.py
Fedor 840acca51a feat(documents): дедупликация documents_meta и исправление field_label
- Исправлен N8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js: использовать uploads_field_labels[0] вместо [grp]
- Создан SQL_CLAIMSAVE_FIXED_NEW_FLOW_DEDUP.sql с дедупликацией documents_meta
- Создан SQL_CLEANUP_DOCUMENTS_META_DUPLICATES.sql для очистки существующих дубликатов
- Создан полный уникальный индекс idx_document_texts_hash_unique на document_texts(file_hash)
- Добавлен SESSION_LOG_2025-11-28_documents_dedup.md с описанием всех изменений

Fixes:
- field_label теперь корректно отображает 'Переписка' вместо 'group-2'
- documents_meta не накапливает дубликаты при повторных сохранениях
- ON CONFLICT (file_hash) теперь работает для document_texts
2025-11-28 18:16:53 +03:00

137 lines
4.8 KiB
Python

#!/usr/bin/env python3
"""
Скрипт для исправления черновика bddb6815-8e17-4d54-a721-5e94382942c7
Добавляет documents_required и исправляет статус
"""
import asyncio
import asyncpg
import json
from pathlib import Path
# Параметры подключения к БД (из config.py)
POSTGRES_HOST = "147.45.189.234"
POSTGRES_PORT = 5432
POSTGRES_DB = "default_db"
POSTGRES_USER = "gen_user"
POSTGRES_PASSWORD = "2~~9_^kVsU?2\\S"
CLAIM_ID = "bddb6815-8e17-4d54-a721-5e94382942c7"
DOCUMENTS_REQUIRED = [
{
"id": "contract",
"name": "Договор или заказ",
"hints": "Фото или скан подписанного договора или квитанции",
"accept": ["pdf", "jpg", "png"],
"priority": 1,
"required": True
},
{
"id": "payment",
"name": "Чек или подтверждение оплаты",
"hints": "Копия кассового чека, онлайн-платежа или квитанции",
"accept": ["pdf", "jpg", "png"],
"priority": 1,
"required": True
},
{
"id": "correspondence",
"name": "Переписка",
"hints": "Скриншоты сообщений, писем, жалоб",
"accept": ["pdf", "jpg", "png"],
"priority": 2,
"required": False
},
{
"id": "evidence_photo",
"name": "Фото доказательства",
"hints": "Фото дефектов товара, видео процесса ремонта или передачи",
"accept": ["jpg", "png", "pdf"],
"priority": 2,
"required": False
}
]
async def fix_draft():
"""Исправляет черновик: добавляет documents_required и обновляет статус"""
conn = await asyncpg.connect(
host=POSTGRES_HOST,
port=POSTGRES_PORT,
database=POSTGRES_DB,
user=POSTGRES_USER,
password=POSTGRES_PASSWORD
)
try:
# Получаем текущее состояние черновика
row = await conn.fetchrow("""
SELECT id, status_code, payload
FROM clpr_claims
WHERE id::text = $1 OR payload->>'claim_id' = $1
LIMIT 1
""", CLAIM_ID)
if not row:
print(f"❌ Черновик {CLAIM_ID} не найден!")
return
payload = row['payload'] if isinstance(row['payload'], dict) else json.loads(row['payload'])
current_status = row['status_code']
documents_uploaded = payload.get('documents_uploaded', [])
uploaded_count = len(documents_uploaded) if isinstance(documents_uploaded, list) else 0
print(f"📋 Текущее состояние черновика:")
print(f" - status_code: {current_status}")
print(f" - documents_required: {len(payload.get('documents_required', []))} шт.")
print(f" - documents_uploaded: {uploaded_count} шт.")
# Определяем новый статус
if uploaded_count > 0:
if uploaded_count >= len(DOCUMENTS_REQUIRED):
new_status = 'draft_docs_complete'
else:
new_status = 'draft_docs_progress'
else:
new_status = 'draft_new'
# Обновляем payload
payload['documents_required'] = DOCUMENTS_REQUIRED
# Обновляем черновик
await conn.execute("""
UPDATE clpr_claims
SET
status_code = $1,
payload = $2::jsonb,
updated_at = now()
WHERE id::text = $3 OR payload->>'claim_id' = $3
""", new_status, json.dumps(payload, ensure_ascii=False), CLAIM_ID)
print(f"\n✅ Черновик исправлен!")
print(f" - Новый status_code: {new_status}")
print(f" - documents_required: {len(DOCUMENTS_REQUIRED)} документов добавлено")
# Проверяем результат
row_after = await conn.fetchrow("""
SELECT
id::text,
status_code,
jsonb_array_length(COALESCE(payload->'documents_required', '[]'::jsonb)) as docs_count
FROM clpr_claims
WHERE id::text = $1 OR payload->>'claim_id' = $1
LIMIT 1
""", CLAIM_ID)
print(f"\n📊 Результат:")
print(f" - status_code: {row_after['status_code']}")
print(f" - documents_required count: {row_after['docs_count']}")
finally:
await conn.close()
if __name__ == "__main__":
asyncio.run(fix_draft())