浏览代码

Merge remote-tracking branch 'origin/dev_v3.2.7' into dev_v3.2.7

wangliang 1 年之前
父节点
当前提交
7fb452e8fe
共有 25 个文件被更改,包括 247 次插入85 次删除
  1. 3 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamDetailCourseMapper.java
  2. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/BasicMessageService.java
  3. 3 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailCourseService.java
  4. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamPrintPlanService.java
  5. 2 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskService.java
  6. 1 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicMessageServiceImpl.java
  7. 46 20
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DataSyncServiceImpl.java
  8. 6 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailCourseServiceImpl.java
  9. 2 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPaperClassMarkerServiceImpl.java
  10. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPrintPlanServiceImpl.java
  11. 41 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  12. 36 18
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/SmsSendServiceImpl.java
  13. 6 1
      distributed-print-business/src/main/resources/db/log/脚本-xiaof.sql
  14. 6 1
      distributed-print-business/src/main/resources/db/upgrade/3.2.7.sql
  15. 37 5
      distributed-print-business/src/main/resources/mapper/ExamDetailCourseMapper.xml
  16. 2 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamPaperStructureController.java
  17. 1 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamPrintPlanSyncController.java
  18. 14 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskController.java
  19. 5 10
      distributed-print/src/main/java/com/qmth/distributed/print/api/SysController.java
  20. 3 3
      distributed-print/src/main/resources/application.properties
  21. 1 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/PushTypeEnum.java
  22. 1 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/sync/CloudMarkingTaskUtils.java
  23. 16 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/FileUtil.java
  24. 2 2
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/start/StartRunning.java
  25. 10 10
      teachcloud-task/src/main/resources/application.properties

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

@@ -39,11 +39,13 @@ public interface ExamDetailCourseMapper extends BaseMapper<ExamDetailCourse> {
 
 
     List<ExamDetailCourseDto> listByPrintPlanIdAndExamTaskId(@Param("printPlanIds") List<Long> printPlanIds, @Param("examTaskId") Long examTaskId, @Param("paperType") String paperType);
     List<ExamDetailCourseDto> listByPrintPlanIdAndExamTaskId(@Param("printPlanIds") List<Long> printPlanIds, @Param("examTaskId") Long examTaskId, @Param("paperType") String paperType);
 
 
-    IPage<SyncExamTaskDto> listSyncCourseByPrintPlanId(@Param("ipage") Page<SyncExamTaskDto> ipage, @Param("semesterId") Long semesterId, @Param("examId") Long examId, @Param("roomOrgIds") Set<Long> roomOrgIds, @Param("orgIds") Set<Long> orgIds, @Param("cardType") String cardType, @Param("syncStatus") ExamTaskSyncStatusEnum syncStatus, @Param("courseCode") String courseCode, @Param("paperNumber") String paperNumber, @Param("startTime") Long startTime, @Param("endTime") Long endTime);
+    IPage<SyncExamTaskDto> listSyncCourseByPrintPlanId(@Param("ipage") Page<SyncExamTaskDto> ipage, @Param("semesterId") Long semesterId, @Param("examId") Long examId, @Param("roomOrgIds") Set<Long> roomOrgIds, @Param("orgIds") Set<Long> orgIds, @Param("cardType") String cardType, @Param("syncStatus") String syncStatus, @Param("courseCode") String courseCode, @Param("paperNumber") String paperNumber, @Param("startTime") Long startTime, @Param("endTime") Long endTime);
 
 
     List<ExamDetailCourse> listExamDetailByExamIdAndPaperNumber(@Param("schoolId") Long schoolId, @Param("examId") Long examId, @Param("paperNumber") String paperNumber);
     List<ExamDetailCourse> listExamDetailByExamIdAndPaperNumber(@Param("schoolId") Long schoolId, @Param("examId") Long examId, @Param("paperNumber") String paperNumber);
 
 
     List<SyncExamTaskDto> listSyncCourseByExamId(@Param("schoolId") Long schoolId, @Param("examId") Long examId);
     List<SyncExamTaskDto> listSyncCourseByExamId(@Param("schoolId") Long schoolId, @Param("examId") Long examId);
 
 
     TbTaskDetailResult getByExamDetailId(Long examDetailId);
     TbTaskDetailResult getByExamDetailId(Long examDetailId);
+
+    List<String> listPaperNumberByPrintPlanId(@Param("param") String param, @Param("printPlanIdList") List<Long> printPlanIdList, @Param("orgIds") Set<Long> orgIds);
 }
 }

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

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

+ 3 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailCourseService.java

@@ -36,7 +36,7 @@ public interface ExamDetailCourseService extends IService<ExamDetailCourse> {
 
 
     List<ExamDetailCourse> listByCourseCodeAndPaperNumber(Long schoolId, Long examId, String courseCode, String paperNumber);
     List<ExamDetailCourse> listByCourseCodeAndPaperNumber(Long schoolId, Long examId, String courseCode, String paperNumber);
 
 
-    IPage<SyncExamTaskDto> listSyncCourseByPrintPlanId(Long semesterId, Long examId, Long orgId, String cardType, ExamTaskSyncStatusEnum syncStatus, String courseCode, String paperNumber, Long startTime, Long endTime, Integer pageNumber, Integer pageSize);
+    IPage<SyncExamTaskDto> listSyncCourseByPrintPlanId(Long semesterId, Long examId, Long orgId, String cardType, String syncStatus, String courseCode, String paperNumber, Long startTime, Long endTime, Integer pageNumber, Integer pageSize);
 
 
     List<ExamDetailCourseDto> listByPrintPlanIdAndExamTaskId(List<Long> printPlanIds, Long examTaskId, String paperType);
     List<ExamDetailCourseDto> listByPrintPlanIdAndExamTaskId(List<Long> printPlanIds, Long examTaskId, String paperType);
 
 
@@ -45,4 +45,6 @@ public interface ExamDetailCourseService extends IService<ExamDetailCourse> {
     List<SyncExamTaskDto> listSyncCourseByExamId(Long schoolId, Long examId);
     List<SyncExamTaskDto> listSyncCourseByExamId(Long schoolId, Long examId);
 
 
     TbTaskDetailResult getByExamDetailId(Long examDetailId);
     TbTaskDetailResult getByExamDetailId(Long examDetailId);
+
+    List<String> listPaperNumberByPrintPlanId(String param, List<Long> printPlanIdList, Set<Long> orgIds);
 }
 }

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

@@ -112,7 +112,7 @@ public interface ExamPrintPlanService extends IService<ExamPrintPlan> {
 
 
     List<ExamPrintPlan> listBySchoolId(Long schoolId);
     List<ExamPrintPlan> listBySchoolId(Long schoolId);
 
 
-    IPage<SyncExamTaskDto> listSyncExamTask(Long semesterId, Long examId, Long orgId, String cardType, ExamTaskSyncStatusEnum syncStatus, String courseCode, String paperNumber, Long startTime, Long endTime, Integer pageNumber, Integer pageSize);
+    IPage<SyncExamTaskDto> listSyncExamTask(Long semesterId, Long examId, Long orgId, String cardType, String syncStatus, String courseCode, String paperNumber, Long startTime, Long endTime, Integer pageNumber, Integer pageSize);
 
 
     void checkSyncMode(SyncDataParam syncDataParam);
     void checkSyncMode(SyncDataParam syncDataParam);
 
 

+ 2 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskService.java

@@ -218,4 +218,6 @@ public interface ExamTaskService extends IService<ExamTask> {
     boolean savePreviewLog(Long examTaskId, String paperType, String type);
     boolean savePreviewLog(Long examTaskId, String paperType, String type);
 
 
     List<ExamTask> getExamTaskByCourseCodeAndCardId(Long schoolId, String courseCode, String cardId);
     List<ExamTask> getExamTaskByCourseCodeAndCardId(Long schoolId, String courseCode, String cardId);
+
+    List<String> listPaperNumber(String param, List<Long> printPlanIdList);
 }
 }

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

