فهرست منبع

update 升级warm-flow1.7.0
update 调整流程撤销
remove 删除无用代码

gssong 1 سال پیش
والد
کامیت
5a8dc8e1cf

+ 1 - 1
pom.xml

@@ -49,7 +49,7 @@
         <!-- 面向运行时的D-ORM依赖 -->
         <anyline.version>8.7.2-20250101</anyline.version>
         <!--工作流配置-->
-        <warm-flow.version>1.6.10</warm-flow.version>
+        <warm-flow.version>1.7.0</warm-flow.version>
 
         <!-- 插件版本 -->
         <maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>

+ 6 - 14
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java

@@ -1,9 +1,11 @@
 package org.dromara.workflow.service;
 
+import org.dromara.warm.flow.core.entity.Instance;
 import org.dromara.warm.flow.core.entity.User;
 import org.dromara.warm.flow.core.service.UserService;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -48,17 +50,6 @@ public interface IFlwCommonService {
      */
     void sendMessage(String flowName, Long instId, List<String> messageType, String message);
 
-    /**
-     * 驳回
-     *
-     * @param message        审批意见
-     * @param instanceId     流程实例id
-     * @param targetNodeCode 目标节点
-     * @param flowStatus     流程状态
-     * @param flowHisStatus  节点操作状态
-     */
-    void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus);
-
     /**
      * 申请人节点编码
      *
@@ -68,9 +59,10 @@ public interface IFlwCommonService {
     String applyNodeCode(Long definitionId);
 
     /**
-     * 删除运行中的任务
+     * 合并变量
      *
-     * @param taskIds 任务id
+     * @param instance 流程实例
+     * @param variable 变量
      */
-    void deleteRunTask(List<Long> taskIds);
+    void mergeVariable(Instance instance, Map<String, Object> variable);
 }

+ 9 - 47
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java

@@ -12,8 +12,9 @@ import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mail.utils.MailUtils;
 import org.dromara.common.sse.dto.SseMessageDto;
 import org.dromara.common.sse.utils.SseMessageUtils;
+import org.dromara.warm.flow.core.FlowEngine;
 import org.dromara.warm.flow.core.constant.ExceptionCons;
-import org.dromara.warm.flow.core.dto.FlowParams;
+import org.dromara.warm.flow.core.entity.Instance;
 import org.dromara.warm.flow.core.entity.Node;
 import org.dromara.warm.flow.core.entity.Task;
 import org.dromara.warm.flow.core.entity.User;
@@ -23,6 +24,7 @@ import org.dromara.warm.flow.core.service.NodeService;
 import org.dromara.warm.flow.core.service.TaskService;
 import org.dromara.warm.flow.core.service.UserService;
 import org.dromara.warm.flow.core.utils.AssertUtil;
+import org.dromara.warm.flow.core.utils.MapUtil;
 import org.dromara.warm.flow.orm.entity.FlowNode;
 import org.dromara.warm.flow.orm.entity.FlowTask;
 import org.dromara.warm.flow.orm.entity.FlowUser;
@@ -177,42 +179,6 @@ public class FlwCommonServiceImpl implements IFlwCommonService {
         }
     }
 
-    /**
-     * 驳回
-     *
-     * @param message        审批意见
-     * @param instanceId     流程实例id
-     * @param targetNodeCode 目标节点
-     * @param flowStatus     流程状态
-     * @param flowHisStatus  节点操作状态
-     */
-    @Override
-    public void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus) {
-        IFlwTaskService flwTaskService = SpringUtils.getBean(IFlwTaskService.class);
-        List<FlowTask> list = flwTaskService.selectByInstId(instanceId);
-        if (CollUtil.isNotEmpty(list)) {
-            List<FlowTask> tasks = StreamUtils.filter(list, e -> e.getNodeCode().equals(targetNodeCode));
-            if (list.size() == tasks.size()) {
-                return;
-            }
-        }
-        for (FlowTask task : list) {
-            List<UserDTO> userList = flwTaskService.currentTaskAllUser(task.getId());
-            FlowParams flowParams = FlowParams.build()
-                .nodeCode(targetNodeCode)
-                .message(message)
-                .skipType(SkipType.PASS.getKey())
-                .flowStatus(flowStatus).hisStatus(flowHisStatus)
-                .ignore(true);
-            //解决会签没权限问题
-            if (CollUtil.isNotEmpty(userList)) {
-                flowParams.handler(userList.get(0).getUserId().toString());
-            }
-            taskService.skip(task.getId(), flowParams);
-        }
-        //解决会签多人审批问题
-        backTask(message, instanceId, targetNodeCode, flowStatus, flowHisStatus);
-    }
 
     /**
      * 申请人节点编码
@@ -231,17 +197,13 @@ public class FlwCommonServiceImpl implements IFlwCommonService {
         return nextNode.getNodeCode();
     }
 
-    /**
-     * 删除运行中的任务
-     *
-     * @param taskIds 任务id
-     */
     @Override
