fanxp 1 anno fa
parent
commit
432c4af077

+ 47 - 47
src/main/java/com/xjrsoft/module/workflow/listener/TaskTimeoutListener.java

@@ -2,6 +2,7 @@ package com.xjrsoft.module.workflow.listener;
 
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.convert.Convert;
+import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.json.JSONUtil;
@@ -12,10 +13,7 @@ import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.module.oa.utils.SendMessageUtil;
 import com.xjrsoft.module.workflow.constant.WorkflowConstant;
 import com.xjrsoft.module.workflow.entity.WorkflowSchema;
-import com.xjrsoft.module.workflow.model.MemberConfig;
-import com.xjrsoft.module.workflow.model.NoticePolicyParam;
-import com.xjrsoft.module.workflow.model.TimeoutRemidConfig;
-import com.xjrsoft.module.workflow.model.WorkflowSchemaConfig;
+import com.xjrsoft.module.workflow.model.*;
 import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
 import com.xjrsoft.module.workflow.service.IWorkflowSchemaService;
 import com.xjrsoft.module.workflow.utils.WorkFlowUtil;
@@ -28,6 +26,8 @@ import org.springframework.data.redis.listener.KeyExpirationEventMessageListener
 import org.springframework.data.redis.listener.RedisMessageListenerContainer;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
@@ -67,49 +67,49 @@ public class TaskTimeoutListener extends KeyExpirationEventMessageListener {
 //            taskService.setVariableLocal(task.getId(), WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.NO.getCode());
 
             // 驳回
-//            workflowExecuteService.dealTimeoutTask(1, taskId);
-//
-//            List<Task> list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
-//            if (list.size() == 1) {
-//                Task currentTask = list.get(0);
-//                //获取到审批人 发送消息
-//                Object approvedIds = taskService.getVariableLocal(currentTask.getId(), WorkflowConstant.TASK_ASSIGNEE_VAR_KEY);
-//
-//                List<String> variableNames = ListUtil.toList(
-//                        WorkflowConstant.PROCESS_SCHEMA_ID_KEY,
-//                        WorkflowConstant.PROCESS_SCHEMA_NAME_KEY,
-//                        WorkflowConstant.PROCESS_START_USER_NAME_KEY);
-//
-//                Map<String, Object> variables = taskService.getVariables(currentTask.getId(), variableNames);
-//
-//                Long schemaId = Convert.toLong(taskService.getVariable(currentTask.getId(), WorkflowConstant.PROCESS_SCHEMA_ID_KEY));
-//
-//                IWorkflowSchemaService workflowSchemaService = SpringUtil.getBean(IWorkflowSchemaService.class);
-//                WorkflowSchema workflowSchema = workflowSchemaService.getOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, schemaId).select(WorkflowSchema::getJsonContent));
-//
-//                WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-//
-//                Map<String, Object> userTaskConfigMap = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(currentTask.getTaskDefinitionKey())).findFirst().orElse(new HashMap<>());
-//                UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, userTaskConfigMap);
-//
-//                List<String> approveIds = ListUtil.toList(Convert.toStr(approvedIds).split(StringPool.COMMA));
-//
-//                NoticePolicyParam param = new NoticePolicyParam();
-//                param.setNoticeUserIds(Convert.toList(Long.class, approveIds));
-//                param.setTaskId(currentTask.getId());
-//                param.setTaskName(currentTask.getName());
-//                param.setProcessId(currentTask.getProcessInstanceId());
-//                param.setTaskName(currentTask.getName());
-//                param.setSchemaId(MapUtil.get(variables, WorkflowConstant.PROCESS_SCHEMA_ID_KEY, Long.class));
-//                param.setSchemaName(MapUtil.get(variables, WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, String.class));
-//                param.setStartUserName(MapUtil.get(variables, WorkflowConstant.PROCESS_START_USER_NAME_KEY, String.class));
-//                // 默认强制推送微信消息
-//                param.setNoticePolicyConfigs(new ArrayList(){{
-//                    add(WorkflowNoticePolicyType.WECHAT.getCode());
-//                }});
-//                //超时消息
-//                WorkFlowUtil.sendTimeOutNoticePolicy(param, "由于审批超时,系统自动驳回审批");
-//            }
+            workflowExecuteService.dealTimeoutTask(1, taskId);
+
+            List<Task> list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
+            if (list.size() == 1) {
+                Task currentTask = list.get(0);
+                //获取到审批人 发送消息
+                Object approvedIds = taskService.getVariableLocal(currentTask.getId(), WorkflowConstant.TASK_ASSIGNEE_VAR_KEY);
+
+                List<String> variableNames = ListUtil.toList(
+                        WorkflowConstant.PROCESS_SCHEMA_ID_KEY,
+                        WorkflowConstant.PROCESS_SCHEMA_NAME_KEY,
+                        WorkflowConstant.PROCESS_START_USER_NAME_KEY);
+
+                Map<String, Object> variables = taskService.getVariables(currentTask.getId(), variableNames);
+
+                Long schemaId = Convert.toLong(taskService.getVariable(currentTask.getId(), WorkflowConstant.PROCESS_SCHEMA_ID_KEY));
+
+                IWorkflowSchemaService workflowSchemaService = SpringUtil.getBean(IWorkflowSchemaService.class);
+                WorkflowSchema workflowSchema = workflowSchemaService.getOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, schemaId).select(WorkflowSchema::getJsonContent));
+
+                WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
+
+                Map<String, Object> userTaskConfigMap = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(currentTask.getTaskDefinitionKey())).findFirst().orElse(new HashMap<>());
+                UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, userTaskConfigMap);
+
+                List<String> approveIds = ListUtil.toList(Convert.toStr(approvedIds).split(StringPool.COMMA));
+
+                NoticePolicyParam param = new NoticePolicyParam();
+                param.setNoticeUserIds(Convert.toList(Long.class, approveIds));
+                param.setTaskId(currentTask.getId());
+                param.setTaskName(currentTask.getName());
+                param.setProcessId(currentTask.getProcessInstanceId());
+                param.setTaskName(currentTask.getName());
+                param.setSchemaId(MapUtil.get(variables, WorkflowConstant.PROCESS_SCHEMA_ID_KEY, Long.class));
+                param.setSchemaName(MapUtil.get(variables, WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, String.class));
+                param.setStartUserName(MapUtil.get(variables, WorkflowConstant.PROCESS_START_USER_NAME_KEY, String.class));
+                // 默认强制推送微信消息
+                param.setNoticePolicyConfigs(new ArrayList(){{
+                    add(WorkflowNoticePolicyType.WECHAT.getCode());
+                }});
+                //超时消息
+                WorkFlowUtil.sendTimeOutNoticePolicy(param, "由于审批超时,系统自动驳回审批");
+            }
 
             return;
         }

