xiaof 3 years ago
parent
commit
7b5c56fbcd
55 changed files with 2511 additions and 629 deletions
  1. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/DirectorApproveListener.java
  2. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/PresidentApproveListener.java
  3. 72 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/BasicStudentImportDto.java
  4. 95 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/BasicStudentParams.java
  5. 29 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/DeleteBatchParams.java
  6. 127 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/BasicStudentResult.java
  7. 197 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/TaskApproveResult.java
  8. 66 34
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/WorkResult.java
  9. 13 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TFFlowApprove.java
  10. 143 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TFFlowApproveLog.java
  11. 8 21
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TFFlowLog.java
  12. 6 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/ExamStatusEnum.java
  13. 10 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/BasicStudentMapper.java
  14. 16 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TFFlowApproveLogMapper.java
  15. 12 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TFFlowMapper.java
  16. 5 12
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ActivitiService.java
  17. 24 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/BasicStudentService.java
  18. 16 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TFFlowApproveLogService.java
  19. 13 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TFFlowService.java
  20. 137 50
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ActivitiServiceImpl.java
  21. 6 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicCampusServiceImpl.java
  22. 98 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicStudentServiceImpl.java
  23. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java
  24. 35 26
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  25. 1 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceServiceImpl.java
  26. 20 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TFFlowApproveLogServiceImpl.java
  27. 15 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TFFlowServiceImpl.java
  28. 60 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncStudentDataImportService.java
  29. 8 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/TaskLogicService.java
  30. 47 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java
  31. 36 0
      distributed-print-business/src/main/resources/mapper/BasicStudentMapper.xml
  32. 351 279
      distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml
  33. 5 0
      distributed-print-business/src/main/resources/mapper/TFFlowApproveLogMapper.xml
  34. 4 0
      distributed-print-business/src/main/resources/mapper/TFFlowMapper.xml
  35. 84 84
      distributed-print/src/main/java/com/qmth/distributed/print/api/ActivitiController.java
  36. 71 31
      distributed-print/src/main/java/com/qmth/distributed/print/api/BasicCourseController.java
  37. 68 3
      distributed-print/src/main/java/com/qmth/distributed/print/api/BasicStudentController.java
  38. 20 27
      distributed-print/src/main/java/com/qmth/distributed/print/api/TFFlowController.java
  39. 1 1
      distributed-print/src/main/resources/processes/GdykdxPaperApprove.bpmn
  40. 83 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/BasicCourseParams.java
  41. 116 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/BasicCourseResult.java
  42. 7 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  43. 25 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicCourse.java
  44. 12 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicUserCourse.java
  45. 0 44
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FlowApproveLevelEnum.java
  46. 3 3
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FlowApprovePassEnum.java
  47. 75 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FlowGdykdxApproveSetupEnum.java
  48. 1 5
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FlowStatusEnum.java
  49. 2 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/TaskTypeEnum.java
  50. 21 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/BasicCourseMapper.java
  51. 29 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/BasicCourseService.java
  52. 11 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/BasicUserCourseService.java
  53. 105 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicCourseServiceImpl.java
  54. 56 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicUserCourseServiceImpl.java
  55. 43 0
      teachcloud-common/src/main/resources/mapper/BasicCourseMapper.xml

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

@@ -20,6 +20,6 @@ public class DirectorApproveListener implements TaskListener {
     @Override
     public void notify(DelegateTask delegateTask) {
         //添加或签的人员,一人通过即可进入下一环节
-        delegateTask.addCandidateUsers(Arrays.asList("王总", "赵总"));
+        delegateTask.addCandidateUsers(Arrays.asList("4", "8"));
     }
 }

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

@@ -20,6 +20,6 @@ public class PresidentApproveListener implements TaskListener {
     @Override
     public void notify(DelegateTask delegateTask) {
         //添加或签的人员,一人通过即可进入下一环节
-        delegateTask.addCandidateUsers(Arrays.asList("王总", "赵总"));
+        delegateTask.addCandidateUsers(Arrays.asList("2", "6"));
     }
 }

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

@@ -0,0 +1,72 @@
+package com.qmth.distributed.print.business.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 基础学生数据导入类
+ * @Author: CaoZixuan
+ * @Date: 2021-08-05
+ */
+public class BasicStudentImportDto {
+    @ExcelNote(value = "姓名")
+    @NotNull
+    private String studentName;
+
+    @ExcelNote(value = "学号")
+    @NotNull
+    private String studentCode;
+
+    @ExcelNote(value = "手机号")
+    @NotNull
+    private String phoneNumber;
+
+    @ExcelNote(value = "校区")
+    @NotNull
+    private String campusName;
+
+    @ExcelNote(value = "班级")
+    @NotNull
+    private String clazz;
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getPhoneNumber() {
+        return phoneNumber;
+    }
+
+    public void setPhoneNumber(String phoneNumber) {
+        this.phoneNumber = phoneNumber;
+    }
+
+    public String getCampusName() {
+        return campusName;
+    }
+
+    public void setCampusName(String campusName) {
+        this.campusName = campusName;
+    }
+
+    public String getClazz() {
+        return clazz;
+    }
+
+    public void setClazz(String clazz) {
+        this.clazz = clazz;
+    }
+}

+ 95 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/BasicStudentParams.java

@@ -0,0 +1,95 @@
+package com.qmth.distributed.print.business.bean.params;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Length;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 基础学生参数
+ * @Author: CaoZixuan
+ * @Date: 2021-08-04
+ */
+public class BasicStudentParams {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "学生id(修改时必填)")
+    private Long id;
+
+    @ApiModelProperty(value = "学生名称")
+    @NotNull(message = "请输入学生名称")
+    @Length(min = 1,message = "请输入学生名称")
+    private String studentName;
+
+    @ApiModelProperty(value = "学生学号")
+    @NotNull(message = "请输入学生学号")
+    @Length(min = 1,message = "请输入学生学号")
+    private String studentCode;
+
+    @ApiModelProperty(value = "手机号码")
+    @NotNull(message = "请输入手机号码")
+    @Length(min = 1,message = "请输入手机号码")
+    private String phoneNumber;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "校区主键")
+    @NotNull(message = "请选择校区")
+    @Range(min = 1L, message = "请选择校区")
+    private Long campusId;
+
+    @ApiModelProperty(value = "班级信息")
+    @NotNull(message = "请输入班级信息")
+    @Length(min = 1,message = "请输入班级信息")
+    private String clazz;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getPhoneNumber() {
+        return phoneNumber;
+    }
+
+    public void setPhoneNumber(String phoneNumber) {
+        this.phoneNumber = phoneNumber;
+    }
+
+    public Long getCampusId() {
+        return campusId;
+    }
+
+    public void setCampusId(Long campusId) {
+        this.campusId = campusId;
+    }
+
+    public String getClazz() {
+        return clazz;
+    }
+
+    public void setClazz(String clazz) {
+        this.clazz = clazz;
+    }
+}

+ 29 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/DeleteBatchParams.java

@@ -0,0 +1,29 @@
+package com.qmth.distributed.print.business.bean.params;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * @Description: 批量删除参数接收类
+ * @Author: CaoZixuan
+ * @Date: 2021-08-04
+ */
+public class DeleteBatchParams {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "选择的要删除的id数组",required = true)
+    @NotEmpty(message = "必须勾选要删除的目标")
+    private List<Long> idList;
+
+    public List<Long> getIdList() {
+        return idList;
+    }
+
+    public void setIdList(List<Long> idList) {
+        this.idList = idList;
+    }
+}

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

@@ -0,0 +1,127 @@
+package com.qmth.distributed.print.business.bean.result;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 基础学生信息查询结果类
+ * @Author: CaoZixuan
+ * @Date: 2021-08-04
+ */
+public class BasicStudentResult {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "学生id")
+    private Long id;
+
+    @ApiModelProperty(value = "学生姓名")
+    private String studentName;
+
+    @ApiModelProperty(value = "学生学号")
+    private String studentCode;
+
+    @ApiModelProperty(value = "学生电话")
+    private String phoneNumber;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "校区id")
+    private Long campusId;
+
+    @ApiModelProperty(value = "校区名称")
+    private String campusName;
+
+    @ApiModelProperty(value = "班级信息")
+    private String clazz;
+
+    @ApiModelProperty(value = "是否被逻辑删除?")
+    private Boolean enable;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "创建时间")
+    private Long createTime;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "创建人id")
+    private Long createId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getPhoneNumber() {
+        return phoneNumber;
+    }
+
+    public void setPhoneNumber(String phoneNumber) {
+        this.phoneNumber = phoneNumber;
+    }
+
+    public Long getCampusId() {
+        return campusId;
+    }
+
+    public void setCampusId(Long campusId) {
+        this.campusId = campusId;
+    }
+
+    public String getCampusName() {
+        return campusName;
+    }
+
+    public void setCampusName(String campusName) {
+        this.campusName = campusName;
+    }
+
+    public String getClazz() {
+        return clazz;
+    }
+
+    public void setClazz(String clazz) {
+        this.clazz = clazz;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+    public Long getCreateId() {
+        return createId;
+    }
+
+    public void setCreateId(Long createId) {
+        this.createId = createId;
+    }
+}

+ 197 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/TaskApproveResult.java

@@ -0,0 +1,197 @@
+package com.qmth.distributed.print.business.bean.result;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.enums.FlowStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @Description: 流程审批列表result
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/8/5
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class TaskApproveResult implements Serializable {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "流程id")
+    private Long flowId;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "学校id")
+    private Long schoolId;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "机构id")
+    private Long orgId;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "命题任务id")
+    private Long taskId;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "发起人id")
+    private Long teacherId;
+
+    @ApiModelProperty(value = "发起人名称")
+    private String teacherName;
+
+    @ApiModelProperty(value = "创建时间")
+    private Long createTime;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "一级审核人id")
+    private Long primaryApproveId;
+
+    @ApiModelProperty(value = "一级审核人名称")
+    private String primaryApproveName;
+
+    @ApiModelProperty(value = "一级审核人意见")
+    private String primaryApproveRemark;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "二级审核人id")
+    private Long secondApproveId;
+
+    @ApiModelProperty(value = "二级审核人名称")
+    private String secondApproveName;
+
+    @ApiModelProperty(value = "二级审核人意见")
+    private String secondApproveRemark;
+
+    @ApiModelProperty(value = "流程状态")
+    private FlowStatusEnum status;
+
+    @ApiModelProperty(value = "流程状态")
+    private String statusStr;
+
+    public Long getFlowId() {
+        return flowId;
+    }
+
+    public void setFlowId(Long flowId) {
+        this.flowId = flowId;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public Long getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(Long taskId) {
+        this.taskId = taskId;
+    }
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+    public Long getPrimaryApproveId() {
+        return primaryApproveId;
+    }
+
+    public void setPrimaryApproveId(Long primaryApproveId) {
+        this.primaryApproveId = primaryApproveId;
+    }
+
+    public String getPrimaryApproveName() {
+        return primaryApproveName;
+    }
+
+    public void setPrimaryApproveName(String primaryApproveName) {
+        this.primaryApproveName = primaryApproveName;
+    }
+
+    public String getPrimaryApproveRemark() {
+        return primaryApproveRemark;
+    }
+
+    public void setPrimaryApproveRemark(String primaryApproveRemark) {
+        this.primaryApproveRemark = primaryApproveRemark;
+    }
+
+    public Long getSecondApproveId() {
+        return secondApproveId;
+    }
+
+    public void setSecondApproveId(Long secondApproveId) {
+        this.secondApproveId = secondApproveId;
+    }
+
+    public String getSecondApproveName() {
+        return secondApproveName;
+    }
+
+    public void setSecondApproveName(String secondApproveName) {
+        this.secondApproveName = secondApproveName;
+    }
+
+    public String getSecondApproveRemark() {
+        return secondApproveRemark;
+    }
+
+    public void setSecondApproveRemark(String secondApproveRemark) {
+        this.secondApproveRemark = secondApproveRemark;
+    }
+
+    public FlowStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(FlowStatusEnum status) {
+        this.status = status;
+    }
+
+    public String getStatusStr() {
+        if (Objects.nonNull(status)) {
+            return status.getTitle();
+        } else {
+            return statusStr;
+        }
+    }
+
+    public void setStatusStr(String statusStr) {
+        this.statusStr = statusStr;
+    }
+}

+ 66 - 34
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/WorkResult.java

