class PartnersController < ApplicationController skip_before_action :check_sign include Base::PaginateHelper include Admins::RenderHelper layout 'college' before_action :require_login, :check_partner_present!, :check_permission! before_action :check_admin_manager_group_permission!, except: [:customers] helper_method :current_partner, :manager_permission? def customers customers = CustomerQuery.call(current_partner, current_user, params) @customers = paginate(customers.includes(:school)) load_customer_extra_statistic_data end def partner_manager_groups @manager_groups = current_partner.partner_manager_groups.includes(users: :user_extension).to_a end def manager_group name = params[:manager_group_name].to_s.strip if params[:manager_group_id].present? # 重命名 @manager_group = current_partner.partner_manager_groups.find(params[:manager_group_id]) return render_error('不能修改管理者权限组名称') if @manager_group.admin? @manager_group.update!(name: name) else # 新建 @manager_group = current_partner.partner_manager_groups.create!(name: name) end end def remove_manager_group manager_group = current_partner.partner_manager_groups.find(params[:manager_group_id]) return render_error('不能删除管理者权限组') if manager_group.admin? manager_group.destroy! render_delete_success end def partner_managers user_ids = Array.wrap(params[:user_ids]) @manager_group = current_partner.partner_manager_groups.find(params[:manager_group_id]) ActiveRecord::Base.transaction do User.where(id: user_ids).pluck(:id).each do |user_id| next if current_partner.partner_managers.exists?(partner_manager_group: @manager_group, user_id: user_id) current_partner.partner_managers.create!(partner_manager_group: @manager_group, user_id: user_id) end end @manager_group.reload end def remove_partner_manager partner_manager = current_partner.partner_managers.find(params[:manager_id]) return render_error('不能删除自己') if partner_manager.user_id == current_user.id && partner_manager.partner_manager_group.admin? partner_manager.destroy! render_delete_success end def customer_manager_group customer = current_partner.customers.find(params[:customer_id]) if params[:manager_group_id].present? manager_group = current_partner.partner_manager_groups.find(params[:manager_group_id]) customer.update!(partner_manager_group: manager_group) else customer.update!(partner_manager_group_id: nil) end render_ok end private def current_partner @_current_partner ||= Partner.find(params[:id].presence || params[:partner_id]) end def check_partner_present! return if current_partner.present? redirect_to '/404' end def manager_permission? admin_or_business? || current_user.partner_managers.exists?(partner_id: current_partner.id) end def check_permission! return if manager_permission? redirect_to '/403' end def check_admin_manager_group_permission! return if admin_or_business? return if current_partner.admin_partner_manager_group.partner_managers.exists?(user: current_user) render_forbidden end def load_customer_extra_statistic_data school_ids = @customers.map(&:school_id) teacher_map = UserExtension.where(school_id: school_ids, identity: 0).group(:school_id).count student_map = UserExtension.where(school_id: school_ids, identity: 1).group(:school_id).count course_map = Course.where(school_id: school_ids, is_delete: 0).where.not(id: 1309).group(:school_id).count shixun_map = Shixun.visible.joins('left join user_extensions on user_extensions.user_id = shixuns.user_id') .where(user_extensions: { school_id: school_ids }).group('user_extensions.school_id').count shixun_report_map = StudentWork.where(work_status: [1, 2]).where('myshixun_id != 0') .joins('left join user_extensions on user_extensions.user_id = student_works.user_id') .where(user_extensions: { school_id: school_ids }) .group('user_extensions.school_id').count course_time_map = Course.where(school_id: school_ids, is_delete: 0) .where.not(id: 1309).group(:school_id).maximum(:updated_at) @customers.each do |customer| customer._extra_data = { teacher_count: teacher_map[customer.school_id], student_count: student_map[customer.school_id], course_count: course_map[customer.school_id], shixun_count: shixun_map[customer.school_id], shixun_report_count: shixun_report_map[customer.school_id], course_time: course_time_map[customer.school_id] } end end end