算法
All checks were successful
Deploy to Server / deploy (push) Successful in 16s

This commit is contained in:
jeremygan2021
2026-03-20 13:20:09 +08:00
parent 98db4d6f75
commit 0d7ba5d87c
3 changed files with 169 additions and 2 deletions

View File

@@ -18,7 +18,7 @@ import uuid
from .models import Competition, CompetitionEnrollment, Project, Score, ScoreDimension, Comment, ProjectFile
from shop.models import WeChatUser
from shop.sms_utils import send_sms
from ai_services.models import TranscriptionTask
from ai_services.models import TranscriptionTask, AIEvaluation
from ai_services.services import AliyunTingwuService
logger = logging.getLogger(__name__)
@@ -332,6 +332,81 @@ def project_detail_api(request, project_id):
latest_task_any = TranscriptionTask.objects.filter(project=project).order_by('-created_at').first()
audio_url = latest_task_any.file_url if latest_task_any else None
# 计算各类评分(仅对评委和嘉宾可见)
judge_score_avg = None
peer_score_avg = None
ai_score_avg = None
final_score = float(project.final_score) if project.final_score else 0
if role in ['judge', 'guest']:
# 评委评分:所有评委的平均分(不包括选手互评维度)
judge_dimensions = ScoreDimension.objects.filter(
competition=project.competition,
is_public=True,
is_peer_review=False
)
judge_enrollments = CompetitionEnrollment.objects.filter(
competition=project.competition,
role='judge'
)
if judge_dimensions.exists() and judge_enrollments.exists():
judge_total = 0
judge_count = 0
for judge_enrollment in judge_enrollments:
judge_project_scores = Score.objects.filter(
project=project,
judge=judge_enrollment,
dimension__in=judge_dimensions
)
if judge_project_scores.exists():
judge_score = sum(
float(s.score) * float(s.dimension.weight)
for s in judge_project_scores
)
judge_total += judge_score
judge_count += 1
if judge_count > 0:
judge_score_avg = round(judge_total / judge_count, 2)
# 选手互评分:所有选手的平均分(仅互评维度)
peer_dimensions = ScoreDimension.objects.filter(
competition=project.competition,
is_peer_review=True
)
peer_enrollments = CompetitionEnrollment.objects.filter(
competition=project.competition,
role='contestant'
)
if peer_dimensions.exists() and peer_enrollments.exists():
peer_total = 0
peer_count = 0
for peer_enrollment in peer_enrollments:
peer_project_scores = Score.objects.filter(
project=project,
judge=peer_enrollment,
dimension__in=peer_dimensions
)
if peer_project_scores.exists():
peer_score = sum(
float(s.score) * float(s.dimension.weight)
for s in peer_project_scores
)
peer_total += peer_score
peer_count += 1
if peer_count > 0:
peer_score_avg = round(peer_total / peer_count, 2)
# AI评分来自AIEvaluation的平均分
ai_evaluations = AIEvaluation.objects.filter(
task__project=project,
task__status='COMPLETED'
)
ai_scores = [e.score for e in ai_evaluations if e.score is not None]
if ai_scores:
ai_score_avg = round(sum(ai_scores) / len(ai_scores), 2)
data = {
'id': project.id,
'title': project.title,
@@ -342,7 +417,14 @@ def project_detail_api(request, project_id):
'current_comment': current_comment,
'ai_result': ai_data,
'audio_url': audio_url,
'can_grade': role == 'judge' or (role == 'contestant' and project.contestant.user != user) # Contestant can grade others if allowed
'can_grade': role == 'judge' or (role == 'contestant' and project.contestant.user != user),
# 评分细项(仅评委和嘉宾可见)
'score_details': {
'judge_score': judge_score_avg,
'peer_score': peer_score_avg,
'ai_score': ai_score_avg,
'final_score': final_score
} if role in ['judge', 'guest'] else None
}
# Specifically for guest: can_grade is False