Sfoglia il codice sorgente

Merge branch 'dev_v2.2.1' into release_v2.2.1
merge

wangliang 3 anni fa
parent
commit
5c3d7cdb66
43 ha cambiato i file con 1015 aggiunte e 355 eliminazioni
  1. 80 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/DirectorApproveByJxzyyListener.java
  2. 3 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/DirectorApproveListener.java
  3. 2 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/PresidentApproveListener.java
  4. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/FlowTaskApproveParam.java
  5. 2 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TFFlowApprove.java
  6. 7 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ActivitiService.java
  7. 336 197
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ActivitiServiceImpl.java
  8. 32 8
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java
  9. 1 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskDetailServiceImpl.java
  10. 8 15
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  11. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCourseDataImportService.java
  12. 50 27
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java
  13. 1 1
      distributed-print-business/src/main/resources/mapper/TSyncExamStudentScoreMapper.xml
  14. 3 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/BasicCourseController.java
  15. 1 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskController.java
  16. 2 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/TFFlowController.java
  17. 3 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/TSyncExamStudentScoreController.java
  18. 8 9
      distributed-print/src/main/resources/application-dev.properties
  19. 69 0
      distributed-print/src/main/resources/processes/JxzyydxPaperApprove.bpmn
  20. 6 6
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/BasicCourseParams.java
  21. 3 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  22. 2 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FlowApproveNameEnum.java
  23. 5 5
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FlowApproveSetupEnum.java
  24. 53 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FlowSchoolCodeEnum.java
  25. 2 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/BasicCourseMapper.java
  26. 9 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/SysOrgMapper.java
  27. 2 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/BasicCourseService.java
  28. 10 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/BasicStudentService.java
  29. 3 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/BasicUserCourseService.java
  30. 9 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysOrgService.java
  31. 28 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysUserService.java
  32. 27 26
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicCourseServiceImpl.java
  33. 9 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicStudentServiceImpl.java
  34. 3 3
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicUserCourseServiceImpl.java
  35. 12 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysOrgServiceImpl.java
  36. 130 22
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysUserServiceImpl.java
  37. 3 0
      teachcloud-common/src/main/resources/mapper/BasicCourseMapper.xml
  38. 9 0
      teachcloud-common/src/main/resources/mapper/SysOrgMapper.xml
  39. 2 3
      teachcloud-task/src/main/resources/application-task.properties
  40. 3 1
      teachcloud-task/src/main/resources/application-task_36dev.properties
  41. 3 1
      teachcloud-task/src/main/resources/application-task_release.properties
  42. 3 1
      teachcloud-task/src/main/resources/application-task_test.properties
  43. 69 0
      teachcloud-task/src/main/resources/processes/JxzyydxPaperApprove.bpmn

+ 80 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/DirectorApproveByJxzyyListener.java

@@ -0,0 +1,80 @@
+package com.qmth.distributed.print.business.activiti;
+
+import com.google.common.reflect.TypeToken;
+import com.google.gson.Gson;
+import com.qmth.distributed.print.business.entity.ExamTask;
+import com.qmth.distributed.print.business.entity.TFFlowApprove;
+import com.qmth.distributed.print.business.enums.MessageEnum;
+import com.qmth.distributed.print.business.service.BasicMessageService;
+import com.qmth.distributed.print.business.service.ExamTaskService;
+import com.qmth.distributed.print.business.service.TFFlowApproveService;
+import com.qmth.teachcloud.common.bean.params.ApproveUserResult;
+import com.qmth.teachcloud.common.contant.SpringContextHolder;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.FlowApproveNameEnum;
+import com.qmth.teachcloud.common.enums.FlowApproveSetupEnum;
+import com.qmth.teachcloud.common.enums.FlowStatusEnum;
+import com.qmth.teachcloud.common.service.SysUserService;
+import com.qmth.teachcloud.common.util.JacksonUtil;
+import org.activiti.engine.delegate.DelegateTask;
+import org.activiti.engine.delegate.TaskListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 教研室主任审批
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/11/10
+ */
+public class DirectorApproveByJxzyyListener implements TaskListener {
+    private final static Logger log = LoggerFactory.getLogger(DirectorApproveByJxzyyListener.class);
+
+    /**
+     * 查找同级和以上人员
+     *
+     * @param delegateTask
+     */
+    @Override
+    public void notify(DelegateTask delegateTask) {
+        SysUserService sysUserService = SpringContextHolder.getBean(SysUserService.class);
+        ExamTaskService examTaskService = SpringContextHolder.getBean(ExamTaskService.class);
+        BasicMessageService basicMessageService = SpringContextHolder.getBean(BasicMessageService.class);
+        TFFlowApproveService tfFlowApproveService = SpringContextHolder.getBean(TFFlowApproveService.class);
+        List<Long> approveUserIds = (List<Long>) delegateTask.getVariable(SystemConstant.APPROVE_DIRECTOR_USER_IDS);
+        String flowId = delegateTask.getProcessInstanceId();
+        ExamTask examTask = examTaskService.findByFlowId(Long.parseLong(flowId));
+        List<ApproveUserResult> sysUserList = null;
+        if (Objects.nonNull(approveUserIds) && approveUserIds.size() > 0) {
+            List<SysUser> sysUsers = sysUserService.listByIds(approveUserIds);
+            sysUserList = new Gson().fromJson(JacksonUtil.parseJson(sysUsers), new TypeToken<List<ApproveUserResult>>() {
+            }.getType());
+            delegateTask.addCandidateUsers(approveUserIds.stream().map(x -> String.valueOf(x)).collect(Collectors.toList()));
+        } else {
+            sysUserList = sysUserService.findByJxzyyDirectorApprove(null, FlowApproveNameEnum.DIRECTOR);
+            if (Objects.nonNull(sysUserList) && sysUserList.size() > 0) {
+                List<String> ids = sysUserList.stream().map(s -> String.valueOf(s.getId())).collect(Collectors.toList());
+                //添加或签的人员,一人通过即可进入下一环节
+                delegateTask.addCandidateUsers(ids);
+            }
+        }
+        // 发送审核短信
+        TFFlowApprove tfFlowApprove = tfFlowApproveService.findByFlowId(Long.valueOf(flowId));
+        if (tfFlowApprove.getStatus().equals(FlowStatusEnum.AUDITING)
+                && tfFlowApprove.getSetup().equals(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup())) {
+            basicMessageService.sendNoticeTaskAuditFlow(examTask, sysUserList, MessageEnum.NOTICE_OF_AUDIT_CREATED);
+        }
+
+        // 驳回短信(驳回给主任)
+        if (tfFlowApprove.getStatus().equals(FlowStatusEnum.REJECT)
+                && tfFlowApprove.getSetup().equals(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup())) {
+            basicMessageService.sendNoticeTaskAuditFlow(examTask, sysUserList, MessageEnum.NOTICE_OF_AUDIT_REJECT);
+        }
+    }
+}

+ 3 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/DirectorApproveListener.java

@@ -12,7 +12,7 @@ import com.qmth.teachcloud.common.bean.params.ApproveUserResult;
 import com.qmth.teachcloud.common.contant.SpringContextHolder;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
-import com.qmth.teachcloud.common.enums.FlowGdykdxApproveSetupEnum;
+import com.qmth.teachcloud.common.enums.FlowApproveSetupEnum;
 import com.qmth.teachcloud.common.enums.FlowStatusEnum;
 import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.util.JacksonUtil;
@@ -66,13 +66,13 @@ public class DirectorApproveListener implements TaskListener {
         // 发送审核短信
         TFFlowApprove tfFlowApprove = tfFlowApproveService.findByFlowId(Long.valueOf(flowId));
         if (tfFlowApprove.getStatus().equals(FlowStatusEnum.AUDITING)
-                && tfFlowApprove.getSetup().equals(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup())) {
+                && tfFlowApprove.getSetup().equals(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup())) {
             basicMessageService.sendNoticeTaskAuditFlow(examTask, sysUserList, MessageEnum.NOTICE_OF_AUDIT_CREATED);
         }
 
         // 驳回短信(驳回给主任)
         if (tfFlowApprove.getStatus().equals(FlowStatusEnum.REJECT)
-                && tfFlowApprove.getSetup().equals(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup())) {
+                && tfFlowApprove.getSetup().equals(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup())) {
             basicMessageService.sendNoticeTaskAuditFlow(examTask, sysUserList, MessageEnum.NOTICE_OF_AUDIT_REJECT);
         }
     }

+ 2 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/PresidentApproveListener.java

@@ -13,7 +13,7 @@ import com.qmth.teachcloud.common.contant.SpringContextHolder;
 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.FlowGdykdxApproveSetupEnum;
+import com.qmth.teachcloud.common.enums.FlowApproveSetupEnum;
 import com.qmth.teachcloud.common.enums.FlowStatusEnum;
 import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.util.JacksonUtil;
@@ -73,7 +73,7 @@ public class PresidentApproveListener implements TaskListener {
         // 发送审核短信
         TFFlowApprove tfFlowApprove = tfFlowApproveService.findByFlowId(Long.valueOf(flowId));
         if (tfFlowApprove.getStatus().equals(FlowStatusEnum.AUDITING)
-                && tfFlowApprove.getSetup().equals(FlowGdykdxApproveSetupEnum.SECOND_APPROVE.getSetup())) {
+                && tfFlowApprove.getSetup().equals(FlowApproveSetupEnum.SECOND_APPROVE.getSetup())) {
             basicMessageService.sendNoticeTaskAuditFlow(examTask, sysUserList, MessageEnum.NOTICE_OF_AUDIT_CREATED);
         }
     }

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/FlowTaskApproveParam.java

