From fb337f57b86ebf3f19beb7b2ac840bb295b17ee0 Mon Sep 17 00:00:00 2001
From: gssong <1742057357@qq.com>
Date: 星期二, 12 三月 2024 21:38:26 +0800
Subject: [PATCH] fix 修复办理后可能出现办理人为空

---
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java |  186 +++++++++++++++++++++++-----------------------
 1 files changed, 94 insertions(+), 92 deletions(-)

diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java
index 440d43c..ecbb405 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java
@@ -3,7 +3,6 @@
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -23,6 +22,7 @@
 import org.dromara.workflow.domain.bo.*;
 import org.dromara.workflow.domain.vo.MultiInstanceVo;
 import org.dromara.workflow.domain.vo.TaskVo;
+import org.dromara.workflow.domain.vo.VariableVo;
 import org.dromara.workflow.domain.vo.WfCopy;
 import org.dromara.workflow.flowable.cmd.*;
 import org.dromara.workflow.flowable.strategy.FlowEventStrategy;
@@ -44,8 +44,8 @@
 import org.flowable.task.api.Task;
 import org.flowable.task.api.TaskQuery;
 import org.flowable.task.api.history.HistoricTaskInstance;
-import org.flowable.task.api.history.HistoricTaskInstanceQuery;
 import org.flowable.task.service.impl.persistence.entity.TaskEntity;
+import org.flowable.variable.api.persistence.entity.VariableInstance;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -53,8 +53,7 @@
 import java.util.*;
 import java.util.stream.Collectors;
 
-import static org.dromara.workflow.common.constant.FlowConstant.FLOWABLE_SKIP_EXPRESSION_ENABLED;
-import static org.dromara.workflow.common.constant.FlowConstant.INITIATOR;
+import static org.dromara.workflow.common.constant.FlowConstant.*;
 
 /**
  * 浠诲姟 鏈嶅姟灞傚疄鐜�
@@ -96,7 +95,7 @@
             if (CollUtil.isNotEmpty(startProcessBo.getVariables())) {
                 taskService.setVariables(taskResult.get(0).getId(), startProcessBo.getVariables());
             }
-            map.put("processInstanceId", taskResult.get(0).getProcessInstanceId());
+            map.put(PROCESS_INSTANCE_ID, taskResult.get(0).getProcessInstanceId());
             map.put("taskId", taskResult.get(0).getId());
             return map;
         }
@@ -129,7 +128,8 @@
 
         runtimeService.updateBusinessStatus(pi.getProcessInstanceId(), BusinessStatusEnum.DRAFT.getStatus());
         taskService.setAssignee(taskList.get(0).getId(), LoginHelper.getUserId().toString());
-        taskService.setVariable(taskList.get(0).getId(), "processInstanceId", pi.getProcessInstanceId());
+        taskService.setVariable(taskList.get(0).getId(), PROCESS_INSTANCE_ID, pi.getProcessInstanceId());
+        taskService.setVariable(taskList.get(0).getId(), BUSINESS_KEY, pi.getBusinessKey());
         map.put("processInstanceId", pi.getProcessInstanceId());
         map.put("taskId", taskList.get(0).getId());
         return map;
@@ -187,6 +187,7 @@
             //鍔炵悊鎰忚
             taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "鍚屾剰" : completeTaskBo.getMessage());
             //鍔炵悊浠诲姟
+            taskService.setAssignee(task.getId(),userId);
             if (CollUtil.isNotEmpty(completeTaskBo.getVariables())) {
                 taskService.complete(completeTaskBo.getTaskId(), completeTaskBo.getVariables());
             } else {
@@ -236,19 +237,18 @@
      * @param taskBo 鍙傛暟
      */
     @Override
