浏览代码

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

xiaof 3 年之前
父节点
当前提交
a29944d82b
共有 34 个文件被更改,包括 1311 次插入575 次删除
  1. 45 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/FlowApproveParam.java
  2. 81 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/FlowApproveResult.java
  3. 73 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/FlowTaskResult.java
  4. 0 197
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/TaskApproveResult.java
  5. 2 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamTask.java
  6. 3 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TFFlow.java
  7. 29 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TFFlowApprove.java
  8. 55 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TFFlowApproveLog.java
  9. 29 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TFFlowLog.java
  10. 3 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TFFlowMapper.java
  11. 14 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ActivitiService.java
  12. 13 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/BasicStudentService.java
  13. 3 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TFFlowService.java
  14. 273 123
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ActivitiServiceImpl.java
  15. 147 55
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicStudentServiceImpl.java
  16. 4 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TFFlowServiceImpl.java
  17. 72 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCourseDataImportService.java
  18. 15 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncStudentDataImportService.java
  19. 8 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/TaskLogicService.java
  20. 46 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java
  21. 0 25
      distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml
  22. 44 2
      distributed-print-business/src/main/resources/mapper/TFFlowMapper.xml
  23. 21 4
      distributed-print/src/main/java/com/qmth/distributed/print/api/BasicCourseController.java
  24. 7 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/BasicStudentController.java
  25. 0 19
      distributed-print/src/main/java/com/qmth/distributed/print/api/TBDepartmentController.java
  26. 0 19
      distributed-print/src/main/java/com/qmth/distributed/print/api/TFFlowApproveController.java
  27. 56 17
      distributed-print/src/main/java/com/qmth/distributed/print/api/TFFlowController.java
  28. 0 19
      distributed-print/src/main/java/com/qmth/distributed/print/api/TFFlowLogController.java
  29. 60 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/BasicCourseImportDto.java
  30. 5 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  31. 70 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FlowApproveVariableEnum.java
  32. 3 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FlowGdykdxApproveSetupEnum.java
  33. 13 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/BasicCourseService.java
  34. 117 63
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicCourseServiceImpl.java

+ 45 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/FlowApproveParam.java

