You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
210 lines
8.8 KiB
210 lines
8.8 KiB
package com.example.demo.controller;
|
|
|
|
import com.example.demo.entity.Holiday;
|
|
import io.swagger.annotations.Api;
|
|
import io.swagger.annotations.ApiOperation;
|
|
import org.activiti.api.process.runtime.ProcessRuntime;
|
|
import org.activiti.api.task.runtime.TaskRuntime;
|
|
import org.activiti.bpmn.model.BpmnModel;
|
|
import org.activiti.bpmn.model.EndEvent;
|
|
import org.activiti.bpmn.model.FlowNode;
|
|
import org.activiti.bpmn.model.SequenceFlow;
|
|
import org.activiti.engine.*;
|
|
import org.activiti.engine.history.HistoricActivityInstance;
|
|
import org.activiti.engine.history.HistoricTaskInstance;
|
|
import org.activiti.engine.repository.Deployment;
|
|
import org.activiti.engine.runtime.Execution;
|
|
import org.activiti.engine.runtime.ProcessInstance;
|
|
import org.activiti.engine.task.Task;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.web.bind.annotation.GetMapping;
|
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
import org.springframework.web.bind.annotation.RequestParam;
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
/**
|
|
* @author yanpeng
|
|
* @version 1.0
|
|
* @desc TODO
|
|
* @company 北京中经网软件有限公司
|
|
* @date 2020/10/27 14:34
|
|
*/
|
|
@RestController
|
|
@RequestMapping("acback")
|
|
@Api(tags = "工作流驳回等")
|
|
public class ACBackController {
|
|
|
|
@Autowired
|
|
private ProcessEngine processEngine;
|
|
|
|
@Autowired
|
|
private HistoryService historyService;
|
|
|
|
@Autowired
|
|
private RuntimeService runtimeService;
|
|
|
|
@Autowired
|
|
private RepositoryService repositoryService;
|
|
|
|
@Autowired
|
|
private TaskService taskService;
|
|
|
|
@ApiOperation(value = "发布工作流")
|
|
@GetMapping("deploy")
|
|
public void deploy() {
|
|
RepositoryService repositoryService = processEngine.getRepositoryService();
|
|
Deployment deploy = repositoryService.createDeployment().addClasspathResource("bpmn/acback.bpmn").name("测试流程回退").key("myProcess").deploy();
|
|
System.out.println(deploy.getId());
|
|
}
|
|
|
|
@ApiOperation(value = "启动工作流")
|
|
@GetMapping("start")
|
|
public void start(@RequestParam Integer num) {
|
|
// Holiday holiday = new Holiday();
|
|
// holiday.setNum(num);
|
|
Map<String, Object> map = new HashMap<>();
|
|
map.put("num", num);
|
|
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess", map);
|
|
System.out.println(processInstance.getProcessDefinitionId());
|
|
System.out.println(processInstance.getId());
|
|
}
|
|
|
|
|
|
@ApiOperation(value = "查询任务")
|
|
@GetMapping("query")
|
|
public Boolean query() {
|
|
List<Task> testbpmn = taskService.createTaskQuery().processDefinitionKey("myProcess").list();
|
|
testbpmn.stream().forEach(x -> {
|
|
System.out.println(x.getProcessDefinitionId());
|
|
System.out.println(x.getProcessInstanceId());
|
|
System.out.println(x.getId());
|
|
System.out.println(x.getName());
|
|
});
|
|
return true;
|
|
}
|
|
|
|
|
|
@ApiOperation(value = "完成任务")
|
|
@GetMapping("ok")
|
|
public Boolean ok(String taskid) {
|
|
TaskService taskService = processEngine.getTaskService();
|
|
taskService.complete(taskid);
|
|
return true;
|
|
}
|
|
|
|
@ApiOperation(value = "完成任务")
|
|
@GetMapping("back")
|
|
public void backProcess(String processInstanceId, String taskId) {
|
|
// String processInstanceId = task.getProcessInstanceId();
|
|
try {
|
|
// 取得所有历史任务按时间降序排序
|
|
List<HistoricTaskInstance> htiList = historyService.createHistoricTaskInstanceQuery()
|
|
.processInstanceId(processInstanceId)
|
|
.orderByTaskCreateTime()
|
|
.desc()
|
|
.list();
|
|
if (htiList == null || htiList.size() < 2) {
|
|
return;
|
|
}
|
|
// list里的第二条代表上一个任务
|
|
HistoricTaskInstance lastTask = htiList.get(1);
|
|
// list里第一条代表当前任务
|
|
HistoricTaskInstance curTask = htiList.get(0);
|
|
// 当前节点的executionId
|
|
String curExecutionId = curTask.getExecutionId();
|
|
// 上个节点的taskId
|
|
String lastTaskId = lastTask.getId();
|
|
// 上个节点的executionId
|
|
String lastExecutionId = lastTask.getExecutionId();
|
|
if (null == lastTaskId) {
|
|
throw new Exception("LAST TASK IS NULL");
|
|
}
|
|
String processDefinitionId = lastTask.getProcessDefinitionId();
|
|
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
|
|
String lastActivityId = null;
|
|
List<HistoricActivityInstance> haiFinishedList = historyService.createHistoricActivityInstanceQuery()
|
|
.executionId(lastExecutionId).finished().list();
|
|
for (HistoricActivityInstance hai : haiFinishedList) {
|
|
if (lastTaskId.equals(hai.getTaskId())) {
|
|
// 得到ActivityId,只有HistoricActivityInstance对象里才有此方法
|
|
lastActivityId = hai.getActivityId();
|
|
break;
|
|
}
|
|
}
|
|
// 得到上个节点的信息
|
|
FlowNode lastFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(lastActivityId);
|
|
// 取得当前节点的信息
|
|
Execution execution = runtimeService.createExecutionQuery().executionId(curExecutionId).singleResult();
|
|
String curActivityId = execution.getActivityId();
|
|
FlowNode curFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(curActivityId);
|
|
//记录当前节点的原活动方向
|
|
List<SequenceFlow> oriSequenceFlows = new ArrayList<>();
|
|
oriSequenceFlows.addAll(curFlowNode.getOutgoingFlows());
|
|
//清理活动方向
|
|
curFlowNode.getOutgoingFlows().clear();
|
|
//建立新方向
|
|
List<SequenceFlow> newSequenceFlowList = new ArrayList<>();
|
|
SequenceFlow newSequenceFlow = new SequenceFlow();
|
|
newSequenceFlow.setId("newSequenceFlowId");
|
|
newSequenceFlow.setSourceFlowElement(curFlowNode);
|
|
newSequenceFlow.setTargetFlowElement(lastFlowNode);
|
|
newSequenceFlowList.add(newSequenceFlow);
|
|
curFlowNode.setOutgoingFlows(newSequenceFlowList);
|
|
// 完成任务
|
|
// taskService.complete(task.getId());
|
|
taskService.complete(taskId);
|
|
//恢复原方向
|
|
curFlowNode.setOutgoingFlows(oriSequenceFlows);
|
|
Task nextTask = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
|
|
// 设置执行人
|
|
if (nextTask != null) {
|
|
taskService.setAssignee(nextTask.getId(), lastTask.getAssignee());
|
|
}
|
|
System.out.println("退回上一步成功");
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
@ApiOperation(value = "驳回任务")
|
|
@GetMapping("stop")
|
|
public void stop(String taskId) {
|
|
try {
|
|
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
|
|
String processDefinitionId = task.getProcessDefinitionId();
|
|
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
|
|
|
|
// 得到结束节点的信息
|
|
FlowNode stopFlowNode = bpmnModel.getMainProcess().findFlowElementsOfType(EndEvent.class).get(0);
|
|
// 取得当前节点的信息
|
|
// Execution execution = runtimeService.createExecutionQuery().executionId(task.getExecutionId()).singleResult();
|
|
// String curActivityId = execution.getActivityId();
|
|
FlowNode curFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(task.getTaskDefinitionKey());
|
|
//记录当前节点的原活动方向
|
|
List<SequenceFlow> outgoingFlows = new ArrayList<>();
|
|
outgoingFlows.addAll(curFlowNode.getOutgoingFlows());
|
|
//清理活动方向
|
|
curFlowNode.getOutgoingFlows().clear();
|
|
//建立新方向
|
|
List<SequenceFlow> newSequenceFlowList = new ArrayList<>();
|
|
SequenceFlow newSequenceFlow = new SequenceFlow();
|
|
newSequenceFlow.setId("newSequenceFlowId");
|
|
newSequenceFlow.setSourceFlowElement(curFlowNode);
|
|
newSequenceFlow.setTargetFlowElement(stopFlowNode);
|
|
newSequenceFlowList.add(newSequenceFlow);
|
|
curFlowNode.setOutgoingFlows(newSequenceFlowList);
|
|
// 完成任务
|
|
taskService.complete(taskId);
|
|
//恢复原方向
|
|
curFlowNode.setOutgoingFlows(outgoingFlows);
|
|
System.out.println("驳回停止成功");
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
}
|
|
|