You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pgfqe6ch8/app/controllers/subjects_controller.rb

402 lines
17 KiB

6 years ago
# 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]
6 years ago
before_filter :find_subject, :except => [:index, :new, :create, :create_subject, :new_subject, :append_to_stage, :send_to_course]
before_filter :require_admin, :only => [:destroy]
6 years ago
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 + " 申请发布课程实训:<a href='#{subject_path(@subject)}'>#{@subject.name}</a>"
# JournalsForMessage.create(:jour_id => 1, :jour_type => 'Principal', :user_id => User.current.id, :notes => notes, :private => 1, :reply_id => 0)
begin
5 years ago
status = Trustie::Sms.send(mobile: '15388083362', send_type:'publish_subject' , name: '管理员')
6 years ago
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)
6 years ago
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
6 years ago
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