From 3de5693ba425a7988e822affdd6571322cdb64bf Mon Sep 17 00:00:00 2001 From: luogw <3132758203@qq.com> Date: Thu, 30 Jul 2026 09:56:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=88=A4=E6=96=AD=E8=80=83?= =?UTF-8?q?=E8=AF=95=E4=BB=BB=E5=8A=A1=E6=98=AF=E5=90=A6=E7=94=9F=E9=A2=98?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/InteractionController.java | 2 +- .../QuestionInventoryDomainServiceImpl.java | 30 +++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/project/interaction/controller/InteractionController.java b/src/main/java/com/project/interaction/controller/InteractionController.java index 487d1f8..4985aed 100644 --- a/src/main/java/com/project/interaction/controller/InteractionController.java +++ b/src/main/java/com/project/interaction/controller/InteractionController.java @@ -62,7 +62,7 @@ public class InteractionController { } /** - * 判断任务是否删除 + * 判断任务是否删除,供算法判断请求是否需要生题 */ @PostMapping("/isDeletedTask") public Result isDeletedTask(Long taskId,@RequestParam("taskKpIds") List taskKpIds,Integer type){ diff --git a/src/main/java/com/project/question/domain/service/impl/QuestionInventoryDomainServiceImpl.java b/src/main/java/com/project/question/domain/service/impl/QuestionInventoryDomainServiceImpl.java index 1410f18..5e5870d 100644 --- a/src/main/java/com/project/question/domain/service/impl/QuestionInventoryDomainServiceImpl.java +++ b/src/main/java/com/project/question/domain/service/impl/QuestionInventoryDomainServiceImpl.java @@ -1,5 +1,6 @@ package com.project.question.domain.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.project.base.domain.result.Result; @@ -19,10 +20,13 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; @Service @Slf4j @@ -113,6 +117,18 @@ public class QuestionInventoryDomainServiceImpl implements QuestionInventoryDoma List kpList = taskKpMapper.selectList( new LambdaQueryWrapper().eq(TaskKnowledgePointEntity::getTaskId , taskId)); + // 批量查询知识点库存: Map>,避免 N+1 + Map> kpStockMap = new HashMap<>(); + Set kpIdSet = kpList.stream().map(TaskKnowledgePointEntity::getId).collect(Collectors.toSet()); + if (CollUtil.isNotEmpty(kpIdSet)) { + for (Map row : taskKpMapper.batchCountByKpAndType(kpIdSet)) { + Long kpId = ((Number) row.get("kpId")).longValue(); + Integer qType = ((Number) row.get("questionType")).intValue(); + Integer stock = ((Number) row.get("stock")).intValue(); + kpStockMap.computeIfAbsent(kpId, k -> new HashMap<>()).put(qType, stock); + } + } + for (QuestionTypeEnum questionType : QuestionTypeEnum.values()) { if (QuestionTypeEnum.MULTIPLE_CHOICE.equals(questionType)) { continue; @@ -128,7 +144,8 @@ public class QuestionInventoryDomainServiceImpl implements QuestionInventoryDoma int passedCount = 0; for (TaskKnowledgePointEntity kp : kpList) { kpCount++; - int currentStock = questionKpMapper.countAvailableByKp(kp.getId(), questionType.getValue()); + int currentStock = kpStockMap.getOrDefault(kp.getId(), Collections.emptyMap()) + .getOrDefault(questionType.getValue(), 0); boolean isEnough = currentStock >= watermark; if (isEnough) { passedCount++; @@ -144,6 +161,15 @@ public class QuestionInventoryDomainServiceImpl implements QuestionInventoryDoma List clusterList = clusterMapper.selectList( new LambdaQueryWrapper().eq(TaskKnowledgeClusterEntity::getTaskId, taskId)); + // 批量查询簇库存: Map,避免 N+1 + Map clusterStockMap = new HashMap<>(); + Set clusterIdSet = clusterList.stream().map(TaskKnowledgeClusterEntity::getId).collect(Collectors.toSet()); + if (CollUtil.isNotEmpty(clusterIdSet)) { + for (Map row : taskKpMapper.batchCountByCluster(clusterIdSet)) { + clusterStockMap.put(((Number) row.get("clusterId")).longValue(), ((Number) row.get("stock")).intValue()); + } + } + // 按簇大小分组统计 Map sizeTotalMap = new HashMap<>(); Map sizePassedMap = new HashMap<>(); @@ -154,7 +180,7 @@ public class QuestionInventoryDomainServiceImpl implements QuestionInventoryDoma } int w = cluster.getClusterSize(); int watermark = (int) Math.ceil(waterLine * w * questionTypeMap.get(QuestionTypeEnum.MULTIPLE_CHOICE.name())); - int currentStock = questionKpMapper.countAvailableByCluster(cluster.getId()); + int currentStock = clusterStockMap.getOrDefault(cluster.getId(), 0); boolean isEnough = currentStock >= watermark; sizeTotalMap.merge(w, 1, Integer::sum);