Explorar el Código

Merge branch 'dev'

xiaof hace 4 años
padre
commit
1f082ca71d
Se han modificado 28 ficheros con 366 adiciones y 107 borrados
  1. 70 7
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintTaskDto.java
  2. 11 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/ClientLoginParam.java
  3. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamPrintPlanMapper.java
  4. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamTaskMapper.java
  5. 5 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/BasicMessageService.java
  6. 9 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/CommonService.java
  7. 2 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamPrintPlanService.java
  8. 16 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicMessageServiceImpl.java
  9. 58 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ClientServiceImpl.java
  10. 4 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ClientStatusServiceImpl.java
  11. 12 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/CommonServiceImpl.java
  12. 13 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java
  13. 15 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPrintPlanServiceImpl.java
  14. 37 39
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskDetailServiceImpl.java
  15. 4 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  16. 4 8
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java
  17. 1 0
      distributed-print-business/src/main/resources/db/init-data.sql
  18. 0 4
      distributed-print-business/src/main/resources/db/init-table.sql
  19. 0 1
      distributed-print-business/src/main/resources/mapper/ExamDetailMapper.xml
  20. 26 24
      distributed-print-business/src/main/resources/mapper/ExamPrintPlanMapper.xml
  21. 8 4
      distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml
  22. 26 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/ResendSmsJob.java
  23. 5 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/service/JobService.java
  24. 5 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/service/impl/JobServiceImpl.java
  25. 12 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/ClientController.java
  26. 2 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamPrintPlanController.java
  27. 10 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskController.java
  28. 9 0
      distributed-print/src/test/java/com/qmth/distributed/print/BasicDataImportTest.java

+ 70 - 7
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintTaskDto.java