@@ -0,0 +1,45 @@
+package com.qmth.distributed.print.business.bean.params;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.base.BasePage;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: 流程审批参数
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/8/6
+ */
+public class FlowApproveParam implements Serializable {
+
+    @ApiModelProperty(value = "流程id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "流程id不能为空")
+    private Long flowId;
+
+    @ApiModelProperty(value = "是否启用,0:停用,1:启用")
+    @NotNull(message = "启用/禁用不能为空")
+    private Boolean enable;
+
+    public Long getFlowId() {
+        return flowId;
+    }
+
+    public void setFlowId(Long flowId) {
+        this.flowId = flowId;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+}

+ 81 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/FlowApproveResult.java

@@ -0,0 +1,81 @@
+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.distributed.print.business.entity.TFFlowApproveLog;
+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 FlowApproveResult extends TFFlowApproveLog implements Serializable {
+
+    @ApiModelProperty(value = "发起人名称")
+    private String startName;
+
+    @ApiModelProperty(value = "一级审核人名称")
+    private String primaryApproveName;
+
+    @ApiModelProperty(value = "二级审核人名称")
+    private String secondApproveName;
+
+    @ApiModelProperty(value = "流程状态")
+    private FlowStatusEnum status;
+
+    @ApiModelProperty(value = "流程状态")
+    private String statusStr;
+
+    public FlowStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(FlowStatusEnum status) {
+        this.status = status;
+    }
+
+    public String getStartName() {
+        return startName;
+    }
+
+    public void setStartName(String startName) {
+        this.startName = startName;
+    }
+
+    public String getPrimaryApproveName() {
+        return primaryApproveName;
+    }
+
+    public void setPrimaryApproveName(String primaryApproveName) {
+        this.primaryApproveName = primaryApproveName;
+    }
+
+    public String getSecondApproveName() {
+        return secondApproveName;
+    }
+
+    public void setSecondApproveName(String secondApproveName) {
+        this.secondApproveName = secondApproveName;
+    }
+
+    public String getStatusStr() {
+        if (Objects.nonNull(status)) {
+            return status.getTitle();
+        } else {
+            return statusStr;
+        }
+    }
+
+    public void setStatusStr(String statusStr) {
+        this.statusStr = statusStr;
+    }
+}

+ 73 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/FlowTaskResult.java

@@ -0,0 +1,73 @@
+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;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 流程节点result
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/8/6
+ */
+public class FlowTaskResult implements Serializable {
+
+    @ApiModelProperty(value = "流程id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long flowId;
+
+    @ApiModelProperty(value = "流程节点名称")
+    private String taskName;
+
+    @ApiModelProperty(value = "流程节点key")
+    private String taskKey;
+
+    @ApiModelProperty(value = "流程节点步骤")
+    private Integer setup;
+
+    public FlowTaskResult() {
+
+    }
+
+    public FlowTaskResult(Long flowId, String taskName, String taskKey, Integer setup) {
+        this.flowId = flowId;
+        this.taskName = taskName;
+        this.taskKey = taskKey;
+        this.setup = setup;
+    }
+
+    public Long getFlowId() {
+        return flowId;
+    }
+
+    public void setFlowId(Long flowId) {
+        this.flowId = flowId;
+    }
+
+    public String getTaskName() {
+        return taskName;
+    }
+
+    public void setTaskName(String taskName) {
+        this.taskName = taskName;
+    }
+
+    public String getTaskKey() {
+        return taskKey;
+    }
+
+    public void setTaskKey(String taskKey) {
+        this.taskKey = taskKey;
+    }
+
+    public Integer getSetup() {
+        return setup;
+    }
+
+    public void setSetup(Integer setup) {
+        this.setup = setup;
+    }
+}

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

@@ -1,197 +0,0 @@
-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;
-    }
-}

+ 2 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamTask.java

@@ -1,5 +1,6 @@
 package com.qmth.distributed.print.business.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@@ -115,6 +116,7 @@ public class ExamTask extends BaseEntity implements Serializable {
 
     @ApiModelProperty(value = "流程id")
     @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "flow_id", updateStrategy = FieldStrategy.IGNORED)
     private Long flowId;
 
     public Long getFlowId() {

+ 3 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TFFlow.java

@@ -3,6 +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 io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -43,6 +44,7 @@ public class TFFlow extends BaseEntity implements Serializable {
     }
 
     public TFFlow(Long schoolId, Long orgId, String name, Long userId) {
+        setId(SystemConstant.getDbUuid());
         this.schoolId = schoolId;
         this.orgId = orgId;
         this.name = name;
@@ -50,6 +52,7 @@ public class TFFlow extends BaseEntity implements Serializable {
     }
 
     public TFFlow(Long schoolId, Long orgId, String name, Boolean publish, Long userId) {
+        setId(SystemConstant.getDbUuid());
         this.schoolId = schoolId;
         this.orgId = orgId;
         this.name = name;

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

@@ -27,6 +27,14 @@ public class TFFlowApprove extends BaseEntity implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+
     @ApiModelProperty(value = "流程id")
     @JsonSerialize(using = ToStringSerializer.class)
     private Long flowId;
@@ -35,7 +43,7 @@ public class TFFlowApprove extends BaseEntity implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long approveId;
 
-    @ApiModelProperty(value = "状态,DRAFT:草稿,TO_BE_SUBMIT:待提交,SUBMIT:已提交,AUDITING:审核中,REJECT:已驳回,END:已终止,FINISH:已结束")
+    @ApiModelProperty(value = "状态,START:已开始,AUDITING:审核中,REJECT:已驳回,END:已终止,FINISH:已结束")
     private FlowStatusEnum status;
 
     @ApiModelProperty(value = "计划步骤")
@@ -45,7 +53,10 @@ public class TFFlowApprove extends BaseEntity implements Serializable {
 
     }
 
-    public TFFlowApprove(Long flowId, Long approveId, FlowStatusEnum status, Long userId) {
+    public TFFlowApprove(Long schoolId, Long orgId, Long flowId, Long approveId, FlowStatusEnum status, Long userId) {
+        setId(SystemConstant.getDbUuid());
+        this.schoolId = schoolId;
+        this.orgId = orgId;
         this.flowId = flowId;
         this.approveId = approveId;
         this.status = status;
@@ -53,6 +64,22 @@ public class TFFlowApprove extends BaseEntity implements Serializable {
         this.setup = FlowGdykdxApproveSetupEnum.SUBMIT.getSetup();
     }
 
+    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 Integer getSetup() {
         return setup;
     }

+ 55 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TFFlowApproveLog.java

@@ -3,6 +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.FlowApproveOperationEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -22,6 +23,14 @@ public class TFFlowApproveLog extends BaseEntity implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+
     @ApiModelProperty(value = "流程id")
     @JsonSerialize(using = ToStringSerializer.class)
     private Long flowId;
@@ -32,7 +41,7 @@ public class TFFlowApproveLog extends BaseEntity implements Serializable {
 
     @ApiModelProperty(value = "发起人id")
     @JsonSerialize(using = ToStringSerializer.class)
-    private Long teacherId;
+    private Long startId;
 
     @ApiModelProperty(value = "一级审核人id")
     @JsonSerialize(using = ToStringSerializer.class)
@@ -57,6 +66,47 @@ public class TFFlowApproveLog extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "是否启用,0:停用,1:启用")
     private Boolean enable;
 
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    public TFFlowApproveLog() {
+
+    }
+
+    public TFFlowApproveLog(Long schoolId, Long orgId, Long flowId, Long taskId, Long startId, Long userId) {
+        setId(SystemConstant.getDbUuid());
+        this.schoolId = schoolId;
+        this.orgId = orgId;
+        this.flowId = flowId;
+        this.taskId = taskId;
+        this.startId = startId;
+        insertInfo(userId);
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    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 static long getSerialVersionUID() {
         return serialVersionUID;
     }
@@ -77,12 +127,12 @@ public class TFFlowApproveLog extends BaseEntity implements Serializable {
         this.taskId = taskId;
     }
 
-    public Long getTeacherId() {
-        return teacherId;
+    public Long getStartId() {
+        return startId;
     }
 
-    public void setTeacherId(Long teacherId) {
-        this.teacherId = teacherId;
+    public void setStartId(Long startId) {
+        this.startId = startId;
     }
 
     public Long getPrimaryApproveId() {

+ 29 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TFFlowLog.java

@@ -3,6 +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.FlowApproveOperationEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -22,6 +23,14 @@ public class TFFlowLog extends BaseEntity implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+
     @ApiModelProperty(value = "流程id")
     @JsonSerialize(using = ToStringSerializer.class)
     private Long flowId;
@@ -50,7 +59,10 @@ public class TFFlowLog extends BaseEntity implements Serializable {
 
     }
 
-    public TFFlowLog(Long flowId, Long taskId, Long approveId, Long userId, String approveRemark) {
+    public TFFlowLog(Long schoolId, Long orgId, Long flowId, Long taskId, Long approveId, Long userId, String approveRemark) {
+        setId(SystemConstant.getDbUuid());
+        this.schoolId = schoolId;
+        this.orgId = orgId;
         this.flowId = flowId;
         this.approveId = approveId;
         this.taskId = taskId;
@@ -58,6 +70,22 @@ public class TFFlowLog extends BaseEntity implements Serializable {
         insertInfo(userId);
     }
 
+    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 FlowApproveOperationEnum getApproveOperation() {
         return approveOperation;
     }

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

@@ -2,7 +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.bean.result.FlowApproveResult;
 import com.qmth.distributed.print.business.entity.TFFlow;
 import org.apache.ibatis.annotations.Param;
 
@@ -33,10 +33,10 @@ public interface TFFlowMapper extends BaseMapper<TFFlow> {
      * 流程审批记录列表
      *
      * @param iPage
-     * @param teacherName
+     * @param startName
      * @param schoolId
      * @param orgId
      * @return
      */
-    IPage<TaskApproveResult> taskApproveList(IPage<Map> iPage, @Param("teacherName") String teacherName, @Param("schoolId") Long schoolId, @Param("orgId") Long orgId);
+    IPage<FlowApproveResult> flowApproveList(IPage<Map> iPage, @Param("startName") String startName, @Param("schoolId") Long schoolId, @Param("orgId") Long orgId);
 }

+ 14 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ActivitiService.java

@@ -1,9 +1,13 @@
 package com.qmth.distributed.print.business.service;
 
+import com.qmth.distributed.print.business.bean.result.FlowTaskResult;
+import org.activiti.bpmn.model.FlowNode;
 import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -50,11 +54,11 @@ public interface ActivitiService {
     void complete(String taskId);
 
     /**
-     * 删除流程
+     * 流程终止
      *
      * @param flowId
      */
-    void deleteProcessInstance(String flowId);
+    public void flowEnd(String flowId);
 
     /**
      * 流程启动
@@ -69,4 +73,12 @@ public interface ActivitiService {
      * @param map
      */
     public void taskApprove(Map<String, Object> map);
+
+    /**
+     * 获取所有流程节点
+     *
+     * @param flowId
+     * @return
+     */
+    public List<FlowTaskResult> getTaskAll(String flowId);
 }

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

@@ -7,8 +7,11 @@ 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.teachcloud.common.entity.SysUser;
+import org.springframework.util.LinkedMultiValueMap;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -37,7 +40,7 @@ public interface BasicStudentService extends IService<BasicStudent> {
      * @param basicStudentParams 基础学生信息参数
      * @return 新增或编辑的校区id
      */
-    Long saveBasicStudent(BasicStudentParams basicStudentParams);
+    Long saveBasicStudent(BasicStudentParams basicStudentParams, SysUser sysUser);
 
     /**
      * 批量删除学生基本信息(逻辑)
@@ -45,4 +48,13 @@ public interface BasicStudentService extends IService<BasicStudent> {
      * @return 是否删除成功
      */
     Boolean removeBasicStudentBatch(List<Long> idList);
+
+    /**
+     * 执行批量导入学生逻辑
+     *
+     * @param finalList 基础学生数据集合
+     * @param map       参数
+     * @return 结果
+     */
+    Map<String, Object> executeBasicStudentImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList, Map<String, Object> map);
 }

+ 3 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TFFlowService.java

@@ -2,9 +2,8 @@ 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.bean.result.FlowApproveResult;
 import com.qmth.distributed.print.business.entity.TFFlow;
-import com.qmth.teachcloud.common.entity.SysRole;
 
 import java.util.Map;
 
@@ -33,10 +32,10 @@ public interface TFFlowService extends IService<TFFlow> {
      * 流程审批记录列表
      *
      * @param iPage
-     * @param teacherName
+     * @param startName
      * @param schoolId
      * @param orgId
      * @return
      */
-    public IPage<TaskApproveResult> taskApproveList(IPage<Map> iPage, String teacherName, Long schoolId, Long orgId);
+    public IPage<FlowApproveResult> flowApproveList(IPage<Map> iPage, String startName, Long schoolId, Long orgId);
 }

+ 273 - 123
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ActivitiServiceImpl.java

@@ -1,21 +1,23 @@
 package com.qmth.distributed.print.business.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.distributed.print.business.bean.result.FlowTaskResult;
 import com.qmth.distributed.print.business.entity.ExamTask;
 import com.qmth.distributed.print.business.entity.TFFlowApprove;
+import com.qmth.distributed.print.business.entity.TFFlowApproveLog;
 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.distributed.print.business.enums.ExamStatusEnum;
+import com.qmth.distributed.print.business.service.*;
 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.*;
+import com.qmth.teachcloud.common.util.RedisUtil;
+import com.qmth.teachcloud.common.util.ResultUtil;
 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.bpmn.model.Process;
+import org.activiti.bpmn.model.*;
 import org.activiti.engine.HistoryService;
 import org.activiti.engine.RepositoryService;
 import org.activiti.engine.RuntimeService;
@@ -34,10 +36,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.annotation.Resource;
 import java.io.File;
 import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * @Description: activiti service impl
@@ -51,13 +50,13 @@ public class ActivitiServiceImpl implements ActivitiService {
     private final static Logger log = LoggerFactory.getLogger(ActivitiServiceImpl.class);
 
     @Resource
-    private RuntimeService runtimeService;
+    RuntimeService runtimeService;
 
     @Resource
-    private TaskService taskService;
+    TaskService taskService;
 
     @Resource
-    private RepositoryService repositoryService;
+    RepositoryService repositoryService;
 
     @Resource
     TFFlowApproveService tfFlowApproveService;
@@ -71,6 +70,12 @@ public class ActivitiServiceImpl implements ActivitiService {
     @Resource
     ExamTaskService examTaskService;
 
+    @Resource
+    TFFlowApproveLogService tfFlowApproveLogService;
+
+    @Resource
+    RedisUtil redisUtil;
+
     /**
      * 注册流程
      *
@@ -169,8 +174,77 @@ public class ActivitiServiceImpl implements ActivitiService {
      * @param flowId
      */
     @Override
-    public void deleteProcessInstance(String flowId) {
-        runtimeService.deleteProcessInstance(flowId, "结束");
+    @Transactional
+    public void flowEnd(String flowId) {
+        Task task = taskService.createTaskQuery().processInstanceId(flowId).singleResult();
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        runtimeService.deleteProcessInstance(flowId, FlowGdykdxApproveSetupEnum.END.getTitle());
+        //流程审批
+        QueryWrapper<TFFlowApprove> tfFlowApproveQueryWrapper = new QueryWrapper<>();
+        tfFlowApproveQueryWrapper.lambda().eq(TFFlowApprove::getFlowId, Long.parseLong(flowId));
+        TFFlowApprove tfFlowApprove = tfFlowApproveService.getOne(tfFlowApproveQueryWrapper);
+        if (Objects.isNull(tfFlowApprove)) {
+            tfFlowApprove = new TFFlowApprove(sysUser.getSchoolId(), sysUser.getOrgId(), Long.parseLong(flowId), sysUser.getId(), FlowStatusEnum.END, sysUser.getId());
+        } else {
+            tfFlowApprove.setStatus(FlowStatusEnum.END);
+            tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.END.getSetup());
+            tfFlowApprove.updateInfo(sysUser.getId());
+        }
+        tfFlowApproveService.saveOrUpdate(tfFlowApprove);
+
+        //流程流水日志
+        QueryWrapper<ExamTask> examTaskQueryWrapper = new QueryWrapper<>();
+        examTaskQueryWrapper.lambda().eq(ExamTask::getFlowId, Long.parseLong(flowId));
+        ExamTask examTask = examTaskService.getOne(examTaskQueryWrapper);
+        TFFlowLog tfFlowLog = new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), Long.parseLong(flowId), examTask.getId(), sysUser.getId(), sysUser.getId(), FlowGdykdxApproveSetupEnum.END.getTitle());
+        tfFlowLog.setApproveOperation(FlowApproveOperationEnum.END);
+        tfFlowLog.setApproveSetup(FlowGdykdxApproveSetupEnum.END.getSetup());
+        tfFlowLogService.save(tfFlowLog);
+
+        if (Objects.nonNull(task)) {
+            String processDefinitionId = historyService.createHistoricProcessInstanceQuery().processInstanceId(flowId).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);
+            if (currFlow instanceof UserTask) {
+                UserTask userTask = (UserTask) currFlow;
+                //广东医科大学流程
+                if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.GDYKDX_FLOW_KEY)) {
+                    //流程审批记录
+                    QueryWrapper<TFFlowApproveLog> tfFlowApproveLogQueryWrapper = new QueryWrapper<>();
+                    tfFlowApproveLogQueryWrapper.lambda().eq(TFFlowApproveLog::getFlowId, Long.parseLong(flowId))
+                            .eq(TFFlowApproveLog::getTaskId, examTask.getId());
+                    TFFlowApproveLog tfFlowApproveLog = tfFlowApproveLogService.getOne(tfFlowApproveLogQueryWrapper);
+                    if (Objects.isNull(tfFlowApproveLog)) {
+                        tfFlowApproveLog = new TFFlowApproveLog(sysUser.getSchoolId(), sysUser.getOrgId(), Long.parseLong(flowId), examTask.getId(), sysUser.getId(), sysUser.getId());
+                    }
+
+                    FlowGdykdxApproveSetupEnum setupEnum = FlowGdykdxApproveSetupEnum.convertToInstance(userTask.getId());
+                    if (setupEnum == FlowGdykdxApproveSetupEnum.SUBMIT) {//命题
+                        tfFlowApproveLog.setStartId(sysUser.getId());
+                        tfFlowApproveLog.setRemark(FlowGdykdxApproveSetupEnum.SUBMIT.getTitle() + FlowApproveOperationEnum.END.getTitle());
+                    } else if (setupEnum == FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE) {//主任
+                        tfFlowApproveLog.setPrimaryApproveId(sysUser.getId());
+                        tfFlowApproveLog.setPrimaryApproveOperation(FlowApproveOperationEnum.END);
+                        tfFlowApproveLog.setPrimaryApproveRemark(FlowApproveOperationEnum.END.getTitle());
+                    } else if (setupEnum == FlowGdykdxApproveSetupEnum.SECOND_APPROVE) {//院长
+                        tfFlowApproveLog.setSecondApproveId(sysUser.getId());
+                        tfFlowApproveLog.setSecondApproveOperation(FlowApproveOperationEnum.END);
+                        tfFlowApproveLog.setSecondApproveRemark(FlowApproveOperationEnum.END.getTitle());
+                    }
+                    tfFlowApproveLog.updateInfo(sysUser.getId());
+                    tfFlowApproveLogService.saveOrUpdate(tfFlowApproveLog);
+                }
+            }
+        }
+
+        //命题任务修改
+        examTask.setFlowId(null);
+        examTask.setStatus(ExamStatusEnum.DRAFT);
+        examTask.updateInfo(sysUser.getId());
+        examTaskService.updateById(examTask);
     }
 
     /**
@@ -194,7 +268,7 @@ public class ActivitiServiceImpl implements ActivitiService {
         FlowStatusEnum flowStatusEnum = (FlowStatusEnum) map.get(SystemConstant.FLOW_STATUS);
 
         Long approveId = Objects.nonNull(map.get(SystemConstant.APPROVE_ID)) ? Long.parseLong(String.valueOf(map.get(SystemConstant.APPROVE_ID))) : null;
-        tfFlowApproveService.save(new TFFlowApprove(flowId, approveId, flowStatusEnum, sysUser.getId()));
+        tfFlowApproveService.save(new TFFlowApprove(sysUser.getSchoolId(), sysUser.getOrgId(), flowId, approveId, flowStatusEnum, sysUser.getId()));
     }
 
     /**
@@ -205,118 +279,194 @@ public class ActivitiServiceImpl implements ActivitiService {
     @Override
     @Transactional
     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 flowTaskId = null;
+        try {
+            SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+            if (Objects.isNull(map.get(SystemConstant.FLOW_TASK_ID))) {
+                throw ExceptionResultEnum.ERROR.exception("流程任务id不能为空");
+            }
+            flowTaskId = (String) map.get(SystemConstant.FLOW_TASK_ID);
+            if (redisUtil.lock(SystemConstant.REDIS_LOCK_FLOW_TASK_PREFIX + flowTaskId, SystemConstant.REDIS_LOCK_FLOW_TASK_TIME_OUT)) {
+                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(task.getProcessInstanceId()));
+                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("流程驳回节点有误");
+                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, Long.parseLong(processInstanceId));
+                TFFlowApprove tfFlowApprove = tfFlowApproveService.getOne(tfFlowApproveQueryWrapper);
+
+                //流程审批记录
+                QueryWrapper<TFFlowApproveLog> tfFlowApproveLogQueryWrapper = new QueryWrapper<>();
+                tfFlowApproveLogQueryWrapper.lambda().eq(TFFlowApproveLog::getFlowId, Long.parseLong(processInstanceId))
+                        .eq(TFFlowApproveLog::getTaskId, examTask.getId());
+                TFFlowApproveLog tfFlowApproveLog = tfFlowApproveLogService.getOne(tfFlowApproveLogQueryWrapper);
+
+                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(sysUser.getSchoolId(), sysUser.getOrgId(), 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("不能提交他人的任务");
+                            }
+                            if (Objects.isNull(tfFlowApproveLog)) {
+                                tfFlowApproveLog = new TFFlowApproveLog(sysUser.getSchoolId(), sysUser.getOrgId(), Long.parseLong(processInstanceId), examTask.getId(), sysUser.getId(), sysUser.getId());
+                            }
+                            tfFlowLog.setApproveSetup(FlowGdykdxApproveSetupEnum.SUBMIT.getSetup());
+                            tfFlowLog.setApproveOperation(FlowApproveOperationEnum.SUBMIT);
+                            tfFlowApprove.setStatus(FlowStatusEnum.AUDITING);
+                            tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup());
+                        } 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);
+                            FlowApproveVariableEnum approve = approvePass == FlowApprovePassEnum.PASS ? FlowApproveVariableEnum.PRIMARY_APPROVE : FlowApproveVariableEnum.PRIMARY_REJECT;
+                            tfFlowLog.setApproveSetup(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup());
+                            tfFlowApproveLog.setPrimaryApproveId(sysUser.getId());
+                            tfFlowApproveLog.setPrimaryApproveRemark(remark);
+                            if (approve == FlowApproveVariableEnum.PRIMARY_REJECT) {//驳回命题
+                                tfFlowLog.setApproveOperation(FlowApproveOperationEnum.REJECT);
+                                tfFlowApproveLog.setPrimaryApproveOperation(FlowApproveOperationEnum.REJECT);
+                                tfFlowApprove.setStatus(FlowStatusEnum.REJECT);
+                                tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.SUBMIT.getSetup());
+                            } else if (approve == FlowApproveVariableEnum.PRIMARY_APPROVE) {//提交
+                                tfFlowLog.setApproveOperation(FlowApproveOperationEnum.APPROVE);
+                                tfFlowApproveLog.setPrimaryApproveOperation(FlowApproveOperationEnum.APPROVE);
+                                tfFlowApprove.setStatus(FlowStatusEnum.AUDITING);
+                                tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.SECOND_APPROVE.getSetup());
+                            } else {
+                                throw ExceptionResultEnum.ERROR.exception("流程变量值错误");
+                            }
+                            map.computeIfAbsent(SystemConstant.APPROVE, v -> approve.getId());
+                        } 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);
+                            FlowApproveVariableEnum approve = null;
+                            tfFlowApproveLog.setSecondApproveId(sysUser.getId());
+                            tfFlowApproveLog.setSecondApproveRemark(remark);
+                            if (approvePass == FlowApprovePassEnum.PASS) {
+                                approve = FlowApproveVariableEnum.SECOND_APPROVE;
+                            } 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 ? FlowApproveVariableEnum.SECOND_REJECT_ONE : FlowApproveVariableEnum.SECOND_REJECT_TWO;
+                            }
+                            tfFlowLog.setApproveSetup(FlowGdykdxApproveSetupEnum.SECOND_APPROVE.getSetup());
+                            if (approve == FlowApproveVariableEnum.SECOND_REJECT_ONE) {//驳回命题
+                                tfFlowLog.setApproveOperation(FlowApproveOperationEnum.REJECT);
+                                tfFlowApproveLog.setSecondApproveOperation(FlowApproveOperationEnum.REJECT);
+                                tfFlowApprove.setStatus(FlowStatusEnum.REJECT);
+                                tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.SUBMIT.getSetup());
+                            } else if (approve == FlowApproveVariableEnum.SECOND_REJECT_TWO) {//驳回主任
+                                tfFlowLog.setApproveOperation(FlowApproveOperationEnum.REJECT);
+                                tfFlowApproveLog.setSecondApproveOperation(FlowApproveOperationEnum.REJECT);
+                                tfFlowApprove.setStatus(FlowStatusEnum.REJECT);
+                                tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.PRIMARY_APPROVE.getSetup());
+                            } else if (approve == FlowApproveVariableEnum.SECOND_APPROVE) {//提交
+                                tfFlowLog.setApproveOperation(FlowApproveOperationEnum.APPROVE);
+                                tfFlowApproveLog.setSecondApproveOperation(FlowApproveOperationEnum.APPROVE);
+                                tfFlowApprove.setStatus(FlowStatusEnum.FINISH);
+                                tfFlowApprove.setSetup(FlowGdykdxApproveSetupEnum.FINISH.getSetup());
+                            } else {
+                                throw ExceptionResultEnum.ERROR.exception("流程变量值错误");
+                            }
+                            FlowApproveVariableEnum finalApprove = approve;
+                            map.computeIfAbsent(SystemConstant.APPROVE, v -> finalApprove.getId());
                         }
-                        approve = setup.intValue() == 1 ? "0" : "1";
+                        tfFlowApprove.updateInfo(sysUser.getId());
+                        tfFlowApproveLog.updateInfo(sysUser.getId());
                     }
-                    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);
+                }
+                if (Objects.nonNull(tfFlowApproveLog)) {
+                    tfFlowApproveLogService.saveOrUpdate(tfFlowApproveLog);
+                }
+            } else {
+                throw ExceptionResultEnum.ERROR.exception("正在审批中,请稍候再试!");
+            }
+        } catch (Exception e) {
+            log.error("请求出错", e);
+            e.printStackTrace();
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {
+            if (Objects.nonNull(flowTaskId)) {
+                redisUtil.releaseLock(SystemConstant.REDIS_LOCK_FLOW_TASK_PREFIX + flowTaskId);
             }
         }
-        tfFlowApprove.setApproveId(sysUser.getId());
-        //当前实例的执行到哪个节点
-        taskService.complete(String.valueOf(flowTaskId), map);
-        tfFlowApproveService.saveOrUpdate(tfFlowApprove);
-        if (Objects.nonNull(tfFlowLog)) {
-            tfFlowLogService.save(tfFlowLog);
+    }
+
+    /**
+     * 获取所有流程节点
+     *
+     * @param flowId
+     * @return
+     */
+    @Override
+    public List<FlowTaskResult> getTaskAll(String flowId) {
+        String processDefinitionId = historyService.createHistoricProcessInstanceQuery().processInstanceId(flowId).singleResult().getProcessDefinitionId();
+        ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(processDefinitionId);
+        BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
+        Process process = bpmnModel.getProcessById(processDefinitionEntity.getKey());
+        Collection<FlowElement> flowElements = process.getFlowElements();
+        List<FlowTaskResult> flowTaskResultList = new ArrayList<>();
+        for (FlowElement flowElement : flowElements) {
+            //假设是任务节点
+            if (flowElement instanceof UserTask) {
+                UserTask userTask = (UserTask) flowElement;
+                if (Objects.nonNull(userTask)) {
+                    //广东医科大学流程
+                    if (Objects.nonNull(processDefinitionEntity) && processDefinitionEntity.getKey().contains(SystemConstant.GDYKDX_FLOW_KEY)) {
+                        FlowGdykdxApproveSetupEnum flowGdykdxApproveSetupEnum = FlowGdykdxApproveSetupEnum.convertToInstance(userTask.getId());
+                        flowTaskResultList.add(new FlowTaskResult(Long.parseLong(flowId), userTask.getName(), flowGdykdxApproveSetupEnum.getId(), flowGdykdxApproveSetupEnum.getSetup()));
+                    }
+                }
+            }
         }
+        return flowTaskResultList;
     }
 }

+ 147 - 55
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicStudentServiceImpl.java

@@ -6,8 +6,10 @@ 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.dto.excel.BasicStudentImportDto;
 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.BasicCampus;
 import com.qmth.distributed.print.business.entity.BasicStudent;
 import com.qmth.distributed.print.business.mapper.BasicStudentMapper;
 import com.qmth.distributed.print.business.service.BasicCampusService;
@@ -19,12 +21,11 @@ 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 org.springframework.util.LinkedMultiValueMap;
 
 import javax.annotation.Resource;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -66,57 +67,12 @@ public class BasicStudentServiceImpl extends ServiceImpl<BasicStudentMapper, Bas
 
     @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;
+    public Long saveBasicStudent(BasicStudentParams basicStudentParams,SysUser sysUser) {
+        List<BasicStudentParams> basicStudentParamsList = new ArrayList<>();
+        basicStudentParamsList.add(basicStudentParams);
+        BasicStudent basicStudent = this.editEntityHelp(basicStudentParamsList,sysUser).get(0);
+        this.saveOrUpdate(basicStudent);
+        return basicStudent.getId();
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -134,4 +90,140 @@ public class BasicStudentServiceImpl extends ServiceImpl<BasicStudentMapper, Bas
                 .in(BasicStudent::getId,idList);
         return this.update(updateWrapper);
     }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Map<String, Object> executeBasicStudentImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList, Map<String, Object> map) {
+        SysUser sysUser = (SysUser) map.get(SystemConstant.SYS_USER);
+        Long schoolId = sysUser.getSchoolId();
+
+        List<BasicStudentParams> addBasicStudentParamsList = new ArrayList<>();
+        for (int i = 0; i < finalList.size(); i++) {
+            LinkedMultiValueMap<Integer, Object> excelMap = finalList.get(i);
+            List<Object> basicStudentImportDtoList = excelMap.get(i);
+            List<BasicStudentImportDto> datasource = Collections.singletonList((BasicStudentImportDto) excelMap.get(i));
+            map.put("dataCount",datasource.size());
+            // TODO: 2021/7/16 校验datasource集合的正确性
+            System.out.println("datasource:\n" + datasource);
+
+            // 新校区名称集合
+            Set<String> newCampusNameSet = datasource.stream().map(BasicStudentImportDto::getCampusName).collect(Collectors.toSet());
+            // 旧校区集合
+            List<BasicCampus> basicCampusList = basicCampusService.list(new QueryWrapper<BasicCampus>().lambda().eq(BasicCampus::getEnable,true).eq(BasicCampus::getSchoolId,schoolId));
+            Set<String> oldCampusNameSet = basicCampusList.stream().map(BasicCampus::getCampusName).collect(Collectors.toSet());
+
+            // 需要新增的校区集合
+            Set<String> addCampusNameSet =  newCampusNameSet.stream().filter(e -> !oldCampusNameSet.contains(e)).collect(Collectors.toSet());
+            List<BasicCampus> addBasicCampusList = new ArrayList<>();
+            for (String campusName : addCampusNameSet) {
+                BasicCampus basicCampus = new BasicCampus();
+                Long id = SystemConstant.getDbUuid();
+                basicCampus.setSchoolId(schoolId);
+                basicCampus.setCampusName(campusName);
+                basicCampus.setId(id);
+                basicCampus.setCampusCode(String.valueOf(id));
+                basicCampus.setEnable(true);
+                basicCampus.setCreateId(sysUser.getId());
+                addBasicCampusList.add(basicCampus);
+            }
+            // 批量新增校区
+            basicCampusService.saveBatch(addBasicCampusList);
+
+            for (int y = 0; y < Objects.requireNonNull(basicStudentImportDtoList).size(); y++) {
+                BasicStudentImportDto basicStudentImportDto = (BasicStudentImportDto) basicStudentImportDtoList.get(y);
+
+                // 取值
+                String studentName = basicStudentImportDto.getStudentName();
+                String studentCode = basicStudentImportDto.getStudentCode();
+                String phoneNumber = basicStudentImportDto.getPhoneNumber();
+                String campusName = basicStudentImportDto.getCampusName();
+                String clazz = basicStudentImportDto.getClazz();
+
+
+                BasicStudentParams basicStudentParams = new BasicStudentParams();
+                basicStudentParams.setCampusId(basicCampusService.getOne(new QueryWrapper<BasicCampus>().lambda()
+                        .eq(BasicCampus::getSchoolId,schoolId)
+                        .eq(BasicCampus::getCampusName,campusName)
+                        .eq(BasicCampus::getEnable,true))
+                        .getId());
+                basicStudentParams.setStudentName(studentName);
+                basicStudentParams.setStudentCode(studentCode);
+                basicStudentParams.setPhoneNumber(phoneNumber);
+                basicStudentParams.setClazz(clazz);
+
+                BasicStudent tmp = this.getOne(new QueryWrapper<BasicStudent>().lambda()
+                        .eq(BasicStudent::getSchoolId,sysUser.getSchoolId())
+                        .eq(BasicStudent::getEnable,true)
+                        .eq(BasicStudent::getStudentCode,studentCode));
+                if (Objects.nonNull(tmp)){
+                    basicStudentParams.setId(tmp.getId());
+                }
+                addBasicStudentParamsList.add(basicStudentParams);
+            }
+
+            List<BasicStudent> basicStudentList = this.editEntityHelp(addBasicStudentParamsList,sysUser);
+            this.saveOrUpdateBatch(basicStudentList);
+        }
+
+        return map;
+    }
+
+    /**
+     * 学生保存助手方法(应对学生保存和导入批量保存)
+     * @param basicStudentParamsList 学生参数
+     * @param sysUser 操作人
+     * @return 结果
+     */
+    private List<BasicStudent> editEntityHelp(List<BasicStudentParams> basicStudentParamsList,SysUser sysUser){
+        Long schoolId = sysUser.getSchoolId();
+        List<BasicStudent> editEntityList = new ArrayList<>();
+        for (BasicStudentParams basicStudentParams : basicStudentParamsList) {
+            // 普通参数
+            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();
+            Long id = basicStudentParams.getId();
+
+            // 检验学号在学校的唯一性
+            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());
+            }else {
+                // id不为空 -> 更新
+                basicStudent.setId(id);
+                basicStudent.setUpdateId(sysUser.getId());
+            }
+            editEntityList.add(basicStudent);
+        }
+        return editEntityList;
+    }
 }

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

@@ -2,7 +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.bean.result.FlowApproveResult;
 import com.qmth.distributed.print.business.entity.TFFlow;
 import com.qmth.distributed.print.business.mapper.TFFlowMapper;
 import com.qmth.distributed.print.business.service.TFFlowService;
@@ -43,13 +43,13 @@ public class TFFlowServiceImpl extends ServiceImpl<TFFlowMapper, TFFlow> impleme
      * 流程审批记录列表
      *
      * @param iPage
-     * @param teacherName
+     * @param startName
      * @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);
+    public IPage<FlowApproveResult> flowApproveList(IPage<Map> iPage, String startName, Long schoolId, Long orgId) {
+        return tfFlowMapper.flowApproveList(iPage, startName, schoolId, orgId);
     }
 }

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

@@ -0,0 +1,72 @@
+package com.qmth.distributed.print.business.templete.execute;
+
+import cn.hutool.core.date.DateUtil;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.distributed.print.business.templete.importData.AsyncImportTaskTemplete;
+import com.qmth.distributed.print.business.templete.service.TaskLogicService;
+import com.qmth.teachcloud.common.contant.SpringContextHolder;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.TBTask;
+import com.qmth.teachcloud.common.enums.TaskResultEnum;
+import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import com.qmth.teachcloud.common.service.TBTaskService;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.Map;
+import java.util.StringJoiner;
+
+/**
+ * @Description: 异步-课程基础信息导入
+ * @Author: CaoZixuan
+ * @Date: 2021-08-06
+ */
+@Service
+public class AsyncCourseDataImportService extends AsyncImportTaskTemplete {
+    private final static Logger log = LoggerFactory.getLogger(AsyncCourseDataImportService.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.executeImportBasicCourseLogic(map);
+
+
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), FINISH_TITLE, Long.valueOf(String.valueOf(result.get("dataCount"))), FINISH_SIZE));
+            tbTask.setResult(TaskResultEnum.SUCCESS);
+        }catch (Exception e){
+            log.error("请求出错", e);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), EXCEPTION_TITLE, EXCEPTION_DATA, e.getMessage()));
+            tbTask.setResult(TaskResultEnum.ERROR);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {//生成txt文件
+            tbTask.setSummary(stringJoinerSummary.toString());
+            super.createTxt(tbTask);
+        }
+        return ResultUtil.ok(map);
+    }
+}

