diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 97d176844..e27d8c026 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -1373,21 +1373,34 @@ class CoursesController < ApplicationController #统计 def course_statistics @left_nav_type = 10 - # @order = params[:order] ? params[:order] : 'desc' - # if !params[:tab] || params[:tab] == "activity" - # @type = params[:type] ? params[:type] : 'act_score' - # sql = "SELECT (message_num*2 + message_reply_num*1 + news_reply_num*1 + news_num*1 + resource_num*5 + journal_num*1 + homework_journal_num*1) AS act_score, - # message_num, message_reply_num, news_reply_num, news_num, resource_num, journal_num, homework_journal_num, ccs.user_id FROM course_contributor_scores ccs - # JOIN students_for_courses ON students_for_courses.course_id = ccs.course_id AND students_for_courses.student_id = ccs.user_id - # WHERE ccs.course_id = #{@course.id} HAVING act_score != 0 ORDER BY #{@type} #{@order}, act_score #{@order}" - # @members = CourseContributorScore.find_by_sql(sql) - # end - # - # @limit = 20 - # @page = params[:page].nil? ? 1 : params['page'].to_i - # @members_count = @members.count - # @mem_pages = Paginator.new @members_count, @limit, @page - # @members = paginateHelper @members, @limit + @order = params[:order] ? params[:order] : 'desc' + @tab = params[:tab] ? params[:tab].to_i : nil + if !params[:tab] || params[:tab] == "1" + @type = params[:type] ? params[:type] : 'act_score' + sql = "SELECT (message_num*2 + message_reply_num*1 + news_reply_num*1 + news_num*1 + resource_num*5 + journal_num*1 + homework_journal_num*1) AS act_score, + message_num, message_reply_num, news_reply_num, news_num, resource_num, journal_num, homework_journal_num, ccs.user_id FROM course_contributor_scores ccs + JOIN students_for_courses ON students_for_courses.course_id = ccs.course_id AND students_for_courses.student_id = ccs.user_id + WHERE ccs.course_id = #{@course.id} HAVING act_score != 0 ORDER BY #{@type} #{@order}, act_score #{@order}" + @members = CourseContributorScore.find_by_sql(sql) + + elsif params[:tab] == "2" + @type = params[:type] ? params[:type] : 'total_score' + @members = @course.course_homework_statisticss.reorder("#{@type} #{@order}, total_score #{@order}") + + elsif params[:tab] == "3" + @type = params[:type] ? params[:type] : 'project_act_score' + sql = "SELECT (IFNULL(changeset_num, 0)*4 + issue_num*4 + issue_journal_num*1 + attach_num*5 + board_num*2 + board_message_num*1) AS project_act_score, + changeset_num, issue_num, issue_journal_num, attach_num, board_num, board_message_num, pss.project_id FROM project_scores pss + JOIN student_work_projects ON student_work_projects.project_id = pss.project_id AND student_work_projects.course_id = #{@course.id} + GROUP BY pss.project_id ORDER BY #{@type} #{@order}, project_act_score #{@order}" + @members = ProjectScore.find_by_sql(sql) + end + + @limit = 20 + @page = params[:page].nil? ? 1 : params['page'].to_i + @members_count = @members.count + @mem_pages = Paginator.new @members_count, @limit, @page + @members = paginateHelper @members, @limit respond_to do |format| format.js format.html {render :layout => 'base_courses'} diff --git a/app/controllers/homework_common_controller.rb b/app/controllers/homework_common_controller.rb index 083b5bb5e..d5511cb44 100644 --- a/app/controllers/homework_common_controller.rb +++ b/app/controllers/homework_common_controller.rb @@ -97,6 +97,9 @@ class HomeworkCommonController < ApplicationController st.late_penalty = @homework.late_penalty st.work_status = 2 st.save + #更新CourseHomeworkStatistics中学生的迟交作品数 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, st.user_id) + course_statistics.update_attribute('late_commit_work_num', course_statistics.late_commit_work_num + 1) if course_statistics end end else @@ -105,6 +108,9 @@ class HomeworkCommonController < ApplicationController st.late_penalty = 0 st.work_status = 1 st.save + #更新CourseHomeworkStatistics中学生的迟交作品数 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, st.user_id) + course_statistics.update_attribute('late_commit_work_num', (course_statistics.late_commit_work_num - 1) < 0 ? 0 : (course_statistics.late_commit_work_num - 1)) if course_statistics end end end @@ -134,9 +140,22 @@ class HomeworkCommonController < ApplicationController end status = false - if @homework.publish_time <= Date.today && homework_detail_manual.comment_status == 0 + if @homework.publish_time > Date.today && homework_detail_manual.comment_status == 1 + homework_detail_manual.comment_status = 0 + @homework.student_works.destroy_all + #更新CourseHomeworkStatistics中每个学生的未交作品数 + @homework.course.student.each do |student| + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, student.student_id) + course_statistics.update_attribute('un_commit_work_num', (course_statistics.un_commit_work_num - 1) < 0 ? 0 : (course_statistics.un_commit_work_num - 1)) if course_statistics + end + elsif @homework.publish_time <= Date.today && homework_detail_manual.comment_status == 0 homework_detail_manual.comment_status = 1 status = true + #更新CourseHomeworkStatistics中每个学生的未交作品数 + @homework.course.student.each do |student| + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, student.student_id) + course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics + end end eval_start = homework_detail_manual.evaluation_start if eval_start.nil? || (eval_start <= @homework.end_time && homework_detail_manual.comment_status <= 1) @@ -216,6 +235,36 @@ class HomeworkCommonController < ApplicationController def destroy if @homework.destroy + #更新CourseHomeworkStatistics中每个学生的未交作品数、已交作品数、迟交作品数 + hw_count = @course.homework_commons.includes(:homework_detail_manual).where("homework_detail_manuals.comment_status > 0").count + homework_ids = @course.homework_commons.empty? ? "(-1)" : "(" + @course.homework_commons.map{|hw| hw.id}.join(",") + ")" + student_works = StudentWork.where("homework_common_id in #{homework_ids} and work_status !=0") + is_eva_homeworks = @course.homework_commons.includes(:homework_detail_manual).where("homework_commons.anonymous_comment = 0 and homework_detail_manuals.comment_status = 2") + is_eva_student_works = StudentWork.where(:homework_common_id => is_eva_homeworks.map{|hw| hw.id}) + has_eva_homeworks = @course.homework_commons.includes(:homework_detail_manual).where("homework_commons.anonymous_comment = 0 and homework_detail_manuals.comment_status = 3") + has_eva_student_works = StudentWork.where(:homework_common_id => has_eva_homeworks.map{|hw| hw.id}) + @course.student.each do |student| + user = student.student + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, student.student_id) + if user && course_statistics + committed_work_num = user.student_works.where("homework_common_id in #{homework_ids} and work_status != 0").count + un_commit_work_num = (hw_count - committed_work_num) < 0 ? 0 : (hw_count - committed_work_num) + late_commit_work_num = user.student_works.where("homework_common_id in #{homework_ids} and work_status = 2").count + absence_evaluation_work_num = user.student_works_evaluation_distributions.where(:student_work_id => has_eva_student_works.map(&:id)).count - + user.student_works_scores.where(:reviewer_role => 3, :student_work_id => has_eva_student_works.map(&:id)).group_by(&:student_work_id).count + absence_evaluation_work_num = absence_evaluation_work_num < 0 ? 0 : absence_evaluation_work_num + un_evaluation_work_num = user.student_works_evaluation_distributions.where(:student_work_id => is_eva_student_works.map(&:id)).count - + user.student_works_scores.where(:reviewer_role => 3, :student_work_id => is_eva_student_works.map(&:id)).group_by(&:student_work_id).count + un_evaluation_work_num = un_evaluation_work_num < 0 ? 0 : un_evaluation_work_num + appeal_num = user.student_works_scores.where(:student_work_id => student_works.map(&:id), :appeal_status => 3).count + average_score = user.student_works.where(:id => student_works.map(&:id)).select("AVG(student_works.work_score) as score").first ? user.student_works.where(:id => student_works.map(&:id)).select("AVG(student_works.work_score) as score").first.score : 0 + total_score = user.student_works.where(:id => student_works.map(&:id)).select("SUM(student_works.work_score) as score").first ? user.student_works.where(:id => student_works.map(&:id)).select("SUM(student_works.work_score) as score").first.score : 0 + course_statistics.update_attributes(:committed_work_num => committed_work_num, :un_commit_work_num => un_commit_work_num, + :late_commit_work_num => late_commit_work_num, :absence_evaluation_work_num => absence_evaluation_work_num, :un_evaluation_work_num => un_evaluation_work_num, + :appeal_num => appeal_num, :average_score => average_score, :total_score => total_score) + end + end + respond_to do |format| format.html { @hw_status = params[:hw_status].to_i @@ -272,6 +321,10 @@ class HomeworkCommonController < ApplicationController student_works_evaluation_distributions = StudentWorksEvaluationDistribution.new(user_id: pro_work.user_id, student_work_id: h.id) student_works_evaluation_distributions.save end + + #更新CourseHomeworkStatistics中该学生的待匿评数 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, pro_work.user_id) + course_statistics.update_attribute('un_evaluation_work_num', course_statistics.un_evaluation_work_num + n) if course_statistics end else student_works.each_with_index do |work, index| @@ -283,6 +336,10 @@ class HomeworkCommonController < ApplicationController student_works_evaluation_distributions = StudentWorksEvaluationDistribution.new(user_id: user.id, student_work_id: h.id) student_works_evaluation_distributions.save end + + #更新CourseHomeworkStatistics中该学生的待匿评数 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, user.id) + course_statistics.update_attribute('un_evaluation_work_num', course_statistics.un_evaluation_work_num + n) if course_statistics end end @homework_detail_manual.update_column('comment_status', 2) @@ -315,6 +372,11 @@ class HomeworkCommonController < ApplicationController absence_penalty_count = student_work.user.student_works_evaluation_distributions.where("student_work_id IN #{work_ids}").count - student_work.user.student_works_scores.where("student_work_id IN #{work_ids} and reviewer_role = 3").count student_work.absence_penalty = absence_penalty_count > 0 ? absence_penalty_count * @homework_detail_manual.absence_penalty : 0 student_work.save + + #更新CourseHomeworkStatistics中该学生的待匿评数和缺评数 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, student_work.user_id) + course_statistics.update_attribute('un_evaluation_work_num', (course_statistics.un_evaluation_work_num - absence_penalty_count) < 0 ? 0 : (course_statistics.un_evaluation_work_num - absence_penalty_count)) if course_statistics + course_statistics.update_attribute('absence_evaluation_work_num', course_statistics.absence_evaluation_work_num + absence_penalty_count) if course_statistics end # 未参与匿评的缺评计算 diff --git a/app/controllers/student_work_controller.rb b/app/controllers/student_work_controller.rb index 1a9056c0b..d43625de8 100644 --- a/app/controllers/student_work_controller.rb +++ b/app/controllers/student_work_controller.rb @@ -607,11 +607,20 @@ class StudentWorkController < ApplicationController anon_count = all_dis_eva.count / has_sw_count student_work.absence_penalty = @homework.homework_detail_manual.absence_penalty * anon_count end + + #更新CourseHomeworkStatistics中学生的迟交作品数 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, User.current.id) + course_statistics.update_attribute('late_commit_work_num', course_statistics.late_commit_work_num + 1) if course_statistics else student_work.late_penalty = 0 student_work.work_status = 1 end if student_work.save + #更新CourseHomeworkStatistics中学生的未交作品数、已交作品数 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, User.current.id) + course_statistics.update_attribute('committed_work_num', course_statistics.committed_work_num + 1) if course_statistics + course_statistics.update_attribute('un_commit_work_num', (course_statistics.un_commit_work_num - 1) < 0 ? 0 : (course_statistics.un_commit_work_num - 1)) if course_statistics + if @homework.homework_type == 3 if @homework.homework_detail_group.base_on_project == 1 @student_work_project.student_work_id = student_work.id @@ -627,6 +636,14 @@ class StudentWorkController < ApplicationController stu_project = StudentWorkProject.new(:homework_common_id => @homework.id, :student_work_id => student_work.id, :project_id => stu_work.project_id == 0 ? -1 : stu_work.project_id, :user_id => members[i].to_i, :is_leader => 0, :course_id => @homework.course_id) stu_project.save end + + #更新CourseHomeworkStatistics中学生的未交作品数、已交作品数、迟交作品数 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, members[i].to_i) + course_statistics.update_attribute('committed_work_num', course_statistics.committed_work_num + 1) if course_statistics + course_statistics.update_attribute('un_commit_work_num', (course_statistics.un_commit_work_num - 1) < 0 ? 0 : (course_statistics.un_commit_work_num - 1)) if course_statistics + if student_work.work_status == 2 + course_statistics.update_attribute('late_commit_work_num', course_statistics.late_commit_work_num + 1) if course_statistics + end end end @homework.update_column(:updated_at, Time.now) @@ -676,6 +693,14 @@ class StudentWorkController < ApplicationController student_work_projects = @homework.student_work_projects.where("student_work_id=? and is_leader =?",@work.id,0) user_ids = student_work_projects.empty? ? "(-1)" : "(" + student_work_projects.map{|stu|stu.user_id}.join(",") + ")" student_works = @homework.student_works.where("user_id in #{user_ids}") + student_works.each do |sw| + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, sw.user_id) + if @work.work_status == 2 + course_statistics.update_attribute('late_commit_work_num', (course_statistics.late_commit_work_num - 1) < 0 ? 0 : (course_statistics.late_commit_work_num - 1)) if course_statistics + end + course_statistics.update_attribute('committed_work_num', (course_statistics.committed_work_num - 1) < 0 ? 0 : (course_statistics.committed_work_num - 1)) if course_statistics + course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics + end student_works.delete_all student_work_projects.delete_all members = params[:group_member_ids].split(',') @@ -685,6 +710,14 @@ class StudentWorkController < ApplicationController stu_project = StudentWorkProject.new(:homework_common_id => @homework.id, :student_work_id => @work.id, :project_id => stu_work.project_id == 0 ? -1 : stu_work.project_id, :user_id => members[i].to_i, :is_leader => 0, :course_id => @homework.course_id) stu_project.save end + + #更新CourseHomeworkStatistics中学生的未交作品数、已交作品数、迟交作品数 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, members[i].to_i) + course_statistics.update_attribute('committed_work_num', course_statistics.committed_work_num + 1) if course_statistics + course_statistics.update_attribute('un_commit_work_num', (course_statistics.un_commit_work_num - 1) < 0 ? 0 : (course_statistics.un_commit_work_num - 1)) if course_statistics + if @work.work_status == 2 + course_statistics.update_attribute('late_commit_work_num', course_statistics.late_commit_work_num + 1) if course_statistics + end end end @@ -736,6 +769,16 @@ class StudentWorkController < ApplicationController pros = @work.student_work_projects.where("is_leader = 0") user_ids = pros.empty? ? "(-1)" : "(" + pros.map{|stu|stu.user_id}.join(",") + ")" student_works = @homework.student_works.where("user_id in #{user_ids}") + + #更新CourseHomeworkStatistics中每个学生的未交作品数、已交作品数、迟交作品数 + student_works.each do |sw| + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, sw.user_id) + if @work.work_status == 2 + course_statistics.update_attribute('late_commit_work_num', (course_statistics.late_commit_work_num - 1) < 0 ? 0 : (course_statistics.late_commit_work_num - 1)) if course_statistics + end + course_statistics.update_attribute('committed_work_num', (course_statistics.committed_work_num - 1) < 0 ? 0 : (course_statistics.committed_work_num - 1)) if course_statistics + course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics + end student_works.delete_all pros.delete_all @@ -747,6 +790,14 @@ class StudentWorkController < ApplicationController end @work.destroy else + #更新CourseHomeworkStatistics中学生的已交作品数、迟交作品数 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, @work.user_id) + if @work.work_status == 2 + course_statistics.update_attribute('late_commit_work_num', (course_statistics.late_commit_work_num - 1) < 0 ? 0 : (course_statistics.late_commit_work_num - 1)) if course_statistics + end + course_statistics.update_attribute('committed_work_num', (course_statistics.committed_work_num - 1) < 0 ? 0 : (course_statistics.committed_work_num - 1)) if course_statistics + course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics + @work.attachments.destroy_all @work.student_works_scores.destroy_all @work.course_messages.destroy_all @@ -762,20 +813,44 @@ class StudentWorkController < ApplicationController end def delete_work - @work = StudentWork.where("user_id =? and homework_common_id =?", User.current.id, @homework.id).first + @work = StudentWork.where("user_id =? and homework_common_id =? and work_status != 0", User.current.id, @homework.id).first if @work - @work.destroy - if @homework.homework_type == 3 && @homework.homework_detail_group.base_on_project == 1 + if @homework.homework_type == 3 pros = @work.student_work_projects.where("is_leader = 0") - pros.each do |pro| - pro.destroy + user_ids = pros.empty? ? "(-1)" : "(" + pros.map{|stu|stu.user_id}.join(",") + ")" + student_works = @homework.student_works.where("user_id in #{user_ids}") + + #更新CourseHomeworkStatistics中每个学生的已交作品数、迟交作品数 + student_works.each do |sw| + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, sw.user_id) + if @work.work_status == 2 + course_statistics.update_attribute('late_commit_work_num', (course_statistics.late_commit_work_num - 1) < 0 ? 0 : (course_statistics.late_commit_work_num - 1)) if course_statistics + end + course_statistics.update_attribute('committed_work_num', (course_statistics.committed_work_num - 1) < 0 ? 0 : (course_statistics.committed_work_num - 1)) if course_statistics + course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics end + student_works.delete_all + pros.delete_all + project = @work.student_work_projects.where("is_leader = 1").first - project.update_attributes(:student_work_id => nil) - elsif @homework.homework_type == 3 && @homework.homework_detail_group.base_on_project == 0 - @work.student_work_projects.each do |pro2| - pro2.destroy + if @homework.homework_detail_group.base_on_project == 1 + project.update_attributes(:student_work_id => nil) + else + project.destroy end + @work.destroy + else + #更新CourseHomeworkStatistics中学生的已交作品数、迟交作品数 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, @work.user_id) + if @work.work_status == 2 + course_statistics.update_attribute('late_commit_work_num', (course_statistics.late_commit_work_num - 1) < 0 ? 0 : (course_statistics.late_commit_work_num - 1)) if course_statistics + end + course_statistics.update_attribute('committed_work_num', (course_statistics.committed_work_num - 1) < 0 ? 0 : (course_statistics.committed_work_num - 1)) if course_statistics + course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics + + @work.update_attributes(:work_status => 0, :name => "#{@homework.name}的作品提交", :description => nil, :late_penalty => 0, :commit_time => nil, :project_id => 0) + @work.attachments.destroy_all + @work.course_messages.destroy_all end end redirect_to student_work_index_path(:homework => @homework.id) @@ -786,6 +861,16 @@ class StudentWorkController < ApplicationController pros = @work.student_work_projects.where("is_leader = 0") user_ids = pros.empty? ? "(-1)" : "(" + pros.map{|stu|stu.user_id}.join(",") + ")" student_works = @homework.student_works.where("user_id in #{user_ids}") + + #更新CourseHomeworkStatistics中每个学生的已交作品数、迟交作品数 + student_works.each do |sw| + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, sw.user_id) + if @work.work_status == 2 + course_statistics.update_attribute('late_commit_work_num', (course_statistics.late_commit_work_num - 1) < 0 ? 0 : (course_statistics.late_commit_work_num - 1)) if course_statistics + end + course_statistics.update_attribute('committed_work_num', (course_statistics.committed_work_num - 1) < 0 ? 0 : (course_statistics.committed_work_num - 1)) if course_statistics + course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics + end student_works.delete_all pros.delete_all @@ -797,6 +882,14 @@ class StudentWorkController < ApplicationController end @work.destroy else + #更新CourseHomeworkStatistics中学生的已交作品数、迟交作品数 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, @work.user_id) + if @work.work_status == 2 + course_statistics.update_attribute('late_commit_work_num', (course_statistics.late_commit_work_num - 1) < 0 ? 0 : (course_statistics.late_commit_work_num - 1)) if course_statistics + end + course_statistics.update_attribute('committed_work_num', (course_statistics.committed_work_num - 1) < 0 ? 0 : (course_statistics.committed_work_num - 1)) if course_statistics + course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics + @work.update_attributes(:work_status => 0, :name => "#{@homework.name}的作品提交", :description => nil, :late_penalty => 0, :commit_time => nil, :project_id => 0) @work.attachments.destroy_all @work.course_messages.destroy_all @@ -835,6 +928,10 @@ class StudentWorkController < ApplicationController @new_score.student_work_id = @work.id if @is_teacher && !@new_score.score.nil? && @work.work_status == 0 @work.update_attributes(:work_status => 1, :commit_time => Time.now) + #更新CourseHomeworkStatistics中学生的已交作品数、未交作品数 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, @work.user_id) + course_statistics.update_attribute('committed_work_num', course_statistics.committed_work_num + 1) if course_statistics + course_statistics.update_attribute('un_commit_work_num', (course_statistics.un_commit_work_num - 1) < 0 ? 0 : (course_statistics.un_commit_work_num - 1)) if course_statistics end if User.current.admin? @new_score.reviewer_role = 1 @@ -884,7 +981,13 @@ class StudentWorkController < ApplicationController if @is_group_leader add_score_to_member @work, @homework, @new_score end - end + + #更新CourseHomeworkStatistics中该学生的待匿评数, 只计算第一次评分 + if User.current.student_works_scores.where(:student_work_id => @work.id, :reviewer_role => 3).count == 1 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, student_work.user_id) + course_statistics.update_attribute('un_evaluation_work_num', (course_statistics.un_evaluation_work_num - 1) < 0 ? 0 : (course_statistics.un_evaluation_work_num - 1)) if course_statistics + end + end @homework.update_column('updated_at', Time.now) update_course_activity(@homework.class,@homework.id) update_user_activity(@homework.class,@homework.id) @@ -1178,11 +1281,18 @@ class StudentWorkController < ApplicationController score_appeal.applied_messages.update_all(:status => params[:status].to_i == 2 ? 3 : (params[:status].to_i == 3 ? 1 : 2)) if params[:status].to_i == 3 || params[:status].to_i == 4 homework = @student_work_score.student_work.homework_common + course = homework.course if params[:status].to_i == 3 # 申诉成功后 扣匿评学生的违规匿评扣分 sw = homework.student_works.where("user_id = #{@student_work_score.user_id}").first sw.update_attribute("appeal_penalty", homework.homework_detail_manual.appeal_penalty + sw.appeal_penalty) + #申诉成功,匿评学生的被申诉记录加一 + course_homework_statistics = CourseHomeworkStatistics.where(:user_id => @student_work_score.user_id, :course_id => course.id).first + if course_homework_statistics + course_homework_statistics.update_attribute('appeal_num', course_homework_statistics.appeal_num + 1) + end + # 申诉成功 重新计算申诉者的匿评分 work = @student_work_score.student_work if work.student_works_scores.where("reviewer_role = 3 AND appeal_status != 3").count > 0 @@ -1193,7 +1303,6 @@ class StudentWorkController < ApplicationController end @student_work_score.student_work.save end - course = homework.course CourseMessage.create(:user_id => @student_work_score.user_id, :course_id => course.id, :viewed => false,:course_message_id=> score_appeal.id,:course_message_type=>'StudentWorksScoresAppeal',:status=>params[:status].to_i,:apply_result =>User.current.id) CourseMessage.create(:user_id => score_appeal.user_id, :course_id => course.id, :viewed => false,:course_message_id=> score_appeal.id,:course_message_type=>'StudentWorksScoresAppeal',:status=>params[:status].to_i,:apply_result =>User.current.id) end @@ -1368,6 +1477,14 @@ class StudentWorkController < ApplicationController stu_project = StudentWorkProject.new(:homework_common_id => @homework.id, :student_work_id => student_work.id, :project_id => stu_work.project_id == 0 ? -1 : stu_work.project_id, :user_id => params[:member_id][i].to_i, :is_leader => 0, :course_id => @homework.course_id) stu_project.save end + + #更新CourseHomeworkStatistics中学生的未交作品数、已交作品数、迟交作品数 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, params[:member_id][i].to_i) + course_statistics.update_attribute('committed_work_num', course_statistics.committed_work_num + 1) if course_statistics + course_statistics.update_attribute('un_commit_work_num', (course_statistics.un_commit_work_num - 1) < 0 ? 0 : (course_statistics.un_commit_work_num - 1)) if course_statistics + if student_work.work_status == 2 + course_statistics.update_attribute('late_commit_work_num', course_statistics.late_commit_work_num + 1) if course_statistics + end end end @@ -1378,6 +1495,14 @@ class StudentWorkController < ApplicationController work = StudentWork.where("homework_common_id = #{@homework.id} and user_id = #{sp.user_id}").first sp.destroy if work + #更新CourseHomeworkStatistics中学生的未交作品数、已交作品数、迟交作品数 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, work.user_id) + if student_work.work_status == 2 + course_statistics.update_attribute('late_commit_work_num', (course_statistics.late_commit_work_num - 1) < 0 ? 0 : (course_statistics.late_commit_work_num - 1)) if course_statistics + end + course_statistics.update_attribute('committed_work_num', (course_statistics.committed_work_num - 1) < 0 ? 0 : (course_statistics.committed_work_num - 1)) if course_statistics + course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics + work.destroy end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 056d6404d..d040a2a64 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1373,6 +1373,12 @@ class UsersController < ApplicationController homework_detail_manual.comment_status = 0 else homework_detail_manual.comment_status = 1 + + #更新CourseHomeworkStatistics中每个学生的未交作品数 + homework.course.student.each do |student| + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(homework.course_id, student.student_id) + course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics + end end homework_detail_manual.evaluation_start = params[:evaluation_start].blank? ? homework.end_time + 7 : params[:evaluation_start] homework_detail_manual.evaluation_end = params[:evaluation_end].blank? ? homework_detail_manual.evaluation_start + 7 : params[:evaluation_end] diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index a7132faeb..a7cb130fb 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -324,7 +324,7 @@ module ApplicationHelper # 获取项目/课程总分 # 发布缺陷 4分 回复缺陷 1分 提交一次 4分 讨论帖子 2分 回复帖子 1分 发布新闻 1分 def static_project_score obj - score = obj.issue_num * 4 + obj.issue_journal_num + (obj.changeset_num||0) * 4 + obj.board_num * 2 + obj.board_message_num + obj.news_num + obj.attach_num * 5 + score = obj.issue_num * 4 + obj.issue_journal_num + (obj.changeset_num||0) * 4 + obj.board_num * 2 + obj.board_message_num + obj.attach_num * 5 end # 获取组织成员中文名字 diff --git a/app/models/course.rb b/app/models/course.rb index 719dd0d28..c5cf7e9a8 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -55,7 +55,7 @@ class Course < ActiveRecord::Base has_many :student_works, :through => :homework_commons, :dependent => :destroy has_many :course_groups, :dependent => :destroy - #has_many :course_homework_statistics, :dependent => :destroy + has_many :course_homework_statisticss, :dependent => :destroy # 课程动态 has_many :course_acts, :class_name => 'CourseActivity',:as =>:course_act ,:dependent => :destroy diff --git a/app/models/course_homework_statistics.rb b/app/models/course_homework_statistics.rb new file mode 100644 index 000000000..b12a42139 --- /dev/null +++ b/app/models/course_homework_statistics.rb @@ -0,0 +1,6 @@ +class CourseHomeworkStatistics < ActiveRecord::Base + # attr_accessible :title, :body + + belongs_to :user + belongs_to :course +end diff --git a/app/models/student_work.rb b/app/models/student_work.rb index 7527cb873..daeb0b207 100644 --- a/app/models/student_work.rb +++ b/app/models/student_work.rb @@ -19,6 +19,7 @@ class StudentWork < ActiveRecord::Base before_destroy :delete_praise before_save :set_program_score, :set_src + after_save :update_avg_sum_score after_create :act_as_message acts_as_attachable @@ -173,6 +174,20 @@ class StudentWork < ActiveRecord::Base end end + #更新course_homework_statistics中的avg_score和total_score + def update_avg_sum_score + course_homework_statistics = CourseHomeworkStatistics.where(:user_id => self.user_id, :course_id => self.homework_common.course_id).first + if course_homework_statistics + course = self.homework_common.course + homework_ids = course.homework_commons.empty? ? "(-1)" : "(" + course.homework_commons.map{|hw| hw.id}.join(",") + ")" + student_works = StudentWork.where("homework_common_id in #{homework_ids} and work_status !=0") + user = self.user + average_score = user.student_works.where(:id => student_works.map(&:id)).select("AVG(student_works.work_score) as score").first ? user.student_works.where(:id => student_works.map(&:id)).select("AVG(student_works.work_score) as score").first.score : 0 + total_score = user.student_works.where(:id => student_works.map(&:id)).select("SUM(student_works.work_score) as score").first ? user.student_works.where(:id => student_works.map(&:id)).select("SUM(student_works.work_score) as score").first.score : 0 + course_homework_statistics.update_attributes(:average_score => average_score, :total_score => total_score) + end + end + # status == 0 : delay def act_as_message if self.work_status != 0 && self.created_at > self.homework_common.end_time + 1 diff --git a/app/models/students_for_course.rb b/app/models/students_for_course.rb index fb302ff2d..35bb6613a 100644 --- a/app/models/students_for_course.rb +++ b/app/models/students_for_course.rb @@ -40,38 +40,36 @@ class StudentsForCourse < ActiveRecord::Base #加入班级时创建一条记录 def create_course_homework_statistic - # if CourseHomeworkStatistic.where(:user_id => self.student_id, :course_id => self.course_id).count == 0 - # course = self.course - # user = self.student - # hw_count = course.homework_commons.count - # homework_ids = course.homework_commons.empty? ? "(-1)" : "(" + course.homework_commons.map{|hw| hw.id}.join(",") + ")" - # student_works = StudentWork.where("homework_common_id in #{homework_ids}") - # is_eva_homeworks = course.homework_commons.includes(:homework_detail_manual).where("homework_commons.anonymous_comment = 0 and homework_detail_manuals.comment_status = 2") - # is_eva_student_works = StudentWork.where(:homework_common_id => is_eva_homeworks.map{|hw| hw.id}) - # has_eva_homeworks = course.homework_commons.includes(:homework_detail_manual).where("homework_commons.anonymous_comment = 0 and homework_detail_manuals.comment_status = 3") - # has_eva_student_works = StudentWork.where(:homework_common_id => has_eva_homeworks.map{|hw| hw.id}) - # course.student.each do |student| - # user = student.student - # if user - # committed_work_num = user.student_works.where("homework_common_id in #{homework_ids} and work_status != 0").count - # un_commit_work_num = hw_count - committed_work_num - # late_commit_work_num = user.student_works.where("homework_common_id in #{homework_ids} and work_status = 2").count - # absence_evaluation_work_num = user.student_works_evaluation_distributions.where(:student_work_id => has_eva_student_works.map(&:id)).count - - # user.student_works_scores.where(:reviewer_role => 3, :student_work_id => has_eva_student_works.map(&:id)).group_by(&:student_work_id).count - # un_evaluation_work_num = user.student_works_evaluation_distributions.where(:student_work_id => is_eva_student_works.map(&:id)).count - - # user.student_works_scores.where(:reviewer_role => 3, :student_work_id => is_eva_student_works.map(&:id)).group_by(&:student_work_id).count - # appeal_num = user.student_works_scores.where(:student_work_id => student_works.map(&:id), :appeal_status => 3).count - # average_score = user.student_works.where(:id => student_works.map(&:id)).select("AVG(student_works.work_score) as score").first ? user.student_works.where(:id => student_works.map(&:id)).select("SUM(student_works.work_score) as score").first.score : 0 - # total_score = user.student_works.where(:id => student_works.map(&:id)).select("SUM(student_works.work_score) as score").first ? user.student_works.where(:id => student_works.map(&:id)).select("SUM(student_works.work_score) as score").first.score : 0 - # CourseHomeworkStatistic.create(:course_id => course.id, :user_id => user.id, :committed_work_num => committed_work_num, :un_commit_work_num => un_commit_work_num, - # :late_commit_work_num => late_commit_work_num, :absence_evaluation_work_num => absence_evaluation_work_num, :un_evaluation_work_num => un_evaluation_work_num, - # :appeal_num => appeal_num, :average_score => average_score, :total_score => total_score) - # end - # end - # end + if CourseHomeworkStatistic.where(:user_id => self.student_id, :course_id => self.course_id).count == 0 + course = self.course + user = self.student + hw_count = course.homework_commons.includes(:homework_detail_manual).where("homework_detail_manuals.comment_status > 0").count + homework_ids = course.homework_commons.empty? ? "(-1)" : "(" + course.homework_commons.map{|hw| hw.id}.join(",") + ")" + student_works = StudentWork.where("homework_common_id in #{homework_ids} and work_status !=0") + is_eva_homeworks = course.homework_commons.includes(:homework_detail_manual).where("homework_commons.anonymous_comment = 0 and homework_detail_manuals.comment_status = 2") + is_eva_student_works = StudentWork.where(:homework_common_id => is_eva_homeworks.map{|hw| hw.id}) + has_eva_homeworks = course.homework_commons.includes(:homework_detail_manual).where("homework_commons.anonymous_comment = 0 and homework_detail_manuals.comment_status = 3") + has_eva_student_works = StudentWork.where(:homework_common_id => has_eva_homeworks.map{|hw| hw.id}) + + committed_work_num = user.student_works.where("homework_common_id in #{homework_ids} and work_status != 0").count + un_commit_work_num = (hw_count - committed_work_num) < 0 ? 0 : (hw_count - committed_work_num) + late_commit_work_num = user.student_works.where("homework_common_id in #{homework_ids} and work_status = 2").count + absence_evaluation_work_num = user.student_works_evaluation_distributions.where(:student_work_id => has_eva_student_works.map(&:id)).count - + user.student_works_scores.where(:reviewer_role => 3, :student_work_id => has_eva_student_works.map(&:id)).group_by(&:student_work_id).count + absence_evaluation_work_num = absence_evaluation_work_num < 0 ? 0 : absence_evaluation_work_num + un_evaluation_work_num = user.student_works_evaluation_distributions.where(:student_work_id => is_eva_student_works.map(&:id)).count - + user.student_works_scores.where(:reviewer_role => 3, :student_work_id => is_eva_student_works.map(&:id)).group_by(&:student_work_id).count + un_evaluation_work_num = un_evaluation_work_num < 0 ? 0 : un_evaluation_work_num + appeal_num = user.student_works_scores.where(:student_work_id => student_works.map(&:id), :appeal_status => 3).count + average_score = user.student_works.where(:id => student_works.map(&:id)).select("AVG(student_works.work_score) as score").first ? user.student_works.where(:id => student_works.map(&:id)).select("AVG(student_works.work_score) as score").first.score : 0 + total_score = user.student_works.where(:id => student_works.map(&:id)).select("SUM(student_works.work_score) as score").first ? user.student_works.where(:id => student_works.map(&:id)).select("SUM(student_works.work_score) as score").first.score : 0 + CourseHomeworkStatistic.create(:course_id => course.id, :user_id => user.id, :committed_work_num => committed_work_num, :un_commit_work_num => un_commit_work_num, + :late_commit_work_num => late_commit_work_num, :absence_evaluation_work_num => absence_evaluation_work_num, :un_evaluation_work_num => un_evaluation_work_num, + :appeal_num => appeal_num, :average_score => average_score, :total_score => total_score) + end end def delete_course_homework_statistic - #CourseHomeworkStatistic.where(:user_id => self.student_id, :course_id => self.course_id).destroy_all + CourseHomeworkStatistic.where(:user_id => self.student_id, :course_id => self.course_id).destroy_all end end diff --git a/app/models/user.rb b/app/models/user.rb index a50c90080..d801ecd9e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -183,7 +183,7 @@ class User < Principal # 课程贡献榜 has_many :course_contributor_scores, :dependent => :destroy - #has_many :course_homework_statistics, :dependent => :destroy + has_many :course_homework_statisticss, :dependent => :destroy ######added by nie has_many :project_infos, :dependent => :destroy diff --git a/app/views/contestant_works/_contest_evaluation_group_work.html.erb b/app/views/contestant_works/_contest_evaluation_group_work.html.erb index b4ce3b3b5..dcbfa06ac 100644 --- a/app/views/contestant_works/_contest_evaluation_group_work.html.erb +++ b/app/views/contestant_works/_contest_evaluation_group_work.html.erb @@ -37,7 +37,7 @@

