|  |  | module StudentWorksHelper
 | 
						
						
						
							|  |  |   # 学生作业是否迟交
 | 
						
						
						
							|  |  |   def student_work_is_delay? homework_common, game
 | 
						
						
						
							|  |  |     (Time.now > homework_common.end_time && game.end_time.blank?) || (game.end_time.present? && game.end_time > homework_common.end_time)
 | 
						
						
						
							|  |  |   end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   # 关卡的完成状态:提交截止(不允许补交)后或补交截止后通关的是无效状态,允许补交且在补交阶段内通关的是延时状态,提交截止前完成的是正常状态
 | 
						
						
						
							|  |  |   # 0:未通关  1:正常  2:延时  3:无效
 | 
						
						
						
							|  |  |   def game_status game, homework
 | 
						
						
						
							|  |  |     if game.status == 2
 | 
						
						
						
							|  |  |       homework_setting = homework.homework_group_setting game.user_id
 | 
						
						
						
							|  |  |       status = homework_setting.end_time >= game.end_time ? 1 :
 | 
						
						
						
							|  |  |                    (homework.allow_late && homework.late_time > game.end_time) ? 2 : 3
 | 
						
						
						
							|  |  |     else
 | 
						
						
						
							|  |  |       status = 0
 | 
						
						
						
							|  |  |     end
 | 
						
						
						
							|  |  |     status
 | 
						
						
						
							|  |  |   end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   # 作业的开启时间
 | 
						
						
						
							|  |  |   def myshixun_open_time game
 | 
						
						
						
							|  |  |     game.open_time ? (format_time game.open_time) : "--"
 | 
						
						
						
							|  |  |   end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   # 作业完成时间
 | 
						
						
						
							|  |  |   def finished_time end_time
 | 
						
						
						
							|  |  |     end_time ? (format_time end_time) : "--"
 | 
						
						
						
							|  |  |   end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   # 作业耗时
 | 
						
						
						
							|  |  |   def time_consuming game
 | 
						
						
						
							|  |  |     game.end_time.blank? ? "--" : (game_spend_time game.cost_time)
 | 
						
						
						
							|  |  |   end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   # 用户个人实训总得分:user_total_score;
 | 
						
						
						
							|  |  |   # consume_time通关的关卡总耗时间;
 | 
						
						
						
							|  |  |   # all_tine实训的总耗时
 | 
						
						
						
							|  |  |   # evaluate_count: 每次总评测次数;
 | 
						
						
						
							|  |  |   # eff_score:用户得分/总评测次数;
 | 
						
						
						
							|  |  |   # round_size:log(所有课堂实训最大评测次数/当前实训评测次数)
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   def student_efficiency(homework_common, work)
 | 
						
						
						
							|  |  |     myshixun_ids = homework_common.student_works.pluck(:myshixun_id)
 | 
						
						
						
							|  |  |     myshixuns = Myshixun.where(id: myshixun_ids).includes(games: [:outputs])
 | 
						
						
						
							|  |  |     #student_works_user_id = homework_common.student_works.pluck(:user_id).uniq
 | 
						
						
						
							|  |  |     #shixun = homework_common.shixuns.first
 | 
						
						
						
							|  |  |     #logger.info("#########shixun_id: ###{shixun.id}")
 | 
						
						
						
							|  |  |     #myshixuns = shixun.myshixuns.where(:user_id => student_works_user_id).includes(games: [:outputs])
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     # 最大评测次数
 | 
						
						
						
							|  |  |     max_evaluate_count = 0
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     # 数据库操作改成对hash数组的操作
 | 
						
						
						
							|  |  |     objects =
 | 
						
						
						
							|  |  |         myshixuns.map do |myshixun|
 | 
						
						
						
							|  |  |           # 评测次数
 | 
						
						
						
							|  |  |           evaluate_count = myshixun.games.inject(0) {|sum, g| sum + g.outputs.pluck(:query_index).first.to_i}
 | 
						
						
						
							|  |  |           # 获取最大评测次数
 | 
						
						
						
							|  |  |           max_evaluate_count = (evaluate_count > max_evaluate_count ? evaluate_count : max_evaluate_count)
 | 
						
						
						
							|  |  |           # 通关耗时
 | 
						
						
						
							|  |  |           pass_consume_time = (myshixun.games.where(status: 2).pluck(:cost_time).sum / 60.0)
 | 
						
						
						
							|  |  |           # 总耗时
 | 
						
						
						
							|  |  |           all_time = (myshixun.games.pluck(:cost_time).sum / 60.0)
 | 
						
						
						
							|  |  |           # 通关得分
 | 
						
						
						
							|  |  |           user_total_score = myshixun.total_score.to_i
 | 
						
						
						
							|  |  |           # 耗时,保留2位小数,
 | 
						
						
						
							|  |  |           consume_time = all_time <= 1 ? 1 : Math.log(all_time).to_f
 | 
						
						
						
							|  |  |           consume_time = format("%.2f", consume_time).to_f
 | 
						
						
						
							|  |  |           # 效率
 | 
						
						
						
							|  |  |           efficiency = (pass_consume_time == 0 ? 0 : Math.log((user_total_score / pass_consume_time.to_f) + 1.0))
 | 
						
						
						
							|  |  |           efficiency = format("%.2f", efficiency).to_f
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |           {consume_time: consume_time, evaluate_count: evaluate_count, user_id: myshixun.user_id,
 | 
						
						
						
							|  |  |            user_total_score: user_total_score, efficiency: efficiency}
 | 
						
						
						
							|  |  |         end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     # 我的效率
 | 
						
						
						
							|  |  |     myself_eff = []
 | 
						
						
						
							|  |  |     myself_object = []
 | 
						
						
						
							|  |  |     # 最小效率值
 | 
						
						
						
							|  |  |     min_efficiency = objects.map {|o| o[:efficiency]}.min
 | 
						
						
						
							|  |  |     # 最大效率值
 | 
						
						
						
							|  |  |     # max_efficiency = objects.map{|o| o[:efficiency]}.max
 | 
						
						
						
							|  |  |     results =
 | 
						
						
						
							|  |  |         objects.each_with_index.map do |object, index|
 | 
						
						
						
							|  |  |           y_score = (object[:evaluate_count] == 0 ? 0 : (object[:user_total_score] / object[:evaluate_count].to_f))
 | 
						
						
						
							|  |  |           eff_score = format("%.2f", y_score).to_f
 | 
						
						
						
							|  |  |           # 效率值
 | 
						
						
						
							|  |  |           efficiency = object[:efficiency] < 0 ?
 | 
						
						
						
							|  |  |                            format("%.2f", object[:efficiency] - min_efficiency) : object[:efficiency]
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |           # 圆圈的大小
 | 
						
						
						
							|  |  |           round_size = (object[:evaluate_count] == 0 ? 0 : Math.log(max_evaluate_count / object[:evaluate_count].to_f)) * 3.14
 | 
						
						
						
							|  |  |           # 作品本人的数据
 | 
						
						
						
							|  |  |           if object[:user_id] == work.user.id
 | 
						
						
						
							|  |  |             myself_eff = [index + 1, efficiency]
 | 
						
						
						
							|  |  |             myself_object = [object[:consume_time], eff_score, round_size]
 | 
						
						
						
							|  |  |           end
 | 
						
						
						
							|  |  |           {:eff_score => eff_score, :user_id => object[:user_id], :consume_time => object[:consume_time],
 | 
						
						
						
							|  |  |            :efficiency => efficiency, :round_size => round_size}
 | 
						
						
						
							|  |  |         end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     # 对结果进行排序
 | 
						
						
						
							|  |  |     efficiency_list =
 | 
						
						
						
							|  |  |         results.sort {|x, y| x[:efficiency] <=> y[:efficiency]}.each_with_index.map do |result, index|
 | 
						
						
						
							|  |  |           [index + 1, result[:efficiency], result[:user_id]]
 | 
						
						
						
							|  |  |         end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     consume_list =
 | 
						
						
						
							|  |  |         results.sort {|x, y| x[:consume_time] <=> y[:consume_time]}.map do |result|
 | 
						
						
						
							|  |  |           [result[:consume_time], result[:eff_score], result[:round_size], result[:user_id]]
 | 
						
						
						
							|  |  |         end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     return {myself_eff: myself_eff, myself_object: myself_object, efficiency_list: efficiency_list, consume_list: consume_list}
 | 
						
						
						
							|  |  |   end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   # tpi详情信息
 | 
						
						
						
							|  |  |   def output_detail game, output
 | 
						
						
						
							|  |  |     if game.challenge.st == 0
 | 
						
						
						
							|  |  |       output.try(:out_put).delete("详情如下:")
 | 
						
						
						
							|  |  |     else
 | 
						
						
						
							|  |  |       if game.status == 2
 | 
						
						
						
							|  |  |         "评测通过"
 | 
						
						
						
							|  |  |       else
 | 
						
						
						
							|  |  |         "共有#{game.challenge.challenge_chooses.count}组测试集,其中有#{game.challenge.challenge_chooses.count-game.choose_correct_num}组测试结果不匹配"
 | 
						
						
						
							|  |  |       end
 | 
						
						
						
							|  |  |     end
 | 
						
						
						
							|  |  |   end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   def allow_score homework, identity, user_id, work
 | 
						
						
						
							|  |  |     (identity < Course::STUDENT && !work.ultimate_score) ||
 | 
						
						
						
							|  |  |         (identity == Course::STUDENT && homework.anonymous_comment &&
 | 
						
						
						
							|  |  |             [3, 4].include?(homework.homework_detail_manual.comment_status) &&
 | 
						
						
						
							|  |  |             StudentWorksEvaluationDistribution.where(user_id: user_id, student_work_id: work.id).count > 0)
 | 
						
						
						
							|  |  |   end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   def message_user_name(message_user, score, work_user, current_user, identity)
 | 
						
						
						
							|  |  |     user_name = ""
 | 
						
						
						
							|  |  |     user_login = "--"
 | 
						
						
						
							|  |  |     image_url = "--"
 | 
						
						
						
							|  |  |     if score.reviewer_role == 3 && score.user == message_user && message_user != current_user && identity >= Course::STUDENT
 | 
						
						
						
							|  |  |       user_name =  "匿评人"
 | 
						
						
						
							|  |  |     elsif score.reviewer_role == 3 && work_user == message_user && message_user != current_user && identity >= Course::STUDENT
 | 
						
						
						
							|  |  |       user_name = "被匿评人"
 | 
						
						
						
							|  |  |     else
 | 
						
						
						
							|  |  |       user_name = message_user.real_name
 | 
						
						
						
							|  |  |       user_login = message_user.login
 | 
						
						
						
							|  |  |       image_url = url_to_avatar(score.user)
 | 
						
						
						
							|  |  |     end
 | 
						
						
						
							|  |  |     {user_name: user_name, user_login: user_login, user_image_url: image_url}
 | 
						
						
						
							|  |  |   end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   def appeal_info work_appeal, user_identity, current_user
 | 
						
						
						
							|  |  |     if user_identity < Course::STUDENT || work_appeal.user == current_user
 | 
						
						
						
							|  |  |       user_name = work_appeal.user.try(:real_name)
 | 
						
						
						
							|  |  |       user_login = work_appeal.user.try(:login)
 | 
						
						
						
							|  |  |       image_url = url_to_avatar(work_appeal.user)
 | 
						
						
						
							|  |  |     else
 | 
						
						
						
							|  |  |       user_name = "匿名"
 | 
						
						
						
							|  |  |       user_login = "--"
 | 
						
						
						
							|  |  |       image_url = "--"
 | 
						
						
						
							|  |  |     end
 | 
						
						
						
							|  |  |     {id: work_appeal.id, user_name: user_name, user_login: user_login, user_image_url: image_url, time: work_appeal.created_at, content: work_appeal.comment}
 | 
						
						
						
							|  |  |   end
 | 
						
						
						
							|  |  | end
 |