Ver Fonte

3.4.3 update-20241224

xiaofei há 5 meses atrás
pai
commit
aae01cac19
20 ficheiros alterados com 402 adições e 265 exclusões
  1. 2 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/BasicExamStudentMapper.java
  2. 2 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/BasicExamStudentService.java
  3. 124 100
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicExamStudentServiceImpl.java
  4. 8 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DownloadServiceImpl.java
  5. 7 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  6. 7 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncExamStudentImportService.java
  7. 71 62
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/DownloadLogicServiceImpl.java
  8. 21 0
      distributed-print-business/src/main/resources/mapper/BasicExamStudentMapper.xml
  9. 4 0
      distributed-print/install/mysql/init/teachcloud_db.sql
  10. 13 0
      distributed-print/install/mysql/upgrade/3.4.3.sql
  11. 9 10
      distributed-print/src/main/resources/application.properties
  12. 2 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/sync/TSyncDataStudent.java
  13. 10 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicExamStudent.java
  14. 2 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/AttachmentCommonService.java
  15. 3 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/AttachmentCommonServiceImpl.java
  16. 31 0
      teachcloud-data/src/main/java/com/qmth/teachcloud/data/dto/SyncDataResult.java
  17. 11 1
      teachcloud-data/src/main/java/com/qmth/teachcloud/data/entity/TSyncDataLog.java
  18. 1 1
      teachcloud-data/src/main/java/com/qmth/teachcloud/data/service/TSyncDataLogService.java
  19. 73 73
      teachcloud-data/src/main/java/com/qmth/teachcloud/data/service/impl/DataServiceImpl.java
  20. 1 1
      teachcloud-data/src/main/java/com/qmth/teachcloud/data/service/impl/TSyncDataLogServiceImpl.java

+ 2 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/BasicExamStudentMapper.java

@@ -49,4 +49,6 @@ public interface BasicExamStudentMapper extends BaseMapper<BasicExamStudent> {
      * @return
      */
     ExamStudentDto queryExamStudent(@Param("examId") Long examId, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber);
+
+    void updateEnableFalse(@Param("examId") Long examId);
 }

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

@@ -17,6 +17,7 @@ import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.BasicExamStudentStatusEnum;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -96,5 +97,5 @@ public interface BasicExamStudentService extends IService<BasicExamStudent> {
     void clearPaperTypeByExamIdAndPaperNumber(Long examId, String paperNumber);
     void clearPaperNumberAndPaperTypeByExamIdAndPaperNumber(Long examId, String paperNumber);
 
-    boolean saveBasicExamStudentFormSync(Long schoolId, Long examId, List<TSyncDataStudent> examStudentDataVo);
+    Map<String, Object> saveBasicExamStudentFormSync(Long schoolId, Long examId, List<TSyncDataStudent> examStudentDataVo);
 }

+ 124 - 100
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicExamStudentServiceImpl.java

@@ -44,6 +44,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import java.lang.reflect.Field;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -589,7 +590,7 @@ public class BasicExamStudentServiceImpl extends ServiceImpl<BasicExamStudentMap
     }
 
     @Override
