请假流程实例
基本介绍
通过一个小例子了解activiti 工作流程的原理,
注意:执行人可以直接设置,也可以取自流程变量,用${}或者#{}获取,同时还可以在监听器中设置
部署流程定义:deploy();
设置流程启动人:identityService.setAuthenticatedUserId(启动人ID号);
启动流程(根据Key获取根据ID)、
runtimeService.startProcessInstanceByKey(流程定义id,流程变量集合(一般是用map));//流程变量可以设置,也可以不设置,根据流程的需要来确定
办理任务:taskService.complete(任务节点ID,流程变量);// 流程变量可以设置,也可以不设置,根据流程的需要来确定.
查询:
流程定义查询
流程实例查询
流程变量查询
任务实例查询
流程图
申请人---上级领导—人事部—结束
流程属性
开始节点
流程变量:
申请人ID(“qwe”)
申请标题:请假回家
申请理由:休假
申请时间:
请假天数:
上级领导ID:managerId
上级领导审批
执行人:用变量获取${ managerId }
审批结果:通过/不通过
理由:
hr审批
用变量获取${hr }
审批结果:通过/不通过
理由:
结束
开始部署流程
用junit进行测试:
首先创建流程引擎
/**
* 手动获取流程引擎
* @return
*/
public ProcessEngineprocessEngine() {
ProcessEngineConfigurationprocessEngineConfig= ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource("activiti/cfg/activiti.cfg.xml");
//ProcessEngine流程引擎的抽象,通过它我们可以获得我们需要的一切服务
ProcessEngineprocessEngine = processEngineConfig.buildProcessEngine();
return processEngine; //有返回值时报错
}
部署流程
/**
* 用Classpath的方法部署流程
* @throws Exception
*/
@Test
public void test_Deploy() throws Exception{
RepositoryService repositoryService =processEngine().getRepositoryService();
String Path="activiti/diagrams/请假流程实例1.bpmn";//文件路径
String Path1="activiti/diagrams/请假流程实例1.png";
repositoryService.createDeployment()//创建部署对象
.addClasspathResource(Path)
.addClasspathResource(Path1)
.name("请假流程实例1")//给流程定义命名
.category("日常办公")//设置流程类型
.deploy();//部署--发布
}
流程部署后流程定义表中以下信息:
act_re_deployment
在网页中进行启动和查看流程
已经部署的流程查询
//查看已经部署流程的最新版本
@Override
public ListgetDeploymentList() {
// TODO Auto-generated method stub
Listlist = repositoryService.createProcessDefinitionQuery()
.latestVersion().list();
return list;
}
页面中展示:
启动流程设置申请人的流程变量
startProcessInstanceByKey :根据流程定义中最新的流程版本进行启动
public voidstartprocessByKey(String key){
Stringapplyuser ="zyq";
identityService.setAuthenticatedUserId(applyuser);
Map<String,Object>variables = new HashMap();//设置流程变量
variables.put("applyUserId","qwer");
variables.put("applyTitle","test_请假申请流程");
variables.put("applyTime","7天");
variables.put("applyCtreateTime",new Date());
variables.put("applyReason","休假");
variables.put("managerId ","xxx");
ProcessInstanceprocessInstance = runtimeService.startProcessInstanceByKey(key,variables);
Tasktask = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
System.out.println(task.getAssignee());
}
启动后各表的变化不再列出
流程启动后可以查询上级领导xxx 是否有收到流程
任务查询
/**
* 任务查询个人
*/
@Test
public void test_searchTask(){
TaskServicetaskService =processEngine().getTaskService();
List<Task> list = taskService.createTaskQuery().taskAssignee(managerId)//根据执行人查询
.orderByTaskCreateTime().desc()
.list();
for(Task t:list){
System.out.println("任务节点id:"+t.getId());
System.out.println("任务节点名:"+t.getName());
System.out.println("任务节点所属流程定义Id:"+t.getProcessDefinitionId());
}
}
执行结果:
任务节点id:30010
任务节点名:上级领导审批
任务节点所属流程定义Id:请假流程实例1:2:27504
上级领导办理任务(hr办理同理)
@Override
public void myTaskeComplete(String taskId) {
Map<String,Object>variables = new HashMap();//设置流程变量
variables.put("managerCheckResult", "同意");
variables.put("managerCheckreason","可用年休假");
variables.put("managerCheckrTime",new Date());
variables.put("hr", "xxhr");
taskService.complete(taskId,variables);
}
可以查询正运行的任务表和历史任务表各自的变化
最后流程变量汇总: