Pārlūkot izejas kodu

Merge branch 'dev_v2.2.0' of http://git.qmth.com.cn/wangliang/distributed-print-service into dev_v2.2.0

xiaof 3 gadi atpakaļ
vecāks
revīzija
6dce050c04
45 mainītis faili ar 1698 papildinājumiem un 173 dzēšanām
  1. 0 12
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/BasicStudentImportDto.java
  2. 5 18
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/BasicStudentParams.java
  3. 11 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/BasicStudentResult.java
  4. 6 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/BasicStudent.java
  5. 1 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamDetail.java
  6. 20 39
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicStudentServiceImpl.java
  7. 9 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java
  8. 9 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskDetailServiceImpl.java
  9. 11 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskPrintServiceImpl.java
  10. 15 14
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  11. 21 11
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceServiceImpl.java
  12. 72 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncBasicClazzImportService.java
  13. 8 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/TaskLogicService.java
  14. 46 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java
  15. 12 7
      distributed-print-business/src/main/resources/mapper/BasicStudentMapper.xml
  16. 7 4
      distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml
  17. 85 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/BasicClazzController.java
  18. 1 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/BasicCourseController.java
  19. 3 3
      distributed-print/src/main/java/com/qmth/distributed/print/api/BasicStudentController.java
  20. 3 2
      distributed-print/src/main/resources/application-36dev.properties
  21. 36 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/BasicClazzImportDto.java
  22. 67 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/BasicClazzParams.java
  23. 5 5
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/BasicCourseParams.java
  24. 127 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/BasicClazzResult.java
  25. 11 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/BasicCourseResult.java
  26. 2 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  27. 95 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicClazz.java
  28. 6 6
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicUserCourse.java
  29. 2 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/TaskTypeEnum.java
  30. 23 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/BasicClazzMapper.java
  31. 52 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/BasicClazzService.java
  32. 2 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/BasicUserCourseService.java
  33. 256 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicClazzServiceImpl.java
  34. 24 20
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicCourseServiceImpl.java
  35. 11 3
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicUserCourseServiceImpl.java
  36. 3 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TBTaskServiceImpl.java
  37. 40 0
      teachcloud-common/src/main/resources/mapper/BasicClazzMapper.xml
  38. 5 1
      teachcloud-common/src/main/resources/mapper/BasicCourseMapper.xml
  39. 12 1
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/TeachcloudTaskApplication.java
  40. 22 0
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/config/RedisMessageListener.java
  41. 39 9
      teachcloud-task/src/main/resources/application-task.properties
  42. 132 0
      teachcloud-task/src/main/resources/application-task_36dev.properties
  43. 131 0
      teachcloud-task/src/main/resources/application-task_release.properties
  44. 131 0
      teachcloud-task/src/main/resources/application-task_test.properties
  45. 119 0
      teachcloud-task/src/main/resources/processes/GdykdxPaperApprove.bpmn

+ 0 - 12
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/BasicStudentImportDto.java