@@ -311,8 +311,7 @@ public class BasicMessageServiceImpl extends ServiceImpl<BasicMessageMapper, Bas
     }
     }
 
 
     @Override
     @Override
-    public void sendNoticeExpireOrOverdue(MessageEnum messageType, Long userId, List<String> ids) {
-        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+    public void sendNoticeExpireOrOverdue(Long schoolId, MessageEnum messageType, Long userId, List<String> ids) {
         // 考务老师(命题任务创建人)
         // 考务老师(命题任务创建人)
         SysUser user = commonCacheService.userCache(userId);
         SysUser user = commonCacheService.userCache(userId);
         if (Objects.nonNull(user)) {
         if (Objects.nonNull(user)) {

+ 46 - 20
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DataSyncServiceImpl.java

@@ -299,8 +299,12 @@ public class DataSyncServiceImpl implements DataSyncService {
                 }
                 }
                 boolean saveMarkerGroup = cloudMarkingTaskUtils.saveMarkerGroup(schoolId, examId, subjectCode, 0, groupDetailDTOS);
                 boolean saveMarkerGroup = cloudMarkingTaskUtils.saveMarkerGroup(schoolId, examId, subjectCode, 0, groupDetailDTOS);
                 examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.GROUP.getType(), "sync", saveMarkerGroup));
                 examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.GROUP.getType(), "sync", saveMarkerGroup));
+            } else {
+                examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.GROUP.getType(), "sync", true));
             }
             }
 
 
+            // 所有分组下评卷员集合(分班阅使用)
+            List<ExamPaperGroupMarker> examPaperGroupMarkerList = new ArrayList<>();
             // 同步绑定评卷员
             // 同步绑定评卷员
             try {
             try {
                 errorMessage = "[绑定评卷员]";
                 errorMessage = "[绑定评卷员]";
@@ -313,6 +317,8 @@ public class DataSyncServiceImpl implements DataSyncService {
                         cloudMarkingTaskUtils.syncUser(SpecialPrivilegeEnum.MARKER.getPrefix() + markerUser.getLoginName(), markerUser.getRealName(), SpecialPrivilegeEnum.MARKER.getValue(), markerUser.getEnable(), schoolId, orgCode);
                         cloudMarkingTaskUtils.syncUser(SpecialPrivilegeEnum.MARKER.getPrefix() + markerUser.getLoginName(), markerUser.getRealName(), SpecialPrivilegeEnum.MARKER.getValue(), markerUser.getEnable(), schoolId, orgCode);
                         // 绑定评卷员
                         // 绑定评卷员
                         cloudMarkingTaskUtils.saveMarker(schoolId, examId, subjectCode, examPaperGroup.getGroupNumber(), examPaperGroupMarker.getLoginName());
                         cloudMarkingTaskUtils.saveMarker(schoolId, examId, subjectCode, examPaperGroup.getGroupNumber(), examPaperGroupMarker.getLoginName());
+
+                        examPaperGroupMarkerList.add(examPaperGroupMarker);
                     }
                     }
                 }
                 }
                 examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.MARKER.getType(), "sync", true));
                 examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.MARKER.getType(), "sync", true));
@@ -321,18 +327,27 @@ public class DataSyncServiceImpl implements DataSyncService {
             }
             }
 
 
             errorMessage = "[分班阅]";
             errorMessage = "[分班阅]";
-            List<ExamPaperClassMarker> examPaperClassMarkers = examPaperClassMarkerService.listByExamPaperStructureId(examPaperStructure.getId());
-            if (!CollectionUtils.isEmpty(examPaperClassMarkers)) {
-                try {
-                    for (ExamPaperClassMarker examPaperClassMarker : examPaperClassMarkers) {
-                        String className = examPaperClassMarker.getClassName();
-                        List<String> classNames = Arrays.asList(className.split(","));
-                        cloudMarkingTaskUtils.saveUserClass(schoolId, examId, examPaperClassMarker.getLoginName(), classNames);
+            try {
+                if (examPaperStructure.getOpenClassReading()) {
+                    List<ExamPaperClassMarker> examPaperClassMarkers = examPaperClassMarkerService.listByExamPaperStructureId(examPaperStructure.getId());
+                    if (!CollectionUtils.isEmpty(examPaperClassMarkers)) {
+
+                        for (ExamPaperClassMarker examPaperClassMarker : examPaperClassMarkers) {
+                            String className = examPaperClassMarker.getClassName();
+                            List<String> classNames = Arrays.asList(className.split(","));
+                            cloudMarkingTaskUtils.saveUserClass(schoolId, examId, examPaperClassMarker.getLoginName(), classNames);
+                        }
+                    }
+                } else {
+                    // 同步空集合对象,就是删除云阅卷分班阅班级信息
+                    List<String> classNames = new ArrayList<>();
+                    for (ExamPaperGroupMarker examPaperGroupMarker : examPaperGroupMarkerList) {
+                        cloudMarkingTaskUtils.saveUserClass(schoolId, examId, examPaperGroupMarker.getLoginName(), classNames);
                     }
                     }
-                    examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.MARKER_CLASS.getType(), "sync", true));
-                } catch (Exception e) {
-                    examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.MARKER_CLASS.getType(), "sync", false));
                 }
                 }
+                examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.MARKER_CLASS.getType(), "sync", true));
+            } catch (Exception e) {
+                examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.MARKER_CLASS.getType(), "sync", false));
             }
             }
             result = TaskResultEnum.SUCCESS;
             result = TaskResultEnum.SUCCESS;
         } catch (Exception e) {
         } catch (Exception e) {
@@ -569,6 +584,7 @@ public class DataSyncServiceImpl implements DataSyncService {
             // 同步客观题
             // 同步客观题
             String orgCode = cloudMarkingTaskUtils.isCollegeMode(schoolId) ? sysOrgService.findCollegeByCourseCode(schoolId, examPaperStructure.getCourseCode()).getCode() : null;
             String orgCode = cloudMarkingTaskUtils.isCollegeMode(schoolId) ? sysOrgService.findCollegeByCourseCode(schoolId, examPaperStructure.getCourseCode()).getCode() : null;
 
 
+            List<ExamPaperGroupMarker> examPaperGroupMarkerList = new ArrayList<>();
             try {
             try {
                 List<ExamPaperGroup> examPaperGroups = examPaperGroupService.listByExamPaperStructureId(examPaperStructure.getId());
                 List<ExamPaperGroup> examPaperGroups = examPaperGroupService.listByExamPaperStructureId(examPaperStructure.getId());
                 for (ExamPaperGroup examPaperGroup : examPaperGroups) {
                 for (ExamPaperGroup examPaperGroup : examPaperGroups) {
@@ -579,6 +595,8 @@ public class DataSyncServiceImpl implements DataSyncService {
                         cloudMarkingTaskUtils.syncUser(SpecialPrivilegeEnum.MARKER.getPrefix() + markerUser.getLoginName(), markerUser.getRealName(), SpecialPrivilegeEnum.MARKER.getValue(), markerUser.getEnable(), schoolId, orgCode);
                         cloudMarkingTaskUtils.syncUser(SpecialPrivilegeEnum.MARKER.getPrefix() + markerUser.getLoginName(), markerUser.getRealName(), SpecialPrivilegeEnum.MARKER.getValue(), markerUser.getEnable(), schoolId, orgCode);
                         // 绑定评卷员
                         // 绑定评卷员
                         cloudMarkingTaskUtils.saveMarker(schoolId, examId, subjectCode, examPaperGroup.getGroupNumber(), examPaperGroupMarker.getLoginName());
                         cloudMarkingTaskUtils.saveMarker(schoolId, examId, subjectCode, examPaperGroup.getGroupNumber(), examPaperGroupMarker.getLoginName());
+
+                        examPaperGroupMarkerList.add(examPaperGroupMarker);
                     }
                     }
                 }
                 }
                 examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.MARKER.getType(), "sync", true));
                 examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.MARKER.getType(), "sync", true));