+ 15 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncStudentDataImportService.java

@@ -1,6 +1,7 @@
 package com.qmth.distributed.print.business.templete.execute;
 
 import cn.hutool.core.date.DateUtil;
+import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.templete.importData.AsyncImportTaskTemplete;
 import com.qmth.distributed.print.business.templete.service.TaskLogicService;
 import com.qmth.teachcloud.common.contant.SpringContextHolder;
@@ -12,6 +13,7 @@ import com.qmth.teachcloud.common.enums.TaskResultEnum;
 import com.qmth.teachcloud.common.enums.TaskStatusEnum;
 import com.qmth.teachcloud.common.service.TBTaskService;
 import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -33,7 +35,7 @@ public class AsyncStudentDataImportService extends AsyncImportTaskTemplete {
 
     public static final String OBJ_TITLE = "学生基础数据";
     @Override
-    public Result importTask(Map<String, Object> map) throws IOException, Exception {
+    public Result importTask(Map<String, Object> map) throws Exception {
         TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
         InputStream inputStream = super.getUploadFileInputStream(tbTask);
         map.put("inputStream",inputStream);
@@ -53,8 +55,18 @@ public class AsyncStudentDataImportService extends AsyncImportTaskTemplete {
             stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), FINISH_TITLE, Long.valueOf(String.valueOf(result.get("dataCount"))), FINISH_SIZE));
             tbTask.setResult(TaskResultEnum.SUCCESS);
         }catch (Exception e){
-
+            log.error("请求出错", e);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), EXCEPTION_TITLE, EXCEPTION_DATA, e.getMessage()));
+            tbTask.setResult(TaskResultEnum.ERROR);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {//生成txt文件
+            tbTask.setSummary(stringJoinerSummary.toString());
+            super.createTxt(tbTask);
         }
