二、眉头一皱退到众人身后
身子养好了,开始脱离凡尘做筹备
-
第六步:流程部署
(一)流程部署形式一、@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 文件中的 process id");
启动后发现有新的表数据:
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<Task> 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<HistoricActivityInstance> 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("<==========================>"); } }
运行截图: