xiaofei 1 жил өмнө
parent
commit
426b48ea37
13 өөрчлөгдсөн 178 нэмэгдсэн , 315 устгасан
  1. 3 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailService.java
  2. 0 17
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/PrintCommonService.java
  3. 43 125
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java
  4. 10 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  5. 6 49
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceImpl.java
  6. 3 19
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java
  7. 28 0
      distributed-print/src/test/java/com/qmth/distributed/print/RedisCounterTest.java
  8. 7 5
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java
  9. 0 86
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/ConvertUtil.java
  10. 39 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/RedisCounterUtil.java
  11. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanAnswerCardService.java
  12. 8 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanAnswerCardServiceImpl.java
  13. 29 3
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/service/impl/PrintFinishServiceImpl.java

+ 3 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailService.java

@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.distributed.print.business.bean.dto.*;
 import com.qmth.distributed.print.business.bean.dto.initMarkData.ExamDetailCourseInitMarkDto;
 import com.qmth.distributed.print.business.bean.examRule.FieldsDto;
-import com.qmth.distributed.print.business.bean.params.SerialNumberParams;
 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;
@@ -169,11 +168,10 @@ public interface ExamDetailService extends IService<ExamDetail> {
     /**
      * 根据考务数据Excel数据处理考务-场次表
      *
-     * @param dataList           Excel处理后的数据
-     * @param serialNumberParams 序列号生成参数
+     * @param dataList Excel处理后的数据
      * @param sysUser
      */
-    List<Long> disposeExamDataByExaminationExcel(ExamPrintPlan examPrintPlan, List<ExaminationImportDto> dataList, SerialNumberParams serialNumberParams, SysUser sysUser);
+    List<Long> disposeExamDataByExaminationExcel(ExamPrintPlan examPrintPlan, List<ExaminationImportDto> dataList, SysUser sysUser);
 
     /**
      * 删除考务数据
@@ -248,7 +246,7 @@ public interface ExamDetailService extends IService<ExamDetail> {
     void resetExamDetail(Long entityId, boolean clearPaperType);
 
     List<ExamDetailCourseInitMarkDto> listPrintFinishExamDetailCourse(String printStatus, long startTime, String markStatus);
-    
+
     List<ExamDetail> listByExamAndPackage(Long examId, String packageCode);
 
 }

+ 0 - 17
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/PrintCommonService.java

@@ -234,23 +234,6 @@ public interface PrintCommonService {
      */
     List<ExamStudent> createBatchStudentByStudentList(Long schoolId, Long examId, String semesterId, ExamTask examTask, String extendFields, List<ExamTaskStudentObjectParam> examTaskStudentObjectParamList, Long examDetailCourseId, Long cardRuleId, SysUser sysUser);
 
-    /**
-     * 生成准考证号
-     *
-     * @param serialNumberParams
-     * @return
-     */
-    String createTempNumber(SerialNumberParams serialNumberParams);
-
-    /**
-     * 生成准考证号
-     *
-     * @param schoolId   学校ID
-     * @param totalDigit 考号位数
-     * @return
-     */
-    String createTicketNumber(List<String> examStudentTicketNumberList, Long schoolId, Integer totalDigit);
-
     /**
      * 保存任务附件(导出)
      *

+ 43 - 125
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java

@@ -1,44 +1,5 @@
 package com.qmth.distributed.print.business.service.impl;
 
-import java.io.IOException;
-import java.net.URLEncoder;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import javax.annotation.Resource;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.ss.usermodel.FillPatternType;
-import org.apache.poi.ss.usermodel.Font;
-import org.apache.poi.ss.usermodel.HorizontalAlignment;
-import org.apache.poi.ss.usermodel.IndexedColors;
-import org.apache.poi.ss.util.CellRangeAddress;
-import org.apache.poi.xssf.usermodel.XSSFCell;
-import org.apache.poi.xssf.usermodel.XSSFCellStyle;
-import org.apache.poi.xssf.usermodel.XSSFRow;
-import org.apache.poi.xssf.usermodel.XSSFSheet;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.dao.DataIntegrityViolationException;
-import org.springframework.jdbc.BadSqlGrammarException;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-import org.springframework.web.multipart.MultipartFile;
-
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -49,83 +10,53 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.boot.api.exception.ApiException;
-import com.qmth.distributed.print.business.bean.dto.ClientExamStudentDto;
-import com.qmth.distributed.print.business.bean.dto.ExamDetailCourseDto;
-import com.qmth.distributed.print.business.bean.dto.ExamDetailPdfDownloadDto;
-import com.qmth.distributed.print.business.bean.dto.ExaminationExportDto;
-import com.qmth.distributed.print.business.bean.dto.ExaminationImportDto;
-import com.qmth.distributed.print.business.bean.dto.PrintTaskDto;
-import com.qmth.distributed.print.business.bean.dto.PrintTaskTotalDto;
+import com.qmth.distributed.print.business.bean.dto.*;
 import com.qmth.distributed.print.business.bean.dto.initMarkData.ExamDetailCourseInitMarkDto;
 import com.qmth.distributed.print.business.bean.examRule.CodeNameEnableValue;
 import com.qmth.distributed.print.business.bean.examRule.FieldsDto;
-import com.qmth.distributed.print.business.bean.params.SerialNumberParams;
 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.BasicCardRule;
-import com.qmth.distributed.print.business.entity.BasicExamRule;
-import com.qmth.distributed.print.business.entity.ClientPrintData;
-import com.qmth.distributed.print.business.entity.ClientStatus;
-import com.qmth.distributed.print.business.entity.ExamDetail;
-import com.qmth.distributed.print.business.entity.ExamDetailCourse;
-import com.qmth.distributed.print.business.entity.ExamPrintPlan;
-import com.qmth.distributed.print.business.entity.ExamStudent;
-import com.qmth.distributed.print.business.entity.ExamTask;
-import com.qmth.distributed.print.business.entity.ExamTaskDetail;
-import com.qmth.distributed.print.business.entity.TeachClazz;
-import com.qmth.distributed.print.business.enums.CardTypeEnum;
-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.enums.SyncCardTypeEnum;
+import com.qmth.distributed.print.business.entity.*;
+import com.qmth.distributed.print.business.enums.*;
 import com.qmth.distributed.print.business.mapper.ExamDetailMapper;
-import com.qmth.distributed.print.business.service.BasicCardRuleService;
-import com.qmth.distributed.print.business.service.BasicExamRuleService;
-import com.qmth.distributed.print.business.service.BasicPrintConfigService;
-import com.qmth.distributed.print.business.service.ClientPrintDataService;
-import com.qmth.distributed.print.business.service.ClientStatusService;
-import com.qmth.distributed.print.business.service.ExamDetailCoursePaperTypeService;
-import com.qmth.distributed.print.business.service.ExamDetailCourseService;
-import com.qmth.distributed.print.business.service.ExamDetailService;
-import com.qmth.distributed.print.business.service.ExamPrintPlanService;
-import com.qmth.distributed.print.business.service.ExamStudentService;
-import com.qmth.distributed.print.business.service.ExamTaskDetailService;
-import com.qmth.distributed.print.business.service.ExamTaskService;
-import com.qmth.distributed.print.business.service.PrintCommonService;
-import com.qmth.distributed.print.business.service.TeachClazzService;
+import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.templete.execute.AsyncExaminationImportTemplateService;
+import com.qmth.teachcloud.common.util.RedisCounterUtil;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
 import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.bean.result.TbTaskDetailResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.entity.BasicAttachment;
-import com.qmth.teachcloud.common.entity.BasicClazz;
-import com.qmth.teachcloud.common.entity.BasicPrintConfig;
-import com.qmth.teachcloud.common.entity.SysOrg;
-import com.qmth.teachcloud.common.entity.SysUser;
-import com.qmth.teachcloud.common.entity.TBTask;
-import com.qmth.teachcloud.common.enums.CardCreateMethodEnum;
-import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.enums.MqTagEnum;
-import com.qmth.teachcloud.common.enums.OrgTypeEnum;
-import com.qmth.teachcloud.common.enums.PdfTypeEnum;
-import com.qmth.teachcloud.common.enums.TaskStatusEnum;
-import com.qmth.teachcloud.common.enums.TaskTypeEnum;
-import com.qmth.teachcloud.common.service.BasicAttachmentService;
-import com.qmth.teachcloud.common.service.BasicClazzService;
-import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
-import com.qmth.teachcloud.common.service.CommonCacheService;
-import com.qmth.teachcloud.common.service.SysOrgService;
-import com.qmth.teachcloud.common.service.SysUserService;
-import com.qmth.teachcloud.common.service.TBTaskService;
-import com.qmth.teachcloud.common.service.TeachcloudCommonService;
-import com.qmth.teachcloud.common.util.ConvertUtil;
-import com.qmth.teachcloud.common.util.JdbcErrorUtil;
-import com.qmth.teachcloud.common.util.RedisUtil;
-import com.qmth.teachcloud.common.util.ResultUtil;
-import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.common.entity.*;
+import com.qmth.teachcloud.common.enums.*;
+import com.qmth.teachcloud.common.service.*;
+import com.qmth.teachcloud.common.util.*;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.FillPatternType;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.IndexedColors;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.jdbc.BadSqlGrammarException;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * <p>
@@ -173,7 +104,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
     TBTaskService tbTaskService;
 
     @Resource
-    ConvertUtil convertUtil;
+    RedisCounterUtil redisCounterUtil;
 
     @Resource
     private ClientPrintDataService clientPrintDataService;
@@ -253,7 +184,6 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
 
         if (printTaskTotalDto != null) {
             // 试卷总计
-            int paperCount = 0;
             Integer paperNumberCount = this.baseMapper.selectPaperCount(schoolId, semesterId, examId, printPlanId, status, courseCode, paperNumber, examPlace, examRoom, examStartTime, examEndTime, printHouseId, dpr);
             printTaskTotalDto.setPaperCount(paperNumberCount);
         }
@@ -666,7 +596,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public List<Long> disposeExamDataByExaminationExcel(ExamPrintPlan examPrintPlan, List<ExaminationImportDto> dataList, SerialNumberParams serialNumberParams, SysUser sysUser) {
+    public List<Long> disposeExamDataByExaminationExcel(ExamPrintPlan examPrintPlan, List<ExaminationImportDto> dataList, SysUser sysUser) {
         try {
             List<Map<String, Object>> examDetailKeyList = dataList.stream().flatMap(e -> {
                 Long schoolIdId = e.getSchoolId();
@@ -705,7 +635,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
 
                 ExamDetail examDetail = new ExamDetail();
                 examDetail.setId(SystemConstant.getDbUuid());
-                examDetail.setPackageCode(convertUtil.getIncre(serialNumberParams.getPrefix(), serialNumberParams.getModel(), serialNumberParams.getDigit()));
+                examDetail.setPackageCode("1" + redisCounterUtil.getCounter(schoolId, 6, "packageCode"));
                 examDetail.setSchoolId(schoolId);
                 examDetail.setOrgId(sysUser.getOrgId());
                 examDetail.setPrintPlanId(examPrintPlan.getId());
@@ -797,10 +727,6 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
      */
     private void disposeExamStudentData(Long examId, Long examDetailCourseId, List<ExaminationImportDto> examDetailCourseStudentList, SysUser sysUser) {
         BasicPrintConfig basicPrintConfig = basicPrintConfigService.getByExamId(examId);
-        BasicCardRule basicCardRule = basicCardRuleService.getById(basicPrintConfig.getCardRuleId());
-
-        // 查询学期下所有考务数据的准考证号集合
-        List<String> examStudentTicketNumberList = examStudentService.listTicketNumberByExamId(examId);
 
         List<ExamStudent> examStudentList = new ArrayList<>();
         Long schoolId = sysUser.getSchoolId();
@@ -808,13 +734,6 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
             String paperNumber = examinationImportDto.getPaperNumber();
             String studentName = examinationImportDto.getStudentName();
             String studentCode = examinationImportDto.getStudentCode();
-            String ticketNumber;
-            //如果为空,系统自动生成准考证号
-            if (StringUtils.isBlank(examinationImportDto.getTicketNumber()) || Objects.equals(examinationImportDto.getTicketNumber().trim(), "")) {
-                ticketNumber = printCommonService.createTicketNumber(examStudentTicketNumberList, schoolId, basicCardRule == null ? null : basicCardRule.getExamNumberDigit());
-            } else {
-                ticketNumber = examinationImportDto.getTicketNumber().trim();
-            }
             String siteNumber = examinationImportDto.getSiteNumber();
             String collegeName = examinationImportDto.getCollegeName();
             String majorName = examinationImportDto.getMajorName();
@@ -832,7 +751,6 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
             examStudent.setPaperNumber(paperNumber);
             examStudent.setStudentCode(studentCode);
             examStudent.setStudentName(studentName);
-            examStudent.setTicketNumber(ticketNumber);
             examStudent.setRequiredFields(JSON.toJSONString(examinationImportDto.getRequiredFieldList()));
             examStudent.setExtendFields(JSON.toJSONString(extendFieldsDtoList));
             examStudent.setSiteNumber(siteNumber);
@@ -1349,12 +1267,12 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
         return new ArrayList<>(clazzNameSet);
     }
 
-	@Override
-	public List<ExamDetail> listByExamAndPackage(Long examId, String packageCode) {
-		QueryWrapper<ExamDetail> wrapper = new QueryWrapper<>();
+    @Override
+    public List<ExamDetail> listByExamAndPackage(Long examId, String packageCode) {
+        QueryWrapper<ExamDetail> wrapper = new QueryWrapper<>();
         LambdaQueryWrapper<ExamDetail> lw = wrapper.lambda();
         lw.eq(ExamDetail::getExamId, examId);
         lw.eq(ExamDetail::getPackageCode, packageCode);
-		return this.list(wrapper);
-	}
+        return this.list(wrapper);
+    }
 }