= <%= (project_score.changeset_num||0) * 4 %> + <%= project_score.issue_num * 4 + project_score.issue_journal_num %> + <%= project_score.attach_num * 5 %> - + <%= project_score.board_num * 2 + project_score.board_message_num + project_score.news_num %>

+ + <%= project_score.board_num * 2 + project_score.board_message_num %>

<% end %> diff --git a/app/views/contestant_works/_contest_evaluation_un_group_work.html.erb b/app/views/contestant_works/_contest_evaluation_un_group_work.html.erb index b75319ae3..9a89110b3 100644 --- a/app/views/contestant_works/_contest_evaluation_un_group_work.html.erb +++ b/app/views/contestant_works/_contest_evaluation_un_group_work.html.erb @@ -37,7 +37,7 @@

= <%= (project_score.changeset_num||0) * 4 %> + <%= project_score.issue_num * 4 + project_score.issue_journal_num %> + <%= project_score.attach_num * 5 %> - + <%= project_score.board_num * 2 + project_score.board_message_num + project_score.news_num %>

+ + <%= project_score.board_num * 2 + project_score.board_message_num %>

<% end %> diff --git a/app/views/courses/_hero_table.html.erb b/app/views/courses/_hero_table.html.erb new file mode 100644 index 000000000..0e4ce2a8a --- /dev/null +++ b/app/views/courses/_hero_table.html.erb @@ -0,0 +1,92 @@ +<% if @members.count != 0 %> + + + + + + + + + + + + + + + <% boo = !(User.current.allowed_to?(:as_teacher,@course) || User.current.admin?) && course_has_score_open_common_homework(@course) %> + <% @members.each do |member| %> + <% is_hidden = boo && User.current.id != member.user_id %> + + + + + + + + + + + <% end %> + +
姓名 + <%= link_to '已交作品', course_statistics_course_path(@course, :tab => 2, :type => 'committed_work_num', :order => (@order == "desc" ? "asc" : "desc")), method: 'get', remote: true, :style => 'color:#000000;'%> + <% if @type == "committed_work_num" && @order == 'desc' %> + + <% elsif @type == "committed_work_num" && @order == 'asc' %> + + <% end %> + + <%= link_to '未交作品', course_statistics_course_path(@course, :tab => 2, :type => 'un_commit_work_num', :order => (@order == "desc" ? "asc" : "desc")), method: 'get', remote: true, :style => 'color:#000000;'%> + <% if @type == "un_commit_work_num" && @order == 'desc' %> + + <% elsif @type == "un_commit_work_num" && @order == 'asc' %> + + <% end %> + + <%= link_to '迟交作品', course_statistics_course_path(@course, :tab => 2, :type => 'late_commit_work_num', :order => (@order == "desc" ? "asc" : "desc")), method: 'get', remote: true, :style => 'color:#000000;'%> + <% if @type == "late_commit_work_num" && @order == 'desc' %> + + <% elsif @type == "late_commit_work_num" && @order == 'asc' %> + + <% end %> + + <%= link_to '匿评缺评', course_statistics_course_path(@course, :tab => 2, :type => 'absence_evaluation_work_num', :order => (@order == "desc" ? "asc" : "desc")), method: 'get', remote: true, :style => 'color:#000000;'%> + <% if @type == "absence_evaluation_work_num" && @order == 'desc' %> + + <% elsif @type == "absence_evaluation_work_num" && @order == 'asc' %> + + <% end %> + + <%= link_to '被申诉', course_statistics_course_path(@course, :tab => 2, :type => 'appeal_num', :order => (@order == "desc" ? "asc" : "desc")), method: 'get', remote: true, :style => 'color:#000000;'%> + <% if @type == "appeal_num" && @order == 'desc' %> + + <% elsif @type == "appeal_num" && @order == 'asc' %> + + <% end %> + + <%= link_to '平均分', course_statistics_course_path(@course, :tab => 2, :type => 'average_score', :order => (@order == "desc" ? "asc" : "desc")), method: 'get', remote: true, :style => 'color:#000000;'%> + <% if @type == "average_score" && @order == 'desc' %> + + <% elsif @type == "average_score" && @order == 'asc' %> + + <% end %> + + <%= link_to '英雄榜', course_statistics_course_path(@course, :tab => 2, :type => 'total_score', :order => (@order == "desc" ? "asc" : "desc")), method: 'get', remote: true, :style => 'color:#000000;'%> + <% if @type == "total_score" && @order == 'desc' %> + + <% elsif @type == "total_score" && @order == 'asc' %> + + <% end %> +
<%= link_to member.user.show_name, user_path(member.user), :class => 'course_class_users_st_name' %><%= member.committed_work_num %><%= member.un_commit_work_num %><%= member.late_commit_work_num %><%= member.absence_evaluation_work_num %><%= member.appeal_num %><%= is_hidden ? '**' : (member.average_score.nil? ? 0 : format("%.1f", member.average_score < 0 ? 0 : member.average_score)) %><%= is_hidden ? '**' : (member.total_score.nil? ? 0 : format("%.1f", member.total_score < 0 ? 0 : member.total_score)) %>
+
+
+ +
+
+
+<% else%> +
+