-    public TableDataInfo<TaskVo> getTaskWaitByPage(TaskBo taskBo) {
-        PageQuery pageQuery = new PageQuery();
-        pageQuery.setPageNum(taskBo.getPageNum());
-        pageQuery.setPageSize(taskBo.getPageSize());
+    public TableDataInfo<TaskVo> getPageByTaskWait(TaskBo taskBo, PageQuery pageQuery) {
         QueryWrapper<TaskVo> queryWrapper = new QueryWrapper<>();
         List<RoleDTO> roles = LoginHelper.getLoginUser().getRoles();
+        List<String> roleIds = StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId()));
         String userId = String.valueOf(LoginHelper.getUserId());
         queryWrapper.eq("t.business_status_", BusinessStatusEnum.WAITING.getStatus());
         queryWrapper.eq(TenantHelper.isEnable(), "t.tenant_id_", TenantHelper.getTenantId());
         queryWrapper.and(w1 ->
             w1.eq("t.assignee_", userId)
                 .or(w2 -> w2.isNull("t.assignee_")
-                    .and(w3 -> w3.eq("t.user_id_", userId).or().in("t.group_id_", StreamUtils.toList(roles, RoleDTO::getRoleId))))
+                    .apply("exists ( select LINK.ID_ from ACT_RU_IDENTITYLINK LINK where LINK.TASK_ID_ = t.ID_ and LINK.TYPE_ = 'candidate' " +
+                        "and (LINK.USER_ID_ = {0} or ( LINK.GROUP_ID_ IN " + getInParam(roleIds) + " ) ))", userId))
         );
         if (StringUtils.isNotBlank(taskBo.getName())) {
             queryWrapper.like("t.name_", taskBo.getName());
@@ -270,13 +270,26 @@
         return new TableDataInfo<>(taskList, page.getTotal());
     }
 
+    private String getInParam(List<String> param) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("(");
+        for (int i = 0; i < param.size(); i++) {
+            sb.append("'").append(param.get(i)).append("'");
+            if (i != param.size() - 1) {
+                sb.append(",");
+            }
+        }
+        sb.append(")");
+        return sb.toString();
+    }
+
     /**
      * 鏌ヨ褰撳墠绉熸埛鎵�鏈夊緟鍔炰换鍔�
      *
      * @param taskBo 鍙傛暟
      */
     @Override
-    public TableDataInfo<TaskVo> getAllTaskWaitByPage(TaskBo taskBo) {
+    public TableDataInfo<TaskVo> getPageByAllTaskWait(TaskBo taskBo, PageQuery pageQuery) {
         TaskQuery query = QueryUtils.taskQuery();
         if (StringUtils.isNotBlank(taskBo.getName())) {
             query.taskNameLike("%" + taskBo.getName() + "%");
@@ -288,7 +301,7 @@
             query.processDefinitionKey(taskBo.getProcessDefinitionKey());
         }
         query.orderByTaskCreateTime().desc();
-        List<Task> taskList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize());
+        List<Task> taskList = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize());
         List<ProcessInstance> processInstanceList = null;
         if (CollUtil.isNotEmpty(taskList)) {
             Set<String> processInstanceIds = StreamUtils.toSet(taskList, Task::getProcessInstanceId);
@@ -320,41 +333,20 @@
      * @param taskBo 鍙傛暟
      */
     @Override
-    public TableDataInfo<TaskVo> getTaskFinishByPage(TaskBo taskBo) {
+    public TableDataInfo<TaskVo> getPageByTaskFinish(TaskBo taskBo, PageQuery pageQuery) {
         String userId = String.valueOf(LoginHelper.getUserId());
-        HistoricTaskInstanceQuery query = QueryUtils.hisTaskInstanceQuery();
-        query.taskAssignee(userId).finished().orderByHistoricTaskInstanceStartTime().desc();
-        if (StringUtils.isNotBlank(taskBo.getName())) {
-            query.taskNameLike("%" + taskBo.getName() + "%");
+        QueryWrapper<TaskVo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.like(StringUtils.isNotBlank(taskBo.getName()), "t.name_", taskBo.getName());
+        queryWrapper.like(StringUtils.isNotBlank(taskBo.getProcessDefinitionName()), "t.processDefinitionName", taskBo.getProcessDefinitionName());
+        queryWrapper.eq(StringUtils.isNotBlank(taskBo.getProcessDefinitionKey()), "t.processDefinitionKey", taskBo.getProcessDefinitionKey());
+        queryWrapper.eq("t.assignee_", userId);
+        Page<TaskVo> page = actTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper);
+
+        List<TaskVo> taskList = page.getRecords();
+        for (TaskVo task : taskList) {
+            task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus()));
         }
-        if (StringUtils.isNotBlank(taskBo.getProcessDefinitionName())) {
-            query.processDefinitionNameLike("%" + taskBo.getProcessDefinitionName() + "%");
-        }
-        if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) {
-            query.processDefinitionKey(taskBo.getProcessDefinitionKey());
-        }
-        List<HistoricTaskInstance> taskInstanceList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize());
-        List<HistoricProcessInstance> historicProcessInstanceList = null;
-        if (CollUtil.isNotEmpty(taskInstanceList)) {
-            Set<String> processInstanceIds = StreamUtils.toSet(taskInstanceList, HistoricTaskInstance::getProcessInstanceId);
-            historicProcessInstanceList = QueryUtils.hisInstanceQuery(processInstanceIds).list();
-        }
-        List<TaskVo> list = new ArrayList<>();
-        for (HistoricTaskInstance task : taskInstanceList) {
-            TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class);
-            if (CollUtil.isNotEmpty(historicProcessInstanceList)) {
-                historicProcessInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> {
-                    taskVo.setBusinessStatus(e.getBusinessStatus());
-                    taskVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(taskVo.getBusinessStatus()));
-                    taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey());
-                    taskVo.setProcessDefinitionName(e.getProcessDefinitionName());
-                });
-            }
-            taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null);
-            list.add(taskVo);
-        }
-        long count = query.count();
-        return new TableDataInfo<>(list, count);
+        return new TableDataInfo<>(taskList, page.getTotal());
     }
 
     /**
@@ -363,10 +355,7 @@
      * @param taskBo 鍙傛暟
      */
     @Override
