| | |
| | | package org.jeecg.modules.flowable.service.impl; |
| | | |
| | | import cn.hutool.core.bean.BeanUtil; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.collection.CollectionUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONArray; |
| | |
| | | |
| | | /** |
| | | * 流程定义 |
| | | * |
| | | */ |
| | | @Service |
| | | public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IFlowDefinitionService { |
| | |
| | | InputStream in = processDiagramGenerator.generateDiagram(bpmnModel, "png", activityIds, flows, engConf.getActivityFontName(), engConf.getLabelFontName(), engConf.getAnnotationFontName(), engConf.getClassLoader(), 1.0, true); |
| | | return in; |
| | | } |
| | | |
| | | /** |
| | | * 读取xml |
| | | * |
| | |
| | | Result result = startProcessInstanceById(processDefinition.getId(),variables); |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * 根据流程定义ID启动流程实例 |
| | | * |
| | |
| | | //如果保存数据前未调用必调的FlowCommonService.initActBusiness方法,就会有问题 |
| | | FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId); |
| | | //设置数据 |
| | | FlowNextDto nextFlowNode = flowTaskService.getNextFlowNode(task.getId(), variables); |
| | | List<FlowNextDto> nextFlowNodeList = flowTaskService.getNextFlowNode(task.getId(), variables); |
| | | taskService.complete(task.getId(), variables); |
| | | //下一个实例节点 多实例会是一个list,随意取一个即可 数组中定义Key是一致的 |
| | | //Task task2 = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).active().singleResult(); |
| | | List<Task> task2List = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).active().list(); |
| | | Task task2 = null; |
| | | if(task2List.size()>0) task2 = task2List.get(0); |
| | | String doneUsers = business.getDoneUsers(); |
| | | // 处理过流程的人 |
| | | JSONArray doneUserList = new JSONArray(); |
| | |
| | | doneUserList.add(sysUser.getUsername()); |
| | | } |
| | | |
| | | if (nextFlowNode!=null){ |
| | | //**有下一个节点 |
| | | if (CollectionUtil.isEmpty(nextFlowNodeList)) { |
| | | // **没有下一个节点,流程已经结束了 |
| | | business.setProcessDefinitionId(procDefId) |
| | | .setProcessInstanceId(processInstance.getProcessInstanceId()) |
| | | // .setActStatus(ActStatus.pass) |
| | | .setProposer(sysUser.getUsername()) |
| | | .setDoneUsers(doneUserList.toJSONString()) |
| | | ; |
| | | flowMyBusinessService.updateById(business); |
| | | } else if (nextFlowNodeList.size() == 1) { |
| | | //下个节点只有一个 |
| | | FlowNextDto nextFlowNode = nextFlowNodeList.get(0); |
| | | UserTask nextTask = nextFlowNode.getUserTask(); |
| | | Task task2 = null; |
| | | Optional<Task> first = task2List.stream().filter(t -> t.getTaskDefinitionKey().equals(nextTask.getId())).findFirst(); |
| | | if (first.isPresent()) { |
| | | task2 = first.get(); |
| | | } |
| | | if (task2 != null) { |
| | | //能够处理下个节点的候选人 |
| | | List<SysUser> nextFlowNodeUserList = nextFlowNode.getUserList(); |
| | | |
| | |
| | | //spring容器类名 |
| | | String serviceImplName = business.getServiceImplName(); |
| | | FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); |
| | | List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionKey(), variables); |
| | | List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionId(), variables); |
| | | business.setProcessDefinitionId(procDefId) |
| | | .setProcessInstanceId(processInstance.getProcessInstanceId()) |
| | | //// .setActStatus(ActStatus.start) |
| | |
| | | .setDoneUsers(doneUserList.toJSONString()); |
| | | if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){ |
| | | // 删除后重写 |
| | | for (Task task2One : task2List) { |
| | | for (String oldUser : collect_username) { |
| | | taskService.deleteCandidateUser(task2.getId(), oldUser); |
| | | } |
| | | // 业务层有指定候选人,覆盖 |
| | | for (String newUser : beforeParamsCandidateUsernames) { |
| | | taskService.addCandidateUser(task2.getId(), newUser); |
| | | } |
| | | business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); |
| | | } else { |
| | | // 业务层没有指定候选人,直接覆盖 |
| | | business.setTodoUsers(JSON.toJSONString(collect_username)); |
| | | } |
| | | flowMyBusinessService.updateById(business); |
| | | } |
| | | } else { |
| | | for (FlowNextDto nextFlowNode : nextFlowNodeList) { |
| | | //**有下一个节点 |
| | | UserTask nextTask = nextFlowNode.getUserTask(); |
| | | Task task2 = null; |
| | | Optional<Task> first = task2List.stream().filter(t -> t.getTaskDefinitionKey().equals(nextTask.getId())).findFirst(); |
| | | if (first.isPresent()) { |
| | | task2 = first.get(); |
| | | } |
| | | if (task2 != null) { |
| | | //新的业务流程节点 |
| | | FlowMyBusiness newBusiness = BeanUtil.copyProperties(business, FlowMyBusiness.class, "id"); |
| | | //能够处理下个节点的候选人 |
| | | List<SysUser> nextFlowNodeUserList = nextFlowNode.getUserList(); |
| | | |
| | | List<String> collect_username = nextFlowNodeUserList.stream().map(SysUser::getUsername).collect(Collectors.toList()); |
| | | //spring容器类名 |
| | | String serviceImplName = newBusiness.getServiceImplName(); |
| | | FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); |
| | | List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionId(), variables); |
| | | newBusiness.setProcessDefinitionId(procDefId) |
| | | .setProcessInstanceId(processInstance.getProcessInstanceId()) |
| | | //// .setActStatus(ActStatus.start) |
| | | .setProposer(sysUser.getUsername()) |
| | | .setTaskId(task2.getId()) |
| | | .setTaskName(nextTask.getName()) |
| | | .setTaskNameId(nextTask.getId()) |
| | | .setPriority(nextTask.getPriority()) |
| | | .setDoneUsers(doneUserList.toJSONString()); |
| | | if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) { |
| | | // 删除后重写 |
| | | for (Task task2One : task2List) { |
| | | for (String oldUser : beforeParamsCandidateUsernames) { |
| | | taskService.deleteCandidateUser(task2One.getId(),oldUser); |
| | | } |
| | | } |
| | |
| | | taskService.addCandidateUser(task2One.getId(),newUser); |
| | | } |
| | | } |
| | | business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); |
| | | newBusiness.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); |
| | | }else { |
| | | // 业务层没有指定候选人,直接覆盖 |
| | | business.setTodoUsers(JSON.toJSONString(collect_username)); |
| | | newBusiness.setTodoUsers(JSON.toJSONString(collect_username)); |
| | | // 删除后重写 |
| | | for (Task task2One : task2List) { |
| | | for (String oldUser : collect_username) { |
| | | taskService.deleteCandidateUser(task2One.getId(), oldUser); |
| | | } |
| | | } else { |
| | | // **没有下一个节点,流程已经结束了 |
| | | business.setProcessDefinitionId(procDefId) |
| | | .setProcessInstanceId(processInstance.getProcessInstanceId()) |
| | | // .setActStatus(ActStatus.pass) |
| | | .setProposer(sysUser.getUsername()) |
| | | .setDoneUsers(doneUserList.toJSONString()) |
| | | ; |
| | | } |
| | | flowMyBusinessService.updateById(business); |
| | | // 业务层有指定候选人,覆盖 |
| | | for (Task task2One : task2List) { |
| | | for (String newUser : collect_username) { |
| | | taskService.addCandidateUser(task2One.getId(), newUser); |
| | | } |
| | | } |
| | | } |
| | | flowMyBusinessService.save(newBusiness); |
| | | } |
| | | } |
| | | //删除原有的业务数据 |
| | | flowMyBusinessService.removeById(business.getId()); |
| | | } |
| | | //spring容器类名 |
| | | String serviceImplName = business.getServiceImplName(); |
| | | FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); |
| | | // 流程处理完后,进行回调业务层 |
| | | business.setValues(variables); |
| | | if (flowCallBackService!=null)flowCallBackService.afterFlowHandle(business); |
| | | if (flowCallBackService != null) { |
| | | flowCallBackService.afterFlowHandle(business); |
| | | } |
| | | return Result.OK("流程启动成功"); |
| | | } |
| | | |