没有数据可以显示!

+<% end %> \ No newline at end of file diff --git a/app/views/courses/_project_table.html.erb b/app/views/courses/_project_table.html.erb new file mode 100644 index 000000000..0ef569f64 --- /dev/null +++ b/app/views/courses/_project_table.html.erb @@ -0,0 +1,108 @@ +<% if @members.count != 0 %> + + + + + + + + + + + + + + + <% @members.each do |member| %> + + + + + + + + + + + <% end %> + +
项目名称 + <%= link_to '发布资源', course_statistics_course_path(@course, :tab => 3, :type => 'attach_num', :order => (@order == "desc" ? "asc" : "desc")), method: 'get', remote: true, :style => 'color:#000000;'%> + <% if @type == "attach_num" && @order == 'desc' %> + + <% elsif @type == "attach_num" && @order == 'asc' %> + + <% end %> + + <%= link_to '提交次数', course_statistics_course_path(@course, :tab => 3, :type => 'changeset_num', :order => (@order == "desc" ? "asc" : "desc")), method: 'get', remote: true, :style => 'color:#000000;'%> + <% if @type == "changeset_num" && @order == 'desc' %> + + <% elsif @type == "changeset_num" && @order == 'asc' %> + + <% end %> + + <%= link_to '发布Issue', course_statistics_course_path(@course, :tab => 3, :type => 'issue_num', :order => (@order == "desc" ? "asc" : "desc")), method: 'get', remote: true, :style => 'color:#000000;'%> + <% if @type == "issue_num" && @order == 'desc' %> + + <% elsif @type == "issue_num" && @order == 'asc' %> + + <% end %> + + <%= link_to 'Issue回复', course_statistics_course_path(@course, :tab => 3, :type => 'issue_journal_num', :order => (@order == "desc" ? "asc" : "desc")), method: 'get', remote: true, :style => 'color:#000000;'%> + <% if @type == "issue_journal_num" && @order == 'desc' %> + + <% elsif @type == "issue_journal_num" && @order == 'asc' %> + + <% end %> + + <%= link_to '发布帖子', course_statistics_course_path(@course, :tab => 3, :type => 'board_num', :order => (@order == "desc" ? "asc" : "desc")), method: 'get', remote: true, :style => 'color:#000000;'%> + <% if @type == "board_num" && @order == 'desc' %> + + <% elsif @type == "board_num" && @order == 'asc' %> + + <% end %> + + <%= link_to '帖子回复', course_statistics_course_path(@course, :tab => 3, :type => 'board_message_num', :order => (@order == "desc" ? "asc" : "desc")), method: 'get', remote: true, :style => 'color:#000000;'%> + <% if @type == "board_message_num" && @order == 'desc' %> + + <% elsif @type == "board_message_num" && @order == 'asc' %> + + <% end %> + + <%= link_to '活跃度', course_statistics_course_path(@course, :tab => 3, :type => 'project_act_score', :order => (@order == "desc" ? "asc" : "desc")), method: 'get', remote: true, :style => 'color:#000000;'%> + <% if @type == "project_act_score" && @order == 'desc' %> + + <% elsif @type == "project_act_score" && @order == 'asc' %> + + <% end %> +
+ <%= link_to member.project.name, project_path(member.project_id), :class => 'new_project_title_width fl ml5' %> + <%= member.project.is_public ? '公开' : '私有' %> + <%= member.attach_num %><%= member.changeset_num || 0 %><%= member.issue_num %><%= member.issue_journal_num %><%= member.board_num %><%= member.board_message_num %> + <%= member.project_act_score %> +
+ + +

