瀏覽代碼

3.2.7 优化

xiaofei 1 年之前
父節點
當前提交
87165b5afe
共有 33 個文件被更改,包括 530 次插入167 次删除
  1. 11 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamCard.java
  2. 1 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/ExamTaskSyncStatusEnum.java
  3. 2 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamDetailCourseMapper.java
  4. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamCardService.java
  5. 2 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailCourseService.java
  6. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicExamServiceImpl.java
  7. 47 24
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardServiceImpl.java
  8. 20 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailCourseServiceImpl.java
  9. 28 18
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPrintPlanServiceImpl.java
  10. 1 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCloudMarkingTaskService.java
  11. 20 7
      distributed-print-business/src/main/resources/db/log/脚本-xiaof.sql
  12. 20 6
      distributed-print-business/src/main/resources/db/upgrade/3.2.7.sql
  13. 62 1
      distributed-print-business/src/main/resources/mapper/ExamDetailCourseMapper.xml
  14. 5 4
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamCardController.java
  15. 2 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/SysPrivilegeController.java
  16. 3 20
      distributed-print/src/main/java/com/qmth/distributed/print/api/SysRoleController.java
  17. 1 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/SysRolePrivilegeParams.java
  18. 12 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicExam.java
  19. 15 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/SysRolePrivilege.java
  20. 98 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/SysRolePrivilegeCustom.java
  21. 14 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/SysRolePrivilegeCustomMapper.java
  22. 2 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysPrivilegeService.java
  23. 13 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysRolePrivilegeCustomService.java
  24. 1 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysRolePrivilegeService.java
  25. 3 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysRoleService.java
  26. 18 8
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysPrivilegeServiceImpl.java
  27. 17 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysRolePrivilegeCustomServiceImpl.java
  28. 42 10
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysRolePrivilegeServiceImpl.java
  29. 52 54
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysRoleServiceImpl.java
  30. 4 0
      teachcloud-common/src/main/resources/mapper/SysRolePrivilegeCustomMapper.xml
  31. 9 1
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SysPrivilegeController.java
  32. 2 2
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/AutoSyncStudentJob.java
  33. 1 1
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/start/StartRunning.java

+ 11 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamCard.java

