class Admins::ImportUserService < ApplicationService Error = Class.new(StandardError) attr_reader :file, :school, :prefix, :result def initialize(file) @file = file @result = { success: 0, fail: [] } end def call raise Error, '文件不存在' if file.blank? excel = Admins::ImportUserExcel.new(file) @school = excel.school @prefix = excel.identifier excel.read_each(&method(:save_user)) result rescue ApplicationImport::Error => ex raise Error, ex.message end private def save_user(data) user = find_user(data) if user.blank? create_user(data) else user.update_column(:certification, 1) end result[:success] += 1 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 create_user(data) department = school.departments.find_by(name: data.department_name) attr = { type: 'User', status: User::STATUS_ACTIVE, login: "#{prefix}#{data.student_id}", firstname: '', lastname: data.name, nickname: data.name, professional_certification: 1, certification: 1, password: '12345678', phone: data.phone, mail: "#{prefix}#{data.student_id}@qq.com", profile_completed: true } ActiveRecord::Base.transaction do user = User.create!(attr) extension_attr = { school_id: school.id, location: school.province, location_city: school.city, gender: 0, identity: data.identity.to_i, department_id: department&.id, student_id: data.student_id } extension_attr[:technical_title] = case data.identity.to_i when 0 then %w(教授 副教授 讲师 助教).include?(data.technical_title) ? data.technical_title : '讲师' when 2 then %w(企业管理者 部门管理者 高级工程师 工程师 助理工程师).include?(data.technical_title) ? data.technical_title : '助理工程师' else nil end user.create_user_extension!(extension_attr) end end def find_user(data) users = User.joins(:user_extension).where(user_extensions: { identity: data.identity, school_id: school.id }) if data.identity.to_i == 1 users = users.where(user_extensions: { student_id: data.student_id }) else users = users.where(user_extensions: { technical_title: data.technical_title }).where('CONCAT(users.lastname,users.firstname) = ?', data.name) end users.first end end