From b5eb7c13541b3efcb9358de4d45d5ac72abeb73f Mon Sep 17 00:00:00 2001 From: Alec Zhou Date: Mon, 29 Apr 2019 08:29:23 +0800 Subject: [PATCH 01/18] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86before=5Ffilte?= =?UTF-8?q?r=E7=9A=84=E4=BD=9C=E7=94=A8=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 2 +- app/controllers/challenges_controller.rb | 2 +- app/controllers/oauth_controller.rb | 14 +++++++++----- app/controllers/shixuns_controller.rb | 2 -- app/controllers/subjects_controller.rb | 2 +- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index b1a66080..7f1383bc 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1149,7 +1149,7 @@ class ApplicationController < ActionController::Base redirect_to authorize_url end - def user_login_and_from_openi + def user_login_and_from_openi? url = request.referer.nil? ? Redmine::Configuration['educoder_domain'] : request.referer flag = URI(url).host == URI(Redmine::Configuration['openi_domain']).host && !current_user.logged? logger.info "----------------------- request referer: #{request.referer} -------------------------" diff --git a/app/controllers/challenges_controller.rb b/app/controllers/challenges_controller.rb index 13bfc188..685f9f74 100644 --- a/app/controllers/challenges_controller.rb +++ b/app/controllers/challenges_controller.rb @@ -2,7 +2,7 @@ class ChallengesController < ApplicationController layout "base_shixun" # 如要添加或修改before_filter时,请将handle_openi_request这个before_filter放至第一位 - # before_filter :handle_openi_request, if: -> { user_login_and_from_openi } + before_filter :handle_openi_request, if: -> { user_login_and_from_openi? }, only: [:index] before_filter :check_authentication, :except => [:index] before_filter :find_shixun, :only => [:index, :new, :create, :destroy, :challenge_build, :update_evaluation, :add_choose_question, :new_choose_question, :choose_type_show, :edit_choose_question, :update_choose_question, :destroy_challenge_choose] diff --git a/app/controllers/oauth_controller.rb b/app/controllers/oauth_controller.rb index 64867d55..930f2b75 100644 --- a/app/controllers/oauth_controller.rb +++ b/app/controllers/oauth_controller.rb @@ -154,9 +154,9 @@ class OauthController < ApplicationController ####--Start-- 获取Openi的授权码,access_token,以及用户信息。为在openi登录的用户创建相关的educoder用户 #### IDENTITY_SITE = Redmine::Configuration['openi_domain'] ROOT_URL = Redmine::Configuration['educoder_domain'] - DEFAULT_PASSWORD = "a12345678" - TOKEN_CALL_BACK = "/oauth/get_token_callback" - USER_INFO = "/oauth/userinfo" + DEFAULT_PASSWORD = 'a12345678'.freeze + TOKEN_CALL_BACK = '/oauth/get_token_callback'.freeze + USER_INFO = '/oauth/userinfo'.freeze def get_code # 从OpenI发过来的回调中获取授权码 @@ -183,6 +183,10 @@ class OauthController < ApplicationController openi = Openi.find_by_login(login) unless openi ActiveRecord::Base.transaction do + # 如果Educoder中已存在与该OpenI用户的邮箱相同的用户,则会直接跳转到登录educoder的登录页面 + existing_user = User.find_by_mail(email) + break if existing_user.present? + user = User.new(lastname: name, mail: email, mail_notification: email) user.login = custom_openi_login(login) user.password = DEFAULT_PASSWORD @@ -196,7 +200,7 @@ class OauthController < ApplicationController end end - self.logged_user = openi.user + self.logged_user = openi.user if openi.present? && openi.user.present? original_url = params[:original_url] redirect_to original_url end @@ -208,7 +212,7 @@ class OauthController < ApplicationController private # 为了保证新创建的用户用户名不与系统中已存在的用户冲突,加上 _openi 后缀 def custom_openi_login(login) - login + "_openi" + login + '_openi' end def require_login diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index 20f0f203..f6578f18 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -2,8 +2,6 @@ # REDO: 创建版本库权限控制 class ShixunsController < ApplicationController layout 'base_shixun' - # 如要添加或修改before_filter时,请将handle_openi_request这个before_filter放至第一位 - # before_filter :handle_openi_request, if: -> { user_login_and_from_openi } before_filter :require_login, :except => [:ghook, :download_file, :show, :index] before_filter :check_authentication, :except => [:ghook, :download_file, :show, :index] before_filter :find_shixun, :except => [ :index, :new, :create, :index, :search, :shixun_courses, :new_disscuss, :shixun_migrate, :qrcode, :download_file, :departments, :get_mirror_script, :send_message_to_administrator] diff --git a/app/controllers/subjects_controller.rb b/app/controllers/subjects_controller.rb index d9d4a24c..61e56f9a 100644 --- a/app/controllers/subjects_controller.rb +++ b/app/controllers/subjects_controller.rb @@ -2,7 +2,7 @@ class SubjectsController < ApplicationController layout 'base_subject' # 如要添加或修改before_filter时,请将handle_openi_request这个before_filter放至第一位 - # before_filter :handle_openi_request, if: -> { user_login_and_from_openi } + before_filter :handle_openi_request, if: -> { user_login_and_from_openi? }, only: [:show] before_filter :require_login, :except => [:show, :index] before_filter :check_authentication, :except => [:show, :index] before_filter :find_subject, :except => [:index, :new, :create, :create_subject, :new_subject, :append_to_stage, :send_to_course] From 0817dc9e86196df0cb019f1bcf406746401eba1f Mon Sep 17 00:00:00 2001 From: p31729568 Date: Mon, 29 Apr 2019 16:44:52 +0800 Subject: [PATCH 02/18] remove whenever gem --- Gemfile | 3 --- config/schedule.rb | 24 -------------------- lib/tasks/statistic_school_daily_report.rake | 5 ++++ 3 files changed, 5 insertions(+), 27 deletions(-) delete mode 100644 config/schedule.rb diff --git a/Gemfile b/Gemfile index 9ff7d11f..b9e1b4e2 100644 --- a/Gemfile +++ b/Gemfile @@ -62,9 +62,6 @@ gem 'elasticsearch-rails' gem 'oauth2' -# cronjob -gem 'whenever', require: false - #Ruby 2.2+ has removed test/unit from the core library. if RUBY_VERSION>='2.2' gem 'test-unit', '~> 3.0' diff --git a/config/schedule.rb b/config/schedule.rb deleted file mode 100644 index 380494c6..00000000 --- a/config/schedule.rb +++ /dev/null @@ -1,24 +0,0 @@ -# Use this file to easily define all of your cron jobs. -# -# It's helpful, but not entirely necessary to understand cron before proceeding. -# http://en.wikipedia.org/wiki/Cron - -# Example: -# -# set :output, "/path/to/my/cron_log.log" -# -# every 2.hours do -# command "/usr/bin/some_great_command" -# runner "MyModel.some_method" -# rake "some:great:rake:task" -# end -# -# every 4.days do -# runner "AnotherModel.prune_old_records" -# end - -# Learn more: http://github.com/javan/whenever - -every 1.days, at: '5:00 am' do - runner 'StatisticSchoolDailyReportTask.new.call' -end diff --git a/lib/tasks/statistic_school_daily_report.rake b/lib/tasks/statistic_school_daily_report.rake index 84b65204..67604fff 100644 --- a/lib/tasks/statistic_school_daily_report.rake +++ b/lib/tasks/statistic_school_daily_report.rake @@ -1,6 +1,11 @@ #coding=utf-8 namespace :school_daily_report do + desc 'daily statistic school task' + task daily_statistic: :environment do + StatisticSchoolDailyReportTask.new.call + end + desc 'statistic school daily report data before now' task :statistic, [:date] => :environment do |_, args| date = Time.zone.parse(args[:date]).beginning_of_day From 8cce3e27ba4a63693627e1ca233dab05280e8217 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 29 Apr 2019 16:57:27 +0800 Subject: [PATCH 03/18] =?UTF-8?q?=E9=9A=90=E8=97=8F=E5=92=8C=E5=B7=B2?= =?UTF-8?q?=E7=BB=8F=E5=88=A0=E9=99=A4=E7=9A=84=E5=AE=9E=E8=AE=AD=EF=BC=8C?= =?UTF-8?q?=E4=B8=8D=E8=83=BD=E9=80=9A=E8=BF=87=E8=BF=9E=E6=8E=A5=E8=AE=BF?= =?UTF-8?q?=E9=97=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/challenges_controller.rb | 2 +- app/models/shixun.rb | 7 ++++++- app/services/games_service.rb | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/controllers/challenges_controller.rb b/app/controllers/challenges_controller.rb index 685f9f74..df1da6ca 100644 --- a/app/controllers/challenges_controller.rb +++ b/app/controllers/challenges_controller.rb @@ -467,7 +467,7 @@ class ChallengesController < ApplicationController render_404 return else - if (@shixun.status == 0 && !User.current.manager_of_shixun?(@shixun)) || @shixun.status == -1 + if (@shixun.status == 0 && !User.current.manager_of_shixun?(@shixun)) || (!@shixun.operable? && !User.current.admin?) render_403 return end diff --git a/app/models/shixun.rb b/app/models/shixun.rb index 54882be1..c7d0460a 100644 --- a/app/models/shixun.rb +++ b/app/models/shixun.rb @@ -62,13 +62,18 @@ class Shixun < ActiveRecord::Base include ApplicationHelper has_many :tidings, :as => :container, :dependent => :destroy - scope :visible, -> { where(status: -1) } + #scope :visible, -> { where(status: -1) } after_create :send_tiding def should_compile? self.mirror_repositories.published_main_mirror.first.try(:should_compile) end + # 可供使用的实训 + def operable? + self.status != -1 && !self.hidden + end + def is_published? self.status > 1 ? true : false end diff --git a/app/services/games_service.rb b/app/services/games_service.rb index bddb03b7..f172edbd 100644 --- a/app/services/games_service.rb +++ b/app/services/games_service.rb @@ -17,7 +17,8 @@ class GamesService myshixun = Myshixun.min.find(game.myshixun_id) shixun = Shixun.min.find(myshixun.shixun_id) - unless (myshixun.user_id == current_user.id || current_user.admin? || current_user.business? || current_user.id == shixun.try(:user_id) || current_user.is_certification_teacher) + unless ((myshixun.user_id == current_user.id || current_user.business? || current_user.id == shixun.try(:user_id) || + current_user.is_certification_teacher) && (shixun.operable?)) || current_user.admin? return{:status => 403} end game_challenge = Challenge.min.find(game.challenge_id) From 5002fd8a5cc6a31f6c91b7996379e1dd6fd6e9f6 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 30 Apr 2019 09:45:32 +0800 Subject: [PATCH 04/18] =?UTF-8?q?=E6=90=9C=E7=B4=A2=E5=AE=9E=E8=AE=AD?= =?UTF-8?q?=E6=97=B6=E8=BF=87=E6=BB=A4=E6=8E=89=E5=88=A0=E9=99=A4=E7=9A=84?= =?UTF-8?q?=E5=AE=9E=E8=AE=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 8c7a1278..64e7aa86 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -940,7 +940,7 @@ class UsersController < ApplicationController @limit = 16 if 1 == @index # @shixuns_result = Shixun.where(:status => [2,3]).where("name like ?", "%#{@search}%").reorder("created_at desc") - @shixuns_result = Shixun.where("name like ? and hidden=0", "%#{@search}%").reorder("myshixuns_count desc") + @shixuns_result = Shixun.where("name like ? and hidden=0 and status != -1", "%#{@search}%").reorder("myshixuns_count desc") @shixuns_result_count = @shixuns_result.count @shixun_pages = Paginator.new @shixuns_result_count, @limit, params['page'] || 1 @offset ||= @shixun_pages.offset From fdec1f663debf88a13bb825aefc1bb864dfb1147 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 30 Apr 2019 10:51:11 +0800 Subject: [PATCH 05/18] =?UTF-8?q?=E8=B6=85=E7=BA=A7=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=98=E7=9A=84=E8=AF=95=E7=94=A8=E6=8E=88=E6=9D=83=E2=80=9C?= =?UTF-8?q?=E5=B7=B2=E5=AE=A1=E6=89=B9=E2=80=9D=E5=A2=9E=E5=8A=A0=E5=AD=A6?= =?UTF-8?q?=E9=99=A2=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/colleges_controller.rb | 58 ++++++++++--------- app/models/school.rb | 2 +- app/views/colleges/_student_eval.html.erb | 8 +-- app/views/colleges/statistics.html.erb | 8 +-- .../_trial_authorization_passed_list.html.erb | 2 +- 5 files changed, 40 insertions(+), 38 deletions(-) diff --git a/app/controllers/colleges_controller.rb b/app/controllers/colleges_controller.rb index df500de8..960030c9 100644 --- a/app/controllers/colleges_controller.rb +++ b/app/controllers/colleges_controller.rb @@ -44,31 +44,31 @@ class CollegesController < ApplicationController def statistics logger.info("#########################{params}") @teachers_count = User.find_by_sql("SELECT COUNT(users.`id`) AS teacher_count FROM users LEFT JOIN user_extensions ON users.id=user_extensions.user_id WHERE - user_extensions.`school_id` = #{@department.school_id} AND user_extensions.`identity` = 0").first.try(:teacher_count) + user_extensions.`school_id` = #{@school.id} AND user_extensions.`identity` = 0").first.try(:teacher_count) @students_count = User.find_by_sql("SELECT COUNT(users.`id`) AS student_count FROM users LEFT JOIN user_extensions ON users.id=user_extensions.user_id WHERE - user_extensions.`school_id` = #{@department.school_id} AND user_extensions.`identity` = 1").first.try(:student_count) + user_extensions.`school_id` = #{@school.id} AND user_extensions.`identity` = 1").first.try(:student_count) # Redo:这样做内存会卡死的 - # user_ids = User.find_by_sql("SELECT users.id FROM users LEFT JOIN user_extensions ON users.id=user_extensions.user_id WHERE user_extensions.`school_id` = #{@department.school_id}").map(&:id) + # user_ids = User.find_by_sql("SELECT users.id FROM users LEFT JOIN user_extensions ON users.id=user_extensions.user_id WHERE user_extensions.`school_id` = #{@school.id}").map(&:id) # Redo:是否直接使用count会更好 - all_course_ids = Course.joins("join users u on courses.tea_id = u.id").joins("join user_extensions ue on u.id = ue.user_id").where("courses.id != 1309 and ue.school_id = #{@department.school_id}") + all_course_ids = Course.joins("join users u on courses.tea_id = u.id").joins("join user_extensions ue on u.id = ue.user_id").where("courses.id != 1309 and ue.school_id = #{@school.id}") @courses_count = all_course_ids.size # Redo:对于量比较大的尽量不使用笛卡尔积 # @shixuns_count = Shixun.where(:status => [2, 3], :user_id => user_ids).size @shixuns_count = Shixun.find_by_sql("select count(s.id) as shixun_count from users u right join shixuns s on u.id=s.user_id and s.status in (2, 3) inner join user_extensions ue on - u.id=ue.user_id and ue.school_id=#{@department.school_id}").first.try(:shixun_count) + u.id=ue.user_id and ue.school_id=#{@school.id}").first.try(:shixun_count) # @shixun_time_sum = (Game.where(:user_id => user_ids).pluck(:cost_time).sum / (24*60*60.0)).ceil @shixun_time_sum = (Game.find_by_sql("select sum(g.cost_time) cost_time from users u RIGHT join games g on u.id=g.user_id inner join user_extensions ue on - u.id=ue.user_id and ue.school_id=#{@department.school_id}").first.try(:cost_time).to_i / (24 * 60 * 60.0)).ceil + u.id=ue.user_id and ue.school_id=#{@school.id}").first.try(:cost_time).to_i / (24 * 60 * 60.0)).ceil # select count(sw.id) from users u left join student_works sw on u.id=sw.user_id and sw.myshixun_id is not null and sw.work_status !=0 inner join user_extensions ue on u.id=ue.user_id and ue.school_id=117 ; # @shixun_report_count = StudentWork.where("work_status != 0 and user_id in (#{user_ids.join(',').strip == "" ? -1 : user_ids.join(',')}) and myshixun_id is not null").count @shixun_report_count = StudentWork.find_by_sql("SELECT count(*) as sw_count FROM `student_works` where user_id in (SELECT users.id FROM users RIGHT JOIN user_extensions ON users.id=user_extensions.user_id WHERE - user_extensions.`school_id`=#{@department.school_id}) and work_status between 1 and 2 and myshixun_id !=0").first.try(:sw_count) + user_extensions.`school_id`=#{@school.id}) and work_status between 1 and 2 and myshixun_id !=0").first.try(:sw_count) @teachers = User.find_by_sql("SELECT users.id, users.login, users.lastname, users.firstname, users.nickname, IFNULL((SELECT count(shixuns.id) FROM shixuns where shixuns.user_id =users.id group by shixuns.user_id), 0) AS publish_shixun_count, (SELECT count(c.id) FROM courses c, members m, member_roles mr WHERE m.course_id = c.id AND m.id=mr.member_id AND mr.role_id in (3,7,9) AND m.user_id=users.id AND c.is_delete = 0) as course_count - FROM `users`, user_extensions ue where users.id=ue.user_id and ue.identity=0 and ue.school_id=#{@department.school_id} ORDER BY publish_shixun_count desc, course_count desc, id desc LIMIT 10") + FROM `users`, user_extensions ue where users.id=ue.user_id and ue.identity=0 and ue.school_id=#{@school.id} ORDER BY publish_shixun_count desc, course_count desc, id desc LIMIT 10") # ).order("publish_shixun_count desc, experience desc").limit(10) @teachers = @teachers.map do |teacher| @@ -131,7 +131,7 @@ class CollegesController < ApplicationController (select count(m.id) from messages m inner join boards b on b.id=m.board_id and b.parent_id=0 where b.course_id=c.id group by c.id) as messages_count, c.tea_id, c.name, c.is_end, (SELECT MAX(created_at) FROM `course_activities` ca WHERE ca.course_id = c.id) AS update_time - FROM `courses` c WHERE (c.school_id = #{@department.school_id} and c.is_delete = 0)") + FROM `courses` c WHERE (c.school_id = #{@school.id} and c.is_delete = 0)") @courses.each do |course| course[:evaluating_count] = Output.find_by_sql("select sum(g.evaluate_count) as evaluating_count from games g inner join @@ -157,11 +157,11 @@ class CollegesController < ApplicationController # 学生实训 def student_shixun - user_ids = User.find_by_sql("SELECT users.id FROM users, user_extensions WHERE users.id=user_extensions.user_id AND user_extensions.`school_id` = #{@department.school_id}").map(&:id) + user_ids = User.find_by_sql("SELECT users.id FROM users, user_extensions WHERE users.id=user_extensions.user_id AND user_extensions.`school_id` = #{@school.id}").map(&:id) @students = User.find_by_sql("SELECT users.id, users.login, users.lastname, users.firstname, users.nickname, users.grade, users.experience, ue.student_id, (SELECT COUNT(myshixuns.id) FROM `myshixuns` WHERE myshixuns.user_id = users.id AND myshixuns.status = 1 GROUP BY users.id) AS myshixun_count FROM users join user_extensions ue on - users.id = ue.user_id where ue.school_id = #{@department.school_id} AND ue.identity = 1 AND `users`.`type` IN ('User', 'AnonymousUser') ORDER BY experience DESC, myshixun_count DESC LIMIT 10") + users.id = ue.user_id where ue.school_id = #{@school.id} AND ue.identity = 1 AND `users`.`type` IN ('User', 'AnonymousUser') ORDER BY experience DESC, myshixun_count DESC LIMIT 10") ## outputs基数过大,用inner join有奇效 @shixun_tags = TagRepertoire.find_by_sql(%Q{ @@ -172,7 +172,7 @@ class CollegesController < ApplicationController AND str.shixun_id = myshixuns.`shixun_id` AND myshixuns.id = games.`myshixun_id` AND myshixuns.`user_id` IN ( - SELECT users.id FROM users, user_extensions WHERE users.id=user_extensions.user_id AND user_extensions.`school_id` = #{@department.school_id} + SELECT users.id FROM users, user_extensions WHERE users.id=user_extensions.user_id AND user_extensions.`school_id` = #{@school.id} ) ) a on a.id = outputs.game_id and outputs.`test_set_position` = 1 group by trid ORDER BY test_count DESC @@ -197,50 +197,50 @@ class CollegesController < ApplicationController @eval_data = [] case @index when "day" - same_count = Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@department.school_id}) b + same_count = Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@school.id}) b ON outputs.`game_id` = b.id WHERE outputs.test_set_position = 1 AND outputs.created_at > '#{(end_day - 365.days).beginning_of_day}' AND outputs.created_at < '#{(end_day - 365.days).end_of_day}'").first.try(:count).to_i - last_count = Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@department.school_id}) b + last_count = Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@school.id}) b ON outputs.`game_id` = b.id WHERE outputs.test_set_position = 1 AND outputs.created_at > '#{(end_day - 1.day).beginning_of_day}' AND outputs.created_at < '#{(end_day - 1.day).end_of_day}'").first.try(:count).to_i @time_range = "#{end_day.strftime("%Y-%m-%d")}~#{end_day.strftime("%Y-%m-%d")}" @time_data = ["2:00", "4:00", "6:00", "8:00", "10:00", "12:00", "14:00", "16:00", "18:00", "20:00", "22:00", "24:00"] for i in 0..11 - @eval_data << Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@department.school_id}) b + @eval_data << Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@school.id}) b ON outputs.`game_id` = b.id WHERE outputs.test_set_position = 1 AND outputs.created_at > '#{end_day.beginning_of_day + (i * 2).hour}' AND outputs.created_at < '#{end_day.beginning_of_day + ((i + 1) * 2).hour}'").first.try(:count).to_i end when "week" start_day = end_day - 6.days - same_count = Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@department.school_id}) b + same_count = Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@school.id}) b ON outputs.`game_id` = b.id WHERE outputs.test_set_position = 1 AND outputs.created_at > '#{(start_day - 365.days).beginning_of_day}' AND outputs.created_at < '#{(end_day - 365.days).end_of_day}'").first.try(:count).to_i - last_count = Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@department.school_id}) b + last_count = Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@school.id}) b ON outputs.`game_id` = b.id WHERE outputs.test_set_position = 1 AND outputs.created_at > '#{(start_day - 7.days).beginning_of_day}' AND outputs.created_at < '#{(end_day - 7.days).end_of_day}'").first.try(:count).to_i @time_range = "#{start_day.strftime("%Y-%m-%d")}~#{end_day.strftime("%Y-%m-%d")}" for i in 0..6 @time_data << (start_day + i.days).strftime("%m.%d") - @eval_data << Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@department.school_id}) b + @eval_data << Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@school.id}) b ON outputs.`game_id` = b.id WHERE outputs.test_set_position = 1 AND outputs.created_at > '#{(start_day + i.days).beginning_of_day}' AND outputs.created_at < '#{(start_day + (i + 1).days).end_of_day}'").first.try(:count).to_i end when "mon" start_day = end_day - 30.days - same_count = Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@department.school_id}) b + same_count = Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@school.id}) b ON outputs.`game_id` = b.id WHERE outputs.test_set_position = 1 AND outputs.created_at > '#{(start_day - 365.days).beginning_of_day}' AND outputs.created_at < '#{(end_day - 365.days).end_of_day}'").first.try(:count).to_i - last_count = Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@department.school_id}) b + last_count = Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@school.id}) b ON outputs.`game_id` = b.id WHERE outputs.test_set_position = 1 AND outputs.created_at > '#{(start_day - 30.days).beginning_of_day}' AND outputs.created_at < '#{(end_day - 30.days).end_of_day}'").first.try(:count).to_i @time_range = "#{start_day.strftime("%Y-%m-%d")}~#{end_day.strftime("%Y-%m-%d")}" for i in 0..9 @time_data << (start_day + (3 * i).days).strftime("%m.%d") - @eval_data << Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@department.school_id}) b + @eval_data << Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@school.id}) b ON outputs.`game_id` = b.id WHERE outputs.test_set_position = 1 AND outputs.created_at > '#{(start_day + (3 * i).days).beginning_of_day}' AND outputs.created_at < '#{(start_day + (3 * (i + 1)).days).end_of_day}'").first.try(:count).to_i end when "year" start_day = end_day - 365.days - same_count = Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@department.school_id}) b + same_count = Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@school.id}) b ON outputs.`game_id` = b.id WHERE outputs.test_set_position = 1 AND outputs.created_at > '#{(start_day - 365.days).beginning_of_day}' AND outputs.created_at < '#{(end_day - 365.days).end_of_day}'").first.try(:count).to_i last_count = same_count @time_range = "#{start_day.strftime("%Y-%m-%d")}~#{end_day.strftime("%Y-%m-%d")}" for i in 0..11 @time_data << (start_day + i.month).strftime("%m.%d") - @eval_data << Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@department.school_id}) b + @eval_data << Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@school.id}) b ON outputs.`game_id` = b.id WHERE outputs.test_set_position = 1 AND outputs.created_at > '#{(start_day + i.days).beginning_of_day}' AND outputs.created_at < '#{(start_day + (i + 1).days).end_of_day}'").first.try(:count).to_i end end @@ -248,9 +248,9 @@ class CollegesController < ApplicationController @same_rate = (@new_count == 0 || same_count == 0) ? 0 : (@new_count * 1.0 / same_count - 1).to_f @last_rate = (@new_count == 0 || last_count == 0) ? 0 : (@new_count * 1.0 / last_count - 1).to_f - @total_count = Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@department.school_id}) b + @total_count = Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@school.id}) b ON outputs.`game_id` = b.id WHERE outputs.test_set_position = 1 ").first.try(:count).to_i - @trend_count = Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@department.school_id}) b + @trend_count = Output.find_by_sql("select count(outputs.id) as count from outputs RIGHT JOIN (SELECT games.id FROM games RIGHT JOIN user_extensions ue ON games.`user_id` = ue.`user_id` AND ue.`school_id`=#{@school.id}) b ON outputs.`game_id` = b.id WHERE outputs.test_set_position = 1 AND outputs.created_at > '#{Time.now - 7.days}'").first.try(:count).to_i end @@ -259,9 +259,9 @@ class CollegesController < ApplicationController def manager_auth # unless (User.current.admin? || DepartmentMember.where(:user_id => User.current.id, :department_id => @department.id).first.present?) unless (User.current.admin? || User.current.business? || - DepartmentMember.where(:user_id => User.current.id, :department_id => @department.id).first.present? || - (User.current.user_extensions.try(:school_id) == @department.school_id && User.current.user_extensions.try(:identity) == 0) || - (@department.school.try(:customer_id) && User.current.try(:partner).try(:customer_ids) && User.current.try(:partner).try(:customer_ids).include?(@department.school.try(:customer_id)))) + (@department.present? && DepartmentMember.where(:user_id => User.current.id, :department_id => @department.id).first.present?) || + (User.current.user_extensions.try(:school_id) == @school.id && User.current.user_extensions.try(:identity) == 0) || + (@school.try(:customer_id) && User.current.try(:partner).try(:customer_ids) && User.current.try(:partner).try(:customer_ids).include?(@school.try(:customer_id)))) render_403 end end @@ -270,6 +270,8 @@ class CollegesController < ApplicationController @department = Department.find_by_identifier(params[:id]) if @department.present? @school = @department.school + else + @school = School.find_by_id(params[:id]) end rescue ActiveRecord::RecordNotFound render_404 diff --git a/app/models/school.rb b/app/models/school.rb index 021048fb..081f3c0c 100644 --- a/app/models/school.rb +++ b/app/models/school.rb @@ -64,7 +64,7 @@ class School < ActiveRecord::Base def statistic_url dep = departments.where("identifier is not null").first - url = dep.present? ? "/colleges/#{dep.identifier}/statistics" : "" + url = dep.present? ? "/colleges/#{dep.identifier}/statistics" : "/colleges/#{self.id}/statistics" end def course_act_time diff --git a/app/views/colleges/_student_eval.html.erb b/app/views/colleges/_student_eval.html.erb index 2f3d47bc..be5bd078 100644 --- a/app/views/colleges/_student_eval.html.erb +++ b/app/views/colleges/_student_eval.html.erb @@ -30,10 +30,10 @@
  • - ">日 - ">周 - ">月 - ">年 + ">日 + ">周 + ">月 + ">年
  • diff --git a/app/views/colleges/statistics.html.erb b/app/views/colleges/statistics.html.erb index e0d93cfa..15535571 100644 --- a/app/views/colleges/statistics.html.erb +++ b/app/views/colleges/statistics.html.erb @@ -44,15 +44,15 @@
  • <%= @shixuns_count %>
  • <%= @shixun_report_count %>
  • <%= @shixun_time_sum %>
  • -
  • <%= @department.host_count.to_i %>
  • +
  • <%= @department.present? ? @department.host_count.to_i : @school.departments.first.try(:host_count).to_i %>
  • @@ -153,7 +153,7 @@ }) }); - $.get('<%= course_statistics_college_path(@department) %>'); + $.get('<%= course_statistics_college_path(@school) %>'); $(".count_student_test a").click(function(){ $(".count_student_test a").removeClass("active"); diff --git a/app/views/managements/_trial_authorization_passed_list.html.erb b/app/views/managements/_trial_authorization_passed_list.html.erb index 2a07d59a..450058ee 100644 --- a/app/views/managements/_trial_authorization_passed_list.html.erb +++ b/app/views/managements/_trial_authorization_passed_list.html.erb @@ -17,7 +17,7 @@
  • <% if !user.try(:user_extensions).school_id.blank? && user.try(:user_extensions).try(:school) %> - <%= user.try(:user_extensions).school.name %><%= user.try(:user_extensions).department ? ' - '+user.try(:user_extensions).department.name.to_s : '' %> + <%= user.try(:user_extensions).school.name %><%= user.try(:user_extensions).department ? ' - '+user.try(:user_extensions).department.name.to_s : '' %> <% end %> <% if user.try(:user_extensions) && user.try(:user_extensions).identity %> <%= user.identity %> From b49c1f57527f3a62b86c6a84068cf456e4782d63 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Tue, 30 Apr 2019 11:21:51 +0800 Subject: [PATCH 06/18] 1 --- app/controllers/challenges_controller.rb | 4 +++- app/models/shixun.rb | 1 + app/views/challenges/_content_list.html.erb | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/controllers/challenges_controller.rb b/app/controllers/challenges_controller.rb index df1da6ca..76f7b080 100644 --- a/app/controllers/challenges_controller.rb +++ b/app/controllers/challenges_controller.rb @@ -2,7 +2,7 @@ class ChallengesController < ApplicationController layout "base_shixun" # 如要添加或修改before_filter时,请将handle_openi_request这个before_filter放至第一位 - before_filter :handle_openi_request, if: -> { user_login_and_from_openi? }, only: [:index] + #before_filter :handle_openi_request, if: -> { user_login_and_from_openi? }, only: [:index] before_filter :check_authentication, :except => [:index] before_filter :find_shixun, :only => [:index, :new, :create, :destroy, :challenge_build, :update_evaluation, :add_choose_question, :new_choose_question, :choose_type_show, :edit_choose_question, :update_choose_question, :destroy_challenge_choose] @@ -467,6 +467,8 @@ class ChallengesController < ApplicationController render_404 return else + logger.info("operable: ##{@shixun.operable?}") + logger.info("@shixun.status: ##{@shixun.status}") if (@shixun.status == 0 && !User.current.manager_of_shixun?(@shixun)) || (!@shixun.operable? && !User.current.admin?) render_403 return diff --git a/app/models/shixun.rb b/app/models/shixun.rb index c7d0460a..85b6a2d4 100644 --- a/app/models/shixun.rb +++ b/app/models/shixun.rb @@ -71,6 +71,7 @@ class Shixun < ActiveRecord::Base # 可供使用的实训 def operable? + logger.info("####") self.status != -1 && !self.hidden end diff --git a/app/views/challenges/_content_list.html.erb b/app/views/challenges/_content_list.html.erb index bc7743de..dec91671 100644 --- a/app/views/challenges/_content_list.html.erb +++ b/app/views/challenges/_content_list.html.erb @@ -13,7 +13,7 @@ <% end %>

    - +

    全部任务 From 731d8532e47d7d2f714de5c098a95599795ca300 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Tue, 30 Apr 2019 11:25:36 +0800 Subject: [PATCH 07/18] 1 --- app/controllers/challenges_controller.rb | 2 +- app/views/challenges/_content_list.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/challenges_controller.rb b/app/controllers/challenges_controller.rb index 76f7b080..344976ab 100644 --- a/app/controllers/challenges_controller.rb +++ b/app/controllers/challenges_controller.rb @@ -2,7 +2,7 @@ class ChallengesController < ApplicationController layout "base_shixun" # 如要添加或修改before_filter时,请将handle_openi_request这个before_filter放至第一位 - #before_filter :handle_openi_request, if: -> { user_login_and_from_openi? }, only: [:index] + before_filter :handle_openi_request, if: -> { user_login_and_from_openi? }, only: [:index] before_filter :check_authentication, :except => [:index] before_filter :find_shixun, :only => [:index, :new, :create, :destroy, :challenge_build, :update_evaluation, :add_choose_question, :new_choose_question, :choose_type_show, :edit_choose_question, :update_choose_question, :destroy_challenge_choose] diff --git a/app/views/challenges/_content_list.html.erb b/app/views/challenges/_content_list.html.erb index dec91671..bc7743de 100644 --- a/app/views/challenges/_content_list.html.erb +++ b/app/views/challenges/_content_list.html.erb @@ -13,7 +13,7 @@ <% end %>

    - +

    全部任务 From 5f8341dcf5f8b65f8b094b248cd99730069afe36 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Tue, 30 Apr 2019 11:27:54 +0800 Subject: [PATCH 08/18] 1 --- app/models/shixun.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/models/shixun.rb b/app/models/shixun.rb index 85b6a2d4..439c0e44 100644 --- a/app/models/shixun.rb +++ b/app/models/shixun.rb @@ -55,8 +55,9 @@ class Shixun < ActiveRecord::Base scope :visible, lambda{where(status: [2,3])} - scope :min, lambda { select([:id, :name, :gpid, :modify_time, :reset_time, :language, :propaedeutics, :status, :identifier, :test_set_permission, :hide_code, :forbid_copy, - :webssh, :user_id, :code_hidden, :task_pass, :exec_time, :multi_webssh]) } + scope :min, lambda { select([:id, :name, :gpid, :modify_time, :reset_time, :language, :propaedeutics, :status, :identifier, + :test_set_permission, :hide_code, :forbid_copy, :hidden, :webssh, :user_id, :code_hidden, + :task_pass, :exec_time, :multi_webssh]) } scope :published, lambda{where(status: 2)} scope :field_for_recommend, lambda{ select([:id, :name, :identifier, :myshixuns_count]) } From 50d7ed2deb55a522f02451343d62995d91501c96 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Tue, 30 Apr 2019 11:34:45 +0800 Subject: [PATCH 09/18] export school statistic data feature --- Gemfile | 3 ++ .../managements/schools_controller.rb | 23 ++++++++++++- app/models/homework_common.rb | 32 ++++++------------- .../management/school_report_service.rb | 2 +- app/views/layouts/base_management.html.erb | 4 --- .../schools/_data_contrast_list.html.erb | 8 ++--- .../schools/_statistics_list.html.erb | 2 +- .../managements/schools/statistics.html.erb | 26 +++++++++++++++ .../schools/statistics_xlsx.xlsx.axlsx | 20 ++++++++++++ config/routes.rb | 1 + 10 files changed, 88 insertions(+), 33 deletions(-) create mode 100644 app/views/managements/schools/statistics_xlsx.xlsx.axlsx diff --git a/Gemfile b/Gemfile index b9e1b4e2..f4697bf5 100644 --- a/Gemfile +++ b/Gemfile @@ -62,6 +62,9 @@ gem 'elasticsearch-rails' gem 'oauth2' +# xlsx +gem 'axlsx_rails', '0.3.0' + #Ruby 2.2+ has removed test/unit from the core library. if RUBY_VERSION>='2.2' gem 'test-unit', '~> 3.0' diff --git a/app/controllers/managements/schools_controller.rb b/app/controllers/managements/schools_controller.rb index 6dfe84fb..381c7493 100644 --- a/app/controllers/managements/schools_controller.rb +++ b/app/controllers/managements/schools_controller.rb @@ -7,8 +7,13 @@ class Managements::SchoolsController < Managements::BaseController params[:sort_by] ||= :teacher_count params[:sort_direction] ||= :desc - schools = Management::SchoolReportService.new(params).call + schools = Management::SchoolReportService.new(params).call @schools = paginateHelper schools + + respond_to do |format| + format.html { load_statistic_total } + format.js + end end def yesterday_data @@ -31,6 +36,13 @@ class Managements::SchoolsController < Managements::BaseController raise '参数错误' end + def statistics_xlsx + @schools = Management::SchoolReportService.new(params).call + + filename = ["学校统计总表", params[:keyword], Time.zone.now.strftime('%Y%m%d%H%M%S')].join('-') << ".xlsx" + render xlsx: "statistics_xlsx", filename: filename + end + private def set_navigation_bar @menu_type = 1 @@ -41,4 +53,13 @@ class Managements::SchoolsController < Managements::BaseController [I18n.t("school_daily_report.#{column}"), column] end end + + def load_statistic_total + @teacher_total = User.teacher.count + @student_total = User.student.count + @course_total = Course.count + @active_course_total = Course.where(is_end: false).count + @shixun_homework_total = HomeworkCommon.where(homework_type: 4).count + @other_homework_total = HomeworkCommon.where(homework_type: [1, 3]).count + end end diff --git a/app/models/homework_common.rb b/app/models/homework_common.rb index 0b7aa420..abe09e08 100644 --- a/app/models/homework_common.rb +++ b/app/models/homework_common.rb @@ -63,33 +63,21 @@ class HomeworkCommon < ActiveRecord::Base #作业类型 def homework_type_ch - type = self.homework_type - case type - when 1 - type = "普通" - when 2 - type = "编程" - when 3 - type = "分组" - when 4 - type = "实训" + case homework_type + when 1 then '普通' + when 2 then '编程' + when 3 then '分组' + when 4 then '实训' end - type end def homework_type_module - type = self.homework_type - case type - when 1 - type = "common_homework" - when 2 - type = "code_homework" - when 3 - type = "group_homework" - when 4 - type = "shixun_homework" + case homework_type + when 1 then 'common_homework' + when 2 then 'code_homework' + when 3 then 'group_homework' + when 4 then 'shixun_homework' end - type end def act_as_activity diff --git a/app/services/management/school_report_service.rb b/app/services/management/school_report_service.rb index 5a962bd5..e9ee1bae 100644 --- a/app/services/management/school_report_service.rb +++ b/app/services/management/school_report_service.rb @@ -39,7 +39,7 @@ class Management::SchoolReportService ( SELECT COUNT(*) FROM homework_commons hc LEFT JOIN courses ON courses.id = hc.course_id - WHERE courses.school_id = schools.id + WHERE courses.school_id = schools.id AND hc.homework_type = 4 ) homework_count, ( SELECT COUNT(*) FROM homework_commons hc diff --git a/app/views/layouts/base_management.html.erb b/app/views/layouts/base_management.html.erb index 9d1d77c8..d357bd09 100644 --- a/app/views/layouts/base_management.html.erb +++ b/app/views/layouts/base_management.html.erb @@ -44,10 +44,6 @@

  • <%= link_to "课堂列表", classroom_classment_managements_path %>
  • <%= link_to "实训作业", shixun_task_managements_path%>
  • <%= link_to "项目列表", project_list_managements_path%>
  • - - - -
  • 精选实训+ diff --git a/app/views/managements/schools/_data_contrast_list.html.erb b/app/views/managements/schools/_data_contrast_list.html.erb index af63aee8..c2699601 100644 --- a/app/views/managements/schools/_data_contrast_list.html.erb +++ b/app/views/managements/schools/_data_contrast_list.html.erb @@ -35,20 +35,20 @@ percentage = report['total'].zero? ? increase.to_f * 100 : (increase / report['total'].to_f) * 100 %> <% if increase > 0 %> - + +<%= increase %> - +<%= percentage.round(5) %>% + +<%= percentage.round(5) %>% <% elsif increase.zero? %> <%= increase %> <%= percentage.round(5) %>% <% else %> - + <%= increase %> - <%= percentage.round(5) %>% + <%= percentage.round(5) %>% <% end %> <% end %> diff --git a/app/views/managements/schools/_statistics_list.html.erb b/app/views/managements/schools/_statistics_list.html.erb index 609a1cca..cffb316c 100644 --- a/app/views/managements/schools/_statistics_list.html.erb +++ b/app/views/managements/schools/_statistics_list.html.erb @@ -17,7 +17,7 @@ <% @schools.each_with_index do |school, index| %> - <% p school %><%= (@obj_pages.page - 1) * @obj_pages.per_page + index + 1 %> + <%= (@obj_pages.page - 1) * @obj_pages.per_page + index + 1 %> <%= school['id'] %> <%= school['name'] %> <%= school['teacher_count'] %> diff --git a/app/views/managements/schools/statistics.html.erb b/app/views/managements/schools/statistics.html.erb index 1597fe45..5a68f75c 100644 --- a/app/views/managements/schools/statistics.html.erb +++ b/app/views/managements/schools/statistics.html.erb @@ -4,7 +4,26 @@ class: 'fl task-form-30 task-height-30 mt10', style: 'margin: 10px 10px 10px 25px;' %> <%= link_to '搜索', 'javascript:void(0)', class: 'fl task-btn task-btn-orange ml5 mt10', onclick: "$('#school_report_search_form').submit();" %> <%= link_to '清除', 'javascript:clearSearchCondition()', class: 'fl task-btn ml5 mt2 mt10' %> + +
    + <%= link_to '导出Excel', school_statistics_xlsx_managements_path(format: :xlsx), + class: 'fl task-btn task-btn-orange mt10 mr20 export-statistic-btn', + onclick: 'exportSchoolStatistic();' %> +
    <% end %> + +
  • + +
    +
    + 统计总计: + 教师总人数<%= @teacher_total %>人, + 学生总人数<%= @student_total %>人, + 课堂总数<%= @course_total %>个, + 正在进行课堂总数<%= @active_course_total %>个, + 实训作业总数<%= @shixun_homework_total %>个, + 其它作业总数<%= @other_homework_total %>个, +
    @@ -16,4 +35,11 @@ $("#school_report_search_form input[name='keyword']").val(""); $('#school_report_search_form').submit(); } + + function exportSchoolStatistic(){ + var form = $("#school_report_search_form") + var exportLink = form.find(".export-statistic-btn"); + var keyword = form.find("input[name='keyword'").val(); + exportLink.attr("href", exportLink.attr("href") + "?keyword=" + keyword); + } \ No newline at end of file diff --git a/app/views/managements/schools/statistics_xlsx.xlsx.axlsx b/app/views/managements/schools/statistics_xlsx.xlsx.axlsx new file mode 100644 index 00000000..b68a817c --- /dev/null +++ b/app/views/managements/schools/statistics_xlsx.xlsx.axlsx @@ -0,0 +1,20 @@ +wb = xlsx_package.workbook +wb.add_worksheet(name: "统计总表") do |sheet| + sheet.add_row %w(ID 单位名称 教师总人数 学生总人数 课堂总数 正在进行课堂数 实训作业总数 其它作业总数 动态时间) + + total = @schools.count + buffer_size = 500 + times = total % 500 > 0 ? total / 500 + 1 : total / 500 + + times.times do |index| + schools = @schools.limit(buffer_size).offset(index * buffer_size) + + schools.each do |school| + sheet.add_row([ + school['id'].to_s, school['name'].to_s, school['teacher_count'].to_s, school['student_count'].to_s, + school['course_count'].to_s, school['active_course_count'].to_s, school['homework_count'].to_s, + school['other_homework_count'].to_s, format_time(school['nearly_course_time']) + ]) + end + end +end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 26cddf96..85ec25c9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -728,6 +728,7 @@ RedmineApp::Application.routes.draw do ## oauth相关 get :school_report, controller: 'managements::schools', action: 'statistics' get :school_yesterday_data, controller: 'managements::schools', action: 'yesterday_data' get :school_data_contrast, controller: 'managements::schools', action: 'data_contrast' + get :school_statistics_xlsx, controller: 'managements::schools', action: 'statistics_xlsx' end end # Enable Grack support From 90e7e056ec7f1cb7fc9c906face74b7e4bde4a16 Mon Sep 17 00:00:00 2001 From: Alec Zhou Date: Tue, 30 Apr 2019 14:29:10 +0800 Subject: [PATCH 10/18] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=87=8D=E5=AE=9A?= =?UTF-8?q?=E5=90=91=E8=BF=87=E5=A4=9A=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/oauth_controller.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/controllers/oauth_controller.rb b/app/controllers/oauth_controller.rb index 930f2b75..16f83291 100644 --- a/app/controllers/oauth_controller.rb +++ b/app/controllers/oauth_controller.rb @@ -202,7 +202,11 @@ class OauthController < ApplicationController self.logged_user = openi.user if openi.present? && openi.user.present? original_url = params[:original_url] - redirect_to original_url + if current_user.logged? + redirect_to original_url + else + redirect_to signin_path + end end def get_token_callback From 09abc5511fbb574cf8d0947592a8bbac8c520ef5 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 30 Apr 2019 14:53:26 +0800 Subject: [PATCH 11/18] =?UTF-8?q?=E7=BC=96=E8=BE=91=E9=83=A8=E9=97=A8url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/managements_controller.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/managements_controller.rb b/app/controllers/managements_controller.rb index 53eb23ae..d4e08240 100644 --- a/app/controllers/managements_controller.rb +++ b/app/controllers/managements_controller.rb @@ -1416,7 +1416,8 @@ end def update_depart_identifier if params[:depart] && params[:identifier] @department = Department.where(:id => params[:depart]).first - @department.update_attributes(:identifier => params[:identifier]) if @department.present? + identifier = params[:identifier].strip.blank? ? nil : params[:identifier].strip + @department.update_attributes(:identifier => identifier) if @department.present? end end From cb8b80efe9d9da2ced8cd07fa5b953e05e06a3c7 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 30 Apr 2019 14:56:34 +0800 Subject: [PATCH 12/18] gem --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index f4697bf5..7dca07cd 100644 --- a/Gemfile +++ b/Gemfile @@ -63,7 +63,7 @@ gem 'elasticsearch-rails' gem 'oauth2' # xlsx -gem 'axlsx_rails', '0.3.0' +# gem 'axlsx_rails', '0.3.0' #Ruby 2.2+ has removed test/unit from the core library. if RUBY_VERSION>='2.2' From c28692ffc5cc924f29d6b559665824d1193d8e06 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 30 Apr 2019 15:01:50 +0800 Subject: [PATCH 13/18] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/school.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/school.rb b/app/models/school.rb index 081f3c0c..fd925f9a 100644 --- a/app/models/school.rb +++ b/app/models/school.rb @@ -64,7 +64,7 @@ class School < ActiveRecord::Base def statistic_url dep = departments.where("identifier is not null").first - url = dep.present? ? "/colleges/#{dep.identifier}/statistics" : "/colleges/#{self.id}/statistics" + url = dep.present? && !dep.identifier.blank? ? "/colleges/#{dep.identifier}/statistics" : "/colleges/#{self.id}/statistics" end def course_act_time From 451e06dcaa94c8e593969ea9472149f030614449 Mon Sep 17 00:00:00 2001 From: Alec Zhou Date: Tue, 30 Apr 2019 15:19:27 +0800 Subject: [PATCH 14/18] =?UTF-8?q?=E5=90=8E=E5=8F=B0=E5=88=9B=E5=BB=BAopeni?= =?UTF-8?q?=E5=85=B3=E8=81=94=E7=94=A8=E6=88=B7=E6=97=B6=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E6=8E=88=E6=9D=83=EF=BC=8C=E5=B9=B6=E4=B8=94=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BA=86=E7=94=9F=E6=88=90=E7=94=A8=E6=88=B7=E5=90=8D=E7=9A=84?= =?UTF-8?q?=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/oauth_controller.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/controllers/oauth_controller.rb b/app/controllers/oauth_controller.rb index 16f83291..4dd2e6fd 100644 --- a/app/controllers/oauth_controller.rb +++ b/app/controllers/oauth_controller.rb @@ -188,14 +188,13 @@ class OauthController < ApplicationController break if existing_user.present? user = User.new(lastname: name, mail: email, mail_notification: email) - user.login = custom_openi_login(login) + user.login = generate_login('m') user.password = DEFAULT_PASSWORD + user.certification = 1 user.save! UserExtensions.create!(user_id: user.id, school_id: School.first.id, identity: 4, gender: 0) - UserDayCertification.create!(user_id: user.id, status: 1) - openi = Openi.create!(user_id: user.id, openi_user_id: openi_user_id, avatar_url: avatar_url, login: login, name: name, email: email) end end @@ -214,9 +213,10 @@ class OauthController < ApplicationController ####--End-- 获取Openi的授权码,access_token,以及用户信息。为在openi登录的用户创建相关的educoder用户 #### private - # 为了保证新创建的用户用户名不与系统中已存在的用户冲突,加上 _openi 后缀 - def custom_openi_login(login) - login + '_openi' + # 为新创建的用户随机生成以m为前缀的用户名,m表示该用户是用邮箱注册 + def generate_login(login_pre) + us = UsersService.new + us.generate_user_login(login_pre) end def require_login From 8348c95b57db63df9f4a39de37d41163da5841be Mon Sep 17 00:00:00 2001 From: p31729568 Date: Tue, 30 Apr 2019 15:40:40 +0800 Subject: [PATCH 15/18] modify school contrast data feature --- Gemfile | 3 +- .../managements/schools_controller.rb | 19 ++- .../management/school_data_grow_service.rb | 59 ++++++++ .../school_yesterday_data_service.rb | 32 ---- app/views/layouts/base_management.html.erb | 2 +- .../schools/_contrast_search_form.html.erb | 142 ++++++++++++++---- .../schools/_data_contrast_list.html.erb | 9 ++ ...list.html.erb => _data_grow_list.html.erb} | 27 +++- ...erday_data.html.erb => data_grow.html.erb} | 2 +- ...yesterday_data.js.erb => data_grow.js.erb} | 2 +- config/routes.rb | 2 +- 11 files changed, 223 insertions(+), 76 deletions(-) create mode 100644 app/services/management/school_data_grow_service.rb delete mode 100644 app/services/management/school_yesterday_data_service.rb rename app/views/managements/schools/{_yesterday_data_list.html.erb => _data_grow_list.html.erb} (56%) rename app/views/managements/schools/{yesterday_data.html.erb => data_grow.html.erb} (79%) rename app/views/managements/schools/{yesterday_data.js.erb => data_grow.js.erb} (63%) diff --git a/Gemfile b/Gemfile index 7dca07cd..7a7deeab 100644 --- a/Gemfile +++ b/Gemfile @@ -63,7 +63,8 @@ gem 'elasticsearch-rails' gem 'oauth2' # xlsx -# gem 'axlsx_rails', '0.3.0' +gem 'axlsx', '2.1.0.pre' +gem 'axlsx_rails', '0.3.0' #Ruby 2.2+ has removed test/unit from the core library. if RUBY_VERSION>='2.2' diff --git a/app/controllers/managements/schools_controller.rb b/app/controllers/managements/schools_controller.rb index 381c7493..24889869 100644 --- a/app/controllers/managements/schools_controller.rb +++ b/app/controllers/managements/schools_controller.rb @@ -16,12 +16,16 @@ class Managements::SchoolsController < Managements::BaseController end end - def yesterday_data + def data_grow @sub_type = 2 + params[:data_type] ||= 'grow' params[:sort_by] ||= :teacher_increase_count params[:sort_direction] ||= :desc - reports = Management::SchoolYesterdayDataService.new(params).call + service = Management::SchoolDataGrowService.new(params) + @grow_summary = service.grow_summary + + reports = service.call @reports = paginateHelper reports end @@ -30,6 +34,12 @@ class Managements::SchoolsController < Managements::BaseController params[:sort_direction] ||= :desc params[:sort_by] ||= :percentage + # 无对比日期时直接返回无数据页面 + if useless_contrast_date_parameter? + @obj_count, @reports = 0, [] + return + end + @obj_count, @reports = Management::SchoolDataContrastService.new(params).call @obj_pages = Paginator.new(@obj_count, Management::SchoolDataContrastService::PAGE_SIZE, params[:page]) rescue Management::SchoolDataContrastService::ParameterError @@ -54,6 +64,11 @@ class Managements::SchoolsController < Managements::BaseController end end + def useless_contrast_date_parameter? + params[:begin_date].blank? && params[:end_date].blank? && + params[:other_begin_date].blank? &¶ms[:other_end_date].blank? + end + def load_statistic_total @teacher_total = User.teacher.count @student_total = User.student.count diff --git a/app/services/management/school_data_grow_service.rb b/app/services/management/school_data_grow_service.rb new file mode 100644 index 00000000..02df364b --- /dev/null +++ b/app/services/management/school_data_grow_service.rb @@ -0,0 +1,59 @@ +class Management::SchoolDataGrowService + include CustomSortable + + attr_reader :params + + sort_columns :teacher_increase_count, :student_increase_count, + :course_increase_count, :shixun_increase_count, :active_user_count, + default_by: :teacher_increase_count, default_direction: :desc + + def initialize(params) + @params = params + end + + def call + custom_sort(query_reports, params[:sort_by], params[:sort_direction]) + end + + def grow_summary + @_grow_summary ||= begin + query_reports.select( + 'SUM(teacher_increase_count) teacher_increase_count,'\ + 'SUM(student_increase_count) student_increase_count,'\ + 'SUM(course_increase_count) course_increase_count,'\ + 'SUM(shixun_increase_count) shixun_increase_count,'\ + 'SUM(active_user_count) active_user_count' + ).first + end + end + + private + def query_reports + reports = SchoolDailyReport.where(date: query_date) + + keyword = params[:keyword].try(:to_s).try(:strip) + if keyword.present? + reports = reports.where("school_name LIKE :keyword OR school_id LIKE :keyword", keyword: "%#{keyword}%") + end + + reports + end + + def query_date + if params[:grow_begin_date].present? + begin_time = Time.zone.parse(params[:grow_begin_date]) + end_date = if params[:grow_end_date].present? + Time.zone.parse(params[:grow_end_date]) + end + + end_date.blank? || end_date == begin_time ? begin_time : begin_time..end_date + else + yesterday + end + end + + def yesterday + # 每日凌晨5点为节点, 25日凌晨4点、3点、2点等等,未到更新数据时间点,看到的数据是:23日-24日的统计数据 + (Time.zone.now - 5.hours).beginning_of_day - 1.days + end +end diff --git a/app/services/management/school_yesterday_data_service.rb b/app/services/management/school_yesterday_data_service.rb deleted file mode 100644 index 238a7297..00000000 --- a/app/services/management/school_yesterday_data_service.rb +++ /dev/null @@ -1,32 +0,0 @@ -class Management::SchoolYesterdayDataService - include CustomSortable - - attr_reader :params - - sort_columns :student_increase_count, :teacher_increase_count, - :course_increase_count, :shixun_increase_count, :active_user_count, - default_by: :teacher_increase_count, default_direction: :desc - - def initialize(params) - @params = params - end - - def call - reports = SchoolDailyReport.where(date: yesterday) - - keyword = params[:keyword].try(:to_s).try(:strip) - if keyword.present? - reports = reports.where("school_name LIKE :keyword OR school_id LIKE :keyword", keyword: "%#{keyword}%") - end - - reports = custom_sort(reports, params[:sort_by], params[:sort_direction]) - - reports - end - - private - def yesterday - # 每日凌晨5点为节点, 25日凌晨4点、3点、2点等等,未到更新数据时间点,看到的数据是:23日-24日的统计数据 - (Time.zone.now - 5.hours).beginning_of_day - 1.days - end -end diff --git a/app/views/layouts/base_management.html.erb b/app/views/layouts/base_management.html.erb index 201e26f1..eb6ce06d 100644 --- a/app/views/layouts/base_management.html.erb +++ b/app/views/layouts/base_management.html.erb @@ -35,7 +35,7 @@
  • 学校+
    • <%= link_to '统计总表', school_report_managements_path %>
    • -
    • <%= link_to '数据变化报表', school_yesterday_data_managements_path %>
    • +
    • <%= link_to '数据变化报表', school_data_grow_managements_path %>
  • 课堂+ diff --git a/app/views/managements/schools/_contrast_search_form.html.erb b/app/views/managements/schools/_contrast_search_form.html.erb index 2140eb97..4d24a810 100644 --- a/app/views/managements/schools/_contrast_search_form.html.erb +++ b/app/views/managements/schools/_contrast_search_form.html.erb @@ -1,26 +1,37 @@
    + <%= hidden_field_tag :contrast_column, params[:contrast_column] %> <%= hidden_field_tag :begin_date, params[:begin_date] %> <%= hidden_field_tag :end_date, params[:end_date] %> <%= hidden_field_tag :other_begin_date, params[:other_begin_date] %> <%= hidden_field_tag :other_end_date, params[:other_end_date] %> + + <%= hidden_field_tag :grow_begin_date, params[:grow_begin_date] %> + <%= hidden_field_tag :grow_end_date, params[:grow_end_date] %> - <%= text_field_tag :date_input, params[:date_input], - class: 'date-input winput-200-30', placeholder: '请选择时间段一' %> - VS - <%= text_field_tag :other_date_input, params[:other_date_input], - class: 'other-date-input winput-200-30', placeholder: '请选择时间段二' %> +
    + <%= text_field_tag :grow_date_input, params[:grow_date_input], + class: 'grow-date-input winput-220-30', placeholder: '请选择时间段', + style: 'width: 400px;' %> +
    +
    + <%= text_field_tag :date_input, params[:date_input], + class: 'date-input winput-200-30', placeholder: '请选择时间段一' %> + VS + <%= text_field_tag :other_date_input, params[:other_date_input], + class: 'other-date-input winput-200-30', placeholder: '请选择时间段二' %> +
    - <%= hidden_field_tag :data_type, params[:data_type] || 'yesterday' %> + <%= hidden_field_tag :data_type, params[:data_type] || 'grow' %> <% if params[:data_type] == 'contrast' %> 时间对比 - 日新增 + 新增数据 <% else %> 时间对比 - 日新增 + 新增数据 <% end %>
    @@ -31,28 +42,36 @@
    \ No newline at end of file diff --git a/app/views/managements/schools/_data_contrast_list.html.erb b/app/views/managements/schools/_data_contrast_list.html.erb index c2699601..ef5b5b17 100644 --- a/app/views/managements/schools/_data_contrast_list.html.erb +++ b/app/views/managements/schools/_data_contrast_list.html.erb @@ -6,8 +6,12 @@ options_for_select(@select_options, params[:contrast_column]), class: 'fl task-height-30 contrast-column-select', style: 'position: absolute; right: 30px; top: 15px;' %> +
    + 说明:新增数=时段二-时段一;新增百分比=(新增数/时段一)*100%(保留小数点后五位) +
  • +<% if @obj_count.nonzero? %> @@ -63,6 +67,11 @@
    +<% else %> +
    + 暂无数据,请选择时间段对比 +
    +<% end %>