-    public TableDataInfo<TaskVo> getTaskCopyByPage(TaskBo taskBo) {
-        PageQuery pageQuery = new PageQuery();
-        pageQuery.setPageNum(taskBo.getPageNum());
-        pageQuery.setPageSize(taskBo.getPageSize());
+    public TableDataInfo<TaskVo> getPageByTaskCopy(TaskBo taskBo, PageQuery pageQuery) {
         QueryWrapper<TaskVo> queryWrapper = new QueryWrapper<>();
         String userId = String.valueOf(LoginHelper.getUserId());
         if (StringUtils.isNotBlank(taskBo.getName())) {
@@ -384,7 +373,6 @@
         List<TaskVo> taskList = page.getRecords();
         for (TaskVo task : taskList) {
             task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus()));
-            task.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null);
         }
         return new TableDataInfo<>(taskList, page.getTotal());
     }
@@ -395,40 +383,18 @@
      * @param taskBo 鍙傛暟
      */
     @Override
-    public TableDataInfo<TaskVo> getAllTaskFinishByPage(TaskBo taskBo) {
-        HistoricTaskInstanceQuery query = QueryUtils.hisTaskInstanceQuery();
-        query.finished().orderByHistoricTaskInstanceStartTime().desc();
-        if (StringUtils.isNotBlank(taskBo.getName())) {
-            query.taskNameLike("%" + taskBo.getName() + "%");
+    public TableDataInfo<TaskVo> getPageByAllTaskFinish(TaskBo taskBo, PageQuery pageQuery) {
+        QueryWrapper<TaskVo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.like(StringUtils.isNotBlank(taskBo.getName()), "t.name_", taskBo.getName());
+        queryWrapper.like(StringUtils.isNotBlank(taskBo.getProcessDefinitionName()), "t.processDefinitionName", taskBo.getProcessDefinitionName());
+        queryWrapper.eq(StringUtils.isNotBlank(taskBo.getProcessDefinitionKey()), "t.processDefinitionKey", taskBo.getProcessDefinitionKey());
+        Page<TaskVo> page = actTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper);
+
+        List<TaskVo> taskList = page.getRecords();
+        for (TaskVo task : taskList) {
+            task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus()));
         }