@@ -93,6 +93,9 @@ public class ExamCard extends BaseEntity implements Serializable {
 
     private String content;
 
+    @TableField(value = "stage_content", updateStrategy = FieldStrategy.IGNORED)
+    private String stageContent;
+
     @TableField("html_content")
     private String htmlContent;
 
@@ -247,6 +250,14 @@ public class ExamCard extends BaseEntity implements Serializable {
         this.content = content;
     }
 
+    public String getStageContent() {
+        return stageContent;
+    }
+
+    public void setStageContent(String stageContent) {
+        this.stageContent = stageContent;
+    }
+
     public String getHtmlContent() {
         return htmlContent;
     }

+ 1 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/ExamTaskSyncStatusEnum.java

@@ -13,8 +13,7 @@ public enum ExamTaskSyncStatusEnum {
     INIT("未开始"),
     STARTING("同步中"),
     FAIL("同步失败"),
-    FINISH("同步成功"),
-    STUDENT_FINISH("考生同步成功");
+    FINISH("同步成功");
 
     ExamTaskSyncStatusEnum(String desc) {
         this.desc = desc;

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

@@ -41,4 +41,6 @@ public interface ExamDetailCourseMapper extends BaseMapper<ExamDetailCourse> {
     IPage<SyncExamTaskDto> listSyncCourseByPrintPlanId(@Param("ipage") Page<SyncExamTaskDto> ipage, @Param("semesterId") Long semesterId, @Param("examId") Long examId, @Param("roomOrgIds") Set<Long> roomOrgIds, @Param("orgIds") Set<Long> orgIds, @Param("cardType") String cardType, @Param("syncStatus") ExamTaskSyncStatusEnum syncStatus, @Param("courseCode") String courseCode, @Param("paperNumber") String paperNumber, @Param("startTime") Long startTime, @Param("endTime") Long endTime);
 
     List<ExamDetailCourse> listExamDetailByExamIdAndPaperNumber(@Param("schoolId") Long schoolId, @Param("examId") Long examId, @Param("paperNumber") String paperNumber);
+
+    List<SyncExamTaskDto> listSyncCourseByExamId(@Param("schoolId") Long schoolId, @Param("examId") Long examId);
 }

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

@@ -42,5 +42,5 @@ public interface ExamCardService extends IService<ExamCard> {
 
     void cardDownload(HttpServletResponse response, String id);
 
-    void storageCard(String id, String content);
+    Long storageCard(String id, String content);
 }

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

@@ -40,4 +40,6 @@ public interface ExamDetailCourseService extends IService<ExamDetailCourse> {
     List<ExamDetailCourseDto> listByPrintPlanIdAndExamTaskId(List<Long> printPlanIds, Long examTaskId, String paperType);
 
     List<ExamDetailCourse> listExamDetailByExamIdAndPaperNumber(Long schoolId, Long examId, String paperNumber);
+
+    List<SyncExamTaskDto> listSyncCourseByExamId(Long schoolId, Long examId);
 }

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

@@ -67,11 +67,11 @@ public class BasicExamServiceImpl extends ServiceImpl<BasicExamMapper, BasicExam
         }
         if (SystemConstant.longNotNull(id)) {
             // 编辑
-            BasicExam old = this.getById(id);
             this.update(new UpdateWrapper<BasicExam>().lambda()
                     .eq(BasicExam::getId, id)
                     .set(BasicExam::getSemesterId, basicExam.getSemesterId())
                     .set(BasicExam::getName, basicExam.getName())
+                    .set(BasicExam::getAutoSyncStudent, basicExam.getAutoSyncStudent())
                     .set(BasicExam::getCategory, basicExam.getCategory())
                     .set(BasicExam::getExamModel, basicExam.getExamModel())
                     .set(BasicExam::getUpdateId, sysUser.getId())

+ 47 - 24
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardServiceImpl.java

@@ -130,13 +130,19 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
             examCard.setCardRuleId(examCardParams.getCardRuleId());
             examCard.insertInfo(user.getId());
 
-            examCard.setContent(examCardParams.getContent());
-            String htmlContent = examCardParams.getHtmlContent();
-            List<ConvertJpgStorage> convertJpgStorageList = htmlToJpgUtil.convertHtmlToJpgByCard(examCard.getTitle(), htmlContent, PageSizeEnum.A3);
-            if (convertJpgStorageList.size() > 0) {
-                examCard.setJpgAttachment(JSON.toJSONString(convertJpgStorageList));
+            // 自动保存
+            if (CardStatusEnum.SUBMIT.equals(examCardParams.getStatus())) {
+                examCard.setContent(examCardParams.getContent());
+                examCard.setStageContent(null);
+                String htmlContent = examCardParams.getHtmlContent();
+                List<ConvertJpgStorage> convertJpgStorageList = htmlToJpgUtil.convertHtmlToJpgByCard(examCard.getTitle(), htmlContent, PageSizeEnum.A3);
+                if (convertJpgStorageList.size() > 0) {
+                    examCard.setJpgAttachment(JSON.toJSONString(convertJpgStorageList));
+                }
+                examCard.setHtmlContent(htmlContent);
+            } else {
+                examCard.setStageContent(examCardParams.getContent());
             }
-            examCard.setHtmlContent(htmlContent);
             this.save(examCard);
         }
         // 修改
@@ -156,13 +162,18 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
             examCard.setStatus(examCardParams.getStatus());
             examCard.setUpdateId(user.getId());
             examCard.setUpdateTime(System.currentTimeMillis());
-            examCard.setContent(examCardParams.getContent());
-            String htmlContent = examCardParams.getHtmlContent();
-            List<ConvertJpgStorage> convertJpgStorageList = htmlToJpgUtil.convertHtmlToJpgByCard(examCard.getTitle(), htmlContent, PageSizeEnum.A3);
-            if (convertJpgStorageList.size() > 0) {
-                examCard.setJpgAttachment(JSON.toJSONString(convertJpgStorageList));
+            if (CardStatusEnum.SUBMIT.equals(examCardParams.getStatus())) {
+                examCard.setContent(examCardParams.getContent());
+                examCard.setStageContent(null);
+                String htmlContent = examCardParams.getHtmlContent();
+                List<ConvertJpgStorage> convertJpgStorageList = htmlToJpgUtil.convertHtmlToJpgByCard(examCard.getTitle(), htmlContent, PageSizeEnum.A3);
+                if (convertJpgStorageList.size() > 0) {
+                    examCard.setJpgAttachment(JSON.toJSONString(convertJpgStorageList));
+                }
+                examCard.setHtmlContent(htmlContent);
+            } else {
+                examCard.setStageContent(examCardParams.getContent());
             }
-            examCard.setHtmlContent(htmlContent);
             this.updateById(examCard);
         }
 
@@ -279,9 +290,14 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
             // 方式为自定义
             else if (CardCreateMethodEnum.STANDARD.equals(params.getCreateMethod())
                     || CardCreateMethodEnum.FREE.equals(params.getCreateMethod())) {
-                examCard.setContent(params.getContent());
-                htmlContent = params.getHtmlContent();
-                examCard.setHtmlContent(htmlContent);
+                if (CardStatusEnum.SUBMIT.equals(params.getStatus())) {
+                    examCard.setContent(params.getContent());
+                    examCard.setStageContent(null);
+                    htmlContent = params.getHtmlContent();
+                    examCard.setHtmlContent(htmlContent);
+                } else {
+                    examCard.setStageContent(params.getContent());
+                }
             } else {
                 throw ExceptionResultEnum.ERROR.exception("不存在的题卡创建方式");
             }
@@ -321,17 +337,24 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
             }
             // 方式为自定义
             else if (CardCreateMethodEnum.STANDARD.equals(params.getCreateMethod()) || CardCreateMethodEnum.FREE.equals(params.getCreateMethod())) {
-                examCard.setContent(params.getContent());
-                htmlContent = params.getHtmlContent();
-                examCard.setHtmlContent(htmlContent);
+                if (CardStatusEnum.SUBMIT.equals(params.getStatus())) {
+                    examCard.setContent(params.getContent());
+                    examCard.setStageContent(null);
+                    htmlContent = params.getHtmlContent();
+                    examCard.setHtmlContent(htmlContent);
+                } else {
+                    examCard.setStageContent(params.getContent());
+                }
             } else {
                 throw ExceptionResultEnum.ERROR.exception("不存在的题卡创建方式");
             }
         }
-        // 生成题卡图片
-        List<ConvertJpgStorage> convertJpgStorageList = htmlToJpgUtil.convertHtmlToJpgByCard(examCard.getTitle(), examCard.getHtmlContent(), PageSizeEnum.A3);
-        if (convertJpgStorageList.size() > 0) {
-            examCard.setJpgAttachment(JSON.toJSONString(convertJpgStorageList));
+        if (CardStatusEnum.SUBMIT.equals(params.getStatus())) {
+            // 生成题卡图片
+            List<ConvertJpgStorage> convertJpgStorageList = htmlToJpgUtil.convertHtmlToJpgByCard(examCard.getTitle(), examCard.getHtmlContent(), PageSizeEnum.A3);
+            if (convertJpgStorageList.size() > 0) {
+                examCard.setJpgAttachment(JSON.toJSONString(convertJpgStorageList));
+            }
         }
         this.saveOrUpdate(examCard);
         return examCard.getId();
@@ -493,7 +516,7 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
     }
 
     @Override
-    public void storageCard(String id, String content) {
+    public Long storageCard(String id, String content) {
         ExamCardStage examCardStage = examCardStageService.getById(id);
         if (examCardStage != null) {
             examCardStage.setContent(content);
@@ -503,7 +526,7 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
             examCardStage.setContent(content);
         }
         examCardStageService.saveOrUpdate(examCardStage);
-
+        return examCardStage.getId();
     }
 
     /**

+ 20 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailCourseServiceImpl.java

@@ -150,4 +150,24 @@ public class ExamDetailCourseServiceImpl extends ServiceImpl<ExamDetailCourseMap
     public List<ExamDetailCourse> listExamDetailByExamIdAndPaperNumber(Long schoolId, Long examId, String paperNumber) {
         return this.baseMapper.listExamDetailByExamIdAndPaperNumber(schoolId, examId, paperNumber);
     }
+
+    @Override
+    public List<SyncExamTaskDto> listSyncCourseByExamId(Long schoolId, Long examId) {
+        List<SyncExamTaskDto> syncExamTaskDtoList = this.baseMapper.listSyncCourseByExamId(schoolId, examId);
+        // 顶级机构
+        SysOrg rootOrg = sysOrgService.findRootOrg(schoolId);
+        for (SyncExamTaskDto examTaskDto : syncExamTaskDtoList) {
+            List<SysOrg> sysOrgList = sysOrgService.findByConnectByParentId(Long.valueOf(examTaskDto.getTeachingRoomId()), false, false);
+            if (!sysOrgList.isEmpty()) {
+                Optional<SysOrg> optionalSysOrg = sysOrgList.stream().filter(m -> rootOrg.getId().equals(m.getParentId())).findFirst();
+                if (optionalSysOrg.isPresent()) {
+                    SysOrg collegeOrg = optionalSysOrg.get();
+                    examTaskDto.setCollegeId(String.valueOf(collegeOrg.getId()));
+                    examTaskDto.setCollegeCode(collegeOrg.getCode());
+                    examTaskDto.setCollegeName(collegeOrg.getName());
+                }
+            }
+        }
+        return syncExamTaskDtoList;
+    }
 }

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

@@ -1,5 +1,6 @@
 package com.qmth.distributed.print.business.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -13,18 +14,14 @@ import com.qmth.distributed.print.business.bean.result.PrintPlanBrief;
 import com.qmth.distributed.print.business.bean.result.PrintPlanResult;
 import com.qmth.distributed.print.business.bean.result.TemplatePrintInfoResult;
 import com.qmth.distributed.print.business.entity.*;
-import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
-import com.qmth.distributed.print.business.enums.ExamTaskSyncStatusEnum;
-import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
+import com.qmth.distributed.print.business.enums.*;
 import com.qmth.distributed.print.business.mapper.ExamPrintPlanMapper;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.templete.execute.AsyncCloudMarkingTaskService;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
 import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.entity.BasicAttachment;
-import com.qmth.teachcloud.common.entity.BasicSchool;
-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.CardCreateMethodEnum;
 import com.qmth.teachcloud.common.enums.ClassifyEnum;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.service.*;
@@ -57,6 +54,9 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
     @Resource
     private ExamDetailService examDetailService;
 
+    @Resource
+    private BasicExamService basicExamService;
+
     @Resource
     private SysOrgService sysOrgService;
 
@@ -64,7 +64,7 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
     private BasicSchoolService basicSchoolService;
 
     @Resource
-    private ExamTaskService examTaskService;
+    private BasicSemesterService basicSemesterService;
 
     @Resource
     private BasicAttachmentService basicAttachmentService;
@@ -72,9 +72,6 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
     @Resource
     private BasicExamRuleService basicExamRuleService;
 
-    @Resource
-    private BasicMessageService basicMessageService;
-
     @Resource
     private TBTaskService tbTaskService;
 
@@ -84,9 +81,6 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
     @Resource
     TeachcloudCommonService teachcloudCommonService;
 
-    @Resource
-    BasicCourseService basicCourseService;
-
     @Resource
     ExamDetailCourseService examDetailCourseService;
 
@@ -102,9 +96,6 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
     @Resource
     private BasicRoleDataPermissionService basicRoleDataPermissionService;
 
-    @Resource
-    TSyncStmmsExamService tSyncStmmsExamService;
-
     @Transactional(rollbackFor = Exception.class)
     @Override
     public IPage<PrintPlanResult> printPlanPage(Long schoolId, Long semesterId, Long examId, List<Long> printPlanIdList, PrintPlanStatusEnum status, Long startTime, Long endTime, int pageNumber, int pageSize) {
@@ -535,7 +526,26 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
 
     @Override
     public void autoSyncStudent() {
-
+        // 查询需要自动同步的考试
+        QueryWrapper<BasicExam> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(BasicExam::getEnable, true) // 未禁用
+                .eq(BasicExam::getAutoSyncStudent, true) // 开启自动同步考务数据
+                .orderByAsc(BasicExam::getSchoolId)
+                .orderByAsc(BasicExam::getId);
+        List<BasicExam> basicExamList = basicExamService.list(queryWrapper);
+        if (!CollectionUtils.isEmpty(basicExamList)) {
+            for (BasicExam basicExam : basicExamList) {
+                List<SyncExamTaskDto> syncExamTasks = examDetailCourseService.listSyncCourseByExamId(basicExam.getSchoolId(), basicExam.getId());
+                if (!CollectionUtils.isEmpty(syncExamTasks)) {
+                    BasicSemester basicSemester = basicSemesterService.getById(basicExam.getSemesterId());
+                    SyncDataParam syncDataParam = new SyncDataParam();
+                    syncDataParam.setThirdRelateName(basicSemester.getName() + "-" + basicExam.getName());
+                    syncDataParam.setExamTime(System.currentTimeMillis());
+                    syncDataParam.setList(syncExamTasks);
+                    asyncCloudMarkingTaskService.syncExamAndStudentAndCard(basicExam.getSchoolId(), syncDataParam);
+                }
+            }
+        }
     }
 
     /**

+ 1 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCloudMarkingTaskService.java

@@ -16,6 +16,7 @@ import com.qmth.teachcloud.common.enums.PushTypeEnum;
 import com.qmth.teachcloud.common.service.SysOrgService;
 import com.qmth.teachcloud.common.sync.CloudMarkingTaskUtils;
 import com.qmth.teachcloud.common.util.ServletUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.annotation.Lazy;

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

@@ -211,7 +211,7 @@ ALTER TABLE `exam_card`
 ADD COLUMN `html_content` MEDIUMTEXT NULL COMMENT 'html格式内容' AFTER `content`,
 ADD COLUMN `backup_attachment` MEDIUMTEXT NULL COMMENT '备用题卡json' AFTER `card_rule_id`,
 ADD COLUMN `jpg_attachment` TEXT NULL COMMENT '题卡转换成的jpg文件信息' AFTER `backup_attachment`,
-CHANGE COLUMN `create_id` `create_id` BIGINT NULL DEFAULT NULL COMMENT '创建人' AFTER `jpg_attachment_info`,
+CHANGE COLUMN `create_id` `create_id` BIGINT NULL DEFAULT NULL COMMENT '创建人' AFTER `jpg_attachment`,
 CHANGE COLUMN `create_time` `create_time` BIGINT NULL DEFAULT NULL COMMENT '创建时间' AFTER `create_id`,
 CHANGE COLUMN `update_id` `update_id` BIGINT NULL DEFAULT NULL COMMENT '更新人' AFTER `create_time`,
 CHANGE COLUMN `update_time` `update_time` BIGINT NULL DEFAULT NULL COMMENT '更新时间' AFTER `update_id`;
@@ -229,7 +229,7 @@ update exam_print_plan set status = 'FINISH' where status = 'PRINT_FINISH';
 
 ALTER TABLE `exam_detail`
     ADD COLUMN `task_id` BIGINT(20) NULL COMMENT 'pdf生成异步任务ID(t_b_task)' AFTER `backup_count`,
-CHANGE COLUMN `create_id` `create_id` BIGINT NULL DEFAULT NULL COMMENT '创建人' AFTER `t_b_task_id`,
+CHANGE COLUMN `create_id` `create_id` BIGINT NULL DEFAULT NULL COMMENT '创建人' AFTER `task_id`,
 CHANGE COLUMN `create_time` `create_time` BIGINT NULL DEFAULT NULL COMMENT '创建时间' AFTER `create_id`,
 CHANGE COLUMN `update_id` `update_id` BIGINT NULL DEFAULT NULL COMMENT '更新人' AFTER `create_time`,
 CHANGE COLUMN `update_time` `update_time` BIGINT NULL DEFAULT NULL COMMENT '更新时间' AFTER `update_id`;
@@ -242,9 +242,22 @@ ALTER TABLE `t_b_sync_task`
     ADD COLUMN `third_relate_name` VARCHAR(300) NULL COMMENT '云阅卷考试名称' AFTER `third_relate_id`,
     ADD COLUMN `exam_time` VARCHAR(20) NULL COMMENT '考试时间' AFTER `third_relate_name`;
 
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`) VALUES ('193', '题卡暂存(自动)', '/api/admin/exam/card/storage_card', 'URL', '175', '4', 'SYS', '1', '1');
 
-CREATE TABLE `exam_card_stage` (
-     `id` INT NOT NULL,
-     `content` MEDIUMTEXT NULL COMMENT '题卡格式内容',
-     PRIMARY KEY (`id`));
-
+ALTER TABLE `exam_card`
+    ADD COLUMN `stage_content` MEDIUMTEXT NULL COMMENT '暂存内容(提交后置空)' AFTER `content`;
+
+ALTER TABLE `basic_exam`
+    ADD COLUMN `auto_sync_student` TINYINT(1) NULL DEFAULT 0 COMMENT '是否自动同步考务数据(默认否)' AFTER `name`;
+
+CREATE TABLE `sys_role_privilege_custom` (
+     `id` bigint NOT NULL COMMENT '主键',
+     `school_id` bigint NOT NULL COMMENT '学校id',
+     `role_id` bigint NOT NULL COMMENT '角色id',
+     `privilege_id` bigint NOT NULL COMMENT '菜单id',
+     `enable` tinyint DEFAULT '1' COMMENT '是否启用,0:停用,1:启用',
+     PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB COMMENT='内置角色和菜单关联表(学校自定义)';
+
+ALTER TABLE `sys_role_privilege`
+    ADD COLUMN `school_id` BIGINT(20) NULL COMMENT '内置角色,按学校自定义的权限' AFTER `enable`;

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

@@ -111,7 +111,7 @@ ALTER TABLE `exam_card`
 ADD COLUMN `html_content` MEDIUMTEXT NULL COMMENT 'html格式内容' AFTER `content`,
 ADD COLUMN `backup_attachment` MEDIUMTEXT NULL COMMENT '备用题卡json' AFTER `card_rule_id`,
 ADD COLUMN `jpg_attachment` TEXT NULL COMMENT '题卡转换成的jpg文件信息' AFTER `backup_attachment`,
-CHANGE COLUMN `create_id` `create_id` BIGINT NULL DEFAULT NULL COMMENT '创建人' AFTER `jpg_attachment_info`,
+CHANGE COLUMN `create_id` `create_id` BIGINT NULL DEFAULT NULL COMMENT '创建人' AFTER `jpg_attachment`,
 CHANGE COLUMN `create_time` `create_time` BIGINT NULL DEFAULT NULL COMMENT '创建时间' AFTER `create_id`,
 CHANGE COLUMN `update_id` `update_id` BIGINT NULL DEFAULT NULL COMMENT '更新人' AFTER `create_time`,
 CHANGE COLUMN `update_time` `update_time` BIGINT NULL DEFAULT NULL COMMENT '更新时间' AFTER `update_id`;
@@ -129,7 +129,7 @@ update exam_print_plan set status = 'FINISH' where status = 'PRINT_FINISH';
 
 ALTER TABLE `exam_detail`
     ADD COLUMN `task_id` BIGINT(20) NULL COMMENT 'pdf生成异步任务ID(t_b_task)' AFTER `backup_count`,
-CHANGE COLUMN `create_id` `create_id` BIGINT NULL DEFAULT NULL COMMENT '创建人' AFTER `t_b_task_id`,
+CHANGE COLUMN `create_id` `create_id` BIGINT NULL DEFAULT NULL COMMENT '创建人' AFTER `task_id`,
 CHANGE COLUMN `create_time` `create_time` BIGINT NULL DEFAULT NULL COMMENT '创建时间' AFTER `create_id`,
 CHANGE COLUMN `update_id` `update_id` BIGINT NULL DEFAULT NULL COMMENT '更新人' AFTER `create_time`,
 CHANGE COLUMN `update_time` `update_time` BIGINT NULL DEFAULT NULL COMMENT '更新时间' AFTER `update_id`;
@@ -142,8 +142,22 @@ ALTER TABLE `t_b_sync_task`
     ADD COLUMN `third_relate_name` VARCHAR(300) NULL COMMENT '云阅卷考试名称' AFTER `third_relate_id`,
     ADD COLUMN `exam_time` VARCHAR(20) NULL COMMENT '考试时间' AFTER `third_relate_name`;
 
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`) VALUES ('193', '题卡暂存(自动)', '/api/admin/exam/card/storage_card', 'URL', '175', '4', 'SYS', '1', '1');
 
-CREATE TABLE `exam_card_stage` (
-                                   `id` INT NOT NULL,
-                                   `content` MEDIUMTEXT NULL COMMENT '题卡格式内容',
-                                   PRIMARY KEY (`id`));
+ALTER TABLE `exam_card`
+    ADD COLUMN `stage_content` MEDIUMTEXT NULL COMMENT '暂存内容(提交后置空)' AFTER `content`;
+
+ALTER TABLE `basic_exam`
+    ADD COLUMN `auto_sync_student` TINYINT(1) NULL DEFAULT 0 COMMENT '是否自动同步考务数据(默认否)' AFTER `name`;
+
+CREATE TABLE `sys_role_privilege_custom` (
+     `id` bigint NOT NULL COMMENT '主键',
+     `school_id` bigint NOT NULL COMMENT '学校id',
+     `role_id` bigint NOT NULL COMMENT '角色id',
+     `privilege_id` bigint NOT NULL COMMENT '菜单id',
+     `enable` tinyint DEFAULT '1' COMMENT '是否启用,0:停用,1:启用',
+     PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB COMMENT='内置角色和菜单关联表(学校自定义)';
+
+ALTER TABLE `sys_role_privilege`
+    ADD COLUMN `school_id` BIGINT(20) NULL COMMENT '内置角色,按学校自定义的权限' AFTER `enable`;

+ 62 - 1
distributed-print-business/src/main/resources/mapper/ExamDetailCourseMapper.xml

@@ -310,5 +310,66 @@
                         AND ed.school_id = #{schoolId}
                         AND ed.exam_id = #{examId})
     </select>
-
+    <select id="listSyncCourseByExamId"
+            resultType="com.qmth.distributed.print.business.bean.dto.SyncExamTaskDto">
+        SELECT
+            et.id examTaskId,
+            et.course_code courseCode,
+            et.course_name courseName,
+            et.paper_number paperNumber,
+            t.paper_type paperType,
+            t.print_plan_ids printPlanIds,
+            ets.third_relate_id thirdRelateId,
+            tsse.exam_name thirdRelateName,
+            ets.sync_status syncStatus,
+            bc.teaching_room_id teachingRoomId
+        FROM
+            exam_task et
+                JOIN
+            (SELECT
+                 b.school_id,
+                 c.exam_id,
+                 b.paper_number,
+                 b.paper_type,
+                 GROUP_CONCAT(c.print_plan_id) print_plan_ids
+             FROM
+                 exam_detail_course b
+                     LEFT JOIN exam_detail c ON b.exam_detail_id = c.id
+             WHERE
+                 c.exam_id = #{examId}
+               AND c.status = 'FINISH'
+             GROUP BY b.school_id , c.exam_id , b.paper_number , b.paper_type) t ON t.school_id = et.school_id
+                AND t.exam_id = et.exam_id
+                AND t.paper_number = et.paper_number
+                LEFT JOIN
+            (SELECT
+                 a.school_id,
+                 a.exam_id,
+                 a.paper_number,
+                 a.org_code,
+                 a.third_relate_id,
+                 a.total_paper_type,
+                 CASE
+                     WHEN LOCATE('STARTING', GROUP_CONCAT(DISTINCT a.sync_status)) THEN 'STARTING'
+                     WHEN LOCATE('FAIL', GROUP_CONCAT(DISTINCT a.sync_status)) THEN 'FAIL'
+                     WHEN LOCATE('FINISH', GROUP_CONCAT(DISTINCT a.sync_status)) THEN 'FINISH'
+                     END sync_status
+             FROM
+                 exam_task_sync a
+             WHERE
+                 a.exam_id = #{examId}
+             GROUP BY a.school_id , a.exam_id , a.paper_number , a.org_code , a.third_relate_id , a.total_paper_type) ets ON et.school_id = ets.school_id
+                AND et.exam_id = ets.exam_id
+                AND et.paper_number = ets.paper_number
+                AND t.paper_type = ets.total_paper_type
+                LEFT JOIN
+            t_sync_stmms_exam tsse ON ets.school_id = tsse.school_id
+                AND ets.third_relate_id = tsse.exam_id
+                LEFT JOIN
+            basic_course bc ON et.school_id = bc.school_id
+                AND et.course_code = bc.code
+        WHERE
+            ets.sync_status != 'FINISH'
+        ORDER BY et.create_time DESC
+    </select>
 </mapper>

+ 5 - 4
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamCardController.java

@@ -182,13 +182,14 @@ public class ExamCardController {
     /**
      * 题卡自动保存临时表
      *
-     * @param id 题卡ID
+     * @param id      题卡ID
      * @param content 卡格式
      */
     @ApiOperation(value = "题卡自动暂存")
     @RequestMapping(value = "/storage_card", method = RequestMethod.POST)
-    public void storageCard(@RequestParam(value = "id") String id,
-                             @RequestParam(value = "id") String content) {
-        examCardService.storageCard(id, content);
+    public Result storageCard(@RequestParam(value = "id") String id,
+                              @RequestParam(value = "id") String content) {
+        Long cardId = examCardService.storageCard(id, content);
+        return ResultUtil.ok(String.valueOf(cardId), "");
     }
 }

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

@@ -1,7 +1,7 @@
 package com.qmth.distributed.print.api;
 
 import com.qmth.boot.api.constant.ApiConstant;
-import com.qmth.distributed.print.business.bean.params.SysRolePrivilegeParams;
+import com.qmth.teachcloud.common.bean.params.SysRolePrivilegeParams;
 import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -104,7 +104,7 @@ public class SysPrivilegeController {
 
         SysRolePrivilegeParams result = new SysRolePrivilegeParams();
         // 该角色拥有的权限集合
-        result.setPrivilegeIds(sysPrivilegeService.getRolePrivileges(roleId));
+        result.setPrivilegeIds(sysPrivilegeService.getRolePrivileges(sysRole));
         // 该角色拥有的数据权限
         result.setDataPermissionInfo(basicRoleDataPermissionService.findRoleDataPermissionInfo(roleId));
         result.setId(roleId);

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

@@ -2,7 +2,7 @@ package com.qmth.distributed.print.api;
 
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionInfo;
-import com.qmth.distributed.print.business.bean.params.SysRolePrivilegeParams;
+import com.qmth.teachcloud.common.bean.params.SysRolePrivilegeParams;
 import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -34,14 +34,12 @@ import java.util.List;
  */
 @Api(tags = "角色Controller")
 @RestController
-@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX  + SystemConstant.PREFIX_URL_SYS + "/role")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_SYS + "/role")
 @Validated
 public class SysRoleController {
 
     @Resource
     private SysRoleService sysRoleService;
-    @Resource
-    private BasicRoleDataPermissionService basicRoleDataPermissionService;
 
     /**
      * 查询
@@ -96,22 +94,7 @@ public class SysRoleController {
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
-        // 组装角色
-        SysRole role = new SysRole();
-        role.setId(sysRolePrivilegeParams.getId());
-        role.setName(sysRolePrivilegeParams.getName());
-        role.setInterpret(sysRolePrivilegeParams.getInterpret());
-        role.setPrivilegeIds(sysRolePrivilegeParams.getPrivilegeIds().stream().map(SystemConstant::convertIdToLong).toArray(Long[]::new));
-        role.setDefaultRole(sysRolePrivilegeParams.getDefaultRole() == null ? false : sysRolePrivilegeParams.getDefaultRole());
-        boolean rolePrivilegeResult = sysRoleService.saveRoleNew(role);
-
-        // 组装角色权限
-        Long roleId = role.getId();
-        // 数据权限集合
-        if (rolePrivilegeResult && roleId > 0){
-            List<DataPermissionInfo> dataPermissionInfoList = sysRolePrivilegeParams.getDataPermissionInfo();
-            basicRoleDataPermissionService.saveRoleDataPermission(roleId,dataPermissionInfoList);
-        }
+        sysRoleService.saveRoleNew(sysRolePrivilegeParams);
         return ResultUtil.ok();
     }
 

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/SysRolePrivilegeParams.java → teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/SysRolePrivilegeParams.java

@@ -1,4 +1,4 @@
-package com.qmth.distributed.print.business.bean.params;
+package com.qmth.teachcloud.common.bean.params;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

+ 12 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicExam.java

@@ -42,6 +42,10 @@ public class BasicExam extends BaseEntity implements Serializable {
     @TableField("name")
     private String name;
 
+    @ApiModelProperty(value = "是否自动推送考务数据")
+    @TableField("auto_sync_student")
+    private Boolean autoSyncStudent;
+
     @ApiModelProperty(value = "考试类型")
     @TableField("category")
     private ExamCategoryEnum category;
@@ -95,6 +99,14 @@ public class BasicExam extends BaseEntity implements Serializable {
         this.name = name;
     }
 
+    public Boolean getAutoSyncStudent() {
+        return autoSyncStudent;
+    }
+
+    public void setAutoSyncStudent(Boolean autoSyncStudent) {
+        this.autoSyncStudent = autoSyncStudent;
+    }
+
     public ExamCategoryEnum getCategory() {
         return category;
     }

+ 15 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/SysRolePrivilege.java

@@ -28,6 +28,13 @@ public class SysRolePrivilege implements Serializable {
     @TableId(value = "id")
     private Long id;
 
+    /**
+     * 学校ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("school_id")
+    private Long schoolId;
+
     /**
      * 角色ID
      */
@@ -81,4 +88,12 @@ public class SysRolePrivilege implements Serializable {
     public void setPrivilegeId(Long privilegeId) {
         this.privilegeId = privilegeId;
     }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
 }

+ 98 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/SysRolePrivilegeCustom.java

@@ -0,0 +1,98 @@
+package com.qmth.teachcloud.common.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 内置角色和菜单关联表(学校自定义)
+ * </p>
+ *
+ * @author xf
+ * @since 2021-03-23
+ */
+@TableName("sys_role_privilege_custom")
+public class SysRolePrivilegeCustom implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 学校ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("school_id")
+    private Long schoolId;
+
+    /**
+     * 角色ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("role_id")
+    private Long roleId;
+
+    /**
+     * 菜单ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("privilege_id")
+    private Long privilegeId;
+
+    @ApiModelProperty(value = "是否启用,0:停用,1:启用")
+    @TableField(value = "enable")
+    private Boolean enable;
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public Long getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId) {
+        this.roleId = roleId;
+    }
+
+    public Long getPrivilegeId() {
+        return privilegeId;
+    }
+
+    public void setPrivilegeId(Long privilegeId) {
+        this.privilegeId = privilegeId;
+    }
+}

+ 14 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/SysRolePrivilegeCustomMapper.java

@@ -0,0 +1,14 @@
+package com.qmth.teachcloud.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.teachcloud.common.entity.SysRolePrivilege;
+import com.qmth.teachcloud.common.entity.SysRolePrivilegeCustom;
+
+/**
+ * <p>
+ * 内置角色和菜单关联表 Mapper 接口
+ * </p>
+ */
+public interface SysRolePrivilegeCustomMapper extends BaseMapper<SysRolePrivilegeCustom> {
+
+}

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

@@ -3,6 +3,7 @@ package com.qmth.teachcloud.common.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.teachcloud.common.bean.dto.PrivilegeDto;
 import com.qmth.teachcloud.common.entity.SysPrivilege;
+import com.qmth.teachcloud.common.entity.SysRole;
 
 import java.util.Collection;
 import java.util.List;
@@ -30,7 +31,7 @@ public interface SysPrivilegeService extends IService<SysPrivilege> {
 
     boolean remove(Long id);
 
-    List<String> getRolePrivileges(Long roleId);
+    List<String> getRolePrivileges(SysRole sysRole);
 
     List<PrivilegeDto> listPrivilegeTreeAuth();
 

+ 13 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysRolePrivilegeCustomService.java

@@ -0,0 +1,13 @@
+package com.qmth.teachcloud.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.common.entity.SysRolePrivilegeCustom;
+
+/**
+ * <p>
+ * 内置角色和菜单关联表 服务类
+ * </p>
+ */
+public interface SysRolePrivilegeCustomService extends IService<SysRolePrivilegeCustom> {
+
+}

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

@@ -18,7 +18,7 @@ public interface SysRolePrivilegeService extends IService<SysRolePrivilege> {
 
     void removeByRoleId(Long id);
 
-    void saveBatch(SysRole role);
+    boolean saveBatch(SysRole role);
 
     List<SysRolePrivilege> listByRoleId(Long roleId);
 }

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

@@ -2,6 +2,7 @@ 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.SysRolePrivilegeParams;
 import com.qmth.teachcloud.common.entity.SysRole;
 
 import java.security.NoSuchAlgorithmException;
@@ -22,10 +23,10 @@ public interface SysRoleService extends IService<SysRole> {
     /**
      * 新增角色
      *
-     * @param role
+     * @param sysRolePrivilegeParams
      * @return
      */
-    boolean saveRoleNew(SysRole role);
+    boolean saveRoleNew(SysRolePrivilegeParams sysRolePrivilegeParams);
 
     boolean saveRoleReportNew(SysRole role);
 

+ 18 - 8
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysPrivilegeServiceImpl.java

@@ -9,16 +9,19 @@ import com.qmth.teachcloud.common.bean.dto.MenuPrivilegeDto;
 import com.qmth.teachcloud.common.bean.dto.PrivilegeDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysPrivilege;
+import com.qmth.teachcloud.common.entity.SysRole;
 import com.qmth.teachcloud.common.entity.SysRolePrivilege;
 import com.qmth.teachcloud.common.entity.TSchoolPrivilege;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.PrivilegeEnum;
 import com.qmth.teachcloud.common.enums.PrivilegePropertyEnum;
 import com.qmth.teachcloud.common.mapper.SysPrivilegeMapper;
+import com.qmth.teachcloud.common.service.CommonCacheService;
 import com.qmth.teachcloud.common.service.SysPrivilegeService;
 import com.qmth.teachcloud.common.service.SysRolePrivilegeService;
 import com.qmth.teachcloud.common.service.TSchoolPrivilegeService;
 import com.qmth.teachcloud.common.util.JacksonUtil;
+import com.qmth.teachcloud.common.util.ServletUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -54,6 +57,9 @@ public class SysPrivilegeServiceImpl extends ServiceImpl<SysPrivilegeMapper, Sys
     @Resource
     TSchoolPrivilegeService tSchoolPrivilegeService;
 
+    @Resource
+    CommonCacheService commonCacheService;
+
     @Override
     public List<PrivilegeDto> listPrivilegeTree() {
         QueryWrapper<SysPrivilege> queryWrapper = new QueryWrapper<>();
@@ -159,13 +165,17 @@ public class SysPrivilegeServiceImpl extends ServiceImpl<SysPrivilegeMapper, Sys
     }
 
     @Override
-    public List<String> getRolePrivileges(Long roleId) {
-        QueryWrapper<SysRolePrivilege> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(SysRolePrivilege::getRoleId, roleId);
-        List<SysRolePrivilege> sysRolePrivileges = sysRolePrivilegeService.list(queryWrapper);
-        List<String> list = null;
-        if (sysRolePrivileges != null && sysRolePrivileges.size() > 0) {
-            list = sysRolePrivileges.stream().map(m -> String.valueOf(m.getPrivilegeId())).collect(Collectors.toList());
+    public List<String> getRolePrivileges(SysRole sysRole) {
+        Long schoolId = Objects.nonNull(ServletUtil.getRequestHeaderSchoolIdByNotVaild()) ? Long.valueOf(ServletUtil.getRequestHeaderSchoolIdByNotVaild().toString()) : null;
+        List<SysRolePrivilege> sysRolePrivileges = commonCacheService.rolePrivilegeCache(sysRole.getId());
+        List<String> list = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(sysRolePrivileges)) {
+            // 内置角色,只返回内置角色对应权限,不显示学校编辑的权限
+            if (schoolId == null && sysRole.getDefaultRole()) {
+                list = sysRolePrivileges.stream().filter(m -> m.getSchoolId() == null).map(m -> String.valueOf(m.getPrivilegeId())).collect(Collectors.toList());
+            } else {
+                list = sysRolePrivileges.stream().map(m -> String.valueOf(m.getPrivilegeId())).collect(Collectors.toList());
+            }
         }
         return list;
     }
@@ -320,7 +330,7 @@ public class SysPrivilegeServiceImpl extends ServiceImpl<SysPrivilegeMapper, Sys
             Long parentId = sysPrivilege.getParentId();
             if (SystemConstant.longNotNull(parentId)) {
                 return this.findPrivilegeUrlCatalog(parentId) + SystemConstant.CATALOG_LINK + currentName;
-            }else {
+            } else {
                 return currentName;
             }
         }

+ 17 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysRolePrivilegeCustomServiceImpl.java

@@ -0,0 +1,17 @@
+package com.qmth.teachcloud.common.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.common.entity.SysRolePrivilegeCustom;
+import com.qmth.teachcloud.common.mapper.SysRolePrivilegeCustomMapper;
+import com.qmth.teachcloud.common.service.SysRolePrivilegeCustomService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 内置角色和菜单关联表 服务实现类
+ * </p>
+ */
+@Service
+public class SysRolePrivilegeCustomServiceImpl extends ServiceImpl<SysRolePrivilegeCustomMapper, SysRolePrivilegeCustom> implements SysRolePrivilegeCustomService {
+
+}

+ 42 - 10
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysRolePrivilegeServiceImpl.java

@@ -7,9 +7,12 @@ import com.qmth.teachcloud.common.entity.SysPrivilege;
 import com.qmth.teachcloud.common.entity.SysRole;
 import com.qmth.teachcloud.common.entity.SysRolePrivilege;
 import com.qmth.teachcloud.common.mapper.SysRolePrivilegeMapper;
+import com.qmth.teachcloud.common.service.CommonCacheService;
 import com.qmth.teachcloud.common.service.SysPrivilegeService;
 import com.qmth.teachcloud.common.service.SysRolePrivilegeService;
+import com.qmth.teachcloud.common.util.ServletUtil;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.util.*;
@@ -25,6 +28,8 @@ import java.util.stream.Collectors;
  */
 @Service
 public class SysRolePrivilegeServiceImpl extends ServiceImpl<SysRolePrivilegeMapper, SysRolePrivilege> implements SysRolePrivilegeService {
+    @Resource
+    private CommonCacheService commonCacheService;
 
     @Resource
     SysPrivilegeService sysPrivilegeService;
@@ -37,12 +42,20 @@ public class SysRolePrivilegeServiceImpl extends ServiceImpl<SysRolePrivilegeMap
     }
 
     @Override
-    public void saveBatch(SysRole role) {
+    public boolean saveBatch(SysRole role) {
+        Long schoolId = Objects.nonNull(ServletUtil.getRequestHeaderSchoolIdByNotVaild()) ? Long.valueOf(ServletUtil.getRequestHeaderSchoolIdByNotVaild().toString()) : null;
+
+        List<SysRolePrivilege> sysRolePrivilegeList = commonCacheService.rolePrivilegeCache(role.getId());
+        if(schoolId == null && role.getDefaultRole()){
+            sysRolePrivilegeList = sysRolePrivilegeList.stream().filter(m->m.getSchoolId() == null).collect(Collectors.toList());
+        }
+
         QueryWrapper<SysPrivilege> sysPrivilegeQueryWrapper = new QueryWrapper<>();
         sysPrivilegeQueryWrapper.lambda().in(SysPrivilege::getId, role.getPrivilegeIds());
         List<SysPrivilege> sysPrivilegeList = sysPrivilegeService.list(sysPrivilegeQueryWrapper);
+
         Set<String> relatedSet = sysPrivilegeList.stream().filter(s -> Objects.nonNull(s.getRelated())).map(s -> s.getRelated()).collect(Collectors.toSet());
-        Set<Long> finalRelatedSet = new HashSet<>();
+        Set<Long> finalRelatedSet = new HashSet<>(Arrays.asList(role.getPrivilegeIds()));
         for (String s : relatedSet) {
             if (s.contains(",")) {
                 String[] arrays = s.split(",");
@@ -53,15 +66,34 @@ public class SysRolePrivilegeServiceImpl extends ServiceImpl<SysRolePrivilegeMap
                 finalRelatedSet.add(Long.parseLong(s));
             }
         }
-        finalRelatedSet.addAll(Arrays.asList(role.getPrivilegeIds()));
-        List<SysRolePrivilege> list = new ArrayList<>();
-        for (Long privilegeId : finalRelatedSet) {
-            SysRolePrivilege sysRolePrivilege = new SysRolePrivilege();
-            sysRolePrivilege.setRoleId(role.getId());
-            sysRolePrivilege.setPrivilegeId(privilegeId);
-            list.add(sysRolePrivilege);
+        // 修改后权限集合
+        List<Long> relatedList = new ArrayList<>(finalRelatedSet);
+        int count = (int) sysRolePrivilegeList.stream().filter(s -> relatedList.contains(s.getPrivilegeId())).count();
+        if (count != sysRolePrivilegeList.size() || count != finalRelatedSet.size()) {
+            List<SysRolePrivilege> list = new ArrayList<>();
+            //学校角色编辑超管
+            if(role.getDefaultRole()){
+                // 超管页面
+                if(schoolId == null) {
+                    this.removeByRoleId(role.getId());
+                }
+                // 学校页面
+                else {
+
+                }
+            } else {
+                this.removeByRoleId(role.getId());
+                for (Long privilegeId : finalRelatedSet) {
+                    SysRolePrivilege sysRolePrivilege = new SysRolePrivilege();
+                    sysRolePrivilege.setRoleId(role.getId());
+                    sysRolePrivilege.setPrivilegeId(privilegeId);
+                    list.add(sysRolePrivilege);
+                }
+            }
+            this.saveBatch(list);
+            return true;
         }
-        this.saveBatch(list);
+        return false;
     }
 
     @Override

+ 52 - 54
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysRoleServiceImpl.java

@@ -6,11 +6,12 @@ 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.boot.api.exception.ApiException;
+import com.qmth.teachcloud.common.bean.dto.DataPermissionInfo;
+import com.qmth.teachcloud.common.bean.params.SysRolePrivilegeParams;
 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.FieldUniqueEnum;
-import com.qmth.teachcloud.common.enums.RoleSourceEnum;
 import com.qmth.teachcloud.common.enums.RoleTypeEnum;
 import com.qmth.teachcloud.common.mapper.SysRoleMapper;
 import com.qmth.teachcloud.common.service.*;
@@ -21,6 +22,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.security.NoSuchAlgorithmException;
@@ -60,6 +62,9 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
     @Resource
     SysRoleGroupMemberService sysRoleGroupMemberService;
 
+    @Resource
+    private BasicRoleDataPermissionService basicRoleDataPermissionService;
+
     @Override
     public IPage<SysRole> list(String name, Boolean enable, Integer pageNumber, Integer pageSize) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
@@ -69,73 +74,60 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
     /**
      * 新增角色
      *
-     * @param role
+     * @param sysRolePrivilegeParams
      * @return
      */
     @Transactional
     @Override
-    public boolean saveRoleNew(SysRole role) {
+    public boolean saveRoleNew(SysRolePrivilegeParams sysRolePrivilegeParams) {
         try {
             SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
             Long schoolId = Objects.nonNull(ServletUtil.getRequestHeaderSchoolIdByNotVaild()) ? Long.valueOf(ServletUtil.getRequestHeaderSchoolIdByNotVaild().toString()) : null;
-            if (Objects.isNull(schoolId) && Objects.isNull(role.getSchoolId())) {
-                role.setSchoolId(sysUser.getSchoolId());
-            } else if (Objects.nonNull(schoolId)) {
-                role.setSchoolId(schoolId);
-            }
+
+            // 组装角色
+            SysRole role = new SysRole();
+            role.setId(sysRolePrivilegeParams.getId());
+            role.setSchoolId(schoolId);
+            role.setName(sysRolePrivilegeParams.getName());
+            role.setInterpret(sysRolePrivilegeParams.getInterpret());
+            role.setPrivilegeIds(sysRolePrivilegeParams.getPrivilegeIds().stream().map(SystemConstant::convertIdToLong).toArray(Long[]::new));
+            role.setDefaultRole(sysRolePrivilegeParams.getDefaultRole() == null ? false : sysRolePrivilegeParams.getDefaultRole());
+
+            List<SysRole> sysRoleList = this.list();
             // 内置角色检验
-            if(role.getDefaultRole()){
-                List<SysRole> roleList = this.list(new QueryWrapper<SysRole>().lambda()
-                                .eq(SysRole::getDefaultRole, true)
-                                .eq(SysRole::getEnable, true))
-                        .stream()
-                        .filter(m->m.getName().equals(role.getName()) && !m.getId().equals(role.getId()))
-                        .distinct()
-                        .collect(Collectors.toList());
-                String roleName = role.getName();
-                if (!roleList.isEmpty()) {
-                    throw ExceptionResultEnum.ERROR.exception("已存在相同的角色名称");
+            if (role.getDefaultRole()) {
+                // 校验在内置角色中是否存在相同名称角色
+                List<SysRole> defaultRoleList = sysRoleList.stream().filter(m -> m.getSchoolId() == null && m.getName().equals(role.getName()) && !m.getId().equals(role.getId())).distinct().collect(Collectors.toList());
+                if (!CollectionUtils.isEmpty(defaultRoleList)) {
+                    throw ExceptionResultEnum.ERROR.exception("内置角色中已存在名称[" + role.getName() + "]的角色");
+                }
+                // 校验在学校角色中是否存在相同名称角色
+                List<SysRole> schoolRoleList = sysRoleList.stream().filter(m -> m.getSchoolId() != null && m.getName().equals(role.getName())).distinct().collect(Collectors.toList());
+                if (!CollectionUtils.isEmpty(schoolRoleList)) {
+                    throw ExceptionResultEnum.ERROR.exception("学校角色中已存在名称[" + role.getName() + "]的角色");
                 }
             } else {
-                // 系统默认内置角色(不允许和系统默认角色重名)
-                List<String> defaultRoleNames = this.list(new QueryWrapper<SysRole>().lambda()
-                                .eq(SysRole::getDefaultRole, true)
-                                .eq(SysRole::getEnable, true))
-                        .stream()
-                        .map(SysRole::getName)
-                        .distinct()
-                        .collect(Collectors.toList());
-                String roleName = role.getName();
-                if (defaultRoleNames.contains(roleName)) {
-                    throw ExceptionResultEnum.ERROR.exception("系统角色已存在相同的角色名称");
+                // 校验在内置角色中是否存在相同名称角色
+                List<SysRole> defaultRoleList = sysRoleList.stream().filter(m -> m.getSchoolId() == null && m.getName().equals(role.getName())).distinct().collect(Collectors.toList());
+                if (!CollectionUtils.isEmpty(defaultRoleList)) {
+                    throw ExceptionResultEnum.ERROR.exception("内置角色中已存在名称[" + role.getName() + "]的角色");
                 }
-            }
-            if (Objects.nonNull(role.getId())) {//编辑
-                List<SysRolePrivilege> sysRolePrivilegeList = commonCacheService.rolePrivilegeCache(role.getId());
-                QueryWrapper<SysPrivilege> sysPrivilegeQueryWrapper = new QueryWrapper<>();
-                sysPrivilegeQueryWrapper.lambda().in(SysPrivilege::getId, role.getPrivilegeIds());
-                List<SysPrivilege> sysPrivilegeList = sysPrivilegeService.list(sysPrivilegeQueryWrapper);
-                Set<String> relatedSet = sysPrivilegeList.stream().filter(s -> Objects.nonNull(s.getRelated())).map(s -> s.getRelated()).collect(Collectors.toSet());
-                Set<Long> finalRelatedSet = new HashSet<>(Arrays.asList(role.getPrivilegeIds()));
-                for (String s : relatedSet) {
-                    if (s.contains(",")) {
-                        String[] arrays = s.split(",");
-                        for (int i = 0; i < arrays.length; i++) {
-                            finalRelatedSet.add(Long.parseLong(arrays[i].trim()));
-                        }
-                    } else {
-                        finalRelatedSet.add(Long.parseLong(s));
-                    }
+                // 校验在学校角色中是否存在相同名称角色
+                List<SysRole> schoolRoleList = sysRoleList.stream().filter(m -> m.getSchoolId().equals(schoolId) && m.getName().equals(role.getName()) && !m.getId().equals(role.getId())).distinct().collect(Collectors.toList());
+                if (!CollectionUtils.isEmpty(schoolRoleList)) {
+                    throw ExceptionResultEnum.ERROR.exception("学校角色中已存在名称[" + role.getName() + "]的角色");
                 }
-                List<Long> relatedList = new ArrayList<>(finalRelatedSet);
-                int count = (int) sysRolePrivilegeList.stream().filter(s -> relatedList.contains(s.getPrivilegeId())).count();
+            }
+
+            //编辑
+            if (Objects.nonNull(role.getId())) {
                 role.updateInfo(sysUser.getId());
                 sysRoleService.updateById(role);
                 commonCacheService.updateRoleCache(role.getId());
 
-                if (count != sysRolePrivilegeList.size() || count != finalRelatedSet.size()) {
-                    sysRolePrivilegeService.removeByRoleId(role.getId());
-                    sysRolePrivilegeService.saveBatch(role);//角色权限
+                boolean isChange = sysRolePrivilegeService.saveBatch(role);//角色权限
+
+                if (isChange) {
                     commonCacheService.updateRolePrivilegeCache(role.getId());
                     //绑定该角色的用户都需要清除鉴权缓存
                     List<SysUserRole> sysUserRoleList = sysUserRoleService.listByRoleId(role.getId());
@@ -147,6 +139,12 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
                 sysRolePrivilegeService.saveBatch(role);//角色权限
                 commonCacheService.updateCustomRoleCache();
             }
+
+            // 组装角色权限
+            Long roleId = role.getId();
+            // 数据权限集合
+            List<DataPermissionInfo> dataPermissionInfoList = sysRolePrivilegeParams.getDataPermissionInfo();
+            basicRoleDataPermissionService.saveRoleDataPermission(roleId, dataPermissionInfoList);
         } catch (Exception e) {
             if (e instanceof DuplicateKeyException) {
                 String errorColumn = e.getCause().toString();
@@ -353,7 +351,7 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
     public List<SysRole> listToAdmin() {
         QueryWrapper<SysRole> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().isNull(SysRole::getSchoolId)
-                .and(s->s.ne(SysRole::getType, RoleTypeEnum.ADMIN).or().isNull(SysRole::getType))
+                .and(s -> s.ne(SysRole::getType, RoleTypeEnum.ADMIN).or().isNull(SysRole::getType))
                 .eq(SysRole::getEnable, true)
                 .orderByAsc(SysRole::getId);
         return this.list(queryWrapper);
@@ -370,7 +368,7 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
         sysRoleQueryWrapper.lambda().eq(SysRole::getDefaultRole, true)
                 .eq(SysRole::getEnable, true)
                 .isNull(SysRole::getSchoolId)
-                .and(l->l.ne(SysRole::getType, SystemConstant.ADMIN_CODE.toUpperCase()).or().isNull(SysRole::getType))
+                .and(l -> l.ne(SysRole::getType, SystemConstant.ADMIN_CODE.toUpperCase()).or().isNull(SysRole::getType))
                 .orderByAsc(SysRole::getId);
         return sysRoleService.list(sysRoleQueryWrapper);
     }

+ 4 - 0
teachcloud-common/src/main/resources/mapper/SysRolePrivilegeCustomMapper.xml

@@ -0,0 +1,4 @@
+<?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.SysRolePrivilegeCustomMapper">
+</mapper>

+ 9 - 1
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SysPrivilegeController.java

@@ -3,7 +3,9 @@ package com.qmth.teachcloud.report.api;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysPrivilege;
+import com.qmth.teachcloud.common.entity.SysRole;
 import com.qmth.teachcloud.common.service.SysPrivilegeService;
+import com.qmth.teachcloud.common.service.SysRoleService;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import io.swagger.annotations.Api;
@@ -11,6 +13,8 @@ import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
+
 /**
  * <p>
  * 菜单权限表 前端控制器
@@ -27,6 +31,9 @@ public class SysPrivilegeController {
     @Autowired
     private SysPrivilegeService sysPrivilegeService;
 
+    @Resource
+    private SysRoleService sysRoleService;
+
     /**
      * 查询
      *
@@ -82,7 +89,8 @@ public class SysPrivilegeController {
     @ApiOperation(value = "角色已绑定权限列表")
     @RequestMapping(value = "/get_role_privileges", method = RequestMethod.POST)
     public Result getRolePrivileges(@RequestParam(value = "roleId", required = true) Long roleId) {
-        return ResultUtil.ok(sysPrivilegeService.getRolePrivileges(roleId));
+        SysRole sysRole = sysRoleService.getById(roleId);
+        return ResultUtil.ok(sysPrivilegeService.getRolePrivileges(sysRole));
     }
 }
 

+ 2 - 2
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/AutoSyncJob.java → teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/AutoSyncStudentJob.java

@@ -12,8 +12,8 @@ import javax.annotation.Resource;
 /**
  * 自动同步考生定时任务
  */
-public class AutoSyncJob extends QuartzJobBean {
-    private final static Logger log = LoggerFactory.getLogger(AutoSyncJob.class);
+public class AutoSyncStudentJob extends QuartzJobBean {
+    private final static Logger log = LoggerFactory.getLogger(AutoSyncStudentJob.class);
 
     @Resource
     JobService jobService;

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

@@ -91,7 +91,7 @@ public class StartRunning implements CommandLineRunner {
         // 每天1点开始,每2小时一次
         log.info("增加自动同步考生定时任务 start");
         Map autoSyncStudentJobMap = new HashMap();
-        autoSyncStudentJobMap.computeIfAbsent("name", v -> AutoSyncJob.class.getName());
+        autoSyncStudentJobMap.computeIfAbsent("name", v -> AutoSyncStudentJob.class.getName());
         quartzService.deleteJob(JobEnum.SYNC_STUDENT_JOB.name(), JobEnum.SYNC_STUDENT_JOB_GROUP.name());
         quartzService.addJob(SendSmsExpireJob.class, JobEnum.SYNC_STUDENT_JOB.name(), JobEnum.SYNC_STUDENT_JOB_GROUP.name(), "0 0 1/2 * * ?", autoSyncStudentJobMap);
         log.info("增加自动同步考生定时任务 end");