@@ -586,18 +604,25 @@ public class DataSyncServiceImpl implements DataSyncService {
                 examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.MARKER.getType(), "sync", false));
                 examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.MARKER.getType(), "sync", false));
             }
             }
 
 
-            List<ExamPaperClassMarker> examPaperClassMarkers = examPaperClassMarkerService.listByExamPaperStructureId(examPaperStructure.getId());
-            if (!CollectionUtils.isEmpty(examPaperClassMarkers)) {
-                try {
-                    for (ExamPaperClassMarker examPaperClassMarker : examPaperClassMarkers) {
-                        String className = examPaperClassMarker.getClassName();
-                        List<String> classNames = Arrays.asList(className.split(","));
-                        cloudMarkingTaskUtils.saveUserClass(schoolId, examId, examPaperClassMarker.getLoginName(), classNames);
+            try {
+                if (examPaperStructure.getOpenClassReading()) {
+                    List<ExamPaperClassMarker> examPaperClassMarkers = examPaperClassMarkerService.listByExamPaperStructureId(examPaperStructure.getId());
+                    if (!CollectionUtils.isEmpty(examPaperClassMarkers)) {
+                        for (ExamPaperClassMarker examPaperClassMarker : examPaperClassMarkers) {
+                            String className = examPaperClassMarker.getClassName();
+                            List<String> classNames = Arrays.asList(className.split(","));
+                            cloudMarkingTaskUtils.saveUserClass(schoolId, examId, examPaperClassMarker.getLoginName(), classNames);
+                        }
+                    }
+                } else {
+                    List<String> classNames = new ArrayList<>();
+                    for (ExamPaperGroupMarker examPaperGroupMarker : examPaperGroupMarkerList) {
+                        cloudMarkingTaskUtils.saveUserClass(schoolId, examId, examPaperGroupMarker.getLoginName(), classNames);
                     }
                     }
-                    examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.MARKER_CLASS.getType(), "sync", true));
-                } catch (Exception e) {
-                    examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.MARKER_CLASS.getType(), "sync", false));
                 }
                 }
+                examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.MARKER_CLASS.getType(), "sync", true));
+            } catch (Exception e) {
+                examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.MARKER_CLASS.getType(), "sync", false));
             }
             }
             result = TaskResultEnum.SUCCESS;
             result = TaskResultEnum.SUCCESS;
         } catch (Exception e) {
         } catch (Exception e) {
@@ -605,6 +630,7 @@ public class DataSyncServiceImpl implements DataSyncService {
             errorMessage = e.getMessage();
             errorMessage = e.getMessage();
         } finally {
         } finally {
             tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), examPaperStructure.getThirdRelateId(), TaskStatusEnum.FINISH, result, errorMessage);
             tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), examPaperStructure.getThirdRelateId(), TaskStatusEnum.FINISH, result, errorMessage);
+            examPaperStructureService.updateById(examPaperStructure);
         }
         }
     }
     }
 
 

+ 6 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailCourseServiceImpl.java

@@ -92,7 +92,7 @@ public class ExamDetailCourseServiceImpl extends ServiceImpl<ExamDetailCourseMap
     }
     }
 
 
     @Override
     @Override
-    public IPage<SyncExamTaskDto> listSyncCourseByPrintPlanId(Long semesterId, Long examId, Long orgId, String cardType, ExamTaskSyncStatusEnum syncStatus, String courseCode, String paperNumber, Long startTime, Long endTime, Integer pageNumber, Integer pageSize) {
+    public IPage<SyncExamTaskDto> listSyncCourseByPrintPlanId(Long semesterId, Long examId, Long orgId, String cardType, String syncStatus, String courseCode, String paperNumber, Long startTime, Long endTime, Integer pageNumber, Integer pageSize) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         Page<SyncExamTaskDto> ipage = new Page<>(pageNumber, pageSize);
         Page<SyncExamTaskDto> ipage = new Page<>(pageNumber, pageSize);
         // 顶级机构
         // 顶级机构
@@ -176,4 +176,9 @@ public class ExamDetailCourseServiceImpl extends ServiceImpl<ExamDetailCourseMap
     public TbTaskDetailResult getByExamDetailId(Long examDetailId) {
     public TbTaskDetailResult getByExamDetailId(Long examDetailId) {
         return this.baseMapper.getByExamDetailId(examDetailId);
         return this.baseMapper.getByExamDetailId(examDetailId);
     }
     }
+
+    @Override
+    public List<String> listPaperNumberByPrintPlanId(String param, List<Long> printPlanIdList, Set<Long> orgIds) {
+        return this.baseMapper.listPaperNumberByPrintPlanId(SystemConstant.translateSpecificSign(param), printPlanIdList, orgIds);
+    }
 }
 }

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

@@ -45,9 +45,9 @@ public class ExamPaperClassMarkerServiceImpl extends ServiceImpl<ExamPaperClassM
                 list.add(examPaperClassMarker);
                 list.add(examPaperClassMarker);
             }
             }
             this.saveBatch(list);
             this.saveBatch(list);
-            examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.MARKER_CLASS.getType(), "save", true));
-            examPaperStructureService.updateById(examPaperStructure);
         }
         }
+        examPaperStructure.setStatus(ExamPaperStructure.parseStatus(examPaperStructure.getStatus(), ExamPaperStructureStatusTypeEnum.MARKER_CLASS.getType(), "save", true));
+        examPaperStructureService.updateById(examPaperStructure);
     }
     }
 
 
     @Override
     @Override

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

@@ -507,7 +507,7 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
     }
     }
 
 
     @Override
     @Override
-    public IPage<SyncExamTaskDto> listSyncExamTask(Long semesterId, Long examId, Long orgId, String cardType, ExamTaskSyncStatusEnum syncStatus, String courseCode, String paperNumber, Long startTime, Long endTime, Integer pageNumber, Integer pageSize) {
+    public IPage<SyncExamTaskDto> listSyncExamTask(Long semesterId, Long examId, Long orgId, String cardType, String syncStatus, String courseCode, String paperNumber, Long startTime, Long endTime, Integer pageNumber, Integer pageSize) {
         return examDetailCourseService.listSyncCourseByPrintPlanId(semesterId, examId, orgId, cardType, syncStatus, courseCode, paperNumber, startTime, endTime, pageNumber, pageSize);
         return examDetailCourseService.listSyncCourseByPrintPlanId(semesterId, examId, orgId, cardType, syncStatus, courseCode, paperNumber, startTime, endTime, pageNumber, pageSize);
     }
     }
 
 

+ 41 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -2061,6 +2061,47 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         return this.baseMapper.getExamTaskByCourseCodeAndCardId(schoolId, courseCode, cardId);
         return this.baseMapper.getExamTaskByCourseCodeAndCardId(schoolId, courseCode, cardId);
     }
     }
 
 