-        if (StringUtils.isNotBlank(taskBo.getProcessDefinitionName())) {
-            query.processDefinitionNameLike("%" + taskBo.getProcessDefinitionName() + "%");
-        }
-        if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) {
-            query.processDefinitionKey(taskBo.getProcessDefinitionKey());
-        }
-        List<HistoricTaskInstance> taskInstanceList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize());
-        List<HistoricProcessInstance> historicProcessInstanceList = null;
-        if (CollUtil.isNotEmpty(taskInstanceList)) {
-            Set<String> processInstanceIds = StreamUtils.toSet(taskInstanceList, HistoricTaskInstance::getProcessInstanceId);
-            historicProcessInstanceList = QueryUtils.hisInstanceQuery(processInstanceIds).list();
-        }
-        List<TaskVo> list = new ArrayList<>();
-        for (HistoricTaskInstance task : taskInstanceList) {
-            TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class);
-            if (CollUtil.isNotEmpty(historicProcessInstanceList)) {
-                historicProcessInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> {
-                    taskVo.setBusinessStatus(e.getBusinessStatus());
-                    taskVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(taskVo.getBusinessStatus()));
-                    taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey());
-                    taskVo.setProcessDefinitionName(e.getProcessDefinitionName());
-                });
-            }
-            taskVo.setAssignee(Convert.toLong(task.getAssignee()));
-            list.add(taskVo);
-        }
-        long count = query.count();
-        return new TableDataInfo<>(list, count);
+        return new TableDataInfo<>(taskList, page.getTotal());
     }
 
     /**
@@ -479,10 +445,8 @@
             throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED);
         }
         HistoricProcessInstance historicProcessInstance = QueryUtils.hisInstanceQuery()
-            .processInstanceBusinessKey(task.getProcessInstanceId()).singleResult();
-        if (ObjectUtil.isNotEmpty(historicProcessInstance) && BusinessStatusEnum.TERMINATION.getStatus().equals(historicProcessInstance.getBusinessStatus())) {
-            throw new ServiceException("璇ュ崟鎹凡缁堟锛�");
-        }
+            .processInstanceId(task.getProcessInstanceId()).singleResult();
+        BusinessStatusEnum.checkInvalidStatus(historicProcessInstance.getBusinessStatus());
         try {
             if (StringUtils.isBlank(terminationBo.getComment())) {
                 terminationBo.setComment(LoginHelper.getLoginUser().getNickname() + "缁堟浜嗙敵璇�");
@@ -496,9 +460,9 @@
                 if (CollectionUtil.isNotEmpty(subTasks)) {
                     subTasks.forEach(e -> taskService.deleteTask(e.getId()));
                 }
+                runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.TERMINATION.getStatus());
                 runtimeService.deleteProcessInstance(task.getProcessInstanceId(), StrUtil.EMPTY);
             }
-            runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.TERMINATION.getStatus());
             FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(historicProcessInstance.getProcessDefinitionKey());
             if (processHandler != null) {
                 processHandler.handleProcess(historicProcessInstance.getBusinessKey(), BusinessStatusEnum.TERMINATION.getStatus(), false);
@@ -657,9 +621,7 @@
             ExecutionChildByExecutionIdCmd childByExecutionIdCmd = new ExecutionChildByExecutionIdCmd(task.getExecutionId());
             List<ExecutionEntity> executionEntities = managementService.executeCommand(childByExecutionIdCmd);
             //鏍¢獙鍗曟嵁
-            if (BusinessStatusEnum.BACK.getStatus().equals(processInstance.getBusinessStatus())) {
-                throw new ServiceException("璇ュ崟鎹凡閫�鍥烇紒");
-            }
+            BusinessStatusEnum.checkBackStatus(processInstance.getBusinessStatus());
             //鍒ゆ柇鏄惁鏈夊涓换鍔�
             List<Task> taskList = QueryUtils.taskQuery(processInstanceId).list();
             //鐢宠浜鸿妭鐐�
@@ -715,4 +677,44 @@
         }
         return true;
     }
+
+    /**
+     * 鏌ヨ娴佺▼鍙橀噺
+     *
+     * @param taskId 浠诲姟id
+     */
+    @Override
+    public List<VariableVo> getInstanceVariable(String taskId) {
+        List<VariableVo> variableVoList = new ArrayList<>();
+        Map<String, VariableInstance> variableInstances = taskService.getVariableInstances(taskId);
+        if (CollectionUtil.isNotEmpty(variableInstances)) {
+            for (Map.Entry<String, VariableInstance> entry : variableInstances.entrySet()) {
+                VariableVo variableVo = new VariableVo();
+                variableVo.setKey(entry.getKey());
+                variableVo.setValue(entry.getValue().getValue().toString());
+                variableVoList.add(variableVo);
+            }
+        }
+        return variableVoList;
+    }
+
+    /**
+     * 鑾峰彇鍙┏鍥炲緱浠诲姟鑺傜偣
+     *
+     * @param processInstanceId 娴佺▼瀹炰緥id
+     */
+    @Override
+    public Set<TaskVo> getTaskNodeList(String processInstanceId) {
+        Set<TaskVo> list = new HashSet<>();
+        List<HistoricTaskInstance> historicTaskInstances = QueryUtils.hisTaskInstanceQuery(processInstanceId).orderByHistoricTaskInstanceEndTime().desc().list();
+        for (HistoricTaskInstance historicTaskInstance : historicTaskInstances) {
+            if (historicTaskInstance.getEndTime() != null) {
+                TaskVo taskVo = new TaskVo();
+                taskVo.setName(historicTaskInstance.getName());
+                taskVo.setTaskDefinitionKey(historicTaskInstance.getTaskDefinitionKey());
+                list.add(taskVo);
+            }
+        }
+        return list;
+    }
 }

--
Gitblit v1.9.3