@@ -8,6 +8,7 @@ import com.qmth.teachcloud.common.enums.FlowStatusEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
+import java.util.Objects;
 
 /**
  * @Description: 工作台 result
@@ -42,7 +43,8 @@ public class WorkResult implements Serializable {
     String cardRuleName;
 
     @ApiModelProperty(value = "用户ID")
-    String userId;
+    @JsonSerialize(using = ToStringSerializer.class)
+    Long userId;
 
     @ApiModelProperty(value = "用户名称")
     String userName;
@@ -53,13 +55,17 @@ public class WorkResult implements Serializable {
     @ApiModelProperty(value = "命题结束时间")
     Long endTime;
 
-    @ApiModelProperty(value = "状态")
+    @ApiModelProperty(value = "流程状态")
     FlowStatusEnum status;
 
+    @ApiModelProperty(value = "流程状态")
+    String statusStr;
+
     @ApiModelProperty(value = "剩余天数")
     Integer remainCount;
 
     @ApiModelProperty(value = "提交人")
+    @JsonSerialize(using = ToStringSerializer.class)
     Long createId;
 
     @ApiModelProperty(value = "提交时间")
@@ -71,11 +77,13 @@ public class WorkResult implements Serializable {
     @ApiModelProperty(value = "当前服务器时间")
     Long systemCurrentTime;
 
+    @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "执行id")
-    String executionId;
+    Long executionId;
 
-    @ApiModelProperty(value = "流程实例id")
-    String flowId;
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "流程id")
+    Long flowId;
 
     @ApiModelProperty(value = "任务节点名称")
     String taskName;
@@ -83,31 +91,39 @@ public class WorkResult implements Serializable {
     @ApiModelProperty(value = "任务节点key")
     String taskDefKey;
 
+    @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "任务节点id")
-    String taskId;
+    Long taskId;
 
-    public FlowStatusEnum getStatus() {
-        return status;
+    @ApiModelProperty(value = "流程步骤")
+    Integer setup;
+
+    public String getStatusStr() {
+        if (Objects.nonNull(status)) {
+            return status.getTitle();
+        } else {
+            return statusStr;
+        }
     }
 
-    public void setStatus(FlowStatusEnum status) {
-        this.status = status;
+    public void setStatusStr(String statusStr) {
+        this.statusStr = statusStr;
     }
 
-    public String getFlowId() {
-        return flowId;
+    public Integer getSetup() {
+        return setup;
     }
 
-    public void setFlowId(String flowId) {
-        this.flowId = flowId;
+    public void setSetup(Integer setup) {
+        this.setup = setup;
     }
 
-    public String getExecutionId() {
-        return executionId;
+    public FlowStatusEnum getStatus() {
+        return status;
     }
 
-    public void setExecutionId(String executionId) {
-        this.executionId = executionId;
+    public void setStatus(FlowStatusEnum status) {
+        this.status = status;
     }
 
     public String getTaskName() {
@@ -126,14 +142,6 @@ public class WorkResult implements Serializable {
         this.taskDefKey = taskDefKey;
     }
 
-    public String getTaskId() {
-        return taskId;
-    }
-
-    public void setTaskId(String taskId) {
-        this.taskId = taskId;
-    }
-
     public Long getId() {
         return id;
     }
@@ -190,14 +198,6 @@ public class WorkResult implements Serializable {
         this.cardRuleName = cardRuleName;
     }
 
-    public String getUserId() {
-        return userId;
-    }
-
-    public void setUserId(String userId) {
-        this.userId = userId;
-    }
-
     public String getUserName() {
         return userName;
     }
@@ -261,4 +261,36 @@ public class WorkResult implements Serializable {
     public void setSystemCurrentTime(Long systemCurrentTime) {
         this.systemCurrentTime = systemCurrentTime;
     }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getExecutionId() {
+        return executionId;
+    }
+
+    public void setExecutionId(Long executionId) {
+        this.executionId = executionId;
+    }
+
+    public Long getFlowId() {
+        return flowId;
+    }
+
+    public void setFlowId(Long flowId) {
+        this.flowId = flowId;
+    }
+
+    public Long getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(Long taskId) {
+        this.taskId = taskId;
+    }
 }

+ 13 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TFFlowApprove.java

@@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 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.FlowStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -37,6 +38,9 @@ public class TFFlowApprove extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "状态,DRAFT:草稿,TO_BE_SUBMIT:待提交,SUBMIT:已提交,AUDITING:审核中,REJECT:已驳回,END:已终止,FINISH:已结束")
     private FlowStatusEnum status;
 
+    @ApiModelProperty(value = "计划步骤")
+    private Integer setup;
+
     public TFFlowApprove() {
 
     }
@@ -46,6 +50,15 @@ public class TFFlowApprove extends BaseEntity implements Serializable {
         this.approveId = approveId;
         this.status = status;
         insertInfo(userId);
+        this.setup = FlowGdykdxApproveSetupEnum.SUBMIT.getSetup();
+    }
+
+    public Integer getSetup() {
+        return setup;
+    }
+
+    public void setSetup(Integer setup) {
+        this.setup = setup;
     }
 
     public FlowStatusEnum getStatus() {

+ 143 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TFFlowApproveLog.java

@@ -0,0 +1,143 @@
+package com.qmth.distributed.print.business.entity;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.base.BaseEntity;
+import com.qmth.teachcloud.common.enums.FlowApproveOperationEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 流程审批记录
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-08-05
+ */
+@ApiModel(value = "TFFlowApproveLog对象", description = "流程审批记录")
+public class TFFlowApproveLog extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "流程id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long flowId;
+
+    @ApiModelProperty(value = "命题任务id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long taskId;
+
+    @ApiModelProperty(value = "发起人id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long teacherId;
+
+    @ApiModelProperty(value = "一级审核人id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long primaryApproveId;
+
+    @ApiModelProperty(value = "一级审核人意见")
+    private String primaryApproveRemark;
+
+    @ApiModelProperty(value = "一级审核人操作,SUBMIT:提交,APPROVE:审批,REJECT:驳回,END:终止")
+    private FlowApproveOperationEnum primaryApproveOperation;
+
+    @ApiModelProperty(value = "二级审核人id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long secondApproveId;
+
+    @ApiModelProperty(value = "二级审核人意见")
+    private String secondApproveRemark;
+
+    @ApiModelProperty(value = "二级审核人操作,SUBMIT:提交,APPROVE:审批,REJECT:驳回,END:终止")
+    private FlowApproveOperationEnum secondApproveOperation;
+
+    @ApiModelProperty(value = "是否启用,0:停用,1:启用")
+    private Boolean enable;
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public Long getFlowId() {
+        return flowId;
+    }
+
+    public void setFlowId(Long flowId) {
+        this.flowId = flowId;
+    }
+
+    public Long getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(Long taskId) {
+        this.taskId = taskId;
+    }
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public Long getPrimaryApproveId() {
+        return primaryApproveId;
+    }
+
+    public void setPrimaryApproveId(Long primaryApproveId) {
+        this.primaryApproveId = primaryApproveId;
+    }
+
+    public String getPrimaryApproveRemark() {
+        return primaryApproveRemark;
+    }
+
+    public void setPrimaryApproveRemark(String primaryApproveRemark) {
+        this.primaryApproveRemark = primaryApproveRemark;
+    }
+
+    public FlowApproveOperationEnum getPrimaryApproveOperation() {
+        return primaryApproveOperation;
+    }
+
+    public void setPrimaryApproveOperation(FlowApproveOperationEnum primaryApproveOperation) {
+        this.primaryApproveOperation = primaryApproveOperation;
+    }
+
+    public Long getSecondApproveId() {
+        return secondApproveId;
+    }
+
+    public void setSecondApproveId(Long secondApproveId) {
+        this.secondApproveId = secondApproveId;
+    }
+
+    public String getSecondApproveRemark() {
+        return secondApproveRemark;
+    }
+
+    public void setSecondApproveRemark(String secondApproveRemark) {
+        this.secondApproveRemark = secondApproveRemark;
+    }
+
+    public FlowApproveOperationEnum getSecondApproveOperation() {
+        return secondApproveOperation;
+    }
+
+    public void setSecondApproveOperation(FlowApproveOperationEnum secondApproveOperation) {
+        this.secondApproveOperation = secondApproveOperation;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+}

+ 8 - 21
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TFFlowLog.java

@@ -3,10 +3,7 @@ package com.qmth.distributed.print.business.entity;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.teachcloud.common.base.BaseEntity;
-import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.enums.FlowApproveLevelEnum;
 import com.qmth.teachcloud.common.enums.FlowApproveOperationEnum;
-import com.qmth.teachcloud.common.enums.FlowApprovePassEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -37,8 +34,8 @@ public class TFFlowLog extends BaseEntity implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long approveId;
 
-    @ApiModelProperty(value = "审核等级")
-    private Integer approveLevel;
+    @ApiModelProperty(value = "审核步骤")
+    private Integer approveSetup;
 
     @ApiModelProperty(value = "审核意见")
     private String approveRemark;
@@ -49,17 +46,15 @@ public class TFFlowLog extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "审批操作,SUBMIT:提交,APPROVE:审批,REJECT:驳回,END:终止")
     private FlowApproveOperationEnum approveOperation;
 
-    @ApiModelProperty(value = "审批是否通过,PASS:通过,NO_PASS:不通过")
-    private FlowApprovePassEnum approvePass;
-
     public TFFlowLog() {
 
     }
 
-    public TFFlowLog(Long flowId, Long taskId, Long approveId, Long userId) {
+    public TFFlowLog(Long flowId, Long taskId, Long approveId, Long userId, String approveRemark) {
         this.flowId = flowId;
         this.approveId = approveId;
         this.taskId = taskId;
+        this.approveRemark = approveRemark;
         insertInfo(userId);
     }
 
@@ -71,14 +66,6 @@ public class TFFlowLog extends BaseEntity implements Serializable {
         this.approveOperation = approveOperation;
     }
 
-    public FlowApprovePassEnum getApprovePass() {
-        return approvePass;
-    }
-
-    public void setApprovePass(FlowApprovePassEnum approvePass) {
-        this.approvePass = approvePass;
-    }
-
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }
@@ -107,12 +94,12 @@ public class TFFlowLog extends BaseEntity implements Serializable {
         this.approveId = approveId;
     }
 
-    public Integer getApproveLevel() {
-        return approveLevel;
+    public Integer getApproveSetup() {
+        return approveSetup;
     }
 
-    public void setApproveLevel(Integer approveLevel) {
-        this.approveLevel = approveLevel;
+    public void setApproveSetup(Integer approveSetup) {
+        this.approveSetup = approveSetup;
     }
 
     public String getApproveRemark() {

+ 6 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/ExamStatusEnum.java

@@ -7,6 +7,7 @@ import java.util.List;
 
 /**
  * 命题类型
+ *
  * @Date: 2021/3/23.
  */
 public enum ExamStatusEnum {
@@ -14,9 +15,12 @@ public enum ExamStatusEnum {
     NEW("新建"),
     READY("待命题"),
     STAGE("进行中"),
-    SUBMIT("待审核"),
     FINISH("已完成"),
-    CANCEL("撤回");
+    CANCEL("撤回"),
+
+    DRAFT("草稿"),
+
+    SUBMIT("已提交");
 
     ExamStatusEnum(String desc) {
         this.desc = desc;

+ 10 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/BasicStudentMapper.java

@@ -2,11 +2,16 @@ package com.qmth.distributed.print.business.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.qmth.distributed.print.business.bean.dto.TaskPrintClassDto;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.distributed.print.business.bean.result.BasicStudentResult;
 import com.qmth.distributed.print.business.entity.BasicStudent;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
+import java.util.Set;
+
 /**
  * <p>
  * 学校id Mapper 接口
@@ -18,4 +23,9 @@ import java.util.List;
 public interface BasicStudentMapper extends BaseMapper<BasicStudent> {
 
     List<TaskPrintClassDto> listByClass(@Param("schoolId") Long schoolId, @Param("stringList") List<String> stringList);
+
+    IPage<BasicStudentResult> findBasicStudentPage(@Param("iPage") Page<BasicStudentResult> iPage,
+                                                @Param("queryParams") String queryParams,
+                                                @Param("schoolId") Long schoolId,
+                                                @Param("orgIds") Set<Long> orgIds);
 }

+ 16 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TFFlowApproveLogMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.distributed.print.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.distributed.print.business.entity.TFFlowApproveLog;
+
+/**
+ * <p>
+ * 流程审批记录 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-08-05
+ */
+public interface TFFlowApproveLogMapper extends BaseMapper<TFFlowApproveLog> {
+
+}

+ 12 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TFFlowMapper.java

@@ -2,6 +2,7 @@ package com.qmth.distributed.print.business.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.qmth.distributed.print.business.bean.result.TaskApproveResult;
 import com.qmth.distributed.print.business.entity.TFFlow;
 import org.apache.ibatis.annotations.Param;
 
@@ -27,4 +28,15 @@ public interface TFFlowMapper extends BaseMapper<TFFlow> {
      * @return
      */
     IPage<TFFlow> list(IPage<Map> iPage, @Param("name") String name, @Param("schoolId") Long schoolId, @Param("orgId") Long orgId);
+
+    /**
+     * 流程审批记录列表
+     *
+     * @param iPage
+     * @param teacherName
+     * @param schoolId
+     * @param orgId
+     * @return
+     */
+    IPage<TaskApproveResult> taskApproveList(IPage<Map> iPage, @Param("teacherName") String teacherName, @Param("schoolId") Long schoolId, @Param("orgId") Long orgId);
 }

+ 5 - 12
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ActivitiService.java

@@ -57,23 +57,16 @@ public interface ActivitiService {
     void deleteProcessInstance(String flowId);
 
     /**
-     * 记录流程日志
+     * 流程启动
      *
      * @param map
      */
-    public void flowLog(Map<String, Object> map);
+    public void flowStart(Map<String, Object> map);
 
     /**
-     * 根据taskId获取任务
+     * 审批任务
      *
-     * @param taskId
-     */
-    public void approveByTaskId(Long taskId);
-
-    /**
-     * 根据id获取任务列表
-     *
-     * @param userId
+     * @param map
      */
-    public void getTaskList(Long userId);
+    public void taskApprove(Map<String, Object> map);
 }

+ 24 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/BasicStudentService.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.distributed.print.business.bean.dto.TaskPrintClassDto;
+import com.qmth.distributed.print.business.bean.params.BasicStudentParams;
+import com.qmth.distributed.print.business.bean.result.BasicStudentResult;
 import com.qmth.distributed.print.business.entity.BasicStudent;
 
 import java.util.List;
@@ -21,4 +23,26 @@ public interface BasicStudentService extends IService<BasicStudent> {
     IPage<BasicStudent> listPage(Page<BasicStudent> page, String classId);
 
     List<TaskPrintClassDto> listByClass(Long schoolId, List<String> stringList);
+    /**
+     * 学生基础信息分页查询
+     * @param queryParams 查询参数(学生学号或姓名)
+     * @param pageNumber 分页页码
+     * @param pageSize 分页容量
+     * @return 分页结果
+     */
+    IPage<BasicStudentResult> basicStudentPage(String queryParams,int pageNumber,int pageSize);
+
+    /**
+     * 新增/编辑 学生基础信息
+     * @param basicStudentParams 基础学生信息参数
+     * @return 新增或编辑的校区id
+     */
+    Long saveBasicStudent(BasicStudentParams basicStudentParams);
+
+    /**
+     * 批量删除学生基本信息(逻辑)
+     * @param idList 要删除的学生主键集合
+     * @return 是否删除成功
+     */
+    Boolean removeBasicStudentBatch(List<Long> idList);
 }

+ 16 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TFFlowApproveLogService.java

@@ -0,0 +1,16 @@
+package com.qmth.distributed.print.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.distributed.print.business.entity.TFFlowApproveLog;
+
+/**
+ * <p>
+ * 流程审批记录 服务类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-08-05
+ */
+public interface TFFlowApproveLogService extends IService<TFFlowApproveLog> {
+
+}

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

@@ -2,6 +2,7 @@ package com.qmth.distributed.print.business.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.distributed.print.business.bean.result.TaskApproveResult;
 import com.qmth.distributed.print.business.entity.TFFlow;
 import com.qmth.teachcloud.common.entity.SysRole;
 
@@ -26,5 +27,16 @@ public interface TFFlowService extends IService<TFFlow> {
      * @param orgId
      * @return
      */
-    IPage<TFFlow> list(IPage<Map> iPage, String name, Long schoolId, Long orgId);
+    public IPage<TFFlow> list(IPage<Map> iPage, String name, Long schoolId, Long orgId);
+
+    /**
+     * 流程审批记录列表
+     *
+     * @param iPage
+     * @param teacherName
+     * @param schoolId
+     * @param orgId
+     * @return
+     */
+    public IPage<TaskApproveResult> taskApproveList(IPage<Map> iPage, String teacherName, Long schoolId, Long orgId);
 }

+ 137 - 50
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ActivitiServiceImpl.java

@@ -1,24 +1,27 @@
 package com.qmth.distributed.print.business.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qmth.distributed.print.business.entity.ExamTask;
 import com.qmth.distributed.print.business.entity.TFFlowApprove;
 import com.qmth.distributed.print.business.entity.TFFlowLog;
 import com.qmth.distributed.print.business.service.ActivitiService;
+import com.qmth.distributed.print.business.service.ExamTaskService;
 import com.qmth.distributed.print.business.service.TFFlowApproveService;
 import com.qmth.distributed.print.business.service.TFFlowLogService;
+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.FlowStatusEnum;
+import com.qmth.teachcloud.common.enums.*;
 import com.qmth.teachcloud.common.util.ServletUtil;
+import org.activiti.bpmn.model.BpmnModel;
+import org.activiti.bpmn.model.FlowNode;
+import org.activiti.bpmn.model.UserTask;
 import org.activiti.engine.HistoryService;
 import org.activiti.engine.RepositoryService;
 import org.activiti.engine.RuntimeService;
 import org.activiti.engine.TaskService;
 import org.activiti.engine.impl.RepositoryServiceImpl;
-import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
 import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
-import org.activiti.engine.impl.persistence.entity.TaskEntity;
 import org.activiti.engine.repository.DeploymentBuilder;
 import org.activiti.engine.runtime.ProcessInstance;
 import org.activiti.engine.task.Task;
@@ -65,6 +68,9 @@ public class ActivitiServiceImpl implements ActivitiService {
     @Resource
     HistoryService historyService;
 
+    @Resource
+    ExamTaskService examTaskService;
+
     /**
      * 注册流程
      *
@@ -135,6 +141,11 @@ public class ActivitiServiceImpl implements ActivitiService {
             processInstance = runtimeService.startProcessInstanceByKey(processKey);
         }
         log.info("流程id:{},processInstanceId:{},processDefinitionId:{},processDefinitionKey:{}", processInstance.getId(), processInstance.getProcessInstanceId(), processInstance.getProcessDefinitionId(), processInstance.getProcessDefinitionKey());
+        ProcessInstance finalProcessInstance = processInstance;
+        map.computeIfAbsent(SystemConstant.FLOW_ID, v -> finalProcessInstance.getId());
+        map.computeIfAbsent(SystemConstant.FLOW_STATUS, v -> FlowStatusEnum.START);
+        ActivitiService activitiService = SpringContextHolder.getBean(ActivitiService.class);
+        activitiService.flowStart(map);
         return processInstance;
     }
 
@@ -163,73 +174,149 @@ public class ActivitiServiceImpl implements ActivitiService {
     }
 
     /**
-     * 记录流程日志
+     * 流程启动
      *
      * @param map
      */
     @Override
     @Transactional
-    public void flowLog(Map<String, Object> map) {
+    public void flowStart(Map<String, Object> map) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+
         if (Objects.isNull(map.get(SystemConstant.FLOW_ID))) {
             throw ExceptionResultEnum.ERROR.exception("流程id不能为空");
         }
-        Long flowId = (Long) map.get(SystemConstant.FLOW_ID);
-        if (Objects.isNull(map.get(SystemConstant.TASK_ID))) {
-            throw ExceptionResultEnum.ERROR.exception("命题任务id不能为空");
-        }
-        Long taskId = (Long) map.get(SystemConstant.TASK_ID);
+        Long flowId = Long.parseLong(map.get(SystemConstant.FLOW_ID).toString());
+
         if (Objects.isNull(map.get(SystemConstant.FLOW_STATUS))) {
             throw ExceptionResultEnum.ERROR.exception("流程状态不能为空");
         }
         FlowStatusEnum flowStatusEnum = (FlowStatusEnum) map.get(SystemConstant.FLOW_STATUS);
-        Long teachId = Objects.nonNull(map.get(SystemConstant.TEACH_ID)) ? Long.parseLong(String.valueOf(map.get(SystemConstant.TEACH_ID))) : null;
-        QueryWrapper<TFFlowApprove> tfFlowApproveQueryWrapper = new QueryWrapper<>();
-        tfFlowApproveQueryWrapper.lambda().eq(TFFlowApprove::getFlowId, flowId);
-        TFFlowApprove tfFlowApprove = tfFlowApproveService.getOne(tfFlowApproveQueryWrapper);
-        if (Objects.isNull(tfFlowApprove)) {//新建流程
-            tfFlowApprove = new TFFlowApprove(flowId, teachId, flowStatusEnum, sysUser.getId());
-        } else {//更新流程
-            tfFlowApprove.updateInfo(sysUser.getId());
-            tfFlowApprove.setApproveId(teachId);
-            tfFlowApprove.setStatus(flowStatusEnum);
-        }
-        tfFlowApproveService.saveOrUpdate(tfFlowApprove);
 
-        //增加流水
-        if (flowStatusEnum != FlowStatusEnum.DRAFT && flowStatusEnum != FlowStatusEnum.TO_BE_SUBMIT) {
-            Task task = taskService.createTaskQuery().taskId(String.valueOf(taskId)).singleResult();
-            String processInstanceId = task.getProcessInstanceId();
-
-            // 流程标示
-            String processDefinitionId = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().getProcessDefinitionId();
-            ProcessDefinitionEntity def = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(processDefinitionId);
-            ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
-            // 当前实例的执行到哪个节点
-            String activitiId = execution.getActivityId();
-            String currentActivityId = execution.getCurrentActivityId();
-            List<TaskEntity> taskEntityList = execution.getTasks();
-            // 获得当前任务的所有节点
-//        List<ActivityImpl> activitiList = def.getIdentityLinks();
-            TFFlowLog tfFlowLog = new TFFlowLog(flowId, taskId, teachId, sysUser.getId());
-        }
+        Long approveId = Objects.nonNull(map.get(SystemConstant.APPROVE_ID)) ? Long.parseLong(String.valueOf(map.get(SystemConstant.APPROVE_ID))) : null;
+        tfFlowApproveService.save(new TFFlowApprove(flowId, approveId, flowStatusEnum, sysUser.getId()));
     }
 
     /**
-     * 根据任务id获取task
+     * 审批任务
      *
-     * @param taskId
+     * @param map
      */
     @Override
     @Transactional
-    public void approveByTaskId(Long taskId) {
-        Task task1 = taskService.createTaskQuery().taskId(String.valueOf(taskId)).singleResult();
-        taskService.complete(String.valueOf(taskId));
-        Task task2 = taskService.createTaskQuery().taskId(String.valueOf(taskId)).singleResult();
-    }
-
-    @Override
-    public void getTaskList(Long userId) {
+    public void taskApprove(Map<String, Object> map) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        if (Objects.isNull(map.get(SystemConstant.FLOW_TASK_ID))) {
+            throw ExceptionResultEnum.ERROR.exception("流程任务id不能为空");
+        }
+        String flowTaskId = (String) map.get(SystemConstant.FLOW_TASK_ID);
+        Task task = taskService.createTaskQuery().taskId(flowTaskId).singleResult();
+        if (Objects.isNull(task)) {
+            throw ExceptionResultEnum.ERROR.exception("流程任务为空");
+        }
+        String processInstanceId = task.getProcessInstanceId();
+        QueryWrapper<ExamTask> examTaskQueryWrapper = new QueryWrapper<>();
+        examTaskQueryWrapper.lambda().eq(ExamTask::getFlowId, Long.parseLong(processInstanceId));
+        ExamTask examTask = examTaskService.getOne(examTaskQueryWrapper);
 
+        String processDefinitionId = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().getProcessDefinitionId();
+        ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(processDefinitionId);
+        String currActivityId = task.getTaskDefinitionKey();
+        BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
+        FlowNode currFlow = (FlowNode) bpmnModel.getMainProcess().getFlowElement(currActivityId);
+        QueryWrapper<TFFlowApprove> tfFlowApproveQueryWrapper = new QueryWrapper<>();
+        tfFlowApproveQueryWrapper.lambda().eq(TFFlowApprove::getFlowId, processInstanceId);
+        TFFlowApprove tfFlowApprove = tfFlowApproveService.getOne(tfFlowApproveQueryWrapper);
+        TFFlowLog tfFlowLog = null;
+        if (currFlow instanceof UserTask) {
+            UserTask userTask = (UserTask) currFlow;
+            //广东医科大学流程
+            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(Long.parseLong(processInstanceId), examTask.getId(), sysUser.getId(), sysUser.getId(), remark);
+                FlowGdykdxApproveSetupEnum setupEnum = FlowGdykdxApproveSetupEnum.convertToInstance(userTask.getId());
+                if (setupEnum == FlowGdykdxApproveSetupEnum.SUBMIT) {//命题提交
+                    Task taskUser = taskService.createTaskQuery().taskId(flowTaskId).taskAssignee(String.valueOf(sysUser.getId())).singleResult();
+                    if (Objects.isNull(taskUser)) {
+                        throw ExceptionResultEnum.ERROR.exception("不能提交他人的任务");
+                    }
+                    tfFlowLog.setApproveSetup(FlowGdykdxApproveSetupEnum.SUBMIT.getSetup());
+                    tfFlowLog.setApproveOperation(FlowApproveOperationEnum.SUBMIT);
+                    tfFlowApprove.setStatus(FlowStatusEnum.AUDITING);
+                    tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup());
+                } else if (setupEnum == FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE) {//主任提交
+                    Task taskUser = taskService.createTaskQuery().taskId(flowTaskId).taskCandidateUser(String.valueOf(sysUser.getId())).singleResult();
+                    if (Objects.isNull(taskUser)) {
+                        throw ExceptionResultEnum.ERROR.exception("不能提交他人的任务");
+                    }
+                    if (Objects.isNull(map.get(SystemConstant.APPROVE_OPERATION))) {
+                        throw ExceptionResultEnum.ERROR.exception("流程审核操作不能为空");
+                    }
+                    FlowApprovePassEnum approvePass = (FlowApprovePassEnum) map.get(SystemConstant.APPROVE_OPERATION);
+                    String approve = approvePass == FlowApprovePassEnum.PASS ? "1" : "0";
+                    tfFlowLog.setApproveSetup(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup());
+                    if (Objects.equals(approve, "0")) {//驳回命题
+                        tfFlowLog.setApproveOperation(FlowApproveOperationEnum.REJECT);
+                        tfFlowApprove.setStatus(FlowStatusEnum.REJECT);
+                        tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.SUBMIT.getSetup());
+                    } else if (Objects.equals(approve, "1")) {//提交
+                        tfFlowLog.setApproveOperation(FlowApproveOperationEnum.APPROVE);
+                        tfFlowApprove.setStatus(FlowStatusEnum.AUDITING);
+                        tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.SECOND_APPROVE.getSetup());
+                    } else {
+                        throw ExceptionResultEnum.ERROR.exception("流程变量值错误");
+                    }
+                    map.computeIfAbsent(SystemConstant.APPROVE, v -> approve);
+                } else if (setupEnum == FlowGdykdxApproveSetupEnum.SECOND_APPROVE) {//院长提交
+                    Task taskUser = taskService.createTaskQuery().taskId(flowTaskId).taskCandidateUser(String.valueOf(sysUser.getId())).singleResult();
+                    if (Objects.isNull(taskUser)) {
+                        throw ExceptionResultEnum.ERROR.exception("不能提交他人的任务");
+                    }
+                    if (Objects.isNull(map.get(SystemConstant.APPROVE_OPERATION))) {
+                        throw ExceptionResultEnum.ERROR.exception("流程审核操作不能为空");
+                    }
+                    FlowApprovePassEnum approvePass = (FlowApprovePassEnum) map.get(SystemConstant.APPROVE_OPERATION);
+                    String approve = null;
+                    if (approvePass == FlowApprovePassEnum.PASS) {
+                        approve = "2";
+                    } else {
+                        if (Objects.isNull(map.get(SystemConstant.APPROVE_SETUP))) {
+                            throw 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()) {
+                            throw ExceptionResultEnum.ERROR.exception("流程驳回节点有误");
+                        }
+                        approve = setup.intValue() == 1 ? "0" : "1";
+                    }
+                    tfFlowLog.setApproveSetup(FlowGdykdxApproveSetupEnum.SECOND_APPROVE.getSetup());
+                    if (Objects.equals(approve, "0")) {//驳回命题
+                        tfFlowLog.setApproveOperation(FlowApproveOperationEnum.REJECT);
+                        tfFlowApprove.setStatus(FlowStatusEnum.REJECT);
+                        tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.SUBMIT.getSetup());
+                    } else if (Objects.equals(approve, "1")) {//驳回主任
+                        tfFlowLog.setApproveOperation(FlowApproveOperationEnum.REJECT);
+                        tfFlowApprove.setStatus(FlowStatusEnum.REJECT);
+                        tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup());
+                    } else if (Objects.equals(approve, "2")) {//提交
+                        tfFlowLog.setApproveOperation(FlowApproveOperationEnum.APPROVE);
+                        tfFlowApprove.setStatus(FlowStatusEnum.FINISH);
+                        tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.END.getSetup());
+                    } else {
+                        throw ExceptionResultEnum.ERROR.exception("流程变量值错误");
+                    }
+                    String finalApprove = approve;
+                    map.computeIfAbsent(SystemConstant.APPROVE, v -> finalApprove);
+                }
+                tfFlowApprove.updateInfo(sysUser.getId());
+            }
+        }
+        tfFlowApprove.setApproveId(sysUser.getId());
+        //当前实例的执行到哪个节点
+        taskService.complete(String.valueOf(flowTaskId), map);
+        tfFlowApproveService.saveOrUpdate(tfFlowApprove);
+        if (Objects.nonNull(tfFlowLog)) {
+            tfFlowLogService.save(tfFlowLog);
+        }
     }
 }

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

@@ -78,8 +78,13 @@ public class BasicCampusServiceImpl extends ServiceImpl<BasicCampusMapper, Basic
     @Transactional(rollbackFor = Exception.class)
     @Override
     public Boolean removeBasicCampusById(Long id) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+
         UpdateWrapper<BasicCampus> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(BasicCampus::getEnable,false).eq(BasicCampus::getId,id);
+        updateWrapper.lambda().set(BasicCampus::getEnable,false)
+                .set(BasicCampus::getOrgId,sysUser.getId())
+                .set(BasicCampus::getUpdateId,sysUser.getUpdateId())
+                .eq(BasicCampus::getId,id);
         return this.update(updateWrapper);
     }
 }

