diff --git a/.gitignore b/.gitignore index 4a01bd5ec..2735825af 100644 --- a/.gitignore +++ b/.gitignore @@ -84,4 +84,5 @@ redis_data/ dump.rdb .tags* ceshi_user.xlsx -public/trace_task_results \ No newline at end of file +public/trace_task_results +public/项目活跃度排行.xls \ No newline at end of file diff --git a/app/controllers/admins/projects_rank_controller.rb b/app/controllers/admins/projects_rank_controller.rb index df7598728..c1f9722c8 100644 --- a/app/controllers/admins/projects_rank_controller.rb +++ b/app/controllers/admins/projects_rank_controller.rb @@ -1,56 +1,17 @@ class Admins::ProjectsRankController < Admins::BaseController - before_action :get_timeable_key_names, only:[:index] def index - puts @names_array - unless @names_array.blank? - $redis_cache.zunionstore("admin-days-project-rank", @names_array) - deleted_data = $redis_cache.smembers("v2-project-rank-deleted") - $redis_cache.zrem("admin-days-project-rank", deleted_data) unless deleted_data.blank? - @date_rank = $redis_cache.zrevrange("admin-days-project-rank", 0, -1, withscores: true) - @date_rank = @date_rank.map do |i| - visits = 0 - watchers = 0 - praises = 0 - forks = 0 - issues = 0 - pullrequests = 0 - commits = 0 - (begin_date..end_date).to_a.each do |d| - result = $redis_cache.hgetall("v2-project-statistic:#{i[0]}-#{d}") - visits += result["visits"].to_i - watchers += result["watchers"].to_i - praises += result["praises"].to_i - forks += result["forks"].to_i - issues += result["issues"].to_i - pullrequests += result["pullrequests"].to_i - commits += result["commits"].to_i - end - i + [visits,watchers,praises,forks,issues,pullrequests,commits] - end - case params[:sort_by] - when 'visits' - @date_rank = @date_rank.sort{|i| i[2]} - when 'watchers' - @date_rank = @date_rank.sort{|i| i[3]} - when 'praises' - @date_rank = @date_rank.sort{|i| i[4]} - when 'forks' - @date_rank = @date_rank.sort{|i| i[5]} - when 'issues' - @date_rank = @date_rank.sort{|i| i[6]} - when 'pullrequests' - @date_rank = @date_rank.sort{|i| i[7]} - when 'commits' - @date_rank = @date_rank.sort{|i| i[8]} - else - @date_rank = @date_rank.sort{|i| i[1]} - end - if params[:sort_direction].blank? || params[:sort_direction].to_s.downcase == "desc" - @date_rank = @date_rank.reverse - end - else - @date_rank = [] - end + @statistics = DailyProjectStatistic.where("date >= ? AND date <= ?", begin_date, end_date) + @statistics = @statistics.group(:project_id).select("project_id, + sum(score) as score, + sum(visits) as visits, + sum(watchers) as watchers, + sum(praises) as praises, + sum(forks) as forks, + sum(issues) as issues, + sum(pullrequests) as pullrequests, + sum(commits) as commits").includes(:project) + @statistics = @statistics.order("#{sort_by} #{sort_direction}") + export_excel(@statistics.limit(50)) end private @@ -63,15 +24,32 @@ class Admins::ProjectsRankController < Admins::BaseController params.fetch(:end_date, Date.today.to_s) end - def get_timeable_key_names - begin - @names_array = [] - (begin_date..end_date).to_a.each do |i| - @names_array << "v2-project-rank-#{i}" - end - rescue - @names_array = [] + def sort_by + params.fetch(:sort_by, "score") + end + + def sort_direction + params.fetch(:sort_direction, "desc") + end + + def export_excel(data) + book = Spreadsheet::Workbook.new + sheet = book.create_worksheet :name => "项目活跃度排行" + sheet.row(0).concat %w(排名 项目全称 项目地址 得分 访问数 关注数 点赞数 fork数 疑修数 合并请求数 提交数) + data.each_with_index do |d, index| + sheet[index+1,0] = index+1 + sheet[index+1,1] = "#{d&.project&.owner&.nickname}/#{d&.project&.name}" + sheet[index+1,2] = "#{Rails.application.config_for(:configuration)['platform_url']}/#{d&.project&.owner&.login}/#{d&.project&.identifier}" + sheet[index+1,3] = d.score + sheet[index+1,4] = d.visits + sheet[index+1,5] = d.watchers + sheet[index+1,6] = d.praises + sheet[index+1,7] = d.forks + sheet[index+1,8] = d.issues + sheet[index+1,9] = d.pullrequests + sheet[index+1,10] = d.commits end + book.write "#{Rails.root}/public/项目活跃度排行.xls" end end \ No newline at end of file diff --git a/app/jobs/daily_project_statistics_job.rb b/app/jobs/daily_project_statistics_job.rb new file mode 100644 index 000000000..985067481 --- /dev/null +++ b/app/jobs/daily_project_statistics_job.rb @@ -0,0 +1,32 @@ +class DailyProjectStatisticsJob < ApplicationJob + queue_as :cache + + def perform + date = (Date.today - 1.days).to_s + daily_data_keys = $redis_cache.keys("v2-project-statistic:*-#{date}") + daily_data_keys.each do |key| + result = $redis_cache.hgetall(key) + project_id = key.gsub('v2-project-statistic:', '').gsub("-#{date}", '') + visits = result["visits"].to_i + watchers = result["watchers"].to_i + praises = result["praises"].to_i + forks = result["forks"].to_i + issues = result["issues"].to_i + pullrequests = result["pullrequests"].to_i + commits = result["commits"].to_i + score = visits *1 + watchers *5 + praises * 5 + forks * 10 + issues *5 + pullrequests * 10 + commits * 5 + DailyProjectStatistic.create!( + project_id: project_id, + date: date, + score: score , + visits: visits, + watchers: watchers, + praises: praises, + forks: forks, + issues: issues, + pullrequests: pullrequests, + commits: commits + ) + end + end +end \ No newline at end of file diff --git a/app/models/daily_project_statistic.rb b/app/models/daily_project_statistic.rb new file mode 100644 index 000000000..f7fc0aad7 --- /dev/null +++ b/app/models/daily_project_statistic.rb @@ -0,0 +1,28 @@ +# == Schema Information +# +# Table name: daily_project_statistics +# +# id :integer not null, primary key +# project_id :integer +# date :string(255) +# visits :integer default("0") +# watchers :integer default("0") +# praises :integer default("0") +# forks :integer default("0") +# issues :integer default("0") +# pullrequests :integer default("0") +# commits :integer default("0") +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_daily_project_statistics_on_date (date) +# index_daily_project_statistics_on_project_id (project_id) +# + +class DailyProjectStatistic < ApplicationRecord + + + belongs_to :project +end diff --git a/app/views/admins/projects_rank/index.html.erb b/app/views/admins/projects_rank/index.html.erb index 3ea7b8ae5..e9d38afa6 100644 --- a/app/views/admins/projects_rank/index.html.erb +++ b/app/views/admins/projects_rank/index.html.erb @@ -5,28 +5,34 @@