activiti学习由浅入深04 weir 2014-12-26 11:12:43.0 java,activiti 859 回顾上一些内容,上一节我们实现了流程图的上传与部署,同时产生三张表的数据记录,这里就有疑问了,既然可以上传与部署一起做,是否可以分开呢?当然可以,可以先上传流程图然后再去部署流程。 其实你通过看activiti的源码也能发现,流程的部署其实就是在act_re_deployment(部署信息表) 这个表里面加一条信息来说明流程已经部署,那么怎么来上传的大家先看看用户手册自己想想,看看能不能通过看用户手册上面的信息自己试着做一下上传。 到这里我们就想了流程部署好了怎么用它呀? 既然流程有了我们是不是要有自己的实际业务了,换句话说是不是该有请假资料了,然后根据请假资料的信息再结合我们的请假流程开始流程化操作了,对,就是这样。 请假资料上面需要什么信息呢?开始日期 结束日期 请假天数 请假原因都应该有吧,还有请假类型(病假 事假等等吧),还有就是要和流程结合了,就是说你这个请假是套用哪一个流程呀,这时候你就又有疑问了,请假当然是请假流程了,还会有别的什么,这里你就想错了,不是别的什么而是请假流程可能不会只有一个,这个大家能想明白么?一个公司可能有多套请假流程出来很正常,这与是什么方式的那只有各个公司自己知道了,所以和流程结合也还是要去选择的,这样一来就可能形成这样的模式: 当然根据自身需求这个只是个参考。 这时我们会考虑两个问题添加请假信息到数据库和启动请假流程, 保存请假信息应该不难,那么怎么启动这个流程呢?也就是说怎么让这个人的请假按照我们设定好的流程执行。 这是我们先回顾一下我们最开始涉及的请假流程图在开始节点上面有一个启动人的信息大家还知道么?我们回头找出来这句话: 我们设置的启动人是applyuser,那么我们先理解一下“启动人”这个名词的意思,这里有两个理解大家分析一下哪个正确: 请假的那个人 添加请假信息的那个人 大家想想这两个人可能是两个工人么?当然可能,也可以是一个人,大家想想都什么情况下发生,如果你公司的这个人没有电脑他怎么申请请假,他是不是要去人事部去呀,那么请假人和添加请假信息的人就会是两个人;那如果这个人自己有电脑他是不是可以自己登陆系统去申请呀这是就是一个人了,这是大家就应该明白“启动人”到底是谁了,应该是操作电脑系统的那个人。 那么这里就有另外一个人问题出来了,我们现在设计的流程图满足哪种情况,不能满足哪种情况?很容易我们就是知道只能满足请假人有电脑的情况,因为我们的请假信息里面没有包含请假人这一条,对不对,也就是说请假人没有办法手工选择或者填写,那就是说请假人和输入请假信息的人是同一个人,这样系统拿到用户名就知道是谁在申请请假。 这里我已经把我们的业务分析透了,大家再好好想想,因为业务决定编程,业务不同编程也随之变化。 分析到这里我们开始编程,首先要获取你系统里面已经部署好的流程: /** * 获取所有流程定义 * @return * @throws InvocationTargetException * @throws IllegalAccessException */ @ResponseBody @RequestMapping(“/processDeflist”) public ListprocessDeflist() throwsIllegalAccessException, InvocationTargetException { //获取所有流程定义 ListprocessDefinitions = repositoryService.createProcessDefinitionQuery().list(); Listpds = newArrayList(); for (ProcessDefinition pd : processDefinitions) { ProcessDefinitionVo pdVo = new ProcessDefinitionVo(); pdVo.setId(pd.getId()); pdVo.setName(pd.getName()); pds.add(pdVo); } return pds; } 关键就是这句话: repositoryService.createProcessDefinitionQuery().list();获取所有的流程定义 这就是api 没什么解释的,记住就行 下面我就把添加请假和流程启东代码拿出来: public void startLeave(Leave l,String userId,String processDedId,Map map) { leaveRepository.save(l); //设置流程的启动人 identityService.setAuthenticatedUserId(userId); ProcessDefinition pd = repositoryService.getProcessDefinition(processDedId); ProcessInstance process = runtimeService.startProcessInstanceByKey(pd.getKey(), l.getLeaveId(), map); l.setProcessins(process); l.setProcessinsId(process.getId()); leaveRepository.save(l); } Leave l 这就是请假信息 String userId用户名 String processDedId流程定义ID Map map 这个因为没有条件就new 一下就行,不需要添加信息。 为什么?我们可以看开始之后有两条分支线么?那么map是干嘛的呢?我现在只给你说是存放分支条件的,你能明白多少是是多少,我感觉这么一说就很明白了。那你又会问了分支是什么?那我就告诉你从一条线分出来两条线就叫分支。 好 回到我们的代码看 leaveRepository.save(l);来保存请假信息,不多说 identityService.setAuthenticatedUserId(userId);设置启动人,这是我们讨论过的启动人的概念,这里也不解释了吧,记住就就这么调用就行,也是api里面的嘛。 ProcessDefinition pd = repositoryService.getProcessDefinition(processDedId); 这个是获取流程定义 ProcessInstance process = runtimeService.startProcessInstanceByKey(pd.getKey(), l.getLeaveId(), map);这个就是启动流程的流程实例 大家可能对这些service看不懂我给大家提供一些资料,其实用户手册里面也有: 接着看代码 l.setProcessins(process); l.setProcessinsId(process.getId()); leaveRepository.save(l); 看看这三行代码都干了什么,请假实体类里面还要有 /** * 流程实例ID */ private String processinsId; @Transient private ProcessInstance processins; 这个就是流程实例,也就是在请假表里面存放了流程实例的ID。 那么当你完成这步操作后再去数据库里面查看记录你就会发现很多信息。