+ 98 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicStudentServiceImpl.java

@@ -1,17 +1,30 @@
 package com.qmth.distributed.print.business.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.distributed.print.business.bean.dto.TaskPrintClassDto;
+import com.qmth.distributed.print.business.bean.params.BasicStudentParams;
+import com.qmth.distributed.print.business.bean.result.BasicStudentResult;
 import com.qmth.distributed.print.business.entity.BasicStudent;
 import com.qmth.distributed.print.business.mapper.BasicStudentMapper;
+import com.qmth.distributed.print.business.service.BasicCampusService;
 import com.qmth.distributed.print.business.service.BasicStudentService;
+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.service.TeachcloudCommonService;
+import com.qmth.teachcloud.common.util.ServletUtil;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
+import java.util.Set;
 
 /**
  * <p>
@@ -23,6 +36,20 @@ import java.util.List;
  */
 @Service
 public class BasicStudentServiceImpl extends ServiceImpl<BasicStudentMapper, BasicStudent> implements BasicStudentService {
+    @Resource
+    private BasicStudentMapper basicStudentMapper;
+    @Resource
+    private TeachcloudCommonService teachcloudCommonService;
+    @Resource
+    private BasicCampusService basicCampusService;
+
+    @Override
+    public IPage<BasicStudentResult> basicStudentPage(String queryParams, int pageNumber, int pageSize) {
+        Long schoolId = SystemConstant.convertIdToLong(ServletUtil.getRequestHeaderSchoolId().toString());
+        Set<Long> orgIds = teachcloudCommonService.listSubOrgIds(null);
+        queryParams = SystemConstant.translateSpecificSign(queryParams);
+        return basicStudentMapper.findBasicStudentPage(new Page<>(pageNumber,pageSize),queryParams,schoolId,orgIds);
+    }
 
     @Override
     public IPage<BasicStudent> listPage(Page<BasicStudent> page, String classId) {
@@ -36,4 +63,75 @@ public class BasicStudentServiceImpl extends ServiceImpl<BasicStudentMapper, Bas
     public List<TaskPrintClassDto> listByClass(Long schoolId, List<String> stringList) {
         return this.baseMapper.listByClass(schoolId, stringList);
     }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Long saveBasicStudent(BasicStudentParams basicStudentParams) {
+        // 权限参数
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        Long schoolId = sysUser.getSchoolId();
+        Long id = basicStudentParams.getId();
+        // 普通参数
+        String studentName = basicStudentParams.getStudentName();
+        String studentCode = basicStudentParams.getStudentCode();
+        String phoneNumber = basicStudentParams.getPhoneNumber();
+        Long campusId = basicStudentParams.getCampusId();
+        if (Objects.isNull(basicCampusService.getById(campusId))){
+            throw ExceptionResultEnum.ERROR.exception("所选校区不存在");
+        }
+        String clazz = basicStudentParams.getClazz();
+
+        // 检验学号在学校的唯一性
+        BasicStudent check = this.getOne(new QueryWrapper<BasicStudent>().lambda()
+                .eq(BasicStudent::getSchoolId,schoolId)
+                .eq(BasicStudent::getStudentCode,studentCode)
+                .eq(BasicStudent::getEnable,true));
+        if (Objects.nonNull(check)){
+            if (!check.getId().equals(id)){
+                throw ExceptionResultEnum.ERROR.exception("学生编号【" + studentCode + "】重复");
+            }
+        }
+
+        // 组装基础参数
+        BasicStudent basicStudent = new BasicStudent();
+        basicStudent.setStudentCode(studentCode);
+        basicStudent.setStudentName(studentName);
+        basicStudent.setPhoneNumber(phoneNumber);
+        basicStudent.setCampusId(campusId);
+        basicStudent.setClazz(clazz);
+        basicStudent.setOrgId(sysUser.getOrgId());
+        basicStudent.setSchoolId(schoolId);
+
+        // 保存
+        if (Objects.isNull(id)){
+            // id为空 -> 新增
+            // 获取分布式id
+            id = SystemConstant.getDbUuid();
+            basicStudent.setId(id);
+            basicStudent.setCreateId(sysUser.getId());
+            this.save(basicStudent);
+        }else {
+            // id不为空 -> 更新
+            basicStudent.setId(id);
+            basicStudent.setUpdateId(sysUser.getId());
+            this.updateById(basicStudent);
+        }
+        return id;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean removeBasicStudentBatch(List<Long> idList) {
+        if (idList.size() == 0){
+            throw ExceptionResultEnum.ERROR.exception("请选择要删除的目标");
+        }
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        UpdateWrapper<BasicStudent> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda()
+                .set(BasicStudent::getEnable,false)
+                .set(BasicStudent::getOrgId,sysUser.getOrgId())
+                .set(BasicStudent::getUpdateId,sysUser.getId())
+                .in(BasicStudent::getId,idList);
+        return this.update(updateWrapper);
+    }
 }

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

@@ -427,7 +427,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
             return Stream.of(map);
         }).distinct().collect(Collectors.toList());
 
