package com.hyj.service.impl;
import com.hyj.service.IFlowService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.flowable.bpmn.converter.BpmnXMLConverter;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.Process;
import org.flowable.engine.*;
import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.DeploymentBuilder;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.image.ProcessDiagramGenerator;
import org.flowable.task.api.Task;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Primary
@Service
public class FlowServiceImpl implements IFlowService {
/**
* 日志类
*/
private static final Logger log = LoggerFactory.getLogger(FlowServiceImpl.class);
/**
* Flowable仓库时服务
*/
@Autowired
private RepositoryService repositoryService;
/**
* Flowable运行时服务
*/
@Autowired
private RuntimeService runtimeService;
/**
* Flowable 流程处理引擎
*/
@Autowired
private ProcessEngine processEngine;
/**
* Flowable 任务处理服务
*/
@Autowired
private TaskService taskService;
/**
* Flowable 历史记录信息
*/
@Autowired
private HistoryService historyService;
@Override
public ProcessInstance strartFlow(String processKey, Map<String, Object> paras) {
if (StringUtils.isEmpty(processKey)){
return null;
}
if (null == paras){
paras = new HashMap<>();
}
List<Deployment> deployments = repositoryService.createDeploymentQuery().processDefinitionKey(processKey).list();
if (CollectionUtils.isEmpty(deployments) ){
log.error("没有该流程");
return null;
}
return runtimeService.startProcessInstanceByKey(processKey,paras);
}
@Override
public Map<String,Object> createFlow(String filePath) {
Map<String,Object> res = new HashMap<>();
//解析BPMN模型看是否成功
XMLStreamReader reader = null;
InputStream inputStream = null;
try {
BpmnXMLConverter bpmnXMLConverter = new BpmnXMLConverter();
XMLInputFactory factory = XMLInputFactory.newInstance();
inputStream=new FileInputStream(new File(filePath));
reader = factory.createXMLStreamReader(inputStream);
BpmnModel model = bpmnXMLConverter.convertToBpmnModel(reader);
List<Process> processes = model.getProcesses();
Process curProcess = null;
if (CollectionUtils.isEmpty(processes)) {
log.error("BPMN模型没有配置流程");
return null;
}
res.put("processes",processes);
curProcess = processes.get(0);
inputStream=new FileInputStream(new File(filePath));
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment().name("TEST_FLOW")
.addInputStream(filePath,inputStream);
Deployment deployment= deploymentBuilder.deploy();
res.put("deployment",deployment);
log.warn("部署流程 name:"+curProcess.getName()+" key "+deployment.getKey() + " deploy "+deployment);
return res;
}
catch (Exception e){
log.error("BPMN模型创建流程异常",e);
return null;
}
finally {
try {
reader.close();
} catch (XMLStreamException e) {
log.error("关闭异常",e);
}
}
}
/**
* 流程是否已经结束
*
* @param processInstanceId 流程实例ID
* @return
*/
@Override
public boolean isFinished(String processInstanceId) {
return historyService.createHistoricProcessInstanceQuery().finished()
.processInstanceId(processInstanceId).count() > 0;
}
/**
* 完成任务
*/
@Override
public boolean completeTask(String taskId,Map<String,Object> paras) {
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
if (task == null) {
return false;
}
if (null == paras){
taskService.complete(taskId);
}
else {
taskService.complete(taskId,paras);
}
return true;
}
@Override
public void genProcessDiagram(HttpServletResponse httpServletResponse, String processId) {
/**
* 获得当前活动的节点
*/
String processDefinitionId = "";
if (this.isFinished(processId)) {// 如果流程已经结束,则得到结束节点
HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processId).singleResult();
processDefinitionId=pi.getProcessDefinitionId();
} else {// 如果流程没有结束,则取当前活动节点
// 根据流程实例ID获得当前处于活动状态的ActivityId合集
ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
processDefinitionId=pi.getProcessDefinitionId();
}
List<String> highLightedActivitis = new ArrayList<String>();
/**
* 获得活动的节点
*/
List<HistoricActivityInstance> highLightedActivitList = historyService.createHistoricActivityInstanceQuery().processInstanceId(processId).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 engconf = processEngine.getProcessEngineConfiguration();
ProcessDiagramGenerator diagramGenerator = engconf.getProcessDiagramGenerator();
InputStream in = diagramGenerator.generateDiagram(bpmnModel, "bmp", highLightedActivitis, flows, engconf.getActivityFontName(),
engconf.getLabelFontName(), engconf.getAnnotationFontName(), engconf.getClassLoader(), 1.0, true);
OutputStream out = null;
byte[] buf = new byte[1024];
int legth = 0;
try {
out = httpServletResponse.getOutputStream();
while ((legth = in.read(buf)) != -1) {
out.write(buf, 0, legth);
}
} catch (IOException e) {
log.error("操作异常",e);
} finally {
IOUtils.closeQuietly(out);
IOUtils.closeQuietly(in);
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
flowablestudych15.zip (19个子文件)
flowablestudy
flowablestudy.iml 81B
flowablech5
pom.xml 2KB
src
test
java
main
resources
flows
测试BPMN模型2.bpmn20.xml 3KB
测试BPMN模型3.bpmn20.xml 3KB
测试BPMN模型4.bpmn20.xml 4KB
测试BPMN模型.bpmn20.xml 2KB
application.yml 726B
mapper
java
com
hyj
config
ProcessConfig.java 1KB
mapper
flowlistener
CommonUserStartListener.java 1KB
main
App.java 856B
controller
FlowController.java 8KB
service
impl
FlowServiceImpl.java 8KB
IFlowService.java 868B
pom.xml 4KB
.idea
uiDesigner.xml 9KB
misc.xml 526B
encodings.xml 363B
compiler.xml 780B
workspace.xml 46KB
共 19 条
- 1
资源评论
书山登峰人
- 粉丝: 490
- 资源: 101
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功