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
6.9 KiB

6 years ago
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)
5 years ago
myshixuns = Myshixun.where(id: myshixun_ids).includes(:games)
6 years ago
#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.pluck(:evaluate_count).sum
6 years ago
# 获取最大评测次数
max_evaluate_count = (evaluate_count > max_evaluate_count ? evaluate_count : max_evaluate_count)
# 通关耗时
pass_consume_time = (myshixun.total_cost_time / 60.0)
6 years ago
# 总耗时
all_time = (myshixun.games.pluck(:cost_time).sum / 60.0)
6 years ago
# 通关得分
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