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