+    @Override
+    public List<String> listPaperNumber(String param, List<Long> printPlanIdList) {
+        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        SysOrg sysOrg = sysOrgService.getById(sysUser.getOrgId());
+        Set<Long> orgIds = teachcloudCommonService.listSubOrgIds(null);
+        if (printPlanIdList.size() == 0) {
+            // 查询命题任务中的试卷编号
+            QueryWrapper<ExamTask> queryWrapperExamTask = new QueryWrapper<>();
+            queryWrapperExamTask.lambda().eq(ExamTask::getSchoolId, schoolId);
+            if (sysOrg != null && !OrgTypeEnum.PRINTING_HOUSE.equals(sysOrg.getType()) && orgIds.size() > 0) {
+                queryWrapperExamTask.lambda().in(ExamTask::getOrgId, orgIds);
+            }
+            List<String> list = new ArrayList<>();
+            if (StringUtils.isNotBlank(param)) {
+                queryWrapperExamTask.lambda().and(i -> i.like(ExamTask::getCourseCode, SystemConstant.translateSpecificSign(param)).or().like(ExamTask::getCourseName, SystemConstant.translateSpecificSign(param)));
+            }
+            List<ExamTask> examTasks = this.list(queryWrapperExamTask);
+            if (examTasks != null && examTasks.size() > 0) {
+                list = examTasks.stream().map(ExamTask::getPaperNumber).distinct().collect(Collectors.toList());
+            }
+
+            // 查询考务-科目中的试卷编号
+            QueryWrapper<ExamDetailCourse> queryWrapperExamDetailCourse = new QueryWrapper<>();
+            queryWrapperExamDetailCourse.lambda().eq(ExamDetailCourse::getSchoolId, schoolId);
+            List<String> list2 = new ArrayList<>();
+            if (StringUtils.isNotBlank(param)) {
+                queryWrapperExamDetailCourse.lambda().and(i -> i.like(ExamDetailCourse::getCourseCode, SystemConstant.translateSpecificSign(param))
+                        .or().like(ExamDetailCourse::getCourseName, SystemConstant.translateSpecificSign(param)));
+            }
+            List<ExamDetailCourse> ExamDetailCourses = examDetailCourseService.list(queryWrapperExamDetailCourse);
+            if (ExamDetailCourses != null && ExamDetailCourses.size() > 0) {
+                list2 = ExamDetailCourses.stream().map(ExamDetailCourse::getPaperNumber).distinct().collect(Collectors.toList());
+            }
+            list.addAll(list2);
+            return list.stream().distinct().collect(Collectors.toList());
+        } else {
+            return examDetailCourseService.listPaperNumberByPrintPlanId(param, printPlanIdList, orgIds);
+        }
+    }
+
     /**
     /**
      * 简单校验提交参数
      * 简单校验提交参数
      *
      *

+ 36 - 18
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/SmsSendServiceImpl.java

@@ -52,27 +52,36 @@ public class SmsSendServiceImpl implements SmsSendService {
             String[] examTaskStatus1 = {ExamStatusEnum.SUBMIT.name()};
             String[] examTaskStatus1 = {ExamStatusEnum.SUBMIT.name()};
             List<ExamTask> examTasks1 = examTaskMapper.listExamTaskExpire(startTime, endTime, examTaskStatus1);
             List<ExamTask> examTasks1 = examTaskMapper.listExamTaskExpire(startTime, endTime, examTaskStatus1);
             if (examTasks1 != null && examTasks1.size() > 0) {
             if (examTasks1 != null && examTasks1.size() > 0) {
-                Map<Long, List<String>> listMap = examTasks1.stream().collect(Collectors.groupingBy(ExamTask::getUserId, Collectors.mapping(m -> m.getId().toString(), Collectors.toList())));
-                for (Map.Entry<Long, List<String>> entry : listMap.entrySet()) {
-                    basicMessageService.sendNoticeExpireOrOverdue(MessageEnum.NOTICE_OF_EXAM_TASK_WILL_EXPIRE, entry.getKey(), entry.getValue());
+                Map<String, List<String>> listMap = examTasks1.stream().collect(Collectors.groupingBy(m -> m.getSchoolId() + "#" + m.getUserId(), Collectors.mapping(m -> m.getId().toString(), Collectors.toList())));
+                for (Map.Entry<String, List<String>> entry : listMap.entrySet()) {
+                    String[] keys = entry.getKey().split("#");
+                    Long schoolId = Long.valueOf(keys[0]);
+                    Long userId = Long.valueOf(keys[1]);
+                    basicMessageService.sendNoticeExpireOrOverdue(schoolId, MessageEnum.NOTICE_OF_EXAM_TASK_WILL_EXPIRE, userId, entry.getValue());
                 }
                 }
             }
             }
             // 命题分配到期预警
             // 命题分配到期预警
             String[] examTaskStatus2 = {ExamStatusEnum.SUBMIT.name()};
             String[] examTaskStatus2 = {ExamStatusEnum.SUBMIT.name()};
             List<ExamTask> examTasks2 = examTaskMapper.listExamTaskExpire(startTime, endTime, examTaskStatus2);
             List<ExamTask> examTasks2 = examTaskMapper.listExamTaskExpire(startTime, endTime, examTaskStatus2);
             if (examTasks2 != null && examTasks2.size() > 0) {
             if (examTasks2 != null && examTasks2.size() > 0) {
-                Map<Long, List<String>> listMap = examTasks2.stream().collect(Collectors.groupingBy(ExamTask::getCreateId, Collectors.mapping(m -> m.getId().toString(), Collectors.toList())));
-                for (Map.Entry<Long, List<String>> entry : listMap.entrySet()) {
-                    basicMessageService.sendNoticeExpireOrOverdue(MessageEnum.NOTICE_OF_ALLOCATION_WILL_EXPIRE, entry.getKey(), entry.getValue());
+                Map<String, List<String>> listMap = examTasks2.stream().collect(Collectors.groupingBy(m -> m.getSchoolId() + "#" + m.getCreateId(), Collectors.mapping(m -> m.getId().toString(), Collectors.toList())));
+                for (Map.Entry<String, List<String>> entry : listMap.entrySet()) {
+                    String[] keys = entry.getKey().split("#");
+                    Long schoolId = Long.valueOf(keys[0]);
+                    Long userId = Long.valueOf(keys[1]);
+                    basicMessageService.sendNoticeExpireOrOverdue(schoolId, MessageEnum.NOTICE_OF_ALLOCATION_WILL_EXPIRE, userId, entry.getValue());
                 }
                 }
             }
             }
 
 
             // 审核待办到期预警
             // 审核待办到期预警
             List<ExamTask> examTasks3 = examTaskMapper.listExamTaskAuditExpire(startTime, endTime);
             List<ExamTask> examTasks3 = examTaskMapper.listExamTaskAuditExpire(startTime, endTime);
             if (examTasks3 != null && examTasks3.size() > 0) {
             if (examTasks3 != null && examTasks3.size() > 0) {
-                Map<Long, List<String>> listMap = examTasks3.stream().collect(Collectors.groupingBy(ExamTask::getCreateId, Collectors.mapping(m -> m.getId().toString(), Collectors.toList())));
-                for (Map.Entry<Long, List<String>> entry : listMap.entrySet()) {
-                    basicMessageService.sendNoticeExpireOrOverdue(MessageEnum.NOTICE_OF_AUDIT_WILL_EXPIRE, entry.getKey(), entry.getValue());
+                Map<String, List<String>> listMap = examTasks3.stream().collect(Collectors.groupingBy(m -> m.getSchoolId() + "#" + m.getCreateId(), Collectors.mapping(m -> m.getId().toString(), Collectors.toList())));
+                for (Map.Entry<String, List<String>> entry : listMap.entrySet()) {
+                    String[] keys = entry.getKey().split("#");
+                    Long schoolId = Long.valueOf(keys[0]);
+                    Long userId = Long.valueOf(keys[1]);
+                    basicMessageService.sendNoticeExpireOrOverdue(schoolId, MessageEnum.NOTICE_OF_AUDIT_WILL_EXPIRE, userId, entry.getValue());
                 }
                 }
             }
             }
         }
         }
@@ -99,27 +108,36 @@ public class SmsSendServiceImpl implements SmsSendService {
         String[] examTaskStatus1 = {ExamStatusEnum.SUBMIT.name()};
         String[] examTaskStatus1 = {ExamStatusEnum.SUBMIT.name()};
         List<ExamTask> examTasks1 = examTaskMapper.listExamTaskExpire(startTime, endTime, examTaskStatus1);
         List<ExamTask> examTasks1 = examTaskMapper.listExamTaskExpire(startTime, endTime, examTaskStatus1);
         if (examTasks1 != null && examTasks1.size() > 0) {
         if (examTasks1 != null && examTasks1.size() > 0) {
-            Map<Long, List<String>> listMap = examTasks1.stream().collect(Collectors.groupingBy(ExamTask::getUserId, Collectors.mapping(m -> m.getId().toString(), Collectors.toList())));
-            for (Map.Entry<Long, List<String>> entry : listMap.entrySet()) {
-                basicMessageService.sendNoticeExpireOrOverdue(MessageEnum.NOTICE_OF_EXAM_TASK_OVERDUE, entry.getKey(), entry.getValue());
+            Map<String, List<String>> listMap = examTasks1.stream().collect(Collectors.groupingBy(m -> m.getSchoolId() + "#" + m.getUserId(), Collectors.mapping(m -> m.getId().toString(), Collectors.toList())));
+            for (Map.Entry<String, List<String>> entry : listMap.entrySet()) {
+                String[] keys = entry.getKey().split("#");
+                Long schoolId = Long.valueOf(keys[0]);
+                Long userId = Long.valueOf(keys[1]);
+                basicMessageService.sendNoticeExpireOrOverdue(schoolId, MessageEnum.NOTICE_OF_EXAM_TASK_OVERDUE, userId, entry.getValue());
             }
             }
         }
         }
         // 命题分配已逾期
         // 命题分配已逾期
         String[] examTaskStatus2 = {ExamStatusEnum.SUBMIT.name()};
         String[] examTaskStatus2 = {ExamStatusEnum.SUBMIT.name()};
         List<ExamTask> examTasks2 = examTaskMapper.listExamTaskExpire(startTime, endTime, examTaskStatus2);
         List<ExamTask> examTasks2 = examTaskMapper.listExamTaskExpire(startTime, endTime, examTaskStatus2);
         if (examTasks2 != null && examTasks2.size() > 0) {
         if (examTasks2 != null && examTasks2.size() > 0) {
-            Map<Long, List<String>> listMap = examTasks2.stream().collect(Collectors.groupingBy(ExamTask::getCreateId, Collectors.mapping(m -> m.getId().toString(), Collectors.toList())));
-            for (Map.Entry<Long, List<String>> entry : listMap.entrySet()) {
-                basicMessageService.sendNoticeExpireOrOverdue(MessageEnum.NOTICE_OF_ALLOCATION_OVERDUE, entry.getKey(), entry.getValue());
+            Map<String, List<String>> listMap = examTasks2.stream().collect(Collectors.groupingBy(m -> m.getSchoolId() + "#" + m.getCreateId(), Collectors.mapping(m -> m.getId().toString(), Collectors.toList())));
+            for (Map.Entry<String, List<String>> entry : listMap.entrySet()) {
+                String[] keys = entry.getKey().split("#");
+                Long schoolId = Long.valueOf(keys[0]);
+                Long userId = Long.valueOf(keys[1]);
+                basicMessageService.sendNoticeExpireOrOverdue(schoolId, MessageEnum.NOTICE_OF_ALLOCATION_OVERDUE, userId, entry.getValue());
             }
             }
         }
         }
 
 
         // 审核待办已逾期
         // 审核待办已逾期
         List<ExamTask> examTasks3 = examTaskMapper.listExamTaskAuditExpire(startTime, endTime);
         List<ExamTask> examTasks3 = examTaskMapper.listExamTaskAuditExpire(startTime, endTime);
         if (examTasks3 != null && examTasks3.size() > 0) {
         if (examTasks3 != null && examTasks3.size() > 0) {
-            Map<Long, List<String>> listMap = examTasks3.stream().collect(Collectors.groupingBy(ExamTask::getCreateId, Collectors.mapping(m -> m.getId().toString(), Collectors.toList())));
-            for (Map.Entry<Long, List<String>> entry : listMap.entrySet()) {
-                basicMessageService.sendNoticeExpireOrOverdue(MessageEnum.NOTICE_OF_AUDIT_OVERDUE, entry.getKey(), entry.getValue());
+            Map<String, List<String>> listMap = examTasks3.stream().collect(Collectors.groupingBy(m -> m.getSchoolId() + "#" + m.getCreateId(), Collectors.mapping(m -> m.getId().toString(), Collectors.toList())));
+            for (Map.Entry<String, List<String>> entry : listMap.entrySet()) {
+                String[] keys = entry.getKey().split("#");
+                Long schoolId = Long.valueOf(keys[0]);
+                Long userId = Long.valueOf(keys[1]);
+                basicMessageService.sendNoticeExpireOrOverdue(schoolId, MessageEnum.NOTICE_OF_AUDIT_OVERDUE, userId, entry.getValue());
             }
             }
         }
         }
     }
     }

+ 6 - 1
distributed-print-business/src/main/resources/db/log/脚本-xiaof.sql

@@ -301,4 +301,9 @@ ADD COLUMN `course_code` VARCHAR(50) NULL COMMENT '课程代码' AFTER `exam_id`
 ADD COLUMN `course_name` VARCHAR(100) NULL COMMENT '课程名称' AFTER `course_code`,
 ADD COLUMN `course_name` VARCHAR(100) NULL COMMENT '课程名称' AFTER `course_code`,
 ADD COLUMN `paper_number` VARCHAR(45) NULL COMMENT '试卷编号' AFTER `course_name`;
 ADD COLUMN `paper_number` VARCHAR(45) NULL COMMENT '试卷编号' AFTER `course_name`;
 
 
-DELETE FROM `sys_privilege` WHERE (`id` = '234');
+UPDATE `sys_privilege` SET `enable` = '0', `front_display` = '0' WHERE (`id` = '234');
+UPDATE `sys_privilege` SET `enable` = '0', `front_display` = '0' WHERE (`id` = '308');
+UPDATE `sys_privilege` SET `enable` = '0', `front_display` = '0' WHERE (`id` = '512');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('330', '重新生成pdf', 'CreatePdf', 'LINK', '47', '6', 'AUTH', '190', '1', '0', '1');
+UPDATE `sys_privilege` SET `enable` = '0', `front_display` = '0' WHERE (`id` = '857');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('140', '模糊查询-试卷编号', '/api/admin/exam/task/paper_number_query', 'URL', '136', '4', 'SYS', '1', '1', '1');

+ 6 - 1
distributed-print-business/src/main/resources/db/upgrade/3.2.7.sql

@@ -207,4 +207,9 @@ ADD COLUMN `course_code` VARCHAR(50) NULL COMMENT '课程代码' AFTER `exam_id`
 ADD COLUMN `course_name` VARCHAR(100) NULL COMMENT '课程名称' AFTER `course_code`,
 ADD COLUMN `course_name` VARCHAR(100) NULL COMMENT '课程名称' AFTER `course_code`,
 ADD COLUMN `paper_number` VARCHAR(45) NULL COMMENT '试卷编号' AFTER `course_name`;
 ADD COLUMN `paper_number` VARCHAR(45) NULL COMMENT '试卷编号' AFTER `course_name`;
 
 
-DELETE FROM `sys_privilege` WHERE (`id` = '234');
+UPDATE `sys_privilege` SET `enable` = '0', `front_display` = '0' WHERE (`id` = '234');
+UPDATE `sys_privilege` SET `enable` = '0', `front_display` = '0' WHERE (`id` = '308');
+UPDATE `sys_privilege` SET `enable` = '0', `front_display` = '0' WHERE (`id` = '512');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('330', '重新生成pdf', 'CreatePdf', 'LINK', '47', '6', 'AUTH', '190', '1', '0', '1');
+UPDATE `sys_privilege` SET `enable` = '0', `front_display` = '0' WHERE (`id` = '857');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('140', '模糊查询-试卷编号', '/api/admin/exam/task/paper_number_query', 'URL', '136', '4', 'SYS', '1', '1', '1');

+ 37 - 5
distributed-print-business/src/main/resources/mapper/ExamDetailCourseMapper.xml

@@ -137,7 +137,7 @@
             t.print_plan_ids printPlanIds,
             t.print_plan_ids printPlanIds,
             ets.third_relate_id thirdRelateId,
             ets.third_relate_id thirdRelateId,
             tsse.exam_name thirdRelateName,
             tsse.exam_name thirdRelateName,
-            ets.sync_status syncStatus,
+            ifnull(ets.sync_status, 'INIT') syncStatus,
             su.real_name syncUserName,
             su.real_name syncUserName,
             bc.teaching_room_id teachingRoomId,
             bc.teaching_room_id teachingRoomId,
             etd.paper_attachment_ids paperAttachmentIds
             etd.paper_attachment_ids paperAttachmentIds
@@ -152,14 +152,15 @@
                  c.exam_start_time,
                  c.exam_start_time,
                  c.exam_end_time,
                  c.exam_end_time,
                  SUM(b.total_subjects) total_subjects,
                  SUM(b.total_subjects) total_subjects,
-                 group_concat(c.print_plan_id) print_plan_ids
+                 group_concat(c.print_plan_id) print_plan_ids,
+                 sum(case c.status when 'FINISH' then 0 else 1 end) notFinishCount
              FROM
              FROM
                  exam_detail_course b
                  exam_detail_course b
                      LEFT JOIN exam_detail c ON b.exam_detail_id = c.id
                      LEFT JOIN exam_detail c ON b.exam_detail_id = c.id
                      LEFT JOIN exam_print_plan epp ON c.print_plan_id = epp.id
                      LEFT JOIN exam_print_plan epp ON c.print_plan_id = epp.id
                      LEFT JOIN basic_exam be ON epp.exam_id = be.id
                      LEFT JOIN basic_exam be ON epp.exam_id = be.id
             <where>
             <where>
-                and c.status = 'FINISH' and be.enable = true
+                 and be.enable = true
                 <if test="semesterId != null">
                 <if test="semesterId != null">
                     and be.semester_id = #{semesterId}
                     and be.semester_id = #{semesterId}
                 </if>
                 </if>
@@ -173,7 +174,7 @@
                     and b.paper_number = #{paperNumber}
                     and b.paper_number = #{paperNumber}
                 </if>
                 </if>
             </where>
             </where>
-             GROUP BY b.school_id , c.exam_id,  b.paper_number , b.paper_type, c.exam_start_time, c.exam_end_time) t
+             GROUP BY b.school_id , c.exam_id,  b.paper_number , b.paper_type, c.exam_start_time, c.exam_end_time having notFinishCount = 0) t
                 ON t.school_id = et.school_id
                 ON t.school_id = et.school_id
                 AND t.exam_id = et.exam_id
                 AND t.exam_id = et.exam_id
                 AND t.paper_number = et.paper_number
                 AND t.paper_number = et.paper_number
@@ -192,6 +193,7 @@
                         WHEN LOCATE('STARTING', GROUP_CONCAT(DISTINCT a.sync_status)) THEN 'STARTING'
                         WHEN LOCATE('STARTING', GROUP_CONCAT(DISTINCT a.sync_status)) THEN 'STARTING'
                         WHEN LOCATE('FAIL', GROUP_CONCAT(DISTINCT a.sync_status)) THEN 'FAIL'
                         WHEN LOCATE('FAIL', GROUP_CONCAT(DISTINCT a.sync_status)) THEN 'FAIL'
                         WHEN LOCATE('FINISH', GROUP_CONCAT(DISTINCT a.sync_status)) THEN 'FINISH'
                         WHEN LOCATE('FINISH', GROUP_CONCAT(DISTINCT a.sync_status)) THEN 'FINISH'
+                        ELSE 'INIT'
                         END sync_status
                         END sync_status
                     from exam_task_sync a
                     from exam_task_sync a
                         left join
                         left join
@@ -234,7 +236,12 @@
                     </foreach>
                     </foreach>
                 </if>
                 </if>
                 <if test="syncStatus != null">
                 <if test="syncStatus != null">
-                    and ets.sync_status = #{syncStatus}
+                    <if test="syncStatus == 'INIT'">
+                        and ets.sync_status is null
+                    </if>
+                    <if test="syncStatus != 'INIT'">
+                        and ets.sync_status = #{syncStatus}
+                    </if>
                 </if>
                 </if>
                 <if test="startTime != null">
                 <if test="startTime != null">
                     and t.exam_start_time &gt;= #{startTime}
                     and t.exam_start_time &gt;= #{startTime}
@@ -392,4 +399,29 @@
             ed.id = #{examDetailId}
             ed.id = #{examDetailId}
         GROUP BY be.semester_id , ed.exam_id
         GROUP BY be.semester_id , ed.exam_id
     </select>
     </select>
+    <select id="listPaperNumberByPrintPlanId" resultType="java.lang.String">
+        SELECT
+        distinct a.paper_number paperNumber
+        FROM
+        exam_detail_course a
+        LEFT JOIN
+        exam_detail b ON a.exam_detail_id = b.id
+        <where>
+            <if test="printPlanIdList != null and printPlanIdList != '' and printPlanIdList.size() > 0">
+                and b.print_plan_id IN
+                <foreach collection="printPlanIdList" item="item" index="index" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="param != null and param != ''">
+                and a.paper_number like concat('%', #{param},'%')
+            </if>
+            <if test="orgIds != null and orgIds != '' and orgIds.size > 0">
+                AND a.org_id IN
+                <foreach collection="orgIds" item="item" index="index" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+    </select>
 </mapper>
 </mapper>

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

@@ -138,12 +138,12 @@ public class ExamPaperStructureController {
     }
     }
 
 
     /**
     /**
-     * 绑定评卷员
+     * 绑定评卷员、分班阅
      *
      *
      * @param data
      * @param data
      * @return
      * @return
      */
      */
