class Admins::ImportCourseMemberService < 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::ImportCourseMemberExcel.new(file) excel.read_each(&method(:create_course_member)) result rescue ApplicationImport::Error => ex raise Error, ex.message end private def create_course_member(data) raise '课堂角色必须为 2、3、4' unless [2, 3, 4].include?(data.role.to_i) user = User.joins(:user_extension).where(user_extensions: { student_id: data.student_id, school_id: data.school_id }).first raise '该学号的用户不存在' if user.blank? course = Course.find_by(id: data.course_id) raise '该课堂不存在' if course.blank? course_group = nil if data.course_group_name.present? course_group = course.course_groups.find_or_create_by!(name: data.course_group_name) end member = course.course_members.find_by(user_id: user.id, role: data.role.to_i) # 如果已是课堂成员且是学生身份and不在指定的分班则移动到该分班 if member.present? && member.role == 'STUDENT' && course_group && member.course_group_id != course_group&.id member.update!(course_group_id: course_group&.id) elsif member.blank? course.course_members.create!(user_id: user.id, role: data.role.to_i, course_group_id: course_group&.id) extra = case data.role.to_i when 2 then 9 when 3 then 7 else 10 end Tiding.create!(user_id: user.id, trigger_user_id: course.tea_id, container_id: course.id, container_type: 'TeacherJoinCourse', belong_container_id: course.id, belong_container_type: 'Course', tiding_type: 'System', extra: extra) 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 end