Activiti工作流入门筑基下篇-养性
二、眉头一皱退到众人身后
身子养好了,开始脱离凡尘做准备
- 第六步:流程部署
(一)流程部署方式一、
@Test public void GenActivitiTables2() { //创建流程引擎ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2、获取RepositoryServcie(re表的服务层) RepositoryService repositoryService = processEngine.getRepositoryService(); //3、使用service进行流程的部署,部署bpmn和png Deployment deploy = repositoryService.createDeployment().name("出差申请流程") .addClasspathResource("bpmn/holiday.bpmn20.xml") .addClasspathResource("bpmn/holiday.bpmn20.png") .deploy(); }
(二)、流程部署方式二、
//1、将png和bpmn打包成zip包 //2、创建(流程引擎)ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //3、获取RepositoryServcie(re表的服务层)\ RepositoryService repositoryService = processEngine.getRepositoryService(); //读取资源包文件,构造成inputStream InputStream inputStream = this.getClass() .getClassLoader() .getResourceAsStream("bpmn/holiday.zip"); //用inputStream 构造ZipInputStream ZipInputStream zipInputStream = new ZipInputStream(inputStream); //使用压缩包的流进行流程的部署 Deployment deploy = repositoryService.createDeployment() .addZipInputStream(zipInputStream) .deploy();
部署去数据库查看,原来没有日期的表现在有了日期的,点击进去可以查看具体数据
文章图片
- 第七步:启动流程实例
//1、创建ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2、获取RunTimeService RuntimeService runtimeService = processEngine.getRuntimeService(); //3、根据流程定义的id启动流程 ProcessInstance instance = runtimeService.startProcessInstanceByKey("就是bpmn文件中的processid");
启动后发现有新的表数据:
act_hi_taskinst(历史任务实例数据表)
act_hi_procinst(历史流程实例数据表,正在执行的任务也在其中)
act_hi_actinst(历史节点数据,图片上的节点信息)
act_hi_identitylink(历史流程用户信息数据表)
act_ru_execution运行时流程执行实例数据表,一条是开始事件的执行实例,这个一直存在,只到流程结束后才会自动删除,is_active字段表示是否正在执行实例)
act_ru_task(运行时任务信息数据信息表)
- 第八步:查询个人代办任务
@Test public void getActiv(){ //1、获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2、获取taskService TaskService taskService = processEngine.getTaskService(); //3、根据流程key 和 任务的负责人 查询任务 List
taskList = taskService.createTaskQuery().processDefinitionKey("holiday").taskAssignee("zhangsan").list(); //4、输出 for (org.activiti.engine.task.Task task : taskList) { System.out.println("流程实例id="+task.getProcessInstanceId()); System.out.println("任务Id="+task.getId()); System.out.println("任务负责人="+task.getAssignee()); System.out.println("任务名称="+task.getName()); }}
执行结果:
文章图片
进入数据库也可以查看到信息:
select distinct RES.* from ACT_RU_TASK RES inner join ACT_RE_PROCDEF D on RES.PROC_DEF_ID_ = D.ID_ WHERE RES.ASSIGNEE_ = 'zhangsan' and D.KEY_ = 'holiday' order by RES.ID_ asc LIMIT 2147483647 OFFSET 0;
- 第九步:完成个人任务
- 第一种方式:直接完成整个流程,找整个流程的创建负责人
//完成个人任务 @Test public void finshActivity(){ //获取引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取操作任务的服务 TaskService TaskService taskService = processEngine.getTaskService(); //完成任务,参数:任务id,完成zhangsan的任务,2505是ACT_RU_TASK表的id taskService.complete("2505"); }
代码运行后,数据库表ACT_HI_TASKINST(历史的任务实例表)会有endtime数据
文章图片
- 第二种方式:将整个流程走完,每个阶段负责人完成每个阶段任务
从流程来看先完成经理审批 @Test //完成其他角色的任务 public void finshotherActivity(){ //完成经理jerry的任务 //获取引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取操作任务的服务 TaskService TaskService taskService = processEngine.getTaskService(); //获取jerry - myEvection 对应的任务 Task task = taskService.createTaskQuery() .processDefinitionKey("holiday") .taskAssignee("jerry") .singleResult(); //完成jerry的任务 taskService.complete(task.getId()); System.out.println("流程实例id="+task.getProcessInstanceId()); System.out.println("任务Id="+task.getId()); System.out.println("任务负责人="+task.getAssignee()); System.out.println("任务名称="+task.getName()); 执行后: 流程实例id=2501 任务Id=5002 任务负责人=jerry 任务名称=经理审批
执行后数据库表act_ru_task数据整体发生变化
文章图片
从jerry的信息变成了jack的信息,也就意味着jerry经理审批这一步已经走完,开始走jack的阶段,运行后到财务信息
//完成jack的任务 Task taskjack = taskService.createTaskQuery() .processDefinitionKey("holiday") .taskAssignee("jack") .singleResult(); System.out.println("流程实例id="+taskjack .getProcessInstanceId()); System.out.println("任务Id="+taskjack .getId()); System.out.println("任务负责人="+taskjack .getAssignee()); System.out.println("任务名称="+taskjack .getName()); //完成jack的任务 taskService.complete(taskjack.getId());
数据库:
文章图片
财务:
////完成rose的任务 Task taskrose = taskService.createTaskQuery() .processDefinitionKey("holiday") .taskAssignee("rose") .singleResult(); System.out.println("流程实例id="+taskrose .getProcessInstanceId()); System.out.println("任务Id="+taskrose .getId()); System.out.println("任务负责人="+taskrose .getAssignee()); System.out.println("任务名称="+taskrose .getName()); //完成任务 taskService.complete(taskrose.getId());
act_ru_task表显示:
文章图片
act_hi_taskinst表显示:到这里就意味着流程走完了,endtime有了数值
文章图片
- 第一种方式:直接完成整个流程,找整个流程的创建负责人
- 第十步:查看历史流程
//获取历史信息 @Test public void hostiry() { //获取引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取HistoryService HistoryService historyService = processEngine.getHistoryService(); //获取 actinst表的查询对象 HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery(); //查询 actinst表,条件:根据 InstanceId 查询 //instanceQuery.processInstanceId("2501"); //查询 actinst表,条件:根据 DefinitionId 查询 instanceQuery.processDefinitionId("holiday:1:4"); //增加排序操作,orderByHistoricActivityInstanceStartTime 根据开始时间排序 asc 升序 instanceQuery.orderByHistoricActivityInstanceStartTime().asc(); //查询所有内容 List activityInstanceList = instanceQuery.list(); //输出 for(HistoricActivityInstance hi : activityInstanceList) { System.out.println(hi.getActivityId()); System.out.println(hi.getActivityName()); System.out.println(hi.getProcessDefinitionId()); System.out.println(hi.getProcessInstanceId()); System.out.println("<==========================>"); }}
【Activiti工作流入门筑基下篇-养性】运行截图:
文章图片
推荐阅读
- Activiti工作流入门筑基上篇-修身
- Element|Element-UI快速入门
- Vue.js入门到精通|基于Vue Computed Watch Filter知识点小案例(购物车)
- Vue.js入门到精通|最常见的需求基于Vue的批量删除你会嘛
- Vue.js入门到精通|2022年Vue最常见的面试题以及填空题(面试必问)
- Vue.js入门到精通|最新【vue】使用vue-cli5.0快速搭建一个项目
- 中间件|Zookeeper详解(从安装—入门—使用)
- vue从入门到成神|Vue2.x 安装 SCSS并使用
- 计算机软件硬件维修,电脑软硬件维修从入门到精通
- android|android ble 标准服务,Android BLE开发入门