Ver Fonte

workflow

fanxp há 1 ano atrás
pai
commit
ea95bc650e

+ 6 - 0
src/main/java/com/xjrsoft/module/workflow/controller/WorkflowExecuteController.java

@@ -133,6 +133,12 @@ public class WorkflowExecuteController {
         return R.ok(workflowExecuteService.newApprove(dto));
     }
 
+    @PostMapping("/is-choose-approve")
+    @ApiOperation(value = "判断当前流程是否需要选择人员审批")
+    public R isChooseApprove(@Valid @RequestBody IsChooseApproveDto dto) {
+        return R.ok(workflowExecuteService.isChooseApprove(dto));
+    }
+
     @GetMapping("/check-audited")
     @ApiOperation(value = "检查是否已经审核")
     public R checkAudited(@RequestParam String taskId) {

+ 18 - 0
src/main/java/com/xjrsoft/module/workflow/dto/IsChooseApproveDto.java

@@ -0,0 +1,18 @@
+package com.xjrsoft.module.workflow.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+public class IsChooseApproveDto {
+    @ApiModelProperty("流程任务id")
+    @NotBlank(message = "流程任务id不能为空")
+    private String taskId;
+
+    @ApiModelProperty("审批类型 0 同意 1 拒绝 2 驳回 3 结束 4 其他(用户自定义按钮) ")
+    @NotNull(message = "审批类型不能为空")
+    private Integer approvedType;
+}

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

@@ -9,16 +9,11 @@ import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.xjrsoft.common.enums.WorkflowNoticePolicyType;
-import com.xjrsoft.common.enums.YesOrNoEnum;
 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.UserTaskConfig;
-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;
@@ -31,6 +26,7 @@ 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;
@@ -65,47 +61,55 @@ public class TaskTimeoutListener extends KeyExpirationEventMessageListener {
             String[] split = expiredKey.split(StringPool.UNDERSCORE);
             String taskId = split[0];
 
-            //获取到审批人 发送消息
-            Object approvedIds = taskService.getVariableLocal(taskId, 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(taskId, variableNames);
-
             Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
 
-            Long schemaId = Convert.toLong(taskService.getVariable(task.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(task.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(task.getId());
-            param.setTaskName(task.getName());
-            param.setProcessId(task.getProcessInstanceId());
-            param.setTaskName(task.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(userTaskConfig.getNoticePolicyConfigs());
-            //发送消息
-            WorkFlowUtil.sendApproveNoticePolicy(param,task.getName());
-
             //到期未指定的任务 将变量设置为不需要指定
-            taskService.setVariableLocal(task.getId(), WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.NO.getCode());
-
+//            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, "由于审批超时,系统自动驳回审批");
+            }
 
             return;
         }
@@ -189,7 +193,7 @@ public class TaskTimeoutListener extends KeyExpirationEventMessageListener {
             if (Convert.toInt(type) == WorkflowNoticePolicyType.SMS.getCode()) {
                 //TODO 短信发送代码
                 CompletableFuture.runAsync(() -> {
-                    SendMessageUtil.sendWorkflowTimeoutSms(param,task.getName());
+                    SendMessageUtil.sendWorkflowTimeoutSms(param, task.getName());
                 });
             }
 
@@ -235,12 +239,12 @@ public class TaskTimeoutListener extends KeyExpirationEventMessageListener {
                     Integer handleType = MapUtils.getInteger(timeoutHandle, "type");
                     if (handleType == 1) {
                         // 驳回
-                        workflowExecuteService.dealTimeoutTask(handleType,taskId);
+                        workflowExecuteService.dealTimeoutTask(handleType, taskId);
                     } else if (handleType == 2) {
                         // 同意
-                        workflowExecuteService.dealTimeoutTask(handleType,taskId);
-                    }else {
-                        throw new  MyException("未选择处理方式");
+                        workflowExecuteService.dealTimeoutTask(handleType, taskId);
+                    } else {
+                        throw new MyException("未选择处理方式");
                     }
                 }
             }

+ 5 - 3
src/main/java/com/xjrsoft/module/workflow/service/IWorkflowExecuteService.java

@@ -106,11 +106,13 @@ public interface IWorkflowExecuteService {
      */
     Page<PendingTaskVo> myExamine(Page<PendingTaskVo> page, MyExaminePageDto dto);
 
+    /**
+     * 判断当前流程是否需要选择人员审批
+     */
+    List<LaunchAndApproveVo> isChooseApprove(IsChooseApproveDto dto);
+
     /**
      * 审批
-     *
-     * @param dto
-     * @return
      */
     List<LaunchAndApproveVo> newApprove(ApproveDto dto);
 

+ 115 - 155
src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java

@@ -24,17 +24,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.github.yulichang.toolkit.MPJWrappers;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.constant.GlobalConstant;
-import com.xjrsoft.common.enums.EnabledMark;
-import com.xjrsoft.common.enums.FormTemplateType;
-import com.xjrsoft.common.enums.WorkflowApproveType;
-import com.xjrsoft.common.enums.WorkflowAutoAgreeType;
-import com.xjrsoft.common.enums.WorkflowIsPrevChooseNextType;
-import com.xjrsoft.common.enums.WorkflowIsRecycleType;
-import com.xjrsoft.common.enums.WorkflowMultiInstanceFinishType;
-import com.xjrsoft.common.enums.WorkflowMultiInstanceType;
-import com.xjrsoft.common.enums.WorkflowNoHandlerType;
-import com.xjrsoft.common.enums.WorkflowRelationAuthType;
-import com.xjrsoft.common.enums.YesOrNoEnum;
+import com.xjrsoft.common.enums.*;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
@@ -57,112 +47,13 @@ import com.xjrsoft.module.system.entity.Stamp;
 import com.xjrsoft.module.system.service.IFileService;
 import com.xjrsoft.module.system.service.IStampService;
 import com.xjrsoft.module.workflow.constant.WorkflowConstant;
-import com.xjrsoft.module.workflow.dto.AddOrSubSignDto;
-import com.xjrsoft.module.workflow.dto.ApproveDto;
-import com.xjrsoft.module.workflow.dto.ApproveMultiDto;
-import com.xjrsoft.module.workflow.dto.ApproveMultiInfoDto;
-import com.xjrsoft.module.workflow.dto.ApproveRecordListDto;
-import com.xjrsoft.module.workflow.dto.ApproveUserDto;
-import com.xjrsoft.module.workflow.dto.ApproveUserMultiDto;
-import com.xjrsoft.module.workflow.dto.CirculatedTaskPageDto;
-import com.xjrsoft.module.workflow.dto.DeployDto;
-import com.xjrsoft.module.workflow.dto.DraftPageDto;
-import com.xjrsoft.module.workflow.dto.FinishedTaskPageDto;
-import com.xjrsoft.module.workflow.dto.FormFinishedTaskDto;
-import com.xjrsoft.module.workflow.dto.GetAssigneeDto;
-import com.xjrsoft.module.workflow.dto.LaunchDto;
-import com.xjrsoft.module.workflow.dto.LaunchRelationTaskDto;
-import com.xjrsoft.module.workflow.dto.MonitorPageDto;
-import com.xjrsoft.module.workflow.dto.MoveRecycleDto;
-import com.xjrsoft.module.workflow.dto.MyExaminePageDto;
-import com.xjrsoft.module.workflow.dto.MyProcessPageDto;
-import com.xjrsoft.module.workflow.dto.PendingTaskPageDto;
-import com.xjrsoft.module.workflow.dto.ReLaunchDto;
-import com.xjrsoft.module.workflow.dto.RecycleDeleteDto;
-import com.xjrsoft.module.workflow.dto.RecycleProcessPageDto;
-import com.xjrsoft.module.workflow.dto.RejectNodeDto;
-import com.xjrsoft.module.workflow.dto.RelationTaskInfoDto;
-import com.xjrsoft.module.workflow.dto.RelationTaskPageDto;
-import com.xjrsoft.module.workflow.dto.RestartDto;
-import com.xjrsoft.module.workflow.dto.SaveDraftDto;
-import com.xjrsoft.module.workflow.dto.SetAssigneeDto;
-import com.xjrsoft.module.workflow.dto.SetSuspendedDto;
-import com.xjrsoft.module.workflow.dto.TransferDto;
-import com.xjrsoft.module.workflow.dto.UpdateDraftDto;
-import com.xjrsoft.module.workflow.dto.WithdrawDto;
-import com.xjrsoft.module.workflow.entity.WorkflowApproveRecord;
-import com.xjrsoft.module.workflow.entity.WorkflowCirculated;
-import com.xjrsoft.module.workflow.entity.WorkflowDelegate;
-import com.xjrsoft.module.workflow.entity.WorkflowDraft;
-import com.xjrsoft.module.workflow.entity.WorkflowExtra;
-import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
-import com.xjrsoft.module.workflow.entity.WorkflowRecord;
-import com.xjrsoft.module.workflow.entity.WorkflowSchema;
-import com.xjrsoft.module.workflow.entity.WorkflowSchemaHistory;
-import com.xjrsoft.module.workflow.entity.XjrWorkflowOperateRecord;
-import com.xjrsoft.module.workflow.mapper.WorkflowDelegateMapper;
-import com.xjrsoft.module.workflow.mapper.WorkflowExtraMapper;
-import com.xjrsoft.module.workflow.mapper.WorkflowRecordMapper;
-import com.xjrsoft.module.workflow.mapper.WorkflowSchemaHistoryMapper;
-import com.xjrsoft.module.workflow.mapper.WorkflowSchemaMapper;
-import com.xjrsoft.module.workflow.mapper.XjrWorkflowExtraMapper;
-import com.xjrsoft.module.workflow.mapper.XjrWorkflowOperateRecordMapper;
-import com.xjrsoft.module.workflow.model.ApiConfig;
-import com.xjrsoft.module.workflow.model.ApiRequestParamsConfig;
-import com.xjrsoft.module.workflow.model.AuthConfig;
-import com.xjrsoft.module.workflow.model.ButtonConfig;
-import com.xjrsoft.module.workflow.model.FormAssignmentConfig;
-import com.xjrsoft.module.workflow.model.FormConfig;
-import com.xjrsoft.module.workflow.model.MemberConfig;
-import com.xjrsoft.module.workflow.model.ProcessParamConfig;
-import com.xjrsoft.module.workflow.model.RelationProcessConfig;
-import com.xjrsoft.module.workflow.model.StartNodeConfig;
-import com.xjrsoft.module.workflow.model.UserTaskConfig;
-import com.xjrsoft.module.workflow.model.WorkflowSchemaConfig;
-import com.xjrsoft.module.workflow.service.IWorkflowApproveRecordService;
-import com.xjrsoft.module.workflow.service.IWorkflowCirculatedService;
-import com.xjrsoft.module.workflow.service.IWorkflowDraftService;
-import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
-import com.xjrsoft.module.workflow.service.IWorkflowExtraService;
-import com.xjrsoft.module.workflow.service.IWorkflowFormRelationService;
-import com.xjrsoft.module.workflow.service.IWorkflowRecordService;
-import com.xjrsoft.module.workflow.service.IXjrWorkflowOperateRecordService;
+import com.xjrsoft.module.workflow.dto.*;
+import com.xjrsoft.module.workflow.entity.*;
+import com.xjrsoft.module.workflow.mapper.*;
+import com.xjrsoft.module.workflow.model.*;
+import com.xjrsoft.module.workflow.service.*;
 import com.xjrsoft.module.workflow.utils.WorkFlowUtil;
-import com.xjrsoft.module.workflow.vo.AllRecordListVo;
-import com.xjrsoft.module.workflow.vo.ApproveMultiInfoVo;
-import com.xjrsoft.module.workflow.vo.ApproveMultiVo;
-import com.xjrsoft.module.workflow.vo.CirculatedTaskPageVo;
-import com.xjrsoft.module.workflow.vo.DraftInfoVo;
-import com.xjrsoft.module.workflow.vo.DraftPageVo;
-import com.xjrsoft.module.workflow.vo.FinishedTaskPageVo;
-import com.xjrsoft.module.workflow.vo.FinishedTaskVo;
-import com.xjrsoft.module.workflow.vo.FormFinishedTaskVo;
-import com.xjrsoft.module.workflow.vo.GetAssigneeVo;
-import com.xjrsoft.module.workflow.vo.GetCountVo;
-import com.xjrsoft.module.workflow.vo.HistoryTaskVo;
-import com.xjrsoft.module.workflow.vo.LaunchAndApproveVo;
-import com.xjrsoft.module.workflow.vo.MonitorPageVo;
-import com.xjrsoft.module.workflow.vo.MyProcessPageVo;
-import com.xjrsoft.module.workflow.vo.PendingTaskVo;
-import com.xjrsoft.module.workflow.vo.ProcessInfoVo;
-import com.xjrsoft.module.workflow.vo.ProcessRecordListVo;
-import com.xjrsoft.module.workflow.vo.RecycleProcessInfoVo;
-import com.xjrsoft.module.workflow.vo.RecycleProcessPageVo;
-import com.xjrsoft.module.workflow.vo.RejectNodeVo;
-import com.xjrsoft.module.workflow.vo.RelationFormInfoVo;
-import com.xjrsoft.module.workflow.vo.RelationTaskInfoVo;
-import com.xjrsoft.module.workflow.vo.RelationTaskPageVo;
-import com.xjrsoft.module.workflow.vo.RestartVo;
-import com.xjrsoft.module.workflow.vo.StartNodeFormInfoVo;
-import com.xjrsoft.module.workflow.vo.StartProcessInfoVo;
-import com.xjrsoft.module.workflow.vo.StartProcessRelationTaskVo;
-import com.xjrsoft.module.workflow.vo.TaskInfoRelationTaskVo;
-import com.xjrsoft.module.workflow.vo.TaskInfoVo;
-import com.xjrsoft.module.workflow.vo.UserDefinedProcessRecordListVo;
-import com.xjrsoft.module.workflow.vo.UserTaskFormInfoVo;
-import com.xjrsoft.module.workflow.vo.UserTaskInfoVo;
-import com.xjrsoft.module.workflow.vo.UserTaskRelationTaskVo;
-import com.xjrsoft.module.workflow.vo.WorkflowSchemaInfoVo;
+import com.xjrsoft.module.workflow.vo.*;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
@@ -172,12 +63,7 @@ import org.camunda.bpm.engine.HistoryService;
 import org.camunda.bpm.engine.RepositoryService;
 import org.camunda.bpm.engine.RuntimeService;
 import org.camunda.bpm.engine.TaskService;
-import org.camunda.bpm.engine.history.HistoricActivityInstance;
-import org.camunda.bpm.engine.history.HistoricProcessInstance;
-import org.camunda.bpm.engine.history.HistoricProcessInstanceQuery;
-import org.camunda.bpm.engine.history.HistoricTaskInstance;
-import org.camunda.bpm.engine.history.HistoricTaskInstanceQuery;
-import org.camunda.bpm.engine.history.HistoricVariableInstance;
+import org.camunda.bpm.engine.history.*;
 import org.camunda.bpm.engine.impl.persistence.entity.HistoricVariableInstanceEntity;
 import org.camunda.bpm.engine.impl.persistence.entity.TaskEntity;
 import org.camunda.bpm.engine.repository.Deployment;
@@ -199,17 +85,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.ssssssss.magicapi.core.service.MagicAPIService;
 
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -1355,28 +1231,27 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         try {
             //表单提交完毕后 发起流程
             ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId(), variableMap);
-            System.out.println("newLaunch start 2");
+
             List<Task> list = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
-            System.out.println("newLaunch start 3");
+
 //            List<LaunchAndApproveVo> result = isPrevChooseApprove(workflowSchemaConfig, list, variableMap);
 
             //如果不需要指定审批人 默认走自动同意规则
             invokeAutoAgree(processInstance.getId(), workflowSchema.getId(), workflowSchemaConfig, list);
-            System.out.println("newLaunch start 4");
+
             //重新获取任务节点,判断是否需要指定下一审批人
             list = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
-            System.out.println("newLaunch start 5");
+
             List<LaunchAndApproveVo> result = isPrevChooseApprove(workflowSchemaConfig, list, variableMap);
-            System.out.println("newLaunch start 6");
+
             updateFileInfo(dto.getFileFolderIds(), processInstance.getId());
-            System.out.println("newLaunch start 7");
+
             //保存 流程 表单 关联 数据
             for (WorkflowFormRelation relation : relations) {
                 relation.setProcessId(processInstance.getId());
             }
 
             formRelationService.saveBatch(relations);
-            System.out.println("newLaunch start 8");
 
             return result;
         } catch (Exception e) {
@@ -1745,6 +1620,39 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         return new Page<>();
     }
 
+    /**
+     * 判断当前流程是否需要选择人员审批
+     */
+    public List<LaunchAndApproveVo> isChooseApprove(IsChooseApproveDto dto){
+        //根据taskid  获取任务信息
+        Task task = taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
+
+        //获取当前任务变量中的  schemaId
+        Long schemaId = Convert.toLong(taskService.getVariable(task.getId(), WorkflowConstant.PROCESS_SCHEMA_ID_KEY));
+
+        //排除xml 查出数据
+        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, schemaId).select(x -> !x.getProperty().startsWith(DB_FIELD_XML_PREFIX)));
+
+        //获取到整个流程模板的配置
+        WorkflowSchemaConfig workflowSchemaConfig = null;
+        // TODO 判断当前流程是否发生了变更
+        if (workflowSchema.getDefinitionId().equals(task.getProcessDefinitionId())) {
+            workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
+        } else {
+            WorkflowSchemaHistory workflowSchemaHistory = workflowSchemaHistoryMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchemaHistory.class).eq(WorkflowSchemaHistory::getDefinitionId, task.getProcessDefinitionId()));
+            if (workflowSchemaHistory == null) {
+                throw new MyException("流转历史记录已丢失!");
+            }
+            workflowSchemaConfig = JSONUtil.toBean(workflowSchemaHistory.getJsonContent(), WorkflowSchemaConfig.class);
+        }
+        List<Task> list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
+        List<LaunchAndApproveVo> result = new ArrayList<>();
+        //如果是同意  || 拒绝  || 其他  默认都是流程往下走
+        if (dto.getApprovedType() == WorkflowApproveType.AGREE.getCode() || dto.getApprovedType() == WorkflowApproveType.DISAGREE.getCode() || dto.getApprovedType() == WorkflowApproveType.OTHER.getCode()) {
+            result = isPrevChooseApprove(workflowSchemaConfig, list, null);
+        }
+        return result;
+    }
 
     @Override
     @SneakyThrows
@@ -2662,7 +2570,11 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
         //这里不再写 发送消息的逻辑 默认使用一个 redis key 使用redis过期策略 执行发送消息的功能 解耦 偷懒
         //每个消息默认相隔一秒 等于队列一样的逻辑
-        redisUtil.set(dto.getTaskId() + StringPool.UNDERSCORE + WorkflowConstant.TASK_IS_APPOINT_APPROVE, dto.getTaskId(), 1);
+//        redisUtil.set(dto.getTaskId() + StringPool.UNDERSCORE + WorkflowConstant.TASK_IS_APPOINT_APPROVE, dto.getTaskId(), 1);
+
+        // 发送消息
+        sendApproveNoticePolicy(dto.getTaskId());
+
         return true;
     }
 
