feat: AI Worker 平台 MVP v1.0.0 - 多租户/项目管理/AI Worker/任务编排/HITL审核/成本治理

This commit is contained in:
2026-08-12 13:31:03 +08:00
parent 05a97f30be
commit 8ba4a6c43e
+92
View File
@@ -0,0 +1,92 @@
"""Review service: HITL approval/rejection flow."""
from sqlalchemy.orm import Session
from typing import List, Optional
from datetime import datetime
from app.models.review import Review
from app.models.task import Task
from app.schemas.review import ReviewCreate, ReviewDecision
class ReviewService:
@staticmethod
def list_reviews(
db: Session,
tenant_id: int,
status: Optional[str] = None,
project_id: Optional[int] = None,
skip: int = 0,
limit: int = 100,
) -> List[Review]:
q = db.query(Review).filter(Review.tenant_id == tenant_id)
if status:
q = q.filter(Review.status == status)
if project_id:
q = q.filter(Review.project_id == project_id)
return q.order_by(Review.created_at.desc()).offset(skip).limit(limit).all()
@staticmethod
def get_review(db: Session, tenant_id: int, review_id: int) -> Optional[Review]:
return (
db.query(Review)
.filter(Review.id == review_id, Review.tenant_id == tenant_id)
.first()
)
@staticmethod
def create_review(
db: Session, tenant_id: int, req: ReviewCreate
) -> Review:
review = Review(
tenant_id=tenant_id,
task_id=req.task_id,
project_id=req.project_id,
review_type=req.review_type,
status="pending",
review_content=req.review_content,
auto_check_result=req.auto_check_result,
submitted_at=datetime.utcnow(),
)
db.add(review)
db.commit()
db.refresh(review)
return review
@staticmethod
def make_decision(
db: Session,
tenant_id: int,
review_id: int,
reviewer_id: int,
reviewer_role: str,
req: ReviewDecision,
) -> Review:
review = ReviewService.get_review(db, tenant_id, review_id)
if not review:
raise ValueError(f"Review #{review_id} not found")
if review.status != "pending":
raise ValueError(f"Review already {review.status}")
review.status = req.status
review.reviewer_id = reviewer_id
review.reviewer_role = reviewer_role
review.reviewer_comment = req.comment
review.reviewed_at = datetime.utcnow()
# Update task status
task = (
db.query(Task)
.filter(Task.id == review.task_id, Task.tenant_id == tenant_id)
.first()
)
if task:
if req.status == "approved":
task.status = "done"
task.completed_at = datetime.utcnow()
task.review_status = "approved"
else:
task.status = "rejected"
task.review_status = "rejected"
db.commit()
db.refresh(review)
return review