from __future__ import annotations from .shared import * from ...services.sstc.entity_lookup import _ensure_project from ...services.sstc.signal_core import _parse_node_id, _parse_project_id router = APIRouter(tags=["sstc"]) @router.post("/projects/{project_id}/signals/{signal_id}/archive") async def archive_signal( project_id: str, signal_id: str, permission_user: User = Depends(require_project_member_or_manager), db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): _ = permission_user pid = _parse_project_id(project_id) sid = _parse_node_id(signal_id, "signal_id") svc = SSTCService(db, tenant_id=int(current_user.tenant_id)) await _ensure_project(svc, pid) result = await db.execute( select(Signal).where( and_(Signal.id == sid, Signal.tenant_id == int(current_user.tenant_id)) ) ) signal = result.scalar_one_or_none() if not signal: raise HTTPException(status_code=404, detail="Signal not found") before = {"processed": signal.processed} signal.processed = True signal.status = "已关闭" await log_operation( db, tenant_id=int(current_user.tenant_id), user_id=int(current_user.id), project_id=pid, entity_type="signal", entity_id=str(sid), action="archive", before_data=before, after_data={"processed": True}, ) await db.commit() return success_response({"id": str(signal.id), "status": "已关闭"})