diff --git a/src/main/java/com/ycwl/basic/puzzle/controller/PuzzleTemplateController.java b/src/main/java/com/ycwl/basic/puzzle/controller/PuzzleTemplateController.java index 0538b72d..5628baad 100644 --- a/src/main/java/com/ycwl/basic/puzzle/controller/PuzzleTemplateController.java +++ b/src/main/java/com/ycwl/basic/puzzle/controller/PuzzleTemplateController.java @@ -118,6 +118,17 @@ public class PuzzleTemplateController { return ApiResponse.success(null); } + /** + * 批量替换模板元素(删除旧元素,添加新元素) + */ + @PutMapping("/templates/{templateId}/elements") + public ApiResponse replaceElements(@PathVariable Long templateId, + @RequestBody List elements) { + log.info("批量替换元素请求: templateId={}, count={}", templateId, elements.size()); + templateService.replaceElements(templateId, elements); + return ApiResponse.success(null); + } + /** * 更新元素 */ diff --git a/src/main/java/com/ycwl/basic/puzzle/mapper/PuzzleElementMapper.java b/src/main/java/com/ycwl/basic/puzzle/mapper/PuzzleElementMapper.java index fcda3ad7..cd962218 100644 --- a/src/main/java/com/ycwl/basic/puzzle/mapper/PuzzleElementMapper.java +++ b/src/main/java/com/ycwl/basic/puzzle/mapper/PuzzleElementMapper.java @@ -23,6 +23,12 @@ public interface PuzzleElementMapper { */ List getByTemplateId(@Param("templateId") Long templateId); + /** + * 根据模板ID和元素Key查询元素 + */ + PuzzleElementEntity getByTemplateIdAndKey(@Param("templateId") Long templateId, + @Param("elementKey") String elementKey); + /** * 插入元素 */ diff --git a/src/main/java/com/ycwl/basic/puzzle/service/IPuzzleTemplateService.java b/src/main/java/com/ycwl/basic/puzzle/service/IPuzzleTemplateService.java index 3b695cdc..5e9d96bf 100644 --- a/src/main/java/com/ycwl/basic/puzzle/service/IPuzzleTemplateService.java +++ b/src/main/java/com/ycwl/basic/puzzle/service/IPuzzleTemplateService.java @@ -69,6 +69,14 @@ public interface IPuzzleTemplateService { */ void batchAddElements(Long templateId, List elements); + /** + * 批量替换元素(删除旧元素,添加新元素) + * + * @param templateId 模板ID + * @param elements 新的元素列表 + */ + void replaceElements(Long templateId, List elements); + /** * 更新元素 */ diff --git a/src/main/java/com/ycwl/basic/puzzle/service/impl/PuzzleTemplateServiceImpl.java b/src/main/java/com/ycwl/basic/puzzle/service/impl/PuzzleTemplateServiceImpl.java index f01d8509..8b11dfc2 100644 --- a/src/main/java/com/ycwl/basic/puzzle/service/impl/PuzzleTemplateServiceImpl.java +++ b/src/main/java/com/ycwl/basic/puzzle/service/impl/PuzzleTemplateServiceImpl.java @@ -20,6 +20,8 @@ import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; /** @@ -227,6 +229,72 @@ public class PuzzleTemplateServiceImpl implements IPuzzleTemplateService { } } + @Override + @Transactional(rollbackFor = Exception.class) + public void replaceElements(Long templateId, List elements) { + log.info("批量替换元素: templateId={}, count={}", templateId, elements.size()); + + // 1. 校验模板 + PuzzleTemplateEntity template = templateMapper.getById(templateId); + if (template == null) { + throw new IllegalArgumentException("模板不存在: " + templateId); + } + + // 2. 获取现有元素(建立 elementKey -> Entity 的映射) + List existingElements = elementMapper.getByTemplateId(templateId); + Map existingMap = existingElements.stream() + .collect(Collectors.toMap( + PuzzleElementEntity::getElementKey, + entity -> entity, + (e1, e2) -> e1 // 如果有重复key,保留第一个 + )); + + // 3. 构建新元素的 key 集合 + Set newElementKeys = elements.stream() + .map(ElementCreateRequest::getElementKey) + .collect(Collectors.toSet()); + + // 4. 找出需要删除的元素(旧元素中不在新元素列表中的) + List toDeleteIds = existingElements.stream() + .filter(entity -> !newElementKeys.contains(entity.getElementKey())) + .map(PuzzleElementEntity::getId) + .collect(Collectors.toList()); + + // 5. 删除不需要的元素 + int deletedCount = 0; + for (Long id : toDeleteIds) { + elementMapper.deleteById(id); + deletedCount++; + } + log.info("删除不需要的元素: templateId={}, count={}", templateId, deletedCount); + + // 6. 处理新元素列表:更新或插入 + int updatedCount = 0; + int insertedCount = 0; + for (ElementCreateRequest request : elements) { + request.setTemplateId(templateId); + ElementConfigHelper.validateRequest(request); + + PuzzleElementEntity existingEntity = existingMap.get(request.getElementKey()); + if (existingEntity != null) { + // 更新现有元素 + PuzzleElementEntity entity = ElementConfigHelper.toEntity(request); + entity.setId(existingEntity.getId()); + elementMapper.update(entity); + updatedCount++; + } else { + // 插入新元素 + PuzzleElementEntity entity = ElementConfigHelper.toEntity(request); + entity.setDeleted(0); + elementMapper.insert(entity); + insertedCount++; + } + } + + log.info("批量替换元素完成: templateId={}, deleted={}, updated={}, inserted={}", + templateId, deletedCount, updatedCount, insertedCount); + } + @Override @Transactional(rollbackFor = Exception.class) public void updateElement(Long id, ElementCreateRequest request) { diff --git a/src/main/resources/mapper/PuzzleElementMapper.xml b/src/main/resources/mapper/PuzzleElementMapper.xml index 42f7b16a..d8ad9df1 100644 --- a/src/main/resources/mapper/PuzzleElementMapper.xml +++ b/src/main/resources/mapper/PuzzleElementMapper.xml @@ -49,6 +49,14 @@ ORDER BY z_index ASC, id ASC + + +