瀏覽代碼

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

xiaof 3 年之前
父節點
當前提交
1e6ba6da56
共有 22 個文件被更改,包括 554 次插入236 次删除
  1. 15 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/custom/listener/ProcessEventListener.java
  2. 22 11
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskDetailCardDto.java
  3. 18 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowVarDto.java
  4. 27 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/FlowTaskResult.java
  5. 2 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ActivitiService.java
  6. 182 46
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ActivitiServiceImpl.java
  7. 12 7
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  8. 2 1
      distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml
  9. 0 69
      distributed-print/src/main/java/com/qmth/distributed/print/api/SysRoleGroupMemberController.java
  10. 6 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/TFCustomFlowController.java
  11. 55 58
      teachcloud-common-api/src/main/java/com/qmth/teachcloud/common/api/api/SysRoleGroupMemberController.java
  12. 27 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/ApproveUserResult.java
  13. 13 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/SysRoleGroupMemberMatch.java
  14. 0 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/SysRoleGroupMemberParams.java
  15. 18 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/SysRoleGroupMemberMatchResult.java
  16. 1 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FieldUniqueEnum.java
  17. 9 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/SysUserMapper.java
  18. 11 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysRoleGroupMemberService.java
  19. 9 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysUserService.java
  20. 86 23
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysRoleGroupMemberServiceImpl.java
  21. 12 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysUserServiceImpl.java
  22. 27 0
      teachcloud-common/src/main/resources/mapper/SysUserMapper.xml

+ 15 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/custom/listener/ProcessEventListener.java

@@ -103,10 +103,10 @@ public class ProcessEventListener implements ActivitiEventListener, Serializable
 //                // 一个节点将要被补偿。事件包含了将要执行补偿的节点id。
 //                log.info("ACTIVITY_COMPENSATE:ProcessInstanceId:{},ExecutionId:{},ProcessDefinitionId:{}", event.getProcessInstanceId(), event.getExecutionId(), event.getProcessDefinitionId());
 //                break;
-            case ACTIVITY_COMPLETED:
-                // 一个节点成功结束
-                log.info("流程节点完成_ACTIVITY_COMPLETED:ProcessInstanceId:{},ExecutionId:{},ProcessDefinitionId:{}", event.getProcessInstanceId(), event.getExecutionId(), event.getProcessDefinitionId());
-                break;
+//            case ACTIVITY_COMPLETED:
+//                // 一个节点成功结束
+//                log.info("流程节点完成_ACTIVITY_COMPLETED:ProcessInstanceId:{},ExecutionId:{},ProcessDefinitionId:{}", event.getProcessInstanceId(), event.getExecutionId(), event.getProcessDefinitionId());
+//                break;
 //            case ACTIVITY_ERROR_RECEIVED:
 //                // 一个节点收到了一个错误事件。在节点实际处理错误之前触发。 事件的activityId对应着处理错误的节点。 这个事件后续会是ACTIVITY_SIGNALLED或ACTIVITY_COMPLETE, 如果错误发送成功的话。
 //                log.info("ACTIVITY_ERROR_RECEIVED:ProcessInstanceId:{},ExecutionId:{},ProcessDefinitionId:{}", event.getProcessInstanceId(), event.getExecutionId(), event.getProcessDefinitionId());
