diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 470315bdc..87a89653d 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -26,17 +26,19 @@ class CoursesController < ApplicationController :base_info, :get_historical_courses, :create_group_by_importing_file, :attahcment_category_list,:export_member_scores_excel, :duplicate_course, :switch_to_teacher, :switch_to_assistant, :switch_to_student, :exit_course, - :informs, :update_informs, :online_learning, :update_task_position, :tasks_list, :join_excellent_course] + :informs, :update_informs, :online_learning, :update_task_position, :tasks_list, + :join_excellent_course, :export_couser_info, :export_member_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, - :transfer_to_course_group, :delete_from_course, - :search_users, :add_students_by_search, :get_historical_courses, :add_teacher_popup, :add_teacher] + :transfer_to_course_group, :delete_from_course, :export_member_scores_excel, + :search_users, :add_students_by_search, :get_historical_courses, :add_teacher_popup, + :add_teacher, :export_couser_info, :export_member_act_score] before_action :admin_allowed, only: [:set_invite_code_halt, :set_public_or_private, :change_course_admin, :set_course_group, :create_group_by_importing_file, :update_informs, :update_task_position, :tasks_list] before_action :teacher_or_admin_allowed, only: [:graduation_group_list, :create_graduation_group, :join_graduation_group, - :change_course_teacher, :export_member_scores_excel, :course_group_list, + :change_course_teacher, :course_group_list, :teacher_application_review, :apply_teachers, :delete_course_teacher] before_action :validate_course_name, only: [:create, :update] before_action :find_board, only: :board_list @@ -1074,44 +1076,64 @@ class CoursesController < ApplicationController @courses= @courses.page(@page).per(@page_size) end + # 导出课堂信息 + def export_couser_info + set_export_cookies + course_info_to_xlsx @course + filename_ = "#{current_user.real_name}_#{@course.name}_课堂信息_#{Time.now.strftime('%Y%m%d_%H%M%S')}" + render xlsx: "#{format_sheet_name filename_.strip}",template: "courses/export_course_info.xlsx.axlsx", + locals: {course_info: @course_info} + end + + # 导出活跃度 + def export_member_act_score + search = params[:search] ? "#{params[:search].strip}" : "" #用户名或学生学号id搜索 + group_id = params[:group_id] #分班的班级id + @all_members = student_act_score group_id, search + if @all_members.size == 0 + normal_status(-1,"课堂暂时没有学生") + elsif params[:export].present? && params[:export] + normal_status(0,"正在下载中") + else + set_export_cookies + act_score_to_xlsx(@all_members) + filename_ = "#{current_user.real_name}_#{@course.name}_活跃度_#{Time.now.strftime('%Y%m%d_%H%M%S')}" + render xlsx: "#{format_sheet_name filename_.strip}",template: "courses/export_member_act_score.xlsx.axlsx", + locals: {activity_level:@user_activity_level} + end + end + + # 导出学生成绩 def export_member_scores_excel ActiveRecord::Base.transaction do begin + @all_members = @course.students search = params[:search] ? "#{params[:search].strip}" : "" #用户名或学生学号id搜索 group_id = params[:group_id] #分班的班级id - # if group_id && group_id != "0" && group_id != "-1" - # @all_members = @course.students.course_find_by_ids("course_group_id",group_id) - # elsif group_id && group_id == "0" # 未分班 - # @all_members = @course.course_members.ungroup_students - # else - # @all_members = @course.students - # end - # if name.present? - # @all_members = @all_members.joins(user: [:user_extension]).where('concat(users.lastname, users.firstname) like ? or user_extensions.student_id like ?',"%#{name}%","%#{name}%") - # end - - @all_members = student_act_score group_id, search + @all_members = @all_members.where(course_group_id: group_id) unless group_id.blank? + unless search.blank? + @all_members = @all_members.joins(user: [:user_extension]).where('concat(users.lastname, users.firstname) like ? or user_extensions.student_id like ?',"%#{search}%","%#{search}%") + end - @c_homeworks = @course.homework_commons.homework_published.order("homework_commons.publish_time asc, homework_commons.created_at asc") - @c_exercises = @course.exercises.is_exercise_published.order("exercises.publish_time asc, exercises.created_at asc") - # @c_polls = @course.polls.publish_or_not.order("polls.publish_time asc, polls.created_at asc") - @c_tasks = @course.graduation_tasks.task_published.order("graduation_tasks.publish_time asc, graduation_tasks.created_at asc") - if @user_course_identity > Course::ASSISTANT_PROFESSOR - tip_exception(403,"无权限操作") - elsif @all_members.size == 0 + if @all_members.length == 0 normal_status(-1,"课堂暂时没有学生") elsif params[:export].present? && params[:export] - normal_status(0,"正在下载中") + normal_status(0,"正在下载中") else + @c_homeworks = @course.homework_commons.homework_published.order("homework_commons.publish_time asc, homework_commons.created_at asc") + @c_exercises = @course.exercises.is_exercise_published.order("exercises.publish_time asc, exercises.created_at asc") + # @c_polls = @course.polls.publish_or_not.order("polls.publish_time asc, polls.created_at asc") + @c_tasks = @course.graduation_tasks.task_published.order("graduation_tasks.publish_time asc, graduation_tasks.created_at asc") + set_export_cookies member_to_xlsx(@course, @all_members, @c_homeworks, @c_exercises, @c_tasks) - filename_ = "#{current_user.real_name}_#{@course.name}_全部成绩_#{Time.now.strftime('%Y%m%d_%H%M%S')}" + filename_ = "#{current_user.real_name}_#{@course.name}_总成绩_#{Time.now.strftime('%Y%m%d_%H%M%S')}" render xlsx: "#{format_sheet_name filename_.strip}",template: "courses/export_member_scores_excel.xlsx.axlsx", - locals: {course_info:@course_info, activity_level:@user_activity_level, - course_scores:@course_user_scores,shixun_works:@shixun_work_arrays, + locals: {course_scores:@course_user_scores,shixun_works:@shixun_work_arrays, common_works:@common_work_arrays,group_works:@group_work_arrays,task_works:@task_work_arrays, exercise_works:@exercise_work_arrays} end + rescue Exception => e uid_logger_error(e.message) tip_exception(e.message) @@ -1279,13 +1301,7 @@ class CoursesController < ApplicationController # end def student_act_score group_id, search - sql_select = %Q{SELECT cm.*,( - SELECT SUM(student_works.work_score) - FROM student_works,homework_commons - WHERE student_works.homework_common_id = homework_commons.id - AND homework_commons.course_id = #{@course.id} - AND student_works.user_id = cm.user_id - ) AS score, + sql_select = %Q{SELECT cm.*, (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, @@ -1306,52 +1322,25 @@ class CoursesController < ApplicationController FROM course_members cm} if search.present? && group_id.present? sql_select += %Q{ join users on cm.user_id = users.id - joins user_extensions ue on ue.user_id = users.id + join user_extensions ue on ue.user_id = users.id WHERE cm.role = 4 and cm.course_id = #{@course.id} and cm.course_group_id = #{group_id} and - (concat(users.lastname, users.firstname) like '%#{search}%' or ue.student_id like '%#{search}%') ORDER BY score desc} + (concat(users.lastname, users.firstname) like '%#{search}%' or ue.student_id like '%#{search}%')} elsif search.present? sql_select += %Q{ join users on cm.user_id = users.id - joins user_extensions ue on ue.user_id = users.id + join user_extensions ue on ue.user_id = users.id WHERE cm.role = 4 and - (concat(users.lastname, users.firstname) like '%#{search}%' or ue.student_id like '%#{search}%') ORDER BY score desc} + (concat(users.lastname, users.firstname) like '%#{search}%' or ue.student_id like '%#{search}%')} elsif group_id.present? - sql_select += %Q{ WHERE cm.role = 4 and cm.course_id = #{@course.id} and cm.course_group_id = #{group_id} ORDER BY score desc} + sql_select += %Q{ WHERE cm.role = 4 and cm.course_id = #{@course.id} and cm.course_group_id = #{group_id}} else - sql_select += %Q{ WHERE cm.role = 4 and cm.course_id = #{@course.id} ORDER BY score desc} + sql_select += %Q{ WHERE cm.role = 4 and cm.course_id = #{@course.id}} end act_scores = CourseMember.find_by_sql(sql_select) act_scores end - def member_to_xlsx(course,all_members,homeworks,exercises,tasks) - #课堂的作业信息 - shixun_homeworks = homeworks.search_homework_type(4) #全部实训作业 - shixun_titles = shixun_homeworks.pluck(:name) + ["总得分"] - - # 更新实训作业成绩 - shixun_homeworks.includes(:homework_challenge_settings, :published_settings, :homework_commons_shixun).each do |homework| - homework.update_homework_work_score - 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 = [] #学生总成绩集合 - + def course_info_to_xlsx course #课堂信息 @course_info = [] course_info_title = "课堂信息概要" @@ -1399,7 +1388,9 @@ class CoursesController < ApplicationController 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 = [] @@ -1414,8 +1405,6 @@ class CoursesController < ApplicationController 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_info_array = [user_login,user_name,user_mail,user_stu_id,user_school,user_course_group] #用户的信息集合 - user_work_scores = [] #课堂活跃度统计 user_homeworks_num = u.homework_num.to_i #完成的作业数 @@ -1434,23 +1423,69 @@ class CoursesController < ApplicationController 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 + 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) + ["总得分"] + + # 更新实训作业成绩 + shixun_homeworks.includes(:homework_challenge_settings, :published_settings, :homework_commons_shixun).each do |homework| + homework.update_homework_work_score + 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 #普通作业的总分 @@ -1548,10 +1583,6 @@ class CoursesController < ApplicationController total_user_score_array.push(user_work_scores) # 全部成员的集合 end - #1.课堂活跃度统计的集合 - course_user_level = course_user_level.sort_by {|k| k[:u_12]}.reverse - @user_activity_level = [course_activity_title,user_cell_head,course_user_level] - #2.学生总成绩的集合 ## 作业标题的集合 course_user_score_title = "学生总成绩" diff --git a/app/views/courses/export_course_info.xlsx.axlsx b/app/views/courses/export_course_info.xlsx.axlsx new file mode 100644 index 000000000..789f5c43b --- /dev/null +++ b/app/views/courses/export_course_info.xlsx.axlsx @@ -0,0 +1,29 @@ +wb = xlsx_package.workbook +wb.use_shared_strings = true +wb.styles do |s| + no_wrap_sz = s.add_style :border => { :style => :thin, :color =>"000000" },:alignment => {wrap_text: false,:horizontal => :center,:vertical => :center } + sz_all = s.add_style :border => { :style => :thin, :color =>"000000" },:alignment => {wrap_text: true,:horizontal => :center,:vertical => :center } + row_cell = s.add_style :bg_color=> "FAEBDC",:border => { :style => :thin, :color =>"000000" },alignment: {wrap_text: true,:horizontal => :center,:vertical => :center } + blue_cell = s.add_style :bg_color => "FAEBDC", :sz => 10,:height => 25,:b => true, :border => { :style => :thin, :color =>"000000" },:alignment => {wrap_text: true,:horizontal => :center,:vertical => :center} + + #课堂信息摘要 + wb.add_worksheet(name:course_info[0]) do |sheet| + sheet.sheet_view.show_grid_lines = false + course_main_info = course_info[1] + course_group_info = course_info[2] + group_info_d = course_group_info[0] + group_info_detail = course_group_info[1] + course_main_info.each do |c| + sheet.add_row c, :style => sz_all #用户id + end + sheet["A1:A7"].each { |c| c.style = row_cell } + sheet.add_row [],:style => sz_all + if group_info_detail.count > 0 + sheet.add_row group_info_d, :style => blue_cell + group_info_detail.each do |group| + sheet.add_row group, :style => sz_all #用户id + end + sheet.column_info.second.width = 40 + end + end #add_worksheet +end diff --git a/app/views/courses/export_member_act_score.xlsx.axlsx b/app/views/courses/export_member_act_score.xlsx.axlsx new file mode 100644 index 000000000..357b28a34 --- /dev/null +++ b/app/views/courses/export_member_act_score.xlsx.axlsx @@ -0,0 +1,25 @@ +wb = xlsx_package.workbook +wb.use_shared_strings = true +wb.styles do |s| + no_wrap_sz = s.add_style :border => { :style => :thin, :color =>"000000" },:alignment => {wrap_text: false,:horizontal => :center,:vertical => :center } + sz_all = s.add_style :border => { :style => :thin, :color =>"000000" },:alignment => {wrap_text: true,:horizontal => :center,:vertical => :center } + row_cell = s.add_style :bg_color=> "FAEBDC",:border => { :style => :thin, :color =>"000000" },alignment: {wrap_text: true,:horizontal => :center,:vertical => :center } + blue_cell = s.add_style :bg_color => "FAEBDC", :sz => 10,:height => 25,:b => true, :border => { :style => :thin, :color =>"000000" },:alignment => {wrap_text: true,:horizontal => :center,:vertical => :center} + + #课堂活跃度统计 + wb.add_worksheet(name:activity_level[0]) do |sheet| + sheet.sheet_view.show_grid_lines = false + sheet_title = activity_level[1] + sheet_content = activity_level[2] + sheet.add_row sheet_title, :height => 25,:style => blue_cell + if sheet_content.count > 0 + sheet_content.each_with_index do |c,index| + c_1 = (index+1) + c_2 = [c_1] + c.values + sheet.add_row c_2, :height => 25, :style => sz_all #用户id + end + sheet.column_widths *([20]*sheet.column_info.count) + sheet.column_info.first.width = 8 + end + end #add_worksheet +end diff --git a/app/views/courses/export_member_scores_excel.xlsx.axlsx b/app/views/courses/export_member_scores_excel.xlsx.axlsx index db4f06ab1..a57211d44 100644 --- a/app/views/courses/export_member_scores_excel.xlsx.axlsx +++ b/app/views/courses/export_member_scores_excel.xlsx.axlsx @@ -6,44 +6,6 @@ wb.styles do |s| row_cell = s.add_style :bg_color=> "FAEBDC",:border => { :style => :thin, :color =>"000000" },alignment: {wrap_text: true,:horizontal => :center,:vertical => :center } blue_cell = s.add_style :bg_color => "FAEBDC", :sz => 10,:height => 25,:b => true, :border => { :style => :thin, :color =>"000000" },:alignment => {wrap_text: true,:horizontal => :center,:vertical => :center} - #课堂信息摘要 - wb.add_worksheet(name:course_info[0]) do |sheet| - sheet.sheet_view.show_grid_lines = false - course_main_info = course_info[1] - course_group_info = course_info[2] - group_info_d = course_group_info[0] - group_info_detail = course_group_info[1] - course_main_info.each do |c| - sheet.add_row c, :style => sz_all #用户id - end - sheet["A1:A7"].each { |c| c.style = row_cell } - sheet.add_row [],:style => sz_all - if group_info_detail.count > 0 - sheet.add_row group_info_d, :style => blue_cell - group_info_detail.each do |group| - sheet.add_row group, :style => sz_all #用户id - end - sheet.column_info.second.width = 40 - end - end #add_worksheet - - #课堂活跃度统计 - wb.add_worksheet(name:activity_level[0]) do |sheet| - sheet.sheet_view.show_grid_lines = false - sheet_title = activity_level[1] - sheet_content = activity_level[2] - sheet.add_row sheet_title, :height => 25,:style => blue_cell - if sheet_content.count > 0 - sheet_content.each_with_index do |c,index| - c_1 = (index+1) - c_2 = [c_1] + c.values - sheet.add_row c_2, :height => 25, :style => sz_all #用户id - end - sheet.column_widths *([20]*sheet.column_info.count) - sheet.column_info.first.width = 8 - end - end #add_worksheet - #学生总成绩 wb.add_worksheet(name:course_scores[0]) do |sheet| sheet.sheet_view.show_grid_lines = false diff --git a/config/routes.rb b/config/routes.rb index 61d59a1a8..4444ca6c0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -343,6 +343,8 @@ Rails.application.routes.draw do get 'base_info' get 'attahcment_category_list' get 'export_member_scores_excel' #导出课堂信息 + get 'export_couser_info' + get 'export_member_act_score' post 'switch_to_teacher' post 'switch_to_assistant' post 'switch_to_student'