diff --git a/app/assets/javascripts/admins/salesman_channels/index.js b/app/assets/javascripts/admins/salesman_channels/index.js new file mode 100644 index 000000000..cc5109160 --- /dev/null +++ b/app/assets/javascripts/admins/salesman_channels/index.js @@ -0,0 +1,74 @@ +$(document).on('turbolinks:load', function() { + if ($('body.admins-salesman-channels-index-page').length > 0) { + + // ============= 添加销售人员 ============== + var $addMemberModal = $('.admin-add-salesman-channel-user-modal'); + var $addMemberForm = $addMemberModal.find('.admin-add-salesman-channel-user-form'); + var $memberSelect = $addMemberModal.find('.salesman-channel-user-select'); + var $salesmanIdInput = $('.salesman-channel-list-form').find(".btn-primary"); + + $addMemberModal.on('show.bs.modal', function(event){ + var $link = $(event.relatedTarget); + // var salesmanId = $link.data('salesman_id'); + // $salesmanIdInput.val(salesmanId); + + $memberSelect.select2('val', ' '); + }); + + $memberSelect.select2({ + theme: 'bootstrap4', + placeholder: '请输入要添加的单位', + multiple: true, + minimumInputLength: 1, + ajax: { + delay: 500, + url: '/admins/schools', + dataType: 'json', + data: function(params){ + return { keyword: params.term }; + }, + processResults: function(data){ + return { results: data.schools } + } + }, + templateResult: function (item) { + if(!item.id || item.id === '') return ''; + return $("" + item.name + ""); + }, + templateSelection: function(item){ + if (item.id) { + } + return item.name || ''; + } + }); + + $addMemberModal.on('click', '.submit-btn', function(){ + $addMemberForm.find('.error').html(''); + + // var salesmanId = $salesmanIdInput.val(); + var memberIds = $memberSelect.val(); + if (memberIds && memberIds.length > 0) { + $.ajax({ + method: 'POST', + dataType: 'json', + url: '/admins/salesman_channels/batch_add', + data: { salesman_id: $salesmanIdInput.data("salesman-id"), school_ids: memberIds }, + success: function(){ + $.notify({ message: '创建成功' }); + $addMemberModal.modal('hide'); + + setTimeout(function(){ + window.location.reload(); + }, 500); + }, + error: function(res){ + var data = res.responseJSON; + $form.find('.error').html(data.message); + } + }); + } else { + $addMemberModal.modal('hide'); + } + }); + } +}); \ No newline at end of file diff --git a/app/assets/javascripts/admins/salesman_customers/index.js b/app/assets/javascripts/admins/salesman_customers/index.js new file mode 100644 index 000000000..607e01f2e --- /dev/null +++ b/app/assets/javascripts/admins/salesman_customers/index.js @@ -0,0 +1,74 @@ +$(document).on('turbolinks:load', function() { + if ($('body.admins-salesman-customers-index-page').length > 0) { + + // ============= 添加销售人员 ============== + var $addMemberModal = $('.admin-add-salesman-customer-user-modal'); + var $addMemberForm = $addMemberModal.find('.admin-add-salesman-customer-user-form'); + var $memberSelect = $addMemberModal.find('.salesman-customer-user-select'); + var $salesmanIdInput = $('.salesman-customer-list-form').find(".btn-primary"); + + $addMemberModal.on('show.bs.modal', function(event){ + var $link = $(event.relatedTarget); + // var salesmanId = $link.data('salesman_id'); + // $salesmanIdInput.val(salesmanId); + + $memberSelect.select2('val', ' '); + }); + + $memberSelect.select2({ + theme: 'bootstrap4', + placeholder: '请输入要添加的销售姓名', + multiple: true, + minimumInputLength: 1, + ajax: { + delay: 500, + url: '/admins/users', + dataType: 'json', + data: function(params){ + return { name: params.term }; + }, + processResults: function(data){ + return { results: data.users } + } + }, + templateResult: function (item) { + if(!item.id || item.id === '') return item.text; + return $("" + item.real_name + " " + item.school_name + ' ' + item.hidden_phone + ""); + }, + templateSelection: function(item){ + if (item.id) { + } + return item.real_name || item.text; + } + }); + + $addMemberModal.on('click', '.submit-btn', function(){ + $addMemberForm.find('.error').html(''); + + // var salesmanId = $salesmanIdInput.val(); + var memberIds = $memberSelect.val(); + if (memberIds && memberIds.length > 0) { + $.ajax({ + method: 'POST', + dataType: 'json', + url: '/admins/salesman_customers/batch_add', + data: { salesman_id: $salesmanIdInput.data("salesman-id"), user_ids: memberIds }, + success: function(){ + $.notify({ message: '创建成功' }); + $addMemberModal.modal('hide'); + + setTimeout(function(){ + window.location.reload(); + }, 500); + }, + error: function(res){ + var data = res.responseJSON; + $form.find('.error').html(data.message); + } + }); + } else { + $addMemberModal.modal('hide'); + } + }); + } +}); \ No newline at end of file diff --git a/app/assets/javascripts/admins/salesmans/index.js b/app/assets/javascripts/admins/salesmans/index.js new file mode 100644 index 000000000..c7d4b416b --- /dev/null +++ b/app/assets/javascripts/admins/salesmans/index.js @@ -0,0 +1,99 @@ +$(document).on('turbolinks:load', function() { + if ($('body.admins-salesmans-index-page').length > 0) { + + // ============= 添加销售人员 ============== + var $addMemberModal = $('.admin-add-salesman-user-modal'); + var $addMemberForm = $addMemberModal.find('.admin-add-salesman-user-form'); + var $memberSelect = $addMemberModal.find('.salesman-user-select'); + // var $salesmanIdInput = $addMemberForm.find('input[name="salesman_id"]') + + $addMemberModal.on('show.bs.modal', function(event){ + var $link = $(event.relatedTarget); + // var salesmanId = $link.data('salesman-id'); + // $salesmanIdInput.val(salesmanId); + + $memberSelect.select2('val', ' '); + }); + + $memberSelect.select2({ + theme: 'bootstrap4', + placeholder: '请输入要添加的销售姓名', + multiple: true, + minimumInputLength: 1, + ajax: { + delay: 500, + url: '/admins/users', + dataType: 'json', + data: function(params){ + return { name: params.term }; + }, + processResults: function(data){ + return { results: data.users } + } + }, + templateResult: function (item) { + if(!item.id || item.id === '') return item.text; + return $("" + item.real_name + " " + item.school_name + ' ' + item.hidden_phone + ""); + }, + templateSelection: function(item){ + if (item.id) { + } + return item.real_name || item.text; + } + }); + + $addMemberModal.on('click', '.submit-btn', function(){ + $addMemberForm.find('.error').html(''); + + // var salesmanId = $salesmanIdInput.val(); + var memberIds = $memberSelect.val(); + if (memberIds && memberIds.length > 0) { + $.ajax({ + method: 'POST', + dataType: 'json', + url: '/admins/salesmans/batch_add', + data: { user_ids: memberIds }, + success: function(){ + $.notify({ message: '创建成功' }); + $addMemberModal.modal('hide'); + + setTimeout(function(){ + window.location.reload(); + }, 500); + }, + error: function(res){ + var data = res.responseJSON; + $form.find('.error').html(data.message); + } + }); + } else { + $addMemberModal.modal('hide'); + } + }); + + $(".salesman-list-container").on("change", '.salesman-sync-course', function () { + var s_id = $(this).attr("data-id"); + var json = {}; + $.ajax({ + url: "/admins/salesmans/" + s_id + "/update_sync_course", + type: "POST", + dataType:'script', + data: json + }) + }); + + $(".salesman-list-container").on("change", '.salesman-sync-form', function () { + var s_id = $(this).attr("data-id"); + var s_value = $(this).val(); + var s_name = $(this).attr("name"); + var json = {}; + json[s_name] = s_value; + $.ajax({ + url: "/admins/salesmans/" + s_id, + type: "PUT", + dataType:'script', + data: json + }); + }); + } +}); \ No newline at end of file diff --git a/app/controllers/admins/salesman_channels_controller.rb b/app/controllers/admins/salesman_channels_controller.rb new file mode 100644 index 000000000..2abf02698 --- /dev/null +++ b/app/controllers/admins/salesman_channels_controller.rb @@ -0,0 +1,28 @@ +class Admins::SalesmanChannelsController < Admins::BaseController + before_action :set_salesman + + def index + @channels = SalesmanChannel.all + end + + def batch_add + channel_ids = @salesman.salesman_channels.pluck(:school_id) + school_ids = params[:school_ids] - channel_ids + school_ids.each do |school_id| + school = School.find_by(id: school_id) + next if school.blank? + @salesman.salesman_channels.create!(school_id: school.id) + end + render_ok + end + + def destroy + @salesman.salesman_channels.find_by!(id: params[:id]).destroy + end + + private + + def set_salesman + @salesman = Salesman.find params[:salesman_id] + end +end diff --git a/app/controllers/admins/salesman_customers_controller.rb b/app/controllers/admins/salesman_customers_controller.rb new file mode 100644 index 000000000..3fa63f147 --- /dev/null +++ b/app/controllers/admins/salesman_customers_controller.rb @@ -0,0 +1,28 @@ +class Admins::SalesmanCustomersController < Admins::BaseController + before_action :set_salesman + + def index + @customers = @salesman.salesman_customers.includes(:user, :school) + end + + def batch_add + customer_ids = @salesman.salesman_customers.pluck(:user_id) + user_ids = params[:user_ids] - customer_ids + user_ids.each do |user_id| + user = UserExtension.find_by(user_id: user_id) + next if user.blank? + @salesman.salesman_customers.create!(user_id: user.user_id, school_id: user.school_id) + end + render_ok + end + + def destroy + @salesman.salesman_customers.find_by!(id: params[:id]).destroy + end + + private + def set_salesman + @salesman = Salesman.find params[:salesman_id] + end + +end \ No newline at end of file diff --git a/app/controllers/admins/salesmans_controller.rb b/app/controllers/admins/salesmans_controller.rb new file mode 100644 index 000000000..436f16262 --- /dev/null +++ b/app/controllers/admins/salesmans_controller.rb @@ -0,0 +1,29 @@ +class Admins::SalesmansController < Admins::BaseController + before_action :set_salesman, except: [:index, :batch_add] + + def index + @salesmans = Salesman.all + end + + def destroy + @salesman.destroy! + end + + # 批量增加销售人员 + def batch_add + salesman_user_ids = Salesman.where(id: params[:user_ids]).pluck(:user_id) + user_ids = params[:user_ids] - salesman_user_ids + user_ids.each do |user_id| + user = User.find_by(id: user_id) + next if user.blank? + Salesman.create!(user_id: user.id, name: user.real_name) + end + render_ok + end + + private + def set_salesman + @salesman = Salesman.find params[:id] + end + +end \ No newline at end of file diff --git a/app/controllers/admins/schools_controller.rb b/app/controllers/admins/schools_controller.rb index 8c4f1d59e..ca1dcb9a3 100644 --- a/app/controllers/admins/schools_controller.rb +++ b/app/controllers/admins/schools_controller.rb @@ -4,7 +4,7 @@ class Admins::SchoolsController < Admins::BaseController params[:sort_direction] ||= 'desc' schools = Admins::SchoolQuery.call(params) - + @total_count = schools.map(&:id).count @schools = paginate schools school_ids = @schools.map(&:id) diff --git a/app/controllers/admins/subjects_controller.rb b/app/controllers/admins/subjects_controller.rb index ed84fcb84..88f3ca527 100644 --- a/app/controllers/admins/subjects_controller.rb +++ b/app/controllers/admins/subjects_controller.rb @@ -49,7 +49,7 @@ class Admins::SubjectsController < Admins::BaseController # 设为金课 def excellent - current_subject.update!(excellent: true) + current_subject.update!(excellent: true, public: 2) render_ok end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index d81b3abb3..15f918c01 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -48,6 +48,19 @@ class ApplicationController < ActionController::Base EduSetting.get(name) end + # 平台身份权限判断(学生用户无权限) + def identity_auth + ue = current_user.user_extension + tip_exception(403, "..") unless current_user.admin_or_business? || ue.teacher? || ue.professional? + end + + # 平台已认证身份判断(已认证的老师和专业人士) + def certi_identity_auth + ue = current_user.user_extension + tip_exception(403, "..") unless current_user.admin_or_business? || + (current_user.professional_certification && (ue.teacher? || ue.professional?)) + end + def shixun_marker unless current_user.is_shixun_marker? || current_user.admin_or_business? tip_exception(403, "..") @@ -73,7 +86,7 @@ class ApplicationController < ActionController::Base check_account tip_exception(@course.excellent ? 410 : 409, "您没有权限进入") end - if @user_course_identity > Course::CREATOR && @user_course_identity <= Course::STUDENT + if @user_course_identity > Course::CREATOR && @user_course_identity <= Course::STUDENT && @course.tea_id != current_user.id # 实名认证和职业认证的身份判断 tip_exception(411, "你的实名认证和职业认证审核未通过") if @course.authentication && @course.professional_certification && (!current_user.authentication && !current_user.professional_certification) @@ -308,7 +321,7 @@ class ApplicationController < ActionController::Base end if !User.current.logged? && Rails.env.development? - User.current = User.find 8686 + User.current = User.find 1 end diff --git a/app/controllers/course_groups_controller.rb b/app/controllers/course_groups_controller.rb index 42a070734..d07a1e12c 100644 --- a/app/controllers/course_groups_controller.rb +++ b/app/controllers/course_groups_controller.rb @@ -2,7 +2,7 @@ class CourseGroupsController < ApplicationController before_action :require_login, :check_auth before_action :set_group, except: [:create] before_action :find_course, only: [:create] - before_action :teacher_allowed + before_action :teacher_allowed, except: [:set_invite_code_halt] def create tip_exception("分班名称不能为空") if params[:name].blank? @@ -55,6 +55,15 @@ class CourseGroupsController < ApplicationController end end + # 邀请码停用/启用 + def set_invite_code_halt + teacher = @course.teachers.find_by(user_id: current_user.id) + tip_exception(403, "无权限") unless current_user.admin_or_business? || + (teacher.present? && (teacher.teacher_course_groups.pluck(:course_group_id).include?(@group.id) || teacher.teacher_course_groups.size == 0)) + @group.update!(invite_code_halt: !@group.invite_code_halt) + normal_status(0, "成功") + end + private def set_group diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index d737ed126..8812e69fe 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -1128,11 +1128,11 @@ class CoursesController < ApplicationController return normal_status(-1, "邀请码不能为空") if params[:invite_code].blank? invite_code = params[:invite_code] course = Course.find_by(invite_code: invite_code, is_delete: 0, invite_code_halt: 0, laboratory_id: current_laboratory.id) - course_group = CourseGroup.find_by(invite_code: invite_code) + course_group = CourseGroup.find_by(invite_code: invite_code, invite_code_halt: 0) if course.blank? return normal_status(-1, "邀请码无效") if course_group.blank? - course = Course.find_by(id: course_group.course_id, is_delete: 0, invite_code_halt: 0, laboratory_id: current_laboratory.id) + course = Course.find_by(id: course_group.course_id, is_delete: 0, laboratory_id: current_laboratory.id) return normal_status(-1, "邀请码无效") if course.blank? end diff --git a/app/controllers/examination_banks_controller.rb b/app/controllers/examination_banks_controller.rb index 251cd197f..bf3bb7a3a 100644 --- a/app/controllers/examination_banks_controller.rb +++ b/app/controllers/examination_banks_controller.rb @@ -1,8 +1,10 @@ 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) @@ -59,7 +61,7 @@ class ExaminationBanksController < ApplicationController def set_public tip_exception(-1, "该试卷已公开") if @exam.public? - tip_exception(-1, "请勿重复提交申请") if ApplyAction.where(container_id: @exam.id, container_type: "ExaminationBank").exists? + 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 diff --git a/app/controllers/examination_intelligent_settings_controller.rb b/app/controllers/examination_intelligent_settings_controller.rb index f4dcc1535..e9456b3dc 100644 --- a/app/controllers/examination_intelligent_settings_controller.rb +++ b/app/controllers/examination_intelligent_settings_controller.rb @@ -1,5 +1,6 @@ class ExaminationIntelligentSettingsController < ApplicationController before_action :require_login + before_action :certi_identity_auth, only: [:create, :optinal_items, :save_exam, :exchange_one_item, :exchange_items] before_action :find_exam, only: [:exchange_one_item, :exchange_items, :save_exam] def optinal_items @@ -36,16 +37,19 @@ class ExaminationIntelligentSettingsController < ApplicationController end def exchange_one_item - item = @exam.item_baskets.find_by!(id: params[:item_id]) + item = @exam.item_baskets.find_by!(item_bank_id: params[:item_id]) exam_type_setting = @exam.examination_type_settings.find_by!(item_type: item.item_type) # 获取可选的题 items = OptionalItemQuery.call(@exam.sub_discipline_id, @exam.tag_discipline_containers.pluck(:tag_discipline_id), @exam.difficulty, @exam.public) + + # 可选题中去掉已组卷的试题 type_items = items.select{ |t_item| t_item.item_type == item.item_type } - # 如果可选的题数小于等于设置的题数则提示无可换的题 - tip_exception("无可换的题") if type_items.size <= exam_type_setting.count - # 可选题中去掉已组卷的同题型试题 - optional_item_ids = type_items.pluck(:id) - @exam.item_baskets.where(item_type: item.item_type).pluck(:item_bank_id) + optional_item_ids = (type_items.pluck(:id) - @exam.item_baskets.where(item_type: item.item_type).pluck(:item_bank_id)).uniq + + # 如果可选的题数等于0则提示无可换的题 + tip_exception("无可换的题") if optional_item_ids.size == 0 + new_item = ItemBank.find optional_item_ids.sample(1).first ActiveRecord::Base.transaction do @exam.item_baskets << ItemBasket.new(item_bank_id: new_item.id, position: item.position, score: item.score, item_type: new_item.item_type) @@ -61,13 +65,15 @@ class ExaminationIntelligentSettingsController < ApplicationController # 获取可选的题 items = OptionalItemQuery.call(@exam.sub_discipline_id, @exam.tag_discipline_containers.pluck(:tag_discipline_id), @exam.difficulty, @exam.public) type_items = items.select{ |t_item| t_item.item_type == params[:item_type] } - # 如果可选的题数小于等于设置的题数则提示无可换的题 - tip_exception("无可换的题") if type_items.size <= exam_type_setting.count - # 可选题中去掉已组卷的同题型试题 + + # 可选题中去掉已组卷的试题 choosed_item_ids = choosed_items.pluck(:item_bank_id) - optional_item_ids = type_items.pluck(:id) - choosed_item_ids + optional_item_ids = (type_items.pluck(:id) - choosed_item_ids).uniq + + # 如果可选的题数等于0则提示无可换的题 + tip_exception("无可换的题") if optional_item_ids.size == 0 - # 如果可选题数小于设置的题数n,则在原来的选题中随机选n个,确保换题时能选到新的题 + # 如果可选题数小于设置的题数(n),则在原来的选题中随机选n个,确保换题时能选到新的题 if optional_item_ids.size < exam_type_setting.count absence_count = exam_type_setting.count - optional_item_ids.size optional_item_ids = optional_item_ids + choosed_item_ids.sample(absence_count) diff --git a/app/controllers/examination_items_controller.rb b/app/controllers/examination_items_controller.rb index ee7a27c59..97aac3bc6 100644 --- a/app/controllers/examination_items_controller.rb +++ b/app/controllers/examination_items_controller.rb @@ -1,5 +1,6 @@ class ExaminationItemsController < ApplicationController before_action :require_login + before_action :certi_identity_auth, only: [:create, :destroy, :delete_item_type, :set_score, :batch_set_score, :adjust_position] before_action :validate_score, only: [:set_score, :batch_set_score] before_action :find_exam, only: [:create, :batch_set_score, :delete_item_type] before_action :find_item, except: [:create, :batch_set_score, :delete_item_type] diff --git a/app/controllers/item_banks_controller.rb b/app/controllers/item_banks_controller.rb index f108c1fad..ea10e865b 100644 --- a/app/controllers/item_banks_controller.rb +++ b/app/controllers/item_banks_controller.rb @@ -1,8 +1,10 @@ class ItemBanksController < ApplicationController include PaginateHelper before_action :require_login + before_action :certi_identity_auth, only: [:create, :edit, :update, :destroy, :set_public] before_action :find_item, except: [:index, :create] before_action :edit_auth, only: [:update, :destroy, :set_public] + before_action :identity_auth, only: [:index] def index items = ItemBankQuery.call(params) @@ -52,7 +54,7 @@ class ItemBanksController < ApplicationController def set_public tip_exception(-1, "该试题已公开") if @item.public? - tip_exception(-1, "请勿重复提交申请") if ApplyAction.where(container_id: @item.id, container_type: 'ItemBank').exists? + tip_exception(-1, "请勿重复提交申请") if ApplyAction.where(container_id: @item.id, container_type: 'ItemBank', status: 0).exists? ApplyAction.create!(container_id: @item.id, container_type: 'ItemBank', user_id: current_user.id) # @item.update_attributes!(public: 1) render_ok diff --git a/app/controllers/item_baskets_controller.rb b/app/controllers/item_baskets_controller.rb index 03355189d..b047e3d78 100644 --- a/app/controllers/item_baskets_controller.rb +++ b/app/controllers/item_baskets_controller.rb @@ -1,5 +1,6 @@ class ItemBasketsController < ApplicationController before_action :require_login + before_action :certi_identity_auth, only: [:create, :delete_item_type, :destroy, :set_score, :batch_set_score, :adjust_position] before_action :validate_score, only: [:set_score, :batch_set_score] helper_method :current_basket diff --git a/app/controllers/subjects_controller.rb b/app/controllers/subjects_controller.rb index 92976e05a..da88e3258 100644 --- a/app/controllers/subjects_controller.rb +++ b/app/controllers/subjects_controller.rb @@ -3,9 +3,10 @@ class SubjectsController < ApplicationController # before_action :check_auth, except: [:index] before_action :check_account, except: [:index, :show, :right_banner] before_action :find_subject, except: [:index, :create, :new, :append_to_stage, :add_shixun_to_stage] - before_action :allowed, only: [:update, :edit, :destroy, :publish, :cancel_publish, :cancel_has_publish, - :search_members, :add_subject_members, :statistics, :shixun_report, :school_report, - :up_member_position, :down_member_position, :update_team_title, :statistics_info] + before_action :allowed, only: [:update, :edit, :destroy, :publish, :cancel_publish, :cancel_has_publish, :apply_public, + :search_members, :add_subject_members, :statistics, :shixun_report, :school_report, + :cancel_has_public, :up_member_position, :down_member_position, :update_team_title, + :statistics_info, :cancel_public] before_action :require_admin, only: [:copy_subject] before_action :shixun_marker, only: [:add_shixun_to_stage] @@ -33,16 +34,16 @@ class SubjectsController < ApplicationController laboratory_join = " AND subjects.id in #{subject_ids} " if select - @subjects = Subject.find_by_sql("SELECT subjects.id, subjects.user_id, subjects.name, subjects.stages_count, subjects.repertoire_id, subjects.status, + @subjects = Subject.find_by_sql("SELECT subjects.id, subjects.user_id, subjects.name, subjects.stages_count, subjects.repertoire_id, subjects.status, subjects.public, subjects.shixuns_count, subjects.excellent, sum(shixuns.myshixuns_count) AS myshixun_member_count FROM subjects join stage_shixuns on stage_shixuns.subject_id = subjects.id join shixuns on shixuns.id = stage_shixuns.shixun_id where - subjects.hidden = 0 AND subjects.status = 2 AND subjects.name like '%#{search}%' #{laboratory_join} + subjects.hidden = 0 AND subjects.public = 2 AND subjects.name like '%#{search}%' #{laboratory_join} AND subjects.repertoire_id = #{select} GROUP BY subjects.id ORDER BY myshixun_member_count DESC") else - @subjects = Subject.find_by_sql("SELECT subjects.id, subjects.user_id, subjects.name, subjects.stages_count, subjects.repertoire_id, subjects.status, + @subjects = Subject.find_by_sql("SELECT subjects.id, subjects.user_id, subjects.name, subjects.stages_count, subjects.repertoire_id, subjects.status, subjects.public, subjects.shixuns_count, subjects.excellent, sum(shixuns.myshixuns_count) AS myshixun_member_count FROM subjects join stage_shixuns on stage_shixuns.subject_id = subjects.id join shixuns on shixuns.id = stage_shixuns.shixun_id where - subjects.hidden = 0 AND subjects.status = 2 AND subjects.name like '%#{search}%' #{laboratory_join} + subjects.hidden = 0 AND subjects.public = 2 AND subjects.name like '%#{search}%' #{laboratory_join} GROUP BY subjects.id ORDER BY myshixun_member_count DESC") end else @@ -59,7 +60,7 @@ class SubjectsController < ApplicationController elsif reorder == "publish_time" @subjects = @subjects.unhidden else - @subjects = @subjects.visible.unhidden + @subjects = @subjects.publiced.unhidden end # 类型 @@ -72,7 +73,7 @@ class SubjectsController < ApplicationController end # 排序 - order_str = (reorder == "publish_time" ? "homepage_show desc, excellent desc, status = 2 desc, publish_time asc" : "homepage_show desc, excellent desc, updated_at desc") + order_str = (reorder == "publish_time" ? "homepage_show desc, excellent desc, public = 2 desc, publish_time asc" : "homepage_show desc, excellent desc, updated_at desc") @subjects = @subjects.reorder(order_str) end @@ -242,7 +243,8 @@ class SubjectsController < ApplicationController ## 云上实验室过滤 @courses = @courses.where(id: current_laboratory.all_courses) - @none_shixun_ids = @subject.shixuns.joins(:shixun_schools).where("school_id != #{current_user.user_extension.try(:school_id).to_i}").where(use_scope: 1).pluck(:id) + @all_shixun_ids = @subject.shixuns.where(use_scope: 0).pluck(:id) + + @subject.shixuns.joins(:shixun_schools).where("school_id = #{current_user.user_extension.try(:school_id).to_i} and use_scope = 1").pluck(:id) end def send_to_course @@ -272,14 +274,44 @@ class SubjectsController < ApplicationController end def publish + @subject.update_attributes(status: 2) + end + + def cancel_publish + begin + 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) + rescue => e + uid_logger_error(e.message) + tip_exception("撤销申请失败") + end + end + + def cancel_has_publish + begin + @subject.update_attributes(:status => 0) + rescue => e + uid_logger_error(e.message) + tip_exception("撤销发布失败") + raise ActiveRecord::Rollback + end + end + + # 申请公开 + def apply_public + tip_exception(-1, "请先发布课程再申请公开") if @subject.status != 2 apply = ApplyAction.where(container_type: "ApplySubject", container_id: @subject.id).order("created_at desc").first if apply && apply.status == 0 @status = 0 else - @subject.update_attributes(status: 1) + @subject.update_attributes(public: 1) ApplyAction.create(container_type: "ApplySubject", container_id: @subject.id, user_id: current_user.id, status: 0) begin - status = Educoder::Sms.send(mobile: '18711011226', send_type:'publish_subject' , name: '管理员') + Educoder::Sms.send(mobile: '18711011226', send_type:'publish_subject' , name: '管理员') rescue => e uid_logger_error("发送验证码出错: #{e}") end @@ -287,28 +319,28 @@ class SubjectsController < ApplicationController end end - def cancel_publish + def cancel_public begin 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) + @subject.update_attributes(public: 0) + render_ok rescue => e uid_logger_error(e.message) tip_exception("撤销申请失败") - raise ActiveRecord::Rollback end end - def cancel_has_publish + def cancel_has_public begin - @subject.update_attributes(:status => 0) + @subject.update_attributes(:public => 0) + render_ok rescue => e uid_logger_error(e.message) - tip_exception("撤销发布失败") - raise ActiveRecord::Rollback + tip_exception("撤销公开失败") end end diff --git a/app/controllers/weapps/courses_controller.rb b/app/controllers/weapps/courses_controller.rb index bef1ca9ac..e3af2310d 100644 --- a/app/controllers/weapps/courses_controller.rb +++ b/app/controllers/weapps/courses_controller.rb @@ -42,11 +42,11 @@ class Weapps::CoursesController < Weapps::BaseController tip_exception(-1, "邀请码不能为空") if params[:invite_code].blank? invite_code = params[:invite_code] course = Course.find_by(invite_code: invite_code, is_delete: 0, invite_code_halt: 0) - course_group = CourseGroup.find_by(invite_code: invite_code) + course_group = CourseGroup.find_by(invite_code: invite_code, invite_code_halt: 0) if course.blank? tip_exception(-1, "邀请码无效") if course_group.blank? - course = Course.find_by(id: course_group.course_id, is_delete: 0, invite_code_halt: 0) + course = Course.find_by(id: course_group.course_id, is_delete: 0) tip_exception(-1, "邀请码无效") if course.blank? end diff --git a/app/helpers/admins/subjects_helper.rb b/app/helpers/admins/subjects_helper.rb index 56738fd86..236bf723f 100644 --- a/app/helpers/admins/subjects_helper.rb +++ b/app/helpers/admins/subjects_helper.rb @@ -1,11 +1,22 @@ module Admins::SubjectsHelper def display_subject_status(subject) style = - case subject.status + case subject.public when 0 then 'text-secondary' when 1 then 'text-warning' when 2 then 'text-success' end - raw content_tag(:span, t("subject.status.#{subject.status}"), class: style) + + status = + if subject.public == 2 + "publiced" + elsif subject.public == 1 + "pending" + elsif subject.status == 2 + "processed" + else + "editing" + end + raw content_tag(:span, t("subject.public.#{status}"), class: style) end end \ No newline at end of file diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 8dd642637..e352d6cec 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -137,7 +137,7 @@ module ApplicationHelper # 用户图像url,如果不存在的话,source为匿名用户,即默认使用匿名用户图像 def url_to_avatar(source) - if File.exist?(disk_filename(source.class, source.id)) + if File.exist?(disk_filename(source&.class, source&.id)) ctime = File.ctime(disk_filename(source.class, source.id)).to_i if source.class.to_s == 'User' File.join(relative_path, ["#{source.class}", "#{source.id}"]) + "?t=#{ctime}" diff --git a/app/helpers/courses_helper.rb b/app/helpers/courses_helper.rb index 37e108a74..f0d58adbb 100644 --- a/app/helpers/courses_helper.rb +++ b/app/helpers/courses_helper.rb @@ -12,6 +12,12 @@ module CoursesHelper # end end + def edit_auth group, teachers + User.current.admin_or_business? || + teachers.select{|teacher| teacher.user_id == User.current.id && + (teacher.teacher_course_groups.pluck(:course_group_id).include?(group.id) || teacher.teacher_course_groups.size == 0)}.size > 0 + end + # 是否有切换为学生的入口 def switch_student_role is_teacher, course, user is_teacher && course.course_members.where(user_id: user.id, role: %i(STUDENT)).exists? diff --git a/app/helpers/homework_commons_helper.rb b/app/helpers/homework_commons_helper.rb index 3061a6e80..2ffc3872f 100644 --- a/app/helpers/homework_commons_helper.rb +++ b/app/helpers/homework_commons_helper.rb @@ -177,6 +177,17 @@ module HomeworkCommonsHelper type == 2 ? student_works.size : (type == 1 ? student_works.where("work_status != 0").size : student_works.where(work_status: 0).size) end + # 作品数统计 + def calculate_work_count homework_common, member + count = {} + student_works = homework_common.teacher_works(member) + count[:commit_count] = student_works.select{|work| work.work_status != 0 }.size + count[:uncommit_count] = student_works.select{|work| work.work_status == 0 }.size + count[:compelete_count] = Myshixun.where(id: student_works.pluck(:myshixun_id).reject(&:blank?), status: 1).size + count[:all_count] = student_works.size + count + end + # 上次查重的时间 def last_review_time homework_common, course_group review = homework_common.homework_group_reviews.where(:course_group_id => course_group.id).last diff --git a/app/helpers/shixuns_helper.rb b/app/helpers/shixuns_helper.rb index 4f522512d..48ca98f26 100644 --- a/app/helpers/shixuns_helper.rb +++ b/app/helpers/shixuns_helper.rb @@ -152,7 +152,7 @@ module ShixunsHelper challenge_program_name = [] shixun.challenges.map(&:exec_path).each do |exec_path| challenge_program_name << "\"#{exec_path}\"" - if shixun.main_mirror_name == "Java" || shixun.main_mirror_name == "Openjdk10/VNC" + if shixun.main_mirror_name == "Java" || shixun.main_mirror_name == "Openjdk10/VNC" || shixun.main_mirror_name == "JavaWeb" if exec_path.nil? || exec_path.split("src/")[1].nil? source = "\"\"" else diff --git a/app/helpers/subjects_helper.rb b/app/helpers/subjects_helper.rb index 72154b0a8..fb2246a50 100644 --- a/app/helpers/subjects_helper.rb +++ b/app/helpers/subjects_helper.rb @@ -1,12 +1,23 @@ module SubjectsHelper # 实训路径的发布状态 - def publish_status subject, is_manager, user + def publish_status subject, is_manager status = -1 if is_manager status = 0 if subject.status == 0 status = 1 if subject.status == 1 - status = 2 if subject.status == 2 && user.admin? + status = 2 if subject.status == 2 + end + status + end + + # 实训路径的公开状态 + def public_status subject, is_manager, user + status = -1 + if is_manager + status = 0 if subject.public == 0 + status = 1 if subject.public == 1 + status = 2 if subject.public == 2 && user.admin? end status end diff --git a/app/models/item_analysis.rb b/app/models/item_analysis.rb index dc1453982..e7177c2f8 100644 --- a/app/models/item_analysis.rb +++ b/app/models/item_analysis.rb @@ -1,3 +1,4 @@ class ItemAnalysis < ApplicationRecord belongs_to :item_bank, touch: true + validates :analysis, length: { maximum: 5000, too_long: "不能超过5000个字符" } end diff --git a/app/models/item_bank.rb b/app/models/item_bank.rb index d22e421a3..71cfd07a4 100644 --- a/app/models/item_bank.rb +++ b/app/models/item_bank.rb @@ -14,7 +14,6 @@ class ItemBank < ApplicationRecord belongs_to :container, polymorphic: true, optional: true validates :name, presence: true, length: { maximum: 1000, too_long: "不能超过1000个字符" } - validates :analysis, length: { maximum: 5000, too_long: "不能超过5000个字符" } def analysis item_analysis&.analysis diff --git a/app/models/salesman.rb b/app/models/salesman.rb new file mode 100644 index 000000000..a1a025776 --- /dev/null +++ b/app/models/salesman.rb @@ -0,0 +1,7 @@ +class Salesman < ApplicationRecord + belongs_to :user + # 渠道 + has_many :salesman_channels, dependent: :destroy + # 客户 + has_many :salesman_customers, dependent: :destroy +end diff --git a/app/models/salesman_channel.rb b/app/models/salesman_channel.rb new file mode 100644 index 000000000..b5ae17e0e --- /dev/null +++ b/app/models/salesman_channel.rb @@ -0,0 +1,27 @@ +class SalesmanChannel < ApplicationRecord + belongs_to :salesman, :touch => true, counter_cache: true + belongs_to :school + + def school_name + school.name + end + + def teacher_count + UserExtension.where(school_id: school_id).where.not(identity: 1).count + end + + def student_count + UserExtension.where(school_id: school_id, identity: 1).count + end + + def course_count + Course.where(school_id: school_id).count + end + + def shixuns_count + ShixunMember.joins("join user_extensions on user_extensions.user_id = shixun_members.user_id") + .where(user_extensions: {school_id: school_id}).pluck(:shixun_id).uniq.count + end + + +end diff --git a/app/models/salesman_customer.rb b/app/models/salesman_customer.rb new file mode 100644 index 000000000..c5e84650b --- /dev/null +++ b/app/models/salesman_customer.rb @@ -0,0 +1,22 @@ +class SalesmanCustomer < ApplicationRecord + belongs_to :salesman, :touch => true, counter_cache: true + belongs_to :school + belongs_to :user + + def name + user.real_name + end + + def school_name + school.name + end + + def courses_count + CourseMember.where(user_id: id).teachers_and_admin.count + end + + def shixuns_count + ShixunMember.where(user_id: id, role: [1, 2]).count + end + +end diff --git a/app/models/subject.rb b/app/models/subject.rb index 99ba4b72b..70f9700df 100644 --- a/app/models/subject.rb +++ b/app/models/subject.rb @@ -40,6 +40,7 @@ class Subject < ApplicationRecord scope :visible, lambda{where(status: 2)} scope :published, lambda{where(status: 1)} scope :unhidden, lambda{where(hidden: 0)} + scope :publiced, lambda{ where(public: 2) } after_create :send_tiding def send_tiding diff --git a/app/queries/admins/subject_query.rb b/app/queries/admins/subject_query.rb index 935f52bb3..dc459885b 100644 --- a/app/queries/admins/subject_query.rb +++ b/app/queries/admins/subject_query.rb @@ -16,12 +16,14 @@ class Admins::SubjectQuery < ApplicationQuery # 状态过滤 status = - case params[:status].to_s.strip - when 'pending' then 0 - when 'applying' then 1 - when 'published' then 2 - end - subjects = subjects.where(status: status) if status + case params[:status].to_s.strip + when "editing" then {status: 0} + when "processed" then {status: 2, public: 0} + when "pending" then {public: 1} + when "publiced" then {public: 2} + end + + subjects = subjects.where(status) if status # 创建者单位 if params[:school_id].present? diff --git a/app/queries/weapps/subject_query.rb b/app/queries/weapps/subject_query.rb index 5ec0c1ed9..8bfe9e9a8 100644 --- a/app/queries/weapps/subject_query.rb +++ b/app/queries/weapps/subject_query.rb @@ -8,7 +8,7 @@ class Weapps::SubjectQuery < ApplicationQuery end def call - subjects = @current_laboratory.subjects.unhidden.visible + subjects = @current_laboratory.subjects.unhidden.publiced # 课程体系的过滤 if params[:sub_discipline_id].present? diff --git a/app/services/admins/subject_auths/agree_apply_service.rb b/app/services/admins/subject_auths/agree_apply_service.rb index 465e3e903..ec5fec4bb 100644 --- a/app/services/admins/subject_auths/agree_apply_service.rb +++ b/app/services/admins/subject_auths/agree_apply_service.rb @@ -10,7 +10,7 @@ class Admins::SubjectAuths::AgreeApplyService < ApplicationService def call ActiveRecord::Base.transaction do apply.update!(status: 1, dealer_id: user.id) - subject.update!(status: 2, publish_time: Time.now) + subject.update!(public: 2, publish_time: Time.now) deal_tiding! end diff --git a/app/services/admins/subject_auths/refuse_apply_service.rb b/app/services/admins/subject_auths/refuse_apply_service.rb index f51d55185..45f2d44d3 100644 --- a/app/services/admins/subject_auths/refuse_apply_service.rb +++ b/app/services/admins/subject_auths/refuse_apply_service.rb @@ -10,7 +10,7 @@ class Admins::SubjectAuths::RefuseApplyService < ApplicationService def call ActiveRecord::Base.transaction do - subject.update!(status: 0) + subject.update!(public: 0) apply.update!(status: 2, reason: reason, dealer_id: user.id) deal_tiding! diff --git a/app/services/search_service.rb b/app/services/search_service.rb index a45875e07..8914bde88 100644 --- a/app/services/search_service.rb +++ b/app/services/search_service.rb @@ -41,7 +41,8 @@ class SearchService < ApplicationService when 'shixun' then { where: { id: Laboratory.current.shixuns.where(public: 2, status: 2, fork_from: nil).or(Laboratory.current.shixuns.where(status: 2, id: User.current.shixuns)).pluck(:id) } } when 'subject' then - { where: { id: Laboratory.current.subjects.pluck(:id) } } + { where: { id: Laboratory.current.subjects.where(public: 2, status: 2) + .or( Laboratory.current.subjects.where(status: 2, id: User.current.subjects)).pluck(:id) } } when 'course' then { where: { id: Laboratory.current.all_courses.pluck(:id) } } else diff --git a/app/services/subject_search_service.rb b/app/services/subject_search_service.rb index 9c2776beb..dc5b069a5 100644 --- a/app/services/subject_search_service.rb +++ b/app/services/subject_search_service.rb @@ -17,9 +17,12 @@ class SubjectSearchService < ApplicationService if type == "mine" @subjects = @subjects.where(id: User.current.subjects).visible.unhidden else - @subjects = @subjects.visible.unhidden + if User.current.admin? || User.current.business? + @subjects = @subjects.unhidden + else + @subjects = @subjects.publiced.unhidden.or(@subjects.where(id: User.current.subjects)) + end end - Subject.search(keyword, search_options) end diff --git a/app/services/users/subject_service.rb b/app/services/users/subject_service.rb index 53ff3f4b9..d0b995c8e 100644 --- a/app/services/users/subject_service.rb +++ b/app/services/users/subject_service.rb @@ -70,12 +70,21 @@ class Users::SubjectService end def manage_subject_status_filter(relations) - status = case params[:status] - when 'editing' then 0 - when 'applying' then 1 - when 'published' then 2 - end - relations = relations.where(status: status) if status + if params[:status] == "publiced" + relations = relations.where(public: 2) + elsif params[:status] == "applying" + relations = relations.where(public: 1) + else + status = case params[:status] + when 'editing' then + 0 + when 'applying' then + 1 + when 'published' then + 2 + end + relations = relations.where(status: status) if status + end relations end diff --git a/app/views/admins/repertoires/shared/_list.html.erb b/app/views/admins/repertoires/shared/_list.html.erb deleted file mode 100644 index c014f6e09..000000000 --- a/app/views/admins/repertoires/shared/_list.html.erb +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - <% if @repertoires.present? %> - <% @repertoires.each_with_index do |repertoire, index| %> - - - - - - <% end %> - <% else %> - <%= render 'admins/shared/no_data_for_table' %> - <% end %> - -
序号技术体系操作
<%= index + 1 %> - <%= link_to repertoire.name, admins_sub_repertoires_path(repertoire_id: repertoire), :title => repertoire.name %> - - <%= link_to '编辑', edit_admins_repertoire_path(repertoire), remote: true, class: 'action' %> - <%= delete_link '删除', admins_repertoire_path(repertoire, element: ".repertoire-item-#{repertoire.id}"), class: 'delete-repertoire-action' %> -
\ No newline at end of file diff --git a/app/views/admins/salesman_channels/destroy.js.erb b/app/views/admins/salesman_channels/destroy.js.erb new file mode 100644 index 000000000..d00e4fa08 --- /dev/null +++ b/app/views/admins/salesman_channels/destroy.js.erb @@ -0,0 +1,2 @@ +$.notify({ message: '操作成功' },{ type: 'success' }); +$("<%= params[:element]%>").remove(); \ No newline at end of file diff --git a/app/views/admins/salesman_channels/index.html.erb b/app/views/admins/salesman_channels/index.html.erb new file mode 100644 index 000000000..5e15d63eb --- /dev/null +++ b/app/views/admins/salesman_channels/index.html.erb @@ -0,0 +1,15 @@ +<% define_admin_breadcrumbs do %> + <% add_admin_breadcrumb("#{@salesman.name}的渠道", admins_salesmans_path) %> +<% end %> + +
+
+ <%= javascript_void_link '新增渠道', class: 'btn btn-primary', data: {salesman_id: @salesman.id, toggle: 'modal', target: '.admin-add-salesman-channel-user-modal' } %> +
+
+ +
+ <%= render(partial: 'admins/salesman_channels/shared/list') %> +
+ +<%= render 'admins/salesman_channels/shared/add_salesman_channels_user_modal' %> diff --git a/app/views/admins/repertoires/shared/_edit_repertoire_modal.html.erb b/app/views/admins/salesman_channels/shared/_add_salesman_channels_user_modal.html.erb similarity index 51% rename from app/views/admins/repertoires/shared/_edit_repertoire_modal.html.erb rename to app/views/admins/salesman_channels/shared/_add_salesman_channels_user_modal.html.erb index a8595d86e..9c435178d 100644 --- a/app/views/admins/repertoires/shared/_edit_repertoire_modal.html.erb +++ b/app/views/admins/salesman_channels/shared/_add_salesman_channels_user_modal.html.erb @@ -1,18 +1,25 @@ -