目标
在不使用activiti explore提供的流程实例图diagram-viewer/index.html以及其繁杂的BaseProcessDefinitionDiagramLayoutResource四个类的情况下,自定义轻量的流程活动图查询接口,可以按顺序返回串行显示的流程数据,并标识执行与否,注意,本例仅解决串行显示的需求,如果需要1:1完全绘制流程,包括排他网关等,则建议复用流程实例图diagram-viewer/index.html以及后端接口。
返回格式
demo:
{
"code":0,
"data":[
{
"activityId":"start_1",
"activityName":"发起任务",
"assign":"admin",
"endTime":"2020-05-07 13:54:15",
"highLight":true,
"startTime":1588830855000
},
{
"activityId":"exec_4",
"activityName":"执行任务",
"assign":"xx",
"endTime":"",
"highLight":true,
"startTime":1588830855000
},
{
"activityId":"confirm_5",
"activityName":"确认结果",
"assign":"",
"endTime":"",
"highLight":false,
"startTime":0
}
],
"message":"成功",
"success":true
}
后端接口逻辑
首先activiti 的数据表模块分运行时(act_ru_execution)和历史(act_hi_procinst、act_hi_actinst),一般来说业务需求中都会有查全部的功能,这个时候需要返回所有的数据,包括运行时和历史。所以如果用户从历史流程列表入口点进流程图页面,这个时候他点击的是已完成的历史流程,后台接口根据历史流程ID采用runtimeService去查,立刻就报错。而简易渲染只关注userTask和startEvent,这个时候只需要查出这两种类型即可。
HistoricActivityInstanceQuery query = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).activityType("userTask");
List<HistoricActivityInstance> list = query.list();
HistoricActivityInstance startEvent = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).activityType("startEvent").singleResult();
然后再从中取出需要的活动节点信息,并封装,准备下一步顺序拼接。
for (HistoricActivityInstance tmpHisAct : list) {
ProcessActivityModel processActivityModel = new ProcessActivityModel();
if (tmpHisAct != null) {
processActivityModel.setActivityId(tmpHisAct.getActivityId());
processActivit