feat: 异步沉淀主题摘要和成长档案

This commit is contained in:
2026-08-03 11:35:58 +08:00
parent a3946013f5
commit d2e08ab36c
24 changed files with 825 additions and 58 deletions

View File

@@ -349,6 +349,34 @@ def generate_user_report(
return api_success(periodic_report_dict(report), message="报告任务已进入后台队列")
@router.post("/user/{user_id}/topic/{topic_id}/settlement/retry")
def retry_topic_settlement(
user_id: int,
topic_id: int,
db: Session = Depends(get_db),
current_admin: Admin = Depends(get_current_admin),
) -> dict:
user = _get_user(db, user_id)
topic = db.scalar(
select(TopicSession).where(TopicSession.id == topic_id, TopicSession.user_id == user.id)
)
if topic is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="主题不存在")
if topic.status != "completed":
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="只能重试已结束主题的沉淀任务")
summary = GrowthProfileService.retry_topic_settlement(db, user=user, topic=topic)
OperationLogService.write(
db,
admin_id=current_admin.id,
module="topic_settlement",
action="retry",
target_id=summary.id,
)
db.commit()
db.refresh(summary)
return api_success(topic_summary_dict(summary), message="主题沉淀任务已重新进入队列")
@router.put("/user/{user_id}")
def update_user(
user_id: int,

View File

@@ -98,6 +98,15 @@ def finish_topic(
return api_success(GrowthProfileService.finish_active_topic(db, user=current_user, session=session))
@router.get("/topic/settlement/{summary_id}")
def topic_settlement(
summary_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
) -> dict:
return api_success(GrowthProfileService.topic_settlement_result(db, user=current_user, summary_id=summary_id))
@router.post("/session/{session_id}/help-card")
def generate_help_card(
session_id: int,

View File

@@ -48,6 +48,13 @@ def growth_profile(
"summary": item.summary,
"recommendedHomework": item.recommended_homework,
"nextObservation": item.next_observation,
"status": item.status,
"errorMessage": item.error_message,
"attemptCount": item.attempt_count,
"maxAttempts": item.max_attempts,
"nextRunAt": item.next_run_at,
"lastStartedAt": item.last_started_at,
"finishedAt": item.finished_at,
"generatedAt": item.generated_at,
}
for item in summaries