@@ -11,10 +11,12 @@ public class ClientPrintTaskDto {
     private String printPlanId;
     @ExcelProperty(name = "印刷计划", width = 30, index = 2)
     private String printPlanName;
-    @ExcelProperty(name = "考试开始日期", width = 30, index = 3)
     private Long examStartTime;
-    @ExcelProperty(name = "考试结束日期", width = 30, index = 4)
+    @ExcelProperty(name = "考试开始日期", width = 30, index = 3)
+    private String examStartTimeStr;
     private Long examEndTime;
+    @ExcelProperty(name = "考试结束日期", width = 30, index = 4)
+    private String examEndTimeStr;
     @ExcelProperty(name = "课程(代码)", width = 30, index = 5)
     private String courseNameCode;
     @ExcelProperty(name = "试卷编号", width = 30, index = 6)
@@ -29,20 +31,25 @@ public class ClientPrintTaskDto {
     private Integer pagesA4;
     @ExcelProperty(name = "科次", width = 30, index = 10)
     private Integer totalSubjects;
-    @ExcelProperty(name = "印刷状态", width = 30, index = 11)
     private String status;
-    @ExcelProperty(name = "是否校验", width = 30, index = 13)
+    @ExcelProperty(name = "印刷状态", width = 30, index = 11)
+    private String statusStr;
     private Boolean validate;
-    @ExcelProperty(name = "是否缓存", width = 30, index = 12)
+    @ExcelProperty(name = "是否校验", width = 30, index = 13)
+    private String validateStr;
     private Boolean download;
+    @ExcelProperty(name = "是否缓存", width = 30, index = 12)
+    private String downloadStr;
     private Boolean isTry;
     private Boolean isPass;
     @ExcelProperty(name = "印刷员", width = 30, index = 14)
     private String printUser;
-    @ExcelProperty(name = "印刷开始时间", width = 30, index = 15)
     private Long printStartTime;
-    @ExcelProperty(name = "印刷完成时间", width = 30, index = 16)
+    @ExcelProperty(name = "印刷开始时间", width = 30, index = 15)
+    private String printStartTimeStr;
     private Long printEndTime;
+    @ExcelProperty(name = "印刷完成时间", width = 30, index = 16)
+    private String printEndTimeStr;
     @ExcelProperty(name = "卷袋编号", width = 30, index = 1)
     private String packageCode;
     private Long createId;
@@ -90,6 +97,14 @@ public class ClientPrintTaskDto {
         this.examStartTime = examStartTime;
     }
 
+    public String getExamStartTimeStr() {
+        return examStartTimeStr;
+    }
+
+    public void setExamStartTimeStr(String examStartTimeStr) {
+        this.examStartTimeStr = examStartTimeStr;
+    }
+
     public Long getExamEndTime() {
         return examEndTime;
     }
@@ -98,6 +113,14 @@ public class ClientPrintTaskDto {
         this.examEndTime = examEndTime;
     }
 
+    public String getExamEndTimeStr() {
+        return examEndTimeStr;
+    }
+
+    public void setExamEndTimeStr(String examEndTimeStr) {
+        this.examEndTimeStr = examEndTimeStr;
+    }
+
     public String getCourseNameCode() {
         return courseNameCode;
     }
@@ -170,6 +193,14 @@ public class ClientPrintTaskDto {
         this.status = status;
     }
 
+    public String getStatusStr() {
+        return statusStr;
+    }
+
+    public void setStatusStr(String statusStr) {
+        this.statusStr = statusStr;
+    }
+
     public Boolean getValidate() {
         return validate;
     }
@@ -178,6 +209,14 @@ public class ClientPrintTaskDto {
         this.validate = validate;
     }
 
+    public String getValidateStr() {
+        return validateStr;
+    }
+
+    public void setValidateStr(String validateStr) {
+        this.validateStr = validateStr;
+    }
+
     public Boolean getDownload() {
         return download;
     }
@@ -186,6 +225,14 @@ public class ClientPrintTaskDto {
         this.download = download;
     }
 
+    public String getDownloadStr() {
+        return downloadStr;
+    }
+
+    public void setDownloadStr(String downloadStr) {
+        this.downloadStr = downloadStr;
+    }
+
     public Boolean getTry() {
         return isTry;
     }
@@ -218,6 +265,14 @@ public class ClientPrintTaskDto {
         this.printStartTime = printStartTime;
     }
 
+    public String getPrintStartTimeStr() {
+        return printStartTimeStr;
+    }
+
+    public void setPrintStartTimeStr(String printStartTimeStr) {
+        this.printStartTimeStr = printStartTimeStr;
+    }
+
     public Long getPrintEndTime() {
         return printEndTime;
     }
@@ -226,6 +281,14 @@ public class ClientPrintTaskDto {
         this.printEndTime = printEndTime;
     }
 
+    public String getPrintEndTimeStr() {
+        return printEndTimeStr;
+    }
+
+    public void setPrintEndTimeStr(String printEndTimeStr) {
+        this.printEndTimeStr = printEndTimeStr;
+    }
+
     public String getPackageCode() {
         return packageCode;
     }

+ 11 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/ClientLoginParam.java

@@ -25,6 +25,9 @@ public class ClientLoginParam {
     @Length(message = "密码不能超过{max}位", max = 30)
     private String password;
 
+    @ApiModelProperty(value = "学校code")
+    private String schoolCode;
+
     public String getLoginName() {
         return loginName;
     }
@@ -40,4 +43,12 @@ public class ClientLoginParam {
     public void setPassword(String password) {
         this.password = password;
     }
+
+    public String getSchoolCode() {
+        return schoolCode;
+    }
+
+    public void setSchoolCode(String schoolCode) {
+        this.schoolCode = schoolCode;
+    }
 }

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamPrintPlanMapper.java

@@ -33,7 +33,7 @@ public interface ExamPrintPlanMapper extends BaseMapper<ExamPrintPlan> {
                                              @Param("endTime") Long endTime,
                                              @Param("orgIds") Set<Long> orgIds);
 
-    List<PrintPlanBrief> list(@Param("schoolId") Long schoolId, @Param("orgIds") Set<Long> orgIds);
+    List<PrintPlanBrief> list(@Param("schoolId") Long schoolId, @Param("source") String source, @Param("status") String[] status, @Param("orgIds") Set<Long> orgIds);
 
     IPage<ClientPrintTaskDto> listClientPrintTask(Page<ClientPrintTaskDto> page, @Param("schoolId") Long schoolId, @Param("machineCode") String machineCode, @Param("printPlanId") String printPlanId, @Param("status") String status, @Param("courseCode") String courseCode, @Param("paperNumber") String paperNumber, @Param("examPlace") String examPlace, @Param("examRoom") String examRoom, @Param("examStartTime") Long examStartTime, @Param("examEndTime") Long examEndTime, @Param("isDownload") Boolean isDownload, @Param("validate") Boolean validate, @Param("orgIds") Set<Long> orgIds, @Param("examDetailStatus") String[] examDetailStatus);
 

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamTaskMapper.java

@@ -71,7 +71,7 @@ public interface ExamTaskMapper extends BaseMapper<ExamTask> {
                                           @Param("schoolId") Long schoolId,
                                           @Param("status") String...status);
 
-    IPage<ClientExamTaskDto> listClientExamTaskPage(Page<ClientExamTaskDto> page, @Param("schoolId") Long schoolId, @Param("machineCode") String machineCode, @Param("printPlanId") Long printPlanId, @Param("courseCode") String courseCode, @Param("paperNumber") String paperNumber, @Param("isTry") Boolean isTry, @Param("isPass") Boolean isPass, @Param("orgIds") Set<Long> orgIds, @Param("printPlanStatus") String printPlanStatus, @Param("examDetailStatus") String examDetailStatus);
+    IPage<ClientExamTaskDto> listClientExamTaskPage(Page<ClientExamTaskDto> page, @Param("schoolId") Long schoolId, @Param("machineCode") String machineCode, @Param("printPlanId") Long printPlanId, @Param("courseCode") String courseCode, @Param("paperNumber") String paperNumber, @Param("isTry") Boolean isTry, @Param("isPass") Boolean isPass, @Param("orgIds") Set<Long> orgIds, @Param("printPlanStatus") String printPlanStatus, @Param("examDetailStatus") String[] examDetailStatus);
 
     List<ClientExamTaskDto> listClientExamTaskPage(@Param("schoolId") Long schoolId, @Param("machineCode") String machineCode, @Param("printPlanId") Long printPlanId, @Param("courseCode") String courseCode, @Param("paperNumber") String paperNumber, @Param("isTry") Boolean isTry, @Param("isPass") Boolean isPass, @Param("orgIds") Set<Long> orgIds, @Param("printPlanStatus") String printPlanStatus, @Param("examDetailStatus") String examDetailStatus);
 

+ 5 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/BasicMessageService.java

@@ -57,4 +57,9 @@ public interface BasicMessageService extends IService<BasicMessage> {
      * @param ids
      */
     void sendNoticeExpireOrOverdue(MessageEnum messageType, Long userId, List<String> ids);
+
+    /**
+     * 重发失败短信
+     */
+    void resendSmsTask();
 }

+ 9 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/CommonService.java

@@ -206,4 +206,13 @@ public interface CommonService {
      * @return
      */
     public String createPaperNumber(Long schoolId);
+
+    /**
+     * 校验课程关联考场是否提交打印
+     * @param schoolId
+     * @param courseCode
+     * @param paperNumber
+     * @return
+     */
+    Boolean checkExamDetailStatus(Long schoolId, String courseCode, String paperNumber);
 }

+ 2 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamPrintPlanService.java

@@ -11,10 +11,8 @@ import com.qmth.distributed.print.business.bean.params.DeleteParams;
 import com.qmth.distributed.print.business.bean.params.PrintPlanParams;
 import com.qmth.distributed.print.business.bean.result.PrintPlanBrief;
 import com.qmth.distributed.print.business.bean.result.PrintPlanResult;
-import com.qmth.distributed.print.business.entity.ExamDetail;
 import com.qmth.distributed.print.business.entity.ExamPrintPlan;
 import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
-import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -47,8 +45,9 @@ public interface ExamPrintPlanService extends IService<ExamPrintPlan> {
      * 印刷计划模糊名称
      *
      * @return 印刷计划id和名称
+     * @param source
      */
-    List<PrintPlanBrief> printPlanBriefQuery();
+    List<PrintPlanBrief> printPlanBriefQuery(String source);
 
 
     /**

+ 16 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicMessageServiceImpl.java

@@ -8,6 +8,7 @@ import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
 import com.aliyuncs.http.MethodType;
 import com.aliyuncs.profile.DefaultProfile;
 import com.aliyuncs.profile.IClientProfile;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.distributed.print.business.config.DictionaryConfig;
 import com.qmth.distributed.print.business.entity.BasicMessage;
@@ -24,6 +25,7 @@ import com.qmth.distributed.print.business.util.ServletUtil;
 import com.qmth.distributed.print.common.contant.SpringContextHolder;
 import com.qmth.distributed.print.common.contant.SystemConstant;
 import com.qmth.distributed.print.common.enums.ExceptionResultEnum;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -231,6 +233,20 @@ public class BasicMessageServiceImpl extends ServiceImpl<BasicMessageMapper, Bas
         }
     }
 
+    @Override
+    public void resendSmsTask() {
+        SysConfig sysConfig = sysConfigService.getByKey("sys.message.resendCount");
+        if(sysConfig != null){
+            Integer resendCount = StringUtils.isBlank(sysConfig.getConfigValue()) ? 0 : Integer.valueOf(sysConfig.getConfigValue());
+            QueryWrapper<BasicMessage> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda().ne(BasicMessage::getSendStatus, "OK").lt(BasicMessage::getResendCount, resendCount);
+            List<BasicMessage> basicMessageList = this.list(queryWrapper);
+            if (basicMessageList != null && basicMessageList.size() > 0) {
+
+            }
+        }
+    }
+
     private void checkData(Object... objects) {
         for (Object object : objects) {
             if (Objects.isNull(object)) {

+ 58 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ClientServiceImpl.java

@@ -8,6 +8,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.distributed.print.business.bean.dto.*;
 import com.qmth.distributed.print.business.entity.*;
 import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
+import com.qmth.distributed.print.business.enums.ExamStatusEnum;
+import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.util.ExcelUtil;
 import com.qmth.distributed.print.business.util.ServletUtil;
@@ -19,6 +21,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpServletResponse;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -93,6 +96,12 @@ public class ClientServiceImpl implements ClientService {
     public Map<String, Object> getReprintData(Long examDetailId, String ticketNumber, String type) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         Map<String, Object> finalMap = new HashMap<>();
+        ExamDetail examDetail = examDetailService.getById(examDetailId);
+        // 撤回提示
+        if(ExamDetailStatusEnum.NEW.name().equals(examDetail.getStatus())
+                || ExamDetailStatusEnum.READY.name().equals(examDetail.getStatus())){
+            throw ExceptionResultEnum.ERROR.exception("该任务已被撤回");
+        }
         // 取试卷
         List<Map<String, Object>> examDetailCourses = examDetailCourseService.listByExamDetailId(examDetailId);
         Map<String, Map<String, String>> map = mapCourseUrl(examDetailCourses);
@@ -103,7 +112,6 @@ public class ClientServiceImpl implements ClientService {
         // 生成题卡List
         finalMap.put("card", spliceCardContent(studentList));
         //
-        ExamDetail examDetail = examDetailService.getById(examDetailId);
         ExamPrintPlan examPrintPlan = examPrintPlanService.getById(examDetail.getPrintPlanId());
         String variableContent = examPrintPlan.getVariableContent();
         String ordinaryContent = examPrintPlan.getOrdinaryContent();
@@ -141,10 +149,15 @@ public class ClientServiceImpl implements ClientService {
     @Transactional
     @Override
     public Map<String, Object> getPrintData(Long examDetailId, String machineCode, Boolean isPrint, String printUser) {
+        ExamDetail examDetail = examDetailService.getById(examDetailId);
+        // 撤回提示
+        if(ExamDetailStatusEnum.NEW.name().equals(examDetail.getStatus())
+                || ExamDetailStatusEnum.READY.name().equals(examDetail.getStatus())){
+            throw ExceptionResultEnum.ERROR.exception("该任务已被撤回");
+        }
         if (isPrint && StringUtils.isBlank(printUser)) {
             throw ExceptionResultEnum.ERROR.exception("打印员不能为空");
         }
-        ExamDetail examDetail = examDetailService.getById(examDetailId);
         if (isPrint && StringUtils.isNotBlank(examDetail.getPrintUser()) && !examDetail.getPrintUser().equals(printUser)) {
             throw ExceptionResultEnum.ERROR.exception("该任务已被[" + printUser + "]占用");
         }
@@ -304,6 +317,18 @@ public class ClientServiceImpl implements ClientService {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         Set<Long> orgIds = commonService.listSubOrgIds(null);
         List<ClientPrintTaskDto> pirntTaskDtoList = examPrintPlanService.listClientPrintTask(schoolId, machineCode, printPlanId, status, courseCode, paperNumber, examPlace, examRoom, examStartTime, examEndTime, isDownload, validate, orgIds);
+        // 撤回
+        long count = pirntTaskDtoList.stream().map(m -> {
+            ExamDetail examDetail = examDetailService.getById(m.getExamDetailId());
+            if (ExamDetailStatusEnum.NEW.name().equals(examDetail.getStatus())
+                    || ExamDetailStatusEnum.READY.name().equals(examDetail.getStatus())) {
+                return m.getExamDetailId();
+            }
+            return null;
+        }).filter(m->StringUtils.isNotBlank(m)).count();
+        if(count > 0){
+            throw ExceptionResultEnum.ERROR.exception("有任务被撤回,请刷新列表后再试");
+        }
         List<Map<String, Object>> finalList = new ArrayList<>();
         for (ClientPrintTaskDto clientPrintTaskDto : pirntTaskDtoList) {
             Map<String, Object> map = getPrintData(Long.valueOf(clientPrintTaskDto.getExamDetailId()), null, false, null);
@@ -358,6 +383,13 @@ public class ClientServiceImpl implements ClientService {
         if (examDetail == null) {
             throw ExceptionResultEnum.ERROR.exception("考场数据有误");
         }
+
+        // 撤回提示
+        if(ExamDetailStatusEnum.NEW.name().equals(examDetail.getStatus())
+                || ExamDetailStatusEnum.READY.name().equals(examDetail.getStatus())){
+            throw ExceptionResultEnum.ERROR.exception("该任务已被撤回");
+        }
+
         if (StringUtils.isBlank(packageCode)) {
             throw ExceptionResultEnum.ERROR.exception("卷袋编号不能为空");
         }
@@ -439,6 +471,29 @@ public class ClientServiceImpl implements ClientService {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         Set<Long> orgIds = commonService.listSubOrgIds(null);
         List<ClientPrintTaskDto> printTaskDtoIList = examPrintPlanService.listClientPrintTask(schoolId, machineCode, printPlanId, status, courseCode, paperNumber, examPlace, examRoom, examStartTime, examEndTime, isDownload, validate, orgIds);
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        printTaskDtoIList = printTaskDtoIList.stream().map(m -> {
+            if (m.getExamStartTime() != null) {
+                String eStartTime = simpleDateFormat.format(new Date(m.getExamStartTime()));
+                m.setExamStartTimeStr(eStartTime);
+            }
+            if (m.getExamEndTime() != null) {
+                String eEndTime = simpleDateFormat.format(new Date(m.getExamEndTime()));
+                m.setExamEndTimeStr(eEndTime);
+            }
+            if (m.getPrintStartTime() != null) {
+                String pStartTime = simpleDateFormat.format(new Date(m.getPrintStartTime()));
+                m.setPrintStartTimeStr(pStartTime);
+            }
+            if (m.getPrintEndTime() != null) {
+                String pEndTime = simpleDateFormat.format(new Date(m.getPrintEndTime()));
+                m.setPrintEndTimeStr(pEndTime);
+            }
+            m.setStatusStr(ExamStatusEnum.valueOf(m.getStatus()).getDesc());
+            m.setValidateStr(m.getValidate() ? "是" : "否");
+            m.setDownloadStr(m.getDownload() ? "是" : "否");
+            return m;
+        }).collect(Collectors.toList());
         ExcelUtil.excelExport("印刷管理", ClientPrintTaskDto.class, printTaskDtoIList, response);
     }
 
@@ -505,7 +560,7 @@ public class ClientServiceImpl implements ClientService {
                 vMap.put("pdfMd5", path.get("pdfMd5"));
             }
         }
-        if(vMap.size() > 1) {
+        if (vMap.size() > 1) {
             otherList.add(vMap);
         }
     }

+ 4 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ClientStatusServiceImpl.java

@@ -28,6 +28,10 @@ public class ClientStatusServiceImpl extends ServiceImpl<ClientStatusMapper, Cli
             clientStatus.setPass(isPass);
             clientStatus.setUpdateId(userId);
             clientStatus.setUpdateTime(System.currentTimeMillis());
+            // 合格,更新打印时间
+            if(isPass){
+                clientStatus.setTryTime(System.currentTimeMillis());
+            }
             return this.updateById(clientStatus);
         } else {
             clientStatus = new ClientStatus();

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

@@ -734,6 +734,18 @@ public class CommonServiceImpl implements CommonService {
         }
     }
 
+    @Override
+    public Boolean checkExamDetailStatus(Long schoolId, String courseCode, String paperNumber) {
+        List<ExamDetail> examDetails = examDetailService.listByCourseCodeAndPaperNumber(schoolId, courseCode, paperNumber);
+        if (examDetails != null && examDetails.size() > 0) {
+            long count = examDetails.stream().filter(m->!ExamDetailStatusEnum.NEW.name().equals(m.getStatus().name()) && !ExamDetailStatusEnum.READY.name().equals(m.getStatus().name())).count();
+            if(count > 0){
+                throw ExceptionResultEnum.ERROR.exception("已有印刷任务进入打印状态,不能修改");
+            }
+        }
+        return true;
+    }
+
     private Set<Long> getOrgIds(Set<Long> stringSet, List<OrgDto> orgDtos, Long parentId) {
         for (OrgDto orgDto : orgDtos) {
             Long tempParentId = orgDto.getParentId();

+ 13 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java

@@ -642,13 +642,19 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
     @Transactional
     @Override
     public Boolean updatePrintProgress(Long schoolId, Long examDetailId, String machineCode, Integer printProgress) {
+
+        ExamDetail examDetail = this.getById(examDetailId);
+        // 撤回提示
+        if(ExamDetailStatusEnum.NEW.name().equals(examDetail.getStatus())
+                || ExamDetailStatusEnum.READY.name().equals(examDetail.getStatus())){
+            throw ExceptionResultEnum.ERROR.exception("该任务已被撤回");
+        }
         // 更新考场进度、状态、打印结束时间
         UpdateWrapper<ExamDetail> updateWrapper = new UpdateWrapper<>();
         updateWrapper.lambda().set(ExamDetail::getPrintProgress, printProgress).set(ExamDetail::getPrintEndTime, System.currentTimeMillis()).set(ExamDetail::getStatus, ExamDetailStatusEnum.FINISH).eq(ExamDetail::getId, examDetailId);
         this.update(updateWrapper);
 
         // 记录机器打印数量
-        ExamDetail examDetail = this.getById(examDetailId);
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         ClientPrintData clientPrintData = new ClientPrintData();
         clientPrintData.setId(SystemConstant.getDbUuid());
@@ -665,6 +671,12 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
 
     @Override
     public IPage<ClientExamStudentDto> listStudent(Long schoolId, Long examDetailId, String ticketNumber, String studentName, String courseCode, Integer pageNumber, Integer pageSize) {
+        // 撤回提示
+        ExamDetail examDetail = this.getById(examDetailId);
+        if(ExamDetailStatusEnum.NEW.name().equals(examDetail.getStatus())
+                || ExamDetailStatusEnum.READY.name().equals(examDetail.getStatus())){
+            throw ExceptionResultEnum.ERROR.exception("该任务已被撤回");
+        }
         Page<ClientExamStudentDto> page = new Page<>(pageNumber, pageSize);
         IPage<ClientExamStudentDto> examStudentDtoIPage = this.baseMapper.listClientExamStudentPage(page, schoolId, examDetailId, ConvertUtil.translateSpecificSign(ticketNumber), ConvertUtil.translateSpecificSign(studentName), courseCode);
         return examStudentDtoIPage;

+ 15 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPrintPlanServiceImpl.java

@@ -1,6 +1,5 @@
 package com.qmth.distributed.print.business.service.impl;
 
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -28,7 +27,6 @@ import com.qmth.distributed.print.common.enums.ExceptionResultEnum;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.connection.StringRedisConnection;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -96,7 +94,7 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public List<PrintPlanBrief> printPlanBriefQuery() {
+    public List<PrintPlanBrief> printPlanBriefQuery(String source) {
         /*List<PrintPlanBrief> printPlanBriefList = new ArrayList<>();
         List<ExamPrintPlan> examPrintPlanList = this.list();
         for (ExamPrintPlan examPrintPlan : examPrintPlanList) {
@@ -107,7 +105,8 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
         }*/
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         Set<Long> orgIds = commonService.listSubOrgIds(null);
-        List<PrintPlanBrief> list = this.baseMapper.list(schoolId, orgIds);
+        String[] status = {PrintPlanStatusEnum.READY.name(), PrintPlanStatusEnum.PRINTING.name(),PrintPlanStatusEnum.PRINT_FINISH.name()};
+        List<PrintPlanBrief> list = this.baseMapper.list(schoolId, source, status, orgIds);
         return list;
     }
 
@@ -223,8 +222,16 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
         examPrintPlan.setPrintContent(printContent);
         examPrintPlan.setCreateId(sysUser.getId());
         examPrintPlan.setUpdateId(sysUser.getId());
+
+        //印刷计划名称唯一性
+        QueryWrapper<ExamPrintPlan> printPlanQueryWrapper = new QueryWrapper<>();
+        printPlanQueryWrapper.lambda().eq(ExamPrintPlan::getSchoolId, schoolId).eq(ExamPrintPlan::getName, examPrintPlan.getName());
+        ExamPrintPlan printPlan = this.getOne(printPlanQueryWrapper);
         if (id == null || id == 0) {
             // 没有印刷计划id -> 新增印刷计划
+            if(printPlan != null){
+                throw ExceptionResultEnum.ERROR.exception("印刷计划名称已存在");
+            }
             examPrintPlan.setId(SystemConstant.getDbUuid());
             examPrintPlan.setStatus(PrintPlanStatusEnum.NEW);
             result = this.save(examPrintPlan);
@@ -234,6 +241,10 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
             if (tmp == null) {
                 throw ExceptionResultEnum.ERROR.exception("印刷计划id不存在");
             }
+            if(printPlan != null && id.longValue() != printPlan.getId().longValue()){
+                throw ExceptionResultEnum.ERROR.exception("印刷计划名称已存在");
+            }
+
             PrintPlanStatusEnum status = tmp.getStatus();
             if (!PrintPlanStatusEnum.NEW.equals(status) && !PrintPlanStatusEnum.READY.equals(status)) {
                 throw ExceptionResultEnum.ERROR.exception("已经开始打印的印刷计划不能编辑");

+ 37 - 39
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskDetailServiceImpl.java

@@ -89,11 +89,6 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
             if (examDetails != null && examDetails.size() > 0) {
                 Map<Long, List<Long>> map = examDetails.stream().collect(Collectors.groupingBy(ExamDetail::getPrintPlanId, Collectors.mapping(ExamDetail::getId, Collectors.toList())));
                 for (Map.Entry<Long, List<Long>> listEntry : map.entrySet()) {
-                    boolean b = tbTaskService.countByPrintPlanIdAndEntityId(examTask.getSchoolId(), listEntry.getKey(), listEntry.getValue());
-                    if (!b) {
-                        throw ExceptionResultEnum.ERROR.exception("有关联该任务的考场正在生成打印pdf,不能禁用卷库");
-                    }
-
                     // 解除所有考场该任务绑定关系
                     // 更新exam_detail
                     List<Long> examDetailIds = listEntry.getValue();
@@ -145,44 +140,47 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
             throw ExceptionResultEnum.ERROR.exception("印刷计划已结束,不能修改");
         }
         ExamTask examTask = examTaskService.getById(paperParam.getExamTaskId());
+        // 校验课程关联考场,是否已经提交打印
+        Boolean isCreate = commonService.checkExamDetailStatus(examTask.getSchoolId(), examTask.getCourseCode(), examTask.getPaperNumber());
+        if(isCreate) {
+            // 提交印刷的考场,不允许修改关联试卷
+            List<ExamDetail> examDetails = examDetailService.listByPrintPlanIdAndCourseCodeAndPaperNumber(examTask.getSchoolId(), paperParam.getPrintPlanId(), examTask.getCourseCode(), examTask.getPaperNumber());
+            List<ExamDetail> examDetails1 = examDetails.stream().filter(m -> !ExamDetailStatusEnum.NEW.equals(m.getStatus()) && !ExamDetailStatusEnum.READY.equals(m.getStatus())).collect(Collectors.toList());
+            if (!examDetails1.isEmpty()) {
+                throw ExceptionResultEnum.ERROR.exception("有考场已开始打印,不能修改");
+            }
 
-        // 提交印刷的考场,不允许修改关联试卷
-        List<ExamDetail> examDetails = examDetailService.listByPrintPlanIdAndCourseCodeAndPaperNumber(examTask.getSchoolId(), paperParam.getPrintPlanId(), examTask.getCourseCode(), examTask.getPaperNumber());
-        List<ExamDetail> examDetails1 = examDetails.stream().filter(m -> !ExamDetailStatusEnum.NEW.equals(m.getStatus()) && !ExamDetailStatusEnum.READY.equals(m.getStatus())).collect(Collectors.toList());
-        if (!examDetails1.isEmpty()) {
-            throw ExceptionResultEnum.ERROR.exception("有考场已开始打印,不能修改");
-        }
-
-        List<Long> entityIds = examDetails.stream().map(m->m.getId()).collect(Collectors.toList());
-        boolean b = tbTaskService.countByPrintPlanIdAndEntityId(examTask.getSchoolId(), paperParam.getPrintPlanId(), entityIds);
-        if (!b) {
-            throw ExceptionResultEnum.ERROR.exception("有关联该任务的考场正在生成打印pdf,不能修改关联类型");
-        }
+            List<Long> entityIds = examDetails.stream().map(m -> m.getId()).collect(Collectors.toList());
+            boolean b = tbTaskService.countByPrintPlanIdAndEntityId(examTask.getSchoolId(), paperParam.getPrintPlanId(), entityIds);
+            if (!b) {
+                throw ExceptionResultEnum.ERROR.exception("有关联该任务的考场正在生成打印pdf,不能修改关联类型");
+            }
 
-        // 更新关联卷型
-        ExamTask newExamTask = examTaskService.getByCourseCodeAndPaperNumber(examTask.getSchoolId(), examTask.getCourseCode(), paperParam.getPaperNumber());
-        UpdateWrapper<ExamTaskDetail> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(ExamTaskDetail::getRelatePaperType, paperParam.getRelatePaperType()).eq(ExamTaskDetail::getExamTaskId, newExamTask.getId());
-        this.update(updateWrapper);
+            // 更新关联卷型
+            ExamTask newExamTask = examTaskService.getByCourseCodeAndPaperNumber(examTask.getSchoolId(), examTask.getCourseCode(), paperParam.getPaperNumber());
+            UpdateWrapper<ExamTaskDetail> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.lambda().set(ExamTaskDetail::getRelatePaperType, paperParam.getRelatePaperType()).eq(ExamTaskDetail::getExamTaskId, newExamTask.getId());
+            this.update(updateWrapper);
 
-        // 更新试卷编号
-        String examDetailCourseIdStr = paperParam.getExamDetailCourseIds();
-        List<Long> examDetailCourseIds = Arrays.asList(examDetailCourseIdStr.split(",")).stream().map(m -> Long.valueOf(m)).collect(Collectors.toList());
+            // 更新试卷编号
+            String examDetailCourseIdStr = paperParam.getExamDetailCourseIds();
+            List<Long> examDetailCourseIds = Arrays.asList(examDetailCourseIdStr.split(",")).stream().map(m -> Long.valueOf(m)).collect(Collectors.toList());
 //        List<ExamDetailCourse> examDetailCourses = examDetailCourseService.listByPrintPlanIdAndCourseCodeAndPaperNumber(examTask.getSchoolId(), paperParam.getPrintPlanId(), examTask.getCourseCode(), examTask.getPaperNumber());
-        examDetailCourseService.updatePaperNumber(examDetailCourseIds, paperParam.getPaperNumber(), paperParam.getRelatePaperType());
-
-        // 更新考生关联类型
-        examStudentService.updatePaperType(examDetailCourseIds, paperParam.getRelatePaperType());
-
-        // 重新生成pdf
-        List<ExamDetailCourse> examDetailCourses = examDetailCourseService.listByIds(examDetailCourseIds);
-        Map<Long, List<Long>> examDetailIdMap = examDetailCourses.stream().collect(Collectors.groupingBy(ExamDetailCourse::getExamDetailId, Collectors.mapping(ExamDetailCourse::getId, Collectors.toList())));
-        for (Map.Entry<Long, List<Long>> listEntry : examDetailIdMap.entrySet()) {
-            SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-            Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.CREATE_PDF, paperParam.getPrintPlanId(), sysUser, listEntry.getKey());
-            map.computeIfAbsent("examDetailCourseIds", v -> listEntry.getValue());
-            map.computeIfAbsent("paperType", v -> paperParam.getRelatePaperType());
-            asyncCreatePdfTempleteService.createPdf(map, null);
+            examDetailCourseService.updatePaperNumber(examDetailCourseIds, paperParam.getPaperNumber(), paperParam.getRelatePaperType());
+
+            // 更新考生关联类型
+            examStudentService.updatePaperType(examDetailCourseIds, paperParam.getRelatePaperType());
+
+            // 重新生成pdf
+            List<ExamDetailCourse> examDetailCourses = examDetailCourseService.listByIds(examDetailCourseIds);
+            Map<Long, List<Long>> examDetailIdMap = examDetailCourses.stream().collect(Collectors.groupingBy(ExamDetailCourse::getExamDetailId, Collectors.mapping(ExamDetailCourse::getId, Collectors.toList())));
+            for (Map.Entry<Long, List<Long>> listEntry : examDetailIdMap.entrySet()) {
+                SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+                Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.CREATE_PDF, paperParam.getPrintPlanId(), sysUser, listEntry.getKey());
+                map.computeIfAbsent("examDetailCourseIds", v -> listEntry.getValue());
+                map.computeIfAbsent("paperType", v -> paperParam.getRelatePaperType());
+                asyncCreatePdfTempleteService.createPdf(map, null);
+            }
         }
         return true;
     }

+ 4 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -322,7 +322,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                 }
             }
             if (excelErrorTemp.size() > 0) {
-                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(excelErrorTemp));
+                List<String> errors = excelErrorTemp.stream().map(m-> m.getExcelErrorType()).collect(Collectors.toList());
+                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(errors));
             }
             return finalExcelList;
         });
