This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user