# #coding=utf-8 # # namespace :exercise_publish do # desc "publish exercise and end exercise" # def get_mulscore(question, user) # ecs = ExerciseAnswer.where("user_id =? and exercise_question_id =?", user.id, question.id) # arr = [] # ecs.each do |ec| # arr << ec.exercise_choice.choice_position # end # #arr = arr.sort # str = arr.sort.join("") # return str # end # # def tran_base64_decode64 str # if str.blank? # str # else # s_size = str.size % 4 # if s_size != 0 # str += "=" * (4 - s_size) # end # Base64.decode64(str.tr("-_", "+/")).force_encoding("utf-8") # end # end # # #计算试卷的总分和试卷的答题状态 # def calculate_student_score(exercise,user) # score1 = 0.0 #选择题/判断题 # score2 = 0.0 #填空题 # score5 = 0.0 #实训题 # ques_stand = [] #问题是否正确 # exercise_questions = exercise.exercise_questions # exercise_questions.each do |q| # if q.question_type != 5 # answers_content = q.exercise_answers.search_answer_users("user_id",user.id) #学生的答案 # else # answers_content = q.exercise_shixun_answers.search_shixun_answers("user_id",user.id) #学生的答案 # end # if q.question_type <= 2 #为选择题或判断题时 # answer_choice_array = [] # answers_content.each do |a| # answer_choice_array.push(a.exercise_choice.choice_position) #学生答案的位置 # end # user_answer_content = answer_choice_array.sort # standard_answer = q.exercise_standard_answers.pluck(:exercise_choice_id).sort #该问题的标准答案,可能有多个 # if user_answer_content == standard_answer #答案一致,多选或单选才给分,答案不对不给分 # if standard_answer.count > 0 # multi_each_score = (q.question_score / standard_answer.count) #当多选答案正确时,每个answer的分数均摊。 # else # multi_each_score = 0.0 # end # answers_content.update_all(:score => multi_each_score) # score1 = score1 + q.question_score # end # elsif q.question_type == 3 #填空题 # null_standard_answer = q.exercise_standard_answers # standard_answer_array = null_standard_answer.select(:exercise_choice_id,:answer_text) # standard_answer_ids = standard_answer_array.pluck(:exercise_choice_id).reject(&:blank?).uniq #标准答案的exercise_choice_id数组 # standard_answer_count = standard_answer_ids.count # if standard_answer_count > 0 #存在标准答案时才有分数 # each_standard_score = (q.question_score.to_f / standard_answer_count).round(1) #每一空的得分 # else # each_standard_score = 0.0 # end # if q.is_ordered # answers_content.each do |u| # i_standard_answer = standard_answer_array.where(exercise_choice_id:u.exercise_choice_id).pluck(:answer_text).reject(&:blank?).map!(&:downcase) #该选项的全部标准答案 # if i_standard_answer.include?(u.answer_text.downcase) #该空的标准答案包含用户的答案才有分数 # u.update_attribute("score",each_standard_score) # score2 = score2 + each_standard_score # end # end # else # st_answer_text = standard_answer_array.pluck(:answer_text).reject(&:blank?).map!(&:downcase) # answers_content.each do |u| # u_answer_text = u.answer_text.downcase # if st_answer_text.include?(u_answer_text) #只要标准答案包含用户的答案,就有分数。同时,下一次循环时,就会删除该标准答案。防止用户的相同答案获分 # u.update_attribute("score",each_standard_score) # score2 = score2 + each_standard_score # st_answer_text.delete(u_answer_text) # end # end # end # elsif q.question_type == 5 #实训题时,主观题这里不评分 # q.exercise_shixun_challenges.each do |exercise_cha| # game = Game.user_games(user.id,exercise_cha.challenge_id).first #当前用户的关卡 # if game.present? # exercise_cha_score = 0 # answer_status = 0 # cha_path = exercise_cha.challenge.path.present? ? exercise_cha.challenge.path.split(";").reject(&:blank?) : [] # if game.status == 2 && game.final_score >= 0 # exercise_cha_score = game.real_score exercise_cha.question_score #每一关卡的得分 # answer_status = 1 # end # if exercise_cha.exercise_shixun_answers.search_shixun_answers("user_id",user.id).blank? #把关卡的答案存入试卷的实训里 # game_challenge = game.game_codes.search_challenge_path(cha_path).first # if game_challenge.present? # game_code = game_challenge # code = game_code.try(:new_code) # else # begin # content = GitService.file_content(repo_path: exercise_cha.shixun.repo_path, path: cha_path)["content"] # decode_content = nil # if content.present? # content = Base64.decode64(content) # cd = CharDet.detect(content) # decode_content = # if cd["encoding"] == 'GB18030' && cd['confidence'] > 0.8 # content.encode('UTF-8', 'GBK', {:invalid => :replace, :undef => :replace, :replace => ' '}) # else # content.force_encoding('UTF-8') # end # end # decode_content # rescue Exception => e # uid_logger_error(e.message) # raise Educoder::TipException.new("文档内容获取异常") # end # code = git_fle_content(exercise_cha.shixun.repo_path,cha_path) # end # sx_option = { # :exercise_question_id => q.id, # :exercise_shixun_challenge_id => exercise_cha.id, # :user_id => user.id, # :score => exercise_cha_score, # :answer_text => code, # :status => answer_status # } # ex_shixun_answer = ExerciseShixunAnswer.new(sx_option) # ex_shixun_answer.save! # end # score5 += exercise_cha_score # end # end # end # user_scores = answers_content.score_reviewed.pluck(:score).sum # if user_scores > 0 # stand_answer = 1 # else # stand_answer = 0 # end # ques_option = { # "q_id":q.id, #该问题的id # "q_type":q.question_type, # "q_position":q.question_number, #该问题的位置 # "stand_status":stand_answer, #该问题是否正确,1为正确,0为错误 # "user_score":user_scores #每个问题的总得分 # } # ques_stand.push(ques_option) # end # total_score = score1 + score2 + score5 # { # "total_score":total_score, # "stand_status":ques_stand # } # end # # task :publish => :environment do # Rails.logger.info("log--------------------------------exercise_publish start") # puts "--------------------------------exercise_publish start" # exercises = Exercise.where("publish_time is not null and exercise_status = 1 and publish_time <=?",Time.now) # exercises.each do |exercise| # exercise.update_column('exercise_status', 2) # course = exercise.course # tid_str = "" # course.teachers.find_each do |member| # tid_str += "," if tid_str != "" # tid_str += "(#{member.user_id}, #{exercise.user_id}, #{exercise.id}, 'Exercise', #{exercise.id}, 'ExercisePublish', #{course.id}, 'Course', 0, 'Exercise', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}')" # end # if exercise.unified_setting # course.student.find_each do |student| # tid_str += "," if tid_str != "" # tid_str += "(#{student.student_id}, #{exercise.user_id}, #{exercise.id}, 'Exercise', #{exercise.id}, 'ExercisePublish', #{course.id}, 'Course', 0, 'Exercise', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}')" # end # end # if tid_str != "" # tid_sql = "insert into tidings (user_id, trigger_user_id, container_id, container_type, parent_container_id, parent_container_type, belong_container_id, belong_container_type, viewed, tiding_type, created_at, updated_at) values" + tid_str # ActiveRecord::Base.connection.execute tid_sql # end # # if exercise.exercise_users.count == 0 # str = "" # course.student.find_each do |student| # str += "," if str != "" # str += "(#{student.user_id}, #{exercise.id}, 0, '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}')" # end # # if str != "" # sql = "insert into exercise_users (user_id, exercise_id, commit_status, created_at, updated_at) values" + str # ActiveRecord::Base.connection.execute sql # end # end # # if exercise.course_acts.size == 0 # exercise.course_acts << CourseActivity.new(:user_id => exercise.user_id,:course_id => exercise.course_id) # end # end # # # 分组设置发布时间的测验 # exercise_group_settings = ExerciseGroupSetting.where("publish_time < ? and publish_time > ?", Time.now + 1800, Time.now - 1800) # exercise_group_settings.each do |exercise_group| # exercise = exercise_group.exercise # if exercise.present? # course = exercise.course # exercise.update_attributes(:exercise_status => 2) if exercise.exercise_status == 1 # tid_str = "" # members = course.students.where(:course_group_id => exercise_group.course_group_id) # members.find_each do |member| # tid_str += "," if tid_str != "" # tid_str += "(#{member.user_id},#{exercise.user_id}, #{exercise.id}, 'Exercise', #{exercise.id}, 'ExercisePublish', #{course.id}, 'Course', 0, 'Exercise', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}')" # end # if tid_str != "" # tid_sql = "insert into tidings (user_id, trigger_user_id, container_id, container_type, parent_container_id, parent_container_type, belong_container_id, belong_container_type, viewed, tiding_type, created_at, updated_at) values" + tid_str # ActiveRecord::Base.connection.execute tid_sql # end # end # end # Rails.logger.info("log--------------------------------exercise_publish end") # puts "--------------------------------exercise_publish end" # end # # task :end => :environment do # # include ExercisesHelper # # include ApplicationController # # exercises = Exercise.where("end_time <=? and exercise_status = 2",Time.now) # exercises.each do |exercise| # course = exercise.course # exercise.update_column('exercise_status', 3) # # exercise.exercise_users.each do |exercise_user| # if exercise_user.commit_status == 0 && !exercise_user.start_at.nil? # exercise_user.update_attributes(:commit_status => 1, :end_at => Time.now, :status => true) # # s_score = calculate_student_score(exercise, exercise_user.user)[:total_score] # exercise_user.update_attributes(:objective_score => s_score, :score => (s_score + (exercise_user.subjective_score && exercise_user.subjective_score > 0 ? exercise_user.subjective_score : 0))) # if exercise_user.user.exercise_answers.where(:exercise_question_id => exercise.exercise_questions.where(:question_type => 4).map(&:id)).empty? # exercise_user.update_attributes(:subjective_score => 0) # end # end # end # end # # all_exercises = Exercise.where("end_time > ? and exercise_status = 2",Time.now) # exercise_ids = all_exercises.blank? ? "(-1)" : "(" + all_exercises.map(&:id).join(",") + ")" # ExerciseGroupSetting.where("end_time <= '#{Time.now}' and exercise_id in #{exercise_ids}").each do |exercise_setting| # exercise = exercise_setting.exercise # # users = exercise.course.students.where(:course_group_id => exercise_setting.course_group_id) # exercise_users = exercise.exercise_users.where(:user_id => users.map(&:user_id)) # # exercise_users.each do |exercise_user| # if exercise_user.commit_status == 0 && !exercise_user.start_at.nil? # exercise_user.update_attributes(:commit_status => 1, :end_at => Time.now, :status => true) # # s_score = calculate_student_score(exercise, exercise_user.user)[:total_score] # exercise_user.update_attributes(:objective_score => s_score, :score => (s_score + (exercise_user.subjective_score && exercise_user.subjective_score > 0 ? exercise_user.subjective_score : 0))) # if exercise_user.user.exercise_answers.where(:exercise_question_id => exercise.exercise_questions.where(:question_type => 4).map(&:id)).empty? # exercise_user.update_attributes(:subjective_score => 0) # end # end # end # end # Rails.logger.info("log--------------------------------exercise_end completed") # end # end