1 packagecom.blk.back.service.impl;2
3 importjava.io.File;4 importjava.io.InputStream;5 import java.util.*;6
7 importjavax.transaction.Transactional;8
9 importcom.blk.integrated.pojo.SysUserRoleMappingPo;10 importlib.core.utils3.StringUtils;11 importlib.hibernate.dao.SimpleDao;12 importorg.activiti.bpmn.BpmnAutoLayout;13 import org.activiti.bpmn.model.*;14 importorg.activiti.bpmn.model.Process;15 importorg.activiti.engine.ActivitiException;16 importorg.activiti.engine.ProcessEngine;17 importorg.activiti.engine.ProcessEngines;18 importorg.activiti.engine.repository.Deployment;19 importorg.activiti.engine.runtime.ProcessInstance;20 importorg.activiti.engine.task.Task;21 importorg.apache.commons.io.FileUtils;22 importorg.springframework.beans.factory.annotation.Autowired;23 importorg.springframework.stereotype.Service;24
25 importcom.alibaba.fastjson.JSONArray;26 importcom.alibaba.fastjson.JSONObject;27 importcom.blk.back.service.SysWorkflowService;28 importcom.blk.core.util.RetKit;29 /**
30 *31 * @project cb-console-service32 *@authorsuruozhong33 * @description (工作流管理)34 * @date 2017年10月19日35 */
36 importcom.blk.integrated.dao.SysRoleDao;37 importcom.blk.integrated.dao.SysWorkflowDao;38 importcom.blk.integrated.dao.SysWorkflowStepDao;39 importcom.blk.integrated.pojo.SysRolePo;40 importcom.blk.integrated.pojo.SysWorkflow;41 importcom.blk.integrated.pojo.SysWorkflowStep;42 @Service43 @Transactional44 public class SysWorkflowServiceImpl implementsSysWorkflowService {45
46 @Autowired47 privateSysRoleDao sysRoleDao;48 @Autowired49 privateSysWorkflowDao sysWorkflowDao;50 @Autowired51 privateSysWorkflowStepDao sysWorkflowStepDao;52 @Autowired53 privateSimpleDao simpleDao;54 //获取角色下所有用户
55 private ListgetUserRole(String rolePkno){56 List list = simpleDao.getDelegate().createSQLQuery("select user_pkno from sys_user_role_mapping where role_pkno=:rolePkno").setParameter("rolePkno",rolePkno).list();57 returnlist;58 }59
60 @Override61 publicRetKit save(SysWorkflow model,String stepArr) {62
63 model.setCreateTime(newDate());64 sysWorkflowDao.getDelegate().save(model);65 JSONArray arr =JSONObject.parseArray(stepArr);66 List stepList = new ArrayList();67 for(int i=0; i
79 addFlowDeployment(model,stepList);80 returnRetKit.ok();81 }82
83 /**
84 *@Date:2017/11/2485 *@Description:创建流程并部署86 *87 */
88 protected void addFlowDeployment(SysWorkflow workflow,ListstepList){89 System.out.println(".........start...");90 ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();91
92 //1. 建立模型
93 BpmnModel model = newBpmnModel();94 Process process=newProcess();95 model.addProcess(process);96 process.setId("news");97 process.setName(workflow.getName());98 process.setDocumentation(workflow.getContent());99 //添加流程100 //开始节点
101 process.addFlowElement(createStartEvent());102 for(int i=0; i
105 if(step.getType()==1){106 //会签107 //加入并行网关-分支
108 process.addFlowElement(createParallelGateway("parallelGateway-fork"+i,"并行网关-分支"+i));109 //获取角色下所有用户
110 List userList =getUserRole(step.getRolePkno());111 for(int u=0; u
113 process.addFlowElement(createUserTask("userTask"+i+u,"并行网关分支用户审核节点"+i+u,userList.get(u)));114 }115 //并行网关-汇聚
116 process.addFlowElement(createParallelGateway("parallelGateway-join"+i,"并行网关到-汇聚"+i));117
118 }else{119 //普通流转120 //审核节点
121 process.addFlowElement(createGroupTask("task"+i,"组审核节点"+i,step.getRolePkno()));122 //回退节点
123 process.addFlowElement(createUserTask("repulse"+i,"回退节点"+i,"${startUserId}"));124 }125 }126 //结束节点
127 process.addFlowElement(createEndEvent());128
129 //连线
130 for(int y=0; y
133 if(step.getType()==1){134 //会签135 //判断是否第一个节点
136 if(y==0){137 //开始节点和并行网关-分支连线
138 process.addFlowElement(createSequenceFlow("startEvent", "parallelGateway-fork"+y, "开始节点到并行网关-分支"+y, ""));139 }else{140 //审核节点或者并行网关-汇聚到并行网关-分支141 //判断上一个节点是否是会签
142 if(stepList.get(y-1).getType()==1){143 process.addFlowElement(createSequenceFlow("parallelGateway-join"+(y-1),"parallelGateway-fork"+y,"并行网关-汇聚到并行网关-分支"+y,""));144 }else{145 process.addFlowElement(createSequenceFlow("task"+(y-1),"parallelGateway-fork"+y,"上一个审核节点到并行网关-分支"+y,""));146 }147 }148 //并行网关-分支和会签用户连线,会签用户和并行网关-汇聚连线
149 List userList =getUserRole(step.getRolePkno());150 for(int u=0; u
155 if(y==(stepList.size()-1)){156 process.addFlowElement(createSequenceFlow("parallelGateway-join"+y,"endEvent","并行网关-汇聚到结束节点",""));157 }158 }else{159 //普通流转160 //第一个节点
161 if(y==0){162 //开始节点和审核节点1
163 process.addFlowElement(createSequenceFlow("startEvent", "task"+y, "开始节点到审核节点"+y, ""));164 }else{165 //判断上一个节点是否会签
166 if(stepList.get(y-1).getType()==1){167 //会签168 //并行网关-汇聚到审核节点
169 process.addFlowElement(createSequenceFlow("parallelGateway-join"+(y-1),"task"+y,"并行网关-汇聚到审核节点"+y,""));170 }else{171 //普通
172 process.addFlowElement(createSequenceFlow("task"+(y-1),"task"+y,"审核节点"+(y-1)+"到审核节点"+y,"${flag=='true'}"));173 }174 }175 //是否最后一个节点
176 if(y==(stepList.size()-1)){177 //审核节点到结束节点
178 process.addFlowElement(createSequenceFlow("task"+y,"endEvent","审核节点"+y+"到结束节点","${flag=='true'}"));179 }180 //审核节点到回退节点
181 process.addFlowElement(createSequenceFlow("task"+y,"repulse"+y,"审核不通过-打回"+y,"${flag=='false'}"));182 process.addFlowElement(createSequenceFlow("repulse"+y,"task"+y,"回退节点到审核节点"+y,""));183 }184 }185
186 //2. 生成的图形信息
187 newBpmnAutoLayout(model).execute();188
189 //3. 部署流程
190 Deployment deployment = processEngine.getRepositoryService().createDeployment().addBpmnModel(process.getId()+".bpmn", model).name(process.getId()+"_deployment").deploy();191
192 // //4. 启动一个流程实例193 //ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(process.getId());194 //
195 // //5. 获取流程任务196 //List tasks = processEngine.getTaskService().createTaskQuery().processInstanceId(processInstance.getId()).list();197 //try{198 // //6. 将流程图保存到本地文件199 //InputStream processDiagram = processEngine.getRepositoryService().getProcessDiagram(processInstance.getProcessDefinitionId());200 //FileUtils.copyInputStreamToFile(processDiagram, new File("/deployments/"+process.getId()+".png"));201 //
202 // //7. 保存BPMN.xml到本地文件203 //InputStream processBpmn = processEngine.getRepositoryService().getResourceAsStream(deployment.getId(), process.getId()+".bpmn");204 //FileUtils.copyInputStreamToFile(processBpmn,new File("/deployments/"+process.getId()+".bpmn"));205 //}catch (Exception e){206 //e.printStackTrace();207 //}
208
209 System.out.println(".........end...");210 }211
212
213 //任务节点-组
214 protectedUserTask createGroupTask(String id, String name, String candidateGroup) {215 List candidateGroups=new ArrayList();216 candidateGroups.add(candidateGroup);217 UserTask userTask = newUserTask();218 userTask.setName(name);219 userTask.setId(id);220 userTask.setCandidateGroups(candidateGroups);221 returnuserTask;222 }223
224 //任务节点-用户
225 protectedUserTask createUserTask(String id, String name, String userPkno) {226 List candidateUsers=new ArrayList();227 candidateUsers.add(userPkno);228 UserTask userTask = newUserTask();229 userTask.setName(name);230 userTask.setId(id);231 userTask.setCandidateUsers(candidateUsers);232 returnuserTask;233 }234
235 //任务节点-锁定者
236 protectedUserTask createAssigneeTask(String id, String name, String assignee) {237 UserTask userTask = newUserTask();238 userTask.setName(name);239 userTask.setId(id);240 userTask.setAssignee(assignee);241 returnuserTask;242 }243
244 /*连线*/
245 protectedSequenceFlow createSequenceFlow(String from, String to,String name,String conditionExpression) {246 SequenceFlow flow = newSequenceFlow();247 flow.setSourceRef(from);248 flow.setTargetRef(to);249 flow.setName(name);250 if(StringUtils.isNotEmpty(conditionExpression)){251 flow.setConditionExpression(conditionExpression);252 }253 returnflow;254 }255
256 //排他网关
257 protectedExclusiveGateway createExclusiveGateway(String id,String name) {258 ExclusiveGateway exclusiveGateway = newExclusiveGateway();259 exclusiveGateway.setId(id);260 exclusiveGateway.setName(name);261 returnexclusiveGateway;262 }263
264 //并行网关
265 protectedParallelGateway createParallelGateway(String id,String name){266 ParallelGateway gateway = newParallelGateway();267 gateway.setId(id);268 gateway.setName(name);269 returngateway;270 }271
272 //开始节点
273 protectedStartEvent createStartEvent() {274 StartEvent startEvent = newStartEvent();275 startEvent.setId("startEvent");276 returnstartEvent;277 }278
279 /*结束节点*/
280 protectedEndEvent createEndEvent() {281 EndEvent endEvent = newEndEvent();282 endEvent.setId("endEvent");283 returnendEvent;284 }285
286 }