发布资源数*5=<%= member.attach_num %>*5=<%= member.attach_num.to_i * 5 %>
+ 代码提交数*2=<%= member.changeset_num %>*2=<%= member.changeset_num.to_i * 2 %>
+ 发布Issue数*1=<%= member.issue_num %>*1=<%= member.issue_num.to_i * 1 %>
+ Issue回复数*1=<%= member.issue_journal_num %>*1=<%= member.issue_journal_num.to_i * 1 %>
+ 发布帖子数*1=<%= member.board_num %>*1=<%= member.board_num.to_i * 1 %>
+ 回复帖子数*1=<%= member.board_message_num %>*1=<%= member.board_message_num.to_i * 1 %>
+ 总得分:<%= member.project_act_score %> +

+
+
+ +
+
+ +
+
+
+<% else %> +
+

没有数据可以显示!

+<% end %> \ No newline at end of file diff --git a/app/views/courses/_tool_expand.html.erb b/app/views/courses/_tool_expand.html.erb index fccf7a6cf..5d758b29c 100644 --- a/app/views/courses/_tool_expand.html.erb +++ b/app/views/courses/_tool_expand.html.erb @@ -64,9 +64,4 @@
  • <%=link_to "分班", course_member_path(@course, :role => 2) %>
  • -<% end %> -<% if show_nav?(0) %> -
  • - 统计 -
  • <% end %> \ No newline at end of file diff --git a/app/views/courses/course_statistics.html.erb b/app/views/courses/course_statistics.html.erb index ce3d65743..c4f495c75 100644 --- a/app/views/courses/course_statistics.html.erb +++ b/app/views/courses/course_statistics.html.erb @@ -1,5 +1,88 @@
    -
    -

    统计功能即将上线,届时我们一起享受教育大数据的红利吧!

    -
    -
    \ No newline at end of file +

    统计

    +
    + +
    +
    + 活跃度总分 = 资源发布数 * 权值(5分) + 发帖数 * 权值(2分) + 帖子回复数 * 权值(1分) + 通知发布数 * 权值(1分) +
    通知回复数 * 权值(1分) + 作业回复数 * 权值(1分) + 班级留言数 * 权值(1分) +
    +
    + <% if @tab.nil? || @tab == 1 %> + <%=render :partial => 'act_table' %> + <% end %> +
    + +
    + +
    +
    + 每个同学作业的得分总和 +
    +
    + <% if @tab == 2 %> + <%=render :partial => 'hero_table' %> + <% end %> +
    + +
    +
    +
    + 项目活跃度 = 发布资源数 * 权值(5分) + 代码提交数 * 权值(4分) + 发布Issue数 * 权值(4分) + Issue回复数 * 权值(1分) +
    发布帖子数 * 权值(2分) + 回复帖子数 * 权值(1分) +
    + +
    + + + + + + + + + +
    + <% if @tab == 3 %> + <%=render :partial => 'project_table' %> + <% end %> +
    +
    +
    +
    + +
    + + \ No newline at end of file diff --git a/app/views/courses/course_statistics.js.erb b/app/views/courses/course_statistics.js.erb index e79baacb2..582cd2e46 100644 --- a/app/views/courses/course_statistics.js.erb +++ b/app/views/courses/course_statistics.js.erb @@ -1,5 +1,7 @@ -<% if !params[:tab] || params[:tab] == "activity" %> +<% if !params[:tab] || params[:tab] == "1" %> $("#act_table_<%=@course.id %>").html("<%= escape_javascript(render :partial => 'act_table')%>"); -<% else %> - +<% elsif params[:tab] == "2" %> + $("#hero_table_<%=@course.id %>").html("<%= escape_javascript(render :partial => 'hero_table')%>"); +<% elsif params[:tab] == "3" %> + $("#project_table_<%=@course.id %>").html("<%= escape_javascript(render :partial => 'project_table')%>"); <% end %> \ No newline at end of file diff --git a/app/views/layouts/base_courses.html.erb b/app/views/layouts/base_courses.html.erb index 087993085..e8436b5b0 100644 --- a/app/views/layouts/base_courses.html.erb +++ b/app/views/layouts/base_courses.html.erb @@ -124,13 +124,10 @@ <%= render :partial => 'layouts/group_children_list', :locals => {:course => @course, :is_teacher => is_teacher} %> <% end %> - <% statistics_count = 0 %> - <% unless show_nav?(statistics_count) %> -
  • - 统计 - -
  • - <% end %> +
  • + 统计 + +
  • <%# 工具栏展开 %> <% if @course.homework_commons.count == 0 || @course.news.count == 0 || course_file_num == 0 || course_poll_count == 0 || @course.exercises.count == 0 || course_feedback_count == 0 || @course.exercises.count == 0 || (@course.boards.first ? @course.boards.first.topics.count : 0) == 0 || statistics_count == 0%> diff --git a/app/views/student_work/_evaluation_un_group_work.html.erb b/app/views/student_work/_evaluation_un_group_work.html.erb index 4545b16e7..78c026bad 100644 --- a/app/views/student_work/_evaluation_un_group_work.html.erb +++ b/app/views/student_work/_evaluation_un_group_work.html.erb @@ -37,7 +37,7 @@

    = <%= (project_score.changeset_num||0) * 4 %> + <%= project_score.issue_num * 4 + project_score.issue_journal_num %> + <%= project_score.attach_num * 5 %> - + <%= project_score.board_num * 2 + project_score.board_message_num + project_score.news_num %>

    + + <%= project_score.board_num * 2 + project_score.board_message_num %>

    <% end %> diff --git a/db/migrate/20170209020934_create_course_homework_statistics.rb b/db/migrate/20170209020934_create_course_homework_statistics.rb new file mode 100644 index 000000000..6214d392c --- /dev/null +++ b/db/migrate/20170209020934_create_course_homework_statistics.rb @@ -0,0 +1,53 @@ +class CreateCourseHomeworkStatistics < ActiveRecord::Migration + def change + create_table :course_homework_statistics do |t| + t.references :user + t.references :course + t.integer :committed_work_num, :default => 0 + t.integer :un_commit_work_num, :default => 0 + t.integer :late_commit_work_num, :default => 0 + t.integer :absence_evaluation_work_num, :default => 0 + t.integer :un_evaluation_work_num, :default => 0 + t.integer :appeal_num, :default => 0 + t.float :average_score, :default => 0 + t.float :total_score, :default => 0 + + t.timestamps + end + + count =Course.all.count / 30 + 2 + transaction do + for i in 1 ... count do i + Course.page(i).per(30).each do |course| + hw_count = course.homework_commons.includes(:homework_detail_manual).where("homework_detail_manuals.comment_status > 0").count + homework_ids = course.homework_commons.empty? ? "(-1)" : "(" + course.homework_commons.map{|hw| hw.id}.join(",") + ")" + student_works = StudentWork.where("homework_common_id in #{homework_ids} and work_status !=0") + is_eva_homeworks = course.homework_commons.includes(:homework_detail_manual).where("homework_commons.anonymous_comment = 0 and homework_detail_manuals.comment_status = 2") + is_eva_student_works = StudentWork.where(:homework_common_id => is_eva_homeworks.map{|hw| hw.id}) + has_eva_homeworks = course.homework_commons.includes(:homework_detail_manual).where("homework_commons.anonymous_comment = 0 and homework_detail_manuals.comment_status = 3") + has_eva_student_works = StudentWork.where(:homework_common_id => has_eva_homeworks.map{|hw| hw.id}) + course.student.each do |student| + user = student.student + if user + committed_work_num = user.student_works.where("homework_common_id in #{homework_ids} and work_status != 0").count + un_commit_work_num = (hw_count - committed_work_num) < 0 ? 0 : (hw_count - committed_work_num) + late_commit_work_num = user.student_works.where("homework_common_id in #{homework_ids} and work_status = 2").count + absence_evaluation_work_num = user.student_works_evaluation_distributions.where(:student_work_id => has_eva_student_works.map(&:id)).count - + user.student_works_scores.where(:reviewer_role => 3, :student_work_id => has_eva_student_works.map(&:id)).group_by(&:student_work_id).count + absence_evaluation_work_num = absence_evaluation_work_num < 0 ? 0 : absence_evaluation_work_num + un_evaluation_work_num = user.student_works_evaluation_distributions.where(:student_work_id => is_eva_student_works.map(&:id)).count - + user.student_works_scores.where(:reviewer_role => 3, :student_work_id => is_eva_student_works.map(&:id)).group_by(&:student_work_id).count + un_evaluation_work_num = un_evaluation_work_num < 0 ? 0 : un_evaluation_work_num + appeal_num = user.student_works_scores.where(:student_work_id => student_works.map(&:id), :appeal_status => 3).count + average_score = user.student_works.where(:id => student_works.map(&:id)).select("AVG(student_works.work_score) as score").first ? user.student_works.where(:id => student_works.map(&:id)).select("AVG(student_works.work_score) as score").first.score : 0 + total_score = user.student_works.where(:id => student_works.map(&:id)).select("SUM(student_works.work_score) as score").first ? user.student_works.where(:id => student_works.map(&:id)).select("SUM(student_works.work_score) as score").first.score : 0 + CourseHomeworkStatistics.create(:course_id => course.id, :user_id => user.id, :committed_work_num => committed_work_num, :un_commit_work_num => un_commit_work_num, + :late_commit_work_num => late_commit_work_num, :absence_evaluation_work_num => absence_evaluation_work_num, :un_evaluation_work_num => un_evaluation_work_num, + :appeal_num => appeal_num, :average_score => average_score, :total_score => total_score) + end + end + end + end + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 31a5b17d7..96c27b9cc 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20170207060207) do +ActiveRecord::Schema.define(:version => 20170209020934) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -350,16 +350,14 @@ ActiveRecord::Schema.define(:version => 20170207060207) do add_index "changeset_parents", ["parent_id"], :name => "changeset_parents_parent_ids" create_table "changesets", :force => true do |t| - t.integer "repository_id", :null => false - t.string "revision", :null => false + t.integer "repository_id", :null => false + t.string "revision", :null => false t.string "committer" - t.datetime "committed_on", :null => false + t.datetime "committed_on", :null => false t.text "comments" t.date "commit_date" t.string "scmid" t.integer "user_id" - t.integer "project_id" - t.integer "type", :default => 0 end add_index "changesets", ["committed_on"], :name => "index_changesets_on_committed_on" @@ -521,13 +519,6 @@ ActiveRecord::Schema.define(:version => 20170207060207) do add_index "contest_messages", ["contest_id"], :name => "index_contest_messages_on_contest_id" add_index "contest_messages", ["user_id"], :name => "index_contest_messages_on_user_id" - create_table "contest_notifications", :force => true do |t| - t.text "title" - t.text "content" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - create_table "contestant_for_contests", :force => true do |t| t.integer "student_id" t.integer "contest_id" @@ -595,37 +586,6 @@ ActiveRecord::Schema.define(:version => 20170207060207) do add_index "contestant_works", ["user_id"], :name => "index_contestant_works_on_user_id" add_index "contestant_works", ["work_id"], :name => "index_contestant_works_on_work_id" - create_table "contesting_projects", :force => true do |t| - t.integer "project_id" - t.string "contest_id" - t.integer "user_id" - t.string "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "reward" - end - - create_table "contesting_softapplications", :force => true do |t| - t.integer "softapplication_id" - t.integer "contest_id" - t.integer "user_id" - t.string "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "reward" - end - - create_table "contestnotifications", :force => true do |t| - t.integer "contest_id" - t.string "title" - t.string "summary" - t.text "description" - t.integer "author_id" - t.integer "notificationcomments_count" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - create_table "contests", :force => true do |t| t.integer "user_id" t.string "name" @@ -668,6 +628,20 @@ ActiveRecord::Schema.define(:version => 20170207060207) do t.integer "container_id", :default => 0 end + create_table "course_class_post", :id => false, :force => true do |t| + t.integer "班级id", :default => 0, :null => false + t.string "班级名" + t.integer "帖子id", :default => 0, :null => false + t.integer "主贴id" + t.string "帖子标题", :default => "", :null => false + t.text "帖子内容" + t.integer "帖子用户id" + t.integer "帖子回复数", :default => 0, :null => false + t.integer "最后回帖id" + t.datetime "发帖时间", :null => false + t.datetime "帖子更新时间", :null => false + end + create_table "course_contributor_scores", :force => true do |t| t.integer "course_id" t.integer "user_id" @@ -695,6 +669,21 @@ ActiveRecord::Schema.define(:version => 20170207060207) do add_index "course_groups", ["course_id"], :name => "index_course_groups_on_course_id" + create_table "course_homework_statistics", :force => true do |t| + t.integer "user_id" + t.integer "course_id" + t.integer "committed_work_num", :default => 0 + t.integer "un_commit_work_num", :default => 0 + t.integer "late_commit_work_num", :default => 0 + t.integer "absence_evaluation_work_num", :default => 0 + t.integer "un_evaluation_work_num", :default => 0 + t.integer "appeal_num", :default => 0 + t.float "average_score", :default => 0.0 + t.float "total_score", :default => 0.0 + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + create_table "course_infos", :force => true do |t| t.integer "course_id" t.integer "user_id" @@ -843,21 +832,6 @@ ActiveRecord::Schema.define(:version => 20170207060207) do add_index "delayed_jobs", ["priority", "run_at"], :name => "delayed_jobs_priority" - create_table "delayed_jobs_20161218", :id => false, :force => true do |t| - t.integer "id", :default => 0, :null => false - t.integer "priority", :default => 0, :null => false - t.integer "attempts", :default => 0, :null => false - t.text "handler", :null => false - t.text "last_error" - t.datetime "run_at" - t.datetime "locked_at" - t.datetime "failed_at" - t.string "locked_by" - t.string "queue" - t.datetime "created_at" - t.datetime "updated_at" - end - create_table "discuss_demos", :force => true do |t| t.string "title" t.text "body" @@ -983,11 +957,13 @@ ActiveRecord::Schema.define(:version => 20170207060207) do t.integer "exercise_status" t.integer "user_id" t.integer "time" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.datetime "publish_time" t.datetime "end_time" t.integer "show_result" + t.integer "question_random", :default => 0 + t.integer "choice_random", :default => 0 end create_table "first_pages", :force => true do |t| @@ -1177,10 +1153,6 @@ ActiveRecord::Schema.define(:version => 20170207060207) do t.datetime "updated_at", :null => false end - create_table "innodb_monitor", :id => false, :force => true do |t| - t.integer "a" - end - create_table "invite_lists", :force => true do |t| t.integer "project_id" t.integer "user_id" diff --git a/lib/tasks/homework_evaluation.rake b/lib/tasks/homework_evaluation.rake index 3aba5235e..0525b6038 100644 --- a/lib/tasks/homework_evaluation.rake +++ b/lib/tasks/homework_evaluation.rake @@ -32,6 +32,10 @@ namespace :homework_evaluation do student_works_evaluation_distributions = StudentWorksEvaluationDistribution.new(user_id: pro_work.user_id, student_work_id: h.id) student_works_evaluation_distributions.save end + + #更新CourseHomeworkStatistics中该学生的待匿评数 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(homework_common.course_id, pro_work.user_id) + course_statistics.update_attribute('un_evaluation_work_num', course_statistics.un_evaluation_work_num + n) if course_statistics end else student_works.each_with_index do |work, index| @@ -43,6 +47,10 @@ namespace :homework_evaluation do student_works_evaluation_distributions = StudentWorksEvaluationDistribution.new(user_id: user.id, student_work_id: h.id) student_works_evaluation_distributions.save end + + #更新CourseHomeworkStatistics中该学生的待匿评数 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(homework_common.course_id, user.id) + course_statistics.update_attribute('un_evaluation_work_num', course_statistics.un_evaluation_work_num + n) if course_statistics end end homework_detail_manual.update_column('comment_status', 2) @@ -87,6 +95,11 @@ namespace :homework_evaluation do absence_penalty_count = student_work.user.student_works_evaluation_distributions.where("student_work_id IN #{work_ids}").count - student_work.user.student_works_scores.where("student_work_id IN #{work_ids} and reviewer_role = 3").count student_work.absence_penalty = absence_penalty_count > 0 ? absence_penalty_count * homework_detail_manual.absence_penalty : 0 student_work.save + + #更新CourseHomeworkStatistics中该学生的待匿评数和缺评数 + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(homework_common.course_id, student_work.user_id) + course_statistics.update_attribute('un_evaluation_work_num', (course_statistics.un_evaluation_work_num - absence_penalty_count) < 0 ? 0 : (course_statistics.un_evaluation_work_num - absence_penalty_count)) if course_statistics + course_statistics.update_attribute('absence_evaluation_work_num', course_statistics.absence_evaluation_work_num + absence_penalty_count) if course_statistics end # 未参与匿评 diff --git a/lib/tasks/homework_publishtime.rake b/lib/tasks/homework_publishtime.rake index 23aae2925..c3c75a147 100644 --- a/lib/tasks/homework_publishtime.rake +++ b/lib/tasks/homework_publishtime.rake @@ -26,6 +26,13 @@ namespace :homework_publishtime do ActiveRecord::Base.connection.execute sql end end + + #更新CourseHomeworkStatistics中每个学生的未交作品数 + homework.course.student.each do |student| + course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(homework.course_id, student.student_id) + course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics + end + course = homework.course course.members.each do |m| homework.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => nil) diff --git a/public/stylesheets/css/courses.css b/public/stylesheets/css/courses.css index c6aa623dd..3c97ebc96 100644 --- a/public/stylesheets/css/courses.css +++ b/public/stylesheets/css/courses.css @@ -525,9 +525,11 @@ a.banner-course-notice {position: absolute; font-size: 12px; line-height: 20px; .game-setting-h3{ width: 100%; height: 40px; line-height: 40px; font-size: 14px; color: #666; font-weight: normal; background: #fff; border-bottom: 10px solid #eaebec;} .t-center{ text-align: center;} .table-td-w20{ width: 18%;} +.table-td-w9{ width: 9%;} .table-td-w10{ width: 10%;} +.table-td-w10-5{ width: 10.5%;} .table-td-w30{ width: 30%;} -.new_project_title_width {font-size: 14px;color: #666; max-width: 180px;font-weight: normal;white-space: nowrap;overflow: hidden; text-overflow: ellipsis;} +.new_project_title_width {font-size: 12px;color: #666; max-width: 170px;font-weight: normal;white-space: nowrap;overflow: hidden; text-overflow: ellipsis;} .syllabus_class_property { font-size: 12px; padding: 0 5px;border-radius: 3px;line-height: 14px;} .syllabus_class_private {color: #ff4a1b;border: 1px solid #ff4a1b;} .syllabus_class_open { color: #7dd26c; border: 1px solid #7dd26c;} diff --git a/spec/factories/course_homework_statistics.rb b/spec/factories/course_homework_statistics.rb new file mode 100644 index 000000000..9b22dd280 --- /dev/null +++ b/spec/factories/course_homework_statistics.rb @@ -0,0 +1,6 @@ +FactoryGirl.define do + factory :course_homework_statistic, :class => 'CourseHomeworkStatistics' do + + end + +end diff --git a/spec/models/course_homework_statistics_spec.rb b/spec/models/course_homework_statistics_spec.rb new file mode 100644 index 000000000..21388658c --- /dev/null +++ b/spec/models/course_homework_statistics_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe CourseHomeworkStatistics, :type => :model do + pending "add some examples to (or delete) #{__FILE__}" +end