feat(etl): stable pipeline, exception registry in SQLite, multi-pass aggregation and db_cli
This commit is contained in:
@@ -8,11 +8,11 @@ DATA_DIR = os.path.join(BASE_DIR, "data")
|
||||
SCUD_DIR = os.path.join(DATA_DIR, "scud")
|
||||
ZUP_1C_DIR = os.path.join(DATA_DIR, "1c")
|
||||
OUTPUT_DIR = os.path.join(BASE_DIR, "output")
|
||||
REPORTS_DIR = os.path.join(OUTPUT_DIR, "reports")
|
||||
|
||||
# Путь к намонтированной сетевой шаре 1С в Linux (вместо \\storage\SCUD\Обмен\Штат)
|
||||
SHARE_1C_DIR = "/mnt/scud_share"
|
||||
|
||||
for folder in [DATA_DIR, SCUD_DIR, ZUP_1C_DIR, OUTPUT_DIR]:
|
||||
for folder in [DATA_DIR, SCUD_DIR, ZUP_1C_DIR, OUTPUT_DIR, REPORTS_DIR]:
|
||||
os.makedirs(folder, exist_ok=True)
|
||||
|
||||
NOW = datetime.now()
|
||||
@@ -23,32 +23,30 @@ if NOW.weekday() == 0:
|
||||
else:
|
||||
DATE_YESTERDAY = (NOW - timedelta(days=1)).strftime("%d.%m.%Y")
|
||||
|
||||
# --- Настройки LLM / Ollama ---
|
||||
OLLAMA_URL = "http://192.168.11.3:11434/api/generate"
|
||||
OLLAMA_MODEL = "qwen2.5:14b"
|
||||
OLLAMA_URL = "http://10.121.17.227:11434/api/generate"
|
||||
OLLAMA_MODEL = "qwen2.5:14b-instruct-q8_0"
|
||||
MODEL_NAME = OLLAMA_MODEL
|
||||
|
||||
KNOWLEDGE_BASE_PATH = os.path.join(DATA_DIR, "knowledge_base.json")
|
||||
EXCEPTIONS_PATH = os.path.join(BASE_DIR, "exceptions.json")
|
||||
|
||||
# --- Настройки подключения к MS SQL Server (1С:ЗУП 3.1) ---
|
||||
ZUP_SQL_CONFIG = {
|
||||
"driver": "{ODBC Driver 18 for SQL Server}", # или "{ODBC Driver 17 for SQL Server}"
|
||||
"driver": "{ODBC Driver 18 for SQL Server}",
|
||||
"server": os.getenv("ZUP_SQL_SERVER", "ACCOUNT-01"),
|
||||
"database": os.getenv("ZUP_SQL_DB", "ZUP30"), # Замените на точное имя базы ЗУП на ACCOUNT-01
|
||||
"user": os.getenv("ZUP_SQL_USER", "scud_reader"), # Логин SQL Server
|
||||
"password": os.getenv("ZUP_SQL_PASS", "Rhfcysq90"), # Пароль SQL Server
|
||||
"trust_server_certificate": "yes", # Доверять сертификату сервера
|
||||
"encrypt": "no" # "yes", если на MS SQL включено обязательное SSL-шифрование
|
||||
"database": os.getenv("ZUP_SQL_DB", "ZUP30"),
|
||||
"user": os.getenv("ZUP_SQL_USER", "scud_reader"),
|
||||
"password": os.getenv("ZUP_SQL_PASS", "Rhfcysq90"),
|
||||
"trust_server_certificate": "yes",
|
||||
"encrypt": "no"
|
||||
}
|
||||
|
||||
|
||||
def find_dated_file(prefix, date_str, search_dirs=[ZUP_1C_DIR, SCUD_DIR, DATA_DIR, "."]):
|
||||
"""
|
||||
Ищет файлы по префиксу и дате (поддерживает и 30.07.2026, и 30_07_2026).
|
||||
"""
|
||||
date_dots = date_str
|
||||
date_underscores = date_str.replace('.', '_')
|
||||
def find_dated_file(prefix, date_str, search_dirs=None):
|
||||
if search_dirs is None:
|
||||
search_dirs = [ZUP_1C_DIR, SCUD_DIR, DATA_DIR, "."]
|
||||
|
||||
date_dots = str(date_str).replace('_', '.')
|
||||
date_underscores = date_dots.replace('.', '_')
|
||||
|
||||
for d in search_dirs:
|
||||
if not os.path.exists(d):
|
||||
@@ -75,6 +73,18 @@ def clean_scud_fio_light(fio_str):
|
||||
|
||||
|
||||
def load_exceptions():
|
||||
"""
|
||||
Приоритетно читает исключения и белый список из SQLite таблицы exceptions_registry.
|
||||
При отсутствии таблицы или пустой базе выполняет fallback на exceptions.json.
|
||||
"""
|
||||
try:
|
||||
from services.exceptions_repo import get_all_exceptions_from_db
|
||||
db_exc = get_all_exceptions_from_db()
|
||||
if any(db_exc.values()):
|
||||
return db_exc
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
import json
|
||||
if os.path.exists(EXCEPTIONS_PATH):
|
||||
try:
|
||||
@@ -82,4 +92,4 @@ def load_exceptions():
|
||||
return json.load(f)
|
||||
except Exception:
|
||||
pass
|
||||
return {"fio": [], "departments": [], "positions": [], "position_keywords": []}
|
||||
return {"fio": [], "departments": [], "positions": [], "position_keywords": [], "include_fio": []}
|
||||
Reference in New Issue
Block a user