-    @ApiOperation(value = "绑定评卷员")
+    @ApiOperation(value = "绑定评卷员、分班阅")
     @RequestMapping(value = "/bind_marker", method = RequestMethod.POST)
     @RequestMapping(value = "/bind_marker", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = EditResult.class)})
     @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = EditResult.class)})
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)

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

@@ -45,7 +45,7 @@ public class ExamPrintPlanSyncController {
                                    @ApiParam(value = "考试ID") @RequestParam(required = false) Long examId,
                                    @ApiParam(value = "考试ID") @RequestParam(required = false) Long examId,
                                    @ApiParam(value = "学院ID") @RequestParam(required = false) Long orgId,
                                    @ApiParam(value = "学院ID") @RequestParam(required = false) Long orgId,
                                    @ApiParam(value = "题卡类型") @RequestParam(required = false) String cardType,
                                    @ApiParam(value = "题卡类型") @RequestParam(required = false) String cardType,
-                                   @ApiParam(value = "推送状态") @RequestParam(required = false) ExamTaskSyncStatusEnum syncStatus,
+                                   @ApiParam(value = "推送状态") @RequestParam(required = false) String syncStatus,
                                    @ApiParam(value = "课程代码") @RequestParam(required = false) String courseCode,
                                    @ApiParam(value = "课程代码") @RequestParam(required = false) String courseCode,
                                    @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
                                    @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
                                    @ApiParam(value = "计划创建时间段开始时间") @RequestParam(required = false) Long startTime,
                                    @ApiParam(value = "计划创建时间段开始时间") @RequestParam(required = false) Long startTime,

+ 14 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskController.java

@@ -237,5 +237,19 @@ public class ExamTaskController {
         ExamTaskApplyTemp task = examTaskApplyTempService.stageTaskApply(examTaskApplyTemp);
         ExamTaskApplyTemp task = examTaskApplyTempService.stageTaskApply(examTaskApplyTemp);
         return ResultUtil.ok(task);
         return ResultUtil.ok(task);
     }
     }
