216 lines
8.5 KiB
Python
216 lines
8.5 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
"""
|
|||
|
|
CSV генератор для проверки сырых данных
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import psycopg2
|
|||
|
|
import json
|
|||
|
|
import csv
|
|||
|
|
from urllib.parse import unquote
|
|||
|
|
from datetime import datetime
|
|||
|
|
|
|||
|
|
# Конфигурация БД
|
|||
|
|
DB_CONFIG = {
|
|||
|
|
'host': '147.45.189.234',
|
|||
|
|
'port': 5432,
|
|||
|
|
'database': 'default_db',
|
|||
|
|
'user': 'gen_user',
|
|||
|
|
'password': unquote('2~~9_%5EkVsU%3F2%5CS')
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
def get_audit_results_from_db():
|
|||
|
|
"""Получить результаты аудита из БД"""
|
|||
|
|
try:
|
|||
|
|
conn = psycopg2.connect(**DB_CONFIG)
|
|||
|
|
cursor = conn.cursor()
|
|||
|
|
|
|||
|
|
cursor.execute("""
|
|||
|
|
SELECT
|
|||
|
|
ar.hotel_id,
|
|||
|
|
hm.full_name,
|
|||
|
|
hm.website_address,
|
|||
|
|
hm.rkn_registry_status,
|
|||
|
|
hm.rkn_registry_number,
|
|||
|
|
hm.rkn_registry_date,
|
|||
|
|
ar.score_percentage,
|
|||
|
|
ar.criteria_results,
|
|||
|
|
hm.created_at
|
|||
|
|
FROM hotel_audit_results ar
|
|||
|
|
JOIN hotel_main hm ON ar.hotel_id = hm.id
|
|||
|
|
WHERE hm.region_name = 'Чукотский автономный округ'
|
|||
|
|
ORDER BY hm.created_at DESC
|
|||
|
|
""")
|
|||
|
|
|
|||
|
|
results = []
|
|||
|
|
for row in cursor.fetchall():
|
|||
|
|
# Конвертируем в словарь
|
|||
|
|
result = {
|
|||
|
|
'hotel_id': row[0],
|
|||
|
|
'full_name': row[1],
|
|||
|
|
'website_address': row[2],
|
|||
|
|
'rkn_registry_status': row[3],
|
|||
|
|
'rkn_registry_number': row[4],
|
|||
|
|
'rkn_registry_date': row[5],
|
|||
|
|
'score_percentage': row[6],
|
|||
|
|
'criteria_results': row[7],
|
|||
|
|
'created_at': row[8]
|
|||
|
|
}
|
|||
|
|
results.append(result)
|
|||
|
|
|
|||
|
|
cursor.close()
|
|||
|
|
conn.close()
|
|||
|
|
|
|||
|
|
return results
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"❌ Ошибка получения данных: {e}")
|
|||
|
|
return []
|
|||
|
|
|
|||
|
|
def create_csv_report(results):
|
|||
|
|
"""Создать CSV отчёт"""
|
|||
|
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|||
|
|
filename = f"audit_debug_{timestamp}.csv"
|
|||
|
|
|
|||
|
|
with open(filename, 'w', newline='', encoding='utf-8') as csvfile:
|
|||
|
|
writer = csv.writer(csvfile)
|
|||
|
|
|
|||
|
|
# Заголовки
|
|||
|
|
headers = [
|
|||
|
|
'ID отеля', 'Название отеля', 'Сайт', 'Балл (%)', 'Дата аудита',
|
|||
|
|
'РКН статус', 'РКН номер', 'РКН дата'
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
# Добавляем заголовки критериев
|
|||
|
|
if results and results[0]['criteria_results']:
|
|||
|
|
criteria_results = results[0]['criteria_results']
|
|||
|
|
if isinstance(criteria_results, str):
|
|||
|
|
criteria_results = json.loads(criteria_results)
|
|||
|
|
|
|||
|
|
if isinstance(criteria_results, list):
|
|||
|
|
for criterion_idx, criterion in enumerate(criteria_results):
|
|||
|
|
# Пропускаем критерий 6 (РКН) - он будет отдельно
|
|||
|
|
if criterion_idx == 5: # индекс 5 = критерий 6
|
|||
|
|
continue
|
|||
|
|
|
|||
|
|
criterion_name = f"Критерий_{criterion_idx+1}"
|
|||
|
|
headers.extend([
|
|||
|
|
f"{criterion_name}_Статус",
|
|||
|
|
f"{criterion_name}_URL",
|
|||
|
|
f"{criterion_name}_Комментарий"
|
|||
|
|
])
|
|||
|
|
|
|||
|
|
# Добавляем РКН колонки
|
|||
|
|
headers.extend(['РКН_Реестр', 'РКН_Номер_Дата', 'РКН_Ссылка'])
|
|||
|
|
|
|||
|
|
writer.writerow(headers)
|
|||
|
|
|
|||
|
|
# Данные
|
|||
|
|
for result in results:
|
|||
|
|
row = [
|
|||
|
|
result['hotel_id'],
|
|||
|
|
result['full_name'],
|
|||
|
|
result['website_address'] or '-',
|
|||
|
|
result['score_percentage'],
|
|||
|
|
str(result['created_at'])[:10]
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
# РКН данные из hotel_main
|
|||
|
|
rkn_status = result.get('rkn_registry_status', '')
|
|||
|
|
rkn_in_registry = "ДА" if rkn_status and rkn_status.lower() == 'found' else "НЕТ"
|
|||
|
|
rkn_number = result.get('rkn_registry_number', '')
|
|||
|
|
rkn_date = result.get('rkn_registry_date', '')
|
|||
|
|
rkn_info_text = f"{rkn_number}\n{rkn_date}" if rkn_number or rkn_date else "-"
|
|||
|
|
rkn_url = f"https://rkn.gov.ru/mass-communications/reestr/search/?q={rkn_number}" if rkn_number else "-"
|
|||
|
|
|
|||
|
|
row.extend([rkn_in_registry, rkn_info_text, rkn_url])
|
|||
|
|
|
|||
|
|
# Данные критериев
|
|||
|
|
criteria_results = result['criteria_results']
|
|||
|
|
if isinstance(criteria_results, str):
|
|||
|
|
criteria_results = json.loads(criteria_results)
|
|||
|
|
|
|||
|
|
if isinstance(criteria_results, list):
|
|||
|
|
for criterion_idx, criterion in enumerate(criteria_results):
|
|||
|
|
# Пропускаем критерий 6 (РКН) - он будет отдельно
|
|||
|
|
if criterion_idx == 5:
|
|||
|
|
continue
|
|||
|
|
|
|||
|
|
# Статус
|
|||
|
|
status = "ДА" if criterion.get('found') else "НЕТ"
|
|||
|
|
|
|||
|
|
# URL
|
|||
|
|
url = '-'
|
|||
|
|
if criterion.get('ai_agent', {}).get('url'):
|
|||
|
|
url = criterion['ai_agent']['url']
|
|||
|
|
|
|||
|
|
# Комментарий
|
|||
|
|
comment = "Не найдено"
|
|||
|
|
if criterion.get('found'):
|
|||
|
|
if criterion.get('ai_agent', {}).get('details'):
|
|||
|
|
comment = criterion['ai_agent']['details']
|
|||
|
|
elif criterion.get('ai_agent', {}).get('quote'):
|
|||
|
|
comment = criterion['ai_agent']['quote']
|
|||
|
|
elif criterion.get('regex', {}).get('extracted'):
|
|||
|
|
comment = criterion['regex']['extracted']
|
|||
|
|
|
|||
|
|
row.extend([status, url, comment])
|
|||
|
|
|
|||
|
|
writer.writerow(row)
|
|||
|
|
|
|||
|
|
return filename
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
"""Основная функция"""
|
|||
|
|
print("🚀 ГЕНЕРАЦИЯ CSV ДЛЯ ДЕБАГА")
|
|||
|
|
print("=" * 40)
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
# Получаем данные
|
|||
|
|
print("📡 Подключаюсь к БД...")
|
|||
|
|
results = get_audit_results_from_db()
|
|||
|
|
|
|||
|
|
if not results:
|
|||
|
|
print("❌ Нет данных для отчёта")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
print(f"✅ Получено результатов: {len(results)}")
|
|||
|
|
|
|||
|
|
# Выводим сырые данные первого отеля
|
|||
|
|
if results:
|
|||
|
|
print("\n🔍 СЫРЫЕ ДАННЫЕ ПЕРВОГО ОТЕЛЯ:")
|
|||
|
|
print(f"ID: {results[0]['hotel_id']}")
|
|||
|
|
print(f"Название: {results[0]['full_name']}")
|
|||
|
|
print(f"Сайт: {results[0]['website_address']}")
|
|||
|
|
print(f"РКН статус: {results[0]['rkn_registry_status']}")
|
|||
|
|
print(f"РКН номер: {results[0]['rkn_registry_number']}")
|
|||
|
|
print(f"РКН дата: {results[0]['rkn_registry_date']}")
|
|||
|
|
print(f"Балл: {results[0]['score_percentage']}")
|
|||
|
|
|
|||
|
|
criteria_results = results[0]['criteria_results']
|
|||
|
|
if isinstance(criteria_results, str):
|
|||
|
|
criteria_results = json.loads(criteria_results)
|
|||
|
|
|
|||
|
|
print(f"\n📊 КРИТЕРИИ ({len(criteria_results)} шт.):")
|
|||
|
|
for i, criterion in enumerate(criteria_results):
|
|||
|
|
if isinstance(criterion, dict):
|
|||
|
|
print(f" {i+1}. {criterion.get('criterion_name', f'Критерий {i+1}')}: {criterion.get('found', False)}")
|
|||
|
|
else:
|
|||
|
|
print(f" {i+1}. {criterion} (тип: {type(criterion)})")
|
|||
|
|
|
|||
|
|
# Создаём CSV
|
|||
|
|
filename = create_csv_report(results)
|
|||
|
|
|
|||
|
|
print(f"\n✅ CSV файл сохранён: {filename}")
|
|||
|
|
print(f"📊 Обработано отелей: {len(results)}")
|
|||
|
|
|
|||
|
|
if results:
|
|||
|
|
avg_score = sum(r['score_percentage'] for r in results) / len(results)
|
|||
|
|
print(f"📈 Средний % соответствия: {avg_score:.1f}%")
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"❌ Ошибка: {e}")
|
|||
|
|
import traceback
|
|||
|
|
traceback.print_exc()
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
main()
|