customs-data / apps /api /routers /entity.py
3v324v23's picture
feat: 完成多国家海关数据源接入与核心功能全量迭代
8ca8917
Raw
History Blame Contribute Delete
2.68 kB
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}