From 69e3afc7707d467b758858b52d3784947f7a502b Mon Sep 17 00:00:00 2001
From: 疯狂的狮子Li <15040126243@163.com>
Date: 星期一, 20 五月 2024 10:25:23 +0800
Subject: [PATCH] !538 ♥️发布 5.2.0-BETA 公测版本 Merge pull request !538 from 疯狂的狮子Li/dev

---
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java |  141 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 141 insertions(+), 0 deletions(-)

diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java
new file mode 100644
index 0000000..0992f6f
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java
@@ -0,0 +1,141 @@
+package org.dromara.workflow.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.workflow.domain.WfTaskBackNode;
+import org.dromara.workflow.domain.vo.MultiInstanceVo;
+import org.dromara.workflow.mapper.WfTaskBackNodeMapper;
+import org.dromara.workflow.service.IWfTaskBackNodeService;
+import org.dromara.workflow.utils.WorkflowUtils;
+import org.flowable.task.api.Task;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.dromara.workflow.common.constant.FlowConstant.MULTI_INSTANCE;
+import static org.dromara.workflow.common.constant.FlowConstant.USER_TASK;
+
+
+/**
+ * 鑺傜偣椹冲洖璁板綍Service涓氬姟灞傚鐞�
+ *
+ * @author may
+ * @date 2024-03-13
+ */
+@RequiredArgsConstructor
+@Service
+public class WfTaskBackNodeServiceImpl implements IWfTaskBackNodeService {
+
+    private final WfTaskBackNodeMapper wfTaskBackNodeMapper;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void recordExecuteNode(Task task) {
+        List<WfTaskBackNode> list = getListByInstanceId(task.getProcessInstanceId());
+        WfTaskBackNode wfTaskBackNode = new WfTaskBackNode();
+        wfTaskBackNode.setNodeId(task.getTaskDefinitionKey());
+        wfTaskBackNode.setNodeName(task.getName());
+        wfTaskBackNode.setInstanceId(task.getProcessInstanceId());
+        wfTaskBackNode.setAssignee(String.valueOf(LoginHelper.getUserId()));
+        MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey());
+        if (ObjectUtil.isNotEmpty(multiInstance)) {
+            wfTaskBackNode.setTaskType(MULTI_INSTANCE);
+        } else {
+            wfTaskBackNode.setTaskType(USER_TASK);
+        }
+        if (CollUtil.isEmpty(list)) {
+            wfTaskBackNode.setOrderNo(0);
+            wfTaskBackNodeMapper.insert(wfTaskBackNode);
+        } else {
+            WfTaskBackNode taskNode = list.stream().filter(e -> e.getNodeId().equals(wfTaskBackNode.getNodeId()) && e.getOrderNo() == 0).findFirst().orElse(null);
+            if (ObjectUtil.isEmpty(taskNode)) {
+                wfTaskBackNode.setOrderNo(list.get(0).getOrderNo() + 1);
+                WfTaskBackNode node = getListByInstanceIdAndNodeId(wfTaskBackNode.getInstanceId(), wfTaskBackNode.getNodeId());
+                if (ObjectUtil.isNotEmpty(node)) {
+                    node.setAssignee(node.getAssignee() + StringUtils.SEPARATOR + LoginHelper.getUserId());
+                    wfTaskBackNodeMapper.updateById(node);
+                } else {
+                    wfTaskBackNodeMapper.insert(wfTaskBackNode);
+                }
+            }
+        }
+    }
+
+    @Override
+    public List<WfTaskBackNode> getListByInstanceId(String processInstanceId) {
+        LambdaQueryWrapper<WfTaskBackNode> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId);
+        wrapper.orderByDesc(WfTaskBackNode::getOrderNo);
+        return wfTaskBackNodeMapper.selectList(wrapper);
+    }
+
+    @Override
+    public WfTaskBackNode getListByInstanceIdAndNodeId(String processInstanceId, String nodeId) {
+        LambdaQueryWrapper<WfTaskBackNode> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId);
+        queryWrapper.eq(WfTaskBackNode::getNodeId, nodeId);
+        return wfTaskBackNodeMapper.selectOne(queryWrapper);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean deleteBackTaskNode(String processInstanceId, String targetActivityId) {
+        try {
+            LambdaQueryWrapper<WfTaskBackNode> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId);
+            queryWrapper.eq(WfTaskBackNode::getNodeId, targetActivityId);
+            WfTaskBackNode actTaskNode = wfTaskBackNodeMapper.selectOne(queryWrapper);
+            if (ObjectUtil.isNotNull(actTaskNode)) {
+                Integer orderNo = actTaskNode.getOrderNo();
+                List<WfTaskBackNode> taskNodeList = getListByInstanceId(processInstanceId);
+                List<Long> ids = new ArrayList<>();
+                if (CollUtil.isNotEmpty(taskNodeList)) {
+                    for (WfTaskBackNode taskNode : taskNodeList) {
+                        if (taskNode.getOrderNo() >= orderNo) {
+                            ids.add(taskNode.getId());
+                        }
+                    }
+                }
+                if (CollUtil.isNotEmpty(ids)) {
+                    wfTaskBackNodeMapper.deleteBatchIds(ids);
+                }
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ServiceException("鍒犻櫎澶辫触");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean deleteByInstanceId(String processInstanceId) {
+        LambdaQueryWrapper<WfTaskBackNode> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId);
+        List<WfTaskBackNode> list = wfTaskBackNodeMapper.selectList(wrapper);
+        int delete = wfTaskBackNodeMapper.delete(wrapper);
+        if (list.size() != delete) {
+            throw new ServiceException("鍒犻櫎澶辫触");
+        }
+        return true;
+    }
+
+    @Override
+    public boolean deleteByInstanceIds(List<String> processInstanceIds) {
+        LambdaQueryWrapper<WfTaskBackNode> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(WfTaskBackNode::getInstanceId, processInstanceIds);
+        List<WfTaskBackNode> list = wfTaskBackNodeMapper.selectList(wrapper);
+        int delete = wfTaskBackNodeMapper.delete(wrapper);
+        if (list.size() != delete) {
+            throw new ServiceException("鍒犻櫎澶辫触");
+        }
+        return true;
+    }
+}

--
Gitblit v1.9.3