diff --git a/sd_dispatcher.py b/sd_dispatcher.py index 4e41863..f99de6b 100644 --- a/sd_dispatcher.py +++ b/sd_dispatcher.py @@ -170,8 +170,8 @@ def find_user_in_ad(requester, caller_phone=None, ticket_id=None): try: server = Server(AD_SERVER, get_info=ALL, connect_timeout=AD_CONNECT_TIMEOUT) conn = Connection(server, user=AD_USER, password=AD_PASSWORD, auto_bind=True, receive_timeout=AD_RECEIVE_TIMEOUT) - conn.search(search_base=AD_BASE, search_filter=ldap_filter, attributes=["l", "company", "manager"]) conn.search(search_base=AD_BASE, search_filter=ldap_filter, attributes=["l", "company", "manager", "department"]) + if not conn.entries: log_to_file(f" [AD] ❌ Объект ({search_by}) не найден in AD!", ticket_id) return None @@ -196,8 +196,8 @@ def find_user_in_ad(requester, caller_phone=None, ticket_id=None): manager_email = conn.entries[0].mail.value department = user.department.value if "department" in user and user.department.value else None - return {"city": city, "company": company, "ad_path": ad_path, "manager_email": manager_email, "source": f"AD ({search_by})"} return {"city": city, "company": company, "department": department, "ad_path": ad_path, "manager_email": manager_email, "source": f"AD ({search_by})"} + except Exception as e: log_to_file(f"❌ Ошибка LDAP или таймаут сети AD: {e}", ticket_id) return None @@ -555,9 +555,7 @@ def classify_ticket(text, ticket_id=None): if not result: return "Не определено", 0, [], True, [], {"pure_qdrant_choice": "Не определено", "q_variance": 0, "q_unique_groups": 0, "q_max_score": 0, "q_dominance": 0} - # ================================================================= # ЭТАП 1: РАСЧЕТ ВЫБОРА ЧИСТОГО QDRANT (ДО СЛУЖБЫ РЕРАНКИНГА) - # ================================================================= pure_scores = defaultdict(float) pure_counts = defaultdict(int) for p in result: @@ -573,9 +571,7 @@ def classify_ticket(text, ticket_id=None): qdrant_scores = [p.score for p in result] - # ================================================================= # ЭТАП 2: СЛУЖБА ПЕРЕРАНЖИРОВАНИЯ CROSS-ENCODER + БЛЕНДИНГ СКОРОВ - # ================================================================= documents = [p.payload.get("text", "Текст отсутствует").strip()[:RERANKER_MAX_DOC_CHARS] for p in result] rerank_payload = { @@ -905,6 +901,18 @@ def process_ticket_logic(req_id): t_log(" ⏭ Пропуск: пользователь в исключённом отделе.") continue + # Проверка: отдел пользователя в списке исключений + is_excluded = False + if user_department and APPROVAL_EXCLUDED_DEPARTMENTS: + for dept in APPROVAL_EXCLUDED_DEPARTMENTS: + if dept.lower() in user_department.lower() or user_department.lower() in dept.lower(): + is_excluded = True + t_log(f" ⚠️ Отдел '{user_department}' в списке исключений — автосогласование отменено") + break + if is_excluded: + t_log(" ⏭ Пропуск: пользователь в исключённом отделе.") + continue + if is_city_ok and (is_group_ok or is_cat_ok): if manager_email: t_log(f"✔ Условия совпали. Запуск процесса согласования для {manager_email}...")