优化flowable接口

This commit is contained in:
2025-12-01 11:29:03 +08:00
parent 551c69f4f4
commit 23a586e706
8 changed files with 35 additions and 246 deletions

View File

@@ -13,8 +13,6 @@ import com.sdm.flowable.dto.resp.DeployFlowableResp;
import com.sdm.flowable.process.ProcessService;
import com.sdm.flowable.service.IProcessNodeParamService;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.validation.ValidationError;
import org.springframework.beans.factory.annotation.Autowired;
@@ -79,48 +77,6 @@ public class ProcessController implements IFlowableFeignClient {
}
}
/**
* 获取所有流程的部署历史
*
* @return 流程部署数据
*/
@GetMapping("/listAllDeployments")
public List<Map<String, Object>> listAllDeployments() {
return processService.listAllDeployments();
}
/**
* 根据部署ID获取流程定义
*
* @param deploymentId 部署ID
* @return 流程定义列表
*/
@GetMapping("/listPorcessDefinitionsByDeploymentId/{deploymentId}")
public List<Map<String, Object>> listPorcessDefinitionsByDeploymentId(@PathVariable String deploymentId) {
return processService.listPorcessDefinitionsByDeploymentId(deploymentId);
}
/**
* 获取部署的流程定义元数据信息
*
* @param processDefinitionId
* @return
*/
@GetMapping("/listProcessDefinitionsMetaInfo")
public SdmResponse listProcessDefinitionsMetaInfo(@RequestParam String processDefinitionId) {
return processService.listProcessDefinitionsMetaInfo(processDefinitionId);
}
/**
* 根据流程 key 和指定版本获取版本流程定义的节点信息
*/
@GetMapping("/listNodesByProcessDefinitionKey")
public List<Map<String, Object>> listNodesByProcessDefinitionKey(@RequestParam String processDefinitionKey, @RequestParam(required = false) Integer processDefinitionVersion) {
return processService.listNodesByProcessDefinitionKey(processDefinitionKey, processDefinitionVersion);
}
/**
* 获取流程定义节点详细信息直接传流程定义ID
*/
@@ -143,32 +99,17 @@ public class ProcessController implements IFlowableFeignClient {
// 保存节点用户输入参数先基于流程定义ID等流程启动后保存流程实例ID作为参数模板
@PostMapping("/saveParamsByDefinitionId")
public void saveParamsByDefinitionId(@RequestParam String processDefinitionId, @RequestParam String nodeId,
public SdmResponse saveParamsByDefinitionId(@RequestParam String processDefinitionId, @RequestParam String nodeId,
@RequestBody Map<String, Object> params) {
processNodeParamService.saveParamByProcessDefinitionId(processDefinitionId, nodeId, params);
return SdmResponse.success();
}
// 启动流程实例后更新流程参数的流程实例id
@PostMapping("/updateNodeParamProcessInstanceId")
public void updateNodeParamProcessInstanceId(@RequestParam String processDefinitionId, @RequestParam String processInstanceId) {
public SdmResponse updateNodeParamProcessInstanceId(@RequestParam String processDefinitionId, @RequestParam String processInstanceId) {
processNodeParamService.updateNodeParamProcessInstanceId(processInstanceId, processDefinitionId);
}
// 启动流程实例
@GetMapping("/startByProcessDefinitionKey")
public SdmResponse startByProcessDefinitionKey(@RequestParam String processDefinitionKey) {
ProcessInstance processInstance = processService.startByProcessDefinitionKey(processDefinitionKey);
ProcessInstanceResp processInstanceResp = new ProcessInstanceResp();
processInstanceResp.setId(processInstance.getId());
processInstanceResp.setProcessDefinitionId(processInstance.getProcessDefinitionId());
processInstanceResp.setProcessDefinitionKey(processInstance.getProcessDefinitionKey());
processInstanceResp.setProcessDefinitionName(processInstance.getProcessDefinitionName());
processInstanceResp.setProcessDefinitionVersion(processInstance.getProcessDefinitionVersion());
processInstanceResp.setBusinessKey(processInstance.getBusinessKey());
processInstanceResp.setStartUserId(processInstance.getStartUserId());
processInstanceResp.setStartTime(processInstance.getStartTime());
processInstanceResp.setSuspended(processInstance.isSuspended());
return SdmResponse.success(processInstanceResp);
return SdmResponse.success();
}
/**
@@ -183,7 +124,7 @@ public class ProcessController implements IFlowableFeignClient {
@RequestBody(required = false) Map<String, Object> variables) {
ProcessInstance processInstance = processService.startByProcessDefinitionId(processDefinitionId, variables);
ProcessInstanceResp processInstanceResp = new ProcessInstanceResp();
processInstanceResp.setId(processInstance.getId());
processInstanceResp.setProcessInstanceId(processInstance.getId());
processInstanceResp.setProcessDefinitionId(processInstance.getProcessDefinitionId());
processInstanceResp.setProcessDefinitionKey(processInstance.getProcessDefinitionKey());
processInstanceResp.setProcessDefinitionName(processInstance.getProcessDefinitionName());
@@ -196,31 +137,13 @@ public class ProcessController implements IFlowableFeignClient {
}
/**
* 获取最新流程实例
*
* @param processDefinitionKey
* @return
* 根据流程实例 ID 查询流程状态以及节点状态
*/
@GetMapping("/getLatestProcessInstanceByProcessDefinitionKey")
public HistoricProcessInstance getLatestProcessInstanceByProcessDefinitionKey(@RequestParam String processDefinitionKey) {
return processService.getLatestProcessInstance(processDefinitionKey);
@GetMapping("/getProcessAndNodeDetailByInstanceId")
public Map<String, Object> getProcessAndNodeDetailByInstanceId(@RequestParam String processInstanceId) {
return processService.getProcessAndNodeDetailByInstanceId(processInstanceId);
}
/**
* 根据流程实例 ID 查询节点状态
*/
@GetMapping("/getNodeDetailByInstanceId")
public Map<String, Object> getNodeDetailByInstanceId(@RequestParam String processInstanceId) {
return processService.getProcessNodeDetail(processInstanceId);
}
/**
* 根据流程定义 Key 查询最新流程实例节点状态
*/
@GetMapping("/getNodeDetailByProcessDefinitionKey")
public Map<String, Object> getNodeDetailByProcessDefinitionKey(@RequestParam String processDefinitionKey) {
return processService.getNodeDetailByProcessDefinitionKey(processDefinitionKey);
}
/**
* 流程节点继续执行(完成人工节点/或者等待用户输入后继续手动执行的节点)

View File

@@ -0,0 +1,14 @@
package com.sdm.flowable.dto;
import lombok.Data;
@Data
public class ProcessDefinitionInfo {
private String id;
private String key;
private String name;
private String version;
private String deploymentId;
private String resourceName;
private boolean suspended;
}

View File

@@ -1,8 +0,0 @@
package com.sdm.flowable.dto.req;
import lombok.Data;
@Data
public class DeployFlowableJsonReq {
String flowableJson;
}

View File

@@ -4,8 +4,6 @@ import lombok.Data;
@Data
public class DeployFlowableResp {
String deploymentId;
String deploymentName;
String processDefinitionId;
String processDefinitionKey;
}

View File

@@ -1,16 +1,13 @@
package com.sdm.flowable.process;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.sdm.common.common.SdmResponse;
import com.sdm.flowable.constants.FlowableConfig;
import com.sdm.flowable.delegate.UniversalDelegate;
import com.sdm.flowable.dto.ProcessDefinitionDTO;
import com.sdm.flowable.dto.req.AsyncCallbackRequest;
import com.sdm.flowable.dto.req.RetryRequest;
import com.sdm.flowable.dto.resp.DeployFlowableResp;
import com.sdm.flowable.enums.FlowElementTypeEnums;
import com.sdm.flowable.util.Dto2BpmnConverter;
import com.sdm.flowable.constants.FlowableConfig;
import com.sdm.flowable.dto.req.CompleteTaskReq;
import com.sdm.flowable.util.FlowNodeIdUtils;
import lombok.extern.slf4j.Slf4j;
@@ -24,7 +21,6 @@ import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.repository.ProcessDefinitionQuery;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.flowable.validation.ProcessValidator;
@@ -98,83 +94,11 @@ public class ProcessService {
return SdmResponse.failed("部署成功,但未找到关联的流程定义");
}
DeployFlowableResp resp = new DeployFlowableResp();
resp.setDeploymentId(deployment.getId());
resp.setDeploymentName(deployment.getName());
resp.setProcessDefinitionId(processDefinition.getId());
resp.setProcessDefinitionKey(processDefinition.getKey());
return SdmResponse.success(resp);
}
public List<Map<String, Object>> listAllDeployments() {
return repositoryService.createDeploymentQuery()
.list()
.stream()
.map(deployment -> {
Map<String, Object> deploymentInfo = new HashMap<>();
deploymentInfo.put("id", deployment.getId());
deploymentInfo.put("name", deployment.getName());
deploymentInfo.put("deploymentTime", deployment.getDeploymentTime());
deploymentInfo.put("category", deployment.getCategory());
return deploymentInfo;
})
.collect(Collectors.toList());
}
public List<Map<String, Object>> listPorcessDefinitionsByDeploymentId(String deploymentId) {
List<ProcessDefinition> processDefinitions =
repositoryService.createProcessDefinitionQuery()
.deploymentId(deploymentId)
.orderByProcessDefinitionVersion().asc()
.list();
return processDefinitions.stream()
.map(def -> {
Map<String, Object> map = new HashMap<>();
map.put("id", def.getId());
map.put("key", def.getKey());
map.put("name", def.getName());
map.put("resourceName", def.getResourceName());
map.put("diagramResourceName", def.getDiagramResourceName());
map.put("version", def.getVersion());
map.put("suspended", def.isSuspended());
map.put("deploymentId", def.getDeploymentId());
return map;
})
.collect(Collectors.toList());
}
public SdmResponse listProcessDefinitionsMetaInfo(String processDefinitionId) {
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();
return SdmResponse.success(processDefinition);
}
public List<Map<String, Object>> listNodesByProcessDefinitionKey(
String processDefinitionKey, Integer processDefinitionVersion) {
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(processDefinitionKey);
ProcessDefinition processDefinition;
if (processDefinitionVersion == null) {
// ⭐ 未指定版本 → 查最新版本
processDefinition = query.latestVersion().singleResult();
} else {
// ⭐ 指定版本 → 查询对应版本
processDefinition = query
.processDefinitionVersion(processDefinitionVersion)
.singleResult();
}
if (processDefinition == null) {
return Collections.emptyList();
}
return getFlowStructureWithExtensions(processDefinition.getId());
}
/**
* 根据流程定义ID获取节点信息
*/
@@ -188,7 +112,7 @@ public class ProcessService {
* @param processDefinitionId
* @return
*/
public List<Map<String, Object>> getFlowStructureWithExtensions(String processDefinitionId) {
private List<Map<String, Object>> getFlowStructureWithExtensions(String processDefinitionId) {
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
if (bpmnModel == null) return Collections.emptyList();
@@ -264,10 +188,6 @@ public class ProcessService {
}
public void deleteAllDeployments() {
repositoryService.createDeploymentQuery()
.list()
@@ -275,12 +195,6 @@ public class ProcessService {
-> repositoryService.deleteDeployment(deployment.getId(), true));
}
// 启动流程实例
public ProcessInstance startByProcessDefinitionKey(String processDefinitionKey) {
return runtimeService.startProcessInstanceByKey(processDefinitionKey);
}
public ProcessInstance startByProcessDefinitionId(String processDefinitionId, Map<String, Object> variables) {
if (variables == null) {
variables = Collections.emptyMap();
@@ -296,11 +210,6 @@ public class ProcessService {
return instance;
}
// 获取BPMN模型用于调试和验证
public BpmnModel getBpmnModel(ProcessDefinitionDTO processDTO) throws Exception {
return dto2BpmnConverter.convert(processDTO);
}
// 验证并返回模型验证错误信息
public List<ValidationError> validateModel(ProcessDefinitionDTO processDTO) throws Exception {
BpmnModel bpmnModel = dto2BpmnConverter.convert(processDTO);
@@ -308,69 +217,16 @@ public class ProcessService {
return validator.validate(bpmnModel);
}
public HistoricProcessInstance getLatestProcessInstance(String processDefinitionKey) {
// 查询最新版本流程定义
ProcessDefinition latestProcDef = repositoryService
.createProcessDefinitionQuery()
.processDefinitionKey(processDefinitionKey)
.latestVersion()
.singleResult();
if (latestProcDef == null) {
return null;
}
// 优先查正在运行的
ProcessInstance running = runtimeService.createProcessInstanceQuery()
.processDefinitionId(latestProcDef.getId())
.orderByStartTime()
.desc()
.listPage(0, 1)
.stream()
.findFirst()
.orElse(null);
if (running != null) {
return historyService.createHistoricProcessInstanceQuery()
.processInstanceId(running.getId())
.singleResult();
}
// 查最近的历史实例(已结束)
return historyService.createHistoricProcessInstanceQuery()
.processDefinitionId(latestProcDef.getId())
.orderByProcessInstanceStartTime()
.desc()
.listPage(0, 1)
.stream()
.findFirst()
.orElse(null);
}
/**
* 查询流程的所有节点状态
*
* @param processInstanceId
* @return
*/
public Map<String, Object> getProcessNodeDetail(String processInstanceId) {
public Map<String, Object> getProcessAndNodeDetailByInstanceId(String processInstanceId) {
return buildProcessNodeDetail(processInstanceId);
}
public Map<String, Object> getNodeDetailByProcessDefinitionKey(String processDefinitionKey) {
HistoricProcessInstance processInstance = getLatestProcessInstance(processDefinitionKey);
if (processInstance == null) {
throw new RuntimeException("流程不存在或未运行过: " + processDefinitionKey);
}
return buildProcessNodeDetail(processInstance.getId());
}
/**
* 根据流程实例ID构建流程节点状态支持 UserTask 任务信息和扩展属性)
*/