|
|
class CopyEcYearService < ApplicationService
|
|
|
attr_reader :major_school, :to_year
|
|
|
|
|
|
def initialize(major_school, year)
|
|
|
@major_school = major_school
|
|
|
@to_year = major_school.ec_years.new(year: year)
|
|
|
end
|
|
|
|
|
|
def call
|
|
|
if from_year.blank?
|
|
|
to_year.save!
|
|
|
return to_year
|
|
|
end
|
|
|
|
|
|
# 专业第一次创建届别时,复制示例专业2017届
|
|
|
ActiveRecord::Base.transaction do
|
|
|
copy_ec_year!
|
|
|
|
|
|
copy_graduation_requirement!
|
|
|
|
|
|
copy_training_objective!
|
|
|
|
|
|
new_major_school? ? copy_template_ec_course! : copy_ec_courses!
|
|
|
end
|
|
|
|
|
|
to_year
|
|
|
end
|
|
|
|
|
|
private
|
|
|
|
|
|
def new_major_school?
|
|
|
@_new_major ||= major_school.ec_years.count.zero?
|
|
|
end
|
|
|
|
|
|
def from_year
|
|
|
@_from_year ||= new_major_school? ? template_major_year : to_year.prev_year
|
|
|
end
|
|
|
|
|
|
def template_major_year
|
|
|
EcYear.joins(:ec_major_school).where(ec_major_schools: { template_major: true }).find_by_year('2017')
|
|
|
end
|
|
|
|
|
|
def copy_ec_year!
|
|
|
to_year.calculation_value = from_year.calculation_value
|
|
|
to_year.save!
|
|
|
end
|
|
|
|
|
|
def copy_graduation_requirement!
|
|
|
requirements = from_year.ec_graduation_requirements.includes(ec_graduation_subitems: :ec_require_sub_vs_standards)
|
|
|
|
|
|
requirements.each do |requirement|
|
|
|
to_requirement = to_year.ec_graduation_requirements.new
|
|
|
to_requirement.attributes = requirement.attributes.except('id', 'ec_year_id', 'created_at', 'updated_at')
|
|
|
to_requirement.save!
|
|
|
|
|
|
# 记录对应关系,创建支撑时使用
|
|
|
graduation_requirement_map[requirement.id] = to_requirement.id
|
|
|
|
|
|
copy_graduation_subitems(requirement, to_requirement)
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def copy_graduation_subitems(requirement, to_requirement)
|
|
|
requirement.ec_graduation_subitems.each do |item|
|
|
|
to_item = to_requirement.ec_graduation_subitems.new
|
|
|
to_item.attributes = item.attributes.except('id', 'ec_graduation_requirement_id', 'created_at', 'updated_at')
|
|
|
to_item.save!
|
|
|
|
|
|
# 记录对应关系,创建支撑时使用
|
|
|
graduation_subitem_map[item.id] = to_item.id
|
|
|
|
|
|
copy_requirement_standard_supports!(item, to_item)
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def copy_requirement_standard_supports!(graduation_subitem, to_graduation_subitem)
|
|
|
graduation_subitem.ec_require_sub_vs_standards.each do |support|
|
|
|
to_support = to_graduation_subitem.ec_require_sub_vs_standards.new
|
|
|
to_support.attributes = support.attributes.except('id', 'ec_graduation_subitem_id', 'created_at', 'updated_at')
|
|
|
to_support.save!
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def copy_training_objective!
|
|
|
training_objective = from_year.ec_training_objective
|
|
|
return if training_objective.blank?
|
|
|
|
|
|
attributes = training_objective.attributes.except('id', 'ec_year_id', 'created_at', 'updated_at')
|
|
|
to_training_objective = to_year.create_ec_training_objective!(attributes)
|
|
|
|
|
|
copy_training_subitems!(training_objective, to_training_objective)
|
|
|
end
|
|
|
|
|
|
def copy_training_subitems!(training_objective, to_training_objective)
|
|
|
training_subitems = training_objective.ec_training_subitems.includes(:ec_requirement_vs_objectives)
|
|
|
|
|
|
training_subitems.each do |item|
|
|
|
to_item = to_training_objective.ec_training_subitems.new
|
|
|
to_item.attributes = item.attributes.except('id', 'ec_training_objective_id', 'created_at', 'updated_at')
|
|
|
to_item.save!
|
|
|
|
|
|
copy_requirement_vs_objectives!(item, to_item)
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def copy_requirement_vs_objectives!(training_item, to_training_item)
|
|
|
training_item.ec_requirement_vs_objectives.each do |support|
|
|
|
to_support = to_training_item.ec_requirement_vs_objectives.new(status: support.status)
|
|
|
to_support.ec_graduation_requirement_id = graduation_requirement_map[support.ec_graduation_requirement_id]
|
|
|
to_support.save!
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def copy_template_ec_course!
|
|
|
course = from_year.ec_courses.includes(
|
|
|
:ec_score_levels,
|
|
|
ec_course_evaluations: :ec_course_evaluation_subitems,
|
|
|
ec_course_targets: :ec_graduation_subitem_course_targets,
|
|
|
ec_course_achievement_methods: :ec_achievement_evaluation_relates,
|
|
|
ec_course_supports: :ec_graduation_subitem_courses
|
|
|
).find_by_name('数据库原理')
|
|
|
|
|
|
to_course = to_year.ec_courses.new
|
|
|
to_course.attributes = course.attributes.except('id', 'ec_year_id', 'created_at', 'updated_at')
|
|
|
to_course.save!
|
|
|
|
|
|
course_map[course.id] = to_course.id
|
|
|
|
|
|
copy_course_evaluations!(course, to_course)
|
|
|
copy_course_targets!(course, to_course)
|
|
|
copy_course_achievement_methods!(course, to_course)
|
|
|
copy_ec_course_supports!(course, to_course)
|
|
|
copy_score_levels!(course, to_course)
|
|
|
|
|
|
# 复制示例时需要复制学生和成绩数据
|
|
|
copy_year_students!
|
|
|
end
|
|
|
|
|
|
def copy_ec_courses!
|
|
|
courses = from_year.ec_courses.includes(
|
|
|
:ec_score_levels,
|
|
|
ec_course_evaluations: :ec_course_evaluation_subitems,
|
|
|
ec_course_targets: :ec_graduation_subitem_course_targets,
|
|
|
ec_course_achievement_methods: :ec_achievement_evaluation_relates,
|
|
|
ec_course_supports: :ec_graduation_subitem_courses
|
|
|
)
|
|
|
|
|
|
courses.each do |course|
|
|
|
to_course = to_year.ec_courses.new
|
|
|
to_course.attributes = course.attributes.except('id', 'ec_year_id', 'created_at', 'updated_at')
|
|
|
to_course.save!
|
|
|
|
|
|
course_map[course.id] = to_course.id
|
|
|
|
|
|
copy_course_evaluations!(course, to_course)
|
|
|
copy_course_targets!(course, to_course)
|
|
|
copy_course_achievement_methods!(course, to_course)
|
|
|
copy_ec_course_supports!(course, to_course)
|
|
|
copy_score_levels!(course, to_course)
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def copy_course_evaluations!(course, to_course)
|
|
|
course.ec_course_evaluations.each do |evaluation|
|
|
|
to_evaluation = to_course.ec_course_evaluations.new
|
|
|
to_evaluation.attributes = evaluation.attributes.except('id', 'ec_course_id', 'created_at', 'updated_at')
|
|
|
to_evaluation.save!
|
|
|
|
|
|
course_evaluation_map[evaluation.id] = to_evaluation.id
|
|
|
|
|
|
copy_course_evaluation_subitems!(evaluation, to_evaluation)
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def copy_course_evaluation_subitems!(evaluation, to_evaluation)
|
|
|
evaluation.ec_course_evaluation_subitems.each do |item|
|
|
|
to_item = to_evaluation.ec_course_evaluation_subitems.new
|
|
|
to_item.attributes = item.attributes.except('id', 'ec_course_evaluation_id', 'created_at', 'updated_at')
|
|
|
to_item.save!
|
|
|
|
|
|
course_evaluation_subitem_map[item.id] = to_item.id
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def copy_course_targets!(course, to_course)
|
|
|
course.ec_course_targets.each do |target|
|
|
|
to_target = to_course.ec_course_targets.new
|
|
|
to_target.attributes = target.attributes.except('id', 'ec_course_id', 'created_at', 'updated_at')
|
|
|
to_target.save!
|
|
|
|
|
|
course_target_map[target.id] = to_target.id
|
|
|
|
|
|
copy_graduation_subitem_course_targets!(target, to_target)
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def copy_graduation_subitem_course_targets!(target, to_target)
|
|
|
target.ec_graduation_subitem_course_targets.each do |support|
|
|
|
to_support = to_target.ec_graduation_subitem_course_targets.new
|
|
|
to_support.attributes = support.attributes.except('id', 'ec_course_target_id', 'ec_graduation_subitem_id', 'created_at', 'updated_at')
|
|
|
to_support.ec_graduation_subitem_id = graduation_subitem_map[support.ec_graduation_subitem_id]
|
|
|
to_support.save!
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def copy_course_achievement_methods!(course, to_course)
|
|
|
course.ec_course_achievement_methods.each do |from|
|
|
|
to = to_course.ec_course_achievement_methods.new
|
|
|
to.attributes = from.attributes.except('id', 'ec_course_id', 'ec_course_target_id', 'ec_course_evaluation_id',
|
|
|
'ec_course_evaluation_subitem_id', 'created_at', 'updated_at')
|
|
|
|
|
|
to.ec_course_target_id = course_target_map[from.ec_course_target_id]
|
|
|
to.ec_course_evaluation_id = course_evaluation_map[from.ec_course_evaluation_id]
|
|
|
to.ec_course_evaluation_subitem_id = course_evaluation_subitem_map[from.ec_course_evaluation_subitem_id]
|
|
|
to.save!
|
|
|
|
|
|
copy_achievement_evaluation_relates!(from, to)
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def copy_achievement_evaluation_relates!(method, to_method)
|
|
|
method.ec_achievement_evaluation_relates.each do |relate|
|
|
|
to_relate = to_method.ec_achievement_evaluation_relates.new
|
|
|
to_relate.attributes = relate.attributes.except('id', 'ec_course_achievement_method_id', 'ec_course_target_id',
|
|
|
'ec_course_evaluation_subitem_id', 'created_at', 'updated_at')
|
|
|
to_relate.ec_course_target_id = course_target_map[relate.ec_course_target_id]
|
|
|
# 可能不存在,所以为 -1
|
|
|
to_relate.ec_course_evaluation_subitem_id = course_evaluation_subitem_map[relate.ec_course_evaluation_subitem_id] || -1
|
|
|
to_relate.save!
|
|
|
|
|
|
achievement_evaluation_relates_map[relate.id] = to_relate.id
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def copy_ec_course_supports!(course, to_course)
|
|
|
course.ec_course_supports.each do |support|
|
|
|
to_support = to_course.ec_course_supports.new
|
|
|
to_support.attributes = support.attributes.except('id', 'ec_course_id', 'created_at', 'updated_at')
|
|
|
to_support.save!
|
|
|
|
|
|
copy_graduation_subitem_courses!(support, to_support)
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def copy_graduation_subitem_courses!(course_support, to_course_support)
|
|
|
course_support.ec_graduation_subitem_courses.each do |item|
|
|
|
to_item = to_course_support.ec_graduation_subitem_courses.new
|
|
|
to_item.attributes = item.attributes.except('id', 'ec_course_support_id', 'ec_graduation_subitem_id',
|
|
|
'created_at', 'updated_at')
|
|
|
to_item.ec_graduation_subitem_id = graduation_subitem_map[item.ec_graduation_subitem_id]
|
|
|
to_item.save!
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def copy_score_levels!(course, to_course)
|
|
|
course.ec_score_levels.each do |level|
|
|
|
to_level = to_course.ec_score_levels.new
|
|
|
to_level.attributes = level.attributes.except('id', 'ec_course_id', 'created_at', 'updated_at')
|
|
|
to_level.save!
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def copy_year_students!
|
|
|
students = from_year.ec_year_students.includes(:ec_student_achievements, :ec_course_student_scores, :ec_student_score_targets)
|
|
|
|
|
|
students.each do |student|
|
|
|
to_student = to_year.ec_year_students.new
|
|
|
to_student.attributes = student.attributes.except('id', 'ec_year_id', 'created_at', 'updated_at')
|
|
|
to_student.save!
|
|
|
|
|
|
copy_student_achievements!(student, to_student)
|
|
|
copy_course_student_scores!(student, to_student)
|
|
|
copy_student_score_targets!(student, to_student)
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def copy_student_achievements!(student, to_student)
|
|
|
student.ec_student_achievements.each do |achievement|
|
|
|
to_achievement = to_student.ec_student_achievements.new
|
|
|
to_achievement.attributes = achievement.attributes.except('id', 'ec_year_student_id', 'ec_course_evaluation_id',
|
|
|
'ec_course_evaluation_subitem_id', 'created_at', 'updated_at')
|
|
|
to_achievement.ec_course_evaluation_id = course_evaluation_map[achievement.ec_course_evaluation_id]
|
|
|
to_achievement.ec_course_evaluation_subitem_id = course_evaluation_subitem_map[achievement.ec_course_evaluation_subitem_id]
|
|
|
to_achievement.save!
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def copy_course_student_scores!(student, to_student)
|
|
|
student.ec_course_student_scores.each do |score|
|
|
|
to_score = to_student.ec_course_student_scores.new
|
|
|
to_score.attributes = score.attributes.except('id', 'ec_year_student_id', 'ec_course_id', 'created_at', 'updated_at')
|
|
|
to_score.ec_course_id = course_map[score.ec_course_id]
|
|
|
to_score.save!
|
|
|
|
|
|
course_student_score_map[score.id] = to_score.id
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def copy_student_score_targets!(student, to_student)
|
|
|
student.ec_student_score_targets.each do |target|
|
|
|
to_target = to_student.ec_student_score_targets.new
|
|
|
to_target.attributes = target.attributes.except('id', 'ec_course_id', 'ec_course_student_score_id',
|
|
|
'ec_course_target_id', 'ec_year_student_id', 'eaer_id',
|
|
|
'created_at', 'updated_at')
|
|
|
to_target.ec_course_id = course_map[target.ec_course_id]
|
|
|
to_target.ec_course_student_score_id = course_student_score_map[target.ec_course_student_score_id]
|
|
|
to_target.ec_course_target_id = course_target_map[target.ec_course_target_id]
|
|
|
to_target.eaer_id = achievement_evaluation_relates_map[target.eaer_id]
|
|
|
to_target.save!
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def graduation_requirement_map
|
|
|
@_graduation_requirement_map ||= {}
|
|
|
end
|
|
|
|
|
|
def graduation_subitem_map
|
|
|
@_graduation_subitem_map ||= {}
|
|
|
end
|
|
|
|
|
|
def course_map
|
|
|
@_course_map ||= {}
|
|
|
end
|
|
|
|
|
|
def course_evaluation_map
|
|
|
@_course_evaluation_map ||= {}
|
|
|
end
|
|
|
|
|
|
def course_evaluation_subitem_map
|
|
|
@_course_evaluation_subitem_map ||= {}
|
|
|
end
|
|
|
|
|
|
def achievement_evaluation_relates_map
|
|
|
@_achievement_evaluation_relates_map ||= {}
|
|
|
end
|
|
|
|
|
|
def course_target_map
|
|
|
@_course_target_map ||= {}
|
|
|
end
|
|
|
|
|
|
def course_student_score_map
|
|
|
@_course_student_score_map ||= {}
|
|
|
end
|
|
|
end |