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.
psfpeqmhf/app/controllers/examination_banks_controlle...

293 lines
12 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 ExaminationBanksController < ApplicationController
include PaginateHelper
include CoursesHelper
before_action :require_login
before_action :certi_identity_auth, only: [:edit, :revoke_item]
before_action :find_exam, except: [:index, :create, :create_random_exam, :cancel_items]
before_action :edit_auth, only: [:update, :set_public, :destroy]
before_action :identity_auth, only: [:index]
before_action :check_account, only: [:index]
before_action :check_contents_and_score_setting, only: [:create_random_exam, :update_random_exam]
# 创建随机组卷
def create_random_exam
ActiveRecord::Base.transaction do
examination_bank = current_user.examination_banks.build(
random_exam_params.slice(:name, :difficulty, :time, :source, :sub_discipline_id).merge(is_random: true)
)
if examination_bank.save!
# 1.保存随机规则设置
# "contents": [
# {
# "question_type": "MULTIPLE",
# "difficulty": 1,
# "sub_discipline_id": 1,
# "sub_discipline_name": null,
# "size": 1
# },
# {
# "question_type": "SINGLE",
# "difficulty": 1,
# "sub_discipline_id": 81,
# "sub_discipline_name": null,
# "size": 1
# }
# ]
random_exam_params[:contents].each do |random_setting|
examination_bank.examination_bank_random_settings.create!(
item_type: random_setting[:item_type],
sub_discipline_id: random_setting[:sub_discipline_id],
difficulty: random_setting[:difficulty],
quanlity: random_setting[:items_count]
)
end
# 2.保存赋分设置
# [
# {
# item_type: "SINGLE",
# score: 1
# }
# ]
random_exam_params[:score_settings].each do |score_setting|
examination_bank.examination_bank_score_settings.create!(
item_type: score_setting[:item_type], score: score_setting[:score]
)
end
end
render_ok({examination_bank_id: examination_bank.id})
end
rescue Exception => ex
render_error(ex.message)
end
# 编辑随机组卷
def edit_random_exam
@examination_bank_score_settings = @exam.examination_bank_score_settings
@examination_bank_random_settings = @exam.examination_bank_random_settings.includes(:sub_discipline=>[:discipline])
# 按照题型-课程-难度进行分组
# @contents = []
# item_types = @examination_bank_random_settings.pluck(:item_type).uniq
# item_types.each do |item_type|
# hash = {item_type: item_type, items_by_item_type: []}
# items_by_item_type = @examination_bank_random_settings.where(item_type: item_type)
# # 该题型下各个课程类的题目集合
# sub_disciplines = items_by_item_type.joins(:sub_discipline=>[:discipline]).pluck(:sub_discipline_id, "sub_disciplines.name name", :discipline_id, "disciplines.name discipline_name").uniq
# sub_disciplines.each_with_index do |sub_discipline, index|
# hash[:items_by_item_type] << {
# sub_discipline_id: sub_discipline[0], sub_discipline_name: sub_discipline[1], discipline_id: sub_discipline[2], discipline_name: sub_discipline[3],
# items_by_item_type_and_sub_discipline: []
# }
# items_by_item_type_and_sub_discipline = items_by_item_type.where(sub_discipline_id: sub_discipline[0])
# difficulties = items_by_item_type_and_sub_discipline.pluck(:difficulty).uniq
# difficulties.each do |difficulty|
# items_by_item_type_and_sub_discipline_and_difficulty = items_by_item_type_and_sub_discipline.where(difficulty: difficulty).select(:id)
# hash[:items_by_item_type][index][:items_by_item_type_and_sub_discipline] << {difficulty: difficulty, items_count: items_by_item_type_and_sub_discipline_and_difficulty.size}
# end
# end
# @contents << hash
# end
# 赋分设置
@score_settings = []
@examination_bank_score_settings.each do |examination_bank_score_setting|
@score_settings << {
item_type: examination_bank_score_setting.item_type,
score: examination_bank_score_setting.score
}
end
end
# 更新随机组卷
def update_random_exam
ActiveRecord::Base.transaction do
# 更新时直接删除原有配置重新建立
@exam.examination_bank_score_settings.destroy_all
@exam.examination_bank_random_settings.destroy_all
@exam.update!(random_exam_params.slice(:name, :difficulty, :time, :source).merge(is_random: true))
if @exam.save!
# 1.保存随机规则设置
# "contents": [
# {
# "question_type": "MULTIPLE",
# "difficulty": 1,
# "sub_discipline_id": 1,
# "sub_discipline_name": null,
# "size": 1
# },
# {
# "question_type": "SINGLE",
# "difficulty": 1,
# "sub_discipline_id": 81,
# "sub_discipline_name": null,
# "size": 1
# }
# ]
random_exam_params[:contents].each do |random_setting|
@exam.examination_bank_random_settings.create!(
item_type: random_setting[:item_type],
sub_discipline_id: random_setting[:sub_discipline_id],
difficulty: random_setting[:difficulty],
quanlity: random_setting[:items_count]
)
end
# 2.保存赋分设置
# [
# {
# item_type: "SINGLE",
# score: 1
# }
# ]
random_exam_params[:score_settings].each do |score_setting|
@exam.examination_bank_score_settings.create!(
item_type: score_setting[:item_type], score: score_setting[:score]
)
end
end
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def index
exams = ExaminationBankQuery.call(params)
@exams_count = exams.size
@exams = paginate exams.includes(:user, :examination_items)
@current_user = current_user
@role = current_user.admin_or_business? || current_user.is_teacher? || current_user.is_shixun_marker?
end
def show
@items = @exam.examination_items
# TODO 由于Jbuilder层公用了item_bank里面有根据用户的权限判断因此这边需要加上一个user_id
@single_questions = @items.where(item_type: "SINGLE")
.joins(:examination_bank).select("examination_items.*, examination_banks.user_id")
@multiple_questions = @items.where(item_type: "MULTIPLE")
.joins(:examination_bank).select("examination_items.*, examination_banks.user_id")
@judgement_questions = @items.where(item_type: "JUDGMENT")
.joins(:examination_bank).select("examination_items.*, examination_banks.user_id")
@completion_questions = @items.where(item_type: "COMPLETION")
.joins(:examination_bank).select("examination_items.*, examination_banks.user_id")
@subjective_questions = @items.where(item_type: "SUBJECTIVE")
.joins(:examination_bank).select("examination_items.*, examination_banks.user_id")
@program_questions = @items.where(item_type: "PROGRAM")
.joins(:examination_bank).select("examination_items.*, examination_banks.user_id")
end
def create
ActiveRecord::Base.transaction do
exam = ExaminationBank.new(user: current_user)
# 保存试卷基础信息
exam = ExaminationBanks::SaveExaminationBankService.call(exam, form_params)
# 将试题篮中的试题发送到试卷,试卷的题目与试题独立
current_user.item_baskets.includes(:item_bank).each do |basket|
item = basket.item_bank
if item.present?
new_item = ExaminationItem.new
new_item.new_item(item, exam, basket.score, basket.position)
end
end
current_user.item_baskets.destroy_all
render_ok({exam_id: exam.id})
end
rescue ApplicationService::Error => ex
render_error(ex.message)
end
def edit; end
def update
ExaminationBanks::SaveExaminationBankService.call(@exam, form_params)
render_ok
rescue ApplicationService::Error => ex
render_error(ex.message)
end
def destroy
tip_exception(403, "无权限") unless current_user.admin? || @exam.user == current_user
ActiveRecord::Base.transaction do
ApplyAction.where(container_type: "ExaminationBank", container_id: @exam.id).destroy_all
@exam.destroy!
render_ok
end
end
def set_public
tip_exception(-1, "该试卷已公开") if @exam.public?
tip_exception(-1, "请勿重复提交申请") if ApplyAction.where(container_id: @exam.id, container_type: "ExaminationBank", status: 0).exists?
ApplyAction.create!(container_id: @exam.id, container_type: "ExaminationBank", user_id: current_user.id)
# @exam.update_attributes!(public: 1)
render_ok
end
def set_private
tip_exception(-1, "该试卷已私有") unless @exam.public?
ActiveRecord::Base.transaction do
@exam.update_attributes!(public: 0)
ApplyAction.where(container_id: @exam.id, container_type: 'ExaminationBank', status: 0).update_all(status: 3)
end
render_ok
end
def revoke_item
item = @exam.examination_items.find_by!(item_bank_id: params[:item_id])
ActiveRecord::Base.transaction do
@exam.examination_items.where(item_type: item.item_type).where("position > #{item.position}").update_all("position = position -1")
item.destroy!
end
render_ok
end
def cancel_items
tip_exception(403, "无权限") unless current_user.admin_or_business? || current_user.item_baskets.where(item_bank_id: params[:item_ids]).size == params[:item_ids].size
current_user.item_baskets.where(item_bank_id: params[:item_ids]).destroy_all
render_ok
end
def send_to_course
tip_exception(403, "无权限") unless @exam.public || @exam.user == current_user
course = Course.find params[:course_id]
exercise = Exercise.new(user_id: current_user.id, course_id: course.id)
exercise = ExaminationBanks::SendToCourseService.call(@exam, exercise)
render_ok({exercise_id: exercise.id, first_category_url: module_url(course.exercise_course_modules.first, course)})
end
private
def form_params
params.permit(:discipline_id, :sub_discipline_id, :difficulty, :name, :duration, tag_discipline_id: [])
end
def find_exam
@exam = ExaminationBank.find_by!(id: params[:id])
end
def edit_auth
tip_exception(403, "无权限") unless current_user.admin_or_business? || @exam.user == current_user
end
def random_exam_params
result = params.permit(
:name, :difficulty, :source, :time, :sub_discipline_id,
contents: [
:item_type,
:sub_discipline_id,
:difficulty,
:items_count
],
score_settings: [
:item_type, :score
]
)
result
end
def check_contents_and_score_setting
raise Educoder::TipException.new("随机规则设置不得为空或者题目数量不能为0") if random_exam_params[:contents].blank? || random_exam_params[:contents].all?{|content| content[:items_count].to_i == 0}
raise Educoder::TipException.new("内容设置和赋分设置的题型数量不一致") if random_exam_params[:contents].collect{|content| content[:item_type]}.uniq.size != random_exam_params[:score_settings].collect{|setting| setting[:item_type]}.uniq.size
end
end