Browse Source

回退发起人优化

caixiaofeng 9 months ago
parent
commit
ff79fa0f4d

+ 28 - 23
flow-workflow/flow-workflow-biz/src/main/java/com/flow/listener/GlobalActivityEventListener.java

@@ -5,6 +5,7 @@ import com.flow.common.oauth2.utils.SecurityContextUtil;
 import com.flow.constant.NodeTypeConstant;
 import com.flow.entity.*;
 import com.flow.entity.node.ApprovalNode;
+import com.flow.entity.node.StartNode;
 import com.flow.entity.settings.CancelConfig;
 import com.flow.entity.settings.Settings;
 import com.flow.enums.ApprovalNobodyEnum;
@@ -29,6 +30,7 @@ import org.springframework.transaction.support.TransactionSynchronizationManager
 
 import java.time.LocalDateTime;
 import java.util.Map;
+import java.util.Objects;
 
 @Component
 @Slf4j
@@ -50,10 +52,6 @@ public class GlobalActivityEventListener extends AbstractFlowableEngineEventList
     @Override
     protected void taskCreated(FlowableEngineEntityEvent event) {
         TaskEntityImpl entity = (TaskEntityImpl) event.getEntity();
-        FlowDefine define = flowDefineService.getDefine(entity.getProcessDefinitionId());
-        ApprovalNode approvalNode = define.getNode(entity.getTaskDefinitionKey(), ApprovalNode.class);
-        AssigneeTypeEnum assigneeType = approvalNode.getAssigneeType();
-        ApprovalNobodyEnum nobody = approvalNode.getNobody();
 
         // 更新任务状态
         FlowTask flowTask = FlowTask.buildStatus(entity.getId(), ProcessStatus.RUNNING);
@@ -65,28 +63,35 @@ public class GlobalActivityEventListener extends AbstractFlowableEngineEventList
         flowActivity.setStatus(ProcessStatus.RUNNING);
         flowActivityService.save(flowActivity);
 
-        // 自动通过
-        if (assigneeType == AssigneeTypeEnum.AUTO_PASS) {
-            flowTaskService.autoComplete(entity.getId());
-            return;
-        }
 
-        // 自动拒绝
-        if (assigneeType == AssigneeTypeEnum.AUTO_REFUSE) {
-            flowTaskService.autoRefuse(entity.getId());
-            return;
-        }
+        FlowDefine define = flowDefineService.getDefine(entity.getProcessDefinitionId());
+        ApprovalNode approvalNode = define.getNode(entity.getTaskDefinitionKey(), ApprovalNode.class);
+        if(Objects.nonNull(approvalNode)){
+            AssigneeTypeEnum assigneeType = approvalNode.getAssigneeType();
+            ApprovalNobodyEnum nobody = approvalNode.getNobody();
+
+            // 自动通过
+            if (assigneeType == AssigneeTypeEnum.AUTO_PASS) {
+                flowTaskService.autoComplete(entity.getId());
+                return;
+            }
 
-        // 审批人为空方式
-        if (StringUtils.isBlank(entity.getAssignee()) || "empty".equals(entity.getAssignee())) {
-            entity.setAssignee("admin");
-            taskService.setAssignee(entity.getId(), "admin");
-            if (nobody == ApprovalNobodyEnum.PASS) {
-                flowTaskService.autoComplete(entity.getId(), " 审批人为空");
-            } else if (nobody == ApprovalNobodyEnum.REFUSE) {
-                flowTaskService.autoRefuse(entity.getId(), " 审批人为空");
+            // 自动拒绝
+            if (assigneeType == AssigneeTypeEnum.AUTO_REFUSE) {
+                flowTaskService.autoRefuse(entity.getId());
+                return;
+            }
+            // 审批人为空方式
+            if (StringUtils.isBlank(entity.getAssignee()) || "empty".equals(entity.getAssignee())) {
+                entity.setAssignee("admin");
+                taskService.setAssignee(entity.getId(), "admin");
+                if (nobody == ApprovalNobodyEnum.PASS) {
+                    flowTaskService.autoComplete(entity.getId(), " 审批人为空");
+                } else if (nobody == ApprovalNobodyEnum.REFUSE) {
+                    flowTaskService.autoRefuse(entity.getId(), " 审批人为空");
+                }
+                return;
             }
-            return;
         }
 
         // 消息通知

+ 1 - 1
flow-workflow/flow-workflow-biz/src/main/java/com/flow/service/impl/FlowActivityServiceImpl.java

@@ -65,7 +65,7 @@ public class FlowActivityServiceImpl extends BaseServiceImpl<FlowActivityDao, Fl
                 entity.getTaskDefinitionKey(),
                 ApprovalNode.class
         );
-        ApprovalMultiEnum multi = approvalNode.getMulti();
+        ApprovalMultiEnum multi = Objects.nonNull(approvalNode) ? approvalNode.getMulti() : ApprovalMultiEnum.SEQUENTIAL;
         // 日志
         FlowActivity flowActivity = new FlowActivity();
         String executionId = entity.getExecutionId();

+ 6 - 9
flow-workflow/flow-workflow-biz/src/main/java/com/flow/service/impl/FlowTaskServiceImpl.java

@@ -15,10 +15,7 @@ import com.flow.entity.FlowActivity;
 import com.flow.entity.FlowDefine;
 import com.flow.entity.FlowInstance;
 import com.flow.entity.FlowTask;
-import com.flow.entity.node.ApprovalNode;
-import com.flow.entity.node.FormProperty;
-import com.flow.entity.node.Node;
-import com.flow.entity.node.StartTaskNode;
+import com.flow.entity.node.*;
 import com.flow.enums.ProcessStatus;
 import com.flow.model.*;
 import com.flow.service.FlowActivityService;
@@ -98,9 +95,9 @@ public class FlowTaskServiceImpl extends BaseServiceImpl<FlowTaskDao, FlowTask>
         }
         Map<String, Object> variables = this.getVariables(task.getId());
         ApprovalNode approvalNode = flowDefine.getNode(task.getTaskDefinitionKey(), ApprovalNode.class);
-        StartTaskNode startTaskNode = flowDefine.getNode(task.getTaskDefinitionKey(), StartTaskNode.class);
-        List<FormProperty> formProperties = Objects.nonNull(approvalNode) ? approvalNode.getFormProperties() : startTaskNode.getFormProperties();
-        Map<String, Boolean> operations = Objects.nonNull(approvalNode) ? approvalNode.getOperations() : startTaskNode.getOperations();
+        StartNode startNode = flowDefine.getNode(task.getTaskDefinitionKey(), StartNode.class);
+        List<FormProperty> formProperties = Objects.nonNull(approvalNode) ? approvalNode.getFormProperties() : startNode.getFormProperties();
+        Map<String, Boolean> operations = Objects.nonNull(approvalNode) ? approvalNode.getOperations() : startNode.getOperations();
         FormInfo formInfo = new FormInfo(
                 flowDefine,
                 formProperties,
@@ -203,13 +200,13 @@ public class FlowTaskServiceImpl extends BaseServiceImpl<FlowTaskDao, FlowTask>
                 .oneOpt();
         if (optional.isPresent()) {
             FlowDefine define = flowDefineService.getDefine(task.getProcessDefinitionId());
-            ApprovalNode approvalNode = define.getNode(taskForm.getTargetNode(), ApprovalNode.class);
+            Node node = define.getNode(taskForm.getTargetNode(), Node.class);
             FlowActivity flowActivity = optional.get();
             List<Comment> comments = Optional.ofNullable(flowActivity.getComment()).orElse(Lists.newArrayList());
             Comment comment = new Comment();
             comment.setUserId(SecurityContextUtil.getUserId());
             comment.setTime(LocalDateTime.now());
-            comment.setContent(String.format("<span>退回至 <span class='color-error'>%s</span></span>", approvalNode.getName()));
+            comment.setContent(String.format("<span>退回至 <span class='color-error'>%s</span></span>", node.getName()));
             comment.setAttachments(Lists.newArrayList());
             comments.add(comment);
             flowActivity.setComment(comments);

+ 1 - 1
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/FlowDefine.java

@@ -140,7 +140,7 @@ public class FlowDefine extends BaseEntity {
             if (type.isInstance(node)) {
                 return type.cast(node);
             } else {
-                throw new BaseException("节点类型不匹配");
+                return null;
             }
         }
         return null;

+ 1 - 1
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/Node.java

@@ -22,7 +22,7 @@ import java.util.stream.Collectors;
 @Data
 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl = Node.class, visible = true)
 @JsonSubTypes({
-        @JsonSubTypes.Type(value = StartTaskNode.class, name = NodeTypeConstant.START),
+        @JsonSubTypes.Type(value = StartNode.class, name = NodeTypeConstant.START),
         @JsonSubTypes.Type(value = CcNode.class, name = NodeTypeConstant.CC),
         @JsonSubTypes.Type(value = ApprovalNode.class, name = NodeTypeConstant.APPROVAL),
         @JsonSubTypes.Type(value = ConditionNode.class, name = NodeTypeConstant.CONDITION),

+ 24 - 8
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/StartNode.java

@@ -6,35 +6,51 @@ import lombok.EqualsAndHashCode;
 import org.flowable.bpmn.model.FlowElement;
 import org.flowable.bpmn.model.SequenceFlow;
 import org.flowable.bpmn.model.StartEvent;
+import org.flowable.bpmn.model.UserTask;
 
 import java.util.ArrayList;
+import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Objects;
+import java.util.Map;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
 public class StartNode extends Node {
     // 表单属性
     private List<FormProperty> formProperties = new ArrayList<>();
+    // 操作权限
+    private Map<String, Boolean> operations = new LinkedHashMap<>();
 
     @Override
     public List<FlowElement> convert() {
         ArrayList<FlowElement> elements = Lists.newArrayList();
         // 开始节点
         StartEvent startEvent = new StartEvent();
-        startEvent.setId(this.getId());
+        String startId = "node_start";
+        startEvent.setId(startId);
         startEvent.setName(this.getName());
         startEvent.setExecutionListeners(this.buidEventListener());
         elements.add(startEvent);
         // 下一个节点的连线
-        Node child = this.getChild();
-        SequenceFlow sequenceFlow = this.buildSequence(child);
+        SequenceFlow sequenceFlow = new SequenceFlow();
+        sequenceFlow.setId(String.format("%s-%s", startId, this.getId()));
+        sequenceFlow.setSourceRef(startId);
+        sequenceFlow.setTargetRef(this.getId());
         elements.add(sequenceFlow);
+        // 发起人用户任务
+        UserTask userTask = new UserTask();
+        userTask.setId(this.getId());
+        userTask.setName("发起人");
+        userTask.setAssignee("${initiator}");
+        userTask.setSkipExpression("${_SKIP_INITIATOR == true}");
+        elements.add(userTask);
+        // 下一个节点的连线
+        Node child = this.getChild();
+        SequenceFlow sequence = this.buildSequence(child);
+        elements.add(sequence);
         // 下一个节点
-        if (Objects.nonNull(child)) {
-            List<FlowElement> flowElements = child.convert();
-            elements.addAll(flowElements);
-        }
+        List<FlowElement> flowElements = child.convert();
+        elements.addAll(flowElements);
         return elements;
     }
 }