Files
crm.clientright.ru/ticket_form/check_claim_status.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

130 lines
6.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
Проверка статуса жалобы в базе данных
"""
import asyncio
import asyncpg
import json
# Параметры подключения к БД
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"
async def check_claim_status():
"""Проверяет статус жалобы"""
conn = None
try:
conn = await asyncpg.connect(
host=POSTGRES_HOST,
port=POSTGRES_PORT,
database=POSTGRES_DB,
user=POSTGRES_USER,
password=POSTGRES_PASSWORD
)
# Запрос статуса жалобы
query = """
SELECT
id,
status_code,
payload->>'claim_id' as claim_id,
payload->>'current_doc_index' as current_doc_index,
jsonb_array_length(COALESCE(payload->'documents_required', '[]'::jsonb)) as documents_required_count,
jsonb_array_length(COALESCE(payload->'documents_uploaded', '[]'::jsonb)) as documents_uploaded_count,
jsonb_array_length(COALESCE(payload->'documents_skipped', '[]'::jsonb)) as documents_skipped_count,
payload->'documents_required' as documents_required,
payload->'documents_uploaded' as documents_uploaded,
payload->'documents_skipped' as documents_skipped,
created_at,
updated_at
FROM clpr_claims
WHERE id::text = $1
OR payload->>'claim_id' = $1
ORDER BY updated_at DESC
LIMIT 1
"""
row = await conn.fetchrow(query, CLAIM_ID)
if not row:
print(f"❌ Жалоба с claim_id '{CLAIM_ID}' не найдена")
return
print("=" * 80)
print(f"📋 Статус жалобы: {CLAIM_ID}")
print("=" * 80)
print(f"ID в БД: {row['id']}")
print(f"Status Code: {row['status_code']}")
print(f"Claim ID: {row['claim_id']}")
print(f"Current Doc Index: {row['current_doc_index']}")
print(f"\n📊 Статистика документов:")
print(f" - Требуется документов: {row['documents_required_count']}")
print(f" - Загружено документов: {row['documents_uploaded_count']}")
print(f" - Пропущено документов: {row['documents_skipped_count']}")
print(f"\n📅 Даты:")
print(f" - Создано: {row['created_at']}")
print(f" - Обновлено: {row['updated_at']}")
documents_required = row['documents_required'] if isinstance(row['documents_required'], list) else (json.loads(row['documents_required']) if isinstance(row['documents_required'], str) else [])
documents_uploaded = row['documents_uploaded'] if isinstance(row['documents_uploaded'], list) else (json.loads(row['documents_uploaded']) if isinstance(row['documents_uploaded'], str) else [])
documents_skipped = row['documents_skipped'] if isinstance(row['documents_skipped'], list) else (json.loads(row['documents_skipped']) if isinstance(row['documents_skipped'], str) else [])
if documents_required:
print(f"\n📄 Требуемые документы:")
for idx, doc in enumerate(documents_required):
doc_obj = doc if isinstance(doc, dict) else json.loads(doc) if isinstance(doc, str) else {}
print(f" {idx}. {doc_obj.get('name', doc_obj.get('id', 'unknown'))} (id: {doc_obj.get('id', 'unknown')})")
if documents_uploaded:
print(f"\n✅ Загруженные документы:")
for doc in documents_uploaded:
doc_obj = doc if isinstance(doc, dict) else json.loads(doc) if isinstance(doc, str) else {}
print(f" - {doc_obj.get('id', 'unknown')}: {doc_obj.get('file_name', 'N/A')}")
if documents_skipped:
print(f"\n⏭️ Пропущенные документы:")
for doc in documents_skipped:
doc_obj = doc if isinstance(doc, dict) else json.loads(doc) if isinstance(doc, str) else {}
group_idx = doc_obj.get('group_index', 'N/A')
print(f" - {doc_obj.get('id', 'unknown')} (group_index: {group_idx}): {doc_obj.get('name', 'N/A')}")
print("\n" + "=" * 80)
# Определяем, что должно происходить дальше
status = row['status_code']
uploaded = row['documents_uploaded_count'] or 0
skipped = row['documents_skipped_count'] or 0
required = row['documents_required_count'] or 0
print(f"\n🔍 Анализ статуса:")
if status == 'draft_docs_complete':
print("Все документы обработаны (загружены или пропущены)")
print(" 📝 Должно происходить: формирование заявления (wizard generation)")
elif status == 'draft_docs_progress':
print(" ⏳ Документы загружаются")
remaining = required - uploaded - skipped
print(f" 📊 Осталось обработать: {remaining} документов")
elif status == 'draft_new':
print(" 🆕 Новая жалоба, только описание")
elif status == 'draft_claim_ready':
print(" ✅ Заявление готово к отправке")
else:
print(f" ⚠️ Неизвестный статус: {status}")
except Exception as e:
print(f"❌ Ошибка: {e}")
import traceback
traceback.print_exc()
finally:
if conn:
await conn.close()
if __name__ == "__main__":
asyncio.run(check_claim_status())