You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pgfqe6ch8/app/controllers/competitions_controller.rb

826 lines
38 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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])
md_content.save_attachments(params[:attachments])
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])
md_content.save_attachments(params[:attachments])
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"
@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 第一阶段118511971195 第二阶段1202, 1210, 1207 第三阶段125412551243
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 第一阶段128913731256 第二阶段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"
@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 第一阶段118511971195 第二阶段1202, 1210, 1207 第三阶段125412551243
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 第一阶段128913731256 第二阶段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 = 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.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]
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"
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, 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 * 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