@@ -21,10 +21,6 @@ public class BasicStudentImportDto {
     @ExcelNote(value = "手机号")
     private String phoneNumber;
 
-    @ExcelNote(value = "校区")
-    @NotNull
-    private String campusName;
-
     @ExcelNote(value = "班级")
     @NotNull
     private String clazz;
@@ -53,14 +49,6 @@ public class BasicStudentImportDto {
         this.phoneNumber = phoneNumber;
     }
 
-    public String getCampusName() {
-        return campusName;
-    }
-
-    public void setCampusName(String campusName) {
-        this.campusName = campusName;
-    }
-
     public String getClazz() {
         return clazz;
     }

+ 5 - 18
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/BasicStudentParams.java

@@ -35,15 +35,10 @@ public class BasicStudentParams {
     private String phoneNumber;
 
     @JsonSerialize(using = ToStringSerializer.class)
-    @ApiModelProperty(value = "校区主键")
-    @NotNull(message = "请选择校区")
-    @Range(min = 1L, message = "请选择校区")
-    private Long campusId;
-
     @ApiModelProperty(value = "班级信息")
     @NotNull(message = "请输入班级信息")
     @Length(min = 1,message = "请输入班级信息")
-    private String clazz;
+    private Long clazzId;
 
     public Long getId() {
         return id;
@@ -77,19 +72,11 @@ public class BasicStudentParams {
         this.phoneNumber = phoneNumber;
     }
 
-    public Long getCampusId() {
-        return campusId;
-    }
-
-    public void setCampusId(Long campusId) {
-        this.campusId = campusId;
-    }
-
-    public String getClazz() {
-        return clazz;
+    public Long getClazzId() {
+        return clazzId;
     }
 
-    public void setClazz(String clazz) {
-        this.clazz = clazz;
+    public void setClazzId(Long clazzId) {
+        this.clazzId = clazzId;
     }
 }

+ 11 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/BasicStudentResult.java

@@ -34,6 +34,9 @@ public class BasicStudentResult {
     @ApiModelProperty(value = "班级信息")
     private String clazz;
 
+    @ApiModelProperty(value = "班级id")
+    private String clazzId;
+
     @ApiModelProperty(value = "是否被逻辑删除?")
     private Boolean enable;
 
@@ -123,4 +126,12 @@ public class BasicStudentResult {
     public void setCreateId(Long createId) {
         this.createId = createId;
     }
+
+    public String getClazzId() {
+        return clazzId;
+    }
+
+    public void setClazzId(String clazzId) {
+        this.clazzId = clazzId;
+    }
 }

+ 6 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/BasicStudent.java

@@ -40,8 +40,8 @@ public class BasicStudent extends BaseEntity implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long campusId;
 
-    @ApiModelProperty(value = "班级")
-    private String clazz;
+    @ApiModelProperty(value = "班级id")
+    private Long clazzId;
 
     @ApiModelProperty(value = "可用状态(1:可用,0:不可用)")
     private Boolean enable;
@@ -95,12 +95,12 @@ public class BasicStudent extends BaseEntity implements Serializable {
         this.campusId = campusId;
     }
 
-    public String getClazz() {
-        return clazz;
+    public Long getClazzId() {
+        return clazzId;
     }
 
-    public void setClazz(String clazz) {
-        this.clazz = clazz;
+    public void setClazzId(Long clazzId) {
+        this.clazzId = clazzId;
     }
 
     public Boolean getEnable() {

+ 1 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamDetail.java

@@ -111,6 +111,7 @@ public class ExamDetail extends BaseEntity implements Serializable {
 
     @ApiModelProperty(value = "印刷室ID")
     @TableField("print_house_id")
+    @JsonSerialize(using = ToStringSerializer.class)
     private Long printHouseId;
 
     public Long getSchoolId() {

+ 20 - 39
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicStudentServiceImpl.java

@@ -9,12 +9,13 @@ import com.qmth.distributed.print.business.bean.dto.TaskPrintClassDto;
 import com.qmth.distributed.print.business.bean.dto.excel.BasicStudentImportDto;
 import com.qmth.distributed.print.business.bean.params.BasicStudentParams;
 import com.qmth.distributed.print.business.bean.result.BasicStudentResult;
+import com.qmth.teachcloud.common.entity.BasicClazz;
 import com.qmth.distributed.print.business.entity.BasicStudent;
 import com.qmth.distributed.print.business.mapper.BasicStudentMapper;
+import com.qmth.teachcloud.common.service.BasicClazzService;
 import com.qmth.distributed.print.business.service.BasicStudentService;
 import com.qmth.teachcloud.common.bean.dto.excel.DescribeImportDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.entity.BasicCampus;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.service.BasicCampusService;
@@ -45,6 +46,8 @@ public class BasicStudentServiceImpl extends ServiceImpl<BasicStudentMapper, Bas
     private TeachcloudCommonService teachcloudCommonService;
     @Resource
     private BasicCampusService basicCampusService;
+    @Resource
+    private BasicClazzService basicClazzService;
 
     @Override
     public IPage<BasicStudentResult> basicStudentPage(String queryParams, int pageNumber, int pageSize) {
@@ -58,7 +61,7 @@ public class BasicStudentServiceImpl extends ServiceImpl<BasicStudentMapper, Bas
     public IPage<BasicStudent> listPage(Page<BasicStudent> page, String classId) {
         List<String> classIds = Arrays.asList(classId.split(","));
         QueryWrapper<BasicStudent> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().in(BasicStudent::getClazz, classIds).orderByAsc(BasicStudent::getClazz, BasicStudent::getStudentCode);
+        queryWrapper.lambda().in(BasicStudent::getClazzId, classIds).orderByAsc(BasicStudent::getClazzId, BasicStudent::getStudentCode);
         return this.baseMapper.selectPage(page, queryWrapper);
     }
 
@@ -87,7 +90,6 @@ public class BasicStudentServiceImpl extends ServiceImpl<BasicStudentMapper, Bas
         UpdateWrapper<BasicStudent> updateWrapper = new UpdateWrapper<>();
         updateWrapper.lambda()
                 .set(BasicStudent::getEnable, false)
-                .set(BasicStudent::getOrgId, sysUser.getOrgId())
                 .set(BasicStudent::getUpdateId, sysUser.getId())
                 .in(BasicStudent::getId, idList);
         return this.update(updateWrapper);
@@ -115,30 +117,6 @@ public class BasicStudentServiceImpl extends ServiceImpl<BasicStudentMapper, Bas
             }).collect(Collectors.toList());
             map.put("dataCount", datasource.size());
 
-
-            // 新校区名称集合
-            Set<String> newCampusNameSet = datasource.stream().map(BasicStudentImportDto::getCampusName).collect(Collectors.toSet());
-            // 旧校区集合
-            List<BasicCampus> basicCampusList = basicCampusService.list(new QueryWrapper<BasicCampus>().lambda().eq(BasicCampus::getEnable, true).eq(BasicCampus::getSchoolId, schoolId));
-            Set<String> oldCampusNameSet = basicCampusList.stream().map(BasicCampus::getCampusName).collect(Collectors.toSet());
-
-            // 需要新增的校区集合
-            Set<String> addCampusNameSet = newCampusNameSet.stream().filter(e -> !oldCampusNameSet.contains(e)).collect(Collectors.toSet());
-            List<BasicCampus> addBasicCampusList = new ArrayList<>();
-            for (String campusName : addCampusNameSet) {
-                BasicCampus basicCampus = new BasicCampus();
-                Long id = SystemConstant.getDbUuid();
-                basicCampus.setSchoolId(schoolId);
-                basicCampus.setCampusName(campusName);
-                basicCampus.setId(id);
-                basicCampus.setCampusCode(String.valueOf(id));
-                basicCampus.setEnable(true);
-                basicCampus.setCreateId(sysUser.getId());
-                addBasicCampusList.add(basicCampus);
-            }
-            // 批量新增校区
-            basicCampusService.saveBatch(addBasicCampusList);
-
             for (int y = 0; y < Objects.requireNonNull(basicStudentImportDtoList).size(); y++) {
                 BasicStudentImportDto basicStudentImportDto = (BasicStudentImportDto) basicStudentImportDtoList.get(y);
 
@@ -146,20 +124,21 @@ public class BasicStudentServiceImpl extends ServiceImpl<BasicStudentMapper, Bas
                 String studentName = basicStudentImportDto.getStudentName();
                 String studentCode = basicStudentImportDto.getStudentCode();
                 String phoneNumber = basicStudentImportDto.getPhoneNumber();
-                String campusName = basicStudentImportDto.getCampusName();
                 String clazz = basicStudentImportDto.getClazz();
+                BasicClazz basicClazz = basicClazzService.getOne(new QueryWrapper<BasicClazz>().lambda()
+                        .eq(BasicClazz::getEnable,true)
+                        .eq(BasicClazz::getClazzName,clazz)
+                        .eq(BasicClazz::getSchoolId,schoolId));
+                if (Objects.isNull(basicClazz)){
+                    throw ExceptionResultEnum.ERROR.exception("【班级】" + clazz + "还没有构建");
+                }
 
 
                 BasicStudentParams basicStudentParams = new BasicStudentParams();
-                basicStudentParams.setCampusId(basicCampusService.getOne(new QueryWrapper<BasicCampus>().lambda()
-                        .eq(BasicCampus::getSchoolId, schoolId)
-                        .eq(BasicCampus::getCampusName, campusName)
-                        .eq(BasicCampus::getEnable, true))
-                        .getId());
                 basicStudentParams.setStudentName(studentName);
                 basicStudentParams.setStudentCode(studentCode);
                 basicStudentParams.setPhoneNumber(phoneNumber);
-                basicStudentParams.setClazz(clazz);
+                basicStudentParams.setClazzId(basicClazz.getId());
 
                 BasicStudent tmp = this.getOne(new QueryWrapper<BasicStudent>().lambda()
                         .eq(BasicStudent::getSchoolId, sysUser.getSchoolId())
@@ -193,11 +172,13 @@ public class BasicStudentServiceImpl extends ServiceImpl<BasicStudentMapper, Bas
             String studentName = basicStudentParams.getStudentName();
             String studentCode = basicStudentParams.getStudentCode();
             String phoneNumber = basicStudentParams.getPhoneNumber();
-            Long campusId = basicStudentParams.getCampusId();
-            if (Objects.isNull(basicCampusService.getById(campusId))) {
-                throw ExceptionResultEnum.ERROR.exception("所选校区不存在");
+            Long clazzId = basicStudentParams.getClazzId();
+            BasicClazz basicClazz = basicClazzService.getById(clazzId);
+            if (Objects.isNull(basicClazz)) {
+                throw ExceptionResultEnum.ERROR.exception("所选班级不存在");
             }
-            String clazz = basicStudentParams.getClazz();
+
+            Long campusId = basicClazz.getCampusId();
             Long id = basicStudentParams.getId();
 
             // 检验学号在学校的唯一性
@@ -231,7 +212,7 @@ public class BasicStudentServiceImpl extends ServiceImpl<BasicStudentMapper, Bas
             basicStudent.setStudentName(studentName);
             basicStudent.setPhoneNumber(phoneNumber);
             basicStudent.setCampusId(campusId);
-            basicStudent.setClazz(clazz);
+            basicStudent.setClazzId(clazzId);
             basicStudent.setSchoolId(schoolId);
 
             // 保存

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

@@ -19,15 +19,18 @@ import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.distributed.print.business.mapper.ExamDetailMapper;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.templete.execute.AsyncCreatePdfTempleteService;
+import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicAttachment;
 import com.qmth.teachcloud.common.entity.BasicCampus;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.entity.TBTask;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.MqTagEnum;
 import com.qmth.teachcloud.common.enums.TaskTypeEnum;
 import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.util.ConvertUtil;
+import com.qmth.teachcloud.common.util.RedisUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.HorizontalAlignment;
@@ -93,6 +96,9 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
     @Autowired
     BasicCampusService basicCampusService;
 
+    @Resource
+    RedisUtil redisUtil;
+
     private final static Logger log = LoggerFactory.getLogger(ExamDetailServiceImpl.class);
 
     @Transactional(rollbackFor = Exception.class)
@@ -410,7 +416,9 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
 
         // 调用生成pdf方法
         Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.CREATE_PDF, detail.getPrintPlanId(), (SysUser) ServletUtil.getRequestUser(), detail.getId());
-        asyncCreatePdfTempleteService.createPdf(map, null);
+//        asyncCreatePdfTempleteService.createPdf(map, null);
+        MqDto mqDto = new MqDto(MqTagEnum.PDF.getCode(), map, String.valueOf(map.get(SystemConstant.TB_TASK_ID)));
+        redisUtil.sendMessage(mqDto.getTopic(), mqDto);
         return true;
     }
 

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

@@ -14,12 +14,15 @@ import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.distributed.print.business.mapper.ExamTaskDetailMapper;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.templete.execute.AsyncCreatePdfTempleteService;
+import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.MqTagEnum;
 import com.qmth.teachcloud.common.enums.TaskTypeEnum;
 import com.qmth.teachcloud.common.service.TBTaskService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
+import com.qmth.teachcloud.common.util.RedisUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -78,6 +81,9 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
     @Resource
     TeachcloudCommonService teachcloudCommonService;
 
+    @Resource
+    RedisUtil redisUtil;
+
     @Transactional
     @Override
     public boolean enable(ExamTaskDetail examTaskDetail) {
@@ -219,7 +225,9 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
                 Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.CREATE_PDF, paperParam.getPrintPlanId(), sysUser, listEntry.getKey());
                 map.computeIfAbsent("examDetailCourseIds", v -> listEntry.getValue());
                 map.computeIfAbsent("paperType", v -> paperParam.getRelatePaperType());
-                asyncCreatePdfTempleteService.createPdf(map, null);
+//                asyncCreatePdfTempleteService.createPdf(map, null);
+                MqDto mqDto = new MqDto(MqTagEnum.PDF.getCode(), map, String.valueOf(map.get(SystemConstant.TB_TASK_ID)));
+                redisUtil.sendMessage(mqDto.getTopic(), mqDto);
             }
         }
         return true;

+ 11 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskPrintServiceImpl.java

@@ -17,16 +17,19 @@ import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.distributed.print.business.mapper.ExamTaskPrintMapper;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.templete.execute.AsyncCreatePdfTempleteService;
+import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicUserCourse;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.entity.TBTask;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.MqTagEnum;
 import com.qmth.teachcloud.common.enums.OrgTypeEnum;
 import com.qmth.teachcloud.common.enums.TaskTypeEnum;
 import com.qmth.teachcloud.common.service.BasicUserCourseService;
 import com.qmth.teachcloud.common.service.TBTaskService;
 import com.qmth.teachcloud.common.util.ConvertUtil;
+import com.qmth.teachcloud.common.util.RedisUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -76,6 +79,9 @@ public class ExamTaskPrintServiceImpl extends ServiceImpl<ExamTaskPrintMapper, E
     @Resource
     ConvertUtil convertUtil;
 
+    @Resource
+    RedisUtil redisUtil;
+
     @Override
     public IPage<BasicStudent> listStudentByClass(String classId, Integer pageNumber, Integer pageSize) {
         Page<BasicStudent> page = new Page<>(pageNumber, pageSize);
@@ -271,7 +277,7 @@ public class ExamTaskPrintServiceImpl extends ServiceImpl<ExamTaskPrintMapper, E
     public List<TaskPrintClassDto> listClass(String printPlanId, String courseCode, String campusId, String paperNumber, Long examTaskPrintId) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         List<BasicUserCourse> courseList = basicUserCourseService.listBySchoolIdAndCourseCode(schoolId, courseCode);
-        Set<String> stringList = courseList.stream().map(m -> m.getClazz()).collect(Collectors.toSet());
+        Set<String> stringList = courseList.stream().map(m -> String.valueOf(m.getClazzId())).collect(Collectors.toSet());
 
         if (!CollectionUtils.isEmpty(stringList)) {
             QueryWrapper<ExamTaskPrint> examTaskPrintQueryWrapper = new QueryWrapper<>();
@@ -344,13 +350,15 @@ public class ExamTaskPrintServiceImpl extends ServiceImpl<ExamTaskPrintMapper, E
         // 调用生成pdf方法
         for (Long examDetailId : list) {
             Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.CREATE_PDF, examTaskPrintParams.getPrintPlanId(), (SysUser) ServletUtil.getRequestUser(), examDetailId);
-            asyncCreatePdfTempleteService.createPdf(map, null);
+//            asyncCreatePdfTempleteService.createPdf(map, null);
+            MqDto mqDto = new MqDto(MqTagEnum.PDF.getCode(), map, String.valueOf(map.get(SystemConstant.TB_TASK_ID)));
+            redisUtil.sendMessage(mqDto.getTopic(), mqDto);
         }
     }
 
     private void saveBatchStudent(ExamTaskPrint examTaskPrint, List<String> classIds, Long examDetailCourseId, SysUser sysUser) {
         QueryWrapper<BasicStudent> queryWrapper1 = new QueryWrapper<>();
-        queryWrapper1.lambda().eq(BasicStudent::getSchoolId, examTaskPrint.getSchoolId()).in(BasicStudent::getClazz, classIds);
+        queryWrapper1.lambda().eq(BasicStudent::getSchoolId, examTaskPrint.getSchoolId()).in(BasicStudent::getClazzId, classIds);
         List<BasicStudent> basicStudents = basicStudentService.list(queryWrapper1);
         AtomicInteger atomicInteger = new AtomicInteger(1);
         List<ExamStudent> examStudents = new ArrayList<>();

+ 15 - 14
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -19,14 +19,13 @@ import com.qmth.distributed.print.business.templete.execute.AsyncCreatePdfTemple
 import com.qmth.distributed.print.business.templete.execute.AsyncPaperReviewPdfExportService;
 import com.qmth.teachcloud.common.bean.dto.BlurryUserDto;
 import com.qmth.teachcloud.common.bean.dto.CourseInfoDto;
+import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.*;
-import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.enums.FlowStatusEnum;
-import com.qmth.teachcloud.common.enums.RoleTypeEnum;
-import com.qmth.teachcloud.common.enums.TaskTypeEnum;
+import com.qmth.teachcloud.common.enums.*;
 import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.util.ExcelUtil;
+import com.qmth.teachcloud.common.util.RedisUtil;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.common.util.excel.ExcelError;
@@ -135,15 +134,15 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     @Resource
     TFFlowApproveService tfFlowApproveService;
 
-    @Resource
-    TFFlowService tfFlowService;
-
     @Resource
     TaskService taskService;
 
     @Resource
     BasicCardRuleService basicCardRuleService;
 
+    @Resource
+    RedisUtil redisUtil;
+
     @Override
     public List<ExamTask> listByCourseCode(Long schoolId, String code) {
         QueryWrapper<ExamTask> queryWrapper = new QueryWrapper<>();
@@ -170,8 +169,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             // 查询命题任务中的试卷编号
             QueryWrapper<ExamTask> queryWrapperExamTask = new QueryWrapper<>();
             queryWrapperExamTask.lambda().eq(ExamTask::getSchoolId, schoolId);
-            if (orgIds.size() > 0){
-                queryWrapperExamTask.lambda().in(ExamTask::getOrgId,orgIds);
+            if (orgIds.size() > 0) {
+                queryWrapperExamTask.lambda().in(ExamTask::getOrgId, orgIds);
             }
             List<String> list = new ArrayList<>();
             if (StringUtils.isNotBlank(param)) {
@@ -185,8 +184,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             // 查询考务-科目中的试卷编号
             QueryWrapper<ExamDetailCourse> queryWrapperExamDetailCourse = new QueryWrapper<>();
             queryWrapperExamDetailCourse.lambda().eq(ExamDetailCourse::getSchoolId, schoolId);
-            if (orgIds.size() > 0){
-                queryWrapperExamDetailCourse.lambda().in(ExamDetailCourse::getOrgId,orgIds);
+            if (orgIds.size() > 0) {
+                queryWrapperExamDetailCourse.lambda().in(ExamDetailCourse::getOrgId, orgIds);
             }
             List<String> list2 = new ArrayList<>();
             if (StringUtils.isNotBlank(param)) {
@@ -200,7 +199,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             list.addAll(list2);
             return list.stream().distinct().collect(Collectors.toList());
         } else {
-            return examDetailCourseService.listPaperNumberByPrintPlanId(param, printPlanIdList,orgIds);
+            return examDetailCourseService.listPaperNumberByPrintPlanId(param, printPlanIdList, orgIds);
         }
     }
 
@@ -448,7 +447,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                                 if (StringUtils.isBlank(userMap.get(excelTeacherAccount))) {
                                     excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[命题老师账号]不存在"));
                                 } else {
-                                    if(!excelTeacherName.equals(userMap.get(excelTeacherAccount))){
+                                    if (!excelTeacherName.equals(userMap.get(excelTeacherAccount))) {
                                         excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[命题老师姓名]与系统不匹配"));
                                     }
                                 }
@@ -1169,7 +1168,9 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         }
         if (judge) {
             Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.CREATE_PDF, examDetail.getPrintPlanId(), user, examDetail.getId());
-            asyncCreatePdfTempleteService.createPdf(map, null);
+            //            asyncCreatePdfTempleteService.createPdf(map, null);
+            MqDto mqDto = new MqDto(MqTagEnum.PDF.getCode(), map, String.valueOf(map.get(SystemConstant.TB_TASK_ID)));
+            redisUtil.sendMessage(mqDto.getTopic(), mqDto);
         }
     }
 

+ 21 - 11
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceServiceImpl.java

@@ -19,6 +19,7 @@ import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.templete.execute.AsyncCreatePdfTempleteService;
 import com.qmth.distributed.print.business.util.HtmlToPdfUtil;
 import com.qmth.distributed.print.business.util.PdfUtil;
+import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.bean.params.ArraysParams;
 import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SpringContextHolder;
@@ -118,6 +119,8 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
     @Resource
     TeachcloudCommonService teachcloudCommonService;
 
+    @Resource
+    RedisUtil redisUtil;
 
     /**
      * 保存附件
@@ -148,9 +151,9 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
             } else if (Objects.nonNull(type) && Objects.equals(type, SystemConstant.HTML_PREFIX)) {
                 filePath = (String) jsonObject.get(SystemConstant.PATH);
                 url = SystemConstant.TEMP_FILES_DIR + File.separator + filePath;
-                UploadFileEnum uploadType = Enum.valueOf(UploadFileEnum.class,(String) jsonObject.get(SystemConstant.UPLOAD_TYPE));
+                UploadFileEnum uploadType = Enum.valueOf(UploadFileEnum.class, (String) jsonObject.get(SystemConstant.UPLOAD_TYPE));
 //                htmlFile = ossUtil.ossDownload(filePath, url);
-                htmlFile = fileStoreUtil.ossDownload(filePath, url,uploadType.getFssType());
+                htmlFile = fileStoreUtil.ossDownload(filePath, url, uploadType.getFssType());
             }
             LocalDateTime nowTime = LocalDateTime.now();
             StringJoiner pdfStringJoiner = new StringJoiner("");
@@ -180,7 +183,7 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
             if (oss) {//上传至oss
                 pdfDto = PdfUtil.addPdfPage(pdfFile);
 //                ossUtil.ossUpload(pdfDirNameStr, pdfFile, BinaryUtil.toBase64String(HexUtils.decodeHex(pdfFileMd5)));
-                fileStoreUtil.ossUpload(pdfDirNameStr, pdfFile, BinaryUtil.toBase64String(HexUtils.decodeHex(pdfFileMd5)),fileStoreUtil.getUploadEnumByPath(pdfDirNameStr).getFssType());
+                fileStoreUtil.ossUpload(pdfDirNameStr, pdfFile, BinaryUtil.toBase64String(HexUtils.decodeHex(pdfFileMd5)), fileStoreUtil.getUploadEnumByPath(pdfDirNameStr).getFssType());
 //                htmlFile.delete();
             }
             JSONObject attachmentPath = JSONObject.parseObject(examDetail.getAttachmentPath());
@@ -251,12 +254,12 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
             if (oss) {//上传至oss
                 String dirName = stringJoiner.toString().replaceAll("\\\\", "/");
 //                ossUtil.ossUpload(dirName, htmlContent);
-                fileStoreUtil.ossUpload(dirName,htmlContent,fileStoreUtil.getUploadEnumByPath(dirName).getFssType());
+                fileStoreUtil.ossUpload(dirName, htmlContent, fileStoreUtil.getUploadEnumByPath(dirName).getFssType());
                 jsonObject.put(SystemConstant.TYPE, SystemConstant.OSS);
                 jsonObject.put(SystemConstant.PATH, dirName);
                 String url = SystemConstant.TEMP_FILES_DIR + File.separator + dirName;
 //                File localHtmlFile = ossUtil.ossDownload(dirName, url);
-                File localHtmlFile = fileStoreUtil.ossDownload(dirName, url,fileStoreUtil.getUploadEnumByPath(dirName).getFssType());
+                File localHtmlFile = fileStoreUtil.ossDownload(dirName, url, fileStoreUtil.getUploadEnumByPath(dirName).getFssType());
                 StringJoiner pdfStringJoiner = new StringJoiner("");
                 pdfStringJoiner.add(UploadFileEnum.PDF.getTitle()).add(File.separator);
                 pdfStringJoiner.add(String.valueOf(nowTime.getYear())).add(File.separator)
@@ -279,8 +282,8 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
                 localFileList.add(new PdfDto(pdfFile.getPath(), PageSizeEnum.A3, pdfDto.getPageCount()));
                 fileMd5 = DigestUtils.md5Hex(new FileInputStream(pdfFile));
 //                ossUtil.ossUpload(pdfDirName, pdfFile, BinaryUtil.toBase64String(HexUtils.decodeHex(fileMd5)));
-                pdfDirName = pdfDirName.replaceAll("\\\\","/");
-                fileStoreUtil.ossUpload(pdfDirName, pdfFile, BinaryUtil.toBase64String(HexUtils.decodeHex(fileMd5)),fileStoreUtil.getUploadEnumByPath(pdfDirName).getFssType());
+                pdfDirName = pdfDirName.replaceAll("\\\\", "/");
+                fileStoreUtil.ossUpload(pdfDirName, pdfFile, BinaryUtil.toBase64String(HexUtils.decodeHex(fileMd5)), fileStoreUtil.getUploadEnumByPath(pdfDirName).getFssType());
 //                localHtmlFile.delete();
                 jsonObject.put(SystemConstant.PDF_PATH, pdfDirName);
                 // htmlMd5
@@ -391,7 +394,7 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
             stringJoiner.add(File.separator).add(SystemConstant.getUuid()).add(format);
             if (oss) {//上传至oss\
                 String dirName = stringJoiner.toString().replaceAll("\\\\", "/");
-                fileStoreUtil.ossUpload(dirName,file.getInputStream(),md5,type.getFssType());
+                fileStoreUtil.ossUpload(dirName, file.getInputStream(), md5, type.getFssType());
 
                 jsonObject.put(SystemConstant.TYPE, SystemConstant.OSS);
                 jsonObject.put(SystemConstant.PATH, dirName);
@@ -474,6 +477,7 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
         }
         return basicCourseService.removeById(id);
     }
+
     /**
      * 保存科目
      *
@@ -644,7 +648,9 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
                 }
                 map.computeIfAbsent(SystemConstant.TASK, v -> tbTask);
                 map.computeIfAbsent(SystemConstant.USER, v -> sysUserService.getById(tbTask.getCreateId()));
-                asyncCreatePdfTempleteService.createPdf(map, null);
+//                asyncCreatePdfTempleteService.createPdf(map, null);
+                MqDto mqDto = new MqDto(MqTagEnum.PDF.getCode(), map, String.valueOf(tbTask.getId()));
+                redisUtil.sendMessage(mqDto.getTopic(), mqDto);
             }
         }
     }
@@ -674,7 +680,9 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
                     }
                     map.computeIfAbsent(SystemConstant.TASK, v -> tbTask);
                     map.computeIfAbsent(SystemConstant.USER, v -> sysUserService.getById(tbTask.getCreateId()));
-                    asyncCreatePdfTempleteService.createPdf(map, null);
+//                    asyncCreatePdfTempleteService.createPdf(map, null);
+                    MqDto mqDto = new MqDto(MqTagEnum.PDF.getCode(), map, String.valueOf(tbTask.getId()));
+                    redisUtil.sendMessage(mqDto.getTopic(), mqDto);
                 }
             }
         }
@@ -882,7 +890,9 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
                         }
 
                         Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.CREATE_PDF, examDetail.getPrintPlanId(), user, examDetail.getId());
-                        asyncCreatePdfTempleteService.createPdf(map, null);
+//                        asyncCreatePdfTempleteService.createPdf(map, null);
+                        MqDto mqDto = new MqDto(MqTagEnum.PDF.getCode(), map, String.valueOf(map.get(SystemConstant.TB_TASK_ID)));
+                        redisUtil.sendMessage(mqDto.getTopic(), mqDto);
                     }
                 }
             }

+ 72 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncBasicClazzImportService.java

@@ -0,0 +1,72 @@
+package com.qmth.distributed.print.business.templete.execute;
+
+import cn.hutool.core.date.DateUtil;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.distributed.print.business.templete.importData.AsyncImportTaskTemplete;
+import com.qmth.distributed.print.business.templete.service.TaskLogicService;
+import com.qmth.teachcloud.common.contant.SpringContextHolder;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.TBTask;
+import com.qmth.teachcloud.common.enums.TaskResultEnum;
+import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import com.qmth.teachcloud.common.service.TBTaskService;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.Map;
+import java.util.StringJoiner;
+
+/**
+ * @Description: 异步-班级基础信息导入
+ * @Author: CaoZixuan
+ * @Date: 2021-08-28
+ */
+@Service
+public class AsyncBasicClazzImportService extends AsyncImportTaskTemplete {
+
+    private final static Logger log = LoggerFactory.getLogger(AsyncStudentDataImportService.class);
+
+    public static final String OBJ_TITLE = "班级基础数据";
+    @Override
+    public Result importTask(Map<String, Object> map) throws IOException, Exception {
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+        InputStream inputStream = super.getUploadFileInputStream(tbTask);
+        map.put("inputStream",inputStream);
+
+        StringJoiner stringJoinerSummary = new StringJoiner("\n")
+                .add(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), BEGIN_TITLE, OBJ_TITLE));
+        tbTask.setStatus(TaskStatusEnum.RUNNING);
+        TBTaskService tbTaskService = SpringContextHolder.getBean(TBTaskService.class);
+        tbTaskService.updateById(tbTask);
+        try {
+            TaskLogicService taskLogicService = SpringContextHolder.getBean(TaskLogicService.class);
+
+            // 执行导入基础学生数据
+            Map<String, Object> result = taskLogicService.executeImportBasicClazzLogic(map);
+
+
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), FINISH_TITLE, Long.valueOf(String.valueOf(result.get("dataCount"))), FINISH_SIZE));
+            tbTask.setResult(TaskResultEnum.SUCCESS);
+        }catch (Exception e){
+            log.error("请求出错", e);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), EXCEPTION_TITLE, EXCEPTION_DATA, e.getMessage()));
+            tbTask.setResult(TaskResultEnum.ERROR);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {//生成txt文件
+            tbTask.setSummary(stringJoinerSummary.toString());
+            super.createTxt(tbTask);
+        }
+        return ResultUtil.ok(map);
+    }
+}

+ 8 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/TaskLogicService.java

@@ -86,4 +86,12 @@ public interface TaskLogicService {
      * @throws Exception 异常
      */
     Map<String,Object> executeImportSysUserLogic(Map<String,Object> map) throws Exception;
+
+    /**
+     * 处理导入基础班级数据
+     * @param map 数据源
+     * @return 结果
+     * @throws Exception 异常
+     */
+    Map<String,Object> executeImportBasicClazzLogic(Map<String,Object> map) throws Exception;
 }

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

@@ -12,6 +12,7 @@ import com.google.common.collect.Lists;
 import com.itextpdf.text.DocumentException;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.dto.*;
+import com.qmth.teachcloud.common.bean.dto.excel.BasicClazzImportDto;
 import com.qmth.teachcloud.common.bean.dto.excel.BasicCourseImportDto;
 import com.qmth.distributed.print.business.bean.dto.excel.BasicStudentImportDto;
 import com.qmth.distributed.print.business.bean.params.SerialNumberParams;
@@ -154,6 +155,9 @@ public class TaskLogicServiceImpl implements TaskLogicService {
     @Resource
     FileStoreUtil fileStoreUtil;
 
+    @Resource
+    BasicClazzService basicClazzService;
+
 
     /**
      * 创建pdf前置条件
@@ -1117,7 +1121,6 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                     String studentName = basicStudentImportDto.getStudentName();
                     String studentCode = basicStudentImportDto.getStudentCode();
                     String phoneNumber = basicStudentImportDto.getPhoneNumber();
-                    String campusName = basicStudentImportDto.getCampusName();
                     String clazz = basicStudentImportDto.getClazz();
 
                     // 检验excel中
@@ -1267,6 +1270,48 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         return sysUserService.executeSysUserImportLogic(finalList, map);
     }
 
+    @Transactional
+    @Override
+    public Map<String, Object> executeImportBasicClazzLogic(Map<String, Object> map) throws Exception {
+        InputStream inputStream = (InputStream) map.get("inputStream");
+        System.out.println(inputStream);
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(inputStream, Lists.newArrayList(BasicClazzImportDto.class,DescribeImportDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+            List<ExcelError> excelErrorTemp = new ArrayList<>();
+            Map<String, String> checkNameMap = new HashMap<>();
+            for (int i = 0; i < finalExcelList.size(); i++) {
+                LinkedMultiValueMap<Integer, Object> excelMap = finalExcelList.get(i);
+                List<Object> basicClazzImportDtoList = excelMap.get(i);
+                assert basicClazzImportDtoList != null;
+                if (basicClazzImportDtoList.get(0) instanceof DescribeImportDto){
+                    continue;
+                }
+                for (int y = 0; y < Objects.requireNonNull(basicClazzImportDtoList).size(); y++) {
+                    BasicClazzImportDto basicClazzImportDto = (BasicClazzImportDto) basicClazzImportDtoList.get(y);
+                    String clazzName = basicClazzImportDto.getClazzName();
+                    String campusName = basicClazzImportDto.getCampusName();
+
+                    // 检验excel中
+                    // 检验学号
+                    if (checkNameMap.containsKey(clazzName)) {
+                        throw ExceptionResultEnum.ERROR.exception("导入的excel中包含在重复的【班级名称】:" + clazzName);
+                    } else {
+                        checkNameMap.put(clazzName, campusName);
+                    }
+
+                    excelErrorTemp.addAll(ExcelUtil.checkExcelField(basicClazzImportDto, y, i));
+                    if (Objects.isNull(clazzName) || clazzName.length() > 50) {
+                        excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[学号]不符合输入规范"));
+                    }
+                }
+            }
+            if (excelErrorTemp.size() > 0) {
+                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(excelErrorTemp));
+            }
+            return finalExcelList;
+        });
+        return basicClazzService.executeBasicClazzImportLogic(finalList, map);
+    }
+
 
     public String createTempNumber(SerialNumberParams serialNumberParams) {
         return convertUtil.getIncre(serialNumberParams.getPrefix(), serialNumberParams.getModel(), serialNumberParams.getDigit());

+ 12 - 7
distributed-print-business/src/main/resources/mapper/BasicStudentMapper.xml

@@ -4,20 +4,22 @@
 
     <select id="listByClass" resultType="com.qmth.distributed.print.business.bean.dto.TaskPrintClassDto">
         SELECT
-            s.clazz classId,
-            s.clazz className,
+            s.clazz_id classId,
+            clz.clazz_name className,
             COUNT(1) studentCount
         FROM
             basic_student s
+                LEFT JOIN
+            basic_clazz clz ON s.clazz_id = clz.id and clz.enable = true
         WHERE
             s.school_id = #{schoolId}
             <if test="stringList != null and stringList != ''">
-                and s.clazz in
+                and s.clazz_id in
                 <foreach collection="stringList" item="cla" open="(" close=")" separator=",">
                     #{cla}
                 </foreach>
             </if>
-        GROUP BY s.clazz
+        GROUP BY s.clazz_id
     </select>
 
     <select id="findBasicStudentPage"
@@ -27,9 +29,10 @@
             student_name AS studentName,
             student_code AS studentCode,
             phone_number AS phoneNumber,
-            campus_id AS campusId,
+            stu.campus_id AS campusId,
             cam.campus_name AS campusName,
-            clazz,
+            clazz_id AS clazzId,
+            clz.clazz_name AS clazz,
             stu.enable,
             stu.create_id AS createId,
             stu.create_time AS createTime
@@ -38,9 +41,11 @@
                 LEFT JOIN
             basic_campus cam ON stu.campus_id = cam.id
                 AND cam.enable = TRUE
+                LEFT JOIN
+            basic_clazz clz ON stu.clazz_id = clz.id AND clz.enable = true
         <where>
             and stu.enable = true
-            <if test="queryParams != null and queryParams.length > 0">
+            <if test="queryParams != null and queryParams != ''">
                 and student_name like concat('%',#{queryParams},'%') or student_code like concat('%',#{queryParams},'%')
             </if>
             <if test="schoolId != null and schoolId > 0">

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

@@ -781,7 +781,8 @@
                 tffa.status,
                 tffa.status auditStatus,
                 et.enable,
-                det.create_time as createTime,
+                et.create_time as createTime,
+                et.update_time as updateTime,
                 art.EXECUTION_ID_ as executionId,
                 et.flow_id as flowId,
                 art.NAME_ as taskName,
@@ -832,7 +833,8 @@
                 tffa.status,
                 tffa.status auditStatus,
                 et.enable,
-                det.create_time as createTime,
+                et.create_time as createTime,
+                et.update_time as updateTime,
                 art.EXECUTION_ID_ as executionId,
                 et.flow_id as flowId,
                 art.NAME_ as taskName,
@@ -887,7 +889,8 @@
                 et.flowStatus as status,
                 et.flowStatus as auditStatus,
                 et.enable,
-                det.create_time as createTime,
+                et.create_time as createTime,
+                et.update_time as updateTime,
                 et.EXECUTION_ID_ as executionId,
                 et.flow_id as flowId,
                 et.NAME_ as taskName,
@@ -931,7 +934,7 @@
             LEFT JOIN exam_task_detail det ON
                     det.exam_task_id = et.id
             LEFT JOIN
-                sys_org so ON et.teaching_room_id = so.id) t order by t.createTime desc
+                sys_org so ON et.teaching_room_id = so.id) t order by t.updateTime desc
     </select>
 
     <select id="findFlowIdToMySelf" resultType="java.lang.Long">

+ 85 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/BasicClazzController.java

@@ -0,0 +1,85 @@
+package com.qmth.distributed.print.api;
+
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.annotation.BOOL;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.result.EditResult;
+import com.qmth.distributed.print.business.service.PrintCommonService;
+import com.qmth.distributed.print.business.templete.execute.AsyncBasicClazzImportService;
+import com.qmth.teachcloud.common.bean.params.BasicClazzParams;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.entity.TBTask;
+import com.qmth.teachcloud.common.enums.TaskTypeEnum;
+import com.qmth.teachcloud.common.service.BasicClazzService;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import com.qmth.teachcloud.common.util.ServletUtil;
+import io.swagger.annotations.*;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @Description: 基础班级管理前端控制器
+ * @Author: CaoZixuan
+ * @Date: 2021-08-28
+ */
+@Api(tags = "班级管理controller")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.basic}/clazz")
+//@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+public class BasicClazzController {
+    @Resource
+    private BasicClazzService basicClazzService;
+    @Resource
+    private PrintCommonService printCommonService;
+    @Resource
+    private AsyncBasicClazzImportService asyncBasicClazzImportService;
+
+    @ApiOperation(value = "班级基本信息管理-查询")
+    @RequestMapping(value = "/query", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findBasicClazzList(@ApiParam(value = "查询参数(班级号或班级名)") @RequestParam(required = false) String queryParams,
+                                      @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
+                                      @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+        return ResultUtil.ok(basicClazzService.basicClazzPage(queryParams, pageNumber, pageSize));
+    }
+
+    @ApiOperation(value = "班级基本信息管理-新增/编辑")
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = EditResult.class)})
+    public Result saveBasicClazz(@Valid @RequestBody BasicClazzParams basicClazzParams, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        return ResultUtil.ok(basicClazzService.saveBasicClazz(basicClazzParams,sysUser));
+    }
+
+    @ApiOperation(value = "班级基本信息管理-批量删除(逻辑)")
+    @RequestMapping(value = "/delete_batch", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "删除成功", response = EditResult.class)})
+    public Result deleteBasicClazz(@ApiParam(value = "选择的要删除的班级id集合",required = true) @RequestParam List<Long> idList) {
+        return ResultUtil.ok(basicClazzService.removeBasicClazzBatch(idList));
+    }
+
+    @ApiOperation(value = "班级基本信息管理-批量导入(异步)")
+    @RequestMapping(value = "/data_import", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
+    public Result basicClazzImportAsync(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file) throws Exception {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        Map<String, Object> map = printCommonService.saveTask(file, TaskTypeEnum.CLAZZ_IMPORT);
+        map.put(SystemConstant.SYS_USER,sysUser);
+
+        asyncBasicClazzImportService.importTask(map);
+        TBTask tbTask = Objects.nonNull(map.get(SystemConstant.TASK)) ? (TBTask) map.get(SystemConstant.TASK) : null;
+        return Objects.nonNull(tbTask) ? ResultUtil.ok(tbTask.getId()) : ResultUtil.error("创建任务失败");
+    }
+}

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

