class BatchExportShixunReportService Error = Class.new(StandardError) MAX_BATCH_LIMIT = 20 attr_reader :homework, :student_work_ids def initialize(homework, student_work_ids) @homework = homework @student_work_ids = student_work_ids end def filename @_filename ||= "#{Time.now.strftime('%Y%m%d%H%M%S')}-#{homework.name}.zip" end def zip validate! student_works = homework.student_works.where(id: student_work_ids).includes(:myshixun, user: :user_extension) if student_works.count.zero? raise Error, '请选择要导出的学生实训报告' end pdfs = [] zip_file = Tempfile.new(filename) Zip::File.open(zip_file.path, Zip::File::CREATE) do |zip| student_works.find_each.map do |student_work| export = ExportShixunReportService.new(homework, student_work) pdf = export.to_pdf pdfs << pdf begin zip.add(export.filename, pdf.path) rescue => ex Rails.logger.error(ex.message) zip.get_output_stream('FILE_NOTICE.txt'){|os| os.write('文件重复') } next end end zip_file end end private def validate! if student_work_ids.size.zero? raise Error, '请选择学生实训作业' end if student_work_ids.size > MAX_BATCH_LIMIT raise Error, '导出实训报告太多,请分批导出' end end end