xiahan 1 рік тому
батько
коміт
0e7abeabe4

+ 9 - 5
cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/service/impl/SaveCheckItemServiceImpl.java

@@ -35,6 +35,7 @@ import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import static com.rongwei.sfcommon.utils.CommonUtil.streamCodeGeneration;
 import static com.rongwei.sfcommon.utils.MlConstants.*;
 
 @Service
@@ -150,11 +151,14 @@ public class SaveCheckItemServiceImpl implements SaveCheckItemService {
             hiddenDangerTrack.setFindtime(checkItemDo.getCreatedate());
             hiddenDangerTrack.setActualchecktime(checkItemDo.getActualchecktime());
             hiddenDangerTrack.setStatus(MlConstants.HIDDEN_DANGER_STATUS_NOTCLOSE);
-            // 总编号生成
-            SysSerialVo sysSerialVo = new SysSerialVo();
-            sysSerialVo.setRuleTemplateStr("@{date:yyyyMMdd}@{serialNumber:#000000}");
-            sysSerialVo.setModulecode("asp_hidden_danger_track_CODE");
-            hiddenDangerTrack.setCode(sysSerialNumberService.getCodeByTemplate(sysSerialVo));
+
+
+            // 点检编号
+
+            String pointcheckcode = streamCodeGeneration("asp_hidden_danger_track_code_aq",
+                    "@{date:yyyyMMdd}@{serialNumber:#000000}","date:yyyy", themeCheck.getTenantid());
+
+            hiddenDangerTrack.setCode(pointcheckcode);
 
             hiddenDangerTrack.setHiddendangertype(info.getType());
             hiddenDangerTrack.setHiddendangerclassify(info.getClassification());

+ 71 - 30
rw-training/training-common/src/main/java/com/rongwei/trainingcommon/sys/service/impl/TrainingExamPaperServiceImpl.java

@@ -2,6 +2,7 @@ package com.rongwei.trainingcommon.sys.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.rongwei.rwcommon.base.R;
+import com.rongwei.rwcommon.utils.StringUtils;
 import com.rongwei.training.domain.ExamPaperDo;
 import com.rongwei.training.domain.PaperSubjectAssignDo;
 import com.rongwei.training.domain.PaperSubjectAutoDo;
@@ -19,6 +20,8 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -42,49 +45,44 @@ public class TrainingExamPaperServiceImpl extends ServiceImpl<ExamPaperDao, Exam
     @Autowired
     private PaperSubjectAutoService paperSubjectAutoService;
 
+    public static final Long ZERO= 0L;
+
     @Override
     public R saveOrUpdate(TrainingPaperVo vo) {
+        // 固定题目
         List<PaperSubjectAssignDo> paperSubjectAssignDos = vo.getPapersubjectassigndos();
+        // 随机题目
         List<PaperSubjectAutoDo> paperSubjectAutoDos = vo.getPapersubjectautodos();
         logger.info("固定题目信息: {}", paperSubjectAssignDos);
         logger.info("随机题目信息: {}", paperSubjectAutoDos);
         // 当随机题目不为空时
         if (paperSubjectAutoDos != null && !paperSubjectAutoDos.isEmpty()) {
+            // 存放考题类型和所需要的题目数量
+            Map<String, Long> subjectTypeAndNum = paperSubjectAutoDos.stream().collect(Collectors.groupingBy(info -> info.getSubjecttype(), Collectors.counting()));
+            if (paperSubjectAssignDos != null && !paperSubjectAssignDos.isEmpty()) {
+                Map<String, Long> collect = paperSubjectAssignDos.stream().collect(Collectors.groupingBy(info -> info.getSubjecttype(), Collectors.counting()));
+                collect.forEach((key, value) -> subjectTypeAndNum.merge(key, value,(prev, one) -> prev + one ));
+            }
             // 获取课程Id
             List<String> courseThemeId = paperSubjectAutoDos.stream().map(PaperSubjectAutoDo::getCoursethemeid).collect(Collectors.toList());
             // 获取随机题目中课程主题的所有题目信息
             List<SubjectDo> subjectDoList = subjectDao.selectInfoByCourseIds(courseThemeId);
-            logger.info("课程对应的题目信息: {}", subjectDoList);
-            // 按照课程ID 和课程类型进行分组 获取每个课程和题目类型 所拥有的题目数量
-            // 是否需要校验固定题目数量
-            boolean assignSubjectCheck = paperSubjectAssignDos != null && !paperSubjectAssignDos.isEmpty();
-            // 随机题目按照课程ID和 题目类型进行分组
-            Map<String, List<PaperSubjectAutoDo>> collect = paperSubjectAutoDos.stream().collect(Collectors.groupingBy(autoSubject -> autoSubject.getCoursethemeid() + ";" + autoSubject.getSubjecttype()));
-            for (Map.Entry<String, List<PaperSubjectAutoDo>> map : collect.entrySet()) {
-                // 该考题所分配的数量
-                int subjectNum = map.getValue().stream().mapToInt(PaperSubjectAutoDo::getThemesubjectnum).sum();
-                // 题目类型
-                String subjectType = map.getValue().get(0).getSubjecttype();
-                // 课程Id
-                String courseId = map.getValue().get(0).getCoursethemeid();
-                String courseThemeName = map.getValue().get(0).getCoursethemename();
-                // 校验固定题目中是否还有相同类型的题目 (1.课程主题一致,2.考题类型一致)
-                int assignSubjectNum = 0;
-                if (assignSubjectCheck) {
-                    // 获取固定题目中取出的题目数量
-                    assignSubjectNum = (int) paperSubjectAssignDos
-                            .stream()
-                            .filter(assignDo -> assignDo.getCourseid().contains(courseId) && assignDo.getSubjecttype().equals(subjectType))
-                            .count();
-                }
-                // 获取题库中当前课程主题下有多少道题目类型相同的题
-                int count = (int) subjectDoList.stream().filter(subjectDo -> subjectDo.getSubjectcourseids().contains(courseId) && subjectDo.getSubjecttype().equals(subjectType)).count();
-                logger.info("当前试卷从课程:{}从取出题目类型为:{}的随机题目: {}道,取出固定题目:{}道,当前题库中共有:{}道", courseThemeName, subjectType, subjectNum, assignSubjectNum, count);
-                if (count < subjectNum + assignSubjectNum) {
-                    logger.error("{}题目数不够", courseThemeName);
-                    return R.errorWithMsg(courseThemeName + "的题目数不够");
+            // 获取所有课程主题下 各类型题目的数量
+            Map<String, Long> subjectMap = subjectDoList.stream().collect(Collectors.groupingBy(info -> info.getSubjecttype(), Collectors.counting()));
+
+            for (Map.Entry<String, Long> entry : subjectTypeAndNum.entrySet()) {
+                String k = entry.getKey();
+                Long v = entry.getValue();
+                if (v > subjectMap.getOrDefault(k, ZERO)) {
+                    return  R.errorWithMsg("题目数量不够");
                 }
             }
+
+            // 校验题目数量是否足够
+            String courseThemeName = questionCheck(paperSubjectAssignDos, paperSubjectAutoDos, subjectDoList);
+            if (StringUtils.isNotBlank(courseThemeName)) {
+                R.errorWithMsg(courseThemeName + "的题目数不够");
+            }
         }
         logger.info("开始保存试卷信息和题目");
         ExamPaperDo examPaperDo = new ExamPaperDo();
@@ -107,4 +105,47 @@ public class TrainingExamPaperServiceImpl extends ServiceImpl<ExamPaperDao, Exam
         }
         return R.saveOk();
     }
-}
+
+    /**
+     * 所需题目数校验
+     *
+     * @param paperSubjectAssignDos
+     * @param paperSubjectAutoDos
+     * @return
+     */
+    public String questionCheck(List<PaperSubjectAssignDo> paperSubjectAssignDos, List<PaperSubjectAutoDo> paperSubjectAutoDos, List<SubjectDo> subjectDoList) {
+
+        logger.info("课程对应的题目信息: {}", subjectDoList);
+        // 按照课程ID 和课程类型进行分组 获取每个课程和题目类型 所拥有的题目数量
+        // 是否需要校验固定题目数量
+        boolean assignSubjectCheck = paperSubjectAssignDos != null && !paperSubjectAssignDos.isEmpty();
+        // 随机题目按照课程ID和 题目类型进行分组
+        Map<String, List<PaperSubjectAutoDo>> collect = paperSubjectAutoDos.stream().collect(Collectors.groupingBy(autoSubject -> autoSubject.getCoursethemeid() + ";" + autoSubject.getSubjecttype()));
+        for (Map.Entry<String, List<PaperSubjectAutoDo>> map : collect.entrySet()) {
+            // 该考题所分配的数量
+            int subjectNum = map.getValue().stream().mapToInt(PaperSubjectAutoDo::getThemesubjectnum).sum();
+            // 题目类型
+            String subjectType = map.getValue().get(0).getSubjecttype();
+            // 课程Id
+            String courseId = map.getValue().get(0).getCoursethemeid();
+            String courseThemeName = map.getValue().get(0).getCoursethemename();
+            // 校验固定题目中是否还有相同类型的题目 (1.课程主题一致,2.考题类型一致)
+            int assignSubjectNum = 0;
+            if (assignSubjectCheck) {
+                // 获取固定题目中取出的题目数量
+                assignSubjectNum = (int) paperSubjectAssignDos
+                        .stream()
+                        .filter(assignDo -> assignDo.getCourseid().contains(courseId) && assignDo.getSubjecttype().equals(subjectType))
+                        .count();
+            }
+            // 获取题库中当前课程主题下有多少道题目类型相同的题
+            int count = (int) subjectDoList.stream().filter(subjectDo -> subjectDo.getSubjectcourseids().contains(courseId) && subjectDo.getSubjecttype().equals(subjectType)).count();
+            logger.info("当前试卷从课程:{}从取出题目类型为:{}的随机题目: {}道,取出固定题目:{}道,当前题库中共有:{}道", courseThemeName, subjectType, subjectNum, assignSubjectNum, count);
+            if (count < subjectNum + assignSubjectNum) {
+                logger.error("{}题目数不够", courseThemeName);
+                return courseThemeName;
+            }
+        }
+        return "";
+    }
+}