@@ -22,7 +22,7 @@ public class FlowTaskApproveParam implements Serializable {
     @NotNull(message = "流程任务id不能为空")
     private String taskId;
 
-    @ApiModelProperty(value = "是否启用,0:停用,1:启用")
+    @ApiModelProperty(value = "流程审核操作")
     private FlowApprovePassEnum approvePass;
 
     @ApiModelProperty(value = "流程审核意见")

+ 2 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TFFlowApprove.java

@@ -1,15 +1,13 @@
 package com.qmth.distributed.print.business.entity;
 
-import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.distributed.print.business.enums.FlowModelEnum;
 import com.qmth.teachcloud.common.base.BaseEntity;
 import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.enums.FlowGdykdxApproveSetupEnum;
+import com.qmth.teachcloud.common.enums.FlowApproveSetupEnum;
 import com.qmth.teachcloud.common.enums.FlowStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -67,7 +65,7 @@ public class TFFlowApprove extends BaseEntity implements Serializable {
         this.approveId = approveId;
         this.status = status;
         insertInfo(userId);
-        this.setup = FlowGdykdxApproveSetupEnum.SUBMIT.getSetup();
+        this.setup = FlowApproveSetupEnum.SUBMIT.getSetup();
         this.model = model;
     }
 

+ 7 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ActivitiService.java

@@ -40,6 +40,13 @@ public interface ActivitiService {
      */
     public ProcessInstance startActivity(String processKey, Map<String, Object> map);
 
+    /**
+     * 启动流程
+     *
+     * @param map
+     */
+    public ProcessInstance flowStart(Map<String, Object> map);
+
     /**
      * 流程终止
      *

+ 336 - 197
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ActivitiServiceImpl.java

@@ -15,6 +15,7 @@ import com.qmth.distributed.print.business.enums.FlowModelEnum;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.teachcloud.common.bean.params.ApproveUserResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+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.enums.*;
@@ -140,6 +141,25 @@ public class ActivitiServiceImpl implements ActivitiService {
         return processInstance;
     }
 
+    /**
+     * 启动流程
+     *
+     * @param map
+     * @return
+     */
+    @Override
+    public ProcessInstance flowStart(Map<String, Object> map) {
+        BasicSchool basicSchool = (BasicSchool) ServletUtil.getRequestSchool();
+        ProcessInstance processInstance = null;
+        //广东医科大学
+        if (Objects.equals(basicSchool.getCode(), FlowSchoolCodeEnum.GDYKDX.getCode())) {
+            processInstance = this.startActivity(SystemConstant.GDYKDX_FLOW_KEY, map);
+        } else if (Objects.equals(basicSchool.getCode(), FlowSchoolCodeEnum.JXZYYDX.getCode())) {//江西中医药大学
+            processInstance = this.startActivity(SystemConstant.JXZYY_FLOW_KEY, map);
+        }
+        return processInstance;
+    }
+
     /**
      * 根据流程id直接结束流程
      *
@@ -155,7 +175,7 @@ public class ActivitiServiceImpl implements ActivitiService {
         try {
             Task task = taskService.createTaskQuery().processInstanceId(flowId).singleResult();
             SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-            runtimeService.deleteProcessInstance(flowId, FlowGdykdxApproveSetupEnum.END.getTitle());
+            runtimeService.deleteProcessInstance(flowId, FlowApproveSetupEnum.END.getTitle());
             //流程审批
             QueryWrapper<TFFlowApprove> tfFlowApproveQueryWrapper = new QueryWrapper<>();
             tfFlowApproveQueryWrapper.lambda().eq(TFFlowApprove::getFlowId, Long.parseLong(flowId));
@@ -166,16 +186,16 @@ public class ActivitiServiceImpl implements ActivitiService {
                 tfFlowApprove = new TFFlowApprove(sysUser.getSchoolId(), sysUser.getOrgId(), Long.parseLong(flowId), sysUser.getId(), FlowStatusEnum.END, sysUser.getId(), count == 0 ? FlowModelEnum.CHOOSE : FlowModelEnum.SYSTEM);
             } else {
                 tfFlowApprove.setStatus(FlowStatusEnum.END);
-                tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.END.getSetup());
+                tfFlowApprove.setSetup(FlowApproveSetupEnum.END.getSetup());
                 tfFlowApprove.updateInfo(sysUser.getId());
             }
             tfFlowApproveService.saveOrUpdate(tfFlowApprove);
 
             //流程流水日志
             ExamTask examTask = examTaskService.findByFlowId(Long.parseLong(flowId));
-            TFFlowLog tfFlowLog = new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), Long.parseLong(flowId), examTask.getId(), sysUser.getId(), sysUser.getId(), FlowGdykdxApproveSetupEnum.END.getTitle());
+            TFFlowLog tfFlowLog = new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), Long.parseLong(flowId), examTask.getId(), sysUser.getId(), sysUser.getId(), FlowApproveSetupEnum.END.getTitle());
             tfFlowLog.setApproveOperation(FlowApproveOperationEnum.END);
-            tfFlowLog.setApproveSetup(FlowGdykdxApproveSetupEnum.END.getSetup());
+            tfFlowLog.setApproveSetup(FlowApproveSetupEnum.END.getSetup());
             tfFlowLogService.save(tfFlowLog);
 
             if (Objects.nonNull(task)) {
@@ -187,33 +207,37 @@ public class ActivitiServiceImpl implements ActivitiService {
                 FlowNode currFlow = (FlowNode) bpmnModel.getMainProcess().getFlowElement(currActivityId);
                 if (currFlow instanceof UserTask) {
                     UserTask userTask = (UserTask) currFlow;
+                    //流程审批记录
+                    QueryWrapper<TFFlowApproveLog> tfFlowApproveLogQueryWrapper = new QueryWrapper<>();
+                    tfFlowApproveLogQueryWrapper.lambda().eq(TFFlowApproveLog::getFlowId, Long.parseLong(flowId))
+                            .eq(TFFlowApproveLog::getTaskId, examTask.getId());
+                    TFFlowApproveLog tfFlowApproveLog = tfFlowApproveLogService.getOne(tfFlowApproveLogQueryWrapper);
+                    if (Objects.isNull(tfFlowApproveLog)) {
+                        tfFlowApproveLog = new TFFlowApproveLog(sysUser.getSchoolId(), sysUser.getOrgId(), Long.parseLong(flowId), examTask.getId(), sysUser.getId(), sysUser.getId());
+                    }
+                    FlowApproveSetupEnum setupEnum = FlowApproveSetupEnum.convertToInstance(userTask.getId());
                     //广东医科大学流程
                     if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.GDYKDX_FLOW_KEY)) {
-                        //流程审批记录
-                        QueryWrapper<TFFlowApproveLog> tfFlowApproveLogQueryWrapper = new QueryWrapper<>();
-                        tfFlowApproveLogQueryWrapper.lambda().eq(TFFlowApproveLog::getFlowId, Long.parseLong(flowId))
-                                .eq(TFFlowApproveLog::getTaskId, examTask.getId());
-                        TFFlowApproveLog tfFlowApproveLog = tfFlowApproveLogService.getOne(tfFlowApproveLogQueryWrapper);
-                        if (Objects.isNull(tfFlowApproveLog)) {
-                            tfFlowApproveLog = new TFFlowApproveLog(sysUser.getSchoolId(), sysUser.getOrgId(), Long.parseLong(flowId), examTask.getId(), sysUser.getId(), sysUser.getId());
-                        }
-
-                        FlowGdykdxApproveSetupEnum setupEnum = FlowGdykdxApproveSetupEnum.convertToInstance(userTask.getId());
-                        if (setupEnum == FlowGdykdxApproveSetupEnum.SUBMIT) {//命题
-                            tfFlowApproveLog.setStartId(sysUser.getId());
-                            tfFlowApproveLog.setRemark(FlowGdykdxApproveSetupEnum.SUBMIT.getTitle() + FlowApproveOperationEnum.END.getTitle());
-                        } else if (setupEnum == FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE) {//主任
-                            tfFlowApproveLog.setPrimaryApproveId(sysUser.getId());
-                            tfFlowApproveLog.setPrimaryApproveOperation(FlowApproveOperationEnum.END);
-                            tfFlowApproveLog.setPrimaryApproveRemark(FlowApproveOperationEnum.END.getTitle());
-                        } else if (setupEnum == FlowGdykdxApproveSetupEnum.SECOND_APPROVE) {//院长
+                        if (setupEnum == FlowApproveSetupEnum.SUBMIT) {//命题
+                            assignFlowEnd(tfFlowApproveLog, sysUser);
+                        } else if (setupEnum == FlowApproveSetupEnum.PRIMARY_APPROVE) {//主任
+                            directorFlowEnd(tfFlowApproveLog, sysUser);
+                        } else if (setupEnum == FlowApproveSetupEnum.SECOND_APPROVE) {//院长
                             tfFlowApproveLog.setSecondApproveId(sysUser.getId());
                             tfFlowApproveLog.setSecondApproveOperation(FlowApproveOperationEnum.END);
                             tfFlowApproveLog.setSecondApproveRemark(FlowApproveOperationEnum.END.getTitle());
                         }
-                        tfFlowApproveLog.updateInfo(sysUser.getId());
-                        tfFlowApproveLogService.saveOrUpdate(tfFlowApproveLog);
                     }
+                    //江西中医药大学
+                    else if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.JXZYY_FLOW_KEY)) {
+                        if (setupEnum == FlowApproveSetupEnum.SUBMIT) {//命题
+                            assignFlowEnd(tfFlowApproveLog, sysUser);
+                        } else if (setupEnum == FlowApproveSetupEnum.PRIMARY_APPROVE) {//主任
+                            directorFlowEnd(tfFlowApproveLog, sysUser);
+                        }
+                    }
+                    tfFlowApproveLog.updateInfo(sysUser.getId());
+                    tfFlowApproveLogService.saveOrUpdate(tfFlowApproveLog);
                 }
             }
 
@@ -241,15 +265,10 @@ public class ActivitiServiceImpl implements ActivitiService {
      */
     public void flowApproveStart(Map<String, Object> map) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-
-        if (Objects.isNull(map.get(SystemConstant.FLOW_ID))) {
-            throw ExceptionResultEnum.ERROR.exception("流程id不能为空");
-        }
+        Optional.ofNullable(map.get(SystemConstant.FLOW_ID)).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程id不能为空"));
         Long flowId = Long.parseLong(map.get(SystemConstant.FLOW_ID).toString());
 
-        if (Objects.isNull(map.get(SystemConstant.FLOW_STATUS))) {
-            throw ExceptionResultEnum.ERROR.exception("流程状态不能为空");
-        }
+        Optional.ofNullable(map.get(SystemConstant.FLOW_STATUS)).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程状态不能为空"));
         FlowStatusEnum flowStatusEnum = (FlowStatusEnum) map.get(SystemConstant.FLOW_STATUS);
 
         Long approveId = Objects.nonNull(map.get(SystemConstant.APPROVE_ID)) ? Long.parseLong(String.valueOf(map.get(SystemConstant.APPROVE_ID))) : null;
@@ -268,9 +287,7 @@ public class ActivitiServiceImpl implements ActivitiService {
     public Map<String, Object> taskApprove(Map<String, Object> map) {
         String flowTaskId = null;
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        if (Objects.isNull(map.get(SystemConstant.FLOW_TASK_ID))) {
-            throw ExceptionResultEnum.ERROR.exception("流程任务id不能为空");
-        }
+        Optional.ofNullable(map.get(SystemConstant.FLOW_TASK_ID)).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程任务id不能为空"));
         flowTaskId = (String) map.get(SystemConstant.FLOW_TASK_ID);
         boolean lock = redisUtil.lock(SystemConstant.REDIS_LOCK_FLOW_TASK_PREFIX + flowTaskId, SystemConstant.REDIS_LOCK_FLOW_TASK_TIME_OUT);
         if (!lock) {
@@ -278,9 +295,7 @@ public class ActivitiServiceImpl implements ActivitiService {
         }
         try {
             Task task = taskService.createTaskQuery().taskId(flowTaskId).singleResult();
-            if (Objects.isNull(task)) {
-                throw ExceptionResultEnum.ERROR.exception("流程任务为空");
-            }
+            Optional.ofNullable(task).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程任务为空或该流程已被他人审核,请刷新再试!"));
             String processInstanceId = task.getProcessInstanceId();
             ExamTask examTask = examTaskService.findByFlowId(Long.parseLong(processInstanceId));
 
@@ -305,45 +320,20 @@ public class ActivitiServiceImpl implements ActivitiService {
             TFFlowLog tfFlowLog = null;
             if (currFlow instanceof UserTask) {
                 UserTask userTask = (UserTask) currFlow;
+                String remark = Objects.nonNull(map.get(SystemConstant.APPROVE_REMARK)) ? map.get(SystemConstant.APPROVE_REMARK).toString() : null;
+                //流程流水日志
+                tfFlowLog = new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), Long.parseLong(processInstanceId), examTask.getId(), sysUser.getId(), sysUser.getId(), remark);
+                FlowApproveSetupEnum setupEnum = FlowApproveSetupEnum.convertToInstance(userTask.getId());
+                if (Objects.isNull(tfFlowApproveLog)) {
+                    tfFlowApproveLog = new TFFlowApproveLog(sysUser.getSchoolId(), sysUser.getOrgId(), Long.parseLong(processInstanceId), examTask.getId(), sysUser.getId(), sysUser.getId());
+                }
                 //广东医科大学流程
                 if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.GDYKDX_FLOW_KEY)) {
-                    String remark = Objects.nonNull(map.get(SystemConstant.APPROVE_REMARK)) ? map.get(SystemConstant.APPROVE_REMARK).toString() : null;
-                    //流程流水日志
-                    tfFlowLog = new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), Long.parseLong(processInstanceId), examTask.getId(), sysUser.getId(), sysUser.getId(), remark);
-                    FlowGdykdxApproveSetupEnum setupEnum = FlowGdykdxApproveSetupEnum.convertToInstance(userTask.getId());
-                    if (setupEnum == FlowGdykdxApproveSetupEnum.SUBMIT) {//命题提交
-                        flowSubmitVaild(task, sysUser.getId());
-                        if (Objects.isNull(tfFlowApproveLog)) {
-                            tfFlowApproveLog = new TFFlowApproveLog(sysUser.getSchoolId(), sysUser.getOrgId(), Long.parseLong(processInstanceId), examTask.getId(), sysUser.getId(), sysUser.getId());
-                        }
-                        tfFlowLog.setApproveSetup(FlowGdykdxApproveSetupEnum.SUBMIT.getSetup());
-                        tfFlowLog.setApproveOperation(FlowApproveOperationEnum.SUBMIT);
-                        tfFlowApprove.setStatus(FlowStatusEnum.AUDITING);
-                        tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup());
-                        map.computeIfAbsent(SystemConstant.APPROVE_DIRECTOR_USER_IDS, v -> map.get(SystemConstant.APPROVE_USER_IDS));
-                    } else if (setupEnum == FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE) {//主任提交
-                        flowApproveVaild(task, sysUser.getId(), map);
-                        FlowApprovePassEnum approvePass = (FlowApprovePassEnum) map.get(SystemConstant.APPROVE_OPERATION);
-                        FlowApproveVariableEnum approve = approvePass == FlowApprovePassEnum.PASS ? FlowApproveVariableEnum.PRIMARY_APPROVE : FlowApproveVariableEnum.PRIMARY_REJECT;
-                        tfFlowLog.setApproveSetup(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup());
-                        tfFlowApproveLog.setPrimaryApproveId(sysUser.getId());
-                        tfFlowApproveLog.setPrimaryApproveRemark(remark);
-                        if (approve == FlowApproveVariableEnum.PRIMARY_REJECT) {//驳回命题
-                            tfFlowLog.setApproveOperation(FlowApproveOperationEnum.REJECT);
-                            tfFlowApproveLog.setPrimaryApproveOperation(FlowApproveOperationEnum.REJECT);
-                            tfFlowApprove.setStatus(FlowStatusEnum.REJECT);
-                            tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.SUBMIT.getSetup());
-                        } else if (approve == FlowApproveVariableEnum.PRIMARY_APPROVE) {//提交
-                            tfFlowLog.setApproveOperation(FlowApproveOperationEnum.APPROVE);
-                            tfFlowApproveLog.setPrimaryApproveOperation(FlowApproveOperationEnum.APPROVE);
-                            tfFlowApprove.setStatus(FlowStatusEnum.AUDITING);
-                            tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.SECOND_APPROVE.getSetup());
-                        } else {
-                            throw ExceptionResultEnum.ERROR.exception("流程变量值错误");
-                        }
-                        map.computeIfAbsent(SystemConstant.APPROVE, v -> approve.getId());
-                        map.computeIfAbsent(SystemConstant.APPROVE_PRESIDENT_USER_IDS, v -> map.get(SystemConstant.APPROVE_USER_IDS));
-                    } else if (setupEnum == FlowGdykdxApproveSetupEnum.SECOND_APPROVE) {//院长提交
+                    if (setupEnum == FlowApproveSetupEnum.SUBMIT) {//命题提交
+                        this.assignSubmit(task, sysUser, tfFlowApprove, tfFlowLog, map);
+                    } else if (setupEnum == FlowApproveSetupEnum.PRIMARY_APPROVE) {//主任提交
+                        this.directorSubmit(task, sysUser, tfFlowApprove, tfFlowApproveLog, tfFlowLog, remark, processDefinitionEntity, map);
+                    } else if (setupEnum == FlowApproveSetupEnum.SECOND_APPROVE) {//院长提交
                         flowApproveVaild(task, sysUser.getId(), map);
                         FlowApprovePassEnum approvePass = (FlowApprovePassEnum) map.get(SystemConstant.APPROVE_OPERATION);
                         FlowApproveVariableEnum approve = null;
@@ -352,41 +342,47 @@ public class ActivitiServiceImpl implements ActivitiService {
                         if (approvePass == FlowApprovePassEnum.PASS) {
                             approve = FlowApproveVariableEnum.SECOND_APPROVE;
                         } else {
-                            if (Objects.isNull(map.get(SystemConstant.APPROVE_SETUP))) {
-                                throw ExceptionResultEnum.ERROR.exception("流程驳回节点不能为空");
-                            }
+                            Optional.ofNullable(map.get(SystemConstant.APPROVE_SETUP)).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程驳回节点不能为空"));
                             Integer setup = Integer.parseInt(map.get(SystemConstant.APPROVE_SETUP).toString());
-                            if (setup.intValue() < FlowGdykdxApproveSetupEnum.SUBMIT.getSetup() || setup.intValue() >= FlowGdykdxApproveSetupEnum.SECOND_APPROVE.getSetup()) {
+                            if (setup.intValue() < FlowApproveSetupEnum.SUBMIT.getSetup() || setup.intValue() >= FlowApproveSetupEnum.SECOND_APPROVE.getSetup()) {
                                 throw ExceptionResultEnum.ERROR.exception("流程驳回节点有误");
                             }
                             approve = setup.intValue() == 1 ? FlowApproveVariableEnum.SECOND_REJECT_ONE : FlowApproveVariableEnum.SECOND_REJECT_TWO;
                         }
-                        tfFlowLog.setApproveSetup(FlowGdykdxApproveSetupEnum.SECOND_APPROVE.getSetup());
+                        tfFlowLog.setApproveSetup(FlowApproveSetupEnum.SECOND_APPROVE.getSetup());
                         if (approve == FlowApproveVariableEnum.SECOND_REJECT_ONE) {//驳回命题
                             tfFlowLog.setApproveOperation(FlowApproveOperationEnum.REJECT);
                             tfFlowApproveLog.setSecondApproveOperation(FlowApproveOperationEnum.REJECT);
                             tfFlowApprove.setStatus(FlowStatusEnum.REJECT);
-                            tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.SUBMIT.getSetup());
+                            tfFlowApprove.setSetup(FlowApproveSetupEnum.SUBMIT.getSetup());
                         } else if (approve == FlowApproveVariableEnum.SECOND_REJECT_TWO) {//驳回主任
                             tfFlowLog.setApproveOperation(FlowApproveOperationEnum.REJECT);
                             tfFlowApproveLog.setSecondApproveOperation(FlowApproveOperationEnum.REJECT);
                             tfFlowApprove.setStatus(FlowStatusEnum.REJECT);
-                            tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup());
+                            tfFlowApprove.setSetup(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup());
                         } else if (approve == FlowApproveVariableEnum.SECOND_APPROVE) {//提交
                             tfFlowLog.setApproveOperation(FlowApproveOperationEnum.APPROVE);
                             tfFlowApproveLog.setSecondApproveOperation(FlowApproveOperationEnum.APPROVE);
                             tfFlowApprove.setStatus(FlowStatusEnum.FINISH);
-                            tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.FINISH.getSetup());
+                            tfFlowApprove.setSetup(FlowApproveSetupEnum.FINISH.getSetup());
                         } else {
                             throw ExceptionResultEnum.ERROR.exception("流程变量值错误");
                         }
                         FlowApproveVariableEnum finalApprove = approve;
                         map.computeIfAbsent(SystemConstant.APPROVE, v -> finalApprove.getId());
                     }
-                    tfFlowApprove.updateInfo(sysUser.getId());
-                    tfFlowApproveLog.updateInfo(sysUser.getId());
+                }
+                //江西中医药大学
+                else if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.JXZYY_FLOW_KEY)) {
+                    if (setupEnum == FlowApproveSetupEnum.SUBMIT) {//命题提交
+                        this.assignSubmit(task, sysUser, tfFlowApprove, tfFlowLog, map);
+                    } else if (setupEnum == FlowApproveSetupEnum.PRIMARY_APPROVE) {//主任提交
+                        this.directorSubmit(task, sysUser, tfFlowApprove, tfFlowApproveLog, tfFlowLog, remark, processDefinitionEntity, map);
+                    }
                 }
             }
+            tfFlowApprove.updateInfo(sysUser.getId());
+            tfFlowApproveLog.updateInfo(sysUser.getId());
             tfFlowApprove.setApproveId(sysUser.getId());
             //当前实例的执行到哪个节点
             taskService.complete(String.valueOf(flowTaskId), map);
@@ -437,11 +433,8 @@ public class ActivitiServiceImpl implements ActivitiService {
             if (flowElement instanceof UserTask) {
                 UserTask userTask = (UserTask) flowElement;
                 if (Objects.nonNull(userTask)) {
-                    //广东药科大学流程
-                    if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.GDYKDX_FLOW_KEY)) {
-                        FlowGdykdxApproveSetupEnum flowGdykdxApproveSetupEnum = FlowGdykdxApproveSetupEnum.convertToInstance(userTask.getId());
-                        flowTaskResultList.add(new FlowTaskResult(Long.parseLong(flowId), userTask.getName(), flowGdykdxApproveSetupEnum.getId(), flowGdykdxApproveSetupEnum.getSetup()));
-                    }
+                    FlowApproveSetupEnum flowApproveSetupEnum = FlowApproveSetupEnum.convertToInstance(userTask.getId());
+                    flowTaskResultList.add(new FlowTaskResult(Long.parseLong(flowId), userTask.getName(), flowApproveSetupEnum.getId(), flowApproveSetupEnum.getSetup()));
                 }
             }
         }