-        return null;
+        return ResultUtil.ok(map);
     }
 }

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

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

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

@@ -12,6 +12,7 @@ import com.google.common.collect.Lists;
 import com.itextpdf.text.DocumentException;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.dto.*;
+import com.qmth.teachcloud.common.bean.dto.excel.BasicCourseImportDto;
 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;
@@ -146,6 +147,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
     @Autowired
     ExamTaskPrintService examTaskPrintService;
 
+
     /**
      * 创建pdf前置条件
      *
@@ -1196,7 +1198,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
 
                     // 检验excel中
                     if (checkMap.containsKey(studentCode)){
-                        throw ExceptionResultEnum.ERROR.exception("导入的excel中包含在重复的【课程编号】:" + studentCode);
+                        throw ExceptionResultEnum.ERROR.exception("导入的excel中包含在重复的【学生编号】:" + studentCode);
                     }else {
                         checkMap.put(studentCode,studentName);
                     }
@@ -1215,9 +1217,51 @@ public class TaskLogicServiceImpl implements TaskLogicService {
             }
             return finalExcelList;
         });
-        return null;
+        return basicStudentService.executeBasicStudentImportLogic(finalList,map);
     }
 
+    @Transactional
+    @Override
+    public Map<String, Object> executeImportBasicCourseLogic(Map<String, Object> map) throws Exception {
+        MultipartFile file = (MultipartFile) map.get(SystemConstant.FILE);
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(BasicCourseImportDto.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> basicCourseImportDtoList = excelMap.get(i);
+                for (int y = 0; y < Objects.requireNonNull(basicCourseImportDtoList).size(); y++) {
+                    BasicCourseImportDto basicCourseImportDto = (BasicCourseImportDto) basicCourseImportDtoList.get(y);
+                    String courseName = basicCourseImportDto.getCourseName();
+                    String courseCode = basicCourseImportDto.getCourseCode();
+                    String teachingRoomName = basicCourseImportDto.getTeachingRoomName();
+                    String clazz = basicCourseImportDto.getClazz();
+
+                    // 检验excel中
+                    if (checkMap.containsKey(courseCode)){
+                        throw ExceptionResultEnum.ERROR.exception("导入的excel中包含在重复的【课程编号】:" + courseCode);
+                    }else {
+                        checkMap.put(courseCode,courseName);
+                    }
+
+                    excelErrorTemp.addAll(ExcelUtil.checkExcelField(basicCourseImportDto, y, i));
+                    if (Objects.isNull(courseCode) || courseCode.length() > 30 || !courseCode.matches(SystemConstant.REGULAR_EXPRESSION_OF_CODE)){
+                        excelErrorTemp.add(new ExcelError(y + 1,"excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[课程编号]不符合输入规范"));
+                    }
+                    if (Objects.isNull(courseName) || courseName.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 basicCourseService.executeBasicCourseImportLogic(finalList,map);
+    }
+
+
     public String createTempNumber(SerialNumberParams serialNumberParams){
         return convertUtil.getIncre(serialNumberParams.getPrefix(), serialNumberParams.getModel(), serialNumberParams.getDigit());
     }

+ 0 - 25
distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml

@@ -664,31 +664,6 @@
     </sql>
 
     <select id="getFlowTaskReadyList" resultType="com.qmth.distributed.print.business.bean.result.WorkResult">
-        /*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,

+ 44 - 2
distributed-print-business/src/main/resources/mapper/TFFlowMapper.xml

@@ -17,7 +17,49 @@
         </where>
     </select>
 
-    <select id="taskApproveList" resultType="com.qmth.distributed.print.business.bean.result.TaskApproveResult">
-
+    <select id="flowApproveList" resultType="com.qmth.distributed.print.business.bean.result.FlowApproveResult">
+        select
+            tffal.flow_id as flowId,
+            tffal.task_id as taskId,
+            tffal.start_id as startId,
+            su.real_name as startName,
+            tffal.create_time as createTime,
+            tffal.primary_approve_id as primaryApproveId,
+            (
+            select
+                t.real_name
+            from
+                sys_user t
+            where
+                t.id = tffal.primary_approve_id) as primaryApproveName,
+            tffal.primary_approve_remark as primaryApproveRemark,
+            tffal.second_approve_id as secondApproveId,
+            (
+            select
+                t.real_name
+            from
+                sys_user t
+            where
+                t.id = tffal.second_approve_id) as secondApproveName,
+            tffal.second_approve_remark as secondApproveRemark,
+            tffa.status
+        from
+            t_f_flow_approve_log tffal
+        left join t_f_flow_approve tffa on tffa.flow_id = tffal.flow_id
+        left join sys_user su on su.id = tffal.start_id
+        <where>
+            <if test="startName != null and startName != ''">
+                and su.real_name like concat('%',#{startName},'%')
+            </if>
+            <if test="schoolId != null and schoolId != ''">
+                and tffal.school_id = #{schoolId}
+            </if>
+            <if test="orgId != null and orgId != ''">
+                and tffal.org_id = #{orgId}
+            </if>
+            and tffal.enable = 1
+        </where>
+        order by
+            tffal.create_time desc
     </select>
 </mapper>

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

@@ -2,26 +2,29 @@ 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.distributed.print.business.templete.execute.AsyncCourseDataImportService;
 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.entity.TBTask;
+import com.qmth.teachcloud.common.enums.TaskTypeEnum;
 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.*;
-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 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>
@@ -40,6 +43,8 @@ public class BasicCourseController {
     private PrintCommonService printCommonService;
     @Resource
     private BasicCourseService basicCourseService;
+    @Resource
+    private AsyncCourseDataImportService asyncCourseDataImportService;
 
     /**
      * 查询
@@ -122,7 +127,8 @@ public class BasicCourseController {
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
-        return ResultUtil.ok(basicCourseService.saveBasicCourse(basicCourseParams));
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        return ResultUtil.ok(basicCourseService.saveBasicCourse(basicCourseParams,sysUser));
     }
 
     @ApiOperation(value = "课程管理-批量删除(逻辑)")
@@ -132,6 +138,17 @@ public class BasicCourseController {
         return ResultUtil.ok(basicCourseService.removeBasicCourseBatch(idList));
     }
 
+    @ApiOperation(value = "课程基本信息管理-批量导入(异步)")
+    @RequestMapping(value = "/data_import", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
+    public Result basicCourseImportAysnc(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file) throws Exception {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        Map<String, Object> map = printCommonService.saveTask(file, TaskTypeEnum.COURSE_IMPORT);
+        map.put(SystemConstant.SYS_USER,sysUser);
 
+        asyncCourseDataImportService.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("创建任务失败");
+    }
 }
 

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

@@ -10,6 +10,7 @@ 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.SysUser;
 import com.qmth.teachcloud.common.entity.TBTask;
 import com.qmth.teachcloud.common.enums.TaskTypeEnum;
 import com.qmth.teachcloud.common.util.Result;
@@ -62,7 +63,8 @@ public class BasicStudentController {
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
-        return ResultUtil.ok(basicStudentService.saveBasicStudent(basicStudentParams));
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        return ResultUtil.ok(basicStudentService.saveBasicStudent(basicStudentParams,sysUser));
     }
 
     @ApiOperation(value = "学生基本信息管理-批量删除(逻辑)")
@@ -75,8 +77,11 @@ public class BasicStudentController {
     @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 {
+    public Result basicStudentImportAysnc(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file) throws Exception {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         Map<String, Object> map = printCommonService.saveTask(file, TaskTypeEnum.STUDENT_IMPORT);
+        map.put(SystemConstant.SYS_USER,sysUser);
+
         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("创建任务失败");

+ 0 - 19
distributed-print/src/main/java/com/qmth/distributed/print/api/TBDepartmentController.java

@@ -1,19 +0,0 @@
-package com.qmth.distributed.print.api;
-
-
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * <p>
- * 部门设置表 前端控制器
- * </p>
- *
- * @author wangliang
- * @since 2021-07-29
- */
-@RestController
-@RequestMapping("/t-bdepartment")
-public class TBDepartmentController {
-
-}

