Add SD group/technician config and auto-assign tickets to Техподдержка ХК / Кривоченко

This commit is contained in:
Денис Кривоченко
2026-07-26 16:39:18 +07:00
parent 3c160afe20
commit 866654a132
2 changed files with 49 additions and 1 deletions
+43 -1
View File
@@ -21,7 +21,7 @@ from utils.stats_logger import log_menu_stats
# Безопасный импорт конфигурации
try:
from config.config import DEFAULT_REQUESTER, SD_URL, SD_TOKEN
from config.config import DEFAULT_REQUESTER, SD_URL, SD_TOKEN, SD_GROUP_NAME, SD_TECHNICIAN_NAME
except ImportError:
import importlib.util
config_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "config", "config.py")
@@ -31,6 +31,8 @@ except ImportError:
DEFAULT_REQUESTER = custom_config.DEFAULT_REQUESTER
SD_URL = custom_config.SD_URL
SD_TOKEN = custom_config.SD_TOKEN
SD_GROUP_NAME = custom_config.SD_GROUP_NAME
SD_TECHNICIAN_NAME = custom_config.SD_TECHNICIAN_NAME
logger = logging.getLogger(__name__)
@@ -100,6 +102,7 @@ def get_ad_user_info(user_id: str) -> dict | None:
async def _send_sd_api_request(requester_email: str, subject: str, description: str, city: str) -> str | None:
"""
Автономная прямая отправка HTTP-запроса в Service Desk API v3.
Автоматически ищет ID группы и техника по именам из config.
"""
# Если запрашивает системный ИИ или не указан email — ищем по ИМЕНИ
if requester_email == DEFAULT_REQUESTER or requester_email == "ai@sibcem.ru":
@@ -107,6 +110,40 @@ async def _send_sd_api_request(requester_email: str, subject: str, description:
else:
requester_payload = {"email_id": requester_email}
# Ищем ID группы
group_id = None
try:
url_groups = f"{SD_URL.rstrip('/')}/api/v3/groups"
headers = {"TECHNICIAN_KEY": SD_TOKEN}
async with httpx.AsyncClient(verify=False) as client:
resp = await client.get(url_groups, headers=headers, timeout=10.0)
if resp.status_code == 200:
groups = resp.json().get("groups", [])
for g in groups:
if g.get("name") == SD_GROUP_NAME:
group_id = g.get("id")
logger.info(f"SD group found: name={SD_GROUP_NAME}, id={group_id}")
break
except Exception as e:
logger.warning(f"Failed to fetch SD groups: {e}")
# Ищем ID техника
tech_id = None
try:
url_techs = f"{SD_URL.rstrip('/')}/api/v3/technicians"
headers = {"TECHNICIAN_KEY": SD_TOKEN}
async with httpx.AsyncClient(verify=False) as client:
resp = await client.get(url_techs, headers=headers, timeout=10.0)
if resp.status_code == 200:
techs = resp.json().get("technicians", [])
for t in techs:
if t.get("display_name") == SD_TECHNICIAN_NAME:
tech_id = t.get("id")
logger.info(f"SD technician found: name={SD_TECHNICIAN_NAME}, id={tech_id}")
break
except Exception as e:
logger.warning(f"Failed to fetch SD technicians: {e}")
payload = {
"request": {
"subject": subject,
@@ -117,6 +154,11 @@ async def _send_sd_api_request(requester_email: str, subject: str, description:
}
}
}
# Добавляем группу и исполнителя если найдены
if group_id:
payload["request"]["group"] = {"id": group_id}
if tech_id:
payload["request"]["assigned_to"] = {"id": tech_id}
url = f"{SD_URL.rstrip('/')}/api/v3/requests"
headers = {"TECHNICIAN_KEY": SD_TOKEN}