@@ -483,19 +476,18 @@ public class ActivitiServiceImpl implements ActivitiService {
         List<FlowTaskApprovePeopleResult> flowTaskApprovePeopleResultList = null;
         if (Objects.nonNull(taskId) && !Objects.equals(taskId, "")) {//说明从已审核的节点开始捞人
             Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
-            if (Objects.isNull(task)) {
-                throw ExceptionResultEnum.ERROR.exception("流程任务为空");
-            }
+            Optional.ofNullable(task).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程任务为空或该流程已被他人审核,请刷新再试!"));
             flowTaskApprovePeopleAllResult = new FlowTaskApprovePeopleAllResult(Long.parseLong(task.getProcessInstanceId()));
             flowTaskApprovePeopleResultList = new LinkedList();
             //获取当前流程节点
             TFFlowApprove tfFlowApprove = tfFlowApproveService.findByFlowId(flowTaskApprovePeopleAllResult.getFlowId());
-            if (Objects.isNull(tfFlowApprove)) {
-                throw ExceptionResultEnum.ERROR.exception("未找到流程状态记录");
-            }
+            Optional.ofNullable(tfFlowApprove).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未找到流程状态记录"));
             if (tfFlowApprove.getSetup() <= 0) {
                 throw ExceptionResultEnum.ERROR.exception("流程已结束或已终止");
             }
+            String processDefinitionId = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult().getProcessDefinitionId();
+            ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(processDefinitionId);
+
             ExamTask examTask = examTaskService.findByFlowId(flowTaskApprovePeopleAllResult.getFlowId());
 
             IPage<FlowApproveResult> flowApproveResultIPage = tfFlowService.flowApproveList(new Page<>(SystemConstant.PAGE_NUMBER, SystemConstant.PAGE_SIZE), null, SystemConstant.getHeadOrUserSchoolId(), null, flowTaskApprovePeopleAllResult.getFlowId());
@@ -506,81 +498,107 @@ public class ActivitiServiceImpl implements ActivitiService {
             List<ApproveUserResult> approveUserMtResult = null;
             switch (tfFlowApprove.getSetup()) {
                 case -1:
-                    if (Objects.isNull(flowApproveResult)) {
-                        throw ExceptionResultEnum.ERROR.exception("未找到流程审批记录");
-                    }
+                    Optional.ofNullable(flowApproveResult).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未找到流程审批记录"));
                     if (Objects.nonNull(flowApproveResult.getStartId())) {
                         //获取命题已审
                         approveUserMtResult = sysUserService.findById(flowApproveResult.getStartId());
-                        flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowGdykdxApproveSetupEnum.SUBMIT.getSetup(), true, approveUserMtResult));
+                        flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.SUBMIT.getSetup(), true, approveUserMtResult));
                     }
                     if (Objects.nonNull(flowApproveResult.getPrimaryApproveId())) {
                         //获取主任已审
                         List<ApproveUserResult> approveUserDirectorList = sysUserService.findById(flowApproveResult.getPrimaryApproveId());
-                        flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup(), true, approveUserDirectorList));
+                        flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup(), true, approveUserDirectorList));
                     }
                     break;
                 case 0:
-                    if (Objects.isNull(flowApproveResult)) {
-                        throw ExceptionResultEnum.ERROR.exception("未找到流程审批记录");
+                    Optional.ofNullable(flowApproveResult).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未找到流程审批记录"));
+                    //广东医科大学流程
+                    if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.GDYKDX_FLOW_KEY)) {
+                        //获取命题已审
+                        approveUserMtResult = sysUserService.findById(flowApproveResult.getStartId());
+                        flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.SUBMIT.getSetup(), true, approveUserMtResult));
+                        //获取主任已审
+                        List<ApproveUserResult> approveUserDirectorList = sysUserService.findById(flowApproveResult.getPrimaryApproveId());
+                        flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup(), true, approveUserDirectorList));
+                        //获取院长已审
+                        List<ApproveUserResult> approveUserPresidentList = sysUserService.findById(flowApproveResult.getSecondApproveId());
+                        flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.SECOND_APPROVE.getSetup(), true, approveUserPresidentList));
+                    }
+                    //江西中医药大学
+                    else if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.JXZYY_FLOW_KEY)) {
+                        //获取命题已审
+                        approveUserMtResult = sysUserService.findById(flowApproveResult.getStartId());
+                        flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.SUBMIT.getSetup(), true, approveUserMtResult));
+                        //获取主任已审
+                        List<ApproveUserResult> approveUserDirectorList = sysUserService.findById(flowApproveResult.getPrimaryApproveId());
+                        flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup(), true, approveUserDirectorList));
                     }
-                    //获取命题已审
-                    approveUserMtResult = sysUserService.findById(flowApproveResult.getStartId());
-                    flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowGdykdxApproveSetupEnum.SUBMIT.getSetup(), true, approveUserMtResult));
-                    //获取主任已审
-                    List<ApproveUserResult> approveUserDirectorList = sysUserService.findById(flowApproveResult.getPrimaryApproveId());
-                    flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup(), true, approveUserDirectorList));
-                    //获取院长已审
-                    List<ApproveUserResult> approveUserPresidentList = sysUserService.findById(flowApproveResult.getSecondApproveId());
-                    flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowGdykdxApproveSetupEnum.SECOND_APPROVE.getSetup(), true, approveUserPresidentList));
                     break;
                 case 1:
                     if (tfFlowApprove.getModel() == FlowModelEnum.SYSTEM) {
-                        flowTaskApprovePeopleResultList = getApproveUserAll(examTask.getCourseCode(), flowTaskApprovePeopleResultList);
+                        flowTaskApprovePeopleResultList = getApproveUserAll(examTask.getCourseCode(), flowTaskApprovePeopleResultList, Objects.nonNull(processDefinitionEntity) ? processDefinitionEntity.getKey() : null);
                     } else {
-                        flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup(), false, new ArrayList<>()));
-                        flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowGdykdxApproveSetupEnum.SECOND_APPROVE.getSetup(), false, new ArrayList<>()));
+                        //广东医科大学流程
+                        if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.GDYKDX_FLOW_KEY)) {
+                            flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup(), false, new ArrayList<>()));
+                            flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.SECOND_APPROVE.getSetup(), false, new ArrayList<>()));
+                        }
+                        //江西中医药大学
+                        else if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.JXZYY_FLOW_KEY)) {
+                            flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup(), false, new ArrayList<>()));
+                        }
                     }
                     break;
                 case 2:
-                    if (Objects.isNull(flowApproveResult)) {
-                        throw ExceptionResultEnum.ERROR.exception("未找到流程审批记录");
-                    }
-                    //获取命题已审
-                    approveUserMtResult = sysUserService.findById(flowApproveResult.getStartId());
-                    flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowGdykdxApproveSetupEnum.SUBMIT.getSetup(), true, approveUserMtResult));
-
-                    if (tfFlowApprove.getModel() == FlowModelEnum.SYSTEM) {
-                        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-                        if (Objects.nonNull(sysUser.getOrgId())) {
-                            //获取院长审批人
-                            List<ApproveUserResult> sysUserPresidentList = sysUserService.findByPresidentApprove(Arrays.asList(sysUser.getOrgId()), null);
-                            flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowGdykdxApproveSetupEnum.SECOND_APPROVE.getSetup(), false, sysUserPresidentList));
+                    Optional.ofNullable(flowApproveResult).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未找到流程审批记录"));
+                    //广东医科大学流程
+                    if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.GDYKDX_FLOW_KEY)) {
+                        //获取命题已审
+                        approveUserMtResult = sysUserService.findById(flowApproveResult.getStartId());
+                        flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.SUBMIT.getSetup(), true, approveUserMtResult));
+
+                        if (tfFlowApprove.getModel() == FlowModelEnum.SYSTEM) {
+                            SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+                            if (Objects.nonNull(sysUser.getOrgId())) {
+                                //获取院长审批人
+                                List<ApproveUserResult> sysUserPresidentList = sysUserService.findByPresidentApprove(Arrays.asList(sysUser.getOrgId()), null);
+                                flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.SECOND_APPROVE.getSetup(), false, sysUserPresidentList));
+                            }
+                        } else {
+                            flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.SECOND_APPROVE.getSetup(), false, new ArrayList<>()));
                         }
-                    } else {
-                        flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowGdykdxApproveSetupEnum.SECOND_APPROVE.getSetup(), false, new ArrayList<>()));
+                    }
+                    //江西中医药大学
+                    else if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.JXZYY_FLOW_KEY)) {
+                        //获取命题已审
+                        approveUserMtResult = sysUserService.findById(flowApproveResult.getStartId());
+                        flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.SUBMIT.getSetup(), true, approveUserMtResult));
                     }
                     break;
                 case 3:
-                    if (Objects.isNull(flowApproveResult)) {
-                        throw ExceptionResultEnum.ERROR.exception("未找到流程审批记录");
-                    }
+                    Optional.ofNullable(flowApproveResult).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未找到流程审批记录"));
                     //获取命题已审
                     approveUserMtResult = sysUserService.findById(flowApproveResult.getStartId());
-                    flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowGdykdxApproveSetupEnum.SUBMIT.getSetup(), true, approveUserMtResult));
+                    flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.SUBMIT.getSetup(), true, approveUserMtResult));
                     //获取主任已审
                     List<ApproveUserResult> sysUserDirectorList = sysUserService.findById(flowApproveResult.getPrimaryApproveId());
-                    flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup(), true, sysUserDirectorList));
+                    flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup(), true, sysUserDirectorList));
                     break;
                 default:
                     break;
             }
         } else {//获取整个节点审批人
-            if (Objects.isNull(courseCode) || Objects.equals(courseCode, "")) {
-                throw ExceptionResultEnum.ERROR.exception("课程编码为空");
+            BasicSchool basicSchool = (BasicSchool) ServletUtil.getRequestSchool();
+            if (Objects.equals(basicSchool.getCode(), FlowSchoolCodeEnum.GDYKDX.getCode())) {
+                if (Objects.isNull(courseCode) || Objects.equals(courseCode, "")) {
+                    throw ExceptionResultEnum.ERROR.exception("课程编码为空");
+                }
+                flowTaskApprovePeopleResultList = getApproveUserAll(courseCode, flowTaskApprovePeopleResultList, SystemConstant.GDYKDX_FLOW_KEY);
+                flowTaskApprovePeopleAllResult = new FlowTaskApprovePeopleAllResult();
+            } else if (Objects.equals(basicSchool.getCode(), FlowSchoolCodeEnum.JXZYYDX.getCode())) {//江西中医药大学
+                flowTaskApprovePeopleResultList = getApproveUserAll(courseCode, flowTaskApprovePeopleResultList, SystemConstant.JXZYY_FLOW_KEY);
+                flowTaskApprovePeopleAllResult = new FlowTaskApprovePeopleAllResult();
             }
-            flowTaskApprovePeopleResultList = getApproveUserAll(courseCode, flowTaskApprovePeopleResultList);
-            flowTaskApprovePeopleAllResult = new FlowTaskApprovePeopleAllResult();
         }
         flowTaskApprovePeopleAllResult.setApproveUserList(flowTaskApprovePeopleResultList);
         return flowTaskApprovePeopleAllResult;
@@ -597,14 +615,10 @@ public class ActivitiServiceImpl implements ActivitiService {
     @Transactional
     public boolean taskApproverExchange(String userId, String taskId) {
         Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
-        if (Objects.isNull(task)) {
-            throw ExceptionResultEnum.ERROR.exception("流程任务为空");
-        }
+        Optional.ofNullable(task).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程任务为空或该流程已被他人审核,请刷新再试!"));
         Long flowId = Long.parseLong(task.getProcessInstanceId());
         TFFlowApprove tfFlowApprove = tfFlowApproveService.findByFlowId(flowId);
-        if (Objects.isNull(tfFlowApprove)) {
-            throw ExceptionResultEnum.ERROR.exception("未找到流程状态记录");
-        }
+        Optional.ofNullable(tfFlowApprove).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未找到流程状态记录"));
         if (tfFlowApprove.getSetup() <= 0) {
             throw ExceptionResultEnum.ERROR.exception("流程已结束或已终止");
         }
@@ -647,8 +661,6 @@ public class ActivitiServiceImpl implements ActivitiService {
 //        }
         ExamTask examTask = examTaskService.findByFlowId(flowId);
 
-        String processDefinitionId = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult().getProcessDefinitionId();
-        ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(processDefinitionId);
         //获取当前流程节点
         String currActivityId = task.getTaskDefinitionKey();
         BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
@@ -659,11 +671,8 @@ public class ActivitiServiceImpl implements ActivitiService {
         TFFlowLog tfFlowLog = new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), flowId, examTask.getId(), sysUser.getId(), sysUser.getRealName() + "转" + exchangeUser.getRealName() + "审批", FlowApproveOperationEnum.EXCHANGE);
         if (currFlow instanceof UserTask) {
             UserTask userTask = (UserTask) currFlow;
-            //广东医科大学流程
-            if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.GDYKDX_FLOW_KEY)) {
-                FlowGdykdxApproveSetupEnum setupEnum = FlowGdykdxApproveSetupEnum.convertToInstance(userTask.getId());
-                tfFlowLog.setApproveSetup(setupEnum.getSetup());
-            }
+            FlowApproveSetupEnum setupEnum = FlowApproveSetupEnum.convertToInstance(userTask.getId());
+            tfFlowLog.setApproveSetup(setupEnum.getSetup());
         }
         tfFlowLogService.save(tfFlowLog);
         return true;
@@ -680,37 +689,52 @@ public class ActivitiServiceImpl implements ActivitiService {
     public FlowTaskApprovePeopleAllResult taskApproverExchangePeople(String taskId, String realName) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
-        if (Objects.isNull(task)) {
-            throw ExceptionResultEnum.ERROR.exception("流程任务为空");
-        }
+        Optional.ofNullable(task).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程任务为空或该流程已被他人审核,请刷新再试!"));
         FlowTaskApprovePeopleAllResult flowTaskApprovePeopleAllResult = new FlowTaskApprovePeopleAllResult(Long.parseLong(task.getProcessInstanceId()));
         //获取当前流程节点
         TFFlowApprove tfFlowApprove = tfFlowApproveService.findByFlowId(flowTaskApprovePeopleAllResult.getFlowId());
-        if (Objects.isNull(tfFlowApprove)) {
-            throw ExceptionResultEnum.ERROR.exception("未找到流程状态记录");
-        }
+        Optional.ofNullable(tfFlowApprove).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未找到流程状态记录"));
         if (tfFlowApprove.getSetup() <= 0) {
             throw ExceptionResultEnum.ERROR.exception("流程已结束或已终止");
         }
+        String processDefinitionId = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult().getProcessDefinitionId();
+        ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(processDefinitionId);
+
         ExamTask examTask = null;
         List<FlowTaskApprovePeopleResult> flowTaskApprovePeopleResultList = new ArrayList<>();
         switch (tfFlowApprove.getSetup()) {
             case 1:
-                //获取命题审批人
-                examTask = examTaskService.findByFlowId(flowTaskApprovePeopleAllResult.getFlowId());
-                List<ApproveUserResult> approveUserResultList = sysUserService.findByAssignApprove(examTask.getCourseCode(), realName);
+                List<ApproveUserResult> approveUserResultList = null;
+                //广东医科大学流程
+                if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.GDYKDX_FLOW_KEY)) {
+                    //获取命题审批人
+                    examTask = examTaskService.findByFlowId(flowTaskApprovePeopleAllResult.getFlowId());
+                    approveUserResultList = sysUserService.findByAssignApprove(examTask.getCourseCode(), realName);
+                }
+                //江西中医药大学
+                else if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.JXZYY_FLOW_KEY)) {
+                    approveUserResultList = sysUserService.findByJxzyyAssignApprove(realName);
+                }
                 flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(approveUserResultList));
                 break;
             case 2:
                 examTask = examTaskService.findByFlowId(flowTaskApprovePeopleAllResult.getFlowId());
                 List<ApproveUserResult> sysUserDirectorList = null;
-                if (tfFlowApprove.getModel() == FlowModelEnum.SYSTEM) {
-                    //获取教研室主任审批人
-                    sysUserDirectorList = sysUserService.findByDirectorApprove(examTask.getCourseCode(), realName);
-                } else {
+                //广东医科大学流程
+                if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.GDYKDX_FLOW_KEY)) {
+                    if (tfFlowApprove.getModel() == FlowModelEnum.SYSTEM) {
+                        //获取教研室主任审批人
+                        sysUserDirectorList = sysUserService.findByDirectorApprove(examTask.getCourseCode(), realName);
+                    } else {
+                        //获取教研室主任审批人
+                        List<SysOrg> sysOrgList = sysOrgService.findByConnectByParentId(examTask.getTeachingRoomId(), true, true);
+                        sysUserDirectorList = sysUserService.findByRootApprove(null, sysOrgList.stream().map(s -> s.getId()).collect(Collectors.toList()), null, FlowApproveNameEnum.DIRECTOR);
+                    }
+                }
+                //江西中医药大学
+                else if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.JXZYY_FLOW_KEY)) {
                     //获取教研室主任审批人
-                    List<SysOrg> sysOrgList = sysOrgService.findByConnectByParentId(examTask.getTeachingRoomId(), true, true);
-                    sysUserDirectorList = sysUserService.findByRootApprove(null, sysOrgList.stream().map(s -> s.getId()).collect(Collectors.toList()), null, FlowApproveNameEnum.DIRECTOR);
+                    sysUserDirectorList = sysUserService.findByJxzyyDirectorApprove(realName, FlowApproveNameEnum.DIRECTOR);
                 }
                 flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(sysUserDirectorList));
                 break;
