add 竞赛打榜都按阶段保存所有打分记录

This commit is contained in:
xxq250 2025-07-31 15:32:10 +08:00
parent 40fd6a2bc1
commit 554f88525e
3 changed files with 26 additions and 32 deletions

View File

@ -410,8 +410,7 @@ class CompetitionInfosController < ApplicationController
stage = competition_user.ext5
# 作品驳回时得分清0
if old_status.to_i == 3 && params[:status].to_i ==2
stage_score = competition_user.competition_user_scores.find_by(stage: stage.to_i)
stage_score.update_attributes!(score: 0, last_score: 0) if stage_score.present?
competition_user.competition_user_scores.where(stage: stage.to_i).update_all(score: 0, last_score: 0)
competition_user.update_attributes!(score: 0)
cache_key = "limit_forbid_control:#{@competition_info.identifier}:competition_api_score:#{competition_user.id}-#{stage}"
Rails.cache.delete(cache_key)
@ -547,6 +546,8 @@ class CompetitionInfosController < ApplicationController
else
Rails.cache.write(cache_key, count_control.to_i + 1, expires_in: 5.minutes)
end
elsif @competition_info.identifier.to_s == "zstp2025"
return normal_status(-1, "打分已达上限5次") if competition_user.competition_user_scores.count >= 5
else
api_score_control = LimitForbidControl::CompetitionApiScore.new(competition_user.id)
return normal_status(-1, "今日打分已达上限,请明日再试") if api_score_control.forbid?
@ -626,7 +627,7 @@ class CompetitionInfosController < ApplicationController
@stage = 1
end
if @stage.present?
competition_users = @competition_info.competition_users.joins(:competition_user_scores)
competition_users = @competition_info.competition_users.select("distinct competition_users.*").joins(:competition_user_scores)
.where("competition_users.status = 3")
.where("competition_user_scores.stage = ? ", @stage.to_i)
.where("competition_user_scores.score > 0")

View File

@ -1,13 +1,12 @@
class CompetitionAutoScoreNewJob < ApplicationJob
queue_as :default
def perform(competition_user_id, api_url, filePath, stage=nil)
def perform(competition_user_id, api_url, filePath, stage = 1)
competition_user = CompetitionUser.find competition_user_id
if stage.present?
stage_score = competition_user.competition_user_scores.find_or_initialize_by(stage: stage.to_i)
stage_score.api_status = 1
stage_score.save
end
stage_score = competition_user.competition_user_scores.new(stage: stage.to_i)
stage_score.api_status = 1
stage_score.save
# 开始打分
domain = EduSetting.get("auto_score_api_url") || "http://114.116.228.69:8888"
url = api_url || "/script/eye"
params = { "filePath" => "#{filePath}", "userId" => competition_user.user_id }
@ -42,24 +41,18 @@ class CompetitionAutoScoreNewJob < ApplicationJob
# 取最高分
competition_user.score = score if score.to_f > competition_user.score.to_f
# data["repeatTripleSet"] if data["repeatTripleSet"].present?
if stage.present?
stage_score = competition_user.competition_user_scores.find_or_initialize_by(stage: stage.to_i)
stage_score.score = score if score.to_f > stage_score.score.to_f
stage_score.created_at = Time.now
stage_score.last_score = score
stage_score.api_status = status
stage_score.api_result = data.to_json
stage_score.save
end
stage_score.score = score
stage_score.created_at = Time.now
stage_score.last_score = 0.to_f
stage_score.api_status = status
stage_score.api_result = data.to_json
stage_score.save
else
if stage.present?
stage_score = competition_user.competition_user_scores.find_or_initialize_by(stage: stage.to_i)
stage_score.created_at = Time.now
stage_score.last_score = 0.to_f
stage_score.api_status = status
stage_score.api_result = data.to_json
stage_score.save
end
stage_score.created_at = Time.now
stage_score.last_score = 0.to_f
stage_score.api_status = status
stage_score.api_result = data.to_json
stage_score.save
end
competition_user.api_status = status
competition_user.api_result = data.to_json

View File

@ -109,18 +109,18 @@ class CompetitionUser < ApplicationRecord
end
def stage_score(stage)
competition_user_score = self.competition_user_scores.find_by(stage: stage.to_i)
competition_user_score.blank? ? 0 : competition_user_score.score.to_f
competition_user_scores = self.competition_user_scores.where(stage: stage.to_i).order(score: :desc)
competition_user_scores.blank? ? 0 : competition_user_scores.first.score.to_f
end
def stage_last_score(stage)
competition_user_score = self.competition_user_scores.find_by(stage: stage.to_i)
competition_user_score.blank? ? 0 : competition_user_score.last_score.to_f
competition_user_scores = self.competition_user_scores.where(stage: stage.to_i).order(created_at: :desc)
competition_user_scores.blank? ? 0 : competition_user_scores.first.score.to_f
end
def stage_api_status(stage)
competition_user_score = self.competition_user_scores.find_by(stage: stage.to_i)
competition_user_score.blank? ? 0 : competition_user_score.api_status
competition_user_scores = self.competition_user_scores.where(stage: stage.to_i).order(created_at: :desc)
competition_user_scores.blank? ? 0 : competition_user_scores.first.api_status
end
def stage_api_result_text(stage)