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.
educoder/app/controllers/polls_controller.rb

1297 lines
57 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

class PollsController < ApplicationController
# before_action :check_poll_status 问卷的发消息和定时任务没有做
before_action :require_login,except: [:index]
before_action :find_course, except: [:show,:poll_setting,:commit_setting,:edit,:update,:start_answer,:commit_poll,
:commit_result,:poll_lists,:cancel_publish,:cancel_publish_modal,:common_header]
before_action :get_poll_and_course, only: [:show,:poll_setting,:commit_setting,:edit,:update,:start_answer,
:commit_poll,:commit_result,:poll_lists,:cancel_publish,
:cancel_publish_modal,:common_header]
before_action :user_course_identity
before_action :is_course_teacher, except: [:index,:start_answer,:poll_setting,:commit_poll,:commit_result,:poll_lists,:common_header] #判断是否为课堂老师
before_action :check_user_status
before_action :is_course_public, only: [:set_public]
before_action :check_user_on_answer, only: [:show,:start_answer,:commit_poll,:poll_lists] #判断当前用户在问卷的权限/老师是否属于分班的权限
before_action :validate_params, only: [:create,:update]
before_action :validates_multi_ids, only: [:publish,:end_poll,:destroys,:set_public,:join_poll_banks]
before_action :check_poll_setting_status,only: [:commit_setting]
before_action :get_questions_count ,only: [:start_answer,:show,:commit_result,:edit]
before_action :check_user_id_start_answer,only: [:start_answer]
before_action :check_poll_question_complete,only: [:commit_poll] #问卷提交前来判断问题是否完成
before_action :check_poll_commit_result,only: [:commit_result]
before_action :get_all_polls_commit, only: [:commit_result] #该问卷全部的用户
before_action :get_left_banner_id, only:[:common_header,:start_answer,:new,:edit,:index]
include PollsHelper
def index
ActiveRecord::Base.transaction do
begin
# 按发布时间或创建时间排序
@polls_all = @course.polls
member_show_polls = @polls_all.publish_or_not # 已发布的或已截止的问卷
@current_user_ = current_user
@course_status = @course.is_end ? 0 : 1 # 课堂是否结束
@course_is_public = @course.is_public
@polls_count = @polls_all.count # 全部页面,需返回
@polls_unpublish_counts = @polls_all.poll_by_status(1).count #未发布的问卷数
@polls_published_counts = @polls_all.poll_by_status([2, 3]).count # 已发布的问卷数
# 课堂的学生人数
@course_all_members = @course.students #当前课堂的全部学生
@course_all_members_count = @course_all_members.count #当前课堂的学生数
@current_student = @course_all_members.find_by(user_id: current_user.id) #当前用户是否为课堂的学生
# polls的不同用户群体的显示
if @user_course_identity < Course::STUDENT # @is_teacher_or 1为老师/管理员/助教
@is_teacher_or = 1
@teacher_groups_ids = @course.charge_group_ids(current_user)
@polls = @polls_all #老师能看到全部的问卷,不管是已发布的/未发布的/已截止的/统一设置的/私有设置的(看到内容不同)
elsif @user_course_identity == Course::STUDENT # 2为课堂成员能看到统一设置的和自己班级的
@is_teacher_or = 2
member_group_id = @current_student.try(:course_group_id).to_i # 成员的分班id默认为0
if member_group_id == 0 #表示是课堂的未分班成员,只能查看统一设置的试卷(已发布的/已截止的)
@polls = member_show_polls.size > 0 ? member_show_polls.public_or_unset : []
else #已分班级的成员,可以查看统一设置和单独设置(试卷是发布在该班级)试卷
# 已发布 当前用户班级分组的 试卷id
poll_settings_ids = @course.poll_group_settings.where(course_group_id: member_group_id).poll_group_published.pluck(:poll_id).uniq # 选择成员的班级id等于课堂问卷设置的班级id
@polls = member_show_polls.present? ? member_show_polls.public_or_unset.or(member_show_polls.where(id: poll_settings_ids)) : []
end
else #用户未登陆或不是该课堂成员,仅显示统一设置的(已发布的/已截止的),如有公开,则不显示锁,不公开,则显示锁
@is_teacher_or = 0
@polls = member_show_polls.size > 0 ? member_show_polls.public_or_unset : []
end
if @polls.count > 0
if params[:type].present?
choose_type = params[:type]
member_group_id = @current_student.try(:course_group_id).to_i # 成员的分班id默认为0
if @is_teacher_or == 2 && member_group_id > 0
poll_groups_sets = @course.poll_group_settings.where(course_group_id: member_group_id).poll_group_published
poll_settings_ids = poll_groups_sets.pluck(:poll_id)
poll_ended_ids = poll_groups_sets.poll_group_ended.pluck(:poll_id).uniq
# poll_settings_ids = @course.poll_group_settings.where(course_group_id: member_group_id).poll_group_ended.pluck(:poll_id).uniq
if choose_type.to_i == 2
@polls = @polls_all.present? ? @polls_all.poll_by_status(2).public_or_unset.or(@polls_all.where(id:(poll_settings_ids - poll_ended_ids).uniq)).distinct : []
elsif choose_type.to_i == 3
@polls = @polls_all.present? ? @polls_all.poll_by_status(3).public_or_unset.or(@polls_all.where(id: poll_ended_ids)).distinct : []
end
else
@polls = @polls.poll_by_status(choose_type)
end
end
if params[:search].present?
search_type = params[:search].to_s.strip
@polls = @polls.poll_search(search_type)
end
# 分页
@polls_select_count = @polls.size
@polls = @polls.order( "IF(ISNULL(publish_time),0,1), publish_time DESC,created_at DESC")
@page = params[:page] || 1
@limit = params[:limit] || 15
@polls = @polls.page(@page).per(@limit)
@polls = @polls&.includes(:poll_users,:poll_questions,:poll_group_settings)
else
@polls = []
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
raise ActiveRecord::Rollback
end
end
end
def new
ActiveRecord::Base.transaction do
begin
@poll = Poll.new
rescue Exception => e
uid_logger_error(e.message)
tip_exception("问卷创建失败!")
raise ActiveRecord::Rollback
end
end
end
# polls_status 问卷状态1为创建成功但未发布2为已发布3表示已截止
# show_result true则在截止时间之后对课堂成员公开答题统计0则不公开,默认为true
# is_public true 为公开/ false为私有默认为false
# exercise_bank_id 试卷的id
# unified_setting true 统一设置 / false为分班设置默认为true
# un_anonymous 是否实名默认为false即不公开
def create
ActiveRecord::Base.transaction do
begin
poll_name = params[:polls_name]
poll_desc = params[:polls_description]
poll_options = {
:polls_name => poll_name,
:polls_description => poll_desc,
:user_id => current_user.id,
:course_id => @course.id,
:polls_status => 1,
:polls_type => "Course",
}
@poll = Poll.create(poll_options)
rescue Exception => e
uid_logger_error(e.message)
tip_exception("问卷创建失败!")
raise ActiveRecord::Rollback
end
end
end
def edit
ActiveRecord::Base.transaction do
begin
@poll_questions = @poll.poll_questions.order("question_number ASC")
rescue Exception => e
uid_logger_error(e.message)
tip_exception("页面请求失败!")
raise ActiveRecord::Rollback
end
end
end
def update
ActiveRecord::Base.transaction do
begin
poll_name = params[:polls_name]
poll_des = params[:polls_description]
poll_params = {
:polls_name => poll_name,
:polls_description => poll_des
}
@poll.update_attributes(poll_params)
normal_status(0,"问卷更新成功!")
rescue Exception => e
uid_logger_error(e.message)
tip_exception("没有权限")
raise ActiveRecord::Rollback
end
end
end
#show页面应该是老师的题型预览页面及问题/答案的编辑,老师页面的
def show
ActiveRecord::Base.transaction do
begin
if @user_course_identity < Course::STUDENT
@is_teacher_or = 1
else
@is_teacher_or = 0
end
@poll_questions = @poll.poll_questions&.includes(:poll_answers).order("question_number ASC")
rescue Exception => e
uid_logger_error(e.message)
tip_exception("没有权限")
raise ActiveRecord::Rollback
end
end
end
def common_header
ActiveRecord::Base.transaction do
begin
if @user_course_identity > Course::ASSISTANT_PROFESSOR
@is_teacher_or = 0
@user_poll_answer = @poll.check_user_votes_status(current_user)
else
@is_teacher_or = 1
@user_poll_answer = 3 #教师页面
end
poll_status = @poll.get_poll_status(current_user.id)
poll_id_array = [@poll.id]
@poll_publish_count = get_user_permission_course(poll_id_array,2).count #是否存在已发布的
@poll_unpublish_count = get_user_permission_course(poll_id_array,1).count #是否存在未发布的
if (@poll_publish_count == 0) && (@poll_unpublish_count == 0) #即表示没有分班
if poll_status == 1
@poll_unpublish_count = 1 #试卷未发布,且课堂没有分班的时候
elsif poll_status == 2
@poll_publish_count = 1 #试卷未发布,且课堂没有分班的时候
end
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception("没有权限")
raise ActiveRecord::Rollback
end
end
end
#立即发布的弹窗内容
def publish_modal
ActiveRecord::Base.transaction do
begin
poll_ids = params[:check_ids]
if poll_ids.count > 0
@course_groups = get_user_permission_course(poll_ids,1)
else
@course_groups = []
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception("没有权限")
raise ActiveRecord::Rollback
end
end
end
#首页批量或单独 立即发布,应是跳出弹窗,设置开始时间和截止时间。
def publish
ActiveRecord::Base.transaction do
begin
check_ids = Poll.where(id: params[:check_ids])
ex_end_time = params[:end_time] || Time.at(((1.month.since.to_i)/3600.0).ceil * 3600)
check_ids.each do |poll|
if poll.unified_setting
pl_status = poll.polls_status #则为试卷的状态
else
pl_status = poll.poll_group_settings.find_in_poll_group("course_group_id",params[:group_ids]).poll_group_not_published.present? ? 1 : 0 #立即发布针对分组设置的全部未发布的班级才生效
end
if pl_status == 1 #如果问卷存在已发布的,或者是已截止的,那么则直接跳过
g_course = params[:group_ids] #表示是否传入分班参数,如果传入分班的参数那么poll的统一设置需修改
if g_course
user_course_groups = @course.charge_group_ids(current_user)
# if course_groups.blank?
# user_course_groups = @course.course_groups.present? ? @course.course_groups.pluck(:id) : []
# else
# user_course_groups = course_groups.pluck(:course_group_id)
# end
if g_course.map(&:to_i).sort == user_course_groups.sort # 如果是设置为全部班级,则问卷不用分组,且问卷设定为统一设置,否则则分组设置
poll.poll_group_settings.destroy_all
poll_unified = true
else
poll_unified = false
g_course.each do |i|
poll_group_setting = poll.poll_group_settings.find_in_poll_group("course_group_id",i).first #根据课堂分班的id寻找问卷所在的班级
if poll_group_setting #如果该问卷分组存在,则更新,否则新建
poll_group_setting.update_attributes(publish_time:Time.now,end_time:ex_end_time)
else
p_course_group = {
:poll_id => poll.id,
:course_group_id => i,
:course_id => poll.course.id,
:publish_time => Time.now,
:end_time => ex_end_time,
}
new_poll_group = poll.poll_group_settings.new p_course_group
new_poll_group.save
end
end
group_ids = params[:group_ids]
end
else
poll.poll_group_settings.destroy_all
poll_unified = true
end
if poll.end_time.blank?
e_time = ex_end_time
elsif poll.poll_group_settings.end_time_present.count > 0 # 该问卷分组有结束时间为空的
e_time = poll.poll_group_settings.end_time_present.map(&:end_time).max
else
e_time = poll.end_time
end
poll_status = set_poll_status(Time.now,e_time)
poll_params = {
:publish_time => Time.now,
:end_time => e_time,
:polls_status => poll_status,
:unified_setting => poll_unified
}
poll.update_attributes(poll_params)
if poll.course_acts.size == 0
poll.course_acts << CourseActivity.new(:user_id => poll.user_id,:course_id => poll.course_id)
end
PollPublishNotifyJob.perform_later(poll.id, group_ids)
end
end
normal_status(0, "问卷发布成功!")
## 需添加发送消息的接口,稍后添加
rescue Exception => e
uid_logger_error(e.message)
tip_exception("问卷发布失败")
raise ActiveRecord::Rollback
end
end
end
#立即截止的弹窗内容
def end_poll_modal
ActiveRecord::Base.transaction do
begin
poll_ids = params[:check_ids]
if poll_ids.count > 0
@course_groups = get_user_permission_course(poll_ids,3)
else
@course_groups = []
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception("没有权限")
raise ActiveRecord::Rollback
end
end
end
# 首页批量或单独 立即截止,截止时间为当前时间
def end_poll
ActiveRecord::Base.transaction do
begin
check_ids = Poll.where(id: params[:check_ids])
check_ids.each do |poll|
poll_status = poll.get_poll_status(current_user.id)
if poll_status == 2 #跳过已截止的或未发布的
g_course = params[:group_ids] #表示是否传入分班参数,如果传入分班的参数那么poll的统一设置需修改poll_group_settings
if g_course
# 如果问卷之前是统一设置且分班参数与课堂的分班数不一致则变为非统一设置同时创建poll_group_settings
if poll.unified_setting && g_course.length != @course.course_groups_count
poll.poll_group_settings.destroy_all
@course.course_groups.each do |group|
poll.poll_group_settings << PollGroupSetting.new(poll_id: poll.id, course_group_id: group.id, course_id: @course.id,
publish_time: poll.publish_time, end_time: poll.end_time)
end
else
poll_unified = poll.unified_setting #这个作为初始化的值是否要好点呢?-hs
end
poll_users = poll_unified ? poll.poll_users :
poll.poll_users.joins("join course_members on poll_users.user_id = course_members.user_id").where(course_members: {course_group_id: g_course, role: 4})
poll_group_setting = poll.poll_group_settings
old_poll_groups = poll_group_setting.find_in_poll_group("course_group_id",g_course) #问卷分组的截止时间更改
old_poll_groups.update_all(:end_time => Time.now)
new_end_time = poll_group_setting.end_time_present.map(&:end_time) # 问卷结束时间不为空的
new_end_time_s = new_end_time.size > 0 ? new_end_time.max : Time.now
new_poll_status = set_poll_status(poll.publish_time,new_end_time_s)
poll.update_attributes(:end_time => new_end_time_s,:polls_status => new_poll_status,:unified_setting => poll_unified)
elsif poll.unified_setting
poll_users = poll.poll_users
poll.update_attributes(:polls_status => 3, :end_time => Time.now)
end
poll_users = poll_users.where("commit_status = 0 and start_at is not null")
poll_users.update_all(:commit_status => 1, :end_at => Time.now)
end
end
normal_status(0, "问卷截止成功!")
rescue Exception => e
uid_logger_error(e.message)
tip_exception("立即截止失败!")
raise ActiveRecord::Rollback
end
end
end
#撤销发布的弹窗内容
def cancel_publish_modal
ActiveRecord::Base.transaction do
begin
poll_ids = [@poll.id]
if poll_ids.count > 0
@course_groups = get_user_permission_course(poll_ids,2)
else
@course_groups = []
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception("没有权限")
raise ActiveRecord::Rollback
end
end
end
# 撤销发布,仅指当前的问卷
def cancel_publish
ActiveRecord::Base.transaction do
begin
g_course = params[:group_ids]
if !@poll.unified_setting #如果问卷为分班设置且传入的班级id存在
if g_course.present?
course_group_ids = @course.course_members.course_find_by_ids("course_group_id",g_course).pluck(:user_id).uniq #传入班级的全部学生人数
all_poll_settings = @poll.poll_group_settings.find_in_poll_group("course_group_id",g_course) #根据传入的班级id来获取问卷的分组设置
all_poll_settings.destroy_all #问卷的设置文件全部删除
# @poll.poll_users.find_by_group_ids(course_group_ids).destroy_all #问卷的提交信息
poll_question_ids = @poll.poll_questions.pluck(:id) #问卷的全部问卷
PollVote.find_current_vote("user_id",course_group_ids).find_current_vote("poll_question_id",poll_question_ids).destroy_all
poll_user_options = {
:commit_status => 0,
:start_at => nil,
:end_at => nil
}
@poll.poll_users.find_by_group_ids(course_group_ids).update_all(poll_user_options) #试卷的用户全部更新为未答题状态
poll_groups = @poll.poll_group_settings
if poll_groups.present? #是否还有问卷的发布分组,如果有的话,则是根据发布规则取最大和最小值
unified_setting = false
e_time_present = poll_groups.end_time_present.map(&:end_time)
p_time_present = poll_groups.publish_time_present.map(&:publish_time)
e_time = e_time_present.size > 0 ? e_time_present.max : nil
p_time = p_time_present.size > 0 ? p_time_present.min : nil
poll_status = 1
if p_time.nil? #发布时间为空,则表示问卷未发布
poll_status = 1
elsif p_time.present? && e_time.present?
poll_status = set_poll_status(p_time,e_time)
end
else
unified_setting = true
p_time = nil
e_time = nil
poll_status = 1
end
poll_options = {
:unified_setting => unified_setting,
:polls_status => poll_status,
:publish_time => p_time,
:end_time => e_time
}
@poll.update_attributes(poll_options)
normal_status(0,"分班问卷撤销发布成功!")
else
normal_status(-1,"请选择撤销发布班级!")
end
else
poll_user_options = {
:commit_status => 0,
:start_at => nil,
:end_at => nil
}
@poll.poll_users.update_all(poll_user_options)
poll_question_ids = @poll.poll_questions.pluck(:id)
PollVote.find_current_vote("poll_question_id",poll_question_ids).destroy_all
poll_new_params = {
:polls_status => 1,
:publish_time => nil,
:end_time => nil,
:unified_setting => true
}
@poll.update_attributes(poll_new_params)
@poll.poll_group_settings.destroy_all
normal_status(0,"问卷撤销发布成功!")
## @poll.tidings.destroy_all 用户的发送消息全部删除,因接口未定,所以先注释
## 需添加发送消息的接口,稍后添加
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception("问卷撤销发布失败!")
raise ActiveRecord::Rollback
end
end
end
# 首页批量或单独删除
def destroys
ActiveRecord::Base.transaction do
begin
check_ids = Poll.where(id:params[:check_ids])
check_ids.each do |poll|
if poll.present?
poll.destroy
end
end
normal_status(0, "问卷已删除成功!")
rescue Exception => e
uid_logger_error(e.message)
tip_exception("问卷删除失败!")
raise ActiveRecord::Rollback
end
end
end
# 设为公开
def set_public
ActiveRecord::Base.transaction do
begin
check_ids = Poll.where(id:params[:check_ids])
check_ids.each do |poll|
poll.update_attribute('is_public', true)
end
normal_status(0, "问卷已设为公开!")
rescue Exception => e
uid_logger_error(e.message)
tip_exception("问卷设为公开失败!")
raise ActiveRecord::Rollback
end
end
end
## 加入题库
def join_poll_banks
ActiveRecord::Base.transaction do
begin
check_ids = Poll.where(id: params[:check_ids])
check_ids.each do |poll|
current_ex_bank = current_user.exercise_banks.find_by_container(poll.id,"Poll").first
if current_ex_bank.present? #当前用户的选择问卷是否已加入习题库,存在则更新习题库和问题库,否则新建习题库和问题库
ex_params = {
:name => poll.polls_name,
:description => poll.polls_description,
:course_list_id => poll.course.try(:course_list_id)
}
current_ex_bank.update_attributes(ex_params)
question_bank = QuestionBank.ques_by_container(current_ex_bank.id,current_ex_bank.container_type) #该习题库是否存在于问题库里
ques_params = {
:name => current_ex_bank.name,
:course_list_id => current_ex_bank.course_list_id
}
question_bank.first.update_attributes(ques_params) if question_bank.present?
current_ex_bank.exercise_bank_questions.destroy_all # 更新后,习题库的问题全部删除,后续重新再建
else
ex_params = {
:name => poll.polls_name,
:description => poll.polls_description,
:user_id => current_user.id,
:is_public => 0,
:course_list_id => poll.course.try(:course_list_id),
:container_id => poll.id,
:container_type => "Poll",
:quotes => 1
}
current_ex_bank= ExerciseBank.new ex_params
if current_ex_bank.save #如果习题库保存成功则会创建问题库question_bank
ques_params = {
:name => current_ex_bank.name,
:container_id => current_ex_bank.id,
:container_type => current_ex_bank.container_type,
:quotes => current_ex_bank.quotes,
:user_id => current_ex_bank.user_id,
:is_public => current_ex_bank.is_public,
:course_list_id => current_ex_bank.course_list_id
}
question_bank = QuestionBank.new ques_params
question_bank.save
end
end
# 问卷的问题的输入
poll.poll_questions.each do |f|
option = {
:question_title => f.question_title,
:question_type => f.question_type,
:is_necessary => f.is_necessary,
:question_number => f.question_number,
:max_choices => f.max_choices,
:min_choices => f.min_choices
}
exercise_bank_question = current_ex_bank.exercise_bank_questions.new option
exercise_bank_question.save
## 问卷答案的输入
f.poll_answers.each do |a|
choice_option = {
:choice_position => a.answer_position,
:choice_text => a.answer_text
}
exercise_bank_c = exercise_bank_question.exercise_bank_choices.new choice_option
exercise_bank_c.save
end
end
end
normal_status(0, "题库更新成功!")
rescue Exception => e
uid_logger_error(e.message)
tip_exception("题库更新失败!")
raise ActiveRecord::Rollback
end
end
end
# 我的问卷题库
def my_polls
ActiveRecord::Base.transaction do
begin
## 我的问卷题库
@current_user_exercises = current_user.exercise_banks.find_by_c_type("Poll")
if @current_user_exercises.present?
if params[:search].present?
search_type = params[:search].to_s.strip
@current_user_exercises = @current_user_exercises.exercise_bank_search(search_type)
end
page = params[:page] || 1
limit = params[:limit] || 15
@my_exercises_count = @current_user_exercises.size
@current_user_exercises = @current_user_exercises.page(page).per(limit)
else
@current_user_exercises = []
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception("题库调用失败!")
raise ActiveRecord::Rollback
end
end
end
# 公共的问卷题库
def public_polls
ActiveRecord::Base.transaction do
begin
if current_user.is_certification_teacher
@user_certification = 1 #用户已通过认证
@public_exercises = ExerciseBank.find_by_c_type("Poll").public_exercises
if @public_exercises.present?
if params[:search].present?
search_type = params[:search].to_s.strip
@public_exercises = @public_exercises.exercise_bank_search(search_type)
end
page = params[:page] || 1
limit = params[:limit] || 15
@public_exercises_count = @public_exercises.size
@public_exercises = @public_exercises.page(page).per(limit)
else
@public_exercises_count = 0
@public_exercises = []
end
else
@user_certification = 0 #用户未通过认证
@public_exercises_count = 0
@public_exercises = []
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception("题库调用失败!")
raise ActiveRecord::Rollback
end
end
end
# 设置页面,先返回问卷的状态
def poll_setting
ActiveRecord::Base.transaction do
begin
@user_permission = 2
@user_course_groups = @course.teacher_group(current_user.id) #当前老师的分班
@being_setting_course_ids = @poll.poll_published_ids(current_user.id) #当前用户已发布的班级的id
@user_published_setting = @poll.poll_group_settings.find_in_poll_group("course_group_id",@being_setting_course_ids)
poll_ids = [@poll.id]
@poll_publish_count = get_user_permission_course(poll_ids,2).count
rescue Exception => e
uid_logger_error(e.message)
tip_exception("页面调用失败!")
raise ActiveRecord::Rollback
end
end
end
#问卷设置提交
def commit_setting
ActiveRecord::Base.transaction do
begin
error_count = 0 # 判断循环里是否有已发布/已截止的,且时间更改了的分班。
course_group_ids = @course.charge_group_ids(current_user) #当前老师的班级id数组
poll_status = @poll.get_poll_status(current_user.id)
if poll_status == 1 && course_group_ids.size > 0 # 问卷未发布且老师的分班大于1 才可以修改统一设置否则按poll默认的来处理
unified_setting = params[:unified_setting]
else
unified_setting = @poll.unified_setting
end
show_result = params[:show_result] ? 1 : 0
un_anonymous = params[:un_anonymous] ? true : false
# 统一设置或者分班为0则更新问卷并删除问卷分组
if unified_setting || (course_group_ids.size == 0)
params_publish_time = params[:publish_time].present? ? params[:publish_time].to_time : nil
params_end_time = nil
if params[:end_time].blank?
if params_publish_time.present?
params_end_time = params_publish_time + 30.days
end
else
params_end_time = params[:end_time].to_time
end
# params_end_time = params[:end_time].present? ? params[:end_time].to_time : nil
if poll_status == 2 && @poll.publish_time != params_publish_time
normal_status(-1,"不允许修改发布时间")
elsif poll_status == 3 && (@poll.end_time != params_end_time || @poll.publish_time != params_publish_time)
normal_status(-1,"不允许修改发布时间")
elsif params_publish_time.present? && params_end_time.present? && params_end_time < params_publish_time
normal_status(-1,"截止时间不能小于发布时间")
else
#发布时间小于当前时间则poll显示为未发布,当截止时间大于当前时间,则显示为已截止
poll_status_n = set_poll_status(params_publish_time,params_end_time)
poll_params = {
:unified_setting => unified_setting,
:show_result => show_result,
:un_anonymous => un_anonymous,
:polls_status => poll_status_n,
:publish_time => params_publish_time,
:end_time => params_end_time
}
@poll.update_attributes(poll_params)
@poll.poll_group_settings.destroy_all
normal_status(0, "问卷设置成功!")
end
else
params_times = params[:publish_time_groups] #分班返回的json数组{"publish_time_groups":[{"course_group_id":["1","2"],"publish_time":"xx","end_time":"xxx"}]}
poll_groups = @poll.poll_group_settings.find_in_poll_group("course_id",@course.id) #当前课堂问卷的班级全部分班信息
poll_groups_ids = poll_groups.pluck(:course_group_id) #问卷的全部分班id
total_common = params_times.map{|k| k[:course_group_id]}.sum #传入的所有分组的分班id
total_common_group = poll_groups_ids & total_common #传入的分班与问卷已存在的分班的交集
old_poll_groups = poll_groups_ids - total_common_group #后来传入的分班里,没有了的班级,即需要删除
params_times.each do |t|
course_id = t[:course_group_id] #为数组可能会设置分班为各个班级id的数组
poll_publish_time = t[:publish_time].present? ? t[:publish_time].to_time : nil
# poll_end_time = t[:end_time].present? ? t[:end_time].to_time : nil
poll_end_time = nil
if t[:end_time].blank?
if poll_publish_time.present?
poll_end_time = poll_publish_time + 30.days
end
else
poll_end_time = t[:end_time].to_time
end
poll_group = poll_groups.find_in_poll_group("course_group_id",course_id) #判断该分班是否存在
if poll_group.present? && poll_group.first.end_time <= Time.now && (poll_end_time != poll_group.first.end_time || poll_publish_time != poll_group.first.publish_time) #已截止且时间改变的,则提示错误
error_count += 1
end
if poll_group.present? && poll_group.first.publish_time < Time.now && poll_publish_time != poll_group.first.publish_time
error_count += 1
end
if error_count == 0
common_group = poll_groups_ids & course_id #传入的班级与问卷已存在的班级的交集,即表示已有分班的
new_group_ids = course_id - common_group #新传入的班级id
if common_group.size > 0 #传入的参数存在已发布的分班
poll_group_params = {
:publish_time => poll_publish_time,
:end_time => poll_end_time
}
poll_group = poll_groups.find_in_poll_group("course_group_id",common_group)
the_group_setting = poll_group.first
if the_group_setting.present?
the_group_setting_status = set_poll_status(the_group_setting.publish_time,the_group_setting.end_time)
if the_group_setting_status == 2
poll_group_params = {
:publish_time => the_group_setting.publish_time,
:end_time => poll_end_time
}
elsif the_group_setting_status == 3
poll_group_params = {
:publish_time => the_group_setting.publish_time,
:end_time => the_group_setting.end_time
}
end
end
poll_group.update_all(poll_group_params)
end
if new_group_ids.size > 0
new_group_ids.each do |c|
poll_group_params = {
:poll_id => @poll.id,
:course_group_id => c,
:course_id => @course.id,
:publish_time => poll_publish_time,
:end_time => poll_end_time
}
new_poll_group = PollGroupSetting.new(poll_group_params)
new_poll_group.save
end
end
end
end
if error_count > 0
error_count == 0
normal_status(-1,"已发布/已截止的问卷不允许修改时间")
else
if old_poll_groups.size > 0
old_all_poll_groups = poll_groups.find_in_poll_group("course_group_id",old_poll_groups)
old_all_poll_groups.destroy_all
end
#问卷更新为poll_group_setting的发布时间最小截止时间最大
e_time_present = poll_groups.end_time_present.map(&:end_time)
p_time_present = poll_groups.publish_time_present.map(&:publish_time)
e_time = e_time_present.size > 0 ? e_time_present.max : nil
p_time = p_time_present.size > 0 ? p_time_present.min : nil
poll_status = 1
if p_time.nil? #发布时间为空,则表示问卷未发布
poll_status = 1
elsif p_time.present? && e_time.present?
poll_status = set_poll_status(p_time,e_time)
end
poll_params = {
:unified_setting => unified_setting,
:show_result => show_result,
:un_anonymous => un_anonymous,
:polls_status => poll_status,
:publish_time => p_time,
:end_time => e_time
}
@poll.update_attributes(poll_params)
if @poll.polls_status == 2
if @poll.course_acts.size == 0
@poll.course_acts << CourseActivity.new(:user_id => @poll.user_id,:course_id => @poll.course_id)
end
end
normal_status(0, "问卷设置成功!")
end
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception("提交出现错误!")
raise ActiveRecord::Rollback
end
end
end
# 开始答题,如答案提交后则不可再修改, 问卷截止后或提交后,该页面不可再次点击
def start_answer
ActiveRecord::Base.transaction do
begin
poll_user_current = @poll.poll_users.find_by_group_ids(@poll_current_user_id).first #查找当前用户是否有过答题
@poll_status = @poll.get_poll_status(current_user.id)
if poll_user_current.blank?
if @user_course_identity > Course::ASSISTANT_PROFESSOR #当为老师的时候不创建poll_user表理论上老师是不能进入答题的
poll_user_params = {
:user_id => @poll_current_user_id,
:poll_id => @poll.id,
:start_at => Time.now,
:commit_status => 0
}
PollUser.create(poll_user_params)
end
elsif poll_user_current.start_at.nil?
poll_user_current.update_attributes(:start_at => Time.now)
end
if @user_course_identity < Course::STUDENT || (@poll_status == 3) || (poll_user_current.present? && poll_user_current.commit_status == 1)
@user_poll_status = 1 #当前用户为老师/问卷已截止/问卷已提交不可编辑
else
@user_poll_status = 0 #可编辑
end
# @answer_user = User.find_by(id:@poll_current_user_id)
@answer_status = []
question_answered = 0
# 判断是否已经回答还是新建的回答
@poll_questions.each do |q|
ques_vote = q.poll_votes.find_current_vote("user_id",@poll_current_user_id)
if ques_vote.present?
ques_status = 1
question_answered += 1
else
ques_status = 0
end
answer_status = {
:ques_id => q.id,
:ques_number => q.question_number,
:ques_status => ques_status
}
@answer_status = @answer_status.push(answer_status)
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception("页面调用失败!")
raise ActiveRecord::Rollback
end
end
end
# 用户提交问卷
def commit_poll
ActiveRecord::Base.transaction do
begin
poll_user_current = @poll.poll_users.find_by_group_ids(current_user.id).first
poll_user_params = {
:commit_status => 1,
:end_at => Time.now
}
poll_user_current.update_attributes(poll_user_params)
normal_status(0, "问卷提交成功!")
## 需添加发送消息的接口,稍后添加
rescue Exception => e
uid_logger_error(e.message)
tip_exception("页面调用失败!")
raise ActiveRecord::Rollback
end
end
end
#问卷的统计结果
def commit_result
ActiveRecord::Base.transaction do
begin
# 分页
@page = params[:page] || 1
@limit = params[:limit] || 10
@poll_export_questions = @poll_questions.order("question_number ASC")
@poll_questions = @poll_questions.page(@page).per(@limit)
respond_to do |format|
format.json
format.xlsx{
if @user_course_identity > Course::ASSISTANT_PROFESSOR
tip_exception(403,"无权限操作")
else
polls_export_name = current_user.real_name + "_" + @course.name + "_" + @poll.polls_name + "_" + Time.now.strftime('%Y%m%d_%H%M%S')
render xlsx: "#{polls_export_name.strip.first(30)}",template: "polls/commit_result.xlsx.axlsx",locals: {poll_questions:@poll_export_questions}
end
}
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception("页面调用失败!")
raise ActiveRecord::Rollback
end
end
end
#问卷的答题列表
def poll_lists
ActiveRecord::Base.transaction do
begin
poll_ids = [@poll.id]
@poll_list_status = @poll.get_poll_status(current_user.id)
@poll_publish_count = get_user_permission_course(poll_ids,2).count
@poll_unpublish_count = get_user_permission_course(poll_ids,1).count
@course_all_members = @course.students
@poll_group_counts = @course.course_groups_count
if @user_course_identity < Course::STUDENT #当前为老师,而且老师只能查看自己班级的/课堂的问卷
@poll_current_user_status = 0
@poll_users_list = @poll.all_poll_users(current_user.id) #该老师分班的全部学生
get_poll_answers(@poll_users_list)
if @poll_list_status == 1
@poll_course_groups =[]
else
poll_common_ids = @poll.poll_published_ids(current_user.id)
@poll_course_groups = @course.get_ex_published_course(poll_common_ids)
end
if @poll_list_status == 1
@poll_users_list = []
end
elsif @user_course_identity > Course::ASSISTANT_PROFESSOR
@poll_all_users = @poll.get_poll_exercise_users
get_poll_answers(@poll_all_users) # 未答和已答的
@poll_course_groups = [] #当为学生的时候,不显示分班情况
@poll_current_user_status = 1 #当前用户的状态,为学生
poll_current_user = @poll_all_users.find_by_group_ids(current_user.id) #当前用户是否开始做问卷(提交/未提交/没做)
if poll_current_user.present? && @poll_list_status != 1 #当前为学生或者有过答题的(提交/未提交),且问卷已发布的
@poll_users_list = poll_current_user.distinct
else
@poll_users_list = []
end
else
@poll_all_users = @poll.get_poll_exercise_users
get_poll_answers(@poll_all_users) # 未答和已答的
@poll_current_user_status = 2 #当前用户非课堂成员
@poll_users_list = []
end
if @poll_users_list.present? && @poll_users_list.count > 0
@poll_users_count = @poll_users_list.count #当前显示的全部成员数量
else
@poll_users_count = 0
end
if @poll_unanswers < 0
@poll_unanswers = 0
end
#筛选/分类,排序
order = params[:order]
# b_sort = params[:sort] || "desc"
choose_type = params[:commit_status]
group_id = params[:poll_group_id]
search_content = params[:search]
if @poll_users_list.present? && @poll_users_list.count > 0
if order == "student_id"
@poll_users_list = @poll_users_list.joins(user: [:user_extension]).order("user_extensions.student_id DESC")
else
@poll_users_list = @poll_users_list.order("end_at DESC")
end
#答题状态的选择
if choose_type.present?
@poll_users_list = @poll_users_list.commit_by_status(choose_type)
end
#班级的选择
if group_id.present?
poll_students = @course_all_members.course_find_by_ids("course_group_id",group_id) # 问卷所分班的全部人数
user_ids = poll_students.pluck(:user_id).reject(&:blank?)
@poll_users_list = @poll_users_list.find_by_group_ids(user_ids)
end
#搜索
if search_content.present?
@poll_users_list = @poll_users_list.joins(user: :user_extension).where("CONCAT(lastname, firstname) like ? OR student_id like ?", "%#{search_content}%", "%#{search_content}%")
end
logger.info("#######F_______@poll_users_list_last___@users_ids________________####{@poll_users_list.pluck(:user_id)}")
@poll_users_size = @poll_users_list.count
# 分页
page = params[:page] || 1
limit = params[:limit] || 20
@poll_users_list = @poll_users_list.page(page).per(limit)
logger.info("#######F_______@poll_users_list_after_page___@users_ids________________####{@poll_users_list.pluck(:user_id)}")
else
@poll_users_list = []
@poll_users_size = 0
end
@current_user = current_user
rescue Exception => e
uid_logger_error(e.message)
tip_exception("页面调用失败!")
raise ActiveRecord::Rollback
end
end
end
private
def is_course_teacher
unless @user_course_identity < Course::STUDENT #为老师/助教/管理员
tip_exception("403", "")
end
end
def validate_params
normal_status(-1, "问卷标题不能为空!") if params[:polls_name].blank?
normal_status(-1, "问卷标题不能超过60个字符") if (params[:polls_name].present? && params[:polls_name].length > 60)
normal_status(-1, "问卷描述不能超过100个字符") if (params[:polls_description].present? && params[:polls_description].length > 100)
end
def poll_params
params.require(:poll).permit(:polls_name,:polls_status,:publish_time,:end_time,:polls_description,
:show_result,:exercise_bank_id,:is_public,:unified_setting,:un_anonymous)
end
# 获得问卷及课堂
def get_poll_and_course
@poll = Poll.find_by(id: params[:id])
if @poll.blank?
tip_exception(404)
else
@course = @poll.course
tip_exception(404) if @course.blank?
end
end
# 当前课堂及用户的判断
def check_user_status
unless @course.is_public == 1 || (@course.is_public == 0 && @user_course_identity < Course::NORMAL) #课堂的成员/管理员才可以
tip_exception(403)
end
end
# 在设置问卷公开前,需判断课堂是否公开
def is_course_public
unless @course.is_public == 1 # 0为私有1为公开
tip_exception(403)
end
end
## 判断开始答题页面的用户权限
def check_user_on_answer
poll_status = @poll.get_poll_status(current_user.id)
if @user_course_identity == Course::STUDENT && poll_status == 1 #问卷未发布,且当前用户不为老师/管理员
normal_status(-1, "未发布问卷!")
elsif @user_course_identity > Course::STUDENT && (!@poll.is_public || (@poll.is_public && !@poll.unified_setting)) ##不为课堂成员,且问卷不为公开的,或问卷公开,但是不是统一设置的
normal_status(-1, "问卷暂未公开!")
end
end
def check_unified_setting?(poll) #问卷是否统一设置,如为分班设置,当前用户是否在班级内
if !poll.unified_setting #如果为分班设置,则需判断用户是否在班级内
poll_group_settings = poll.poll_group_settings.pluck(:course_group_id)
member = @course.course_members.course_find_by_ids("user_id",current_user.id)
member_group_id = member.pluck(:course_group_id).uniq
if (member_group_id & poll_group_settings).size > 0 || @user_course_identity < Course::STUDENT
true
else
false
end
else
true
end
end
def validates_multi_ids
if params[:check_ids].blank? || params[:check_ids].count <= 0
normal_status(-1, "请选择问卷!")
elsif params[:check_ids].count > 15
normal_status(-1, "最多只能选择15条数据")
end
end
def set_poll_status(publish_time,end_time)
time_now_i = Time.now
if publish_time.present? && end_time.present? && publish_time <= time_now_i && end_time > time_now_i
2
elsif publish_time.nil? || (publish_time.present? && publish_time > time_now_i)
1
elsif end_time.present? && end_time <= time_now_i
3
# elsif end_time.present? && publish_time.present? && end_time < publish_time
# normal_status(-1,"时间设置错误!")
else
1
end
end
def get_questions_count
@poll_questions = @poll.poll_questions&.includes(:poll_answers,:poll_votes).order("question_number ASC")
@poll_questions_count = @poll_questions.count # 全部的题目数
@poll_question_singles = @poll_questions.ques_count(1).all.count # 单选题
@poll_question_doubles = @poll_questions.ques_count(2).all.count # 多选题
@poll_question_mains = @poll_questions.ques_count(3).all.count #主观题
end
def check_poll_question_complete #commit_poll 的权限
poll_user_current = @poll.poll_users.find_by_group_ids(current_user.id).first
poll_status = @poll.get_poll_status(current_user.id)
if @user_course_identity < Course::STUDENT || (poll_status == 3) || (poll_user_current.present? && poll_user_current.commit_status == 1)
normal_status(-1,"用户没有权限!") #老师/管理员在提交时没有权限
else
necessary_answer = 0
poll_questions = @poll.poll_questions
necessary_question = poll_questions.ques_necessary # 问卷必答的问题
necessary_question.each do |q|
user_vote = q.poll_votes.find_current_vote("user_id",current_user.id)
vote_answer_id = user_vote.pluck(:poll_answer_id).reject(&:blank?).size
vote_text_count = user_vote.pluck(:vote_text).reject(&:blank?).size
if vote_answer_id == 0 && vote_text_count == 0
necessary_answer += 1
end
end
if necessary_answer > 0
normal_status(-1,"问卷提交失败,有#{necessary_answer}个未答的必答题!")
end
end
end
def check_poll_commit_result
poll_status = @poll.get_poll_status(current_user.id)
commit_poll_user = @poll.poll_users.find_by_group_ids(current_user.id).commit_by_status(1) #当前用户已提交问卷的
unless (@user_course_identity < Course::STUDENT) || ((@poll.show_result == 1) && (poll_status == 3) && commit_poll_user.present?)
normal_status(-1,"没有权限!") #当前为老师/问卷公开统计,且问卷已截止,且用户有过回答的
end
end
def check_user_id_start_answer #判断用户在开始答题时是否有用户id传入,如果为老师则id必需否则为当前用户的id
user_login = params[:login]
# @poll_current_user_id = params[:user_id]
if user_login.blank? && @user_course_identity < Course::STUDENT #id不存在且当前为老师/管理员等
normal_status(-1,"请输入学生登陆名!")
else
@answer_user = User.find_by(login:user_login)
if @answer_user.blank?
normal_status(404,"答题用户不存在")
else
@poll_current_user_id = @answer_user.id || current_user.id
end
end
end
def get_all_polls_commit
@poll_questions = @poll.poll_questions.order("question_number ASC")
@poll_commit_ids = @poll.poll_users.commit_by_status(1).pluck(:user_id) #问卷提交用户的id
# 全部页面,需返回
@poll_questions_count = @poll_questions.size
end
def get_user_permission_course(poll_ids,status) #获取用户权限范围内的已发布/未发布
poll_status = status.to_i
unpublish_group = []
# g_course_ids = @course.teacher_course_groups.get_user_groups(current_user.id).pluck(:course_group_id).reject(&:blank?).uniq
# if g_course_ids.blank? || g_course_ids.include?(0) #当前用户的分班权限为空,即具体全部的分班权限
# user_groups_id = @course.course_groups.pluck(:id)
# else
# user_groups_id = g_course_ids
# end
user_groups_id = @course.charge_group_ids(current_user)
all_polls = Poll.where(id:poll_ids)
all_polls.each do |poll|
if poll.present?
if poll.unified_setting
poll_user_status = poll.get_poll_status(current_user.id) #当前用户的能看到的试卷
if poll_user_status == poll_status || poll_status == 3 #未发布的情况
unpublish_group = unpublish_group + user_groups_id
else
unpublish_group = []
end
# unpublish_group = unpublish_group + user_groups_id
else
poll_all_group_settings = poll.poll_group_settings
poll_group_settings = poll_all_group_settings.poll_group_published.pluck(:course_group_id).uniq #问卷设置已发布的班级
if poll_status == 1
unpublish_group = user_groups_id - poll_group_settings
elsif poll_status == 3
poll_ended_groups = poll_all_group_settings.poll_group_ended.pluck(:course_group_id).uniq
poll_and_user = user_groups_id & poll_group_settings #用户已设置的分班
unpublish_group = unpublish_group + poll_and_user - poll_ended_groups #已发布的全部班级减去截止的全部班级
else
poll_and_user = user_groups_id & poll_group_settings #用户已设置的分班
unpublish_group = unpublish_group + poll_and_user
end
end
end
end
unpublish_group = unpublish_group.uniq
if unpublish_group.size > 0
course_groups = CourseGroup.by_group_ids(unpublish_group)
else
course_groups = []
end
course_groups
end
def check_poll_setting_status
publish_course = params[:publish_time_groups]
unified_setting = params[:unified_setting]
if @course.is_end
normal_status(-1,"课堂已结束不能再修改!")
elsif unified_setting
poll_group_settings = @poll.poll_group_settings
if poll_group_settings.present?
p_time_present = poll_group_settings.publish_time_present.map(&:publish_time).min
if p_time_present < Time.now
normal_status(-1,"设置失败,存在已发布的分班!")
end
elsif params[:publish_time].blank?
normal_status(-1,"发布时间不允许为空")
end
elsif unified_setting.present? && !unified_setting #非统一设置,分班不能为空
if publish_course.present?
course_ids = publish_course.map{|a| a[:course_group_id]}.sum
publish_t = publish_course.map{|a| a[:publish_time]}
if course_ids.include?(nil) || course_ids.count == 0
normal_status(-1,"请选择分班!")
elsif publish_t.include?(nil) || publish_t.count == 0
normal_status(-1,"发布时间不允许为空")
end
else
normal_status(-1,"请选择分班!")
end
# elsif (@poll.poll_status != 1) && (params[:publish_time].to_time != @poll.publish_time) && (@user_course_identity > Course::CREATOR)
# normal_status(-1,"已发布/已截止的不能修发布时间!") #课堂管理员和超级管理员才有权限
end
end
def get_left_banner_id
left_banner_content = @course.course_modules.search_by_module_type("poll")
if left_banner_content.present?
@left_banner_id = left_banner_content.first.id
@left_banner_name = left_banner_content.first.module_name
else
tip_exception(404)
end
end
end