From 21f559f2547911ada4d73bb8a042d2d5f1ef6235 Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 19 Dec 2023 14:57:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E6=8E=92=E8=A1=8C=E6=A6=9C=E4=BD=BF=E7=94=A8=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E4=BB=A5=E5=8F=8A=E6=95=B0=E6=8D=AE=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- .../admins/projects_rank_controller.rb | 96 +++++++------------ app/jobs/daily_project_statistics_job.rb | 32 +++++++ app/models/daily_project_statistic.rb | 28 ++++++ app/views/admins/projects_rank/index.html.erb | 30 +++--- app/views/admins/projects_rank/index.js.erb | 2 +- .../projects_rank/shared/_data_list.html.erb | 24 +++-- config/sidekiq_cron.yml | 5 + ...9020521_create_daily_project_statistics.rb | 19 ++++ 9 files changed, 153 insertions(+), 86 deletions(-) create mode 100644 app/jobs/daily_project_statistics_job.rb create mode 100644 app/models/daily_project_statistic.rb create mode 100644 db/migrate/20231219020521_create_daily_project_statistics.rb 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 @@
<%= form_tag(admins_projects_rank_index_path, method: :get, class: 'form-inline search-form flex-1', id: 'project-rank-date-form') do %> -
- - <% dates_array = (0..30).to_a.map { |item| [(Date.today-item.days).to_s, (Date.today-item.days).to_s] } %> - <%= select_tag(:begin_date, options_for_select(dates_array, params[:begin_date]), class:"form-control",id: "project-rank-begin-date-select")%> +
+ 开始日期 +
-
- - <% dates_array = (0..30).to_a.map { |item| [(Date.today-item.days).to_s, (Date.today-item.days).to_s] } %> - <%= select_tag(:end_date, options_for_select(dates_array, params[:end_date]), class:"form-control",id: "project-rank-end-date-select")%> +
+ 结束日期 +
<% end %> - + <%= link_to '导出', "/项目活跃度排行.xls", class: 'btn btn-primary mr-3' %>
- <%= render partial: 'admins/projects_rank/shared/data_list', locals: { date_rank: @date_rank } %> + <%= render partial: 'admins/projects_rank/shared/data_list', locals: { statistics: @statistics } %>
\ No newline at end of file diff --git a/app/views/admins/projects_rank/index.js.erb b/app/views/admins/projects_rank/index.js.erb index 7e0f0e5fa..0d36dd86d 100644 --- a/app/views/admins/projects_rank/index.js.erb +++ b/app/views/admins/projects_rank/index.js.erb @@ -1 +1 @@ -$('.project-rank-list-container').html("<%= j( render partial: 'admins/projects_rank/shared/data_list', locals: { date_rank: @date_rank } ) %>"); \ No newline at end of file +$('.project-rank-list-container').html("<%= j( render partial: 'admins/projects_rank/shared/data_list', locals: { statistics: @statistics } ) %>"); \ No newline at end of file diff --git a/app/views/admins/projects_rank/shared/_data_list.html.erb b/app/views/admins/projects_rank/shared/_data_list.html.erb index 06b41b45e..bb9f4577c 100644 --- a/app/views/admins/projects_rank/shared/_data_list.html.erb +++ b/app/views/admins/projects_rank/shared/_data_list.html.erb @@ -14,25 +14,23 @@ - <% date_rank.each_with_index do |item, index| %> + <% statistics.each_with_index do |item, index| %> <%= index + 1%> - <% project_common = $redis_cache.hgetall("v2-project-common:#{item[0]}") %> - <% owner_common = $redis_cache.hgetall("v2-owner-common:#{project_common["owner_id"]}")%> - /<%= project_common["identifier"]%>"> - <%= "#{owner_common["name"]}/#{project_common["name"]}" %> + "> + <%= "#{item&.project&.owner&.nickname}/#{item&.project&.name}" %> - <%= item[1] %> - <%= item[2] %> - <%= item[3] %> - <%= item[4] %> - <%= item[5] %> - <%= item[6] %> - <%= item[7] %> - <%= item[8] %> + <%= item&.score %> + <%= item&.visits %> + <%= item&.watchers %> + <%= item&.praises %> + <%= item&.forks %> + <%= item&.issues %> + <%= item&.pullrequests %> + <%= item&.commits %> <% end %> diff --git a/config/sidekiq_cron.yml b/config/sidekiq_cron.yml index 448e9c945..0ec8f997e 100644 --- a/config/sidekiq_cron.yml +++ b/config/sidekiq_cron.yml @@ -7,3 +7,8 @@ delay_expired_issue: cron: "0 0 * * *" class: "DelayExpiredIssueJob" queue: message + +create_daily_project_statistics: + cron: "0 1 * * *" + class: "DailyProjectStatisticsJob" + queue: cache \ No newline at end of file diff --git a/db/migrate/20231219020521_create_daily_project_statistics.rb b/db/migrate/20231219020521_create_daily_project_statistics.rb new file mode 100644 index 000000000..4465154d2 --- /dev/null +++ b/db/migrate/20231219020521_create_daily_project_statistics.rb @@ -0,0 +1,19 @@ +class CreateDailyProjectStatistics < ActiveRecord::Migration[5.2] + def change + create_table :daily_project_statistics do |t| + t.references :project + t.date :date + t.index :date + t.integer :score, default: 0 + t.integer :visits, default: 0 + t.integer :watchers, default: 0 + t.integer :praises, default: 0 + t.integer :forks, default: 0 + t.integer :issues, default: 0 + t.integer :pullrequests, default: 0 + t.integer :commits, default: 0 + + t.timestamps + end + end +end