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

197 lines
8.7 KiB

6 years ago
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 :homework_common
belongs_to :myshixun, optional: true
has_many :student_works_evaluation_distributions, dependent: :destroy
has_many :student_works_scores, 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 }
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
5 years ago
self.student_works_scores.select{|score| score.reviewer_role == 2}.group_by(&:user_id).count
6 years ago
end
# 匿评次数
def student_comment_num
5 years ago
homework_common.homework_detail_manual.comment_status > 2 ? self.student_works_scores.select{|score| score.reviewer_role == 3}.group_by(&:user_id).count : 0
6 years ago
end
# 匿评申诉总条数
def appeal_all_count
5 years ago
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
6 years ago
end
# 匿评申诉待处理条数
def appeal_deal_count
5 years ago
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
6 years ago
end
# 当前用户该作品的匿评申诉总条数
def my_appeal_all_count user_id
5 years ago
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
5 years ago
student_works_scores.select{|score| score.reviewer_role == 3 && score.appeal_status == 1 && score.user_id == user_id}.size
end
6 years ago
# 分组名
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.where.not(score: nil).last
atta.author_id == user_id && (!last_score.present? || last_score.try(:created_at) < atta.created_on)
end
# 作品总体评价
def overall_appraisal
case self.work_score.to_i
when (90..100)
'优秀'
when (70...90)
'良好'
when (60...70)
'及格'
when (0...60)
'不及格'
end
end
# 更新作品成绩
def set_work_score
if work_status > 0 && homework_common && homework_common.homework_detail_manual && !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 scored?
student_works_scores.where.not(reviewer_role: 3).exists?
end
end