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/models/student_work.rb

255 lines
11 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.

class StudentWork < ApplicationRecord
#学生提交作品表 #work_status :0 未提交 1 已提交 2 迟交
belongs_to :user
belongs_to :commit_user, class_name: 'User', foreign_key: :commit_user_id, optional: true
belongs_to :update_user, class_name: 'User', foreign_key: :update_user_id, optional: true
belongs_to :homework_common
belongs_to :myshixun, optional: true
has_many :student_works_evaluation_distributions, dependent: :destroy
has_many :student_works_scores, dependent: :destroy
has_many :shixun_work_comments, dependent: :destroy
belongs_to :project, optional: true
# attachtype: 1正常提交的附件 7补交的附件
has_many :attachments, as: :container, dependent: :destroy
has_many :tidings, as: :container, dependent: :destroy
has_many :challenge_work_scores, dependent: :destroy
before_save :set_work_score
validates :description, length: { maximum: 5000, too_long: "不能超过5000个字符" }
scope :has_committed, lambda { where("work_status != 0") }
# 未提交
scope :unfinished, -> {where(work_status: 0)}
# 按时提交
scope :finished, -> {where(work_status: 1)}
# 延迟提交
scope :delay_finished, -> {where(work_status: 2)}
#按用户id查找
scope :homework_by_user, lambda{|ids| where(user_id: ids)}
#根据homework_common_id查找
scope :find_by_homework, lambda{|ids| where(homework_common_id: ids)}
def myshixun_consume
self.myshixun && self.myshixun.passed_count > 0 ? self.myshixun.total_spend_time : "--"
end
# 助教评分次数
def ta_comment_count
self.student_works_scores.select{|score| score.reviewer_role == 2}.group_by(&:user_id).count
end
# 匿评次数
def student_comment_num
homework_common.homework_detail_manual.comment_status > 2 && work_status > 0 ? self.student_works_scores.select{|score| score.reviewer_role == 3}.group_by(&:user_id).size : 0
end
# 学生评阅作品数
def user_comment_num
if homework_common.homework_detail_manual.comment_status > 2 && work_status > 0
count = homework_common.student_works_scores.select{|score| score.reviewer_role == 3 && score.user_id == user_id}.group_by(&:student_work_id).size
else
count = 0
end
count
end
# 匿评申诉总条数
def appeal_all_count
homework_common.homework_detail_manual.comment_status >= 3 ? self.student_works_scores.
select{|score| score.reviewer_role == 3 && score.appeal_status != 0}.group_by(&:user_id).count : 0
end
# 匿评申诉待处理条数
def appeal_deal_count
homework_common.homework_detail_manual.comment_status >= 3 ? self.student_works_scores.
select{|score| score.reviewer_role == 3 && score.appeal_status == 1}.group_by(&:user_id).count : 0
end
# 当前用户该作品的匿评申诉总条数
def my_appeal_all_count user_id
student_works_scores.select{|score| score.reviewer_role == 3 && score.appeal_status != 0 && score.user_id == user_id}.size
end
# 当前用户该作品的匿评申诉总条数
def my_appeal_deal_count user_id
student_works_scores.select{|score| score.reviewer_role == 3 && score.appeal_status == 1 && score.user_id == user_id}.size
end
# 分组名
def work_group_name
self.group_id == 0 ? "--" : "分组#{self.group_id}"
end
# 助教评分
def ta_score ta_mode
if ta_mode == 1
ts_score = StudentWorksScore.find_by_sql("SELECT AVG(score) AS score FROM (SELECT * FROM
(SELECT * FROM student_works_scores WHERE student_work_id = #{self.id}
AND reviewer_role = 2 AND score IS NOT NULL ORDER BY created_at DESC)
AS t GROUP BY user_id) AS a")
score = ts_score.first.score.nil? ? nil : ts_score.first.score.to_f.try(:round, 2)
else
score = StudentWorksScore.where("student_work_id = #{self.id} AND reviewer_role = 2 AND score IS NOT NULL").last.try(:score)
end
end
# 缺评次数
def absence_count
absence_penalty_count = self.user.student_works_evaluation_distributions.joins(:student_work).
where("homework_common_id = #{self.homework_common_id}").count -
self.user.student_works_scores.joins(:student_work).where("homework_common_id = #{self.homework_common_id}
and reviewer_role = 3").select("distinct student_work_id").count
absence_penalty_count = absence_penalty_count < 0 ? 0 : absence_penalty_count
end
# 违规匿评次数
def appeal_count
appeal_count = self.user.student_works_scores.joins(:student_work).where("homework_common_id = #{self.homework_common_id}
and appeal_status = 3").select("distinct student_work_id").count
end
def delete_atta atta
last_score = student_works_scores.last
(atta.author_id == User.current.id) && (last_score.blank? || last_score.try(:created_at) < atta.created_on)
end
# 作品总体评价
def overall_appraisal
return "--" if work_status == 0
case (self.work_score.to_f / homework_common.total_score).round(2)
when (0.90..1.00)
'优秀'
when (0.70...0.90)
'良好'
when (0.60...0.70)
'及格'
when (0.00...0.60)
'不及格'
end
end
# 实训作业的作品状态 0未提交1未通关2按时通关(提交截止前通关)3迟交通关提交截止-补交截止间通关)
def real_work_status
status = work_status
if status > 0 && myshixun
if myshixun.status != 1
status = 1
else
homework_end_time = homework_common.homework_group_setting(user_id)&.end_time
if homework_end_time.present? && homework_end_time > myshixun.passed_time
status = 2
elsif homework_end_time.present? && homework_common.allow_late && homework_common.late_time > myshixun.passed_time
status = 3
else
status = 1
end
end
end
status
end
# 更新作品成绩
def set_work_score
if work_status > 0 && homework_common && !self.ultimate_score
case homework_common.homework_type
when "normal", "group"
if !homework_common&.homework_detail_manual&.final_mode
tea_ass_proportion = homework_common.homework_detail_manual.ta_proportion
tea_proportion = homework_common.homework_detail_manual.te_proportion
if self.teacher_score
if self.teaching_asistant_score.nil?
if self.student_score.nil?
self.final_score = self.teacher_score
else
te_proportion = tea_proportion + tea_ass_proportion / 2
final_te_score = BigDecimal.new("#{self.teacher_score}") * BigDecimal.new("#{te_proportion}")
final_s_score = BigDecimal.new("#{self.student_score}") * (BigDecimal.new('1.0') -
BigDecimal.new("#{te_proportion}"))
final_score = final_te_score + final_s_score
self.final_score = format("%.2f", final_score.to_f)
end
else
if self.student_score.nil?
te_proportion = tea_proportion + (1.0 - tea_proportion - tea_ass_proportion) / 2
final_te_score = BigDecimal.new("#{self.teacher_score}") * BigDecimal.new("#{te_proportion}")
final_ta_score = BigDecimal.new("#{self.teaching_asistant_score}") * (BigDecimal.new('1.0') -
BigDecimal.new("#{te_proportion}"))
final_score = final_te_score + final_ta_score
self.final_score = format("%.2f",final_score.to_f)
else
final_te_score = BigDecimal.new("#{self.teacher_score}") * BigDecimal.new("#{tea_proportion}")
final_ta_score = BigDecimal.new("#{self.teaching_asistant_score}") * BigDecimal.new("#{tea_ass_proportion}")
final_s_score = BigDecimal.new("#{self.student_score}") * (BigDecimal.new('1.0') -
BigDecimal.new("#{tea_proportion}") - BigDecimal.new("#{tea_ass_proportion}"))
final_score = final_te_score + final_ta_score + final_s_score
self.final_score = format("%.2f",final_score.to_f)
end
end
else
if self.teaching_asistant_score.nil?
self.final_score = self.student_score
elsif self.student_score.nil?
self.final_score = self.teaching_asistant_score
else
ta_proportion = tea_ass_proportion + tea_proportion / 2
final_ta_score = BigDecimal.new("#{self.teaching_asistant_score}") * BigDecimal.new("#{ta_proportion}")
final_s_score = BigDecimal.new("#{self.student_score}") * (BigDecimal.new('1.0') -
BigDecimal.new("#{ta_proportion}"))
final_score = final_ta_score + final_s_score
self.final_score = format("%.2f",final_score.to_f)
end
end
else
self.final_score = self.teacher_score ? self.teacher_score :
(self.teaching_asistant_score ? self.teaching_asistant_score : self.student_score)
end
# 作品最终得分work_score 等于作品得分 - 缺评扣分 - 迟交扣分 - 申诉扣分
score = self.final_score.to_f - self.absence_penalty - self.late_penalty - self.appeal_penalty if self.final_score
self.work_score = score ? format("%.2f",(score < 0 ? 0 : score).to_f) : nil
when "practice"
# 作品最终得分work_score 等于作品关卡得分 + 效率分 - 迟交扣分
work_score = self.final_score + self.eff_score - self.late_penalty if self.final_score
self.work_score = work_score ? format("%.2f", work_score < 0 ? 0 : work_score) : nil
end
end
end
# 实训作品是否已被评阅过
def shixun_has_comment?
shixun_work_comments.size > 0 || student_works_scores.size > 0 || challenge_work_scores.size > 0
end
# 普通/分组作品是否已被评阅过
def work_has_comment?
student_works_scores.select{|score| score.reviewer_role < 3}.size > 0
end
def scored?
student_works_scores.where.not(reviewer_role: 3, score: nil).exists?
end
def work_challenge_score game, score, challenge_id
game_score = 0
adjust_score = challenge_work_scores.where(challenge_id: challenge_id).last
if adjust_score.present?
game_score = adjust_score.score
elsif game.present?
setting = homework_common.homework_group_setting game.user_id
if game.status == 2 && ((game.end_time && setting.end_time && game.end_time < setting.end_time) || (homework_common.allow_late && homework_common.late_time && game.end_time && game.end_time < homework_common.late_time))
answer_open_evaluation = homework_common.homework_detail_manual.answer_open_evaluation
game_score = answer_open_evaluation ? score : (game.final_score > 0 ? game.real_score(score) : 0)
end
end
game_score
end
end