+ 0 - 19
distributed-print/src/main/java/com/qmth/distributed/print/api/TFFlowApproveController.java

@@ -1,19 +0,0 @@
-package com.qmth.distributed.print.api;
-
-
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * <p>
- * 流程审核表 前端控制器
- * </p>
- *
- * @author wangliang
- * @since 2021-08-02
- */
-@RestController
-@RequestMapping("/t-fflow-approve")
-public class TFFlowApproveController {
-
-}

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

@@ -6,11 +6,14 @@ 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.params.FlowApproveParam;
 import com.qmth.distributed.print.business.bean.result.EditResult;
-import com.qmth.distributed.print.business.bean.result.TaskApproveResult;
+import com.qmth.distributed.print.business.bean.result.FlowApproveResult;
 import com.qmth.distributed.print.business.entity.TFFlow;
+import com.qmth.distributed.print.business.entity.TFFlowApproveLog;
 import com.qmth.distributed.print.business.service.ActivitiService;
 import com.qmth.distributed.print.business.service.PrintCommonService;
+import com.qmth.distributed.print.business.service.TFFlowApproveLogService;
 import com.qmth.distributed.print.business.service.TFFlowService;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicAttachment;
@@ -28,13 +31,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.transaction.annotation.Transactional;
-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.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.HashMap;
 import java.util.Map;
 import java.util.Objects;
