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

175 lines
6.4 KiB

6 years ago
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 != 1") }
has_many :graduation_work_scores
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