activiti学习由浅入深08 weir 2014-12-26 11:18:18.0 java,activiti 2424 接下来我们先完成签收操作: /** * 签收 * @param taskIds * @param session * @return */ @ResponseBody @RequestMapping(“/claim”) public Json claim(String taskIds,HttpSession session) { Json j = new Json(); // User u = (User) session.getAttribute(“U”); User user = (User) session.getAttribute(“U”); if (user==null) { j.setMsg(“用户需要登录”); return j; } try { String[] ids = taskIds.split(“,”); for (String taskId : ids) { workFlowService.claim(taskId, user.getUserId()); } j.setMsg(“签收成功”); j.setSuccess(true); } catch (Exception e) { j.setMsg(e.getMessage()); e.printStackTrace(); } return j; } @Override public void claim(String taskId, String userId) { taskService.claim(taskId, userId); } 这里我就说这一句话:taskService.claim(taskId, userId); 这就是签收。那么签收是操作了哪个表呢?大家应该能想到 act_ru_task操作的就是这个表的ASSIGNEE_ 字段,把签收人的ID保存一下。 签收完之后立马就变成了处理状态,也是当前用户,处理是不是要审核是否同意呀,也就是说我要在一个页面里面选择同意或不同意而且还要有审核意见对不对,我要给出来我的处理意见,提供给面下的人作参考,因此就有了: 代码就是: /** * 处理请假 * @param taskId * @param businessKey * @param model * @return */ @RequestMapping(“/detail”) public String detail(String taskId,String businessKey,Model model) { // Task task = workFlowService.getTaskById(taskId); // ExecutionEntity executionEntity= (ExecutionEntity) runtimeService.createExecutionQuery().executionId(task.getExecutionId()).processInstanceId(task.getProcessInstanceId()).singleResult(); // String activitiId = executionEntity.getActivityId(); Leave leave = leaveService.find(businessKey); Listapprovations = approvationService.findbyBusinesskey(businessKey); model.addAttribute(“taskId”, taskId); // model.addAttribute(“activitiId”, activitiId); model.addAttribute(“leave”, leave); model.addAttribute(“approvations”, approvations); return “/leave/leave_detail”; } 这里唯一需要解释的就是Approvation 审核意见表: /** * 审批意见 * @author Administrator * */ @Entity @Table(name=”approvation”) public class Approvation implements Serializable{ private static final long serialVersionUID = 7128566513663740700L; @Id private String approvationId; private String approvation; private String approvationuserId; private String approvationusername; private Date approvationtime = new Date(); private String businesskey; 有了这个实体我觉得也没有什么可解释的了。 然后在这个页面上选择同意或不同意提交真正的去处理该节点的流程,这里依然还是先看代码: /** * 流程处理 * @param leaveId * @param taskId * @param departLeader * @param approvation * @param session * @return */ @ResponseBody @RequestMapping(“/completeLeaveDepart”) public Json completeLeaveDepart(String leaveId,String taskId,String departLeader,String approvation,HttpSession session) { Json j = new Json(); User user = (User) session.getAttribute(“U”); if (user==null) { j.setMsg(“用户需要登录”); return j; } boolean departLeaderPass = false; if (departLeader.equals(“1″)) { departLeaderPass=true; } Map map = new HashMap(); map.put(“departLeaderPass”, departLeaderPass); Approvation app = new Approvation(); app.setApprovation(approvation); app.setBusinesskey(leaveId); app.setApprovationId(KeyProvider.getPrimaryKey()); app.setApprovationuserId(user.getUserId()); app.setApprovationusername(user.getUsername()); try { approvationService.save(app); workFlowService.complete(taskId, map); j.setMsg(“处理完成”); j.setSuccess(true); } catch (Exception e) { j.setMsg(e.getMessage()); e.printStackTrace(); } return j; } 这里先看一下: boolean departLeaderPass = false; if (departLeader.equals(“1″)) { departLeaderPass=true; } Map map = new HashMap(); map.put(“departLeaderPass”, departLeaderPass); 我解释一下if语句的含义,当departLeader==1时表示同意申请,然后把布尔值departLeaderPass存放到map里面。 下面关键一句话是workFlowService.complete(taskId, map);这句话就是调用方法: public void complete(String taskId,Map map){ taskService.complete(taskId, map); } 从这里可以看出不管map里面存放的是true还是false都是有一个接口完成。 这些都是在activiti里面封装好的我们只需要调用它的api就行了。 在这个地方就有分支,我们先处理不同意的分支,不同意是流到了调整申请 我们看当前任务节点变成了调整申请: 调整申请就是你要去让申请人可以修改他的请假信息,请假日期呀,请假天数呀,请假原因呀,然后再提交申请: /** * 流程调整 * @param leave * @param taskId * @param session * @return */ @ResponseBody @RequestMapping(“/tiaozhengLeave”) public Json tiaozhengLeave(LeaveVo lvo,String taskId,HttpSession session) { Json j = new Json(); User user = (User) session.getAttribute(“U”); if (user==null) { j.setMsg(“用户需要登录”); return j; } Leave leave = leaveService.find(lvo.getLeaveId()); leave.setLeaveday(lvo.getLeaveday()); leave.setLeaveendtime(lvo.getLeaveendtime()); leave.setLeavestarttime(lvo.getLeavestarttime()); leave.setReason(lvo.getReason()); try { leaveService.saveOrUpdate(leave); workFlowService.complete(taskId, new HashMap()); j.setMsg(“处理完成”); j.setSuccess(true); } catch (Exception e) { j.setMsg(e.getMessage()); e.printStackTrace(); } return j; } 从这个调整申请的提交来看我们调用的依然是: workFlowService.complete(taskId, new HashMap()); 这个api,这个我们可以思考一下为什么没一个节点的完成都是调用同一个接口,先思考思考,我接着流程往下说: 我们发现这时又回到了部门领导审批状态是未签收,与我们设计的流程图真好对应上,那么这个不同意的流程就开始了循环,你老不同意它就老这样循环下去,直到你同意为止。 那么我们就看了同意之后是走到哪里了?是不是交给人力资源审批了,这是我们再看人力资源是怎么处理的,我还是先拿到: “hrLeaderAduit” name=“人事资源审批“activiti:candidateUsers=“1000,1001”> 这是我们看到是有两个人都可以处理,这个时候我们在代办那你就会看到: 我们用这两个人的用户都登陆系统,看到的信息是一样的,因为这两人都有处理的权限,这个地方就是同时交给这两人处理的,那么这个地方就有一些疑问提出来了,两个人可以同时操作么?这里是不是一个人先签收了另外一个人就无法处理这个申请了?带着这样的疑问我们就可以做个试验了,先让一个人签收,然后去刷新另外一个人的代办页面看看会出现什么情况。这时候好玩的事情就出现了,当你去刷新页面是之前的那一条信息不见了,这就说明两个人谁先签收,另外一个人就钱收不到了,如果两个人同时签收其中一个人会不会报错,这个实验让大家自己去做,然后得出结论,这就是学习的过程。 下面就到了人力资源处理该节点的时候了,还是会先出来想部门领导审批是的界面,有同意和不同意的选择和审核原因,这个处理过程的代码和部门领导时处理的代码一样,我就不再拿出来了,这里我们也不再说不同意的情况了,因为不同意又回到了调整申请的流程,和之前的一样了。我们只说通过之后的销假: “usertask2″ name=“销假“activiti:assignee=“${applyuser}”> 这里可以看到销假是有启动人来完成的,这个大家回头看一下applyuser 是什么开始有的,我们再看代码: /** * 流程处理-销假 * @param leaveId * @param taskId * @param departLeader * @param approvation * @param session * @return */ @ResponseBody @RequestMapping(“/completeLeaveXiaojia”) public Json completeLeaveXiaojia(String leaveId,String taskId,String approvation,HttpSession session) { Json j = new Json(); User user = (User) session.getAttribute(“U”); if (user==null) { j.setMsg(“用户需要登录”); return j; } Map map = new HashMap(); // map.put(“need”, false); map.put(“need”, true); map.put(“form”, “weir@wiseknit.com.cn”); map.put(“to”, “hejianhui@wiseknit.com.cn”); Approvation app = new Approvation(); app.setApprovation(approvation); app.setBusinesskey(leaveId); app.setApprovationId(KeyProvider.getPrimaryKey()); app.setApprovationuserId(user.getUserId()); app.setApprovationusername(user.getUsername()); try { approvationService.save(app); workFlowService.complete(taskId, map); j.setMsg(“销假处理完成”); j.setSuccess(true); } catch (Exception e) { j.setMsg(e.getMessage()); e.printStackTrace(); } return j; } 这里我们主要看: Map map = new HashMap(); // map.put(“need”, false); map.put(“need”, true); map.put(“form”, “weir@wiseknit.com.cn”); map.put(“to”, “hejianhui@wiseknit.com.cn”); 我们可以传递过来一个参数来判断是否发送邮件,至此请假流程就走完了。