@@ -749,44 +773,59 @@ public class ActivitiServiceImpl implements ActivitiService {
         List<FlowTaskApprovePeopleResult> flowTaskApprovePeopleResultList = null;
         if (Objects.nonNull(taskId) && !Objects.equals(taskId, "")) {//说明从已审核的节点开始捞人
             Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
-            if (Objects.isNull(task)) {
-                throw ExceptionResultEnum.ERROR.exception("流程任务为空");
-            }
+            Optional.ofNullable(task).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程任务为空或该流程已被他人审核,请刷新再试!"));
+
             flowTaskApprovePeopleAllResult = new FlowTaskApprovePeopleAllResult(Long.parseLong(task.getProcessInstanceId()));
             //获取当前流程节点
             TFFlowApprove tfFlowApprove = tfFlowApproveService.findByFlowId(flowTaskApprovePeopleAllResult.getFlowId());
-            if (Objects.isNull(tfFlowApprove)) {
-                throw ExceptionResultEnum.ERROR.exception("未找到流程状态记录");
-            }
+            Optional.ofNullable(tfFlowApprove).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未找到流程状态记录"));
             if (tfFlowApprove.getSetup() <= 0) {
                 throw ExceptionResultEnum.ERROR.exception("流程已结束或已终止");
             }
             List<ApproveUserResult> approveUserResultList = null;
             flowTaskApprovePeopleResultList = new LinkedList<>();
 
+            String processDefinitionId = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult().getProcessDefinitionId();
+            ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(processDefinitionId);
+
             ExamTask examTask = examTaskService.findByFlowId(flowTaskApprovePeopleAllResult.getFlowId());
             List<SysOrg> sysOrgList = sysOrgService.findByConnectByParentId(examTask.getTeachingRoomId(), true, true);
             switch (tfFlowApprove.getSetup()) {
                 case 1:
-                    //获取教研室主任审批人
-                    approveUserResultList = sysUserService.findByRootApprove(null, sysOrgList.stream().map(s -> s.getId()).collect(Collectors.toList()), null, FlowApproveNameEnum.DIRECTOR);
-                    flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup(), false, approveUserResultList));
+                    //广东医科大学流程
+                    if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.GDYKDX_FLOW_KEY)) {
+                        //获取教研室主任审批人
+                        approveUserResultList = sysUserService.findByRootApprove(null, sysOrgList.stream().map(s -> s.getId()).collect(Collectors.toList()), null, FlowApproveNameEnum.DIRECTOR);
+                        flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup(), false, approveUserResultList));
+                    }
+                    //江西中医药大学
+                    else if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.JXZYY_FLOW_KEY)) {
+                        //获取教研室主任审批人
+                        approveUserResultList = sysUserService.findByJxzyyDirectorApprove(null, FlowApproveNameEnum.DIRECTOR);
+                        flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup(), false, approveUserResultList));
+                    }
                     break;
                 case 2:
                     //获取院长审批人
                     approveUserResultList = sysUserService.findByRootApprove(null, sysOrgList.stream().map(s -> s.getId()).collect(Collectors.toList()), null, FlowApproveNameEnum.PRESIDENT);
-                    flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowGdykdxApproveSetupEnum.SECOND_APPROVE.getSetup(), false, approveUserResultList));
+                    flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.SECOND_APPROVE.getSetup(), false, approveUserResultList));
                     break;
                 default:
                     break;
             }
         } else {//获取整个节点审批人
-            if (Objects.isNull(courseCode) || Objects.equals(courseCode, "")) {
-                throw ExceptionResultEnum.ERROR.exception("课程编码为空");
+            List<ApproveUserResult> approveUserResultList = null;
+            BasicSchool basicSchool = (BasicSchool) ServletUtil.getRequestSchool();
+            if (Objects.equals(basicSchool.getCode(), FlowSchoolCodeEnum.GDYKDX.getCode())) {
+                if (Objects.isNull(courseCode) || Objects.equals(courseCode, "")) {
+                    throw ExceptionResultEnum.ERROR.exception("课程编码为空");
+                }
+                approveUserResultList = sysUserService.findByRootApprove(courseCode, null, null, FlowApproveNameEnum.DIRECTOR);
+            } else if (Objects.equals(basicSchool.getCode(), FlowSchoolCodeEnum.JXZYYDX.getCode())) {//江西中医药大学
+                approveUserResultList = sysUserService.findByJxzyyDirectorApprove(null, FlowApproveNameEnum.DIRECTOR);
             }
-            List<ApproveUserResult> approveUserResultList = sysUserService.findByRootApprove(courseCode, null, null, FlowApproveNameEnum.DIRECTOR);
             flowTaskApprovePeopleResultList = new LinkedList<>();
-            flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup(), false, approveUserResultList));
+            flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup(), false, approveUserResultList));
             flowTaskApprovePeopleAllResult = new FlowTaskApprovePeopleAllResult();
         }
         flowTaskApprovePeopleAllResult.setApproveUserList(flowTaskApprovePeopleResultList);
@@ -802,9 +841,7 @@ public class ActivitiServiceImpl implements ActivitiService {
     private void flowSubmitVaild(Task task, Long userId) {
         if (Objects.isNull(task.getAssignee())) {
             Task taskUser = taskService.createTaskQuery().taskId(task.getId()).taskAssignee(String.valueOf(userId)).singleResult();
-            if (Objects.isNull(taskUser)) {
-                throw ExceptionResultEnum.ERROR.exception("不能提交他人的任务或者该任务已被审核,请刷新再试!");
-            }
+            Optional.ofNullable(taskUser).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("不能提交他人的任务或者该任务已被审核,请刷新再试!"));
         } else {
             if (!Objects.equals(task.getAssignee(), String.valueOf(userId))) {
                 throw ExceptionResultEnum.ERROR.exception("不能提交他人的任务或者该任务已被审核,请刷新再试!");
@@ -822,17 +859,13 @@ public class ActivitiServiceImpl implements ActivitiService {
     private void flowApproveVaild(Task task, Long userId, Map<String, Object> map) {
         if (Objects.isNull(task.getAssignee())) {
             Task taskUser = taskService.createTaskQuery().taskId(task.getId()).taskCandidateUser(String.valueOf(userId)).singleResult();
-            if (Objects.isNull(taskUser)) {
-                throw ExceptionResultEnum.ERROR.exception("不能提交他人的任务或者该任务已被审核,请刷新再试!");
-            }
+            Optional.ofNullable(taskUser).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("不能提交他人的任务或者该任务已被审核,请刷新再试!"));
         } else {
             if (!Objects.equals(task.getAssignee(), String.valueOf(userId))) {
                 throw ExceptionResultEnum.ERROR.exception("不能提交他人的任务或者该任务已被审核,请刷新再试!");
             }
         }
-        if (Objects.isNull(map.get(SystemConstant.APPROVE_OPERATION))) {
-            throw ExceptionResultEnum.ERROR.exception("流程审核操作不能为空");
-        }
+        Optional.ofNullable(map.get(SystemConstant.APPROVE_OPERATION)).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程审核操作不能为空"));
     }
 
     /**
@@ -840,16 +873,122 @@ public class ActivitiServiceImpl implements ActivitiService {
      *
      * @param courseCode
      * @param flowTaskApprovePeopleResultList
+     * @param processDefinitionEntity
      */
-    private List<FlowTaskApprovePeopleResult> getApproveUserAll(String courseCode, List<FlowTaskApprovePeopleResult> flowTaskApprovePeopleResultList) {
+    private List<FlowTaskApprovePeopleResult> getApproveUserAll(String courseCode, List<FlowTaskApprovePeopleResult> flowTaskApprovePeopleResultList, String processDefinitionEntity) {
         flowTaskApprovePeopleResultList = Objects.isNull(flowTaskApprovePeopleResultList) ? new LinkedList() : flowTaskApprovePeopleResultList;
-        //获取教研室主任审批人
-        List<ApproveUserResult> sysUserDirectorList = sysUserService.findByDirectorApprove(courseCode, null);
-        flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup(), false, sysUserDirectorList));
-        Set<Long> orgIds = sysUserDirectorList.stream().map(s -> s.getOrgId()).collect(Collectors.toSet());
-        //获取院长审批人
-        List<ApproveUserResult> sysUserPresidentList = sysUserService.findByPresidentApprove(new ArrayList<>(orgIds), null);
-        flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowGdykdxApproveSetupEnum.SECOND_APPROVE.getSetup(), false, sysUserPresidentList));
+        //广东医科大学流程
+        if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.contains(SystemConstant.GDYKDX_FLOW_KEY)) {
+            //获取教研室主任审批人
+            List<ApproveUserResult> sysUserDirectorList = sysUserService.findByDirectorApprove(courseCode, null);
+            flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup(), false, sysUserDirectorList));
+            Set<Long> orgIds = sysUserDirectorList.stream().map(s -> s.getOrgId()).collect(Collectors.toSet());
+            //获取院长审批人
+            List<ApproveUserResult> sysUserPresidentList = sysUserService.findByPresidentApprove(new ArrayList<>(orgIds), null);
+            flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.SECOND_APPROVE.getSetup(), false, sysUserPresidentList));
+        }
+        //江西中医药大学
+        else if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.contains(SystemConstant.JXZYY_FLOW_KEY)) {
+            //获取教研室主任审批人
+            List<ApproveUserResult> sysUserDirectorList = sysUserService.findByJxzyyDirectorApprove(null, FlowApproveNameEnum.DIRECTOR);
+            flowTaskApprovePeopleResultList.add(new FlowTaskApprovePeopleResult(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup(), false, sysUserDirectorList));
+        }
         return flowTaskApprovePeopleResultList;
     }
+
+    /**
+     * 命题提交
+     *
+     * @param task
+     * @param sysUser
+     * @param tfFlowApprove
+     * @param tfFlowLog
+     * @param map
+     */
+    private void assignSubmit(Task task,
+                              SysUser sysUser,
+                              TFFlowApprove tfFlowApprove,
+                              TFFlowLog tfFlowLog,
+                              Map<String, Object> map) {
+        flowSubmitVaild(task, sysUser.getId());
+        tfFlowLog.setApproveSetup(FlowApproveSetupEnum.SUBMIT.getSetup());
+        tfFlowLog.setApproveOperation(FlowApproveOperationEnum.SUBMIT);
+        tfFlowApprove.setStatus(FlowStatusEnum.AUDITING);
+        tfFlowApprove.setSetup(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup());
+        map.computeIfAbsent(SystemConstant.APPROVE_DIRECTOR_USER_IDS, v -> map.get(SystemConstant.APPROVE_USER_IDS));
+    }
+
+    /**
+     * 主任提交
+     *
+     * @param task
+     * @param sysUser
+     * @param tfFlowApprove
+     * @param tfFlowApproveLog
+     * @param tfFlowLog
+     * @param remark
+     * @param processDefinitionEntity
+     * @param map
+     */
+    private void directorSubmit(Task task,
+                                SysUser sysUser,
+                                TFFlowApprove tfFlowApprove,
+                                TFFlowApproveLog tfFlowApproveLog,
+                                TFFlowLog tfFlowLog,
+                                String remark,
+                                ProcessDefinitionEntity processDefinitionEntity,
+                                Map<String, Object> map) {
+        flowApproveVaild(task, sysUser.getId(), map);
+        FlowApprovePassEnum approvePass = (FlowApprovePassEnum) map.get(SystemConstant.APPROVE_OPERATION);
+        FlowApproveVariableEnum approve = approvePass == FlowApprovePassEnum.PASS ? FlowApproveVariableEnum.PRIMARY_APPROVE : FlowApproveVariableEnum.PRIMARY_REJECT;
+        tfFlowLog.setApproveSetup(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup());
+        tfFlowApproveLog.setPrimaryApproveId(sysUser.getId());
+        tfFlowApproveLog.setPrimaryApproveRemark(remark);
+        if (approve == FlowApproveVariableEnum.PRIMARY_REJECT) {//驳回命题
+            tfFlowLog.setApproveOperation(FlowApproveOperationEnum.REJECT);
+            tfFlowApproveLog.setPrimaryApproveOperation(FlowApproveOperationEnum.REJECT);
+            tfFlowApprove.setStatus(FlowStatusEnum.REJECT);
+            tfFlowApprove.setSetup(FlowApproveSetupEnum.SUBMIT.getSetup());
+        } else if (approve == FlowApproveVariableEnum.PRIMARY_APPROVE) {//提交
+            tfFlowLog.setApproveOperation(FlowApproveOperationEnum.APPROVE);
+            tfFlowApproveLog.setPrimaryApproveOperation(FlowApproveOperationEnum.APPROVE);
+            //广东医科大学流程
+            if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.GDYKDX_FLOW_KEY)) {
+                tfFlowApprove.setStatus(FlowStatusEnum.AUDITING);
+                tfFlowApprove.setSetup(FlowApproveSetupEnum.SECOND_APPROVE.getSetup());
+            }
+            //江西中医药大学
+            else if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.JXZYY_FLOW_KEY)) {
+                tfFlowApprove.setStatus(FlowStatusEnum.FINISH);
+                tfFlowApprove.setSetup(FlowApproveSetupEnum.FINISH.getSetup());
+            }
+        } else {
+            throw ExceptionResultEnum.ERROR.exception("流程变量值错误");
+        }
+        map.computeIfAbsent(SystemConstant.APPROVE, v -> approve.getId());
+        map.computeIfAbsent(SystemConstant.APPROVE_PRESIDENT_USER_IDS, v -> map.get(SystemConstant.APPROVE_USER_IDS));
+    }
+
+    /**
+     * 命题终止
+     *
+     * @param tfFlowApproveLog
+     * @param sysUser
+     */
+    private void assignFlowEnd(TFFlowApproveLog tfFlowApproveLog, SysUser sysUser) {
+        tfFlowApproveLog.setStartId(sysUser.getId());
+        tfFlowApproveLog.setRemark(FlowApproveSetupEnum.SUBMIT.getTitle() + FlowApproveOperationEnum.END.getTitle());
+    }
+
+    /**
+     * 主任终止
+     *
+     * @param tfFlowApproveLog
+     * @param sysUser
+     */
+    private void directorFlowEnd(TFFlowApproveLog tfFlowApproveLog, SysUser sysUser) {
+        tfFlowApproveLog.setPrimaryApproveId(sysUser.getId());
+        tfFlowApproveLog.setPrimaryApproveOperation(FlowApproveOperationEnum.END);
+        tfFlowApproveLog.setPrimaryApproveRemark(FlowApproveOperationEnum.END.getTitle());
+    }
 }

+ 32 - 8
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java

@@ -3,7 +3,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.conditions.update.Update;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -21,11 +20,9 @@ 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.bean.params.BasicStudentParams;
 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.entity.*;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.MqTagEnum;
 import com.qmth.teachcloud.common.enums.TaskTypeEnum;
@@ -76,6 +73,8 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
     private ExamPrintPlanService examPrintPlanService;
     @Resource
     private BasicAttachmentService basicAttachmentService;
+    @Resource
+    private BasicStudentService basicStudentService;
 
     @Resource
     TBTaskService tbTaskService;
@@ -576,6 +575,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
     @Override
     public void disposeExamStudentByExaminationExcel(List<ExaminationImportDto> dataList, Long userId, SysUser sysUser) {
         List<ExamStudent> examStudentList = new ArrayList<>();
+        List<BasicStudentParams> basicStudentParamsList = new ArrayList<>();
         for (ExaminationImportDto examinationImportDto : dataList) {
             Long schoolId = examinationImportDto.getSchoolId();
             Long printPlanId = examinationImportDto.getPrintPlanId();
@@ -590,6 +590,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
             String studentCode = examinationImportDto.getStudentCode();
             String ticketNumber = examinationImportDto.getTicketNumber();
             String siteNumber = examinationImportDto.getSiteNumber();
+            String campusName = examinationImportDto.getCampusName();
 
             List<FieldsDto> fieldsDtoList = examinationImportDto.getSecondaryFieldList();
             List<ExtendFieldsDto> extendFieldsDtoList = this.getExtendFieldsByFields(fieldsDtoList);
@@ -626,17 +627,40 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
             examStudent.setCreateId(userId);
             examStudent.setUpdateId(userId);
             examStudentList.add(examStudent);
+
+
+            BasicStudentParams basicStudentParams = new BasicStudentParams();
+            BasicStudent tmp = basicStudentService.getOne(new QueryWrapper<BasicStudent>().lambda()
+                    .eq(BasicStudent::getSchoolId, sysUser.getSchoolId())
+                    .eq(BasicStudent::getEnable, true)
+                    .eq(BasicStudent::getStudentCode, studentCode));
+            if (Objects.nonNull(tmp)) {
+                basicStudentParams.setId(tmp.getId());
+            }
+            basicStudentParams.setStudentCode(studentCode);
+            basicStudentParams.setStudentName(studentName);
+            basicStudentParams.setCampusId(basicCampusService.getOne(new QueryWrapper<BasicCampus>()
+                    .lambda()
+                    .eq(BasicCampus::getSchoolId,schoolId)
+                    .eq(BasicCampus::getCampusName,campusName))
+                    .getId());
+            basicStudentParams.setCollegeId(tmp.getBelongOrgId());
+            basicStudentParams.setMajorId(tmp.getMajorId());
+            basicStudentParams.setClazzId(tmp.getClazzId());
+            basicStudentParams.setPhoneNumber(tmp.getPhoneNumber());
+            basicStudentParamsList.add(basicStudentParams);
         }
         examStudentService.saveBatch(examStudentList);
+        // 更新基础学生表数据
+        basicStudentService.saveOrUpdateBasicStudentBatch(basicStudentParamsList,sysUser);
     }
 
     @Override
     public List<ExamDetail> listByPrintPlanIdAndCourseCodeAndPaperNumber(Long schoolId, Long printPlanId, String courseCode, String paperNumber) {
         List<ExamDetailCourse> examDetailCourses = examDetailCourseService.listByPrintPlanIdAndCourseCodeAndPaperNumber(schoolId, printPlanId, courseCode, paperNumber);
         if (examDetailCourses != null && examDetailCourses.size() > 0) {
-            Set<Long> examDetailIds = examDetailCourses.stream().map(m -> m.getExamDetailId()).collect(Collectors.toSet());
-            List<ExamDetail> examDetails = this.listByIds(examDetailIds);
-            return examDetails;
+            Set<Long> examDetailIds = examDetailCourses.stream().map(ExamDetailCourse::getExamDetailId).collect(Collectors.toSet());
+            return this.listByIds(examDetailIds);
         }
         return null;
     }

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