@@ -150,7 +150,7 @@ public class BasicCourseController {
     @ApiOperation(value = "课程基本信息管理-批量导入(异步)")
     @RequestMapping(value = "/data_import", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
-    public Result basicCourseImportAysnc(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file) throws Exception {
+    public Result basicCourseImportAsync(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file) throws Exception {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         Map<String, Object> map = printCommonService.saveTask(file, TaskTypeEnum.COURSE_IMPORT);
         map.put(SystemConstant.SYS_USER,sysUser);

+ 3 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/BasicStudentController.java

@@ -50,7 +50,7 @@ public class BasicStudentController {
     @ApiOperation(value = "学生基本信息管理-查询")
     @RequestMapping(value = "/query", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
-    public Result findBasicCampusList(@ApiParam(value = "查询参数(学生学号或姓名)") @RequestParam(required = false) String queryParams,
+    public Result findBasicStudentList(@ApiParam(value = "查询参数(学生学号或姓名)") @RequestParam(required = false) String queryParams,
                                       @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
                                       @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
         return ResultUtil.ok(basicStudentService.basicStudentPage(queryParams, pageNumber, pageSize));
@@ -59,7 +59,7 @@ public class BasicStudentController {
     @ApiOperation(value = "学生基本信息管理-新增/编辑")
     @RequestMapping(value = "/save", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = EditResult.class)})
-    public Result saveBasicCampus(@Valid @RequestBody BasicStudentParams basicStudentParams, BindingResult bindingResult) {
+    public Result saveBasicStudent(@Valid @RequestBody BasicStudentParams basicStudentParams, BindingResult bindingResult) {
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
@@ -70,7 +70,7 @@ public class BasicStudentController {
     @ApiOperation(value = "学生基本信息管理-批量删除(逻辑)")
     @RequestMapping(value = "/delete_batch", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "删除成功", response = EditResult.class)})
-    public Result deleteBasicCampus(@ApiParam(value = "选择的要删除的学生id集合",required = true) @RequestParam List<Long> idList) {
+    public Result deleteBasicStudent(@ApiParam(value = "选择的要删除的学生id集合",required = true) @RequestParam List<Long> idList) {
         return ResultUtil.ok(basicStudentService.removeBasicStudentBatch(idList));
     }
 

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

@@ -12,7 +12,8 @@ spring.application.name=distributed-print
 #\u6570\u636E\u6E90\u914D\u7F6E
 db.host=192.168.10.136
 db.port=3306
-db.name=distributed-print-v2.2.0
+#db.name=distributed-print-v2.2.0
+db.name=distributed-v2.2.0-test
 db.username=root
 db.password=Qmth87863577!
 
@@ -135,7 +136,7 @@ sms.config.codeSendInterval=60
 sms.config.aliyunSMSKey=LTAI4Fi8jVRYT49QBXU9x5QX
 #aliyun SMS secret
 sms.config.aliyunSMSSecret=97aBLBfkQR5mzCiQa82yWLAH57eUd8
-sms.config.aliyunSMSSignName=\u9038\u6559\u4e91
+sms.config.aliyunSMSSignName=\u9038\u6559\u4E91
 sms.config.aliyunSMSTplCode=SMS_147416565
 sms.config.aliyunSMSAuditPassCode=SMS_216425141
 sms.config.aliyunSMSAuditNotPassCode=SMS_216275156

+ 36 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/BasicClazzImportDto.java

@@ -0,0 +1,36 @@
+package com.qmth.teachcloud.common.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 基础课程导入
+ * @Author: CaoZixuan
+ * @Date: 2021-08-28
+ */
+public class BasicClazzImportDto {
+    @ExcelNote(value = "班级名称")
+    @NotNull
+    private String clazzName;
+
+    @ExcelNote(value = "校区名称")
+    @NotNull
+    private String campusName;
+
+    public String getClazzName() {
+        return clazzName;
+    }
+
+    public void setClazzName(String clazzName) {
+        this.clazzName = clazzName;
+    }
+
+    public String getCampusName() {
+        return campusName;
+    }
+
+    public void setCampusName(String campusName) {
+        this.campusName = campusName;
+    }
+}

+ 67 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/BasicClazzParams.java

@@ -0,0 +1,67 @@
+package com.qmth.teachcloud.common.bean.params;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Length;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 基础班级参数
+ * @Author: CaoZixuan
+ * @Date: 2021-08-28
+ */
+public class BasicClazzParams {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "班级id(修改时必填)")
+    private Long id;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "校区主键")
+    @NotNull(message = "请选择校区")
+    @Range(min = 1L, message = "请选择校区")
+    private Long campusId;
+
+    @ApiModelProperty(value = "班级编号")
+    private String clazzCode;
+
+    @ApiModelProperty(value = "班级名称")
+    @NotNull(message = "请输入班级名称")
+    @Length(min = 1,message = "请输入班级名称")
+    private String clazzName;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getCampusId() {
+        return campusId;
+    }
+
+    public void setCampusId(Long campusId) {
+        this.campusId = campusId;
+    }
+
+    public String getClazzCode() {
+        return clazzCode;
+    }
+
+    public void setClazzCode(String clazzCode) {
+        this.clazzCode = clazzCode;
+    }
+
+    public String getClazzName() {
+        return clazzName;
+    }
+
+    public void setClazzName(String clazzName) {
+        this.clazzName = clazzName;
+    }
+}

+ 5 - 5
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/BasicCourseParams.java

@@ -39,7 +39,7 @@ public class BasicCourseParams {
 
     @ApiModelProperty(value = "授课班级集合")
     @NotEmpty(message = "请输入班级名称")
-    private List<String> clazzList;
+    private List<Long> clazzIdList;
 
     public Long getId() {
         return id;
@@ -73,11 +73,11 @@ public class BasicCourseParams {
         this.teachingRoomId = teachingRoomId;
     }
 
-    public List<String> getClazzList() {
-        return clazzList;
+    public List<Long> getClazzIdList() {
+        return clazzIdList;
     }
 
-    public void setClazzList(List<String> clazzList) {
-        this.clazzList = clazzList;
+    public void setClazzIdList(List<Long> clazzIdList) {
+        this.clazzIdList = clazzIdList;
     }
 }

+ 127 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/BasicClazzResult.java

@@ -0,0 +1,127 @@
+package com.qmth.teachcloud.common.bean.result;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 基础班级信息查询结果类
+ * @Author: CaoZixuan
+ * @Date: 2021-08-28
+ */
+public class BasicClazzResult {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "学生id")
+    private Long id;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "学校id")
+    private String schoolId;
+
+    @ApiModelProperty(value = "班级编号")
+    private String clazzCode;
+
+    @ApiModelProperty(value = "班级名称")
+    private String clazzName;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "校区id")
+    private String campusId;
+
+    @ApiModelProperty(value = "校区名称")
+    private String campusName;
+
+    @ApiModelProperty(value = "校区编号")
+    private String campusCode;
+
+    @ApiModelProperty(value = "是否被逻辑删除?")
+    private Boolean enable;
+
+    @ApiModelProperty(value = "创建时间")
+    private Long createTime;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "创建人id")
+    private Long createId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(String schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public String getClazzCode() {
+        return clazzCode;
+    }
+
+    public void setClazzCode(String clazzCode) {
+        this.clazzCode = clazzCode;
+    }
+
+    public String getClazzName() {
+        return clazzName;
+    }
+
+    public void setClazzName(String clazzName) {
+        this.clazzName = clazzName;
+    }
+
+    public String getCampusId() {
+        return campusId;
+    }
+
+    public void setCampusId(String campusId) {
+        this.campusId = campusId;
+    }
+
+    public String getCampusName() {
+        return campusName;
+    }
+
+    public void setCampusName(String campusName) {
+        this.campusName = campusName;
+    }
+
+    public String getCampusCode() {
+        return campusCode;
+    }
+
+    public void setCampusCode(String campusCode) {
+        this.campusCode = campusCode;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+    public Long getCreateId() {
+        return createId;
+    }
+
+    public void setCreateId(Long createId) {
+        this.createId = createId;
+    }
+}

+ 11 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/BasicCourseResult.java

@@ -31,6 +31,9 @@ public class BasicCourseResult {
     @ApiModelProperty(value = "班级")
     private String clazz;
 
+    @ApiModelProperty(value = "班级")
+    private String clazzId;
+
     @ApiModelProperty(value = "是否被逻辑删除")
     private Boolean enable;
 
@@ -112,4 +115,12 @@ public class BasicCourseResult {
     public void setCreateId(Long createId) {
         this.createId = createId;
     }
+
+    public String getClazzId() {
+        return clazzId;
+    }
+
+    public void setClazzId(String clazzId) {
+        this.clazzId = clazzId;
+    }
 }

+ 2 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -34,6 +34,7 @@ public class SystemConstant {
     public static final String DOWNLOAD_TEMP = "download-temp";
     public static final String SESSION = "session:";
     public static final String TASK = "task";
+    public static final String TB_TASK_ID = "tbTaskId";
     public static final String USER = "account";
     public static final String SCHOOL_ID = "schoolId";
     public static final String SCHOOL = "school";
@@ -131,7 +132,7 @@ public class SystemConstant {
      * redis mq
      */
     public static final String REDIS_LOCK_MQ_PREFIX = "redis:lock:mq:";
-    public static final int REDIS_MQ_MAX_RECONSUME = 3;
+    public static final int REDIS_MQ_MAX_RECONSUME = 5;
     public static final String MQ_TOPIC_BUFFER_LIST = "mq:topic:buffer:list";
 
     /**

+ 95 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicClazz.java

@@ -0,0 +1,95 @@
+package com.qmth.teachcloud.common.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.base.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 班级基础表
+ * @Author: CaoZixuan
+ * @Date: 2021-08-28
+ */
+@ApiModel(value = "BasicStudent对象", description = "学校id")
+public class BasicClazz extends BaseEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "校区id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long campusId;
+
+    @ApiModelProperty(value = "班级编号")
+    private String clazzCode;
+
+    @ApiModelProperty(value = "班级名称")
+    private String clazzName;
+
+    @ApiModelProperty(value = "是否可用")
+    private Boolean enable;
+
+    @ApiModelProperty(value = "权限机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "org_id", updateStrategy = FieldStrategy.IGNORED)
+    private Long orgId;
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getCampusId() {
+        return campusId;
+    }
+
+    public void setCampusId(Long campusId) {
+        this.campusId = campusId;
+    }
+
+    public String getClazzCode() {
+        return clazzCode;
+    }
+
+    public void setClazzCode(String clazzCode) {
+        this.clazzCode = clazzCode;
+    }
+
+    public String getClazzName() {
+        return clazzName;
+    }
+
+    public void setClazzName(String clazzName) {
+        this.clazzName = clazzName;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+}

+ 6 - 6
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicUserCourse.java

@@ -46,8 +46,8 @@ public class BasicUserCourse extends BaseEntity implements Serializable {
     private Long courseId;
 
     @ApiModelProperty(value = "授课班级")
-    @TableField("clazz")
-    private String clazz;
+    @TableField("clazz_id")
+    private Long clazzId;
 
     public static long getSerialVersionUID() {
         return serialVersionUID;
@@ -85,11 +85,11 @@ public class BasicUserCourse extends BaseEntity implements Serializable {
         this.courseId = courseId;
     }
 
-    public String getClazz() {
-        return clazz;
+    public Long getClazzId() {
+        return clazzId;
     }
 
-    public void setClazz(String clazz) {
-        this.clazz = clazz;
+    public void setClazzId(Long clazzId) {
+        this.clazzId = clazzId;
     }
 }

+ 2 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/TaskTypeEnum.java

@@ -17,6 +17,8 @@ public enum TaskTypeEnum {
 
     COURSE_IMPORT("课程导入"),
 
+    CLAZZ_IMPORT("班级导入"),
+
     QUESTION_MISSION_BATCH_CREATE("批量新建命题任务"),
 
     SAMPLE_EXPORT("导出审核样本"),

+ 23 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/BasicClazzMapper.java

@@ -0,0 +1,23 @@
+package com.qmth.teachcloud.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.teachcloud.common.bean.result.BasicClazzResult;
+import com.qmth.teachcloud.common.entity.BasicClazz;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Set;
+
+/**
+ * @Description: 基础课程管理mapper 接口
+ * @Author: CaoZixuan
+ * @Date: 2021-08-28
+ */
+public interface BasicClazzMapper extends BaseMapper<BasicClazz> {
+
+    IPage<BasicClazzResult> findBasicClazzPage(@Param("iPage") Page<BasicClazzResult> iPage,
+                                                   @Param("queryParams") String queryParams,
+                                                   @Param("schoolId") Long schoolId,
+                                                   @Param("orgIds") Set<Long> orgIds);
+}

+ 52 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/BasicClazzService.java

@@ -0,0 +1,52 @@
+package com.qmth.teachcloud.common.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.common.bean.params.BasicClazzParams;
+import com.qmth.teachcloud.common.bean.result.BasicClazzResult;
+import com.qmth.teachcloud.common.entity.BasicClazz;
+import com.qmth.teachcloud.common.entity.SysUser;
+import org.springframework.util.LinkedMultiValueMap;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 基础班级service
+ * @Author: CaoZixuan
+ * @Date: 2021-08-28
+ */
+public interface BasicClazzService extends IService<BasicClazz> {
+    /**
+     * 班级基础信息分页查询
+     * @param queryParams 查询参数(班级号或名称)
+     * @param pageNumber 分页页码
+     * @param pageSize 分页容量
+     * @return 分页结果
+     */
+    IPage<BasicClazzResult> basicClazzPage(String queryParams, int pageNumber, int pageSize);
+
+    /**
+     * 新增/编辑 学生基础信息
+     * @param basicClazzParams 基础学生信息参数
+     * @param sysUser 创建人信息
+     * @return 新增或编辑的班级id
+     */
+    Long saveBasicClazz(BasicClazzParams basicClazzParams, SysUser sysUser);
+
+    /**
+     * 批量删除班级基本信息(逻辑)
+     * @param idList 要删除的班级主键集合
+     * @return 是否删除成功
+     */
+    Boolean removeBasicClazzBatch(List<Long> idList);
+
+    /**
+     * 执行批量导入班级逻辑
+     *
+     * @param finalList 基础班级数据集合
+     * @param map       参数
+     * @return 结果
+     */
+    Map<String, Object> executeBasicClazzImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList, Map<String, Object> map);
+}

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

@@ -24,11 +24,11 @@ public interface BasicUserCourseService extends IService<BasicUserCourse> {
      * 根据课程id和班级集合更新'basic_user_course'表
      * 逻辑:课程id查询出所有该课程相关记录并删除,添加和班级对应关系
      * @param courseId 课程id
-     * @param clazzList 班级集合
+     * @param clazzIdList 班级集合
      * @param sysUser 执行人
      * @param orgId 机构权限id
      */
-    void updateByCourseIdAndClazzList(Long courseId, List<String> clazzList,SysUser sysUser,Long orgId);
+    void updateByCourseIdAndClazzList(Long courseId, List<Long> clazzIdList,SysUser sysUser,Long orgId);
 
     List<BasicUserCourse> listBySchoolIdAndCourseCode(Long schoolId, String courseCode);
 }

+ 256 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicClazzServiceImpl.java

@@ -0,0 +1,256 @@
+package com.qmth.teachcloud.common.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.common.bean.dto.excel.BasicClazzImportDto;
+import com.qmth.teachcloud.common.bean.dto.excel.DescribeImportDto;
+import com.qmth.teachcloud.common.bean.params.BasicClazzParams;
+import com.qmth.teachcloud.common.bean.result.BasicClazzResult;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.BasicCampus;
+import com.qmth.teachcloud.common.entity.BasicClazz;
+import com.qmth.teachcloud.common.entity.BasicUserCourse;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.mapper.BasicClazzMapper;
+import com.qmth.teachcloud.common.service.BasicCampusService;
+import com.qmth.teachcloud.common.service.BasicClazzService;
+import com.qmth.teachcloud.common.service.BasicUserCourseService;
+import com.qmth.teachcloud.common.service.TeachcloudCommonService;
+import com.qmth.teachcloud.common.util.ServletUtil;
+import org.apache.tomcat.util.buf.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.LinkedMultiValueMap;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+/**
+ * @Description: 基础课程服务实现类
+ * @Author: CaoZixuan
+ * @Date: 2021-08-28
+ */
+@Service
+public class BasicClazzServiceImpl extends ServiceImpl<BasicClazzMapper, BasicClazz> implements BasicClazzService {
+    @Resource
+    private BasicClazzMapper basicClazzMapper;
+    @Resource
+    private TeachcloudCommonService teachcloudCommonService;
+//    @Resource
+//    private BasicStudentService basicStudentService;
+    @Resource
+    private BasicUserCourseService basicUserCourseService;
+    @Resource
+    private BasicCampusService basicCampusService;
+
+    @Override
+    public IPage<BasicClazzResult> basicClazzPage(String queryParams, int pageNumber, int pageSize) {
+        Long schoolId = SystemConstant.convertIdToLong(ServletUtil.getRequestHeaderSchoolId().toString());
+        Set<Long> orgIds = teachcloudCommonService.listSubOrgIds(null);
+        queryParams = SystemConstant.translateSpecificSign(queryParams);
+        return basicClazzMapper.findBasicClazzPage(new Page<>(pageNumber, pageSize), queryParams, schoolId, orgIds);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Long saveBasicClazz(BasicClazzParams basicClazzParams, SysUser sysUser) {
+        List<BasicClazzParams> basicClazzParamsList = new ArrayList<>();
+        basicClazzParamsList.add(basicClazzParams);
+        BasicClazz basicClazz = this.editEntityHelp(basicClazzParamsList, sysUser).get(0);
+        this.saveOrUpdate(basicClazz);
+        return basicClazz.getId();
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean removeBasicClazzBatch(List<Long> idList) {
+        if (idList.size() == 0) {
+            throw ExceptionResultEnum.ERROR.exception("请选择要删除的目标");
+        }
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+
+        // 异常处理
+        String errorStudent = "";
+        String errorCourse = "";
+        // TODO: 2021/8/28  
+//        List<BasicStudent> basicStudentCheck = basicStudentService.list(new QueryWrapper<BasicStudent>().lambda().eq(BasicStudent::getEnable,true).in(BasicStudent::getClazzId,idList));
+//        if (basicStudentCheck.size() > 0){
+//            Set<Long> ids = basicStudentCheck.stream().map(BasicStudent::getClazzId).collect(Collectors.toSet());
+//            List<String> exStudentClazz = this.list(new QueryWrapper<BasicClazz>().lambda().in(BasicClazz::getId,ids)).stream().map(BasicClazz::getClazzName).collect(Collectors.toList());
+//            errorStudent = StringUtils.join(exStudentClazz,',');
+//        }
+
+        List<BasicUserCourse> basicUserCourseCheck = basicUserCourseService.list(new QueryWrapper<BasicUserCourse>().lambda().in(BasicUserCourse::getClazzId,idList));
+        if (basicUserCourseCheck.size() > 0){
+            Set<Long> ids = basicUserCourseCheck.stream().map(BasicUserCourse::getClazzId).collect(Collectors.toSet());
+            List<String> exUserCourseClazz = this.list(new QueryWrapper<BasicClazz>().lambda().in(BasicClazz::getId,ids)).stream().map(BasicClazz::getClazzName).collect(Collectors.toList());
+            errorCourse = StringUtils.join(exUserCourseClazz,',');
+        }
+
+        if (SystemConstant.strNotNull(errorStudent) && SystemConstant.strNotNull(errorCourse)){
+            throw ExceptionResultEnum.ERROR.exception("学生已绑定了要删除的【班级】 : " + errorStudent + ",课程已绑定了要删除的【班级】 : " + errorCourse);
+        } else if (SystemConstant.strNotNull(errorStudent) && !SystemConstant.strNotNull(errorCourse)){
+            throw ExceptionResultEnum.ERROR.exception("学生已绑定了要删除的【班级】 : " + errorStudent);
+        } else if (SystemConstant.strNotNull(errorCourse) && !SystemConstant.strNotNull(errorCourse)){
+            throw ExceptionResultEnum.ERROR.exception("课程已绑定了要删除的【班级】 : " + errorCourse);
+        }
+
+        // 逻辑删除
+        UpdateWrapper<BasicClazz> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().set(BasicClazz::getEnable, false)
+                .set(BasicClazz::getUpdateId, sysUser.getUpdateId())
+                .in(BasicClazz::getId, idList);
+        return this.update(updateWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Map<String, Object> executeBasicClazzImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList, Map<String, Object> map) {
+        SysUser sysUser = (SysUser) map.get(SystemConstant.SYS_USER);
+        Long schoolId = sysUser.getSchoolId();
+
+        List<BasicClazzParams> addBasicClazzParamsList = new ArrayList<>();
+        for (int i = 0; i < finalList.size(); i++) {
+            LinkedMultiValueMap<Integer, Object> excelMap = finalList.get(i);
+            List<Object> basicClazzImportDtoList = excelMap.get(i);
+
+            assert basicClazzImportDtoList != null;
+            if (basicClazzImportDtoList.get(0) instanceof DescribeImportDto) {
+                continue;
+            }
+            List<BasicClazzImportDto> datasource = basicClazzImportDtoList.stream().map(e -> {
+                BasicClazzImportDto basicClazzImportDto = new BasicClazzImportDto();
+                BeanUtils.copyProperties(e, basicClazzImportDto);
+                return basicClazzImportDto;
+            }).collect(Collectors.toList());
+            map.put("dataCount", datasource.size());
+
+
+            // 新校区名称集合
+            Set<String> newCampusNameSet = datasource.stream().map(BasicClazzImportDto::getCampusName).collect(Collectors.toSet());
+            // 旧校区集合
+            List<BasicCampus> basicCampusList = basicCampusService.list(new QueryWrapper<BasicCampus>().lambda().eq(BasicCampus::getEnable, true).eq(BasicCampus::getSchoolId, schoolId));
+            Set<String> oldCampusNameSet = basicCampusList.stream().map(BasicCampus::getCampusName).collect(Collectors.toSet());
+
+            // 需要新增的校区集合
+            Set<String> addCampusNameSet = newCampusNameSet.stream().filter(e -> !oldCampusNameSet.contains(e)).collect(Collectors.toSet());
+            List<BasicCampus> addBasicCampusList = new ArrayList<>();
+            for (String campusName : addCampusNameSet) {
+                BasicCampus basicCampus = new BasicCampus();
+                Long id = SystemConstant.getDbUuid();
+                basicCampus.setSchoolId(schoolId);
+                basicCampus.setCampusName(campusName);
+                basicCampus.setId(id);
+                basicCampus.setCampusCode(String.valueOf(id));
+                basicCampus.setEnable(true);
+                basicCampus.setCreateId(sysUser.getId());
+                addBasicCampusList.add(basicCampus);
+            }
+            // 批量新增校区
+            basicCampusService.saveBatch(addBasicCampusList);
+
+            for (int y = 0; y < Objects.requireNonNull(basicClazzImportDtoList).size(); y++) {
+                BasicClazzImportDto basicClazzImportDto = (BasicClazzImportDto) basicClazzImportDtoList.get(y);
+
+                // 取值
+                String clazzName = basicClazzImportDto.getClazzName();
+                String campusName = basicClazzImportDto.getCampusName();
+
+
+                BasicClazzParams basicClazzParams = new BasicClazzParams();
+                basicClazzParams.setCampusId(basicCampusService.getOne(new QueryWrapper<BasicCampus>().lambda()
+                        .eq(BasicCampus::getSchoolId, schoolId)
+                        .eq(BasicCampus::getCampusName, campusName)
+                        .eq(BasicCampus::getEnable, true))
+                        .getId());
+                basicClazzParams.setClazzName(clazzName);
+
+                BasicClazz tmp = this.getOne(new QueryWrapper<BasicClazz>().lambda()
+                        .eq(BasicClazz::getSchoolId, sysUser.getSchoolId())
+                        .eq(BasicClazz::getEnable, true)
+                        .eq(BasicClazz::getClazzName, clazzName));
+                if (Objects.nonNull(tmp)) {
+                    basicClazzParams.setId(tmp.getId());
+                }
+                addBasicClazzParamsList.add(basicClazzParams);
+            }
+
+            List<BasicClazz> basicClazzList = this.editEntityHelp(addBasicClazzParamsList, sysUser);
+            this.saveOrUpdateBatch(basicClazzList);
+        }
+        return map;
+    }
+
+    /**
+     * 基础班级保存助手方法
+     *
+     * @param basicClazzParamsList 基础班级参数
+     * @param sysUser              操作人
+     * @return 结果
+     */
+    private List<BasicClazz> editEntityHelp(List<BasicClazzParams> basicClazzParamsList, SysUser sysUser) {
+        Long schoolId = sysUser.getSchoolId();
+        List<BasicClazz> editEntityList = new ArrayList<>();
+        for (BasicClazzParams basicClazzParams : basicClazzParamsList) {
+            // 普通参数
+            Long id = basicClazzParams.getId();
+            Long campusId = basicClazzParams.getCampusId();
+            String clazzCode = basicClazzParams.getClazzCode();
+            String clazzName = basicClazzParams.getClazzName();
+
+            // 校验校区不存在
+            if (Objects.isNull(basicCampusService.getById(campusId))) {
+                throw ExceptionResultEnum.ERROR.exception("所选校区不存在");
+            }
+            // 检验班级名称在学校的唯一性
+            BasicClazz checkName = this.getOne(new QueryWrapper<BasicClazz>().lambda()
+                    .eq(BasicClazz::getSchoolId, schoolId)
+                    .eq(BasicClazz::getEnable, true)
+                    .eq(BasicClazz::getClazzName, clazzName));
+            if (Objects.nonNull(checkName)) {
+                if (!checkName.getId().equals(id)) {
+                    throw ExceptionResultEnum.ERROR.exception("班级名称【" + clazzName + "】重复");
+                }
+            }
+
+            // 组装基础参数
+            Long orgId;
+            BasicClazz basicClazz = new BasicClazz();
+            basicClazz.setCampusId(campusId);
+            basicClazz.setSchoolId(schoolId);
+            if (SystemConstant.strNotNull(clazzCode)) {
+                basicClazz.setClazzCode(clazzCode);
+            }
+            basicClazz.setClazzName(clazzName);
+
+            if (!SystemConstant.longNotNull(id)) {
+                // id为空 -> 新增
+                // 获取分布式id
+                orgId = sysUser.getOrgId();
+                id = SystemConstant.getDbUuid();
+                basicClazz.setId(id);
+                basicClazz.setEnable(true);
+                basicClazz.setCreateId(sysUser.getId());
+            } else {
+                // id不为空 -> 编辑
+                BasicClazz old = this.getById(id);
+                if (Objects.isNull(old) || old.getEnable().equals(false)) {
+                    throw ExceptionResultEnum.ERROR.exception("基础班级主键不存在或被禁用");
+                }
+                orgId = old.getOrgId();
+                basicClazz.setId(id);
+                basicClazz.setUpdateId(sysUser.getId());
+            }
+            basicClazz.setOrgId(orgId);
+            editEntityList.add(basicClazz);
+        }
+        return editEntityList;
+    }
+}

+ 24 - 20
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicCourseServiceImpl.java

@@ -11,27 +11,18 @@ import com.qmth.teachcloud.common.bean.dto.excel.DescribeImportDto;
 import com.qmth.teachcloud.common.bean.params.BasicCourseParams;
 import com.qmth.teachcloud.common.bean.result.BasicCourseResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.entity.BasicCourse;
-import com.qmth.teachcloud.common.entity.BasicUserCourse;
-import com.qmth.teachcloud.common.entity.SysOrg;
-import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.entity.*;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.OrgTypeEnum;
 import com.qmth.teachcloud.common.mapper.BasicCourseMapper;
-import com.qmth.teachcloud.common.service.BasicCourseService;
-import com.qmth.teachcloud.common.service.BasicUserCourseService;
-import com.qmth.teachcloud.common.service.SysOrgService;
-import com.qmth.teachcloud.common.service.TeachcloudCommonService;
+import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.util.ServletUtil;
-import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.LinkedMultiValueMap;
 
 import javax.annotation.Resource;
-import javax.websocket.RemoteEndpoint;
 import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -52,6 +43,8 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
     private SysOrgService sysOrgService;
     @Resource
     private BasicUserCourseService basicUserCourseService;
+    @Resource
+    private BasicClazzService basicClazzService;
 
 
     @Override
@@ -184,21 +177,32 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
                     throw ExceptionResultEnum.ERROR.exception("输入的教研室【" + teachingRoomName + "】不存在");
                 }
                 Long teachingRoomId = sysOrg.getId();
-                List<String> clazzList = Arrays.asList(clazz.split(clazzSplit));
+                String[] clazzList = clazz.split(clazzSplit);
+                List<Long> clazzIdList = new ArrayList<>();
+                for (String clzName : clazzList) {
+                    BasicClazz basicClazz = basicClazzService.getOne(new QueryWrapper<BasicClazz>().lambda()
+                            .eq(BasicClazz::getEnable, true)
+                            .eq(BasicClazz::getSchoolId, schoolId)
+                            .eq(BasicClazz::getClazzName, clzName));
+                    if (Objects.isNull(basicClazz)) {
+                        throw ExceptionResultEnum.ERROR.exception("所选择【班级】" + clzName + "不存在");
+                    }
+                    clazzIdList.add(basicClazz.getId());
+                }
+
                 BasicCourseParams basicCourseParams = new BasicCourseParams();
                 basicCourseParams.setCourseCode(courseCode);
                 basicCourseParams.setCourseName(courseName);
                 basicCourseParams.setTeachingRoomId(teachingRoomId);
-                basicCourseParams.setClazzList(clazzList);
+                basicCourseParams.setClazzIdList(clazzIdList);
                 BasicCourse old = this.getOne(new QueryWrapper<BasicCourse>().lambda().eq(BasicCourse::getSchoolId, schoolId).eq(BasicCourse::getEnable, true).eq(BasicCourse::getCode, courseCode));
                 if (Objects.nonNull(old)) {
                     basicCourseParams.setId(old.getId());
+                    addBasicCourseParamsList.add(basicCourseParams);
                 }
-
-                addBasicCourseParamsList.add(basicCourseParams);
+                List<BasicCourse> editBasicCourse = this.editEntityHelp(addBasicCourseParamsList, sysUser);
+                this.saveOrUpdateBatch(editBasicCourse);
             }
-            List<BasicCourse> editBasicCourse = this.editEntityHelp(addBasicCourseParamsList, sysUser);
-            this.saveOrUpdateBatch(editBasicCourse);
         }
         return map;
     }
@@ -244,8 +248,8 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
                 throw ExceptionResultEnum.ERROR.exception("所选教研室不存在");
             }
             // 校验班级
-            List<String> clazzList = basicCourseParams.getClazzList();
-            if (clazzList.size() != clazzList.stream().distinct().count()) {
+            List<Long> clazzIdList = basicCourseParams.getClazzIdList();
+            if (clazzIdList.size() != clazzIdList.stream().distinct().count()) {
                 throw ExceptionResultEnum.ERROR.exception("输入的班级重复");
             }
 
@@ -277,7 +281,7 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
             basicCourse.setOrgId(orgId);
 
             // 根据课程id和授课班级集合更新'basic_user_course'表
-            basicUserCourseService.updateByCourseIdAndClazzList(id, clazzList, sysUser, orgId);
+            basicUserCourseService.updateByCourseIdAndClazzList(id, clazzIdList, sysUser, orgId);
 
             basicCourseList.add(basicCourse);
         }

+ 11 - 3
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicUserCourseServiceImpl.java

@@ -8,12 +8,15 @@ import com.qmth.teachcloud.common.entity.BasicUserCourse;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.mapper.BasicUserCourseMapper;
+import com.qmth.teachcloud.common.service.BasicClazzService;
 import com.qmth.teachcloud.common.service.BasicUserCourseService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -26,6 +29,8 @@ import java.util.stream.Collectors;
  */
 @Service
 public class BasicUserCourseServiceImpl extends ServiceImpl<BasicUserCourseMapper, BasicUserCourse> implements BasicUserCourseService {
+    @Resource
+    private BasicClazzService basicClazzService;
 
     @Override
     public void removeByUserId(Long userId) {
@@ -51,20 +56,23 @@ public class BasicUserCourseServiceImpl extends ServiceImpl<BasicUserCourseMappe
 
     @Transactional
     @Override
-    public void updateByCourseIdAndClazzList(Long courseId, List<String> clazzList, SysUser sysUser, Long orgId) {
+    public void updateByCourseIdAndClazzList(Long courseId, List<Long> clazzIdList, SysUser sysUser, Long orgId) {
         List<BasicUserCourse> willAddList = new ArrayList<>();
 
         // 删除原有的全部
         this.remove(new QueryWrapper<BasicUserCourse>().lambda().eq(BasicUserCourse::getCourseId,courseId).gt(BasicUserCourse::getId,0));
 
         // 新增
-        for (String clazz : clazzList) {
+        for (Long clazzId : clazzIdList) {
+            if (Objects.isNull(basicClazzService.getById(clazzId))){
+                throw ExceptionResultEnum.ERROR.exception("班级主键不存在");
+            }
             BasicUserCourse basicUserCourse = new BasicUserCourse();
             basicUserCourse.setId(SystemConstant.getDbUuid());
             basicUserCourse.setSchoolId(sysUser.getSchoolId());
             basicUserCourse.setOrgId(orgId);
             basicUserCourse.setCourseId(courseId);
-            basicUserCourse.setClazz(clazz);
+            basicUserCourse.setClazzId(clazzId);
             basicUserCourse.setUpdateId(sysUser.getId());
             willAddList.add(basicUserCourse);
         }

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

@@ -154,7 +154,7 @@ public class TBTaskServiceImpl extends ServiceImpl<TBTaskMapper, TBTask> impleme
         Map<String, Object> map = new HashMap<>();
         try {
             TBTask tbTask = saveTaskCommon(null, taskTypeEnum, map, sysUser);
-            if(Objects.nonNull(arraysParams)) {
+            if (Objects.nonNull(arraysParams)) {
                 tbTask.setRemark(JacksonUtil.parseJson(arraysParams.getIds()));
             }
             this.save(tbTask);
@@ -200,7 +200,7 @@ public class TBTaskServiceImpl extends ServiceImpl<TBTaskMapper, TBTask> impleme
     @Override
     public IPage<TaskListResult> query(IPage<Map> iPage, Long schoolId, Long printPlanId, TaskStatusEnum status, TaskTypeEnum type, TaskResultEnum result) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        return tbTaskMapper.query(iPage, schoolId, printPlanId, Objects.nonNull(status) ? status.name() : null, Objects.nonNull(type) ? type.name() : null, Objects.nonNull(result) ? result.name() : null,sysUser.getId());
+        return tbTaskMapper.query(iPage, schoolId, printPlanId, Objects.nonNull(status) ? status.name() : null, Objects.nonNull(type) ? type.name() : null, Objects.nonNull(result) ? result.name() : null, sysUser.getId());
     }
 
     /**
@@ -252,6 +252,7 @@ public class TBTaskServiceImpl extends ServiceImpl<TBTaskMapper, TBTask> impleme
         }
         map.computeIfAbsent(SystemConstant.TASK, v -> tbTask);
         map.computeIfAbsent(SystemConstant.USER, v -> requestUser);
+        map.computeIfAbsent(SystemConstant.TB_TASK_ID, v -> tbTask.getId());
         return tbTask;
     }
 }

+ 40 - 0
teachcloud-common/src/main/resources/mapper/BasicClazzMapper.xml

@@ -0,0 +1,40 @@
+<?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.teachcloud.common.mapper.BasicClazzMapper">
+
+    <select id="findBasicClazzPage"
+            resultType="com.qmth.teachcloud.common.bean.result.BasicClazzResult">
+        SELECT
+            clz.id,
+            clz.school_id AS schoolId,
+            clz.campus_id AS campusId,
+            clz.clazz_code AS clazzCode,
+            clz.clazz_name AS clazzName,
+            clz.enable,
+            clz.create_id AS createId,
+            clz.create_time AS createTime,
+            cap.campus_name AS campusName,
+            cap.campus_code AS campusCode
+        FROM
+            basic_clazz clz
+                LEFT JOIN
+            basic_campus cap ON clz.campus_id = cap.id
+                AND cap.enable = TRUE
+        <where>
+            AND clz.enable = TRUE
+            <if test="schoolId != null and schoolId > 0">
+                AND clz.school_id = #{schoolId}
+            </if>
+            <if test="queryParams != null and queryParams != ''">
+                AND clz.clazz_name LIKE CONCAT('%',#{queryParams},'%') OR clz.clazz_code LIKE CONCAT('%',#{queryParams},'%')
+            </if>
+            <if test="orgIds != null">
+                AND clz.org_id IN
+                <foreach collection="orgIds" item="item" index="index" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+        ORDER BY clz.create_time DESC
+    </select>
+</mapper>

+ 5 - 1
teachcloud-common/src/main/resources/mapper/BasicCourseMapper.xml

@@ -64,8 +64,10 @@
             MAX(bc.name) AS courseName,
             MAX(teaching_room_id) AS teachingRoomId,
             MAX(org.name) AS teachingRoomName,
-            GROUP_CONCAT(buc.clazz
+            GROUP_CONCAT(clz.clazz_name
                          SEPARATOR ',') AS clazz,
+            GROUP_CONCAT(clz.id
+                         SEPARATOR ',') AS clazzId,
             MAX(bc.enable) as enable,
             MAX(bc.create_id) AS createId,
             MAX(bc.create_time) AS createTime
@@ -74,6 +76,8 @@
                 INNER JOIN
             basic_user_course buc ON bc.id = buc.course_id
                 LEFT JOIN
+            basic_clazz clz ON buc.clazz_id = clz.id AND clz.enable = TRUE
+                LEFT JOIN
             sys_org org ON bc.teaching_room_id = org.id
                 AND org.type = 'TEACHING_ROOM'
                 AND org.enable = TRUE

+ 12 - 1
teachcloud-task/src/main/java/com/qmth/teachcloud/task/TeachcloudTaskApplication.java

@@ -1,14 +1,19 @@
 package com.qmth.teachcloud.task;
 
+import com.qmth.teachcloud.common.threadPool.MyThreadPool;
+import org.activiti.spring.boot.SecurityAutoConfiguration;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.domain.EntityScan;
 import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.task.TaskExecutor;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
-@SpringBootApplication(scanBasePackages = "com.qmth.*")
+@SpringBootApplication(scanBasePackages = "com.qmth.*", exclude = {SecurityAutoConfiguration.class})
 @MapperScan({"com.qmth.distributed.print.business.mapper","com.qmth.teachcloud.report.business.mapper","com.qmth.teachcloud.common.mapper"})
 //主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中,做过web开发的同学一定都有用过@Controller,@Service,@Repository注解,查看其源码你会发现,他们中有一个共同的注解@Component,没错@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中
 @EntityScan(basePackages = {"com.qmth.distributed.print.business.entity","com.qmth.teachcloud.report.business.entity","com.qmth.teachcloud.common.entity"}) // 用来扫描和发现指定包及其子包中的Entity定义
@@ -20,4 +25,10 @@ public class TeachcloudTaskApplication {
     public static void main(String[] args) {
         SpringApplication.run(TeachcloudTaskApplication.class, args);
     }
+
+    @Primary
+    @Bean
+    public TaskExecutor primaryTaskExecutor() {
+        return new MyThreadPool();
+    }
 }

+ 22 - 0
teachcloud-task/src/main/java/com/qmth/teachcloud/task/config/RedisMessageListener.java

@@ -1,8 +1,13 @@
 package com.qmth.teachcloud.task.config;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.google.gson.Gson;
+import com.qmth.distributed.print.business.templete.execute.AsyncCreatePdfTempleteService;
 import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.entity.TBTask;
 import com.qmth.teachcloud.common.entity.TMMqMessage;
 import com.qmth.teachcloud.common.service.TMMqMessageService;
 import com.qmth.teachcloud.common.util.JacksonUtil;
@@ -16,6 +21,8 @@ import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
 import java.time.Duration;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -36,6 +43,9 @@ public class RedisMessageListener implements MessageListener {
     @Resource
     TMMqMessageService tmMqMessageService;
 
+    @Resource
+    AsyncCreatePdfTempleteService asyncCreatePdfTempleteService;
+
     @Override
     public void onMessage(Message message, byte[] bytes) {
         MqDto mqDto = null;
@@ -55,6 +65,18 @@ public class RedisMessageListener implements MessageListener {
                         String topic = new String(message.getChannel(), SystemConstant.CHARSET_NAME);
                         mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
                         log.info("mqDto:{},topic:{}", JacksonUtil.parseJson(mqDto), JacksonUtil.parseJson(topic));
+                        Map<String, Object> map = (Map<String, Object>) mqDto.getBody();
+                        Map<String, Object> finalMap = new HashMap<>();
+                        map.forEach((k, v) -> {
+                            if (Objects.equals(k, SystemConstant.TASK)) {
+                                v = JSONObject.parseObject(JSON.toJSONString(v), TBTask.class);
+                            } else if (Objects.equals(k, SystemConstant.USER)) {
+                                v = JSONObject.parseObject(JSON.toJSONString(v), SysUser.class);
+                            }
+                            Object finalV = v;
+                            finalMap.computeIfAbsent(k, v1 -> finalV);
+                        });
+                        asyncCreatePdfTempleteService.createPdf(finalMap, null);
                         redisUtil.delete(SystemConstant.MQ_TOPIC_BUFFER_LIST, mqDto.getId());
                         break;
                     } else {

+ 39 - 9
teachcloud-task/src/main/resources/application-task.properties

@@ -13,23 +13,40 @@ spring.application.name=teachcloud-task
 #\u6570\u636E\u6E90\u914D\u7F6E
 db.host=localhost
 db.port=3306
-db.name=distributed-v2.2.0
+db.name=distributed-v2.2.0-test
 db.username=root
 db.password=123456789
 
 #redis\u6570\u636E\u6E90\u914D\u7F6E
 com.qmth.redis.host=${db.host}
 com.qmth.redis.port=6379
-com.qmth.redis.db=0
+com.qmth.redis.db=15
 #com.qmth.redis.password
 
 #mysql\u914D\u7F6E
-com.qmth.mysql.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
-com.qmth.mysql.username=${db.username}
-com.qmth.mysql.password=${db.password}
-com.qmth.mysql.min-idle=40
-com.qmth.mysql.max-pool-size=200
-com.qmth.mysql.log-level=debug
+com.qmth.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&nullCatalogMeansCurrent=true
+com.qmth.datasource.username=${db.username}
+com.qmth.datasource.password=${db.password}
+com.qmth.mybatis.log-level=debug
+
+#activiti\u914D\u7F6E
+#activiti\u4F1A\u5BF9\u6570\u636E\u5E93\u4E2D\u6240\u6709\u8868\u8FDB\u884C\u66F4\u65B0\u64CD\u4F5C\u3002\u5982\u679C\u8868\u4E0D\u5B58\u5728\uFF0C\u5219\u81EA\u52A8\u521B\u5EFA
+#false\uFF1Afalse\u4E3A\u9ED8\u8BA4\u503C\uFF0C\u8BBE\u7F6E\u4E3A\u8BE5\u503C\u540E\uFF0CActiviti\u5728\u542F\u52A8\u65F6\uFF0C\u4F1A\u5BF9\u6BD4\u6570\u636E\u5E93\u8868\u4E2D\u4FDD\u5B58\u7684\u7248\u672C\uFF0C\u5982\u679C\u6CA1\u6709\u8868\u6216\u8005\u7248\u672C\u4E0D\u5339\u914D\u65F6\uFF0C\u5C06\u5728\u542F\u52A8\u65F6\u629B\u51FA\u5F02\u5E38\u3002
+#true\uFF1A\u8BBE\u7F6E\u4E3A\u8BE5\u503C\u540E\uFF0CActiviti\u4F1A\u5BF9\u6570\u636E\u5E93\u4E2D\u6240\u6709\u7684\u8868\u8FDB\u884C\u66F4\u65B0\uFF0C\u5982\u679C\u8868\u4E0D\u5B58\u5728\uFF0C\u5219Activiti\u4F1A\u81EA\u52A8\u521B\u5EFA\u3002
+#create-drop\uFF1AActiviti\u542F\u52A8\u65F6\uFF0C\u4F1A\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u521B\u5EFA\u64CD\u4F5C\uFF0C\u5728Activiti\u5173\u95ED\u65F6\uFF0C\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u5220\u9664\u64CD\u4F5C\u3002
+#drop-create\uFF1AActiviti\u542F\u52A8\u65F6\uFF0C\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u5220\u9664\u64CD\u4F5C\u5728Activiti\u5173\u95ED\u65F6\uFF0C\u4F1A\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u521B\u5EFA\u64CD\u4F5C\u3002
+spring.activiti.database-schema-update=true
+#\u68C0\u6D4B\u5386\u53F2\u8868\u662F\u5426\u5B58\u5728
+spring.activiti.db-history-used=true
+#\u81EA\u52A8\u90E8\u7F72\u9A8C\u8BC1\u8BBE\u7F6E:true-\u5F00\u542F\uFF08\u9ED8\u8BA4\uFF09\u3001false-\u5173\u95ED
+spring.activiti.check-process-definitions=false
+#spring.activiti.process-definition-location-prefix=classpath:/processes/
+#\u5BF9\u4E8E\u5386\u53F2\u6570\u636E\uFF0C\u4FDD\u5B58\u5230\u4F55\u79CD\u7C92\u5EA6\uFF0CActiviti\u63D0\u4F9B\u4E86history-level\u5C5E\u6027\u5BF9\u5176\u8FDB\u884C\u914D\u7F6E\u3002history-level\u5C5E\u6027\u6709\u70B9\u50CFlog4j\u7684\u65E5\u5FD7\u8F93\u51FA\u7EA7\u522B\uFF0C\u8BE5\u5C5E\u6027\u6709\u4EE5\u4E0B\u56DB\u4E2A\u503C\uFF1A
+#none\uFF1A\u4E0D\u4FDD\u5B58\u4EFB\u4F55\u7684\u5386\u53F2\u6570\u636E\uFF0C\u56E0\u6B64\uFF0C\u5728\u6D41\u7A0B\u6267\u884C\u8FC7\u7A0B\u4E2D\uFF0C\u8FD9\u662F\u6700\u9AD8\u6548\u7684\u3002
+#activity\uFF1A\u7EA7\u522B\u9AD8\u4E8Enone\uFF0C\u4FDD\u5B58\u6D41\u7A0B\u5B9E\u4F8B\u4E0E\u6D41\u7A0B\u884C\u4E3A\uFF0C\u5176\u4ED6\u6570\u636E\u4E0D\u4FDD\u5B58\u3002
+#audit\uFF1A\u9664activity\u7EA7\u522B\u4F1A\u4FDD\u5B58\u7684\u6570\u636E\u5916\uFF0C\u8FD8\u4F1A\u4FDD\u5B58\u5168\u90E8\u7684\u6D41\u7A0B\u4EFB\u52A1\u53CA\u5176\u5C5E\u6027\u3002audit\u4E3Ahistory\u7684\u9ED8\u8BA4\u503C\u3002
+#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
 
 #\u963F\u91CC\u4E91OSS\u914D\u7F6E
 aliyun.oss.name=oss-cn-shenzhen.aliyuncs.com
@@ -39,9 +56,14 @@ aliyun.oss.accessKeySecret=97aBLBfkQR5mzCiQa82yWLAH57eUd8
 aliyun.oss.bucket=teachcloud-test
 aliyun.oss.url=http://${aliyun.oss.bucket}.${aliyun.oss.name}
 
+com.qmth.fss.public.config=oss://key:secret@teachcloud-print-dev-public.oss-api.qmth.com.cn
+com.qmth.fss.public.server=http://oss-file.qmth.com.cn/teachcloud-print-dev-public
+com.qmth.fss.private.config=oss://key:secret@teachcloud-print-dev-private.oss-api.qmth.com.cn
+com.qmth.fss.private.server=http://oss-file.qmth.com.cn/teachcloud-print-dev-private
+
 #\u7CFB\u7EDF\u914D\u7F6E
 sys.config.oss=true
-sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe,.ftl
+sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe,.ftl,.bpmn,.xml
 sys.config.attachmentLength=100
 sys.config.attachmentSize=200
 sys.config.serverUpload=
@@ -60,6 +82,14 @@ sys.config.customThreadPoolCoreSize=true
 sys.config.sessionActive=4h
 spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
 
+#\u65E5\u671F\u683C\u5F0F\u5316
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=GMT+8
+
+#\u65E5\u5FD7\u914D\u7F6E
+com.qmth.logging.root-level=info
+com.qmth.logging.file-path=/Users/king/Downloads/distributed-task.log
+
 #============================================================================
 # \u914D\u7F6EJobStore
 #============================================================================

+ 132 - 0
teachcloud-task/src/main/resources/application-task_36dev.properties

@@ -0,0 +1,132 @@
+#\u7AEF\u53E3\u914D\u7F6E
+server.port=7871
+#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
+server.tomcat.threads.max=2500
+#tomcat\u6700\u5927\u8FDE\u63A5\u6570
+server.tomcat.max-connections=2500
+#tomcat\u7684URI\u7F16\u7801
+server.tomcat.uri-encoding=UTF-8
+
+#\u9879\u76EE\u540D\u79F0
+spring.application.name=teachcloud-task
+
+#\u6570\u636E\u6E90\u914D\u7F6E
+db.host=192.168.10.136
+db.port=3306
+#db.name=distributed-print-v2.2.0
+db.name=distributed-v2.2.0-test
+db.username=root
+db.password=Qmth87863577!
+
+#redis\u6570\u636E\u6E90\u914D\u7F6E
+com.qmth.redis.host=${db.host}
+com.qmth.redis.db=13
+com.qmth.redis.port=6379
+com.qmth.redis.password=123456
+
+#mysql\u914D\u7F6E
+com.qmth.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&nullCatalogMeansCurrent=true
+com.qmth.datasource.username=${db.username}
+com.qmth.datasource.password=${db.password}
+com.qmth.mybatis.log-level=debug
+
+#activiti\u914D\u7F6E
+#activiti\u4F1A\u5BF9\u6570\u636E\u5E93\u4E2D\u6240\u6709\u8868\u8FDB\u884C\u66F4\u65B0\u64CD\u4F5C\u3002\u5982\u679C\u8868\u4E0D\u5B58\u5728\uFF0C\u5219\u81EA\u52A8\u521B\u5EFA
+#false\uFF1Afalse\u4E3A\u9ED8\u8BA4\u503C\uFF0C\u8BBE\u7F6E\u4E3A\u8BE5\u503C\u540E\uFF0CActiviti\u5728\u542F\u52A8\u65F6\uFF0C\u4F1A\u5BF9\u6BD4\u6570\u636E\u5E93\u8868\u4E2D\u4FDD\u5B58\u7684\u7248\u672C\uFF0C\u5982\u679C\u6CA1\u6709\u8868\u6216\u8005\u7248\u672C\u4E0D\u5339\u914D\u65F6\uFF0C\u5C06\u5728\u542F\u52A8\u65F6\u629B\u51FA\u5F02\u5E38\u3002
+#true\uFF1A\u8BBE\u7F6E\u4E3A\u8BE5\u503C\u540E\uFF0CActiviti\u4F1A\u5BF9\u6570\u636E\u5E93\u4E2D\u6240\u6709\u7684\u8868\u8FDB\u884C\u66F4\u65B0\uFF0C\u5982\u679C\u8868\u4E0D\u5B58\u5728\uFF0C\u5219Activiti\u4F1A\u81EA\u52A8\u521B\u5EFA\u3002
+#create-drop\uFF1AActiviti\u542F\u52A8\u65F6\uFF0C\u4F1A\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u521B\u5EFA\u64CD\u4F5C\uFF0C\u5728Activiti\u5173\u95ED\u65F6\uFF0C\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u5220\u9664\u64CD\u4F5C\u3002
+#drop-create\uFF1AActiviti\u542F\u52A8\u65F6\uFF0C\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u5220\u9664\u64CD\u4F5C\u5728Activiti\u5173\u95ED\u65F6\uFF0C\u4F1A\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u521B\u5EFA\u64CD\u4F5C\u3002
+spring.activiti.database-schema-update=true
+#\u68C0\u6D4B\u5386\u53F2\u8868\u662F\u5426\u5B58\u5728
+spring.activiti.db-history-used=true
+#\u81EA\u52A8\u90E8\u7F72\u9A8C\u8BC1\u8BBE\u7F6E:true-\u5F00\u542F\uFF08\u9ED8\u8BA4\uFF09\u3001false-\u5173\u95ED
+spring.activiti.check-process-definitions=false
+#spring.activiti.process-definition-location-prefix=classpath:/processes/
+#\u5BF9\u4E8E\u5386\u53F2\u6570\u636E\uFF0C\u4FDD\u5B58\u5230\u4F55\u79CD\u7C92\u5EA6\uFF0CActiviti\u63D0\u4F9B\u4E86history-level\u5C5E\u6027\u5BF9\u5176\u8FDB\u884C\u914D\u7F6E\u3002history-level\u5C5E\u6027\u6709\u70B9\u50CFlog4j\u7684\u65E5\u5FD7\u8F93\u51FA\u7EA7\u522B\uFF0C\u8BE5\u5C5E\u6027\u6709\u4EE5\u4E0B\u56DB\u4E2A\u503C\uFF1A
+#none\uFF1A\u4E0D\u4FDD\u5B58\u4EFB\u4F55\u7684\u5386\u53F2\u6570\u636E\uFF0C\u56E0\u6B64\uFF0C\u5728\u6D41\u7A0B\u6267\u884C\u8FC7\u7A0B\u4E2D\uFF0C\u8FD9\u662F\u6700\u9AD8\u6548\u7684\u3002
+#activity\uFF1A\u7EA7\u522B\u9AD8\u4E8Enone\uFF0C\u4FDD\u5B58\u6D41\u7A0B\u5B9E\u4F8B\u4E0E\u6D41\u7A0B\u884C\u4E3A\uFF0C\u5176\u4ED6\u6570\u636E\u4E0D\u4FDD\u5B58\u3002
+#audit\uFF1A\u9664activity\u7EA7\u522B\u4F1A\u4FDD\u5B58\u7684\u6570\u636E\u5916\uFF0C\u8FD8\u4F1A\u4FDD\u5B58\u5168\u90E8\u7684\u6D41\u7A0B\u4EFB\u52A1\u53CA\u5176\u5C5E\u6027\u3002audit\u4E3Ahistory\u7684\u9ED8\u8BA4\u503C\u3002
+#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
+
+#\u963F\u91CC\u4E91OSS\u914D\u7F6E
+aliyun.oss.name=oss-cn-shenzhen.aliyuncs.com
+aliyun.oss.endpoint=http://${aliyun.oss.name}
+aliyun.oss.accessKeyId=LTAI4Fi8jVRYT49QBXU9x5QX
+aliyun.oss.accessKeySecret=97aBLBfkQR5mzCiQa82yWLAH57eUd8
+aliyun.oss.bucket=teachcloud-test
+aliyun.oss.url=http://${aliyun.oss.bucket}.${aliyun.oss.name}
+
+com.qmth.fss.public.config=oss://key:secret@teachcloud-print-dev-public.oss-api.qmth.com.cn
+com.qmth.fss.public.server=https://oss-file.qmth.com.cn/teachcloud-print-dev-public
+com.qmth.fss.private.config=oss://key:secret@teachcloud-print-dev-private.oss-api.qmth.com.cn
+com.qmth.fss.private.server=https://oss-file.qmth.com.cn/teachcloud-print-dev-private
+
+#\u7CFB\u7EDF\u914D\u7F6E
+sys.config.oss=true
+sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe,.ftl,.bpmn,.xml
+sys.config.attachmentLength=100
+sys.config.attachmentSize=200
+sys.config.serverUpload=
+sys.config.fileHost=localhost:7871
+sys.config.serverHost=localhost:7871
+#sys.config.accessKey=0bce69d94a7b4aef8bc0badf150351a9
+#sys.config.accessSecret=LdUwb5X4etmjW7fDn0KAdoXG0Yt7AkDu
+sys.config.accessKey=274f823e5f59410f8b3bb6edcd8e2b6e
+sys.config.accessSecret=y7AO6W0TOdTF8HpWBwGHbp3wfIHsmUKr
+sys.config.adminLogoUrl=http://qmth-test.oss-cn-shenzhen.aliyuncs.com/frontend/wx_logo.png
+#sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
+sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
+sys.config.autoCreatePdfResetMaxCount=5
+sys.config.threadPoolCoreSize=1
+sys.config.customThreadPoolCoreSize=true
+sys.config.sessionActive=4h
+spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
+
+#\u65E5\u671F\u683C\u5F0F\u5316
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=GMT+8
+
+#\u65E5\u5FD7\u914D\u7F6E
+com.qmth.logging.root-level=info
+com.qmth.logging.file-path=/ONLINE_EXAM/distributed/task_tomcat/logs/distributed-task.log
+
+#============================================================================
+# \u914D\u7F6EJobStore
+#============================================================================
+spring.quartz.job-store-type=jdbc
+spring.quartz.jdbc.initialize-schema=never
+# JobDataMaps\u662F\u5426\u90FD\u4E3AString\u7C7B\u578B\uFF0C\u9ED8\u8BA4false
+spring.quartz.properties.org.quartz.jobStore.useProperties=false
+# \u8868\u7684\u524D\u7F00\uFF0C\u9ED8\u8BA4QRTZ_
+spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
+# \u662F\u5426\u52A0\u5165\u96C6\u7FA4
+spring.quartz.properties.org.quartz.jobStore.isClustered=true
+# \u8C03\u5EA6\u5B9E\u4F8B\u5931\u6548\u7684\u68C0\u67E5\u65F6\u95F4\u95F4\u9694 ms
+spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=5000
+# \u5F53\u8BBE\u7F6E\u4E3A\u201Ctrue\u201D\u65F6\uFF0C\u6B64\u5C5E\u6027\u544A\u8BC9Quartz \u5728\u975E\u6258\u7BA1JDBC\u8FDE\u63A5\u4E0A\u8C03\u7528setTransactionIsolation\uFF08Connection.TRANSACTION_READ_COMMITTED\uFF09\u3002
+spring.quartz.properties.org.quartz.jobStore.txIsolationLevelReadCommitted=true
+# \u6570\u636E\u4FDD\u5B58\u65B9\u5F0F\u4E3A\u6570\u636E\u5E93\u6301\u4E45\u5316
+spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
+# \u6570\u636E\u5E93\u4EE3\u7406\u7C7B\uFF0C\u4E00\u822Corg.quartz.impl.jdbcjobstore.StdJDBCDelegate\u53EF\u4EE5\u6EE1\u8DB3\u5927\u90E8\u5206\u6570\u636E\u5E93
+spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
+#============================================================================
+# Scheduler \u8C03\u5EA6\u5668\u5C5E\u6027\u914D\u7F6E
+#============================================================================
+# \u8C03\u5EA6\u6807\u8BC6\u540D \u96C6\u7FA4\u4E2D\u6BCF\u4E00\u4E2A\u5B9E\u4F8B\u90FD\u5FC5\u987B\u4F7F\u7528\u76F8\u540C\u7684\u540D\u79F0
+spring.quartz.properties.org.quartz.scheduler.instanceName=ClusterQuartz
+# ID\u8BBE\u7F6E\u4E3A\u81EA\u52A8\u83B7\u53D6 \u6BCF\u4E00\u4E2A\u5FC5\u987B\u4E0D\u540C
+spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
+
+#============================================================================
+# \u914D\u7F6EThreadPool
+#============================================================================
+# \u7EBF\u7A0B\u6C60\u7684\u5B9E\u73B0\u7C7B\uFF08\u4E00\u822C\u4F7F\u7528SimpleThreadPool\u5373\u53EF\u6EE1\u8DB3\u51E0\u4E4E\u6240\u6709\u7528\u6237\u7684\u9700\u6C42\uFF09
+spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
+# \u6307\u5B9A\u7EBF\u7A0B\u6570\uFF0C\u4E00\u822C\u8BBE\u7F6E\u4E3A1-100\u76F4\u63A5\u7684\u6574\u6570\uFF0C\u6839\u636E\u7CFB\u7EDF\u8D44\u6E90\u914D\u7F6E
+spring.quartz.properties.org.quartz.threadPool.threadCount=10
+# \u8BBE\u7F6E\u7EBF\u7A0B\u7684\u4F18\u5148\u7EA7(\u53EF\u4EE5\u662FThread.MIN_PRIORITY\uFF08\u53731\uFF09\u548CThread.MAX_PRIORITY\uFF08\u8FD9\u662F10\uFF09\u4E4B\u95F4\u7684\u4EFB\u4F55int \u3002\u9ED8\u8BA4\u503C\u4E3AThread.NORM_PRIORITY\uFF085\uFF09\u3002)
+spring.quartz.properties.org.quartz.threadPool.threadPriority=5
+
+#\u914D\u7F6E\u6587\u4EF6
+#spring.profiles=task

+ 131 - 0
teachcloud-task/src/main/resources/application-task_release.properties

@@ -0,0 +1,131 @@
+#\u7AEF\u53E3\u914D\u7F6E
+server.port=7011
+#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
+server.tomcat.threads.max=2500
+#tomcat\u6700\u5927\u8FDE\u63A5\u6570
+server.tomcat.max-connections=2500
+#tomcat\u7684URI\u7F16\u7801
+server.tomcat.uri-encoding=UTF-8
+
+#\u9879\u76EE\u540D\u79F0
+spring.application.name=teachcloud-task
+
+#\u6570\u636E\u6E90\u914D\u7F6E
+db.host=localhost
+db.port=3306
+db.name=distributed-v2.2.0-test
+db.username=root
+db.password=123456789
+
+#redis\u6570\u636E\u6E90\u914D\u7F6E
+com.qmth.redis.host=${db.host}
+com.qmth.redis.port=6379
+com.qmth.redis.db=15
+#com.qmth.redis.password
+
+#mysql\u914D\u7F6E
+com.qmth.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&nullCatalogMeansCurrent=true
+com.qmth.datasource.username=${db.username}
+com.qmth.datasource.password=${db.password}
+com.qmth.mybatis.log-level=debug
+
+#activiti\u914D\u7F6E
+#activiti\u4F1A\u5BF9\u6570\u636E\u5E93\u4E2D\u6240\u6709\u8868\u8FDB\u884C\u66F4\u65B0\u64CD\u4F5C\u3002\u5982\u679C\u8868\u4E0D\u5B58\u5728\uFF0C\u5219\u81EA\u52A8\u521B\u5EFA
+#false\uFF1Afalse\u4E3A\u9ED8\u8BA4\u503C\uFF0C\u8BBE\u7F6E\u4E3A\u8BE5\u503C\u540E\uFF0CActiviti\u5728\u542F\u52A8\u65F6\uFF0C\u4F1A\u5BF9\u6BD4\u6570\u636E\u5E93\u8868\u4E2D\u4FDD\u5B58\u7684\u7248\u672C\uFF0C\u5982\u679C\u6CA1\u6709\u8868\u6216\u8005\u7248\u672C\u4E0D\u5339\u914D\u65F6\uFF0C\u5C06\u5728\u542F\u52A8\u65F6\u629B\u51FA\u5F02\u5E38\u3002
+#true\uFF1A\u8BBE\u7F6E\u4E3A\u8BE5\u503C\u540E\uFF0CActiviti\u4F1A\u5BF9\u6570\u636E\u5E93\u4E2D\u6240\u6709\u7684\u8868\u8FDB\u884C\u66F4\u65B0\uFF0C\u5982\u679C\u8868\u4E0D\u5B58\u5728\uFF0C\u5219Activiti\u4F1A\u81EA\u52A8\u521B\u5EFA\u3002
+#create-drop\uFF1AActiviti\u542F\u52A8\u65F6\uFF0C\u4F1A\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u521B\u5EFA\u64CD\u4F5C\uFF0C\u5728Activiti\u5173\u95ED\u65F6\uFF0C\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u5220\u9664\u64CD\u4F5C\u3002
+#drop-create\uFF1AActiviti\u542F\u52A8\u65F6\uFF0C\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u5220\u9664\u64CD\u4F5C\u5728Activiti\u5173\u95ED\u65F6\uFF0C\u4F1A\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u521B\u5EFA\u64CD\u4F5C\u3002
+spring.activiti.database-schema-update=true
+#\u68C0\u6D4B\u5386\u53F2\u8868\u662F\u5426\u5B58\u5728
+spring.activiti.db-history-used=true
+#\u81EA\u52A8\u90E8\u7F72\u9A8C\u8BC1\u8BBE\u7F6E:true-\u5F00\u542F\uFF08\u9ED8\u8BA4\uFF09\u3001false-\u5173\u95ED
+spring.activiti.check-process-definitions=false
+#spring.activiti.process-definition-location-prefix=classpath:/processes/
+#\u5BF9\u4E8E\u5386\u53F2\u6570\u636E\uFF0C\u4FDD\u5B58\u5230\u4F55\u79CD\u7C92\u5EA6\uFF0CActiviti\u63D0\u4F9B\u4E86history-level\u5C5E\u6027\u5BF9\u5176\u8FDB\u884C\u914D\u7F6E\u3002history-level\u5C5E\u6027\u6709\u70B9\u50CFlog4j\u7684\u65E5\u5FD7\u8F93\u51FA\u7EA7\u522B\uFF0C\u8BE5\u5C5E\u6027\u6709\u4EE5\u4E0B\u56DB\u4E2A\u503C\uFF1A
+#none\uFF1A\u4E0D\u4FDD\u5B58\u4EFB\u4F55\u7684\u5386\u53F2\u6570\u636E\uFF0C\u56E0\u6B64\uFF0C\u5728\u6D41\u7A0B\u6267\u884C\u8FC7\u7A0B\u4E2D\uFF0C\u8FD9\u662F\u6700\u9AD8\u6548\u7684\u3002
+#activity\uFF1A\u7EA7\u522B\u9AD8\u4E8Enone\uFF0C\u4FDD\u5B58\u6D41\u7A0B\u5B9E\u4F8B\u4E0E\u6D41\u7A0B\u884C\u4E3A\uFF0C\u5176\u4ED6\u6570\u636E\u4E0D\u4FDD\u5B58\u3002
+#audit\uFF1A\u9664activity\u7EA7\u522B\u4F1A\u4FDD\u5B58\u7684\u6570\u636E\u5916\uFF0C\u8FD8\u4F1A\u4FDD\u5B58\u5168\u90E8\u7684\u6D41\u7A0B\u4EFB\u52A1\u53CA\u5176\u5C5E\u6027\u3002audit\u4E3Ahistory\u7684\u9ED8\u8BA4\u503C\u3002
+#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
+
+#\u963F\u91CC\u4E91OSS\u914D\u7F6E
+aliyun.oss.name=oss-cn-shenzhen.aliyuncs.com
+aliyun.oss.endpoint=http://${aliyun.oss.name}
+aliyun.oss.accessKeyId=LTAI4Fi8jVRYT49QBXU9x5QX
+aliyun.oss.accessKeySecret=97aBLBfkQR5mzCiQa82yWLAH57eUd8
+aliyun.oss.bucket=teachcloud-test
+aliyun.oss.url=http://${aliyun.oss.bucket}.${aliyun.oss.name}
+
+com.qmth.fss.public.config=oss://key:secret@teachcloud-print-dev-public.oss-api.qmth.com.cn
+com.qmth.fss.public.server=http://oss-file.qmth.com.cn/teachcloud-print-dev-public
+com.qmth.fss.private.config=oss://key:secret@teachcloud-print-dev-private.oss-api.qmth.com.cn
+com.qmth.fss.private.server=http://oss-file.qmth.com.cn/teachcloud-print-dev-private
+
+#\u7CFB\u7EDF\u914D\u7F6E
+sys.config.oss=true
+sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe,.ftl,.bpmn,.xml
+sys.config.attachmentLength=100
+sys.config.attachmentSize=200
+sys.config.serverUpload=
+sys.config.fileHost=localhost:7011
+sys.config.serverHost=localhost:7011
+#sys.config.accessKey=0bce69d94a7b4aef8bc0badf150351a9
+#sys.config.accessSecret=LdUwb5X4etmjW7fDn0KAdoXG0Yt7AkDu
+sys.config.accessKey=274f823e5f59410f8b3bb6edcd8e2b6e
+sys.config.accessSecret=y7AO6W0TOdTF8HpWBwGHbp3wfIHsmUKr
+sys.config.adminLogoUrl=http://qmth-test.oss-cn-shenzhen.aliyuncs.com/frontend/wx_logo.png
+#sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
+sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
+sys.config.autoCreatePdfResetMaxCount=5
+sys.config.threadPoolCoreSize=1
+sys.config.customThreadPoolCoreSize=true
+sys.config.sessionActive=4h
+spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
+
+#\u65E5\u671F\u683C\u5F0F\u5316
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=GMT+8
+
+#\u65E5\u5FD7\u914D\u7F6E
+com.qmth.logging.root-level=info
+com.qmth.logging.file-path=/ONLINE_EXAM/distributed/task_tomcat/logs/distributed-task.log
+
+#============================================================================
+# \u914D\u7F6EJobStore
+#============================================================================
+spring.quartz.job-store-type=jdbc
+spring.quartz.jdbc.initialize-schema=never
+# JobDataMaps\u662F\u5426\u90FD\u4E3AString\u7C7B\u578B\uFF0C\u9ED8\u8BA4false
+spring.quartz.properties.org.quartz.jobStore.useProperties=false
+# \u8868\u7684\u524D\u7F00\uFF0C\u9ED8\u8BA4QRTZ_
+spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
+# \u662F\u5426\u52A0\u5165\u96C6\u7FA4
+spring.quartz.properties.org.quartz.jobStore.isClustered=true
+# \u8C03\u5EA6\u5B9E\u4F8B\u5931\u6548\u7684\u68C0\u67E5\u65F6\u95F4\u95F4\u9694 ms
+spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=5000
+# \u5F53\u8BBE\u7F6E\u4E3A\u201Ctrue\u201D\u65F6\uFF0C\u6B64\u5C5E\u6027\u544A\u8BC9Quartz \u5728\u975E\u6258\u7BA1JDBC\u8FDE\u63A5\u4E0A\u8C03\u7528setTransactionIsolation\uFF08Connection.TRANSACTION_READ_COMMITTED\uFF09\u3002
+spring.quartz.properties.org.quartz.jobStore.txIsolationLevelReadCommitted=true
+# \u6570\u636E\u4FDD\u5B58\u65B9\u5F0F\u4E3A\u6570\u636E\u5E93\u6301\u4E45\u5316
+spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
+# \u6570\u636E\u5E93\u4EE3\u7406\u7C7B\uFF0C\u4E00\u822Corg.quartz.impl.jdbcjobstore.StdJDBCDelegate\u53EF\u4EE5\u6EE1\u8DB3\u5927\u90E8\u5206\u6570\u636E\u5E93
+spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
+#============================================================================
+# Scheduler \u8C03\u5EA6\u5668\u5C5E\u6027\u914D\u7F6E
+#============================================================================
+# \u8C03\u5EA6\u6807\u8BC6\u540D \u96C6\u7FA4\u4E2D\u6BCF\u4E00\u4E2A\u5B9E\u4F8B\u90FD\u5FC5\u987B\u4F7F\u7528\u76F8\u540C\u7684\u540D\u79F0
+spring.quartz.properties.org.quartz.scheduler.instanceName=ClusterQuartz
+# ID\u8BBE\u7F6E\u4E3A\u81EA\u52A8\u83B7\u53D6 \u6BCF\u4E00\u4E2A\u5FC5\u987B\u4E0D\u540C
+spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
+
+#============================================================================
+# \u914D\u7F6EThreadPool
+#============================================================================
+# \u7EBF\u7A0B\u6C60\u7684\u5B9E\u73B0\u7C7B\uFF08\u4E00\u822C\u4F7F\u7528SimpleThreadPool\u5373\u53EF\u6EE1\u8DB3\u51E0\u4E4E\u6240\u6709\u7528\u6237\u7684\u9700\u6C42\uFF09
+spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
+# \u6307\u5B9A\u7EBF\u7A0B\u6570\uFF0C\u4E00\u822C\u8BBE\u7F6E\u4E3A1-100\u76F4\u63A5\u7684\u6574\u6570\uFF0C\u6839\u636E\u7CFB\u7EDF\u8D44\u6E90\u914D\u7F6E
+spring.quartz.properties.org.quartz.threadPool.threadCount=10
+# \u8BBE\u7F6E\u7EBF\u7A0B\u7684\u4F18\u5148\u7EA7(\u53EF\u4EE5\u662FThread.MIN_PRIORITY\uFF08\u53731\uFF09\u548CThread.MAX_PRIORITY\uFF08\u8FD9\u662F10\uFF09\u4E4B\u95F4\u7684\u4EFB\u4F55int \u3002\u9ED8\u8BA4\u503C\u4E3AThread.NORM_PRIORITY\uFF085\uFF09\u3002)
+spring.quartz.properties.org.quartz.threadPool.threadPriority=5
+
+#\u914D\u7F6E\u6587\u4EF6
+#spring.profiles=task

+ 131 - 0
teachcloud-task/src/main/resources/application-task_test.properties

@@ -0,0 +1,131 @@
+#\u7AEF\u53E3\u914D\u7F6E
+server.port=7011
+#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
+server.tomcat.threads.max=2500
+#tomcat\u6700\u5927\u8FDE\u63A5\u6570
+server.tomcat.max-connections=2500
+#tomcat\u7684URI\u7F16\u7801
+server.tomcat.uri-encoding=UTF-8
+
+#\u9879\u76EE\u540D\u79F0
+spring.application.name=teachcloud-task
+
+#\u6570\u636E\u6E90\u914D\u7F6E
+db.host=localhost
+db.port=3306
+db.name=distributed-v2.2.0-test
+db.username=root
+db.password=123456789
+
+#redis\u6570\u636E\u6E90\u914D\u7F6E
+com.qmth.redis.host=${db.host}
+com.qmth.redis.port=6379
+com.qmth.redis.db=15
+#com.qmth.redis.password
+
+#mysql\u914D\u7F6E
+com.qmth.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&nullCatalogMeansCurrent=true
+com.qmth.datasource.username=${db.username}
+com.qmth.datasource.password=${db.password}
+com.qmth.mybatis.log-level=debug
+
+#activiti\u914D\u7F6E
+#activiti\u4F1A\u5BF9\u6570\u636E\u5E93\u4E2D\u6240\u6709\u8868\u8FDB\u884C\u66F4\u65B0\u64CD\u4F5C\u3002\u5982\u679C\u8868\u4E0D\u5B58\u5728\uFF0C\u5219\u81EA\u52A8\u521B\u5EFA
+#false\uFF1Afalse\u4E3A\u9ED8\u8BA4\u503C\uFF0C\u8BBE\u7F6E\u4E3A\u8BE5\u503C\u540E\uFF0CActiviti\u5728\u542F\u52A8\u65F6\uFF0C\u4F1A\u5BF9\u6BD4\u6570\u636E\u5E93\u8868\u4E2D\u4FDD\u5B58\u7684\u7248\u672C\uFF0C\u5982\u679C\u6CA1\u6709\u8868\u6216\u8005\u7248\u672C\u4E0D\u5339\u914D\u65F6\uFF0C\u5C06\u5728\u542F\u52A8\u65F6\u629B\u51FA\u5F02\u5E38\u3002
+#true\uFF1A\u8BBE\u7F6E\u4E3A\u8BE5\u503C\u540E\uFF0CActiviti\u4F1A\u5BF9\u6570\u636E\u5E93\u4E2D\u6240\u6709\u7684\u8868\u8FDB\u884C\u66F4\u65B0\uFF0C\u5982\u679C\u8868\u4E0D\u5B58\u5728\uFF0C\u5219Activiti\u4F1A\u81EA\u52A8\u521B\u5EFA\u3002
+#create-drop\uFF1AActiviti\u542F\u52A8\u65F6\uFF0C\u4F1A\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u521B\u5EFA\u64CD\u4F5C\uFF0C\u5728Activiti\u5173\u95ED\u65F6\uFF0C\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u5220\u9664\u64CD\u4F5C\u3002
+#drop-create\uFF1AActiviti\u542F\u52A8\u65F6\uFF0C\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u5220\u9664\u64CD\u4F5C\u5728Activiti\u5173\u95ED\u65F6\uFF0C\u4F1A\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u521B\u5EFA\u64CD\u4F5C\u3002
+spring.activiti.database-schema-update=true
+#\u68C0\u6D4B\u5386\u53F2\u8868\u662F\u5426\u5B58\u5728
+spring.activiti.db-history-used=true
+#\u81EA\u52A8\u90E8\u7F72\u9A8C\u8BC1\u8BBE\u7F6E:true-\u5F00\u542F\uFF08\u9ED8\u8BA4\uFF09\u3001false-\u5173\u95ED
+spring.activiti.check-process-definitions=false
+#spring.activiti.process-definition-location-prefix=classpath:/processes/
+#\u5BF9\u4E8E\u5386\u53F2\u6570\u636E\uFF0C\u4FDD\u5B58\u5230\u4F55\u79CD\u7C92\u5EA6\uFF0CActiviti\u63D0\u4F9B\u4E86history-level\u5C5E\u6027\u5BF9\u5176\u8FDB\u884C\u914D\u7F6E\u3002history-level\u5C5E\u6027\u6709\u70B9\u50CFlog4j\u7684\u65E5\u5FD7\u8F93\u51FA\u7EA7\u522B\uFF0C\u8BE5\u5C5E\u6027\u6709\u4EE5\u4E0B\u56DB\u4E2A\u503C\uFF1A
+#none\uFF1A\u4E0D\u4FDD\u5B58\u4EFB\u4F55\u7684\u5386\u53F2\u6570\u636E\uFF0C\u56E0\u6B64\uFF0C\u5728\u6D41\u7A0B\u6267\u884C\u8FC7\u7A0B\u4E2D\uFF0C\u8FD9\u662F\u6700\u9AD8\u6548\u7684\u3002
+#activity\uFF1A\u7EA7\u522B\u9AD8\u4E8Enone\uFF0C\u4FDD\u5B58\u6D41\u7A0B\u5B9E\u4F8B\u4E0E\u6D41\u7A0B\u884C\u4E3A\uFF0C\u5176\u4ED6\u6570\u636E\u4E0D\u4FDD\u5B58\u3002
+#audit\uFF1A\u9664activity\u7EA7\u522B\u4F1A\u4FDD\u5B58\u7684\u6570\u636E\u5916\uFF0C\u8FD8\u4F1A\u4FDD\u5B58\u5168\u90E8\u7684\u6D41\u7A0B\u4EFB\u52A1\u53CA\u5176\u5C5E\u6027\u3002audit\u4E3Ahistory\u7684\u9ED8\u8BA4\u503C\u3002
+#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
+
+#\u963F\u91CC\u4E91OSS\u914D\u7F6E
+aliyun.oss.name=oss-cn-shenzhen.aliyuncs.com
+aliyun.oss.endpoint=http://${aliyun.oss.name}
+aliyun.oss.accessKeyId=LTAI4Fi8jVRYT49QBXU9x5QX
+aliyun.oss.accessKeySecret=97aBLBfkQR5mzCiQa82yWLAH57eUd8
+aliyun.oss.bucket=teachcloud-test
+aliyun.oss.url=http://${aliyun.oss.bucket}.${aliyun.oss.name}
+
+com.qmth.fss.public.config=oss://key:secret@teachcloud-print-dev-public.oss-api.qmth.com.cn
+com.qmth.fss.public.server=http://oss-file.qmth.com.cn/teachcloud-print-dev-public
+com.qmth.fss.private.config=oss://key:secret@teachcloud-print-dev-private.oss-api.qmth.com.cn
+com.qmth.fss.private.server=http://oss-file.qmth.com.cn/teachcloud-print-dev-private
+
+#\u7CFB\u7EDF\u914D\u7F6E
+sys.config.oss=true
+sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe,.ftl,.bpmn,.xml
+sys.config.attachmentLength=100
+sys.config.attachmentSize=200
+sys.config.serverUpload=
+sys.config.fileHost=localhost:7011
+sys.config.serverHost=localhost:7011
+#sys.config.accessKey=0bce69d94a7b4aef8bc0badf150351a9
+#sys.config.accessSecret=LdUwb5X4etmjW7fDn0KAdoXG0Yt7AkDu
+sys.config.accessKey=274f823e5f59410f8b3bb6edcd8e2b6e
+sys.config.accessSecret=y7AO6W0TOdTF8HpWBwGHbp3wfIHsmUKr
+sys.config.adminLogoUrl=http://qmth-test.oss-cn-shenzhen.aliyuncs.com/frontend/wx_logo.png
+#sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
+sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
+sys.config.autoCreatePdfResetMaxCount=5
+sys.config.threadPoolCoreSize=1
+sys.config.customThreadPoolCoreSize=true
+sys.config.sessionActive=4h
+spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
+
+#\u65E5\u671F\u683C\u5F0F\u5316
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=GMT+8
+
+#\u65E5\u5FD7\u914D\u7F6E
+com.qmth.logging.root-level=info
+com.qmth.logging.file-path=/ONLINE_EXAM/distributed/task_tomcat/logs/distributed-task.log
+
+#============================================================================
+# \u914D\u7F6EJobStore
+#============================================================================
+spring.quartz.job-store-type=jdbc
+spring.quartz.jdbc.initialize-schema=never
+# JobDataMaps\u662F\u5426\u90FD\u4E3AString\u7C7B\u578B\uFF0C\u9ED8\u8BA4false
+spring.quartz.properties.org.quartz.jobStore.useProperties=false
+# \u8868\u7684\u524D\u7F00\uFF0C\u9ED8\u8BA4QRTZ_
+spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
+# \u662F\u5426\u52A0\u5165\u96C6\u7FA4
+spring.quartz.properties.org.quartz.jobStore.isClustered=true
+# \u8C03\u5EA6\u5B9E\u4F8B\u5931\u6548\u7684\u68C0\u67E5\u65F6\u95F4\u95F4\u9694 ms
+spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=5000
+# \u5F53\u8BBE\u7F6E\u4E3A\u201Ctrue\u201D\u65F6\uFF0C\u6B64\u5C5E\u6027\u544A\u8BC9Quartz \u5728\u975E\u6258\u7BA1JDBC\u8FDE\u63A5\u4E0A\u8C03\u7528setTransactionIsolation\uFF08Connection.TRANSACTION_READ_COMMITTED\uFF09\u3002
+spring.quartz.properties.org.quartz.jobStore.txIsolationLevelReadCommitted=true
+# \u6570\u636E\u4FDD\u5B58\u65B9\u5F0F\u4E3A\u6570\u636E\u5E93\u6301\u4E45\u5316
+spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
+# \u6570\u636E\u5E93\u4EE3\u7406\u7C7B\uFF0C\u4E00\u822Corg.quartz.impl.jdbcjobstore.StdJDBCDelegate\u53EF\u4EE5\u6EE1\u8DB3\u5927\u90E8\u5206\u6570\u636E\u5E93
+spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
+#============================================================================
+# Scheduler \u8C03\u5EA6\u5668\u5C5E\u6027\u914D\u7F6E
+#============================================================================
+# \u8C03\u5EA6\u6807\u8BC6\u540D \u96C6\u7FA4\u4E2D\u6BCF\u4E00\u4E2A\u5B9E\u4F8B\u90FD\u5FC5\u987B\u4F7F\u7528\u76F8\u540C\u7684\u540D\u79F0
+spring.quartz.properties.org.quartz.scheduler.instanceName=ClusterQuartz
+# ID\u8BBE\u7F6E\u4E3A\u81EA\u52A8\u83B7\u53D6 \u6BCF\u4E00\u4E2A\u5FC5\u987B\u4E0D\u540C
+spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
+
+#============================================================================
+# \u914D\u7F6EThreadPool
+#============================================================================
+# \u7EBF\u7A0B\u6C60\u7684\u5B9E\u73B0\u7C7B\uFF08\u4E00\u822C\u4F7F\u7528SimpleThreadPool\u5373\u53EF\u6EE1\u8DB3\u51E0\u4E4E\u6240\u6709\u7528\u6237\u7684\u9700\u6C42\uFF09
+spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
+# \u6307\u5B9A\u7EBF\u7A0B\u6570\uFF0C\u4E00\u822C\u8BBE\u7F6E\u4E3A1-100\u76F4\u63A5\u7684\u6574\u6570\uFF0C\u6839\u636E\u7CFB\u7EDF\u8D44\u6E90\u914D\u7F6E
+spring.quartz.properties.org.quartz.threadPool.threadCount=10
+# \u8BBE\u7F6E\u7EBF\u7A0B\u7684\u4F18\u5148\u7EA7(\u53EF\u4EE5\u662FThread.MIN_PRIORITY\uFF08\u53731\uFF09\u548CThread.MAX_PRIORITY\uFF08\u8FD9\u662F10\uFF09\u4E4B\u95F4\u7684\u4EFB\u4F55int \u3002\u9ED8\u8BA4\u503C\u4E3AThread.NORM_PRIORITY\uFF085\uFF09\u3002)
+spring.quartz.properties.org.quartz.threadPool.threadPriority=5
+
+#\u914D\u7F6E\u6587\u4EF6
+#spring.profiles=task

+ 119 - 0
teachcloud-task/src/main/resources/processes/GdykdxPaperApprove.bpmn

@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
+  <process id="GdykdxPaperApprove" name="GdykdxPaperApprove" isExecutable="true">
+    <startEvent id="startevent1" name="Start"></startEvent>
+    <userTask id="usertask1" name="提交试卷(命题老师)" activiti:assignee="${approveId}"></userTask>
+    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
+    <userTask id="usertask2" name="审核试卷(教研室主任)">
+      <extensionElements>
+        <activiti:taskListener event="create" class="com.qmth.distributed.print.business.activiti.DirectorApproveListener"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
+    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
+    <endEvent id="endevent1" name="End"></endEvent>
+    <exclusiveGateway id="exclusivegateway1" name="审批"></exclusiveGateway>
+    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="exclusivegateway1"></sequenceFlow>
+    <userTask id="usertask3" name="审核试卷(教学院长)">
+      <extensionElements>
+        <activiti:taskListener event="create" class="com.qmth.distributed.print.business.activiti.PresidentApproveListener"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
+    <sequenceFlow id="flow4" name="通过" sourceRef="exclusivegateway1" targetRef="usertask3">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve == 1}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="flow5" name="驳回" sourceRef="exclusivegateway1" targetRef="usertask1">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve == 0}]]></conditionExpression>
+    </sequenceFlow>
+    <exclusiveGateway id="exclusivegateway2" name="审批"></exclusiveGateway>
+    <sequenceFlow id="flow6" sourceRef="usertask3" targetRef="exclusivegateway2"></sequenceFlow>
+    <sequenceFlow id="flow7" name="通过" sourceRef="exclusivegateway2" targetRef="endevent1">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve == 2}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="flow8" name="驳回" sourceRef="exclusivegateway2" targetRef="usertask2">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve == 1}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="flow9" name="驳回" sourceRef="exclusivegateway2" targetRef="usertask1">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve == 0}]]></conditionExpression>
+    </sequenceFlow>
+  </process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_GdykdxPaperApprove">
+    <bpmndi:BPMNPlane bpmnElement="GdykdxPaperApprove" id="BPMNPlane_GdykdxPaperApprove">
+      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="43.0" y="46.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
+        <omgdc:Bounds height="55.0" width="105.0" x="151.0" y="36.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
+        <omgdc:Bounds height="55.0" width="105.0" x="350.0" y="36.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="385.0" y="400.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1">
+        <omgdc:Bounds height="40.0" width="40.0" x="382.0" y="110.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">
+        <omgdc:Bounds height="55.0" width="105.0" x="350.0" y="190.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="exclusivegateway2" id="BPMNShape_exclusivegateway2">
+        <omgdc:Bounds height="40.0" width="40.0" x="382.0" y="300.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
+        <omgdi:waypoint x="78.0" y="63.0"></omgdi:waypoint>
+        <omgdi:waypoint x="151.0" y="63.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
+        <omgdi:waypoint x="256.0" y="63.0"></omgdi:waypoint>
+        <omgdi:waypoint x="350.0" y="63.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
+        <omgdi:waypoint x="402.0" y="91.0"></omgdi:waypoint>
+        <omgdi:waypoint x="402.0" y="110.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
+        <omgdi:waypoint x="402.0" y="150.0"></omgdi:waypoint>
+        <omgdi:waypoint x="402.0" y="190.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="16.0" width="22.0" x="402.0" y="150.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
+        <omgdi:waypoint x="382.0" y="130.0"></omgdi:waypoint>
+        <omgdi:waypoint x="203.0" y="130.0"></omgdi:waypoint>
+        <omgdi:waypoint x="203.0" y="91.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="16.0" width="22.0" x="382.0" y="130.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
+        <omgdi:waypoint x="402.0" y="245.0"></omgdi:waypoint>
+        <omgdi:waypoint x="402.0" y="300.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7">
+        <omgdi:waypoint x="402.0" y="340.0"></omgdi:waypoint>
+        <omgdi:waypoint x="402.0" y="400.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="16.0" width="22.0" x="402.0" y="340.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8">
+        <omgdi:waypoint x="422.0" y="320.0"></omgdi:waypoint>
+        <omgdi:waypoint x="546.0" y="319.0"></omgdi:waypoint>
+        <omgdi:waypoint x="546.0" y="63.0"></omgdi:waypoint>
+        <omgdi:waypoint x="455.0" y="63.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="16.0" width="22.0" x="422.0" y="320.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow9" id="BPMNEdge_flow9">
+        <omgdi:waypoint x="382.0" y="320.0"></omgdi:waypoint>
+        <omgdi:waypoint x="203.0" y="321.0"></omgdi:waypoint>
+        <omgdi:waypoint x="203.0" y="91.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="16.0" width="22.0" x="382.0" y="320.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</definitions>