klg-asutk-app/backend/app/api/routes/global_search.py

54 lines
3.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Глобальный поиск по всем сущностям АСУ ТК.
Ищет по: ВС, компонентам, директивам, бюллетеням, нарядам, дефектам, персоналу.
"""
import logging
from fastapi import APIRouter, Depends, Query
from app.api.deps import get_current_user
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/search", tags=["search"])
@router.get("/global")
def global_search(q: str = Query(..., min_length=2), user=Depends(get_current_user)):
"""Поиск по всем модулям системы."""
q_lower = q.lower()
results = []
# Search in directives
from app.api.routes.airworthiness_core import _directives, _bulletins, _life_limits, _components
for d in _directives.values():
if q_lower in d.get("number", "").lower() or q_lower in d.get("title", "").lower():
results.append({"type": "directive", "id": d["id"], "title": f"ДЛГ {d['number']}", "subtitle": d.get("title", ""), "url": "/airworthiness-core"})
# Bulletins
for b in _bulletins.values():
if q_lower in b.get("number", "").lower() or q_lower in b.get("title", "").lower():
results.append({"type": "bulletin", "id": b["id"], "title": f"SB {b['number']}", "subtitle": b.get("title", ""), "url": "/airworthiness-core"})
# Components
for c in _components.values():
if q_lower in c.get("name", "").lower() or q_lower in c.get("part_number", "").lower() or q_lower in c.get("serial_number", "").lower():
results.append({"type": "component", "id": c["id"], "title": f"{c['name']} P/N {c['part_number']}", "subtitle": f"S/N {c['serial_number']}", "url": "/airworthiness-core"})
# Work orders
from app.api.routes.work_orders import _work_orders
for w in _work_orders.values():
if q_lower in w.get("wo_number", "").lower() or q_lower in w.get("title", "").lower() or q_lower in w.get("aircraft_reg", "").lower():
results.append({"type": "work_order", "id": w["id"], "title": f"WO {w['wo_number']}", "subtitle": w.get("title", ""), "url": "/maintenance"})
# Defects
from app.api.routes.defects import _defects
for d in _defects.values():
if q_lower in d.get("aircraft_reg", "").lower() or q_lower in d.get("description", "").lower():
results.append({"type": "defect", "id": d["id"], "title": f"Дефект {d['aircraft_reg']}", "subtitle": d.get("description", "")[:80], "url": "/defects"})
# Personnel
from app.api.routes.personnel_plg import _specialists
for s in _specialists.values():
if q_lower in s.get("full_name", "").lower() or q_lower in s.get("personnel_number", "").lower() or q_lower in s.get("license_number", "").lower():
results.append({"type": "specialist", "id": s["id"], "title": s["full_name"], "subtitle": f"Кат. {s['category']} · {s.get('license_number', '')}", "url": "/personnel-plg"})
return {"query": q, "total": len(results), "results": results[:50]}