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/graduation_topics_controlle...

313 lines
14 KiB

6 years ago
class GraduationTopicsController < ApplicationController
before_action :require_login, except: [:index]
before_action :find_course
before_action :teacher_allowed, only: [:new, :create, :update, :edit, :destroys, :set_public,
:refuse_student_topic, :accept_student_topic, :export]
before_action :find_graduation_topic, except: [:index, :create, :new, :set_public, :destroys, :export]
before_action :find_course_teachers, only: [:new, :edit]
before_action :user_course_identity, only: [:index, :show, :show_detail, :show_comment]
include ExportHelper
# 毕设选题列表
def index
@graduation_topic = @course.graduation_topics
@current_user = current_user
# 搜索
if params[:search]
@graduation_topic = @graduation_topic.search_by_name(params[:search])
end
if params[:status]
@graduation_topic = @graduation_topic.search_by_status(params[:status])
end
# 当前用户是否已经选过题
# @user_selected = StudentGraduationTopic.where(graduation_topic_id: @graduation_topic, user_id: current_user.id).count > 0
user_graduation_topics = @course.student_graduation_topics.where(user_id: current_user.id, status: [0, 1], graduation_topic_id: @graduation_topic.pluck(:id)) #6.12 -hs
@user_selected = user_graduation_topics.size > 0
## 分页参数
page = params[:page] || 1
limit = params[:limit] || 15
@graduation_topic_count = @graduation_topic.count
@graduation_topic = @graduation_topic.order("created_at desc").page(page).per(limit)
end
# 课题列表
def show
@student_graduation_topics =
if @user_course_identity > Course::STUDENT && !@graduation_topic.is_public
StudentGraduationTopic.none
else
@graduation_topic.student_graduation_topics.includes(:user, :course_member => [:course_group])
.order("student_graduation_topics.created_at desc")
end
## 分页参数
@current_user = current_user
course_group_ids = @course.course_members.where(user_id: current_user.id, role: [1,2,3]).pluck(:course_group_id).uniq
#6.11 -hs
if course_group_ids.present?
if course_group_ids.include?(0)
course_group_ids = @course.course_groups.pluck(:id)
end
end
@group_list = CourseGroup.where(id: course_group_ids)
page = params[:page] || 1
limit = params[:limit] || 50
@users_count = @student_graduation_topics.try(:count).to_i
@student_graduation_topics = @student_graduation_topics.page(page).per(limit)
end
# 课题详情
def show_detail
@attachments = @graduation_topic.attachments
end
# 课题详情回复接口
def show_comment
@page = params[:page] || 1
@limit = params[:limit] || 10
@parent = params[:parent_id]
@current_user = current_user
@messages = @graduation_topic.journals_for_messages
if @parent
@messages = @messages.where(m_parent_id: @parent).order("created_on desc")
else
@messages = @messages.parent_comment.order("created_on asc")
end
@messages_count = @messages.count
@messages = @messages.page(@page).per(@limit)
end
# 新建课题
def new
#6.11 新增,-hs
left_banner_content = @course.course_modules.search_by_module_type("graduation")
if left_banner_content.present?
@left_banner_id = left_banner_content.first.course_second_categories.first.id
@left_banner_name = left_banner_content.first.course_second_categories.first.name
else
normal_status(-1,"左侧导航不存在!")
end
end
# 创建课题
# POST: /graduation_topics
def create
@graduation_topic = GraduationTopic.new(graduation_topic_params)
@graduation_topic.course_id = @course.id
@graduation_topic.user_id = current_user.id
@graduation_topic.save!
Attachment.associate_container(params[:attachment_ids], @graduation_topic.id, @graduation_topic.class) if params[:attachment_ids]
end
# 更新课程
def update
@graduation_topic.update_attributes(graduation_topic_params)
Attachment.associate_container(params[:attachment_ids], @graduation_topic.id, @graduation_topic.class) if params[:attachment_ids]
end
def edit
@attachments = @graduation_topic.attachments
left_banner_content = @course.course_modules.search_by_module_type("graduation")
if left_banner_content.present?
@left_banner_id = left_banner_content.first.course_second_categories.first.id
@left_banner_name = left_banner_content.first.course_second_categories.first.name
end
end
def destroys
tip_exception(-1, "graduation_topic_ids不能为空") if params[:graduation_topic_ids].nil?
@graduation_topics = GraduationTopic.where(:id => params[:graduation_topic_ids])
@graduation_topics.destroy_all
normal_status("删除成功")
end
def set_public
tip_exception(-1, "私有课程不能设置毕设选题为公开") if @course.is_public == 0
tip_exception(-1, "graduation_topic_ids不能为空") if params[:graduation_topic_ids].nil?
@graduation_topics = GraduationTopic.where(id: params[:graduation_topic_ids])
@graduation_topics.update_all(is_public: true)
normal_status("设置成功")
end
# 拒绝课题
def refuse_student_topic
begin
student_graduation_topic = @graduation_topic.student_graduation_topics
.find_by(id: params[:student_graduation_topic])
if student_graduation_topic.present?
# 更新学生选题和老师选题的状态
student_graduation_topic.update_attributes(:status => 2)
update_graduation_topic_status
# 拒绝后将该学生移动到未分班中
student_member = @course.course_members.where(:user_id => student_graduation_topic.user_id).first
student_member.update_attributes(:course_group_id => 0) if student_member.present?
student_graduation_topic.tidings.update_all(:status => 1)
Tiding.create(:user_id => student_graduation_topic.user_id, :trigger_user_id => current_user.id,
:container_id => student_graduation_topic.id, :container_type => "DealStudentTopicSelect",
:parent_container_id => @graduation_topic.id, :parent_container_type => "GraduationTopic",
:belong_container_id => @graduation_topic.course_id, :belong_container_type => "Course",
:viewed => 0, :tiding_type => "GraduationTopic", :status => 2)
end
normal_status("拒绝成功")
rescue Exception => e
uid_logger(e.message)
tip_exception(-1, "操作失败")
end
end
# 接受课题
def accept_student_topic
student_graduation_topic = @graduation_topic.student_graduation_topics
.where(:id => params[:student_graduation_topic_id]).first
if student_graduation_topic.present?
# 更新学生选题和老师选题的状态
student_graduation_topic.update_attributes(:status => 1)
update_graduation_topic_status
# 将学生加入到老师的第一个具有管理权限的分班没有则创建一个“XXX老师组”分班并弹框提醒
teacher_group = @course.teacher_course_groups.where(:user_id => @graduation_topic.tea_id, :id => params[:group_id]).first
unless teacher_group.present?
member = @course.course_members.where(:user_id => @graduation_topic.tea_id).first
tip_exception("分班名称不能为空") if params[:course_group_name].blank?
course_group = CourseGroup.create(:name => params[:course_group_name], :course_id => @course.id)
teacher_group = TeacherCourseGroup.create(:course_id => @course.id, :member_id => member.try(:id),
:user_id => @graduation_topic.tea_id,
:course_group_id => course_group.try(:id))
end
student_member = @course.course_members.where(:user_id => student_graduation_topic.user_id).first
student_member.update_attributes(:course_group_id => teacher_group.course_group_id) if student_member.present?
student_graduation_topic.tidings.update_all(:status => 1)
Tiding.create(:user_id => student_graduation_topic.user_id, :trigger_user_id => current_user.id,
:container_id => student_graduation_topic.id, :container_type => "DealStudentTopicSelect",
:parent_container_id => @graduation_topic.id, :parent_container_type => "GraduationTopic",
:belong_container_id => @graduation_topic.course_id, :belong_container_type => "Course",
:viewed => 0, :tiding_type => "GraduationTopic", :status => 1)
end
normal_status("同意成功")
end
# 学生选题
def student_select_topic
user_unaccept_topics = @course.student_graduation_topics.where(user_id: current_user.id, status: [0, 1])
if user_unaccept_topics.size == 0
member_id = @course.course_members.find_by_user_id(current_user.id)
StudentGraduationTopic.create(course_id: @course.id, user_id: current_user.id, member_id: member_id,
graduation_topic_id: @graduation_topic.id)
@graduation_topic.update_attribute(:status, 1)
normal_status("选题成功")
else
normal_status("已经选过题,无法重复选题")
end
end
# 学生取消选题
def student_cancel_topic
user_unaccept_topics = @course.student_graduation_topics.where(user_id: current_user.id, status: [0, 1])
user_unaccept_topics.destroy_all
update_graduation_topic_status
normal_status(0,"取消成功")
end
# 加入题库
def add_to_bank
ActiveRecord::Base.transaction do
begin
topics = @course.graduation_topics.where(id: params[:topic_ids])
topics.each do |topic|
topic_bank = current_user.gtopic_banks.find_by(graduation_topic_id: topic.id)
# 已加入的更新,未加入的新建
if topic_bank.present?
topic_bank.update_attributes(name: topic, description: topic.description,
topic_source: topic.topic_source,
topic_property_first: topic.topic_property_first,
topic_property_second: topic.topic_property_second,
source_unit: topic.source_unit,
topic_repeat: topic.topic_repeat,
province: topic.province,
city: topic.city,
course_list_id: @course.course_list_id)
topic_bank.attachments.destroy_all
else
topic_bank = GtopicBank.new(name: topic, description: topic.description,
topic_source: topic.topic_source,
topic_property_first: topic.topic_property_first,
topic_property_second: topic.topic_property_second,
source_unit: topic.source_unit,
topic_repeat: topic.topic_repeat,
province: topic.province,
city: topic.city,
course_list_id: @course.course_list_id,
user_id: current_user.id,
graduation_topic_id: topic.id)
topic_bank.save!
end
topic.attachments.each do |attachment|
att = attachment.copy
att.author_id = topic_bank.user_id
att.copy_from = attachment.id
topic_bank.attachments << att
end
end
normal_status(0,"加入题库成功")
rescue Exception => e
uid_logger(e.message)
tip_exception(e.message)
raise ActiveRecord::Rollback
end
end
end
# 导出功能
def export
course = @course
students = course.students.joins(user: :user_extension).order("user_extensions.student_id")
graduation_topic_to_xlsx(students,course)
exercise_export_name = current_user.real_name + "_" + course.name + "_毕设选题" + "_" + Time.now.strftime('%Y%m%d_%H%M%S')
render xlsx: "#{exercise_export_name.strip.first(30)}",template: "graduation_topics/export.xlsx.axlsx",locals: {table_columns:@topic_head_cells,topic_users:@topic_body_cells}
end
private
def find_graduation_topic
begin
@graduation_topic = GraduationTopic.find params[:id]
rescue Exception => e
uid_logger(e.message)
missing_template
end
end
def find_course_teachers
@teachers = @course.teachers.joins(:user).order("users.id = #{current_user.id} desc,
CONVERT(users.lastname USING gbk) COLLATE gbk_chinese_ci asc")
end
# 创建允许参数
def graduation_topic_params
params.require(:graduation_topic).permit(:tea_id, :name, :topic_type, :topic_source, :topic_property_first,
:description, :topic_property_second, :status, :source_unit, :topic_repeat,
:province, :city, :is_public)
end
# 更新选题的状态
def update_graduation_topic_status
status = @graduation_topic.student_graduation_topic_status
@graduation_topic.update_attribute(:status, status)
end
end