+
+    /**
+     * 试卷编号模糊查询
+     */
+    @ApiOperation(value = "试卷编号模糊查询")
+    @RequestMapping(value = "/paper_number_query", method = RequestMethod.POST)
+    public Result paperNumberQuery(@RequestParam(value = "param", required = false) String param,
+                                   @RequestParam(value = "printPlanId", required = false) List<String> printPlanId) {
+        if (Objects.isNull(printPlanId)) {
+            printPlanId = new ArrayList<>();
+        }
+        List<Long> printPlanIdList = printPlanId.stream().map(SystemConstant::convertIdToLong).collect(Collectors.toList());
+        return ResultUtil.ok(examTaskService.listPaperNumber(param, printPlanIdList));
+    }
 }
 }
 
 

+ 5 - 10
distributed-print/src/main/java/com/qmth/distributed/print/api/SysController.java

@@ -44,10 +44,11 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
-import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import javax.validation.Valid;
 import java.io.File;
 import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
 import java.security.NoSuchAlgorithmException;
 import java.security.NoSuchAlgorithmException;
 import java.util.*;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
@@ -845,7 +846,6 @@ public class SysController {
      */
      */
     @ApiOperation(value = "下载导入模板")
     @ApiOperation(value = "下载导入模板")
     @RequestMapping(value = "/download_import_template", method = RequestMethod.POST)
     @RequestMapping(value = "/download_import_template", method = RequestMethod.POST)
-    @Aac(auth = BOOL.FALSE)
     public void downloadImportTemplate(@RequestParam(value = "type") String type, HttpServletResponse response) {
     public void downloadImportTemplate(@RequestParam(value = "type") String type, HttpServletResponse response) {
         List<String> templateEnums = Stream.of(ImportTemplateEnum.values()).map(m -> m.name()).collect(Collectors.toList());
         List<String> templateEnums = Stream.of(ImportTemplateEnum.values()).map(m -> m.name()).collect(Collectors.toList());
         if (!templateEnums.contains(type)) {
         if (!templateEnums.contains(type)) {
@@ -853,14 +853,9 @@ public class SysController {
         }
         }
 
 
         ImportTemplateEnum importTemplateEnum = ImportTemplateEnum.valueOf(type);
         ImportTemplateEnum importTemplateEnum = ImportTemplateEnum.valueOf(type);
-        //注意getResource("")里面是空字符串
-        String path = this.getClass().getClassLoader().getResource("").getPath();
-        File file = new File(path + File.separator + "temps", importTemplateEnum.getTemplateName());
-        log.info("模板下载路径:{}", file.getPath());
-        if (!file.exists()) {
-            throw ExceptionResultEnum.ERROR.exception("模板文件下载失败");
-        }
+
+        InputStream inputStream = this.getClass().getResourceAsStream(File.separator + "temps" + File.separator + importTemplateEnum.getTemplateName());
         // 导出
         // 导出
-        FileUtil.outputFile(response, file, importTemplateEnum.getFileName());
+        FileUtil.outputFile(response, inputStream, importTemplateEnum.getFileName());
     }
     }
 }
 }

