StatServiceImpl.kt
package io.github.lishangbu.avalon.dataset.service.impl
import io.github.lishangbu.avalon.dataset.entity.Stat
import io.github.lishangbu.avalon.dataset.entity.dto.SaveStatInput
import io.github.lishangbu.avalon.dataset.entity.dto.StatSpecification
import io.github.lishangbu.avalon.dataset.entity.dto.StatView
import io.github.lishangbu.avalon.dataset.entity.dto.UpdateStatInput
import io.github.lishangbu.avalon.dataset.repository.StatRepository
import io.github.lishangbu.avalon.dataset.service.StatService
import org.babyfish.jimmer.sql.ast.mutation.SaveMode
import org.springframework.stereotype.Service
/** 能力值服务实现*/
@Service
class StatServiceImpl(
/** 能力值仓储*/
private val statRepository: StatRepository,
) : StatService {
override fun listCoreStats(): List<Stat> = statRepository.listCoreStats()
/** 根据条件查询能力值列表*/
override fun listByCondition(specification: StatSpecification): List<StatView> = statRepository.listViews(specification)
/** 保存能力值*/
override fun save(command: SaveStatInput): StatView = statRepository.save(command.toEntity(), SaveMode.INSERT_ONLY).let(::reloadView)
/** 更新能力值*/
override fun update(command: UpdateStatInput): StatView {
requireStatEditable(command.id.toLong(), "能力值已设为只读,禁止修改")
return statRepository.save(command.toEntity(), SaveMode.UPDATE_ONLY).let(::reloadView)
}
/** 按 ID 删除能力值*/
override fun removeById(id: Long) {
requireStatEditable(id, "能力值已设为只读,禁止删除")
statRepository.deleteById(id)
}
private fun reloadView(stat: Stat): StatView = requireNotNull(statRepository.loadViewById(stat.id)) { "未找到 ID=${stat.id} 对应的能力值" }
private fun requireStatEditable(
id: Long,
errorMessage: String,
) {
val stat = requireNotNull(statRepository.findNullable(id)) { "未找到 ID=$id 对应的能力值" }
if (stat.readonly) {
throw IllegalStateException(errorMessage)
}
}
}