forked from jasder/forgeplus
52 lines
1.4 KiB
Ruby
52 lines
1.4 KiB
Ruby
class Admins::ImportDisciplineService < ApplicationService
|
|
Error = Class.new(StandardError)
|
|
|
|
attr_reader :file, :result
|
|
|
|
def initialize(file)
|
|
@file = file
|
|
@result = { success: 0, fail: [] }
|
|
end
|
|
|
|
def call
|
|
raise Error, '文件不存在' if file.blank?
|
|
|
|
excel = Admins::ImportDisciplineExcel.new(file)
|
|
excel.read_each(&method(:save_discipline))
|
|
|
|
result
|
|
rescue ApplicationImport::Error => ex
|
|
raise Error, ex.message
|
|
end
|
|
|
|
private
|
|
|
|
def save_discipline(data)
|
|
count = 0
|
|
discipline_name = data.discipline_name.to_s.strip
|
|
sub_discipline_name = data.sub_discipline_name.to_s.strip
|
|
|
|
return unless discipline_name.present?
|
|
discipline = Discipline.find_by(name: discipline_name)
|
|
if discipline.blank?
|
|
discipline = Discipline.create!(name: discipline_name, position: Discipline.all.pluck(:position).max + 1)
|
|
count += 1
|
|
end
|
|
|
|
if sub_discipline_name.present?
|
|
sub_discipline = SubDiscipline.find_by(name: discipline_name, discipline: discipline)
|
|
if sub_discipline.blank?
|
|
SubDiscipline.create!(name: sub_discipline_name, discipline: discipline, position: discipline.sub_disciplines.pluck(:position).max + 1)
|
|
count += 1
|
|
end
|
|
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
|
|
end |