day58_BOS项目_10

目录 1、流程变量(设置、获取) 1.1、设置流程变量的方式 1.2、获取流程变量的方式 2、组任务操作(候选人、候选组) 2.1、候选人的组任务(了解) 2.2、候选组的组任务(重点) 3、排他网关的使用(常用) 4、spring 整合 activiti框架 5、将activiti框架应用到bos项目中 5.1、查询流程定义 5.2、部署流程定义(即发布新流程) 5.3、查看png图片 5.4、删除流程定义 今天内容安排: 1、流程变量(设置、获取) 2、组任务操作(候选人、候选组) 3、排他网关的使用 4、spring 整合 activiti框架 5、将activiti框架应用到bos项目中 6、在bos项目中实现流程定义管理(部署、查询、查看png、删除) 回到顶部 1、流程变量(设置、获取) 之前的请假流程,是没有实际意义的,我们要使得我们流程变得有意义(有实际意义),需要在流程向下推进的过程中带着数据推进才有意义。如下图所示: 1.1、设置流程变量的方式 准备工作:重新新建一个数据库,名为activiti_day02,使用框架提供的sql文件建表,今天我们执行Windows批处理文件建表,再使用插件设计一个报销流程图。之后我们部署流程定义。 批处理文件内容如下: ActivitiAcutoCreateTable.bat @echo off title Activiti5-CreateTableProcess color b @echo activiti_day02数据库导入中... mysql -uroot -proot activiti_day02 < activiti.mysql.create.engine.sql mysql -uroot -proot activiti_day02 < activiti.mysql.create.history.sql mysql -uroot -proot activiti_day02 < activiti.mysql.create.identity.sql @rem pause if "%OS%"=="Windows_NT" ENDLOCAL 一共有4种设置流程变量方式,实际开发中都会用到。 方式一:启动流程实例时设置流程变量 /** * 方式一:启动流程实例时设置流程变量 */ @Test public void test2() { String processDefinitionKey = "baoxiaoliucheng"; // 流程定义id Map variables = new HashMap<>(); // 注意:第二个参数是一个HashMap // 设置流程变量 variables.put("key1", "value1"); variables.put("key2", 100); ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey, variables); System.out.println(processInstance.getId()); } 方式二:办理任务时设置流程变量 /** * 方式二:办理任务时设置流程变量 */ @Test public void test3() { String taskId = "106"; Map variables = new HashMap<>(); // 注意:第二个参数是也一个HashMap // 设置流程变量 variables.put("reason", "差旅费用"); variables.put("money", 500); processEngine.getTaskService().complete(taskId, variables); } 就我们当前的报销场景来说,方式二:办理任务时设置流程变量更合理,因为我们在办报销任务的时候,浏览器端会给用户提供一个用户页面,在页面上有一个表单,在表单上可以填写报销原因、报销金额等信息。填写完表单后,一点击提交按钮,这个任务就办理了。所以方式二:办理任务时设置流程变量更合理。在服务器端会将表单提交过来的数据保存至数据库中。 方式三:使用RuntimeService的set方法时设置流程变量 /** * 方式三:使用RuntimeService的set方法时设置流程变量 */ @Test public void test4() { String executionId = "101"; // 流程实例id Map variables = new HashMap<>(); // 注意:第二个参数是也一个HashMap集合 // 设置流程变量 variables.put("审批意见", "报销原因不够详细"); variables.put("user", new User(10, 25, "北京市朝阳区")); // 设置的是自定义的类型 processEngine.getRuntimeService().setVariables(executionId, variables); // processEngine.getRuntimeService().setVariable(executionId, variableName, value); // 一个一个的设置 } 注意:如果设置的是自定义的类型,如User,需要该类实现序列化接口。 方式四:使用TaskService的set方法时设置流程变量 /** * 方式四:使用TaskService的set方法时设置流程变量 */ @Test public void test5() { String taskId = "204"; // 任务id String variableName = "审批意见"; // 注意:在同一个流程实例里面,流程变量的key是不能重复的,若出现重复,会覆盖 String value = "不批,需要详细写清楚报销原因"; processEngine.getTaskService().setVariable(taskId, variableName, value); } 1.2、获取流程变量的方式 方式一:使用RuntimeService的get方法时获取流程变量 /** * 方式一:使用RuntimeService的get方法获取流程变量 */ @Test public void test6() { String executionId = "101"; // 流程实例id Map variables = processEngine.getRuntimeService().getVariables(executionId); System.out.println(variables); // Map集合的toString()方法比较友好,还可以看 // 如果我们自己遍历Map:通过键找值 Set keySet = variables.keySet(); // 先获得键集合 for (String key : keySet) { Object value = variables.get(key); // 通过键找值 System.out.println(key + " = " + value); // 注意:为了使得自定义的类型User打印出来的结果好看些,我们需要在User类中重写User的toString()方法,但是需要重新进行序列化,不然反序列化的时候会报错 } } 方式二:使用TaskService的get方法时获取流程变量 /** * 方式二:使用TaskService的get方法时获取流程变量 */ @Test public void test7() { String taskId = "204"; // 任务id Object value = processEngine.getTaskService().getVariable(taskId , "user"); System.out.println(value); } 方式三:使用框架提供的表达式获取流程变量 示例演示的是:当创建任务的时候(即启动流程实例时),${variableName}表示activiti框架会拿着variableName(流程变量的name,即键key)到流程变量表中去找对应的name。其他的同理。 相应的代码截图: 相应的流程图截图: 相应的数据库表截图: 回到顶部 2、组任务操作(候选人、候选组) 2.1、候选人的组任务(了解) 示例代码如下: package com.itheima.activiti.grouptask; import java.util.HashMap; import java.util.List; import java.util.Map; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.repository.DeploymentBuilder; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.activiti.engine.task.TaskQuery; import org.junit.Test; /** * 组任务测试(候选人) * @author Bruce * */ public class GroupTaskTest { // 获取默认流程引擎(全局变量) ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); /** * 部署流程定义 */ @Test public void test1() { DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment(); deploymentBuilder.addClasspathResource("com/itheima/activiti/grouptask/baoxiaoliucheng.bpmn"); deploymentBuilder.addClasspathResource("com/itheima/activiti/variable/baoxiaoliucheng.png"); deploymentBuilder.deploy(); } /** * 启动流程实例时设置流程变量 */ @Test public void test2() { String processDefinitionKey = "baoxiaoliucheng"; // 流程定义id Map variables = new HashMap<>(); // 注意:第二个参数是一个HashMap集合 // 设置流程变量 variables.put("loginUser", "熊五"); ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey, variables); System.out.println(processInstance.getId()); } /** * 办理任务 */ @Test public void test3() { String taskId = "1002"; // 任务id processEngine.getTaskService().complete(taskId); } /** * 查询组任务 * 如果财务二拾取了组任务,财务三就查询不到组任务了。 */ @Test public void test4() { TaskQuery query = processEngine.getTaskService().createTaskQuery(); String candidateUser = "财务三"; query.taskCandidateUser(candidateUser); // 使用候选人过滤 List list = query.list(); for (Task task : list) { System.out.println(task.getId()); } } /** * 拾取组任务,即将组任务变为个人任务 * 不能两个人拾取同一组任务,若拾取,框架会抛异常 */ @Test public void test5() { String taskId = "902"; processEngine.getTaskService().claim(taskId , "财务二"); } } 候选人的组任务相对于个人任务来说,先进了一些,但是还不够灵活,虽然写了3个具体的人,但是一旦3个人中有人离职了,那么这个流程就不能正常运行了。于是,有个更加灵活的候选组的组任务。 2.2、候选组的组任务(重点) 示例代码如下: package com.itheima.activiti.grouptask; import java.util.HashMap; import java.util.List; import java.util.Map; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.identity.Group; import org.activiti.engine.identity.User; import org.activiti.engine.impl.persistence.entity.GroupEntity; import org.activiti.engine.impl.persistence.entity.UserEntity; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.DeploymentBuilder; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.activiti.engine.task.TaskQuery; import org.junit.Test; /** * 组任务测试(候选组) * @author Bruce * */ public class GroupTaskTest2 { // 获取默认流程引擎(全局变量) ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); /** * 部署流程定义 */ @Test public void test1() { DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment(); deploymentBuilder.addClasspathResource("com/itheima/activiti/grouptask/baoxiaoliucheng2.bpmn"); deploymentBuilder.addClasspathResource("com/itheima/activiti/grouptask/baoxiaoliucheng2.png"); deploymentBuilder.deploy(); } /** * 创建组 */ @Test public void test2() { Group group = new GroupEntity(); // 注意:后期框架act_id_group表与BOS项目的auth_role同步 group.setId("财务组"); // 与流程图的一致 group.setName("管理财务"); processEngine.getIdentityService().saveGroup(group); } /** * 创建用户 */ @Test public void test3() { User user = new UserEntity(); // 注意:后期框架act_id_user表与BOS项目的t_user同步 user.setId("2"); processEngine.getIdentityService().saveUser(user); } /** * 建立用户和组的关系 */ @Test public void test4() { processEngine.getIdentityService().createMembership("2", "财务组"); } /** * 启动流程实例时设置流程变量 */ @Test public void test5() { String processDefinitionKey = "baoxiaoliucheng"; // 流程定义key Map variables = new HashMap(); variables.put("loginUser", "晓艺"); ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey, variables); System.out.println(pi.getId()); } /** * 办理任务 */ @Test public void test6() { String taskId = "1605"; processEngine.getTaskService().complete(taskId); } /** * 查询组任务 */ @Test public void test7() { TaskQuery query = processEngine.getTaskService().createTaskQuery(); String candidateUser = "2"; query.taskCandidateUser(candidateUser); // 使用候选人过滤,更实用直接,因为User是从session中取过来 // query.taskCandidateGroup("财务组"); // 使用候选组过滤,Group是从角色中取过来,稍微麻烦些 List list = query.list(); for (Task task : list) { System.out.println(task.getId()); } } /** * 拾取组任务,将组任务变为个人任务 */ @Test public void test8() { String taskId = "1702"; processEngine.getTaskService().claim(taskId , "1"); } /** * 删除 所有部署流程定义数据(带级联删除) */ @Test public void test9() { List list = processEngine.getRepositoryService().createDeploymentQuery().list(); for (Deployment deployment : list) { processEngine.getRepositoryService().deleteDeployment(deployment.getId(), true); } } } 回到顶部 3、排他网关的使用(常用) 示例代码如下: package com.itheima.activiti.gateway; import java.util.HashMap; import java.util.Map; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.repository.DeploymentBuilder; import org.activiti.engine.runtime.ProcessInstance; import org.junit.Test; /** * 排他网关的测试 * @author Bruce * */ public class GatewayTest { // 获取默认流程引擎(全局变量) ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); /** * 部署流程定义 */ @Test public void test1() { DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment(); deploymentBuilder.addClasspathResource("com/itheima/activiti/gateway/qingjialiucheng.bpmn"); deploymentBuilder.addClasspathResource("com/itheima/activiti/gateway/qingjialiucheng.png"); deploymentBuilder.deploy(); } /** * 方式一:启动流程实例时设置流程变量 */ @Test public void test2() { String processDefinitionKey = "qingjialiucheng"; // 流程定义id Map variables = new HashMap<>(); // 注意:第二个参数是一个HashMap集合 // 设置流程变量 variables.put("qjts", 2); ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey, variables); System.out.println(processInstance.getId()); } /** * 方式二:办理任务时设置流程变量 */ @Test public void test3() { String taskId = "2005"; // 任务id Map variables = new HashMap<>(); // 注意:第二个参数是也一个HashMap集合 // 设置流程变量 variables.put("qjts", 5); processEngine.getTaskService().complete(taskId, variables); } } 回到顶部 4、spring 整合 activiti框架 步骤一:读取(加载)spring配置文件,使用spring提供的流程引擎配置对象 步骤二:提供数据源和事务管理器 步骤三:使用spring提供的流程引擎工厂bean创建流程引擎对象 示例代码如下: applicationContext.xml
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信