activiti笔记

附上eclipse的activiti插件下载地址:http://www.activiti.org/designer/archived/activiti-designer-5.18.0.zip

然后是官方文档地址:https://www.activiti.org/userguide/

1.task

常用的task有UserTask,ScriptTask,ServiceTask

user task是分派给用户的,用户任务

script task是脚本任务

service task指定Java类,调用方法完成任务

2.常用的service

RepositoryService提供流程管理部署的操作

RuntimeService 它处理启动流程定义的新流程实例

TaskService  查询任务,完成任务,创建新的独立任务

IdentityService  对组和用户进行管理(创建、更新、删除、查询……)

FormService  是一项可选服务。这意味着 Activiti 可以在没有它的情况下完美使用,而不会牺牲任何功能。

HistoryService 查询所有历史数据

应用.

1。使用插件创建一个比较复杂的流程图

 

 

 2.启动该流程实例

    @Test
    void contextLoads() {
        ProcessInstance myProcess = runtimeService.startProcessInstanceByKey("myProcess");
    }

3.创建实时流程图,

   @Test
    void png() throws Exception{
        DefaultProcessDiagramGenerator processDiagramGenerator = new DefaultProcessDiagramGenerator();
        BpmnModel bpmnModel = repositoryService.getBpmnModel("myProcess:1:4");
        String id = taskService.createTaskQuery().list().get(0).getId();
        System.out.println(id);
        List<String> activeActivityIds = runtimeService.getActiveActivityIds("6");
        InputStream generateDiagram = processDiagramGenerator.generateDiagram(bpmnModel, "png", activeActivityIds);
        FileOutputStream fileOutputStream = new FileOutputStream(new File("a.png"));
        byte[] bytes = new byte[1024];
        int read;
        while ((read = generateDiagram.read(bytes)) != -1) {
            fileOutputStream.write(bytes);
        }
        generateDiagram.close();
        fileOutputStream.close();
    }

4.如图,启动第一步后流程就在

 

 activiti的api已经提供了创建图片的api,拿来直接用就好了

尝试在HTML页面显示

1.创建controller,然后把处理的逻辑放到service层

@Controller
public class PngController {

    @Autowired
    private PngService pngService;
    @ResponseBody
    @RequestMapping("/getPng")
    public void getPng(HttpServletResponse response) throws IOException {
        pngService.getPng(response);
    }
}

2.创建service

@Service
public class PngService {
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private RepositoryService repositoryService;

    public void getPng(HttpServletResponse response) throws IOException {
        response.setContentType("image/png");//设置类型
        DefaultProcessDiagramGenerator processDiagramGenerator = new DefaultProcessDiagramGenerator();//图片生成器,
        BpmnModel bpmnModel = repositoryService.getBpmnModel("myProcess:1:4");
        String id = taskService.createTaskQuery().list().get(0).getId();
        List<String> activeActivityIds = runtimeService.getActiveActivityIds("6");
        InputStream png = processDiagramGenerator.generateDiagram(bpmnModel, "png", activeActivityIds);
        ServletOutputStream outputStream = response.getOutputStream();
        int read;
        byte[] bytes = new byte[1024];
        while ((read = png.read(bytes))!=-1){
            outputStream.write(bytes);
            outputStream.flush();
        }
        png.close();//关闭流
        outputStream.close();//关闭流
    }
}

3.因为直接@ResponseBody,所以启动应用,访问直接会显示图片

 

 

 此时流程已经到达这里,在service增加历史记录节点。

 public void getPng(HttpServletResponse response) throws IOException {
        response.setContentType("image/png");
        DefaultProcessDiagramGenerator processDiagramGenerator = new DefaultProcessDiagramGenerator();
        BpmnModel bpmnModel = repositoryService.getBpmnModel("myProcess:1:4");
        String id = taskService.createTaskQuery().list().get(0).getId();
        List<String> activeActivityIds = runtimeService.getActiveActivityIds("6");
        List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery().list();//历史记录节点
        for (HistoricActivityInstance h:list
        ) {
            activeActivityIds.add(h.getActivityId());//添加历史记录节点
        }
        InputStream png = processDiagramGenerator.generateDiagram(bpmnModel, "png", activeActivityIds);
        ServletOutputStream outputStream = response.getOutputStream();
        int read;
        byte[] bytes = new byte[1024];
        while ((read = png.read(bytes))!=-1){
            outputStream.write(bytes);
            outputStream.flush();
        }
        png.close();
        outputStream.close();
    }

重新启动并访问,走过的历史节点也被染色了。

 

posted @ 2021-06-02 23:52  张碧晨  阅读(229)  评论(0)    收藏  举报