|
|
#coding=utf-8
|
|
|
class CompetitionsController < ApplicationController
|
|
|
before_filter :find_type, :except => [:index, :new_competition, :edit_competition, :md_content, :create_md_content,
|
|
|
:edit_md_content, :update_md_content,
|
|
|
:new_competition_stage, :new_stage_section, :update_competition_stage]
|
|
|
before_filter :find_inform, :only => [:edit_inform, :update_inform]
|
|
|
before_filter :require_login, :only => [:enroll_portal, :publish]
|
|
|
skip_before_filter :verify_authenticity_token, :only => [:edit_rule]
|
|
|
layout 'base_competition'
|
|
|
|
|
|
include CompetitionsHelper
|
|
|
include ApplicationHelper
|
|
|
|
|
|
def home
|
|
|
respond_to do |format|
|
|
|
format.html { render :layout => "base_edu"}
|
|
|
format.js
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def show
|
|
|
@images = @competition.attachments
|
|
|
@user = current_user
|
|
|
@enrolled = @user && @user.logged? && @competition.team_members.exists?(user_id: @user.id)
|
|
|
end
|
|
|
|
|
|
def index
|
|
|
competitions = Competition.where('status = 1 or published_at is not null')
|
|
|
|
|
|
case params[:category]
|
|
|
when 'nearly_published' then
|
|
|
competitions = competitions.where('status = 0')
|
|
|
when 'progressing' then
|
|
|
competitions = competitions.where('end_time > NOW() AND status = 1')
|
|
|
when 'ended' then
|
|
|
competitions = competitions.where('end_time < NOW()')
|
|
|
end
|
|
|
@competitions = competitions.reorder("published_at desc, online_time desc")
|
|
|
respond_to do |format|
|
|
|
format.html { render :layout => "base_edu"}
|
|
|
format.js
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def informs
|
|
|
status = params[:status] || 1
|
|
|
@informs = Inform.where(:container_type => "Competition", :container_id => @competition.id, :status => status)
|
|
|
end
|
|
|
|
|
|
def md_edit
|
|
|
|
|
|
end
|
|
|
|
|
|
def new_inform
|
|
|
@status = params[:status]
|
|
|
@url = "#{create_inform_competition_path(@competition, :status => @status)}"
|
|
|
@inform = Inform.new
|
|
|
end
|
|
|
|
|
|
def create_inform
|
|
|
inform = Inform.new(params[:inform])
|
|
|
inform.container_type = "Competition"
|
|
|
inform.container_id = @competition.id
|
|
|
inform.status = params[:status]
|
|
|
inform.save_attachments(params[:attachments])
|
|
|
inform.save
|
|
|
redirect_to informs_competition_url(@competition, :status => params[:status])
|
|
|
end
|
|
|
|
|
|
def edit_inform
|
|
|
@layout_header_show = false
|
|
|
@url = "#{update_inform_competition_path(@competition, :inform_id => @inform, :status => params[:status])}"
|
|
|
end
|
|
|
|
|
|
def update_inform
|
|
|
@inform.update_attributes(params[:inform])
|
|
|
@inform.save_attachments(params[:attachments])
|
|
|
@inform.save
|
|
|
redirect_to informs_competition_url(@competition, :status => params[:status])
|
|
|
end
|
|
|
|
|
|
def md_content
|
|
|
@md_content_header = true
|
|
|
@md_content = CompetitionModuleMdContent.find params[:md_content_id]
|
|
|
@competition = @md_content.competition_module.competition
|
|
|
|
|
|
end
|
|
|
|
|
|
def create_md_content
|
|
|
md_content = CompetitionModuleMdContent.find params[:md_content_id]
|
|
|
md_content.update_attributes(params[:md_content])
|
|
|
attachment_ids = params[:attachments].values.map{|a| a[:attachment_id]}.compact
|
|
|
Attachment.where(:id => attachment_ids)
|
|
|
.update_all(container_id: md_content.id, container_type: 'CompetitionModuleMdContent') if attachment_ids
|
|
|
redirect_to md_contents_competition_url(:md_content_id => md_content.id)
|
|
|
end
|
|
|
|
|
|
def edit_md_content
|
|
|
@md_content_header = true
|
|
|
@md_content = CompetitionModuleMdContent.find params[:md_content_id]
|
|
|
@competition = @md_content.competition_module.competition
|
|
|
@url = "#{update_md_content_competitions_path(:md_content_id => @md_content.id)}"
|
|
|
end
|
|
|
|
|
|
def update_md_content
|
|
|
md_content = CompetitionModuleMdContent.find params[:md_content_id]
|
|
|
md_content.update_attributes(params[:md_content])
|
|
|
attachment_ids = params[:attachments].values.map{|a| a[:attachment_id]}.compact
|
|
|
Attachment.where(:id => attachment_ids)
|
|
|
.update_all(container_id: md_content.id, container_type: 'CompetitionModuleMdContent') if attachment_ids
|
|
|
redirect_to md_content_competitions_path(:md_content_id => md_content.id)
|
|
|
end
|
|
|
|
|
|
def enroll
|
|
|
@user = User.current
|
|
|
if params[:schoolname] && params[:schoolname].strip != ""
|
|
|
school_ids = School.where("name like '%#{params[:schoolname]}%'").pluck(:id)
|
|
|
school_ids = school_ids.size == 0 ? "(-1)" : "(" + school_ids.join(",") + ")"
|
|
|
@teams = @competition.competition_teams.joins("join user_extensions ue on competition_teams.user_id = ue.user_id").where("ue.school_id in #{school_ids}").order("#{CompetitionTeam.table_name}.created_at desc")
|
|
|
else
|
|
|
@teams = @competition.competition_teams.includes(:team_members, {user: :user_extensions}).order("#{CompetitionTeam.table_name}.created_at desc")
|
|
|
end
|
|
|
|
|
|
@team_count = @teams.count
|
|
|
@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?)
|
|
|
@teams = paginateHelper @teams.includes(:user, teachers: :user, members: :user), 50
|
|
|
|
|
|
@minimum_staff = @competition.competition_staffs.sum(:minimum)
|
|
|
@maximum_staff = @competition.competition_staffs.sum(:maximum)
|
|
|
respond_to do |format|
|
|
|
format.js
|
|
|
format.html
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def enroll_portal
|
|
|
CompetitionList.create(:user_id => User.current.id, :competition_id => @competition)
|
|
|
redirect_to enroll_competition_path
|
|
|
end
|
|
|
|
|
|
def send_message
|
|
|
stage = @competition.competition_stages.where(:id => params[:stage_id]).first
|
|
|
section = stage.competition_stage_sections.reorder("start_time asc").first
|
|
|
if section.present? && section.start_time.present? && section.start_time > Time.now
|
|
|
User.where(:id => TeamMember.where(:competition_team_id => @competition.competition_teams.pluck(:id)).pluck(:user_id).uniq).each do |user|
|
|
|
name = @competition.name + "#{@competition.sub_title}(#{stage.name})"
|
|
|
begin
|
|
|
if user.phone.present?
|
|
|
status = Trustie::Sms.send(mobile: user.phone.to_s, code: '1', send_type:'competition_start', user_name:user.show_name, name:name, result:section.start_time.strftime('%Y-%m-%d %H:%M:%S'))
|
|
|
end
|
|
|
rescue => e
|
|
|
Rails.logger.error "发送验证码出错: #{e}"
|
|
|
end
|
|
|
end
|
|
|
@status = 0
|
|
|
else
|
|
|
@status = 1
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def charts
|
|
|
if (@competition.competition_modules.where(:name => "排行榜").first.present? && !@competition.competition_modules.where(:name => "排行榜").first.hidden) || User.current.admin?
|
|
|
@max_min_stage = max_min_stage_time @competition
|
|
|
if params[:stage_id]
|
|
|
@stage = @competition.competition_stages.where(:id => params[:stage_id]).first
|
|
|
@type = @stage.name
|
|
|
elsif @competition.competition_stages.count == 1
|
|
|
@stage = @competition.competition_stages.first
|
|
|
@type = "排行榜"
|
|
|
else
|
|
|
if @competition.end_time < Time.now
|
|
|
@type = "总排行榜"
|
|
|
else
|
|
|
@max_min_stage.reverse.each do |section|
|
|
|
if section.competition_stage.name != "模拟赛"
|
|
|
if section.min_start_time < Time.now
|
|
|
@stage = section.competition_stage
|
|
|
@type = @stage.name
|
|
|
break
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
if @competition.identifier == "gcc-annotation-2018" || @competition.identifier == "gcc-course-2019"
|
|
|
@rule_content = @competition.chart_rules.first
|
|
|
else
|
|
|
@rule_content = @competition.chart_rules.where(:competition_stage_id => @stage.try(:id)).first
|
|
|
end
|
|
|
@records = []
|
|
|
if @competition.identifier == 'hn'
|
|
|
if @type == "总排行榜"
|
|
|
pre_stage = @competition.competition_stages.where(:name => "预赛").first
|
|
|
final_stage = @competition.competition_stages.where(:name => "决赛").first
|
|
|
@records = @competition.competition_teams.includes(:user => [:user_extensions => [:school]])
|
|
|
@records.each do |team|
|
|
|
# 决赛记录
|
|
|
f_score = team.competition_scores.where(:competition_stage_id => final_stage.try(:id)).first
|
|
|
# 预赛记录
|
|
|
p_score = team.competition_scores.where(:competition_stage_id => pre_stage.try(:id)).first
|
|
|
team[:s_score] = (f_score.try(:score).to_f * 0.8 + p_score.try(:score).to_f * 0.2).try(:round, 2)
|
|
|
team[:s_spend_time] = f_score.try(:cost_time).to_i + p_score.try(:cost_time).to_i
|
|
|
end
|
|
|
else
|
|
|
@records = CompetitionTeam.find_by_sql("SELECT teams.*, cs.score AS s_score, cs.cost_time AS s_spend_time FROM competition_teams teams, competition_scores cs WHERE cs.competition_team_id = teams.`id` AND cs.competition_stage_id = '#{@stage.id}'")
|
|
|
end
|
|
|
@records = @records.sort do |a, b|
|
|
|
[b[:s_score], a[:s_spend_time]] <=> [a[:s_score], b[:s_spend_time]]
|
|
|
end
|
|
|
current_team = @competition.team_members.where(:user_id => User.current.id).first
|
|
|
if current_team.present?
|
|
|
@user_rank = @records.map(&:id).index(current_team.competition_team_id)
|
|
|
@user_record = @records.select{|team| team.id == current_team.competition_team_id}.first if @user_rank.present?
|
|
|
end
|
|
|
@records = @records[0..17]
|
|
|
elsif @competition.identifier == 'gcc-dev-2018'
|
|
|
if @type == "预赛" || @type == "决赛"
|
|
|
if @type == "预赛"
|
|
|
# 'nyog9r7c','yugrij4n','48flws5g','bfgau7s6','mfv6zrj7','f398leqr','qwaffs2p','ose7482b','y5wh2ofx'
|
|
|
# 预赛的实训id 第一阶段:1185,1197,1195 第二阶段:1202, 1210, 1207 第三阶段:1254,1255,1243
|
|
|
shixun1_id = [1185, 1197, 1195]
|
|
|
shixun2_id = [1202, 1210, 1207]
|
|
|
shixun3_id = [1254, 1255, 1243]
|
|
|
elsif @type == "决赛"
|
|
|
# '92b7vt8x','a7fxenvc','wt2xfzny','xa4m9cng','tng6heyf','am5o73er','9fla2zry','fzp3iu4w','qlsy6xb4'
|
|
|
# 预赛的实训id 第一阶段:1289,1373,1256 第二阶段:1488, 1453, 1487 第三阶段:1470, 1473, 1408
|
|
|
shixun1_id = Shixun.where(:identifier => ['92b7vt8x','a7fxenvc','wt2xfzny']).pluck(:id)
|
|
|
shixun2_id = Shixun.where(:identifier => ['xa4m9cng','tng6heyf','am5o73er']).pluck(:id)
|
|
|
shixun3_id = Shixun.where(:identifier => ['9fla2zry','fzp3iu4w','qlsy6xb4']).pluck(:id)
|
|
|
end
|
|
|
|
|
|
if @competition.competition_scores.where(:competition_stage_id => @stage.id).count == 0
|
|
|
# 三个阶段的开始时间和结束时间
|
|
|
s1_time = @stage.competition_stage_sections[0].start_time
|
|
|
e1_time = @stage.competition_stage_sections[0].end_time
|
|
|
s2_time = @stage.competition_stage_sections[1].start_time
|
|
|
e2_time = @stage.competition_stage_sections[1].end_time
|
|
|
s3_time = @stage.competition_stage_sections[2].start_time
|
|
|
e3_time = @stage.competition_stage_sections[2].end_time
|
|
|
|
|
|
@records = @competition.competition_teams.includes(:user => [:user_extensions => [:school]])
|
|
|
@records.each do |team|
|
|
|
user_ids = team.team_members.where(:is_teacher => 0).pluck(:user_id)
|
|
|
# 第一阶段的得分和耗时
|
|
|
challenges_1 = Challenge.where(:shixun_id => shixun1_id)
|
|
|
challenge_rate1 = 0.5
|
|
|
result1 = chart_exp_score_pre user_ids, s1_time, e1_time, challenges_1, challenge_rate1, 3
|
|
|
score1 = result1[0]
|
|
|
time1 = result1[1]
|
|
|
|
|
|
# 第二阶段的得分和耗时
|
|
|
challenge_rate2 = 1.0
|
|
|
challenges_2 = Challenge.where(:shixun_id => shixun2_id)
|
|
|
result2 = chart_exp_score_pre user_ids, s2_time, e2_time, challenges_2, challenge_rate2, 3
|
|
|
score2 = result2[0]
|
|
|
time2 = result2[1]
|
|
|
|
|
|
|
|
|
# 第三阶段的得分和耗时
|
|
|
challenges_3 = Challenge.where(:shixun_id => shixun3_id)
|
|
|
result3 = chart_exp_score_third user_ids, s3_time, e3_time, challenges_3
|
|
|
score3 = result3[0]
|
|
|
time3 = result3[1]
|
|
|
|
|
|
team[:s_score] = (score1 + score2 + score3).try(:round, 2)
|
|
|
team[:s_spend_time] = time1 + time2 + time3
|
|
|
|
|
|
# 比赛已截止且未有分数纪录 则创建
|
|
|
if Time.now > e3_time && team.competition_scores.where(:competition_id => @competition.id, :competition_stage_id => @stage.id).count == 0
|
|
|
CompetitionScore.create(:user_id => team.user_id, :competition_team_id => team.id, :competition_id => @competition.id, :competition_stage_id => @stage.id, :score => team[:s_score], :cost_time => team[:s_spend_time])
|
|
|
end
|
|
|
end
|
|
|
else
|
|
|
@records = CompetitionTeam.find_by_sql("SELECT teams.*, cs.score AS s_score, cs.cost_time AS s_spend_time FROM competition_teams teams, competition_scores cs WHERE cs.competition_team_id = teams.`id` AND cs.competition_stage_id = '#{@stage.id}'")
|
|
|
end
|
|
|
elsif @type == "总排行榜"
|
|
|
pre_stage = @competition.competition_stages.where(:name => "预赛").first
|
|
|
final_stage = @competition.competition_stages.where(:name => "决赛").first
|
|
|
@records = @competition.competition_teams.includes(:user => [:user_extensions => [:school]])
|
|
|
@records.each do |team|
|
|
|
# 决赛记录
|
|
|
f_score = team.competition_scores.where(:competition_stage_id => final_stage.try(:id)).first
|
|
|
# 预赛记录
|
|
|
p_score = team.competition_scores.where(:competition_stage_id => pre_stage.try(:id)).first
|
|
|
team[:s_score] = (f_score.try(:score).to_f * 0.85 + p_score.try(:score).to_f * 0.15).try(:round, 2)
|
|
|
team[:s_spend_time] = f_score.try(:cost_time).to_i + p_score.try(:cost_time).to_i
|
|
|
end
|
|
|
end
|
|
|
|
|
|
@records = @records.sort do |a, b|
|
|
|
[b[:s_score], a[:s_spend_time]] <=> [a[:s_score], b[:s_spend_time]]
|
|
|
end
|
|
|
current_team_ids = @competition.team_members.where(:user_id => User.current.id).pluck(:competition_team_id).uniq
|
|
|
@user_ranks = @records.select{|com_team| current_team_ids.include?(com_team.id)}
|
|
|
@records = @records.select{|record| record[:s_score] > 0}
|
|
|
@user_ranks.each do |team|
|
|
|
rank = @records.map(&:id).index(team.id)
|
|
|
team[:rank] = rank.present? ? (rank+1) : 0
|
|
|
end
|
|
|
records_length = 97
|
|
|
@records = @records[0..records_length]
|
|
|
elsif @competition.identifier == "gcc-annotation-2018" || @competition.identifier == "gcc-course-2019"
|
|
|
@records = @competition.competition_teams.includes(:user => [:user_extensions => [:school]])
|
|
|
@records.each do |team|
|
|
|
team[:s_score] = team.competition_scores.where(:competition_id => @competition.id).first.try(:score).to_f.try(:round, 3)
|
|
|
end
|
|
|
@records = @records.sort do |a, b|
|
|
|
[b[:s_score]] <=> [a[:s_score]]
|
|
|
end
|
|
|
current_team_ids = @competition.team_members.where(:user_id => User.current.id).pluck(:competition_team_id).uniq
|
|
|
@user_ranks = @records.select{|com_team| current_team_ids.include?(com_team.id)}
|
|
|
@records = @records.select{|record| record[:s_score] > 0}
|
|
|
@user_ranks.each do |team|
|
|
|
rank = @records.map(&:id).index(team.id)
|
|
|
team[:rank] = rank.present? ? (rank+1) : 0
|
|
|
end
|
|
|
elsif @competition.identifier == 'gcc-task-2019'
|
|
|
if @type == "预赛" || @type == "决赛"
|
|
|
if @type == "预赛"
|
|
|
# 'nyog9r7c','yugrij4n','48flws5g','bfgau7s6','mfv6zrj7','f398leqr','qwaffs2p','ose7482b','y5wh2ofx'
|
|
|
# 预赛的实训id 第一阶段:1185,1197,1195 第二阶段:1202, 1210, 1207 第三阶段:1254,1255,1243
|
|
|
shixun1_id = [2303]
|
|
|
shixun2_id = [2994, 3012, 3024]
|
|
|
shixun3_id = [2944, 2938, 2943]
|
|
|
elsif @type == "决赛"
|
|
|
# '92b7vt8x','a7fxenvc','wt2xfzny','xa4m9cng','tng6heyf','am5o73er','9fla2zry','fzp3iu4w','qlsy6xb4'
|
|
|
# 预赛的实训id 第一阶段:1289,1373,1256 第二阶段:1488, 1453, 1487 第三阶段:1470, 1473, 1408
|
|
|
shixun1_id = Shixun.where(:identifier => ['ftlc4x38']).pluck(:id)
|
|
|
shixun2_id = Shixun.where(:identifier => ['y9npgih2','ucqt7fw3','2p7ouzwk']).pluck(:id)
|
|
|
shixun3_id = Shixun.where(:identifier => ['fj49r7xv','gf2cvxfh','cmoxhtbs']).pluck(:id)
|
|
|
end
|
|
|
|
|
|
if @competition.competition_scores.where(:competition_stage_id => @stage.id).count == 0
|
|
|
# 三个阶段的开始时间和结束时间
|
|
|
s1_time = @stage.competition_stage_sections[0].start_time
|
|
|
e1_time = @stage.competition_stage_sections[0].end_time
|
|
|
s2_time = @stage.competition_stage_sections[1].start_time
|
|
|
e2_time = @stage.competition_stage_sections[1].end_time
|
|
|
s3_time = @stage.competition_stage_sections[2].start_time
|
|
|
e3_time = @stage.competition_stage_sections[2].end_time
|
|
|
|
|
|
@records = @competition.competition_teams.includes(:user => [:user_extensions => [:school]])
|
|
|
@records.each do |team|
|
|
|
user_ids = team.team_members.where(:is_teacher => 0).pluck(:user_id)
|
|
|
# 第一阶段的得分和耗时
|
|
|
challenges_1 = Challenge.where(:shixun_id => shixun1_id)
|
|
|
challenge_rate1 = 1.0
|
|
|
result1 = chart_exp_score_pre user_ids, s1_time, e1_time, challenges_1, challenge_rate1, 2
|
|
|
score1 = result1[0]
|
|
|
time1 = result1[1]
|
|
|
|
|
|
# 第二阶段的得分和耗时
|
|
|
challenge_rate2 = 1.0
|
|
|
challenges_2 = Challenge.where(:shixun_id => shixun2_id)
|
|
|
result2 = chart_exp_score_pre user_ids, s2_time, e2_time, challenges_2, challenge_rate2, 2
|
|
|
score2 = result2[0]
|
|
|
time2 = result2[1]
|
|
|
|
|
|
|
|
|
# 第三阶段的得分和耗时
|
|
|
challenges_3 = Challenge.where(:shixun_id => shixun3_id)
|
|
|
result3 = chart_exp_score_third user_ids, s3_time, e3_time, challenges_3
|
|
|
score3 = result3[0]
|
|
|
time3 = result3[1]
|
|
|
|
|
|
team[:s_score] = (score1 + score2 + score3).try(:round, 2)
|
|
|
team[:s_spend_time] = time1 + time2 + time3
|
|
|
|
|
|
# 比赛已截止且未有分数纪录 则创建
|
|
|
if Time.now > e3_time && team.competition_scores.where(:competition_id => @competition.id, :competition_stage_id => @stage.id).count == 0
|
|
|
CompetitionScore.create(:user_id => team.user_id, :competition_team_id => team.id, :competition_id => @competition.id, :competition_stage_id => @stage.id, :score => team[:s_score], :cost_time => team[:s_spend_time])
|
|
|
end
|
|
|
end
|
|
|
else
|
|
|
@records = CompetitionTeam.find_by_sql("SELECT teams.*, cs.score AS s_score, cs.cost_time AS s_spend_time FROM competition_teams teams, competition_scores cs WHERE cs.competition_team_id = teams.`id` AND cs.competition_stage_id = '#{@stage.id}'")
|
|
|
end
|
|
|
elsif @type == "总排行榜"
|
|
|
pre_stage = @competition.competition_stages.where(:name => "预赛").first
|
|
|
final_stage = @competition.competition_stages.where(:name => "决赛").first
|
|
|
@records = @competition.competition_teams.includes(:user => [:user_extensions => [:school]])
|
|
|
@records.each do |team|
|
|
|
# 决赛记录
|
|
|
f_score = team.competition_scores.where(:competition_stage_id => final_stage.try(:id)).first
|
|
|
# 预赛记录
|
|
|
p_score = team.competition_scores.where(:competition_stage_id => pre_stage.try(:id)).first
|
|
|
team[:s_score] = (f_score.try(:score).to_f * 0.80 + p_score.try(:score).to_f * 0.20).try(:round, 2)
|
|
|
team[:s_spend_time] = f_score.try(:cost_time).to_i + p_score.try(:cost_time).to_i
|
|
|
end
|
|
|
end
|
|
|
|
|
|
@records = @records.sort do |a, b|
|
|
|
[b[:s_score], a[:s_spend_time]] <=> [a[:s_score], b[:s_spend_time]]
|
|
|
end
|
|
|
current_team_ids = @competition.team_members.where(:user_id => User.current.id).pluck(:competition_team_id).uniq
|
|
|
@user_ranks = @records.select{|com_team| current_team_ids.include?(com_team.id)}
|
|
|
@records = @records.select{|record| record[:s_score] > 0}
|
|
|
@user_ranks.each do |team|
|
|
|
rank = @records.map(&:id).index(team.id)
|
|
|
team[:rank] = rank.present? ? (rank+1) : 0
|
|
|
end
|
|
|
records_length = 97
|
|
|
@records = @records[0..records_length]
|
|
|
end
|
|
|
else
|
|
|
render_403
|
|
|
end
|
|
|
end
|
|
|
|
|
|
|
|
|
def export_chart_score
|
|
|
xls_report = StringIO.new
|
|
|
book = Spreadsheet::Workbook.new
|
|
|
sheet1 = book.create_worksheet :name => "比赛成绩"
|
|
|
blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
|
|
|
sheet1.row(0).default_format = blue
|
|
|
|
|
|
if @competition.identifier == "hn"
|
|
|
records = User.where(:id => CompetitionScore.where("competition_id = #{@competition.id} and competition_stage_id is not null").map(&:user_id)).includes(:user_extensions => [:school])
|
|
|
records.each do |user|
|
|
|
# 决赛记录
|
|
|
f_score = user.competition_scores.where(:region => 'hn', :score_type => 'f').first
|
|
|
# 预赛记录
|
|
|
p_score = user.competition_scores.where(:region => 'hn', :score_type => 'p').first
|
|
|
user[:p_score] = p_score.try(:score)
|
|
|
user[:p_time] = p_score.try(:cost_time)
|
|
|
user[:f_score] = f_score.try(:score)
|
|
|
user[:f_time] = f_score.try(:cost_time)
|
|
|
user[:s_score] = (f_score.try(:score).to_f * 0.8 + p_score.try(:score).to_f * 0.2).try(:round, 2)
|
|
|
user[:s_spend_time] = f_score.try(:cost_time).to_i + p_score.try(:cost_time).to_i
|
|
|
end
|
|
|
records = records.sort do |a, b|
|
|
|
[b[:s_score], a[:s_spend_time]] <=> [a[:s_score], b[:s_spend_time]]
|
|
|
end
|
|
|
|
|
|
sheet1.row(0).concat(["序号","姓名","学校","学号","模拟赛得分","模拟赛用时","预赛得分","预赛用时",
|
|
|
"决赛得分","决赛用时","总得分","总用时"])
|
|
|
count_row = 1
|
|
|
records.each_with_index do |user, index|
|
|
|
sheet1[count_row,0] = index + 1
|
|
|
sheet1[count_row,1] = user.show_real_name
|
|
|
sheet1[count_row,2] = user.school_name
|
|
|
sheet1[count_row,3] = user.user_extensions.try(:student_id)
|
|
|
sheet1[count_row,4] = user.competition_scores.where(:region => 'hn', :score_type => 't').first.try(:score)
|
|
|
sheet1[count_row,5] = com_spend_time user.competition_scores.where(:region => 'hn', :score_type => 't').first.try(:cost_time).to_i
|
|
|
sheet1[count_row,6] = user[:p_score]
|
|
|
sheet1[count_row,7] = com_spend_time user[:p_time].to_i
|
|
|
sheet1[count_row,8] = user[:f_score]
|
|
|
sheet1[count_row,9] = com_spend_time user[:f_time].to_i
|
|
|
sheet1[count_row,10] = user[:s_score]
|
|
|
sheet1[count_row,11] = com_spend_time user[:s_spend_time].to_i
|
|
|
count_row += 1
|
|
|
end
|
|
|
elsif @competition.identifier == "gcc-dev-2018" || @competition.identifier == "gcc-task-2019"
|
|
|
records = @competition.competition_teams
|
|
|
f_rate = @competition.identifier == "gcc-dev-2018" ? 0.85 : 0.8
|
|
|
p_rate = @competition.identifier == "gcc-dev-2018" ? 0.15 : 0.2
|
|
|
records.each do |team|
|
|
|
# 决赛记录
|
|
|
f_score = team.competition_scores.where(:competition_stage_id => @competition.competition_stages.where(:name => "决赛").first.try(:id)).first
|
|
|
# 预赛记录
|
|
|
p_score = team.competition_scores.where(:competition_stage_id => @competition.competition_stages.where(:name => "预赛").first.try(:id)).first
|
|
|
team[:p_score] = p_score.try(:score)
|
|
|
team[:p_time] = p_score.try(:cost_time)
|
|
|
team[:f_score] = f_score.try(:score)
|
|
|
team[:f_time] = f_score.try(:cost_time)
|
|
|
team[:s_score] = (f_score.try(:score).to_f * f_rate + p_score.try(:score).to_f * p_rate).try(:round, 2)
|
|
|
team[:s_spend_time] = f_score.try(:cost_time).to_i + p_score.try(:cost_time).to_i
|
|
|
end
|
|
|
records = records.sort do |a, b|
|
|
|
[b[:s_score], a[:s_spend_time]] <=> [a[:s_score], b[:s_spend_time]]
|
|
|
end
|
|
|
|
|
|
sheet1.row(0).concat(["序号","战队名","指导老师","队员","学校","预赛得分","预赛用时",
|
|
|
"决赛得分","决赛用时","总得分","总用时"])
|
|
|
count_row = 1
|
|
|
records.each_with_index do |team, index|
|
|
|
user = team.user
|
|
|
sheet1[count_row,0] = index + 1
|
|
|
sheet1[count_row,1] = team.name
|
|
|
sheet1[count_row,2] = team.teacher.try(:show_real_name)
|
|
|
sheet1[count_row,3] = team.group_members
|
|
|
sheet1[count_row,4] = chart_school_str team.team_members.where(:is_teacher => 0)
|
|
|
sheet1[count_row,5] = team[:p_score]
|
|
|
sheet1[count_row,6] = com_spend_time team[:p_time].to_i
|
|
|
sheet1[count_row,7] = team[:f_score]
|
|
|
sheet1[count_row,8] = com_spend_time team[:f_time].to_i
|
|
|
sheet1[count_row,9] = team[:s_score]
|
|
|
sheet1[count_row,10] = com_spend_time team[:s_spend_time].to_i
|
|
|
count_row += 1
|
|
|
end
|
|
|
elsif @competition.identifier == "gcc-annotation-2018" || @competition.identifier == "gcc-course-2019"
|
|
|
records = @competition.competition_teams
|
|
|
records.each do |team|
|
|
|
team[:s_score] = team.competition_scores.where(:competition_id => @competition.id).first.try(:score).to_f.try(:round, 3)
|
|
|
end
|
|
|
records = records.sort do |a, b|
|
|
|
[b[:s_score]] <=> [a[:s_score]]
|
|
|
end
|
|
|
|
|
|
sheet1.row(0).concat(["序号","战队名","指导老师","队员","学校","总得分"])
|
|
|
count_row = 1
|
|
|
records.each_with_index do |team, index|
|
|
|
user = team.user
|
|
|
sheet1[count_row,0] = index + 1
|
|
|
sheet1[count_row,1] = team.name
|
|
|
sheet1[count_row,2] = team.teacher.try(:show_real_name)
|
|
|
sheet1[count_row,3] = team.group_members
|
|
|
sheet1[count_row,4] = chart_school_str team.team_members.where(:is_teacher => 0)
|
|
|
sheet1[count_row,5] = team[:s_score]
|
|
|
count_row += 1
|
|
|
end
|
|
|
end
|
|
|
book.write xls_report
|
|
|
send_data(xls_report.string, :type => "text/excel;charset=utf-8; header=present",
|
|
|
:filename => filename_for_content_disposition("#{@competition.name}比赛成绩.xls"))
|
|
|
end
|
|
|
|
|
|
def edit_rule
|
|
|
@stage = @competition.competition_stages.where(:id => params[:stage_id]).first
|
|
|
if request.get?
|
|
|
@rule_content = ChartRule.where(:competition_id => @competition.id, :competition_stage_id => @stage.try(:id)).first
|
|
|
else
|
|
|
if params[:content]
|
|
|
@rule_content = ChartRule.where(:competition_id => @competition.id, :competition_stage_id => @stage.try(:id)).first
|
|
|
if @rule_content.present?
|
|
|
@rule_content.update_attribute("content", params[:content])
|
|
|
else
|
|
|
@rule_content = ChartRule.create(:competition_id => @competition.id, :competition_stage_id => @stage.try(:id), :content => params[:content])
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def online_switch
|
|
|
if @competition.present?
|
|
|
if @competition.status
|
|
|
@competition.update_attributes(status: false, published_at: nil)
|
|
|
@btn_html = "上架"
|
|
|
else
|
|
|
@competition.update_attributes(status: true, online_time: Time.now, published_at: nil)
|
|
|
@btn_html = "下架"
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def new_competition
|
|
|
if params[:com_name] && params[:com_name].strip != ""
|
|
|
visits = rand(400..1000)
|
|
|
Competition.create(:name => params[:com_name], sub_title: params[:sub_title].to_s.strip, :start_time => params[:start_time], :end_time => params[:end_time], :visits => visits)
|
|
|
end
|
|
|
redirect_to competition_managements_path
|
|
|
end
|
|
|
|
|
|
def edit_competition
|
|
|
competition = Competition.find params[:id]
|
|
|
if params[:com_name] && params[:com_name].strip != ""
|
|
|
competition.update_attributes(:name => params[:com_name], sub_title: params[:sub_title].to_s.strip, :start_time => params[:start_time], :end_time => params[:end_time])
|
|
|
end
|
|
|
redirect_to competition_managements_path
|
|
|
end
|
|
|
|
|
|
def competition_setting
|
|
|
# @competition = Competition.find params[:id]
|
|
|
ActiveRecord::Base.transaction do
|
|
|
if params[:md_name]
|
|
|
md_modules = @competition.competition_modules.where(:md_edit => true)
|
|
|
md_modules.destroy_all if md_modules
|
|
|
params[:md_name].each_with_index do |name, index|
|
|
|
hidden = params[:md_checked][index].to_i == 0 ? 1 : 0
|
|
|
cm = CompetitionModule.create(:competition_id => @competition.id,:name => name, :position => params[:md_position][index], :hidden => hidden, :md_edit => true)
|
|
|
# 创建md_contents
|
|
|
CompetitionModuleMdContent.create(:competition_module_id => cm.id)
|
|
|
end
|
|
|
end
|
|
|
|
|
|
if params[:competition_module]
|
|
|
@competition.competition_modules.where(:id => params[:competition_module], :md_edit => false).update_all(:hidden => 0)
|
|
|
none_modules = @competition.competition_modules.where("name != '首页' and md_edit = false").pluck(:id) - params[:competition_module].map(&:to_i)
|
|
|
@competition.competition_modules.where(:id => none_modules).update_all(:hidden => 1)
|
|
|
end
|
|
|
if params[:name]
|
|
|
@competition.competition_modules.where("name not in ('首页', '报名', '通知公告', '排行榜', '资料下载') and md_edit = false").each_with_index do |mod, index|
|
|
|
mod.update_attribute("name", params[:name][index])
|
|
|
end
|
|
|
end
|
|
|
if params[:url]
|
|
|
@competition.competition_modules.where("name not in ('首页', '报名', '通知公告', '排行榜') and md_edit = false").each_with_index do |mod, index|
|
|
|
mod.update_attribute("url", params[:url][index])
|
|
|
end
|
|
|
end
|
|
|
if params[:position]
|
|
|
@competition.competition_modules.where(:md_edit => false).each_with_index do |mod, index|
|
|
|
mod.update_attribute("position", params[:position][index])
|
|
|
end
|
|
|
end
|
|
|
@competition.update_attributes(:identifier => params[:identifier], :enroll_end_time => params[:enroll_end_time])
|
|
|
|
|
|
if params[:competition_staffs].present?
|
|
|
@competition.competition_staffs.delete_all
|
|
|
params[:competition_staffs].each_with_index do |staff_params, index|
|
|
|
@competition.competition_staffs.create(staff_params.merge(position: index + 1))
|
|
|
end
|
|
|
end
|
|
|
|
|
|
if params[:new_name]
|
|
|
params[:new_name].each_with_index do |new_module, index|
|
|
|
@competition.competition_modules << CompetitionModule.new(:name => new_module, :position => params[:new_position][index], :hidden => 0, :url => params[:new_url][index])
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def competition_images
|
|
|
@competition.attachments.destroy_all
|
|
|
if params[:file]
|
|
|
params[:file].each do |file|
|
|
|
img_base64_head = 'data:image/jpeg;base64,'
|
|
|
if file && file.start_with?(img_base64_head)
|
|
|
file = StringIO.new(Base64.decode64(file[img_base64_head.size,file.size-img_base64_head.size]))
|
|
|
attachment = Attachment.new(:file => file)
|
|
|
attachment.author = User.current
|
|
|
attachment.container_type = 'Competition'
|
|
|
attachment.container_id = @competition.id
|
|
|
attachment.filename = Redmine::Utils.random_hex(16) + ".jpg"
|
|
|
attachment.save
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def new_competition_stage
|
|
|
@result = ""
|
|
|
@competition = Competition.find params[:id]
|
|
|
if params[:name] && params[:name] != ""
|
|
|
if @competition.competition_stages.where(:name => params[:name]).count > 0
|
|
|
@result = "已存在同名的阶段"
|
|
|
else
|
|
|
@competition.competition_stages << CompetitionStage.new(:name => params[:name])
|
|
|
@result = "新建成功"
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def update_competition_stage
|
|
|
@competition = Competition.find params[:id]
|
|
|
@competition.competition_stages.where(:id => params[:stage_id]).update_all(:name => params[:name])
|
|
|
end
|
|
|
|
|
|
def delete_competition_stage
|
|
|
@competition.competition_stages.where(:id => params[:stage_id]).destroy_all
|
|
|
end
|
|
|
|
|
|
def new_stage_section
|
|
|
@competition = Competition.find params[:id]
|
|
|
@result = ""
|
|
|
stage = @competition.competition_stages.where(:id => params[:stage_id]).first
|
|
|
if stage.present?
|
|
|
new_section = CompetitionStageSection.new(:competition_id => @competition.id, :name => params[:new_section_name],
|
|
|
:start_time => params[:new_start_time], :end_time => params[:new_end_time], :entry => params[:entry])
|
|
|
stage.competition_stage_sections << new_section
|
|
|
if params[:entry_name]
|
|
|
params[:entry_name].each_with_index do |name, index|
|
|
|
new_section.competition_entries << CompetitionEntry.new(:competition_stage_id => stage.id, :name => name, :url => params[:entry_url][index])
|
|
|
end
|
|
|
end
|
|
|
new_section.entry = params[:entry_name] ? params[:entry_name].length : 0
|
|
|
new_section.save
|
|
|
@result = "新建成功"
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def update_stage_section
|
|
|
section = @competition.competition_stage_sections.where(:id => params[:section_id]).first
|
|
|
if section.present?
|
|
|
section_entries = section.competition_entries
|
|
|
if !params[:entry_name]
|
|
|
section_entries.destroy_all
|
|
|
else
|
|
|
if params[:entry_name].length < section_entries.size
|
|
|
section_entries[params[:entry_name].length, section_entries.size - 1].each(&:destroy)
|
|
|
end
|
|
|
|
|
|
params[:entry_name].each_with_index do |name, index|
|
|
|
entry = section_entries[index]
|
|
|
if entry.present?
|
|
|
entry.update_attributes(:name => name, :url => params[:entry_url][index])
|
|
|
else
|
|
|
section.competition_entries << CompetitionEntry.new(:competition_stage_id => section.competition_stage_id, :name => name, :url => params[:entry_url][index])
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
section.update_attributes(:name => params[:name], :start_time => params[:start_time], :end_time => params[:end_time], :entry => params[:entry_name] ? params[:entry_name].length : 0)
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def delete_stage_section
|
|
|
@competition.competition_stage_sections.where(:id => params[:section_id]).destroy_all
|
|
|
end
|
|
|
|
|
|
def publish
|
|
|
return render_403 unless admin_or_business?
|
|
|
|
|
|
@competition.update_column(:published_at, Time.now)
|
|
|
end
|
|
|
|
|
|
private
|
|
|
|
|
|
def chart_exp_score_mo myshixuns, s_time, e_time
|
|
|
score1 = 0
|
|
|
time1 = 0
|
|
|
myshixuns.each do |myshixun|
|
|
|
t_games = myshixun.games.select{|game| game.status == 2 && game.open_time >= s_time && game.end_time <= e_time }
|
|
|
myshixun_score = t_games.map(&:final_score).sum
|
|
|
myshixun_time = 0
|
|
|
t_games.each do |game|
|
|
|
myshixun_time += (game.end_time.to_i - game.open_time.to_i) > 0 ? (game.end_time.to_i - game.open_time.to_i) : 0
|
|
|
end
|
|
|
# myshixun_time = t_games.map(&:cost_time).sum
|
|
|
time1 = myshixun_score > score1 ? myshixun_time : time1
|
|
|
score1 = myshixun_score > score1 ? myshixun_score : score1
|
|
|
end
|
|
|
return [score1, time1]
|
|
|
end
|
|
|
|
|
|
def chart_exp_score myshixuns, s_time, e_time
|
|
|
score1 = 0
|
|
|
time1 = 0
|
|
|
myshixuns.each do |myshixun|
|
|
|
t_games = myshixun.games.select{|game| game.status == 2 && game.open_time >= s_time && game.end_time <= e_time }
|
|
|
myshixun_score = t_games.map(&:final_score).sum
|
|
|
end_time = t_games.map(&:end_time).max
|
|
|
myshixun_time = (end_time.to_i - s_time.to_i) > 0 ? (end_time.to_i - s_time.to_i) : 0
|
|
|
# myshixun_time = t_games.map(&:cost_time).sum
|
|
|
time1 = myshixun_score > score1 ? myshixun_time : time1
|
|
|
score1 = myshixun_score > score1 ? myshixun_score : score1
|
|
|
end
|
|
|
return [score1, time1]
|
|
|
end
|
|
|
|
|
|
# 预赛第一阶段
|
|
|
# challenges 每阶段三个实训的所有关卡
|
|
|
# s_time 阶段开始时间 e_time 阶段结束时间
|
|
|
# rate 关卡经验值与分数的比值
|
|
|
# challenge_count 每个实训的关卡数
|
|
|
# 对三个实训的所有关卡循环: 找到在比赛时间内通关的最低耗时
|
|
|
def chart_exp_score_pre user_ids, s_time, e_time, challenges, s_rate, challenge_count
|
|
|
total_score = 0
|
|
|
total_time = 0
|
|
|
length = challenge_count #每个实训的关卡数
|
|
|
for i in 1..length
|
|
|
score = 0
|
|
|
time = 0
|
|
|
challenges.where(:position => i).each do |challenge|
|
|
|
Game.where(:challenge_id => challenge.id, :user_id => user_ids, :status => 2).select{|game| game.open_time >= s_time && game.end_time <= e_time }.each do |game|
|
|
|
game_score = challenge.score * s_rate
|
|
|
cost_time = (game.end_time.to_i - s_time.to_i) > 0 ? (game.end_time.to_i - s_time.to_i) : 0
|
|
|
if score < game_score
|
|
|
score = game_score
|
|
|
time = cost_time
|
|
|
elsif score == game_score
|
|
|
time = cost_time > time ? time : cost_time
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
total_score += score
|
|
|
total_time += time
|
|
|
=begin
|
|
|
if team_id == 744
|
|
|
Rails.logger.warn("#########challenge---#{i}:#{score}")
|
|
|
end
|
|
|
=end
|
|
|
end
|
|
|
return [total_score, total_time]
|
|
|
end
|
|
|
|
|
|
def chart_exp_score_third user_ids, s_time, e_time, challenges
|
|
|
# 第三阶段的得分和耗时
|
|
|
score3 = 0
|
|
|
time3 = 0
|
|
|
|
|
|
challenges.each do |challenge|
|
|
|
Game.where(:challenge_id => challenge.id, :user_id => user_ids, :status => 2).select{|game| game.open_time >= s_time && game.end_time <= e_time }.each do |game|
|
|
|
outputs = game.outputs.select{|output| !output.text_scor.nil? && output.created_at <= e_time }
|
|
|
if outputs.present?
|
|
|
outputs = outputs.sort { |a, b| b[:text_scor].to_f <=> a[:text_scor].to_f }
|
|
|
myshixun_score = outputs.first.text_scor.to_f
|
|
|
myshixun_time = outputs.first.created_at.to_i - s_time.to_i
|
|
|
if score3 < myshixun_score
|
|
|
score3 = myshixun_score
|
|
|
time3 = myshixun_time
|
|
|
elsif score3 == myshixun_score
|
|
|
time3 = myshixun_time > time3 ? time3 : myshixun_time
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
return [score3, time3]
|
|
|
end
|
|
|
|
|
|
def find_inform
|
|
|
if params[:inform_id].present?
|
|
|
@inform = Inform.find params[:inform_id]
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def find_type
|
|
|
# competition = ["hn", "db"]
|
|
|
# @competition = params[:competition_id] ? params[:competition_id] : params[:id]
|
|
|
# if competition.include?(@competition.try(:strip))
|
|
|
# @competition
|
|
|
# else
|
|
|
# render_404
|
|
|
# end
|
|
|
|
|
|
if Competition.where(:identifier => params[:id]).blank?
|
|
|
@competition = Competition.find(params[:id])
|
|
|
else
|
|
|
@competition = Competition.where(:identifier => params[:id]).first
|
|
|
end
|
|
|
rescue ActiveRecord::RecordNotFound
|
|
|
render_404
|
|
|
end
|
|
|
end
|