@@ -221,8 +221,17 @@ public class ProcessEventListener implements ActivitiEventListener, Serializable
 
                             if (Objects.nonNull(nextApproverPeopleList) && (tfFlowLog.getApproveOperation() == FlowApproveOperationEnum.APPROVE
                                     || tfFlowLog.getApproveOperation() == FlowApproveOperationEnum.EXCHANGE)) {
-                                if (Objects.nonNull(o) && o instanceof ExamTask) {
-                                    basicMessageService.sendNoticeTaskAuditFlow((ExamTask) o, nextApproverPeopleList, MessageEnum.NOTICE_OF_AUDIT_CREATED);
+                                //如果不是并行会签,则每个节点都发
+                                if (Objects.nonNull(tfFlowLog.getApproveUserApproveType()) && tfFlowLog.getApproveUserApproveType() != CustomFlowMultipleUserApproveTypeEnum.ALL) {
+                                    if (Objects.nonNull(o) && o instanceof ExamTask) {
+                                        basicMessageService.sendNoticeTaskAuditFlow((ExamTask) o, nextApproverPeopleList, MessageEnum.NOTICE_OF_AUDIT_CREATED);
+                                    }
+                                } else {
+                                    if (Objects.isNull(tfFlowLog.getApproveMultiSetup()) || tfFlowLog.getApproveMultiSetup().intValue() == 0) {
+                                        if (Objects.nonNull(o) && o instanceof ExamTask) {
+                                            basicMessageService.sendNoticeTaskAuditFlow((ExamTask) o, nextApproverPeopleList, MessageEnum.NOTICE_OF_AUDIT_CREATED);
+                                        }
+                                    }
                                 }
                             } else if (Objects.nonNull(nextApproverPeopleList) && (tfFlowLog.getApproveOperation() == FlowApproveOperationEnum.REJECT
                                     || tfFlowLog.getApproveOperation() == FlowApproveOperationEnum.CANCEL)) {

+ 22 - 11
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskDetailCardDto.java

@@ -1,8 +1,8 @@
 package com.qmth.distributed.print.business.bean.dto;
 
-import io.swagger.annotations.ApiModelProperty;
+import com.qmth.teachcloud.common.enums.FlowStatusEnum;
 
-import java.util.List;
+import java.util.Objects;
 
 /**
  * @Date: 2021/3/31.
@@ -30,17 +30,28 @@ public class ExamTaskDetailCardDto {
     private String examModel;
     private String examName;
     private String semesterName;
+    private FlowStatusEnum flowStatus;
+    private String flowStatusStr;
 
-//    @ApiModelProperty(value = "是否是子流程驳回")
-//    private boolean subFlowReject;
+    public FlowStatusEnum getFlowStatus() {
+        return flowStatus;
+    }
+
+    public void setFlowStatus(FlowStatusEnum flowStatus) {
+        this.flowStatus = flowStatus;
+    }
 
-//    public boolean isSubFlowReject() {
-//        return subFlowReject;
-//    }
-//
-//    public void setSubFlowReject(boolean subFlowReject) {
-//        this.subFlowReject = subFlowReject;
-//    }
+    public String getFlowStatusStr() {
+        if (Objects.nonNull(flowStatus)) {
+            return flowStatus.getTitle();
+        } else {
+            return flowStatusStr;
+        }
+    }
+
+    public void setFlowStatusStr(String flowStatusStr) {
+        this.flowStatusStr = flowStatusStr;
+    }
 
     public String getExamTaskId() {
         return examTaskId;

+ 18 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowVarDto.java

@@ -45,6 +45,9 @@ public class CustomFlowVarDto implements Serializable {
     @ApiModelProperty(value = "抄送人姓名")
     String copyForUserNames;
 
+    @ApiModelProperty(value = "审批角色ids")
+    List<String> approveRoleIds;
+
     public CustomFlowVarDto() {
 
     }
@@ -53,19 +56,21 @@ public class CustomFlowVarDto implements Serializable {
         this.flowTaskVar = flowTaskVar;
     }
 
-    public CustomFlowVarDto(String flowTaskVar, List<String> approveIds, List<String> copyForUserIds, String copyForUserNames) {
+    public CustomFlowVarDto(String flowTaskVar, List<String> approveIds, List<String> copyForUserIds, String copyForUserNames, List<String> approveRoleIds) {
         this.flowTaskVar = flowTaskVar;
         this.approveIds = approveIds;
         this.copyForUserIds = copyForUserIds;
         this.copyForUserNames = copyForUserNames;
+        this.approveRoleIds = approveRoleIds;
     }
 
-    public CustomFlowVarDto(String flowTaskVar, List<String> approveIds, String approveUserNames, List<String> copyForUserIds, String copyForUserNames) {
+    public CustomFlowVarDto(String flowTaskVar, List<String> approveIds, String approveUserNames, List<String> copyForUserIds, String copyForUserNames, List<String> approveRoleIds) {
         this.flowTaskVar = flowTaskVar;
         this.approveIds = approveIds;
         this.approveUserNames = approveUserNames;
         this.copyForUserIds = copyForUserIds;
         this.copyForUserNames = copyForUserNames;
+        this.approveRoleIds = approveRoleIds;
     }
 
     public CustomFlowVarDto(String flowTaskVar, List<String> approveIds,
@@ -75,7 +80,8 @@ public class CustomFlowVarDto implements Serializable {
                             CustomFlowRejectResubmitTypeEnum rejectResubmitType,
                             String approveUserNames,
                             List<String> copyForUserIds,
-                            String copyForUserNames) {
+                            String copyForUserNames,
+                            List<String> approveRoleIds) {
         this.flowTaskVar = flowTaskVar;
         this.approveIds = approveIds;
         this.approveUserType = approveUserType;
@@ -85,6 +91,15 @@ public class CustomFlowVarDto implements Serializable {
         this.approveUserNames = approveUserNames;
         this.copyForUserIds = copyForUserIds;
         this.copyForUserNames = copyForUserNames;
+        this.approveRoleIds = approveRoleIds;
+    }
+
+    public List<String> getApproveRoleIds() {
+        return approveRoleIds;
+    }
+
+    public void setApproveRoleIds(List<String> approveRoleIds) {
+        this.approveRoleIds = approveRoleIds;
     }
 
     public List<String> getCopyForUserIds() {

+ 27 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/FlowTaskResult.java

@@ -2,9 +2,11 @@ package com.qmth.distributed.print.business.bean.result;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.enums.CustomFlowApproveUserTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * @Description: 流程节点result
@@ -31,6 +33,12 @@ public class FlowTaskResult implements Serializable {
     @ApiModelProperty(value = "审批人")
     String approveUserNames;
 
+    @ApiModelProperty(value = "审批角色ids")
+    List<String> approveRoleIds;
+
+    @ApiModelProperty(value = "属性")
+    CustomFlowApproveUserTypeEnum approveUserType;
+
     public FlowTaskResult() {
 
     }
@@ -41,11 +49,29 @@ public class FlowTaskResult implements Serializable {
         this.setup = setup;
     }
 
-    public FlowTaskResult(Long flowId, String taskName, String taskKey, Integer setup) {
+    public FlowTaskResult(Long flowId, String taskName, String taskKey, Integer setup, List<String> approveRoleIds, CustomFlowApproveUserTypeEnum approveUserType) {
         this.flowId = flowId;
         this.taskName = taskName;
         this.taskKey = taskKey;
         this.setup = setup;
+        this.approveRoleIds = approveRoleIds;
+        this.approveUserType = approveUserType;
+    }
+
+    public List<String> getApproveRoleIds() {
+        return approveRoleIds;
+    }
+
+    public void setApproveRoleIds(List<String> approveRoleIds) {
+        this.approveRoleIds = approveRoleIds;
+    }
+
+    public CustomFlowApproveUserTypeEnum getApproveUserType() {
+        return approveUserType;
+    }
+
+    public void setApproveUserType(CustomFlowApproveUserTypeEnum approveUserType) {
+        this.approveUserType = approveUserType;
     }
 
     public String getApproveUserNames() {

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

@@ -97,7 +97,8 @@ public interface ActivitiService {
      * 根据流程类型获取流程节点
      *
      * @param type
+     * @param flowId
      * @return
      */
-    public FlowInfoResult getFlowInfoByType(TFCustomTypeEnum type);
+    public FlowInfoResult getFlowInfoByType(TFCustomTypeEnum type, Long flowId);
 }

+ 182 - 46
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ActivitiServiceImpl.java

@@ -13,11 +13,15 @@ import com.qmth.distributed.print.business.entity.*;
 import com.qmth.distributed.print.business.enums.*;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.teachcloud.common.bean.params.ApproveUserResult;
+import com.qmth.teachcloud.common.bean.params.SysRoleGroupMemberMatch;
+import com.qmth.teachcloud.common.bean.params.SysRoleGroupMemberMatchParams;
+import com.qmth.teachcloud.common.bean.result.SysRoleGroupMemberMatchResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysOrg;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.*;
 import com.qmth.teachcloud.common.service.CommonCacheService;
+import com.qmth.teachcloud.common.service.SysRoleGroupMemberService;
 import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.util.JacksonUtil;
 import com.qmth.teachcloud.common.util.RedisUtil;
@@ -49,6 +53,7 @@ import java.io.InputStream;
 import java.text.MessageFormat;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -101,6 +106,12 @@ public class ActivitiServiceImpl implements ActivitiService {
     @Resource
     CommonCacheService commonCacheService;
 
+    @Resource
+    SysRoleGroupMemberService sysRoleGroupMemberService;
+
+    @Resource
+    BasicMessageService basicMessageService;
+
     /**
      * 启动流程
      *
@@ -109,6 +120,7 @@ public class ActivitiServiceImpl implements ActivitiService {
      */
     @Override
     public ProcessInstance flowStart(Map<String, Object> map) {
+        Long approveId = Objects.nonNull(map.get(SystemConstant.APPROVE_ID)) ? (Long) map.get(SystemConstant.APPROVE_ID) : null;
         String id = (String) map.get(SystemConstant.ID);
         Long objectId = (Long) map.get(SystemConstant.OBJECT_ID);
         TFCustomTypeEnum flowType = (TFCustomTypeEnum) map.get(SystemConstant.FLOW_TYPE);
@@ -116,21 +128,73 @@ public class ActivitiServiceImpl implements ActivitiService {
         Boolean flowSubmit = (Boolean) map.get(SystemConstant.FLOW_SUBMIT);
         Map flowProcessVarMap = (Map) map.get(SystemConstant.FLOW_PROCESS_VAR_MAP);
         Map<String, CustomFlowVarDto> agginessMap = (Map<String, CustomFlowVarDto>) flowProcessVarMap.get(SystemConstant.AGGINESS_MAP);
+        SysRoleGroupMemberMatchParams roleGroupMemberMatchParams = null;
+        Map<String, SysRoleGroupMemberMatch> flowRoleGroupMemberMatchMap = null;
         Map<String, Object> varMap = new HashMap<>();
         Gson gson = new Gson();
         for (Map.Entry<String, CustomFlowVarDto> entry : agginessMap.entrySet()) {
             CustomFlowVarDto customFlowVarDto = gson.fromJson(gson.toJson(entry.getValue()), CustomFlowVarDto.class);
             if (Objects.nonNull(customFlowVarDto.getFlowTaskVar()) && customFlowVarDto.getFlowTaskVar().contains(DefaultInstanceConvertToMultiInstance.DEFAULT_ASSIGNEE_LIST)) {
-                Set<String> set = new LinkedHashSet(customFlowVarDto.getApproveIds());
-                if (customFlowVarDto.getMultipleUserApproveType() == CustomFlowMultipleUserApproveTypeEnum.SOME) {
-                    varMap.computeIfAbsent(customFlowVarDto.getFlowTaskVar(), s -> set.toString().replaceAll("\\[", "").replaceAll("\\]", "").trim());
-                } else {
-                    varMap.computeIfAbsent(customFlowVarDto.getFlowTaskVar(), s -> set);
+                if (customFlowVarDto.getApproveUserType() == CustomFlowApproveUserTypeEnum.USER) {
+                    Set<String> set = new LinkedHashSet(customFlowVarDto.getApproveIds());
+                    if (customFlowVarDto.getMultipleUserApproveType() == CustomFlowMultipleUserApproveTypeEnum.SOME) {
+                        varMap.computeIfAbsent(customFlowVarDto.getFlowTaskVar(), s -> set.toString().replaceAll("\\[", "").replaceAll("\\]", "").trim());
+                    } else {
+                        varMap.computeIfAbsent(customFlowVarDto.getFlowTaskVar(), s -> set);
+                    }
+                } else if (customFlowVarDto.getApproveUserType() == CustomFlowApproveUserTypeEnum.ROLE) {
+                    roleGroupMemberMatchParams = Objects.isNull(roleGroupMemberMatchParams) ? new SysRoleGroupMemberMatchParams() : roleGroupMemberMatchParams;
+                    if (Objects.isNull(roleGroupMemberMatchParams.getFlowRoleGroupMemberMatchMap()) || roleGroupMemberMatchParams.getFlowRoleGroupMemberMatchMap().size() == 0) {
+                        flowRoleGroupMemberMatchMap = new LinkedHashMap<>();
+                    } else {
+                        flowRoleGroupMemberMatchMap = roleGroupMemberMatchParams.getFlowRoleGroupMemberMatchMap();
+                    }
+                    if (flowRoleGroupMemberMatchMap.size() == 0) {
+                        flowRoleGroupMemberMatchMap.computeIfAbsent(entry.getKey(), v -> new SysRoleGroupMemberMatch(customFlowVarDto.getApproveRoleIds().stream().map(s -> SystemConstant.convertIdToLong(s)).collect(Collectors.toList()), approveId));
+                    } else {
+                        flowRoleGroupMemberMatchMap.computeIfAbsent(entry.getKey(), v -> new SysRoleGroupMemberMatch(customFlowVarDto.getApproveRoleIds().stream().map(s -> SystemConstant.convertIdToLong(s)).collect(Collectors.toList())));
+                    }
+                    roleGroupMemberMatchParams.setFlowRoleGroupMemberMatchMap(flowRoleGroupMemberMatchMap);
                 }
             } else {
                 varMap.computeIfAbsent(customFlowVarDto.getFlowTaskVar(), s -> customFlowVarDto.getApproveIds().get(0));
             }
         }
+        if (Objects.nonNull(roleGroupMemberMatchParams)) {
+            Map<String, SysRoleGroupMemberMatchResult> sysRoleGroupMemberMatchResultMap = sysRoleGroupMemberService.matchList(roleGroupMemberMatchParams);
+            if (Objects.nonNull(sysRoleGroupMemberMatchResultMap) && sysRoleGroupMemberMatchResultMap.size() > 0) {
+                sysRoleGroupMemberMatchResultMap.forEach((k, v) -> {
+                    String userTaskId = k.substring(k.length() - 1, k.length());
+                    CustomFlowVarDto customFlowVarDto = gson.fromJson(gson.toJson(agginessMap.get(k)), CustomFlowVarDto.class);
+                    if (Objects.isNull(v)) {
+                        throw ExceptionResultEnum.ERROR.exception("流程第" + userTaskId + "个审批节点没有审批人或成员数据已发生改变,请重新选择!");
+                    }
+                    int count = sysRoleGroupMemberService.findByIdsCount(v.getSysRoleGroupMemberIdList());
+                    if (count == 0 || count != v.getSysRoleGroupMemberIdList().size()) {
+                        throw ExceptionResultEnum.ERROR.exception("流程第" + userTaskId + "个审批节点成员数据已发生改变,请重新选择!");
+                    }
+                    List<ApproveUserResult> approveUserResultList = v.getApproveUserResultList();
+                    List<String> approveUserList = new ArrayList<>();
+                    StringJoiner approveUserNamesSj = new StringJoiner("");
+                    for (ApproveUserResult a : approveUserResultList) {
+                        approveUserList.add(String.valueOf(a.getId()));
+                        approveUserNamesSj.add(a.getRealName()).add("(").add(a.getOrgName()).add(")").add(",");
+                    }
+                    customFlowVarDto.setApproveIds(approveUserList);
+                    Set<String> set = new LinkedHashSet(approveUserList);
+                    String approveUserNames = approveUserNamesSj.toString();
+                    approveUserNames = !Objects.equals(approveUserNames, "") ? approveUserNames.substring(0, approveUserNames.length() - 1) : null;
+                    customFlowVarDto.setApproveUserNames(approveUserNames);
+                    if (customFlowVarDto.getMultipleUserApproveType() == CustomFlowMultipleUserApproveTypeEnum.SOME) {
+                        varMap.put(customFlowVarDto.getFlowTaskVar(), set.toString().replaceAll("\\[", "").replaceAll("\\]", "").trim());
+                    } else {
+                        varMap.put(customFlowVarDto.getFlowTaskVar(), set);
+                    }
+                    agginessMap.put(k, customFlowVarDto);
+                });
+            }
+            flowProcessVarMap.put(SystemConstant.AGGINESS_MAP, agginessMap);
+        }
         varMap.computeIfAbsent(SystemConstant.OBJECT_ID, v -> objectId);
         varMap.computeIfAbsent(SystemConstant.OBJECT_DATA, v -> o);
         varMap.computeIfAbsent(SystemConstant.FLOW_TYPE, v -> flowType);
@@ -208,10 +272,13 @@ public class ActivitiServiceImpl implements ActivitiService {
         }
         try {
             SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-            ExamTask examTask = examTaskService.findByFlowId(SystemConstant.convertIdToLong(flowId));
+            TFFlowJoin tfFlowJoin = tfFlowJoinService.findByFlowId(SystemConstant.convertIdToLong(flowId));
+            Object o = null;
+            if (Objects.nonNull(tfFlowJoin.getObjectTable()) && Objects.equals(tfFlowJoin.getObjectTable(), TFCustomTypeEnum.ELECTRON_FLOW.getTable())) {
+                o = examTaskService.findByFlowId(SystemConstant.convertIdToLong(flowId));
+            }
             //流程审批
             TFFlowApprove tfFlowApprove = tfFlowApproveService.findByFlowId(SystemConstant.convertIdToLong(flowId));
-            TFFlowJoin tfFlowJoin = tfFlowJoinService.findByFlowId(SystemConstant.convertIdToLong(flowId));
             if (Objects.isNull(tfFlowApprove)) {
                 tfFlowApprove = new TFFlowApprove(sysUser.getSchoolId(), sysUser.getOrgId(), SystemConstant.convertIdToLong(flowId), sysUser.getId(), FlowStatusEnum.END, sysUser.getId());
             } else {
@@ -222,16 +289,19 @@ public class ActivitiServiceImpl implements ActivitiService {
             tfFlowApproveService.saveOrUpdate(tfFlowApprove);
 
             //流程流水日志
-            TFFlowLog tfFlowLog = new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), examTask.getFlowId(), examTask.getId(), sysUser.getId(), sysUser.getId(), FlowApproveSetupEnum.END.getTitle(), tfFlowJoin.getObjectTable());
+            TFFlowLog tfFlowLog = new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), tfFlowJoin.getFlowId(), tfFlowJoin.getObjectId(), sysUser.getId(), sysUser.getId(), FlowApproveSetupEnum.END.getTitle(), tfFlowJoin.getObjectTable());
             tfFlowLog.setApproveOperation(FlowApproveOperationEnum.END);
             tfFlowLog.setApproveSetup(FlowApproveSetupEnum.END.getSetup());
             tfFlowLogService.save(tfFlowLog);
 
             //命题任务修改
 //            examTask.setFlowId(null);
-            examTask.setStatus(ExamStatusEnum.STAGE);
-            examTask.updateInfo(sysUser.getId());
-            examTaskService.updateById(examTask);
+            if (Objects.nonNull(o) && o instanceof ExamTask) {
+                ExamTask examTask = (ExamTask) o;
+                examTask.setStatus(ExamStatusEnum.STAGE);
+                examTask.updateInfo(sysUser.getId());
+                examTaskService.updateById(examTask);
+            }
             runtimeService.deleteProcessInstance(flowId, FlowApproveSetupEnum.END.getTitle());
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
@@ -300,7 +370,11 @@ public class ActivitiServiceImpl implements ActivitiService {
             throw ExceptionResultEnum.ERROR.exception("正在审批中,请稍候再试!");
         }
         try {
-            ExamTask examTask = examTaskService.findByFlowId(flowId);
+            TFFlowJoin tfFlowJoin = tfFlowJoinService.findByFlowId(flowId);
+            Object o = null;
+            if (Objects.nonNull(tfFlowJoin.getObjectTable()) && Objects.equals(tfFlowJoin.getObjectTable(), TFCustomTypeEnum.ELECTRON_FLOW.getTable())) {
+                o = examTaskService.findByFlowId(flowId);
+            }
 
             //获取当前流程节点
             String currActivityId = task.getTaskDefinitionKey();
@@ -316,8 +390,6 @@ public class ActivitiServiceImpl implements ActivitiService {
             TFCustomFlowEntity tfCustomFlowEntity = tfCustomFlowEntityService.findByFlowId(flowId);
             Map<String, Object> flowProcessVarMap = this.getFlowProcessVarMap(tfCustomFlowEntity);
 
-            TFFlowJoin tfFlowJoin = tfFlowJoinService.findByFlowId(flowId);
-
             String remark = null;
             FlowTaskResult currFlowTaskResult = null, nextFlowTaskResult = null;
             Map<String, CustomFlowVarDto> agginessMap = (Map<String, CustomFlowVarDto>) flowProcessVarMap.get(SystemConstant.AGGINESS_MAP);
@@ -338,7 +410,7 @@ public class ActivitiServiceImpl implements ActivitiService {
                 }
                 remark = Objects.nonNull(map.get(SystemConstant.APPROVE_REMARK)) ? map.get(SystemConstant.APPROVE_REMARK).toString() : null;
                 //流程流水日志
-                tfFlowLog = new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), flowId, examTask.getId(), sysUser.getId(), sysUser.getId(), remark, tfFlowJoin.getObjectTable());
+                tfFlowLog = new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), flowId, tfFlowJoin.getObjectId(), sysUser.getId(), sysUser.getId(), remark, tfFlowJoin.getObjectTable());
                 //判断流程审批是通过还是驳回
                 FlowApprovePassEnum approvePass = (FlowApprovePassEnum) map.get(SystemConstant.APPROVE_OPERATION);
                 Map<String, FlowTaskResult> setupMap = (Map<String, FlowTaskResult>) flowProcessVarMap.get(SystemConstant.SETUP_MAP);
@@ -423,7 +495,7 @@ public class ActivitiServiceImpl implements ActivitiService {
                     nextFlowTaskResult,
                     gson,
                     agginessMap,
-                    examTask);
+                    o);
             //当前实例的执行到哪个节点
             taskService.complete(String.valueOf(flowTaskId), map);
         } catch (Exception e) {
@@ -453,7 +525,7 @@ public class ActivitiServiceImpl implements ActivitiService {
      * @param nextFlowTaskResult
      * @param gson
      * @param agginessMap
-     * @param examTask
+     * @param o
      */
     protected void setApproveInfo(TFFlowApprove tfFlowApprove,
                                   TFFlowLog tfFlowLog,
@@ -466,7 +538,7 @@ public class ActivitiServiceImpl implements ActivitiService {
                                   FlowTaskResult nextFlowTaskResult,
                                   Gson gson,
                                   Map<String, CustomFlowVarDto> agginessMap,
-                                  ExamTask examTask) {
+                                  Object o) {
         tfFlowApprove.updateInfo(sysUser.getId());
         if (tfFlowLog.getApproveOperation() == FlowApproveOperationEnum.APPROVE) {
             tfFlowApprove.setApproveSetup(nrOfCompletedInstances);
@@ -517,8 +589,11 @@ public class ActivitiServiceImpl implements ActivitiService {
         map.put(SystemConstant.APPROVE_TF_FLOW_LOG, tfFlowLog);
         tfFlowApproveService.saveOrUpdate(tfFlowApprove);
         tfFlowLogService.save(tfFlowLog);
-        examTask.updateInfo(sysUser.getId());
-        examTaskService.updateById(examTask);
+        if (Objects.nonNull(o) && o instanceof ExamTask) {
+            ExamTask examTask = (ExamTask) o;
+            examTask.updateInfo(sysUser.getId());
+            examTaskService.updateById(examTask);
+        }
     }
 
     /**
@@ -809,17 +884,18 @@ public class ActivitiServiceImpl implements ActivitiService {
                 throw ExceptionResultEnum.ERROR.exception("该审批人已有审批权限,无需流转");
             }
         }
-
-        ExamTask examTask = examTaskService.findByFlowId(SystemConstant.convertIdToLong(flowId));
+        TFFlowJoin tfFlowJoin = tfFlowJoinService.findByFlowId(SystemConstant.convertIdToLong(flowId));
+        Object o = null;
+        if (Objects.nonNull(tfFlowJoin.getObjectTable()) && Objects.equals(tfFlowJoin.getObjectTable(), TFCustomTypeEnum.ELECTRON_FLOW.getTable())) {
+            o = examTaskService.findByFlowId(SystemConstant.convertIdToLong(flowId));
+        }
         SysUser exchangeUser = sysUserService.getById(userId);
         SysOrg exchangeSysOrg = commonCacheService.orgCache(exchangeUser.getOrgId());
 
-        TFFlowJoin tfFlowJoin = tfFlowJoinService.findByFlowId(SystemConstant.convertIdToLong(flowId));
-
         String remark = Objects.nonNull(sysOrg) ? sysOrg.getName() : "无机构";
         String exchangeRemark = Objects.nonNull(exchangeSysOrg) ? exchangeSysOrg.getName() : "无机构";
         //流程流水日志
-        TFFlowLog tfFlowLog = new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), examTask.getFlowId(), examTask.getId(), sysUser.getId(), sysUser.getRealName() + "(" + remark + ")转" + exchangeUser.getRealName() + "(" + exchangeRemark + ")审批", FlowApproveOperationEnum.EXCHANGE, sysUser.getId(), String.valueOf(exchangeUser.getId()), tfFlowJoin.getObjectTable());
+        TFFlowLog tfFlowLog = new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), tfFlowJoin.getFlowId(), tfFlowJoin.getObjectId(), sysUser.getId(), sysUser.getRealName() + "(" + remark + ")转" + exchangeUser.getRealName() + "(" + exchangeRemark + ")审批", FlowApproveOperationEnum.EXCHANGE, sysUser.getId(), String.valueOf(exchangeUser.getId()), tfFlowJoin.getObjectTable());
         CustomFlowVarDto customFlowVarDto = gson.fromJson(gson.toJson(agginessMap.get(userTask.getId())), CustomFlowVarDto.class);
         if (customFlowVarDto.getApproveIds().size() == 1) {
             customFlowVarDto.setApproveIds(new ArrayList<>(Arrays.asList(userId)));
@@ -860,7 +936,7 @@ public class ActivitiServiceImpl implements ActivitiService {
         tfFlowApprove.setTransferAssignee(JacksonUtil.parseJson(agginessMap));
         tfFlowApproveService.updateById(tfFlowApprove);
 
-        tfFlowLog.setApproveMultiSetup(Objects.nonNull(nrOfCompletedInstances) ? nrOfCompletedInstances++ : nrOfCompletedInstances);
+        tfFlowLog.setApproveMultiSetup(Objects.nonNull(nrOfCompletedInstances) ? ++nrOfCompletedInstances : nrOfCompletedInstances);
         tfFlowLog.setApproveSetup(tfFlowApprove.getSetup());
         tfFlowLog.setApproveUserApproveType(customFlowVarDto.getMultipleUserApproveType());
         tfFlowLogService.save(tfFlowLog);
@@ -871,6 +947,10 @@ public class ActivitiServiceImpl implements ActivitiService {
         } else {
             taskService.setAssignee(taskId, userId);
         }
+        ApproveUserResult approveUserResultExchange = gson.fromJson(gson.toJson(exchangeUser), ApproveUserResult.class);
+        if (Objects.nonNull(o) && o instanceof ExamTask) {
+            basicMessageService.sendNoticeTaskAuditFlow((ExamTask) o, Arrays.asList(approveUserResultExchange), MessageEnum.NOTICE_OF_AUDIT_CREATED);
+        }
         return true;
     }
 
@@ -909,9 +989,9 @@ public class ActivitiServiceImpl implements ActivitiService {
         Map<CustomFlowTypeEnum, CustomFlowDto> customFlowTypeEnumCustomFlowDtoMap = new HashMap<>();
         FlowTaskLink flowTaskLink = new FlowTaskLink();//流程双向链表
         Map<String, Object> flowProcessVarMap = new HashMap<>();//流程变量
-        Map<String, CustomFlowVarDto> agginessMap = new HashMap<>();//流程审核人数据
+        Map<String, CustomFlowVarDto> agginessMap = new LinkedHashMap<>();//流程审核人数据
         Map<String, CustomFlowGatewayDto> approveDataMap = new HashMap<>();//流程审批数据
-        Map<String, FlowTaskResult> setupMap = new HashMap<>();//流程审批步骤map
+        Map<String, FlowTaskResult> setupMap = new LinkedHashMap<>();//流程审批步骤map
         LinkedMultiValueMap<String, CustomFlowSequenceDto> approvePassMap = new LinkedMultiValueMap<>();//流程审批通过数据
         LinkedMultiValueMap<String, CustomFlowSequenceDto> approveRejectMap = new LinkedMultiValueMap<>();//流程审批驳回数据
         flowProcessVarMap.computeIfAbsent(SystemConstant.AGGINESS_MAP, v -> agginessMap);
@@ -938,16 +1018,18 @@ public class ActivitiServiceImpl implements ActivitiService {
                     //默认在开始节点后新增一个审批节点
                     customFlowDefaultDto = multiWorkFlow.createDefaultUserTask(customFlowDto, flowTaskLink, DefaultInstanceConvertToMultiInstance.DEFAULT_USER_TASK);
                     setupMap.put(customFlowDefaultDto.getFlowTaskId(), new FlowTaskResult(customFlowDefaultDto.getContent(), customFlowDefaultDto.getFlowTaskId(), customFlowDefaultDto.getSetup()));
-                    agginessMap.computeIfAbsent(customFlowDefaultDto.getFlowTaskId(), v -> new CustomFlowVarDto(SystemConstant.APPROVE_ID, new ArrayList(Arrays.asList("")), null, null));
+                    agginessMap.computeIfAbsent(customFlowDefaultDto.getFlowTaskId(), v -> new CustomFlowVarDto(SystemConstant.APPROVE_ID, new ArrayList(Arrays.asList("")), null, null, null));
                     process.addFlowElement(createUserTask(CustomFlowTypeEnum.USER_TASK.getId() + DefaultInstanceConvertToMultiInstance.DEFAULT_USER_TASK, Objects.nonNull(flowTaskLink.getLast().getTask().getContent()) && !Objects.equals(flowTaskLink.getLast().getTask().getContent(), "") ? flowTaskLink.getLast().getTask().getContent() : DefaultInstanceConvertToMultiInstance.DEFAULT_USER_TASK_NAME, DefaultInstanceConvertToMultiInstance.APPROVE_ID_EXP));
                     break;
                 case PROCESS://过程节点
                     customFlowDto.setSetup(setup.getAndIncrement());
                     customFlowDto.setFlowTaskId(CustomFlowTypeEnum.USER_TASK.getId() + i);
-                    setupMap.put(customFlowDto.getFlowTaskId(), new FlowTaskResult(Objects.nonNull(customFlowDto.getContent()) && !Objects.equals(customFlowDto.getContent(), "") ? customFlowDto.getContent() : DefaultInstanceConvertToMultiInstance.USER_TASK_APPROVE_NAME, customFlowDto.getFlowTaskId(), customFlowDto.getSetup()));
+                    FlowTaskResult flowTaskResult = new FlowTaskResult(Objects.nonNull(customFlowDto.getContent()) && !Objects.equals(customFlowDto.getContent(), "") ? customFlowDto.getContent() : DefaultInstanceConvertToMultiInstance.USER_TASK_APPROVE_NAME, customFlowDto.getFlowTaskId(), customFlowDto.getSetup());
+                    setupMap.put(customFlowDto.getFlowTaskId(), flowTaskResult);
                     CustomFlowPropertyDto customFlowPropertyDto = customFlowDto.getProperty();
                     List<String> approveUserIds = new ArrayList<>();//审批用户
                     List<String> copyUserIds = new ArrayList<>();//抄送用户
+                    List<String> approveRoleIds = null;//审批角色
                     //抄送用户
                     if (Objects.nonNull(customFlowPropertyDto.getCopyForUsers()) && customFlowPropertyDto.getCopyForUsers().size() > 0) {
                         copyUserIds.addAll(customFlowPropertyDto.getCopyForUsers().stream().map(x -> String.valueOf(x.getId())).collect(Collectors.toList()));
@@ -962,21 +1044,23 @@ public class ActivitiServiceImpl implements ActivitiService {
                                 break;
                             case ROLE://角色
                                 if (Objects.nonNull(customFlowPropertyDto.getApproveRoles()) && customFlowPropertyDto.getApproveRoles().size() > 0) {
-//                                    List<SysUser> sysUserList = sysUserService.findByRoleIds(customFlowPropertyDto.getApproveRoles().stream().map(x -> x.getId()).collect(Collectors.toList()));
-//                                    approveUserIds.addAll(sysUserList.stream().map(x -> String.valueOf(x.getId())).collect(Collectors.toList()));
+                                    approveRoleIds = customFlowPropertyDto.getApproveRoles().stream().map(x -> String.valueOf(x.getId())).collect(Collectors.toList());
                                 }
                                 break;
                             default:
                                 break;
                         }
-                        Set<String> set = new LinkedHashSet(approveUserIds);
-                        ApproveUserResult approveUserResult = sysUserService.findByIds(set.stream().map(x -> SystemConstant.convertIdToLong(x)).collect(Collectors.toList()));
+                        ApproveUserResult approveUserResult = null;
+                        if (approveUserIds.size() > 0) {
+                            Set<String> set = new LinkedHashSet(approveUserIds);
+                            approveUserResult = sysUserService.findByIds(set.stream().map(x -> SystemConstant.convertIdToLong(x)).collect(Collectors.toList()));
+                        }
                         ApproveUserResult approveUserResultCopyUser = null;
                         if (copyUserIds.size() > 0) {
                             Set<String> copyUserSet = new LinkedHashSet(copyUserIds);
                             approveUserResultCopyUser = sysUserService.findByIds(copyUserSet.stream().map(x -> SystemConstant.convertIdToLong(x)).collect(Collectors.toList()));
                         }
-                        agginessMap.put(node.getTask().getFlowTaskId(), new CustomFlowVarDto(DefaultInstanceConvertToMultiInstance.DEFAULT_ASSIGNEE_LIST + i, approveUserIds, node.getTask().getProperty().getApproveUserType(), node.getTask().getProperty().getMultipleUserApproveType(), node.getTask().getProperty().getRejectType(), node.getTask().getProperty().getRejectResubmitType(), approveUserResult.getPendApproveUsers(), copyUserIds, Objects.nonNull(approveUserResultCopyUser) ? approveUserResultCopyUser.getPendApproveUsers() : null));
+                        agginessMap.put(node.getTask().getFlowTaskId(), new CustomFlowVarDto(DefaultInstanceConvertToMultiInstance.DEFAULT_ASSIGNEE_LIST + i, approveUserIds, node.getTask().getProperty().getApproveUserType(), node.getTask().getProperty().getMultipleUserApproveType(), node.getTask().getProperty().getRejectType(), node.getTask().getProperty().getRejectResubmitType(), Objects.nonNull(approveUserResult) ? approveUserResult.getPendApproveUsers() : null, copyUserIds, Objects.nonNull(approveUserResultCopyUser) ? approveUserResultCopyUser.getPendApproveUsers() : null, approveRoleIds));
                         if (Objects.nonNull(customFlowPropertyDto.getRejectType()) && !Objects.equals(customFlowPropertyDto.getRejectType(), "")) {
                             //驳回属性
                             switch (customFlowPropertyDto.getRejectType()) {
@@ -1075,6 +1159,8 @@ public class ActivitiServiceImpl implements ActivitiService {
                             }
                         }
                     }
+                    flowTaskResult.setApproveRoleIds(approveRoleIds);
+                    flowTaskResult.setApproveUserType(customFlowPropertyDto.getApproveUserType());
                     process.addFlowElement(createUserTask(CustomFlowTypeEnum.USER_TASK.getId() + i, Objects.nonNull(customFlowDto.getContent()) && !Objects.equals(customFlowDto.getContent(), "") ? customFlowDto.getContent() : DefaultInstanceConvertToMultiInstance.USER_TASK_APPROVE_NAME, approveUserIds, customFlowPropertyDto.getMultipleUserApproveType()));
                     break;
                 case END://结束节点
@@ -1310,7 +1396,7 @@ public class ActivitiServiceImpl implements ActivitiService {
         List<String> approveUserIds = new ArrayList(Arrays.asList(String.valueOf(approveId)));
         Set<String> set = new LinkedHashSet(approveUserIds);
         ApproveUserResult approveUserResult = sysUserService.findByIds(set.stream().map(x -> SystemConstant.convertIdToLong(x)).collect(Collectors.toList()));
-        agginessMap.put(CustomFlowTypeEnum.USER_TASK.getId() + DefaultInstanceConvertToMultiInstance.DEFAULT_USER_TASK, new CustomFlowVarDto(SystemConstant.APPROVE_ID, approveUserIds, approveUserResult.getPendApproveUsers(), null, null));
+        agginessMap.put(CustomFlowTypeEnum.USER_TASK.getId() + DefaultInstanceConvertToMultiInstance.DEFAULT_USER_TASK, new CustomFlowVarDto(SystemConstant.APPROVE_ID, approveUserIds, approveUserResult.getPendApproveUsers(), null, null, null));
         flowProcessVarMap.put(SystemConstant.AGGINESS_MAP, agginessMap);
 
         map.computeIfAbsent(SystemConstant.ID, v -> tfCustomFlow.getFlowKey());
@@ -1343,7 +1429,6 @@ public class ActivitiServiceImpl implements ActivitiService {
      */
     @Override
     public TaskInfoResult getTaskInfo(Long taskId) {
-        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         Task task = taskService.createTaskQuery().taskId(String.valueOf(taskId)).singleResult();
         Optional.ofNullable(task).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程任务为空或该流程已被他人审核,请刷新再试!"));
         Long flowId = SystemConstant.convertIdToLong(task.getProcessInstanceId());
@@ -1450,27 +1535,78 @@ public class ActivitiServiceImpl implements ActivitiService {
      * 根据流程类型获取流程节点
      *
      * @param type
+     * @param flowId
      * @return
      */
     @Override
-    public FlowInfoResult getFlowInfoByType(TFCustomTypeEnum type) {
+    public FlowInfoResult getFlowInfoByType(TFCustomTypeEnum type, Long flowId) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        TFCustomFlow tfCustomFlow = tfCustomFlowService.findMaxVersion(sysUser.getSchoolId(), null, type);
-        Optional.ofNullable(tfCustomFlow).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未找到自定义流程数据"));
-
-        List<FlowTaskResult> flowTaskResultList = this.getFlowTaskResult(tfCustomFlow);
-        Map<String, Object> flowProcessVarMap = this.getFlowProcessVarMap(tfCustomFlow);
+        TFCustomFlow tfCustomFlow = null;
+        TFCustomFlowEntity tfCustomFlowEntity = null;
+        List<FlowTaskResult> flowTaskResultList = null;
+        Map<String, Object> flowProcessVarMap = null;
+        if (Objects.isNull(flowId)) {
+            tfCustomFlow = tfCustomFlowService.findMaxVersion(sysUser.getSchoolId(), null, type);
+            Optional.ofNullable(tfCustomFlow).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未找到自定义流程数据"));
+            flowTaskResultList = this.getFlowTaskResult(tfCustomFlow);
+            flowProcessVarMap = this.getFlowProcessVarMap(tfCustomFlow);
+        } else {
+            tfCustomFlowEntity = tfCustomFlowEntityService.findByFlowId(flowId);
+            Optional.ofNullable(tfCustomFlowEntity).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未找到自定义流程实体数据"));
+            flowTaskResultList = this.getFlowTaskResult(tfCustomFlowEntity);
+            flowProcessVarMap = this.getFlowProcessVarMap(tfCustomFlowEntity);
+        }
+        Optional.ofNullable(flowProcessVarMap).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未找到自定义流程变量数据"));
+        Map<String, FlowTaskResult> flowTaskResultMap = flowTaskResultList.stream().collect(Collectors.toMap(FlowTaskResult::getTaskKey, Function.identity(), (dto1, dto2) -> dto1));
         Map<String, CustomFlowVarDto> agginessMap = (Map<String, CustomFlowVarDto>) flowProcessVarMap.get(SystemConstant.AGGINESS_MAP);
-        Optional.ofNullable(tfCustomFlow).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未找到自定义流程数据"));
 
         Gson gson = new Gson();
+        SysRoleGroupMemberMatchParams roleGroupMemberMatchParams = null;
+        Map<String, SysRoleGroupMemberMatch> flowRoleGroupMemberMatchMap = null;
         for (FlowTaskResult f : flowTaskResultList) {
             CustomFlowVarDto customFlowVarDto = gson.fromJson(gson.toJson(agginessMap.get(f.getTaskKey())), CustomFlowVarDto.class);
             if (Objects.nonNull(customFlowVarDto)) {
-                f.setApproveUserNames(customFlowVarDto.getApproveUserNames());
+                if (Objects.isNull(customFlowVarDto.getApproveUserNames()) && customFlowVarDto.getApproveUserType() == CustomFlowApproveUserTypeEnum.ROLE) {
+                    roleGroupMemberMatchParams = Objects.isNull(roleGroupMemberMatchParams) ? new SysRoleGroupMemberMatchParams() : roleGroupMemberMatchParams;
+                    if (Objects.isNull(roleGroupMemberMatchParams.getFlowRoleGroupMemberMatchMap()) || roleGroupMemberMatchParams.getFlowRoleGroupMemberMatchMap().size() == 0) {
+                        flowRoleGroupMemberMatchMap = new LinkedHashMap<>();
+                    } else {
+                        flowRoleGroupMemberMatchMap = roleGroupMemberMatchParams.getFlowRoleGroupMemberMatchMap();
+                    }
+                    if (flowRoleGroupMemberMatchMap.size() == 0) {
+                        flowRoleGroupMemberMatchMap.computeIfAbsent(f.getTaskKey(), v -> new SysRoleGroupMemberMatch(customFlowVarDto.getApproveRoleIds().stream().map(s -> SystemConstant.convertIdToLong(s)).collect(Collectors.toList()), sysUser.getId()));
+                    } else {
+                        flowRoleGroupMemberMatchMap.computeIfAbsent(f.getTaskKey(), v -> new SysRoleGroupMemberMatch(customFlowVarDto.getApproveRoleIds().stream().map(s -> SystemConstant.convertIdToLong(s)).collect(Collectors.toList())));
+                    }
+                    roleGroupMemberMatchParams.setFlowRoleGroupMemberMatchMap(flowRoleGroupMemberMatchMap);
+                } else {
+                    f.setApproveUserNames(customFlowVarDto.getApproveUserNames());
+                }
+            }
+        }
+        if (Objects.nonNull(roleGroupMemberMatchParams)) {
+            Map<String, SysRoleGroupMemberMatchResult> sysRoleGroupMemberMatchResultMap = sysRoleGroupMemberService.matchList(roleGroupMemberMatchParams);
+            if (Objects.nonNull(sysRoleGroupMemberMatchResultMap) && sysRoleGroupMemberMatchResultMap.size() > 0) {
+                sysRoleGroupMemberMatchResultMap.forEach((k, v) -> {
+                    String userTaskId = k.substring(k.length() - 1, k.length());
+                    if (Objects.isNull(v)) {
+                        throw ExceptionResultEnum.ERROR.exception("流程第" + userTaskId + "个审批节点没有审批人或成员数据已发生改变,请重新选择!");
+                    }
+                    int count = sysRoleGroupMemberService.findByIdsCount(v.getSysRoleGroupMemberIdList());
+                    if (count == 0 || count != v.getSysRoleGroupMemberIdList().size()) {
+                        throw ExceptionResultEnum.ERROR.exception("流程第" + userTaskId + "个审批节点成员数据已发生改变,请重新选择!");
+                    }
+                    List<String> approveUserNamesList = v.getApproveUserResultList().stream().map(s -> s.getRealName() + "(" + s.getOrgName() + ")").collect(Collectors.toList());
+                    FlowTaskResult flowTaskResult = flowTaskResultMap.get(k);
+                    flowTaskResult.setApproveUserNames(approveUserNamesList.toString().replaceAll("\\[", "").replaceAll("\\]", "").trim());
+                });
             }
         }
-        return new FlowInfoResult(tfCustomFlow.getId(), tfCustomFlow.getVersion(), flowTaskResultList);
+        if (Objects.nonNull(tfCustomFlow)) {
+            return new FlowInfoResult(tfCustomFlow.getId(), tfCustomFlow.getVersion(), flowTaskResultList);
+        } else {
+            return new FlowInfoResult(tfCustomFlowEntity.gettFCustomFlowId(), null, flowTaskResultList);
+        }
     }
 
     /**

+ 12 - 7
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -180,6 +180,9 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     @Resource
     BasicExamService basicExamService;
 
+    @Resource
+    BasicSemesterService basicSemesterService;
+
     @Override
     public List<ExamTask> listByCourseCode(Long schoolId, String code) {
         QueryWrapper<ExamTask> queryWrapper = new QueryWrapper<>();
@@ -1624,14 +1627,16 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         Long customFlowId = examTaskApplyTemp.getCustomFlowId();
         Optional.ofNullable(customFlowId).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("自定义流程id为空"));
 
-        Integer version = examTaskApplyTemp.getVersion();
-        Optional.ofNullable(version).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("自定义流程版本号为空"));
+        if (Objects.nonNull(examTaskApplyTemp.getVersion())) {
+            Integer version = examTaskApplyTemp.getVersion();
+            Optional.ofNullable(version).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("自定义流程版本号为空"));
 
-        TFCustomFlow tfCustomFlow = tfCustomFlowService.getById(customFlowId);
-        Optional.ofNullable(tfCustomFlow).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未找到自定义流程数据"));
+            TFCustomFlow tfCustomFlow = tfCustomFlowService.getById(customFlowId);
+            Optional.ofNullable(tfCustomFlow).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未找到自定义流程数据"));
 
-        if (tfCustomFlow.getVersion().intValue() != version.intValue()) {
-            throw ExceptionResultEnum.ERROR.exception("自定义流程数据已发生改变,请刷新重试");
+            if (tfCustomFlow.getVersion().intValue() != version.intValue()) {
+                throw ExceptionResultEnum.ERROR.exception("自定义流程数据已发生改变,请刷新重试");
+            }
         }
 
         JSONObject jsonObject = JSONObject.parseObject(examTaskApplyTemp.getExamTaskContent());
@@ -1867,7 +1872,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             throw ExceptionResultEnum.ERROR.exception("命题任务不存在");
         }
         String paperNumber = examTask.getPaperNumber();
-        String paperName = examTask.getPaperName();
+        String paperName = basicSemesterService.getById(basicExamService.getById(examTask.getExamId()).getSemesterId()).getName();
         Long teachingRoomId = examTask.getTeachingRoomId();
         SysOrg teachingRoom = sysOrgService.getOne(new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getId, teachingRoomId).eq(SysOrg::getType, OrgTypeEnum.TEACHING_ROOM));
         if (Objects.isNull(teachingRoom)) {

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

@@ -599,7 +599,8 @@
             a.draw_count drawCount,
             ifnull(d.status, b.status) status,
             e.flow_id flowId,
-            f.setup
+            f.setup,
+            f.status as flowStatus
         FROM
             exam_task e
                 LEFT JOIN

+ 0 - 69
distributed-print/src/main/java/com/qmth/distributed/print/api/SysRoleGroupMemberController.java

@@ -1,69 +0,0 @@
-package com.qmth.distributed.print.api;
-
-import com.qmth.boot.api.annotation.Aac;
-import com.qmth.boot.api.annotation.BOOL;
-import com.qmth.boot.api.constant.ApiConstant;
-import com.qmth.teachcloud.common.bean.params.SysRoleGroupMemberMatchParams;
-import com.qmth.teachcloud.common.bean.params.SysRoleGroupMemberParams;
-import com.qmth.teachcloud.common.bean.result.SysRoleGroupMemberMatchResult;
-import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.entity.SysRoleGroupMember;
-import com.qmth.teachcloud.common.service.SysRoleGroupMemberService;
-import com.qmth.teachcloud.common.util.Result;
-import com.qmth.teachcloud.common.util.ResultUtil;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
-import org.springframework.validation.BindingResult;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import javax.validation.Valid;
-
-/**
- * <p>
- * 角色组成员表 前端控制器
- * </p>
- *
- * @author wangliang
- * @since 2022-03-08
- */
-@Api(tags = "角色组成员Controller")
-@RestController
-@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.sys}/role/group")
-@Validated
-@Aac(auth = BOOL.FALSE, strict = BOOL.FALSE)
-public class SysRoleGroupMemberController {
-
-    @Resource
-    SysRoleGroupMemberService sysRoleGroupMemberService;
-
-    @ApiOperation(value = "新增/修改")
-    @ApiResponses({@ApiResponse(code = 200, message = "常规信息", response = ResultUtil.class)})
-    @RequestMapping(value = "/save", method = RequestMethod.POST)
-    public Result save(@Valid @RequestBody SysRoleGroupMemberParams roleGroupMemberParams, BindingResult bindingResult) {
-        if (bindingResult.hasErrors()) {
-            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
-        }
-        return ResultUtil.ok(sysRoleGroupMemberService.saveOrUpdate(roleGroupMemberParams));
-    }
-
-    @ApiOperation(value = "成员管理查询")
-    @ApiResponses({@ApiResponse(code = 200, message = "角色组成员信息", response = SysRoleGroupMember.class)})
-    @RequestMapping(value = "/list", method = RequestMethod.POST)
-    public Result list(@RequestParam(value = "roleId") String roleId) {
-        return ResultUtil.ok(sysRoleGroupMemberService.findByRoleId(SystemConstant.convertIdToLong(roleId)));
-    }
-
-    @ApiOperation(value = "匹配查询")
-    @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = SysRoleGroupMemberMatchResult.class)})
-    @RequestMapping(value = "/match/list", method = RequestMethod.POST)
-    public Result matchList(@Valid @RequestBody SysRoleGroupMemberMatchParams roleGroupMemberMatchParams, BindingResult bindingResult) {
-        if (bindingResult.hasErrors()) {
-            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
-        }
-        return ResultUtil.ok(sysRoleGroupMemberService.matchList(roleGroupMemberMatchParams));
-    }
-}

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

@@ -308,7 +308,11 @@ public class TFCustomFlowController {
     @ApiOperation(value = "根据流程类型获取流程节点")
     @ApiResponses({@ApiResponse(code = 200, message = "当前流程节点信息", response = FlowInfoResult.class)})
     @RequestMapping(value = "/get_flow_info_by_type", method = RequestMethod.POST)
-    public Result getFlowInfoByType(@ApiParam(value = "流程类型", required = true) @RequestParam TFCustomTypeEnum type) {
-        return ResultUtil.ok(activitiService.getFlowInfoByType(type));
+    public Result getFlowInfoByType(@ApiParam(value = "流程类型", required = false) @RequestParam(required = false) TFCustomTypeEnum type,
+                                    @ApiParam(value = "流程id", required = false) @RequestParam(required = false) String flowId) {
+        if (Objects.isNull(type) && Objects.isNull(flowId)) {
+            throw ExceptionResultEnum.ERROR.exception("流程类型或流程id必须输入一项");
+        }
+        return ResultUtil.ok(activitiService.getFlowInfoByType(type, Objects.nonNull(flowId) ? SystemConstant.convertIdToLong(flowId) : null));
     }
 }

+ 55 - 58
teachcloud-common-api/src/main/java/com/qmth/teachcloud/common/api/api/SysRoleGroupMemberController.java

@@ -1,61 +1,58 @@
-//package com.qmth.teachcloud.common.api.api;
-//
-//import com.qmth.boot.api.constant.ApiConstant;
-//import com.qmth.teachcloud.common.bean.params.ApproveUserResult;
-//import com.qmth.teachcloud.common.bean.params.SysRoleGroupMemberMatchParams;
-//import com.qmth.teachcloud.common.bean.params.SysRoleGroupMemberParams;
-//import com.qmth.teachcloud.common.contant.SystemConstant;
-//import com.qmth.teachcloud.common.entity.SysRoleGroupMember;
-//import com.qmth.teachcloud.common.service.SysRoleGroupMemberService;
-//import com.qmth.teachcloud.common.util.Result;
-//import com.qmth.teachcloud.common.util.ResultUtil;
-//import io.swagger.annotations.Api;
-//import io.swagger.annotations.ApiOperation;
-//import io.swagger.annotations.ApiResponse;
-//import io.swagger.annotations.ApiResponses;
-//import org.springframework.validation.BindingResult;
-//import org.springframework.validation.annotation.Validated;
-//import org.springframework.web.bind.annotation.*;
-//
-//import javax.annotation.Resource;
-//import javax.validation.Valid;
-//
-///**
-// * <p>
-// * 角色组成员表 前端控制器
-// * </p>
-// *
-// * @author wangliang
-// * @since 2022-03-08
-// */
-//@Api(tags = "角色组成员Controller")
-//@RestController
-//@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.sys}/role/group")
-//@Validated
-//public class SysRoleGroupMemberController {
-//
-//    @Resource
-//    SysRoleGroupMemberService sysRoleGroupMemberService;
-//
-//    @ApiOperation(value = "新增/修改")
-//    @ApiResponses({@ApiResponse(code = 200, message = "常规信息", response = ResultUtil.class)})
-//    @RequestMapping(value = "/save", method = RequestMethod.POST)
-//    public Result save(@Valid @RequestBody SysRoleGroupMemberParams roleGroupMemberParams, BindingResult bindingResult) {
-//        if (bindingResult.hasErrors()) {
-//            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
-//        }
-//        return ResultUtil.ok(sysRoleGroupMemberService.saveOrUpdate(roleGroupMemberParams));
-//    }
-//
-//    @ApiOperation(value = "查询")
-//    @ApiResponses({@ApiResponse(code = 200, message = "角色组成员信息", response = SysRoleGroupMember.class)})
-//    @RequestMapping(value = "/list", method = RequestMethod.POST)
-//    public Result list(@RequestParam(value = "roleId") String roleId) {
-//        return ResultUtil.ok(sysRoleGroupMemberService.findByRoleId(SystemConstant.convertIdToLong(roleId)));
-//    }
-//
+package com.qmth.distributed.print.api;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.teachcloud.common.bean.params.SysRoleGroupMemberParams;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysRoleGroupMember;
+import com.qmth.teachcloud.common.service.SysRoleGroupMemberService;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import io.swagger.annotations.*;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+/**
+ * <p>
+ * 角色组成员表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-03-08
+ */
+@Api(tags = "角色组成员Controller")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.sys}/role/group")
+@Validated
+//@Aac(auth = BOOL.FALSE, strict = BOOL.FALSE)
+public class SysRoleGroupMemberController {
+
+    @Resource
+    SysRoleGroupMemberService sysRoleGroupMemberService;
+
+    @ApiOperation(value = "新增/修改")
+    @ApiResponses({@ApiResponse(code = 200, message = "常规信息", response = ResultUtil.class)})
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    public Result save(@Valid @RequestBody SysRoleGroupMemberParams roleGroupMemberParams, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        return ResultUtil.ok(sysRoleGroupMemberService.saveOrUpdate(roleGroupMemberParams));
+    }
+
+    @ApiOperation(value = "成员管理查询")
+    @ApiResponses({@ApiResponse(code = 200, message = "角色组成员信息", response = SysRoleGroupMember.class)})
+    @RequestMapping(value = "/list", method = RequestMethod.POST)
+    public Result list(@ApiParam(value = "角色id", required = true) @RequestParam String roleId,
+                       @ApiParam(value = "成员姓名", required = false) @RequestParam(required = false) String name) {
+        return ResultUtil.ok(sysRoleGroupMemberService.findByRoleIdAndName(SystemConstant.convertIdToLong(roleId), name));
+    }
+
 //    @ApiOperation(value = "匹配查询")
-//    @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = ApproveUserResult.class)})
+//    @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = SysRoleGroupMemberMatchResult.class)})
 //    @RequestMapping(value = "/match/list", method = RequestMethod.POST)
 //    public Result matchList(@Valid @RequestBody SysRoleGroupMemberMatchParams roleGroupMemberMatchParams, BindingResult bindingResult) {
 //        if (bindingResult.hasErrors()) {
@@ -63,4 +60,4 @@
 //        }
 //        return ResultUtil.ok(sysRoleGroupMemberService.matchList(roleGroupMemberMatchParams));
 //    }
-//}
+}

+ 27 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/ApproveUserResult.java

@@ -1,6 +1,8 @@
 package com.qmth.teachcloud.common.bean.params;
 
 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.entity.SysUser;
 import com.qmth.teachcloud.common.enums.OrgTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
@@ -29,11 +31,19 @@ public class ApproveUserResult extends SysUser implements Serializable {
     @ApiModelProperty(value = "流程待审批人")
     private String pendApproveUsers;
 
+    @ApiModelProperty(value = "角色id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long roleId;
+
+    @ApiModelProperty(value = "用户id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long userId;
+
     public ApproveUserResult() {
 
     }
 
-    public ApproveUserResult(String orgName, OrgTypeEnum orgType, String loginName, String realName, Long schoolId, String code, String mobileNumber, Long createTime,String paperUrls) {
+    public ApproveUserResult(String orgName, OrgTypeEnum orgType, String loginName, String realName, Long schoolId, String code, String mobileNumber, Long createTime, String paperUrls) {
         this.orgName = orgName;
         this.orgType = orgType;
         setLoginName(loginName);
@@ -45,6 +55,22 @@ public class ApproveUserResult extends SysUser implements Serializable {
         this.paperUrls = paperUrls;
     }
 
+    public Long getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId) {
+        this.roleId = roleId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
     public String getPendApproveUsers() {
         return pendApproveUsers;
     }

+ 13 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/SysRoleGroupMemberMatch.java

@@ -28,6 +28,19 @@ public class SysRoleGroupMemberMatch implements Serializable {
     @NotNull(message = "用户id不能为空")
     private Long userId;
 
+    public SysRoleGroupMemberMatch() {
+
+    }
+
+    public SysRoleGroupMemberMatch(List<Long> roleIdList) {
+        this.roleIdList = roleIdList;
+    }
+
+    public SysRoleGroupMemberMatch(List<Long> roleIdList, Long userId) {
+        this.roleIdList = roleIdList;
+        this.userId = userId;
+    }
+
     public List<Long> getRoleIdList() {
         return roleIdList;
     }

+ 0 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/SysRoleGroupMemberParams.java

@@ -4,7 +4,6 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModelProperty;
 
-import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 import java.util.List;
@@ -30,7 +29,6 @@ public class SysRoleGroupMemberParams implements Serializable {
 
     @ApiModelProperty(value = "成员id组")
     @JsonSerialize(using = ToStringSerializer.class)
-    @NotEmpty(message = "成员id组不能为空")
     private List<Long> memberIdList;
 
     public Long getRoleId() {

+ 18 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/SysRoleGroupMemberMatchResult.java

@@ -1,5 +1,7 @@
 package com.qmth.teachcloud.common.bean.result;
 
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.teachcloud.common.bean.params.ApproveUserResult;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -21,17 +23,23 @@ public class SysRoleGroupMemberMatchResult implements Serializable {
     @ApiModelProperty(value = "人员信息")
     List<ApproveUserResult> approveUserResultList;
 
+    @ApiModelProperty(value = "id信息")
+    @JsonSerialize(using = ToStringSerializer.class)
+    List<Long> sysRoleGroupMemberIdList;
+
     public SysRoleGroupMemberMatchResult() {
 
     }
 
-    public SysRoleGroupMemberMatchResult(List<ApproveUserResult> approveUserResultList) {
+    public SysRoleGroupMemberMatchResult(List<ApproveUserResult> approveUserResultList, List<Long> sysRoleGroupMemberIdList) {
         this.approveUserResultList = approveUserResultList;
+        this.sysRoleGroupMemberIdList = sysRoleGroupMemberIdList;
     }
 
-    public SysRoleGroupMemberMatchResult(boolean manual, List<ApproveUserResult> approveUserResultList) {
+    public SysRoleGroupMemberMatchResult(boolean manual, List<ApproveUserResult> approveUserResultList, List<Long> sysRoleGroupMemberIdList) {
         this.manual = manual;
         this.approveUserResultList = approveUserResultList;
+        this.sysRoleGroupMemberIdList = sysRoleGroupMemberIdList;
     }
 
     public boolean isManual() {
@@ -49,4 +57,12 @@ public class SysRoleGroupMemberMatchResult implements Serializable {
     public void setApproveUserResultList(List<ApproveUserResult> approveUserResultList) {
         this.approveUserResultList = approveUserResultList;
     }
+
+    public List<Long> getSysRoleGroupMemberIdList() {
+        return sysRoleGroupMemberIdList;
+    }
+
+    public void setSysRoleGroupMemberIdList(List<Long> sysRoleGroupMemberIdList) {
+        this.sysRoleGroupMemberIdList = sysRoleGroupMemberIdList;
+    }
 }

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

@@ -35,7 +35,7 @@ public enum FieldUniqueEnum {
 
     custom_flow_schoolId_type_idx("流程类型"),
 
-    role_group_roleId_memberId_idx("角色成员数据重复");
+    role_group_roleId_memberId_idx("角色成员数据重复,同角色其它用户已绑定");
 
     private String title;
 

+ 9 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/SysUserMapper.java

@@ -124,4 +124,13 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
      * @return 用户集合
      */
     List<SysUserResult> findSysUserResultBySchoolId(@Param("schoolId") Long schoolId);
+
+    /**
+     * 根据roleId和成员姓名获取
+     *
+     * @param roleId
+     * @param name
+     * @return
+     */
+    List<ApproveUserResult> findByRoldIdAndMemberName(@Param("roleId") Long roleId, @Param("name") String name);
 }

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

@@ -29,12 +29,21 @@ public interface SysRoleGroupMemberService extends IService<SysRoleGroupMember>
     public boolean saveOrUpdate(SysRoleGroupMemberParams roleGroupMemberParams);
 
     /**
-     * 根据roleId查找数据
+     * 根据roleId和name查找数据
      *
      * @param roleId
+     * @param name
      * @return
      */
-    public List<SysRoleGroupMemberResult> findByRoleId(Long roleId);
+    public List<SysRoleGroupMemberResult> findByRoleIdAndName(Long roleId, String name);
+
+    /**
+     * 根据ids count数据
+     *
+     * @param ids
+     * @return
+     */
+    public int findByIdsCount(List<Long> ids);
 
     /**
      * 根据roleId和userId查找数据

+ 9 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysUserService.java

@@ -254,4 +254,13 @@ public interface SysUserService extends IService<SysUser> {
      * @return 用户集合
      */
     List<SysUserResult> findSysUserResultList();
+
+    /**
+     * 根据roleId和成员姓名获取
+     *
+     * @param roleId
+     * @param name
+     * @return
+     */
+    public List<ApproveUserResult> findByRoldIdAndMemberName(Long roleId, String name);
 }

+ 86 - 23
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysRoleGroupMemberServiceImpl.java

@@ -11,6 +11,7 @@ import com.qmth.teachcloud.common.bean.result.SysRoleGroupMemberMatchResult;
 import com.qmth.teachcloud.common.bean.result.SysRoleGroupMemberResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysRoleGroupMember;
+import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.entity.SysUserRole;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.FieldUniqueEnum;
@@ -59,20 +60,26 @@ public class SysRoleGroupMemberServiceImpl extends ServiceImpl<SysRoleGroupMembe
             List<SysRoleGroupMember> sysRoleGroupMemberList = null;
             List<Long> memberIdList = roleGroupMemberParams.getMemberIdList();
             if (Objects.nonNull(sysRoleGroupMemberDbList) && sysRoleGroupMemberDbList.size() > 0) {//编辑
-                int count = (int) sysRoleGroupMemberDbList.stream().filter(s -> memberIdList.contains(s.getMemberId())).count();
-                if (count != sysRoleGroupMemberDbList.size() || memberIdList.size() != sysRoleGroupMemberDbList.size()) {
-                    //全量删除
+                if (Objects.nonNull(memberIdList) && memberIdList.size() > 0) {
+                    int count = (int) sysRoleGroupMemberDbList.stream().filter(s -> memberIdList.contains(s.getMemberId())).count();
+                    if (count != sysRoleGroupMemberDbList.size() || memberIdList.size() != sysRoleGroupMemberDbList.size()) {
+                        //全量删除
+                        this.removeByIds(sysRoleGroupMemberDbList.stream().map(s -> s.getId()).collect(Collectors.toList()));
+                        sysRoleGroupMemberList = new ArrayList<>();
+                        for (Long l : memberIdList) {
+                            sysRoleGroupMemberList.add(new SysRoleGroupMember(roleGroupMemberParams.getRoleId(), roleGroupMemberParams.getUserId(), l));
+                        }
+                    }
+                } else {
                     this.removeByIds(sysRoleGroupMemberDbList.stream().map(s -> s.getId()).collect(Collectors.toList()));
+                }
+            } else {
+                if (Objects.nonNull(memberIdList) && memberIdList.size() > 0) {
                     sysRoleGroupMemberList = new ArrayList<>();
                     for (Long l : memberIdList) {
                         sysRoleGroupMemberList.add(new SysRoleGroupMember(roleGroupMemberParams.getRoleId(), roleGroupMemberParams.getUserId(), l));
                     }
                 }
-            } else {
-                sysRoleGroupMemberList = new ArrayList<>();
-                for (Long l : memberIdList) {
-                    sysRoleGroupMemberList.add(new SysRoleGroupMember(roleGroupMemberParams.getRoleId(), roleGroupMemberParams.getUserId(), l));
-                }
             }
             if (Objects.nonNull(sysRoleGroupMemberList)) {
                 this.saveBatch(sysRoleGroupMemberList);
@@ -81,8 +88,19 @@ public class SysRoleGroupMemberServiceImpl extends ServiceImpl<SysRoleGroupMembe
             log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof DuplicateKeyException) {
                 String errorColumn = e.getCause().toString();
+                String repeatColumn = errorColumn.substring(errorColumn.lastIndexOf("entry") + 6, errorColumn.length());
+                repeatColumn = repeatColumn.substring(0, repeatColumn.lastIndexOf("for") - 2);
+                String[] strs = repeatColumn.split("-");
+                SysUser sysuser = null;
+                if (Objects.nonNull(strs) && strs.length >= 2) {
+                    sysuser = sysUserService.getById(SystemConstant.convertIdToLong(strs[1]));
+                }
                 String columnStr = errorColumn.substring(errorColumn.lastIndexOf("key") + 3, errorColumn.length()).replaceAll("'", "");
-                throw ExceptionResultEnum.SQL_ERROR.exception("[" + FieldUniqueEnum.convertToTitle(columnStr) + "]数据不允许重复插入");
+                if (Objects.nonNull(sysuser)) {
+                    throw ExceptionResultEnum.SQL_ERROR.exception("[" + sysuser.getRealName() + FieldUniqueEnum.convertToTitle(columnStr) + "]数据不允许重复插入");
+                } else {
+                    throw ExceptionResultEnum.SQL_ERROR.exception("[" + FieldUniqueEnum.convertToTitle(columnStr) + "]数据不允许重复插入");
+                }
             } else if (e instanceof ApiException) {
                 ResultUtil.error((ApiException) e, e.getMessage());
             } else {
@@ -96,23 +114,47 @@ public class SysRoleGroupMemberServiceImpl extends ServiceImpl<SysRoleGroupMembe
      * 根据roleId查找数据
      *
      * @param roleId
+     * @param name
      * @return
      */
     @Override
-    public List<SysRoleGroupMemberResult> findByRoleId(Long roleId) {
+    public List<SysRoleGroupMemberResult> findByRoleIdAndName(Long roleId, String name) {
         List<SysRoleGroupMemberResult> sysRoleGroupMemberResultList = null;
-        List<SysUserRole> sysUserRoles = sysUserRoleService.listByRoleId(roleId);
-        if (Objects.nonNull(sysUserRoles) && sysUserRoles.size() > 0) {
-            sysRoleGroupMemberResultList = new ArrayList<>();
-            for (SysUserRole s : sysUserRoles) {
-                List<ApproveUserResult> approveUserResult = sysUserService.findById(s.getUserId());
-                if (Objects.nonNull(approveUserResult) && approveUserResult.size() == 1) {
-                    List<SysRoleGroupMember> sysRoleGroupMemberList = this.findByRoleIdAndUserId(s.getRoleId(), s.getUserId());
-                    if (Objects.nonNull(sysRoleGroupMemberList) && sysRoleGroupMemberList.size() > 0) {
-                        List<ApproveUserResult> approveUserResultList = sysUserService.findByIdsForResult(sysRoleGroupMemberList.stream().map(x -> x.getMemberId()).collect(Collectors.toList()));
-                        sysRoleGroupMemberResultList.add(new SysRoleGroupMemberResult(approveUserResult.get(0), approveUserResultList));
+        if (Objects.nonNull(roleId) && Objects.nonNull(name)) {
+            List<ApproveUserResult> approveUserResultList = sysUserService.findByRoldIdAndMemberName(roleId, name);
+            if (Objects.nonNull(approveUserResultList) && approveUserResultList.size() > 0) {
+                Map<String, List<ApproveUserResult>> map = new LinkedHashMap<>();
+                List<ApproveUserResult> list = null;
+                for (ApproveUserResult a : approveUserResultList) {
+                    if (!map.containsKey(a.getRoleId() + "_" + a.getUserId())) {
+                        list = new ArrayList<>();
                     } else {
-                        sysRoleGroupMemberResultList.add(new SysRoleGroupMemberResult(approveUserResult.get(0)));
+                        list = map.get(a.getRoleId() + "_" + a.getUserId());
+                    }
+                    list.add(a);
+                    map.put(a.getRoleId() + "_" + a.getUserId(), list);
+                }
+                sysRoleGroupMemberResultList = new ArrayList<>();
+                for (Map.Entry<String, List<ApproveUserResult>> entry : map.entrySet()) {
+                    String[] strs = entry.getKey().split("_");
+                    List<ApproveUserResult> approveUserResult = sysUserService.findById(SystemConstant.convertIdToLong(strs[1]));
+                    sysRoleGroupMemberResultList.add(new SysRoleGroupMemberResult(approveUserResult.get(0), entry.getValue()));
+                }
+            }
+        } else {
+            List<SysUserRole> sysUserRoles = sysUserRoleService.listByRoleId(roleId);
+            if (Objects.nonNull(sysUserRoles) && sysUserRoles.size() > 0) {
+                sysRoleGroupMemberResultList = new ArrayList<>();
+                for (SysUserRole s : sysUserRoles) {
+                    List<ApproveUserResult> approveUserResult = sysUserService.findById(s.getUserId());
+                    if (Objects.nonNull(approveUserResult) && approveUserResult.size() == 1) {
+                        List<SysRoleGroupMember> sysRoleGroupMemberList = this.findByRoleIdAndUserId(s.getRoleId(), s.getUserId());
+                        if (Objects.nonNull(sysRoleGroupMemberList) && sysRoleGroupMemberList.size() > 0) {
+                            List<ApproveUserResult> approveUserResultList = sysUserService.findByIdsForResult(sysRoleGroupMemberList.stream().map(x -> x.getMemberId()).collect(Collectors.toList()));
+                            sysRoleGroupMemberResultList.add(new SysRoleGroupMemberResult(approveUserResult.get(0), approveUserResultList));
+                        } else {
+                            sysRoleGroupMemberResultList.add(new SysRoleGroupMemberResult(approveUserResult.get(0)));
+                        }
                     }
                 }
             }
@@ -120,6 +162,17 @@ public class SysRoleGroupMemberServiceImpl extends ServiceImpl<SysRoleGroupMembe
         return sysRoleGroupMemberResultList;
     }
 
+    /**
+     * 根据ids count数据
+     *
+     * @param ids
+     * @return
+     */
+    @Override
+    public int findByIdsCount(List<Long> ids) {
+        return this.count(new QueryWrapper<SysRoleGroupMember>().lambda().in(SysRoleGroupMember::getId, ids));
+    }
+
     /**
      * 根据roleId和userId查找数据
      *
@@ -169,6 +222,7 @@ public class SysRoleGroupMemberServiceImpl extends ServiceImpl<SysRoleGroupMembe
         List<Long> nextApproveUserList = null;
         for (Map.Entry<String, SysRoleGroupMemberMatch> entry : map.entrySet()) {
             List<SysRoleGroupMember> sysRoleGroupMemberList = null;
+            List<Long> sysRoleGroupMemberIdList = new ArrayList<>();
             if (Objects.nonNull(entry.getValue().getUserId())) {
                 sysRoleGroupMemberList = this.findByRoleIdsAndMemberId(entry.getValue().getRoleIdList(), entry.getValue().getUserId());
             } else if (Objects.nonNull(nextApproveUserList) && nextApproveUserList.size() > 0) {
@@ -182,9 +236,18 @@ public class SysRoleGroupMemberServiceImpl extends ServiceImpl<SysRoleGroupMembe
                 } else if (sysRoleGroupMemberList.size() > 1) {//前端选择
                     manual = true;
                 }
-                nextApproveUserList = sysRoleGroupMemberList.stream().map(s -> s.getUserId()).collect(Collectors.toList());
+
+                if (Objects.isNull(nextApproveUserList)) {
+                    nextApproveUserList = new ArrayList<>();
+                } else {
+                    nextApproveUserList.clear();
+                }
+                for (SysRoleGroupMember s : sysRoleGroupMemberList) {
+                    sysRoleGroupMemberIdList.add(s.getId());
+                    nextApproveUserList.add(s.getUserId());
+                }
                 List<ApproveUserResult> approveUserResultList = sysUserService.findByIdsForResult(nextApproveUserList);
-                approveUserResultMap.put(entry.getKey(), new SysRoleGroupMemberMatchResult(manual, approveUserResultList));
+                approveUserResultMap.put(entry.getKey(), new SysRoleGroupMemberMatchResult(manual, approveUserResultList, sysRoleGroupMemberIdList));
             } else {
                 approveUserResultMap.put(entry.getKey(), null);
             }

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

@@ -1109,6 +1109,18 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return this.baseMapper.findSysUserResultBySchoolId(schoolId);
     }
 
+    /**
+     * 根据roleId和成员姓名获取
+     *
+     * @param roleId
+     * @param name
+     * @return
+     */
+    @Override
+    public List<ApproveUserResult> findByRoldIdAndMemberName(Long roleId, String name) {
+        return sysUserMapper.findByRoldIdAndMemberName(roleId, name);
+    }
+
     /**
      * 批量处理用户信息帮助类
      *

+ 27 - 0
teachcloud-common/src/main/resources/mapper/SysUserMapper.xml

@@ -327,4 +327,31 @@
             </if>
         </where>
     </select>
+
+    <select id="findByRoldIdAndMemberName" resultType="com.qmth.teachcloud.common.bean.params.ApproveUserResult">
+        select DISTINCT su.id,
+            su.school_id as schoolId,
+            su.login_name as loginName,
+            su.real_name as realName,
+            su.code,
+            su.mobile_number as mobileNumber,
+            su.org_id as orgId,
+            so.name as orgName,
+            so.`type` as orgType,
+            srgm.role_id as roleId,
+            srgm.user_id as userId
+            from sys_role_group_member srgm
+            join sys_user su on su.id = srgm.member_id
+            join sys_user_role sur on sur.user_id = su.id
+            join sys_org so on so.id = su.org_id
+        <where>
+            <if test="roleId != null and roleId != ''">
+                and srgm.role_id = #{roleId}
+            </if>
+            <if test="name != null and name != ''">
+                and su.real_name like concat('%',#{name},'%')
+            </if>
+            and su.enable = 1
+        </where>
+    </select>
 </mapper>