-        System.out.println("examDetailKeyList = " + JSON.toJSONString(examDetailKeyList));
+//        System.out.println("examDetailKeyList = " + JSON.toJSONString(examDetailKeyList));
 
         List<ExamDetail> examDetailList = new ArrayList<>();
         for (Map<String, Object> map : examDetailKeyList) {

+ 35 - 26
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import com.google.gson.Gson;
-import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.dto.*;
 import com.qmth.distributed.print.business.bean.result.WorkResult;
 import com.qmth.distributed.print.business.entity.*;
@@ -22,7 +21,6 @@ import com.qmth.teachcloud.common.bean.dto.CourseInfoDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.*;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.enums.FlowStatusEnum;
 import com.qmth.teachcloud.common.enums.RoleTypeEnum;
 import com.qmth.teachcloud.common.enums.TaskTypeEnum;
 import com.qmth.teachcloud.common.service.*;
@@ -274,11 +272,11 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         if (basicExamRule == null) {
             throw ExceptionResultEnum.ERROR.exception("通用规则未设置");
         }
-        if (examTask.getUserId() == null) {
-            examTask.setStatus(ExamStatusEnum.NEW);
-        } else {
-            examTask.setStatus(ExamStatusEnum.READY);
-        }
+//        if (examTask.getUserId() == null) {
+//            examTask.setStatus(ExamStatusEnum.NEW);
+//        } else {
+//            examTask.setStatus(ExamStatusEnum.READY);
+//        }
         examTask.setEnable(true);
         examTask.setCreateId(sysUser.getId());
         examTask.setCreateTime(System.currentTimeMillis());
@@ -324,17 +322,18 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             examTask.setCreateId(sysUser.getId());
             examTask.setReview(basicExamRule.getReview());
             examTask.setOrgId(sysUser.getOrgId());
-
-            Map<String, Object> map = new HashMap<>();
-            map.computeIfAbsent(SystemConstant.TEACH_ID, v -> String.valueOf(sysUser.getId()));
-            ProcessInstance processInstance = activitiService.startActivity(SystemConstant.GDYKDX_FLOW_KEY, map);
-            examTask.setFlowId(Long.parseLong(processInstance.getId()));
+            if (examTask.getUserId() == null) {
+                examTask.setStatus(ExamStatusEnum.DRAFT);
+            } else {
+                if (Objects.isNull(examTask.getFlowId())) {
+                    examTask.setStatus(ExamStatusEnum.SUBMIT);
+                    Map<String, Object> map = new HashMap<>();
+                    map.computeIfAbsent(SystemConstant.APPROVE_ID, v -> String.valueOf(examTask.getUserId()));
+                    ProcessInstance processInstance = activitiService.startActivity(SystemConstant.GDYKDX_FLOW_KEY, map);
+                    examTask.setFlowId(Long.parseLong(processInstance.getId()));
+                }
+            }
             this.save(examTask);
-
-            map.computeIfAbsent(SystemConstant.FLOW_ID, v -> examTask.getFlowId());
-            map.computeIfAbsent(SystemConstant.TASK_ID, v -> examTask.getId());
-            map.computeIfAbsent(SystemConstant.FLOW_STATUS, v -> Objects.isNull(examTask.getUserId()) ? FlowStatusEnum.DRAFT : FlowStatusEnum.TO_BE_SUBMIT);
-            activitiService.flowLog(map);
         } catch (Exception e) {
             log.error("请求出错", e);
             if (e instanceof ActivitiObjectNotFoundException) {
@@ -670,7 +669,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
 //    }
 
     @Override
-    public IPage<ExamTaskDto> listTaskApply(String auditStatus, String reviewStatus, Long cardRuleId, String courseCode, String paperNumber, Long startTime, Long endTime, Integer pageNumber, Integer pageSize) {
+    public IPage<ExamTaskDto> listTaskApply(String auditStatus, String reviewStatus, Long cardRuleId, String
+            courseCode, String paperNumber, Long startTime, Long endTime, Integer pageNumber, Integer pageSize) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         Set<Long> orgIds = teachcloudCommonService.listSubOrgIds(null);
@@ -681,7 +681,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     }
 
     @Override
-    public IPage<ExamTaskDto> listTaskReviewUnaudited(String courseCode, String paperNumber, Long userId, Long cardRuleId, Long startTime, Long endTime, Integer pageNumber, Integer pageSize) {
+    public IPage<ExamTaskDto> listTaskReviewUnaudited(String courseCode, String paperNumber, Long userId, Long
+            cardRuleId, Long startTime, Long endTime, Integer pageNumber, Integer pageSize) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         Set<Long> orgIds = teachcloudCommonService.listSubOrgIds(null);
         Page<ExamTaskDto> page = new Page<>(pageNumber, pageSize);
@@ -690,7 +691,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     }
 
     @Override
-    public IPage<ExamTaskDto> listTaskReviewAudited(String reviewStatus, String courseCode, String paperNumber, Long userId, Long cardRuleId, Long startTime, Long endTime, Integer pageNumber, Integer pageSize) {
+    public IPage<ExamTaskDto> listTaskReviewAudited(String reviewStatus, String courseCode, String
+            paperNumber, Long userId, Long cardRuleId, Long startTime, Long endTime, Integer pageNumber, Integer pageSize) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         Set<Long> orgIds = teachcloudCommonService.listSubOrgIds(null);
         Page<ExamTaskDto> page = new Page<>(pageNumber, pageSize);
@@ -782,7 +784,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         return true;
     }
 
-    private void taskAfterPass(ReviewStatusEnum statusEnum, Long examTaskId, ExamTaskPaperLog examTaskPaperLog, SysUser sysUser) {
+    private void taskAfterPass(ReviewStatusEnum statusEnum, Long examTaskId, ExamTaskPaperLog
+            examTaskPaperLog, SysUser sysUser) {
         // 更新记录表状态
         examTaskPaperLog.setReview(true);
         examTaskPaperLog.setReviewStatus(statusEnum);
@@ -818,7 +821,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     }
 
     @Override
-    public IPage<ExamTaskDetailDto> listTaskPaper(String courseCode, String paperNumber, Long startTime, Long endTime, Integer pageNumber, Integer pageSize) {
+    public IPage<ExamTaskDetailDto> listTaskPaper(String courseCode, String paperNumber, Long startTime, Long
+            endTime, Integer pageNumber, Integer pageSize) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         // 查询用户角色是否包含命题老师
         List<SysRole> list = sysUserRoleService.listRoleByUserId(sysUser.getId());
@@ -1016,7 +1020,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
      * @return
      */
     @Override
-    public IPage<WorkResult> queryByMyWorkSubmit(IPage<Map> iPage, Long userId, Long schoolId, ExamStatusEnum status) {
+    public IPage<WorkResult> queryByMyWorkSubmit(IPage<Map> iPage, Long userId, Long schoolId, ExamStatusEnum
+            status) {
         return examTaskMapper.queryByMyWorkSubmit(iPage, userId, schoolId, Objects.nonNull(status) ? status.name() : null);
     }
 
@@ -1093,7 +1098,9 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     }
 
     @Override
-    public IPage<ClientExamTaskDto> listTryTask(Long schoolId, String machineCode, Long orgId, Long printPlanId, String courseCode, String paperNumber, Boolean isTry, Boolean isPass, Integer pageNumber, Integer pageSize) {
+    public IPage<ClientExamTaskDto> listTryTask(Long schoolId, String machineCode, Long orgId, Long
+            printPlanId, String courseCode, String paperNumber, Boolean isTry, Boolean isPass, Integer pageNumber, Integer
+                                                        pageSize) {
         Set<Long> orgIds = teachcloudCommonService.listSubOrgIds(orgId);
         Page<ClientExamTaskDto> page = new Page<>(pageNumber, pageSize);
         // 印刷任务状态为印刷中(PRINTING),考场状态为待打印(WAITING)
@@ -1103,7 +1110,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     }
 
     @Override
-    public List<ClientExamTaskDto> listTryTask(Long schoolId, String machineCode, Long orgId, Long printPlanId, String courseCode, String paperNumber, Boolean isTry, Boolean isPass) {
+    public List<ClientExamTaskDto> listTryTask(Long schoolId, String machineCode, Long orgId, Long
+            printPlanId, String courseCode, String paperNumber, Boolean isTry, Boolean isPass) {
         Set<Long> orgIds = teachcloudCommonService.listSubOrgIds(orgId);
         // 印刷任务状态为印刷中(PRINTING),考场状态为待打印(WAITING)
         String[] examDetailstatus = {ExamDetailStatusEnum.NEW.name(), ExamDetailStatusEnum.READY.name()};
@@ -1269,7 +1277,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     }
 
     @Override
-    public List<ExamTaskDetailDto> listTaskPaper(String courseCode, String paperNumber, Long startTime, Long endTime) {
+    public List<ExamTaskDetailDto> listTaskPaper(String courseCode, String paperNumber, Long startTime, Long
+            endTime) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         // 查询用户角色是否包含命题老师
         List<SysRole> list = sysUserRoleService.listRoleByUserId(sysUser.getId());

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

@@ -682,6 +682,7 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
             } else {
                 map = new HashMap<>();
                 TBTask tbTask = tbTaskService.saveTaskCommon(basicAttachment, taskTypeEnum, map, null);
+                map.put(SystemConstant.FILE,file);
                 tbTaskService.save(tbTask);
             }
         } catch (Exception e) {

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

@@ -0,0 +1,20 @@
+package com.qmth.distributed.print.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.distributed.print.business.entity.TFFlowApproveLog;
+import com.qmth.distributed.print.business.mapper.TFFlowApproveLogMapper;
+import com.qmth.distributed.print.business.service.TFFlowApproveLogService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 流程审批记录 服务实现类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-08-05
+ */
+@Service
+public class TFFlowApproveLogServiceImpl extends ServiceImpl<TFFlowApproveLogMapper, TFFlowApproveLog> implements TFFlowApproveLogService {
+
+}

+ 15 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TFFlowServiceImpl.java

@@ -2,6 +2,7 @@ package com.qmth.distributed.print.business.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.distributed.print.business.bean.result.TaskApproveResult;
 import com.qmth.distributed.print.business.entity.TFFlow;
 import com.qmth.distributed.print.business.mapper.TFFlowMapper;
 import com.qmth.distributed.print.business.service.TFFlowService;
@@ -37,4 +38,18 @@ public class TFFlowServiceImpl extends ServiceImpl<TFFlowMapper, TFFlow> impleme
     public IPage<TFFlow> list(IPage<Map> iPage, String name, Long schoolId, Long orgId) {
         return tfFlowMapper.list(iPage, name, schoolId, orgId);
     }
+
+    /**
+     * 流程审批记录列表
+     *
+     * @param iPage
+     * @param teacherName
+     * @param schoolId
+     * @param orgId
+     * @return
+     */
+    @Override
+    public IPage<TaskApproveResult> taskApproveList(IPage<Map> iPage, String teacherName, Long schoolId, Long orgId) {
+        return tfFlowMapper.taskApproveList(iPage, teacherName, schoolId, orgId);
+    }
 }

+ 60 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncStudentDataImportService.java

@@ -0,0 +1,60 @@
+package com.qmth.distributed.print.business.templete.execute;
+
+import cn.hutool.core.date.DateUtil;
+import com.qmth.distributed.print.business.templete.importData.AsyncImportTaskTemplete;
+import com.qmth.distributed.print.business.templete.service.TaskLogicService;
+import com.qmth.teachcloud.common.contant.SpringContextHolder;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.entity.TBTask;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.TaskResultEnum;
+import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import com.qmth.teachcloud.common.service.TBTaskService;
+import com.qmth.teachcloud.common.util.Result;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.MessageFormat;
+import java.util.*;
+
+/**
+ * @Description: 异步-学生基础信息导入
+ * @Author: CaoZixuan
+ * @Date: 2021-04-07
+ */
+@Service
+public class AsyncStudentDataImportService extends AsyncImportTaskTemplete {
+
+    private final static Logger log = LoggerFactory.getLogger(AsyncStudentDataImportService.class);
+
+    public static final String OBJ_TITLE = "学生基础数据";
+    @Override
+    public Result importTask(Map<String, Object> map) throws IOException, Exception {
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+        InputStream inputStream = super.getUploadFileInputStream(tbTask);
+        map.put("inputStream",inputStream);
+
+        StringJoiner stringJoinerSummary = new StringJoiner("\n")
+                .add(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), BEGIN_TITLE, OBJ_TITLE));
+        tbTask.setStatus(TaskStatusEnum.RUNNING);
+        TBTaskService tbTaskService = SpringContextHolder.getBean(TBTaskService.class);
+        tbTaskService.updateById(tbTask);
+        try {
+            TaskLogicService taskLogicService = SpringContextHolder.getBean(TaskLogicService.class);
+
+            // 执行导入基础学生数据
+            Map<String, Object> result = taskLogicService.executeImportBasicStudentLogic(map);
+
+
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), FINISH_TITLE, Long.valueOf(String.valueOf(result.get("dataCount"))), FINISH_SIZE));
+            tbTask.setResult(TaskResultEnum.SUCCESS);
+        }catch (Exception e){
+
+        }
+        return null;
+    }
+}

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

@@ -69,4 +69,12 @@ public interface TaskLogicService {
      * @return
      */
     Map<String, Object> executeGenerateExamLogic(Map<String, Object> map);
+
+    /**
+     * 处理导入考生数据
+     * @param map 数据源
+     * @return 结果
+     * @throws Exception 异常
+     */
+    Map<String,Object> executeImportBasicStudentLogic(Map<String,Object> map) throws Exception;
 }

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

@@ -8,9 +8,11 @@ import com.alibaba.fastjson.JSONObject;
 import com.aliyun.oss.common.utils.BinaryUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.google.common.collect.Lists;
 import com.itextpdf.text.DocumentException;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.dto.*;
+import com.qmth.distributed.print.business.bean.dto.excel.BasicStudentImportDto;
 import com.qmth.distributed.print.business.bean.params.SerialNumberParams;
 import com.qmth.distributed.print.business.cache.CreatePdfCacheUtil;
 import com.qmth.distributed.print.business.entity.*;
@@ -31,6 +33,7 @@ import com.qmth.teachcloud.common.enums.PageSizeEnum;
 import com.qmth.teachcloud.common.enums.UploadFileEnum;
 import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.util.*;
+import com.qmth.teachcloud.common.util.excel.ExcelError;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
@@ -48,6 +51,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.FileCopyUtils;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import java.io.*;
@@ -1171,6 +1176,48 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         return map;
     }
 
+    @Transactional
+    @Override
+    public Map<String, Object> executeImportBasicStudentLogic(Map<String, Object> map) throws Exception {
+        MultipartFile file = (MultipartFile) map.get(SystemConstant.FILE);
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(BasicStudentImportDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+            List<ExcelError> excelErrorTemp = new ArrayList<>();
+            Map<String,String> checkMap = new HashMap<>();
+            for (int i = 0; i < finalExcelList.size(); i++) {
+                LinkedMultiValueMap<Integer, Object> excelMap = finalExcelList.get(i);
+                List<Object> basicStudentImportDtoList = excelMap.get(i);
+                for (int y = 0; y < Objects.requireNonNull(basicStudentImportDtoList).size(); y++) {
+                    BasicStudentImportDto basicStudentImportDto = (BasicStudentImportDto) basicStudentImportDtoList.get(y);
+                    String studentName = basicStudentImportDto.getStudentName();
+                    String studentCode = basicStudentImportDto.getStudentCode();
+                    String phoneNumber = basicStudentImportDto.getPhoneNumber();
+                    String campusName = basicStudentImportDto.getCampusName();
+                    String clazz = basicStudentImportDto.getClazz();
+
+                    // 检验excel中
+                    if (checkMap.containsKey(studentCode)){
+                        throw ExceptionResultEnum.ERROR.exception("导入的excel中包含在重复的【课程编号】:" + studentCode);
+                    }else {
+                        checkMap.put(studentCode,studentName);
+                    }
+
+                    excelErrorTemp.addAll(ExcelUtil.checkExcelField(basicStudentImportDto, y, i));
+                    if (Objects.isNull(studentCode) || studentCode.length() > 30 || !studentCode.matches(SystemConstant.REGULAR_EXPRESSION_OF_CODE)){
+                        excelErrorTemp.add(new ExcelError(y + 1,"excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[学号]不符合输入规范"));
+                    }
+                    if (Objects.isNull(studentName) || studentName.length() > 30){
+                        excelErrorTemp.add(new ExcelError(y + 1,"excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[学生名称]不符合输入规范"));
+                    }
+                }
+            }
+            if (excelErrorTemp.size() > 0) {
+                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(excelErrorTemp));
+            }
+            return finalExcelList;
+        });
+        return null;
+    }
+
     public String createTempNumber(SerialNumberParams serialNumberParams){
         return convertUtil.getIncre(serialNumberParams.getPrefix(), serialNumberParams.getModel(), serialNumberParams.getDigit());
     }

+ 36 - 0
distributed-print-business/src/main/resources/mapper/BasicStudentMapper.xml

@@ -19,4 +19,40 @@
             </if>
         GROUP BY s.clazz
     </select>
