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
+6
View File
@@ -96,6 +96,12 @@ ALLOWED_USERS = [ # Список TrueConf ID разрешенны
] ]
# =========================================================
# 3.5. НАСТРОЙКИ SERVICE DESK: ГРУППА И ИСПОЛНИТЕЛЬ
# =========================================================
SD_GROUP_NAME = "Техподдержка ХК" # Название группы в ServiceDesk
SD_TECHNICIAN_NAME = "Кривоченко Денис Сергеевич" # ФИО техника в ServiceDesk
# ========================================================= # =========================================================
# 3. НАСТРОЙКИ СВЯЗИ С КОРПОРАТИВНЫМИ СИСТЕМАМИ # 3. НАСТРОЙКИ СВЯЗИ С КОРПОРАТИВНЫМИ СИСТЕМАМИ
# ========================================================= # =========================================================
+43 -1
View File
@@ -21,7 +21,7 @@ from utils.stats_logger import log_menu_stats
# Безопасный импорт конфигурации # Безопасный импорт конфигурации
try: 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: except ImportError:
import importlib.util import importlib.util
config_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "config", "config.py") 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 DEFAULT_REQUESTER = custom_config.DEFAULT_REQUESTER
SD_URL = custom_config.SD_URL SD_URL = custom_config.SD_URL
SD_TOKEN = custom_config.SD_TOKEN 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__) 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: async def _send_sd_api_request(requester_email: str, subject: str, description: str, city: str) -> str | None:
""" """
Автономная прямая отправка HTTP-запроса в Service Desk API v3. Автономная прямая отправка HTTP-запроса в Service Desk API v3.
Автоматически ищет ID группы и техника по именам из config.
""" """
# Если запрашивает системный ИИ или не указан email — ищем по ИМЕНИ # Если запрашивает системный ИИ или не указан email — ищем по ИМЕНИ
if requester_email == DEFAULT_REQUESTER or requester_email == "ai@sibcem.ru": 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: else:
requester_payload = {"email_id": requester_email} 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 = { payload = {
"request": { "request": {
"subject": subject, "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" url = f"{SD_URL.rstrip('/')}/api/v3/requests"
headers = {"TECHNICIAN_KEY": SD_TOKEN} headers = {"TECHNICIAN_KEY": SD_TOKEN}