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.
67 lines
1.9 KiB
67 lines
1.9 KiB
class Admins::ImportHackService < ApplicationService
|
|
Error = Class.new(StandardError)
|
|
|
|
attr_reader :file, :result
|
|
|
|
def initialize(file, sub_discipline_id)
|
|
@sub_discipline_id = sub_discipline_id
|
|
@file = file
|
|
@result = { success: 0, fail: [] }
|
|
end
|
|
|
|
def call
|
|
raise Error, '文件不存在' if file.blank?
|
|
|
|
excel = Admins::ImportHackExcel.new(file)
|
|
excel.read_each(&method(:save_data))
|
|
|
|
result
|
|
rescue ApplicationImport::Error => ex
|
|
raise Error, ex.message
|
|
end
|
|
|
|
private
|
|
|
|
def save_data(data)
|
|
count = 0
|
|
unless data.task_name.to_s.strip.present?
|
|
return
|
|
end
|
|
|
|
unless data.login.to_s.strip.present?
|
|
raise '用户名不能为空'
|
|
end
|
|
|
|
user = User.find_by(login: data.login.to_s.strip)
|
|
hack = Hack.new(name: data.task_name, difficult: data.difficulty || 1, user_id: user.id, status: 1,
|
|
time_limit: data.time, description: data.desc, score: 200, sub_discipline_id: @sub_discipline_id)
|
|
hack.identifier = ApplicationController.new.generate_identifier Hack, 8
|
|
ActiveRecord::Base.transaction do
|
|
hack.save!
|
|
hack_set(hack, data)
|
|
hack.hack_codes.create!(code: Base64.urlsafe_encode64s(data.code), language: data.language, modify_time: Time.now)
|
|
|
|
ItemBank.create!(public: true, name: data.task_name, container: hack, item_type: 'PROGRAM', difficulty: data.difficulty || 1, user_id: user.id, sub_discipline_id: @sub_discipline_id)
|
|
count += 1
|
|
end
|
|
|
|
result[:success] += count
|
|
rescue Exception => ex
|
|
fail_data = data.as_json
|
|
fail_data[:data] = fail_data.values.join(',')
|
|
fail_data[:message] = ex.message
|
|
|
|
result[:fail] << fail_data
|
|
end
|
|
|
|
|
|
def hack_set(hack, data)
|
|
(1..4).each do |d|
|
|
set_in = data.send("set_input#{d}").to_s.strip
|
|
set_out = data.send("set_output#{d}").to_s.strip
|
|
if set_in.present? && set_out.present?
|
|
hack.hack_sets.create!(input: set_in, output: set_out, position: d )
|
|
end
|
|
end
|
|
end
|
|
end |