Bläddra i källkod

准考证号生成和唯一校验

wangliang 2 år sedan
förälder
incheckning
5985c2dfee

+ 10 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/PrintCommonService.java

@@ -230,6 +230,14 @@ public interface PrintCommonService {
      */
     public String createPaperNumber(Long schoolId, Long examId);
 
+    /**
+     * 生成唯一的准考证号
+     *
+     * @param schoolId
+     * @return
+     */
+    public String createTicketNumber(Long schoolId);
+
     /**
      * 校验是否可以提交
      *
@@ -306,10 +314,10 @@ public interface PrintCommonService {
      *
      * @param schoolId    学校ID
      * @param paperNumber 试卷编号
-     * @param examId 考试id
+     * @param examId      考试id
      * @param paperType   试卷类型
      */
-    public void updateGradeBatchStatus(Long schoolId,Long examId, String paperNumber, String paperType);
+    public void updateGradeBatchStatus(Long schoolId, Long examId, String paperNumber, String paperType);
 
     void saveAttachmentPackagePdf(PdfPackageDto pdfPackageDto, ExamDetail examDetail, List<PdfDto> variablePdfList, Integer printCount, List<File> fileTempList);
 

+ 22 - 14
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java

@@ -15,7 +15,10 @@ import com.qmth.distributed.print.business.bean.result.ExaminationDetailResult;
 import com.qmth.distributed.print.business.bean.result.ExaminationResult;
 import com.qmth.distributed.print.business.bean.result.SummarizedDataResult;
 import com.qmth.distributed.print.business.entity.*;
-import com.qmth.distributed.print.business.enums.*;
+import com.qmth.distributed.print.business.enums.ExamDataSourceEnum;
+import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
+import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
+import com.qmth.distributed.print.business.enums.StudentClazzEnum;
 import com.qmth.distributed.print.business.mapper.ExamDetailMapper;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
@@ -103,9 +106,6 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
     @Resource
     TeachcloudCommonService teachcloudCommonService;
 
-    @Resource
-    BasicCampusService basicCampusService;
-
     @Resource
     ExamTaskService examTaskService;
 
@@ -121,6 +121,9 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
     @Resource
     BasicRoleDataPermissionService basicRoleDataPermissionService;
 
+    @Resource
+    private PrintCommonService printCommonService;
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public double calculateTotalSubjects(Long printPlanId) {
@@ -348,7 +351,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
         return summarizedDataResult;*/
 
         SummarizedDataResult summarizedDataResult = this.baseMapper.findSummarizedData(schoolId, semesterId, examId, printPlanIdList, courseCode, paperNumber, examPlace, examRoom, packageCode, startDate, endDate, dpr);
-        if(summarizedDataResult ==null){
+        if (summarizedDataResult == null) {
             summarizedDataResult = new SummarizedDataResult();
             summarizedDataResult.setSchoolId(schoolId);
             summarizedDataResult.setTotalSubjects(0);
@@ -653,12 +656,12 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
     public void disposeExamStudentByExaminationExcel(Long examId, List<ExaminationImportDto> dataList, Long userId, SysUser sysUser) throws IllegalAccessException {
         BasicExam basicExam = basicExamService.getById(examId);
         // 查询学期下所有考务数据的准考证号集合
-        List<String> examStudentTicketNumberList = examStudentService.listTicketNumberBySemesterId(basicExam.getSemesterId(), examId);
+//        List<String> examStudentTicketNumberList = examStudentService.listTicketNumberBySemesterId(basicExam.getSemesterId(), examId);
 
         List<ExamStudent> examStudentList = new ArrayList<>();
         List<BasicStudentExtrasParam> basicStudentExtrasParamList = new ArrayList<>();
         Map<String, Integer> ticketNumberCodeMap = new HashMap<>();
-        Set<String> ticketNumberRepeatList = new HashSet<>();
+//        Set<String> ticketNumberRepeatList = new HashSet<>();
         StringJoiner stringJoiner = new StringJoiner(",");
         for (ExaminationImportDto examinationImportDto : dataList) {
             Long schoolId = examinationImportDto.getSchoolId();
@@ -672,7 +675,12 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
             String paperNumber = examinationImportDto.getPaperNumber();
             String studentName = examinationImportDto.getStudentName();
             String studentCode = examinationImportDto.getStudentCode();
-            String ticketNumber = examinationImportDto.getTicketNumber();
+            String ticketNumber = null;
+            if (Objects.isNull(examinationImportDto.getTicketNumber()) || Objects.equals(examinationImportDto.getTicketNumber().trim(), "")) {//如果为空
+                ticketNumber = printCommonService.createTicketNumber(schoolId);
+            } else {
+                ticketNumber = examinationImportDto.getTicketNumber();
+            }
             String siteNumber = examinationImportDto.getSiteNumber();
             String collegeName = examinationImportDto.getCollegeName();
             String majorName = examinationImportDto.getMajorName();
@@ -684,9 +692,9 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
                 ticketNumberCodeMap.put(ticketNumber, 1);
             }
 
-            if (!examStudentTicketNumberList.isEmpty() && examStudentTicketNumberList.contains(ticketNumber)) {
-                ticketNumberRepeatList.add(ticketNumber);
-            }
+//            if (!examStudentTicketNumberList.isEmpty() && examStudentTicketNumberList.contains(ticketNumber)) {
+//                ticketNumberRepeatList.add(ticketNumber);
+//            }
 
             List<FieldsDto> fieldsDtoList = examinationImportDto.getSecondaryFieldList();
             List<ExtendFieldsDto> extendFieldsDtoList = this.getExtendFieldsByFields(fieldsDtoList);
@@ -745,9 +753,9 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
         if (!stringList.isEmpty()) {
             stringJoiner.add(String.join(",", stringList));
         }
-        if (!ticketNumberRepeatList.isEmpty()) {
-            stringJoiner.add("考号[" + String.join(",", ticketNumberRepeatList) + "]在当前考试下已存在");
-        }
+//        if (!ticketNumberRepeatList.isEmpty()) {
+//            stringJoiner.add("考号[" + String.join(",", ticketNumberRepeatList) + "]在当前考试下已存在");
+//        }
         if (stringJoiner.toString().length() > 1) {
             throw ExceptionResultEnum.ERROR.exception(stringJoiner.toString());
         }

+ 12 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceImpl.java

@@ -1011,6 +1011,18 @@ public class PrintCommonServiceImpl implements PrintCommonService {
         }
     }
 
+    /**
+     * 生成唯一的准考证号
+     *
+     * @param schoolId
+     * @return
+     */
+    @Override
+    public String createTicketNumber(Long schoolId) {
+        String date = DateUtil.today().replace(SystemConstant.HYPHEN, "");
+        return convertUtil.getIncre(date.substring(2, date.length()), "ticketNumber" + schoolId, 4);
+    }
+
     /**
      * 校验是否可以提交
      *

+ 18 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java

@@ -1,5 +1,6 @@
 package com.qmth.distributed.print.business.templete.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -49,6 +50,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.support.atomic.RedisAtomicLong;
 import org.springframework.stereotype.Service;
@@ -878,6 +880,10 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         String key = serialNumberParams.getModel() + serialNumberParams.getPrefix();
         RedisAtomicLong counter = new RedisAtomicLong(key, Objects.requireNonNull(redisTemplate.getConnectionFactory()));
         Long value = counter.get();
+        String date = DateUtil.today().replace(SystemConstant.HYPHEN, "");
+        String keyStudent = "ticketNumber" + tbTask.getSchoolId() + date.substring(2, date.length());
+        RedisAtomicLong counterStudent = new RedisAtomicLong(keyStudent, Objects.requireNonNull(redisTemplate.getConnectionFactory()));
+        Long valueStudent = counterStudent.get();
         try {
             // 组装exam_detail数据
             List<Long> examDetailIdList = examDetailService.disposeExamDetailByExaminationExcel(examPrintPlan.getExamId(), examinationImportDtoList, userId, serialNumberParams, sysUser);
@@ -894,9 +900,19 @@ public class TaskLogicServiceImpl implements TaskLogicService {
             map.put("dataCount", examinationImportDtoList.size());
         } catch (Exception e) {
             redisTemplate.opsForValue().set(key, value);
-            throw new RuntimeException(e);
+            redisTemplate.opsForValue().set(keyStudent, valueStudent);
+            if (e instanceof DuplicateKeyException) {
+                String errorColumn = e.getCause().toString();
+                String columnStr = errorColumn.substring(errorColumn.lastIndexOf("key") + 3, errorColumn.length()).replaceAll("'", "");
+                String[] data = errorColumn.split("-");
+                data[1] = data[1].substring(0, data[1].indexOf("'"));
+                throw ExceptionResultEnum.SQL_ERROR.exception("[" + FieldUniqueEnum.convertToTitle(columnStr) + "'" + data[1] + "']" + "数据不允许重复插入");
+            } else if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
         }
-
         return map;
     }
 

+ 3 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FieldUniqueEnum.java

@@ -35,7 +35,9 @@ public enum FieldUniqueEnum {
 
     custom_flow_schoolId_type_idx("流程类型"),
 
-    role_group_roleId_memberId_idx("角色成员数据重复,同角色其它用户已绑定");
+    role_group_roleId_memberId_idx("角色成员数据重复,同角色其它用户已绑定"),
+
+    unique_ticket_number_idx("学校准考证号");
 
     private String title;