# 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 + " 申请发布课程实训:<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
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