diff --git a/app/controllers/competition_teams_controller.rb b/app/controllers/competition_teams_controller.rb index 817de9be..fb41d3f8 100644 --- a/app/controllers/competition_teams_controller.rb +++ b/app/controllers/competition_teams_controller.rb @@ -38,9 +38,13 @@ class CompetitionTeamsController < ApplicationController end def create + teacher_limited = @competition.teacher_enroll_mutiple_limited + member_limited = @competition.member_enroll_mutiple_limited + # 判断用户是否已创建过战队 - if @competition.competition_teams.where(:user_id => User.current.id).count > 0 && !User.current.is_teacher - @status, @message = -1, '您已创建过战队,不能重复创建' + if @competition.team_members.where(user_id: User.current.id).count > 0 && + ((User.current.is_teacher && teacher_limited) || (!User.current.is_teacher && member_limited)) + @status, @message = -1, '您已经在战队中了' return end @@ -52,6 +56,11 @@ class CompetitionTeamsController < ApplicationController is_teacher = User.current.user_extensions.identity == 0 return unless member_and_teacher_count_valid?(is_teacher) + # 检查老师多次报名限制 + return unless check_teacher_enroll_limited?(@competition, (params[:teacher_ids].presence || []).map(&:to_i) - [User.current.id]) + # 检查成员多次报名限制 + return unless check_member_enroll_limited?(@competition, (params[:member_ids].presence || []).map(&:to_i) - [User.current.id]) + ActiveRecord::Base.transaction do invite_code = generate_team_code new_team = CompetitionTeam.create(:competition_id => @competition.id, :name => params[:name], @@ -104,8 +113,12 @@ class CompetitionTeamsController < ApplicationController # 删除的成员 delete_member_ids = team_member_ids - new_member_ids @team.team_members.where(role: 2, user_id: delete_member_ids).delete_all + # 新增加的成员 - (new_member_ids - team_member_ids).each do |user_id| + ids = new_member_ids - team_member_ids + raise @message unless check_member_enroll_limited?(@competition, ids) # 有成员已经加入其他战队,并且只能一次报名 + + ids.each do |user_id| next if user_id.to_i == @team.user_id @team.team_members.create!(user_id: user_id, role: 2, competition_id: @competition.id) end @@ -117,12 +130,19 @@ class CompetitionTeamsController < ApplicationController # 删除的老师 delete_teacher_ids = teacher_ids - new_teacher_ids @team.team_members.where(role: 3, user_id: delete_teacher_ids).delete_all + # 新增加的老师 - (new_teacher_ids - teacher_ids).each do |user_id| + ids = new_teacher_ids - teacher_ids + raise @message unless check_teacher_enroll_limited?(@competition, ids) # 有老师已经加入其他战队,并且只能一次报名 + + ids.each do |user_id| next if user_id.to_i == @team.user_id @team.team_members.create!(user_id: user_id, role: 3, competition_id: @competition.id, is_teacher: true) end end + rescue => ex + @status = -1 + @message = ex.message end # @status:提示语标志(0:加入成功;1:邀请码错误;2:已经加入了其他队, 3:超过人数限制,4:已有指导老师,5:只有学生和老师身份的用户才能加入战队) @@ -133,7 +153,8 @@ class CompetitionTeamsController < ApplicationController return end - if TeamMember.where(:user_id => User.current.id, :competition_team_id => @competition.competition_teams.map(&:id), :is_teacher => 0).count > 0 + enroll_limited = (User.current.is_teacher ? @competition.teacher_enroll_mutiple_limited : @competition.member_enroll_mutiple_limited) + if enroll_limited && @competition.team_members.exists?(user_id: User.current.id) @status, @message = -1, '您已加入战队,不能重复加' return end @@ -243,4 +264,30 @@ class CompetitionTeamsController < ApplicationController true end + + def check_teacher_enroll_limited?(competition, user_ids) + teacher_limited = competition.teacher_enroll_mutiple_limited + return true unless teacher_limited && user_ids.present? + + repeat_teachers = competition.team_members.where(user_id: user_ids).includes(:user).to_a + if repeat_teachers.size > 0 + @status, @message = -1, "导师#{repeat_teachers.map{|t| t.user.show_real_name}}已经加入其它战队了" + return false + end + + true + end + + def check_member_enroll_limited?(competition, user_ids) + member_limited = competition.member_enroll_mutiple_limited + return true unless member_limited && user_ids.present? + + repeat_members = competition.team_members.where(user_id: user_ids).includes(:user).to_a + if repeat_members.size > 0 + @status, @message = -1, "成员#{repeat_members.map{|t| t.user.show_real_name}}已经加入其它战队了" + return false + end + + true + end end diff --git a/app/controllers/competitions_controller.rb b/app/controllers/competitions_controller.rb index c890ff6b..0e9fb376 100644 --- a/app/controllers/competitions_controller.rb +++ b/app/controllers/competitions_controller.rb @@ -111,6 +111,7 @@ class CompetitionsController < ApplicationController @search_teams_count = @teams.count @team_members_count = TeamMember.where(:competition_team_id => @teams.pluck(:id)).count + @can_enroll = !(@user.is_teacher ? @competition.teacher_enroll_mutiple_limited : @competition.member_enroll_mutiple_limited) || !@competition.team_members.exists?(user_id: User.current.id) @is_enroll = CompetitionTeam.where(:id => TeamMember.where(:user_id => @user, :competition_team_id => @competition.competition_teams.map(&:id)).pluck(:competition_team_id)).reorder("created_at desc") @show_notice = (@competition.identifier == "gcc-dev-2018" || @competition.identifier == "gcc-annotation-2018") && @competition.competition_teams.joins(:team_members).where(:user_id => User.current.id).group('competition_teams.id').sum('IF(team_members.is_teacher=1, 1, 0)').values.any?(&:zero?) @@ -580,7 +581,7 @@ class CompetitionsController < ApplicationController section_entries.destroy_all else if params[:entry_name].length < section_entries.size - section_entries[params[:entry_name].length, section_entries.size - 1].destroy_all + section_entries[params[:entry_name].length, section_entries.size - 1].each(&:destroy) end params[:entry_name].each_with_index do |name, index| diff --git a/app/models/competition.rb b/app/models/competition.rb index d66aac1a..96747b0b 100644 --- a/app/models/competition.rb +++ b/app/models/competition.rb @@ -32,4 +32,12 @@ class Competition < ActiveRecord::Base def member_count self.team_members.count == 0 ? 0 : self.team_members.count + 268 end + + def teacher_enroll_mutiple_limited + competition_staffs.where(category: 'teacher').first.try(:mutiple_limited) + end + + def member_enroll_mutiple_limited + competition_staffs.where(category: 'student').first.try(:mutiple_limited) + end end diff --git a/app/models/competition_staff.rb b/app/models/competition_staff.rb index 1a949460..6609cdbb 100644 --- a/app/models/competition_staff.rb +++ b/app/models/competition_staff.rb @@ -1,7 +1,7 @@ class CompetitionStaff < ActiveRecord::Base default_scope order: 'position asc' - attr_accessible :minimum, :maximum, :category, :position + attr_accessible :minimum, :maximum, :category, :position, :mutiple_limited belongs_to :competition diff --git a/app/views/competition_teams/_search_member_list.html.erb b/app/views/competition_teams/_search_member_list.html.erb index bf4a9b8d..2bdd8340 100644 --- a/app/views/competition_teams/_search_member_list.html.erb +++ b/app/views/competition_teams/_search_member_list.html.erb @@ -1,5 +1,5 @@ <% @users.each do |user| %> - <% has_enroll = @team.present? ? @competition.team_members.where("user_id = '#{user.id}' and id != #{@team.id}").count > 0 : @competition.team_members.where("user_id = '#{user.id}'").count > 0 %> + <% has_enroll = @competition.member_enroll_mutiple_limited && (@team.present? ? @competition.team_members.where("user_id = '#{user.id}' and id != #{@team.id}").count > 0 : @competition.team_members.where("user_id = '#{user.id}'").count > 0) %>
<%= @competition.name %>
- <% if @minimum_staff > 1 %> + <% if @maximum_staff > 1 %><%= @competition.sub_title %>
<% unless User.current.logged? %> <%= link_to "创建战队", signin_path, :remote => true, :class => "enroll-in-b enroll-in-b-green fr" %> <% else %> <% unless @competition.enroll_end_time.present? && @competition.enroll_end_time < Time.now %> - <% if @is_enroll.present? && !@user.is_teacher %> + <% if !@can_enroll %> 创建战队 <% else %> 创建战队 @@ -23,7 +23,7 @@ <%= link_to "加入战队", signin_path, :remote => true, :class => "enroll-in-b fr" %> <% else %> <% unless @competition.enroll_end_time.present? && @competition.enroll_end_time < Time.now %> - <% if @is_enroll.present? && !@user.is_teacher %> + <% if !@can_enroll %> 加入战队 <% else %> 加入战队 @@ -40,7 +40,7 @@ <% else %>
<% unless @competition.enroll_end_time.present? && @competition.enroll_end_time < Time.now %> - <% if @is_enroll.present? %> + <% if !@can_enroll %> 立即报名 <% else %> <%= link_to "立即报名", personal_enroll_competition_teams_path(:com_id => @competition.id), :remote => true, :class => "enroll-in-b enroll-in-b-green fr" %> @@ -97,6 +97,10 @@ 退出 <% end %> <% end %> + + <% if @competition.identifier == 'gcc-course-2019' %> + <%= link_to '战队详情', competition_team_path(id: @competition.id) %> + <% end %> <% end %>