Spaces:
Runtime error
Runtime error
| from fastapi import APIRouter, Depends, HTTPException | |
| from sqlalchemy.ext.asyncio import AsyncSession | |
| from sqlalchemy.future import select | |
| from sqlalchemy import update | |
| from pydantic import BaseModel | |
| from typing import List | |
| from packages.core.database import get_db | |
| from packages.core.models import EntityReviewPool, EntityMapping | |
| router = APIRouter(prefix="/entities", tags=["Entities"]) | |
| class ReviewTaskResponse(BaseModel): | |
| id: str | |
| source_name: str | |
| target_name: str | |
| target_entity_id: str | |
| similarity_score: float | |
| status: str | |
| class ReviewDecisionRequest(BaseModel): | |
| task_id: str | |
| decision: str # "APPROVED" or "REJECTED" | |
| async def get_review_pool(status: str = "PENDING", db: AsyncSession = Depends(get_db)): | |
| """ | |
| 获取待人工确认的企业实体合并任务。 | |
| """ | |
| stmt = select(EntityReviewPool).where(EntityReviewPool.status == status).limit(50) | |
| result = await db.execute(stmt) | |
| tasks = result.scalars().all() | |
| return [ | |
| ReviewTaskResponse( | |
| id=t.id, | |
| source_name=t.source_name, | |
| target_name=t.target_name, | |
| target_entity_id=t.target_entity_id, | |
| similarity_score=t.similarity_score, | |
| status=t.status | |
| ) for t in tasks | |
| ] | |
| async def make_review_decision(req: ReviewDecisionRequest, db: AsyncSession = Depends(get_db)): | |
| """ | |
| 提交运营审核决定。 | |
| 如果 APPROVED,则将 source_name 映射到 target_entity_id,并更新 review_pool 状态。 | |
| 如果 REJECTED,仅更新 review_pool 状态。 | |
| """ | |
| stmt = select(EntityReviewPool).where(EntityReviewPool.id == req.task_id) | |
| result = await db.execute(stmt) | |
| task = result.scalar_one_or_none() | |
| if not task: | |
| raise HTTPException(status_code=404, detail="Review task not found") | |
| if req.decision not in ["APPROVED", "REJECTED"]: | |
| raise HTTPException(status_code=400, detail="Invalid decision") | |
| task.status = req.decision | |
| if req.decision == "APPROVED": | |
| # 更新 mapping 表,将 source_name 的 standard_entity_id 指向 target_entity_id | |
| # 并将 is_manual 设为 1 | |
| upd_stmt = update(EntityMapping).where( | |
| EntityMapping.original_name == task.source_name | |
| ).values( | |
| standard_entity_id=task.target_entity_id, | |
| standard_name=task.target_name, | |
| is_manual=1 | |
| ) | |
| await db.execute(upd_stmt) | |
| await db.commit() | |
| return {"status": "success", "task_id": req.task_id, "decision": req.decision} | |