@@ -369,11 +369,10 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
         // 不需要审核,直接更新,否则加入待审核列表
         if (examTask.getReview()) {
             // 发起新流程
-            //TODO 这里以后要判断学校code来取流程key
             Map<String, Object> map = new HashMap<>();
             map.computeIfAbsent(SystemConstant.APPROVE_ID, v -> String.valueOf(examTask.getUserId()));
             map.computeIfAbsent(SystemConstant.TEACHING_ROOM_ID, v -> examTask.getTeachingRoomId());
-            ProcessInstance processInstance = activitiService.startActivity(SystemConstant.GDYKDX_FLOW_KEY, map);
+            ProcessInstance processInstance = activitiService.flowStart(map);
             Long flowId = Long.parseLong(processInstance.getId());
             UpdateWrapper<ExamTask> updateWrapper = new UpdateWrapper<>();
             updateWrapper.lambda().set(ExamTask::getFlowId, flowId).eq(ExamTask::getId, examTaskDetail.getExamTaskId());

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

@@ -264,11 +264,10 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
 
             if (Objects.nonNull(examTask.getUserId())) {
                 examStatusEnum = ExamStatusEnum.STAGE;
-                //TODO 这里以后要判断学校code来取流程key
                 Map<String, Object> map = new HashMap<>();
                 map.computeIfAbsent(SystemConstant.APPROVE_ID, v -> String.valueOf(examTask.getUserId()));
                 map.computeIfAbsent(SystemConstant.TEACHING_ROOM_ID, v -> examTask.getTeachingRoomId());
-                ProcessInstance processInstance = activitiService.startActivity(SystemConstant.GDYKDX_FLOW_KEY, map);
+                ProcessInstance processInstance = activitiService.flowStart(map);
                 flowId = Long.parseLong(processInstance.getId());
             }
         }