+ 3 - 3
distributed-print/src/main/resources/application.properties

@@ -12,7 +12,7 @@ spring.application.name=distributed-print
 #\u6570\u636E\u6E90\u914D\u7F6E
 #\u6570\u636E\u6E90\u914D\u7F6E
 db.host=localhost
 db.host=localhost
 db.port=3306
 db.port=3306
-db.name=distributed-print-3.2.7
+db.name=distributed-print-test
 db.username=ENC(/Tvgn1JSwu3+8T3qR1CiBA==)
 db.username=ENC(/Tvgn1JSwu3+8T3qR1CiBA==)
 db.password=ENC(Susfsu9bmA+vOmJOs/BCZv9514+7waIp)
 db.password=ENC(Susfsu9bmA+vOmJOs/BCZv9514+7waIp)
 
 
@@ -64,9 +64,9 @@ spring.activiti.history-level=audit
 #com.qmth.fss.private.server=https://oss-cn-shenzhen.aliyuncs.com
 #com.qmth.fss.private.server=https://oss-cn-shenzhen.aliyuncs.com
 
 
 com.qmth.fss.public.config=/Users/xiaofei/qmth/temporary/zxzk/file-temp
 com.qmth.fss.public.config=/Users/xiaofei/qmth/temporary/zxzk/file-temp
-com.qmth.fss.public.server=http://192.168.10.140:7001
+com.qmth.fss.public.server=http://localhost:7001
 com.qmth.fss.private.config=/Users/xiaofei/qmth/temporary/zxzk/pdf-temp
 com.qmth.fss.private.config=/Users/xiaofei/qmth/temporary/zxzk/pdf-temp
-com.qmth.fss.private.server=http://192.168.10.140:7001
+com.qmth.fss.private.server=http://localhost:7001
 
 
 #com.qmth.fss.public.config=/Users/king/git/static
 #com.qmth.fss.public.config=/Users/king/git/static
 #com.qmth.fss.public.server=http://127.0.0.1:7001
 #com.qmth.fss.public.server=http://127.0.0.1:7001

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

@@ -16,7 +16,7 @@ public enum PushTypeEnum {
     STRUCTURE_GROUP_PUSH("试卷结构、分组、评卷员绑定关系数据推送"),
     STRUCTURE_GROUP_PUSH("试卷结构、分组、评卷员绑定关系数据推送"),
 
 
     MARK_LEADER_PUSH("科组长数据推送"),
     MARK_LEADER_PUSH("科组长数据推送"),
-    MARKER_PUSH("评卷员数据推送"),
+    MARKER_PUSH("评卷员、分班阅数据推送"),
 
 
     PAPER_ANSWER_FILE_PUSH("试卷、标答文件推送"),
     PAPER_ANSWER_FILE_PUSH("试卷、标答文件推送"),
 
 

+ 1 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/sync/CloudMarkingTaskUtils.java

@@ -590,7 +590,7 @@ public class CloudMarkingTaskUtils {
             ClassMarkerDTO classMarkerDTO = new ClassMarkerDTO();
             ClassMarkerDTO classMarkerDTO = new ClassMarkerDTO();
             classMarkerDTO.setExamId(Integer.valueOf(validParam(examId, null, true, "考试ID")));
             classMarkerDTO.setExamId(Integer.valueOf(validParam(examId, null, true, "考试ID")));
             classMarkerDTO.setAccount(SpecialPrivilegeEnum.MARKER.getPrefix() + validParam(loginName, null, true, "用户名"));
             classMarkerDTO.setAccount(SpecialPrivilegeEnum.MARKER.getPrefix() + validParam(loginName, null, true, "用户名"));
-            classMarkerDTO.setClassName(validParam(className, null, true, "班级名称"));
+            classMarkerDTO.setClassName(validParam(className, new ArrayList<>(), false, "班级名称"));
 
 
             String jsonData = JSONObject.toJSONString(classMarkerDTO);
             String jsonData = JSONObject.toJSONString(classMarkerDTO);
             String result = HttpKit.sendPost(postUrl, jsonData, getHeaders(schoolId, userClassSaveUrl));
             String result = HttpKit.sendPost(postUrl, jsonData, getHeaders(schoolId, userClassSaveUrl));

+ 16 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/FileUtil.java

@@ -584,4 +584,20 @@ public class FileUtil {
             log.error(SystemConstant.LOG_ERROR, e);
             log.error(SystemConstant.LOG_ERROR, e);
         }
         }
     }
     }