+ 10 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -13,7 +13,10 @@ import com.qmth.distributed.print.business.bean.dto.*;
 import com.qmth.distributed.print.business.bean.dto.approvalForm.*;
 import com.qmth.distributed.print.business.bean.dto.examObject.ExamObjectDto;
 import com.qmth.distributed.print.business.bean.dto.excel.ExamStudentImportDto;
-import com.qmth.distributed.print.business.bean.params.*;
+import com.qmth.distributed.print.business.bean.params.ExamDetailList;
+import com.qmth.distributed.print.business.bean.params.ExamDetailParams;
+import com.qmth.distributed.print.business.bean.params.ExamTaskReApplyParam;
+import com.qmth.distributed.print.business.bean.params.ExamTaskStudentObjectParam;
 import com.qmth.distributed.print.business.bean.result.WorkResult;
 import com.qmth.distributed.print.business.bean.result.examTaskStudent.ExamTaskExamStudentImportResult;
 import com.qmth.distributed.print.business.bean.result.examTaskStudent.ExamTaskStudentObjectResult;
@@ -25,6 +28,7 @@ import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.templete.execute.AsyncPaperReviewPdfExportService;
 import com.qmth.distributed.print.business.util.CreatePdfUtil;
 import com.qmth.distributed.print.business.util.HtmlToPdfUtil;
