BookshelfServiceImpl.java
package org.darkroomlibrary.service.impl;
import org.darkroomlibrary.mapper.BookMapper;
import org.darkroomlibrary.mapper.BookshelfMapper;
import org.darkroomlibrary.web.response.ApiResponse;
import org.darkroomlibrary.web.response.PageResponse;
import org.darkroomlibrary.web.dto.query.BookshelfPageQuery;
import org.darkroomlibrary.domain.model.Bookshelf;
import org.darkroomlibrary.service.BookshelfService;
import org.darkroomlibrary.utils.IdListUtils;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import jakarta.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
/**
* 书架服务实现
*/
@Service
public class BookshelfServiceImpl implements BookshelfService {
@Resource
private BookshelfMapper bookshelfMapper;
@Resource
private BookMapper bookMapper;
@Override
@Transactional
public ApiResponse<Void> save(Bookshelf bookshelf) {
String validationError = validate(bookshelf, false);
if (validationError != null) {
return ApiResponse.error(validationError);
}
if (bookshelf.getCapacity() == null) {
bookshelf.setCapacity(100);
}
normalizeText(bookshelf);
bookshelf.setCreateTime(LocalDateTime.now());
try {
if (bookshelfMapper.insert(bookshelf) != 1) {
return ApiResponse.error("书架新增失败,请重试");
}
} catch (DuplicateKeyException e) {
return ApiResponse.error("书架名称已存在");
}
return ApiResponse.success("新增书架成功");
}
@Override
@Transactional
public ApiResponse<Void> update(Bookshelf bookshelf) {
String validationError = validate(bookshelf, true);
if (validationError != null) {
return ApiResponse.error(validationError);
}
if (bookshelfMapper.findByIdForUpdate(bookshelf.getId()) == null) {
return ApiResponse.error("书架不存在");
}
normalizeText(bookshelf);
try {
if (bookshelfMapper.update(bookshelf) == 0) {
return ApiResponse.error("书架状态已变化,请刷新后重试");
}
} catch (DuplicateKeyException e) {
return ApiResponse.error("书架名称已存在");
}
return ApiResponse.success("修改书架成功");
}
@Override
@Transactional
public ApiResponse<Void> batchDelete(List<Integer> ids) {
List<Integer> normalizedIds = IdListUtils.normalize(ids);
if (normalizedIds.isEmpty()) {
return ApiResponse.error("请选择要删除的书架");
}
if (IdListUtils.exceedsBatchLimit(normalizedIds)) {
return ApiResponse.error("单次最多删除" + IdListUtils.MAX_BATCH_SIZE + "个书架");
}
if (bookshelfMapper.findByIdsForUpdate(normalizedIds).size() != normalizedIds.size()) {
return ApiResponse.error("部分书架不存在");
}
if (bookMapper.countByBookshelfIds(normalizedIds) > 0) {
return ApiResponse.error("书架仍被图书使用,请先调整相关图书");
}
if (bookshelfMapper.batchDelete(normalizedIds) != normalizedIds.size()) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return ApiResponse.error("书架状态已变化,请刷新后重试");
}
return ApiResponse.success("删除书架成功");
}
@Override
public ApiResponse<List<Bookshelf>> query(BookshelfPageQuery dto) {
List<Bookshelf> list = bookshelfMapper.query(dto);
Integer total = bookshelfMapper.queryCount(dto);
return PageResponse.success(list, total);
}
@Override
public ApiResponse<List<Bookshelf>> queryAll() {
List<Bookshelf> list = bookshelfMapper.queryAll();
return ApiResponse.success(list);
}
private String validate(Bookshelf bookshelf, boolean requireId) {
if (bookshelf == null) {
return "书架参数不能为空";
}
if (requireId && bookshelf.getId() == null) {
return "书架编号不能为空";
}
if (bookshelf.getName() == null || bookshelf.getName().trim().isEmpty()) {
return "书架名称不能为空";
}
if (bookshelf.getName().trim().length() > 50) {
return "书架名称不能超过50个字符";
}
if (bookshelf.getLocation() != null && bookshelf.getLocation().trim().length() > 100) {
return "书架位置不能超过100个字符";
}
if (bookshelf.getDescription() != null && bookshelf.getDescription().trim().length() > 500) {
return "书架说明不能超过500个字符";
}
if (bookshelf.getCapacity() != null && bookshelf.getCapacity() <= 0) {
return "书架容量必须大于0";
}
return null;
}
private void normalizeText(Bookshelf bookshelf) {
bookshelf.setName(bookshelf.getName().trim());
if (bookshelf.getLocation() != null) {
bookshelf.setLocation(bookshelf.getLocation().trim());
}
if (bookshelf.getDescription() != null) {
bookshelf.setDescription(bookshelf.getDescription().trim());
}
}
}