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/graduation_task.rb

180 lines
6.6 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 GraduationTask < ApplicationRecord
# task_type 1: 普通作业 2分组作业
# status 0未发布 1已发布 2评阅中 3交叉评阅
# comment_status 1随机分配 2指导老师手动分配 3答辩组内老师互评 4答辩组间老师互评
belongs_to :course, counter_cache: true
belongs_to :user
has_many :journals_for_messages, as: :jour, dependent: :destroy
has_many :praise_tread, as: :praise_tread_object, dependent: :destroy
has_many :course_acts, class_name: 'CourseActivity', as: :course_act, dependent: :destroy
has_many :tidings, as: :container, dependent: :destroy
has_many :attachments, as: :container, dependent: :destroy
has_many :graduation_task_group_assignations, dependent: :destroy
has_many :graduation_work_comment_assignations, dependent: :destroy
has_many :graduation_works, -> { where("is_delete = 0") }
has_many :score_graduation_works, -> { where("is_delete = 0 and work_status != 0").order("work_score desc") }, class_name: "GraduationWork"
has_many :graduation_work_scores
belongs_to :gtask_bank, optional: true
validates :name, length: { maximum: 60 }
validates :description, length: { maximum: 5000 }
# 未提交
scope :unfinished, -> {where(status: 0)}
# 按时提交
scope :finished, -> {where(status: 1)}
# 延迟提交
scope :delay_finished, -> {where(status: 2)}
#已发布的
scope :task_published, -> {where("publish_time <= ?",Time.now)}
def user_work user_id
work = self.graduation_works.find_by(user_id: user_id)
end
def task_type_name
task_type == 1 ? "普通作业" : "分组作业"
end
# 是否有学生提交过作品
def student_commit_works
graduation_works.has_committed.count > 0
end
# 是否有学生关联了项目
def student_relate_projects
task_type == 2 && graduation_works.where("project_id != 0").count > 0
end
# 是否发布
def published?
self.publish_time.present? && self.publish_time < Time.now
end
# 答辩组互评分配
def task_assign_group group_id
graduation_task_group_assignations.find_by(graduation_group_id: group_id)
end
def create_work_list
str = ""
self.course.students.each do |student|
str += "," if str != ""
str += "(#{self.id}, #{student.user_id}, #{self.course_id}, '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}')"
end
if str != ""
sql = "insert into graduation_works (graduation_task_id, user_id, course_id, created_at, updated_at) values" + str
ActiveRecord::Base.connection.execute sql
end
end
#课程动态公共表记录
def act_as_course_activity
if self.course_acts.size == 0
self.course_acts << CourseActivity.new(user_id: self.user_id, course_id: self.course_id)
end
end
# 是否提交了作品
def has_commit_work user_id
work = self.graduation_works.find_by(user_id: user_id)
work.present? && work.work_status != 0
end
# 任务已评数 user_id: 对应老师的id
def comment_count(user_id)
course = self.course
# 如果有分班,则取此老师对应分班的已评数,没有分班,则取所有的
course_group_ids = course.group_course_power(user_id)
sql =
if course_group_ids.count > 0
%Q{
SELECT count(distinct graduation_work_id) cnt FROM graduation_work_scores WHERE reviewer_role IN(1,2) AND graduation_work_id
IN(SELECT id FROM graduation_works WHERE graduation_task_id = #{self.id} AND user_id
IN(SELECT user_id FROM course_members WHERE role = 4 AND course_group_id
IN(SELECT course_group_id FROM teacher_course_groups WHERE id IN(#{course_group_ids.join(",")}))
)
)
}
else
%Q{
SELECT COUNT(distinct graduation_work_id) cnt FROM graduation_works gw
JOIN graduation_work_scores gwc ON gw.graduation_task_id = gwc.graduation_task_id
WHERE reviewer_role IN(1,2) AND gwc.graduation_task_id = #{self.id}
}
end
GraduationWorkScore.find_by_sql(sql).first.try(:cnt).to_i
end
# 任务未评数
def uncomment_count(user_id)
user_ids = course.teacher_group_user_ids user_id
self.graduation_works.where(user_id: user_ids).count - self.comment_count(user_id)
end
# 任务未提交数
def unfinished_count user_id
course_group_ids = course.group_course_power(user_id)
if course_group_ids.count > 0
sql = %Q{
SELECT count(*) cnt FROM graduation_works gw WHERE work_status = 0 AND gw.graduation_task_id = #{self.id} AND gw.user_id
IN( SELECT user_id FROM course_members WHERE role = 4 AND course_group_id
IN( SELECT course_group_id FROM teacher_course_groups WHERE id not IN(#{course_group_ids.join(",")}) )
)
}
GraduationWork.find_by_sql(sql).first.try(:cnt)
else
self.graduation_works.where(work_status: 0).count
end
end
# 任务按时提交数
def finished_count(user_id)
course = self.course
course_group_ids = course.group_course_power(user_id)
if course_group_ids.count > 0
sql = %Q{
SELECT count(*) cnt FROM graduation_works gw WHERE work_status = 1 AND gw.graduation_task_id = #{self.id} AND gw.user_id
IN( SELECT user_id FROM course_members WHERE role = 4 AND course_group_id
IN( SELECT course_group_id FROM teacher_course_groups WHERE id IN(#{course_group_ids.join(",")}) )
)
}
GraduationWork.find_by_sql(sql).first.try(:cnt)
else
self.graduation_works.where(work_status: 1).count
end
end
def delay_finished_count(user_id)
course = self.course
course_group_ids = course.group_course_power(user_id)
if course_group_ids.count > 0
sql = %Q{
SELECT count(*) cnt FROM graduation_works gw WHERE work_status = 2 AND gw.graduation_task_id = #{self.id} AND gw.user_id
IN( SELECT user_id FROM course_members WHERE role = 4 AND course_group_id
IN( SELECT course_group_id FROM teacher_course_groups WHERE id IN(#{course_group_ids.join(",")}) )
)
}
GraduationWork.find_by_sql(sql).first.try(:cnt)
else
self.graduation_works.where(work_status: 2).count
end
end
# 是否具有分组
def have_grouping?
self.task_type == 2
end
end