fix: Перезапуск платформы - исправлены зависимости и TypeScript ошибки
- Исправлены TypeScript ошибки в Step3Payment.tsx (типизация, неиспользуемые импорты) - Добавлены недостающие зависимости: aiomysql, pymysql, python-multipart - Обновлен requirements.txt с актуальными версиями - Добавлены новые API endpoints: policy check, file upload - Добавлен policy_service для работы с MySQL - Все сервисы успешно запущены и работают - Обновлен SESSION_LOG с документацией процесса
This commit is contained in:
89
backend/app/services/policy_service.py
Normal file
89
backend/app/services/policy_service.py
Normal file
@@ -0,0 +1,89 @@
|
||||
"""
|
||||
Policy Service - Проверка полисов в MySQL БД
|
||||
"""
|
||||
import aiomysql
|
||||
from typing import Optional, Dict, Any
|
||||
from ..config import settings
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class PolicyService:
|
||||
"""Сервис для проверки полисов ERV"""
|
||||
|
||||
def __init__(self):
|
||||
self.pool: Optional[aiomysql.Pool] = None
|
||||
|
||||
async def connect(self):
|
||||
"""Подключение к MySQL БД с полисами"""
|
||||
try:
|
||||
# Используем credentials из .env через settings
|
||||
self.pool = await aiomysql.create_pool(
|
||||
host=settings.mysql_host,
|
||||
port=settings.mysql_port,
|
||||
user=settings.mysql_user,
|
||||
password=settings.mysql_password,
|
||||
db=settings.mysql_db,
|
||||
autocommit=True,
|
||||
minsize=1,
|
||||
maxsize=5
|
||||
)
|
||||
logger.info(f"✅ MySQL Policy DB connected: {settings.mysql_host}/{settings.mysql_db}")
|
||||
except Exception as e:
|
||||
logger.error(f"❌ MySQL Policy DB connection error: {e}")
|
||||
raise
|
||||
|
||||
async def check_policy(self, voucher: str, inn: Optional[str] = None) -> Optional[Dict[str, Any]]:
|
||||
"""
|
||||
Проверить полис в БД
|
||||
|
||||
Args:
|
||||
voucher: Номер полиса
|
||||
inn: ИНН (опционально)
|
||||
|
||||
Returns:
|
||||
Dict с данными полиса или None если не найден
|
||||
"""
|
||||
if not self.pool:
|
||||
await self.connect()
|
||||
|
||||
try:
|
||||
async with self.pool.acquire() as conn:
|
||||
async with conn.cursor(aiomysql.DictCursor) as cursor:
|
||||
# Базовый запрос
|
||||
query = "SELECT * FROM erv_vouchers WHERE voucher = %s"
|
||||
params = [voucher]
|
||||
|
||||
# Если указан ИНН, добавляем проверку
|
||||
if inn:
|
||||
query += " AND inn = %s"
|
||||
params.append(inn)
|
||||
|
||||
query += " LIMIT 1"
|
||||
|
||||
await cursor.execute(query, params)
|
||||
result = await cursor.fetchone()
|
||||
|
||||
if result:
|
||||
logger.info(f"✅ Policy found: {voucher}")
|
||||
return dict(result)
|
||||
else:
|
||||
logger.warning(f"⚠️ Policy not found: {voucher}")
|
||||
return None
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error checking policy: {e}")
|
||||
return None
|
||||
|
||||
async def close(self):
|
||||
"""Закрыть пул подключений"""
|
||||
if self.pool:
|
||||
self.pool.close()
|
||||
await self.pool.wait_closed()
|
||||
logger.info("MySQL Policy DB pool closed")
|
||||
|
||||
|
||||
# Глобальный экземпляр
|
||||
policy_service = PolicyService()
|
||||
|
||||
@@ -65,6 +65,12 @@ class SMSService:
|
||||
logger.warning("SMS отправка отключена в конфигурации")
|
||||
return False
|
||||
|
||||
# DEBUG MODE: Не отправляем реальные SMS, экономим бюджет
|
||||
if settings.debug or settings.app_env == "development":
|
||||
logger.info(f"🔧 DEBUG MODE: SMS to {phone} not sent (saving money!)")
|
||||
logger.info(f"📱 Message would be: {message}")
|
||||
return True
|
||||
|
||||
try:
|
||||
# Получаем актуальный токен
|
||||
token = await self._get_token()
|
||||
|
||||
Reference in New Issue
Block a user