#encoding: utf-8 class CoursesController < ApplicationController # layout 'base_courses' include CoursesHelper include ActivitiesHelper helper :activities helper :members helper :words helper :attachments helper :files helper :activity_notifys helper :graduation_tasks include ApplicationHelper helper SyllabusesHelper # before_filter :auth_login1, :only => [:show, :course_activity, :feedback] if Redmine::Configuration['gitlab_address'].include?("test") skip_before_filter :verify_authenticity_token, :only => [:update_course_module, :join_course_multi_role] before_filter :require_login, :only => [:join, :unjoin] else skip_before_filter :verify_authenticity_token, :only => [:update_course_module] before_filter :require_login, :only => [:join, :unjoin, :join_course_multi_role, :join_private_courses] end # before_filter :check_authentication, :except => [:update_course_module] menu_item :overview menu_item :feedback, :only => :feedback menu_item :homework, :only => :homework menu_item :new_homework, :only => :new_homework menu_item l(:label_sort_by_time), :only => :index menu_item l(:label_sort_by_active), :only => :index menu_item l(:label_sort_by_influence), :only => :index #before_filter :can_show_course, :except => [] before_filter :logged_user_by_apptoken,:only => [:show,:feedback] before_filter :find_course, :except => [ :index, :search, :new, :join, :unjoin, :create, :new_join, :course, :join_private_courses, :join_course_multi_role, :unjoin_group, :search_course_list, :validate_copy_permission] # before_filter :authorize_course, :only => [:show, :settings, :update, :course] before_filter :authorize_course_global, :only => [:new,:create] before_filter :toggleCourse, :only => [:finishcourse, :restartcourse] before_filter :is_deleted, :only => [:show, :settings] #before_filter :allow_join, :only => [:join] require 'bundler/setup' if RUBY_PLATFORM =~ /linux/ require 'simple_xlsx_reader' require 'roo-xls' end # params[:search] 搜索课程的名称 # params[:select] "join" "create" "all" 参与的 创建的 所有的课程 # def index @user = User.current @search = params[:search].nil? ? '' : params[:search] @select = params[:select].nil? ? '' : params[:select] # @is_over = params[:is_over] # 是否是新建课程页面跳转的查看归档 # @syllabuses_num = Course.count # @my_courses_count = @user.courses.not_deleted_not_end.count if params[:order].present? @order = params[:order] order_str = params[:order] == "members_count" ? "c.members_count" : (params[:order] == "created_at" ? "c.created_at" : "c.updated_at") else @order = "all" end # @hidden = params[:hidden] ? params[:hidden].to_i : 0 if params[:search].present? user_ids = User.where("concat(lastname,firstname) = '#{@search}'").pluck(:id) user_ids = user_ids.present? ? user_ids.join(",") : -1 course_ids = Course.where("courses.name like '%#{@search}%' or courses.tea_id in (#{user_ids})").pluck(:id) end # 页面筛选的课程 # join users 是为了过滤掉用户为nil的课堂 =begin if @select == "private" @courses = Course.find_by_sql("select c.id, c.tea_id, c.name, c.is_public, c.members_count, c.homework_commons_count, u.login, u.nickname, u.lastname, u.firstname, u.show_realname, ue.school_id from courses c, users u, user_extensions ue where c.tea_id = u.id and u.id = ue.user_id and c.is_delete = 0 and c.is_public = 0 #{course_ids == -1 ? "" : "and c.id in (#{course_ids})"} order by #{order_str} desc") elsif @select == "public" @courses = Course.find_by_sql("select c.id, c.tea_id, c.name, c.is_public, c.members_count, c.homework_commons_count, u.login, u.nickname, u.lastname, u.firstname, u.show_realname, ue.school_id from courses c, users u, user_extensions ue where c.tea_id = u.id and u.id = ue.user_id and c.is_delete = 0 and c.is_public = 1 #{course_ids == -1 ? "" : "and c.id in (#{course_ids})"} order by c.id = 1309 desc, #{order_str} desc") else # 全部课堂 @courses = Course.find_by_sql("select c.id, c.tea_id, c.name, c.is_public, c.members_count, c.homework_commons_count, u.login, u.nickname, u.lastname, u.firstname, u.show_realname, ue.school_id from courses c, users u, user_extensions ue where c.tea_id = u.id and u.id = ue.user_id and c.is_delete = 0 #{course_ids == -1 ? "" : "and c.id in (#{course_ids})"} order by c.id = 1309 desc, #{order_str} desc") end =end if @order == "all" course_ids = course_ids.present? ? course_ids.join(",") : -1 @courses = Course.where("courses.is_delete = 0 and courses.is_hidden = 0 #{course_ids == -1 ? "" : "and courses.id in (#{course_ids})"}").select("courses.id, courses.tea_id, courses.name, courses.is_public, courses.members_count, courses.homework_commons_count,(SELECT MAX(created_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS a").order("courses.id = 1309 desc, a desc") elsif @order == "mine" my_course_ids = Course.find_by_sql("SELECT c.id FROM courses c, members m, member_roles mr WHERE m.course_id = c.id AND m.id=mr.member_id AND mr.role_id in (3,7,9,10) AND m.user_id=#{@user.id} AND c.is_delete = 0") course_ids = course_ids.present? ? my_course_ids.map(&:id) & course_ids : my_course_ids.map(&:id) course_ids = course_ids.size > 0 ? course_ids.join(",") : "-1" @courses = Course.find_by_sql("select c.id, c.tea_id, c.name, c.is_public, c.members_count, c.homework_commons_count, u.login, u.nickname, u.lastname, u.firstname, u.show_realname, ue.school_id from courses c, users u, user_extensions ue where c.tea_id = u.id and u.id = ue.user_id and c.is_delete = 0 and c.is_hidden = 0 and c.id in (#{course_ids}) order by c.id = 1309 desc, #{order_str} desc") elsif @order == "created_at" course_ids = course_ids.present? ? course_ids.join(",") : -1 @courses = Course.find_by_sql("select c.id, c.tea_id, c.name, c.is_public, c.members_count, c.homework_commons_count, u.login, u.nickname, u.lastname, u.firstname, u.show_realname, ue.school_id from courses c, users u, user_extensions ue where c.tea_id = u.id and u.id = ue.user_id and c.is_delete = 0 and c.is_hidden = 0 and c.is_end = 0 #{course_ids == -1 ? "" : "and c.id in (#{course_ids})"} order by c.id = 1309 desc, #{order_str} desc") else course_ids = course_ids.present? ? course_ids.join(",") : -1 @courses = Course.find_by_sql("select c.id, c.tea_id, c.name, c.is_public, c.members_count, c.homework_commons_count, u.login, u.nickname, u.lastname, u.firstname, u.show_realname, ue.school_id from courses c, users u, user_extensions ue where c.tea_id = u.id and u.id = ue.user_id and c.is_delete = 0 and c.is_hidden = 0 #{course_ids == -1 ? "" : "and c.id in (#{course_ids})"} order by c.id = 1309 desc, #{order_str} desc") end @courses = paginateHelper @courses, 16 respond_to do |format| format.js format.html { render :layout => "base_edu" } end end def import_excel attachments = params[:attachments] attachments.each do |attachment| attachment = Attachment.find_by_token_only(attachment[1]['token']) attachment.container_id = @course.id attachment.container_type = "ImportStudent" attachment.save end @import_attachments = Attachment.where(:container_id => @course.id, :container_type => "ImportStudent") end def shixun_statistics if params[:homework_id] @homeworks = @course.homework_commons.where(:id => params[:homework_id]) else @homeworks = @course.homework_commons.where("homework_type = 4 and publish_time < '#{Time.now}'").order("publish_time desc") end #filename="#{format_date(Time.now)}_#{@course.teacher.show_real_name.to_s}_#{@course.name}_实训数据报告"; filename="#{format_date(Time.now)}_#{@course.teacher.show_real_name.to_s}_#{@course.name}_#{@homeworks.first.name}_实训数据报告"; respond_to do |format| format.xls { send_data(shixun_xls(@homeworks,@course), :type => 'application/octet-stream', :filename => filename_for_content_disposition("#{filename}.xls")) } end end # REDO:性能需要优化,这块是管理员后台任务,不影响用户使用 def sync_students # school_id = User.find(@course.tea_id).try(:user_extensions).try(:school_id) school_id = nil @import_attachments = Attachment.where(:container_id => @course.id, :container_type => "ImportStudent") @had_import_count = 0 @list_count = 0 if @import_attachments.present? @import_attachments.each do |attachment| path = attachment.disk_directory name = attachment.disk_filename if name.split(".").last == "xls" || name.split(".").last == "xlsx" lists = readData("files/#{path}/#{name}") @list_count += lists.count lists.each_with_index do |list, index| logger.info("#{list[0]}---#{list[1]}---#{list[2]}") if list[0] if index == 0 school_id = list[1] elsif index > 1 course_group = @course.course_groups.where(:name => list[2]).first if !course_group && list[2] course_group = CourseGroup.create(:name => list[2], :course_id => @course.id, :members_count => 0) end import_user = ImportCourseUser.new(:user_group_name => list[2], :user_name => list[1], :user_student_id => list[0], :course_id => @course.id, :school_id => school_id) user = User.find_by_sql("SELECT u.* FROM `users` u, `user_extensions` ue where u.id = ue.user_id and ue.school_id='#{school_id}' and ue.student_id='#{list[0]}'").last # 用户存在并且用户是非课程成员 if user.present? member = Member.where(:course_id => @course, :user_id => user.id).first if !member.present? members = [] members << Member.new(:role_ids => [10], :user_id => user.id, :course_group_id => course_group ? course_group.id : 0) @course.members << members StudentsForCourse.create(:student_id => user.id, :course_id => @course.id) elsif course_group && member.course_group_id != course_group.id member.update_attributes(:course_group_id => course_group.id) end @had_import_count += 1 import_user.status = 1 end import_user.save end end end attachment.destroy end end end # @members = @course.members.joins("join user_extensions on members.user_id = user_extensions.user_id").order("student_id asc").select{|m| m.roles.to_s.include?("Student")} # @member_count = @members.count # @limit = 20 # @is_remote = true # @page = (params['page'] || 1).to_i # @member_pages = Paginator.new @member_count, @limit, params['page'] || 1 # @offset ||= @member_pages.offset # @members = paginateHelper @members,@limit # # @teacher_count = TeacherAndAssistantCount @course # @student_count = studentCount(@course) # @no_group_count = @course.members.where(:course_group_id => 0).select{|m| m.roles.to_s.include?("Student")}.count end def none_register_students student_ids = UserExtensions.where(:user_id => @course.student.map(&:student_id)).map{|ue| ue.student_id if ue.student_id.present?} student_ids = student_ids.empty? ? "(-1)" : "(" + student_ids.compact.join(",") + ")" @import_users = @course.import_course_users.where("school_id = #{@course.teacher.try(:user_extensions).try(:school_id)} and user_student_id not in #{student_ids}") @curr_page = '尚未注册学生列表' render :layout => "base_edu_course" end def readData(xlsx) doc = SimpleXlsxReader.open(xlsx) sheet = doc.sheets.first return sheet.rows # sheet.rows.inject([]) { |l, row| # if row.size >= 3 && row[1] && row[2] # l << [row[1], row[2]] # else # l # end # } end # 邀请码停用/启用 def set_invite_code_halt if User.current.allowed_to?(:as_teacher, @course) || User.current.admin? @course.update_attribute('invite_code_halt', @course.invite_code_halt == 0 ? 1 : 0) @course_group = @course.course_groups.where(:id => params[:group_id]).first if params[:group_id] end end #查找组织 def search_public_orgs_not_in_course condition = '%%' if !params[:name].nil? condition = "%#{params[:name].strip}%".gsub(" ","") end limit = 15 course_org_ids = OrgCourse.find_by_sql("select distinct organization_id from org_courses where course_id = #{params[:id]}").map(&:organization_id) #@orgs_not_in_course = User.current.organizations.where("organizations.id not in (#{course_org_ids.join(',')}) and organizations.name like ?", condition).page(params[:page].to_i || 1).per(limit) #@org_count = User.current.organizations.where("organizations.id not in (#{course_org_ids.join(',')}) and organizations.name like ?", condition).count if course_org_ids.empty? @orgs_not_in_course = User.current.organizations.where("name like ?",condition).page((params[:page].to_i || 1)).per(limit) @org_count = @orgs_not_in_course.count else course_org_ids = "(" + course_org_ids.join(',') + ")" @orgs_not_in_course = User.current.organizations.where("organizations.id not in #{course_org_ids} and organizations.name like ?", condition).page((params[:page].to_i || 1)).per(limit) @org_count = @orgs_not_in_course.empty? ? 0 : @orgs_not_in_course.count end @course_count = Project.course_entities.visible.like(params[:name]).page(params[:page]).count @orgs_page = Paginator.new @org_count, limit,params[:page] @hint_flag = params[:hint_flag] #render :json => {:orgs => @orgs_not_in_course, :count => @org_count}.to_json respond_to do |format| format.js end end def join if User.current.logged? cs = CoursesService.new @user = User.current join = cs.join_course params,@user @state = join[:state] @course = join[:course] # else # @course = Course.find_by_id params[:object_id] # CourseMessage.create(:user_id => @course.tea_id, :course_id => @course.id, :viewed => false,:content=> params[:role],:course_message_id=>User.current.id,:course_message_type=>'JoinCourseRequest') # @state = 6 # end else @state = 5 #未登录 end @object_id = @course.id if @course respond_to do |format| format.js #{ render :partial => 'set_join', :locals => {:user => @user, :course => @course, :object_id => params[:object_id]} } end end def join_course_multi_role =begin if Redmine::Configuration['gitlab_address'].include?("test") User.current = User.find(12) end =end if User.current.logged? cs = CoursesService.new @user = User.current join = cs.join_course_roles params,@user @state = join[:state] @course = join[:course] if @state == 6 || @state == 13 # 给课堂老师发留言 if params[:role].include?("7") || params[:role].include?("9") # notes = @user.show_real_name.to_s + " 申请以#{params[:role].include?('7') ? '教辅' : '教师'}的身份加入班级:#{@course.name}" @course.course_teachers.each do |mem| Tiding.create(:user_id => mem.user_id, :trigger_user_id => User.current.id, :container_id => @course.id, :container_type => 'JoinCourse', :status => 0, :belong_container_id => @course.id, :belong_container_type => "Course", :tiding_type => "Apply", :extra => params[:role].include?("7") ? "7" : "9") end begin user = User.where(:id => @course.tea_id).first if user.phone.present? status = Trustie::Sms.send(mobile: user.phone.to_s, send_type:'join_course_multi_role', user_name: user.show_name, name: @course.id) end rescue => e Rails.logger.error "发送验证码出错: #{e}" end end end if @state == 0 || @state == 13 @course.course_teachers.each do |mem| Tiding.create(:user_id => mem.user_id, :trigger_user_id => @user.id, :container_id => @course.id, :container_type => 'StudentJoinCourse', :belong_container_id => @course.id, :belong_container_type => "Course", :tiding_type => "System") end end else @state = 5 #未登录 end @object_id = @course.id if @course respond_to do |format| format.js format.json { render json: {:state => @state, :course_id => @course.try(:id)} } end end def unjoin if User.current.logged? cs = CoursesService.new cs.exit_course params,User.current end redirect_to user_path(User.current) end def join_private_courses @invitation_code = params[:invitation_code] respond_to do |format| format.js end end #更新课程信息 def update cs = CoursesService.new c = cs.edit_course params,@course,User.current @course = c[:course] if @course.errors.full_messages.count <= 0 respond_to do |format| format.js format.api { render_api_ok } end else respond_to do |format| format.js format.api { render_validation_errors(@course) } end end end def new_join @course = Course.find(params[:object_id]) respond_to do |format| format.js end end # 课程搜索 # add by nwb def search if params[:name].empty? courses = Course.visible @courses = paginateHelper courses,10 else courses = Course.visible.where("LOWER(name) like '%#{params[:name].to_s.downcase}%'").order("time desc, created_at desc") @courses = paginateHelper courses,10 end @name = params[:name] @type = 'courses' respond_to do |format| format.html { render :layout => 'course_base' } format.atom { courses = Course.visible.order('created_on DESC').limit(Setting.feeds_limit.to_i).all render_feed(courses, :title => "#{Setting.app_title}: #{l(:label_course_latest)}") } end rescue Exception => e if e.message == 'sumbit empty' (redirect_to courses_url, :notice => l(:label_sumbit_empty);return) end end def searchmembers @subPage_title = l :label_student_list @canShowCode = User.current.allowed_to?(:as_teacher,@course) && params[:role] != '1' # @is_remote = true @sort_type = 'score' @score_sort_by = "desc" @search_name = "#{params[:name].strip}" q = "#{params[:name].strip}" if params[:incourse] results = searchmember_by_name(student_homework_score(0,0,0,"desc"), q) elsif params[:ingroup] if params[:search_group_id] == "-1" @group = -1 results = searchmember_by_name(student_homework_score(-1,0,0,"desc"), q) else @group = CourseGroup.find(params[:search_group_id]) results = searchmember_by_name(student_homework_score(@group.id,0,0,"desc"), q) end end @is_remote = true #@result_count = results.count #@results = paginateHelper results, 10 @results = results @search_name = q @limit = 50 @page = params[:page].nil? ? 1 : params['page'].to_i @members_count = @results.count @mem_pages = Paginator.new @members_count, @limit, @page @results = paginateHelper @results, @limit end def addgroups data = {:result=>1} @subPage_title = l :label_student_list if params[:group_name] if @course.course_groups.where(:name => params[:group_name]).count > 0 data[:result] = 0 else group = CourseGroup.new group.name = params[:group_name] group.course_id = @course.id group.save end end render :json => data end def deletegroup data = {:result=>1} group = CourseGroup.find params[:group_id] if group if group.members.count == 0 group.destroy else group.members.update_all(:course_group_id => 0) group.destroy end end render :json => data end def updategroupname data = {:result=>1} @subPage_title = l :label_student_list if params[:group_name] && params[:group_id] group = CourseGroup.find(params[:group_id]) if @course.course_groups.where("name = '#{params[:group_name]}' and id != #{params[:group_id]}").count > 0 data[:result] = 0 else group.name = params[:group_name] group.save end end render :json => data end def choose_group_allow @course.update_attributes(:choose_group_allow => !@course.choose_group_allow) end # 显示/隐藏课程"开源检索"的入口 def open_or_close_os_interface os_status = @course.os_allow == 0 ? 1 : 0 @course.update_attribute(:os_allow, os_status) respond_to do |format| format.js end end def valid_ajax req = Hash.new(false) req[:message] = '' valid_attr = params[:valid] valid_value = params[:value] group_id = params[:group_id] # faker = CourseGroup.new if valid_attr.eql?('name') course = Course.find params[:course_id] group_names = course.course_groups.map{|group| group.name unless group.id.to_s == group_id}.select{|group| !group.nil?} if group_names.include?(valid_value) req[:valid] = false req[:message] = l(:modal_valid_unpassing) else req[:valid] = true req[:message] = l(:modal_valid_passing) end # faker.name = valid_value # faker.course_id = params[:course_id] # faker.valid? # req[:valid] = faker.errors[:name].blank? # req[:message] = faker.errors[:name] end # req[:message] = l(:modal_valid_passing) if req[:message].blank? render :json => req end def delete_course_students if params[:member_ids] params[:member_ids].split(",").each do |member_id| member = Member.find member_id if member ActiveRecord::Base.transaction do if member.member_roles.count == 1 StudentsForCourse.where('student_id = ? and course_id = ?', member.user_id,@course.id).destroy_all member.destroy else member.member_roles.where("role_id = 10").destroy_all StudentsForCourse.where('student_id = ? and course_id = ?', member.user_id,@course.id).destroy_all member.update_attributes(:course_group_id => 0) member_role = member.member_roles.where("role_id = 7 or role_id = 9 or role_id = 3").first member_role.update_attributes(:is_current => 1) if member_role.present? end end end end end respond_to do |format| format.js end end def teacher_assign_group if params[:course_group_id] == '0' @group = 0 else @group = @course.course_groups.where(:id => params[:course_group_id].to_i).first end if params[:member_ids] && @group params[:member_ids].each do |member_id| member = Member.find member_id @old_group = member.course_group member.update_attributes(:course_group_id => params[:course_group_id].to_i) if member end end respond_to do |format| format.js end end def join_group group = CourseGroup.find(params[:group_id]) member = Member.where(:course_id => @course.id, :user_id => User.current.id).first member.course_group_id = group.id member.save @group = group respond_to do |format| format.js end #@course_groups = @course.course_groups #@no_group_count = @course.student.count - @course.members.where("course_group_id != 0").count # redirect_to has_group_student_list_course_path(@course, :group_id => @group.id) #search_group_members group end def change_manager if params[:chooseteacher] man_member = Member.where(:course_id => @course.id, :user_id => @course.tea_id).first cha_member = Member.find params[:chooseteacher] if man_member && cha_member cha_member.member_roles.where("role_id = 9 || role_id = 7").first.update_attributes(:role_id => 3, :is_current => 1) if cha_member.member_roles.where("role_id = 10").count > 0 cha_member.member_roles.where("role_id = 10").first.destroy StudentsForCourse.where(:course_id => @course.id, :student_id => cha_member.user_id).destroy_all end @course.update_attributes(:tea_id => cha_member.user_id, :school_id => cha_member.user.try(:user_extensions).try(:school_id)) man_member.member_roles.first.update_attributes(:role_id => 9) course_act = CourseActivity.where(:course_id => @course.id, :course_act_id => @course.id, :course_act_type => 'Course').first course_act.update_column('user_id', cha_member.user_id) UserActivity.where(:act_id => @course.id, :container_type => 'Course', :act_type => 'Course', :container_id => @course.id).first.update_column('user_id', cha_member.user_id) =begin ws = WechatService.new title = "您已成为班级管理员" ws.create_class_notice cha_member.user_id, "create_course_notice", @course.id,title, @course.name, man_member.user.show_name, @course.members.count, "点击查看班级详情。" =end end end end def choose_graduation_group if User.current.allowed_to?(:as_teacher, @course) @member_ids = params[:member_ids] @graduation_groups = @course.graduation_groups @default_group_name = @graduation_groups.count == 0 ? "分组1" : "分组#{(@graduation_groups.count+1)}" @page = params[:page] else render_403 end end def teacher_graduation_group if User.current.admin? || User.current.allowed_to?(:as_teacher, @course) if params[:graduation_group_name].strip != "" graduation_group = @course.graduation_groups.where(:name => params[:graduation_group_name].strip).first unless graduation_group.present? graduation_group = @course.graduation_groups.new(:name => params[:graduation_group_name].strip, :user_id => User.current.id) graduation_group.save end Member.where(:course_id => @course.id, :id => params[:member_ids].split(",")).update_all(:graduation_group_id => graduation_group.id) end redirect_to teachers_course_path(@course, :page => params[:page]) else render_403 end end def switch_teacher_role if User.current.admin? || User.current.has_teacher_role(@course) member = @course.members.where(:id => params[:member_id]).first if member.present? member.member_roles.where(:role_id => params[:role].to_i == 7 ? 9 : 7).update_all(:role_id => params[:role]) end redirect_to teachers_course_path(@course) else render_403 end end # 给教师分配管理权限 def assign_teacher_groups status = 0 if params[:member_id] && params[:group_id] && params[:check] member = @course.members.where(:id => params[:member_id]).first course_group = @course.course_groups.where(:id => params[:group_id]).first if member.present? && course_group.present? teacher_group = member.teacher_course_groups.where(:course_group_id => params[:group_id]) if params[:check].to_i == 1 if teacher_group.count == 0 member.teacher_course_groups << TeacherCourseGroup.new(:user_id => member.user_id, :course_id => @course.id, :course_group_id => params[:group_id]) end status = 1 elsif params[:check].to_i == 0 teacher_group.destroy_all status = 1 end end end render :json => {status: status} end def import_course_group attachments = params[:attachments] attachments.each do |attachment| attachment = Attachment.find_by_token_only(attachment[1]['token']) if attachment.present? attachment.container_id = @course.id attachment.container_type = "ImportCourseGroup" attachment.save end end new_atta = Attachment.where(:container_id => @course.id, :container_type => "ImportCourseGroup").last if new_atta.present? path = new_atta.disk_directory name = new_atta.disk_filename if name.split(".").last == "xls" begin xls = Roo::Spreadsheet.open("files/#{path}/#{name}",extension: :xls) worksheet = xls.sheet(0) rows = worksheet.last_row #最后一行数 if rows < 2 @status = 0 @message = "请按照模板格式导入" else group_count = 0 for row in 2 .. rows do name = worksheet.cell(row, 1).to_s # Rails.logger.info("-----user_id #{worksheet.cell(row, 1)}-------------group_name #{name}") if @course.course_groups.where(:name => name).count == 0 @course.course_groups << CourseGroup.new(:name => name) group_count += 1 end end @status = 1 @message = "已导入#{group_count}个分班" end rescue @status = 0 @message = "无法完成导入,原因:文件内容无法读取" end else @status = 0 @message = "无法完成导入,原因:文件类型错误(只支持.xls文件)" end new_atta.destroy else @status = 0 @message = "无法完成导入,原因:文件不存在" end end def teachers @search = params[:search] q = params[:search] ? "#{params[:search].strip.downcase}" : "" if @course.try(:id) != 1309 || User.current.admin? || User.current.try(:id) == 15582 @teachers = @course.members.includes(:roles, :user).where("roles.id in (3, 7, 9) and LOWER(concat(users.lastname, users.firstname)) LIKE '%#{q}%'") else @teachers = @course.members.includes(:roles, :user).where("(roles.id in (3, 7) or (members.user_id = #{User.current.id} and roles.id = 9)) and LOWER(concat(users.lastname, users.firstname)) LIKE '%#{q}%'") end @apply_users = CourseMessage.where(:course_id => @course.id,:course_message_type => 'JoinCourseRequest', :status => 0) @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin? @has_graduation = @course.course_modules.where(:module_type => "graduation").first.try(:hidden).to_i == 0 @teachers_count = @teachers.size @limit = 20 @page = params[:page] ? params[:page].to_i : 1 @teachers = paginateHelper @teachers, @limit respond_to do |format| format.js format.html { render :layout => 'base_courses' } end end def students @order, @r_sort = params[:order] || "student_id", params[:sort] || "asc" @sort = @r_sort == "desc" ? "asc" : "desc" @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin? @search = params[:search] q = params[:search] ? "#{params[:search].strip.downcase}" : "" @group = params[:group_id].to_i if params[:group_id].present? && params[:group_id] != "undefined" if @group group_ids = "(#{params[:group_id]})" else group_ids = "(#{@course.course_groups.blank? ? 0 : @course.course_groups.map(&:id).join(",") + ",0"})" end =begin if q.nil? || q == "" @members = Member.find_by_sql("SELECT members.*, (SELECT SUM(student_works.work_score) FROM student_works,homework_commons WHERE student_works.homework_common_id = homework_commons.id AND homework_commons.homework_type IN (1, 3, 4) AND homework_commons.course_id = #{@course.id} AND student_works.user_id = members.user_id ) AS score, (SELECT SUM(gw.work_score) FROM graduation_works gw,graduation_tasks gt WHERE gw.graduation_task_id = gt.id AND gt.course_id = #{@course.id} AND gw.user_id = members.user_id) AS graduation_score, (SELECT SUM(exercise_users.score) FROM exercise_users,exercises WHERE exercise_users.exercise_id = exercises.id AND exercises.course_id = #{@course.id} AND exercise_users.user_id = members.user_id) AS ex_score, (SELECT max(message_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_num, (SELECT max(message_reply_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_reply_num, (SELECT max(resource_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS resource_num, (SELECT max(homework_journal_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_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 = members.user_id) AS graduation_num, (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 = members.user_id) AS homework_num, (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 = members.user_id) AS exercise_num, (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 = members.user_id) AS poll_num, ue.student_id, CONCAT(u.lastname,u.firstname) AS username FROM members, users u, user_extensions ue, students_for_courses sfc WHERE sfc.student_id = members.user_id AND sfc.course_id = members.course_id AND members.`user_id`= u.id AND u.id = ue.user_id AND members.course_id = #{@course.id} and members.course_group_id in #{group_ids}") else @members = Member.find_by_sql("SELECT members.*, (SELECT SUM(student_works.work_score) FROM student_works,homework_commons WHERE student_works.homework_common_id = homework_commons.id AND homework_commons.homework_type IN (1, 3, 4) AND homework_commons.course_id = #{@course.id} AND student_works.user_id = members.user_id ) AS score, (SELECT SUM(gw.work_score) FROM graduation_works gw,graduation_tasks gt WHERE gw.graduation_task_id = gt.id AND gt.course_id = #{@course.id} AND gw.user_id = members.user_id) AS graduation_score, (SELECT SUM(exercise_users.score) FROM exercise_users,exercises WHERE exercise_users.exercise_id = exercises.id AND exercises.course_id = #{@course.id} AND exercise_users.user_id = members.user_id) AS ex_score, (SELECT max(message_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_num, (SELECT max(message_reply_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_reply_num, (SELECT max(resource_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS resource_num, (SELECT max(homework_journal_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_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 = members.user_id) AS graduation_num, (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 = members.user_id) AS homework_num, (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 = members.user_id) AS exercise_num, (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 = members.user_id) AS poll_num, ue.student_id, CONCAT(u.lastname,u.firstname) AS username FROM members, users u, user_extensions ue, students_for_courses sfc WHERE sfc.student_id = members.user_id AND sfc.course_id = members.course_id AND members.`user_id`= u.id AND u.id = ue.user_id AND members.course_id = #{@course.id} and (ue.student_id like '%#{q}%' OR LOWER(CONCAT(u.lastname,u.firstname)) LIKE '%#{q}%') and members.course_group_id in #{group_ids}") end @members.each do |member| member[:course_score] = (member.score.nil? ? 0 : member.score) + (member.graduation_score.nil? ? 0 : member.graduation_score) + (member.ex_score.nil? ? 0 : member.ex_score) end =end =begin if @order == "student_id" @r_sort == "desc" ? @members.sort! {|x,y| y[:student_id].to_s <=> x[:student_id].to_s} : @members.sort! {|x,y| x[:student_id].to_s <=> y[:student_id].to_s} else @r_sort == "desc" ? @members = @members.sort{|x,y| y[:course_score] <=> x[:course_score] } : @members = @members.sort{|x,y| x[:course_score] <=> y[:course_score] } end =end @members = @course.members.where(:user_id => @course.student.pluck(:student_id) ).where("course_group_id in #{group_ids}").includes(:user => [:user_extensions]). where("user_extensions.student_id like '%#{q}%' OR LOWER(CONCAT(users.lastname,users.firstname)) LIKE '%#{q}%'").reorder("user_extensions.student_id #{@r_sort}") #分页 @member_count = @members.count @all_member_ids = @members.map(&:id).join(",") @limit = 20 @is_remote = true @page = (params['page'] || 1).to_i @member_pages = Paginator.new @member_count, @limit, @page @offset ||= @member_pages.offset @members = paginateHelper @members,@limit @import_attachments = Attachment.where(:container_id => @course.id, :container_type => "ImportStudent") # 统计上传的Excel数量 if !@group.present? @left_nav_type = 8 @group_name = @course.student_list else @left_nav_type = @group == 0 ? 9 : 10 if @group == 0 @group_name = "未分班" else @course_group = @course.course_groups.where(:id => @group).first @group_name = @course_group.try(:name) end end respond_to do |format| format.js format.html{render :layout => 'base_courses'} end end def no_group_student_list @order, @r_sort = params[:order] || "student_id", params[:sort] || "asc" @sort = @r_sort == "desc" ? "asc" : "desc" @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin? @search = params[:search] q = params[:search] ? "#{params[:search].strip}" : "" @members = Member.find_by_sql("SELECT members.*,( SELECT SUM(student_works.work_score) FROM student_works,homework_commons WHERE student_works.homework_common_id = homework_commons.id AND homework_commons.homework_type in (1, 3, 4) AND homework_commons.course_id = #{@course.id} AND student_works.user_id = members.user_id ) AS score,(SELECT SUM(exercise_users.score) FROM exercise_users,exercises WHERE exercise_users.exercise_id = exercises.id AND exercises.course_id = #{@course.id} AND exercise_users.user_id = members.user_id) AS ex_score FROM members JOIN students_for_courses ON students_for_courses.student_id = members.user_id AND students_for_courses.course_id = members.course_id WHERE members.course_id = #{@course.id} AND members.course_group_id = 0") # if @order == "student_id" # @members = @course.members.where(:course_group_id => 0).joins("join user_extensions on members.user_id = user_extensions.user_id").order("student_id #{@sort}").select{|m| m.roles.to_s.include?("Student")} # else # @members = @course.members.where(:course_group_id => 0).joins("join users on members.user_id = users.id").order("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@sort}, login #{@b_sort}").select{|m| m.roles.to_s.include?("Student")} # end if q.nil? || q == "" else members = [] @members.each do |m| username = m.user[:lastname].to_s.downcase + m.user[:firstname].to_s.downcase if m && m.user && (m.user.user_extensions[:student_id].to_s.downcase.include?(q) || username.include?(q)) members << m end end @members = members end @members.each do |member| member[:course_score] = (member.score.nil? ? 0 : member.score) + (member.ex_score.nil? ? 0 : member.ex_score) end @members = @members.sort{|x,y| y[:course_score] <=> x[:course_score] } #分页 @member_count = @members.count @all_member_ids = @members.map(&:id).join(",") @limit = 20 @is_remote = true @page = (params['page'] || 1).to_i @member_pages = Paginator.new @member_count, @limit, params['page'] || 1 @offset ||= @member_pages.offset @members = paginateHelper @members,@limit # @teacher_count = TeacherAndAssistantCount @course if @course.try(:id) != 1309 || User.current.admin? || User.current.try(:id) == 15582 @teacher_count = @course.members.includes(:roles, :user).where("roles.id" => [3,7,9]).count else @teacher_count = @course.members.includes(:roles, :user).where("roles.id" => [3,7]).count end @student_count = studentCount(@course) @no_group_count = @course.members.where(:course_group_id => 0).select{|m| m.roles.to_s.include?("Student")}.count @left_nav_type = 9 respond_to do |format| format.js format.html{render :layout => 'base_courses'} end end def has_group_student_list #@order, @r_sort = params[:order] || "student_id", params[:sort] || "asc" #@sort = @r_sort == "desc" ? "asc" : "desc" @search = params[:search] q = params[:search] ? "#{params[:search].strip}" : "" @group = @course.course_groups.find params[:group_id] @members = Member.find_by_sql("SELECT members.*,( SELECT SUM(student_works.work_score) FROM student_works,homework_commons WHERE student_works.homework_common_id = homework_commons.id AND homework_commons.homework_type in (1, 3, 4) AND homework_commons.course_id = #{@course.id} AND student_works.user_id = members.user_id ) AS score,(SELECT SUM(exercise_users.score) FROM exercise_users,exercises WHERE exercise_users.exercise_id = exercises.id AND exercises.course_id = #{@course.id} AND exercise_users.user_id = members.user_id) AS ex_score FROM members JOIN students_for_courses ON students_for_courses.student_id = members.user_id AND students_for_courses.course_id = members.course_id WHERE members.course_id = #{@course.id} AND members.course_group_id = #{@group.id}") # if @order == "student_id" # @members = @course.members.where(:course_group_id => @group.id).joins("join user_extensions on members.user_id = user_extensions.user_id").select{|m| m.roles.to_s.include?("Student")}.reorder("student_id #{@sort}") # else # @members = @course.members.where(:course_group_id => @group.id).joins("join users on members.user_id = users.id").select{|m| m.roles.to_s.include?("Student")}.reorder("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@sort}, login #{@b_sort}") # end if q.nil? || q == "" else members = [] @members.each do |m| username = m.user[:lastname].to_s.downcase + m.user[:firstname].to_s.downcase if m && m.user && (m.user.user_extensions[:student_id].to_s.downcase.include?(q) || username.include?(q)) members << m end end @members = members end @members.each do |member| member[:course_score] = (member.score.nil? ? 0 : member.score) + (member.ex_score.nil? ? 0 : member.ex_score) end @members = @members.sort{|x,y| y[:course_score] <=> x[:course_score] } @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin? #分页 @member_count = @members.count @all_member_ids = @members.map(&:id).join(",") @limit = 20 @is_remote = true @page = (params['page'] || 1).to_i @member_pages = Paginator.new @member_count, @limit, params['page'] || 1 @offset ||= @member_pages.offset @members = paginateHelper @members,@limit # @teacher_count = TeacherAndAssistantCount @course if @course.try(:id) != 1309 || User.current.admin? || User.current.try(:id) == 15582 @teacher_count = @course.members.includes(:roles, :user).where("roles.id" => [3,7,9]).count else @teacher_count = @course.members.includes(:roles, :user).where("roles.id" => [3,7]).count end @student_count = studentCount(@course) @no_group_count = @course.members.where(:course_group_id => 0).select{|m| m.roles.to_s.include?("Student")}.count @left_nav_type = 10 respond_to do |format| format.js format.html{render :layout => 'base_courses'} end end def choose_course_group @member_ids = params[:member_ids].split(",") if params[:group_id] @groups = @course.course_groups.where("id != #{params[:group_id]}").order("name asc") else @groups = @course.course_groups.order("name asc") end @group_id = params[:group_id] respond_to do |format| format.js end end def search_course_teacher_list q = params[:search] ? "#{params[:search].strip}" : "" @members = searchTeacherAndAssistantNoManager(@course) if q.nil? || q == "" else members = [] @members.each do |m| username = m.user[:lastname].to_s.downcase + m.user[:firstname].to_s.downcase if m && m.user && (m.user[:login].to_s.downcase.include?(q) || m.user[:mail].to_s.downcase.include?(q) || username.include?(q)) members << m end end @members = members end end #查找未分班的学生 def search_not_group_member @group = CourseGroup.find params[:group_id] @search = params[:search] q = params[:search] ? "#{params[:search].strip}" : "" @members = [] @members = @course.members.where("course_group_id = 0").joins("join user_extensions on members.user_id = user_extensions.user_id").order("student_id asc").select{|m| m.roles.to_s.include?("Student")} if q.nil? || q == "" else members = [] @members.each do |m| username = m.user[:lastname].to_s.downcase + m.user[:firstname].to_s.downcase if m && m.user && (m.user[:login].to_s.downcase.include?(q) || m.user.user_extensions[:student_id].to_s.downcase.include?(q) || username.include?(q)) members << m end end @members = members end @is_search = params[:is_search] ? 1 : 0 respond_to do |format| format.js end end def add_members @group = CourseGroup.find params[:group_id] if @group && params[:chooseStudent] params[:chooseStudent].each do |mem| member = Member.find mem if member && member.course == @course member.update_attribute('course_group_id', @group.id) end end redirect_to group_member_course_path(@course, :group_id => @group.id) end end def unjoin_group #@subPage_title = l :label_student_list group = CourseGroup.find(params[:group_id]) member = Member.find params[:member] @user = member.user member.course_group_id = 0 member.save @group = group @course = @group.course @teacher_count = searchTeacherAndAssistant(@course).count @student_count = @course.student.count @no_group_count = @course.members.where("course_group_id = 0").select{|m| m.roles.to_s.include?("Student")}.count end def searchgroupmembers @subPage_title = l :label_student_list @render_file = 'new_member_list' @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1' @is_remote = true @sort_type = 'score' @score_sort_by = "desc" @search_name = "" if params[:group_id] && params[:group_id] != "0" && params[:group_id] != "-1" @group = CourseGroup.find(params[:group_id]) @results = student_homework_score(@group.id,0, 0,"desc") # @results = paginateHelper @results, 10 elsif params[:group_id] && params[:group_id] == "-1" @group = -1 @results = student_homework_score(-1, 0, 10,"desc") else page_from = params[:page].nil? ? 0 : (params[:page].to_i - 1) @results = student_homework_score(0,page_from, 10,"desc") end @no_group_count = @course.members.where(:course_group_id => 0).select{|m| m.roles.to_s.include?("Student")}.count @course_groups = @course.course_groups @limit = 50 @page = params[:page].nil? ? 1 : params['page'].to_i @members_count = @results.count @mem_pages = Paginator.new @members_count, @limit, @page @results = paginateHelper @results, @limit end def group_member @canShowCode = isCourseTeacher(User.current.id,@course) @sort_type = 'score' @score_sort_by = "desc" if params[:group_id] && params[:group_id] != "0" && params[:group_id] != "-1" @group = CourseGroup.find(params[:group_id]) @results = student_homework_score(@group.id,0, 0,"desc") else page_from = params[:page].nil? ? 0 : (params[:page].to_i - 1) @results = student_homework_score(0,page_from, 10,"desc") end @limit = 50 @page = params[:page].nil? ? 1 : params['page'].to_i @members_count = @results.count @mem_pages = Paginator.new @members_count, @limit, @page @results = paginateHelper @results, @limit respond_to do |format| format.html {render :layout => 'base_courses'} format.js end end def member if User.current.member_of_course?(@course) || User.current.admin? # 当前用户查看班级消息时,设置消息为已读 update_messsages_to_viewed("CourseMessage", @course) ## 有角色参数的才是课程,没有的就是项目 @order, @r_sort = params[:order] || "student_id", params[:sort] || "asc" @sort = @r_sort == "desc" ? "asc" : "desc" @search = params[:search] q = params[:search] ? "#{params[:search].strip}" : "" if params[:role] == 't' @members = searchTeacherAndAssistant(@course) elsif params[:role] == 'as' if @order == "student_id" @members = @course.members.joins("join user_extensions on members.user_id = user_extensions.user_id").order("student_id #{@sort}").select{|m| m.roles.to_s.include?("Student")} else @members = @course.members.joins("join users on members.user_id = users.id").order("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@sort}, login #{@b_sort}").select{|m| m.roles.to_s.include?("Student")} end elsif params[:role] == 'ns' if @order == "student_id" @members = @course.members.where(:course_group_id => 0).joins("join user_extensions on members.user_id = user_extensions.user_id").order("student_id #{@sort}").select{|m| m.roles.to_s.include?("Student")} else @members = @course.members.where(:course_group_id => 0).joins("join users on members.user_id = users.id").order("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@sort}, login #{@b_sort}").select{|m| m.roles.to_s.include?("Student")} end else @group = @course.course_groups.find params[:role] if @order == "student_id" @members = @course.members.where(:course_group_id => @group.id).joins("join user_extensions on members.user_id = user_extensions.user_id").order("student_id #{@sort}").select{|m| m.roles.to_s.include?("Student")} else @members = @course.members.where(:course_group_id => @group.id).joins("join users on members.user_id = users.id").order("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@sort}, login #{@b_sort}").select{|m| m.roles.to_s.include?("Student")} end end if q.nil? || q == "" else members = [] @members.each do |m| username = m.user[:lastname].to_s.downcase + m.user[:firstname].to_s.downcase if m && m.user && (m.user.user_extensions[:student_id].to_s.downcase.include?(q) || username.include?(q)) members << m end end @members = members end #分页 @member_count = @members.count @limit = 20 @is_remote = true @page = (params['page'] || 1).to_i @member_pages = Paginator.new @member_count, @limit, params['page'] || 1 @offset ||= @member_pages.offset @members = paginateHelper @members,@limit @teacher_count = TeacherAndAssistantCount @course @student_count = studentCount(@course) @no_group_count = @course.members.where(:course_group_id => 0).select{|m| m.roles.to_s.include?("Student")}.count respond_to do |format| if @search format.js else format.html {render :layout => 'base_edu'} format.js end end else render_403 end end def export_course_member_excel q = params[:name] ? "#{params[:name].strip}" : "" filename="#{@course.teacher.show_real_name.to_s }_#{@course.name}_#{l(:excel_member_list)}"; if params[:group_id] && params[:group_id] != "0" && params[:group_id] != "-1" group = CourseGroup.find params[:group_id] unless group.nil? @all_members = searchmember_by_name(student_homework_score(group.id,0,0,"desc"), q) filename="#{@course.teacher.show_real_name.to_s }_#{@course.name}_#{group.name}_#{l(:excel_member_list)}" end elsif params[:group_id] && params[:group_id] == "0" @all_members = searchmember_by_name(student_homework_score(-1, 0, 10,"desc"), q) filename="#{@course.teacher.show_real_name.to_s }_#{@course.name}_未分班_#{l(:excel_member_list)}" else @all_members = searchmember_by_name(student_homework_score(0, 0, 10,"desc"), q) end @homeworks = @course.homework_commons.where("publish_time <= '#{Time.now}'").order("publish_time asc, created_at asc") @exercises = @course.exercises.where("publish_time <= '#{Time.now}'").order("publish_time asc, created_at asc") @tasks = @course.graduation_tasks.where("publish_time <= '#{Time.now}'").order("publish_time asc, created_at asc") =begin @homeworks.where(:homework_type => 4).each do |homework| items = homework.student_works.where("work_status != 0") if items.count == 0 && homework.publish_time < Time.now && !@course.is_end update_shixun_work_status homework end end =end respond_to do |format| format.xls { send_data(member_to_xls(@homeworks, @exercises, @tasks, @course,@all_members,@course.course_groups), :type => "text/excel;charset=utf-8; header=present", :filename => filename_for_content_disposition("#{filename}.xls")) } end end def member_score_sort @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1' @subPage_title = l :label_student_list @render_file = 'new_member_list' @is_remote = true @sort_type = params[:sort_type] if params[:sort_type] @score_sort_by = params[:sort_by] if params[:sort_by] @search_name = params[:search_name] if params[:search_name] group_id = params[:group_id] if !@search_name.nil? if group_id == '0' #page = params[:page].nil? ? 0 : (params['page'].to_i - 1) @results = searchmember_by_name(student_homework_score(0,0,0,@score_sort_by,@sort_type), @search_name) # @results = paginateHelper @results, 10 elsif group_id == '-1' @group = -1 @results = searchmember_by_name(student_homework_score(-1,0,0,@score_sort_by,@sort_type), @search_name) else @group = CourseGroup.find(group_id) @results = searchmember_by_name(student_homework_score(group_id, 0, 0,@score_sort_by,@sort_type),@search_name) # @results = paginateHelper @results, 10 end else if group_id == '0' page = params[:page].nil? ? 0 : (params['page'].to_i - 1) @results = student_homework_score(0,page, 10,@score_sort_by,@sort_type) elsif group_id == '-1' @group = -1 @results = student_homework_score(-1,0, 10,@score_sort_by,@sort_type) else @group = CourseGroup.find(group_id) @results = student_homework_score(group_id, 0, 0,@score_sort_by,@sort_type) end end @limit = 50 @page = params[:page].nil? ? 1 : params['page'].to_i @members_count = @results.count @no_group_count = @course.members.where(:course_group_id => 0).select{|m| m.roles.to_s.include?("Student")}.count @mem_pages = Paginator.new @members_count, @limit, @page @results = paginateHelper @results, @limit end # 显示每个学生的作业评分详情 def show_member_score @member_score = Member.find(params[:member_id]) if params[:member_id] respond_to do |format| format.html {render :layout => 'course_base'} format.js end end # 显示每个学生的作业评分详情 def show_member_act_score @member = Member.find(params[:member_id]) if params[:member_id] respond_to do |format| format.html {render :layout => 'course_base'} format.js end end def delete_member member = @course.members.find params[:member_id] student_role = member.member_roles.where("role_id = 10").first teacher_role = member.member_roles.where("role_id = 7 || role_id = 9").first joined = StudentsForCourse.where('student_id = ? and course_id = ?', member.user_id,@course.id) joined.destroy_all if member && member.deletable? && student_role user_admin = CourseInfos.where("user_id = ? and course_id = ?", member.user_id, @course.id) if user_admin.size > 0 user_admin.destroy_all end if member.member_roles.count > 1&& student_role && teacher_role student_role.destroy teacher_role.update_attribute("is_current", 1) member.update_attribute("course_group_id", 0) else member.destroy end #移出课程发送消息 CourseMessage.create(:user_id => member.user_id, :course_id => @course.id, :course_message_type => "RemoveFromCourse", :viewed => false, :course_message_id => User.current.id) @course_groups = @course.course_groups @no_group_count = @course.members.where(:course_group_id => 0).select{|m| m.roles.to_s.include?("Student")}.count @canShowCode = isCourseTeacher(User.current.id,@course) respond_to do |format| format.js end end end def handle_course courses, activities course_activity_count_array=activities.values() course_array=[] i=0; courses.each do |course| course_array[i]=course i=i+1 end courses=desc_sort_course_by_avtivity(course_activity_count_array, course_array) return courses end def settings if User.current.allowed_to?(:as_teacher,@course) @board = @course.boards.where(:parent_id => 0).first @course_boards = @board.children.reorder("position asc") @tab = params[:tab] ? params[:tab].to_i : 1 @curr_page = "设置" respond_to do |format| format.html { render :layout => 'base_edu_course' } format.api { render_validation_errors(@course) } end else render_403 end end def update_course_module course_modules = @course.course_modules course_modules.where(:module_type => 'activity').first.update_attributes(:module_name => params[:name][0]) for i in 1..9 course_module = course_modules.where(:module_type => params[:position][i]).first if course_module.present? course_module.update_attributes(:position => i+1, :module_name => params[:name][i] == "" ? course_module.default_module_name : params[:name][i]) end end # params[:message] 有值 就更行字段: 0为不隐藏,1为隐藏 type = ["shixun_homework", "common_homework", "group_homework", "graduation", "exercise", "poll", "attachment", "board", "course_group"] hidden = type - params[:message] course_modules.where(:module_type => params[:message]).update_all(:hidden => 0) course_modules.where(:module_type => hidden).update_all(:hidden => 1) if params[:teacher_list] && params[:teacher_list].strip != "" @course.update_attributes(:teacher_list => params[:teacher_list].strip) end if params[:student_list] && params[:student_list].strip != "" @course.update_attributes(:student_list => params[:student_list].strip) end respond_to do |format| format.js end end def private_or_public if @course.is_public == 0 @course.update_attributes(:is_public => 1) else @course.update_attributes(:is_public => 0) end if @course.is_public == 0 course_status = CourseStatus.find_by_course_id(@course.id) course_status.destroy if course_status elsif @course.is_public == 1 course_status = CourseStatus.find_by_course_id(@course.id) course_status.destroy if course_status course_status = CourseStatus.create(:course_id => @course.id, :grade => 0) end @syllabus = @course.syllabus respond_to do |format| format.js end end def search_member if User.current.allowed_to?(:as_teacher,@course) || User.current.admin q = "#{params[:name].strip}" @roles = Role.givable.all[3..5] if q.nil? || q == "" @members = @course.member_principals.includes(:roles, :principal).all.sort else @members = searchmember_by_name(@course.member_principals.includes(:roles, :principal).all.sort,q) end else render_403 end end def create cs = CoursesService.new @course = cs.create_course(params,User.current)[:course] if @course #发送微信消息 # count = ShieldWechatMessage.where("container_type='User' and container_id=#{User.current.id} and shield_type='Course' and shield_id=#{@course.id}").count # if count == 0 # ss = SyllabusesService.new # ss.send_wechat_create_class_notice User.current,@course # end respond_to do |format| flash[:notice] = l(:notice_successful_create) format.html {redirect_to course_url(@course)} format.api { render :action => 'show', :status => :created, :location => url_for(:controller => 'courses', :action => 'show', :id => @course.id) } end else respond_to do |format| flash[:notice] = l(:notice_create_failed) # @course = Course.new format.html { redirect_to new_course_path } #Added by young format.api { render_validation_errors(@course) } end end end def course @school_id = params[:school_id] per_page_option = 10 if @school_id == "0" or @school_id.nil? @courses_all = Course.active.visible. joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id") else @courses_all = Course.active.visible. joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id"). joins(:course_extra). where("#{Course.table_name}.school_id = ?", @school_id) end @course_count = @courses_all.count @course_pages = Paginator.new @course_count, per_page_option, params['page'] @course_activity_count=Hash.new @courses_all.each do |course| @course_activity_count[course.id]=0 end case params[:course_sort_type] when '0' @courses = @courses_all.order("created_on desc") @s_type = 0 @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page) @course_activity_count=get_course_activity @courses,@course_activity_count when '1' @courses = @courses_all.order("course_ac_para desc") @s_type = 1 @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page) @course_activity_count=get_course_activity @courses,@course_activity_count when '2' @courses = @courses_all.order("watchers_count desc") @s_type = 2 @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page) @course_activity_count=get_course_activity @courses,@course_activity_count when '3' @course_activity_count=get_course_activity @courses_all,@course_activity_count @courses=handle_course @courses_all,@course_activity_count @s_type = 3 @courses = @courses[@course_pages.offset, @course_pages.per_page] else @s_type = 0 @courses = @courses_all.order("created_on desc") @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page) @course_activity_count=get_course_activity @courses,@course_activity_count end respond_to do |format| format.html { render :layout => 'new_base' } format.api { } format.atom { courses = Course.visible.order('created_on DESC').limit(Setting.feeds_limit.to_i).all render_feed(courses, :title => "#{Setting.app_title}: #{l(:label_course_latest)}") } end end def new if User.current.login? if User.current.user_extensions.try(:identity) == 1 render_403 else @course = Course.new @course.safe_attributes = params[:course] # month = Time.now.month render :layout => 'base_edu' end else redirect_to signin_url end end def search_course_list data = {courses: []} search = params[:search] ? "%#{params[:search].strip}%" : "%%" CourseList.where("name like '#{search}'").each do |course| option = [] option << course.name.to_s option << course.id data[:courses] << option end render :json => data end def desc_sort_course_by_avtivity(activity_count, courses) return courses if activity_count.size<2 (activity_count.size-2).downto(0) do |i| (0..i).each do |j| if activity_count[j] params[:category_name]) end # redirect_to homework_common_index_path(:course => @course.id, :homework_type => 4) end # 重命名实训作业目录 def rename_homework_category if request.get? @category = @course.course_homework_categories.where(:id => params[:category_id]).first else category = @course.course_homework_categories.where(:id => params[:category_id]).first if category.present? category.update_attributes(:name => params[:category_name]) end redirect_to homework_common_index_path(:course => @course.id, :homework_type => 4, :category => params[:category_id]) end end # 删除实训作业子目录 def delete_homework_category category = @course.course_homework_categories.where(:id => params[:category_id]).first if category.present? category.homework_commons.update_all(:course_homework_category_id => nil) category.destroy end redirect_to homework_common_index_path(:course => @course.id, :homework_type => 4) end def toggleCourse @course_prefs = Course.find_by_extra(@course.extra) unless (User.current.allowed_to?(:as_teacher,@course_prefs) || User.current.admin?) render_403 end end def is_deleted if @course.is_delete == 1 and !User.current.admin? render_404 return end end def get_courses @user = User.current membership = @user.coursememberships.all membership.sort! {|older, newer| newer.created_on <=> older.created_on } @memberships = [] membership.collect { |e| @memberships.push(e) } @memberships_doing = [] @memberships_done = [] now_time = Time.now.year @memberships.map { |e| end_time = e.course.get_time.year isDone = course_endTime_timeout?(e.course) if isDone @memberships_done.push e else @memberships_doing.push e end } end def finishcourse yesterday = Date.today.prev_day.to_time @course_prefs.endup_time = yesterday @save_flag = @course_prefs.save get_courses respond_to do |format| format.js end end def restartcourse day = Time.parse("3000-01-01") @course_prefs.endup_time = day @save_flag = @course_prefs.save get_courses respond_to do |format| format.js { render action:'finishcourse' } end end def course_activity redirect_to course_url(@course, type: params[:type], page: params[:page]) end def show # 被删除的课程只有超级管理员才能看到,is_delete为1的时候,标记课程被删除 # if @course.is_delete == 1 && !User.current.admin? # render_403 # return # end #更新创建课程消息状态 # course_request_messages = CourseMessage.where(:user_id => User.current.id, :course_id => @course.id, :course_message_type => ["CourseRequestDealResult", "Course"], :viewed => false) # course_request_messages.update_all(:viewed => true) # create_course_messages = @course.course_messages.where("user_id =? and course_message_type =? and course_id =? and viewed =?", User.current.id, 'Course', @course.id, 0) # create_course_messages.update_all(:viewed => true) #更新申请结果反馈消息的状态 # course_request_messages = CourseMessage.where("user_id =? and course_id =? and course_message_type =? and viewed =?", User.current.id, @course.id, 'CourseRequestDealResult', false) # course_request_messages.update_all(:viewed => true) @course_modules = @course.course_modules.where(:hidden => 0) course_module_type = @course_modules.map(&:module_type) @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin? || User.current.business? if User.current.member_of_course?(@course) && !@is_teacher member = @course.members.where(:user_id => User.current.id).first if member.try(:course_group_id).to_i == 0 common_homework_ids = @course.homework_commons.where("homework_type = 1 and unified_setting = 1") shixun_homework_ids = @course.homework_commons.where("homework_type = 4 and unified_setting = 1") group_homework_ids = @course.homework_commons.where("homework_type = 3 and unified_setting = 1") exercise_ids = @course.exercises.where("unified_setting = 1") poll_ids = @course.polls.where("unified_setting = 1") atta_ids = @course.attachments.where("unified_setting = 1") else not_homework_ids = @course.homework_group_settings.where("course_group_id = #{member.try(:course_group_id)} and (publish_time > '#{Time.now}' or publish_time is null)") not_homework_ids = not_homework_ids.blank? ? "(-1)" : "(" + not_homework_ids.map(&:homework_common_id).join(",") + ")" common_homework_ids = @course.homework_commons.where("homework_type = 1 and id not in #{not_homework_ids}") shixun_homework_ids = @course.homework_commons.where("homework_type = 4 and id not in #{not_homework_ids}") group_homework_ids = @course.homework_commons.where("homework_type = 3 and id not in #{not_homework_ids}") not_exercise_ids = @course.exercise_group_settings.where("course_group_id = #{member.try(:course_group_id)} and (publish_time > '#{Time.now}' or publish_time is null)") not_exercise_ids = not_exercise_ids.blank? ? "(-1)" : "(" + not_exercise_ids.map(&:exercise_id).join(",") + ")" exercise_ids = @course.exercises.where("id not in #{not_exercise_ids}") not_poll_ids = @course.poll_group_settings.where("course_group_id = #{member.try(:course_group_id)} and (publish_time > '#{Time.now}' or publish_time is null)") not_poll_ids = not_poll_ids.blank? ? "(-1)" : "(" + not_poll_ids.map(&:poll_id).join(",") + ")" poll_ids = @course.polls.where("id not in #{not_poll_ids}") not_atta_ids = @course.attachment_group_settings.where("course_group_id = #{member.try(:course_group_id)} and publish_time > '#{Time.now}'") not_atta_ids = not_atta_ids.blank? ? "(-1)" : "(" + not_atta_ids.map(&:attachment_id).join(",") + ")" atta_ids = @course.attachments.where("id not in #{not_atta_ids}") end else common_homework_ids = @course.homework_commons.where("homework_type = 1") shixun_homework_ids = @course.homework_commons.where("homework_type = 4") group_homework_ids = @course.homework_commons.where("homework_type = 3") exercise_ids = @course.exercises poll_ids = @course.polls atta_ids = @course.attachments end common_homework_ids = common_homework_ids.blank? ? "(-1)" : "(" + common_homework_ids.map(&:id).join(",") + ")" shixun_homework_ids = shixun_homework_ids.blank? ? "(-1)" : "(" + shixun_homework_ids.map(&:id).join(",") + ")" group_homework_ids = group_homework_ids.blank? ? "(-1)" : "(" + group_homework_ids.map(&:id).join(",") + ")" exercise_ids = exercise_ids.blank? ? "(-1)" : "(" + exercise_ids.map(&:id).join(",") + ")" poll_ids = poll_ids.blank? ? "(-1)" : "(" + poll_ids.map(&:id).join(",") + ")" atta_ids = atta_ids.blank? ? "(-1)" : "(" + atta_ids.map(&:id).join(",") + ")" if @is_teacher && course_module_type.include?('board') course_act_type = "('Message', 'JoinCourse')" elsif @is_teacher course_act_type = "('JoinCourse')" elsif course_module_type.include?('board') course_act_type = "('Message')" else course_act_type = "('0')" end sql_str = "course_act_type in #{course_act_type}" @course_modules.each do |course_module| case course_module.module_type when "shixun_homework" sql_str += " or (course_act_type = 'HomeworkCommon' && course_act_id in #{shixun_homework_ids})" when "common_homework" sql_str += " or (course_act_type = 'HomeworkCommon' && course_act_id in #{common_homework_ids})" when "group_homework" sql_str += " or (course_act_type = 'HomeworkCommon' && course_act_id in #{group_homework_ids})" when "graduation" sql_str += " or (course_act_type = 'GraduationTopic' or course_act_type = 'GraduationTask')" when "exercise" sql_str += " or (course_act_type = 'Exercise' && course_act_id in #{exercise_ids})" when "poll" sql_str += " or (course_act_type = 'Poll' && course_act_id in #{poll_ids})" when "attachment" sql_str += " or (course_act_type = 'Attachment' && course_act_id in #{atta_ids})" end end @page = params[:page] ? params[:page].to_i + 1 : 0 if params[:type].present? case params[:type] when "common_homework" # homework_ids = @course.homework_commons.where("homework_type = 1 and id in #{homework_ids}") @course_activities = @course.course_activities.where("course_act_type = 'HomeworkCommon' and course_act_id in #{common_homework_ids}").order('updated_at desc') when "shixun_homework" # homework_ids = @course.homework_commons.where("homework_type = 4 and id in #{homework_ids}") @course_activities = @course.course_activities.where("course_act_type = 'HomeworkCommon' and course_act_id in #{shixun_homework_ids}").order('updated_at desc') when "group_homework" # homework_ids = @course.homework_commons.where("homework_type = 3 and id in #{homework_ids}") @course_activities = @course.course_activities.where("course_act_type = 'HomeworkCommon' and course_act_id in #{group_homework_ids}").order('updated_at desc') when "graduation_topic" @course_activities = @course.course_activities.where("course_act_type = 'GraduationTopic'").order('updated_at desc') when "graduation_task" @course_activities = @course.course_activities.where("course_act_type = 'GraduationTask'").order('updated_at desc') when "news" @course_activities = @course.course_activities.where("course_act_type = 'News'").order('updated_at desc') when "message" @course_activities = @course.course_activities.where("course_act_type = 'Message'").order('updated_at desc') when "poll" @course_activities = @course.course_activities.where("course_act_type = 'Poll' && course_act_id in #{poll_ids}").order('updated_at desc') when "exercise" @course_activities = @course.course_activities.where("course_act_type = 'Exercise' && course_act_id in #{exercise_ids}").order('updated_at desc') when "attachment" @course_activities = @course.course_activities.where("course_act_type = 'Attachment' && course_act_id in #{atta_ids}").order('updated_at desc') when 'JoinCourse' @course_activities = @course.course_activities.where("course_act_type = 'JoinCourse'").order('updated_at desc') when "journalsForMessage" @course_activities = @course.course_activities.where("course_act_type = 'JournalsForMessage'").order('updated_at desc') else @course_activities = @course.course_activities.where("#{sql_str}").order('updated_at desc') end else @course_activities = @course.course_activities.where("#{sql_str}").order('updated_at desc') end @course_activities_count = @course_activities.size @course_activities = @course_activities.limit(10).offset(@page * 10) @type = params[:type] @left_nav_type = 1 @show_page = true respond_to do |format| format.js format.html{render :layout => 'base_courses'} format.api end end #判断指定用户是否为课程教师 def isCourseTeacher(id,course) result = false user = User.find(id) if !user.nil? && user.allowed_to?(:as_teacher,course) result = true end result end def feedback CourseMessage.where("user_id = ? and course_id = ?", User.current, @course.id).update_all(:viewed => true) if (User.current.admin? || @course.is_public == 1 || (@course.is_public == 0 && User.current.member_of_course?(@course))) page = params[:page] # Find the page of the requested reply @jours = @course.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC') @jour_count = @jours.count @limit = 10 if params[:r] && page.nil? offset = @jours.count(:conditions => ["#{JournalsForMessage.table_name}.id > ?", params[:r].to_i]) page = 1 + offset / @limit end @jour = paginateHelper @jours,10 @state = false @left_nav_type = 6 respond_to do |format| format.html{render :layout => 'base_courses'} format.api end else render_403 end end def search_homework_member homeworks,name if name == "" select_homework = homeworks else name = name.downcase select_homework = homeworks.select{ |homework| homework.user[:login].to_s.downcase.include?(name) || homework.user.user_extensions[:student_id].to_s.downcase.include?(name) || (homework.user[:lastname].to_s.downcase + homework.user[:firstname].to_s.downcase).include?(name) } end select_homework end # 作业查重 def code_repeat #代码查重新加的 @index = params[:index] @order,@b_sort,@name,@group = params[:order] || "score",params[:sort] || "desc",params[:name] || "",params[:group] @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin? if !@is_teacher render_403 return end @homework = HomeworkCommon.find params[:homework] #order("#{@order} #{@b_sort}" @student_works = search_homework_member @homework.student_works.select("student_works.*,IF(final_score is null,null,IF(final_score = 0, 0, final_score - absence_penalty - late_penalty)) as score").order("simi_value desc").has_committed,@name @works_hash = {} @student_works.each do |tmpwork| @works_hash[tmpwork.id] = tmpwork puts tmpwork.id end respond_to do |format| format.html {render :layout => 'base_edu'} end end def show_comparecode @index = params[:index] src_id = params[:src_id] dst_id = params[:dst_id] @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin? if !@is_teacher render_403 return end src_work = StudentWork.where("id =?", src_id).first @homework = HomeworkCommon.find params[:homework_id] @simi_value = src_work.simi_value.to_i @src_code = src_work.description src_user = User.where("id =?", src_work.user_id).first @src_username = src_user.try(:realname) != " " ? src_user.lastname + src_user.firstname : src_user.try(:login) #descriotion user name dst_work = StudentWork.where("id =?", dst_id).first @dst_code = dst_work.description dst_user = User.where("id =?", dst_work.user_id).first @dst_username = dst_user.try(:realname) != " " ? dst_user.lastname + dst_user.firstname : dst_user.try(:login) respond_to do |format| format.html{render :layout => 'base_edu'} end end # 判断非本课堂成员的老师是否有权限复制课堂 def validate_copy_permission status = 0 if User.current.professional_certification && User.current.user_extensions.identity == 0 status = 1 end render :json => {:status => status} end #根据已有课程复制课程 #param id:已有课程ID def copy_course unless User.current.logged? return render_403 end cs = CoursesService.new course = cs.copy_a_course(@course)[:course] if course redirect_to course_path(course) end end #从课程创建的老师那里选择课程大纲 def course_outline @teacher = User.find(@course.tea_id) @blog_articles = @teacher.blog.articles @is_in_show_outline_page = params[:is_in_show_outline_page] respond_to do |format| format.js end end #根据关键字搜索,查找方法一样的,但返回内容不一样 def search_course_outline @article_title = params[:title] @teacher = User.find(@course.tea_id) @blog_articles = @teacher.blog.articles.like(@article_title) render :json=>@blog_articles.to_json end #设置或者更改课程的大纲 def set_course_outline @course.outline = params[:outline_id] @course.save @is_in_show_outline_page = params[:is_in_show_outline_page] respond_to do |format| format.js end end #显示课程大纲 def syllabus @article = BlogComment.find(@course.outline) respond_to do |format| format.html {render :layout => 'base_courses'} end end #删除课程 #删除课程只是将课程的is_deleted状态改为false,is_deleted为false状态的课程只有管理员可以看到 def destroy @course_id = @course.id syllabus = @course.syllabus @course.delete! respond_to do |format| format.js format.html{redirect_to courses_path()} end # redirect_to :back end #归档班级 def archive_course if params[:source] == "1" @syllabus = @course.syllabus end if params[:type] == "0" @course.delete! else @course.update_attribute(:is_delete, false) end respond_to do |format| format.js end end # 恢复已删除的课程 def renew if User.current.admin? @course.update_attributes(:is_delete => false) redirect_to course_path(@course) else return 404 end end #搜索作业 def homework_search @search = "%#{params[:search].strip.downcase}%" @is_teacher = User.current.logged? && (User.current.admin? || User.current.allowed_to?(:as_teacher,@course)) @page = params[:page] ? params[:page].to_i + 1 : 0 if @is_teacher @homeworks = @course.homework_commons.where("name like '%#{@search}%'").order("created_at desc").limit(10).offset(@page * 10) else @homeworks = @course.homework_commons.where("name like '%#{@search}%' and publish_time <= '#{Time.now}'").order("created_at desc").limit(10).offset(@page * 10) end end #统计 def course_statistics @left_nav_type = 10 @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} 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" @homework_id = params[:homework_id] ? params[:homework_id].to_i : 0 @type = params[:type] ? params[:type] : 'project_act_score' if @homework_id == 0 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}" else 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} AND student_work_projects.homework_common_id = #{@homework_id} GROUP BY pss.project_id ORDER BY #{@type} #{@order}, project_act_score #{@order}" end @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'} end end #切换身份 def switch_role members = @course.members.where("user_id = #{params[:user_id]}") unless members.blank? #role = MemberRole.where("member_id = #{members.first.id} and role_id = #{params[:role]}").first curr_role = MemberRole.find_by_member_id_and_role_id(members.first.id, params[:curr_role]) tar_role = MemberRole.find_by_member_id_and_role_id(members.first.id, params[:tar_role]) unless (curr_role.nil? || tar_role.nil?) curr_role.update_column('is_current', 0) tar_role.update_column('is_current', 1) end end redirect_to course_path(@course) end def search_not_teachers # members = searchTeacherAndAssistant @course member_ids = Member.find_by_sql("SELECT user_id from members where id in (SELECT member_id FROM `member_roles` where role_id in (3,7,9) and member_id in (select id from members where course_id=#{@course.id}))") member_ids = "(" + member_ids.map(&:user_id).join(',') + ")" condition = "%#{params[:search]}%".gsub(" ","") @school = params[:school] || @course.teacher.school_name if @school != "" school_s = "%#{@school}%".gsub(" ","") school_ids = School.where("name like '#{school_s}'").blank? ? "(-1)" : "(" + School.where("name like '#{school_s}'").map(&:id).join(",") + ")" @users = User.joins(:user_extensions).where("users.id not in #{member_ids} and status = 1 and LOWER(concat(lastname, firstname)) LIKE '#{condition}' and user_extensions.school_id in #{school_ids}") else @users = User.where("id not in #{member_ids} and status = 1 and LOWER(concat(lastname, firstname)) LIKE '#{condition}'").includes(:user_extensions) end @role = params[:role].to_i @user_ids = @users.map(&:id).join(",") @limit = 10 @page = params[:page].nil? ? 1 : params['page'].to_i @users_count = @users.count @total_pages = (@users_count / 10.0).ceil @users_pages = Paginator.new @users_count, @limit, @page @users = paginateHelper @users, @limit respond_to do |format| format.js format.json { render json: search_teacher_json_data(@users) } end end def search_not_students members = @course.members.select{|m| m.roles.to_s.include?("Student")} member_ids = members.empty? ? "(-1)" : "(" + members.map(&:user_id).join(',') + ")" condition = "%#{params[:search]}%".gsub(" ","") @school = params[:school] || @course.teacher.school_name if @school != "" school_s = "%#{@school}%".gsub(" ","") school_ids = School.where("name like '#{school_s}'").blank? ? "(-1)" : "(" + School.where("name like '#{school_s}'").map(&:id).join(",") + ")" @users = User.joins(:user_extensions).where("users.id not in #{member_ids} and status = 1 and user_extensions.school_id in #{school_ids} and (LOWER(concat(lastname, firstname)) LIKE '#{condition}' or user_extensions.student_id LIKE '#{condition}')") else @users = User.joins(:user_extensions).where("users.id not in #{member_ids} and status = 1 and (LOWER(concat(lastname, firstname)) LIKE '#{condition}' or user_extensions.student_id LIKE '#{condition}')") end @user_ids = @users.map(&:id).join(",") @limit = 8 @page = params[:page].nil? ? 1 : params['page'].to_i @users_count = @users.count @total_pages = (@users_count / 10.0).ceil @users_pages = Paginator.new @users_count, @limit, @page @users = paginateHelper @users, @limit respond_to do |format| format.js format.json { render json: search_student_json_data(@users) } end end private def allow_join course if course_endTime_timeout? course respond_to do |format| format.js { @state = 2 render :partial => 'set_join', :locals => {:user => User.current, :course => Course.find(params[:object_id]), :object_id => params[:object_id] } } end end end #验证是否显示课程 def can_show_course @first_page = FirstPage.find_by_page_type('project') if @first_page.try(:show_course) == 2 render_404 end end def student_homework_score(groupid,start_from, nums, score_sort_by, sort_type = 'score') start_from = start_from * nums if groupid == 0 sql_select = "SELECT members.*,( 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 = members.user_id ) AS score, (SELECT SUM(gw.work_score) FROM graduation_works gw,graduation_tasks gt WHERE gw.graduation_task_id = gt.id AND gt.course_id = #{@course.id} AND gw.user_id = members.user_id) AS graduation_score, (SELECT SUM(exercise_users.score) FROM exercise_users,exercises WHERE exercise_users.exercise_id = exercises.id AND exercises.course_id = #{@course.id} AND exercise_users.user_id = members.user_id) AS ex_score, (SELECT max(student_id) FROM user_extensions WHERE user_extensions.user_id = members.user_id) AS student_id, (SELECT max(message_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_num, (SELECT max(message_reply_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_reply_num, (SELECT max(resource_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS resource_num, (SELECT max(homework_journal_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_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 = members.user_id) AS graduation_num, (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 = members.user_id) AS homework_num, (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 = members.user_id) AS exercise_num, (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 = members.user_id) AS poll_num FROM members JOIN students_for_courses ON students_for_courses.student_id = members.user_id AND students_for_courses.course_id = members.course_id WHERE members.course_id = #{@course.id} ORDER BY #{sort_type} #{score_sort_by}" elsif groupid == -1 sql_select = "SELECT members.*,( 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 = members.user_id ) AS score, (SELECT SUM(gw.work_score) FROM graduation_works gw,graduation_tasks gt WHERE gw.graduation_task_id = gt.id AND gt.course_id = #{@course.id} AND gw.user_id = members.user_id) AS graduation_score, (SELECT SUM(exercise_users.score) FROM exercise_users,exercises WHERE exercise_users.exercise_id = exercises.id AND exercises.course_id = #{@course.id} AND exercise_users.user_id = members.user_id) AS ex_score, (SELECT max(student_id) FROM user_extensions WHERE user_extensions.user_id = members.user_id) AS student_id, (SELECT max(message_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_num, (SELECT max(message_reply_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_reply_num, (SELECT max(resource_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS resource_num, (SELECT max(homework_journal_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_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 = members.user_id) AS graduation_num, (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 = members.user_id) AS homework_num, (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 = members.user_id) AS exercise_num, (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 = members.user_id) AS poll_num FROM members JOIN students_for_courses ON students_for_courses.student_id = members.user_id AND students_for_courses.course_id = members.course_id WHERE members.course_id = #{@course.id} AND members.course_group_id = 0 ORDER BY #{sort_type} #{score_sort_by}" else sql_select = "SELECT members.*,( 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 = members.user_id ) AS score, (SELECT SUM(gw.work_score) FROM graduation_works gw,graduation_tasks gt WHERE gw.graduation_task_id = gt.id AND gt.course_id = #{@course.id} AND gw.user_id = members.user_id) AS graduation_score, (SELECT SUM(exercise_users.score) FROM exercise_users,exercises WHERE exercise_users.exercise_id = exercises.id AND exercises.course_id = #{@course.id} AND exercise_users.user_id = members.user_id) AS ex_score, (SELECT max(student_id) FROM user_extensions WHERE user_extensions.user_id = members.user_id) AS student_id, (SELECT max(message_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_num, (SELECT max(message_reply_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_reply_num, (SELECT max(resource_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS resource_num, (SELECT max(homework_journal_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_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 = members.user_id) AS graduation_num, (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 = members.user_id) AS homework_num, (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 = members.user_id) AS exercise_num, (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 = members.user_id) AS poll_num FROM members JOIN students_for_courses ON students_for_courses.student_id = members.user_id AND students_for_courses.course_id = members.course_id WHERE members.course_id = #{@course.id} AND members.course_group_id = #{groupid} ORDER BY #{sort_type} #{score_sort_by}" end sql = ActiveRecord::Base.connection() homework_scores = Member.find_by_sql(sql_select) sql.close() homework_scores end #获取课程的老师列表 def find_course_teachers course searchTeacherAndAssistant(course).map{|teacher| teacher.user_id}.join(",") end #当加入,退出分班时查询分班的学生 def search_group_members group @render_file = 'new_member_list' @canShowCode = isCourseTeacher(User.current.id,@course) @is_remote = true @score_sort_by = "desc" @results = student_homework_score(group.id,0,0, "desc") @limit = 50 @page = params[:page].nil? ? 1 : params['page'].to_i @members_count = @results.count @mem_pages = Paginator.new @members_count, @limit, @page @results = paginateHelper @results, @limit end def shixun_xls homeworks, course xls_report = StringIO.new book = Spreadsheet::Workbook.new blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 black = Spreadsheet::Format.new :color => :black, :weight => :bold, :size => 10 current_row = 0 sheet = book.create_worksheet :name => "学员统计" sheet.row(0).default_format = blue sheet.row(0).concat(["学生id","学生姓名","作业编号","作业/实训名称","关卡"," 经验值","金币","评测历史","评测时间","评测结果"]) course.student.each_with_index do |course, i| # 总统计 count_exp_score = 0 count_gold_score = 0 count_test = 0 count_time = 0 game_count = 0 # end user = course.student current_row += 1 sheet[current_row, 0] = user.login sheet[current_row, 1] = user.show_real_name homeworks.each_with_index do |homework, j| # 关卡统计 count_game_exp_score = 0 count_game_gold_score = 0 count_game_test = 0 count_game_time = 0 # end sheet[current_row, 2] = "# #{get_hw_index(homework, true, 4)}" sheet[current_row, 3] = homework.name shixun = homework.homework_commons_shixuns.shixun if homework.homework_commons_shixuns if shixun shixun.challenges.each_with_index do |challenge, k| sheet[current_row, 4] = "第#{k+1}关" games = Game.where(:challenge_id => challenge.id, :user_id => user.id) game_count = game_count + games.count if games.count > 0 games.each do |game| sheet[current_row, 5] = game.final_score ? "+#{game.final_score.to_s}" : "--" sheet[current_row, 6] = game.final_score ? (game.answer_open? ? "#{-challenge.score.to_i}" : "+#{game.final_score.to_i}") : "--" count_exp_score += (game.final_score ? game.final_score.to_i : 0) count_gold_score += (game.final_score ? (game.answer_open? ? -challenge.score.to_i : game.final_score.to_i) : 0) count_game_exp_score += (game.final_score ? game.final_score.to_i : 0) count_game_gold_score += (game.final_score ? (game.answer_open? ? -challenge.score.to_i : game.final_score.to_i) : 0) count = game.outputs.count if count > 0 outputs = game.outputs.where(:test_set_position => 1).reorder("created_at asc") outputs.each_with_index do |output, k| count_test += 1 count_game_test += 1 sheet[current_row, 7] = "第#{k+1}次评测" sheet[current_row, 8] = k == 0 ? game_spend_time((output.created_at - game.created_at).to_i) : game_spend_time((output.created_at - outputs[k-1].created_at).to_i) count_time = count_time + (k == 0 ? (output.created_at - game.created_at).to_i : (output.created_at - outputs[k-1].created_at).to_i) count_game_time += (k == 0 ? (output.created_at - game.created_at).to_i : (output.created_at - outputs[k-1].created_at).to_i) sheet[current_row, 9] = game.outputs.where(:query_index => output.query_index).select{|ou| ou.result == false}.count > 0 ? "失败" : "成功" current_row += 1 end else current_row += 1 end end else current_row += 1 end end end sheet[current_row,4] = "合计" sheet[current_row,5] = count_game_exp_score >= 0 ? "+#{count_game_exp_score}" : "-#{count_game_exp_score}" sheet[current_row,6] = count_game_gold_score >= 0 ? "+#{count_game_gold_score}" : "#{count_game_gold_score}" sheet[current_row,7] = "共#{count_game_test}次评测" sheet[current_row,8] = game_spend_time((count_game_time == 0 ? 0 : (count_game_time / count_test)).to_i)+"/次" sheet.row(current_row).default_format = black #current_row += 1 end # sheet[current_row,2] = "合计" # sheet[current_row,4] = "共#{game_count}" # sheet[current_row,5] = count_exp_score >= 0 ? "+#{count_exp_score}" : "-#{count_exp_score}" # sheet[current_row,6] = count_gold_score >= 0 ? "+#{count_gold_score}" : "#{count_gold_score}" # sheet[current_row,7] = "共#{count_test}次评测" # sheet[current_row,8] = game_spend_time((count_time == 0 ? 0 : (count_time / count_test)).to_i)+"/次" # sheet.row(current_row).default_format = black end homeworks.each_with_index do |homework, i| sheet = book.create_worksheet :name => "关卡统计" sheet.row(0).default_format = blue sheet[0,0] = "课堂编号" sheet[0,1] = "主讲老师" sheet[0,2] = "课堂名称" sheet[0,3] = "作业编号" sheet[0,4] = "作业/实训名称" sheet[0,5] = "关卡" sheet[0,6] = "学生id" sheet[0,7] = "学生姓名" sheet[0,8] = "经验值" sheet[0,9] = "金币" sheet[0,10] = "评测历史" sheet[0,11] = "评测时间" sheet[0,12] = "评测结果" sheet[1,0] = course.id sheet[1,1] = course.teacher.show_real_name sheet[1,2] = course.name sheet[1,3] = "# #{get_hw_index(homework, true, 4)}" sheet[1,4] = homework.name current_row = 1 shixun = homework.homework_commons_shixuns.shixun if homework.homework_commons_shixuns if shixun shixun.challenges.each_with_index do |challenge, j| sheet[current_row,5] = "第#{j+1}关" games = Game.where(:challenge_id => challenge.id, :user_id => homework.student_works.where("work_status != 0").map(&:user_id)) count_exp_score = 0 count_gold_score = 0 count_test = 0 count_time = 0 if games.count > 0 games.each do |game| user = game.user sheet[current_row,6] = user.login sheet[current_row,7] = user.show_real_name sheet[current_row,8] = game.final_score ? "+#{game.final_score.to_s}" : "--" count_exp_score = count_exp_score + (game.final_score ? game.final_score.to_i : 0) sheet[current_row,9] = game.final_score ? (game.answer_open? ? "#{-challenge.score.to_i}" : "+#{game.final_score.to_i}") : "--" count_gold_score = count_gold_score + (game.final_score ? (game.answer_open? ? -challenge.score.to_i : game.final_score.to_i) : 0) count = game.outputs.count if count > 0 outputs = game.outputs.where(:test_set_position => 1).reorder("created_at asc") outputs.each_with_index do |output, k| count_test = count_test + 1 sheet[current_row,10] = "第#{k+1}次评测" sheet[current_row,11] = k == 0 ? game_spend_time((output.created_at - game.created_at).to_i) : game_spend_time((output.created_at - outputs[k-1].created_at).to_i) count_time = count_time + (k == 0 ? (output.created_at - game.created_at).to_i : (output.created_at - outputs[k-1].created_at).to_i) sheet[current_row,12] = game.outputs.where(:query_index => output.query_index).select{|ou| ou.result == false}.count > 0 ? "失败" : "成功" current_row = current_row + 1 end else current_row = current_row + 1 end end else current_row = current_row + 1 end sheet[current_row,6] = "合计" sheet[current_row,7] = games.count.to_s + "人" sheet[current_row,8] = count_exp_score >= 0 ? "+#{count_exp_score}" : "-#{count_exp_score}" sheet[current_row,9] = count_gold_score >= 0 ? "+#{count_gold_score}" : "#{count_gold_score}" sheet[current_row,10] = "共#{count_test}次评测" sheet[current_row,11] = game_spend_time((count_time == 0 ? 0 : (count_time / count_test)).to_i)+"/次" sheet.row(current_row).default_format = black current_row = current_row + 1 end end end book.write xls_report xls_report.string end def member_to_xls homeworks, exercises, tasks, course, members, groups xls_report = StringIO.new book = Spreadsheet::Workbook.new # sheet1 = book.create_worksheet :name => "总成绩" # blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 # #sheet1.row(0).default_format = blue # #sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_class),l(:excel_f_score),l(:excel_commit_time)]) teacher_co = (searchTeacherAndAssistant course).map{|member| member.user.show_real_name}.join('、') # sheet1[0,0] = "课程编号" # sheet1[0,1] = course.id # sheet1[1,0] = "课程名称" # sheet1[1,1] = course.name # sheet1[2,0] = "教师团队" # sheet1[2,1] = teacher_co # sheet1[3,0] = "主讲教师" # sheet1[3,1] = course.teacher.show_real_name # sheet1[4,0] = "排名" # sheet1[4,1] = "学生姓名" # sheet1[4,2] = "昵称" # sheet1[4,3] = "邮箱" # sheet1[4,4] = "学号" # sheet1[4,5] = "分班" # current_col = 5 # homeworks.where(:homework_type => 4).each do |homework| # sheet1[4,current_col+=1] = "#{homework.name}" # end # for i in 0 ... homeworks.where(:homework_type => 1).size # sheet1[4,current_col+=1] = "普通作业第"+(i+1).to_s+"次" # end # for i in 0 ... homeworks.where(:homework_type => 3).size # sheet1[4,current_col+=1] = "分组作业第"+(i+1).to_s+"次" # end # for i in 0 ... exercises.size # sheet1[4,current_col+=1] = "试卷第"+(i+1).to_s+"次" # end # for i in 0 ... tasks.size # sheet1[4,current_col+=1] = "毕设任务第"+(i+1).to_s+"次" # end # # sheet1[4,current_col+=1] = "实训作业总得分" # sheet1[4,current_col+=1] = "普通作业总得分" # sheet1[4,current_col+=1] = "分组作业总得分" # sheet1[4,current_col+=1] = "试卷总得分" # if tasks.count > 0 # sheet1[4,current_col+=1] = "毕设任务总得分" # end # #sheet1[6,homeworks.count+6] = "社区得分" # sheet1[4,current_col+=1] = "总得分" # count_row = 5 # members.each_with_index do |member, i| # column = 0 # sheet1[count_row,column]= i+1 # sheet1[count_row,column+=1] = member.user.show_real_name # sheet1[count_row,column+=1] = member.user.login # sheet1[count_row,column+=1] = member.user.mail # sheet1[count_row,column+=1] = member.user.user_extensions.student_id # sheet1[count_row,column+=1] = member.course_group_id == 0 ? "暂无" : member.course_group.name # # current_col = 5 # shixun_score = 0 # homeworks.where(:homework_type => 4).includes(:score_student_works).each do |homework| # student_works = homework.score_student_works.select{|work| work.user_id == member.user.id} # if student_works.empty? # sheet1[count_row,column+=1] = 0 # else # work_score = student_works.first.work_score.nil? ? 0 : student_works.first.work_score # sheet1[count_row,column+=1] = work_score < 0 ? 0 : work_score.round(1) # shixun_score += work_score < 0 ? 0 : work_score.round(1) # end # # current_col += 1 # end # common_score = 0 # homeworks.where(:homework_type => 1).includes(:score_student_works).each do |homework| # student_works = homework.score_student_works.select{|work| work.user_id == member.user.id} # if student_works.empty? # sheet1[count_row,column+=1] = 0 # else # work_score = student_works.first.work_score.nil? ? 0 : student_works.first.work_score # sheet1[count_row,column+=1] = work_score < 0 ? 0 : work_score.round(1) # common_score += work_score < 0 ? 0 : work_score.round(1) # end # # current_col += 1 # end # group_score = 0 # homeworks.where(:homework_type => 3).includes(:score_student_works).each do |homework| # student_works = homework.score_student_works.select{|work| work.user_id == member.user.id} # if student_works.empty? # sheet1[count_row,column+=1] = 0 # else # work_score = student_works.first.work_score.nil? ? 0 : student_works.first.work_score # sheet1[count_row,column+=1] = work_score < 0 ? 0 : work_score.round(1) # group_score += work_score < 0 ? 0 : work_score.round(1) # end # # current_col += 1 # end # exercise_score = 0 # exercises.includes(:score_exercise_users).each do |exercise| # exercise_user = exercise.score_exercise_users.select{|work| work.user_id == member.user.id} # if exercise_user.empty? # sheet1[count_row,column+=1] = 0 # else # work_score = exercise_user.first.score.nil? ? 0 : exercise_user.first.score # sheet1[count_row,column+=1] = work_score < 0 ? 0 : work_score.round(1) # exercise_score += work_score < 0 ? 0 : work_score.round(1) # end # # current_col += 1 # end # # graduation_score = 0 # tasks.includes(:graduation_works).each do |task| # graduation_works = task.graduation_works.where("user_id = #{member.user.id}") # if graduation_works.empty? # sheet1[count_row,column+=1] = 0 # else # work_score = graduation_works.first.work_score.nil? ? 0 : graduation_works.first.work_score # sheet1[count_row,column+=1] = work_score < 0 ? 0 : work_score.round(1) # graduation_score += work_score < 0 ? 0 : work_score.round(1) # end # # current_col += 1 # end # # sum = shixun_score + common_score + group_score + exercise_score + graduation_score # sheet1[count_row,column+=1] = shixun_score # sheet1[count_row,column+=1] = common_score # sheet1[count_row,column+=1] = group_score # sheet1[count_row,column+=1] = exercise_score # if tasks.count > 0 # sheet1[count_row,column+=1] = graduation_score # end # sheet1[count_row,column+=1] = sum.round(1) # count_row += 1 # end # # if course.course_groups.count > 0 # sheet = book.create_worksheet :name => "分班信息" # sheet.row(0).concat(["课程编号", course.id]) # sheet.row(1).concat(["课程名称", course.name]) # sheet.row(2).concat(["教师团队", teacher_co]) # sheet.row(3).concat(["主讲教师", course.teacher.show_real_name]) # sheet.row(4).concat(["序号", "分班名称", "邀请码", "学生数量"]) # current_row = 5 # course.course_groups.includes(:members).each do |course_group| # sheet[current_row,0]= current_row - 4 # sheet[current_row,1]= course_group.name # sheet[current_row,2]= course_group.invite_code # sheet[current_row,3]= course_group.members.size # current_row += 1 # end # end # # sheet2 = book.create_worksheet :name => "活跃度" # sheet2[0,0] = "课程编号" # sheet2[0,1] = course.id # sheet2[1,0] = "课程名称" # sheet2[1,1] = course.name # sheet2[2,0] = "教师团队" # sheet2[2,1] = teacher_co # sheet2[3,0] = "主讲教师" # sheet2[3,1] = course.teacher.show_real_name # sheet2.row(4).concat(["排名","学生姓名","昵称","学号","分班","作业完成数(*10)","试卷完成数(*10)","问卷完成数(*7)","资源发布数(*5)","帖子发布数(*2)","帖子回复数(*1)","作业回复数(*1)","活跃度"]) # act_members = members # act_members.each do |member| # member[:act_score] = ((member.homework_num.to_i + member.graduation_num.to_i) * 10) + (member.exercise_num.to_i * 10) + (member.poll_num.to_i * 7) + (member.resource_num.to_i * 5) + (member.message_num.to_i * 2) + member.message_reply_num.to_i + member.homework_journal_num.to_i # end # act_members = act_members.sort do |a, b| # [b[:act_score]] <=> [a[:act_score]] # end # count_row = 5 # act_members.each_with_index do |act_member, index| # sheet2[count_row,0]= index + 1 # sheet2[count_row,1] = act_member.user.show_real_name # sheet2[count_row,2] = act_member.user.login # sheet2[count_row,3] = act_member.user.user_extensions.student_id # sheet2[count_row,4] = act_member.course_group_id == 0 ? "暂无" : act_member.course_group.name # sheet2[count_row,5]= act_member.homework_num.to_i + act_member.graduation_num.to_i # sheet2[count_row,6]= act_member.exercise_num # sheet2[count_row,7]= act_member.poll_num # sheet2[count_row,8]= act_member.resource_num # sheet2[count_row,9]= act_member.message_num # sheet2[count_row,10]= act_member.message_reply_num # sheet2[count_row,11]= act_member.homework_journal_num # sheet2[count_row,12]= act_member.act_score # count_row += 1 # end homeworks.where(:homework_type => 4).includes(:score_student_works).each_with_index do |home, i| sheet = book.create_worksheet :name => "#{home.name}" sheet[0,0] = "课程编号" sheet[0,1] = course.id sheet[1,0] = "课程名称" sheet[1,1] = course.name sheet[2,0] = "教师团队" sheet[2,1] = teacher_co sheet[3,0] = "主讲教师" sheet[3,1] = course.teacher.show_real_name sheet[3,0] = "作业批次" sheet[3,1] = "第#{i+1}次" sheet[3,0] = "作业名称" sheet[3,1] = home.name sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),"分班",l(:excel_homework_des),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) count_row = 5 items = home.score_student_works # if items.count == 0 && home.publish_time < Time.now && !course.is_end # update_shixun_work_status home # items = StudentWork.where("work_status != 0 and homework_common_id = #{home.id}").order("work_score desc") # end items.each_with_index do |stu, j| sheet[count_row,0]= j + 1 sheet[count_row,1] = stu.user.show_real_name sheet[count_row,2] = stu.user.login sheet[count_row,3] = stu.user.user_extensions.student_id sheet[count_row,4] = member_group_name course.members, stu.user_id sheet[count_row,5] = strip_html stu.description sheet[count_row,6] = stu.late_penalty sheet[count_row,7] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(1) sheet[count_row,8] = format_time(stu.commit_time) count_row += 1 end end homeworks.where(:homework_type => 1).each_with_index do |home, i| sheet = book.create_worksheet :name => "普通作业第#{i+1}次" sheet[0,0] = "课程编号" sheet[0,1] = course.id sheet[1,0] = "课程名称" sheet[1,1] = course.name sheet[2,0] = "教师团队" sheet[2,1] = teacher_co sheet[3,0] = "主讲教师" sheet[3,1] = course.teacher.show_real_name sheet[3,0] = "作业批次" sheet[3,1] = "第#{i+1}次" sheet[3,0] = "作业名称" sheet[3,1] = home.name if home.anonymous_comment ==0 sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_homework_des), l(:excel_t_score),l(:excel_ta_score), l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) else sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_homework_des), l(:excel_t_score),l(:excel_ta_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) end count_row = 5 items = home.score_student_works items.each_with_index do |stu, j| sheet[count_row,0]= j + 1 sheet[count_row,1] = stu.user.show_real_name sheet[count_row,2] = stu.user.login sheet[count_row,3] = stu.user.user_extensions.student_id sheet[count_row,4] = strip_html stu.description sheet[count_row,5] = stu.teacher_score.nil? ? l(:label_without_score) : stu.teacher_score.round(1) sheet[count_row,6] = stu.teaching_asistant_score.nil? ? l(:label_without_score) : stu.teaching_asistant_score.round(1) if home.anonymous_comment ==0 sheet[count_row,7] = stu.student_score.nil? ? l(:label_without_score) : stu.student_score.round(1) sheet[count_row,8] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.absence_penalty sheet[count_row,9] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.late_penalty sheet[count_row,10] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(1) sheet[count_row,11] = format_time(stu.commit_time) else sheet[count_row,7] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.late_penalty sheet[count_row,8] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(1) sheet[count_row,9] = format_time(stu.commit_time) end count_row += 1 end end homeworks.where(:homework_type => 3).each_with_index do |home, i| sheet = book.create_worksheet :name => "分组作业第#{i+1}次" sheet[0,0] = "课程编号" sheet[0,1] = course.id sheet[1,0] = "课程名称" sheet[1,1] = course.name sheet[2,0] = "教师团队" sheet[2,1] = teacher_co sheet[3,0] = "主讲教师" sheet[3,1] = course.teacher.show_real_name sheet[3,0] = "作业批次" sheet[3,1] = "第#{i+1}次" sheet[3,0] = "作业名称" sheet[3,1] = home.name if home.anonymous_comment ==0 sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_group_member),l(:excel_homework_des), l(:excel_t_score),l(:excel_ta_score),l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) else sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_group_member),l(:excel_homework_des), l(:excel_t_score),l(:excel_ta_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) end count_row = 5 items = home.score_student_works items.each_with_index do |stu, j| sheet[count_row,0] = j + 1 sheet[count_row,1] = stu.user.show_real_name sheet[count_row,2] = stu.user.login sheet[count_row,3] = stu.user.user_extensions.student_id sheet[count_row,4] = get_group_member_names home.student_works.where(:group_id => stu.group_id).pluck(:user_id) sheet[count_row,5] = strip_html stu.description sheet[count_row,6] = stu.teacher_score.nil? ? l(:label_without_score) : stu.teacher_score.round(1) sheet[count_row,7] = stu.teaching_asistant_score.nil? ? l(:label_without_score) : stu.teaching_asistant_score.round(1) if home.anonymous_comment ==0 sheet[count_row,8] = stu.student_score.nil? ? l(:label_without_score) : stu.student_score.round(1) sheet[count_row,9] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.absence_penalty sheet[count_row,10] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.late_penalty sheet[count_row,11] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(1) sheet[count_row,12] = format_time(stu.commit_time) else sheet[count_row,8] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.late_penalty sheet[count_row,9] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(1) sheet[count_row,10] = format_time(stu.commit_time) end count_row += 1 end end exercises.each_with_index do |exercise, i| sheet = book.create_worksheet :name => "试卷第#{i+1}次" sheet[0,0] = "课程编号" sheet[0,1] = course.id sheet[1,0] = "课程名称" sheet[1,1] = course.name sheet[3,0] = "教师团队" sheet[3,1] = teacher_co sheet[3,0] = "主讲教师" sheet[3,1] = course.teacher.show_real_name sheet[3,0] = "试卷批次" sheet[3,1] = "第#{i+1}次" sheet[3,0] = "试卷名称" sheet[3,1] = exercise.exercise_name sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_objective_score),l(:excel_subjective_score),l(:excel_f_score),l(:excel_answer_time)]) count_row = 5 items = exercise.score_exercise_users items.each_with_index do |stu, j| sheet[count_row,0] = j + 1 sheet[count_row,1] = stu.user.show_real_name sheet[count_row,2] = stu.user.login sheet[count_row,3] = stu.user.user_extensions.student_id sheet[count_row,4] = stu.objective_score == -1 ? "0.0" : format("%.1f",stu.objective_score) sheet[count_row,5] = stu.subjective_score == -1 ? "0.0" : format("%.1f",stu.subjective_score) sheet[count_row,6] = stu.score.nil? ? '--' : stu.score.round(1) sheet[count_row,7] = stu.commit_status == 0 ? l(:excel_no_answer) : format_time(stu.start_at) count_row += 1 end end tasks.each_with_index do |task, i| sheet = book.create_worksheet :name => "毕设任务第#{i+1}次" sheet[0,0] = "课程编号" sheet[0,1] = course.id sheet[1,0] = "课程名称" sheet[1,1] = course.name sheet[2,0] = "教师团队" sheet[2,1] = teacher_co sheet[3,0] = "主讲教师" sheet[3,1] = course.teacher.show_real_name sheet[3,0] = "作业批次" sheet[3,1] = "第#{i+1}次" sheet[3,0] = "作业名称" sheet[3,1] = task.name sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id)]) if task.task_type == 2 sheet.row(4).concat([l(:excel_group_member)]) end sheet.row(4).concat([l(:excel_homework_des), l(:excel_t_score)]) if task.cross_comment sheet.row(4).concat(["交叉评分"]) end sheet.row(4).concat([l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) count_row = 5 items = task.graduation_works.where("work_status != 0").order("work_score desc") items.each_with_index do |stu, j| column = 0 sheet[count_row,column]= j + 1 sheet[count_row,column+=1] = stu.user.show_real_name sheet[count_row,column+=1] = stu.user.login sheet[count_row,column+=1] = stu.user.user_extensions.student_id if task.task_type == 2 sheet[count_row,column+=1] = get_group_member_names task.graduation_works.where(:group_id => stu.group_id).pluck(:user_id) end sheet[count_row,column+=1] = strip_html stu.description sheet[count_row,column+=1] = stu.teacher_score.nil? ? l(:label_without_score) : stu.teacher_score.round(1) if task.cross_comment sheet[count_row,column+=1] = stu.cross_score.nil? ? l(:label_without_score) : stu.cross_score.round(1) end sheet[count_row,column+=1] = stu.late_penalty sheet[count_row,column+=1] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(1) sheet[count_row,column+=1] = format_time(stu.commit_time) count_row += 1 end =begin if task.task_type == 1 if task.cross_comment sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_homework_des), l(:excel_t_score),"交叉评分",l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) else sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_homework_des), l(:excel_t_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) end else if task.cross_comment sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_group_member),l(:excel_homework_des), l(:excel_t_score),"交叉评分",l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) else sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_group_member),l(:excel_homework_des), l(:excel_t_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) end count_row = 5 items = task.graduation_works.order("work_score desc") items.each_with_index do |stu, j| column = 0 sheet[count_row,column]= j + 1 sheet[count_row,column+1] = stu.user.show_name sheet[count_row,column+1] = stu.user.login sheet[count_row,column+1] = stu.user.user_extensions.student_id sheet[count_row,column+1] = strip_html stu.description sheet[count_row,column+1] = stu.teacher_score.nil? ? l(:label_without_score) : stu.teacher_score.round(2) if task.cross_comment sheet[count_row,column+1] = stu.cross_score.nil? ? l(:label_without_score) : stu.cross_score.round(2) end sheet[count_row,column+1] = stu.late_penalty sheet[count_row,column+1] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(2) sheet[count_row,column+1] = format_time(stu.commit_time) count_row += 1 end end =end end book.write xls_report xls_report.string end end