#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 "
@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 "
@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 "
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