新增风险监控接口并补齐案例结果字段

This commit is contained in:
kx_guo 2026-09-08 18:27:27 +08:00
parent 680b0c20cf
commit 4562aa6bdc
4 changed files with 34 additions and 1 deletions

View File

@ -7,6 +7,7 @@ from app.api.v1.conversations import router as conversations_router
from app.api.v1.dashboard import router as dashboard_router
from app.api.v1.health import router as health_router
from app.api.v1.model_config import router as model_config_router
from app.api.v1.monitoring import router as monitoring_router
from app.api.v1.ocr import router as ocr_router
from app.api.v1.reports import router as reports_router
from app.api.v1.risk_items import router as risk_items_router
@ -17,6 +18,7 @@ from app.api.v1.suppliers import router as suppliers_router
api_router = APIRouter(prefix="/api/v1")
api_router.include_router(health_router)
api_router.include_router(model_config_router)
api_router.include_router(monitoring_router)
api_router.include_router(ocr_router)
api_router.include_router(auth_router)
api_router.include_router(conversations_router)

28
app/api/v1/monitoring.py Normal file
View File

@ -0,0 +1,28 @@
from typing import Annotated
from fastapi import APIRouter, Depends
from app.api.dependencies import DatabaseSession, require_permission
from app.models.entities import OperationAudit, UserAccount
from app.schemas.common import ApiResponse
router = APIRouter(prefix="/monitoring", tags=["monitoring"])
@router.post("/risk")
async def monitor_risk(
payload: dict,
session: DatabaseSession,
current_user: Annotated[UserAccount, Depends(require_permission("risk.assess", operate=True))],
) -> ApiResponse[dict]:
session.add(
OperationAudit(
actor_user_id=current_user.id,
actor_emp_no=current_user.emp_no,
action="risk.monitor.add",
resource_type="risk_assessment",
resource_id=str(payload.get("subject_id") or ""),
audit_metadata=payload,
)
)
return ApiResponse(data={"monitored": True, "subject_id": payload.get("subject_id")})

View File

@ -79,6 +79,7 @@ class SimilarCase(ApiSchema):
description: str | None = None
root_cause: str | None = None
defect_level: str | None = None
result: str | None = None
problem: str | None = None
solution: str | None = None
similarity: float | None = None

View File

@ -123,6 +123,7 @@ class AnomalyCaseRAG:
AnomalyCase.solution,
AnomalyCase.root_cause,
AnomalyCase.defect_level,
AnomalyCase.result,
)
vector_ready = await self._vector_column_ready()
has_vectors = await self._has_stored_vectors() if vector_ready else False
@ -135,7 +136,7 @@ class AnomalyCaseRAG:
"""
SELECT id, date, product_name, product_category, material_type, supplier,
factory, stage_new, anomaly_type, description, solution, root_cause,
defect_level, 1 - (embedding_vector <=> CAST(:embedding AS halfvec)) AS vector_score
defect_level, result, 1 - (embedding_vector <=> CAST(:embedding AS halfvec)) AS vector_score
FROM anomaly_cases
WHERE embedding_vector IS NOT NULL
ORDER BY embedding_vector <=> CAST(:embedding AS halfvec)
@ -306,6 +307,7 @@ class AnomalyCaseRAG:
description=row.get("description"),
root_cause=row.get("root_cause"),
defect_level=row.get("defect_level"),
result=row.get("result"),
problem=(row.get("anomaly_type") or row.get("description") or "历史异常未填写"),
solution=(row.get("solution") or row.get("root_cause") or "请查看原始案例记录"),
)