Browse Source

修改考生密号生成算法,改为8位随机数字,并在保存逻辑处加入循环尝试避免重复的逻辑

luoshi 4 years ago
parent
commit
342f76aaab

+ 9 - 5
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java

@@ -1,7 +1,6 @@
 package cn.com.qmth.stmms.biz.exam.dao;
 
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
@@ -11,8 +10,8 @@ import org.springframework.data.repository.PagingAndSortingRepository;
 import java.util.Date;
 import java.util.List;
 
-public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent, Integer>,
-        JpaSpecificationExecutor<ExamStudent> {
+public interface ExamStudentDao
+        extends PagingAndSortingRepository<ExamStudent, Integer>, JpaSpecificationExecutor<ExamStudent> {
 
     public List<ExamStudent> findByExamId(int examId, Pageable pageable);
 
@@ -35,6 +34,9 @@ public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent,
             + "and s.upload=true and s.absent=false and s.breach=false")
     public long countUploaded(Integer examId);
 
+    @Query("select count(s) from ExamStudent s where s.examId=?1 and s.secretNumber=?2")
+    public long countByExamIdAndSecretNumber(int examId, String secretNumber);
+
     @Query("select count(s) from ExamStudent s where s.examId=?1 and s.campusName=?2")
     public long countByExamIdAndCampusName(int examId, String campusName);
 
@@ -123,7 +125,8 @@ public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent,
 
     @Query("select s from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=true and s.absent=false and s.breach=false and s.uploadTime!=null "
             + "and not exists (select l.id from MarkLibrary l where l.studentId=s.id and l.groupNumber=?3)")
-    public List<ExamStudent> findUnLibraryStudent(Integer examId, String subjectCode, Integer groupNumber, Pageable page);
+    public List<ExamStudent> findUnLibraryStudent(Integer examId, String subjectCode, Integer groupNumber,
+            Pageable page);
 
     @Query("select s from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=true and s.absent=false and s.breach=false and s.uploadTime!=null and s.uploadTime>=?4 "
             + "and not exists (select l.id from MarkLibrary l where l.studentId=s.id and l.groupNumber=?3)")
@@ -150,7 +153,8 @@ public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent,
     public List<String> findDistinctClassName(Integer examId, String subjectCode);
 
     @Query(value = "select s.objective_score+s.subjective_score from eb_exam_student s where s.exam_id=?1 and s.subject_code=?2 and s.is_upload =true and s.is_absent=false and s.is_breach=false order by s.objective_score+s.subjective_score desc limit ?3 ", nativeQuery = true)
-    public List<Double> findHighCountTotalSocreByExamIdAndSubjectCode(Integer examId, String subjectCode, int highCount);
+    public List<Double> findHighCountTotalSocreByExamIdAndSubjectCode(Integer examId, String subjectCode,
+            int highCount);
 
     @Query(value = "select s.objective_score+s.subjective_score from eb_exam_student s where s.exam_id=?1 and s.subject_code=?2 and s.is_upload =true and s.is_absent=false and s.is_breach=false order by s.objective_score+s.subjective_score asc limit ?3 ", nativeQuery = true)
     public List<Double> findLowCountTotalSocreByExamIdAndSubjectCode(Integer examId, String subjectCode, int lowCount);

+ 11 - 5
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamStudent.java

@@ -3,12 +3,11 @@ package cn.com.qmth.stmms.biz.exam.model;
 import cn.com.qmth.stmms.biz.mark.model.ProblemType;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
 import cn.com.qmth.stmms.common.annotation.ExcelField;
-import com.google.common.hash.Hashing;
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.math.RandomUtils;
 
 import javax.persistence.*;
 import java.io.Serializable;
-import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.LinkedList;
@@ -29,6 +28,12 @@ public class ExamStudent implements Serializable {
 
     public static final String SPLIT = ";";
 
+    public static final int SECRET_NUMBER_LENGTH = 8;
+
+    public static final int SECRET_NUMBER_START = 10000000;
+
+    public static final int SECRET_NUMBER_END = 99999999;
+
     @Id
     @GeneratedValue
     private Integer id;
@@ -766,8 +771,9 @@ public class ExamStudent implements Serializable {
         return secretNumber;
     }
 
-    public void resetSecretNumber() {
-        secretNumber = Integer
-                .toUnsignedString(Hashing.murmur3_32().hashString(examNumber, StandardCharsets.UTF_8).asInt());
+    public void randomSecretNumber() {
+        secretNumber = String.valueOf(
+                (int) (RandomUtils.nextDouble() * (SECRET_NUMBER_END - SECRET_NUMBER_START)) + SECRET_NUMBER_START);
     }
+
 }

+ 54 - 35
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java

@@ -16,7 +16,6 @@ import cn.com.qmth.stmms.biz.utils.OriginTag;
 import cn.com.qmth.stmms.biz.utils.PictureConfigTransform;
 import cn.com.qmth.stmms.biz.utils.PictureTag;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
-
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.math.RandomUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,7 +27,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.persistence.criteria.*;
-
 import java.text.DecimalFormat;
 import java.util.*;
 
@@ -86,13 +84,13 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         }
         int success = 0;
         int examId = list.get(0).getExamId();
-        int schoolId = list.get(0).getSchoolId();
         Map<String, ExamSubject> subjectMap = new HashMap<String, ExamSubject>();
         Set<String> packageSet = new HashSet<String>();
+        Set<String> secretNumberSet = new HashSet<>();
 
         for (ExamStudent student : list) {
             ExamSubject subject = null;
-            student.resetSecretNumber();
+            student.randomSecretNumber();
             student.setSubjectCode(StringUtils.trimToNull(student.getSubjectCode()));
             student.setSubjectName(StringUtils.trimToNull(student.getSubjectName()));
             if (!subjectMap.containsKey(student.getSubjectCode())) {
@@ -153,6 +151,15 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             student.setSubjectName(subject.getName());
             student.setSubjectLevel(subject.getLevel());
             student.setSubjectCategory(subject.getCategory());
+            if (student.getSecretNumber() == null) {
+                student.randomSecretNumber();
+                while (secretNumberSet.contains(student.getSecretNumber())
+                        || studentDao.countByExamIdAndSecretNumber(student.getExamId(), student.getSecretNumber())
+                        > 0) {
+                    student.randomSecretNumber();
+                }
+            }
+            secretNumberSet.add(student.getSecretNumber());
         }
         studentDao.save(list);
         return success;
@@ -160,7 +167,6 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
 
     @Transactional
     public ExamStudent save(ExamStudent student) {
-        student.resetSecretNumber();
         student.setSubjectCode(StringUtils.trimToNull(student.getSubjectCode()));
         student.setSubjectName(StringUtils.trimToNull(student.getSubjectName()));
         ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
@@ -193,6 +199,13 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 packageService.save(examPackage);
             }
         }
+
+        if (student.getSecretNumber() == null) {
+            student.randomSecretNumber();
+            while (studentDao.countByExamIdAndSecretNumber(student.getExamId(), student.getSecretNumber()) > 0) {
+                student.randomSecretNumber();
+            }
+        }
         return studentDao.save(student);
     }
 