@@ -66,9 +68,12 @@ public class TFFlowController {
     @Resource
     TFFlowService tfFlowService;
 
+    @Resource
+    TFFlowApproveLogService tfFlowApproveLogService;
+
     @ApiOperation(value = "注册流程")
     @Transactional
-    @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = ResultUtil.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "常规信息", response = ResultUtil.class)})
     @RequestMapping(value = "/register", method = RequestMethod.POST)
     public Result register(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
                            @ApiParam(value = "上传文件类型", required = true) @RequestParam UploadFileEnum type,
@@ -109,7 +114,7 @@ public class TFFlowController {
     }
 
     @ApiOperation(value = "发布流程")
-    @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = ResultUtil.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "常规信息", response = ResultUtil.class)})
     @RequestMapping(value = "/publish", method = RequestMethod.POST)
     public Result publish(@ApiParam(value = "流程文件id", required = true) @RequestParam String id) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
@@ -122,7 +127,7 @@ public class TFFlowController {
     }
 
     @ApiOperation(value = "流程列表")
-    @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = TFFlow.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "流程信息", response = TFFlow.class)})
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     public Result list(@ApiParam(value = "流程名称", required = false) @RequestParam(required = false) String name,
                        @ApiParam(value = "页码", required = true) @RequestParam Integer pageNumber,
@@ -132,12 +137,12 @@ public class TFFlowController {
     }
 
     @ApiOperation(value = "审批流程")
-    @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = ResultUtil.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "常规信息", response = ResultUtil.class)})
     @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) {
+    public Result taskApprove(@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.FLOW_TASK_ID, v -> taskId);
         map.computeIfAbsent(SystemConstant.APPROVE_OPERATION, v -> approvePass);
@@ -148,12 +153,46 @@ public class TFFlowController {
     }
 
     @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,
+    @ApiResponses({@ApiResponse(code = 200, message = "流程审批记录信息", response = FlowApproveResult.class)})
+    @RequestMapping(value = "/approve/list", method = RequestMethod.POST)
+    public Result taskApproveList(@ApiParam(value = "发起人名称", required = false) @RequestParam(required = false) String startName,
                                   @ApiParam(value = "页码", required = true) @RequestParam Integer pageNumber,
                                   @ApiParam(value = "数量", required = true) @RequestParam Integer pageSize) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        return ResultUtil.ok(tfFlowService.taskApproveList(new Page<>(pageNumber, pageSize), teacherName, SystemConstant.getHeadOrUserSchoolId(), sysUser.getOrgId()));
+        return ResultUtil.ok(tfFlowService.flowApproveList(new Page<>(pageNumber, pageSize), startName, SystemConstant.getHeadOrUserSchoolId(), sysUser.getOrgId()));
+    }
+
+    /**
+     * 流程审批记录启用/禁用
+     *
+     * @param flowApproveParam
+     * @return
+     */
+    @ApiOperation(value = "流程审批记录启用/禁用")
+    @ApiResponses({@ApiResponse(code = 200, message = "常规信息", response = ResultUtil.class)})
+    @RequestMapping(value = "/approve/enable", method = RequestMethod.POST)
+    public Result enable(@Valid @RequestBody FlowApproveParam flowApproveParam, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        UpdateWrapper<TFFlowApproveLog> tfFlowApproveLogUpdateWrapper = new UpdateWrapper<>();
+        tfFlowApproveLogUpdateWrapper.lambda().eq(TFFlowApproveLog::getFlowId, flowApproveParam.getFlowId())
+                .set(TFFlowApproveLog::getEnable, flowApproveParam.getEnable());
+        return ResultUtil.ok(tfFlowApproveLogService.update(tfFlowApproveLogUpdateWrapper));
+    }
+
+    @ApiOperation(value = "流程终止")
+    @ApiResponses({@ApiResponse(code = 200, message = "常规信息", response = ResultUtil.class)})
+    @RequestMapping(value = "/end", method = RequestMethod.POST)
+    public Result end(@ApiParam(value = "流程id", required = true) @RequestParam String flowId) {
+        activitiService.flowEnd(flowId);
+        return ResultUtil.ok();
+    }
+
+    @ApiOperation(value = "获取所有流程节点")
+    @ApiResponses({@ApiResponse(code = 200, message = "常规信息", response = ResultUtil.class)})
+    @RequestMapping(value = "/task/all", method = RequestMethod.POST)
+    public Result taskAll(@ApiParam(value = "流程id", required = true) @RequestParam String flowId) {
+        return ResultUtil.ok(activitiService.getTaskAll(flowId));
     }
 }

