You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
educoder/app/helpers/student_works_helper.rb

166 lines
7.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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_sizelog(所有课堂实训最大评测次数/当前实训评测次数)
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