# encoding: utf-8 class SubjectsController < ApplicationController layout 'base_subject' # 如要添加或修改before_filter时,请将handle_openi_request这个before_filter放至第一位 before_filter :handle_openi_request, if: -> { user_login_and_from_openi? }, only: [:show] before_filter :require_login, :except => [:show, :index] before_filter :check_authentication, :except => [:show, :index] before_filter :find_subject, :except => [:index, :new, :create, :create_subject, :new_subject, :append_to_stage, :send_to_course] before_filter :require_admin, :only => [:destroy] include ApplicationHelper include SubjectsHelper def index @tech_system = Repertoire.where(nil).order("updated_at asc") @order = params[:order] || "publish_time" @select = params[:select] @search = params[:search] # 为了本地版部署 # if @order == "myshixun_count" && !request.host.include?("educoder") # @order = "status = 2" # end if @select.blank? if @order == "myshixun_count" @subjects = Subject.find_by_sql("SELECT subjects.id, subjects.name, subjects.stages_count, subjects.status, COUNT(myshixuns.id) AS myshixun_member_count FROM myshixuns, stage_shixuns, subjects WHERE myshixuns.shixun_id = stage_shixuns.shixun_id AND stage_shixuns.subject_id = subjects.id AND `subjects`.`hidden` = 0 AND `subjects`.`status` = 2 AND `subjects`.`name` like '%#{@search}%' GROUP BY subjects.id ORDER BY myshixun_member_count DESC") elsif @order == "mine" subject_ids = StageShixun.where(:shixun_id => User.current.myshixuns.map(&:shixun_id)).map(&:subject_id) + User.current.subject_members.map(&:subject_id) @subjects = Subject.where(:id => subject_ids.uniq).where("name like '%#{@search}%'").reorder("updated_at desc") elsif @order == "updated_at" @subjects = Subject.where("hidden = 0 and name like '%#{@search}%' and status = 2").reorder("#{@order} desc") else @subjects = Subject.where("hidden = 0 and name like '%#{@search}%'").reorder("status = 2 desc, #{@order} asc") end else if @order == "myshixun_count" @subjects = Subject.find_by_sql("SELECT subjects.id, subjects.name, subjects.stages_count, subjects.status, COUNT(myshixuns.id) AS myshixun_member_count FROM myshixuns, stage_shixuns, subjects WHERE myshixuns.shixun_id = stage_shixuns.shixun_id AND stage_shixuns.subject_id = subjects.id AND `subjects`.`hidden` = 0 AND `subjects`.`status` = 2 AND `subjects`.`name` like '%#{@search}%' AND `subjects`.`repertoire_id` = #{@select} GROUP BY subjects.id ORDER BY myshixun_member_count DESC") elsif @order == "mine" subject_ids = StageShixun.where(:shixun_id => User.current.myshixuns.map(&:shixun_id)).map(&:subject_id) + User.current.subject_members.map(&:subject_id) @subjects = Subject.where(:id => subject_ids.uniq, :repertoire_id => @select.to_i).where("name like '%#{@search}%'").reorder("updated_at desc") elsif @order == "updated_at" @subjects = Subject.where("hidden = 0 and repertoire_id = #{@select.to_i} and name like '%#{@search}%' and status = 2").reorder("#{@order} desc") else @subjects = Subject.where("hidden = 0 and repertoire_id = #{@select.to_i} and name like '%#{@search}%'").reorder("status = 2 desc, #{@order} asc") end end @subjects = paginateHelper @subjects, 16 respond_to do |format| format.js format.html { render :layout => "base_edu" } end end def show @stages = @subject.stages.includes(stage_shixuns: [{shixun: :users}]) @is_member = User.current.member_of_subject?(@subject) @is_manager = User.current.manager_of_subject?(@subject) @admin = User.current.admin? @challenge_tags = ChallengeTag.where(:challenge_id => Challenge.where(:shixun_id => @subject.shixuns.where(:status => 2).pluck(:id)).pluck(:id)).pluck(:name).uniq end def new @subject = Subject.new render :layout => "base_edu" end def create ActiveRecord::Base.transaction do begin subject = Subject.create!(:name => params[:name], :learning_notes => params[:learning_notes], :description => params[:description], :user_id => User.current.id, :visits => 1, :status => 0) SubjectMember.create!(:subject_id => subject.id, :role => 1, :user_id => subject.user_id) redirect_to subject_path(subject) rescue Exception => e logger.error("create subject error info: #{e}") redirect_to new_subject_path end end end def edit render :layout => "base_edu" end def update @subject.update_attributes(:name => params[:name], :learning_notes => params[:learning_notes], :description => params[:description]) redirect_to subject_path(@subject) end def destroy if @subject ApplyAction.where(:container_type => "ApplySubject", :container_id => @subject.id).destroy_all @subject.destroy respond_to do |format| format.js format.html{redirect_to subjects_path} end end end def send_to_course params[:shixun_ids].each do |shixun_id| shixun = Shixun.where(:id => shixun_id).first if shixun.present? && shixun.status == 2 homework = HomeworkCommon.new(:name => shixun.name, :description => shixun.description, :anonymous_comment => 1, :homework_type => 4, :late_penalty => 5, :teacher_priority => 1, :user_id => User.current.id, :course_id => params[:course_id]) homework_detail_manual = HomeworkDetailManual.new(:te_proportion => 1.0, :ta_proportion => 0, :comment_status => 0, :evaluation_num => 0, :absence_penalty => 0) homework.homework_detail_manual = homework_detail_manual if homework.save homework_detail_manual.save if homework_detail_manual HomeworkCommonsShixuns.create(:homework_common_id => homework.id, :shixun_id => shixun.id) create_shixun_homework_cha_setting homework, shixun create_works_list homework end end end redirect_to homework_common_index_path(:course => params[:course_id], :homework_type => 4) end def update_attr if params[:name] @subject.update_attributes(:name => params[:name]) elsif params[:description] @subject.update_attributes(:description => params[:description]) end end def new_subject if Course.where(:tea_id => User.current.id).count > 0 @status = 1 @course_lists = CourseList.where(:id => ShixunMajorCourse.where(:shixun_id => Shixun.where(:user_id => User.current.id).map(&:id)).map(&:course_list_id)) else @status = 0 end respond_to do |format| format.js end end def create_subject if params[:course_list_id] course = CourseList.find params[:course_list_id] if course subject = Subject.create(:name => course.name, :user_id => User.current.id, :visits => 0, :status => 0, :course_list_id => course.id) end end redirect_to subject_path(subject) end def choose_subject_shixun #course_list = @subject.course_list @search = params[:search] @type = params[:type] if User.current.admin? @shixuns = Shixun.select([:id, :name, :status, :myshixuns_count, :identifier]) published_shixun_ids = Shixun.pluck(:id) tag_ids = ShixunTagRepertoire.where(:shixun_id => published_shixun_ids).pluck(:tag_repertoire_id).uniq @tags = TagRepertoire.select([:id, :name]).where(:id => tag_ids) else shixun_ids = ShixunMember.where(:user_id => @subject.subject_members.map(&:user_id)).pluck(:shixun_id).uniq tag_ids = ShixunTagRepertoire.where(:shixun_id => shixun_ids).pluck(:tag_repertoire_id).uniq @tags = TagRepertoire.select([:id, :name]).where(:id => tag_ids) @shixuns = Shixun.select([:id, :name, :status, :myshixuns_count, :identifier]).where(:id => shixun_ids) end if params[:search] @shixuns = @shixuns.where("name like ?", "%#{@search}%") end unless @type.nil? || @type == "" || @type == "all" shixun_ids = ShixunTagRepertoire.where(:tag_repertoire_id => @type).pluck(:shixun_id).uniq @shixuns = @shixuns.select([:id, :name, :myshixuns_count, :identifier, :status]).where(:id => shixun_ids) end @shixuns = @shixuns.reorder("created_at desc") @limit = 10 @page = params['page'] || 1 @shixuns_count = @shixuns.size @total_pages = (@shixuns_count / 10.0).ceil @shixuns = paginateHelper @shixuns, @limit @shixuns = @shixuns.includes(:myshixuns) respond_to do |format| format.js format.json { render json: shixun_json_data(@shixuns) } end end def append_to_stage @shixuns = Shixun.where(:id => params[:shixun_homework]).reorder("id desc") end def publish apply = ApplyAction.where(:container_type => "ApplySubject", :container_id => @subject.id).order("created_at desc").first if apply && apply.status == 0 @status = 0 else #if Shixun.where(:id => @subject.stage_shixuns.map(&:shixun_id), :status => [0, 1]).count > 0 # @status = 2 #else @subject.update_attributes(:status => 1) ApplyAction.create(:container_type => "ApplySubject", :container_id => @subject.id, :user_id => User.current.id, :status => 0) # notes = User.current.show_name.to_s + " 申请发布课程实训:#{@subject.name}" # JournalsForMessage.create(:jour_id => 1, :jour_type => 'Principal', :user_id => User.current.id, :notes => notes, :private => 1, :reply_id => 0) begin status = Trustie::Sms.send(mobile: '15388083362', send_type:'publish_subject' , name: '管理员') rescue => e Rails.logger.error "发送验证码出错: #{e}" end @status = 1 # end end end def cancel_publish apply = ApplyAction.where(:container_type => "ApplySubject", :container_id => @subject.id).order("created_at desc").first if apply && apply.status == 0 apply.update_attributes(:status => 3) apply.tidings.destroy_all end @subject.update_attributes(:status => 0) redirect_to subject_path(@subject) end def cancel_has_publish @subject.update_attributes(:status => 0) redirect_to subject_path(@subject) end def add_collaborators if !params[:search].nil? member_ids = "(" + @subject.subject_members.map(&:user_id).join(',') + ")" condition = "%#{params[:search].strip}%".gsub(" ","") @users = User.where("id not in #{member_ids} and status = 1 and LOWER(concat(lastname, firstname, login, mail)) LIKE '#{condition}'").includes(:user_extensions) end end def add_subject_members unless params[:membership][:user_ids].blank? memberships = params[:membership][:user_ids] memberships.each do |member| user = User.find(member) SubjectMember.create!(:user_id => member, :subject_id => @subject.id, :role => 2, :position => @subject.subject_members.size + 1) end end end def delete_member if User.current.admin? ActiveRecord::Base.transaction do member = @subject.subject_members.where(:id => params[:mem_id]).first if member.present? && member.role != 1 @subject.subject_members.where("position > #{member.position}").update_all("position = position - 1") member.destroy end end else render_403 end end def up_member_position if User.current.member_of_subject?(@subject) ActiveRecord::Base.transaction do member = @subject.subject_members.where(:id => params[:mem_id]).first raise "不能再上移了" if member.position == 1 up_member = @subject.subject_members.where(:position => member.position - 1).first up_member.update_attribute(:position, member.position) member.update_attribute(:position, member.position - 1) end else render_403 end end def down_member_position if User.current.member_of_subject?(@subject) ActiveRecord::Base.transaction do begin member = @subject.subject_members.where(:id => params[:mem_id]).first raise "不能再下移了" if member.position == @subject.subject_members.count down_member = @subject.subject_members.where(:position => member.position + 1).first down_member.update_attribute(:position, member.position) member.update_attribute(:position, member.position + 1) rescue Exception => e raise ActiveRecord::Rollback end end else render_403 end end def statistics @learn_count = @subject.subject_users shixun_ids = @subject.stage_shixuns.pluck(:shixun_id) homework_common_id = HomeworkCommonsShixuns.where(:shixun_id => shixun_ids).pluck(:homework_common_id).uniq homework_common_id = homework_common_id.blank? ? -1 : homework_common_id.join(",") # 受用课堂(已经发布的实训(在此路径中的实训)作业的个数) homework_common_id = HomeworkDetailManual.where("homework_common_id in(#{homework_common_id}) and comment_status > 0").pluck(:homework_common_id) course_ids = HomeworkCommon.where(:id => homework_common_id).pluck(:course_id).uniq @course_count = course_ids.count course_ids = course_ids.blank? ? -1 : course_ids.join(",") # 受用院校 user_ids = Myshixun.where(:shixun_id => shixun_ids).pluck(:user_id).uniq school_ids = UserExtensions.where(:user_id => user_ids).pluck(:school_id).uniq @schools_count = school_ids.count # type 1: 采用课堂情况+章节使用情况 2:实训使用详情 + 实训学习统计 3: 院校学习情况 if params[:type].to_i == 3 @schools = School.select([:id, :name]).where(:id => school_ids) @schools = @schools.map do |s| users = UserExtensions.where(:school_id => s.id, :user_id => user_ids).pluck(:user_id) student_count = users.count pass_count = Myshixun.where(:user_id => users, :status => 1).pluck(:user_id).uniq.count unpass_count = student_count - pass_count ss = s.attributes.dup.merge({student_count: student_count, pass_count: pass_count, unpass_count: unpass_count}).to_json JSON.parse(ss) end @schools = @schools.sort{|x,y| y['student_count'] <=> x['student_count']}.first(10) elsif params[:type].to_i == 2 @stages = @subject.stages.select([:id, :position]).includes(stage_shixuns: [{shixun: {myshixuns: {user: :user_extensions}}}]) else # 采用课堂情况 courses = Course.where("is_delete = 0 and id in (#{course_ids}) and school_id is not null") school_ids = courses.map(&:school_id).uniq @schools = School.select([:id, :name]).where(:id => school_ids) @schools = @schools.map do |s| school_courses = courses.where(:school_id => s.id) course_count = school_courses.count course_student_ids = [] school_courses.each do |c| course_student_ids += c.student.map(&:student_id) end student_count = course_student_ids.uniq.size homework_count = HomeworkCommon.find_by_sql("select count(*) cnt from homework_commons hc join courses c on hc.course_id = c.id where c.school_id = #{s.id} and hc.id in(#{homework_common_id.join(",")})").first.try(:cnt) ss = s.attributes.dup.merge({course_count: course_count, student_count: student_count,homework_count: homework_count}).to_json JSON.parse(ss) end @schools = @schools.sort{|x,y| y['homework_count'] <=> x['homework_count']} @schools = paginateHelper @schools, 10 # TODO: 这个可以异步加载,让页面刷新完成后再加载图形数据 # 章节使用情况 @stage_user_info = [] sum = 0 #总数 @subject.stages.includes(:stage_shixuns).each do |stage| shixun_ids = stage.stage_shixuns.pluck(:shixun_id) if shixun_ids.present? homework_common_id = HomeworkCommonsShixuns.where(:shixun_id => shixun_ids).pluck(:homework_common_id).uniq if homework_common_id.present? publish_homework = HomeworkDetailManual.where("homework_common_id in(#{homework_common_id.join(",")}) and comment_status > 0").pluck(:homework_common_id) use_count = publish_homework.present? ? HomeworkCommon.find_by_sql("select count(*) cnt from homework_commons hc join courses c on hc.course_id = c.id where hc.id in(#{publish_homework.join(",")}) and c.school_id is not null").first.try(:cnt) : 0 sum += use_count else sum += 0 use_count = 0 end @stage_user_info << use_count else sum += 0 @stage_user_info << 0 end end # 章节占整体的百分数 @stage_user_info = @stage_user_info.map{|x| sum ==0 ? 0 : (x * 100 / sum.to_f).round} @data = [] @data_info = [] @stage_user_info.each_with_index do |s, index| @data << "第#{index + 1}章" @data_info << { value: s, name:"第#{index + 1}章"} end end respond_to do |format| format.js format.html{render :layout => 'base_edu'} end end private # Find subject of id params[:id] def find_subject @subject = Subject.find_by_id(params[:id]) render_404 if @subject.nil? rescue ActiveRecord::RecordNotFound render_404 end end