本文共 11444 字,大约阅读时间需要 38 分钟。
流程启动后,流程节点便进入到了任务相关的部分。可以看到我之前的做法是在启动节点就绑定了form表单,启动时就填写相关的数据。实际上在之前我的做法是不对开始节点做任何操作,知道任务节点的时候再填写相关的数据进行设置。
至于这两种方式的优劣,我暂时还不太确定,单独从功能上来说都是可以实现的,因此大家可以都试一试,然后视不同的情况而定,按自己究竟要用哪种。
而在任务相关的部分,我是把用户任务分成了两种,一种是我的申请,一种是我的任务。区别就是我发起的任务,和别人提交给我的或者反馈给我的任务。
那么流程一启动,第一个自然就是自己的申请了,这里便说明这个问题。
在这一篇中,需要注意的并不在于form表单,而是如何判断是不是初次申请,我一开始用的是流程节点来判断,这样就需要拿到流程节点并进行相关的遍历。
但是后来我回过头来再看时便发现其实远不止着一种方法,比如也可以通过任务来区分,如果整个流程实例只有一个任务,那么这个任务自然就是申请。当然了,前提是要限制任务是不能删除的。
还有就是,每一个任务都有启动时间,根据这个时间进行排序也应该可以进行判断,只是这个我还没有尝试,可行性究竟如何还有待确定。
那么下边就又到了上代码的时刻:
后台代码如下:
/** * @throwsXMLStreamException * 查询我申请未提交的任务 * * @author:tuzongxun * @Title: findTask * @param@return * @return Object * @date Mar 17, 20162:44:11 PM * @throws */ @RequestMapping(value = "/findFirstTask.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8") @ResponseBody public Object findFirstTask(HttpServletRequest req) throws XMLStreamException { Mapmap = new HashMap (); boolean isLogin = this.isLogin(req); if (isLogin) { List taskList = new ArrayList (); HttpSession session = req.getSession(); String assginee = (String) session.getAttribute("userName"); List taskList1 = taskService.createTaskQuery() .taskAssignee(assginee).list(); if (taskList1 != null && taskList1.size() > 0) { for (Task task : taskList1) { TaskModel taskModel = new TaskModel(); // 获取部署名 String processdefintionId = task.getProcessDefinitionId(); ProcessDefinition processDefinition = repositoryService .createProcessDefinitionQuery() .processDefinitionId(processdefintionId) .singleResult(); // 根据taskname和节点判断是否是第一个 String taskName = task.getName(); Iterator iterator = this .findFlow(processdefintionId); String row0 = null; String eleName0 = null; while (iterator.hasNext()) { FlowElement flowElement0 = iterator.next(); // 下一个节点 FlowElement flowElement = iterator.next(); String eleName = flowElement.getName(); if (taskName.equals(eleName)) { row0 = flowElement0.getXmlRowNumber() + ""; eleName0 = flowElement0.getClass().getSimpleName(); break; } } // 提交申请时 if (eleName0.equals("StartEvent")) { /// // 获取流程变量 Map variables = runtimeService .getVariables(task.getProcessInstanceId()); Set keysSet = variables.keySet(); Iterator keySet = keysSet.iterator(); Map formData = new HashMap (); taskModel.setLastForm(this .getStartForm1((String) variables .get("deploymentId"))); taskModel.setAssignee(task.getAssignee()); taskModel.setCreateTime(task.getCreateTime()); taskModel.setId(task.getId()); taskModel.setName(task.getName()); taskModel.setProcessInstanceId(task .getProcessInstanceId()); taskModel .setProcessDefId(task.getProcessDefinitionId()); taskModel.setFormKey(task.getFormKey()); String deploymentId = processDefinition .getDeploymentId(); Deployment deployment = repositoryService .createDeploymentQuery() .deploymentId(deploymentId).singleResult(); String deploymentName = deployment.getName(); taskModel.setDeploymentName(deploymentName); while (keySet.hasNext()) { String key = keySet.next(); String value = (String) variables.get(key); if (key.contains(row0)) { formData.put(key, value); } } taskModel.setFormData(formData); taskList.add(taskModel); } } } map.put("isLogin", "yes"); map.put("userName", (String) req.getSession().getAttribute("userName")); map.put("result", "success"); map.put("data", taskList); } else { map.put("isLogin", "no"); } return map; }
注意上边的方法中有调用getStartForm1这个方法,可在上一篇中找到。另外一个调用查询流程节点的方法如下:
/** * @throwsXMLStreamException * 查询流程节点 * * @author:tuzongxun * @Title: findFlow * @param@return * @return Iterator* @date Mar 21, 20169:31:42 AM * @throws */ public Iterator findFlow(String processDefId) throws XMLStreamException { List lists = repositoryService .createProcessDefinitionQuery() .processDefinitionId(processDefId) .orderByProcessDefinitionVersion().desc().list(); ProcessDefinition processDefinition = lists.get(0); processDefinition.getCategory(); String resourceName = processDefinition.getResourceName(); InputStream inputStream = repositoryService.getResourceAsStream( processDefinition.getDeploymentId(), resourceName); BpmnXMLConverter converter = new BpmnXMLConverter(); XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader reader = factory.createXMLStreamReader(inputStream); BpmnModel bpmnModel = converter.convertToBpmnModel(reader); Process process = bpmnModel.getMainProcess(); Collection elements = process.getFlowElements(); Iterator iterator = elements.iterator(); return iterator; }
前台的代码,我想经过这么久的代码罗列,app.js和html中的写法应该没有必要再写了,业务逻辑如下:
angular.module('activitiApp') .controller('findFirstTaskCtr', ['$rootScope','$scope','$http','$location','$state', function($rootScope,$scope,$http,$location,$state){ $scope.init=function(){ $http.post("./findFirstTask.do").success(function(result) { if(result.isLogin==="yes"){ $rootScope.userName=result.userName; $scope.taskList=result.data; }else{ $location.path("/login"); } });} //查看findDetail(task) $scope.findDetail=function(task){ console.log(task); $('#findDetail').html('').dialog({ title:'节点名称[' + task.name + ']', modal:true, width:$.common.window.getClientWidth() * 0.6, height:$.common.window.getClientHeight() * 0.9, open:function() { // 获取json格式的表单数据,就是流程定义中的所有field var dialog = this; // 读取启动时的表单 // 获取的form是字符行,html格式直接显示在对话框内就可以了,然后用form包裹起来 $(dialog).append(" "); $('.formContent').html('').wrap("
转载地址:http://dabsx.baihongyu.com/