@@ -1016,7 +1017,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         Set<Long> orgIds = commonService.listSubOrgIds(orgId);
         Page<ClientExamTaskDto> page = new Page<>(pageNumber, pageSize);
         // 印刷任务状态为印刷中(PRINTING),考场状态为待打印(WAITING)
-        IPage<ClientExamTaskDto> examTaskDtoIPage = this.baseMapper.listClientExamTaskPage(page, schoolId, machineCode, printPlanId, courseCode, paperNumber, isTry, isPass, orgIds, PrintPlanStatusEnum.PRINTING.name(), ExamDetailStatusEnum.WAITING.name());
+        String[] examDetailstatus = {ExamDetailStatusEnum.NEW.name(), ExamDetailStatusEnum.READY.name()};
+        IPage<ClientExamTaskDto> examTaskDtoIPage = this.baseMapper.listClientExamTaskPage(page, schoolId, machineCode, printPlanId, courseCode, paperNumber, isTry, isPass, orgIds, PrintPlanStatusEnum.PRINTING.name(), examDetailstatus);
         return examTaskDtoIPage;
     }
 

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

@@ -39,6 +39,7 @@ 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;
 import org.springframework.util.FileCopyUtils;
 
 import javax.annotation.Resource;
@@ -148,15 +149,10 @@ public class TaskLogicServiceImpl implements TaskLogicService {
 
         //所有考场都撤回,印刷任务状态改为就绪
         QueryWrapper<ExamDetail> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(ExamDetail::getPrintPlanId, tbTask.getPrintPlanId());
-        if (Objects.nonNull(examDetailId)) {
-            queryWrapper.lambda().eq(ExamDetail::getId, examDetailId);
-        } else if (Objects.nonNull(examDetailIds)) {
-            queryWrapper.lambda().in(ExamDetail::getId, examDetailIds);
-        }
-        queryWrapper.lambda().notIn(ExamDetail::getStatus, ExamDetailStatusEnum.NEW, ExamDetailStatusEnum.READY);
+        queryWrapper.lambda().eq(ExamDetail::getPrintPlanId, tbTask.getPrintPlanId())
+                .notIn(ExamDetail::getStatus, ExamDetailStatusEnum.NEW, ExamDetailStatusEnum.READY);
         List<ExamDetail> examDetails = detailService.list(queryWrapper);
-        if (examDetails.isEmpty()) {
+        if (CollectionUtils.isEmpty(examDetails)) {
             UpdateWrapper<ExamPrintPlan> printPlanUpdateWrapper = new UpdateWrapper<>();
             printPlanUpdateWrapper.lambda().set(ExamPrintPlan::getStatus, PrintPlanStatusEnum.READY).eq(ExamPrintPlan::getId, tbTask.getPrintPlanId());
             examPrintPlanService.update(printPlanUpdateWrapper);

+ 1 - 0
distributed-print-business/src/main/resources/db/init-data.sql

@@ -4,4 +4,5 @@ INSERT INTO `sys_config` VALUES (1, 'sys.user.initPassword', '初始密码', '12
 INSERT INTO `sys_config` VALUES (2, 'sys.warning.days', '预警天数', '3',NULL, 1, NULL, NULL, NULL);
 INSERT INTO `sys_config` VALUES (3, 'sys.code.enable', '是否启用短信验证码', 'true', 'true-启用,false-禁用', 1, NULL, NULL, NULL);
 INSERT INTO `sys_config` VALUES (4, 'sys.message.enable', '是否启用短信消息提示', 'true', 'true-启用,false-禁用', 1, NULL, NULL, NULL);
+INSERT INTO `sys_config` VALUES (5, 'sys.message.resendCount', '失败短信重试次数', '3', NULL, 1, NULL, NULL, NULL);
 

+ 0 - 4
distributed-print-business/src/main/resources/db/init-table.sql

@@ -969,10 +969,6 @@ INSERT INTO `sys_role` VALUES (3, NULL, '考务老师', 1, 'EXAM_TEACHER', NULL,
 INSERT INTO `sys_role` VALUES (4, NULL, '命题老师', 1, 'QUESTION_TEACHER', NULL, NULL, NULL, NULL);
 INSERT INTO `sys_role` VALUES (5, NULL, '客服人员', 1, 'CUSTOMER', NULL, NULL, NULL, NULL);
 INSERT INTO `sys_role` VALUES (6, NULL, '印刷人员', 1, 'PRINTER', NULL, NULL, NULL, NULL);
-INSERT INTO `sys_role` VALUES (114679324187033600, 1, '命题老师', 1, 'QUESTION_TEACHER', 1, 1618282481532, 1, 1618295472171);
-INSERT INTO `sys_role` VALUES (114680250561986560, 1, '考务老师', 1, 'EXAM_TEACHER', 1, 1618282702391, 1, 1618295489620);
-INSERT INTO `sys_role` VALUES (114680556444188672, 1, '学校管理员', 1, 'SCHOOL_ADMIN', 1, 1618282775319, 1, 1618295501203);
-INSERT INTO `sys_role` VALUES (114685879674470400, 1, '客服员', 1, 'CUSTOMER', 1, 1618284044479, NULL, 1618284044479);
 
 -- ----------------------------
 -- Table structure for sys_role_course

+ 0 - 1
distributed-print-business/src/main/resources/mapper/ExamDetailMapper.xml

@@ -8,7 +8,6 @@
         <result column="school_id" property="schoolId" />
         <result column="print_plan_id" property="printPlanId" />
         <result column="print_plan_name" property="printPlanName" />
-        <result column="exam_name" property="examName" />
         <result column="exam_start_time" property="examStartTime" />
         <result column="exam_end_time" property="examEndTime" />
         <result column="exam_place" property="examPlace" />

+ 26 - 24
distributed-print-business/src/main/resources/mapper/ExamPrintPlanMapper.xml

@@ -88,6 +88,12 @@
             <if test="schoolId != null and schoolId != ''">
                 and a.school_id = #{schoolId}
             </if>
+            <if test="source == 'client'">
+                AND a.status IN
+                <foreach collection="status" item="item" index="index" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
             <if test="orgIds != null">
                 AND b.org_id IN
                 <foreach collection="orgIds" item="item" index="index" open="(" separator="," close=")">
@@ -153,14 +159,6 @@
                 AND a.course_code = b.course_code
                 AND a.paper_number = b.paper_number
                 AND b.machine_code = #{machineCode}
-            <where>
-                <if test="courseCode != null and courseCode != ''">
-                    and a.course_code = #{courseCode}
-                </if>
-                <if test="paperNumber != null and paperNumber != ''">
-                    and a.paper_number = #{paperNumber}
-                </if>
-            </where>
             GROUP BY exam_detail_id) c ON b.id = c.exam_detail_id
                 LEFT JOIN
             sys_user e ON b.print_user = e.login_name
@@ -176,7 +174,13 @@
                 and a.id = #{printPlanId}
             </if>
             <if test="status != null and status != ''">
-                and a.status = #{status}
+                and b.status = #{status}
+            </if>
+            <if test="courseCode != null and courseCode != ''">
+                and c.courseNameCode like concat('%',#{courseCode},'%')
+            </if>
+            <if test="paperNumber != null and paperNumber != ''">
+                and c.paperNumber like concat('%',#{paperNumber},'%')
             </if>
             <if test="examPlace != null and examPlace != ''">
                 and b.exam_place = #{examPlace}
@@ -190,10 +194,10 @@
             <if test="examEndTime != null and examEndTime != ''">
                 and b.exam_end_time &lt; #{examEndTime}
             </if>
-            <if test="validate != null and validate != ''">
-                and b.validate = #{validate}
+            <if test="validate != null">
+                and ifnull(b.validate, false) = #{validate}
             </if>
-            <if test="isDownload != null and isDownload != ''">
+            <if test="isDownload != null">
                 <if test="isDownload == true">
                     and c.isDownload = 0
                 </if>
@@ -245,14 +249,6 @@
                 AND a.course_code = b.course_code
                 AND a.paper_number = b.paper_number
                 AND b.machine_code = #{machineCode}
-        <where>
-            <if test="courseCode != null and courseCode != ''">
-                and a.course_code = #{courseCode}
-            </if>
-            <if test="paperNumber != null and paperNumber != ''">
-                and a.paper_number = #{paperNumber}
-            </if>
-        </where>
         GROUP BY exam_detail_id) c ON b.id = c.exam_detail_id
             LEFT JOIN
         sys_user e ON b.print_user = e.login_name
@@ -268,7 +264,13 @@
                 and a.id = #{printPlanId}
             </if>
             <if test="status != null and status != ''">
-                and a.status = #{status}
+                and b.status = #{status}
+            </if>
+            <if test="courseCode != null and courseCode != ''">
+                and c.courseNameCode like concat('%',#{courseCode},'%')
+            </if>
+            <if test="paperNumber != null and paperNumber != ''">
+                and c.paperNumber like concat('%',#{paperNumber},'%')
             </if>
             <if test="examPlace != null and examPlace != ''">
                 and b.exam_place = #{examPlace}
@@ -282,10 +284,10 @@
             <if test="examEndTime != null and examEndTime != ''">
                 and b.exam_end_time &lt; #{examEndTime}
             </if>
-            <if test="validate != null and validate != ''">
-                and b.validate = #{validate}
+            <if test="validate != null">
+                and ifnull(b.validate, false) = #{validate}
             </if>
-            <if test="isDownload != null and isDownload != ''">
+            <if test="isDownload != null">
                 <if test="isDownload == true">
                     and c.isDownload = 0
                 </if>

+ 8 - 4
distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml

@@ -479,6 +479,10 @@
         <where>
             and a.status = #{printPlanStatus}
             and d.status = 'FINISH'
+            and b.status not in
+            <foreach item="item" collection="examDetailStatus" separator="," open="(" close=")" index="">
+                #{item}
+            </foreach>
             <if test="printPlanId != null and printPlanId != ''">
                 and a.id = #{printPlanId}
             </if>
@@ -488,11 +492,11 @@
             <if test="paperNumber != null and paperNumber != ''">
                 and c.paper_number = #{paperNumber}
             </if>
-            <if test="isTry != null and isTry != ''">
-                and e.is_try = #{isTry}
+            <if test="isTry != null">
+                and IFNULL(e.is_try, FALSE) = #{isTry}
             </if>
-            <if test="isPass != null and isPass != ''">
-                and e.is_pass = #{isPass}
+            <if test="isPass != null">
+                and IFNULL(e.is_pass, FALSE) = #{isPass}
             </if>
             <if test="orgIds != null">
                 AND g.org_id IN

+ 26 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/ResendSmsJob.java

@@ -0,0 +1,26 @@
+package com.qmth.distributed.print.task.job;
+
+import com.qmth.distributed.print.task.job.service.JobService;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import javax.annotation.Resource;
+
+/**
+ * @Description: 定时重发失败短信
+ */
+public class ResendSmsJob extends QuartzJobBean {
+
+    @Resource
+    JobService jobService;
+
+    @Override
+    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        try {
+            jobService.resendSmsTask();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 5 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/service/JobService.java

@@ -37,4 +37,9 @@ public interface JobService {
      * 发送逾期数据
      */
     void sendSmsOverdueTask();
+
+    /**
+     * 重发失败短信
+     */
+    void resendSmsTask();
 }

+ 5 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/service/impl/JobServiceImpl.java

@@ -95,4 +95,9 @@ public class JobServiceImpl implements JobService {
     public void sendSmsOverdueTask() {
         examTaskService.sendSmsOverdueTask();
     }
+
+    @Override
+    public void resendSmsTask() {
+        basicMessageService.resendSmsTask();
+    }
 }

+ 12 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/ClientController.java

@@ -9,8 +9,10 @@ import com.qmth.distributed.print.business.bean.auth.AuthBean;
 import com.qmth.distributed.print.business.bean.dto.*;
 import com.qmth.distributed.print.business.bean.params.ClientLoginParam;
 import com.qmth.distributed.print.business.bean.result.LoginResult;
+import com.qmth.distributed.print.business.entity.BasicSchool;
 import com.qmth.distributed.print.business.entity.SysUser;
 import com.qmth.distributed.print.business.enums.RoleTypeEnum;
+import com.qmth.distributed.print.business.service.CacheService;
 import com.qmth.distributed.print.business.service.ClientService;
 import com.qmth.distributed.print.business.service.CommonService;
 import com.qmth.distributed.print.business.service.SysUserService;
@@ -49,6 +51,9 @@ public class ClientController {
     @Resource
     CommonService commonService;
 
+    @Resource
+    CacheService cacheService;
+
     /**
      * 登录
      *
@@ -63,8 +68,14 @@ public class ClientController {
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
+
+        BasicSchool basicSchool = cacheService.schoolCache(login.getSchoolCode());
+        if (Objects.isNull(basicSchool)) {
+            throw ExceptionResultEnum.SCHOOL_NO_DATA.exception();
+        }
+
         QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
-        wrapper.lambda().eq(SysUser::getLoginName, login.getLoginName());
+        wrapper.lambda().eq(SysUser::getSchoolId, basicSchool.getId()).eq(SysUser::getLoginName, login.getLoginName());
         SysUser sysUser = sysUserService.getOne(wrapper);
         //用户不存在
         if (Objects.isNull(sysUser)) {

+ 2 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamPrintPlanController.java

@@ -86,8 +86,8 @@ public class ExamPrintPlanController {
     @ApiOperation(value = "印刷计划模糊查询")
     @RequestMapping(value = "/query", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
-    public Result findPrintPlanQuery() {
-        return ResultUtil.ok(examPrintPlanService.printPlanBriefQuery());
+    public Result findPrintPlanQuery(@RequestParam(value = "source", required = false) String source) {
+        return ResultUtil.ok(examPrintPlanService.printPlanBriefQuery(source));
     }
 
     @ApiOperation(value = "按类型查询模板")

+ 10 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskController.java

@@ -477,8 +477,12 @@ public class ExamTaskController {
         if(examTaskDetail.getEnable()){
             SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
             ExamTask examTask = examTaskService.getById(examTaskDetail.getId());
+            // 校验课程关联考场,是否已经提交打印
+            Boolean isCreate = commonService.checkExamDetailStatus(examTask.getSchoolId(), examTask.getCourseCode(), examTask.getPaperNumber());
             // 校验是否可以提交打印状态
-            commonService.checkData(examTask.getSchoolId(), examTask.getCourseCode(), examTask.getPaperNumber(), sysUser);
+            if(isCreate) {
+                commonService.checkData(examTask.getSchoolId(), examTask.getCourseCode(), examTask.getPaperNumber(), sysUser);
+            }
         }
         return ResultUtil.ok(isSuccess);
     }
@@ -499,8 +503,12 @@ public class ExamTaskController {
 //                basicMessageService.sendNoticeTaskAuditCreateOrReview(examTask, MessageEnum.NOTICE_OF_AUDIT_REVIEW);
             } else {
                 SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+                // 校验课程关联考场,是否已经提交打印
+                Boolean isCreate = commonService.checkExamDetailStatus(examTask.getSchoolId(), examTask.getCourseCode(), examTask.getPaperNumber());
                 // 校验是否可以提交打印状态
-                commonService.checkData(examTask.getSchoolId(), examTask.getCourseCode(), examTask.getPaperNumber(), sysUser);
+                if(isCreate) {
+                    commonService.checkData(examTask.getSchoolId(), examTask.getCourseCode(), examTask.getPaperNumber(), sysUser);
+                }
             }
         }
         return ResultUtil.ok(isSuccess);

+ 9 - 0
distributed-print/src/test/java/com/qmth/distributed/print/BasicDataImportTest.java

@@ -252,4 +252,13 @@ public class BasicDataImportTest {
         return userList;
     }
 
+    @Test
+    public void createCourse() {
+        List<BasicCourse> courses = basicCourseService.list();
+        for (BasicCourse cours : courses) {
+            String a = "INSERT INTO `basic_course` VALUES (%s,1,'%s','%s',124882698949885952,1620464769921,NULL,1620464769921);";
+            System.out.println(String.format(a, SystemConstant.getDbUuid(), cours.getCode(), cours.getName()));
+        }
+    }
+
 }