You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
class ExportShixunReportService
|
|
|
|
include ApplicationHelper
|
|
|
|
include StudentWorksHelper
|
|
|
|
|
|
|
|
attr_reader :homework, :work
|
|
|
|
|
|
|
|
def initialize(homework, work)
|
|
|
|
@homework = homework
|
|
|
|
@work = work
|
|
|
|
end
|
|
|
|
|
|
|
|
def filename
|
|
|
|
@_filename ||= "#{homework.name}-#{work.user.user_extension&.student_id}-#{work.user.real_name}.pdf".gsub(' ', '-').gsub('/', '_')
|
|
|
|
end
|
|
|
|
|
|
|
|
def prepare_binding
|
|
|
|
load_data
|
|
|
|
|
|
|
|
binding
|
|
|
|
end
|
|
|
|
|
|
|
|
def to_pdf
|
|
|
|
@_pdf ||= generate_pdf
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def generate_pdf
|
|
|
|
file = File.open(Rails.root.join('app/templates/shixun_work/shixun_work.html.erb'))
|
|
|
|
html = ERB.new(file.read).result(prepare_binding)
|
|
|
|
kit = PDFKit.new(html)
|
|
|
|
|
|
|
|
base_css = %w(app/templates/shared/main.css app/templates/shixun_work/shixun_work.css app/templates/shared/codemirror.css)
|
|
|
|
base_css.each { |css| kit.stylesheets << Rails.root.join(css) }
|
|
|
|
|
|
|
|
file = Tempfile.new(filename)
|
|
|
|
kit.to_pdf(file.path)
|
|
|
|
file
|
|
|
|
end
|
|
|
|
|
|
|
|
def load_data
|
|
|
|
@course = homework.course
|
|
|
|
@user = @work.user
|
|
|
|
@shixun = homework.shixuns.take
|
|
|
|
@games = @work.myshixun.games.includes(:challenge, :game_codes,:outputs) if @work.myshixun
|
|
|
|
|
|
|
|
# 用户最大评测次数
|
|
|
|
@user_evaluate_count = @games.pluck(:evaluate_count).sum if @games
|
|
|
|
# @user_evaluate_count = @games.inject(0){|sum, g| sum + g.outputs.pluck(:query_index)&.first } if @games
|
|
|
|
# 图形效率图的数据
|
|
|
|
@echart_data = student_efficiency(homework, @work)
|
|
|
|
@myself_eff = @echart_data[:efficiency_list].find { |item| item.last == @user.id }
|
|
|
|
@myself_consume = @echart_data[:consume_list].find { |item| item.last == @user.id }
|
|
|
|
end
|
|
|
|
end
|