# vue-bpmn-activiti
**Repository Path**: jiangtaoCode/vue-bpmn-activiti
## Basic Information
- **Project Name**: vue-bpmn-activiti
- **Description**: bpmn-js 封装成 Vue 组件。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 5
- **Forks**: 1
- **Created**: 2022-02-10
- **Last Updated**: 2023-07-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# vue-bpmn-activiti 组件库
### 快速开始
#### 1. 安装组件库
```bash
npm i @jt_coder/vue-bpmn-activiti
```
#### 2. 引用组件库
```javascript
import "@jt_coder/vue-bpmn-activiti/dist/index.css";
import VueBpmn from "@jt_coder/vue-bpmn-activiti";
Vue.use(VueBpmn);
```
### 预览图

### 流程设计组件(BpmnDesigner)
#### 示例
```javascript
onChange(xml) {
console.log("xml:", xml);
},
```
#### 属性说明
| 属性 | 说明 | 类型 | 默认值 |
| ------ | --------------------- | ------ | ------ |
| xmlStr | activiti xml 格式数据 | string | - |
#### 事件说明
| 事件名称 | 说明 | 回调参数 |
| -------- | ---------------------------------------- | --------------- |
| change | 元素新增,删除,修改,移动,属性设置触发 | (event) => void |
### 流程预览组件(BpmnView)
#### 示例
```javascript
data() {
return {
bpmnXml,
highlightOptions: {
h__highPoint: ["Event_09ccqp5", "Activity_07td992"],
h__iDo: ["Activity_1bj9xl3"],
h__waitingToDo: ["Event_1w1dma1"],
},
};
},
```
#### 属性说明
| 属性 | 说明 | 类型 | 默认值 |
| ---------------- | ------------------------------- | ------ | -------------------------------------------------------------- |
| xmlStr | activiti xml 格式数据 | string | - |
| highlightOptions | 高亮节点数据,属性和高亮类型对应 | obj | null |
| types | 高亮类型 | array | [ "h__highLine", "h__highPoint", "h__iDo", "h__waitingToDo", ] |
#### 渲染流程
1. 准备流程定义 xml
2. 准备高亮节点数据
3. 渲染图形化流程
4. 根据高亮数据着色
参考:[bpmn colors exapmles, Options3](https://github.com/bpmn-io/bpmn-js-examples/tree/master/colors)
#### java 获取节点高亮数据接口
参考:[Activiti7 精讲&Java 通用型工作流开发实战](https://coding.imooc.com/class/454.html)
```java
/**
* 获取历史高亮信息
* @param instanceId 流程实例ID
*/
public Map getHighlight(String instanceId) {
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(instanceId).singleResult();
//获取bpmnModel对象
BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId());
//因为我们这里只定义了一个Process 所以获取集合中的第一个即可
Process process = bpmnModel.getProcesses().get(0);
//获取所有的FlowElement信息
Collection flowElements = process.getFlowElements();
Map map = new HashMap<>();
for (FlowElement flowElement : flowElements) {
//判断是否是连线
if (flowElement instanceof SequenceFlow) {
SequenceFlow sequenceFlow = (SequenceFlow) flowElement;
String ref = sequenceFlow.getSourceRef();
String targetRef = sequenceFlow.getTargetRef();
map.put(ref + targetRef, sequenceFlow.getId());
}
}
//获取流程实例 历史节点(全部)
List list = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(instanceId)
.list();
//各个历史节点 两两组合 key
Set keyList = new HashSet<>();
for (HistoricActivityInstance i : list) {
for (HistoricActivityInstance j : list) {
if (i != j) {
keyList.add(i.getActivityId() + j.getActivityId());
}
}
}
//高亮连线ID
Set highLine = new HashSet<>();
keyList.forEach(s -> highLine.add(map.get(s)));
//获取流程实例 历史节点(已完成)
List listFinished = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(instanceId)
.finished()
.list();
//高亮节点ID
Set highPoint = new HashSet<>();
listFinished.forEach(s -> highPoint.add(s.getActivityId()));
//获取流程实例 历史节点(待办节点)
List listUnFinished = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(instanceId)
.unfinished()
.list();
//需要移除的高亮连线
Set set = new HashSet<>();
//待办高亮节点
Set waitingToDo = new HashSet<>();
listUnFinished.forEach(s -> {
waitingToDo.add(s.getActivityId());
for (FlowElement flowElement : flowElements) {
//判断是否是 用户节点
if (flowElement instanceof UserTask) {
UserTask userTask = (UserTask) flowElement;
if (userTask.getId().equals(s.getActivityId())) {
List outgoingFlows = userTask.getOutgoingFlows();
//因为 高亮连线查询的是所有节点 两两组合 把待办 之后 往外发出的连线 也包含进去了 所以要把高亮待办节点 之后 即出的连线去掉
if (outgoingFlows != null && outgoingFlows.size() > 0) {
outgoingFlows.forEach(a -> {
if (a.getSourceRef().equals(s.getActivityId())) {
set.add(a.getId());
}
});
}
}
}
}
});
highLine.removeAll(set);
Set iDo = new HashSet<>(); //存放 高亮 我的办理节点
String AssigneeName = getUserInfo().getId();
List taskInstanceList = historyService.createHistoricTaskInstanceQuery()
.taskAssignee(AssigneeName)
.finished()
.processInstanceId(instanceId).list();
taskInstanceList.forEach(a -> iDo.add(a.getTaskDefinitionKey()));
Map reMap = new HashMap<>();
reMap.put("highPoint", highPoint);
reMap.put("highLine", highLine);
reMap.put("waitingToDo", waitingToDo);
reMap.put("iDo", iDo);
return reMap;
}
```