+ 44 - 0
src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java

@@ -1981,6 +1981,39 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 //获取到当前活动的实例
                 ActivityInstance activityInstance = runtimeService.getActivityInstance(task.getProcessInstanceId());
 
+                List<HistoricActivityInstance> historicActivityInstances = historyService
+                        .createHistoricActivityInstanceQuery()
+                        .processInstanceId(task.getProcessInstanceId())
+                        .activityId(dto.getRejectNodeActivityId())
+                        .orderByHistoricActivityInstanceEndTime()
+                        .asc()
+                        .list();
+                if (null == historicActivityInstances || historicActivityInstances.isEmpty()) {
+                    throw new MyException("当前任务之前不存在用户任务无法驳回!");
+                }
+                int originSize = historicActivityInstances.size();
+                HistoricActivityInstance historicActivityInstance = historicActivityInstances.get(originSize - 1);
+                // 获取历史任务信息
+                HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery()
+                        .processInstanceId(task.getProcessInstanceId())
+                        .taskId(historicActivityInstance.getTaskId())
+                        .finished()
+                        .orderByHistoricTaskInstanceEndTime()
+                        .asc()
+                        .singleResult();
+                // 获取act_hi_detail表中的信息,但是HistoricDetail还没有包含变量信息
+                List<HistoricDetail> details = historyService.createHistoricDetailQuery()
+                        .variableUpdates()
+                        .activityInstanceId(historicTaskInstance.getActivityInstanceId())// 使用activityInstanceId可以获取到每个节点对应的detail信息
+                        .list();
+                Map<String, Object> variables = new HashMap<>();
+                for (HistoricDetail historicDetail : details) {
+                    // 所以需要将HistoricDetail转换为HistoricVariableUpdate才可以获取到variables
+                    HistoricVariableUpdate historicVariableUpdate = (HistoricVariableUpdate) historicDetail;
+                    variables.put(historicVariableUpdate.getVariableName(), historicVariableUpdate.getValue());
+                }
+                String assignee = variables.get("assignee").toString();
+
                 //先停止当前活动示例  然后  测回流程到指定节点
                 runtimeService.createProcessInstanceModification(task.getProcessInstanceId())
                         .cancelActivityInstance(activityInstance.getId())
@@ -1988,6 +2021,11 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                         .startBeforeActivity(dto.getRejectNodeActivityId())
                         .execute();
 
+                List<Task> list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
+                if (list.size() == 1) {
+                    Task currentTask = list.get(0);
+                    taskService.setVariable(currentTask.getId(), WorkflowConstant.TASK_ASSIGNEE_VAR_KEY, assignee);
+                }
 
                 Optional<Map<String, Object>> rejectNodeMap = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(dto.getRejectNodeActivityId())).findFirst();
 
@@ -5587,6 +5625,12 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                     .setVariables(taskVariable)//流程的可变参数赋值
                     .execute();
 
+            List<Task> list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
+            if (list.size() == 1) {
+                Task currentTask = list.get(0);
+                taskService.setVariable(currentTask.getId(), WorkflowConstant.TASK_ASSIGNEE_VAR_KEY, assignee);
+            }
+
             Optional<Map<String, Object>> rejectNodeMap = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(toActId)).findFirst();
 
             rejectNodeMap.ifPresent(node -> {