From 2fa3597f11e76bbf89e519c111e1b7715cf4bc51 Mon Sep 17 00:00:00 2001 From: luoweijian <1329394916@qq.com> Date: Fri, 29 May 2026 15:47:51 +0800 Subject: [PATCH] =?UTF-8?q?bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/AssemblePaperDomainServiceImpl.java | 52 +++++++++++++++++++ .../mapper/TaskKnowledgePointMapper.java | 43 +++++++++++++-- 2 files changed, 92 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/project/exam/domain/service/impl/AssemblePaperDomainServiceImpl.java b/src/main/java/com/project/exam/domain/service/impl/AssemblePaperDomainServiceImpl.java index 2cee252..efdefc4 100644 --- a/src/main/java/com/project/exam/domain/service/impl/AssemblePaperDomainServiceImpl.java +++ b/src/main/java/com/project/exam/domain/service/impl/AssemblePaperDomainServiceImpl.java @@ -214,6 +214,58 @@ public class AssemblePaperDomainServiceImpl implements AssemblePaperDomainServic List kpList = taskKnowledgePointBaseService.lambdaQuery() .eq(TaskKnowledgePointEntity::getTaskId, dto.getId()).list().stream() .map(entity -> entity.toDTO(TaskKnowledgePointDTO::new)).toList(); + + // ========== 新增:批量查询库存,内存过滤 ========== + // 1. 批量查询知识点级别的各题型库存 + Set allKpIds = kpList.stream().map(TaskKnowledgePointDTO::getId).collect(Collectors.toSet()); + Map> kpStockMap = new HashMap<>(); + if (CollUtil.isNotEmpty(allKpIds)) { + List> kpStockList = taskKnowledgePointMapper.batchCountByKpAndType(allKpIds); + for (Map row : kpStockList) { + Long kpId = ((Number) row.get("kpId")).longValue(); + Integer questionType = ((Number) row.get("questionType")).intValue(); + Integer stock = ((Number) row.get("stock")).intValue(); + kpStockMap.computeIfAbsent(kpId, k -> new HashMap<>()).put(questionType, stock); + } + } + + // 2. 批量查询簇级别的多选题库存 + Set allClusterIds = kpList.stream() + .filter(kp -> Objects.nonNull(kp.getClusterId())) + .map(TaskKnowledgePointDTO::getClusterId) + .collect(Collectors.toSet()); + Map clusterStockMap = new HashMap<>(); + if (CollUtil.isNotEmpty(allClusterIds)) { + List> clusterStockList = taskKnowledgePointMapper.batchCountByCluster(allClusterIds); + for (Map row : clusterStockList) { + Long clusterId = ((Number) row.get("clusterId")).longValue(); + Integer stock = ((Number) row.get("stock")).intValue(); + clusterStockMap.put(clusterId, stock); + } + } + + // 3. 内存过滤:只保留有库存的知识点 + kpList = kpList.stream().filter(kp -> { + // 多选题种子:需要簇级别有多选题库存(排除单知识点簇) + if (Objects.nonNull(kp.getClusterSize()) && kp.getClusterSize() > 1) { + Integer clusterStock = clusterStockMap.getOrDefault(kp.getClusterId(), 0); + if (clusterStock > 0) { + return true; + } + } + // 单选/判断种子:需要知识点级别有对应题型库存 + Map typeStock = kpStockMap.getOrDefault(kp.getId(), Collections.emptyMap()); + return typeStock.getOrDefault(QuestionTypeEnum.SINGLE_CHOICE.getValue(), 0) > 0 + || typeStock.getOrDefault(QuestionTypeEnum.TRUE_FALSE.getValue(), 0) > 0; + }).toList(); + + // 4. 检查过滤后的种子数量是否足够 + if (kpList.size() < totalNum) { + log.warn(">>> [库存不足] 任务: {}, 需要种子: {}, 可用种子: {}", dto.getId(), totalNum, kpList.size()); + throw new BusinessErrorException("当前题库可用题目不足,请联系管理员补货"); + } + // ========== 新增结束 ========== + // 按簇分组 Map> clusterGroup = kpList.stream() .collect(Collectors.groupingBy(TaskKnowledgePointDTO::getClusterId)); diff --git a/src/main/java/com/project/question/mapper/TaskKnowledgePointMapper.java b/src/main/java/com/project/question/mapper/TaskKnowledgePointMapper.java index c337d4f..f8004ca 100644 --- a/src/main/java/com/project/question/mapper/TaskKnowledgePointMapper.java +++ b/src/main/java/com/project/question/mapper/TaskKnowledgePointMapper.java @@ -3,11 +3,11 @@ package com.project.question.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.project.question.domain.dto.TaskKnowledgePointDTO; import com.project.question.domain.entity.TaskKnowledgePointEntity; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.*; +import java.util.Collection; import java.util.List; +import java.util.Map; @Mapper public interface TaskKnowledgePointMapper extends BaseMapper { @@ -28,4 +28,41 @@ public interface TaskKnowledgePointMapper extends BaseMapper selectKpOrderBySingle(@Param("id") Long id); + + /** + * 批量查询知识点下各题型的可用库存 + * 返回 Map> + */ + @MapKey("kpId") + @Select("") + List> batchCountByKpAndType(@Param("kpIds") Collection kpIds); + + /** + * 批量查询簇下多选题的可用库存 + * 返回 Map + */ + @MapKey("clusterId") + @Select("") + List> batchCountByCluster(@Param("clusterIds") Collection clusterIds); }