+
+    <select id="findBasicStudentPage"
+            resultType="com.qmth.distributed.print.business.bean.result.BasicStudentResult">
+        SELECT
+            stu.id,
+            student_name AS studentName,
+            student_code AS studentCode,
+            phone_number AS phhoneNumber,
+            campus_id AS campusId,
+            cam.campus_name AS campusName,
+            clazz,
+            stu.enable,
+            stu.create_id AS createId,
+            stu.create_time AS createTime
+        FROM
+            basic_student stu
+                LEFT JOIN
+            basic_campus cam ON stu.campus_id = cam.id
+                AND cam.enable = TRUE
+        <where>
+            and stu.enable = true
+            <if test="queryParams != null and queryParams.length > 0">
+                and student_name like concat('%',#{queryParams},'%') or student_code like concat('%',#{queryParams},'%')
+            </if>
+            <if test="schoolId != null and schoolId > 0">
+                and stu.school_id = #{schoolId}
+            </if>
+            <if test="orgIds != null and orgIds.size > 0">
+                AND stu.org_id IN
+                <foreach collection="orgIds" item="item" index="index" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+        ORDER BY stu.create_time DESC
+    </select>
 </mapper>

+ 351 - 279
distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml

@@ -4,24 +4,24 @@
 
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.qmth.distributed.print.business.entity.ExamTask">
-    <result column="id" property="id" />
-        <result column="school_id" property="schoolId" />
-        <result column="course_code" property="courseCode" />
-        <result column="course_name" property="courseName" />
-        <result column="specialty" property="specialty" />
-        <result column="paper_number" property="paperNumber" />
-        <result column="start_time" property="startTime" />
-        <result column="end_time" property="endTime" />
-        <result column="card_rule_id" property="cardRuleId" />
-        <result column="user_id" property="userId" />
-        <result column="status" property="status" />
-        <result column="review_status" property="reviewStatus" />
-        <result column="enable" property="enable" />
-        <result column="batch_no" property="batchNo" />
-        <result column="create_id" property="createId" />
-        <result column="create_time" property="createTime" />
-        <result column="update_id" property="updateId" />
-        <result column="update_time" property="updateTime" />
+        <result column="id" property="id"/>
+        <result column="school_id" property="schoolId"/>
+        <result column="course_code" property="courseCode"/>
+        <result column="course_name" property="courseName"/>
+        <result column="specialty" property="specialty"/>
+        <result column="paper_number" property="paperNumber"/>
+        <result column="start_time" property="startTime"/>
+        <result column="end_time" property="endTime"/>
+        <result column="card_rule_id" property="cardRuleId"/>
+        <result column="user_id" property="userId"/>
+        <result column="status" property="status"/>
+        <result column="review_status" property="reviewStatus"/>
+        <result column="enable" property="enable"/>
+        <result column="batch_no" property="batchNo"/>
+        <result column="create_id" property="createId"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_id" property="updateId"/>
+        <result column="update_time" property="updateTime"/>
     </resultMap>
 
     <!-- 通用查询结果列 -->
@@ -31,31 +31,31 @@
     </sql>
     <select id="listPage" resultType="com.qmth.distributed.print.business.bean.dto.ExamTaskDto">
         SELECT
-            a.id,
-            a.school_id schoolId,
-            a.course_code courseCode,
-            a.course_name courseName,
-            a.specialty,
-            a.paper_number paperNumber,
-            a.card_rule_id cardRuleId,
-            case a.card_rule_id when -1 then '全部通卡' else b.name end cardRuleName,
-            a.user_id userId,
-            c.real_name userName,
-            d.real_name createName,
-            a.start_time startTime,
-            a.end_time endTime,
-            a.status,
-            a.enable,
-            a.create_id createId,
-            a.create_time createTime
+        a.id,
+        a.school_id schoolId,
+        a.course_code courseCode,
+        a.course_name courseName,
+        a.specialty,
+        a.paper_number paperNumber,
+        a.card_rule_id cardRuleId,
+        case a.card_rule_id when -1 then '全部通卡' else b.name end cardRuleName,
+        a.user_id userId,
+        c.real_name userName,
+        d.real_name createName,
+        a.start_time startTime,
+        a.end_time endTime,
+        a.status,
+        a.enable,
+        a.create_id createId,
+        a.create_time createTime
         FROM
-            exam_task a
-                LEFT JOIN
-            basic_card_rule b ON a.card_rule_id = b.id
-                LEFT JOIN
-            sys_user c ON a.user_id = c.id
-                LEFT JOIN
-            sys_user d ON a.create_id = d.id
+        exam_task a
+        LEFT JOIN
+        basic_card_rule b ON a.card_rule_id = b.id
+        LEFT JOIN
+        sys_user c ON a.user_id = c.id
+        LEFT JOIN
+        sys_user d ON a.create_id = d.id
         <where>
             <if test="schoolId != null and schoolId != ''">
                 and a.school_id = #{schoolId}
@@ -92,11 +92,11 @@
     </select>
     <select id="listUser" resultType="com.qmth.teachcloud.common.bean.dto.BlurryUserDto">
         SELECT
-           distinct a.user_id id, b.real_name name
+        distinct a.user_id id, b.real_name name
         FROM
-            exam_task a
-                LEFT JOIN
-            sys_user b ON a.user_id = b.id
+        exam_task a
+        LEFT JOIN
+        sys_user b ON a.user_id = b.id
         <where>
             b.enable = true
             <if test="schoolId != null and schoolId != ''">
@@ -109,47 +109,47 @@
     </select>
     <select id="listTaskApply" resultType="com.qmth.distributed.print.business.bean.dto.ExamTaskDto">
         select * from (SELECT
-            a.id,
-            a.school_id schoolId,
-            a.course_code courseCode,
-            a.course_name courseName,
-            a.specialty,
-            a.paper_number paperNumber,
-            a.card_rule_id cardRuleId,
-            case a.card_rule_id when -1 then '全部通卡' else b.name end cardRuleName,
-            a.user_id userId,
-            c.real_name userName,
-            a.start_time startTime,
-            a.end_time endTime,
-            a.status,
-            CASE
-                WHEN a.review = 1 AND a.status = 'SUBMIT' THEN 'NOT_AUDITED'
-                WHEN a.review = 1 AND a.status IN ('STAGE', 'FINISH') AND  a.review_status IS NOT NULL THEN 'AUDITED'
-                ELSE ''
-            END auditStatus,
-            CASE
-                WHEN a.review_status IS NULL THEN ''
-                ELSE a.review_status
-            END reviewStatus,
-            a.enable,
-            a.create_id createId,
-            a.create_time createTime
+        a.id,
+        a.school_id schoolId,
+        a.course_code courseCode,
+        a.course_name courseName,
+        a.specialty,
+        a.paper_number paperNumber,
+        a.card_rule_id cardRuleId,
+        case a.card_rule_id when -1 then '全部通卡' else b.name end cardRuleName,
+        a.user_id userId,
+        c.real_name userName,
+        a.start_time startTime,
+        a.end_time endTime,
+        a.status,
+        CASE
+        WHEN a.review = 1 AND a.status = 'SUBMIT' THEN 'NOT_AUDITED'
+        WHEN a.review = 1 AND a.status IN ('STAGE', 'FINISH') AND a.review_status IS NOT NULL THEN 'AUDITED'
+        ELSE ''
+        END auditStatus,
+        CASE
+        WHEN a.review_status IS NULL THEN ''
+        ELSE a.review_status
+        END reviewStatus,
+        a.enable,
+        a.create_id createId,
+        a.create_time createTime
         FROM
-            exam_task a
-                LEFT JOIN
-            basic_card_rule b ON a.card_rule_id = b.id
-                LEFT JOIN
-            sys_user c ON a.user_id = c.id
-            <where>
-                <if test="orgIds != null and userId != null and userId != ''">
-                    and a.user_id = #{userId}
-                </if>
-            </where>
-            order by a.create_time desc) a
+        exam_task a
+        LEFT JOIN
+        basic_card_rule b ON a.card_rule_id = b.id
+        LEFT JOIN
+        sys_user c ON a.user_id = c.id
+        <where>
+            <if test="orgIds != null and userId != null and userId != ''">
+                and a.user_id = #{userId}
+            </if>
+        </where>
+        order by a.create_time desc) a
         <where>
             a.enable = true and a.status not in
             <foreach item="item" collection="status" separator="," open="(" close=")" index="">
-               #{item}
+                #{item}
             </foreach>
             <if test="schoolId != null and schoolId != ''">
                 and a.schoolId = #{schoolId}
@@ -179,42 +179,42 @@
     </select>
     <select id="listTaskReviewUnaudited" resultType="com.qmth.distributed.print.business.bean.dto.ExamTaskDto">
         SELECT
-            a.id,
-            a.school_id schoolId,
-            a.course_code courseCode,
-            a.course_name courseName,
-            a.specialty,
-            a.paper_number paperNumber,
-            a.card_rule_id cardRuleId,
-            case a.card_rule_id when -1 then '全部通卡' else b.name end cardRuleName,
-            a.user_id userId,
-            c.real_name userName,
-            d.real_name createName,
-            a.start_time startTime,
-            a.end_time endTime,
-            a.enable,
-            a.create_id createId,
-            a.create_time createTime,
-            a.status,
-            CASE
-                WHEN a.review = 1 AND a.status = 'SUBMIT' THEN 'NOT_AUDITED'
-                WHEN a.review = 1 AND a.status IN ('STAGE', 'FINISH') AND  a.review_status IS NOT NULL THEN 'AUDITED'
-                ELSE ''
-            END auditStatus,
-            CASE
-                WHEN a.review_status IS NULL THEN ''
-                ELSE a.review_status
-            END reviewStatus
+        a.id,
+        a.school_id schoolId,
+        a.course_code courseCode,
+        a.course_name courseName,
+        a.specialty,
+        a.paper_number paperNumber,
+        a.card_rule_id cardRuleId,
+        case a.card_rule_id when -1 then '全部通卡' else b.name end cardRuleName,
+        a.user_id userId,
+        c.real_name userName,
+        d.real_name createName,
+        a.start_time startTime,
+        a.end_time endTime,
+        a.enable,
+        a.create_id createId,
+        a.create_time createTime,
+        a.status,
+        CASE
+        WHEN a.review = 1 AND a.status = 'SUBMIT' THEN 'NOT_AUDITED'
+        WHEN a.review = 1 AND a.status IN ('STAGE', 'FINISH') AND a.review_status IS NOT NULL THEN 'AUDITED'
+        ELSE ''
+        END auditStatus,
+        CASE
+        WHEN a.review_status IS NULL THEN ''
+        ELSE a.review_status
+        END reviewStatus
         FROM
-            exam_task a
+        exam_task a
         LEFT JOIN
-            basic_card_rule b ON a.card_rule_id = b.id
+        basic_card_rule b ON a.card_rule_id = b.id
         LEFT JOIN
-            sys_user c ON a.user_id = c.id
+        sys_user c ON a.user_id = c.id
         LEFT JOIN
-            sys_user d ON a.create_id = d.id
+        sys_user d ON a.create_id = d.id
         LEFT JOIN
-            exam_task_paper_log e ON a.id = e.exam_task_id AND e.review = false
+        exam_task_paper_log e ON a.id = e.exam_task_id AND e.review = false
         <where>
             a.enable = true
             and a.review = true
@@ -251,41 +251,41 @@
     </select>
     <select id="listTaskReviewAudited" resultType="com.qmth.distributed.print.business.bean.dto.ExamTaskDto">
         SELECT
-            a.id,
-            a.school_id schoolId,
-            a.course_code courseCode,
-            a.course_name courseName,
-            a.specialty,
-            a.paper_number paperNumber,
-            a.card_rule_id cardRuleId,
-            case a.card_rule_id when -1 then '全部通卡' else b.name end cardRuleName,
-            a.user_id userId,
-            c.real_name userName,
-            d.real_name createName,
-            a.start_time startTime,
-            a.end_time endTime,
-            a.review_status reviewStatus,
-            a.enable,
-            a.create_id createId,
-            a.create_time createTime,
-            a.status,
-            CASE
-                WHEN a.review = 1 AND a.status = 'SUBMIT' THEN 'NOT_AUDITED'
-                WHEN a.review = 1 AND a.status IN ('STAGE', 'FINISH') AND  a.review_status IS NOT NULL THEN 'AUDITED'
-                ELSE ''
-            END auditStatus,
-            CASE
-                WHEN a.review_status IS NULL THEN ''
-                ELSE a.review_status
-            END reviewStatus
+        a.id,
+        a.school_id schoolId,
+        a.course_code courseCode,
+        a.course_name courseName,
+        a.specialty,
+        a.paper_number paperNumber,
+        a.card_rule_id cardRuleId,
+        case a.card_rule_id when -1 then '全部通卡' else b.name end cardRuleName,
+        a.user_id userId,
+        c.real_name userName,
+        d.real_name createName,
+        a.start_time startTime,
+        a.end_time endTime,
+        a.review_status reviewStatus,
+        a.enable,
+        a.create_id createId,
+        a.create_time createTime,
+        a.status,
+        CASE
+        WHEN a.review = 1 AND a.status = 'SUBMIT' THEN 'NOT_AUDITED'
+        WHEN a.review = 1 AND a.status IN ('STAGE', 'FINISH') AND a.review_status IS NOT NULL THEN 'AUDITED'
+        ELSE ''
+        END auditStatus,
+        CASE
+        WHEN a.review_status IS NULL THEN ''
+        ELSE a.review_status
+        END reviewStatus
         FROM
-            exam_task a
+        exam_task a
         LEFT JOIN
-            basic_card_rule b ON a.card_rule_id = b.id
+        basic_card_rule b ON a.card_rule_id = b.id
         LEFT JOIN
-            sys_user c ON a.user_id = c.id
+        sys_user c ON a.user_id = c.id
         LEFT JOIN
-            sys_user d ON a.create_id = d.id
+        sys_user d ON a.create_id = d.id
         <where>
             a.enable = true and a.review = true and a.status in ('STAGE','FINISH') and a.review_status is not null
             <if test="schoolId != null and schoolId != ''">
@@ -323,38 +323,38 @@
     </select>
     <select id="listTaskPaper" resultType="com.qmth.distributed.print.business.bean.dto.ExamTaskDetailDto">
         SELECT
-            a.id,
-            a.school_id schoolId,
-            a.course_code courseCode,
-            a.course_name courseName,
-            a.specialty,
-            a.paper_number paperNumber,
-            a.user_id userId,
-            a.card_rule_id cardRuleId,
-            c.real_name userName,
-            d.real_name createName,
-            a.start_time startTime,
-            a.end_time endTime,
-            a.create_id createId,
-            ifnull(e.operate_time, a.update_time)  createTime,
-            b.enable,
-            b.paper_type paperType,
-            b.exposed_paper_type exposedPaperType,
-            b.unexposed_paper_type unexposedPaperType
+        a.id,
+        a.school_id schoolId,
+        a.course_code courseCode,
+        a.course_name courseName,
+        a.specialty,
+        a.paper_number paperNumber,
+        a.user_id userId,
+        a.card_rule_id cardRuleId,
+        c.real_name userName,
+        d.real_name createName,
+        a.start_time startTime,
+        a.end_time endTime,
+        a.create_id createId,
+        ifnull(e.operate_time, a.update_time) createTime,
+        b.enable,
+        b.paper_type paperType,
+        b.exposed_paper_type exposedPaperType,
+        b.unexposed_paper_type unexposedPaperType
         FROM
-            exam_task a
-                LEFT JOIN
-            exam_task_detail b ON a.id = b.exam_task_id
-                LEFT JOIN
-            (SELECT
-                a.exam_task_id, MAX(operate_time) operate_time
-            FROM
-                exam_task_review_log a
-            GROUP BY a.exam_task_id) e ON e.exam_task_id = a.id
-                LEFT JOIN
-            sys_user c ON a.user_id = c.id
-                LEFT JOIN
-            sys_user d ON a.create_id = d.id
+        exam_task a
+        LEFT JOIN
+        exam_task_detail b ON a.id = b.exam_task_id
+        LEFT JOIN
+        (SELECT
+        a.exam_task_id, MAX(operate_time) operate_time
+        FROM
+        exam_task_review_log a
+        GROUP BY a.exam_task_id) e ON e.exam_task_id = a.id
+        LEFT JOIN
+        sys_user c ON a.user_id = c.id
+        LEFT JOIN
+        sys_user d ON a.create_id = d.id
         <where>
             a.status = 'FINISH'
             <if test="schoolId != null and schoolId != ''">
@@ -386,13 +386,13 @@
     </select>
     <select id="listPaperNumbers" resultType="com.qmth.distributed.print.business.bean.dto.RelatePaperDto">
         SELECT
-            id,
-            school_id schoolId,
-            course_code courseCode,
-            course_name courseName,
-            paper_number paperNumber
+        id,
+        school_id schoolId,
+        course_code courseCode,
+        course_name courseName,
+        paper_number paperNumber
         FROM
-            exam_task
+        exam_task
         <where>
             school_id = #{schoolId} and course_code = #{courseCode} and status = #{status} and enable = true
         </where>
@@ -419,65 +419,65 @@
     </select>
 
     <select id="queryByMyWork" resultType="com.qmth.distributed.print.business.bean.result.WorkResult">
-        <include refid="myworkCommonHead" />
-        <include refid="myworkCommonMiddle" />
+        <include refid="myworkCommonHead"/>
+        <include refid="myworkCommonMiddle"/>
         <where>
-            <include refid="myworkSubmitCommonFoot" />
+            <include refid="myworkSubmitCommonFoot"/>
         </where>
     </select>
 
     <select id="queryUserByMyWork" resultType="com.qmth.distributed.print.business.bean.result.WorkResult">
-        <include refid="myworkCommonHead" />
-        <include refid="myworkCommonMiddle" />
+        <include refid="myworkCommonHead"/>
+        <include refid="myworkCommonMiddle"/>
         <where>
-            <include refid="myworkCommonFoot" />
+            <include refid="myworkCommonFoot"/>
         </where>
     </select>
 
     <select id="queryByMyWorkSubmit" resultType="com.qmth.distributed.print.business.bean.result.WorkResult">
-        <include refid="myworkCommonHead" />
-        <include refid="myworkCommonMiddle" />
+        <include refid="myworkCommonHead"/>
+        <include refid="myworkCommonMiddle"/>
         <where>
-            <include refid="myworkSubmitCommonFootNew" />
+            <include refid="myworkSubmitCommonFootNew"/>
         </where>
     </select>
     <select id="listClientExamTaskPage"
             resultType="com.qmth.distributed.print.business.bean.dto.ClientExamTaskDto">
         SELECT
         distinct a.school_id schoolId,
-            a.id printPlanId,
-            a.name printPlanName,
-            c.course_code courseCode,
-            c.course_name courseName,
-            c.paper_number paperNumber,
-            d.id examTaskId,
-            d.specialty,
-            d.user_id userId,
-            f.real_name userName,
-            ifnull(e.is_try, false) isTry,
-            ifnull(e.is_pass, false) isPass,
-            e.try_time tryTime
+        a.id printPlanId,
+        a.name printPlanName,
+        c.course_code courseCode,
+        c.course_name courseName,
+        c.paper_number paperNumber,
+        d.id examTaskId,
+        d.specialty,
+        d.user_id userId,
+        f.real_name userName,
+        ifnull(e.is_try, false) isTry,
+        ifnull(e.is_pass, false) isPass,
+        e.try_time tryTime
         FROM