+ 0 - 19
distributed-print/src/main/java/com/qmth/distributed/print/api/TFFlowLogController.java

@@ -1,19 +0,0 @@
-package com.qmth.distributed.print.api;
-
-
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * <p>
- * 流程流水表 前端控制器
- * </p>
- *
- * @author wangliang
- * @since 2021-08-02
- */
-@RestController
-@RequestMapping("/t-fflow-log")
-public class TFFlowLogController {
-
-}

+ 60 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/BasicCourseImportDto.java

@@ -0,0 +1,60 @@
+package com.qmth.teachcloud.common.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 基础课程数据导入类
+ * @Author: CaoZixuan
+ * @Date: 2021-08-06
+ */
+public class BasicCourseImportDto {
+    @ExcelNote(value = "课程名称")
+    @NotNull
+    private String courseName;
+
+    @ExcelNote(value = "课程编码")
+    @NotNull
+    private String courseCode;
+
+    @ExcelNote(value = "所属教研室")
+    @NotNull
+    private String teachingRoomName;
+
+    @ExcelNote(value = "授课班级")
+    @NotNull
+    private String clazz;
+
+    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 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;
+    }
+}

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

@@ -74,8 +74,10 @@ public class SystemConstant {
     public static final String SCHOOL_CODE = "wdfx";
     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 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+)?";
