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

830 lines
38 KiB

6 years ago
#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]
6 years ago
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)
6 years ago
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")
6 years ago
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
6 years ago
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
6 years ago
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)
6 years ago
@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)
6 years ago
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}"
6 years ago
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
5 years ago
result1 = chart_exp_score_pre user_ids, s1_time, e1_time, challenges_1, challenge_rate1, 3
6 years ago
score1 = result1[0]
time1 = result1[1]
# 第二阶段的得分和耗时
challenge_rate2 = 1.0
challenges_2 = Challenge.where(:shixun_id => shixun2_id)
5 years ago
result2 = chart_exp_score_pre user_ids, s2_time, e2_time, challenges_2, challenge_rate2, 3
6 years ago
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]
5 years ago
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 => ['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)
5 years ago
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)
5 years ago
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]
6 years ago
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"
6 years ago
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
6 years ago
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)
6 years ago
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)
6 years ago
@btn_html = "上架"
else
@competition.update_attributes(status: true, online_time: Time.now, published_at: nil)
6 years ago
@btn_html = "下架"
end
end
end
def new_competition
if params[:com_name] && params[:com_name].strip != ""
visits = rand(400..1000)
6 years ago
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)
6 years ago
end
redirect_to competition_managements_path
end
def edit_competition
competition = Competition.find params[:id]
if params[:com_name] && params[:com_name].strip != ""
6 years ago
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])
6 years ago
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
6 years ago
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)
6 years ago
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
6 years ago
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
6 years ago
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
6 years ago
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)
6 years ago
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
6 years ago
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 关卡经验值与分数的比值
5 years ago
# challenge_count 每个实训的关卡数
6 years ago
# 对三个实训的所有关卡循环: 找到在比赛时间内通关的最低耗时
5 years ago
def chart_exp_score_pre user_ids, s_time, e_time, challenges, s_rate, challenge_count
6 years ago
total_score = 0
total_time = 0
5 years ago
length = challenge_count #每个实训的关卡数
6 years ago
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|
5 years ago
game_score = challenge.score * s_rate
6 years ago
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|
5 years ago
outputs = game.outputs.select{|output| !output.text_scor.nil? && output.created_at <= e_time }
6 years ago
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