-    public boolean saveBasicExamStudentFormSync(Long schoolId, Long examId, List<TSyncDataStudent> examStudentDataVoList) {
+    public Map<String, Object> saveBasicExamStudentFormSync(Long schoolId, Long examId, List<TSyncDataStudent> examStudentDataVoList) {
         BasicExam basicExam = basicExamService.getById(examId);
 
         List<BasicExamStudent> basicExamStudentList = this.list(new QueryWrapper<BasicExamStudent>().lambda()
@@ -612,154 +613,177 @@ public class BasicExamStudentServiceImpl extends ServiceImpl<BasicExamStudentMap
 
         List<BasicExamStudent> basicExamStudents = new ArrayList<>();
 
+        StringJoiner errorMsg = new StringJoiner("<br>");
+        AtomicInteger i = new AtomicInteger(0);
         for (TSyncDataStudent tSyncDataStudent : examStudentDataVoList) {
-            BasicExamStudent basicExamStudent = new BasicExamStudent();
-            BeanUtils.copyProperties(tSyncDataStudent, basicExamStudent);
-            basicExamStudent.setSchoolId(schoolId);
-            basicExamStudent.setSemesterId(Long.valueOf(basicExam.getSemesterId()));
-            basicExamStudent.setExamId(examId);
-
-            StringJoiner stringJoiner = new StringJoiner(";");
-            // 学号校验
-            if (StringUtils.isNotBlank(basicExamStudent.getStudentCode()) && !basicExamStudent.getStudentCode().matches(SystemConstant.REGULAR_EXPRESSION_OF_STUDENT_CODE)) {
-                stringJoiner.add("学号只能由大写字母、数字组成");
-            }
-
-            if (ExamModelEnum.MODEL4.equals(basicExam.getExamModel())) {
-                if (basicExamStudent.getPaperType() == null) {
-                    basicExamStudent.setPaperType(SystemConstant.DEFAULT_PAPER_TYPE_A);
+            StringJoiner stringJoiner = new StringJoiner(";<br>");
+            try {
+                if (StringUtils.isBlank(tSyncDataStudent.getCourseCode())) {
+                    throw ExceptionResultEnum.ERROR.exception("课程代码必填");
                 }
-            }
-            // 任课老师和任课老师工号都有值或都没值
-            if (StringUtils.isNotBlank(tSyncDataStudent.getTeacherCode()) && StringUtils.isBlank(tSyncDataStudent.getTeacherName())) {
-                stringJoiner.add(RequiredFieldsEnum.TEACHER_NAME.getName() + "必填");
-            }
-            if (StringUtils.isNotBlank(tSyncDataStudent.getTeacherName()) && StringUtils.isBlank(tSyncDataStudent.getTeacherCode())) {
-                stringJoiner.add(RequiredFieldsEnum.TEACHER_CODE.getName() + "必填");
-            }
-
-            // 解析考试日期和考试时间
-//            if (StringUtils.isNoneBlank(tSyncDataStudent.getExamDate(), tSyncDataStudent.getExamTime())) {
-//                try {
-//                    Map<String, Object> timeMap = ConvertUtil.analyzeExamTime(basicExamStudentImport.getExamDate(), basicExamStudentImport.getExamTime());
-//                    basicExamStudent.setExamStartTime(Long.valueOf(String.valueOf(timeMap.get("startTime"))));
-//                    basicExamStudent.setExamEndTime(Long.valueOf(String.valueOf(timeMap.get("endTime"))));
-//
-//                    // 反向更新examDate为标准日期格式,
-//                    for (CodeNameEnableDisabledValue codeNameEnableDisabledValue : basicExamStudentImport.getRequiredFieldList()) {
-//                        if (codeNameEnableDisabledValue.getCode().equals(RequiredFieldsEnum.EXAM_DATE.getCode())) {
-//                            codeNameEnableDisabledValue.setValue(String.valueOf(timeMap.get("dateStr")));
-//                        }
-//                    }
-//                } catch (Exception e) {
-//                    stringJoiner.add(e.getMessage());
-//                }
-//            }
-
-            // 校验课程开课学院和课程代码
-            if (StringUtils.isNoneBlank(tSyncDataStudent.getCourseCode(), tSyncDataStudent.getCourseCollegeName())) {
+                if (StringUtils.isBlank(tSyncDataStudent.getCourseCollegeName())) {
+                    throw ExceptionResultEnum.ERROR.exception("课程开课学院必填");
+                }
+                if(needPaperNumber && StringUtils.isBlank(tSyncDataStudent.getPaperNumber())){
+                    throw ExceptionResultEnum.ERROR.exception("试卷编号必填");
+                }
+                if (StringUtils.isBlank(tSyncDataStudent.getStudentName())) {
+                    throw ExceptionResultEnum.ERROR.exception("姓名必填");
+                } else if (StringUtils.isNotBlank(tSyncDataStudent.getStudentCode()) && !tSyncDataStudent.getStudentCode().matches(SystemConstant.REGULAR_EXPRESSION_OF_STUDENT_CODE)) {
+                    throw ExceptionResultEnum.ERROR.exception("学号只能由大写字母、数字组成");
+                }
+                if (StringUtils.isBlank(tSyncDataStudent.getStudentCode())) {
+                    throw ExceptionResultEnum.ERROR.exception("学号必填");
+                }
+                if (StringUtils.isBlank(tSyncDataStudent.getTeachClassName())) {
+                    throw ExceptionResultEnum.ERROR.exception("教学班必填");
+                }
+                // 任课老师和任课老师工号都有值或都没值
+                if (StringUtils.isNotBlank(tSyncDataStudent.getTeacherCode()) && StringUtils.isBlank(tSyncDataStudent.getTeacherName())) {
+                    throw ExceptionResultEnum.ERROR.exception(RequiredFieldsEnum.TEACHER_NAME.getName() + "必填");
+                }
+                if (StringUtils.isNotBlank(tSyncDataStudent.getTeacherName()) && StringUtils.isBlank(tSyncDataStudent.getTeacherCode())) {
+                    throw ExceptionResultEnum.ERROR.exception(RequiredFieldsEnum.TEACHER_CODE.getName() + "必填");
+                }
+                // 校验课程开课学院和课程代码
+                Long courseId = null;
                 String key = tSyncDataStudent.getCourseCode() + SystemConstant.HYPHEN + tSyncDataStudent.getCourseCollegeName();
                 if (!basicCourseIdMap.containsKey(key)) {
                     List<SysOrg> sysOrgList = sysOrgService.getSecondOrg(schoolId, tSyncDataStudent.getCourseCollegeName());
                     if (CollectionUtils.isEmpty(sysOrgList)) {
-                        stringJoiner.add("开课学院[" + tSyncDataStudent.getCourseCollegeName() + "]在学院层级不存在");
+                        throw ExceptionResultEnum.ERROR.exception("开课学院[" + tSyncDataStudent.getCourseCollegeName() + "]在学院层级不存在");
                     } else if (sysOrgList.size() == 1) {
                         SysOrg sysOrg = sysOrgList.get(0);
                         // 校验课程代码和开课学院
                         BasicCourse basicCourse = basicCourseService.getByTeachRoomIdAndCode(sysOrg.getId(), tSyncDataStudent.getCourseCode());
                         if (Objects.isNull(basicCourse)) {
-                            stringJoiner.add("课程代码[" + tSyncDataStudent.getCourseCode() + "]在开课学院[" + tSyncDataStudent.getCourseCollegeName() + "]不存在");
+                            throw ExceptionResultEnum.ERROR.exception("课程代码[" + tSyncDataStudent.getCourseCode() + "]在开课学院[" + tSyncDataStudent.getCourseCollegeName() + "]不存在");
                         } else {
-                            basicExamStudent.setCourseId(basicCourse.getId());
+                            courseId = basicCourse.getId();
                             basicCourseIdMap.put(key, basicCourse.getId());
                         }
                     } else {
-                        stringJoiner.add("开课学院[" + tSyncDataStudent.getCourseCollegeName() + "]存在多个相同值");
+                        throw ExceptionResultEnum.ERROR.exception("开课学院[" + tSyncDataStudent.getCourseCollegeName() + "]存在多个相同值");
                     }
                 } else {
-                    basicExamStudent.setCourseId(basicCourseIdMap.get(key));
+                    courseId = basicCourseIdMap.get(key);
                 }
-            }
 
-            // 校验任课老师工号和姓名
-            if (StringUtils.isNoneBlank(tSyncDataStudent.getTeacherCode(), tSyncDataStudent.getTeacherName())) {
-                SysUser sysUser = sysUserService.getByLoginName(schoolId, tSyncDataStudent.getTeacherCode());
-                if (sysUser == null) {
-                    stringJoiner.add("任课老师工号[" + tSyncDataStudent.getTeacherCode() + "]用户不存在");
-                } else {
-                    if (!sysUser.getEnable()) {
-                        stringJoiner.add("任课老师工号[" + tSyncDataStudent.getTeacherCode() + "]用户已禁用");
-                    } else if (!sysUser.getRealName().equals(tSyncDataStudent.getTeacherName())) {
-                        stringJoiner.add("任课老师[" + tSyncDataStudent.getTeacherName() + "]与用户管理中姓名[" + sysUser.getRealName() + "]不一致");
-                    } else {
-                        basicExamStudent.setTeacherId(sysUser.getId());
-                    }
+                if (courseId == null) {
+                    throw ExceptionResultEnum.ERROR.exception("课程管理中未查到课程");
                 }
 
-                // 校验同课程下,同一教学班只能有一个任课老师
-                String courseTeachClassTeacherKey = basicExamStudent.getCourseId() + basicExamStudent.getTeachClassName();
-                if (courseTeachClassTeacherMap.containsKey(courseTeachClassTeacherKey)) {
-                    Long teacherId = courseTeachClassTeacherMap.get(courseTeachClassTeacherKey);
-                    if ((teacherId == null && basicExamStudent.getTeacherId() != null) || (teacherId != null && basicExamStudent.getTeacherId() == null) || (teacherId != null && !teacherId.equals(basicExamStudent.getTeacherId()))) {
-                        stringJoiner.add("同课程同教学班,只允许设置一个任课老师");
-                    }
+                String courseStudentKey = courseId + SystemConstant.HYPHEN + tSyncDataStudent.getStudentCode();
+                // 校验课程学号唯一
+                if (courseCodeStudentCodeList.contains(courseStudentKey)) {
+                    throw ExceptionResultEnum.ERROR.exception(String.format("课程代码[%s],开课学院[%s],学号[%s]存在重复考生", tSyncDataStudent.getCourseCode(), tSyncDataStudent.getCourseCollegeName(), tSyncDataStudent.getStudentCode()));
                 } else {
-                    courseTeachClassTeacherMap.put(courseTeachClassTeacherKey, basicExamStudent.getTeacherId());
+                    courseCodeStudentCodeList.add(courseStudentKey);
                 }
-            }
 
-            if (basicExamStudent.getCourseId() != null) {
-                if (courseIdStudentCodeMap.containsKey(basicExamStudent.getCourseId() + SystemConstant.HYPHEN + basicExamStudent.getStudentCode())) {
-                    BasicExamStudent student = courseIdStudentCodeMap.get(basicExamStudent.getCourseId() + SystemConstant.HYPHEN + basicExamStudent.getStudentCode());
-                    if (StringUtils.isNotBlank(student.getPaperNumber()) && !student.getPaperNumber().equals(basicExamStudent.getPaperNumber())) {
-                        throw ExceptionResultEnum.ERROR.exception("不允许修改试卷编号");
-                    } else {
-                        basicExamStudent.setId(student.getId());
-                        basicExamStudent.setPaperType(student.getPaperType());
-                    }
+                // 获取basicExamStudent对象
+                BasicExamStudent basicExamStudent;
+                if (courseIdStudentCodeMap.containsKey(courseStudentKey)) {
+                    basicExamStudent = courseIdStudentCodeMap.get(courseStudentKey);
+                } else {
+                    basicExamStudent = new BasicExamStudent();
+                    basicExamStudent.setId(SystemConstant.getDbUuid());
+                    basicExamStudent.setSchoolId(schoolId);
+                    basicExamStudent.setSemesterId(Long.valueOf(basicExam.getSemesterId()));
+                    basicExamStudent.setExamId(examId);
+                    basicExamStudent.setCourseId(courseId);
+                    basicExamStudent.setStudentCode(tSyncDataStudent.getStudentCode());
                 }
 
-                if (StringUtils.isNotBlank(basicExamStudent.getPaperNumber())) {
-                    if (paperNumberCourseIdMap.containsKey(basicExamStudent.getPaperNumber())) {
+                basicExamStudent.setStudentName(tSyncDataStudent.getStudentName());
+                basicExamStudent.setSiteNumber(tSyncDataStudent.getSiteNumber());
+                basicExamStudent.setCollegeName(tSyncDataStudent.getStudentCollegeName());
+                basicExamStudent.setMajorName(tSyncDataStudent.getMajorName());
+                basicExamStudent.setTeachClassName(tSyncDataStudent.getTeachClassName());
+                basicExamStudent.setClassName(tSyncDataStudent.getClassName());
+                basicExamStudent.setStatus(BasicExamStudentStatusEnum.N);
+                basicExamStudent.setExamStartTime(tSyncDataStudent.getExamStartTime());
+                basicExamStudent.setExamEndTime(tSyncDataStudent.getExamEndTime());
+                basicExamStudent.setExamPlace(tSyncDataStudent.getExamPlace());
+                basicExamStudent.setExamRoom(tSyncDataStudent.getExamRoom());
+
+                if (StringUtils.isNotBlank(tSyncDataStudent.getPaperNumber())) {
+                    if (paperNumberCourseIdMap.containsKey(tSyncDataStudent.getPaperNumber())) {
                         if (!paperNumberCourseIdMap.get(basicExamStudent.getPaperNumber()).equals(basicExamStudent.getCourseId())) {
-                            stringJoiner.add("试卷编号[" + basicExamStudent.getPaperNumber() + "]不能绑定多个课程");
+                            throw ExceptionResultEnum.ERROR.exception("试卷编号[" + basicExamStudent.getPaperNumber() + "]不能绑定多个课程");
                         }
                     } else {
-                        long count = basicExamStudentList.stream().filter(m -> m.getPaperNumber() != null && m.getPaperNumber().equals(basicExamStudent.getPaperNumber()) && !Objects.equals(m.getCourseId(), basicExamStudent.getCourseId())).count();
+                        long count = basicExamStudentList.stream().filter(m -> m.getPaperNumber() != null && m.getPaperNumber().equals(tSyncDataStudent.getPaperNumber()) && !Objects.equals(m.getCourseId(), basicExamStudent.getCourseId())).count();
                         if (count > 0) {
-                            stringJoiner.add("试卷编号[" + basicExamStudent.getPaperNumber() + "]已绑定其它课程");
+                            throw ExceptionResultEnum.ERROR.exception("试卷编号[" + basicExamStudent.getPaperNumber() + "]已绑定其它课程");
                         } else {
                             paperNumberCourseIdMap.put(basicExamStudent.getPaperNumber(), basicExamStudent.getCourseId());
                         }
                     }
 
                     // 同一试卷编号只能对应同一考试时间
-                    if (basicExamStudent.getExamStartTime() != null && basicExamStudent.getExamEndTime() != null) {
+                    if (tSyncDataStudent.getExamStartTime() != null && tSyncDataStudent.getExamEndTime() != null) {
                         String examTimeValue = basicExamStudent.getExamStartTime() + "-" + basicExamStudent.getExamEndTime();
                         if (paperNumberExamTimeMap.containsKey(basicExamStudent.getPaperNumber())) {
                             if (!paperNumberExamTimeMap.get(basicExamStudent.getPaperNumber()).equals(examTimeValue)) {
-                                stringJoiner.add("试卷编号[" + basicExamStudent.getPaperNumber() + "]只能有相同考试时间");
+                                throw ExceptionResultEnum.ERROR.exception("试卷编号[" + basicExamStudent.getPaperNumber() + "]只能有相同考试时间");
                             }
                         } else {
                             paperNumberExamTimeMap.put(basicExamStudent.getPaperNumber(), examTimeValue);
                         }
                     }
+
+                    basicExamStudent.setPaperNumber(tSyncDataStudent.getPaperNumber());
                 }
 
-                // 校验课程学号唯一
-                String courseCodeStudentCodeKey = basicExamStudent.getCourseId() + tSyncDataStudent.getStudentCode();
-                if (courseCodeStudentCodeList.contains(courseCodeStudentCodeKey)) {
-                    stringJoiner.add(String.format("课程代码[%s],开课学院[%s],学号[%s]存在重复考生", tSyncDataStudent.getCourseCode(), tSyncDataStudent.getCourseCollegeName(), tSyncDataStudent.getStudentCode()));
-                } else {
-                    courseCodeStudentCodeList.add(courseCodeStudentCodeKey);
+//                if (ExamModelEnum.MODEL4.equals(basicExam.getExamModel())) {
+//                    if (basicExamStudent.getPaperType() == null) {
+//                        basicExamStudent.setPaperType(SystemConstant.DEFAULT_PAPER_TYPE_A);
+//                    }
+//                }
+
+                // 校验任课老师工号和姓名
+                if (StringUtils.isNoneBlank(tSyncDataStudent.getTeacherCode(), tSyncDataStudent.getTeacherName())) {
+                    SysUser sysUser = sysUserService.getByLoginName(schoolId, tSyncDataStudent.getTeacherCode());
+                    if (sysUser == null) {
+                        throw ExceptionResultEnum.ERROR.exception("任课老师工号[" + tSyncDataStudent.getTeacherCode() + "]用户不存在");
+                    } else {
+                        if (!sysUser.getEnable()) {
+                            throw ExceptionResultEnum.ERROR.exception("任课老师工号[" + tSyncDataStudent.getTeacherCode() + "]用户已禁用");
+                        } else if (!sysUser.getRealName().equals(tSyncDataStudent.getTeacherName())) {
+                            throw ExceptionResultEnum.ERROR.exception("任课老师[" + tSyncDataStudent.getTeacherName() + "]与用户管理中姓名[" + sysUser.getRealName() + "]不一致");
+                        } else {
+                            basicExamStudent.setTeacherId(sysUser.getId());
+                        }
+                    }
+
+                    // 校验同课程下,同一教学班只能有一个任课老师
+                    String courseTeachClassTeacherKey = basicExamStudent.getCourseId() + tSyncDataStudent.getTeachClassName();
+                    if (courseTeachClassTeacherMap.containsKey(courseTeachClassTeacherKey)) {
+                        Long teacherId = courseTeachClassTeacherMap.get(courseTeachClassTeacherKey);
+                        if ((teacherId == null && basicExamStudent.getTeacherId() != null) || (teacherId != null && basicExamStudent.getTeacherId() == null) || (teacherId != null && !teacherId.equals(basicExamStudent.getTeacherId()))) {
+                            throw ExceptionResultEnum.ERROR.exception("同课程同教学班,只允许设置一个任课老师");
+                        }
+                    } else {
+                        courseTeachClassTeacherMap.put(courseTeachClassTeacherKey, basicExamStudent.getTeacherId());
+                    }
                 }
+                parserRequiredField(basicExamStudent);
+                basicExamStudents.add(basicExamStudent);
+            } catch (Exception e) {
+                stringJoiner.add(e.getMessage());
             }
-
-            parserRequiredField(basicExamStudent);
-            basicExamStudents.add(basicExamStudent);
         }
 
-        this.saveOrUpdateBatch(basicExamStudents, 2000);
-        return true;
+        this.saveOrUpdateBatch(basicExamStudents);
+        // 更新删除考生启用状态为false
+        this.baseMapper.updateEnableFalse(examId);
+        this.updateMarkData(examId, basicExamStudentList, null);
+        // 自动创建课程管理数据
+        teachCourseService.batchCreateTeachCourse(schoolId, examId, basicExamStudentList);
+        Map<String, Object> map = new HashMap<>();
+        map.put("count", basicExamStudents.size());
+        map.put("errMsg", errorMsg.toString());
+        return map;
     }
 }

+ 8 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DownloadServiceImpl.java

@@ -24,6 +24,8 @@ import com.qmth.teachcloud.common.enums.PageSizeEnum;
 import com.qmth.teachcloud.common.mapper.BasicAttachmentMapper;
 import com.qmth.teachcloud.common.service.AttachmentCommonService;
 import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
+import com.qmth.teachcloud.common.service.SysUserService;
+import com.qmth.teachcloud.common.util.Base64Util;
 import com.qmth.teachcloud.common.util.ConvertUtil;
 import com.qmth.distributed.print.business.util.ExamTaskUtil;
 import com.qmth.teachcloud.common.util.HtmlToPdfUtil;
@@ -49,7 +51,7 @@ public class DownloadServiceImpl implements DownloadService {
     @Resource
     ExamTaskMapper examTaskMapper;
     @Resource
-    ExamTaskDetailMapper examTaskDetailMapper;
+    SysUserService sysUserService;
 
     @Resource
     BasicAttachmentMapper basicAttachmentMapper;
@@ -112,9 +114,8 @@ public class DownloadServiceImpl implements DownloadService {
                     if (StringUtils.isNotBlank(attachmentId)) {
                         // 试卷
                         BasicAttachment attachment = basicAttachmentMapper.selectById(attachmentId);
-                        if (attachment == null) {
-                            throw ExceptionResultEnum.ERROR.exception("附件数据异常");
-                        }
+                        Optional.ofNullable(attachment).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未查询到试卷"));
+
                         String paperPath = rootPath + File.separator + examTask.getCourseName().replaceAll(" ", "") + SystemConstant.HYPHEN + examTask.getCourseCode() + File.separator + examTask.getPaperNumber();
                         String fileName = "卷" + examTaskDetail.getSerialNumber() + SystemConstant.HYPHEN + "试卷" + SystemConstant.HYPHEN + attachment.getName() + SystemConstant.HYPHEN + paperType + attachment.getType();
                         fileList.add(attachmentCommonService.downloadFile(paperPath, fileName, attachment));
@@ -125,6 +126,7 @@ public class DownloadServiceImpl implements DownloadService {
                     // 题卡
                     if (StringUtils.isNotBlank(cardId)) {
                         ExamCard examCard = examCardMapper.selectById(cardId);
+                        Optional.ofNullable(examCard).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未查询到题卡"));
 
                         String cardPath = rootPath + File.separator + examTask.getCourseName().replaceAll(" ", "") + SystemConstant.HYPHEN + examTask.getCourseCode() + File.separator + examTask.getPaperNumber();
                         String cardHtmlPath = cardPath + File.separator + "卷" + examTaskDetail.getSerialNumber() + SystemConstant.HYPHEN + "题卡" + SystemConstant.HYPHEN + examTask.getCourseName() + SystemConstant.HYPHEN + paperType + SystemConstant.HTML_PREFIX;
@@ -157,7 +159,8 @@ public class DownloadServiceImpl implements DownloadService {
                 throw ExceptionResultEnum.ERROR.exception("没有可导出文件");
             }
             String zipName = examTask.getCourseName() + "未曝光试卷" + SystemConstant.ZIP_PREFIX;
-            attachmentCommonService.zipFiles(response, rootPath, zipName, fileList);
+            SysUser sysUser = sysUserService.getById(ServletUtil.getRequestUserId());
+            attachmentCommonService.zipFiles(response, rootPath, zipName, fileList, new String(Base64Util.decode(sysUser.getPassword())));
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
         } finally {

+ 7 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -1027,19 +1027,21 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                 List<PaperInfoVo> paperInfoVoList = ExamTaskUtil.parsePaperAttachmentPath(examTaskDetail.getPaperAttachmentIds());
                 // 试卷
                 for (PaperInfoVo paperInfoVo : paperInfoVoList) {
-                    Long attachmentId = Long.valueOf(paperInfoVo.getAttachmentId());
                     String name = paperInfoVo.getName();
-                    if (Objects.nonNull(attachmentId)) {
+                    String attachmentId = paperInfoVo.getAttachmentId();
+                    if (StringUtils.isNotBlank(attachmentId)) {
                         BasicAttachment attachment = basicAttachmentService.getById(attachmentId);
-                        Optional.ofNullable(attachment).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("附件数据异常"));
+                        Optional.ofNullable(attachment).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未查询到试卷"));
+
                         String fileName = dirPath + "卷" + examTaskDetail.getSerialNumber() + SystemConstant.HYPHEN + "试卷" + SystemConstant.HYPHEN + name + attachment.getType();
                         fileUploadService.downloadFile(attachment, fileName);
                     }
 
                     // 题卡
-                    Long cardId = Long.valueOf(paperInfoVo.getCardId());
-                    if (cardId != null) {
+                    String cardId = paperInfoVo.getCardId();
+                    if (StringUtils.isNotBlank(cardId)) {
                         ExamCard examCard = examCardService.getById(cardId);
+                        Optional.ofNullable(examCard).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未查询到题卡"));
 
                         String cardHtmlPath = dirPath + "卷" + examTaskDetail.getSerialNumber() + SystemConstant.HYPHEN + "题卡" + SystemConstant.HYPHEN + name + SystemConstant.HTML_PREFIX;
                         String cardPdfPath = dirPath + "卷" + examTaskDetail.getSerialNumber() + SystemConstant.HYPHEN + "题卡" + SystemConstant.HYPHEN + name + SystemConstant.PDF_PREFIX;

+ 7 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncExamStudentImportService.java

@@ -63,6 +63,8 @@ public class AsyncExamStudentImportService extends AsyncImportTaskTemplete {
     @Resource
     private BasicExamStudentService basicExamStudentService;
     @Resource
+    private TeachCourseService teachCourseService;
+    @Resource
     private FileUploadService fileUploadService;
 
     @Override
@@ -130,7 +132,11 @@ public class AsyncExamStudentImportService extends AsyncImportTaskTemplete {
 
                 List<BasicExamStudent> basicExamStudentList = JSON.parseArray(JSON.toJSONString(result.get(SystemConstant.DATASOURCE)), BasicExamStudent.class);
                 basicExamStudentService.saveOrUpdateBatch(basicExamStudentList);
-                SystemConstant.addSummary(stringJoinerSummary, "保存基础考生数据完成,开始保存印刷任务数据");
+                SystemConstant.addSummary(stringJoinerSummary, "保存基础考生数据完成,开始保存课程管理数据");
+
+                // 自动创建课程管理数据
+                teachCourseService.batchCreateTeachCourse(tbTask.getSchoolId(), tbTask.getExamId(), basicExamStudentList);
+                SystemConstant.addSummary(stringJoinerSummary, "保存课程管理数据完成,开始保存印刷任务数据");
 
                 ExamPrintPlan examPrintPlan = examPrintPlanService.getById(tbTask.getPrintPlanId());
                 // 组装exam_detail数据

+ 71 - 62
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/DownloadLogicServiceImpl.java

@@ -292,41 +292,48 @@ public class DownloadLogicServiceImpl implements DownloadLogicService {
                             throw ExceptionResultEnum.ERROR.exception("试卷信息不存在");
                         }
                         for (PaperInfoVo paperInfoVo : paperInfoVoList) {
-                            Long attachmentId = Long.valueOf(paperInfoVo.getAttachmentId());
                             String name = paperInfoVo.getName();
-                            if (Objects.nonNull(attachmentId)) {
+
+                            // 试卷
+                            String attachmentId = paperInfoVo.getAttachmentId();
+                            if (StringUtils.isNotBlank(attachmentId)) {
                                 BasicAttachment attachment = basicAttachmentService.getById(attachmentId);
+                                Optional.ofNullable(attachment).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("课程[" + examTask.getCourseName() + "(" + examTask.getCourseCode() + ")]、试卷编号[" + examTask.getPaperNumber() + "]命题任务未查询到卷型[" + paperInfoVo.getName() + "]试卷"));
+
                                 if (Objects.nonNull(attachment)) {
                                     String fileName = dirPath + "卷" + examTaskDetail.getSerialNumber() + SystemConstant.HYPHEN + "试卷" + SystemConstant.HYPHEN + name + attachment.getType();
                                     File paperFile = fileUploadService.downloadFile(attachment, fileName);
                                     sourceFileList.add(paperFile);
                                 }
                             }
-                            Long cardId = Long.valueOf(paperInfoVo.getCardId());
-                            ExamCard examCard = examCardService.getById(cardId);
-                            Optional.ofNullable(examCard).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("找不到答题卡"));
-
-                            String cardHtmlPath = dirPath + "卷" + examTaskDetail.getSerialNumber() + SystemConstant.HYPHEN + "题卡" + SystemConstant.HYPHEN + name + SystemConstant.HTML_PREFIX;
-                            String cardPdfPath = dirPath + "卷" + examTaskDetail.getSerialNumber() + SystemConstant.HYPHEN + "题卡" + SystemConstant.HYPHEN + name + SystemConstant.PDF_PREFIX;
-                            // 通用题卡
-                            String htmlContent = createPdfUtil.replaceBlankHtmlContent(examCard.getHtmlContent(), examCard.getCourseId());
-                            // html
-                            File localFile = new File(cardHtmlPath);
-                            if (!localFile.exists()) {
-                                localFile.getParentFile().mkdirs();
-                                localFile.createNewFile();
-                            }
-                            // 生成html文件
-                            FileCopyUtils.copy(htmlContent.getBytes(StandardCharsets.UTF_8), localFile);
-                            sourceFileList.add(localFile);
-                            // 转pdf文件
-                            File file = new File(cardPdfPath);
-                            if (!file.exists()) {
-                                file.getParentFile().mkdirs();
-                                file.createNewFile();
+                            // 题卡
+                            String cardId = paperInfoVo.getCardId();
+                            if (StringUtils.isNotBlank(cardId)) {
+                                ExamCard examCard = examCardService.getById(cardId);
+                                Optional.ofNullable(examCard).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("课程[" + examTask.getCourseName() + "(" + examTask.getCourseCode() + ")]、试卷编号[" + examTask.getPaperNumber() + "]命题任务未查询到卷型[" + paperInfoVo.getName() + "]题卡"));
+
+                                String cardHtmlPath = dirPath + "卷" + examTaskDetail.getSerialNumber() + SystemConstant.HYPHEN + "题卡" + SystemConstant.HYPHEN + name + SystemConstant.HTML_PREFIX;
+                                String cardPdfPath = dirPath + "卷" + examTaskDetail.getSerialNumber() + SystemConstant.HYPHEN + "题卡" + SystemConstant.HYPHEN + name + SystemConstant.PDF_PREFIX;
+                                // 通用题卡
+                                String htmlContent = createPdfUtil.replaceBlankHtmlContent(examCard.getHtmlContent(), examCard.getCourseId());
+                                // html
+                                File localFile = new File(cardHtmlPath);
+                                if (!localFile.exists()) {
+                                    localFile.getParentFile().mkdirs();
+                                    localFile.createNewFile();
+                                }
+                                // 生成html文件
+                                FileCopyUtils.copy(htmlContent.getBytes(StandardCharsets.UTF_8), localFile);
+                                sourceFileList.add(localFile);
+                                // 转pdf文件
+                                File file = new File(cardPdfPath);
+                                if (!file.exists()) {
+                                    file.getParentFile().mkdirs();
+                                    file.createNewFile();
+                                }
+                                HtmlToPdfUtil.convert(cardHtmlPath, cardPdfPath, "8K".equals(examCard.getPageSize()) ? PageSizeEnum.K8 : PageSizeEnum.valueOf(examCard.getPageSize()));
+                                sourceFileList.add(file);
                             }
-                            HtmlToPdfUtil.convert(cardHtmlPath, cardPdfPath, "8K".equals(examCard.getPageSize()) ? PageSizeEnum.K8 : PageSizeEnum.valueOf(examCard.getPageSize()));
-                            sourceFileList.add(file);
                         }
                     }
                 }
@@ -607,49 +614,51 @@ public class DownloadLogicServiceImpl implements DownloadLogicService {
                             } else {
                                 paperFileNamePath = paperFileNamePath + "." + FilenameUtils.getExtension(paperInfoVo.getFilename());
                             }
-                            Long attachmentId = Long.valueOf(paperInfoVo.getAttachmentId());
-                            if (Objects.nonNull(attachmentId)) {
+                            String attachmentId = paperInfoVo.getAttachmentId();
+                            if (StringUtils.isNotBlank(attachmentId)) {
                                 BasicAttachment attachment = basicAttachmentService.getById(attachmentId);
-                                if (Objects.nonNull(attachment)) {
-                                    String fileName = trimWhiteSpace(zipLocalRootPath + File.separator + secondPath + File.separator + spliceFileName(paperFileNamePath, SystemConstant.PDF_PREFIX));
-                                    fileUploadService.downloadFile(attachment, fileName);
-                                }
+                                Optional.ofNullable(attachment).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("课程[" + examTaskDetailDto.getCourseName() + "(" + examTaskDetailDto.getCourseCode() + ")]、试卷编号[" + examTaskDetailDto.getPaperNumber() + "]命题任务未查询到卷型[" + paperInfoVo.getName() + "]试卷"));
+
+                                String fileName = trimWhiteSpace(zipLocalRootPath + File.separator + secondPath + File.separator + spliceFileName(paperFileNamePath, SystemConstant.PDF_PREFIX));
+                                fileUploadService.downloadFile(attachment, fileName);
                             }
                         }
                         // 下载题卡
                         if (downloadCard) {
-                            Long cardId = Long.valueOf(paperInfoVo.getCardId());
-                            ExamCard examCard = examCardService.getById(cardId);
-                            Optional.ofNullable(examCard).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("课程[" + examTaskDetailDto.getCourseName() + "(" + examTaskDetailDto.getCourseCode() + ")]、试卷编号[" + examTaskDetailDto.getPaperNumber() + "]命题任务未找到卷型[" + paperInfoVo.getName() + "]题卡"));
-
-                            String cardHtmlPath = zipLocalRootPath + File.separator + secondPath + File.separator + "卷" + examTaskDetail.getSerialNumber() + SystemConstant.HYPHEN + "题卡" + SystemConstant.HYPHEN + paperInfoVo.getName() + SystemConstant.HYPHEN + fileNamePath;
-                            String cardPdfPath = zipLocalRootPath + File.separator + secondPath + File.separator + "卷" + examTaskDetail.getSerialNumber() + SystemConstant.HYPHEN + "题卡" + SystemConstant.HYPHEN + paperInfoVo.getName() + SystemConstant.HYPHEN + fileNamePath;
-                            // 原文件名
-                            if (namedByOriginalFile) {
-                                cardHtmlPath = trimWhiteSpace(cardHtmlPath + SystemConstant.HYPHEN + examCard.getTitle() + SystemConstant.HTML_PREFIX);
-                                cardPdfPath = trimWhiteSpace(cardPdfPath + SystemConstant.HYPHEN + examCard.getTitle() + SystemConstant.PDF_PREFIX);
-                            } else {
-                                cardHtmlPath = trimWhiteSpace(cardHtmlPath + SystemConstant.HTML_PREFIX);
-                                cardPdfPath = trimWhiteSpace(cardPdfPath + SystemConstant.PDF_PREFIX);
-                            }
+                            String cardId = paperInfoVo.getCardId();
+                            if (StringUtils.isNotBlank(cardId)) {
+                                ExamCard examCard = examCardService.getById(cardId);
+                                Optional.ofNullable(examCard).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("课程[" + examTaskDetailDto.getCourseName() + "(" + examTaskDetailDto.getCourseCode() + ")]、试卷编号[" + examTaskDetailDto.getPaperNumber() + "]命题任务未查询到卷型[" + paperInfoVo.getName() + "]题卡"));
+
+                                String cardHtmlPath = zipLocalRootPath + File.separator + secondPath + File.separator + "卷" + examTaskDetail.getSerialNumber() + SystemConstant.HYPHEN + "题卡" + SystemConstant.HYPHEN + paperInfoVo.getName() + SystemConstant.HYPHEN + fileNamePath;
+                                String cardPdfPath = zipLocalRootPath + File.separator + secondPath + File.separator + "卷" + examTaskDetail.getSerialNumber() + SystemConstant.HYPHEN + "题卡" + SystemConstant.HYPHEN + paperInfoVo.getName() + SystemConstant.HYPHEN + fileNamePath;
+                                // 原文件名
+                                if (namedByOriginalFile) {
+                                    cardHtmlPath = trimWhiteSpace(cardHtmlPath + SystemConstant.HYPHEN + examCard.getTitle() + SystemConstant.HTML_PREFIX);
+                                    cardPdfPath = trimWhiteSpace(cardPdfPath + SystemConstant.HYPHEN + examCard.getTitle() + SystemConstant.PDF_PREFIX);
+                                } else {
+                                    cardHtmlPath = trimWhiteSpace(cardHtmlPath + SystemConstant.HTML_PREFIX);
+                                    cardPdfPath = trimWhiteSpace(cardPdfPath + SystemConstant.PDF_PREFIX);
+                                }
 
-                            // html
-                            File localFile = new File(cardHtmlPath);
-                            if (!localFile.exists()) {
-                                localFile.getParentFile().mkdirs();
-                                localFile.createNewFile();
-                            }
-                            // 通用题卡
-                            String htmlContent = createPdfUtil.replaceBlankHtmlContent(examCard.getHtmlContent(), examCard.getCourseId());
-                            // 生成html文件
-                            FileCopyUtils.copy(htmlContent.getBytes(StandardCharsets.UTF_8), localFile);
-                            // 转pdf文件
-                            File file = new File(cardPdfPath);
-                            if (!file.exists()) {
-                                file.getParentFile().mkdirs();
-                                file.createNewFile();
+                                // html
+                                File localFile = new File(cardHtmlPath);
+                                if (!localFile.exists()) {
+                                    localFile.getParentFile().mkdirs();
+                                    localFile.createNewFile();
+                                }
+                                // 通用题卡
+                                String htmlContent = createPdfUtil.replaceBlankHtmlContent(examCard.getHtmlContent(), examCard.getCourseId());
+                                // 生成html文件
+                                FileCopyUtils.copy(htmlContent.getBytes(StandardCharsets.UTF_8), localFile);
+                                // 转pdf文件
+                                File file = new File(cardPdfPath);
+                                if (!file.exists()) {
+                                    file.getParentFile().mkdirs();
+                                    file.createNewFile();
+                                }
+                                HtmlToPdfUtil.convert(cardHtmlPath, cardPdfPath, "8K".equals(examCard.getPageSize()) ? PageSizeEnum.K8 : PageSizeEnum.valueOf(examCard.getPageSize()));
                             }
-                            HtmlToPdfUtil.convert(cardHtmlPath, cardPdfPath, "8K".equals(examCard.getPageSize()) ? PageSizeEnum.K8 : PageSizeEnum.valueOf(examCard.getPageSize()));
                         }
                         examTaskPaperExportDto.setResult("下载成功");
                     }

+ 21 - 0
distributed-print-business/src/main/resources/mapper/BasicExamStudentMapper.xml

@@ -1,6 +1,26 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.qmth.distributed.print.business.mapper.BasicExamStudentMapper">
+    <update id="updateEnableFalse">
+        UPDATE basic_exam_student bes
+            LEFT JOIN
+            basic_course bc ON bes.course_id = bc.id
+            LEFT JOIN
+            sys_org so ON bc.teaching_room_id = so.id
+            SET
+                bes.enable = FALSE
+        WHERE
+            bes.exam_id = #{examId}
+          AND NOT EXISTS( SELECT
+            1
+            FROM
+            t_sync_data_student tsds
+            WHERE
+            bes.exam_id = tsds.exam_id
+          AND bc.code = tsds.course_code
+          AND so.name = tsds.course_college_name
+          AND bes.student_code = tsds.student_code)
+    </update>
 
     <select id="findBasicExamStudentPage"
             resultType="com.qmth.distributed.print.business.bean.result.BasicExamStudentResult">
@@ -149,6 +169,7 @@
             <if test="query.paperNumber != null and query.paperNumber != ''">
                 and stu.paper_number like concat('%', #{query.paperNumber}, '%')
             </if>
+            and stu.enable = true
         </where>
         ORDER BY stu.student_code
     </select>

+ 4 - 0
distributed-print/install/mysql/init/teachcloud_db.sql

@@ -204,6 +204,7 @@ CREATE TABLE IF NOT EXISTS `basic_exam_student` (
   `exam_room` varchar(50) DEFAULT NULL COMMENT '考场',
   `required_fields` mediumtext COMMENT '基础字段',
   `extend_fields` mediumtext COMMENT '扩展字段',
+  `enable` TINYINT(1) NULL DEFAULT 1 COMMENT '是否启用',
   `create_id` bigint DEFAULT NULL COMMENT '创建人',
   `create_time` bigint DEFAULT NULL COMMENT '创建时间',
   `update_id` bigint DEFAULT NULL COMMENT '更新人',
@@ -5989,6 +5990,7 @@ CREATE TABLE IF NOT EXISTS `t_sync_data_log` (
        `start_time` BIGINT(20) NULL COMMENT '开始同步时间',
        `end_time` BIGINT(20) NULL COMMENT '结束同步时间',
        `count` INT NULL COMMENT '同步数量',
+        `success_count` INT(11) NULL DEFAULT NULL COMMENT '成功数量',
        `error_msg` MEDIUMTEXT NULL COMMENT '失败原因',
        PRIMARY KEY (`id`))
     COMMENT = '数据同步日志';
@@ -6022,6 +6024,8 @@ CREATE TABLE IF NOT EXISTS `t_sync_data_student`  (
         `jxbzc` VARCHAR(2000) NULL COMMENT '教学班组成',
         `xnm` VARCHAR(45) NULL COMMENT '学年名',
         `xqm` VARCHAR(45) NULL COMMENT '学期名',
+        `exam_date` VARCHAR(45) NULL COMMENT '考试日期',
+        `exam_time` VARCHAR(45) NULL COMMENT '考试时间',
         PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据同步考生' ROW_FORMAT = Dynamic;
 

+ 13 - 0
distributed-print/install/mysql/upgrade/3.4.3.sql

@@ -82,3 +82,16 @@ INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('3077', '数据同步参数保存', '/api/admin/set/data/sync/save', 'URL', '508', '20', 'AUTH', '1', '0', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('3078', '机器人参数查询', '/api/admin/set/ai/robot/select', 'URL', '508', '21', 'AUTH', '1', '0', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('3079', '机器人参数保存', '/api/admin/set/ai/robot/save', 'URL', '508', '22', 'AUTH', '1', '0', '1');
+
+-- 2024.12.20发版后新增的脚本
+ALTER TABLE `t_sync_data_log`
+    ADD COLUMN `success_count` INT(11) NULL DEFAULT NULL COMMENT '成功数量' AFTER `count`,
+CHANGE COLUMN `count` `count` INT(11) NULL DEFAULT NULL COMMENT '同步数据总数量' ;
+
+
+ALTER TABLE `t_sync_data_student`
+    ADD COLUMN `exam_date` VARCHAR(45) NULL COMMENT '考试日期' AFTER `xqm`,
+ADD COLUMN `exam_time` VARCHAR(45) NULL COMMENT '考试时间' AFTER `exam_date`;
+
+ALTER TABLE `basic_exam_student`
+    ADD COLUMN `enable` TINYINT(1) NULL DEFAULT 1 COMMENT '是否启用' AFTER `extend_fields`;

+ 9 - 10
distributed-print/src/main/resources/application.properties

@@ -13,7 +13,6 @@ spring.application.name=teachcloud
 db.host=localhost
 db.port=3306
 db.name=teachcloud-test
-
 db.username=root
 db.password=12345678
 
@@ -52,23 +51,23 @@ spring.activiti.check-process-definitions=false
 #full\uFF1A\u4FDD\u5B58\u5386\u53F2\u6570\u636E\u7684\u6700\u9AD8\u7EA7\u522B\uFF0C\u9664\u4E86\u4F1A\u4FDD\u5B58audit\u7EA7\u522B\u7684\u6570\u636E\u5916\uFF0C\u8FD8\u4F1A\u4FDD\u5B58\u5176\u4ED6\u5168\u90E8\u6D41\u7A0B\u76F8\u5173\u7684\u7EC6\u8282\u6570\u636E\uFF0C\u5305\u62EC\u4E00\u4E9B\u6D41\u7A0B\u53C2\u6570\u7B49\u3002
 spring.activiti.history-level=audit
 
-com.qmth.fss.private.config=oss://key:secret@teachcloud-dps-dev-private.oss-api.qmth.com.cn
-com.qmth.fss.private.server=https://oss-file.qmth.com.cn/teachcloud-dps-dev-private
-com.qmth.fss.public.config=oss://key:secret@teachcloud-dps-dev-public.oss-api.qmth.com.cn
-com.qmth.fss.public.server=https://oss-file.qmth.com.cn/teachcloud-dps-dev-public
+#com.qmth.fss.private.config=oss://key:secret@teachcloud-dps-dev-private.oss-api.qmth.com.cn
+#com.qmth.fss.private.server=https://oss-file.qmth.com.cn/teachcloud-dps-dev-private
+#com.qmth.fss.public.config=oss://key:secret@teachcloud-dps-dev-public.oss-api.qmth.com.cn
+#com.qmth.fss.public.server=https://oss-file.qmth.com.cn/teachcloud-dps-dev-public
 
 #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=/file-temp/
-#com.qmth.fss.private.config=/Users/xiaofei/qmth/temporary/zxzk/pdf-temp
-#com.qmth.fss.private.server=/pdf-temp/
+com.qmth.fss.public.config=/Users/xiaofei/qmth/temporary/zxzk/file-temp
+com.qmth.fss.public.server=/file-temp/
+com.qmth.fss.private.config=/Users/xiaofei/qmth/temporary/zxzk/pdf-temp
+com.qmth.fss.private.server=/fss/
 
 #\u7CFB\u7EDF\u914D\u7F6E
-sys.config.oss=false
+sys.config.oss=true
 sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
 sys.config.serverUpload=
 spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/

+ 2 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/sync/TSyncDataStudent.java

@@ -96,9 +96,9 @@ public class TSyncDataStudent implements Serializable {
     @ApiModelProperty(value = "教学班组成")
     private String jxbzc;
 
-    @TableField(exist = false)
+    @ApiModelProperty(value = "考试日期")
     private String examDate;
-    @TableField(exist = false)
+    @ApiModelProperty(value = "考试时间")
     private String examTime;
 
     public Long getId() {

+ 10 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicExamStudent.java

@@ -102,6 +102,8 @@ public class BasicExamStudent extends BaseEntity {
 
     @ApiModelProperty("扩展字段")
     private String extendFields;
+    @ApiModelProperty("是否启用")
+    private Boolean enable;
 
     @ApiModelProperty("状态")
     private BasicExamStudentStatusEnum status;
@@ -281,6 +283,14 @@ public class BasicExamStudent extends BaseEntity {
         this.extendFields = extendFields;
     }
 
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
     public BasicExamStudentStatusEnum getStatus() {
         return status;
     }

+ 2 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/AttachmentCommonService.java

@@ -27,6 +27,7 @@ public interface AttachmentCommonService {
      * @param filePath 文件根目录(存储zip文件路径)
      * @param zipName  zip文件名
      * @param files    需要下载的文件集合
+     * @param password
      */
-    public void zipFiles(HttpServletResponse response, String filePath, String zipName, List<File> files);
+    public void zipFiles(HttpServletResponse response, String filePath, String zipName, List<File> files, String password);
 }

+ 3 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/AttachmentCommonServiceImpl.java

@@ -92,7 +92,7 @@ public class AttachmentCommonServiceImpl implements AttachmentCommonService {
     }
 
     @Override
-    public void zipFiles(HttpServletResponse response, String filePath, String zipName, List<File> files) {
+    public void zipFiles(HttpServletResponse response, String filePath, String zipName, List<File> files, String password) {
         File fileTemp = SystemConstant.getFileTempDirVar(String.valueOf(System.currentTimeMillis()) + File.separator + SystemConstant.getNanoId(), SystemConstant.TEMP_PREFIX);
         filePath = StringUtils.isNotBlank(filePath) ? filePath : fileTemp.getPath();
         File rootFile = new File(filePath);
@@ -104,7 +104,8 @@ public class AttachmentCommonServiceImpl implements AttachmentCommonService {
         try {
             zipName = StringUtils.isNotBlank(zipName) ? zipName : SystemConstant.getNanoId() + SystemConstant.ZIP_PREFIX;
             zipFile = FileUtil.file(filePath, zipName);
-            Zip4jUtil.zipEncryptFile(zipFile.getPath(), files, SystemConstant.ZIP_ENCRYPT_PWD);
+            password = StringUtils.isNotBlank(password) ? password : SystemConstant.ZIP_ENCRYPT_PWD;
+            Zip4jUtil.zipEncryptFile(zipFile.getPath(), files, password);
             outputFile(response, zipFile, zipName);
         } catch (Exception e) {
             throw ExceptionResultEnum.ERROR.exception("下载失败");

+ 31 - 0
teachcloud-data/src/main/java/com/qmth/teachcloud/data/dto/SyncDataResult.java

@@ -0,0 +1,31 @@
+package com.qmth.teachcloud.data.dto;
+
+public class SyncDataResult {
+
+    private int count;
+    private String errMsg;
+
+    public SyncDataResult() {
+    }
+
+    public SyncDataResult(int count, String errMsg) {
+        this.count = count;
+        this.errMsg = errMsg;
+    }
+
+    public int getCount() {
+        return count;
+    }
+
+    public void setCount(int count) {
+        this.count = count;
+    }
+
+    public String getErrMsg() {
+        return errMsg;
+    }
+
+    public void setErrMsg(String errMsg) {
+        this.errMsg = errMsg;
+    }
+}

+ 11 - 1
teachcloud-data/src/main/java/com/qmth/teachcloud/data/entity/TSyncDataLog.java

@@ -49,8 +49,10 @@ public class TSyncDataLog implements Serializable {
     @ApiModelProperty(value = "结束同步时间")
     private Long endTime;
 
-    @ApiModelProperty(value = "同步数量")
+    @ApiModelProperty(value = "同步数量")
     private Integer count;
+    @ApiModelProperty(value = "同步成功数量")
+    private Integer successCount;
 
     @ApiModelProperty(value = "失败原因")
     private String errorMsg;
@@ -106,6 +108,14 @@ public class TSyncDataLog implements Serializable {
         this.count = count;
     }
 
+    public Integer getSuccessCount() {
+        return successCount;
+    }
+
+    public void setSuccessCount(Integer successCount) {
+        this.successCount = successCount;
+    }
+
     public String getErrorMsg() {
         return errorMsg;
     }

+ 1 - 1
teachcloud-data/src/main/java/com/qmth/teachcloud/data/service/TSyncDataLogService.java

@@ -13,5 +13,5 @@ import com.qmth.teachcloud.data.entity.TSyncDataLog;
  */
 public interface TSyncDataLogService extends IMppService<TSyncDataLog> {
 
-    void saveLog(Long schoolId, Long examId, String dataType, long startTime, long endTime, int count, String errorMsg);
+    void saveLog(Long schoolId, Long examId, String dataType, long startTime, long endTime, int count, int successCount, String errorMsg);
 }

+ 73 - 73
teachcloud-data/src/main/java/com/qmth/teachcloud/data/service/impl/DataServiceImpl.java

@@ -20,6 +20,7 @@ import com.qmth.teachcloud.common.service.SysOrgService;
 import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.util.ConvertUtil;
 import com.qmth.teachcloud.data.DataUtil;
+import com.qmth.teachcloud.data.dto.SyncDataResult;
 import com.qmth.teachcloud.data.entity.TSyncData;
 import com.qmth.teachcloud.common.bean.sync.TSyncDataStudent;
 import com.qmth.teachcloud.data.enums.DataType;
@@ -36,6 +37,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.StringJoiner;
+import java.util.concurrent.atomic.AtomicInteger;
 
 @Service
 public class DataServiceImpl implements DataService {
@@ -91,33 +93,33 @@ public class DataServiceImpl implements DataService {
         StringJoiner stringJoiner = new StringJoiner(";");
         // 机构同步
         if (dataRange.contains(DataType.A.name())) {
-            int count = syncOrg(jdbcTemplate, schoolId, examId, datasourceType.getConfigValue().toString());
-            stringJoiner.add(DataType.A.name() + ":" + count);
-            sendSms = count == 0 ? true : sendSms;
+            SyncDataResult syncDataResult = syncOrg(jdbcTemplate, schoolId, examId, datasourceType.getConfigValue().toString());
+            stringJoiner.add(DataType.A.name() + ":" + syncDataResult.getCount());
+            sendSms = StringUtils.isNotBlank(syncDataResult.getErrMsg()) ? true : sendSms;
         }
         // 用户同步
         if (dataRange.contains(DataType.B.name())) {
-            int count = syncUser(jdbcTemplate, schoolId, examId, datasourceType.getConfigValue().toString());
-            stringJoiner.add(DataType.B.name() + ":" + count);
-            sendSms = count == 0 ? true : sendSms;
+            SyncDataResult syncDataResult = syncUser(jdbcTemplate, schoolId, examId, datasourceType.getConfigValue().toString());
+            stringJoiner.add(DataType.B.name() + ":" + syncDataResult.getCount());
+            sendSms = StringUtils.isNotBlank(syncDataResult.getErrMsg()) ? true : sendSms;
         }
         // 课程同步
         if (dataRange.contains(DataType.C.name())) {
-            int count = syncCourse(jdbcTemplate, schoolId, examId, datasourceType.getConfigValue().toString());
-            stringJoiner.add(DataType.C.name() + ":" + count);
-            sendSms = count == 0 ? true : sendSms;
+            SyncDataResult syncDataResult = syncCourse(jdbcTemplate, schoolId, examId, datasourceType.getConfigValue().toString());
+            stringJoiner.add(DataType.C.name() + ":" + syncDataResult.getCount());
+            sendSms = StringUtils.isNotBlank(syncDataResult.getErrMsg()) ? true : sendSms;
         }
         // 考生同步
         if (dataRange.contains(DataType.D.name())) {
-            int count = syncStudent(jdbcTemplate, schoolId, examId, datasourceType.getConfigValue().toString());
-            stringJoiner.add(DataType.D.name() + ":" + count);
-            sendSms = count == 0 ? true : sendSms;
+            SyncDataResult syncDataResult = syncStudent(jdbcTemplate, schoolId, examId, datasourceType.getConfigValue().toString());
+            stringJoiner.add(DataType.D.name() + ":" + syncDataResult.getCount());
+            sendSms = StringUtils.isNotBlank(syncDataResult.getErrMsg()) ? true : sendSms;
         }
         // 命题任务同步
         if (dataRange.contains(DataType.E.name())) {
-            int count = syncExamTask(jdbcTemplate, schoolId, examId, datasourceType.getConfigValue().toString());
-            stringJoiner.add(DataType.E.name() + ":" + count);
-            sendSms = count == 0 ? true : sendSms;
+            SyncDataResult syncDataResult = syncExamTask(jdbcTemplate, schoolId, examId, datasourceType.getConfigValue().toString());
+            stringJoiner.add(DataType.E.name() + ":" + syncDataResult.getCount());
+            sendSms = StringUtils.isNotBlank(syncDataResult.getErrMsg()) ? true : sendSms;
         }
 
         syncData.setDetail(stringJoiner.toString());
@@ -128,73 +130,71 @@ public class DataServiceImpl implements DataService {
             Map<String, String> variableParams = new HashMap<>();
             variableParams.put("schoolName", basicSchool.getName());
             for (String phoneNumber : syncData.getPhoneNumber().split(",")) {
-                basicMessageService.saveMessageSendLog(schoolId, null, null, phoneNumber, JSON.toJSONString(variableParams), MessageEnum.NOTICE_SYNC_DATA);
+//                basicMessageService.saveMessageSendLog(schoolId, null, null, phoneNumber, JSON.toJSONString(variableParams), MessageEnum.NOTICE_SYNC_DATA);
             }
         }
     }
 
-    private int syncOrg(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType) {
+    private SyncDataResult syncOrg(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType) {
         long startTime = System.currentTimeMillis();
         List<OrgDataVo> dataVoList = dataUtil.listOrg(jdbcTemplate, DataType.A, datasourceType);
-        int count = dataVoList.size();
-        String errorMsg = null;
-        try {
-            for (OrgDataVo orgDataVo : dataVoList) {
+        StringJoiner errorMsg = new StringJoiner("<br>");
+        AtomicInteger i = new AtomicInteger(0);
+        for (OrgDataVo orgDataVo : dataVoList) {
+            try {
                 sysOrgService.saveOrgFromSync(schoolId, orgDataVo);
+                i.getAndIncrement();
+            } catch (Exception e) {
+                errorMsg.add(e.getMessage());
             }
-        } catch (Exception e) {
-            count = 0;
-            errorMsg = e.getMessage();
-        } finally {
-            long endTime = System.currentTimeMillis();
-            tSyncDataLogService.saveLog(schoolId, examId, DataType.A.name(), startTime, endTime, count, errorMsg);
         }
-        return count;
+        long endTime = System.currentTimeMillis();
+        tSyncDataLogService.saveLog(schoolId, examId, DataType.A.name(), startTime, endTime, dataVoList.size(), i.get(), errorMsg.toString());
+        return new SyncDataResult(i.get(), errorMsg.toString());
     }
 
-    private int syncUser(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType) {
+    private SyncDataResult syncUser(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType) {
         long startTime = System.currentTimeMillis();
         List<UserDataVo> dataVoList = dataUtil.listUser(jdbcTemplate, DataType.B, datasourceType);
-        int count = dataVoList.size();
-        String errorMsg = null;
-        try {
-            for (UserDataVo userDataVo : dataVoList) {
+        StringJoiner errorMsg = new StringJoiner("<br>");
+        AtomicInteger i = new AtomicInteger(0);
+        for (UserDataVo userDataVo : dataVoList) {
+            try {
                 sysUserService.saveUserFromSync(schoolId, userDataVo);
+                i.getAndIncrement();
+            } catch (Exception e) {
+                errorMsg.add(e.getMessage());
             }
-        } catch (Exception e) {
-            count = 0;
-            errorMsg = e.getMessage();
-        } finally {
-            long endTime = System.currentTimeMillis();
-            tSyncDataLogService.saveLog(schoolId, examId, DataType.B.name(), startTime, endTime, count, errorMsg);
         }
-        return count;
+        long endTime = System.currentTimeMillis();
+        tSyncDataLogService.saveLog(schoolId, examId, DataType.B.name(), startTime, endTime, dataVoList.size(), i.get(), errorMsg.toString());
+        return new SyncDataResult(i.get(), errorMsg.toString());
     }
 
-    private int syncCourse(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType) {
+    private SyncDataResult syncCourse(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType) {
         long startTime = System.currentTimeMillis();
         List<CourseDataVo> dataVoList = dataUtil.listCourse(jdbcTemplate, DataType.C, datasourceType);
-        int count = dataVoList.size();
-        String errorMsg = null;
-        try {
-            for (CourseDataVo courseDataVo : dataVoList) {
+        StringJoiner errorMsg = new StringJoiner("<br>");
+        AtomicInteger i = new AtomicInteger(0);
+        for (CourseDataVo courseDataVo : dataVoList) {
+            try {
                 basicCourseService.saveBasicCourseFormSync(schoolId, courseDataVo);
+                i.getAndIncrement();
+            } catch (Exception e) {
+                errorMsg.add(e.getMessage());
             }
-        } catch (Exception e) {
-            count = 0;
-            errorMsg = e.getMessage();
-        } finally {
-            long endTime = System.currentTimeMillis();
-            tSyncDataLogService.saveLog(schoolId, examId, DataType.C.name(), startTime, endTime, count, errorMsg);
         }
-        return count;
+        long endTime = System.currentTimeMillis();
+        tSyncDataLogService.saveLog(schoolId, examId, DataType.C.name(), startTime, endTime, dataVoList.size(), i.get(), errorMsg.toString());
+        return new SyncDataResult(i.get(), errorMsg.toString());
     }
 
-    private int syncStudent(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType) {
+    private SyncDataResult syncStudent(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType) {
         long startTime = System.currentTimeMillis();
         List<TSyncDataStudent> dataVoList = dataUtil.listExamStudent(jdbcTemplate, DataType.D, datasourceType);
-        int count = dataVoList.size();
-        String errorMsg = null;
+        Map<String, Object> map = new HashMap<>();
+        int successCount = 0;
+        String errMsg = null;
         try {
             for (TSyncDataStudent tSyncDataStudent : dataVoList) {
                 tSyncDataStudent.setId(SystemConstant.getDbUuid());
@@ -212,34 +212,34 @@ public class DataServiceImpl implements DataService {
                 }
             }
             tSyncDataStudentService.remove(new UpdateWrapper<TSyncDataStudent>().lambda().eq(TSyncDataStudent::getSchoolId, schoolId).eq(TSyncDataStudent::getExamId, examId));
-            tSyncDataStudentService.saveBatch(dataVoList, 2000);
-            basicExamStudentService.saveBasicExamStudentFormSync(schoolId, examId, dataVoList);
+            tSyncDataStudentService.saveBatch(dataVoList);
+            map = basicExamStudentService.saveBasicExamStudentFormSync(schoolId, examId, dataVoList);
         } catch (Exception e) {
-            count = 0;
-            errorMsg = e.getMessage();
+            errMsg = e.getMessage();
         } finally {
+            successCount = map.containsKey("count") ? Integer.parseInt(map.get("count").toString()) : 0;
+            errMsg = errMsg == null && map.containsKey("errMsg") ? map.get("errMsg").toString() : null;
             long endTime = System.currentTimeMillis();
-            tSyncDataLogService.saveLog(schoolId, examId, DataType.D.name(), startTime, endTime, count, errorMsg);
+            tSyncDataLogService.saveLog(schoolId, examId, DataType.D.name(), startTime, endTime, dataVoList.size(), successCount, errMsg);
         }
-        return count;
+        return new SyncDataResult(successCount, errMsg);
     }
 
-    private int syncExamTask(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType) {
+    private SyncDataResult syncExamTask(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType) {
         long startTime = System.currentTimeMillis();
         List<ExamTaskDataVo> dataVoList = dataUtil.listExamTask(jdbcTemplate, DataType.E, datasourceType);
-        int count = dataVoList.size();
-        String errorMsg = null;
-        try {
-            for (ExamTaskDataVo examTaskDataVo : dataVoList) {
+        StringJoiner errorMsg = new StringJoiner("<br>");
+        AtomicInteger i = new AtomicInteger(0);
+        for (ExamTaskDataVo examTaskDataVo : dataVoList) {
+            try {
                 examTaskService.saveExamTaskFormSync(schoolId, examId, examTaskDataVo);
+                i.getAndIncrement();
+            } catch (Exception e) {
+                errorMsg.add(e.getMessage());
             }
-        } catch (Exception e) {
-            count = 0;
-            errorMsg = e.getMessage();
-        } finally {
-            long endTime = System.currentTimeMillis();
-            tSyncDataLogService.saveLog(schoolId, examId, DataType.E.name(), startTime, endTime, count, errorMsg);
         }
-        return count;
+        long endTime = System.currentTimeMillis();
+        tSyncDataLogService.saveLog(schoolId, examId, DataType.E.name(), startTime, endTime, dataVoList.size(), i.get(), errorMsg.toString());
+        return new SyncDataResult(i.get(), errorMsg.toString());
     }
 }

+ 1 - 1
teachcloud-data/src/main/java/com/qmth/teachcloud/data/service/impl/TSyncDataLogServiceImpl.java

@@ -18,7 +18,7 @@ import org.springframework.stereotype.Service;
 public class TSyncDataLogServiceImpl extends MppServiceImpl<TSyncDataLogMapper, TSyncDataLog> implements TSyncDataLogService {
 
     @Override
-    public void saveLog(Long schoolId, Long examId, String dataType, long startTime, long endTime, int count, String errorMsg) {
+    public void saveLog(Long schoolId, Long examId, String dataType, long startTime, long endTime, int count, int successCount, String errorMsg) {
         TSyncDataLog tSyncDataLog = new TSyncDataLog();
         tSyncDataLog.setId(System.currentTimeMillis());
         tSyncDataLog.setSchoolId(schoolId);