+import com.qmth.teachcloud.common.util.RedisCounterUtil;
 import com.qmth.teachcloud.common.bean.dto.AssignTeacherDto;
 import com.qmth.teachcloud.common.bean.dto.BlurryUserDto;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
@@ -32,7 +36,6 @@ import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.bean.dto.excel.DescribeImportDto;
 import com.qmth.teachcloud.common.bean.params.BasicStudentExtrasParam;
 import com.qmth.teachcloud.common.bean.result.BasicStudentResult;
-import com.qmth.teachcloud.common.bean.result.MenuResult;
 import com.qmth.teachcloud.common.bean.result.SysUserResult;
 import com.qmth.teachcloud.common.bean.result.TbTaskDetailResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -213,6 +216,9 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     @Resource
     private BasicOperationLogService basicOperationLogService;
 
+    @Resource
+    private RedisCounterUtil redisCounterUtil;
+
     @Override
     public IPage<ExamTaskDto> list(Long semesterId, Long examId, Boolean enable, String status, Long cardRuleId, String courseCode, String paperNumber, Long startTime, Long endTime, String userName, String createName, Integer pageNumber, Integer pageSize) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
@@ -1416,10 +1422,9 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                             }
                         }
 
-                        SerialNumberParams serialNumberParams = new SerialNumberParams("packageCode-" + schoolId, "1", 6);
                         ExamDetail examDetail = new ExamDetail();
                         examDetail.setId(SystemConstant.getDbUuid());