@@ -2729,7 +2641,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
         List<WorkflowDelegate> workflowDelegates = workflowDelegateMapper.selectList(wrapper);
 
-        int i = 1;
+//        int i = 1;
         //获取当前用户的信息
         User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
         for (ApproveUserDto item : approveUserList) {
@@ -2764,12 +2676,61 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
             //这里不再写 发送消息的逻辑 默认使用一个 redis key 使用redis过期策略 执行发送消息的功能 解耦 偷懒
             //每个消息默认相隔一秒 等于队列一样的逻辑
-            redisUtil.set(item.getTaskId() + StringPool.UNDERSCORE + WorkflowConstant.TASK_IS_APPOINT_APPROVE, item.getTaskId(), i);
-            i++;
+//            redisUtil.set(item.getTaskId() + StringPool.UNDERSCORE + WorkflowConstant.TASK_IS_APPOINT_APPROVE, item.getTaskId(), i);
+//            i++;
+
+            // 发送消息
+            sendApproveNoticePolicy(item.getTaskId());
         }
+
+
         return true;
     }
 
+    /**
+     * 根据taskid发送审核通知
+     */
+    private void sendApproveNoticePolicy(String taskId){
+        //获取到审批人 发送消息
+        Object approvedIds = taskService.getVariableLocal(taskId, 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(taskId, variableNames);
+
+        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
+
+        Long schemaId = Convert.toLong(taskService.getVariable(task.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(task.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(task.getId());
+        param.setTaskName(task.getName());
+        param.setProcessId(task.getProcessInstanceId());
+        param.setTaskName(task.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(userTaskConfig.getNoticePolicyConfigs());
+        //发送消息
+        WorkFlowUtil.sendApproveNoticePolicy(param,task.getName());
+    }
+
     @Override
     public PageOutput<RelationTaskPageVo> getRelationTaskPage(RelationTaskPageDto dto) {
         //排除xml 查出数据
@@ -4238,11 +4199,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                         vo.setCanRemove(Boolean.TRUE);
                     }
                 }
-
                 result.add(vo);
             }
-
-
         }
         return result;
     }
@@ -4933,8 +4891,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
                         //如果是需要指定审批人 默认设置变量
                         taskService.setVariableLocal(task.getId(), WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.YES.getCode());
-                        //默认定时10分钟  如果不指定审批人 就会使用原审批人
-                        redisUtil.set(task.getId() + StringPool.UNDERSCORE + WorkflowConstant.TASK_IS_APPOINT_APPROVE, task.getId(), 10 * 60);
+                        //默认定时2分钟  如果不指定审批人 就会使用原审批人
+                        redisUtil.set(task.getId() + StringPool.UNDERSCORE + WorkflowConstant.TASK_IS_APPOINT_APPROVE, task.getId(), 2 * 60);
 //                            redisUtil.set(GlobalConstant.CAPTCHA + StringPool.UNDERSCORE + mobile, code, 6000L);
                         continue;
                     }