-    public void deleteRunTask(List<Long> taskIds) {
-        if (CollUtil.isEmpty(taskIds)) {
-            return;
+    public void mergeVariable(Instance instance, Map<String, Object> variable) {
+        if (MapUtil.isNotEmpty(variable)) {
+            String variableStr = instance.getVariable();
+            Map<String, Object> deserialize = FlowEngine.jsonConvert.strToMap(variableStr);
+            deserialize.putAll(variable);
+            instance.setVariable(FlowEngine.jsonConvert.objToStr(deserialize));
         }
-        userService.deleteByTaskIds(taskIds);
-        flowTaskMapper.deleteByIds(taskIds);
     }
 }

+ 12 - 15
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java

@@ -19,13 +19,13 @@ import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.satoken.utils.LoginHelper;
-import org.dromara.warm.flow.core.FlowEngine;
 import org.dromara.warm.flow.core.constant.ExceptionCons;
 import org.dromara.warm.flow.core.dto.FlowParams;
 import org.dromara.warm.flow.core.entity.Definition;
 import org.dromara.warm.flow.core.entity.Instance;
 import org.dromara.warm.flow.core.entity.Task;
 import org.dromara.warm.flow.core.enums.NodeType;
+import org.dromara.warm.flow.core.enums.SkipType;
 import org.dromara.warm.flow.core.service.ChartService;
 import org.dromara.warm.flow.core.service.DefService;
 import org.dromara.warm.flow.core.service.InsService;
@@ -185,7 +185,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean deleteByBusinessIds(List<Long> businessIds) {
-        List<FlowInstance> flowInstances = flowInstanceMapper.selectList(new LambdaQueryWrapper<FlowInstance>().in(FlowInstance::getBusinessId, StreamUtils.toList(businessIds,Convert::toStr)));
+        List<FlowInstance> flowInstances = flowInstanceMapper.selectList(new LambdaQueryWrapper<FlowInstance>().in(FlowInstance::getBusinessId, StreamUtils.toList(businessIds, Convert::toStr)));
         if (CollUtil.isEmpty(flowInstances)) {
             log.warn("未找到对应的流程实例信息,无法执行删除操作。");
             return false;
@@ -244,19 +244,16 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
                 throw new ServiceException(ExceptionCons.NOT_FOUNT_DEF);
             }
             String message = bo.getMessage();
+            String userIdStr = LoginHelper.getUserIdStr();
             BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus());
-            String applyNodeCode = flwCommonService.applyNodeCode(definition.getId());
-            //撤销
-            flwCommonService.backTask(message, instance.getId(), applyNodeCode, BusinessStatusEnum.CANCEL.getStatus(), BusinessStatusEnum.CANCEL.getStatus());
-            //判断或签节点是否有多个,只保留一个
-            List<Task> currentTaskList = taskService.list(FlowEngine.newTask().setInstanceId(instance.getId()));
-            if (CollUtil.isNotEmpty(currentTaskList)) {
-                if (currentTaskList.size() > 1) {
-                    currentTaskList.remove(0);
-                    flwCommonService.deleteRunTask(StreamUtils.toList(currentTaskList, Task::getId));
-                }
-            }
-
+            FlowParams flowParams = FlowParams.build()
+                .message(message)
+                .skipType(SkipType.PASS.getKey())
+                .flowStatus(BusinessStatusEnum.CANCEL.getStatus())
+                .hisStatus(BusinessStatusEnum.CANCEL.getStatus())
+                .handler(userIdStr)
+                .ignore(true);
+            taskService.revoke(instance.getId(), flowParams);
         } catch (Exception e) {
             log.error("撤销失败: {}", e.getMessage(), e);
             throw new ServiceException(e.getMessage());
@@ -363,7 +360,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
     public void setVariable(Long instanceId, Map<String, Object> variable) {
         Instance instance = insService.getById(instanceId);
         if (instance != null) {
-            taskService.mergeVariable(instance, variable);
+            flwCommonService.mergeVariable(instance, variable);
             insService.updateById(instance);
         }
     }

+ 3 - 3
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java

@@ -112,7 +112,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
         if (ObjectUtil.isNotNull(flowInstance)) {
             BusinessStatusEnum.checkStartStatus(flowInstance.getFlowStatus());
             List<Task> taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId()));
-            taskService.mergeVariable(flowInstance, variables);
+            flwCommonService.mergeVariable(flowInstance, variables);
             insService.updateById(flowInstance);
             StartProcessReturnDTO dto = new StartProcessReturnDTO();
             dto.setProcessInstanceId(taskList.get(0).getInstanceId());
@@ -217,7 +217,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
                 variableMap.remove(task.getNodeCode());
             }
         }
-        taskService.mergeVariable(inst, variableMap);
+        flwCommonService.mergeVariable(inst, variableMap);
     }
 
     /**
@@ -594,7 +594,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
         nextFlowNodes = StreamUtils.filter(nextFlowNodes, node -> NodeType.BETWEEN.getKey().equals(node.getNodeType()));
         if (CollUtil.isNotEmpty(nextNodeList)) {
             // 构建以下节点数据
-            List<Task> buildNextTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, null));
+            List<Task> buildNextTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, FlowParams.build()));
             // 办理人变量替换
             ExpressionUtil.evalVariable(buildNextTaskList, mergeVariable);
             for (FlowNode flowNode : nextFlowNodes) {