add 添加流程启动

This commit is contained in:
songgaoshuai 2023-06-07 18:01:01 +08:00
parent 550bfdf8bf
commit 6f934d16ec
4 changed files with 191 additions and 0 deletions

View File

@ -0,0 +1,41 @@
package org.dromara.workflow.controller;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.workflow.domain.bo.StartProcessBo;
import org.dromara.workflow.service.IActTaskService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
* 任务管理 控制层
*
* @author may
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/workflow/task")
public class ActTaskController {
private final IActTaskService iActTaskService;
/**
* 启动任务
*
* @param startProcessBo 启动流程参数
*/
@Log(title = "任务管理", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/startWorkFlow")
public R<Map<String, Object>> startWorkFlow(@RequestBody StartProcessBo startProcessBo) {
Map<String, Object> map = iActTaskService.startWorkFlow(startProcessBo);
return R.ok("提交成功", map);
}
}

View File

@ -0,0 +1,47 @@
package org.dromara.workflow.domain.bo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* 启动流程对象
*
* @author may
*/
@Data
public class StartProcessBo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 业务唯一值id
*/
private String businessKey;
/**
* 流程执行key
*/
private String processKey;
/**
* 如果传实体 需要序列化后的
* 流程变量前端会提交一个元素{'entity': {业务详情数据对象}}
*/
private Map<String, Object> variables;
public Map<String, Object> getVariables() {
if (variables == null) {
return new HashMap<>(16);
}
variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
return variables;
}
}

View File

@ -0,0 +1,20 @@
package org.dromara.workflow.service;
import org.dromara.workflow.domain.bo.StartProcessBo;
import java.util.Map;
/**
* 任务 服务层
*
* @author may
*/
public interface IActTaskService {
/**
* 启动任务
*
* @param startProcessBo 启动流程参数
* @return 结果
*/
Map<String, Object> startWorkFlow(StartProcessBo startProcessBo);
}

View File

@ -0,0 +1,83 @@
package org.dromara.workflow.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.workflow.domain.bo.StartProcessBo;
import org.dromara.workflow.service.IActTaskService;
import org.flowable.common.engine.impl.identity.Authentication;
import org.flowable.engine.HistoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.flowable.task.api.TaskQuery;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 任务 服务层实现
*
* @author may
*/
@RequiredArgsConstructor
@Service
public class ActTaskServiceImpl implements IActTaskService {
private final RuntimeService runtimeService;
private final TaskService taskService;
private final HistoryService historyService;
/**
* 启动任务
*
* @param startProcessBo 启动流程参数
*/
@Override
public Map<String, Object> startWorkFlow(StartProcessBo startProcessBo) {
Map<String, Object> map = new HashMap<>();
if (StringUtils.isBlank(startProcessBo.getBusinessKey())) {
throw new ServiceException("启动工作流时必须包含业务ID");
}
// 判断当前业务是否启动过流程
List<HistoricProcessInstance> instanceList = historyService.createHistoricProcessInstanceQuery().processInstanceBusinessKey(startProcessBo.getBusinessKey()).list();
TaskQuery taskQuery = taskService.createTaskQuery();
List<Task> taskResult = taskQuery.processInstanceBusinessKey(startProcessBo.getBusinessKey()).list();
if (CollUtil.isNotEmpty(instanceList)) {
map.put("processInstanceId", taskResult.get(0).getProcessInstanceId());
map.put("taskId", taskResult.get(0).getId());
return map;
}
// 设置启动人
Authentication.setAuthenticatedUserId(LoginHelper.getUserId().toString());
// 启动流程实例提交申请
Map<String, Object> variables = startProcessBo.getVariables();
// 启动跳过表达式
variables.put("_FLOWABLE_SKIP_EXPRESSION_ENABLED", true);
ProcessInstance pi;
if (CollUtil.isNotEmpty(variables)) {
pi = runtimeService.startProcessInstanceByKeyAndTenantId(startProcessBo.getProcessKey(), startProcessBo.getBusinessKey(), variables, LoginHelper.getTenantId());
} else {
pi = runtimeService.startProcessInstanceByKeyAndTenantId(startProcessBo.getProcessKey(), startProcessBo.getBusinessKey(), LoginHelper.getTenantId());
}
// 将流程定义名称 作为 流程实例名称
runtimeService.setProcessInstanceName(pi.getProcessInstanceId(), pi.getProcessDefinitionName());
// 申请人执行流程
List<Task> taskList = taskService.createTaskQuery().processInstanceId(pi.getId()).list();
if (taskList.size() > 1) {
throw new ServiceException("请检查流程第一个环节是否为申请人!");
}
taskService.setAssignee(taskList.get(0).getId(), LoginHelper.getUserId().toString());
taskService.setVariable(taskList.get(0).getId(), "processInstanceId", pi.getProcessInstanceId());
map.put("processInstanceId", pi.getProcessInstanceId());
map.put("taskId", taskList.get(0).getId());
return map;
}
}