-            exam_print_plan a
-                JOIN
-            exam_detail b ON a.id = b.print_plan_id
-                JOIN
-            exam_detail_course c ON b.id = c.exam_detail_id
-                JOIN
-            exam_task d ON d.school_id = c.school_id
-                AND d.course_code = c.course_code
-                AND d.paper_number = c.paper_number
-                LEFT JOIN
-            client_status e ON e.school_id = d.school_id
-                AND b.id = e.exam_detail_id
-                AND a.id = e.print_plan_id
-                AND e.course_code = d.course_code
-                AND e.paper_number = d.paper_number
-                and e.machine_code = #{machineCode}
-                LEFT JOIN
-            sys_user f ON d.user_id = f.id
-                LEFT JOIN
-            sys_user g ON a.create_id = g.id
+        exam_print_plan a
+        JOIN
+        exam_detail b ON a.id = b.print_plan_id
+        JOIN
+        exam_detail_course c ON b.id = c.exam_detail_id
+        JOIN
+        exam_task d ON d.school_id = c.school_id
+        AND d.course_code = c.course_code
+        AND d.paper_number = c.paper_number
+        LEFT JOIN
+        client_status e ON e.school_id = d.school_id
+        AND b.id = e.exam_detail_id
+        AND a.id = e.print_plan_id
+        AND e.course_code = d.course_code
+        AND e.paper_number = d.paper_number
+        and e.machine_code = #{machineCode}
+        LEFT JOIN
+        sys_user f ON d.user_id = f.id
+        LEFT JOIN
+        sys_user g ON a.create_id = g.id
         <where>
             and a.status = #{printPlanStatus}
             and d.status = 'FINISH'
@@ -555,12 +555,12 @@
     </select>
     <select id="listExamTaskAuditExpire" resultMap="BaseResultMap">
         SELECT
-            *
+        *
         FROM
-            exam_task a
-                LEFT JOIN
-            exam_task_paper_log b ON a.id = b.exam_task_id
-                AND b.review = FALSE
+        exam_task a
+        LEFT JOIN
+        exam_task_paper_log b ON a.id = b.exam_task_id
+        AND b.review = FALSE
         <where>
             and a.enable = true
             and a.review = true
@@ -664,58 +664,130 @@
     </sql>
 
     <select id="getFlowTaskReadyList" resultType="com.qmth.distributed.print.business.bean.result.WorkResult">
-            SELECT
-                et.id,
-                et.school_id schoolId,
-                et.course_code courseCode,
-                et.course_name courseName,
-                et.specialty,
-                et.paper_number paperNumber,
-                et.card_rule_id cardRuleId,
-                case
-                    et.card_rule_id when -1 then '全部通卡'
-                    else b.name
-                end cardRuleName,
-                art.ASSIGNEE_ userId,
-                c.real_name userName,
-                et.start_time startTime,
-                et.end_time endTime,
-                tffa.status,
-                et.enable,
-                et.create_id createId,
-                et.create_time createTime,
-                art.EXECUTION_ID_ as executionId,
-                et.flow_id as flowId,
-                art.NAME_ as taskName,
-                art.TASK_DEF_KEY_ as taskDefKey,
-                art.ID_ as taskId
-            FROM
-                exam_task et
-            LEFT JOIN
-                        basic_card_rule b ON
-                et.card_rule_id = b.id
-            LEFT JOIN
-                        exam_task_paper_log d ON
-                et.id = d.exam_task_id
-                and d.review = false
-            LEFT JOIN
-                        sys_user c ON
-                et.user_id = c.id
-            left join ACT_RU_TASK art on
-                art.PROC_INST_ID_ = et.flow_id
-            left join t_f_flow_approve tffa
-                on tffa.flow_id = et.flow_id
+        /*select
+        *
+        from
+        ACT_RU_TASK art
+        join
+        (
+        select
+        ari.USER_ID_ as userId,
+        ari.PROC_INST_ID_ as procInstId,
+        (
+        select
+        t.TASK_ID_
+        from
+        ACT_RU_IDENTITYLINK t
+        where
+        t.TYPE_ = 'candidate'
+        and t.USER_ID_ = '153080457649455104') as taskId
+        from
+        ACT_RU_IDENTITYLINK ari
+        where
+        ari.TYPE_ = 'participant'
+        and ari.USER_ID_ = '153080457649455104') temp on
+        art.PROC_INST_ID_ = temp.procInstId*/
+
+
+        select
+        et.id,
+        et.school_id schoolId,
+        et.org_id as orgId,
+        et.course_code courseCode,
+        et.course_name courseName,
+        et.specialty,
+        et.paper_number paperNumber,
+        et.card_rule_id cardRuleId,
+        case
+        et.card_rule_id when -1 then '全部通卡'
+        else b.name
+        end cardRuleName,
+        art.ASSIGNEE_ as userId,
+        c.real_name userName,
+        et.start_time startTime,
+        et.end_time endTime,
+        tffa.status,
+        et.enable,
+        et.create_time createTime,
+        art.EXECUTION_ID_ as executionId,
+        et.flow_id as flowId,
+        art.NAME_ as taskName,
+        art.TASK_DEF_KEY_ as taskDefKey,
+        art.ID_ as taskId,
+        tffa.setup
+        from
+        ACT_RU_TASK art
+        left join exam_task et on
+        et.flow_id = art.PROC_INST_ID_
+        left join basic_card_rule b ON
+        et.card_rule_id = b.id
+        left join t_f_flow_approve tffa on
+        tffa.flow_id = et.flow_id
+        left join sys_user c ON
+        art.ASSIGNEE_ = c.id
         <where>
-                <if test="userId != null and userId != ''">
-                    and art.ASSIGNEE_ = #{userId}
-                </if>
-                <if test="schoolId != null and schoolId != ''">
-                    and et.school_id = #{schoolId}
-                </if>
-                <if test="orgId != null and orgId != ''">
-                    and et.org_id = #{orgId}
-                </if>
-            </where>
+            <if test="userId != null and userId != ''">
+                and art.ASSIGNEE_ = #{userId}
+            </if>
+            <if test="schoolId != null and schoolId != ''">
+                and et.school_id = #{schoolId}
+            </if>
+            <if test="orgId != null and orgId != ''">
+                and et.org_id = #{orgId}
+            </if>
+        </where>
+        UNION all
+        select
+        et.id,
+        et.school_id schoolId,
+        et.org_id as orgId,
+        et.course_code courseCode,
+        et.course_name courseName,
+        et.specialty,
+        et.paper_number paperNumber,
+        et.card_rule_id cardRuleId,
+        case
+        et.card_rule_id when -1 then '全部通卡'
+        else b.name
+        end cardRuleName,
+        ari.USER_ID_ as userId,
+        c.real_name userName,
+        et.start_time startTime,
+        et.end_time endTime,
+        tffa.status,
+        et.enable,
+        et.create_time createTime,
+        art.EXECUTION_ID_ as executionId,
+        et.flow_id as flowId,
+        art.NAME_ as taskName,
+        art.TASK_DEF_KEY_ as taskDefKey,
+        art.ID_ as taskId,
+        tffa.setup
+        from
+        ACT_RU_TASK art
+        left join exam_task et on
+        et.flow_id = art.PROC_INST_ID_
+        left join act_ru_identitylink ari on
+        ari.TASK_ID_ = art.ID_
+        left join basic_card_rule b ON
+        et.card_rule_id = b.id
+        left join t_f_flow_approve tffa on
+        tffa.flow_id = et.flow_id
+        left join sys_user c ON
+        ari.USER_ID_ = c.id
+        <where>
+            and art.ASSIGNEE_ is null
+            and ari.TYPE_ = 'candidate'
+            <if test="userId != null and userId != ''">
+                and ari.USER_ID_ = #{userId}
+            </if>
+            <if test="schoolId != null and schoolId != ''">
+                and et.school_id = #{schoolId}
+            </if>
+            <if test="orgId != null and orgId != ''">
+                and et.org_id = #{orgId}
+            </if>
+        </where>
     </select>
 
 </mapper>

+ 5 - 0
distributed-print-business/src/main/resources/mapper/TFFlowApproveLogMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qmth.distributed.print.business.mapper.TFFlowApproveLogMapper">
+
+</mapper>

+ 4 - 0
distributed-print-business/src/main/resources/mapper/TFFlowMapper.xml

@@ -16,4 +16,8 @@
             </if>
         </where>
     </select>
+
+    <select id="taskApproveList" resultType="com.qmth.distributed.print.business.bean.result.TaskApproveResult">
+
+    </select>
 </mapper>

+ 84 - 84
distributed-print/src/main/java/com/qmth/distributed/print/api/ActivitiController.java

@@ -1,84 +1,84 @@
-package com.qmth.distributed.print.api;
-
-import com.qmth.boot.api.annotation.Aac;
-import com.qmth.boot.api.annotation.BOOL;
-import com.qmth.boot.api.constant.ApiConstant;
-import com.qmth.distributed.print.business.service.ActivitiService;
-import com.qmth.teachcloud.common.util.Result;
-import com.qmth.teachcloud.common.util.ResultUtil;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.annotation.Resource;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @Description: activiti demo api
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2021/7/12
- */
-@Api(tags = "工作流Controller")
-@RestController
-@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.basic}/activiti")
-@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
-public class ActivitiController {
-
-    @Resource
-    private ActivitiService activitiService;
-
-    @ApiOperation(value = "注册流程")
-    @RequestMapping(value = "/createDeployment", method = RequestMethod.POST)
-    public Result createDeployment(@RequestParam(value = "processFileName") String processFileName) {
-        activitiService.createDeployment(processFileName);
-        return ResultUtil.ok();
-    }
-
-    @ApiOperation(value = "上传流程")
-    @RequestMapping(value = "/updateDeployment", method = RequestMethod.POST)
-    public Result uploadDeployment(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file) throws IOException {
-        activitiService.uploadDeployment(file);
-        return ResultUtil.ok();
-    }
-
-    @ApiOperation(value = "启动流程")
-    @RequestMapping(value = "/startActivity", method = RequestMethod.POST)
-    public Result startActivity(@RequestParam(value = "processKey") String processKey) {
-        Map<String, Object> map = new HashMap<>();
-        map.put("userId", 1L);
-        map.put("approveId", 2L);
-        map.put("assigneeId", 3L);
-        activitiService.startActivity(processKey, null);
-        return ResultUtil.ok();
-    }
-
-    @ApiOperation(value = "获取待办")
-    @RequestMapping(value = "/getTaskList", method = RequestMethod.POST)
-    public Result getTaskList() {
-        activitiService.getTaskList();
-        return ResultUtil.ok();
-    }
-
-    @ApiOperation(value = "提交")
-    @RequestMapping(value = "/complete", method = RequestMethod.POST)
-    public Result complete(@RequestParam(value = "taskId") String taskId) {
-        activitiService.complete(taskId);
-        return ResultUtil.ok();
-    }
-
-    @ApiOperation(value = "根据流程id直接结束流程")
-    @RequestMapping(value = "/deleteProcessInstance", method = RequestMethod.POST)
-    public Result deleteProcessInstance(@RequestParam(value = "flowId") String flowId) {
-        activitiService.deleteProcessInstance(flowId);
-        return ResultUtil.ok();
-    }
-}
+//package com.qmth.distributed.print.api;
+//
+//import com.qmth.boot.api.annotation.Aac;
+//import com.qmth.boot.api.annotation.BOOL;
+//import com.qmth.boot.api.constant.ApiConstant;
+//import com.qmth.distributed.print.business.service.ActivitiService;
+//import com.qmth.teachcloud.common.util.Result;
+//import com.qmth.teachcloud.common.util.ResultUtil;
+//import io.swagger.annotations.Api;
+//import io.swagger.annotations.ApiOperation;
+//import io.swagger.annotations.ApiParam;
+//import org.springframework.web.bind.annotation.RequestMapping;
+//import org.springframework.web.bind.annotation.RequestMethod;
+//import org.springframework.web.bind.annotation.RequestParam;
+//import org.springframework.web.bind.annotation.RestController;
+//import org.springframework.web.multipart.MultipartFile;
+//
+//import javax.annotation.Resource;
+//import java.io.IOException;
+//import java.util.HashMap;
+//import java.util.Map;
+//
+///**
+// * @Description: activiti demo api
+// * @Param:
+// * @return:
+// * @Author: wangliang
+// * @Date: 2021/7/12
+// */
+//@Api(tags = "工作流Controller")
+//@RestController
+//@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.basic}/activiti")
+//@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+//public class ActivitiController {
+//
+//    @Resource
+//    private ActivitiService activitiService;
+//
+//    @ApiOperation(value = "注册流程")
+//    @RequestMapping(value = "/createDeployment", method = RequestMethod.POST)
+//    public Result createDeployment(@RequestParam(value = "processFileName") String processFileName) {
+//        activitiService.createDeployment(processFileName);
+//        return ResultUtil.ok();
+//    }
+//
+//    @ApiOperation(value = "上传流程")
+//    @RequestMapping(value = "/updateDeployment", method = RequestMethod.POST)
+//    public Result uploadDeployment(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file) throws IOException {
+//        activitiService.uploadDeployment(file);
+//        return ResultUtil.ok();
+//    }
+//
+//    @ApiOperation(value = "启动流程")
+//    @RequestMapping(value = "/startActivity", method = RequestMethod.POST)
+//    public Result startActivity(@RequestParam(value = "processKey") String processKey) {
+//        Map<String, Object> map = new HashMap<>();
+//        map.put("userId", 1L);
+//        map.put("approveId", 2L);
+//        map.put("assigneeId", 3L);
+//        activitiService.startActivity(processKey, null);
+//        return ResultUtil.ok();
+//    }
+//
+//    @ApiOperation(value = "获取待办")
+//    @RequestMapping(value = "/getTaskList", method = RequestMethod.POST)
+//    public Result getTaskList() {
+//        activitiService.getTaskList();
+//        return ResultUtil.ok();
+//    }
+//
+//    @ApiOperation(value = "提交")
+//    @RequestMapping(value = "/complete", method = RequestMethod.POST)
+//    public Result complete(@RequestParam(value = "taskId") String taskId) {
+//        activitiService.complete(taskId);
+//        return ResultUtil.ok();
+//    }
+//
+//    @ApiOperation(value = "根据流程id直接结束流程")
+//    @RequestMapping(value = "/deleteProcessInstance", method = RequestMethod.POST)
+//    public Result deleteProcessInstance(@RequestParam(value = "flowId") String flowId) {
+//        activitiService.deleteProcessInstance(flowId);
+//        return ResultUtil.ok();
+//    }
+//}

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

@@ -2,18 +2,25 @@ package com.qmth.distributed.print.api;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.params.BasicStudentParams;
+import com.qmth.distributed.print.business.bean.result.EditResult;
 import com.qmth.distributed.print.business.service.PrintCommonService;
+import com.qmth.teachcloud.common.bean.params.BasicCourseParams;
+import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicCourse;
 import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.service.BasicCourseService;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.*;
