Commit 9663fa30 authored by 赵啸非's avatar 赵啸非

添加工作流feign接口

parent 2e9bc04b
......@@ -43,6 +43,11 @@
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
......
......@@ -7,10 +7,8 @@ import lombok.Data;
*/
@Data
public class ApiReqPdu<T> {
/**
* 会员编号
*/
private Member member;
private String seq;
/**
* 透传数据
......
package com.mortals.xhx.flowable.controller;
import cn.hutool.core.codec.Base64;
import com.alibaba.fastjson.JSON;
import com.mortals.framework.exception.AppException;
import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.common.pdu.api.ApiRespPdu;
import com.mortals.xhx.feign.flowable.IApiFlowFeign;
import lombok.extern.apachecommons.CommonsLog;
import org.flowable.bpmn.converter.BpmnXMLConverter;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.engine.*;
import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.image.ProcessDiagramGenerator;
import org.flowable.task.api.Task;
import org.flowable.ui.modeler.domain.Model;
import org.flowable.ui.modeler.serviceapi.ModelService;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author: finegirl
* @date: 2021/7/29 14:00
* @description: 工作流外部调用
**/
@RestController
@CommonsLog
public class ApiFlowImpl implements IApiFlowFeign {
// 流程引擎
@Resource
private ProcessEngine processEngine;
// 部署服务
@Resource
private RepositoryService repositoryService;
// 流程节点任务服务
@Resource
private TaskService taskService;
// 模型服务
@Resource
private ModelService modelService;
// 用户以及组管理服务
@Resource
private IdentityService identityService;
// 流程实例服务
@Resource
private RuntimeService runtimeService;
// 历史数据服务
@Resource
private HistoryService historyService;
@Override
public ApiRespPdu<String> deploy(String modelId) throws AppException {
log.info("流程部署!modelId:" + modelId);
ApiRespPdu<String> rsp = new ApiRespPdu<>();
rsp.setCode(YesNoEnum.YES.getValue());
rsp.setMsg(YesNoEnum.YES.getDesc());
// 根据模型 ID 获取模型
Model modelData = modelService.getModel(modelId);
byte[] bytes = modelService.getBpmnXML(modelData);
if (bytes == null) {
log.error("模型数据为空,请先设计流程并成功保存,再进行发布");
rsp.setCode(YesNoEnum.NO.getValue());
rsp.setMsg(YesNoEnum.NO.getDesc());
rsp.setData("模型数据为空,请先设计流程并成功保存,再进行发布!");
}
BpmnModel model = modelService.getBpmnModel(modelData);
if (model.getProcesses().size() == 0) {
log.error("数据模型不符要求,请至少设计一条主线流程");
rsp.setCode(YesNoEnum.NO.getValue());
rsp.setMsg(YesNoEnum.NO.getDesc());
rsp.setData("数据模型不符要求,请至少设计一条主线流程!");
}
byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);
String processName = modelData.getName() + ".bpmn20.xml";
// 部署流程
repositoryService.createDeployment()
.name(modelData.getName())
.addBytes(processName, bpmnBytes)
.deploy();
log.info("流程部署成功:" + modelId + " " + new Date());
rsp.setData("流程部署成功:" + modelId + " " + new Date());
return rsp;
}
@Override
public ApiRespPdu<String> start(String deployId, String userId, String dataKey) throws AppException {
ApiRespPdu<String> rsp = new ApiRespPdu<>();
rsp.setCode(YesNoEnum.YES.getValue());
rsp.setMsg(YesNoEnum.YES.getDesc());
// 设置发起人
identityService.setAuthenticatedUserId(userId);
// 根据流程 ID 启动流程
ProcessInstance processInstance = runtimeService.startProcessInstanceById(deployId, dataKey);
log.info("流程启动成功:" + deployId + " processInstance:" + JSON.toJSONString(processInstance));
rsp.setData(JSON.toJSONString(processInstance));
return rsp;
}
@Override
public ApiRespPdu<String> taskByAssignee(String taskId, String assignee, Map<String, Object> map) {
ApiRespPdu<String> rsp = new ApiRespPdu<>();
rsp.setCode(YesNoEnum.YES.getValue());
rsp.setMsg(YesNoEnum.YES.getDesc());
// 设置审核人
taskService.setAssignee(taskId, assignee);
// 设置任务参数,也可不设置:key value,只是示例
// 带 Local 为局部参数,只适用于本任务,不带 Local 为全局任务,可在其他任务调用参数
taskService.setVariableLocal(taskId, "status", true);
// 完成任务
taskService.complete(taskId, map);
log.info("任务完成:" + taskId + " " + new Date());
return rsp;
}
@Override
public ApiRespPdu<String> deleteProcess(String processId) {
return null;
}
@Override
public ApiRespPdu<List<String>> getRuntimeDataId() {
return null;
}
@Override
public ApiRespPdu<List<Map<String, Object>>> getRuntimeBusinessKeyByUser(String userId) {
return null;
}
@Override
public ApiRespPdu<List<Map<String, Object>>> getRuntimeBusinessKeyByGroup(List<String> groupIds) {
return null;
}
@Override
public ApiRespPdu<List<Map<String, Object>>> getHistoryByUser(String userId) {
return null;
}
@Override
public ApiRespPdu<Boolean> checkProcessInstanceFinish(String processInstanceId) {
return null;
}
@Override
public ApiRespPdu<String> setVariables(String taskId, Map<String, Object> map) {
log.info("设置任务参数:" + taskId + " map:" + JSON.toJSONString(map));
ApiRespPdu<String> rsp = new ApiRespPdu<>();
rsp.setCode(YesNoEnum.YES.getValue());
rsp.setMsg(YesNoEnum.YES.getDesc());
String processInstanceId = taskService.createTaskQuery().taskId(taskId).singleResult().getProcessInstanceId();
runtimeService.setVariables(processInstanceId, map);
return rsp;
}
@Override
public ApiRespPdu<String> setVariable(String taskId, String key, Object value) {
ApiRespPdu<String> rsp = new ApiRespPdu<>();
rsp.setCode(YesNoEnum.YES.getValue());
rsp.setMsg(YesNoEnum.YES.getDesc());
String processInstanceId = taskService.createTaskQuery().taskId(taskId).singleResult().getProcessInstanceId();
runtimeService.setVariable(processInstanceId, key, value);
return rsp;
}
@Override
public ApiRespPdu<String> setListVariable(String taskId, String key, List<String> list) {
log.info(String.format("设置任务参数:%s ,key:%s,list:%s", taskId, key, JSON.toJSONString(list)));
ApiRespPdu<String> rsp = new ApiRespPdu<>();
rsp.setCode(YesNoEnum.YES.getValue());
rsp.setMsg(YesNoEnum.YES.getDesc());
String processInstanceId = taskService.createTaskQuery().taskId(taskId).singleResult().getProcessInstanceId();
runtimeService.setVariable(processInstanceId, key, list);
return rsp;
}
@Override
public ApiRespPdu<String> task(String taskId) {
ApiRespPdu<String> rsp = new ApiRespPdu<>();
rsp.setCode(YesNoEnum.YES.getValue());
Boolean isSuspended = taskService.createTaskQuery().taskId(taskId).singleResult().isSuspended();
if (isSuspended) {
log.info("任务已挂起,无法完成");
rsp.setCode(YesNoEnum.NO.getValue());
rsp.setData("任务已挂起,无法完成");
return rsp;
}
// 设置任务参数,也可不设置:key value
// 带 Local 为局部参数,只适用于本任务,不带 Local 为全局任务,可在其他任务调用参数
taskService.setVariableLocal(taskId, "status", true);
// 完成任务
taskService.complete(taskId);
log.info("任务完成:" + taskId + " " + new Date());
return rsp;
}
@Override
public ApiRespPdu<String> getTaskInfo(String taskId) {
ApiRespPdu<String> rsp = new ApiRespPdu<>();
rsp.setCode(YesNoEnum.YES.getValue());
rsp.setMsg(YesNoEnum.YES.getDesc());
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
rsp.setData(task.getProcessInstanceId());
return rsp;
}
@Override
public String getProcessDiagram(String processInstanceId) throws AppException {
// 流程定义 ID
String processDefinitionId;
// 查看完成的进程中是否存在此进程
long count = historyService.createHistoricProcessInstanceQuery().finished().processInstanceId(processInstanceId).count();
if (count > 0) {
// 如果流程已经结束,则得到结束节点
log.info("流程已经结束,则得到结束节点!");
HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
processDefinitionId = pi.getProcessDefinitionId();
} else {// 如果流程没有结束,则取当前活动节点
log.info("流程没有结束,则取当前活动节点!");
// 根据流程实例ID获得当前处于活动状态的ActivityId合集
ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
processDefinitionId = pi.getProcessDefinitionId();
}
List<String> highLightedActivitis = new ArrayList<>();
// 获得活动的节点
List<HistoricActivityInstance> highLightedActivitList = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).orderByHistoricActivityInstanceStartTime().asc().list();
for (HistoricActivityInstance tempActivity : highLightedActivitList) {
String activityId = tempActivity.getActivityId();
highLightedActivitis.add(activityId);
}
List<String> flows = new ArrayList<>();
// 获取流程图
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
ProcessEngineConfiguration processEngineConfig = processEngine.getProcessEngineConfiguration();
ProcessDiagramGenerator diagramGenerator = processEngineConfig.getProcessDiagramGenerator();
InputStream in = diagramGenerator.generateDiagram(bpmnModel, "bmp", highLightedActivitis, flows, processEngineConfig.getActivityFontName(),
processEngineConfig.getLabelFontName(), processEngineConfig.getAnnotationFontName(), processEngineConfig.getClassLoader(), 1.0, true);
//通过流生成图片并转化为base64
return Base64.encode(in);
}
@Override
public ApiRespPdu<String> getTaskProcessDiagram(String taskId) {
return null;
}
}
package com.mortals.xhx.flowable.listener;
import lombok.extern.apachecommons.CommonsLog;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
......@@ -14,6 +15,7 @@ import javax.annotation.PostConstruct;
* 会签监听器示例
*/
@Component
@CommonsLog
public class MyListener implements ExecutionListener {
// 页面配置参数注入
......
......@@ -27,7 +27,7 @@
<link rel="Stylesheet" href="libs/handsontable_0.31.2/handsontable.full.min.css" type="text/css"/>
<!-- build:css styles/3thparty.css -->
<link rel="stylesheet" href="libs/bootstrap_3.1.1/css/bootstrap.css"/>
<link rel="stylesheet" href="libs/bootstrap_3.1.1/css/bootstrap.min.css"/>
<link rel="stylesheet" href="libs/bootstrap-tour_0.9.1/bootstrap-tour.min.css"/>
<link rel="stylesheet" href="libs/angular-spectrum-colorpicker_1.0.13/spectrum.css"/>
<!-- endbuild -->
......
......@@ -25,6 +25,7 @@
</dependency>
<!-- 引入 SpringMVC 相关依赖,并实现对其的自动配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
......
###流程查询
POST {{baseUrl}}/m/test/task/acceptor
Content-Type: application/json
{"seq":"123456","transmission":{"processInstanceId":"11111"}}
###流程部署
POST {{baseUrl}}/m/test/task/deploy
Content-Type: application/json
{"seq":"123456","transmission":{"processInstanceId":"11111","modelId":"f589444d-efa8-11eb-99ca-c25bd865180b"}}
\ No newline at end of file
package com.mortals.xhx.daemon.demo;
import com.alibaba.fastjson.JSON;
import com.mortals.xhx.common.model.RequestTaskReq;
import com.mortals.xhx.common.pdu.api.ApiReqPdu;
import com.mortals.xhx.common.pdu.api.ApiRespPdu;
import com.mortals.xhx.feign.flowable.IApiFlowFeign;
import lombok.extern.apachecommons.CommonsLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
/**
* @author karlhoo
*/
@CommonsLog
@RestController
@RequestMapping("test")
public class RequestDispatchController {
@Autowired
private IApiFlowFeign apiFlowFeign;
@PostMapping("task/acceptor")
public ApiRespPdu taskAcceptor(@RequestBody ApiReqPdu<RequestTaskReq> req) {
log.info("receive api request:" + JSON.toJSONString(req));
String processDiagram = apiFlowFeign.getProcessDiagram(req.getTransmission().getProcessInstanceId());
log.info("receive api base64 receive:" + processDiagram);
ApiRespPdu<String> respPdu = new ApiRespPdu<>();
respPdu.setData(processDiagram);
return respPdu;
}
@PostMapping("task/deploy")
public ApiRespPdu deploy(@RequestBody ApiReqPdu<RequestTaskReq> req) {
log.info("receive api request:" + JSON.toJSONString(req));
ApiRespPdu<String> deploy = apiFlowFeign.deploy(req.getTransmission().getModelId());
log.info("receive api base64 receive:" + JSON.toJSONString(deploy));
ApiRespPdu<String> respPdu = new ApiRespPdu<>();
respPdu.setData(JSON.toJSONString(deploy));
return respPdu;
}
@PostMapping("task/start")
public ApiRespPdu start(@RequestBody ApiReqPdu<RequestTaskReq> req) {
log.info("receive api request:" + JSON.toJSONString(req));
ApiRespPdu<String> start = apiFlowFeign.start(req.getTransmission().getDeployId(), req.getTransmission().getUserId(), req.getTransmission().getDataKey());
log.info("receive api start receive:" + JSON.toJSONString(start));
ApiRespPdu<String> respPdu = new ApiRespPdu<>();
respPdu.setData(JSON.toJSONString(start));
return respPdu;
}
@PostMapping("task/complete")
public ApiRespPdu taskComplete(@RequestBody ApiReqPdu<RequestTaskReq> req) {
log.info("receive api request:" + JSON.toJSONString(req));
//任务完成,设置审核人,完成当前任务
HashMap<String, Object> map = new HashMap<>();
map.put("test","1111");
apiFlowFeign.taskByAssignee(req.getTransmission().getTaskId(),req.getTransmission().getAssignee(),map);
ApiRespPdu<String> start = apiFlowFeign.start(req.getTransmission().getDeployId(), req.getTransmission().getUserId(), req.getTransmission().getDataKey());
log.info("receive api complete receive:" + JSON.toJSONString(start));
ApiRespPdu<String> respPdu = new ApiRespPdu<>();
respPdu.setData(JSON.toJSONString(start));
return respPdu;
}
public static void main(String[] args) {
RequestTaskReq requestTaskReq = new RequestTaskReq();
requestTaskReq.setProcessInstanceId("11111");
requestTaskReq.setDeployId("1");
requestTaskReq.setUserId("admin");
requestTaskReq.setDataKey("data");
ApiReqPdu<RequestTaskReq> requestTaskReqApiReqPdu = new ApiReqPdu<>();
requestTaskReqApiReqPdu.setTransmission(requestTaskReq);
requestTaskReqApiReqPdu.setSeq("123456");
System.out.println(JSON.toJSONString(requestTaskReqApiReqPdu));
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment