diff --git a/src/main/java/com/project/interaction/domain/service/impl/SaveClusterDomainServiceImpl.java b/src/main/java/com/project/interaction/domain/service/impl/SaveClusterDomainServiceImpl.java index a42ec1a..a65c668 100644 --- a/src/main/java/com/project/interaction/domain/service/impl/SaveClusterDomainServiceImpl.java +++ b/src/main/java/com/project/interaction/domain/service/impl/SaveClusterDomainServiceImpl.java @@ -19,6 +19,7 @@ import com.project.question.domain.enums.QuestionSourceTypeEnum; import com.project.question.domain.service.GenerateQuestionDomainService; import com.project.question.domain.service.TaskKnowledgeClusterBaseService; import com.project.question.domain.service.TaskKnowledgePointBaseService; +import com.project.question.mapper.TaskKnowledgePointMapper; import com.project.task.domain.entity.TaskEntity; import com.project.task.domain.enums.QuestionTypeEnum; import com.project.task.domain.service.TaskBaseService; @@ -38,6 +39,9 @@ public class SaveClusterDomainServiceImpl implements SaveClusterDomainService { @Autowired private TaskBaseService taskBaseService; + @Autowired + private TaskKnowledgePointMapper taskKpMapper; + @Autowired private TaskKnowledgeClusterBaseService taskKnowledgeClusterBaseService; @@ -130,7 +134,8 @@ public class SaveClusterDomainServiceImpl implements SaveClusterDomainService { // 批量插入 taskKnowledgePointBaseService.saveBatch(taskKpList); // 生成目标量 - int targetNum = (int) Math.ceil(2 * u); + double multiplier = getQuestionCountMultiplier(taskEntity); + int targetNum = (int) Math.ceil(2 * u * multiplier); //题目总数 int totalNum = taskEntity.getMultipleChoiceNum() + taskEntity.getSingleChoiceNum() + taskEntity.getTrueFalseNum(); //题目占比系数 @@ -231,4 +236,22 @@ public class SaveClusterDomainServiceImpl implements SaveClusterDomainService { produceDTO.setNeedMultipleCount(needMultipleCount); return produceDTO; } + + /** + * 题目数量系数 = 题目总数 / 知识点数 + * 题目总数 = 单选 + 多选 + 判断(不含简答) + * 知识点数 = 任务下的任务知识点记录数 + */ + private double getQuestionCountMultiplier(TaskEntity task) { + int totalNum = (task.getSingleChoiceNum() == null ? 0 : task.getSingleChoiceNum()) + + (task.getMultipleChoiceNum() == null ? 0 : task.getMultipleChoiceNum()) + + (task.getTrueFalseNum() == null ? 0 : task.getTrueFalseNum()); + Long kpCount = taskKpMapper.selectCount( + new LambdaQueryWrapper() + .eq(TaskKnowledgePointEntity::getTaskId, task.getId())); + if (totalNum <= 0 || kpCount == null || kpCount <= 0) { + return 1.0; + } + return totalNum * 1.0 / kpCount; + } } 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 5e5870d..98a923f 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 @@ -58,6 +58,9 @@ public class QuestionInventoryDomainServiceImpl implements QuestionInventoryDoma } int watermark = getWatermark(task); int targetLine = getTargetLine(task); + if (watermark >= targetLine) { + watermark = targetLine - 1; + } Map questionTypeMap = questionTypeProportion(task); @@ -108,6 +111,10 @@ public class QuestionInventoryDomainServiceImpl implements QuestionInventoryDoma Map questionTypeMap = questionTypeProportion(task); int waterLine = getWatermark(task); + int targetLine = getTargetLine(task); + if (waterLine >= targetLine) { + waterLine = targetLine - 1; + } StringBuilder resultBuilder = new StringBuilder(); resultBuilder.append("=== 库存检查报告 ===\n"); @@ -154,6 +161,8 @@ public class QuestionInventoryDomainServiceImpl implements QuestionInventoryDoma resultBuilder.append(" 知识点总数: ").append(kpCount).append("\n"); resultBuilder.append(" 达标知识点数: ").append(passedCount).append("\n"); resultBuilder.append(" 是否全部达标: ").append(passedCount == kpCount ? "是" : "否").append("\n"); + int targetPerKp = (int) Math.ceil(targetLine * questionTypeMap.get(questionType.name())); + resultBuilder.append(" 应生成题目总数: ").append(kpCount * targetPerKp).append("\n"); } // 多知识点簇检查 @@ -202,6 +211,8 @@ public class QuestionInventoryDomainServiceImpl implements QuestionInventoryDoma resultBuilder.append(" 簇总数: ").append(total).append("\n"); resultBuilder.append(" 达标簇数: ").append(passed).append("\n"); resultBuilder.append(" 是否全部达标: ").append(passed == total ? "是" : "否").append("\n"); + int targetPerCluster = (int) Math.ceil(targetLine * size * questionTypeMap.get(QuestionTypeEnum.MULTIPLE_CHOICE.name())); + resultBuilder.append(" 应生成题目总数: ").append(total * targetPerCluster).append("\n"); } } @@ -261,17 +272,37 @@ public class QuestionInventoryDomainServiceImpl implements QuestionInventoryDoma } /** - * 计算水位线 (watermark = ceil(1.0 * u)) + * 计算水位线 (watermark = ceil(1.0 * u * 题目总数/知识点数)) */ private int getWatermark(TaskEntity task) { - return (int) Math.ceil(1.0 * getUnpassedCount(task)); + double multiplier = getQuestionCountMultiplier(task); + return (int) Math.ceil(1.0 * getUnpassedCount(task) * multiplier); } /** - * 计算目标线 (targetLine = ceil(2 * u)) + * 计算目标线 (targetLine = ceil(2 * u * 题目总数/知识点数)) */ private int getTargetLine(TaskEntity task) { - return (int) Math.ceil(2 * getUnpassedCount(task)); + double multiplier = getQuestionCountMultiplier(task); + return (int) Math.ceil(2 * getUnpassedCount(task) * multiplier); + } + + /** + * 题目数量系数 = 题目总数 / 知识点数 + * 题目总数 = 单选 + 多选 + 判断(不含简答) + * 知识点数 = 任务下的任务知识点记录数 + */ + private double getQuestionCountMultiplier(TaskEntity task) { + int totalNum = (task.getSingleChoiceNum() == null ? 0 : task.getSingleChoiceNum()) + + (task.getMultipleChoiceNum() == null ? 0 : task.getMultipleChoiceNum()) + + (task.getTrueFalseNum() == null ? 0 : task.getTrueFalseNum()); + Long kpCount = taskKpMapper.selectCount( + new LambdaQueryWrapper() + .eq(TaskKnowledgePointEntity::getTaskId, task.getId())); + if (totalNum <= 0 || kpCount == null || kpCount <= 0) { + return 1.0; + } + return totalNum * 1.0 / kpCount; } /**