diff --git a/app/controllers/competition_teams_controller.rb b/app/controllers/competition_teams_controller.rb index 2bbbd6ef..72732a1a 100644 --- a/app/controllers/competition_teams_controller.rb +++ b/app/controllers/competition_teams_controller.rb @@ -17,7 +17,8 @@ class CompetitionTeamsController < ApplicationController @team_user_ids = @team.team_members.pluck(:user_id) - shixuns = Shixun.where(user_id: @team_user_ids, status: 2).where('shixuns.created_at > ?', Time.parse('2018-06-01')) + shixuns = Shixun.where(user_id: @team_user_ids, status: 2) + .where('shixuns.created_at > ? && shixuns.created_at <= ?', Time.parse('2018-06-01'), @competition.end_time) shixuns = shixuns.joins('left join shixuns forked_shixuns on forked_shixuns.fork_from = shixuns.id and forked_shixuns.status = 2') shixuns = shixuns.select('shixuns.id, shixuns.identifier, shixuns.user_id, shixuns.myshixuns_count, shixuns.name, shixuns.fork_from, sum(forked_shixuns.myshixuns_count) forked_myshixun_count') @shixuns = shixuns.group('shixuns.id').order('shixuns.myshixuns_count desc').includes(:creator) @@ -30,18 +31,30 @@ class CompetitionTeamsController < ApplicationController forked_myshixun_count_map = get_valid_myshixun_count(forked_shixun_map.keys) forked_myshixun_count_map.each { |k, v| @myshixun_count_map[forked_shixun_map[k]] += v } - # todo:使用新版course_members + @course_count_map = get_valid_course_count(shixun_ids) + forked_map = get_valid_course_count(forked_shixun_map.keys) + @forked_course_count_map = {} + forked_map.each do |forked_id, course_count| + @forked_course_count_map[forked_shixun_map[forked_id]] ||= 0 + @forked_course_count_map[forked_shixun_map[forked_id]] += course_count + end + + + # 课堂 course_ids = Course.where('courses.created_at > ?', Time.parse('2018-06-01')) + .where('courses.created_at <= ?', @competition.end_time) .joins('join course_members on course_members.course_id = courses.id and course_members.role in (1,2,3)') .where(course_members: { user_id: @team_user_ids }).pluck(:id) courses = Course.where(id: course_ids).joins(:shixun_homework_commons).where('homework_commons.publish_time < now()') @courses = courses.select('courses.id, courses.name, courses.members_count, count(*) shixun_homework_count') .group('courses.id').order('shixun_homework_count desc').having('shixun_homework_count > 0') + course_ids = @courses.map(&:id) @course_myshixun_map = Myshixun.joins(student_works: :homework_common) - .where(homework_commons: { course_id: @courses.map(&:id) }) + .where(homework_commons: { course_id: course_ids }) .where('exists(select 1 from games where games.myshixun_id = myshixuns.id and games.status = 2)') .group('homework_commons.course_id').count + @course_shixun_count_map = get_valid_shixun_count(course_ids) end def search_teacher @@ -345,6 +358,28 @@ class CompetitionTeamsController < ApplicationController .group('shixun_id').count end + def get_valid_course_count(ids) + percentage_sql = StudentWork.where('homework_common_id = homework_commons.id') + .select('count(compelete_status !=0 ) as finish, count(*) as total') + .having('finish > (total / 2)').to_sql + + Course.joins(shixun_homework_commons: :homework_commons_shixuns) + .where('shixun_id in (?)', ids) + .where("exists (#{percentage_sql})") + .group('shixun_id').count + end + + def get_valid_shixun_count(ids) + percentage_sql = StudentWork.where('homework_common_id = homework_commons.id') + .select('count(compelete_status !=0 ) as finish, count(*) as total') + .having('finish > (total / 2)').to_sql + Shixun.joins(homework_commons_shixuns: :homework_common) + .where(homework_commons: { homework_type: 3 }) + .where('course_id in (?)', ids) + .where("exists (#{percentage_sql})") + .group('course_id').count + end + def record_agent_user_action # 记录是否是引流用户的行为 ip = request.remote_ip diff --git a/app/models/shixun.rb b/app/models/shixun.rb index 0d201ed3..35193f2d 100644 --- a/app/models/shixun.rb +++ b/app/models/shixun.rb @@ -32,7 +32,7 @@ class Shixun < ActiveRecord::Base has_many :users, :through => :shixun_members has_many :shixun_members, :dependent => :destroy has_one :repository, :dependent => :destroy - has_many :homework_commons_shixunses + has_many :homework_commons_shixuns, class_name: 'HomeworkCommonsShixuns' has_many :homework_challenge_settings, :dependent => :destroy has_many :challenges, :dependent => :destroy has_many :myshixuns, :dependent => :destroy diff --git a/app/views/competition_teams/show.html.erb b/app/views/competition_teams/show.html.erb index 129fa32a..f8e1f1c5 100644 --- a/app/views/competition_teams/show.html.erb +++ b/app/views/competition_teams/show.html.erb @@ -20,11 +20,23 @@ <% total_myshixun_count = 0 total_forked_myshixun_count = 0 + total_shixun_score = 0 %> <% @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 = @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 + score += @forked_course_count_map.fetch(shixun.id, 0) + total_shixun_score += score %> <%= shixun.creator.show_real_name %> @@ -39,7 +51,7 @@ <%= shixun.myshixuns_count.to_i.zero? ? '--' : shixun.myshixuns_count.to_i %> <%= shixun['forked_myshixun_count'].to_i.zero? ? '--' : shixun['forked_myshixun_count'].to_i %> <%= @myshixun_count_map.fetch(shixun.id, '--') %> - -- + <%= score.zero? ? '--' : score %> <% end %> @@ -50,7 +62,7 @@ <%= total_myshixun_count %> <%= total_forked_myshixun_count %> <%= @myshixun_count_map.values.reduce(:+) %> - -- + <%= total_shixun_score %> @@ -73,11 +85,15 @@ <% total_members_count = 0 total_shixun_homework_count = 0 + total_course_score = 0 %> <% @courses.each do |course| %> <% total_members_count += course.members_count.to_i 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 %> <%= course.teachers.where(user_id: @team_user_ids).first.user.show_real_name %> @@ -89,7 +105,7 @@ <%= course.members_count %> <%= course['shixun_homework_count'].presence || '--' %> <%= @course_myshixun_map.fetch(course.id, '--') %> - -- + <%= score.zero? ? '--' : score %> <% end %> @@ -99,8 +115,8 @@ <%= @courses.size %> <%= total_members_count %> <%= total_shixun_homework_count %> - <%= @course_myshixun_map.values.reduce(:+) %> - -- + <%= @course_myshixun_map.values.reduce(:+) || 0 %> + <%= total_course_score %>