перед внедрением веб интерфейса и API для взаимодействием с gemini.
This commit is contained in:
+15
-12
@@ -36,19 +36,19 @@ def ask_ollama(prompt, system_prompt=None):
|
||||
|
||||
def get_system_rules_context():
|
||||
"""
|
||||
Загружает глобальные системные правила компании прямо из Базы Данных SQLite.
|
||||
Загружает динамические системные правила компании напрямую из Базы Данных SQLite.
|
||||
"""
|
||||
rules = get_all_rules_from_db()
|
||||
if not rules:
|
||||
return ""
|
||||
rules_text = "\n".join([f"- {r}" for r in rules])
|
||||
return f"\nОБЯЗАТЕЛЬНЫЕ ГЛОБАЛЬНЫЕ ПРАВИЛА И ПРИОРИТЕТЫ КОМПАНИИ:\n{rules_text}\n"
|
||||
return f"\nОБЯЗАТЕЛЬНЫЕ ГЛОБАЛЬНЫЕ ПРАВИЛА И ПРИОРИТЕТЫ КОМПАНИИ (ИЗ SQLITE БД):\n{rules_text}\n"
|
||||
|
||||
|
||||
def analyze_scud_mass_failure_ai(df_scud):
|
||||
"""
|
||||
Оценивает процент аномалий 'ANOMALY_NO_IN_HAS_ACTIVITY' в выгрузке.
|
||||
Если процент аномалий превышает 5% от смены, вызывает ИИ для генерации критического алерта.
|
||||
Если процент аномалий превышает 5% от смены или 10 человек, вызывает ИИ для генерации критического алерта.
|
||||
"""
|
||||
if df_scud is None or df_scud.empty:
|
||||
return None
|
||||
@@ -66,9 +66,9 @@ def analyze_scud_mass_failure_ai(df_scud):
|
||||
rules_context = get_system_rules_context()
|
||||
prompt = f"""
|
||||
{rules_context}
|
||||
ВНИМАНИЕ! Проведён анализ дневной смены СКУД:
|
||||
ВНИМАНИЕ! Проведён анализ смены СКУД:
|
||||
- Всего записей за смену: {total_records}
|
||||
- Выявлено сотрудников без утреннего входа, но с зафиксированной дневной активностью (первая активность): {anomaly_count} ({anomaly_percent}% от смены)
|
||||
- Выявлено сотрудников без утреннего входа, но с зафиксированной дневной активностью: {anomaly_count} ({anomaly_percent}% от смены)
|
||||
|
||||
Сформируй понятное предупреждение для Администратора СКУД и Руководителя.
|
||||
Объясни, что это критический массовый сбой турникетов/контроллеров входа на КПП, и порекомендуй действия.
|
||||
@@ -90,13 +90,16 @@ def analyze_scud_mass_failure_ai(df_scud):
|
||||
|
||||
|
||||
def ai_verify_scud_against_staff(unrecognized_scud_fios, staff_fios):
|
||||
"""
|
||||
ИИ-сверка опечаток и несовпадений ФИО между СКУД и 1С:ЗУП.
|
||||
Записи из 1С считаются 100% эталоном.
|
||||
"""
|
||||
if not unrecognized_scud_fios or not staff_fios:
|
||||
return {}
|
||||
|
||||
# 🛡 Исключаем точные совпадения (чтобы ИИ не совершал ложных замен)
|
||||
staff_fios_set = set(staff_fios)
|
||||
real_unrecognized = [f for f in unrecognized_scud_fios if f not in staff_fios_set]
|
||||
|
||||
if not real_unrecognized:
|
||||
return {}
|
||||
|
||||
rules_context = get_system_rules_context()
|
||||
|
||||
prompt = f"""
|
||||
@@ -110,7 +113,7 @@ def ai_verify_scud_against_staff(unrecognized_scud_fios, staff_fios):
|
||||
2. В СКУД допущена опечатка.
|
||||
3. Любое присутствие сотрудника по СКУД при наличии в 1С документа отсутствия (кроме командировок) является гарантированной аномалией.
|
||||
4. В поле "warning" опиши обнаруженную опечатку.
|
||||
5. Запрещено выдумывать опечатки!
|
||||
5. Запрещено выдумывать опечатки и объединять разных людей/однофамильцев!
|
||||
|
||||
ОТВЕЧАЙ ТОЛЬКО ИСКЛЮЧИТЕЛЬНО В ФОРМАТЕ JSON!
|
||||
|
||||
@@ -148,10 +151,10 @@ def ai_verify_scud_against_staff(unrecognized_scud_fios, staff_fios):
|
||||
|
||||
return mapping
|
||||
|
||||
|
||||
def ai_verify_department_exceptions(unexplained_df, exception_departments):
|
||||
"""
|
||||
Локальный ИИ проверит, не являются ли оставшиеся неотмеченными отделы
|
||||
синонимами/аббревиатурами отделов из exceptions.json.
|
||||
Локальный ИИ проверяет, не являются ли неотмеченные отделы синонимами отделов-исключений.
|
||||
"""
|
||||
if unexplained_df.empty or not exception_departments:
|
||||
return []
|
||||
|
||||
Reference in New Issue
Block a user