-                        examDetail.setPackageCode(printCommonService.createTempNumber(serialNumberParams));
+                        examDetail.setPackageCode("1" + redisCounterUtil.getCounter(schoolId, 6, "packageCode"));
                         examDetail.setSchoolId(schoolId);
                         examDetail.setOrgId(sysUser.getOrgId());
                         examDetail.setPrintPlanId(examPrintPlan.getId());
@@ -1491,10 +1496,9 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                             }
                         }
                     }
-                    SerialNumberParams serialNumberParams = new SerialNumberParams("packageCode-" + schoolId, "1", 6);
                     ExamDetail examDetail = new ExamDetail();
                     examDetail.setId(SystemConstant.getDbUuid());
-                    examDetail.setPackageCode(printCommonService.createTempNumber(serialNumberParams));
+                    examDetail.setPackageCode("1" + redisCounterUtil.getCounter(schoolId, 6, "packageCode"));
                     examDetail.setSchoolId(schoolId);
                     examDetail.setOrgId(sysUser.getOrgId());
                     examDetail.setPrintPlanId(examPrintPlan.getId());

+ 6 - 49
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceImpl.java

@@ -15,7 +15,6 @@ import com.qmth.distributed.print.business.bean.dto.PdfDto;
 import com.qmth.distributed.print.business.bean.dto.PdfPackageDto;
 import com.qmth.distributed.print.business.bean.dto.PdfSignDto;
 import com.qmth.distributed.print.business.bean.params.ExamTaskStudentObjectParam;
