diff --git a/app/controllers/exercise_answers_controller.rb b/app/controllers/exercise_answers_controller.rb index b1e23071b..4b94676e5 100644 --- a/app/controllers/exercise_answers_controller.rb +++ b/app/controllers/exercise_answers_controller.rb @@ -107,7 +107,7 @@ class ExerciseAnswersController < ApplicationController normal_status(-1,"已提交/已结束的试卷不允许修改!") else if (@exercise_user_status == Exercise::DEADLINE && @exercise_user.commit_status == 0) || (@exercise.time > 0 && @exercise_user.start_at.present? && ((@exercise_user.start_at + @exercise.time.to_i.minutes) < Time.now)) - objective_score = calculate_student_score(@exercise,current_user)[:total_score] + objective_score = calculate_student_score(@exercise,current_user,Time.now)[:total_score] subjective_score = @exercise_user.subjective_score < 0.0 ? 0.0 : @exercise_user.subjective_score total_score = objective_score + subjective_score commit_option = { diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index 3b4d65a1f..97e0593d8 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -886,7 +886,7 @@ class ExercisesController < ApplicationController ex_user_ids = exercise_users.pluck(:id) - EndExerciseCalculateJob.perform_later(ex_user_ids,exercise) + EndExerciseCalculateJob.perform_later(ex_user_ids,exercise,Time.now) # exercise_users.each do |user| # if user.commit_status == 0 && user.start_at.present? # objective_score = calculate_student_score(exercise,user.user)[:total_score] @@ -1141,7 +1141,7 @@ class ExercisesController < ApplicationController can_commit_exercise = true end if can_commit_exercise - objective_score = calculate_student_score(@exercise,current_user)[:total_score] + objective_score = calculate_student_score(@exercise,current_user,Time.now)[:total_score] subjective_score = @answer_committed_user.subjective_score total_score_subjective_score = subjective_score < 0.0 ? 0.0 : subjective_score total_score = objective_score + total_score_subjective_score diff --git a/app/helpers/exercises_helper.rb b/app/helpers/exercises_helper.rb index 41d2a748e..44c341d6e 100644 --- a/app/helpers/exercises_helper.rb +++ b/app/helpers/exercises_helper.rb @@ -412,12 +412,13 @@ module ExercisesHelper end #计算试卷的总分和试卷的答题状态 - def calculate_student_score(exercise,user) + def calculate_student_score(exercise,user,end_time) score1 = 0.0 #选择题/判断题 score2 = 0.0 #填空题 score5 = 0.0 #实训题 ques_stand = [] #问题是否正确 - exercise_questions = exercise.exercise_questions.includes(:exercise_answers,:exercise_shixun_answers,:exercise_standard_answers,:exercise_shixun_challenges) + exercise_end_time = end_time || Time.now + exercise_questions = exercise.exercise_questions.includes(:exercise_standard_answers,:exercise_shixun_challenges) exercise_questions&.each do |q| begin if q.question_type != 5 @@ -505,7 +506,7 @@ module ExercisesHelper exercise_cha_score = 0.0 answer_status = 0 # if game.status == 2 && game.final_score >= 0 - if game.final_score > 0 && game.end_time < exercise.end_time + if game.final_score > 0 && game.end_time && game.end_time < exercise_end_time exercise_cha_score = game.real_score(exercise_cha.question_score) # exercise_cha_score = exercise_cha.question_score #每一关卡的得分 answer_status = 1 diff --git a/app/jobs/end_exercise_calculate_job.rb b/app/jobs/end_exercise_calculate_job.rb index b6d8e491e..35c6ded57 100644 --- a/app/jobs/end_exercise_calculate_job.rb +++ b/app/jobs/end_exercise_calculate_job.rb @@ -5,11 +5,11 @@ class EndExerciseCalculateJob < ApplicationJob queue_as :default - def perform(ex_user_ids,exercise) + def perform(ex_user_ids,exercise,end_time) exercise_users = ExerciseUser.where(id: ex_user_ids) exercise_users.each do |user| if user.commit_status == 0 && user.start_at.present? - objective_score = calculate_student_score(exercise,user.user)[:total_score] + objective_score = calculate_student_score(exercise,user.user,end_time)[:total_score] user_sub_score = user.subjective_score subjective_score = user_sub_score < 0.0 ? 0.0 : user_sub_score total_score = objective_score + subjective_score diff --git a/app/models/exercise.rb b/app/models/exercise.rb index 0b9963eee..177c0ac88 100644 --- a/app/models/exercise.rb +++ b/app/models/exercise.rb @@ -70,7 +70,7 @@ class Exercise < ApplicationRecord if unified_setting self&.end_time else - user_course_group = course.course_members.find_by(user_id: user_id)&.course_group_id + user_course_group = course.students.find_by(user_id: user_id)&.course_group_id exercise_group_settings.find_by(course_group_id:user_course_group)&.end_time end end diff --git a/app/tasks/exercise_publish_task.rb b/app/tasks/exercise_publish_task.rb index 04e37d126..6aa444683 100644 --- a/app/tasks/exercise_publish_task.rb +++ b/app/tasks/exercise_publish_task.rb @@ -41,20 +41,21 @@ class ExercisePublishTask puts "--------------------------------exercise_publish end" end + def end Rails.logger.info("log--------------------------------exercise_end start") puts "--------------------------------exercise_end start" # 1。统一设置的试卷 - exercises = Exercise.includes(:exercise_users,:exercise_questions).where("exercise_status = 2 AND - unified_setting = true AND end_time <= ?",Time.now + 900) - exercises&.each do |exercise| - ex_type = exercise.exercise_questions.pluck(:question_type).uniq + exercises = Exercise.includes(:exercise_questions).where("exercise_status = 2 AND end_time <= ?",Time.now + 900) + exercises.each do |exercise| + Rails.logger.info("end_exercise_id: #{exercise.id}") exercise.update_column('exercise_status', 3) - exercise.exercise_users&.each do |exercise_user| - begin - Rails.logger.info("true: user_id:#{exercise_user.user_id}--commit_status:#{exercise_user.commit_status}") - if (exercise_user&.commit_status == 0) && (exercise_user&.start_at.present?) - s_score = calculate_student_score(exercise, exercise_user.user)[:total_score] + if exercise.unified_setting + ex_type = exercise.exercise_questions.pluck(:question_type).uniq + exercise.exercise_users.where("commit_status = 0 and start_at is not null").each do |exercise_user| + begin + Rails.logger.info("true: user_id:#{exercise_user.user_id}--commit_status:#{exercise_user.commit_status}") + s_score = calculate_student_score(exercise, exercise_user.user, exercise.end_time)[:total_score] if ex_type.include?(4) #是否包含主观题 subjective_score = exercise_user.subjective_score else @@ -66,72 +67,61 @@ class ExercisePublishTask Rails.logger.info("true: user_id:#{exercise_user.user_id}--s_score:#{s_score}") Rails.logger.info("true: user_id:#{exercise_user.user_id}--commit_method:#{exercise_user.commit_method}") commit_option = { - :status => 1, - :commit_status => 1, - :end_at => Time.now, - :objective_score => s_score, - :score => total_score, - :subjective_score => subjective_score, - :commit_method => exercise_user&.commit_method.to_i > 0 ? exercise_user&.commit_method.to_i : 3 + :status => 1, + :commit_status => 1, + :end_at => exercise.end_time, + :objective_score => s_score, + :score => total_score, + :subjective_score => subjective_score, + :commit_method => exercise_user&.commit_method.to_i > 0 ? exercise_user&.commit_method.to_i : 3 } exercise_user.update_attributes(commit_option) + rescue Exception => e + Rails.logger.info("rescue errors ___________________________#{e}") + next end - rescue Exception => e - Rails.logger.info("rescue errors ___________________________#{e}") - next end - end end - # 2.非统一的试卷 - all_exercises = Exercise.includes(:exercise_group_settings,:exercise_users,:exercise_questions).where("unified_setting = false AND exercise_status = 2 AND end_time > ?",Time.now + 900) - exercise_ids = all_exercises.blank? ? "(-1)" : "(" + all_exercises.map(&:id).join(",") + ")" - ex_group_settings = ExerciseGroupSetting.where("end_time <= '#{Time.now}' and exercise_id in #{exercise_ids}") - ex_group_settings&.each do |exercise_setting| + ExerciseGroupSetting.where("end_time < ? and end_time > ?", Time.now + 900, Time.now - 900).each do |exercise_setting| exercise = exercise_setting.exercise - if exercise.end_time <= Time.now - exercise.update_column('exercise_status', 3) - end + Rails.logger.info("exercise_group_setting: exercise_id:#{exercise.id}--group_settings_id:#{exercise_setting.id}") + users = exercise.course.course_members.where(:course_group_id => exercise_setting.course_group_id) + exercise_users = exercise.exercise_users.where(user_id: users.pluck(:user_id)).where("commit_status = 0 and start_at is not null") ex_types = exercise.exercise_questions.pluck(:question_type).uniq - users = exercise.course.students.where(:course_group_id => exercise_setting.course_group_id) - exercise_users = exercise.exercise_users.where(:user_id => users.pluck(:user_id)) - exercise_users&.each do |exercise_user| + exercise_users.each do |exercise_user| + Rails.logger.info("false: user_id:#{exercise_user.user_id}--commit_status:#{exercise_user.commit_status}") begin - Rails.logger.info("false: user_id:#{exercise_user.user_id}--commit_status:#{exercise_user.commit_status}") - if exercise_user.commit_status == 0 && !exercise_user.start_at.nil? - if ex_types.include?(4) #是否包含主观题 - subjective_score = exercise_user.subjective_score - else - subjective_score = -1.0 - end - s_score = calculate_student_score(exercise, exercise_user.user)[:total_score] - total_score_subjective_score = subjective_score < 0.0 ? 0.0 : subjective_score - total_score = s_score + total_score_subjective_score - Rails.logger.info("false: user_id:#{exercise_user.user_id}--s_score:#{s_score}") - Rails.logger.info("false: user_id:#{exercise_user.user_id}--subjective_score:#{subjective_score}") - Rails.logger.info("false: user_id:#{exercise_user.user_id}--commit_method:#{exercise_user.commit_method}") - commit_option = { - :status => 1, - :commit_status => 1, - :end_at => Time.now, - :objective_score => s_score, - :score => total_score, - :subjective_score => subjective_score, - :commit_method => exercise_user&.commit_method.to_i > 0 ? exercise_user&.commit_method.to_i : 3 - } - exercise_user.update_attributes(commit_option) + if ex_types.include?(4) #是否包含主观题 + subjective_score = exercise_user.subjective_score + else + subjective_score = -1.0 end + s_score = calculate_student_score(exercise, exercise_user.user, exercise_setting.end_time)[:total_score] + total_score_subjective_score = subjective_score < 0.0 ? 0.0 : subjective_score + total_score = s_score + total_score_subjective_score + Rails.logger.info("false: user_id:#{exercise_user.user_id}--s_score:#{s_score}") + Rails.logger.info("false: user_id:#{exercise_user.user_id}--subjective_score:#{subjective_score}") + Rails.logger.info("false: user_id:#{exercise_user.user_id}--commit_method:#{exercise_user.commit_method}") + commit_option = { + :status => 1, + :commit_status => 1, + :end_at => exercise_setting.end_time, + :objective_score => s_score, + :score => total_score, + :subjective_score => subjective_score, + :commit_method => exercise_user&.commit_method.to_i > 0 ? exercise_user&.commit_method.to_i : 3 + } + exercise_user.update_attributes(commit_option) rescue Exception => e Rails.logger.info("unified_setting_false_rescue errors ___________________________#{e}") next end - end end Rails.logger.info("log--------------------------------exercise_end end") puts "--------------------------------exercise_end end" end - end \ No newline at end of file diff --git a/lib/tasks/poll_publish.rake b/lib/tasks/poll_publish.rake index 2460e88c9..1b6d63bcc 100644 --- a/lib/tasks/poll_publish.rake +++ b/lib/tasks/poll_publish.rake @@ -110,7 +110,7 @@ namespace :poll_publish do # # end # end - PollGroupSetting.where("end_time < ? and end_time > ?", Time.now + 1800, Time.now - 1800).each do |poll_setting| + PollGroupSetting.where("end_time < ? and end_time > ?", Time.now + 900, Time.now - 900).each do |poll_setting| poll = poll_setting.poll # poll.update_column('polls_status',3)