+import org.hibernate.validator.constraints.pl.REGON;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.validation.Valid;
 import java.util.List;
 
 /**
@@ -31,6 +38,8 @@ public class BasicCourseController {
 
     @Resource
     private PrintCommonService printCommonService;
+    @Resource
+    private BasicCourseService basicCourseService;
 
     /**
      * 查询
@@ -51,35 +60,35 @@ public class BasicCourseController {
         return ResultUtil.ok(userDtos);
     }
 
-    /**
-     * 模糊查询
-     *
-     * @param param
-     * @return
-     */
-    @ApiOperation(value = "模糊查询")
-    @RequestMapping(value = "/query", method = RequestMethod.POST)
-    public Result query(@RequestParam(value = "param", required = false) String param,
-                        @RequestParam(value = "printPlanId", required = false) Long printPlanId) {
-        List<BasicCourse> userDtos = printCommonService.list(param, printPlanId);
-        return ResultUtil.ok(userDtos);
-    }
-
-    /**
-     * 新增/修改
-     *
-     * @param course
-     * @return
-     */
-    @ApiOperation(value = "新增/修改")
-    @RequestMapping(value = "/save", method = RequestMethod.POST)
-    public Result save(@RequestBody BasicCourse course) {
-        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
-        course.setSchoolId(schoolId);
-        boolean isSuccess = printCommonService.saveCourse(course, sysUser.getId());
-        return ResultUtil.ok(isSuccess);
-    }
+//    /**
+//     * 模糊查询
+//     *
+//     * @param param
+//     * @return
+//     */
+//    @ApiOperation(value = "模糊查询")
+//    @RequestMapping(value = "/query", method = RequestMethod.POST)
+//    public Result query(@RequestParam(value = "param", required = false) String param,
+//                        @RequestParam(value = "printPlanId", required = false) Long printPlanId) {
+//        List<BasicCourse> userDtos = printCommonService.list(param, printPlanId);
+//        return ResultUtil.ok(userDtos);
+//    }
+//
+//    /**
+//     * 新增/修改
+//     *
+//     * @param course
+//     * @return
+//     */
+//    @ApiOperation(value = "新增/修改")
+//    @RequestMapping(value = "/save", method = RequestMethod.POST)
+//    public Result save(@RequestBody BasicCourse course) {
+//        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+//        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+//        course.setSchoolId(schoolId);
+//        boolean isSuccess = printCommonService.saveCourse(course, sysUser.getId());
+//        return ResultUtil.ok(isSuccess);
+//    }
 
     /**
      * 删除
@@ -93,5 +102,36 @@ public class BasicCourseController {
         boolean isSuccess = printCommonService.remove(course.getId());
         return ResultUtil.ok(isSuccess);
     }
+
+
+    @ApiOperation(value = "课程管理-查询")
+    @RequestMapping(value = "/query", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findBasicCampusList(@ApiParam(value = "课程名称(模糊查询)") @RequestParam(required = false) String courseName,
+                                      @ApiParam(value = "创建时间(起始位置)") @RequestParam(required = false) String startCreateTime,
+                                      @ApiParam(value = "创建时间(终止位置)") @RequestParam(required = false) String endCreateTime,
+                                      @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
+                                      @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+        return ResultUtil.ok(basicCourseService.basicCoursePage(courseName, SystemConstant.convertIdToLong(startCreateTime),SystemConstant.convertIdToLong(endCreateTime),pageNumber,pageSize));
+    }
+
+    @ApiOperation(value = "课程管理-新增/编辑")
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = EditResult.class)})
+    public Result saveBasicCampus(@Valid @RequestBody BasicCourseParams basicCourseParams, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        return ResultUtil.ok(basicCourseService.saveBasicCourse(basicCourseParams));
+    }
+
+    @ApiOperation(value = "课程管理-批量删除(逻辑)")
+    @RequestMapping(value = "/delete_batch", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "删除成功", response = EditResult.class)})
+    public Result deleteBasicCampus(@ApiParam(value = "选择的要删除的学生id集合",required = true) List<Long> idList) {
+        return ResultUtil.ok(basicCourseService.removeBasicCourseBatch(idList));
+    }
+
+
 }
 

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

@@ -1,8 +1,31 @@
 package com.qmth.distributed.print.api;
 
 
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.params.BasicCampusParams;
+import com.qmth.distributed.print.business.bean.params.BasicStudentParams;
+import com.qmth.distributed.print.business.bean.result.EditResult;
+import com.qmth.distributed.print.business.entity.BasicStudent;
+import com.qmth.distributed.print.business.service.BasicStudentService;
+import com.qmth.distributed.print.business.service.PrintCommonService;
+import com.qmth.distributed.print.business.templete.execute.AsyncStudentDataImportService;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.TBTask;
+import com.qmth.teachcloud.common.enums.TaskTypeEnum;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import com.qmth.teachcloud.common.util.ServletUtil;
+import io.swagger.annotations.*;
+import org.junit.Test;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * <p>
@@ -12,8 +35,50 @@ import org.springframework.web.bind.annotation.RestController;
  * @author wangliang
  * @since 2021-08-02
  */
+@Api(tags = "学生管理controller")
 @RestController
-@RequestMapping("/basic-student")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.basic}/student")
 public class BasicStudentController {
+    @Resource
+    private BasicStudentService basicStudentService;
+    @Resource
+    private PrintCommonService printCommonService;
+    @Resource
+    private AsyncStudentDataImportService asyncStudentDataImportService;
+
+    @ApiOperation(value = "学生基本信息管理-查询")
+    @RequestMapping(value = "/query", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findBasicCampusList(@ApiParam(value = "查询参数(学生学号或姓名)") @RequestParam(required = false) String queryParams,
+                                      @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
+                                      @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+        return ResultUtil.ok(basicStudentService.basicStudentPage(queryParams, pageNumber, pageSize));
+    }
+
+    @ApiOperation(value = "学生基本信息管理-新增/编辑")
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = EditResult.class)})
+    public Result saveBasicCampus(@Valid @RequestBody BasicStudentParams basicStudentParams, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        return ResultUtil.ok(basicStudentService.saveBasicStudent(basicStudentParams));
+    }
+
+    @ApiOperation(value = "学生基本信息管理-批量删除(逻辑)")
+    @RequestMapping(value = "/delete_batch", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "删除成功", response = EditResult.class)})
+    public Result deleteBasicCampus(@ApiParam(value = "选择的要删除的学生id集合",required = true) List<Long> idList) {
+        return ResultUtil.ok(basicStudentService.removeBasicStudentBatch(idList));
+    }
 
+    @ApiOperation(value = "学生基本信息管理-批量导入(异步)")
+    @RequestMapping(value = "/data_import", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
+    public Result examinationImportAysnc(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file) throws Exception {
+        Map<String, Object> map = printCommonService.saveTask(file, TaskTypeEnum.STUDENT_IMPORT);
+        asyncStudentDataImportService.importTask(map);
+        TBTask tbTask = Objects.nonNull(map.get(SystemConstant.TASK)) ? (TBTask) map.get(SystemConstant.TASK) : null;
+        return Objects.nonNull(tbTask) ? ResultUtil.ok(tbTask.getId()) : ResultUtil.error("创建任务失败");
+    }
 }

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

@@ -1,33 +1,29 @@
 package com.qmth.distributed.print.api;
 
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.result.EditResult;
+import com.qmth.distributed.print.business.bean.result.TaskApproveResult;
 import com.qmth.distributed.print.business.entity.TFFlow;
 import com.qmth.distributed.print.business.service.ActivitiService;
 import com.qmth.distributed.print.business.service.PrintCommonService;
 import com.qmth.distributed.print.business.service.TFFlowService;
-import com.qmth.teachcloud.common.base.BaseListPage;
-import com.qmth.teachcloud.common.base.BasePage;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicAttachment;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.FieldUniqueEnum;
+import com.qmth.teachcloud.common.enums.FlowApprovePassEnum;
 import com.qmth.teachcloud.common.enums.UploadFileEnum;
 import com.qmth.teachcloud.common.service.BasicAttachmentService;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import io.swagger.annotations.*;
-import org.activiti.engine.RuntimeService;
-import org.activiti.engine.TaskService;
-import org.activiti.engine.task.Task;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.dao.DuplicateKeyException;
@@ -40,7 +36,6 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
@@ -71,12 +66,6 @@ public class TFFlowController {
     @Resource
     TFFlowService tfFlowService;
 
-    @Resource
-    RuntimeService runtimeService;
-
-    @Resource
-    TaskService taskService;
-
     @ApiOperation(value = "注册流程")
     @Transactional
     @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = ResultUtil.class)})
@@ -142,25 +131,29 @@ public class TFFlowController {
         return ResultUtil.ok(tfFlowService.list(new Page<>(pageNumber, pageSize), name, SystemConstant.getHeadOrUserSchoolId(), sysUser.getOrgId()));
     }
 
-    @ApiOperation(value = "启动流程")
+    @ApiOperation(value = "审批流程")
     @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = ResultUtil.class)})
-    @RequestMapping(value = "/start", method = RequestMethod.POST)
-    public Result start() {
-        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+    @RequestMapping(value = "/task/approve", method = RequestMethod.POST)
+    public Result teachTaskList(@ApiParam(value = "流程任务id", required = true) @RequestParam String taskId,
+                                @ApiParam(value = "流程审批操作", required = false) @RequestParam(required = false) FlowApprovePassEnum approvePass,
+                                @ApiParam(value = "流程审核意见", required = false) @RequestParam(required = false) String remark,
+                                @ApiParam(value = "流程驳回节点", required = false) @RequestParam(required = false) Integer setup) {
         Map<String, Object> map = new HashMap<>();
-        map.computeIfAbsent(SystemConstant.TEACH_ID, v -> String.valueOf(sysUser.getId()));
-        activitiService.startActivity(SystemConstant.GDYKDX_FLOW_KEY, map);
+        map.computeIfAbsent(SystemConstant.FLOW_TASK_ID, v -> taskId);
+        map.computeIfAbsent(SystemConstant.APPROVE_OPERATION, v -> approvePass);
+        map.computeIfAbsent(SystemConstant.APPROVE_REMARK, v -> remark);
+        map.computeIfAbsent(SystemConstant.APPROVE_SETUP, v -> setup);
+        activitiService.taskApprove(map);
         return ResultUtil.ok();
     }
 
-    @ApiOperation(value = "命题老师获取待办流程")
-    @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = ResultUtil.class)})
-    @RequestMapping(value = "teach/task/list", method = RequestMethod.POST)
-    public Result teachTaskList(@ApiParam(value = "页码", required = true) @RequestParam Integer pageNumber,
-                                @ApiParam(value = "数量", required = true) @RequestParam Integer pageSize) {
+    @ApiOperation(value = "流程审批记录列表")
+    @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = TaskApproveResult.class)})
+    @RequestMapping(value = "/task/approve/list", method = RequestMethod.POST)
+    public Result taskApproveList(@ApiParam(value = "发起人名称", required = false) @RequestParam(required = false) String teacherName,
+                                  @ApiParam(value = "页码", required = true) @RequestParam Integer pageNumber,
+                                  @ApiParam(value = "数量", required = true) @RequestParam Integer pageSize) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        List<Task> taskList = taskService.createTaskQuery().taskAssignee(String.valueOf(sysUser.getId())).orderByTaskCreateTime().desc().list();
-//        BaseListPage<Task> taskIPage = new BaseListPage<>(tasks.subList(pageNumber, pageSize), pageNumber, pageSize, tasks.size());
-        return ResultUtil.ok(true);
+        return ResultUtil.ok(tfFlowService.taskApproveList(new Page<>(pageNumber, pageSize), teacherName, SystemConstant.getHeadOrUserSchoolId(), sysUser.getOrgId()));
     }
 }

+ 1 - 1
distributed-print/src/main/resources/processes/GdykdxPaperApprove.bpmn

@@ -2,7 +2,7 @@
 <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
   <process id="GdykdxPaperApprove" name="GdykdxPaperApprove" isExecutable="true">
     <startEvent id="startevent1" name="Start"></startEvent>
-    <userTask id="usertask1" name="提交试卷(命题老师)" activiti:assignee="${teachId}"></userTask>
+    <userTask id="usertask1" name="提交试卷(命题老师)" activiti:assignee="${approveId}"></userTask>
     <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
     <userTask id="usertask2" name="审核试卷(教研室主任)">
       <extensionElements>

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

@@ -0,0 +1,83 @@
+package com.qmth.teachcloud.common.bean.params;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Length;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @Description: 基础课程参数
+ * @Author: CaoZixuan
+ * @Date: 2021-08-04
+ */
+public class BasicCourseParams {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "课程id(编辑时必填)")
+    private Long id;
+
+    @ApiModelProperty(value = "课程名称")
+    @NotNull(message = "请输入课程名称")
+    @Length(min = 1,message = "请输入课程名称")
+    private String courseName;
+
+    @ApiModelProperty(value = "课程编号(系统默认生成全校唯一,允许编辑,提交时校验)")
+    @NotNull(message = "请输入课程编号")
+    @Length(min = 1,message = "请输入课程编号")
+    private String courseCode;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "所属教研室id")
+    @NotNull(message = "请选择所属教研室")
+    @Range(min = 1L, message = "请选择所属教研室")
+    private Long teachingRoomId;
+
+    @ApiModelProperty(value = "授课班级集合")
+    @NotEmpty(message = "请输入班级名称")
+    private List<String> clazzList;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public Long getTeachingRoomId() {
+        return teachingRoomId;
+    }
+
+    public void setTeachingRoomId(Long teachingRoomId) {
+        this.teachingRoomId = teachingRoomId;
+    }
+
+    public List<String> getClazzList() {
+        return clazzList;
+    }
+
+    public void setClazzList(List<String> clazzList) {
+        this.clazzList = clazzList;
+    }
+}

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

@@ -0,0 +1,116 @@
+package com.qmth.teachcloud.common.bean.result;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 课程查询结果
+ * @Author: CaoZixuan
+ * @Date: 2021-08-04
+ */
+public class BasicCourseResult {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "课程id")
+    private Long id;
+
+    @ApiModelProperty(value = "课程名称")
+    private String courseName;
+
+    @ApiModelProperty(value = "课程编码")
+    private String courseCode;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "所属教研室id")
+    private Long teachingRoomId;
+
+    @ApiModelProperty(value = "所属教研室名称")
+    private String teachingRoomName;
+
+    @ApiModelProperty(value = "班级")
+    private String clazz;
+
+    @ApiModelProperty(value = "是否被逻辑删除")
+    private Boolean enable;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "创建时间")
+    private Long createTime;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "创建人id")
+    private Long createId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public Long getTeachingRoomId() {
+        return teachingRoomId;
+    }
+
+    public void setTeachingRoomId(Long teachingRoomId) {
+        this.teachingRoomId = teachingRoomId;
+    }
+
+    public String getTeachingRoomName() {
+        return teachingRoomName;
+    }
+
+    public void setTeachingRoomName(String teachingRoomName) {
+        this.teachingRoomName = teachingRoomName;
+    }
+
+    public String getClazz() {
+        return clazz;
+    }
+
+    public void setClazz(String clazz) {
+        this.clazz = clazz;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+    public Long getCreateId() {
+        return createId;
+    }
+
+    public void setCreateId(Long createId) {
+        this.createId = createId;
+    }
+}

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