@@ -4956,8 +4914,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
                             //如果是需要指定审批人 默认设置变量
                             taskService.setVariableLocal(task.getId(), WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.YES.getCode());
-                            //默认定时10分钟  如果不指定审批人 就会使用原审批人
-                            redisUtil.set(task.getId() + StringPool.UNDERSCORE + WorkflowConstant.TASK_IS_APPOINT_APPROVE, task.getId(), 10 * 60);
+                            //默认定时2分钟  如果不指定审批人 就会使用原审批人
+                            redisUtil.set(task.getId() + StringPool.UNDERSCORE + WorkflowConstant.TASK_IS_APPOINT_APPROVE, task.getId(), 2 * 60);
                             continue;
                         } else {
                             List<UserRoleRelation> userRoleRelations = redisUtil.get(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, new TypeReference<List<UserRoleRelation>>() {
@@ -5041,8 +4999,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
                     //如果是需要指定审批人 默认设置变量
                     taskService.setVariableLocal(task.getId(), WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.YES.getCode());
-                    //默认定时10分钟  如果不指定审批人 就会使用原审批人
-                    redisUtil.set(task.getId() + StringPool.UNDERSCORE + WorkflowConstant.TASK_IS_APPOINT_APPROVE, task.getId(), 10 * 60);
+                    //默认定时2分钟  如果不指定审批人 就会使用原审批人
+                    redisUtil.set(task.getId() + StringPool.UNDERSCORE + WorkflowConstant.TASK_IS_APPOINT_APPROVE, task.getId(), 2 * 60);
                     return voList;
                 }
 
@@ -5066,8 +5024,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
                         //如果是需要指定审批人 默认设置变量
                         taskService.setVariableLocal(task.getId(), WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.YES.getCode());
-                        //默认定时10分钟  如果不指定审批人 就会使用原审批人
-                        redisUtil.set(task.getId() + StringPool.UNDERSCORE + WorkflowConstant.TASK_IS_APPOINT_APPROVE, task.getId(), 10 * 60);
+                        //默认定时2分钟  如果不指定审批人 就会使用原审批人
+                        redisUtil.set(task.getId() + StringPool.UNDERSCORE + WorkflowConstant.TASK_IS_APPOINT_APPROVE, task.getId(), 2 * 60);
                         return voList;
                     } else {
                         List<UserRoleRelation> userRoleRelations = redisUtil.get(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, new TypeReference<List<UserRoleRelation>>() {
@@ -5660,6 +5618,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
                 operateRecord.setOperateInfo("审批人:" + task.getName() + ", 审批结果:驳回, 审批内容:由于审批超时,系统自动驳回审批");
                 xjrWorkflowOperateRecordMapper.insert(operateRecord);
+
+
             });
         } else if (handleType == 2) {//同意
             //新增流程发起流程记录

+ 8 - 59
src/main/java/com/xjrsoft/module/workflow/utils/WorkFlowUtil.java

@@ -13,36 +13,18 @@ import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.hutool.db.Db;
 import cn.hutool.extra.spring.SpringUtil;
-import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fasterxml.jackson.core.type.TypeReference;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.xjrsoft.common.constant.GlobalConstant;
-import com.xjrsoft.common.enums.ParamAssignmentType;
-import com.xjrsoft.common.enums.WorkflowAuth;
-import com.xjrsoft.common.enums.WorkflowEventType;
-import com.xjrsoft.common.enums.WorkflowMemberType;
-import com.xjrsoft.common.enums.WorkflowNoticePolicyType;
-import com.xjrsoft.common.enums.WorkflowParamType;
-import com.xjrsoft.common.utils.DatasourceUtil;
+import com.xjrsoft.common.enums.*;
 import com.xjrsoft.common.utils.RedisUtil;
-import com.xjrsoft.module.form.entity.FormTemplate;
 import com.xjrsoft.module.magicapi.service.IMagicApiService;
 import com.xjrsoft.module.magicapi.vo.MagicApiInfoVo;
 import com.xjrsoft.module.oa.utils.SendMessageUtil;
-import com.xjrsoft.module.organization.entity.Department;
-import com.xjrsoft.module.organization.entity.Post;
-import com.xjrsoft.module.organization.entity.User;
-import com.xjrsoft.module.organization.entity.UserDeptRelation;
-import com.xjrsoft.module.organization.entity.UserPostRelation;
-import com.xjrsoft.module.organization.entity.UserRoleRelation;
+import com.xjrsoft.module.organization.entity.*;
 import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
 import com.xjrsoft.module.workflow.constant.WorkflowConstant;
@@ -50,27 +32,8 @@ import com.xjrsoft.module.workflow.dto.LaunchDto;
 import com.xjrsoft.module.workflow.entity.WorkflowApproveRecord;
 import com.xjrsoft.module.workflow.entity.WorkflowDelegate;
 import com.xjrsoft.module.workflow.entity.WorkflowSchema;
-import com.xjrsoft.module.workflow.model.ApiConfig;
-import com.xjrsoft.module.workflow.model.ApiRequestParamsConfig;
-import com.xjrsoft.module.workflow.model.AssignmentConfig;
-import com.xjrsoft.module.workflow.model.AuthConfig;
-import com.xjrsoft.module.workflow.model.ConditionConfig;
-import com.xjrsoft.module.workflow.model.FormAssignmentConfig;
-import com.xjrsoft.module.workflow.model.FormAssignmentSourceConfig;
-import com.xjrsoft.module.workflow.model.FormConfig;
-import com.xjrsoft.module.workflow.model.FormFieldConfig;
-import com.xjrsoft.module.workflow.model.LeaderConfig;
-import com.xjrsoft.module.workflow.model.MemberConfig;
-import com.xjrsoft.module.workflow.model.NameRuleConfig;
-import com.xjrsoft.module.workflow.model.NodeBasicConfig;
-import com.xjrsoft.module.workflow.model.NoticePolicyParam;
-import com.xjrsoft.module.workflow.model.ParamAssignmentConfig;
-import com.xjrsoft.module.workflow.model.ProcessParamConfig;
-import com.xjrsoft.module.workflow.model.SequenceFlowConfig;
-import com.xjrsoft.module.workflow.model.UserTaskConfig;
-import com.xjrsoft.module.workflow.model.WorkflowSchemaConfig;
+import com.xjrsoft.module.workflow.model.*;
 import com.xjrsoft.module.workflow.service.IWorkflowApproveRecordService;
-import com.yomahub.liteflow.util.JsonUtil;
 import lombok.SneakyThrows;
 import org.camunda.bpm.engine.HistoryService;
 import org.camunda.bpm.engine.ProcessEngines;
@@ -78,28 +41,12 @@ import org.camunda.bpm.engine.RepositoryService;
 import org.camunda.bpm.engine.RuntimeService;
 import org.camunda.bpm.engine.history.HistoricVariableInstance;
 import org.camunda.bpm.engine.variable.VariableMap;
-import org.camunda.bpm.model.bpmn.instance.BaseElement;
-import org.camunda.bpm.model.bpmn.instance.ConditionExpression;
-import org.camunda.bpm.model.bpmn.instance.FlowNode;
-import org.camunda.bpm.model.bpmn.instance.Gateway;
-import org.camunda.bpm.model.bpmn.instance.SequenceFlow;
+import org.camunda.bpm.model.bpmn.instance.*;
 import org.camunda.bpm.model.xml.instance.ModelElementInstance;
 import org.ssssssss.magicapi.core.service.MagicAPIService;
 
-import javax.sql.DataSource;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
@@ -1280,7 +1227,9 @@ public class WorkFlowUtil {
             }
             //如果包含企业微信
             if (param.getNoticePolicyConfigs().contains(WorkflowNoticePolicyType.WECHAT.getCode())) {
-                //TODO 发送企业微信
+                CompletableFuture.runAsync(() -> {
+                    SendMessageUtil.sendWorkflowApproveWx(param, name);
+                });
             }
             //如果包含钉钉
             if (param.getNoticePolicyConfigs().contains(WorkflowNoticePolicyType.DING.getCode())) {