-import com.qmth.distributed.print.business.bean.params.SerialNumberParams;
 import com.qmth.distributed.print.business.entity.*;
 import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
 import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
@@ -24,6 +23,7 @@ import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.util.CreatePrintPdfUtil;
 import com.qmth.distributed.print.business.util.HtmlToPdfUtil;
 import com.qmth.distributed.print.business.util.PdfUtil;
+import com.qmth.teachcloud.common.util.RedisCounterUtil;
 import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.bean.params.ArraysParams;
 import com.qmth.teachcloud.common.bean.result.BasicStudentResult;
@@ -53,7 +53,6 @@ import java.io.*;
 import java.math.BigDecimal;
 import java.nio.charset.StandardCharsets;
 import java.util.*;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
@@ -156,6 +155,9 @@ public class PrintCommonServiceImpl implements PrintCommonService {
     @Resource
     CommonCacheService commonCacheService;
 
+    @Resource
+    RedisCounterUtil redisCounterUtil;
+
     /**
      * 保存附件
      *
@@ -964,7 +966,8 @@ public class PrintCommonServiceImpl implements PrintCommonService {
     @Override
     public String createPaperNumber(Long schoolId, Long examId) {
         String date = DateUtil.today().replace(SystemConstant.HYPHEN, "");
-        String paperNumber = convertUtil.getIncre(date, "paperNumber" + schoolId, 5);
+        String counter = redisCounterUtil.getCounter(schoolId, 5, "paperNumber", date);
+        String paperNumber = date + counter;
         QueryWrapper<ExamTask> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(ExamTask::getSchoolId, schoolId).eq(ExamTask::getExamId, examId).eq(ExamTask::getPaperNumber, paperNumber);
         ExamTask examTask = examTaskService.getOne(queryWrapper);
@@ -1099,7 +1102,6 @@ public class PrintCommonServiceImpl implements PrintCommonService {
             examStudent.setCoursePaperId(examTask.getCourseCode().concat(examTask.getSequence()));
             examStudent.setCollegeName(basicStudentResult.getCollegeName());
             examStudent.setMajorName(basicStudentResult.getMajorName());
-            examStudent.setTicketNumber(createTicketNumber(examStudentTicketNumberList, schoolId, basicCardRule == null ? null : basicCardRule.getExamNumberDigit()));
             examStudent.setSiteNumber(String.valueOf(atomicInteger.getAndIncrement()));
             examStudent.setExtendFields(extendFields);
             examStudent.setCreateId(sysUser.getId());
@@ -1119,51 +1121,6 @@ public class PrintCommonServiceImpl implements PrintCommonService {
         return examStudentList;
     }
 
-    @Override
-    public String createTempNumber(SerialNumberParams serialNumberParams) {
-        return convertUtil.getIncre(serialNumberParams.getPrefix(), serialNumberParams.getModel(), serialNumberParams.getDigit());
-    }
-
-
-    /**
-     * 生成唯一的准考证号
-     *
-     * @param schoolId   学校ID
-     * @param totalDigit 考号位数
-     * @return
-     */
-    @Override
-    public String createTicketNumber(List<String> usedTicketNumberList, Long schoolId, Integer totalDigit) {
-        // 考号位数为空时,默认生成10位
-        if (totalDigit == null) {
-            totalDigit = 10;
-        }
-        String ticketNumber = null;
-        try {
-            try {
-                lock.tryLock(30, TimeUnit.SECONDS);
-            } catch (InterruptedException e) {
-                log.error("生成准考证号失败");
-            }
-            String date = DateUtil.today().replace(SystemConstant.HYPHEN, "");
-            String prefix;
-            if (totalDigit < 10) {
-                prefix = date.substring(2, 4);
-            } else {
-                prefix = date.substring(2, 6);
-            }
-            ticketNumber = convertUtil.getIncre(prefix, SystemConstant.NUMBER_CACHE + "ticketNumber" + schoolId, totalDigit - prefix.length());
-            if (!CollectionUtils.isEmpty(usedTicketNumberList) && usedTicketNumberList.contains(ticketNumber)) {
-                createTicketNumber(usedTicketNumberList, schoolId, totalDigit);
-            }
-            usedTicketNumberList.add(ticketNumber);
-
-        } finally {
-            lock.unlock();
-        }
-        return ticketNumber;
-    }
-
     /**
      * 保存任务附件(导出)
      *

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

@@ -1,6 +1,5 @@
 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;
@@ -14,7 +13,6 @@ import com.qmth.distributed.print.business.bean.dto.*;
 import com.qmth.distributed.print.business.bean.examRule.CodeNameEnableValue;
 import com.qmth.distributed.print.business.bean.examRule.FieldsDto;
 import com.qmth.distributed.print.business.bean.params.DownloadPaperFileParam;
-import com.qmth.distributed.print.business.bean.params.SerialNumberParams;
 import com.qmth.distributed.print.business.bean.result.DictionaryResult;
 import com.qmth.distributed.print.business.bean.result.TSyncExamStudentScoreResult;
 import com.qmth.distributed.print.business.cache.CreatePdfCacheUtil;
@@ -24,6 +22,7 @@ import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.templete.service.TaskLogicService;
 import com.qmth.distributed.print.business.util.CreatePdfUtil;
 import com.qmth.distributed.print.business.util.HtmlToPdfUtil;
+import com.qmth.teachcloud.common.util.RedisCounterUtil;
 import com.qmth.teachcloud.common.annotation.ExcelDBFieldDesc;
 import com.qmth.teachcloud.common.base.BaseEntity;
 import com.qmth.teachcloud.common.bean.dto.excel.*;
@@ -53,7 +52,6 @@ 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;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -80,7 +78,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
     private final static Logger log = LoggerFactory.getLogger(TaskLogicServiceImpl.class);
 
     @Resource
-    BasicExamService basicExamService;
+    RedisCounterUtil redisCounterUtil;
 
     @Resource
     ExamPrintPlanService examPrintPlanService;
@@ -938,17 +936,9 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         );
 
         // 卷袋号生成规则
-        SerialNumberParams serialNumberParams = new SerialNumberParams("packageCode-" + schoolId, "1", 6);
-        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.disposeExamDataByExaminationExcel(examPrintPlan, examinationImportDtoList, serialNumberParams, sysUser);
+            List<Long> examDetailIdList = examDetailService.disposeExamDataByExaminationExcel(examPrintPlan, examinationImportDtoList, sysUser);
             // 更改印刷计划状态
             examPrintPlan.setStatus(PrintPlanStatusEnum.READY);
             examPrintPlanService.updateById(examPrintPlan);
@@ -956,8 +946,6 @@ public class TaskLogicServiceImpl implements TaskLogicService {
             map.put("examDetailIdList", examDetailIdList);
             map.put("dataCount", examinationImportDtoList.size());
         } catch (Exception e) {
-            redisTemplate.opsForValue().set(key, value);
-            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("'", "");
@@ -2105,10 +2093,6 @@ public class TaskLogicServiceImpl implements TaskLogicService {
     }
 
 
-    public String createTempNumber(SerialNumberParams serialNumberParams) {
-        return convertUtil.getIncre(serialNumberParams.getPrefix(), serialNumberParams.getModel(), serialNumberParams.getDigit());
-    }
-
     /**
      * 验证机构是否存在
      *

+ 28 - 0
distributed-print/src/test/java/com/qmth/distributed/print/RedisCounterTest.java

@@ -0,0 +1,28 @@
+package com.qmth.distributed.print;
+
+import com.qmth.teachcloud.common.util.RedisCounterUtil;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import javax.annotation.Resource;
+
+/**
+ * redis计数器测试类
+ */
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class RedisCounterTest {
+    @Resource
+    private RedisCounterUtil redisCounterUtil;
+
+    @Test
+    public void test() {
+        Long schoolId = 1L;
+        String key = "packageCode";
+        String counter1 = redisCounterUtil.getCounter(schoolId, 5, key);
+        System.out.println("counter1:" + counter1);
+    }
+
+}

+ 7 - 5
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java

@@ -102,6 +102,9 @@ public class TeachcloudCommonServiceImpl implements TeachcloudCommonService {
     @Resource
     BasicCourseService basicCourseService;
 
+    @Resource
+    RedisCounterUtil redisCounterUtil;
+
     /**
      * 获取用户菜单
      *
@@ -807,26 +810,25 @@ public class TeachcloudCommonServiceImpl implements TeachcloudCommonService {
     public String getSysIncrCode(SystemCodeEnum type, SysUser requestUser) {
         Long schoolId = requestUser.getSchoolId();
         String date = DateUtil.today().replace(SystemConstant.HYPHEN, "");
-        String paperNumber = "";
         int count = 0;
+        String code = date.concat(redisCounterUtil.getCounter(schoolId, 4, type.getCode()));
         do {
-            paperNumber = convertUtil.getIncre(date, type.getModel() + schoolId, type.getDigit());
             switch (type) {
                 case CAMPUS_CODE:
                     count = basicCampusService.count(new QueryWrapper<BasicCampus>().lambda()
-                            .eq(BasicCampus::getCampusCode, paperNumber)
+                            .eq(BasicCampus::getCampusCode, code)
                             .eq(BasicCampus::getSchoolId, schoolId));
                     break;
                 case COURSE_CODE:
                     count = basicCourseService.count(new QueryWrapper<BasicCourse>().lambda()
-                            .eq(BasicCourse::getCode, paperNumber)
+                            .eq(BasicCourse::getCode, code)
                             .eq(BasicCourse::getSchoolId, schoolId));
                     break;
                 default:
                     break;
             }
         } while (count > 0);
-        return paperNumber;
+        return code;
     }
 
     @Override

+ 0 - 86
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/ConvertUtil.java

@@ -154,92 +154,6 @@ public class ConvertUtil {
         }
     }
 
-
-    /**
-     * 获取递增序列号
-     *
-     * @param prefix 前缀
-     * @param model  模块
-     * @param digit  补齐位数
-     * @return 序列号
-     */
-    public String getIncre(String prefix, String model, int digit) {
-        StringBuilder temp = new StringBuilder();
-        for (int i = 0; i < digit; i++) {
-            temp.append("0");
-        }
-        //序列号前缀加特定标识,如系统模块名之类的 防止重复
-        String key = model + prefix;
-        String increResult = "";
-        try {
-            //如果该key不存在 会自动创建,值为第二个参数delta
-            //最终调用的还是jedis的incrBy(byte[] key, long value)方法
-            RedisAtomicLong counter = new RedisAtomicLong(key, Objects.requireNonNull(redisTemplate.getConnectionFactory()));
-            Long increment = counter.incrementAndGet();
-            //不足补位
-            DecimalFormat df = new DecimalFormat(temp.toString());
-            increResult = prefix + df.format(increment);
-        } catch (Exception e) {
-            // TODO: 2021/4/16  
-            System.out.println("获取序列号失败");
-            /*这里可以根据需求手动生成一个不重复的单号,
-             * */
-        }
-        return increResult;
-    }
-
-    /**
-     * 解析excel单元格类型
-     *
-     * @param cell 单元格
-     * @return 转换成字符串后的值
-     */
-    public static String analyzeExcelCellValue(Cell cell) {
-        String cellValue;
-        CellType cellType = cell.getCellTypeEnum();
-        switch (cellType) {
-            case NUMERIC:
-                if (HSSFDateUtil.isCellDateFormatted(cell)) {
-                    SimpleDateFormat sdf;
-                    // 验证short值
-                    if (cell.getCellStyle().getDataFormat() == 14) {
-                        sdf = new SimpleDateFormat("yyyy/MM/dd");
-                    } else if (cell.getCellStyle().getDataFormat() == 21) {
-                        sdf = new SimpleDateFormat("HH:mm:ss");
-                    } else if (cell.getCellStyle().getDataFormat() == 22) {
-                        sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
-                    } else {
-                        throw new RuntimeException("日期格式错误!!!");
-                    }
-                    Date date = cell.getDateCellValue();
-                    cellValue = sdf.format(date);
-                } else {//处理数值格式
-                    cell.setCellType(CellType.STRING);
-                    cellValue = String.valueOf(cell.getRichStringCellValue().getString());
-                }
-                break;
-            case STRING:
-                cellValue = String.valueOf(cell.getStringCellValue());
-                break;
-            case BOOLEAN:
-                cellValue = String.valueOf(cell.getBooleanCellValue());
-                break;
-            case FORMULA:
-                cellValue = String.valueOf(cell.getCellFormula());
-                break;
-            case BLANK:
-                cellValue = null;
-                break;
-            case ERROR:
-                cellValue = "非法字符";
-                break;
-            default:
-                cellValue = "未知类型";
-                break;
-        }
-        return cellValue;
-    }
-
     public static void delFolder(String folderPath) {
         try {
             delAllFile(folderPath); //删除完里面所有内容

+ 39 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/RedisCounterUtil.java

@@ -0,0 +1,39 @@
+package com.qmth.teachcloud.common.util;
+
+import org.redisson.api.RedissonClient;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.StringJoiner;
+
+/**
+ * redis计数器工具类
+ */
+@Component
+public class RedisCounterUtil {
+
+
+    @Resource
+    private RedissonClient redissonClient;
+
+    /**
+     * 计数器
+     *
+     * @param schoolId 学校ID
+     * @param keys     keys
+     * @param fillZero 补0个数
+     */
+    public String getCounter(Long schoolId, int fillZero, String... keys) {
+        try {
+            StringJoiner stringJoiner = new StringJoiner(":");
+            stringJoiner.add("counter").add(String.valueOf(schoolId));
+            for (String key : keys) {
+                stringJoiner.add(key);
+            }
+            long count = redissonClient.getAtomicLong(stringJoiner.toString()).incrementAndGet();
+            return String.format("%0" + fillZero + "d", count);
+        } catch (NumberFormatException e) {
+            throw new RuntimeException("生成考试编码失败");
+        }
+    }
+}

+ 2 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanAnswerCardService.java

@@ -37,4 +37,6 @@ public interface ScanAnswerCardService extends IService<ScanAnswerCard> {
 	AnswerCardVo cardGet(Long examId, Integer number);
 
     ScanAnswerCard getByExamIdAndCoursePaperIdAndCardId(Long examId, String coursePaperId, Long cardId);
+
+    List<ScanAnswerCard> listByExamIdAndPaperNumber(Long examId, String paperNumber);
 }

+ 8 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanAnswerCardServiceImpl.java

@@ -215,4 +215,12 @@ public class ScanAnswerCardServiceImpl extends ServiceImpl<ScanAnswerCardMapper,
         return this.getOne(queryWrapper);
     }
 
+    @Override
+    public List<ScanAnswerCard> listByExamIdAndPaperNumber(Long examId, String paperNumber) {
+        QueryWrapper<ScanAnswerCard> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(ScanAnswerCard::getExamId, examId)
+                .eq(ScanAnswerCard::getPaperNumber, paperNumber);
+        return this.list(queryWrapper);
+    }
+
 }

+ 29 - 3
teachcloud-task/src/main/java/com/qmth/teachcloud/task/service/impl/PrintFinishServiceImpl.java

@@ -50,7 +50,7 @@ public class PrintFinishServiceImpl implements PrintFinishService {
     @Resource
     private ScanAnswerCardService scanAnswerCardService;
     @Resource
-    private ExamDetailCourseService examDetailCourseService;
+    private ScanPaperService scanPaperService;
     @Resource
     private ExamStudentService examStudentService;
     @Resource
@@ -148,11 +148,11 @@ public class PrintFinishServiceImpl implements PrintFinishService {
     @Override
     public void insertMarkQuestion(Long examId, String paperNumber, String content) {
         List<Struct> structList = CardParseUtils.parseCardContent(content);
-        if(CollectionUtils.isEmpty(structList)){
+        if (CollectionUtils.isEmpty(structList)) {
             return;
         }
         List<MarkQuestion> markQuestionList = markQuestionService.listQuestionByExamIdAndPaperNumber(examId, paperNumber);
-        if(CollectionUtils.isEmpty(markQuestionList)){
+        if (CollectionUtils.isEmpty(markQuestionList)) {
             List<MarkQuestion> markQuestions = new ArrayList<>();
             for (Struct struct : structList) {
                 MarkQuestion markQuestion = new MarkQuestion();
@@ -171,6 +171,32 @@ public class PrintFinishServiceImpl implements PrintFinishService {
             markQuestionService.saveBatch(markQuestions);
         } else {
 
+            List<ScanAnswerCard> scanAnswerCardList = scanAnswerCardService.listByExamIdAndPaperNumber(examId, paperNumber);
+            if (CollectionUtils.isNotEmpty(scanAnswerCardList)) {
+                for (ScanAnswerCard scanAnswerCard : scanAnswerCardList) {
+                    int count = scanPaperService.getCountByExamAndCardNumber(examId, scanAnswerCard.getNumber());
+                    if (count > 0) return;
+                }
+            }
+
+            // todo 题卡变动后,结构数据处理逻辑
+            if (structList.size() == markQuestionList.size()) {
+                for (int i = 0; i < structList.size(); i++) {
+                    Struct struct = structList.get(i);
+                    MarkQuestion markQuestion = markQuestionList.get(i);
+                    if (markQuestion.getGroupNumber() != null) {
+                        if (struct.getMainNumber() == markQuestion.getMainNumber()
+                                && struct.getSubNumber() == markQuestion.getSubNumber()
+                                && struct.getObjective().equals(markQuestion.getObjective())
+                                && struct.getType() == markQuestion.getQuestionType().getValue()
+                                && struct.getMainTitle().equals(markQuestion.getMainTitle())) {
+                            continue;
+                        }
+                    }
+                }
+            } else {
+
+            }
         }
     }
 }