+    public static final String SYS_USER = "sysUser";
 
     /**
      * oss url过期时间
@@ -193,6 +195,8 @@ public class SystemConstant {
     public static final String APPROVE_OPERATION = "approveOperation";//流程节点
     public static final String FLOW_STATUS = "flowStatus";//流程状态
     public static final String APPROVE_REMARK = "approveRemark";//流程审批意见
+    public static final String REDIS_LOCK_FLOW_TASK_PREFIX = "redis:lock:flow:task";//流程节点锁
+    public static final long REDIS_LOCK_FLOW_TASK_TIME_OUT = 60L * 2;
 
     /**
      * 初始化附件文件路径

+ 70 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FlowApproveVariableEnum.java

@@ -0,0 +1,70 @@
+package com.qmth.teachcloud.common.enums;
+
+import java.util.Objects;
+
+/**
+ * @Description: 流程审批变量 enum
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/8/2
+ */
+public enum FlowApproveVariableEnum {
+
+    PRIMARY_APPROVE("一级审核通过", "1"),
+
+    PRIMARY_REJECT("一级审核驳回", "0"),
+
+    SECOND_APPROVE("二级审核通过", "2"),
+
+    SECOND_REJECT_ONE("二级审核驳回至第一节点", "0"),
+
+    SECOND_REJECT_TWO("二级审核驳回至第二节点", "1");
+
+    private String title;
+
+    private String id;
+
+    private FlowApproveVariableEnum(String title, String id) {
+        this.title = title;
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param title
+     * @return
+     */
+    public static String convertToName(String title) {
+        for (FlowApproveVariableEnum e : FlowApproveVariableEnum.values()) {
+            if (Objects.equals(title, e.getTitle())) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 状态转换 toInstance
+     *
+     * @param id
+     * @return
+     */
+    public static FlowApproveVariableEnum convertToInstance(String id) {
+        for (FlowApproveVariableEnum e : FlowApproveVariableEnum.values()) {
+            if (Objects.equals(id, e.getTitle())) {
+                return e;
+            }
+        }
+        return null;
+    }
+}

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

@@ -17,7 +17,9 @@ public enum FlowGdykdxApproveSetupEnum {
 
     SECOND_APPROVE("二级审核", "usertask3", 3),
 
-    END("已结束或已终止", null, -1);
+    END("已终止", null, -1),
+
+    FINISH("已结束", null, 0);
 
     private String title;
 

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

@@ -6,8 +6,11 @@ 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 com.qmth.teachcloud.common.entity.SysUser;
+import org.springframework.util.LinkedMultiValueMap;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -66,7 +69,7 @@ public interface BasicCourseService extends IService<BasicCourse> {
      * @param basicCourseParams 基础课程信息参数
      * @return 新增或编辑的课程id
      */
-    Long saveBasicCourse(BasicCourseParams basicCourseParams);
+    Long saveBasicCourse(BasicCourseParams basicCourseParams, SysUser sysUser);
 
     /**
      * 批量删除课程基本信息(逻辑)
@@ -74,4 +77,13 @@ public interface BasicCourseService extends IService<BasicCourse> {
      * @return 是否删除成功
      */
     Boolean removeBasicCourseBatch(List<Long> idList);
+
+    /**
+     * 执行批量导入课程逻辑
+     *
+     * @param finalList 基础课程数据集合
+     * @param map       参数
+     * @return 结果
+     */
+    Map<String, Object> executeBasicCourseImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList, Map<String, Object> map);
 }

+ 117 - 63
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicCourseServiceImpl.java

@@ -6,6 +6,7 @@ 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.dto.excel.BasicCourseImportDto;
 import com.qmth.teachcloud.common.bean.params.BasicCourseParams;
 import com.qmth.teachcloud.common.bean.result.BasicCourseResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -13,7 +14,6 @@ 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;
@@ -21,15 +21,12 @@ 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;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.LinkedMultiValueMap;
 
 import javax.annotation.Resource;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 
 /**
  * <p>
@@ -126,63 +123,12 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
 
     @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;
+    public Long saveBasicCourse(BasicCourseParams basicCourseParams,SysUser sysUser) {
+        List<BasicCourseParams> basicCourseParamsList = new ArrayList<>();
+        basicCourseParamsList.add(basicCourseParams);
+        BasicCourse editBasicCourse = this.editEntityHelp(basicCourseParamsList,sysUser).get(0);
+        this.saveOrUpdate(editBasicCourse);
+        return editBasicCourse.getId();
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -202,4 +148,112 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
 
         return this.update(updateWrapper);
     }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Map<String, Object> executeBasicCourseImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList, Map<String, Object> map) {
+        // 班级分割标志
+        final String clazzSplit = ",";
+
+        SysUser sysUser = (SysUser) map.get(SystemConstant.SYS_USER);
+        Long schoolId = sysUser.getSchoolId();
+        List<BasicCourseParams> addBasicCourseParamsList = new ArrayList<>();
+
+        for (int i = 0; i < finalList.size(); i++) {
+            LinkedMultiValueMap<Integer, Object> excelMap = finalList.get(i);
+            List<Object> basicCourseImportDtoList = excelMap.get(i);
+            List<BasicCourseImportDto> datasource = Collections.singletonList((BasicCourseImportDto) excelMap.get(i));
+            // TODO: 2021/7/16 校验datasource集合的正确性
+            map.put("dataCount", datasource.size());
+            System.out.println("datasource:\n" + datasource);
+
+            for (int y = 0; y < Objects.requireNonNull(basicCourseImportDtoList).size(); y++) {
+                BasicCourseImportDto basicCourseImportDto = (BasicCourseImportDto) basicCourseImportDtoList.get(y);
+                String courseName = basicCourseImportDto.getCourseName();
+                String courseCode = basicCourseImportDto.getCourseCode();
+                String teachingRoomName = basicCourseImportDto.getTeachingRoomName();
+                String clazz = basicCourseImportDto.getClazz();
+
+                SysOrg sysOrg = sysOrgService.getOne(new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getSchoolId, schoolId).eq(SysOrg::getEnable, true).eq(SysOrg::getType, OrgTypeEnum.TEACHING_ROOM));
+                if (Objects.isNull(sysOrg)) {
+                    throw ExceptionResultEnum.ERROR.exception("输入的教研室【" + teachingRoomName + "】不存在");
+                }
+                Long teachingRoomId = sysOrg.getId();
+                List<String> clazzList = Arrays.asList(clazz.split(clazzSplit));
+                BasicCourseParams basicCourseParams = new BasicCourseParams();
+                basicCourseParams.setCourseCode(courseCode);
+                basicCourseParams.setCourseName(courseName);
+                basicCourseParams.setTeachingRoomId(teachingRoomId);
+                basicCourseParams.setClazzList(clazzList);
+                BasicCourse old = this.getOne(new QueryWrapper<BasicCourse>().lambda().eq(BasicCourse::getSchoolId,schoolId).eq(BasicCourse::getEnable,true).eq(BasicCourse::getCode,courseCode));
+                if (Objects.nonNull(old)){
+                    basicCourseParams.setId(old.getId());
+                }
+
+                addBasicCourseParamsList.add(basicCourseParams);
+            }
+            List<BasicCourse> editBasicCourse = this.editEntityHelp(addBasicCourseParamsList,sysUser);
+            this.saveOrUpdateBatch(editBasicCourse);
+        }
+        return map;
+    }
+
+    private List<BasicCourse> editEntityHelp(List<BasicCourseParams> basicCourseParamsList,SysUser sysUser){
+        Long schoolId = sysUser.getSchoolId();
+        List<BasicCourse> basicCourseList = new ArrayList<>();
+        for (BasicCourseParams basicCourseParams : basicCourseParamsList) {
+            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);
+
+            basicCourseList.add(basicCourse);
+        }
+        return basicCourseList;
+    }
 }