+
+    public static void outputFile(HttpServletResponse response, InputStream inputStream, String fileName) {
+        try {
+            BufferedInputStream br = new BufferedInputStream(inputStream);
+            String fName = URLEncoder.encode(fileName, SystemConstant.CHARSET_NAME);
+
+            response.reset();
+            response.setContentType("application/x-msdownload");
+            response.setHeader("Content-Disposition", "attachment; filename=" + fName);
+            IOUtils.copy(br, response.getOutputStream());
+            br.close();
+//            outStream.close();
+        } catch (IOException e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+        }
+    }
 }
 }

+ 2 - 2
teachcloud-task/src/main/java/com/qmth/teachcloud/task/start/StartRunning.java

@@ -85,7 +85,7 @@ public class StartRunning implements CommandLineRunner {
         Map reunifyJobMap = new HashMap();
         Map reunifyJobMap = new HashMap();
         reunifyJobMap.computeIfAbsent("name", v -> SubjectCalculateJob.class.getName());
         reunifyJobMap.computeIfAbsent("name", v -> SubjectCalculateJob.class.getName());
         quartzService.deleteJob(JobEnum.SYNC_REUNIFY_JOB.name(), JobEnum.SYNC_REUNIFY_JOB_GROUP.name());
         quartzService.deleteJob(JobEnum.SYNC_REUNIFY_JOB.name(), JobEnum.SYNC_REUNIFY_JOB_GROUP.name());
-        quartzService.addJob(SendSmsExpireJob.class, JobEnum.SYNC_REUNIFY_JOB.name(), JobEnum.SYNC_REUNIFY_JOB_GROUP.name(), "0 0 0/2 * * ?", reunifyJobMap);
+        quartzService.addJob(SubjectCalculateJob.class, JobEnum.SYNC_REUNIFY_JOB.name(), JobEnum.SYNC_REUNIFY_JOB_GROUP.name(), "0 0 0/2 * * ?", reunifyJobMap);
         log.info("增加自动统分定时任务 end");
         log.info("增加自动统分定时任务 end");
 
 
         // 每天1点开始,每2小时一次
         // 每天1点开始,每2小时一次
@@ -93,7 +93,7 @@ public class StartRunning implements CommandLineRunner {
         Map autoSyncStudentJobMap = new HashMap();
         Map autoSyncStudentJobMap = new HashMap();
         autoSyncStudentJobMap.computeIfAbsent("name", v -> AutoSyncStudentJob.class.getName());
         autoSyncStudentJobMap.computeIfAbsent("name", v -> AutoSyncStudentJob.class.getName());
         quartzService.deleteJob(JobEnum.SYNC_STUDENT_JOB.name(), JobEnum.SYNC_STUDENT_JOB_GROUP.name());
         quartzService.deleteJob(JobEnum.SYNC_STUDENT_JOB.name(), JobEnum.SYNC_STUDENT_JOB_GROUP.name());
-        quartzService.addJob(SendSmsExpireJob.class, JobEnum.SYNC_STUDENT_JOB.name(), JobEnum.SYNC_STUDENT_JOB_GROUP.name(), "0 0 1/2 * * ?", autoSyncStudentJobMap);
+        quartzService.addJob(AutoSyncStudentJob.class, JobEnum.SYNC_STUDENT_JOB.name(), JobEnum.SYNC_STUDENT_JOB_GROUP.name(), "0 0 1/2 * * ?", autoSyncStudentJobMap);
         log.info("增加自动同步考生定时任务 end");
         log.info("增加自动同步考生定时任务 end");
 
 
         log.info("服务器启动时执行 end");
         log.info("服务器启动时执行 end");

+ 10 - 10
teachcloud-task/src/main/resources/application.properties

@@ -13,14 +13,14 @@ spring.application.name=teachcloud-task
 #\u6570\u636E\u6E90\u914D\u7F6E
 #\u6570\u636E\u6E90\u914D\u7F6E
 db.host=localhost
 db.host=localhost
 db.port=3306
 db.port=3306
-db.name=distributed-v3.2.3
-db.username=ENC(HR5javPBrhlAf4sy/hbT5w==)
-db.password=ENC(YgWN6qax08Zi5Fz83jyNbvfac3Xkg1cI)
+db.name=distributed-print-test
+db.username=ENC(/Tvgn1JSwu3+8T3qR1CiBA==)
+db.password=ENC(Susfsu9bmA+vOmJOs/BCZv9514+7waIp)
 
 
 #redis\u6570\u636E\u6E90\u914D\u7F6E
 #redis\u6570\u636E\u6E90\u914D\u7F6E
 com.qmth.redis.host=${db.host}
 com.qmth.redis.host=${db.host}
 com.qmth.redis.port=6379
 com.qmth.redis.port=6379
-com.qmth.redis.db=1
+com.qmth.redis.db=5
 #com.qmth.redis.password
 #com.qmth.redis.password
 
 
 #mysql\u914D\u7F6E
 #mysql\u914D\u7F6E
@@ -69,13 +69,13 @@ spring.activiti.history-level=audit
 #com.qmth.fss.private.config=../static/
 #com.qmth.fss.private.config=../static/
 #com.qmth.fss.private.server=/static/
 #com.qmth.fss.private.server=/static/
 
 
-com.qmth.fss.public.config=../static/
-com.qmth.fss.public.server=/static/
-com.qmth.fss.private.config=../static/
-com.qmth.fss.private.server=/static/
+com.qmth.fss.public.config=/Users/xiaofei/qmth/temporary/zxzk/file-temp
+com.qmth.fss.public.server=http://localhost:7001
+com.qmth.fss.private.config=/Users/xiaofei/qmth/temporary/zxzk/pdf-temp
+com.qmth.fss.private.server=http://localhost:7001
 
 
 #\u7CFB\u7EDF\u914D\u7F6E
 #\u7CFB\u7EDF\u914D\u7F6E
-sys.config.oss=true
+sys.config.oss=false
 sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
 sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
 #sys.config.serverUpload=
 #sys.config.serverUpload=
 #spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
 #spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
@@ -86,7 +86,7 @@ spring.jackson.time-zone=GMT+8
 
 
 #\u65E5\u5FD7\u914D\u7F6E
 #\u65E5\u5FD7\u914D\u7F6E
 com.qmth.logging.root-level=info
 com.qmth.logging.root-level=info
-com.qmth.logging.file-path=/Users/king/Downloads/distributed-task.log
+com.qmth.logging.file-path=/Users/xiaofei/qmth/temporary/zxzk/log/distributed-task.log
 
 
 #============================================================================
 #============================================================================
 # \u914D\u7F6EJobStore
 # \u914D\u7F6EJobStore