activit配置json文件进行后台开发

来源:互联网 发布:有关数据库的书 编辑:程序博客网 时间:2024/06/04 00:46

基于公司的业务总是会画流程图去做巡查上报的业务,我就把这个业务封装成可配置的流程业务便于以后的快速开发,针对的是后台程序员的定制化开发,而不是针对客户的自定义定制,那样虽然更加友好,但是开发难度和成本更大,我这种方式是针对不变的流程图的快速开发。
项目使用mybaits+activiti
项目地址:https://github.com/lightTrace/activititModel
项目结构图:
这里写图片描述
定义一个流程图,复杂程度一般:
这里写图片描述
对应的activitit.json

{     "deployProcess":{   "name":"activiti流程示例",   "bpmnPath":"cn/com/wavenet/activiti/diagrams/activitiExample.bpmn",   "pngPath":"cn/com/wavenet/activiti/diagrams/activitiExample.png"   },   "processDefinitionKey":"myProcess",   "startTask":{   "currentRole":"roleStart",   "startNextArr":["102101,处理角色1,roleDeal1","102102,处理角色2,roleDeal2"]   },   "dealTask":{   "dealNextArr":["102201,处理角色3,roleDeal3","102202,处理角色4,roleDeal4","102203,结案角色,roleEnd","102204,结案角色,roleEnd"]   },   "endTask":{   "endNextArr":["102301,处理角色5,roleDeal5","102302,处理角色6,roleDeal6","102303"]   }    }

为了区分阶段,我将整个流程分为startTask、dealTask、endTask,大家可以根据需求自行调整,主要代码是FlowUtils这个类,而FlowFrame原理就是从json文件中读取预定义的json数据然后调用FlowUtils操作流程,部署就不说了,直接看finishWork()这个方法:

        Task task = taskService.createTaskQuery().processInstanceId(processId).taskCandidateGroup(currentRole).singleResult();//首先查询当前流程实例下该角色是否有任务,有任务肯定也是唯一的                if(task!=null){                 String [] candidateUsers={nextRole};//流程图中可以看出开始任务后有两个选择,根据前端传入的条件我们可以从activitit.json中找到下一节点的处理角色nextRole以及节点ID nextNodeId                 taskService.setVariable(task.getId(), nextNodeId,  Arrays.asList(candidateUsers));//然后通过以上两行代码设置进去,roleDeal1可以包括处理角色1,你还可以将处理角色1a放进roleDeal1,这样是为了方便扩展角色                 taskService.complete(task.getId(),conditionMap);//最后完成任务                                      }

这个方法无论哪个节点完成任务都可以使用,那么在下一节点开始任务的时候怎么做呢?
我们再看FlowFrame中的dealTask方法:

       public void dealTask(String condition , String processId){           String group_id_ = flowUtils.selectGroupId(processId);//首先通过selectGroupId方法调用mybaits去查询这样一个语句:SELECT group_id_ FROM ACT_RU_TASK t JOIN ACT_RU_IDENTITYLINK i ON t.id_ = i.task_id_ WHERE            t.proc_inst_id_=#{nm_processId} ,就是上一节点处理完之后设定的下一处理角色可以通过这个方法找到,然后下面就是重复finishWork()的方法           //处理任务           String currentRole = group_id_;           JSONObject jsonObject = jsonUtils.getJson();           JSONArray dealArr = jsonObject.getJSONObject("dealTask").getJSONArray("dealNextArr");           String nextRole = "";           String nextNodeId = "";           for (Iterator iterator = dealArr.iterator();iterator.hasNext();) {             String preCondition = (String) iterator.next();             String[] preConditionArr = preCondition.split(",");             if(preConditionArr[0].equals(condition)){                 nextRole = preConditionArr[1];                 nextNodeId = preConditionArr[2];             }        }           if(nextRole.equals("")||nextNodeId.equals("")){               throw new NoConditionException("没有对应的节点出口");           }           Map<String,Object> conditionMap = new HashMap<String,Object>();           conditionMap.put("state", condition);           flowUtils.finishWork(processId, currentRole, nextRole, nextNodeId,conditionMap);       }    

开始任务后查询到当前做任务的角色:
这里写图片描述
至于最后的endTask就更简单了,原理大同小异,任务完成后当前流程id没有任何待办任务角色:
这里写图片描述
主要看flow包下的两个类,activiti.json和流程图的对应关系就可以了,其余的都是mybaits对数据库的操作,虽然我只设置了一个数据源,但是项目里面可以设置多数据源,有兴趣可以在网上看下配置下就可以了,而在项目里面只要在jdbc.properties和activiti.cfg.xml配置154数据源的相关信息就可以了,然后直接运行JunitTest的testFlowFrame方法。

    @Test    public void testFlowFrame(){        flowFrame.deploymentProcess();//      flowFrame.startTask("102102");//      flowFrame.dealTask("102204", "12501");//      flowFrame.endTask("102303", "12501");    }

从上到下就是一个完整的部署、开始、处理、结束的流程,摸清楚我的思路后,就可以配置activiti.json和画流程图来开发流程业务了,不需要写一行代码,当然由于我水平有限,待改进的地方很多,欢迎各路同学拍砖改进。

原创粉丝点击