@@ -362,9 +375,10 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     @Transactional
     public boolean updateScanInfo(ExamStudent student) {
         student.setUploadTime(new Date());
-        return studentDao.updateScanInfo(student.getId(), student.getSheetCount(), student.getSliceCount(),
-                student.getAnswers(), student.getBatchCode(), student.getPaperType(), student.isAbsent(),
-                student.getUploadTime(), student.getObjectiveScore(), student.getObjectiveScoreList()) > 0;
+        return studentDao
+                .updateScanInfo(student.getId(), student.getSheetCount(), student.getSliceCount(), student.getAnswers(),
+                        student.getBatchCode(), student.getPaperType(), student.isAbsent(), student.getUploadTime(),
+                        student.getObjectiveScore(), student.getObjectiveScoreList()) > 0;
     }
 
     @Override
@@ -424,14 +438,14 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             @Override
             public Predicate toPredicate(Root<ExamStudent> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
                 List<Predicate> predicates = new LinkedList<Predicate>();
-                Expression<Double> evaluationItemSum = cb.sum(root.get("objectiveScore").as(Double.class),
-                        root.get("subjectiveScore").as(Double.class));
+                Expression<Double> evaluationItemSum = cb
+                        .sum(root.get("objectiveScore").as(Double.class), root.get("subjectiveScore").as(Double.class));
                 if (query.getStartScroe() != null) {
                     Predicate predicate1 = cb.ge(evaluationItemSum, query.getStartScroe());
                     Predicate predicate2 = cb.le(evaluationItemSum, query.getEndScroe());
                     if (query.getStartScroe() == 0) {
-                        Predicate predicate = cb.or(cb.equal(root.get("absent"), true),
-                                cb.equal(root.get("breach"), true));
+                        Predicate predicate = cb
+                                .or(cb.equal(root.get("absent"), true), cb.equal(root.get("breach"), true));
                         Predicate predicate3 = cb.and(predicate1, predicate2);
                         predicates.add(cb.or(predicate, predicate3));
                     } else {
@@ -591,8 +605,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 if (StringUtils.isNotBlank(query.getTeacher())) {
                     predicates.add(cb.equal(root.get("teacher"), query.getTeacher()));
                 }
-                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
-                        .size()]));
+                return predicates.isEmpty() ?
+                        cb.conjunction() :
+                        cb.and(predicates.toArray(new Predicate[predicates.size()]));
             }
         };
     }
