class ExaminationBanksController < ApplicationController include PaginateHelper before_action :require_login before_action :certi_identity_auth, only: [:create, :edit, :update, :destroy, :set_public, :revoke_item] before_action :find_exam, except: [:index, :create] before_action :edit_auth, only: [:update, :destroy, :set_public, :revoke_item] before_action :identity_auth, only: [:index] def index exams = ExaminationBankQuery.call(params) @exams_count = exams.size @exams = paginate exams.includes(:user, :examination_items) end def show @items = @exam.examination_items @single_questions = @items.where(item_type: "SINGLE") @multiple_questions = @items.where(item_type: "MULTIPLE") @judgement_questions = @items.where(item_type: "JUDGMENT") @program_questions = @items.where(item_type: "PROGRAM") 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 end render_ok 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 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 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 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 current_user.admin_or_business? || @exam.user == current_user end end