Merge branches 'competitions' and 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into ysmCompetitions
commit
6bd83ef694
@ -0,0 +1,11 @@
|
||||
$(document).on('turbolinks:load', function() {
|
||||
if ($('body.admins-competitions-index-page').length > 0) {
|
||||
$('.modal.admin-upload-file-modal').on('upload:success', function(e, data){
|
||||
var $imageElement = $('.competition-image-' + data.source_id);
|
||||
$imageElement.attr('src', data.url);
|
||||
$imageElement.show();
|
||||
$imageElement.next().html('重新上传');
|
||||
})
|
||||
}
|
||||
});
|
||||
|
@ -0,0 +1,54 @@
|
||||
module CompetitionsHelper
|
||||
def chart_school_str user_ids
|
||||
chart_school_name = ""
|
||||
chart_school_name = School.where(id: UserExtension.where(user_id: user_ids).pluck(:school_id).uniq).pluck(:name).join("、")
|
||||
end
|
||||
|
||||
# 耗时:小时、分、秒 00:00:00
|
||||
# 小于1秒钟则不显示
|
||||
def com_spend_time time
|
||||
hour = time / (60*60)
|
||||
min = time % (60*60) / 60
|
||||
sec = time % (60*60) % 60
|
||||
hour_str = "00"
|
||||
min_str = "00"
|
||||
sec_str = "00"
|
||||
if hour >= 1 && hour < 10
|
||||
hour_str = "0#{hour}"
|
||||
elsif hour >= 10
|
||||
hour_str = "#{hour}"
|
||||
end
|
||||
|
||||
if min >= 1 && min < 10
|
||||
min_str = "0#{min}"
|
||||
elsif min >= 10
|
||||
min_str = "#{min}"
|
||||
end
|
||||
|
||||
if sec >= 1 && sec < 10
|
||||
sec_str = "0#{sec}"
|
||||
elsif sec >= 10
|
||||
sec_str = "#{sec}"
|
||||
end
|
||||
|
||||
time = "#{hour_str} : #{min_str} : #{sec_str}"
|
||||
return time
|
||||
end
|
||||
|
||||
def chart_stages competition
|
||||
stages = []
|
||||
statistic_stages = competition.competition_stages.where("rate > 0")
|
||||
if competition.end_time && competition.end_time < Time.now && statistic_stages.size > 1
|
||||
stages << {id: nil, name: "总排行榜", rate: 1.0, start_time: competition.start_time, end_time: competition.end_time}
|
||||
end
|
||||
|
||||
statistic_stages.each do |stage|
|
||||
if stage.max_end_time && stage.max_end_time < Time.now
|
||||
stages << {id: stage.id, name: "#{stage.name}排行榜", rate: stage.score_rate, start_time: stage.min_start_time, end_time: stage.max_end_time}
|
||||
end
|
||||
end
|
||||
|
||||
stages = stages.sort { |a, b| b[:end_time] <=> a[:end_time] } if stages.size > 0
|
||||
return stages
|
||||
end
|
||||
end
|
@ -0,0 +1,6 @@
|
||||
class ChartRule < ApplicationRecord
|
||||
belongs_to :competition
|
||||
belongs_to :competition_stage, optional: true
|
||||
|
||||
validates :content, length: { maximum: 1000 }
|
||||
end
|
@ -0,0 +1,3 @@
|
||||
class CompetitionAward < ApplicationRecord
|
||||
belongs_to :competition
|
||||
end
|
@ -1,3 +1,4 @@
|
||||
class CompetitionModeSetting < ApplicationRecord
|
||||
belongs_to :course
|
||||
belongs_to :course, optional: true
|
||||
belongs_to :competition
|
||||
end
|
||||
|
@ -0,0 +1,6 @@
|
||||
class CompetitionScore < ApplicationRecord
|
||||
belongs_to :user
|
||||
belongs_to :competition
|
||||
belongs_to :competition_stage, optional: true
|
||||
belongs_to :competition_team, optional: true
|
||||
end
|
@ -0,0 +1,2 @@
|
||||
class ModuleSetting < ApplicationRecord
|
||||
end
|
@ -0,0 +1,16 @@
|
||||
<%
|
||||
define_admin_breadcrumbs do
|
||||
add_admin_breadcrumb('竞赛列表', admins_competitions_path)
|
||||
add_admin_breadcrumb(@competition.name)
|
||||
end
|
||||
%>
|
||||
|
||||
<div class="card mb-5">
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<span class="flex-1">基础设置</span>
|
||||
</div>
|
||||
<div class="card-body row">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
@ -0,0 +1,28 @@
|
||||
total_students_count = 0
|
||||
total_shixun_homework_count = 0
|
||||
total_course_score = 0
|
||||
|
||||
json.courses @courses.each do |course|
|
||||
students_count = course.students.count
|
||||
total_students_count += students_count
|
||||
total_shixun_homework_count += course['shixun_homework_count'].to_i
|
||||
|
||||
score = 500 + 5 * @course_shixun_count_map.fetch(course.id, 0) * @course_myshixun_map.fetch(course.id, 0)
|
||||
total_course_score += score
|
||||
|
||||
teacher = course.teachers.where(user_id: @team_user_ids).first.user
|
||||
json.creator teacher&.real_name
|
||||
json.creator_login teacher&.login
|
||||
json.course_name course.name
|
||||
json.course_id course.id
|
||||
json.students_count students_count
|
||||
json.shixun_homework_count course['shixun_homework_count']
|
||||
json.valid_count @course_myshixun_map.fetch(course.id, 0)
|
||||
json.score score
|
||||
end
|
||||
|
||||
json.total_course_count @courses.size
|
||||
json.total_students_count total_students_count
|
||||
json.total_shixun_homework_count total_shixun_homework_count
|
||||
json.total_valid_count @course_myshixun_map.values.reduce(:+)
|
||||
json.total_course_score total_course_score
|
@ -0,0 +1,41 @@
|
||||
total_myshixun_count = 0
|
||||
total_forked_myshixun_count = 0
|
||||
total_shixun_score = 0
|
||||
|
||||
json.shixuns @shixuns.each do |shixun|
|
||||
total_myshixun_count += shixun.myshixuns_count
|
||||
total_forked_myshixun_count += shixun['forked_myshixun_count'].to_i
|
||||
|
||||
valid_course_count = @course_count_map.fetch(shixun.id, 0)
|
||||
valid_student_count = @original_myshixun_count_map.fetch(shixun.id, 0)
|
||||
score =
|
||||
if shixun.fork_from.blank?
|
||||
500 + 50 * valid_course_count + 10 * valid_student_count
|
||||
else
|
||||
100 + 10 * valid_course_count + 5 * valid_student_count
|
||||
end
|
||||
|
||||
@forked_shixun_map.each do |shixun_id, fork_from_id|
|
||||
next if fork_from_id != shixun.id
|
||||
|
||||
score += 100 + 10 * @forked_map.fetch(shixun_id, 0) + 5 * @forked_myshixun_count_map.fetch(shixun_id, 0)
|
||||
end
|
||||
|
||||
total_shixun_score += score
|
||||
|
||||
json.creator shixun.user.real_name
|
||||
json.creator_login shixun.user.login
|
||||
json.shixun_name shixun.name
|
||||
json.shixun_identifier shixun.identifier
|
||||
json.forked shixun.fork_from.present?
|
||||
json.myshixuns_count shixun.myshixuns_count
|
||||
json.forked_myshixun_count shixun['forked_myshixun_count'].to_i
|
||||
json.valid_count @myshixun_count_map.fetch(shixun.id, 0)
|
||||
json.score score
|
||||
end
|
||||
|
||||
json.shixun_count @shixuns.size
|
||||
json.total_myshixun_count total_myshixun_count
|
||||
json.total_forked_myshixun_count total_forked_myshixun_count
|
||||
json.total_valid_count @myshixun_count_map.values.reduce(:+)
|
||||
json.total_shixun_score total_shixun_score
|
@ -0,0 +1,18 @@
|
||||
|
||||
wb = xlsx_package.workbook
|
||||
# wb.use_autowidth = false
|
||||
wb.styles do |s|
|
||||
sz_all = s.add_style :border => { :style => :thin, :color =>"000000" },:alignment => {:horizontal => :center}
|
||||
blue_cell = s.add_style :bg_color => "FAEBDC", :sz => 10,:height => 20,:b => true, :border => { :style => :thin, :color =>"000000" },:alignment => {:horizontal => :center}
|
||||
wb.add_worksheet(:name => "比赛成绩") do |sheet|
|
||||
sheet.sheet_view.show_grid_lines = false
|
||||
sheet.add_row table_columns, :style => blue_cell
|
||||
if chart_lists.count > 0
|
||||
chart_lists.each do |user|
|
||||
sheet.add_row user, :height => 20,:style => sz_all
|
||||
end #each_widh_index
|
||||
end
|
||||
sheet.column_widths *([20]*sheet.column_info.count)
|
||||
sheet.column_info.first.width = 12
|
||||
end #add_worksheet
|
||||
end
|
@ -0,0 +1,5 @@
|
||||
json.rule_contents @rule_contents.each do |rule|
|
||||
json.(rule, :id, :content, :competition_stage_id)
|
||||
end
|
||||
|
||||
json.stages chart_stages @competition
|
@ -0,0 +1,21 @@
|
||||
json.user_ranks @user_ranks.each do |user_rank|
|
||||
rank = @records.map(&:id).index(user_rank.id)
|
||||
rank = rank.present? ? (rank+1) : 0
|
||||
json.rank rank == 0 ? "--" : user_rank.rank
|
||||
json.team_name user_rank.name
|
||||
json.user_name user_rank.user.real_name
|
||||
json.cost_time rank == 0 && user_rank.cost_time ? "--" : com_spend_time(user_rank.cost_time)
|
||||
json.score rank == 0 ? "--" : user_rank.score.round(2)
|
||||
end
|
||||
|
||||
json.teams @records.each do |record|
|
||||
record_user = record.user
|
||||
json.team_name record.name
|
||||
json.record_user_name record_user.real_name
|
||||
json.user_image url_to_avatar(record_user)
|
||||
json.user_login record_user.login
|
||||
school_name = chart_school_str record.team_members.select{|member| !member.is_teacher}.pluck(:user_id)
|
||||
json.school_name school_name
|
||||
json.score record&.score&.round(2)
|
||||
json.spend_time record.cost_time ? com_spend_time(record.cost_time) : "--"
|
||||
end
|
@ -0,0 +1,24 @@
|
||||
json.extract! @competition, :id, :name, :sub_title, :identifier, :bonus, :mode
|
||||
json.visits_count @competition.visits
|
||||
member_count = @competition.team_members.count
|
||||
json.member_count member_count.zero? ? 268 : member_count
|
||||
|
||||
json.start_time @competition.start_time&.strftime("%Y-%m-%d")
|
||||
json.end_time @competition.end_time&.strftime("%Y-%m-%d")
|
||||
json.enroll_end_time @competition.enroll_end_time&.strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
||||
json.published @competition.published?
|
||||
json.nearly_published @competition.published_at.present?
|
||||
|
||||
json.competition_modules @competition_modules do |com_module|
|
||||
json.(com_module, :name, :position)
|
||||
json.module_url com_module.module_url
|
||||
end
|
||||
|
||||
json.stages
|
||||
|
||||
if @competition.mode == 1
|
||||
json.course_id @competition.competition_mode_setting&.course_id
|
||||
json.member_of_course @user.member_of_course?(@competition.competition_mode_setting&.course)
|
||||
end
|
||||
|
@ -0,0 +1,6 @@
|
||||
json.informs @informs.each do |inform|
|
||||
json.(inform, :id, :name, :description)
|
||||
json.attachments inform.attachments do |atta|
|
||||
json.partial! "attachments/attachment_simple", locals: {attachment: atta}
|
||||
end
|
||||
end
|
@ -0,0 +1,4 @@
|
||||
json.(@md_content, :id, :name, :content)
|
||||
json.attachments @md_content.attachments do |atta|
|
||||
json.partial! "attachments/attachment_simple", locals: {attachment: atta}
|
||||
end
|
@ -1,36 +1,2 @@
|
||||
competition = current_competition
|
||||
json.extract! competition, :id, :name, :sub_title, :identifier
|
||||
|
||||
json.start_time competition.display_start_time
|
||||
json.end_time competition.display_end_time
|
||||
json.enroll_end_time competition.display_enroll_end_time
|
||||
|
||||
json.images do
|
||||
json.array! competition.attachments, partial: 'attachments/attachment_simple', as: :attachment
|
||||
end
|
||||
|
||||
json.competition_stages do
|
||||
stages = competition.competition_stages.includes(competition_stage_sections: :competition_entries)
|
||||
json.array! stages.each do |stage|
|
||||
json.extract! stage, :id, :name
|
||||
|
||||
json.sections do
|
||||
json.array! stage.competition_stage_sections.each do |section|
|
||||
json.extract! section, :id, :name
|
||||
|
||||
decorator_section = ActiveDecorator::Decorator.instance.decorate(section)
|
||||
json.start_time decorator_section.display_start_time
|
||||
json.end_time decorator_section.display_end_time
|
||||
|
||||
is_start = section.start_time > Time.now
|
||||
json.entries do
|
||||
json.array! section.competition_entries.each do |entry|
|
||||
json.extract! entry, :id, :name
|
||||
|
||||
json.url is_start ? entry.url : ''
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
json.extract! @competition, :id, :introduction
|
||||
json.image_url url_to_avatar(@competition)
|
@ -1,3 +1,4 @@
|
||||
admins-mirror_scripts: 'admins-mirror_repositories'
|
||||
admins-laboratory_settings: 'admins-laboratories'
|
||||
admins-carousels: 'admins-laboratories'
|
||||
admins-carousels: 'admins-laboratories'
|
||||
admins-competition_settings: 'admins-competitions'
|
@ -0,0 +1,7 @@
|
||||
class AddCompetitionIdToModeSetting < ActiveRecord::Migration[5.2]
|
||||
def change
|
||||
add_column :competition_mode_settings, :competition_id, :integer
|
||||
|
||||
add_index :competition_mode_settings, :competition_id
|
||||
end
|
||||
end
|
@ -0,0 +1,29 @@
|
||||
class MigrateCompetitionScore < ActiveRecord::Migration[5.2]
|
||||
def change
|
||||
CompetitionModule.where(name: "排行榜", hidden: 0).each do |com_module|
|
||||
competition = com_module.competition
|
||||
if competition.present?
|
||||
puts competition.id
|
||||
if competition.identifier == 'hn' || competition.identifier == 'gcc-task-2019'
|
||||
p_rate = 0.2
|
||||
f_rate = 0.8
|
||||
else
|
||||
p_rate = 0.15
|
||||
f_rate = 0.85
|
||||
end
|
||||
pre_stage = competition.competition_stages.where(:name => "预赛").first
|
||||
final_stage = competition.competition_stages.where(:name => "决赛").first
|
||||
|
||||
competition.competition_teams.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
|
||||
s_score = (f_score.try(:score).to_f * f_rate + p_score.try(:score).to_f * p_rate).try(:round, 2)
|
||||
s_spend_time = f_score.try(:cost_time).to_i + p_score.try(:cost_time).to_i
|
||||
CompetitionScore.create(:user_id => team.user_id, :competition_team_id => team.id, :competition_id => competition.id,
|
||||
:competition_stage_id => 0, :score => s_score, :cost_time => s_spend_time)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
@ -0,0 +1,12 @@
|
||||
class CreateCompetitionAwards < ActiveRecord::Migration[5.2]
|
||||
def change
|
||||
create_table :competition_awards do |t|
|
||||
t.references :competition, index: true
|
||||
t.string :name
|
||||
t.integer :num, default: 0
|
||||
t.integer :award_type, default: 0
|
||||
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
@ -0,0 +1,5 @@
|
||||
class AddRateToCompetitionStage < ActiveRecord::Migration[5.2]
|
||||
def change
|
||||
add_column :competition_stages, :rate, :float, default: 1.0
|
||||
end
|
||||
end
|
@ -0,0 +1,12 @@
|
||||
class CreateModuleSettings < ActiveRecord::Migration[5.2]
|
||||
def change
|
||||
create_table :module_settings do |t|
|
||||
t.string :module_type
|
||||
t.string :property
|
||||
|
||||
t.timestamps
|
||||
end
|
||||
|
||||
add_index :module_settings, :module_type
|
||||
end
|
||||
end
|
@ -0,0 +1,5 @@
|
||||
class ChangeColumnCompetitionStage < ActiveRecord::Migration[5.2]
|
||||
def change
|
||||
rename_column :competition_stages, :rate, :score_rate
|
||||
end
|
||||
end
|
@ -0,0 +1,5 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe ChartRule, type: :model do
|
||||
pending "add some examples to (or delete) #{__FILE__}"
|
||||
end
|
@ -0,0 +1,5 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe CompetitionAward, type: :model do
|
||||
pending "add some examples to (or delete) #{__FILE__}"
|
||||
end
|
@ -0,0 +1,5 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe CompetitionScore, type: :model do
|
||||
pending "add some examples to (or delete) #{__FILE__}"
|
||||
end
|
@ -0,0 +1,5 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe ModuleSetting, type: :model do
|
||||
pending "add some examples to (or delete) #{__FILE__}"
|
||||
end
|
Loading…
Reference in new issue