@@ -611,8 +626,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     @Override
     public ExamStudent findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(Integer schoolId, String subjectCode,
             String studentCode, String examSeqCode) {
-        return studentDao.findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(schoolId, subjectCode, studentCode,
-                examSeqCode);
+        return studentDao
+                .findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(schoolId, subjectCode, studentCode, examSeqCode);
     }
 
     @Override
@@ -645,9 +660,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         query.setPageNumber(1);
         query.setPageSize(1);
         query.setSort(new Sort(Direction.ASC, "uploadTime", "id"));
-        List<ExamStudent> list = minUploadTime != null ? studentDao.findUnLibraryStudent(examId, subjectCode,
-                groupNumber, minUploadTime, query) : studentDao.findUnLibraryStudent(examId, subjectCode, groupNumber,
-                query);
+        List<ExamStudent> list = minUploadTime != null ?
+                studentDao.findUnLibraryStudent(examId, subjectCode, groupNumber, minUploadTime, query) :
+                studentDao.findUnLibraryStudent(examId, subjectCode, groupNumber, query);
         return list.isEmpty() ? null : list.get(0);
     }
 
@@ -686,7 +701,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         return countByQuery(query);
     }
 
-    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent, boolean breach) {
+    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent,
+            boolean breach) {
         ExamStudentSearchQuery query = new ExamStudentSearchQuery();
         query.setExamId(examId);
         query.setSubjectCode(subjectCode);
@@ -734,8 +750,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         // 构造评卷标记信息
         Exam exam = examService.findById(student.getExamId());
         ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
-        List<PictureConfigItem> sliceConfig = subject.getSliceConfigList().isEmpty() ? exam.getSliceConfigList()
-                : subject.getSliceConfigList();
+        List<PictureConfigItem> sliceConfig = subject.getSliceConfigList().isEmpty() ?
+                exam.getSliceConfigList() :
+                subject.getSliceConfigList();
         if (!sliceConfig.isEmpty()) {
             List<PictureTag> tags = PictureConfigTransform.process(sliceConfig, getSliceTags(student)).get(index);
             if (tags != null) {
@@ -753,8 +770,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         Map<MarkGroup, List<OriginTag>> tagMap = new HashMap<MarkGroup, List<OriginTag>>();
         Exam exam = examService.findById(student.getExamId());
         ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
-        List<PictureConfigItem> sliceConfig = subject.getSliceConfigList().isEmpty() ? exam.getSliceConfigList()
-                : subject.getSliceConfigList();
+        List<PictureConfigItem> sliceConfig = subject.getSliceConfigList().isEmpty() ?
+                exam.getSliceConfigList() :
+                subject.getSliceConfigList();
         if (!sliceConfig.isEmpty()) {
             // 有裁切图配置时才需要获取原始评卷标记信息
             tagMap = getSliceTags(student);
@@ -775,8 +793,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     @Override
     public Map<MarkGroup, List<OriginTag>> getSliceTags(ExamStudent student) {
         Map<MarkGroup, List<OriginTag>> tagMap = new HashMap<MarkGroup, List<OriginTag>>();
-        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjective(student.getExamId(),
-                student.getSubjectCode(), false);
+        List<ExamQuestion> questions = questionService
+                .findByExamAndSubjectAndObjective(student.getExamId(), student.getSubjectCode(), false);
         List<ScoreItem> scoreList = student.getScoreList(false);
         List<MarkGroup> markGroups = groupService.findByExamAndSubject(student.getExamId(), student.getSubjectCode());
         for (MarkGroup group : markGroups) {
@@ -798,13 +816,14 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         List<String> lines = new LinkedList<>();
         lines.add("成绩明细");
         // 总分得分明细
-        lines.add("总分 (客观+主观) | " + format.format(student.getTotalScore()) + "="
-                + format.format(student.getObjectiveScore() != null ? student.getObjectiveScore() : 0) + "+"
-                + format.format(student.getSubjectiveScore() != null ? student.getSubjectiveScore() : 0));
+        lines.add("总分 (客观+主观) | " + format.format(student.getTotalScore()) + "=" + format
+                .format(student.getObjectiveScore() != null ? student.getObjectiveScore() : 0) + "+" + format
+                .format(student.getSubjectiveScore() != null ? student.getSubjectiveScore() : 0));
         // 客观题得分明细
         List<String> objectives = new LinkedList<>();
-        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndPaperType(
-                student.getExamId(), student.getSubjectCode(), true, student.getPaperType());
+        List<ExamQuestion> questions = questionService
+                .findByExamAndSubjectAndObjectiveAndPaperType(student.getExamId(), student.getSubjectCode(), true,
+                        student.getPaperType());
         List<ScoreItem> scoreList = student.getScoreList(true);
         List<String> details = new ArrayList<>();
         int i = 0;
@@ -884,14 +903,14 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             // 添加轨迹分
             List<MarkTrack> tracks = trackService.findByLibraryId(selected.getId());
             for (MarkTrack markTrack : tracks) {
-                originTags.add(new OriginTag(format.format(markTrack.getScore()), markTrack.getPositionX(), markTrack
-                        .getPositionY()));
+                originTags.add(new OriginTag(format.format(markTrack.getScore()), markTrack.getPositionX(),
+                        markTrack.getPositionY()));
             }
             // 添加特殊标记
             List<MarkSpecialTag> specialTags = specialTagService.findByLibraryId(selected.getId());
             for (MarkSpecialTag markSpecialTag : specialTags) {
-                originTags.add(new OriginTag(markSpecialTag.getTagName(), markSpecialTag.getPositionX(), markSpecialTag
-                        .getPositionY()));
+                originTags.add(new OriginTag(markSpecialTag.getTagName(), markSpecialTag.getPositionX(),
+                        markSpecialTag.getPositionY()));
             }
         }
         return originTags;