@@ -410,11 +409,10 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                 examTask.setStatus(ExamStatusEnum.DRAFT);
             } else if (examTask.getReview()) {
                 examTask.setStatus(ExamStatusEnum.STAGE);
-                //TODO 这里以后要判断学校code来取流程key
                 Map<String, Object> map = new HashMap<>();
                 map.computeIfAbsent(SystemConstant.APPROVE_ID, v -> String.valueOf(examTask.getUserId()));
                 map.computeIfAbsent(SystemConstant.TEACHING_ROOM_ID, v -> examTask.getTeachingRoomId());
-                ProcessInstance processInstance = activitiService.startActivity(SystemConstant.GDYKDX_FLOW_KEY, map);
+                ProcessInstance processInstance = activitiService.flowStart(map);
                 examTask.setFlowId(Long.parseLong(processInstance.getId()));
             } else if (!examTask.getReview()) {
                 examTask.setStatus(ExamStatusEnum.STAGE);
@@ -699,11 +697,10 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         this.saveBatch(list);
         for (ExamTask examTask : list) {
             if (examTask.getReview() && Objects.nonNull(examTask.getUserId()) && Objects.isNull(examTask.getFlowId())) {
-                //TODO 这里以后要判断学校code来取流程key
                 Map<String, Object> map = new HashMap<>();
                 map.computeIfAbsent(SystemConstant.APPROVE_ID, v -> String.valueOf(examTask.getUserId()));
                 map.computeIfAbsent(SystemConstant.TEACHING_ROOM_ID, v -> examTask.getTeachingRoomId());
-                ProcessInstance processInstance = activitiService.startActivity(SystemConstant.GDYKDX_FLOW_KEY, map);
+                ProcessInstance processInstance = activitiService.flowStart(map);
                 examTask.setFlowId(Long.parseLong(processInstance.getId()));
                 this.updateById(examTask);
             }
@@ -726,7 +723,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         for (ExamTaskDto record : examTaskDtoIPage.getRecords()) {
 //            List<ExamPackageDetail> examPackageDetailDatasource = this.baseMapper.findExamPackageDetailByPaperNumber(schoolId,record.getCourseCode(),paperNumber, printPlanStatusEnumList);
 //            record.setApproveFormStatus(examPackageDetailDatasource.size() > 0);
-            if ((record.getReview() && FlowGdykdxApproveSetupEnum.FINISH.name().equals(record.getAuditStatus())
+            if ((record.getReview() && FlowApproveSetupEnum.FINISH.name().equals(record.getAuditStatus())
                     || (!record.getReview()))) {
                 record.setApproveFormStatus(true);
             } else {
@@ -1018,15 +1015,14 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             throw ExceptionResultEnum.ERROR.exception("审核流程进度丢失,不能撤回");
         }
 
-        if (!tfFlowApprove.getSetup().equals(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup())) {
+        if (!tfFlowApprove.getSetup().equals(FlowApproveSetupEnum.PRIMARY_APPROVE.getSetup())) {
             throw ExceptionResultEnum.ERROR.exception("当前审核节点不能撤回");
         }
 
-        //TODO 这里以后要判断学校code来取流程key
         Map<String, Object> map = new HashMap<>();
         map.computeIfAbsent(SystemConstant.APPROVE_ID, v -> String.valueOf(task.getUserId()));
         map.computeIfAbsent(SystemConstant.TEACHING_ROOM_ID, v -> task.getTeachingRoomId());
-        ProcessInstance processInstance = activitiService.startActivity(SystemConstant.GDYKDX_FLOW_KEY, map);
+        ProcessInstance processInstance = activitiService.flowStart(map);
 
         UpdateWrapper<ExamTask> updateWrapper = new UpdateWrapper<>();
         updateWrapper.lambda().set(ExamTask::getStatus, ExamStatusEnum.STAGE)
@@ -1481,14 +1477,12 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
 
             examTask.setStatus(ExamStatusEnum.valueOf(examTaskDetail.getOperateType()));
             if (Objects.isNull(examTask.getFlowId())) {
-                //TODO 这里以后要判断学校code来取流程key
                 if (basicExamRule.getReview()) {
                     Map<String, Object> map = new HashMap<>();
                     map.computeIfAbsent(SystemConstant.APPROVE_ID, v -> String.valueOf(examTask.getUserId()));
                     map.computeIfAbsent(SystemConstant.TEACHING_ROOM_ID, v -> examTask.getTeachingRoomId());
-                    ProcessInstance processInstance = activitiService.startActivity(SystemConstant.GDYKDX_FLOW_KEY, map);
+                    ProcessInstance processInstance = activitiService.flowStart(map);
                     examTask.setFlowId(Long.parseLong(processInstance.getId()));
-
                 }
             }
             this.saveOrUpdate(examTask);
@@ -1618,12 +1612,11 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             examTask.setCreateTime(System.currentTimeMillis());
 
             if (Objects.isNull(examTask.getFlowId())) {
-                //TODO 这里以后要判断学校code来取流程key
                 if (basicExamRule.getReview()) {
                     Map<String, Object> map = new HashMap<>();
                     map.computeIfAbsent(SystemConstant.APPROVE_ID, v -> String.valueOf(examTask.getUserId()));
                     map.computeIfAbsent(SystemConstant.TEACHING_ROOM_ID, v -> examTask.getTeachingRoomId());
-                    ProcessInstance processInstance = activitiService.startActivity(SystemConstant.GDYKDX_FLOW_KEY, map);
+                    ProcessInstance processInstance = activitiService.flowStart(map);
                     examTask.setFlowId(Long.parseLong(processInstance.getId()));
                 }
             }

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

@@ -48,7 +48,7 @@ public class AsyncCourseDataImportService extends AsyncImportTaskTemplete {
         try {
             TaskLogicService taskLogicService = SpringContextHolder.getBean(TaskLogicService.class);
 
-            // 执行导入基础学生数据
+            // 执行导入基础课程数据
             Map<String, Object> result = taskLogicService.executeImportBasicCourseLogic(map);
 
 

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

@@ -1182,7 +1182,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         InputStream inputStream = (InputStream) map.get("inputStream");
         List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(inputStream, Lists.newArrayList(BasicCourseImportDto.class, DescribeImportDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
             List<ExcelError> excelErrorTemp = new ArrayList<>();
-//            Map<String, String> checkMap = new HashMap<>();
+            Map<String, BasicCourseImportDto> courseDtoMap = new HashMap<>();
             for (int i = 0; i < finalExcelList.size(); i++) {
                 LinkedMultiValueMap<Integer, Object> excelMap = finalExcelList.get(i);
                 List<Object> basicCourseImportDtoList = excelMap.get(i);
@@ -1190,6 +1190,8 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                 if (basicCourseImportDtoList.get(0) instanceof DescribeImportDto) {
                     continue;
                 }
+                map.put("dataCount", basicCourseImportDtoList.size());
+                List<BasicCourseImportDto> duplicateData = new ArrayList<>();
                 for (int y = 0; y < Objects.requireNonNull(basicCourseImportDtoList).size(); y++) {
                     BasicCourseImportDto basicCourseImportDto = (BasicCourseImportDto) basicCourseImportDtoList.get(y);
                     String courseName = basicCourseImportDto.getCourseName();
@@ -1197,12 +1199,25 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                     String teachingRoomName = basicCourseImportDto.getTeachingRoomName();
                     String clazz = basicCourseImportDto.getClazz();
 
-                    // 检验excel中
-//                    if (checkMap.containsKey(courseCode)) {
-//                        throw ExceptionResultEnum.ERROR.exception("导入的excel中包含在重复的【课程编号】:" + courseCode);
-//                    } else {
-//                        checkMap.put(courseCode, courseName);
-//                    }
+                    if (courseDtoMap.containsKey(courseCode)){
+                        BasicCourseImportDto primaryCell = courseDtoMap.get(courseCode);
+                        String primaryName = primaryCell.getCourseName();
+                        String primaryTeachingRoomName = primaryCell.getTeachingRoomName();
+                        if (!Objects.equals(primaryName,courseName)){
+                            throw ExceptionResultEnum.ERROR.exception("【课程编号】 : " + courseCode + ",存在不同的【课程名称】");
+                        }
+                        if (!Objects.equals(primaryTeachingRoomName,teachingRoomName)){
+                            throw ExceptionResultEnum.ERROR.exception("【课程编号】 : " + courseCode + ",存在不同的【所属教研室】");
+                        }
+                        String primaryClazz = primaryCell.getClazz();
+                        if (SystemConstant.strNotNull(clazz)){
+                            primaryClazz = primaryClazz + SystemConstant.COMMA + clazz;
+                            primaryCell.setClazz(primaryClazz);
+                        }
+                        duplicateData.add(basicCourseImportDto);
+                    }else {
+                        courseDtoMap.put(courseCode, basicCourseImportDto);
+                    }
 
                     excelErrorTemp.addAll(ExcelUtil.checkExcelField(basicCourseImportDto, y, i));
                     if (Objects.isNull(courseCode) || courseCode.length() > 30 || !courseCode.matches(SystemConstant.REGULAR_EXPRESSION_OF_CODE)) {
@@ -1212,6 +1227,8 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                         excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[课程名称]不符合输入规范"));
                     }
                 }
+                // 删除重复的(需要累加的)excel数据
+                basicCourseImportDtoList.removeAll(duplicateData);
             }
             if (excelErrorTemp.size() > 0) {
                 throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(excelErrorTemp));
@@ -1227,9 +1244,8 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         InputStream inputStream = (InputStream) map.get("inputStream");
         List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(inputStream, Lists.newArrayList(SysUserImportDto.class, DescribeImportDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
             List<ExcelError> excelErrorTemp = new ArrayList<>();
-//            Map<String, String> checkName = new HashMap<>();
-            Map<String, String> checkCode = new HashMap<>();
-            Map<String, String> checkPhoneMap = new HashMap<>();
+            Map<String,SysUserImportDto> checkDtoMap = new HashMap<>();
+
             for (int i = 0; i < finalExcelList.size(); i++) {
                 LinkedMultiValueMap<Integer, Object> excelMap = finalExcelList.get(i);
                 List<Object> sysUserImportDtoList = excelMap.get(i);
@@ -1237,6 +1253,8 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                 if (sysUserImportDtoList.get(0) instanceof DescribeImportDto) {
                     continue;
                 }
+                map.put("dataCount", sysUserImportDtoList.size());
+                List<SysUserImportDto> duplicateData = new ArrayList<>();
                 for (int y = 0; y < Objects.requireNonNull(sysUserImportDtoList).size(); y++) {
                     SysUserImportDto sysUserImportDto = (SysUserImportDto) sysUserImportDtoList.get(y);
                     String name = sysUserImportDto.getName();
@@ -1245,24 +1263,28 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                     String orgName = sysUserImportDto.getOrgName();
                     String roleName = sysUserImportDto.getRoleName();
 
-                    // 检验excel中
-//                    if (checkName.containsKey(name)) {
-//                        throw ExceptionResultEnum.ERROR.exception("导入的excel中包含在重复的【姓名】:" + name);
-//                    } else {
-//                        checkName.put(name, code);
-//                    }
-                    if (checkCode.containsKey(code)) {
-                        throw ExceptionResultEnum.ERROR.exception("导入的excel中包含在重复的【工号】:" + code);
-                    } else {
-                        checkCode.put(code, name);
-                    }
-                    // 如果电话有值则检验电话excel中唯一性
-                    if (SystemConstant.strNotNull(phoneNumber)) {
-                        if (checkPhoneMap.containsKey(phoneNumber)) {
-                            throw ExceptionResultEnum.ERROR.exception("导入的excel中包含在重复的【电话号码】:" + phoneNumber);
-                        } else {
-                            checkPhoneMap.put(phoneNumber, code);
+                    if (checkDtoMap.containsKey(code)){
+                        SysUserImportDto primaryCell = checkDtoMap.get(code);
+                        String priName = primaryCell.getName();
+                        String priPhoneNumber = primaryCell.getPhoneNumber();
+                        String priOrgName = primaryCell.getOrgName();
+                        if (!Objects.equals(priName,name)){
+                            throw ExceptionResultEnum.ERROR.exception("【工号】 :" + code + ",的用户存在不同的用户名称异常");
+                        }
+                        if (!Objects.equals(priPhoneNumber,phoneNumber)){
+                            throw ExceptionResultEnum.ERROR.exception("【工号】 :" + code + ",的用户存在不同的手机号异常");
+                        }
+                        if (!Objects.equals(priOrgName,orgName)){
+                            throw ExceptionResultEnum.ERROR.exception("【工号】 :" + code + ",的用户存在不同的组织架构异常");
+                        }
+                        String priRoleName = primaryCell.getRoleName();
+                        if (SystemConstant.strNotNull(roleName)){
+                            priRoleName = priRoleName + SystemConstant.COMMA + roleName;
+                            primaryCell.setRoleName(priRoleName);
                         }
+                        duplicateData.add(sysUserImportDto);
+                    }else {
+                        checkDtoMap.put(code,sysUserImportDto);
                     }
 
                     excelErrorTemp.addAll(ExcelUtil.checkExcelField(sysUserImportDto, y, i));
@@ -1276,6 +1298,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                         excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[电话号码]不符合输入规范"));
                     }
                 }
+                sysUserImportDtoList.removeAll(duplicateData);
             }
             if (excelErrorTemp.size() > 0) {
                 throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(excelErrorTemp));

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

@@ -61,7 +61,7 @@
                 and tsess.clazz_id = #{clazzId}
             </if>
             <if test="courseCode != null and courseCode != ''">
-                and tsess.subject_code = #{courseCode}
+                and tsess.subject_code LIKE CONCAT('%',#{courseCode},'%')
             </if>
         </where>
     </sql>

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

@@ -88,13 +88,14 @@ public class BasicCourseController {
     @ApiOperation(value = "课程管理-查询")
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
-    public Result findBasicCampusList(@ApiParam(value = "课程名称(模糊查询)") @RequestParam(required = false) String courseName,
+    public Result findBasicCampusList(@ApiParam(value = "所属机构id") @RequestParam(required = false) String belongOrgId,
+                                      @ApiParam(value = "课程名称(模糊查询)") @RequestParam(required = false) String courseName,
                                       @ApiParam(value = "创建时间(起始位置)") @RequestParam(required = false) String startCreateTime,
                                       @ApiParam(value = "创建时间(终止位置)") @RequestParam(required = false) String endCreateTime,
                                       @ApiParam(value = "状态") @RequestParam(required = false) Boolean enable,
                                       @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
                                       @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        return ResultUtil.ok(basicCourseService.basicCoursePage(courseName, SystemConstant.convertIdToLong(startCreateTime), SystemConstant.convertIdToLong(endCreateTime), enable, pageNumber, pageSize));
+        return ResultUtil.ok(basicCourseService.basicCoursePage(SystemConstant.convertIdToLong(belongOrgId), courseName, SystemConstant.convertIdToLong(startCreateTime), SystemConstant.convertIdToLong(endCreateTime), enable, pageNumber, pageSize));
     }
 
     @ApiOperation(value = "课程管理-新增/编辑")

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

@@ -452,7 +452,7 @@ public class ExamTaskController {
                 if (Objects.nonNull(objectMap)) {
                     TFFlowApprove tfFlowApprove = (TFFlowApprove) objectMap.get("tfFlowApprove");
                     //审核通过,生成pdf
-                    if (Objects.nonNull(tfFlowApprove) && FlowGdykdxApproveSetupEnum.FINISH.getSetup() == tfFlowApprove.getSetup()) {
+                    if (Objects.nonNull(tfFlowApprove) && FlowApproveSetupEnum.FINISH.getSetup() == tfFlowApprove.getSetup()) {
 //                        ExamTask examTask = (ExamTask) objectMap.get("examTask");
                         SysUser sysUser = (SysUser) objectMap.get("sysUser");
                         try {

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

@@ -177,7 +177,7 @@ public class TFFlowController {
             TFFlowApprove tfFlowApprove = (TFFlowApprove) objectMap.get("tfFlowApprove");
             ExamTask examTask = (ExamTask) objectMap.get("examTask");
             //审核通过,生成pdf
-            if (Objects.nonNull(tfFlowApprove) && FlowGdykdxApproveSetupEnum.FINISH.getSetup() == tfFlowApprove.getSetup()) {
+            if (Objects.nonNull(tfFlowApprove) && FlowApproveSetupEnum.FINISH.getSetup() == tfFlowApprove.getSetup()) {
                 // 取命题老师ID
                 SysUser sysUser = sysUserService.getById(examTask.getUserId());
                 try {
@@ -189,7 +189,7 @@ public class TFFlowController {
 
             // 驳回短信(驳回给提交老师)
             if (tfFlowApprove.getStatus().equals(FlowStatusEnum.REJECT)
-                    && tfFlowApprove.getSetup().equals(FlowGdykdxApproveSetupEnum.SUBMIT.getSetup())) {
+                    && tfFlowApprove.getSetup().equals(FlowApproveSetupEnum.SUBMIT.getSetup())) {
                 List<SysUser> sysUsers = sysUserService.listByIds(Arrays.asList(examTask.getUserId()));
                 List<ApproveUserResult> sysUserList = new Gson().fromJson(JacksonUtil.parseJson(sysUsers), new TypeToken<List<ApproveUserResult>>() {
                 }.getType());

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

@@ -9,6 +9,7 @@ import com.qmth.distributed.print.business.bean.result.TSyncExamStudentScoreResu
 import com.qmth.distributed.print.business.entity.ExamPrintPlan;
 import com.qmth.distributed.print.business.entity.TBSyncTask;
 import com.qmth.distributed.print.business.entity.TSyncExamStudentScore;
+import com.qmth.distributed.print.business.enums.ExamPrintPlanSyncStatusEnum;
 import com.qmth.distributed.print.business.enums.ImageTrajectoryEnum;
 import com.qmth.distributed.print.business.service.ExamPrintPlanService;
 import com.qmth.distributed.print.business.service.PrintCommonService;
@@ -138,7 +139,8 @@ public class TSyncExamStudentScoreController {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         QueryWrapper<ExamPrintPlan> examPrintPlanQueryWrapper = new QueryWrapper<ExamPrintPlan>();
         examPrintPlanQueryWrapper.select(" DISTINCT third_relate_id ").eq("school_id", sysUser.getSchoolId())
-                .eq("semester_id", SystemConstant.convertIdToLong(semesterId));
+                .eq("semester_id", SystemConstant.convertIdToLong(semesterId))
+                .eq("sync_status", ExamPrintPlanSyncStatusEnum.FINISH);
         List<ExamPrintPlan> examPrintPlanList = examPrintPlanService.list(examPrintPlanQueryWrapper);
         if (Objects.isNull(examPrintPlanList) || examPrintPlanList.size() == 0) {
             throw ExceptionResultEnum.ERROR.exception("此学期学院下未找到需要同步的考试记录");

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

@@ -12,10 +12,9 @@ spring.application.name=distributed-print
 #\u6570\u636E\u6E90\u914D\u7F6E
 db.host=localhost
 db.port=3306
-#db.name=distributed-v2.2.0
-db.name=distributed-print-v2.2.1
+db.name=distributed-v2.2.1-test
 db.username=root
-db.password=root
+db.password=123456789
 
 #redis\u6570\u636E\u6E90\u914D\u7F6E
 com.qmth.redis.host=${db.host}
@@ -124,26 +123,26 @@ com.qmth.logging.file-path=/Users/king/Downloads/distributed-print.log
 #spring.profiles.include=task
 
 #\uFFFD\uFFFD\uFFFD\u013E\uFFFD\uFFFD\uFFFD\uFFFDurl
-sync.config.hostUrl=http://localhost:8080/
+sync.config.hostUrl=http://192.168.10.224:80
 #\u036C\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD
 sync.config.examSaveUrl=/api/exam/save
 #\u036C\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD
 sync.config.studentSaveUrl=/api/exam/student/save
 #\u036C\uFFFD\uFFFD\uFFFD\u2FE8
 sync.config.fileUploadUrl=/api/file/{type}/upload
-# 试卷结构查询接口
+# \uFFFD\u053E\uFFFD\u1E79\uFFFD\uFFFD\u046F\uFFFD\u04FF\uFFFD
 sync.config.queryPaperStructure=/api/exam/paper/query
 #\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u00BC
 sync.config.markLoginUrl=/open/mark/login
-#科组长登录
+#\uFFFD\uFFFD\uFFFD\u9CE4\uFFFD\uFFFD\u00BC
 sync.config.markLeaderLoginUrl=/open/subject_header/login
 #\uFFFD\u027C\uFFFD\uFFFD\u0634\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD
 sync.config.studentCountUrl=/api/exam/student/count
 #\uFFFD\u027C\uFFFD\uFFFD\u0634\uFFFD
 sync.config.studentScoreUrl=/api/exam/student/score
-# 同步试卷结构
+# \u036C\uFFFD\uFFFD\uFFFD\u053E\uFFFD\u1E79
 sync.config.structureUrl=/api/exam/paper/save
-# 用户同步
+# \uFFFD\u00FB\uFFFD\u036C\uFFFD\uFFFD
 sync.config.userSaveUrl=/api/user/external/save
 
 
@@ -178,5 +177,5 @@ sms.config.aliyunSMSAuditWillExpireCode=SMS_217436302
 sms.config.aliyunSMSAuditOverdueCode=SMS_217416271
 #\uFFFD\uFFFD\uFFFD\uFFFD
 sms.config.aliyunSMSAuditRejectCode=SMS_225394754
-# 试卷结构标答上传通知
+# \uFFFD\u053E\uFFFD\u1E79\uFFFD\uFFFD\uFFFD\uFFFD\u03F4\uFFFD\u0368\u05AA
 sms.config.aliyunSMSUploadStructureCode=SMS_227253569

+ 69 - 0
distributed-print/src/main/resources/processes/JxzyydxPaperApprove.bpmn

@@ -0,0 +1,69 @@
+<?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="JxzyyPaperApprove" name="JxzyyPaperApprove" isExecutable="true">
+    <startEvent id="startevent1" name="Start"></startEvent>
+    <userTask id="usertask1" name="提交试卷" activiti:assignee="${approveId}"></userTask>
+    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
+    <endEvent id="endevent1" name="End"></endEvent>
+    <userTask id="usertask2" name="审核试卷">
+      <extensionElements>
+        <activiti:taskListener event="create" class="com.qmth.distributed.print.business.activiti.DirectorApproveByJxzyyListener"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
+    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
+    <exclusiveGateway id="exclusivegateway1" name="审批"></exclusiveGateway>
+    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="exclusivegateway1"></sequenceFlow>
+    <sequenceFlow id="flow4" name="通过" sourceRef="exclusivegateway1" targetRef="endevent1">
+      <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>
+  </process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_JxzyyPaperApprove">
+    <bpmndi:BPMNPlane bpmnElement="JxzyyPaperApprove" id="BPMNPlane_JxzyyPaperApprove">
+      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="80.0" y="80.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
+        <omgdc:Bounds height="55.0" width="105.0" x="160.0" y="70.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="345.0" y="270.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
+        <omgdc:Bounds height="55.0" width="105.0" x="310.0" y="70.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1">
+        <omgdc:Bounds height="40.0" width="40.0" x="342.0" y="180.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
+        <omgdi:waypoint x="115.0" y="97.0"></omgdi:waypoint>
+        <omgdi:waypoint x="160.0" y="97.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
+        <omgdi:waypoint x="265.0" y="97.0"></omgdi:waypoint>
+        <omgdi:waypoint x="310.0" y="97.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
+        <omgdi:waypoint x="362.0" y="125.0"></omgdi:waypoint>
+        <omgdi:waypoint x="362.0" y="180.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
+        <omgdi:waypoint x="362.0" y="220.0"></omgdi:waypoint>
+        <omgdi:waypoint x="362.0" y="270.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="16.0" width="22.0" x="362.0" y="220.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
+        <omgdi:waypoint x="342.0" y="200.0"></omgdi:waypoint>
+        <omgdi:waypoint x="212.0" y="199.0"></omgdi:waypoint>
+        <omgdi:waypoint x="212.0" y="125.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="16.0" width="22.0" x="342.0" y="200.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</definitions>

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

@@ -8,7 +8,7 @@ import org.hibernate.validator.constraints.Range;
 
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
-import java.util.List;
+import java.util.Set;
 
 /**
  * @Description: 基础课程参数
@@ -40,7 +40,7 @@ public class BasicCourseParams {
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "授课班级集合")
     @NotEmpty(message = "请输入班级名称")
-    private List<Long> clazzIdList;
+    private Set<Long> clazzIdSet;
 
     public Long getId() {
         return id;
@@ -74,11 +74,11 @@ public class BasicCourseParams {
         this.teachingRoomId = teachingRoomId;
     }
 
-    public List<Long> getClazzIdList() {
-        return clazzIdList;
+    public Set<Long> getClazzIdSet() {
+        return clazzIdSet;
     }
 
-    public void setClazzIdList(List<Long> clazzIdList) {
-        this.clazzIdList = clazzIdList;
+    public void setClazzIdSet(Set<Long> clazzIdSet) {
+        this.clazzIdSet = clazzIdSet;
     }
 }

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

@@ -70,6 +70,7 @@ public class SystemConstant {
     public static final int ALL_CARD = -1;
     public static final String MANUAL = "manual";
     public static final String DELIMITER = ":";
+    public static final String COMMA = ",";
     public static final int FINAL_SCALE = 1;
     public static final int CALCULATE_SCALE = 4;
     public static final int OPER_SCALE = 8;
@@ -194,7 +195,8 @@ public class SystemConstant {
      * activiti
      */
     public static final String PROCESSES = "processes";
-    public static final String GDYKDX_FLOW_KEY = "GdykdxPaperApprove";//流程key
+    public static final String GDYKDX_FLOW_KEY = "GdykdxPaperApprove";//广药流程key
+    public static final String JXZYY_FLOW_KEY = "JxzyyPaperApprove";//江西流程key
     public static final String APPROVE_ID = "approveId";//审批id
     public static final String TEACHING_ROOM_ID = "teachingRoomId";//教研室机构id
     public static final String FLOW_ID = "flowId";//流程id

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

@@ -11,6 +11,8 @@ import java.util.Objects;
  */
 public enum FlowApproveNameEnum {
 
+    TEACHER("命题老师", "Teacher"),
+
     DIRECTOR("主任审批", "Director"),
 
     PRESIDENT("院长审核", "President");

+ 5 - 5
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FlowGdykdxApproveSetupEnum.java → teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FlowApproveSetupEnum.java

@@ -9,7 +9,7 @@ import java.util.Objects;
  * @Author: wangliang
  * @Date: 2021/8/2
  */
-public enum FlowGdykdxApproveSetupEnum {
+public enum FlowApproveSetupEnum {
 
     SUBMIT("提交试卷", "usertask1", 1),
 
@@ -27,7 +27,7 @@ public enum FlowGdykdxApproveSetupEnum {
 
     private int setup;
 
-    private FlowGdykdxApproveSetupEnum(String title, String id, int setup) {
+    private FlowApproveSetupEnum(String title, String id, int setup) {
         this.title = title;
         this.id = id;
         this.setup = setup;
@@ -52,7 +52,7 @@ public enum FlowGdykdxApproveSetupEnum {
      * @return
      */
     public static String convertToName(String title) {
-        for (FlowGdykdxApproveSetupEnum e : FlowGdykdxApproveSetupEnum.values()) {
+        for (FlowApproveSetupEnum e : FlowApproveSetupEnum.values()) {
             if (Objects.equals(title, e.getTitle())) {
                 return e.name();
             }
@@ -66,8 +66,8 @@ public enum FlowGdykdxApproveSetupEnum {
      * @param id
      * @return
      */
-    public static FlowGdykdxApproveSetupEnum convertToInstance(String id) {
-        for (FlowGdykdxApproveSetupEnum e : FlowGdykdxApproveSetupEnum.values()) {
+    public static FlowApproveSetupEnum convertToInstance(String id) {
+        for (FlowApproveSetupEnum e : FlowApproveSetupEnum.values()) {
             if (Objects.equals(id, e.getId())) {
                 return e;
             }

+ 53 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FlowSchoolCodeEnum.java

@@ -0,0 +1,53 @@
+package com.qmth.teachcloud.common.enums;
+
+import java.util.Objects;
+
+/**
+ * @Description: 学校流程code enum
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/11/10
+ */
+public enum FlowSchoolCodeEnum {
+
+//    GDYKDX("广东医科大学", "gdpu"),
+//
+//    JXZYYDX("江西中医药大学", "jxutcm");
+
+    GDYKDX("广东医科大学", "test-school-2"),
+
+    JXZYYDX("江西中医药大学", "test-school-1");
+
+    private String title;
+
+    private String code;
+
+    private FlowSchoolCodeEnum(String title, String code) {
+        this.title = title;
+        this.code = code;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param title
+     * @return
+     */
+    public static String convertToName(String title) {
+        for (FlowSchoolCodeEnum e : FlowSchoolCodeEnum.values()) {
+            if (Objects.equals(title, e.getTitle())) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+}

+ 2 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/BasicCourseMapper.java

@@ -32,6 +32,7 @@ public interface BasicCourseMapper extends BaseMapper<BasicCourse> {
      * 查询课程字典
      *
      * @param iPage           分页参数
+     * @param belongOrgId     所属机构id
      * @param courseName      课程名称(模糊查询)
      * @param startCreateTime 课程创建时间(起始值)
      * @param endCreateTime   课程创建时间(终止值)
@@ -41,6 +42,7 @@ public interface BasicCourseMapper extends BaseMapper<BasicCourse> {
      * @return 结果
      */
     IPage<BasicCourseResult> findBasicCoursePage(@Param("iPage") Page<BasicCourseResult> iPage,
+                                                 @Param("belongOrgId") Long belongOrgId,
                                                  @Param("courseName") String courseName,
                                                  @Param("startCreateTime") Long startCreateTime,
                                                  @Param("endCreateTime") Long endCreateTime,

+ 9 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/SysOrgMapper.java

@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.qmth.teachcloud.common.bean.dto.OrgDto;
 import com.qmth.teachcloud.common.entity.SysOrg;
 import com.qmth.teachcloud.common.entity.SysUser;
-import com.qmth.teachcloud.common.enums.OrgTypeEnum;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -39,6 +38,15 @@ public interface SysOrgMapper extends BaseMapper<SysOrg> {
      */
     List<SysOrg> findByConnectByParentId(@Param("orgId") Long orgId, @Param("school") Boolean school, @Param("college") Boolean college);
 
+    /**
+     * 递归树查询(同级及以上)
+     *
+     * @param orgId
+     * @param orgType
+     * @return
+     */
+    List<SysOrg> findByJxzyyConnectByParentId(@Param("orgId") Long orgId, @Param("orgType") String orgType);
+
     /**
      * 递归树查询(同级及以下)
      *

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

@@ -59,6 +59,7 @@ public interface BasicCourseService extends IService<BasicCourse> {
     /**
      * 查询课程信息-分页查询
      *
+     * @param belongOrgId      所属机构id
      * @param courseName      课程名称(模糊查询)
      * @param startCreateTime 课程创建时间(起始)
      * @param endCreateTime   课程创建时间(终止)
@@ -67,7 +68,7 @@ public interface BasicCourseService extends IService<BasicCourse> {
      * @param pageSize        分页容量
      * @return 查询结果
      */
-    IPage<BasicCourseResult> basicCoursePage(String courseName, Long startCreateTime, Long endCreateTime, Boolean enable, int pageNumber, int pageSize);
+    IPage<BasicCourseResult> basicCoursePage(Long belongOrgId,String courseName, Long startCreateTime, Long endCreateTime, Boolean enable, int pageNumber, int pageSize);
 
     /**
      * 新增/编辑 课程基础信息

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

@@ -41,9 +41,17 @@ public interface BasicStudentService extends IService<BasicStudent> {
     /**
      * 新增/编辑 学生基础信息
      * @param basicStudentParams 基础学生信息参数
-     * @return 新增或编辑的校区id
+     * @param requestUser 新增或编辑的校区id
+     * @return
      */
-    Long saveBasicStudent(BasicStudentParams basicStudentParams, SysUser sysUser);
+    Long saveBasicStudent(BasicStudentParams basicStudentParams, SysUser requestUser);
+
+    /**
+     * 批量新增或更新基础学生信息
+     * @param basicStudentParamsList 学生参数集合
+     * @param requestUser 请求人
+     */
+    void saveOrUpdateBasicStudentBatch(List<BasicStudentParams> basicStudentParamsList,SysUser requestUser);
 
     /**
      * 批量删除学生基本信息(逻辑)

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

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

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

@@ -7,7 +7,6 @@ import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.OrgTypeEnum;
 
 import java.util.List;
-import java.util.Set;
 
 /**
  * <p>
@@ -79,6 +78,15 @@ public interface SysOrgService extends IService<SysOrg> {
      */
     List<SysOrg> findByConnectByParentId(Long orgId, Boolean school, Boolean college);
 
+    /**
+     * 递归树查询(同级及以上)
+     *
+     * @param orgId
+     * @param orgType
+     * @return
+     */
+    List<SysOrg> findByJxzyyConnectByParentId(Long orgId, OrgTypeEnum orgType);
+
     /**
      * 递归树查询(同级及以下)
      *

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

@@ -115,6 +115,14 @@ public interface SysUserService extends IService<SysUser> {
      */
     public List<ApproveUserResult> findByAssignApprove(String courseCode, String realName);
 
+    /**
+     * 获取命题审批人
+     *
+     * @param realName
+     * @return
+     */
+    public List<ApproveUserResult> findByJxzyyAssignApprove(String realName);
+
     /**
      * 获取教研室主任审批人
      *
@@ -124,6 +132,15 @@ public interface SysUserService extends IService<SysUser> {
      */
     public List<ApproveUserResult> findByDirectorApprove(String courseCode, String realName);
 
+    /**
+     * 获取教研室主任审批人
+     *
+     * @param realName
+     * @param flowApproveNameEnum
+     * @return
+     */
+    public List<ApproveUserResult> findByJxzyyDirectorApprove(String realName, FlowApproveNameEnum flowApproveNameEnum);
+
     /**
      * 获取院长审批人
      *
@@ -133,6 +150,16 @@ public interface SysUserService extends IService<SysUser> {
      */
     public List<ApproveUserResult> findByPresidentApprove(List<Long> orgIds, String realName);
 
+    /**
+     * 获取主任或院长审批人
+     *
+     * @param orgIds
+     * @param realName
+     * @param flowApproveNameEnum
+     * @return
+     */
+    public List<ApproveUserResult> findByJxzyyTopDirectorOrPresidentApprove(List<Long> orgIds, String realName, FlowApproveNameEnum flowApproveNameEnum);
+
     /**
      * 获取同级别下一级审批人
      *
@@ -181,7 +208,7 @@ public interface SysUserService extends IService<SysUser> {
      * 用户推送云阅卷服务
      *
      * @param userPushParamList 推送参数
-     * @param requestUserId       请求的用户id
+     * @param requestUserId     请求的用户id
      * @throws IllegalAccessException
      */
     boolean userPushService(List<UserPushParam> userPushParamList, Long requestUserId) throws IllegalAccessException;

+ 27 - 26
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicCourseServiceImpl.java

@@ -118,26 +118,28 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
     }
 
     @Override
-    public IPage<BasicCourseResult> basicCoursePage(String courseName, Long startCreateTime, Long endCreateTime, Boolean enable, int pageNumber, int pageSize) {
+    public IPage<BasicCourseResult> basicCoursePage(Long belongOrgId, String courseName, Long startCreateTime, Long endCreateTime, Boolean enable, int pageNumber, int pageSize) {
         Long schoolId = SystemConstant.convertIdToLong(ServletUtil.getRequestHeaderSchoolId().toString());
         Set<Long> orgIds = teachcloudCommonService.listSubOrgIds(null);
         courseName = SystemConstant.translateSpecificSign(courseName);
-        IPage<BasicCourseResult> iPage = basicCourseMapper.findBasicCoursePage(new Page<>(pageNumber, pageSize), courseName, startCreateTime, endCreateTime, enable, schoolId, orgIds);
+        IPage<BasicCourseResult> iPage = basicCourseMapper.findBasicCoursePage(new Page<>(pageNumber, pageSize),belongOrgId, courseName, startCreateTime, endCreateTime, enable, schoolId, orgIds);
         List<BasicCourseResult> list = iPage.getRecords();
         for (BasicCourseResult basicCourseResult : list) {
             Long courseId = basicCourseResult.getId();
             List<BasicUserCourse> basicUserCourseList = basicUserCourseService.list(new QueryWrapper<BasicUserCourse>().lambda().eq(BasicUserCourse::getCourseId,courseId));
             Set<Long> clazzIdSet = basicUserCourseList.stream().map(BasicUserCourse::getClazzId).collect(Collectors.toSet());
             List<ClazzDatasourceResult> clazzDatasourceResultList = new ArrayList<>();
-            for (Long id : clazzIdSet) {
-                ClazzDatasourceResult clazzDatasourceResult = new ClazzDatasourceResult();
-                BasicClazz clazz = basicClazzService.getById(id);
-                clazzDatasourceResult.setId(clazz.getId());
-                clazzDatasourceResult.setCode(clazz.getClazzCode());
-                clazzDatasourceResult.setName(clazz.getClazzName());
-                clazzDatasourceResultList.add(clazzDatasourceResult);
+            if (clazzIdSet.size() > 0){
+                List<BasicClazz> clazzList = basicClazzService.list(new QueryWrapper<BasicClazz>().lambda().in(BasicClazz::getId,clazzIdSet).orderByAsc(BasicClazz::getCreateTime));
+                for (BasicClazz clazz : clazzList) {
+                    ClazzDatasourceResult clazzDatasourceResult = new ClazzDatasourceResult();
+                    clazzDatasourceResult.setId(clazz.getId());
+                    clazzDatasourceResult.setCode(clazz.getClazzCode());
+                    clazzDatasourceResult.setName(clazz.getClazzName());
+                    clazzDatasourceResultList.add(clazzDatasourceResult);
+                }
+                basicCourseResult.setClazzList(clazzDatasourceResultList);
             }
-            basicCourseResult.setClazzList(clazzDatasourceResultList);
         }
         return iPage;
     }
@@ -198,13 +200,9 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
     @Transactional(rollbackFor = Exception.class)
     @Override
     public Map<String, Object> executeBasicCourseImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList, Map<String, Object> map) {
-        // 班级分割标志
-        final String clazzSplit = ",";
-
         SysUser sysUser = (SysUser) map.get(SystemConstant.SYS_USER);
         Long schoolId = sysUser.getSchoolId();
         List<BasicCourseParams> addBasicCourseParamsList = new ArrayList<>();
-
         for (int i = 0; i < finalList.size(); i++) {
             LinkedMultiValueMap<Integer, Object> excelMap = finalList.get(i);
             List<Object> basicCourseImportDtoList = excelMap.get(i);
@@ -212,7 +210,6 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
             if (basicCourseImportDtoList.get(0) instanceof DescribeImportDto) {
                 continue;
             }
-            map.put("dataCount", basicCourseImportDtoList.size());
             for (int y = 0; y < Objects.requireNonNull(basicCourseImportDtoList).size(); y++) {
                 BasicCourseImportDto basicCourseImportDto = (BasicCourseImportDto) basicCourseImportDtoList.get(y);
                 String courseName = basicCourseImportDto.getCourseName();
@@ -220,13 +217,17 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
                 String teachingRoomName = basicCourseImportDto.getTeachingRoomName();
                 String clazz = basicCourseImportDto.getClazz();
 
-                SysOrg sysOrg = sysOrgService.getOne(new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getSchoolId, schoolId).eq(SysOrg::getEnable, true).eq(SysOrg::getType, OrgTypeEnum.TEACHING_ROOM).eq(SysOrg::getName, teachingRoomName));
+                SysOrg sysOrg = sysOrgService.getOne(new QueryWrapper<SysOrg>().lambda()
+                        .eq(SysOrg::getSchoolId, schoolId)
+                        .eq(SysOrg::getEnable, true)
+                        .eq(SysOrg::getType, OrgTypeEnum.TEACHING_ROOM)
+                        .eq(SysOrg::getName, teachingRoomName));
                 if (Objects.isNull(sysOrg)) {
                     throw ExceptionResultEnum.ERROR.exception("输入的教研室【" + teachingRoomName + "】不存在");
                 }
                 Long teachingRoomId = sysOrg.getId();
-                String[] clazzList = clazz.split(clazzSplit);
-                List<Long> clazzIdList = new ArrayList<>();
+                String[] clazzList = clazz.split(SystemConstant.COMMA);
+                LinkedHashSet<Long> clazzIdSet = new LinkedHashSet<>();
                 for (String clzName : clazzList) {
                     BasicClazz basicClazz = basicClazzService.getOne(new QueryWrapper<BasicClazz>().lambda()
                             .eq(BasicClazz::getEnable, true)
@@ -235,15 +236,18 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
                     if (Objects.isNull(basicClazz)) {
                         throw ExceptionResultEnum.ERROR.exception("所选择【班级】" + clzName + "不存在");
                     }
-                    clazzIdList.add(basicClazz.getId());
+                    clazzIdSet.add(basicClazz.getId());
                 }
 
                 BasicCourseParams basicCourseParams = new BasicCourseParams();
                 basicCourseParams.setCourseCode(courseCode);
                 basicCourseParams.setCourseName(courseName);
                 basicCourseParams.setTeachingRoomId(teachingRoomId);
-                basicCourseParams.setClazzIdList(clazzIdList);
-                BasicCourse old = this.getOne(new QueryWrapper<BasicCourse>().lambda().eq(BasicCourse::getSchoolId, schoolId).eq(BasicCourse::getEnable, true).eq(BasicCourse::getCode, courseCode));
+                basicCourseParams.setClazzIdSet(clazzIdSet);
+                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());
                 }
@@ -303,10 +307,7 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
                 throw ExceptionResultEnum.ERROR.exception("所选教研室不存在");
             }
             // 校验班级
-            List<Long> clazzIdList = basicCourseParams.getClazzIdList();
-            if (clazzIdList.size() != clazzIdList.stream().distinct().count()) {
-                throw ExceptionResultEnum.ERROR.exception("输入的班级重复");
-            }
+            Set<Long> clazzIdSet = basicCourseParams.getClazzIdSet();
 
             //基础数据组装
             Long orgId;
@@ -336,7 +337,7 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
             basicCourse.setOrgId(orgId);
 
             // 根据课程id和授课班级集合更新'basic_user_course'表
-            basicUserCourseService.updateByCourseIdAndClazzList(id, clazzIdList, sysUser, orgId);
+            basicUserCourseService.updateByCourseIdAndClazzList(id, clazzIdSet, sysUser, orgId);
 
             basicCourseList.add(basicCourse);
         }

+ 9 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicStudentServiceImpl.java

@@ -71,17 +71,24 @@ public class BasicStudentServiceImpl extends ServiceImpl<BasicStudentMapper, Bas
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public Long saveBasicStudent(BasicStudentParams basicStudentParams, SysUser sysUser) {
+    public Long saveBasicStudent(BasicStudentParams basicStudentParams, SysUser requestUser) {
         List<BasicStudentParams> basicStudentParamsList = new ArrayList<>();
         basicStudentParamsList.add(basicStudentParams);
-        BasicStudent basicStudent = this.editEntityHelp(basicStudentParamsList, sysUser).get(0);
+        BasicStudent basicStudent = this.editEntityHelp(basicStudentParamsList, requestUser).get(0);
         this.saveOrUpdate(basicStudent);
         return basicStudent.getId();
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void saveOrUpdateBasicStudentBatch(List<BasicStudentParams> basicStudentParamsList,SysUser requestUser) {
+        this.saveOrUpdateBatch(this.editEntityHelp(basicStudentParamsList,requestUser));
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public Boolean removeBasicStudentBatch(List<Long> idList) {
+
         if (idList.size() == 0) {
             throw ExceptionResultEnum.ERROR.exception("请选择要删除的目标");
         }

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

@@ -17,7 +17,7 @@ import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
-import java.util.stream.Collectors;
+import java.util.Set;
 
 /**
  * <p>
@@ -56,14 +56,14 @@ public class BasicUserCourseServiceImpl extends ServiceImpl<BasicUserCourseMappe
 
     @Transactional
     @Override
-    public void updateByCourseIdAndClazzList(Long courseId, List<Long> clazzIdList, SysUser sysUser, Long orgId) {
+    public void updateByCourseIdAndClazzList(Long courseId, Set<Long> clazzIdSet, SysUser sysUser, Long orgId) {
         List<BasicUserCourse> willAddList = new ArrayList<>();
 
         // 删除原有的全部
         this.remove(new QueryWrapper<BasicUserCourse>().lambda().eq(BasicUserCourse::getCourseId,courseId).gt(BasicUserCourse::getId,0));
 
         // 新增
-        for (Long clazzId : clazzIdList) {
+        for (Long clazzId : clazzIdSet) {
             if (Objects.isNull(basicClazzService.getById(clazzId))){
                 throw ExceptionResultEnum.ERROR.exception("班级主键不存在");
             }

+ 12 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysOrgServiceImpl.java

@@ -289,6 +289,18 @@ public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> impleme
         return sysOrgMapper.findByConnectByParentId(orgId, school, college);
     }
 
+    /**
+     * 递归树查询(同级及以下)
+     *
+     * @param orgId
+     * @param orgType
+     * @return
+     */
+    @Override
+    public List<SysOrg> findByJxzyyConnectByParentId(Long orgId, OrgTypeEnum orgType) {
+        return sysOrgMapper.findByJxzyyConnectByParentId(orgId, Objects.nonNull(orgType) ? orgType.name() : null);
+    }
+
     /**
      * 递归树查询(同级及以下)
      *

+ 130 - 22
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysUserServiceImpl.java

@@ -108,7 +108,6 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Resource
     StmmsUtils stmmsUtils;
 
-
     @Override
     public IPage<UserDto> list(String loginName, String roleId, Boolean enable, String realName, Integer pageNumber, Integer pageSize) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
@@ -376,6 +375,31 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             throw ExceptionResultEnum.ERROR.exception("找不到此课程信息");
         }
 
+        BasicSchool basicSchool = (BasicSchool) ServletUtil.getRequestSchool();
+        if (Objects.equals(basicSchool.getCode(), FlowSchoolCodeEnum.JXZYYDX.getCode())) {
+            List<ApproveUserResult> approveUserResultList = sysUserService.findByJxzyyDirectorApprove(null, FlowApproveNameEnum.TEACHER);
+            if (Objects.nonNull(approveUserResultList) && approveUserResultList.size() > 0) {//说明是实施人员提交
+                List<BlurryUserDto> blurryUserDtoList = new ArrayList<>();
+                for (ApproveUserResult sysUser : approveUserResultList) {
+                    blurryUserDtoList.add(new BlurryUserDto(sysUser.getId(), sysUser.getLoginName(), sysUser.getRealName()));
+                }
+                return blurryUserDtoList;
+            } else {
+                return listUserCommon(basicCourse, schoolId);
+            }
+        } else {
+            return listUserCommon(basicCourse, schoolId);
+        }
+    }
+
+    /**
+     * 查找命题老师公用
+     *
+     * @param basicCourse
+     * @param schoolId
+     * @return
+     */
+    private List<BlurryUserDto> listUserCommon(BasicCourse basicCourse, Long schoolId) {
         int count = this.countByTeachingRoomId(basicCourse.getTeachingRoomId());
         List<SysOrg> sysOrgList = null;
         if (count == 0) {
@@ -689,7 +713,6 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             if (sysUserImportDtoList.get(0) instanceof DescribeImportDto) {
                 continue;
             }
-            map.put("dataCount", sysUserImportDtoList.size());
             for (int y = 0; y < Objects.requireNonNull(sysUserImportDtoList).size(); y++) {
                 SysUserImportDto sysUserImportDto = (SysUserImportDto) sysUserImportDtoList.get(y);
                 String name = sysUserImportDto.getName();
@@ -700,7 +723,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
                 UserSaveParams userSaveParams = new UserSaveParams();
                 Long orgId = this.analyzeOrgName(schoolId, orgName);
-                List<Long> roleIdList = this.analyzeRoleName(schoolId, roleName);
+                LinkedHashSet<Long> roleIdList = this.analyzeRoleName(schoolId, roleName);
 
                 SysUser oldUser = this.getOne(new QueryWrapper<SysUser>().lambda().eq(SysUser::getCode, code).eq(SysUser::getSchoolId, schoolId));
                 Long oldUserId = null;
@@ -780,14 +803,26 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                 .eq(BasicCourse::getCode, courseCode)
                 .eq(BasicCourse::getEnable, true);
         BasicCourse basicCourse = basicCourseService.getOne(basicCourseQueryWrapper);
-        if (Objects.isNull(basicCourse)) {
-            throw ExceptionResultEnum.ERROR.exception("找不到此课程信息");
-        }
+        Optional.ofNullable(basicCourse).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("课程数据为空"));
         List<SysOrg> sysOrgList = sysOrgService.findByConnectByRootOrgId(basicCourse.getTeachingRoomId());
         Set<Long> orgIds = sysOrgList.stream().map(s -> s.getId()).collect(Collectors.toSet());
         return sysUserService.filterFlowPrivilege(schoolId, orgIds, false, null, realName);
     }
 
+    /**
+     * 获取命题审批人
+     *
+     * @param realName
+     * @return
+     */
+    @Override
+    public List<ApproveUserResult> findByJxzyyAssignApprove(String realName) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        List<SysOrg> sysOrgList = sysOrgService.findByConnectByRootOrgId(sysUser.getOrgId());
+        Set<Long> orgIds = sysOrgList.stream().map(s -> s.getId()).collect(Collectors.toSet());
+        return sysUserService.filterFlowPrivilege(sysUser.getSchoolId(), orgIds, false, null, realName);
+    }
+
     /**
      * 获取教研室主任审批人
      *
@@ -803,12 +838,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                 .eq(BasicCourse::getCode, courseCode);
         BasicCourse basicCourse = basicCourseService.getOne(basicCourseQueryWrapper);
 
-        if (Objects.isNull(basicCourse)) {
-            throw ExceptionResultEnum.ERROR.exception("课程数据为空");
-        }
-        if (Objects.isNull(basicCourse.getTeachingRoomId())) {
-            throw ExceptionResultEnum.ERROR.exception("课程机构为空");
-        }
+        Optional.ofNullable(basicCourse).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("课程数据为空"));
+        Optional.ofNullable(basicCourse.getTeachingRoomId()).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("课程机构为空"));
         List<SysOrg> sysOrgList = sysOrgService.findByConnectByRootOrgId(basicCourse.getTeachingRoomId());
         Set<Long> orgIds = sysOrgList.stream().map(s -> s.getId()).collect(Collectors.toSet());
         List<ApproveUserResult> approveUserResultList = sysUserService.filterFlowPrivilege(schoolId, orgIds, true, FlowApproveNameEnum.DIRECTOR, realName);
@@ -818,6 +849,65 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return approveUserResultList;
     }
 
+    /**
+     * 获取教研室主任审批人
+     *
+     * @param realName
+     * @param flowApproveNameEnum
+     * @return
+     */
+    @Override
+    public List<ApproveUserResult> findByJxzyyDirectorApprove(String realName, FlowApproveNameEnum flowApproveNameEnum) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        AuthBean authBean = teachcloudCommonService.getUserAuth(sysUser.getId());
+        Set<SysRolePrivilege> sysRolePrivilegeSet = new HashSet<>();
+        for (SysRole s : authBean.getRoleList()) {
+            sysRolePrivilegeSet.addAll(teachcloudCommonService.getRolePrivilege(s.getId()));
+        }
+        boolean cjmt = false, cjss = false;
+        List<SysPrivilege> sysPrivilegeList = sysPrivilegeService.list(new QueryWrapper<SysPrivilege>().lambda().in(SysPrivilege::getUrl, Arrays.asList(FlowApproveNameEnum.DIRECTOR.getId(), FlowApproveNameEnum.PRESIDENT.getId())));
+        go:
+        for (SysRolePrivilege sysRolePrivilege : sysRolePrivilegeSet) {
+            for (SysPrivilege sysPrivilege : sysPrivilegeList) {
+                if (Objects.equals(sysPrivilege.getUrl(), FlowApproveNameEnum.DIRECTOR.getId()) && sysRolePrivilege.getPrivilegeId().longValue() == sysPrivilege.getId().longValue()) {
+                    cjmt = true;
+                } else if (Objects.equals(sysPrivilege.getUrl(), FlowApproveNameEnum.PRESIDENT.getId()) && sysRolePrivilege.getPrivilegeId().longValue() == sysPrivilege.getId().longValue()) {
+                    cjss = true;
+                }
+            }
+            if (cjmt && cjss) {
+                break go;
+            }
+        }
+        SysOrg sysOrg = authBean.getOrg();
+        if (sysOrg.getType() == OrgTypeEnum.SCHOOL) {//学校下是实施人员或者超级老师
+            List<ApproveUserResult> approveUserResultList = new ArrayList<>();
+            if (cjss && cjmt) {
+                List<ApproveUserResult> presidentList = this.findByJxzyyTopDirectorOrPresidentApprove(Arrays.asList(sysOrg.getId()), realName, FlowApproveNameEnum.PRESIDENT);
+                List<ApproveUserResult> directorList = this.findByJxzyyTopDirectorOrPresidentApprove(Arrays.asList(sysOrg.getId()), realName, FlowApproveNameEnum.DIRECTOR);
+                approveUserResultList.addAll(presidentList);
+                approveUserResultList.addAll(directorList);
+                Set<ApproveUserResult> approveUserResultSet = new HashSet<>(approveUserResultList);
+                approveUserResultList = new ArrayList<>(approveUserResultSet);
+            } else if (cjss) {
+                approveUserResultList = this.findByJxzyyTopDirectorOrPresidentApprove(Arrays.asList(sysOrg.getId()), realName, FlowApproveNameEnum.PRESIDENT);
+            } else if (cjmt && flowApproveNameEnum == FlowApproveNameEnum.DIRECTOR) {
+                approveUserResultList = this.findByJxzyyTopDirectorOrPresidentApprove(Arrays.asList(sysOrg.getId()), realName, FlowApproveNameEnum.DIRECTOR);
+            }
+            return approveUserResultList;
+        } else {//否则是学校命题老师
+            if (flowApproveNameEnum == FlowApproveNameEnum.DIRECTOR) {
+                List<ApproveUserResult> approveUserResultList = this.findByJxzyyTopDirectorOrPresidentApprove(Arrays.asList(sysOrg.getId()), realName, FlowApproveNameEnum.DIRECTOR);
+                List<SysOrg> sysOrgList = sysOrgService.findByConnectByParentId(sysUser.getOrgId(), true, false);
+                Set<Long> orgIds = sysOrgList.stream().map(s -> s.getId()).collect(Collectors.toSet());
+                approveUserResultList.addAll(sysUserService.filterFlowPrivilege(sysUser.getSchoolId(), orgIds, true, FlowApproveNameEnum.DIRECTOR, realName));
+                return approveUserResultList;
+            } else {
+                return null;
+            }
+        }
+    }
+
     /**
      * 获取院长审批人
      *
@@ -844,6 +934,29 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         }
     }
 
+    /**
+     * 获取院长审批人
+     *
+     * @param orgIds
+     * @param realName
+     * @return
+     */
+    @Override
+    public List<ApproveUserResult> findByJxzyyTopDirectorOrPresidentApprove(List<Long> orgIds, String realName, FlowApproveNameEnum flowApproveNameEnum) {
+        if (Objects.nonNull(orgIds) && orgIds.size() > 0) {
+            Long schoolId = SystemConstant.getHeadOrUserSchoolId();
+            Set<SysOrg> sysOrgSet = new HashSet<>();
+            for (Long l : orgIds) {
+                sysOrgSet.addAll(sysOrgService.findByJxzyyConnectByParentId(l, OrgTypeEnum.SCHOOL));
+            }
+            Set<Long> orgIdsSet = sysOrgSet.stream().map(s -> s.getId()).collect(Collectors.toSet());
+            List<ApproveUserResult> approveUserResultList = sysUserService.filterFlowPrivilege(schoolId, orgIdsSet, true, flowApproveNameEnum, realName);
+            return approveUserResultList;
+        } else {
+            return new ArrayList<>();
+        }
+    }
+
     /**
      * 获取同级别下一级审批人
      *
@@ -862,13 +975,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             basicCourseQueryWrapper.lambda().eq(BasicCourse::getSchoolId, schoolId)
                     .eq(BasicCourse::getCode, courseCode);
             BasicCourse basicCourse = basicCourseService.getOne(basicCourseQueryWrapper);
-
-            if (Objects.isNull(basicCourse)) {
-                throw ExceptionResultEnum.ERROR.exception("课程数据为空");
-            }
-            if (Objects.isNull(basicCourse.getTeachingRoomId())) {
-                throw ExceptionResultEnum.ERROR.exception("课程机构为空");
-            }
+            Optional.ofNullable(basicCourse).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("课程数据为空"));
+            Optional.ofNullable(basicCourse.getTeachingRoomId()).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("课程机构为空"));
             List<SysOrg> sysOrgList = sysOrgService.findByConnectByParentId(basicCourse.getTeachingRoomId(), true, true);
             orgIdsSet.addAll(sysOrgList.stream().map(BaseEntity::getId).collect(Collectors.toSet()));
         } else {
@@ -1171,9 +1279,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
      * @param roleName 角色名称组
      * @return 角色集合
      */
-    private List<Long> analyzeRoleName(Long schoolId, String roleName) {
-        List<Long> roleIdList = new ArrayList<>();
-        String[] arr = roleName.split(",");
+    private LinkedHashSet<Long> analyzeRoleName(Long schoolId, String roleName) {
+        LinkedHashSet<Long> roleIdList = new LinkedHashSet<>();
+        String[] arr = roleName.split(SystemConstant.COMMA);
         for (String cell : arr) {
             SysRole sysRole = sysRoleService.getOne(new QueryWrapper<SysRole>().lambda()
                     .eq(SysRole::getEnable, true)

+ 3 - 0
teachcloud-common/src/main/resources/mapper/BasicCourseMapper.xml

@@ -74,6 +74,9 @@
                 AND org.type = 'TEACHING_ROOM'
                 AND org.enable = TRUE
         <where>
+            <if test="belongOrgId != null and belongOrgId != ''">
+                AND bc.teaching_room_id = #{belongOrgId}
+            </if>
             <if test="courseName != null and courseName != ''">
                 AND bc.name LIKE CONCAT('%',#{courseName},'%')
             </if>

+ 9 - 0
teachcloud-common/src/main/resources/mapper/SysOrgMapper.xml

@@ -34,6 +34,15 @@
         </where>
     </select>
 
+    <select id="findByJxzyyConnectByParentId" resultType="com.qmth.teachcloud.common.entity.SysOrg">
+        SELECT su.* FROM (SELECT @a AS _id, (SELECT @a := so.parent_id FROM sys_org so WHERE so.id = _id) AS parent_id FROM (SELECT @a := #{orgId}) vars, sys_org h WHERE @a <![CDATA[ <> ]]> 0) temp JOIN sys_org su ON temp._id = su.id
+        <where>
+            <if test="orgType != null and orgType != ''">
+                and su.type = #{orgType}
+            </if>
+        </where>
+    </select>
+
     <select id="findByConnectByRootOrgId" resultType="com.qmth.teachcloud.common.entity.SysOrg">
         SELECT so.* FROM sys_org so WHERE FIND_IN_SET(id, getRootChildId(#{orgId}))
     </select>

+ 2 - 3
teachcloud-task/src/main/resources/application-task.properties

@@ -13,7 +13,7 @@ spring.application.name=teachcloud-task
 #\u6570\u636E\u6E90\u914D\u7F6E
 db.host=localhost
 db.port=3306
-db.name=distributed-v2.2.0-test
+db.name=distributed-v2.2.1-test
 db.username=root
 db.password=123456789
 
@@ -129,6 +129,5 @@ spring.quartz.properties.org.quartz.threadPool.threadPriority=5
 
 #\u914D\u7F6E\u6587\u4EF6
 #spring.profiles=task
-sync.config.hostUrl=http://localhost:8081
-
+sync.config.hostUrl=http://192.168.10.224:80
 sync.config.userSaveUrl=/api/user/external/save

+ 3 - 1
teachcloud-task/src/main/resources/application-task_36dev.properties

@@ -128,4 +128,6 @@ spring.quartz.properties.org.quartz.threadPool.threadCount=10
 spring.quartz.properties.org.quartz.threadPool.threadPriority=5
 
 #\u914D\u7F6E\u6587\u4EF6
-#spring.profiles=task
+#spring.profiles=task
+sync.config.hostUrl=http://localhost:8081
+sync.config.userSaveUrl=/api/user/external/save

+ 3 - 1
teachcloud-task/src/main/resources/application-task_release.properties

@@ -128,4 +128,6 @@ spring.quartz.properties.org.quartz.threadPool.threadCount=10
 spring.quartz.properties.org.quartz.threadPool.threadPriority=5
 
 #\u914D\u7F6E\u6587\u4EF6
-#spring.profiles=task
+#spring.profiles=task
+sync.config.hostUrl=http://localhost:8081
+sync.config.userSaveUrl=/api/user/external/save

+ 3 - 1
teachcloud-task/src/main/resources/application-task_test.properties

@@ -128,4 +128,6 @@ spring.quartz.properties.org.quartz.threadPool.threadCount=10
 spring.quartz.properties.org.quartz.threadPool.threadPriority=5
 
 #\u914D\u7F6E\u6587\u4EF6
-#spring.profiles=task
+#spring.profiles=task
+sync.config.hostUrl=http://localhost:8081
+sync.config.userSaveUrl=/api/user/external/save

+ 69 - 0
teachcloud-task/src/main/resources/processes/JxzyydxPaperApprove.bpmn

@@ -0,0 +1,69 @@
+<?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="JxzyyPaperApprove" name="JxzyyPaperApprove" isExecutable="true">
+    <startEvent id="startevent1" name="Start"></startEvent>
+    <userTask id="usertask1" name="提交试卷" activiti:assignee="${approveId}"></userTask>
+    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
+    <endEvent id="endevent1" name="End"></endEvent>
+    <userTask id="usertask2" name="审核试卷">
+      <extensionElements>
+        <activiti:taskListener event="create" class="com.qmth.distributed.print.business.activiti.DirectorApproveByJxzyyListener"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
+    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
+    <exclusiveGateway id="exclusivegateway1" name="审批"></exclusiveGateway>
+    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="exclusivegateway1"></sequenceFlow>
+    <sequenceFlow id="flow4" name="通过" sourceRef="exclusivegateway1" targetRef="endevent1">
+      <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>
+  </process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_JxzyyPaperApprove">
+    <bpmndi:BPMNPlane bpmnElement="JxzyyPaperApprove" id="BPMNPlane_JxzyyPaperApprove">
+      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="80.0" y="80.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
+        <omgdc:Bounds height="55.0" width="105.0" x="160.0" y="70.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="345.0" y="270.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
+        <omgdc:Bounds height="55.0" width="105.0" x="310.0" y="70.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1">
+        <omgdc:Bounds height="40.0" width="40.0" x="342.0" y="180.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
+        <omgdi:waypoint x="115.0" y="97.0"></omgdi:waypoint>
+        <omgdi:waypoint x="160.0" y="97.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
+        <omgdi:waypoint x="265.0" y="97.0"></omgdi:waypoint>
+        <omgdi:waypoint x="310.0" y="97.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
+        <omgdi:waypoint x="362.0" y="125.0"></omgdi:waypoint>
+        <omgdi:waypoint x="362.0" y="180.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
+        <omgdi:waypoint x="362.0" y="220.0"></omgdi:waypoint>
+        <omgdi:waypoint x="362.0" y="270.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="16.0" width="22.0" x="362.0" y="220.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
+        <omgdi:waypoint x="342.0" y="200.0"></omgdi:waypoint>
+        <omgdi:waypoint x="212.0" y="199.0"></omgdi:waypoint>
+        <omgdi:waypoint x="212.0" y="125.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="16.0" width="22.0" x="342.0" y="200.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</definitions>