feat(turnstile): двухконтурный учет СКУД, реестры исключений с автокомплитом 1С и калибровка таймзон

This commit is contained in:
2026-09-10 15:36:32 +03:00
parent 6c9b131cf2
commit 74332aa38a
31 changed files with 4509 additions and 10769 deletions
+31 -12
View File
@@ -3,7 +3,7 @@
FILE: services/snapshots/service.py
PROJECT: SCUD Orion AI (Unified Architecture)
MODULE: services / snapshots
ROLE: Бизнес-логика срезов СКУД (выборка, валидация Y-срезов, удаление).
ROLE: Бизнес-логика срезов СКУД (выборка, отображение времени, удаление).
AI-CONTEXT-ANCHORS:
- ANCHOR[SNAPSHOT_GET_REGISTRY]: Выборка срезов с разметкой защищенных Y-снапшотов.
@@ -18,20 +18,39 @@ from core.repositories.scud_repo import get_available_snapshots, delete_snapshot
# ANCHOR[SNAPSHOT_GET_REGISTRY]
def get_snapshots_registry(date_str: Optional[str] = None) -> Dict[str, Any]:
"""Возвращает реестр снапшотов за дату или за все доступные дни."""
"""
Возвращает реестр снапшотов.
В поле snapshot_time объединяет время среза и фактическое время создания снапшота.
"""
clean_date = date_str.strip() if date_str else ""
rows = get_available_snapshots(date_str=clean_date if clean_date else None)
snapshots = [
{
"snapshot_id": r[0],
"log_date": r[1],
"snapshot_time": r[2],
"record_count": r[3],
"is_final": str(r[0]).startswith("Y")
}
for r in rows
]
snapshots = []
for r in rows:
snap_id = r[0]
log_date = r[1]
snap_time = r[2]
rec_count = r[3]
created_at = r[4] if len(r) > 4 else None
slice_time_str = snap_time.split()[1] if snap_time and " " in snap_time else snap_time
created_str = ""
if created_at and " " in str(created_at):
c_date, c_time = str(created_at).split()[:2]
c_parts = c_date.split("-")
c_date_fmt = f"{c_parts[2]}.{c_parts[1]}" if len(c_parts) == 3 else c_date
created_str = f" · создан {c_date_fmt} {c_time[:5]}"
display_label = f"Срез {slice_time_str}{created_str}"
snapshots.append({
"snapshot_id": snap_id,
"log_date": log_date,
"snapshot_time": display_label,
"record_count": rec_count,
"is_final": str(snap_id).startswith("Y") or "_FINAL" in str(snap_id)
})
return {
"query_date": clean_date or "все",