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.
70 lines
2.2 KiB
70 lines
2.2 KiB
class Ecs::SaveGraduationRequirementeService < ApplicationService
|
|
include AcceptsNestedAttributesHelper
|
|
|
|
attr_reader :ec_year, :graduation_requirement, :params
|
|
|
|
def initialize(graduation_requirement, params)
|
|
@graduation_requirement = graduation_requirement
|
|
@ec_year = graduation_requirement.ec_year
|
|
@params = params
|
|
end
|
|
|
|
def call
|
|
set_graduation_subitems_position!
|
|
|
|
graduation_requirement.position = params[:position].presence || ec_year.ec_graduation_requirements.count + 1
|
|
graduation_requirement.content = params[:content].to_s.strip
|
|
|
|
attributes = build_accepts_nested_attributes(
|
|
graduation_requirement,
|
|
graduation_requirement.ec_graduation_subitems,
|
|
params[:graduation_subitems],
|
|
&method(:graduation_subitem_params_handler!)
|
|
)
|
|
|
|
ActiveRecord::Base.transaction do
|
|
graduation_requirement.assign_attributes(ec_graduation_subitems_attributes: attributes)
|
|
|
|
resort_graduation_requirements_position!
|
|
|
|
graduation_requirement.save!
|
|
end
|
|
|
|
graduation_requirement
|
|
end
|
|
|
|
private
|
|
|
|
def set_graduation_subitems_position!
|
|
params[:graduation_subitems].each_with_index do |item, index|
|
|
item[:position] = index + 1
|
|
end
|
|
end
|
|
|
|
def resort_graduation_requirements_position!
|
|
# 新增时
|
|
if graduation_requirement.new_record?
|
|
# 插入数据时只需要后移
|
|
ec_year.ec_graduation_requirements.where('position >= ?', graduation_requirement.position)
|
|
.update_all('position = position + 1')
|
|
return
|
|
end
|
|
|
|
# 编辑时
|
|
new_position = graduation_requirement.position
|
|
old_position = graduation_requirement.position_in_database
|
|
|
|
if new_position > old_position # 前移
|
|
ec_year.ec_graduation_requirements.where('position <= ? AND position > ?', new_position, old_position)
|
|
.update_all('position = position - 1')
|
|
elsif new_position < old_position # 后移
|
|
ec_year.ec_graduation_requirements.where('position >= ? AND position < ?', new_position, old_position)
|
|
.update_all('position = position + 1')
|
|
end
|
|
end
|
|
|
|
def graduation_subitem_params_handler!(subitem)
|
|
subitem[:content] = subitem[:content].to_s.strip
|
|
end
|
|
end
|