瀏覽代碼

Merge branch 'dev'
merge

wangliang 4 年之前
父節點
當前提交
b5b5dbf4e9

+ 7 - 7
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ClientStatus.java

@@ -31,11 +31,11 @@ public class ClientStatus extends BaseEntity implements Serializable {
     @TableField("machine_code")
     private String machineCode;
     /**
-     * 命题任务ID
+     * 考场ID
      */
     @JsonSerialize(using = ToStringSerializer.class)
-    @TableField("exam_task_id")
-    private Long examTaskId;
+    @TableField("exam_detail_id")
+    private Long examDetailId;
 
     /**
      * 命题任务ID
@@ -100,12 +100,12 @@ public class ClientStatus extends BaseEntity implements Serializable {
         this.machineCode = machineCode;
     }
 
-    public Long getExamTaskId() {
-        return examTaskId;
+    public Long getExamDetailId() {
+        return examDetailId;
     }
 
-    public void setExamTaskId(Long examTaskId) {
-        this.examTaskId = examTaskId;
+    public void setExamDetailId(Long examDetailId) {
+        this.examDetailId = examDetailId;
     }
 
     public Long getPrintPlanId() {

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

@@ -73,7 +73,7 @@ public interface ExamTaskMapper extends BaseMapper<ExamTask> {
 
     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);
+    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);
 
     List<ExamTask> listExamTaskByCardId(Long cardId);
 

+ 76 - 32
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicMessageServiceImpl.java

@@ -5,6 +5,7 @@ import com.aliyuncs.DefaultAcsClient;
 import com.aliyuncs.IAcsClient;
 import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
 import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
 import com.aliyuncs.http.MethodType;
 import com.aliyuncs.profile.DefaultProfile;
 import com.aliyuncs.profile.IClientProfile;
@@ -74,38 +75,7 @@ public class BasicMessageServiceImpl extends ServiceImpl<BasicMessageMapper, Bas
                 throw ExceptionResultEnum.ERROR.exception("短信消息提示已关闭");
             }
 
-            System.setProperty("sun.net.client.defaultConnectTimeout", "180000");
-            System.setProperty("sun.net.client.defaultReadTimeout", "18000");
-            // 初始化ascClient需要的几个参数
-            final String product = "Dysmsapi";// 短信API产品名称(短信产品名固定,无需修改)
-            final String domain = "dysmsapi.aliyuncs.com";// 短信API产品域名(接口地址固定,无需修改)
-            // 替换成你的AK
-            final String accessKeyId = dictionaryConfig.smsDomain().getAliyunSMSKey();// 你的accessKeyId,参考本文档步骤2
-            final String accessKeySecret = dictionaryConfig.smsDomain().getAliyunSMSSecret();// 你的accessKeySecret,参考本文档步骤2
-            // 初始化ascClient,暂时不支持多region(请勿修改)
-            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
-            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
-            IAcsClient acsClient = new DefaultAcsClient(profile);
-            // 组装请求对象
-            SendSmsRequest request = new SendSmsRequest();
-            // 使用post提交
-            request.setMethod(MethodType.POST);
-            // 必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式;发送国际/港澳台消息时,接收号码格式为00+国际区号+号码,如“0085200000000”
-            request.setPhoneNumbers(mobileNumber);
-            // 必填:短信签名-可在短信控制台中找到
-            request.setSignName(dictionaryConfig.smsDomain().getAliyunSMSSignName());
-            // 必填:短信模板-可在短信控制台中找到
-            request.setTemplateCode(templateCode);
-            // 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
-            // 友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
-            request.setTemplateParam(variableParams);
-            // 可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)
-            // request.setSmsUpExtendCode("90997");
-            // 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
-//             request.setOutId("yourOutId");
-            // 请求失败这里会抛ClientException异常
-
-            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
+            SendSmsResponse sendSmsResponse = sendSms(mobileNumber, templateCode, variableParams);
 
             if (sendSmsResponse.getCode() != null) {
 
@@ -141,6 +111,50 @@ public class BasicMessageServiceImpl extends ServiceImpl<BasicMessageMapper, Bas
         }
     }
 
+    /**
+     * 发送短信
+     * @param mobileNumber
+     * @param templateCode
+     * @param variableParams
+     * @return
+     * @throws ClientException
+     */
+    private SendSmsResponse sendSms(String mobileNumber, String templateCode, String variableParams) throws ClientException {
+        System.setProperty("sun.net.client.defaultConnectTimeout", "180000");
+        System.setProperty("sun.net.client.defaultReadTimeout", "18000");
+        // 初始化ascClient需要的几个参数
+        final String product = "Dysmsapi";// 短信API产品名称(短信产品名固定,无需修改)
+        final String domain = "dysmsapi.aliyuncs.com";// 短信API产品域名(接口地址固定,无需修改)
+        // 替换成你的AK
+        final String accessKeyId = dictionaryConfig.smsDomain().getAliyunSMSKey();// 你的accessKeyId,参考本文档步骤2
+        final String accessKeySecret = dictionaryConfig.smsDomain().getAliyunSMSSecret();// 你的accessKeySecret,参考本文档步骤2
+        // 初始化ascClient,暂时不支持多region(请勿修改)
+        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
+        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
+        IAcsClient acsClient = new DefaultAcsClient(profile);
+        // 组装请求对象
+        SendSmsRequest request = new SendSmsRequest();
+        // 使用post提交
+        request.setMethod(MethodType.POST);
+        // 必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式;发送国际/港澳台消息时,接收号码格式为00+国际区号+号码,如“0085200000000”
+        request.setPhoneNumbers(mobileNumber);
+        // 必填:短信签名-可在短信控制台中找到
+        request.setSignName(dictionaryConfig.smsDomain().getAliyunSMSSignName());
+        // 必填:短信模板-可在短信控制台中找到
+        request.setTemplateCode(templateCode);
+        // 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
+        // 友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
+        request.setTemplateParam(variableParams);
+        // 可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)
+        // request.setSmsUpExtendCode("90997");
+        // 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
+//             request.setOutId("yourOutId");
+        // 请求失败这里会抛ClientException异常
+
+        SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
+        return sendSmsResponse;
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void noticeOfExamTaskAudit(List<Long> examTaskIdList, MessageEnum messageType, SysUser sysUser) {
@@ -242,8 +256,38 @@ public class BasicMessageServiceImpl extends ServiceImpl<BasicMessageMapper, Bas
             queryWrapper.lambda().ne(BasicMessage::getSendStatus, "OK").lt(BasicMessage::getResendCount, resendCount);
             List<BasicMessage> basicMessageList = this.list(queryWrapper);
             if (basicMessageList != null && basicMessageList.size() > 0) {
+                for (BasicMessage basicMessage : basicMessageList) {
+                    this.saveMessageResendLog(basicMessage);
+                }
+            }
+        }
+    }
 
+    /**
+     * 自动重发
+     * @param basicMessage
+     */
+    private void saveMessageResendLog(BasicMessage basicMessage) {
+        String errorMessage = null;
+        try {
+            SendSmsResponse sendSmsResponse = sendSms(basicMessage.getMobileNumber(), basicMessage.getTemplateCode(), basicMessage.getVariableParams());
+            if (sendSmsResponse.getCode() != null) {
+                basicMessage.setSendStatus(sendSmsResponse.getCode());
+                basicMessage.setSendResult(sendSmsResponse.getMessage());
+            } else {
+                throw ExceptionResultEnum.ERROR.exception(sendSmsResponse.getMessage());
+            }
+        } catch (Exception e) {
+            errorMessage = e.getMessage();
+        } finally {
+            // 重试次数+1
+            basicMessage.setResendCount(basicMessage.getResendCount() + 1);
+            // 经过处理的新字段
+            if (errorMessage != null && errorMessage.length() > 0) {
+                basicMessage.setSendStatus("SYSTEM_ERROR");
+                basicMessage.setSendResult(errorMessage);
             }
+            this.updateById(basicMessage);
         }
     }
 

+ 5 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ClientServiceImpl.java

@@ -348,18 +348,21 @@ public class ClientServiceImpl implements ClientService {
 
     @Override
     public Boolean updateDownload(Long examDetailId, String machineCode, Boolean isDownload) {
+        ExamDetail examDetail = examDetailService.getById(examDetailId);
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         QueryWrapper<ExamDetailCourse> examDetailCourseQueryWrapper = new QueryWrapper<>();
         examDetailCourseQueryWrapper.lambda().eq(ExamDetailCourse::getSchoolId, schoolId).eq(ExamDetailCourse::getExamDetailId, examDetailId);
         List<ExamDetailCourse> examDetailCourses = examDetailCourseService.list(examDetailCourseQueryWrapper);
         for (ExamDetailCourse examDetailCours : examDetailCourses) {
             QueryWrapper<ClientStatus> clientStatusQueryWrapper = new QueryWrapper<>();
-            clientStatusQueryWrapper.lambda().eq(ClientStatus::getSchoolId, schoolId).eq(ClientStatus::getCourseCode, examDetailCours.getCourseCode()).eq(ClientStatus::getPaperNumber, examDetailCours.getPaperNumber()).eq(ClientStatus::getMachineCode, machineCode);
+            clientStatusQueryWrapper.lambda().eq(ClientStatus::getSchoolId, schoolId).eq(ClientStatus::getExamDetailId, examDetailId).eq(ClientStatus::getPrintPlanId, examDetail.getPrintPlanId()).eq(ClientStatus::getCourseCode, examDetailCours.getCourseCode()).eq(ClientStatus::getPaperNumber, examDetailCours.getPaperNumber()).eq(ClientStatus::getMachineCode, machineCode);
             ClientStatus clientStatus = clientStatusService.getOne(clientStatusQueryWrapper);
             if (clientStatus == null) {
                 clientStatus = new ClientStatus();
                 clientStatus.setId(SystemConstant.getDbUuid());
                 clientStatus.setSchoolId(schoolId);
+                clientStatus.setExamDetailId(examDetailId);
+                clientStatus.setPrintPlanId(examDetail.getPrintPlanId());
                 clientStatus.setMachineCode(machineCode);
                 clientStatus.setCourseCode(examDetailCours.getCourseCode());
                 clientStatus.setCourseName(examDetailCours.getCourseName());
@@ -460,7 +463,7 @@ public class ClientServiceImpl implements ClientService {
             map.put("courseCode", clientExamTaskDto.getCourseCode());
             map.put("courseName", clientExamTaskDto.getCourseName());
             map.put("paperNumber", clientExamTaskDto.getPaperNumber());
-            Map<String, String> stringMap = examTaskDetailService.getUrl(schoolId, printPlanId, Long.valueOf(clientExamTaskDto.getExamTaskId()));
+            Map<String, String> stringMap = examTaskDetailService.getUrl(schoolId, Long.valueOf(clientExamTaskDto.getPrintPlanId()), Long.valueOf(clientExamTaskDto.getExamTaskId()));
             map.putAll(stringMap);
             list.add(map);
         }

+ 38 - 25
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ClientStatusServiceImpl.java

@@ -3,48 +3,61 @@ package com.qmth.distributed.print.business.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.distributed.print.business.entity.ClientStatus;
+import com.qmth.distributed.print.business.entity.ExamDetailCourse;
 import com.qmth.distributed.print.business.mapper.ClientStatusMapper;
 import com.qmth.distributed.print.business.service.ClientStatusService;
+import com.qmth.distributed.print.business.service.ExamDetailCourseService;
 import com.qmth.distributed.print.business.service.ExamTaskService;
 import com.qmth.distributed.print.common.contant.SystemConstant;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * @Date: 2021/4/19.
  */
 @Service
 public class ClientStatusServiceImpl extends ServiceImpl<ClientStatusMapper, ClientStatus> implements ClientStatusService {
 
+    @Autowired
+    private ExamDetailCourseService examDetailCourseService;
+
     @Override
     public Boolean tagPass(Long schoolId, Long printPlanId, String courseCode, String courseName, String paperNumber, String machineCode, Boolean isPass, Long userId) {
-        QueryWrapper<ClientStatus> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(ClientStatus::getSchoolId, schoolId).eq(ClientStatus::getPrintPlanId, printPlanId).eq(ClientStatus::getCourseCode, courseCode).eq(ClientStatus::getPaperNumber, paperNumber).eq(ClientStatus::getMachineCode, machineCode);
-        ClientStatus clientStatus = this.getOne(queryWrapper);
-        if(clientStatus != null){
-            clientStatus.setPass(isPass);
-            clientStatus.setUpdateId(userId);
-            clientStatus.setUpdateTime(System.currentTimeMillis());
-            // 合格,更新打印时间
-            if(isPass){
+        List<ExamDetailCourse> examDetailCourses = examDetailCourseService.listByPrintPlanIdAndCourseCodeAndPaperNumber(schoolId, printPlanId, courseCode, paperNumber);
+        for (ExamDetailCourse examDetailCours : examDetailCourses) {
+            QueryWrapper<ClientStatus> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda().eq(ClientStatus::getSchoolId, schoolId).eq(ClientStatus::getExamDetailId, examDetailCours.getExamDetailId()).eq(ClientStatus::getPrintPlanId, printPlanId).eq(ClientStatus::getCourseCode, courseCode).eq(ClientStatus::getPaperNumber, paperNumber).eq(ClientStatus::getMachineCode, machineCode);
+            ClientStatus clientStatus = this.getOne(queryWrapper);
+            if(clientStatus != null){
+                clientStatus.setPass(isPass);
+                clientStatus.setUpdateId(userId);
+                clientStatus.setUpdateTime(System.currentTimeMillis());
+                // 合格,更新打印时间
+                if(isPass){
+                    clientStatus.setTryTime(System.currentTimeMillis());
+                }
+                this.updateById(clientStatus);
+            } else {
+                clientStatus = new ClientStatus();
+                clientStatus.setId(SystemConstant.getDbUuid());
+                clientStatus.setSchoolId(schoolId);
+                clientStatus.setExamDetailId(examDetailCours.getExamDetailId());
+                clientStatus.setPrintPlanId(printPlanId);
+                clientStatus.setMachineCode(machineCode);
+                clientStatus.setCourseCode(courseCode);
+                clientStatus.setCourseName(courseName);
+                clientStatus.setPaperNumber(paperNumber);
+                clientStatus.setTry(true);
                 clientStatus.setTryTime(System.currentTimeMillis());
+                clientStatus.setPass(isPass);
+                clientStatus.setDownload(false);
+                clientStatus.setCreateId(userId);
+                clientStatus.setCreateTime(System.currentTimeMillis());
+                this.save(clientStatus);
             }
-            return this.updateById(clientStatus);
-        } else {
-            clientStatus = new ClientStatus();
-            clientStatus.setId(SystemConstant.getDbUuid());
-            clientStatus.setSchoolId(schoolId);
-            clientStatus.setPrintPlanId(printPlanId);
-            clientStatus.setMachineCode(machineCode);
-            clientStatus.setCourseCode(courseCode);
-            clientStatus.setCourseName(courseName);
-            clientStatus.setPaperNumber(paperNumber);
-            clientStatus.setTry(true);
-            clientStatus.setTryTime(System.currentTimeMillis());
-            clientStatus.setPass(isPass);
-            clientStatus.setCreateId(userId);
-            clientStatus.setCreateTime(System.currentTimeMillis());
-            return this.save(clientStatus);
         }
+        return true;
     }
 }

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

@@ -371,19 +371,21 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
         }
 
         // 当关联课程所有考场都撤回,清除提当前计划下打样记录
-//        List<ExamDetailCourse> examDetailCourses = examDetailCourseService.listByExamDetailIdAndStatus(detail.getId());
-//        for (ExamDetailCourse examDetailCours : examDetailCourses) {
-//            List<ExamDetail> examDetailList = this.listByPrintPlanIdAndCourseCodeAndPaperNumber(detail.getSchoolId(), detail.getPrintPlanId(), examDetailCours.getCourseCode(), examDetailCours.getPaperNumber());
-//            long count = examDetailList.stream().filter(m->!m.getStatus().name().equals(ExamDetailStatusEnum.NEW.name()) && !m.getStatus().name().equals(ExamDetailStatusEnum.READY.name())).count();
-//            if(count == 0){
-//                UpdateWrapper<ClientStatus> clientStatusUpdateWrapper = new UpdateWrapper<>();
-//                clientStatusUpdateWrapper.lambda().eq(ClientStatus::getSchoolId, detail.getSchoolId())
-//                        .eq(ClientStatus::getPrintPlanId, detail.getPrintPlanId())
-//                        .eq(ClientStatus::getCourseCode, examDetailCours.getCourseCode())
-//                        .eq(ClientStatus::getPaperNumber, examDetailCours.getPaperNumber());
-//                clientStatusService.remove(clientStatusUpdateWrapper);
-//            }
-//        }
+        QueryWrapper<ExamDetailCourse> examDetailCourseQueryWrapper = new QueryWrapper<>();
+        examDetailCourseQueryWrapper.lambda().eq(ExamDetailCourse::getExamDetailId, detail.getId());
+        List<ExamDetailCourse> examDetailCourses = examDetailCourseService.list(examDetailCourseQueryWrapper);
+        for (ExamDetailCourse examDetailCours : examDetailCourses) {
+            List<ExamDetail> examDetailList = this.listByPrintPlanIdAndCourseCodeAndPaperNumber(detail.getSchoolId(), detail.getPrintPlanId(), examDetailCours.getCourseCode(), examDetailCours.getPaperNumber());
+            long count = examDetailList.stream().filter(m->!m.getStatus().name().equals(ExamDetailStatusEnum.NEW.name()) && !m.getStatus().name().equals(ExamDetailStatusEnum.READY.name())).count();
+            if(count == 0){
+                UpdateWrapper<ClientStatus> clientStatusUpdateWrapper = new UpdateWrapper<>();
+                clientStatusUpdateWrapper.lambda().eq(ClientStatus::getSchoolId, detail.getSchoolId())
+                        .eq(ClientStatus::getPrintPlanId, detail.getPrintPlanId())
+                        .eq(ClientStatus::getCourseCode, examDetailCours.getCourseCode())
+                        .eq(ClientStatus::getPaperNumber, examDetailCours.getPaperNumber());
+                clientStatusService.remove(clientStatusUpdateWrapper);
+            }
+        }
         return true;
     }
 

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

@@ -1027,7 +1027,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     public List<ClientExamTaskDto> listTryTask(Long schoolId, String machineCode, Long orgId, Long printPlanId, String courseCode, String paperNumber, Boolean isTry, Boolean isPass) {
         Set<Long> orgIds = commonService.listSubOrgIds(orgId);
         // 印刷任务状态为印刷中(PRINTING),考场状态为待打印(WAITING)
-        List<ClientExamTaskDto> examTaskDtoIPage = this.baseMapper.listClientExamTaskPage(schoolId, machineCode, printPlanId, courseCode, paperNumber, isTry, isPass, orgIds, PrintPlanStatusEnum.PRINTING.name(), ExamDetailStatusEnum.WAITING.name());
+        String[] examDetailstatus = {ExamDetailStatusEnum.NEW.name(), ExamDetailStatusEnum.READY.name()};
+        List<ClientExamTaskDto> examTaskDtoIPage = this.baseMapper.listClientExamTaskPage(schoolId, machineCode, printPlanId, courseCode, paperNumber, isTry, isPass, orgIds, PrintPlanStatusEnum.PRINTING.name(), examDetailstatus);
         return examTaskDtoIPage;
     }
 

+ 10 - 5
distributed-print-business/src/main/resources/mapper/ExamPrintPlanMapper.xml

@@ -89,6 +89,7 @@
                 and a.school_id = #{schoolId}
             </if>
             <if test="source == 'client'">
+                AND LOCATE('PAPER', print_content) > 0
                 AND a.status IN
                 <foreach collection="status" item="item" index="index" open="(" separator="," close=")">
                     #{item}
@@ -121,6 +122,7 @@
             b.total_subjects totalSubjects,
             IFNULL(b.pages_a3, 0) pagesA3,
             IFNULL(b.pages_a4, 0) pagesA4,
+            case b.status when 'FINISH' then IFNULL(b.pages_a3, 0)+IFNULL(b.pages_a4, 0) else 0 end totalPrint,
             c.singlePagesA3,
             b.status,
             ifnull(b.validate, false) validate,
@@ -137,8 +139,8 @@
             exam_detail b ON a.id = b.print_plan_id
                 JOIN
             (SELECT
-                b.print_plan_id,
-                exam_detail_id,
+                    b.exam_detail_id,
+                    b.print_plan_id,
                     GROUP_CONCAT(CONCAT(a.course_name, '(', a.course_code, ')')) courseNameCode,
                     GROUP_CONCAT(a.paper_number) paperNumber,
                     GROUP_CONCAT(IFNULL(a.paper_pages_a3, 0) + IFNULL(a.card_pages_a3, 0)) singlePagesA3,
@@ -157,10 +159,11 @@
             FROM
                 exam_detail_course a
             LEFT JOIN client_status b ON a.school_id = b.school_id
+                AND a.exam_detail_id = b.exam_detail_id
                 AND a.course_code = b.course_code
                 AND a.paper_number = b.paper_number
                 AND b.machine_code = #{machineCode}
-            GROUP BY b.print_plan_id, exam_detail_id) c ON a.id = c.print_plan_id and b.id = c.exam_detail_id
+            GROUP BY b.exam_detail_id, b.print_plan_id) c ON a.id = c.print_plan_id and b.id = c.exam_detail_id
                 LEFT JOIN
             sys_user e ON b.print_user = e.login_name
                 LEFT JOIN
@@ -228,7 +231,8 @@
             exam_detail b ON a.id = b.print_plan_id
         JOIN
             (SELECT
-                exam_detail_id,
+                b.exam_detail_id,
+                b.print_plan_id,
                 GROUP_CONCAT(CONCAT(a.course_name, '(', a.course_code, ')')) courseNameCode,
                 GROUP_CONCAT(a.paper_number) paperNumber,
                 GROUP_CONCAT(IFNULL(a.paper_pages_a3, 0) + IFNULL(a.card_pages_a3, 0)) singlePagesA3,
@@ -247,10 +251,11 @@
         FROM
             exam_detail_course a
                 LEFT JOIN client_status b ON a.school_id = b.school_id
+                AND a.exam_detail_id = b.exam_detail_id
                 AND a.course_code = b.course_code
                 AND a.paper_number = b.paper_number
                 AND b.machine_code = #{machineCode}
-        GROUP BY exam_detail_id) c ON b.id = c.exam_detail_id
+        GROUP BY b.exam_detail_id, b.print_plan_id) c ON a.id = c.print_plan_id and b.id = c.exam_detail_id
             LEFT JOIN
         sys_user e ON b.print_user = e.login_name
             LEFT JOIN

+ 3 - 0
distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml

@@ -469,6 +469,8 @@
                 AND d.paper_number = c.paper_number
                 LEFT JOIN
             client_status e ON e.school_id = d.school_id
+                AND b.id = e.exam_detail_id
+                AND a.id = e.print_plan_id
                 AND e.course_code = d.course_code
                 AND e.paper_number = d.paper_number
                 and e.machine_code = #{machineCode}
@@ -479,6 +481,7 @@
         <where>
             and a.status = #{printPlanStatus}
             and d.status = 'FINISH'
+            and LOCATE('PAPER', a.print_content) > 0
             and b.status not in
             <foreach item="item" collection="examDetailStatus" separator="," open="(" close=")" index="">
                 #{item}

+ 5 - 1
distributed-print-task/src/main/java/com/qmth/distributed/print/task/enums/JobEnum.java

@@ -25,7 +25,11 @@ public enum JobEnum {
 
     SMS_NOTICE_TASK_OVERDUE_JOB("任务逾期提醒定时任务"),
 
-    SMS_NOTICE_TASK_OVERDUE_JOB_GROUP("任务逾期提醒定时任务job组");
+    SMS_NOTICE_TASK_OVERDUE_JOB_GROUP("任务逾期提醒定时任务job组"),
+
+    SMS_NOTICE_TASK_RESEND_JOB("短信发送失败重发定时任务"),
+
+    SMS_NOTICE_TASK_RESEND_JOB_GROUP("短信发送失败重发定时任务job组");
 
     private String title;
 

+ 10 - 1
distributed-print/src/main/java/com/qmth/distributed/print/start/StartRunning.java

@@ -4,6 +4,7 @@ import com.qmth.distributed.print.business.service.OrgCenterDataDisposeService;
 import com.qmth.distributed.print.business.service.TBTaskService;
 import com.qmth.distributed.print.common.contant.SystemConstant;
 import com.qmth.distributed.print.task.enums.JobEnum;
+import com.qmth.distributed.print.task.job.ResendSmsJob;
 import com.qmth.distributed.print.task.job.ResetCreatePdfJob;
 import com.qmth.distributed.print.task.job.TimedSyncSchoolJob;
 import com.qmth.distributed.print.task.service.QuartzService;
@@ -73,9 +74,17 @@ public class StartRunning implements CommandLineRunner {
 //        orverdueJobMap.computeIfAbsent("name", v -> SendSmsOverdueJob.class.getName());
 //        quartzService.deleteJob(JobEnum.SMS_NOTICE_TASK_OVERDUE_JOB.name(), JobEnum.SMS_NOTICE_TASK_OVERDUE_JOB_GROUP.name());
 //        // 每天9点定时任务
-//        quartzService.addJob(SendSmsOverdueJob.class, JobEnum.SMS_NOTICE_TASK_OVERDUE_JOB.name(), JobEnum.SMS_NOTICE_TASK_OVERDUE_JOB_GROUP.name(), "0 */5 * * * ?", orverdueJobMap);
+//        quartzService.addJob(SendSmsOverdueJob.class, JobEnum.SMS_NOTICE_TASK_OVERDUE_JOB.name(), JobEnum.SMS_NOTICE_TASK_OVERDUE_JOB_GROUP.name(), "0 0 9 * * ?", orverdueJobMap);
 //        log.info("增加任务逾期提醒定时任务 end");
 
+//        log.info("增加短信发送失败重发定时任务 start");
+//        Map rensendJobMap = new HashMap();
+//        rensendJobMap.computeIfAbsent("name", v -> ResendSmsJob.class.getName());
+//        quartzService.deleteJob(JobEnum.SMS_NOTICE_TASK_RESEND_JOB.name(), JobEnum.SMS_NOTICE_TASK_RESEND_JOB_GROUP.name());
+//        // 每隔1小时定时任务
+//        quartzService.addJob(ResendSmsJob.class, JobEnum.SMS_NOTICE_TASK_RESEND_JOB.name(), JobEnum.SMS_NOTICE_TASK_RESEND_JOB_GROUP.name(), "0 */30 * * * ?", rensendJobMap);
+//        log.info("增加短信发送失败重发定时任务 end");
+
         log.info("服务器启动时执行 end");
     }
 }