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" @router.get("/review-pool", response_model=List[ReviewTaskResponse]) 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 ] @router.post("/review-decision") 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}