From 9b540b646aa7171d3d3ba707457b86445dc71dc7 Mon Sep 17 00:00:00 2001
From: liyj <1003249715@qq.com>
Date: Mon, 09 Sep 2024 20:04:23 +0800
Subject: [PATCH] 1、事件流转相关接口优化

---
 dyh-service/dyh-mediate/src/main/java/cn/huge/module/flow/service/FlowInfoService.java |  144 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 144 insertions(+), 0 deletions(-)

diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/flow/service/FlowInfoService.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/flow/service/FlowInfoService.java
index 7cb9355..4ea5a47 100644
--- a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/flow/service/FlowInfoService.java
+++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/flow/service/FlowInfoService.java
@@ -2,11 +2,24 @@
 
 import cn.huge.base.common.exception.ServiceException;
 import cn.huge.base.common.utils.DateUtils;
+import cn.huge.base.common.utils.FieldUtils;
 import cn.huge.base.common.utils.IdUtils;
+import cn.huge.base.common.utils.ObjectUtils;
 import cn.huge.module.client.api.impl.UtilsClientImpl;
 import cn.huge.module.flow.dao.mapper.FlowInfoMapper;
 import cn.huge.module.flow.domain.po.FlowInfo;
+import cn.huge.module.flow.domain.po.FlowNode;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Maps;
+import org.apache.commons.collections.CollectionUtils;
+import org.flowable.engine.HistoryService;
+import org.flowable.engine.RepositoryService;
+import org.flowable.engine.RuntimeService;
+import org.flowable.engine.TaskService;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import lombok.extern.slf4j.Slf4j;
@@ -38,7 +51,18 @@
     private FlowInfoMapper mapper;
 
     @Autowired
+    private FlowNodeService flowNodeService;
+    @Autowired
     private UtilsClientImpl utilsClient;
+
+    @Autowired
+    private RuntimeService runtimeService;
+    @Autowired
+    private TaskService taskService;
+    @Autowired
+    private HistoryService historyService;
+    @Autowired
+    private RepositoryService repositoryService;
 
     /**
     * 更新对象
@@ -130,4 +154,124 @@
         }
     }
 
+    /**
+     * 封装任务节点
+     * @param flowableId 流程定义编号
+     * @param task 流程任务
+     * @return FlowNodeBaseDTO
+     */
+    public FlowNode getFlowNode(String flowableId, Task task){
+        // 封装任务节点
+        FlowNode flowNode = null;
+        if (ObjectUtils.isNotEmpty(task)) {
+            flowNode = flowNodeService.listByFlowAndNode(flowableId, task.getTaskDefinitionKey());
+            if (ObjectUtils.isNotEmpty(flowNode)) {
+                flowNode.setProcessInstanceId(task.getProcessInstanceId());
+                flowNode.setProcessTaskId(task.getId());
+            }
+        }
+        return flowNode;
+    }
+
+    /**
+     * 单节点业务操作-根据流程编号启动流程
+     * @param flowableId 流程定义编号
+     * @param businessId 业务编号
+     * @return FlowNodeBaseDTO
+     */
+    public FlowNode startFlow(String flowableId, String businessId) {
+        try {
+            // 启动任务
+            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(flowableId, businessId);
+            Task nextTask = getTaskByProcdefId(processInstance.getId());
+            // 封装任务节点
+            FlowNode flowNode = this.getFlowNode(flowableId, nextTask);
+            return flowNode;
+        }catch (Exception e){
+            log.error("service方法[FlowInfoService.startFlow]调用异常:"+e, e);
+            throw new ServiceException("FlowInfoService.startFlow", e);
+        }
+    }
+
+    /**
+     * 单节点业务操作-通过当前任务编号完成当前任务
+     * @param flowableId 流程定义编号
+     * @param taskId 任务编号
+     * @param operation 操作调解
+     * @param handlerUserId 任务执行者
+     * @return FlowNodeBaseDTO
+     */
+    public FlowNode completeTask(String flowableId, String taskId, String operation, String handlerUserId) {
+        try{
+            Task task = findTaskById(taskId);
+            task.setAssignee(handlerUserId);
+            Map flowParam = Maps.newHashMap();
+            flowParam.put("operation", operation);
+            taskService.complete(task.getId(), flowParam);
+            Task nextTask = getTaskByProcdefId(task.getProcessInstanceId());
+            FlowNode flowNode = this.getFlowNode(flowableId, nextTask);
+            return flowNode;
+        }catch (Exception e){
+            log.error("service方法[FlowInfoService.completeByTaskId]调用异常:"+e, e);
+            throw new ServiceException("FlowInfoService.completeByTaskId", e);
+        }
+    }
+
+    /**
+     * 单节点业务操作-任务指定人员
+     * @param taskId 任务编号
+     * @param handlerUserId 任务候选人
+     */
+    public void appointTaskOwner(String taskId, String handlerUserId) {
+        try{
+            Task task = findTaskById(taskId);
+            taskService.addCandidateUser(task.getId(), handlerUserId);
+        }catch (Exception e){
+            log.error("service方法[FlowInfoService.appointTaskOwner]调用异常:"+e, e);
+            throw new ServiceException("FlowInfoService.appointTaskOwner", e);
+        }
+    }
+
+    /**
+     * 根据流程实例Id获取任务
+     * @param processInstanceId 流程实例Id
+     * @return Task
+     */
+    public Task getTaskByProcdefId(String processInstanceId){
+        Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
+        return task;
+    }
+
+    /**
+     * 根据任务ID,获取任务
+     * @param taskId 任务ID
+     * @return Task
+     */
+    public Task findTaskById(String taskId) {
+        return taskService.createTaskQuery().taskId(taskId).singleResult();
+    }
+
+    /**
+     * 根据流程实例Id获取当前所有任务
+     * @param processInstanceId 流程示例编号
+     * @return List<Task>
+     */
+    public List<Task> getTaskByProcdefIds(String processInstanceId){
+        List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstanceId).list();
+        return tasks;
+    }
+
+    /**
+     * 结束流程
+     * @param processInstanceId 流程示例编号
+     */
+    public void endFlow(String processInstanceId) {
+        try{
+            runtimeService.deleteProcessInstance(processInstanceId,"");
+        }catch (Exception e){
+            log.error("service方法[FlowInfoService.endFlow]调用异常:"+e, e);
+            throw new ServiceException("FlowInfoService.endFlow", e);
+        }
+    }
+
 }

--
Gitblit v1.8.0