package com.rongyichuang.rating.service; import com.rongyichuang.common.dto.PageRequest; import com.rongyichuang.common.dto.PageResponse; import com.rongyichuang.common.exception.BusinessException; import com.rongyichuang.rating.dto.request.RatingItemInput; import com.rongyichuang.rating.dto.request.RatingSchemeInput; import com.rongyichuang.rating.dto.response.RatingSchemeResponse; import com.rongyichuang.rating.entity.RatingItem; import com.rongyichuang.rating.entity.RatingScheme; import com.rongyichuang.rating.repository.RatingItemRepository; import com.rongyichuang.rating.repository.RatingSchemeRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; /** * 评分模板服务层 */ @Service public class RatingSchemeService { @Autowired private RatingSchemeRepository ratingSchemeRepository; @Autowired private RatingItemRepository ratingItemRepository; /** * 分页查询评分模板列表 */ public PageResponse getSchemeList(PageRequest pageRequest, String name) { Pageable pageable = pageRequest.toPageable(); Page page; if (StringUtils.hasText(name)) { page = ratingSchemeRepository.findByNameContaining(name, pageable); } else { page = ratingSchemeRepository.findAll(pageable); } List content = page.getContent().stream() .map(RatingSchemeResponse::new) .collect(Collectors.toList()); return new PageResponse<>(content, page.getTotalElements(), page.getNumber(), page.getSize()); } /** * 根据ID获取评分模板详情 */ public RatingSchemeResponse getSchemeById(Long id) { Optional optional = ratingSchemeRepository.findById(id); if (optional.isEmpty()) { throw new BusinessException("评分模板不存在"); } return new RatingSchemeResponse(optional.get()); } /** * 保存评分模板(新增或修改) */ @Transactional public RatingSchemeResponse saveScheme(RatingSchemeInput input) { RatingScheme scheme; if (input.getId() == null) { // 新增 scheme = new RatingScheme(); } else { // 修改 Optional optional = ratingSchemeRepository.findById(input.getId()); if (optional.isEmpty()) { throw new BusinessException("评分模板不存在"); } scheme = optional.get(); } // 设置基本信息 scheme.setName(input.getName()); scheme.setDescription(input.getDescription()); // 保存模板 scheme = ratingSchemeRepository.save(scheme); // 处理评分条目 if (input.getItems() != null) { saveRatingItems(scheme, input.getItems()); } return new RatingSchemeResponse(scheme); } /** * 删除评分模板 */ @Transactional public boolean deleteScheme(Long id) { Optional optional = ratingSchemeRepository.findById(id); if (optional.isEmpty()) { throw new BusinessException("评分模板不存在"); } // 检查是否被比赛使用 if (ratingSchemeRepository.isUsedByActivity(id)) { throw new BusinessException("该评分模板已被比赛使用,无法删除"); } RatingScheme scheme = optional.get(); scheme.setState(0); // 逻辑删除 ratingSchemeRepository.save(scheme); return true; } /** * 保存评分条目 */ private void saveRatingItems(RatingScheme scheme, List itemInputs) { // 获取现有条目 List existingItems = ratingItemRepository.findBySchemeIdOrderByOrderNo(scheme.getId()); // 处理新的条目列表 List newItems = new ArrayList<>(); for (int i = 0; i < itemInputs.size(); i++) { RatingItemInput itemInput = itemInputs.get(i); RatingItem item; if (itemInput.getId() == null) { // 新增条目 item = new RatingItem(); item.setScheme(scheme); } else { // 修改条目 item = existingItems.stream() .filter(existing -> existing.getId().equals(itemInput.getId())) .findFirst() .orElse(new RatingItem()); if (item.getScheme() == null) { item.setScheme(scheme); } } item.setName(itemInput.getName()); item.setMaxScore(itemInput.getMaxScore()); item.setOrderNo(itemInput.getOrderNo() != null ? itemInput.getOrderNo() : i + 1); newItems.add(item); } // 删除不在新列表中的条目 List newItemIds = newItems.stream() .map(RatingItem::getId) .filter(id -> id != null) .collect(Collectors.toList()); for (RatingItem existingItem : existingItems) { if (!newItemIds.contains(existingItem.getId())) { existingItem.setState(0); // 逻辑删除 ratingItemRepository.save(existingItem); } } // 保存新的条目列表 ratingItemRepository.saveAll(newItems); } /** * 获取所有评分模板(用于下拉选择) */ public List getAllSchemes() { List schemes = ratingSchemeRepository.findAll(); return schemes.stream() .map(RatingSchemeResponse::new) .collect(Collectors.toList()); } }