diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index a1bd16e94..45f4da0de 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -28,7 +28,8 @@ class CoursesController < ApplicationController :switch_to_teacher, :switch_to_assistant, :switch_to_student, :exit_course, :informs, :update_informs, :online_learning, :update_task_position, :tasks_list, :join_excellent_course, :export_couser_info, :export_member_act_score, :new_informs, - :delete_informs, :change_member_role, :course_groups, :join_course_group] + :delete_informs, :change_member_role, :course_groups, :join_course_group, :statistics, + :work_score, :act_score] before_action :user_course_identity, except: [:join_excellent_course, :index, :create, :new, :apply_to_join_course, :search_course_list, :get_historical_course_students, :mine, :search_slim, :board_list] before_action :teacher_allowed, only: [:update, :destroy, :settings, :search_teacher_candidate, @@ -47,6 +48,7 @@ class CoursesController < ApplicationController before_action :validate_page_size, only: :mine before_action :course_tasks, only: [:tasks_list, :update_task_position] before_action :validate_inform_params, only: [:update_informs, :new_informs] + before_action :course_member_allowed, only: [:statistics, :work_score, :act_score] if RUBY_PLATFORM =~ /linux/ require 'simple_xlsx_reader' @@ -227,6 +229,29 @@ class CoursesController < ApplicationController end end + def statistics + max_exp = User.where(id: @course.students.pluck(:user_id)).pluck(:experience).max + limit = params[:limit] || 5 + @top_scores = course_statistics(@course, max_exp, limit) + end + + def work_score + sort = params[:sort] || "desc" + group_ids = params[:group_ids] + @course_members = course_work_scores @course, sort, group_ids + if @user_course_identity == Course::STUDENT + user_ids = @course_members.map(&:user_id) + @rank = user_ids.index(current_user.id).to_i + 1 + @course_members = @course_members.select{|member| member.user_id == current_user.id} + else + @course_members = paginate @course_members + end + end + + def act_score + + end + def join_excellent_course tip_exception("您已是课堂成员") if current_user.member_of_course?(@course) tip_exception("请通过邀请码加入课堂") unless @course.excellent @@ -1379,6 +1404,10 @@ class CoursesController < ApplicationController end end + def course_member_allowed + tip_exception(403, "..") if @user_course_identity > Course::STUDENT + end + def course_tasks case params[:container_type] when 'shixun_homework' @@ -1466,319 +1495,64 @@ class CoursesController < ApplicationController act_scores end - def course_info_to_xlsx course - #课堂信息 - @course_info = [] - course_info_title = "课堂信息概要" - course_id = course.id - course_name = course.name - course_list_name = course.course_list.present? ? course.course_list.name : "--" - course_assistants = course.teachers - course_assistants_count = course_assistants&.size - course_assistants_name = course_assistants_count > 0 ? course_assistants.map{|m| m.user.real_name}.join('、') : "--" - course_teacher_member = course.course_members.course_user_role(%i[CREATOR]) - course_teacher = course_teacher_member.present? ? course_teacher_member.first.user.real_name : "--" - course_class_counts = course.course_groups_count - course_students_count = course.students.size - course_1 = ["课堂编号",course_id] - course_2 = ["课程名称",course_list_name] - course_3 = ["课堂名称",course_name] - course_4 = ["教师团队(#{course_assistants_count})", course_assistants_name] - course_5 = ["主讲教师", course_teacher] - course_6 = ["分班",course_class_counts] - course_7 = ["学生", course_students_count] - course_main_info = [course_1,course_2,course_3,course_4,course_5,course_6,course_7] - course_group_info_head = %w(序号 分班名称 邀请码 学生数量) - course_group_info_body = [] - none_group_counts = course.none_group_count - - #当有未分班时,应该也做个统计 - if none_group_counts > 0 - none_group_index = 2 - no_group_array = [1,"未分班",course.invite_code,none_group_counts] - course_group_info_body.push(no_group_array) - else - none_group_index = 1 - end - - if course.course_groups.exists? - course.course_groups.each_with_index do |group, index| - group_index = (index+none_group_index) - group_name = group.name - group_code = group.invite_code - group_count = group.course_members_count - group_array = [group_index,group_name,group_code,group_count] - course_group_info_body.push(group_array) - end - - end - course_group_info = [course_group_info_head,course_group_info_body] - @course_info += [course_info_title,course_main_info,course_group_info] - end - - def act_score_to_xlsx all_members - #课堂活跃度 - @user_activity_level = [] - course_user_level = [] - course_activity_title = "课堂活跃度统计" - user_cell_head = %w(排名 真实姓名 登录名 邮箱 学号 学校 分班 作业完成数(*10) 试卷完成数(*10) 问卷完成数(*7) 资源发布数(*5) 帖子发布数(*2) 帖子回复数(*1) 作业回复数(*1) 活跃度) - all_members.each do |u| - #用户的基本信息 - user = u.user - user_login = user.login - user_name = user.real_name - user_mail = user.mail - user_stu_id = u.student_id.present? ? (u.student_id.to_s + "\t") : "--" - user_school = user.school_name - user_course_group = u.course_group_name - - #课堂活跃度统计 - user_homeworks_num = u.homework_num.to_i #完成的作业数 - user_graduate_num = u.graduation_num.to_i #毕业任务完成数 - user_exercise_num = u.exercise_num.to_i #根据试卷的id来查找 - user_poll_num = u.poll_num.to_i #已完成问卷 - user_file_num = u.resource_num.to_i - user_messages_num = u.message_num.to_i #帖子发布数 - user_reply_num = u.message_reply_num.to_i #帖子回复数 - user_work_reply_num = u.homework_journal_num.to_i #作业回复数的数量 - c_works_num = (user_homeworks_num + user_graduate_num)*10 - c_exercise_num = user_exercise_num*10 - c_poll_num = user_poll_num*7 - c_file_num = user_file_num*5 - c_message_num = user_messages_num*2 - c_reply_num = user_reply_num - user_activity_levels = c_works_num + c_exercise_num + c_poll_num + c_file_num + c_message_num + c_reply_num + user_work_reply_num - user_ac_level = { - u_1: user_name, - u_2: user_login, - u_2_1: user_mail, - u_3: user_stu_id, - u_4: user_school, - u_5: user_course_group, - u_6: c_works_num, - u_7: c_exercise_num, - u_8: c_poll_num, - u_9: c_file_num, - u_10: c_message_num, - u_11: c_reply_num, - u_12: user_work_reply_num, - u_13: user_activity_levels - } - course_user_level.push(user_ac_level) - - #.课堂活跃度统计的集合 - course_user_level = course_user_level.sort_by {|k| k[:u_13]}.reverse - @user_activity_level = [course_activity_title,user_cell_head,course_user_level] - end - end - - def member_to_xlsx(course,all_members,homeworks,exercises,tasks) - #课堂的作业信息 - shixun_homeworks = homeworks.search_homework_type(4) #全部实训作业 - shixun_titles = shixun_homeworks.pluck(:name) + ["总得分"] - - # 更新实训作业成绩 - unless course.is_end - shixun_homeworks.includes(:homework_challenge_settings, :published_settings, :homework_commons_shixun).each do |homework| - homework.update_homework_work_score - end - end - - shixun_homeworks = shixun_homeworks&.includes(score_student_works: :user) - - common_homeworks = homeworks.search_homework_type(1) #全部普通作业 - common_titles = common_homeworks.pluck(:name)+ ["总得分"] - common_homeworks = common_homeworks&.includes(score_student_works: :user) - - group_homeworks = homeworks.search_homework_type(3) #全部分组作业 - group_titles = group_homeworks.pluck(:name)+ ["总得分"] - group_homeworks = group_homeworks&.includes(score_student_works: :user) - - task_titles = tasks.pluck(:name) + ["总得分"] - tasks = tasks&.includes(user: :user_extension, score_graduation_works: :user) - - exercise_titles = exercises.pluck(:exercise_name) + ["总得分"] - exercises = exercises&.includes(user: :user_extension, score_exercise_users: :user) - - total_user_score_array = [] #学生总成绩集合 - - all_members.each do |u| - #用户的基本信息 - user = u.user - user_login = user.login - user_name = user.real_name - user_mail = user.mail - user_stu_id = user.student_id.present? ? (user.student_id.to_s + "\t") : "--" - user_school = user.school_name - user_course_group = u.course_group_name - user_info_array = [user_name,user_login,user_mail,user_stu_id,user_school,user_course_group] #用户的信息集合 - user_work_scores = [] - - #学生总成绩 - shixun_score = 0.0 # 实训作业的总分 - common_score = 0.0 #普通作业的总分 - group_score = 0.0 #分组作业的总分 - task_score = 0.0 # 毕业任务的总得分 - exercise_score = 0.0 #试卷的总得分 - shixun_score_array = [] - common_score_array = [] - group_score_array = [] - task_score_array = [] - exercise_score_array = [] - - #实训作业 - if shixun_homeworks.size > 0 - shixun_homeworks.each do |s| - user_student_work = s.score_student_works.select{|work| work.user_id == user.id}.first #当前用户的对该作业的回答 - if user_student_work.nil? - h_score = 0.0 #该作业的得分为0 - else - h_score = user_student_work.work_score.nil? ? 0.0 : user_student_work.work_score #用户对该作业的分数 - end - shixun_score_array.push(h_score) - end - end - shixun_score += shixun_score_array.sum - shixun_score_array.push(shixun_score) #shixun_score_array的最后一行为总分 - user_work_scores += user_info_array + shixun_score_array #单个用户的实训作业得分信息 - - #普通作业 - if common_homeworks.size > 0 - common_homeworks.each do |c| - user_student_work_1 = c.score_student_works.select{|work| work.user_id == user.id}.first #当前用户的对该作业的回答 - if user_student_work_1.nil? - h_score_1 = 0.0 #该作业的得分为0 - else - h_score_1 = user_student_work_1.work_score.nil? ? 0.0 : user_student_work_1.work_score #用户对该作业的分数 - end - common_score_array.push(h_score_1) - end - end - common_score += common_score_array.sum - common_score_array.push(common_score) #shixun_score_array的最后一行为总分 - user_work_scores += common_score_array #单个用户的普通作业得分信息 - - #分组作业 - if group_homeworks.size > 0 - group_homeworks.each do |g| - user_student_work_3 = g.score_student_works.select{|work| work.user_id == user.id}.first #当前用户的对该作业的回答 - if user_student_work_3.nil? - h_score_3 = 0.0 #该作业的得分为0 - else - h_score_3 = user_student_work_3.work_score.nil? ? 0.0 : user_student_work_3.work_score #用户对该作业的分数 - end - group_score_array.push(h_score_3) - end - end - group_score += group_score_array.sum - group_score_array.push(group_score) #shixun_score_array的最后一行为总分 - user_work_scores += group_score_array #单个用户的分组作业得分信息 - - #毕设作业 - if tasks.size > 0 - tasks.each do |task| - graduation_work = task.score_graduation_works.select{|work| work.user_id == user.id}.first - if graduation_work.nil? - t_score = 0.0 - else - t_score = graduation_work.work_score.nil? ? 0.0 : graduation_work.work_score - end - task_score_array.push(t_score) - end - end - task_score += task_score_array.sum - task_score_array.push(task_score) - user_work_scores += task_score_array #单个用户的分组作业得分信息 - - #试卷 - if exercises.size > 0 - exercises.each do |ex| - exercise_work = ex.score_exercise_users.select{|work| work.user_id == user.id}.first - if exercise_work.nil? - e_score = 0.0 - else - e_score = exercise_work.score.nil? ? 0.0 : exercise_work.score - end - exercise_score_array.push(e_score) - end - end - exercise_score += exercise_score_array.sum - exercise_score_array.push(exercise_score) - - user_work_scores += exercise_score_array #单个用户的分组作业得分信息 - total_user_scores = shixun_score + common_score + group_score + task_score + exercise_score - user_work_scores.push(total_user_scores) #个人的行内容添加总成绩 - total_user_score_array.push(user_work_scores) # 全部成员的集合 - end - - #2.学生总成绩的集合 - ## 作业标题的集合 - course_user_score_title = "学生总成绩" - score_title_cells = shixun_titles + common_titles + group_titles + task_titles + exercise_titles - score_title_counts = [shixun_titles.count,common_titles.count,group_titles.count,task_titles.count,exercise_titles.count] - score_cell_head = %w(序号 真实姓名 登录名 邮箱 学号 学校 分班) + score_title_cells + ["个人总成绩"] - @course_user_scores = [course_user_score_title,score_cell_head,score_title_counts,total_user_score_array] - - #作业的全部集合 - @shixun_work_arrays = [] - @group_work_arrays = [] - @common_work_arrays = [] - @task_work_arrays = [] - @exercise_work_arrays = [] - count_1 = shixun_homeworks.size - count_2 = common_homeworks.size - count_3 = group_homeworks.size - count_4 = tasks.size - #实训作业 - shixun_homeworks.each_with_index do |s,index| - all_student_works = s.score_student_works #该实训题的全部用户回答 - title_no = index.to_i + 1 - student_work_to_xlsx(all_student_works,s) - shixun_work_display_name = format_sheet_name (title_no.to_s + "." + s.name).strip.first(30) - shixun_work_content = [shixun_work_display_name,@work_head_cells,@work_cells_column] - @shixun_work_arrays.push(shixun_work_content) - end - - #普通作业 - common_homeworks.each_with_index do |c,index| - all_student_works = c.score_student_works #当前用户的对该作业的回答 - title_no = count_1 + index.to_i + 1 - student_work_to_xlsx(all_student_works,c) - - work_name = format_sheet_name (title_no.to_s + "." + c.name).strip.first(30) - work_content = [work_name,@work_head_cells,@work_cells_column] - @common_work_arrays.push(work_content) - title_no - end - - #分组作业 - group_homeworks.each_with_index do |c,index| - all_student_works = c.score_student_works #当前用户的对该作业的回答 - title_no = count_1 + count_2 + index.to_i + 1 - student_work_to_xlsx(all_student_works,c) - work_name = format_sheet_name (title_no.to_s + "." + c.name).strip.first(30) - work_content = [work_name,@work_head_cells,@work_cells_column] - @group_work_arrays.push(work_content) - end - - #毕设任务 - tasks.each_with_index do |c,index| - all_student_works = c.score_graduation_works #当前用户的对该作业的回答 - title_no = count_1 + count_2 + count_3 + index.to_i + 1 - graduation_work_to_xlsx(all_student_works,c,current_user) - work_name = format_sheet_name (title_no.to_s + "." + c.name).strip.first(30) - work_content = [work_name,@head_cells_column,@task_cells_column] - @task_work_arrays.push(work_content) - end - - #试卷的导出 - exercises.each_with_index do |c,index| - all_student_works = c.score_exercise_users #当前用户的对该作业的回答 - title_no = count_1 + count_2 + count_3 + count_4 + index.to_i + 1 - get_export_users(c,course,all_student_works) - work_name = format_sheet_name (title_no.to_s + "." + c.exercise_name).strip.first(30) - work_content = [work_name,@table_columns,@user_columns] - @exercise_work_arrays.push(work_content) - end + def course_statistics course, max_exp, limit + max_rate = 20.0 / max_exp + + sql_select = %Q{ SELECT a.*, (message_num*0.2 + message_reply_num*0.1 + resource_num*0.5 + homework_journal_num*0.1 + graduation_num + + homework_num + exercise_num + poll_num*0.7 + exercise_score * 0.7 + graduation_score * 0.7 + homework_score * 0.7 + exp*#{max_rate}) + AS score from + (select cm.*, users.experience as exp, (SELECT max(student_id) FROM user_extensions WHERE user_extensions.user_id = cm.user_id) AS student_id, + (SELECT count(messages.id) FROM messages join boards on messages.board_id = boards.id WHERE boards.course_id = #{course.id} + AND messages.author_id = cm.user_id and messages.parent_id is null) AS message_num, + (SELECT count(messages.id) FROM messages join boards on messages.board_id = boards.id WHERE boards.course_id = #{course.id} + AND messages.author_id = cm.user_id and messages.parent_id is not null) AS message_reply_num, + (SELECT count(attachments.id) FROM attachments WHERE container_id = #{course.id} and container_type = "Course" + AND attachments.author_id = cm.user_id) AS resource_num, + (SELECT count(jfm.id) FROM journals_for_messages AS jfm, homework_commons hs WHERE jfm.jour_id = hs.id AND + jfm.user_id = cm.user_id and jfm.jour_type = "HomeworkCommon" and hs.course_id = #{course.id}) AS homework_journal_num, + (SELECT COUNT(gw.id) FROM graduation_works AS gw, graduation_tasks AS gt WHERE gw.graduation_task_id = gt.id AND + gt.course_id = #{course.id} AND gw.work_status != 0 AND gw.user_id = cm.user_id) AS graduation_num, + (SELECT IFNULL(sum(gw.work_score),0) FROM graduation_works AS gw, graduation_tasks AS gt WHERE gw.graduation_task_id = gt.id AND + gt.course_id = #{course.id} AND gw.work_status != 0 AND gw.user_id = cm.user_id) AS graduation_score, + (SELECT COUNT(ss.id) FROM student_works AS ss ,homework_commons AS hc WHERE ss.homework_common_id = hc.id AND + hc.course_id = #{course.id} AND ss.work_status != 0 AND ss.user_id = cm.user_id) AS homework_num, + (SELECT IFNULL(sum(ss.work_score),0) FROM student_works AS ss ,homework_commons AS hc WHERE ss.homework_common_id = hc.id AND + hc.course_id = #{course.id} AND ss.work_status != 0 AND ss.user_id = cm.user_id) AS homework_score, + (SELECT COUNT(eu.id) FROM exercise_users AS eu,exercises WHERE eu.exercise_id = exercises.id AND exercises.course_id = #{course.id} + AND eu.commit_status = 1 AND eu.user_id = cm.user_id) AS exercise_num, + (SELECT IFNULL(sum(eu.score),0) FROM exercise_users AS eu,exercises WHERE eu.exercise_id = exercises.id AND exercises.course_id = #{course.id} + AND eu.commit_status = 1 AND eu.user_id = cm.user_id) AS exercise_score, + (SELECT COUNT(pu.id) FROM poll_users AS pu, polls WHERE pu.poll_id = polls.id AND polls.course_id = #{course.id} + AND pu.commit_status = 1 AND pu.user_id = cm.user_id) AS poll_num + FROM course_members cm join users on cm.user_id = users.id + join user_extensions ue on ue.user_id = users.id + WHERE cm.role = 4 and cm.course_id = #{course.id}) a ORDER BY score desc limit #{limit}; + } + CourseMember.find_by_sql(sql_select) + end + + def course_work_scores course, sort, group_ids + sql_select = %Q{ SELECT a.*, + (exercise_score + graduation_score + common_score + practice_score + group_score) AS score from + (select cm.*, + (SELECT IFNULL(sum(gw.work_score),0) FROM graduation_works AS gw, graduation_tasks AS gt WHERE gw.graduation_task_id = gt.id AND + gt.course_id = #{course.id} AND gw.work_status != 0 AND gw.user_id = cm.user_id) AS graduation_score, + (SELECT IFNULL(sum(ss.work_score),0) FROM student_works AS ss ,homework_commons AS hc WHERE ss.homework_common_id = hc.id AND + hc.course_id = #{course.id} AND ss.work_status != 0 AND ss.user_id = cm.user_id and hc.homework_type=1) AS common_score, + (SELECT IFNULL(sum(ss.work_score),0) FROM student_works AS ss ,homework_commons AS hc WHERE ss.homework_common_id = hc.id AND + hc.course_id = #{course.id} AND ss.work_status != 0 AND ss.user_id = cm.user_id and hc.homework_type=3) AS group_score, + (SELECT IFNULL(sum(ss.work_score),0) FROM student_works AS ss ,homework_commons AS hc WHERE ss.homework_common_id = hc.id AND + hc.course_id = #{course.id} AND ss.work_status != 0 AND ss.user_id = cm.user_id and hc.homework_type=4) AS practice_score, + (SELECT IFNULL(sum(eu.score),0) FROM exercise_users AS eu,exercises WHERE eu.exercise_id = exercises.id AND exercises.course_id = #{course.id} + AND eu.commit_status = 1 AND eu.user_id = cm.user_id) AS exercise_score + FROM course_members cm join users on cm.user_id = users.id + join user_extensions ue on ue.user_id = users.id + WHERE cm.role = 4 and cm.course_id = #{course.id}) + } + + sql_select += %Q{ and cm.course_group_id in (#{group_ids.join(",")}) } if group_ids.present? + sql_select += %Q{ a ORDER BY score #{sort}; } + course_members = CourseMember.find_by_sql(sql_select) + course_members end end diff --git a/app/helpers/export_helper.rb b/app/helpers/export_helper.rb index 86cac2f98..115bdb951 100644 --- a/app/helpers/export_helper.rb +++ b/app/helpers/export_helper.rb @@ -9,6 +9,323 @@ module ExportHelper OUTPUT_FOLDER = "#{Rails.root}/files/archiveZip" MAX_PATH = 50 + # 课堂成绩导出 + def member_to_xlsx(course,all_members,homeworks,exercises,tasks) + #课堂的作业信息 + shixun_homeworks = homeworks.search_homework_type(4) #全部实训作业 + shixun_titles = shixun_homeworks.pluck(:name) + ["总得分"] + + # 更新实训作业成绩 + unless course.is_end + shixun_homeworks.includes(:homework_challenge_settings, :published_settings, :homework_commons_shixun).each do |homework| + homework.update_homework_work_score + end + end + + shixun_homeworks = shixun_homeworks&.includes(score_student_works: :user) + + common_homeworks = homeworks.search_homework_type(1) #全部普通作业 + common_titles = common_homeworks.pluck(:name)+ ["总得分"] + common_homeworks = common_homeworks&.includes(score_student_works: :user) + + group_homeworks = homeworks.search_homework_type(3) #全部分组作业 + group_titles = group_homeworks.pluck(:name)+ ["总得分"] + group_homeworks = group_homeworks&.includes(score_student_works: :user) + + task_titles = tasks.pluck(:name) + ["总得分"] + tasks = tasks&.includes(user: :user_extension, score_graduation_works: :user) + + exercise_titles = exercises.pluck(:exercise_name) + ["总得分"] + exercises = exercises&.includes(user: :user_extension, score_exercise_users: :user) + + total_user_score_array = [] #学生总成绩集合 + + all_members.each do |u| + #用户的基本信息 + user = u.user + user_login = user.login + user_name = user.real_name + user_mail = user.mail + user_stu_id = user.student_id.present? ? (user.student_id.to_s + "\t") : "--" + user_school = user.school_name + user_course_group = u.course_group_name + user_info_array = [user_name,user_login,user_mail,user_stu_id,user_school,user_course_group] #用户的信息集合 + user_work_scores = [] + + #学生总成绩 + shixun_score = 0.0 # 实训作业的总分 + common_score = 0.0 #普通作业的总分 + group_score = 0.0 #分组作业的总分 + task_score = 0.0 # 毕业任务的总得分 + exercise_score = 0.0 #试卷的总得分 + shixun_score_array = [] + common_score_array = [] + group_score_array = [] + task_score_array = [] + exercise_score_array = [] + + #实训作业 + if shixun_homeworks.size > 0 + shixun_homeworks.each do |s| + user_student_work = s.score_student_works.select{|work| work.user_id == user.id}.first #当前用户的对该作业的回答 + if user_student_work.nil? + h_score = 0.0 #该作业的得分为0 + else + h_score = user_student_work.work_score.nil? ? 0.0 : user_student_work.work_score #用户对该作业的分数 + end + shixun_score_array.push(h_score) + end + end + shixun_score += shixun_score_array.sum + shixun_score_array.push(shixun_score) #shixun_score_array的最后一行为总分 + user_work_scores += user_info_array + shixun_score_array #单个用户的实训作业得分信息 + + #普通作业 + if common_homeworks.size > 0 + common_homeworks.each do |c| + user_student_work_1 = c.score_student_works.select{|work| work.user_id == user.id}.first #当前用户的对该作业的回答 + if user_student_work_1.nil? + h_score_1 = 0.0 #该作业的得分为0 + else + h_score_1 = user_student_work_1.work_score.nil? ? 0.0 : user_student_work_1.work_score #用户对该作业的分数 + end + common_score_array.push(h_score_1) + end + end + common_score += common_score_array.sum + common_score_array.push(common_score) #shixun_score_array的最后一行为总分 + user_work_scores += common_score_array #单个用户的普通作业得分信息 + + #分组作业 + if group_homeworks.size > 0 + group_homeworks.each do |g| + user_student_work_3 = g.score_student_works.select{|work| work.user_id == user.id}.first #当前用户的对该作业的回答 + if user_student_work_3.nil? + h_score_3 = 0.0 #该作业的得分为0 + else + h_score_3 = user_student_work_3.work_score.nil? ? 0.0 : user_student_work_3.work_score #用户对该作业的分数 + end + group_score_array.push(h_score_3) + end + end + group_score += group_score_array.sum + group_score_array.push(group_score) #shixun_score_array的最后一行为总分 + user_work_scores += group_score_array #单个用户的分组作业得分信息 + + #毕设作业 + if tasks.size > 0 + tasks.each do |task| + graduation_work = task.score_graduation_works.select{|work| work.user_id == user.id}.first + if graduation_work.nil? + t_score = 0.0 + else + t_score = graduation_work.work_score.nil? ? 0.0 : graduation_work.work_score + end + task_score_array.push(t_score) + end + end + task_score += task_score_array.sum + task_score_array.push(task_score) + user_work_scores += task_score_array #单个用户的分组作业得分信息 + + #试卷 + if exercises.size > 0 + exercises.each do |ex| + exercise_work = ex.score_exercise_users.select{|work| work.user_id == user.id}.first + if exercise_work.nil? + e_score = 0.0 + else + e_score = exercise_work.score.nil? ? 0.0 : exercise_work.score + end + exercise_score_array.push(e_score) + end + end + exercise_score += exercise_score_array.sum + exercise_score_array.push(exercise_score) + + user_work_scores += exercise_score_array #单个用户的分组作业得分信息 + total_user_scores = shixun_score + common_score + group_score + task_score + exercise_score + user_work_scores.push(total_user_scores) #个人的行内容添加总成绩 + total_user_score_array.push(user_work_scores) # 全部成员的集合 + end + + #2.学生总成绩的集合 + ## 作业标题的集合 + course_user_score_title = "学生总成绩" + score_title_cells = shixun_titles + common_titles + group_titles + task_titles + exercise_titles + score_title_counts = [shixun_titles.count,common_titles.count,group_titles.count,task_titles.count,exercise_titles.count] + score_cell_head = %w(序号 真实姓名 登录名 邮箱 学号 学校 分班) + score_title_cells + ["个人总成绩"] + @course_user_scores = [course_user_score_title,score_cell_head,score_title_counts,total_user_score_array] + + #作业的全部集合 + @shixun_work_arrays = [] + @group_work_arrays = [] + @common_work_arrays = [] + @task_work_arrays = [] + @exercise_work_arrays = [] + count_1 = shixun_homeworks.size + count_2 = common_homeworks.size + count_3 = group_homeworks.size + count_4 = tasks.size + #实训作业 + shixun_homeworks.each_with_index do |s,index| + all_student_works = s.score_student_works #该实训题的全部用户回答 + title_no = index.to_i + 1 + student_work_to_xlsx(all_student_works,s) + shixun_work_display_name = format_sheet_name (title_no.to_s + "." + s.name).strip.first(30) + shixun_work_content = [shixun_work_display_name,@work_head_cells,@work_cells_column] + @shixun_work_arrays.push(shixun_work_content) + end + + #普通作业 + common_homeworks.each_with_index do |c,index| + all_student_works = c.score_student_works #当前用户的对该作业的回答 + title_no = count_1 + index.to_i + 1 + student_work_to_xlsx(all_student_works,c) + + work_name = format_sheet_name (title_no.to_s + "." + c.name).strip.first(30) + work_content = [work_name,@work_head_cells,@work_cells_column] + @common_work_arrays.push(work_content) + title_no + end + + #分组作业 + group_homeworks.each_with_index do |c,index| + all_student_works = c.score_student_works #当前用户的对该作业的回答 + title_no = count_1 + count_2 + index.to_i + 1 + student_work_to_xlsx(all_student_works,c) + work_name = format_sheet_name (title_no.to_s + "." + c.name).strip.first(30) + work_content = [work_name,@work_head_cells,@work_cells_column] + @group_work_arrays.push(work_content) + end + + #毕设任务 + tasks.each_with_index do |c,index| + all_student_works = c.score_graduation_works #当前用户的对该作业的回答 + title_no = count_1 + count_2 + count_3 + index.to_i + 1 + graduation_work_to_xlsx(all_student_works,c,current_user) + work_name = format_sheet_name (title_no.to_s + "." + c.name).strip.first(30) + work_content = [work_name,@head_cells_column,@task_cells_column] + @task_work_arrays.push(work_content) + end + + #试卷的导出 + exercises.each_with_index do |c,index| + all_student_works = c.score_exercise_users #当前用户的对该作业的回答 + title_no = count_1 + count_2 + count_3 + count_4 + index.to_i + 1 + get_export_users(c,course,all_student_works) + work_name = format_sheet_name (title_no.to_s + "." + c.exercise_name).strip.first(30) + work_content = [work_name,@table_columns,@user_columns] + @exercise_work_arrays.push(work_content) + end + end + + #课堂活跃度 + def act_score_to_xlsx all_members + @user_activity_level = [] + course_user_level = [] + course_activity_title = "课堂活跃度统计" + user_cell_head = %w(排名 真实姓名 登录名 邮箱 学号 学校 分班 作业完成数(*10) 试卷完成数(*10) 问卷完成数(*7) 资源发布数(*5) 帖子发布数(*2) 帖子回复数(*1) 作业回复数(*1) 活跃度) + all_members.each do |u| + #用户的基本信息 + user = u.user + user_login = user.login + user_name = user.real_name + user_mail = user.mail + user_stu_id = u.student_id.present? ? (u.student_id.to_s + "\t") : "--" + user_school = user.school_name + user_course_group = u.course_group_name + + #课堂活跃度统计 + user_homeworks_num = u.homework_num.to_i #完成的作业数 + user_graduate_num = u.graduation_num.to_i #毕业任务完成数 + user_exercise_num = u.exercise_num.to_i #根据试卷的id来查找 + user_poll_num = u.poll_num.to_i #已完成问卷 + user_file_num = u.resource_num.to_i + user_messages_num = u.message_num.to_i #帖子发布数 + user_reply_num = u.message_reply_num.to_i #帖子回复数 + user_work_reply_num = u.homework_journal_num.to_i #作业回复数的数量 + c_works_num = (user_homeworks_num + user_graduate_num)*10 + c_exercise_num = user_exercise_num*10 + c_poll_num = user_poll_num*7 + c_file_num = user_file_num*5 + c_message_num = user_messages_num*2 + c_reply_num = user_reply_num + user_activity_levels = c_works_num + c_exercise_num + c_poll_num + c_file_num + c_message_num + c_reply_num + user_work_reply_num + user_ac_level = { + u_1: user_name, + u_2: user_login, + u_2_1: user_mail, + u_3: user_stu_id, + u_4: user_school, + u_5: user_course_group, + u_6: c_works_num, + u_7: c_exercise_num, + u_8: c_poll_num, + u_9: c_file_num, + u_10: c_message_num, + u_11: c_reply_num, + u_12: user_work_reply_num, + u_13: user_activity_levels + } + course_user_level.push(user_ac_level) + + #.课堂活跃度统计的集合 + course_user_level = course_user_level.sort_by {|k| k[:u_13]}.reverse + @user_activity_level = [course_activity_title,user_cell_head,course_user_level] + end + end + + def course_info_to_xlsx course + #课堂信息 + @course_info = [] + course_info_title = "课堂信息概要" + course_id = course.id + course_name = course.name + course_list_name = course.course_list.present? ? course.course_list.name : "--" + course_assistants = course.teachers + course_assistants_count = course_assistants&.size + course_assistants_name = course_assistants_count > 0 ? course_assistants.map{|m| m.user.real_name}.join('、') : "--" + course_teacher_member = course.course_members.course_user_role(%i[CREATOR]) + course_teacher = course_teacher_member.present? ? course_teacher_member.first.user.real_name : "--" + course_class_counts = course.course_groups_count + course_students_count = course.students.size + course_1 = ["课堂编号",course_id] + course_2 = ["课程名称",course_list_name] + course_3 = ["课堂名称",course_name] + course_4 = ["教师团队(#{course_assistants_count})", course_assistants_name] + course_5 = ["主讲教师", course_teacher] + course_6 = ["分班",course_class_counts] + course_7 = ["学生", course_students_count] + course_main_info = [course_1,course_2,course_3,course_4,course_5,course_6,course_7] + course_group_info_head = %w(序号 分班名称 邀请码 学生数量) + course_group_info_body = [] + none_group_counts = course.none_group_count + + #当有未分班时,应该也做个统计 + if none_group_counts > 0 + none_group_index = 2 + no_group_array = [1,"未分班",course.invite_code,none_group_counts] + course_group_info_body.push(no_group_array) + else + none_group_index = 1 + end + + if course.course_groups.exists? + course.course_groups.each_with_index do |group, index| + group_index = (index+none_group_index) + group_name = group.name + group_code = group.invite_code + group_count = group.course_members_count + group_array = [group_index,group_name,group_code,group_count] + course_group_info_body.push(group_array) + end + + end + course_group_info = [course_group_info_head,course_group_info_body] + @course_info += [course_info_title,course_main_info,course_group_info] + end + # 作业导出为xlsx,homework_type 1:普通作业 2:编程作业(弃用) 3:分组作业 4:实训作业 def student_work_to_xlsx(works,homework) @work_head_cells = [] diff --git a/app/views/courses/statistics.json.jbuilder b/app/views/courses/statistics.json.jbuilder new file mode 100644 index 000000000..c530171fc --- /dev/null +++ b/app/views/courses/statistics.json.jbuilder @@ -0,0 +1,6 @@ +json.top_scores @top_scores.each do |cm_score| + user = cm_score.user + json.user_name user.real_name + json.user_login user.login + json.avatar_url url_to_avatar(user) +end \ No newline at end of file diff --git a/app/views/courses/work_score.json.jbuilder b/app/views/courses/work_score.json.jbuilder new file mode 100644 index 000000000..e845b647a --- /dev/null +++ b/app/views/courses/work_score.json.jbuilder @@ -0,0 +1,13 @@ +json.course_members @course_members.each do |member| + user = member.user + json.user_login user.login + json.user_name user.real_name + json.course_group member.course_group_name + json.common_score member.common_score + json.group_score member.group_score + json.practice_score member.practice_score + json.exercise_score member.exercise_score + json.graduation_score member.graduation_score + json.total_score member.score + json.rank @rank if @user_course_identity == Course::STUDENT +end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 957f21f3b..284435dd2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -375,6 +375,9 @@ Rails.application.routes.draw do post 'update_task_position' get 'course_groups' post 'join_course_group' + get 'work_score' + get 'act_score' + get 'statistics' end collection do