@@ -75,6 +75,7 @@ public class SystemConstant {
     public static final String ADMIN_CODE = "admin";
     public static final String AUTH = "auth";//命题老师id
 //    public static final int MAX_RETRY_CREATE_PDF_COUNT = 5;
+    public static final String REGULAR_EXPRESSION_OF_CODE = "[a-zA-Z0-9](\\w+)?-?(\\w+)?—?(\\w+)?(\\((\\w+)?-?(\\w+)?—?(\\w+)?\\))?(\\((\\w+)?-?(\\w+)?—?(\\w+)?\\))?(\\w+)?";
 
     /**
      * oss url过期时间
@@ -183,10 +184,15 @@ public class SystemConstant {
      */
     public static final String PROCESSES = "processes";
     public static final String GDYKDX_FLOW_KEY = "GdykdxPaperApprove";//流程key
-    public static final String TEACH_ID = "teachId";//命题老师id
+    public static final String APPROVE_ID = "approveId";//审批id
     public static final String FLOW_ID = "flowId";//流程id
     public static final String TASK_ID = "taskId";//命题任务id
+    public static final String FLOW_TASK_ID = "flowTaskId";//流程任务id
+    public static final String APPROVE = "approve";//流程审核变量
+    public static final String APPROVE_SETUP = "approveSetup";//流程节点
+    public static final String APPROVE_OPERATION = "approveOperation";//流程节点
     public static final String FLOW_STATUS = "flowStatus";//流程状态
+    public static final String APPROVE_REMARK = "approveRemark";//流程审批意见
 
     /**
      * 初始化附件文件路径

+ 25 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicCourse.java

@@ -32,6 +32,11 @@ public class BasicCourse extends BaseEntity implements Serializable {
     @TableField("org_id")
     private Long orgId;
 
+    @ApiModelProperty(value = "教研室id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("teaching_room_id")
+    private Long teachingRoomId;
+
     /**
      * 课程编码
      */
@@ -43,6 +48,10 @@ public class BasicCourse extends BaseEntity implements Serializable {
 
     private String clazz;
 
+    @ApiModelProperty(value = "是否可用")
+    @TableField("enable")
+    private Boolean enable;
+
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }
@@ -79,6 +88,22 @@ public class BasicCourse extends BaseEntity implements Serializable {
         this.name = name;
     }
 
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public Long getTeachingRoomId() {
+        return teachingRoomId;
+    }
+
+    public void setTeachingRoomId(Long teachingRoomId) {
+        this.teachingRoomId = teachingRoomId;
+    }
+
     public String getClazz() {
         return clazz;
     }

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

@@ -45,6 +45,10 @@ public class BasicUserCourse extends BaseEntity implements Serializable {
     @TableField("course_id")
     private Long courseId;
 
+    @ApiModelProperty(value = "授课班级")
+    @TableField("clazz")
+    private String clazz;
+
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }
@@ -80,4 +84,12 @@ public class BasicUserCourse extends BaseEntity implements Serializable {
     public void setCourseId(Long courseId) {
         this.courseId = courseId;
     }
+
+    public String getClazz() {
+        return clazz;
+    }
+
+    public void setClazz(String clazz) {
+        this.clazz = clazz;
+    }
 }

+ 0 - 44
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FlowApproveLevelEnum.java

@@ -1,44 +0,0 @@
-package com.qmth.teachcloud.common.enums;
-
-import java.util.Objects;
-
-/**
- * @Description: 流程审批等级 enum
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2021/8/2
- */
-public enum FlowApproveLevelEnum {
-
-    START("发起人"),
-
-    PRIMARY("一级审核人"),
-
-    SECOND("二级审核人");
-
-    private String title;
-
-    private FlowApproveLevelEnum(String title) {
-        this.title = title;
-    }
-
-    public String getTitle() {
-        return title;
-    }
-
-    /**
-     * 状态转换 toName
-     *
-     * @param title
-     * @return
-     */
-    public static String convertToName(String title) {
-        for (FlowApproveLevelEnum e : FlowApproveLevelEnum.values()) {
-            if (Objects.equals(title, e.getTitle())) {
-                return e.name();
-            }
-        }
-        return null;
-    }
-}

+ 3 - 3
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FlowApprovePassEnum.java

@@ -3,7 +3,7 @@ package com.qmth.teachcloud.common.enums;
 import java.util.Objects;
 
 /**
- * @Description: 流程是否通过操作 enum
+ * @Description: 流程审批操作 enum
  * @Param:
  * @return:
  * @Author: wangliang
@@ -13,7 +13,7 @@ public enum FlowApprovePassEnum {
 
     PASS("通过"),
 
-    NO_PASS("不通过");
+    REJECT("驳回");
 
     private String title;
 
@@ -39,4 +39,4 @@ public enum FlowApprovePassEnum {
         }
         return null;
     }
-}
+}

+ 75 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FlowGdykdxApproveSetupEnum.java

@@ -0,0 +1,75 @@
+package com.qmth.teachcloud.common.enums;
+
+import java.util.Objects;
+
+/**
+ * @Description: 广东医科大学流程审批步骤 enum
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/8/2
+ */
+public enum FlowGdykdxApproveSetupEnum {
+
+    SUBMIT("提交试卷", "usertask1", 1),
+
+    PRIMARY_APPROVE("一级审核", "usertask2", 2),
+
+    SECOND_APPROVE("二级审核", "usertask3", 3),
+
+    END("已结束或已终止", null, -1);
+
+    private String title;
+
+    private String id;
+
+    private int setup;
+
+    private FlowGdykdxApproveSetupEnum(String title, String id, int setup) {
+        this.title = title;
+        this.id = id;
+        this.setup = setup;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public int getSetup() {
+        return setup;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param title
+     * @return
+     */
+    public static String convertToName(String title) {
+        for (FlowGdykdxApproveSetupEnum e : FlowGdykdxApproveSetupEnum.values()) {
+            if (Objects.equals(title, e.getTitle())) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 状态转换 ToInstance
+     *
+     * @param id
+     * @return
+     */
+    public static FlowGdykdxApproveSetupEnum convertToInstance(String id) {
+        for (FlowGdykdxApproveSetupEnum e : FlowGdykdxApproveSetupEnum.values()) {
+            if (Objects.equals(id, e.getId())) {
+                return e;
+            }
+        }
+        return null;
+    }
+}

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

@@ -11,11 +11,7 @@ import java.util.Objects;
  */
 public enum FlowStatusEnum {
 
-    DRAFT("草稿"),
-
-    TO_BE_SUBMIT("待提交"),
-
-    SUBMIT("已提交"),
+    START("已开始"),
 
     AUDITING("审核中"),
 

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

@@ -13,6 +13,8 @@ public enum TaskTypeEnum {
 
     USER_IMPORT("用户导入"),
 
+    STUDENT_IMPORT("学生导入"),
+
     COURSE_IMPORT("课程导入"),
 
     QUESTION_MISSION_BATCH_CREATE("批量新建命题任务"),

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

@@ -4,10 +4,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.teachcloud.common.bean.dto.CourseInfoDto;
+import com.qmth.teachcloud.common.bean.result.BasicCourseResult;
 import com.qmth.teachcloud.common.entity.BasicCourse;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -24,4 +26,23 @@ public interface BasicCourseMapper extends BaseMapper<BasicCourse> {
     IPage<BasicCourse> listPage(Page<BasicCourse> page, @Param("schoolId") Long schoolId, @Param("code") String code, @Param("name") String name);
 
     List<CourseInfoDto> findByUserLoginNameAndRealName(@Param("loginName")String loginName, @Param("realName") String realName);
+
+    /**
+     * 查询课程字典
+     * @param iPage 分页参数
+     * @param courseName 课程名称(模糊查询)
+     * @param startCreateTime 课程创建时间(起始值)
+     * @param endCreateTime 课程创建时间(终止值)
+     * @param schoolId 学校id
+     * @param orgIds 权限机构组
+     * @return 结果
+     */
+    IPage<BasicCourseResult> findBasicCoursePage(@Param("iPage") Page<BasicCourseResult> iPage,
+                                                 @Param("courseName") String courseName,
+                                                 @Param("startCreateTime") Long startCreateTime,
+                                                 @Param("endCreateTime") Long endCreateTime,
+                                                 @Param("schoolId") Long schoolId,
+                                                 @Param("orgIds") Set<Long> orgIds);
+
+
 }

+ 29 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/BasicCourseService.java

@@ -3,6 +3,8 @@ package com.qmth.teachcloud.common.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.teachcloud.common.bean.dto.CourseInfoDto;
+import com.qmth.teachcloud.common.bean.params.BasicCourseParams;
+import com.qmth.teachcloud.common.bean.result.BasicCourseResult;
 import com.qmth.teachcloud.common.entity.BasicCourse;
 
 import java.util.List;
@@ -45,4 +47,31 @@ public interface BasicCourseService extends IService<BasicCourse> {
      * @param courseName 课程名称
      */
     void createCourse(Long schoolId,String courseCode,String courseName);
+
+    // dev_2.2.0
+
+    /**
+     * 查询课程信息-分页查询
+     * @param courseName 课程名称(模糊查询)
+     * @param startCreateTime 课程创建时间(起始)
+     * @param endCreateTime 课程创建时间(终止)
+     * @param pageNumber 分页页码
+     * @param pageSize 分页容量
+     * @return 查询结果
+     */
+    IPage<BasicCourseResult> basicCoursePage(String courseName, Long startCreateTime, Long endCreateTime, int pageNumber, int pageSize);
+
+    /**
+     * 新增/编辑 课程基础信息
+     * @param basicCourseParams 基础课程信息参数
+     * @return 新增或编辑的课程id
+     */
+    Long saveBasicCourse(BasicCourseParams basicCourseParams);
+
+    /**
+     * 批量删除课程基本信息(逻辑)
+     * @param idList 要删除的课程主键集合
+     * @return 是否删除成功
+     */
+    Boolean removeBasicCourseBatch(List<Long> idList);
 }

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

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.teachcloud.common.entity.BasicUserCourse;
 import com.qmth.teachcloud.common.entity.SysUser;
 
+import java.util.List;
+
 /**
  * <p>
  * 用户和课程关联表 服务类
@@ -17,4 +19,13 @@ public interface BasicUserCourseService extends IService<BasicUserCourse> {
     void removeByUserId(Long userId);
 
     void saveBatch(SysUser sysUser);
+
+    /**
+     * 根据课程id和班级集合更新'basic_user_course'表
+     * 逻辑:课程id查询出所有该课程相关记录并删除,添加和班级对应关系
+     * @param courseId 课程id
+     * @param clazzList 班级集合
+     * @param sysUser 执行人
+     */
+    void updateByCourseIdAndClazzList(Long courseId, List<String> clazzList,SysUser sysUser);
 }

+ 105 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicCourseServiceImpl.java

@@ -1,15 +1,25 @@
 package com.qmth.teachcloud.common.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.teachcloud.common.bean.dto.CourseInfoDto;
+import com.qmth.teachcloud.common.bean.params.BasicCourseParams;
+import com.qmth.teachcloud.common.bean.result.BasicCourseResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicCourse;
+import com.qmth.teachcloud.common.entity.SysOrg;
+import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.OrgCenterTypeEnum;
+import com.qmth.teachcloud.common.enums.OrgTypeEnum;
 import com.qmth.teachcloud.common.mapper.BasicCourseMapper;
 import com.qmth.teachcloud.common.service.BasicCourseService;
+import com.qmth.teachcloud.common.service.BasicUserCourseService;
+import com.qmth.teachcloud.common.service.SysOrgService;
+import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,6 +29,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import java.util.List;
 import java.util.Objects;
+import java.util.Set;
 
 /**
  * <p>
@@ -33,6 +44,12 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
 
     @Resource
     private BasicCourseMapper basicCourseMapper;
+    @Resource
+    private TeachcloudCommonService teachcloudCommonService;
+    @Resource
+    private SysOrgService sysOrgService;
+    @Resource
+    private BasicUserCourseService basicUserCourseService;
 
 
 
@@ -85,7 +102,7 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void createCourse(Long schoolId, String courseCode, String courseName) {
-        // 向'basic_course'表新增数据
+        // 向'basic_course'表新增数据 - 教研分析用
         List<BasicCourse> basicCourseList = this.list(new QueryWrapper<BasicCourse>().lambda()
                 .eq(BasicCourse::getSchoolId,schoolId).eq(BasicCourse::getCode,courseCode));
         if (basicCourseList.size() > 0){
@@ -98,4 +115,91 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
         basicCourse.setSchoolId(schoolId);
         this.save(basicCourse);
     }
+
+    @Override
+    public IPage<BasicCourseResult> basicCoursePage(String courseName, Long startCreateTime, Long endCreateTime, int pageNumber, int pageSize) {
+        Long schoolId = SystemConstant.convertIdToLong(ServletUtil.getRequestHeaderSchoolId().toString());
+        Set<Long> orgIds = teachcloudCommonService.listSubOrgIds(null);
+        courseName = SystemConstant.translateSpecificSign(courseName);
+        return basicCourseMapper.findBasicCoursePage(new Page<>(pageNumber,pageSize),courseName,startCreateTime,endCreateTime,schoolId,orgIds);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Long saveBasicCourse(BasicCourseParams basicCourseParams) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        Long schoolId = sysUser.getSchoolId();
+        Long id = basicCourseParams.getId();
+        String courseName = basicCourseParams.getCourseName();
+        // 校验课程编号
+        String courseCode = basicCourseParams.getCourseCode();
+        BasicCourse checkCode = this.getOne(new QueryWrapper<BasicCourse>().lambda()
+                .eq(BasicCourse::getCode,courseCode)
+                .eq(BasicCourse::getSchoolId,schoolId)
+                .eq(BasicCourse::getEnable,true));
+        if (Objects.nonNull(checkCode)){
+            if (!checkCode.getId().equals(id)){
+                throw ExceptionResultEnum.ERROR.exception("课程编号【" + courseCode +"】重复");
+            }
+        }
+        // 校验教研室id
+        Long teachingRoomId = basicCourseParams.getTeachingRoomId();
+        if (Objects.isNull(sysOrgService.getOne(new QueryWrapper<SysOrg>().lambda()
+                .eq(SysOrg::getId,teachingRoomId)
+                .eq(SysOrg::getEnable,true)
+                .eq(SysOrg::getType, OrgTypeEnum.TEACHING_ROOM)))){
+            throw ExceptionResultEnum.ERROR.exception("所选教研室不存在");
+        }
+        // 校验班级
+        List<String> clazzList = basicCourseParams.getClazzList();
+        if (clazzList.size() != clazzList.stream().distinct().count()){
+            throw ExceptionResultEnum.ERROR.exception("输入的班级重复");
+        }
+
+        //基础数据组装
+        BasicCourse basicCourse = new BasicCourse();
+        basicCourse.setName(courseName);
+        basicCourse.setCode(courseCode);
+        basicCourse.setTeachingRoomId(teachingRoomId);
+        basicCourse.setSchoolId(schoolId);
+
+        if (!SystemConstant.longNotNull(id)){
+            // 没有id -》新增
+            id = SystemConstant.getDbUuid();
+            basicCourse.setId(id);
+            basicCourse.setCreateId(sysUser.getId());
+            basicCourse.setEnable(true);
+        }else {
+            // 有id -》 更新
+            basicCourse.setId(id);
+            basicCourse.setUpdateId(sysUser.getId());
+            basicCourse.setOrgId(sysUser.getOrgId());
+        }
+
+        // 根据课程id和授课班级集合更新'basic_user_course'表
+        basicUserCourseService.updateByCourseIdAndClazzList(id,clazzList,sysUser);
+
+        // 新增或更新基础课程表
+        this.saveOrUpdate(basicCourse);
+
+        return id;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean removeBasicCourseBatch(List<Long> idList) {
+        if (idList.size() == 0){
+            throw ExceptionResultEnum.ERROR.exception("请选择要删除的目标");
+        }
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+
+        UpdateWrapper<BasicCourse> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda()
+                .set(BasicCourse::getEnable,false)
+                .in(BasicCourse::getId,idList)
+                .set(BasicCourse::getOrgId,sysUser.getOrgId())
+                .set(BasicCourse::getUpdateId,sysUser.getId());
+
+        return this.update(updateWrapper);
+    }
 }

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

@@ -1,15 +1,20 @@
 package com.qmth.teachcloud.common.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicUserCourse;
 import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.mapper.BasicUserCourseMapper;
 import com.qmth.teachcloud.common.service.BasicUserCourseService;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -43,4 +48,55 @@ public class BasicUserCourseServiceImpl extends ServiceImpl<BasicUserCourseMappe
         }
         this.saveBatch(list);
     }
+
+    @Transactional
+    @Override
+    public void updateByCourseIdAndClazzList(Long courseId, List<String> clazzList, SysUser sysUser) {
+        List<BasicUserCourse> basicUserCourseList = this.list(new QueryWrapper<BasicUserCourse>().lambda()
+                .eq(BasicUserCourse::getCourseId, courseId));
+
+        // 寻找要删除的目标(1.班级不为空 2.老班级不被新班级集合包含)
+        List<BasicUserCourse> willUpdateList = new ArrayList<>();
+        List<Long> willDeleteIdList = new ArrayList<>();
+        List<String> willAddClazz = new ArrayList<>(clazzList);
+        List<BasicUserCourse> willAddList = new ArrayList<>();
+
+        for (BasicUserCourse old : basicUserCourseList) {
+            String clazz = old.getClazz();
+            Long id = old.getId();
+            if (SystemConstant.strNotNull(clazz)){
+                if (clazzList.contains(clazz)){
+                    // 要更新时间的旧关系
+                    old.setOrgId(sysUser.getOrgId());
+                    old.setUpdateId(sysUser.getUpdateId());
+                    willUpdateList.add(old);
+                    willAddClazz.remove(clazz);
+                }else {
+                    // 要被删除的旧关系
+                    willDeleteIdList.add(id);
+                }
+            }
+        }
+
+        // 删掉全部
+        if (willDeleteIdList.size() > 0) {
+            this.removeByIds(willDeleteIdList);
+        }
+
+        // 更新
+        this.updateBatchById(willUpdateList);
+
+        // 新增
+        for (String addClazz : willAddClazz) {
+            BasicUserCourse basicUserCourse = new BasicUserCourse();
+            basicUserCourse.setId(SystemConstant.getDbUuid());
+            basicUserCourse.setSchoolId(sysUser.getSchoolId());
+            basicUserCourse.setOrgId(sysUser.getOrgId());
+            basicUserCourse.setCourseId(courseId);
+            basicUserCourse.setClazz(addClazz);
+            basicUserCourse.setCreateId(sysUser.getId());
+            willAddList.add(basicUserCourse);
+        }
+        this.saveBatch(willAddList);
+    }
 }

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

@@ -57,5 +57,48 @@
             su.login_name = #{loginName}
           AND real_name = #{realName};
     </select>
+    <select id="findBasicCoursePage" resultType="com.qmth.teachcloud.common.bean.result.BasicCourseResult">
+        SELECT
+            bc.id,
+            MAX(bc.code) AS courseCode,
+            MAX(bc.name) AS courseName,
+            MAX(teaching_room_id) AS teachingRoomId,
+            MAX(org.name) AS teachingRoomName,
+            GROUP_CONCAT(buc.clazz
+                         SEPARATOR ',') AS clazz,
+            MAX(bc.create_id) AS createId,
+            MAX(bc.create_time) AS createTime
+        FROM
+            basic_course bc
+                INNER JOIN
+            basic_user_course buc ON bc.id = buc.course_id
+                LEFT JOIN
+            sys_org org ON bc.teaching_room_id = org.id
+                AND org.type = 'TEACHING_ROOM'
+                AND org.enable = TRUE
+        <where>
+            AND bc.enable = TRUE
+            <if test="courseName != null and courseName.length > 0">
+                AND bc.name LIKE CONCAT('%',#{courseName},'%')
+            </if>
+            <if test="startCreateTime != null and startCreateTime > 0">
+                AND bc.create_time >= #{startCreateTime}
+            </if>
+            <if test="endCreateTime != null and endCreateTime > 0">
+                AND #{endCreateTime} >= bc.create_time
+            </if>
+            <if test="schoolId != null and schoolId > 0">
+                and bc.school_id = #{schoolId}
+            </if>
+            <if test="orgIds != null and orgIds.size > 0">
+                AND bc.org_id IN
+                <foreach collection="orgIds" item="item" index="index" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+        GROUP BY bc.id
+        ORDER BY createTime DESC
+    </select>
 
 </mapper>