class Admins::ProjectsRankController < Admins::BaseController def index @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 def begin_date params.fetch(:begin_date, (Date.yesterday-7.days).to_s) end def end_date params.fetch(:end_date, Date.yesterday.to_s) end def sort_by DailyProjectStatistic.column_names.include?(params.fetch(:sort_by, "score")) ? params.fetch(:sort_by, "score") : "score" end def sort_direction %w(desc asc).include?(params.fetch(:sort_direction, "desc")) ? params.fetch(:sort_direction, "desc") : "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&.real_name}/#{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