#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') ? '教辅' : '教师'}的身份加入班级:<a target='_blank' href='#{members_course_path(@course)}'>#{@course.name}</a>"
          @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)
        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")
    @exercises = @course.exercises.where("publish_time <= '#{Time.now}'").order("publish_time asc")
    @tasks = @course.graduation_tasks.where("publish_time <= '#{Time.now}'").order("publish_time asc")

    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?
      @course_type = params[:course_type] ||= params[:course]
      @issue_custom_fields = IssueCustomField.sorted.all
      @trackers = Tracker.sorted.all
      @course = Course.new
      @course.safe_attributes = params[:course]
      @syllabus = Syllabus.where("id = #{params[:syllabus_id].to_i}").first if params[:syllabus_id]
      # month = Time.now.month
      render :layout => 'base_edu'
    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]<activity_count[j+1]
          courses[j], courses[j+1]=courses[j+1], courses[j]
          activity_count[j], activity_count[j+1]=activity_count[j+1], activity_count[j]
        end
      end
    end
    return courses
  end

  # 创建实训作业目录
  def create_homework_category
    if params[:category_name]
      @course.course_homework_categories << CourseHomeworkCategory.new(:name => 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?
    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)])
    sheet1[0,0] = "课程编号"
    sheet1[0,1] = course.id
    sheet1[1,0] = "课程名称"
    sheet1[1,1] = course.name
    sheet1[2,0] = "教师团队"
    sheet1[2,1] = (searchTeacherAndAssistant course).map{|member| member.user.show_real_name}.join('、')
    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] = "分班"
    current_col = 4
    for i in 0 ... homeworks.where(:homework_type => 4).count
      sheet1[4,current_col+=1] = "实训作业第"+(i+1).to_s+"次"
    end
    for i in 0 ... homeworks.where(:homework_type => 1).count
      sheet1[4,current_col+=1] = "普通作业第"+(i+1).to_s+"次"
    end
    for i in 0 ... homeworks.where(:homework_type => 3).count
      sheet1[4,current_col+=1] = "分组作业第"+(i+1).to_s+"次"
    end
    for i in 0 ... exercises.count
      sheet1[4,current_col+=1] = "试卷第"+(i+1).to_s+"次"
    end
    for i in 0 ... tasks.count
      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.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).each do |homework|
        student_works = homework.student_works.where("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(2)
          shixun_score += work_score < 0 ? 0 : work_score.round(2)
        end
        # current_col += 1
      end
      common_score = 0
      homeworks.where(:homework_type => 1).each do |homework|
        student_works = homework.student_works.where("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(2)
          common_score += work_score < 0 ? 0 : work_score.round(2)
        end
        # current_col += 1
      end
      group_score = 0
      homeworks.where(:homework_type => 3).each do |homework|
        student_works = homework.student_works.where("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(2)
          group_score += work_score < 0 ? 0 : work_score.round(2)
        end
        # current_col += 1
      end
      exercise_score = 0
      exercises.each do |exercise|
        exercise_user = exercise.exercise_users.where("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(2)
          exercise_score += work_score < 0 ? 0 : work_score.round(2)
        end
        # current_col += 1
      end

      graduation_score = 0
      tasks.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(2)
          graduation_score += work_score < 0 ? 0 : work_score.round(2)
        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(2)
      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(["教师团队", (searchTeacherAndAssistant course).map{|member| member.user.show_real_name}.join('、')])
      sheet.row(3).concat(["主讲教师", course.teacher.show_real_name])
      sheet.row(4).concat(["序号", "分班名称", "邀请码", "学生数量"])
      current_row = 5
      course.course_groups.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.count
        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] = (searchTeacherAndAssistant course).map{|member| member.user.show_real_name}.join('、')
    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).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] = (searchTeacherAndAssistant course).map{|member| member.user.show_real_name}.join('、')
      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.student_works.where("work_status != 0").order("work_score desc")
      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.late_penalty
        sheet[count_row,6] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(2)
        sheet[count_row,7] = 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] = (searchTeacherAndAssistant course).map{|member| member.user.show_real_name}.join('、')
      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.student_works.where("work_status != 0").order("work_score desc")
      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(2)
        sheet[count_row,6] = stu.teaching_asistant_score.nil? ? l(:label_without_score) : stu.teaching_asistant_score.round(2)
        if home.anonymous_comment ==0
          sheet[count_row,7] = stu.student_score.nil? ? l(:label_without_score) : stu.student_score.round(2)
          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(2)
          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(2)
          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] = (searchTeacherAndAssistant course).map{|member| member.user.show_real_name}.join('、')
      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.student_works.where("work_status != 0").order("work_score desc")
      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(2)
        sheet[count_row,7] = stu.teaching_asistant_score.nil? ? l(:label_without_score) : stu.teaching_asistant_score.round(2)
        if home.anonymous_comment ==0
          sheet[count_row,8] = stu.student_score.nil? ? l(:label_without_score) : stu.student_score.round(2)
          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(2)
          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(2)
          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] = (searchTeacherAndAssistant course).map{|member| member.user.show_real_name}.join('、')
      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.exercise_users.where("commit_status != 0").order("score desc")
      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(2)
        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] = (searchTeacherAndAssistant course).map{|member| member.user.show_real_name}.join('、')
      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(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
=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