From e1856ede152bbe7ab32208716b87c7d289080221 Mon Sep 17 00:00:00 2001 From: zhangherong <571457620@qq.com> Date: 星期二, 27 五月 2025 14:48:43 +0800 Subject: [PATCH] art: 设备管理-三保-并行任务执行, 并行网关多任务处理 --- lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java | 536 ++++++++++++++++++++++++++++++++++++----------------------- 1 files changed, 326 insertions(+), 210 deletions(-) diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java index 6b715e9..78a241f 100644 --- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java +++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java @@ -1,5 +1,6 @@ package org.jeecg.modules.flowable.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; @@ -68,6 +69,7 @@ import java.util.stream.Collectors; /** + * **/ @Service @Slf4j @@ -78,6 +80,7 @@ private IFlowThirdService iFlowThirdService; @Autowired FlowMyBusinessServiceImpl flowMyBusinessService; + /** * 瀹屾垚浠诲姟 * @@ -87,23 +90,23 @@ @Override public Result complete(FlowTaskVo taskVo) { Task task = taskService.createTaskQuery().taskId(taskVo.getTaskId()).singleResult(); - if (Objects.isNull(task)){ + if (Objects.isNull(task)) { return Result.error("浠诲姟涓嶅瓨鍦�"); } - if(StringUtils.isNotEmpty(taskVo.getComment())){ + if (StringUtils.isNotEmpty(taskVo.getComment())) { task.setDescription(taskVo.getComment()); taskService.saveTask(task); } SysUser loginUser = iFlowThirdService.getLoginUser(); //鍒ゆ柇鐢ㄦ埛鏄惁鏈夋潈闄� - if (!task.getAssignee().equals(loginUser.getUsername())){ + if (!task.getAssignee().equals(loginUser.getUsername())) { return Result.error("褰撳墠鐢ㄦ埛鏃犳潈闄�"); } if (DelegationState.PENDING.equals(task.getDelegationState())) { taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.DELEGATE.getType(), taskVo.getComment()); //taskService.resolveTask(taskVo.getTaskId(), taskVo.getValues()); } else { - System.out.println("taskVo.getTaskId()--->taskVo.getInstanceId()--->FlowComment.NORMAL.getType()--->taskVo.getComment()"+taskVo.getTaskId() + "---" + taskVo.getInstanceId() + "---" + FlowComment.NORMAL.getType() + "---"+taskVo.getComment() ); + System.out.println("taskVo.getTaskId()--->taskVo.getInstanceId()--->FlowComment.NORMAL.getType()--->taskVo.getComment()" + taskVo.getTaskId() + "---" + taskVo.getInstanceId() + "---" + FlowComment.NORMAL.getType() + "---" + taskVo.getComment()); taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.NORMAL.getType(), taskVo.getComment()); taskService.setAssignee(taskVo.getTaskId(), loginUser.getUsername()); } @@ -111,20 +114,22 @@ //涓氬姟鏁版嵁id String dataId = taskVo.getDataId(); //濡傛灉淇濆瓨鏁版嵁鍓嶆湭璋冪敤蹇呰皟鐨凢lowCommonService.initActBusiness鏂规硶锛屽氨浼氭湁闂 - FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId); + FlowMyBusiness business = flowMyBusinessService.getFlowMyBusiness(taskVo.getInstanceId(), taskVo.getTaskId()); //spring瀹瑰櫒绫诲悕 String serviceImplName = business.getServiceImplName(); FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); // 娴佺▼鍙橀噺 - Map<String, Object> flowBeforeParamsValues = flowCallBackService.flowValuesOfTask(business.getTaskNameId(),taskVo.getValues()); + Map<String, Object> flowBeforeParamsValues = flowCallBackService.flowValuesOfTask(business.getTaskNameId(), taskVo.getValues()); //璁剧疆鏁版嵁 Map<String, Object> values = taskVo.getValues(); - if (MapUtil.isNotEmpty(flowBeforeParamsValues)){ - // 涓氬姟灞傛湁璁剧疆鍙橀噺锛屼娇鐢ㄤ笟鍔″眰鐨勫彉閲� + if (MapUtil.isNotEmpty(flowBeforeParamsValues)) { + // 涓氬姟灞傛湁璁剧疆鍙橀噺锛屼娇鐢ㄤ笟鍔″眰鐨勫彉閲� values = flowBeforeParamsValues; } - FlowNextDto nextFlowNode = this.getNextFlowNode(task.getId(), values); + + //骞惰缃戝叧 澶氫换鍔� + List<FlowNextDto> nextFlowNodeList = this.getNextFlowNode(task.getId(), values); //涓嬩竴涓疄渚嬭妭鐐� if (DelegationState.PENDING.equals(task.getDelegationState())) { taskService.resolveTask(taskVo.getTaskId(), values); @@ -132,140 +137,218 @@ taskService.complete(taskVo.getTaskId(), values); } List<Task> task2List = taskService.createTaskQuery().processInstanceId(business.getProcessInstanceId()).active().list(); - Task task2 = null; - if (CollUtil.isNotEmpty(task2List)){ - task2 = task2List.get(0); - } - - // 涓嬩釜鑺傜偣鍊欓�変汉 - List<String> beforeParamsCandidateUsernames = Lists.newArrayList(); - if(task2!=null){ - beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionKey(),taskVo.getValues()); - } - List<String> candidateUsers = taskVo.getCandidateUsers(); - if (CollUtil.isNotEmpty(candidateUsers)){ - // 鍓嶇浼犲叆鍊欓�変汉 瑕嗙洊 - beforeParamsCandidateUsernames = candidateUsers; - } String doneUsers = business.getDoneUsers(); // 澶勭悊杩囨祦绋嬬殑浜� JSONArray doneUserList = new JSONArray(); - if (StrUtil.isNotBlank(doneUsers)){ + if (StrUtil.isNotBlank(doneUsers)) { doneUserList = JSON.parseArray(doneUsers); } - if (!doneUserList.contains(loginUser.getUsername())){ + if (!doneUserList.contains(loginUser.getUsername())) { doneUserList.add(loginUser.getUsername()); } - if (task2!=null && task.getTaskDefinitionKey().equals(task2.getTaskDefinitionKey())){ - // * 褰撳墠鑺傜偣鏄細绛捐妭鐐癸紝娌℃湁璧板畬 - business.setTaskId(task2.getId()) -// .setActStatus(ActStatus.doing) + if (CollectionUtils.isEmpty(nextFlowNodeList)) { + // **娌℃湁涓嬩竴涓妭鐐癸紝娴佺▼宸茬粡缁撴潫浜� + business .setDoneUsers(doneUserList.toJSONString()) + .setTodoUsers("") + .setTaskId("") + .setTaskNameId("") + .setTaskName("") ; - String todoUsersStr = business.getTodoUsers(); - JSONArray todosArr = JSON.parseArray(todoUsersStr); - // 鍒犻櫎鍚庨噸鍐� - for (Task task2One : task2List) { - for (Object oldUser : todosArr) { - taskService.deleteCandidateUser(task2One.getId(),oldUser.toString()); + 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(); + task2 = first.orElseGet(() -> task2List.get(0)); + if (task2 != null) { + // 涓嬩釜鑺傜偣鍊欓�変汉 + List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionKey(), taskVo.getValues()); + List<String> candidateUsers = taskVo.getCandidateUsers(); + if (CollUtil.isNotEmpty(candidateUsers)) { + // 鍓嶇浼犲叆鍊欓�変汉 瑕嗙洊 + beforeParamsCandidateUsernames = candidateUsers; } - } - // 閲嶅啓 - if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){ - beforeParamsCandidateUsernames.remove(loginUser.getUsername()); - // 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩� - for (Task task2One : task2List) { - for (String newUser : beforeParamsCandidateUsernames) { - taskService.addCandidateUser(task2One.getId(),newUser); - } - } - business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); - } else { - todosArr.remove(loginUser.getUsername()); - for (Task task2One : task2List) { + if (task.getTaskDefinitionKey().equals(task2.getTaskDefinitionKey())) { + //澶氬疄渚� 浼氱 TODO + // * 褰撳墠鑺傜偣鏄細绛捐妭鐐癸紝娌℃湁璧板畬 + business.setTaskId(task2.getId()) +// .setActStatus(ActStatus.doing) + .setDoneUsers(doneUserList.toJSONString()) + ; + String todoUsersStr = business.getTodoUsers(); + JSONArray todosArr = JSON.parseArray(todoUsersStr); + // 鍒犻櫎鍚庨噸鍐� for (Object oldUser : todosArr) { - taskService.addCandidateUser(task2One.getId(),oldUser.toString()); + taskService.deleteCandidateUser(task2.getId(), oldUser.toString()); + } + // 閲嶅啓 + if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) { + beforeParamsCandidateUsernames.remove(loginUser.getUsername()); + // 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩� + for (String newUser : beforeParamsCandidateUsernames) { + taskService.addCandidateUser(task2.getId(), newUser); + } + business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); + } else { + todosArr.remove(loginUser.getUsername()); + for (Object oldUser : todosArr) { + taskService.addCandidateUser(task2.getId(), oldUser.toString()); + } + business.setTodoUsers(todosArr.toJSONString()); + } + + } else { + //鑳藉澶勭悊涓嬩釜鑺傜偣鐨勫�欓�変汉 + List<SysUser> nextFlowNodeUserList = nextFlowNode.getUserList(); + List<String> collect_username = nextFlowNodeUserList.stream().map(SysUser::getUsername).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(candidateUsers)) { + // 鍓嶇浼犲叆鍊欓�変汉 + collect_username = candidateUsers; + } + business + .setTaskId(task2.getId()) +// .setActStatus(ActStatus.doing) + .setTaskNameId(nextTask.getId()) + .setTaskName(nextTask.getName()) + .setPriority(nextTask.getPriority()) + .setDoneUsers(doneUserList.toJSONString()) + .setTodoUsers(JSON.toJSONString(collect_username)) + ; + // 鍒犻櫎鍚庨噸鍐� + for (String oldUser : collect_username) { + taskService.deleteCandidateUser(task2.getId(), oldUser); + } + if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) { + // 鍓嶇娌℃湁浼犲叆鍊欓�変汉 && 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩� + for (String newUser : beforeParamsCandidateUsernames) { + taskService.addCandidateUser(task2.getId(), newUser); + } + business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); + } else { + for (String oldUser : collect_username) { + taskService.addCandidateUser(task2.getId(), oldUser); + } + business.setTodoUsers(JSON.toJSONString(collect_username)); } } - business.setTodoUsers(todosArr.toJSONString()); } - - - } else { - // * 涓嬩竴鑺傜偣鏄細绛捐妭鐐� 鎴� 鏅�氱敤鎴疯妭鐐癸紝閫昏緫涓�鑷� - if (nextFlowNode!=null){ + flowMyBusinessService.updateById(business); + } + else { + for(FlowNextDto nextFlowNode : nextFlowNodeList) { //**鏈変笅涓�涓妭鐐� UserTask nextTask = nextFlowNode.getUserTask(); - //鑳藉澶勭悊涓嬩釜鑺傜偣鐨勫�欓�変汉 - List<SysUser> nextFlowNodeUserList = nextFlowNode.getUserList(); - List<String> collect_username = nextFlowNodeUserList.stream().map(SysUser::getUsername).collect(Collectors.toList()); - if (CollUtil.isNotEmpty(candidateUsers)){ - // 鍓嶇浼犲叆鍊欓�変汉 - collect_username = candidateUsers; + Task task2 = null; + Optional<Task> first = task2List.stream().filter(t -> t.getTaskDefinitionKey().equals(nextTask.getId())).findFirst(); + if (first.isPresent()) { + task2 = first.get(); } - business - .setTaskId(task2.getId()) -// .setActStatus(ActStatus.doing) - .setTaskNameId(nextTask.getId()) - .setTaskName(nextTask.getName()) - .setPriority(nextTask.getPriority()) - .setDoneUsers(doneUserList.toJSONString()) - .setTodoUsers(JSON.toJSONString(collect_username)) - ; - // 鍒犻櫎鍚庨噸鍐� - for (Task task2One : task2List) { - for (String oldUser : collect_username) { - taskService.deleteCandidateUser(task2One.getId(),oldUser); + if (task2 != null) { + //鏂扮殑涓氬姟娴佺▼鑺傜偣 + FlowMyBusiness newBusiness = BeanUtil.copyProperties(business, FlowMyBusiness.class, "id"); + // 涓嬩釜鑺傜偣鍊欓�変汉 + List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionKey(), taskVo.getValues()); + List<String> candidateUsers = taskVo.getCandidateUsers(); + if (CollUtil.isNotEmpty(candidateUsers)) { + // 鍓嶇浼犲叆鍊欓�変汉 瑕嗙洊 + beforeParamsCandidateUsernames = candidateUsers; } - } - if (CollUtil.isEmpty(candidateUsers)&&CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){ - // 鍓嶇娌℃湁浼犲叆鍊欓�変汉 && 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩� - for (Task task2One : task2List) { - for (String newUser : beforeParamsCandidateUsernames) { - taskService.addCandidateUser(task2One.getId(),newUser); + if (task.getTaskDefinitionKey().equals(task2.getTaskDefinitionKey())) { + //澶氬疄渚� 浼氱 TODO + // * 褰撳墠鑺傜偣鏄細绛捐妭鐐癸紝娌℃湁璧板畬 + newBusiness.setTaskId(task2.getId()) +// .setActStatus(ActStatus.doing) + .setDoneUsers(doneUserList.toJSONString()) + ; + String todoUsersStr = business.getTodoUsers(); + JSONArray todosArr = JSON.parseArray(todoUsersStr); + // 鍒犻櫎鍚庨噸鍐� + for (Object oldUser : todosArr) { + taskService.deleteCandidateUser(task2.getId(), oldUser.toString()); } - } - business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); - } else { - for (Task task2One : task2List) { - for (String oldUser : collect_username) { - taskService.addCandidateUser(task2One.getId(),oldUser); + // 閲嶅啓 + if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) { + beforeParamsCandidateUsernames.remove(loginUser.getUsername()); + // 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩� + for (String newUser : beforeParamsCandidateUsernames) { + taskService.addCandidateUser(task2.getId(), newUser); + } + newBusiness.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); + } else { + todosArr.remove(loginUser.getUsername()); + for (Object oldUser : todosArr) { + taskService.addCandidateUser(task2.getId(), oldUser.toString()); + } + newBusiness.setTodoUsers(todosArr.toJSONString()); } - } - } - } else { - // **娌℃湁涓嬩竴涓妭鐐癸紝娴佺▼宸茬粡缁撴潫浜� - business - .setDoneUsers(doneUserList.toJSONString()) - .setTodoUsers("") - .setTaskId("") - .setTaskNameId("") - .setTaskName("") - ; + } else { + //鑳藉澶勭悊涓嬩釜鑺傜偣鐨勫�欓�変汉 + List<SysUser> nextFlowNodeUserList = nextFlowNode.getUserList(); + List<String> collect_username = nextFlowNodeUserList.stream().map(SysUser::getUsername).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(candidateUsers)) { + // 鍓嶇浼犲叆鍊欓�変汉 + collect_username = candidateUsers; + } + newBusiness + .setTaskId(task2.getId()) +// .setActStatus(ActStatus.doing) + .setTaskNameId(nextTask.getId()) + .setTaskName(nextTask.getName()) + .setPriority(nextTask.getPriority()) + .setDoneUsers(doneUserList.toJSONString()) + .setTodoUsers(JSON.toJSONString(collect_username)) + ; + // 鍒犻櫎鍚庨噸鍐� + for (String oldUser : collect_username) { + taskService.deleteCandidateUser(task2.getId(), oldUser); + } + if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) { + // 鍓嶇娌℃湁浼犲叆鍊欓�変汉 && 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩� + for (String newUser : beforeParamsCandidateUsernames) { + taskService.addCandidateUser(task2.getId(), newUser); + } + newBusiness.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); + } else { + for (String oldUser : collect_username) { + taskService.addCandidateUser(task2.getId(), oldUser); + } + newBusiness.setTodoUsers(JSON.toJSONString(collect_username)); + } + } + flowMyBusinessService.save(newBusiness); + } + flowMyBusinessService.updateById(business); } + //鍒犻櫎鍘熸湁鐨勪笟鍔℃暟鎹� + flowMyBusinessService.removeById(business.getId()); } - flowMyBusinessService.updateById(business); // 娴佺▼澶勭悊瀹屽悗锛岃繘琛屽洖璋冧笟鍔″眰 business.setValues(values); - if (flowCallBackService!=null)flowCallBackService.afterFlowHandle(business); + if (flowCallBackService != null) { + flowCallBackService.afterFlowHandle(business); + } return Result.OK(); } @Override @Transactional(rollbackFor = Exception.class) - public Result completeByDateId(FlowTaskVo flowTaskVo){ + public Result completeByDateId(FlowTaskVo flowTaskVo) { return this.complete(flowTaskVo); } @Override - public void taskRejectByDataId(FlowTaskVo flowTaskVo){ + public void taskRejectByDataId(FlowTaskVo flowTaskVo) { FlowMyBusiness business = flowMyBusinessService.getByDataId(flowTaskVo.getDataId()); flowTaskVo.setTaskId(business.getTaskId()); this.taskReject(flowTaskVo); } + /** * 椹冲洖浠诲姟 * @@ -387,7 +470,7 @@ /*======================椹冲洖 鍥炶皟浠ュ強鍏抽敭鏁版嵁淇濆瓨======================*/ //涓氬姟鏁版嵁id String dataId = flowTaskVo.getDataId(); - if (dataId==null) return; + if (dataId == null) return; //濡傛灉淇濆瓨鏁版嵁鍓嶆湭璋冪敤蹇呰皟鐨凢lowCommonService.initActBusiness鏂规硶锛屽氨浼氭湁闂 FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId); // 椹冲洖鍒颁簡涓婁竴涓妭鐐圭瓑寰呭鐞� @@ -397,21 +480,21 @@ String serviceImplName = business.getServiceImplName(); FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); Map<String, Object> values = flowTaskVo.getValues(); - if (values ==null){ + if (values == null) { values = MapUtil.newHashMap(); - values.put("dataId",dataId); + values.put("dataId", dataId); } else { - values.put("dataId",dataId); + values.put("dataId", dataId); } List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionKey(), values); //璁剧疆鏁版嵁 String doneUsers = business.getDoneUsers(); // 澶勭悊杩囨祦绋嬬殑浜� JSONArray doneUserList = new JSONArray(); - if (StrUtil.isNotBlank(doneUsers)){ + if (StrUtil.isNotBlank(doneUsers)) { doneUserList = JSON.parseArray(doneUsers); } - if (!doneUserList.contains(loginUser.getUsername())){ + if (!doneUserList.contains(loginUser.getUsername())) { doneUserList.add(loginUser.getUsername()); } business @@ -432,31 +515,31 @@ } } - if (targetElement!=null){ + if (targetElement != null) { UserTask targetTask = (UserTask) targetElement; business.setPriority(targetTask.getPriority()); - if (StrUtil.equals(business.getTaskNameId(),ProcessConstants.START_NODE)){ + if (StrUtil.equals(business.getTaskNameId(), ProcessConstants.START_NODE)) { // 寮�濮嬭妭鐐广�傝缃鐞嗕汉涓虹敵璇蜂汉 business.setTodoUsers(JSON.toJSONString(Lists.newArrayList(business.getProposer()))); - taskService.setAssignee(business.getTaskId(),business.getProposer()); + taskService.setAssignee(business.getTaskId(), business.getProposer()); } else { List<SysUser> sysUserFromTask = getSysUserFromTask(targetTask); List<String> collect_username = sysUserFromTask.stream().map(SysUser::getUsername).collect(Collectors.toList()); // 鍓嶇瀛樺叆鐨勫�欓�変汉 List<String> candidateUsers = flowTaskVo.getCandidateUsers(); - if (CollUtil.isNotEmpty(candidateUsers)){ + if (CollUtil.isNotEmpty(candidateUsers)) { collect_username = candidateUsers; } business.setTodoUsers(JSON.toJSONString(collect_username)); // 鍒犻櫎鍚庨噸鍐� for (Task task2One : task2List) { for (String oldUser : collect_username) { - taskService.deleteCandidateUser(task2One.getId(),oldUser); + taskService.deleteCandidateUser(task2One.getId(), oldUser); } } - if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){ - if (CollUtil.isNotEmpty(candidateUsers)){ + if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) { + if (CollUtil.isNotEmpty(candidateUsers)) { beforeParamsCandidateUsernames = candidateUsers; } // 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩� @@ -477,9 +560,9 @@ } flowMyBusinessService.updateById(business); - // 娴佺▼澶勭悊瀹屽悗锛岃繘琛屽洖璋冧笟鍔″眰 + // 娴佺▼澶勭悊瀹屽悗锛岃繘琛屽洖璋冧笟鍔″眰 business.setValues(values); - if (flowCallBackService!=null) flowCallBackService.afterFlowHandle(business); + if (flowCallBackService != null) flowCallBackService.afterFlowHandle(business); } catch (FlowableObjectNotFoundException e) { throw new CustomException("鏈壘鍒版祦绋嬪疄渚嬶紝娴佺▼鍙兘宸插彂鐢熷彉鍖�"); } catch (FlowableException e) { @@ -487,13 +570,15 @@ } } + @Override - public void taskReturnByDataId(FlowTaskVo flowTaskVo){ + public void taskReturnByDataId(FlowTaskVo flowTaskVo) { //濡傛灉淇濆瓨鏁版嵁鍓嶆湭璋冪敤蹇呰皟鐨凢lowCommonService.initActBusiness鏂规硶锛屽氨浼氭湁闂 FlowMyBusiness business = flowMyBusinessService.getByDataId(flowTaskVo.getDataId()); flowTaskVo.setTaskId(business.getTaskId()); taskReturn(flowTaskVo); } + /** * 閫�鍥炰换鍔� * @@ -574,7 +659,7 @@ /*======================閫�鍥� 鍥炶皟浠ュ強鍏抽敭鏁版嵁淇濆瓨======================*/ //涓氬姟鏁版嵁id String dataId = flowTaskVo.getDataId(); - if (dataId==null) return; + if (dataId == null) return; //濡傛灉淇濆瓨鏁版嵁鍓嶆湭璋冪敤蹇呰皟鐨凢lowCommonService.initActBusiness鏂规硶锛屽氨浼氭湁闂 FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId); //spring瀹瑰櫒绫诲悕 @@ -584,61 +669,61 @@ String doneUsers = business.getDoneUsers(); // 澶勭悊杩囨祦绋嬬殑浜� JSONArray doneUserList = new JSONArray(); - if (StrUtil.isNotBlank(doneUsers)){ + if (StrUtil.isNotBlank(doneUsers)) { doneUserList = JSON.parseArray(doneUsers); } - if (!doneUserList.contains(loginUser.getUsername())){ + if (!doneUserList.contains(loginUser.getUsername())) { doneUserList.add(loginUser.getUsername()); } - //**璺宠浆鍒扮洰鏍囪妭鐐� + //**璺宠浆鍒扮洰鏍囪妭鐐� List<Task> task2List = taskService.createTaskQuery().processInstanceId(business.getProcessInstanceId()).active().list(); Task targetTask = task2List.get(0); - business - .setTaskId(targetTask.getId()) + business + .setTaskId(targetTask.getId()) // .setActStatus(ActStatus.reject) - .setTaskNameId(targetTask.getTaskDefinitionKey()) - .setTaskName(targetTask.getName()) - .setPriority(targetTask.getPriority()+"") - .setDoneUsers(doneUserList.toJSONString()) - ; - if (target!=null){ + .setTaskNameId(targetTask.getTaskDefinitionKey()) + .setTaskName(targetTask.getName()) + .setPriority(targetTask.getPriority() + "") + .setDoneUsers(doneUserList.toJSONString()) + ; + if (target != null) { UserTask target2 = (UserTask) target; business.setPriority(target2.getPriority()); - if (StrUtil.equals(business.getTaskNameId(),ProcessConstants.START_NODE)){ - // 寮�濮嬭妭鐐广�傝缃鐞嗕汉涓虹敵璇蜂汉 + if (StrUtil.equals(business.getTaskNameId(), ProcessConstants.START_NODE)) { + // 寮�濮嬭妭鐐广�傝缃鐞嗕汉涓虹敵璇蜂汉 business.setTodoUsers(JSON.toJSONString(Lists.newArrayList(business.getProposer()))); - taskService.setAssignee(business.getTaskId(),business.getProposer()); + taskService.setAssignee(business.getTaskId(), business.getProposer()); } else { List<SysUser> sysUserFromTask = getSysUserFromTask(target2); List<String> collect_username = sysUserFromTask.stream().map(SysUser::getUsername).collect(Collectors.toList()); List<String> candidateUsers = flowTaskVo.getCandidateUsers(); - if (CollUtil.isNotEmpty(candidateUsers)){ + if (CollUtil.isNotEmpty(candidateUsers)) { collect_username = candidateUsers; } business.setTodoUsers(JSON.toJSONString(collect_username)); // 鍒犻櫎鍚庨噸鍐� for (Task task2One : task2List) { for (String oldUser : collect_username) { - taskService.deleteCandidateUser(task2One.getId(),oldUser); + taskService.deleteCandidateUser(task2One.getId(), oldUser); } } Map<String, Object> values = flowTaskVo.getValues(); - if (values==null){ + if (values == null) { values = MapUtil.newHashMap(); - values.put("dataId",dataId); + values.put("dataId", dataId); } else { - values.put("dataId",dataId); + values.put("dataId", dataId); } List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(targetTask.getTaskDefinitionKey(), values); - if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){ - if (CollUtil.isNotEmpty(candidateUsers)){ + if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) { + if (CollUtil.isNotEmpty(candidateUsers)) { beforeParamsCandidateUsernames = candidateUsers; } // 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩� for (Task task2One : task2List) { for (String newUser : beforeParamsCandidateUsernames) { - taskService.addCandidateUser(task2One.getId(),newUser); + taskService.addCandidateUser(task2One.getId(), newUser); } } business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); @@ -654,7 +739,7 @@ flowMyBusinessService.updateById(business); // 娴佺▼澶勭悊瀹屽悗锛岃繘琛屽洖璋冧笟鍔″眰 business.setValues(flowTaskVo.getValues()); - if (flowCallBackService!=null) flowCallBackService.afterFlowHandle(business); + if (flowCallBackService != null) flowCallBackService.afterFlowHandle(business); } catch (FlowableObjectNotFoundException e) { throw new CustomException("鏈壘鍒版祦绋嬪疄渚嬶紝娴佺▼鍙兘宸插彂鐢熷彉鍖�"); } catch (FlowableException e) { @@ -671,15 +756,16 @@ /** * 缁撴潫娴佺▼ + * * @param processInstanceId 娴佺▼瀹炰緥 ID - * @param deleteReason 瀹氫箟鍒犻櫎鍘熷洜 + * @param deleteReason 瀹氫箟鍒犻櫎鍘熷洜 */ public Result<?> end(String processInstanceId, String deleteReason) { try { // 寮哄埗缁撴潫娴佺▼瀹炰緥 runtimeService.deleteProcessInstance(processInstanceId, deleteReason); // 鍒犻櫎鍏宠仈娴佺▼鐨勪笟鍔� - FlowMyBusiness flowMyBusiness=flowMyBusinessService.getFlowMyBusiness(processInstanceId); + FlowMyBusiness flowMyBusiness = flowMyBusinessService.getFlowMyBusiness(processInstanceId); flowMyBusinessService.removeById(flowMyBusiness.getId()); System.out.println("Process instance with ID " + processInstanceId + " has been forcefully ended."); } catch (Exception e) { @@ -740,7 +826,7 @@ @Override public void deleteTask(FlowTaskVo flowTaskVo) { // todo 寰呯‘璁ゅ垹闄や换鍔℃槸鐗╃悊鍒犻櫎浠诲姟 杩樻槸閫昏緫鍒犻櫎锛岃杩欎釜浠诲姟鐩存帴閫氳繃锛� - taskService.deleteTask(flowTaskVo.getTaskId(),flowTaskVo.getComment()); + taskService.deleteTask(flowTaskVo.getTaskId(), flowTaskVo.getComment()); } /** @@ -785,7 +871,7 @@ @Override @Transactional(rollbackFor = Exception.class) public void assignTask(FlowTaskVo flowTaskVo) { - taskService.setAssignee(flowTaskVo.getTaskId(),flowTaskVo.getAssignee()); + taskService.setAssignee(flowTaskVo.getTaskId(), flowTaskVo.getAssignee()); } /** @@ -803,7 +889,7 @@ .startedBy(username) .orderByProcessInstanceStartTime() .desc(); - List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery.listPage((pageNum - 1)*pageSize, pageSize); + List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery.listPage((pageNum - 1) * pageSize, pageSize); page.setTotal(historicProcessInstanceQuery.count()); List<FlowTaskDto> flowList = new ArrayList<>(); for (HistoricProcessInstance hisIns : historicProcessInstances) { @@ -942,6 +1028,7 @@ /** * 鍒ゆ柇澶氫釜浠诲姟鏄惁澶勪簬鍚屼竴娴佺▼鑺傜偣 + * * @param taskIds 閫楀彿鍒嗛殧鐨勪换鍔D瀛楃涓� * @return 缁熶竴缁撴灉灏佽 */ @@ -1013,7 +1100,7 @@ .taskAssignee(username) .orderByTaskCreateTime().desc(); page.setTotal(taskQuery.count()); - List<Task> taskList = taskQuery.listPage((pageNum - 1)*pageSize, pageSize); + List<Task> taskList = taskQuery.listPage((pageNum - 1) * pageSize, pageSize); List<FlowTaskDto> flowList = new ArrayList<>(); for (Task task : taskList) { FlowTaskDto flowTask = new FlowTaskDto(); @@ -1040,7 +1127,7 @@ List<String> departNamesByUsername = iFlowThirdService.getDepartNamesByUsername(historicProcessInstance.getStartUserId()); flowTask.setStartUserId(startUser.getUsername()); flowTask.setStartUserName(startUser.getRealname()); - flowTask.setStartDeptName(CollUtil.join(departNamesByUsername,"锛�")); + flowTask.setStartDeptName(CollUtil.join(departNamesByUsername, "锛�")); flowList.add(flowTask); } @@ -1069,15 +1156,15 @@ .processInstanceId(flowTaskDto.getProcInsId()) .singleResult(); SysUser startUser = iFlowThirdService.getUserByUsername(historicProcessInstance.getStartUserId()); - if (startUser!=null){ + if (startUser != null) { flowTaskDto.setStartUserId(startUser.getUsername()); flowTaskDto.setStartUserName(startUser.getRealname()); } List<String> departNamesByUsername = iFlowThirdService.getDepartNamesByUsername(historicProcessInstance.getStartUserId()); - flowTaskDto.setStartDeptName(CollUtil.join(departNamesByUsername,"锛�")); - if (flowTaskDto.getTodoUsers() == null){ + flowTaskDto.setStartDeptName(CollUtil.join(departNamesByUsername, "锛�")); + if (flowTaskDto.getTodoUsers() == null) { flowTaskDto.setTodoUsers(""); - }else { + } else { //鍘婚櫎[] flowTaskDto.setTodoUsers(flowTaskDto.getTodoUsers().replaceAll("\\[", "").replaceAll("\\]", "")); flowTaskDto.setTodoUsers(flowTaskDto.getTodoUsers().replaceAll("\"", "")); @@ -1125,9 +1212,9 @@ flowTask.setAssigneeId(sysUser.getUsername()); flowTask.setAssigneeName(sysUser.getRealname()); List<String> departNamesByUsername = iFlowThirdService.getDepartNamesByUsername(histIns.getAssignee()); - flowTask.setDeptName(CollUtil.join(departNamesByUsername,"锛�")); - if (StrUtil.equals(histIns.getActivityId(),ProcessConstants.START_NODE)){ - // 寮�濮嬭妭鐐癸紝鎶婂�欓�変汉璁剧疆涓哄彂璧蜂汉锛岃繖涓�煎凡琚叾浠栧湴鏂硅缃繃锛屼笌瀹為檯鍔炵悊浜轰竴鑷村嵆鍙� + flowTask.setDeptName(CollUtil.join(departNamesByUsername, "锛�")); + if (StrUtil.equals(histIns.getActivityId(), ProcessConstants.START_NODE)) { + // 寮�濮嬭妭鐐癸紝鎶婂�欓�変汉璁剧疆涓哄彂璧蜂汉锛岃繖涓�煎凡琚叾浠栧湴鏂硅缃繃锛屼笌瀹為檯鍔炵悊浜轰竴鑷村嵆鍙� flowTask.setCandidate(sysUser.getRealname()); } } @@ -1169,9 +1256,9 @@ String serviceImplName = business.getServiceImplName(); FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); // 娴佺▼澶勭悊瀹屽悗锛岃繘琛屽洖璋冧笟鍔″眰 - if (flowCallBackService!=null){ + if (flowCallBackService != null) { Object businessDataById = flowCallBackService.getBusinessDataById(dataId); - map.put("formData",businessDataById); + map.put("formData", businessDataById); } return Result.OK(map); } @@ -1260,8 +1347,8 @@ for (FlowViewerDto viewerDto : flowViewerList) { String key = viewerDto.getKey(); - if (key.equals(flowViewerDto.getKey())){ - // 閲嶅鍒犻櫎鍚庨潰鏇存柊 + if (key.equals(flowViewerDto.getKey())) { + // 閲嶅鍒犻櫎鍚庨潰鏇存柊 flowViewerList.remove(viewerDto); break; } @@ -1276,7 +1363,7 @@ @Override public List<FlowViewerDto> getFlowViewerByDataId(String dataId) { LambdaQueryWrapper<FlowMyBusiness> flowMyBusinessLambdaQueryWrapper = new LambdaQueryWrapper<>(); - flowMyBusinessLambdaQueryWrapper.eq(FlowMyBusiness::getDataId,dataId) + flowMyBusinessLambdaQueryWrapper.eq(FlowMyBusiness::getDataId, dataId) ; //濡傛灉淇濆瓨鏁版嵁鍓嶆湭璋冪敤蹇呰皟鐨凢lowCommonService.initActBusiness鏂规硶锛屽氨浼氭湁闂 FlowMyBusiness business = flowMyBusinessService.getOne(flowMyBusinessLambdaQueryWrapper); @@ -1298,7 +1385,7 @@ String firstKey = stev.getId(); orderKeys.add(firstKey); //椤哄簭鑾峰彇鑺傜偣 - this.appendKeys(orderKeys, firstKey,flowElements); + this.appendKeys(orderKeys, firstKey, flowElements); } catch (Exception e) { break; } @@ -1307,11 +1394,11 @@ for (String key : orderKeys) { Optional<FlowViewerDto> any = flowViewers.stream().filter(o -> StrUtil.equals(o.getKey(), key)).findAny(); - if(any.isPresent()){ + if (any.isPresent()) { FlowViewerDto viewerDto = any.get(); reflowViewers.add(viewerDto); - if (!viewerDto.isCompleted()){ - // 宸插埌姝e湪绛夊緟鎵ц鐨勮妭鐐癸紝鍚庨潰鐨勪笉瑕佷簡 + if (!viewerDto.isCompleted()) { + // 宸插埌姝e湪绛夊緟鎵ц鐨勮妭鐐癸紝鍚庨潰鐨勪笉瑕佷簡 break; } } @@ -1327,8 +1414,9 @@ /** * 椤哄簭鎶藉彇鑺傜偣 - * @param orderKeys 瀹瑰櫒 - * @param sourceKey 婧� + * + * @param orderKeys 瀹瑰櫒 + * @param sourceKey 婧� * @param flowElements 鎵�鏈夌殑鑺傜偣瀵硅薄 */ private void appendKeys(List<String> orderKeys, String sourceKey, List<FlowElement> flowElements) { @@ -1337,9 +1425,9 @@ SequenceFlow sf = (SequenceFlow) flowElement; String sourceRef = sf.getSourceRef(); String targetRef = sf.getTargetRef(); - if (sourceKey.equals(sourceRef)&&targetRef!=null){ + if (sourceKey.equals(sourceRef) && targetRef != null) { orderKeys.add(targetRef); - this.appendKeys(orderKeys,targetRef,flowElements); + this.appendKeys(orderKeys, targetRef, flowElements); } } catch (Exception e) { continue; @@ -1373,89 +1461,116 @@ * @return */ @Override - public Result getNextFlowNode(FlowTaskVo flowTaskVo) { + public Result<List<FlowNextDto>> getNextFlowNode(FlowTaskVo flowTaskVo) { // todo 浼间箮閫昏緫鏈啓瀹岋紝寰呮鏌� - FlowNextDto flowNextDto = this.getNextFlowNode(flowTaskVo.getTaskId(), flowTaskVo.getValues()); - if (flowNextDto==null) { + List<FlowNextDto> nextDtoList = this.getNextFlowNode(flowTaskVo.getTaskId(), flowTaskVo.getValues()); + if (CollectionUtils.isEmpty(nextDtoList)) { return Result.OK("娴佺▼宸插畬缁�", null); } - return Result.OK(flowNextDto); + return Result.OK(nextDtoList); + } + + @Override + public boolean checkParallelCompletion(String currentTaskId) { + //鑾峰彇褰撳墠浠诲姟 + Task currentTask = taskService.createTaskQuery().taskId(currentTaskId).singleResult(); + if (currentTask == null) { + return false; + } + //鑾峰彇褰撳墠鎵ц + Execution execution = runtimeService.createExecutionQuery().executionId(currentTask.getExecutionId()).singleResult(); + if (execution == null) { + return false; + } + String parentId = execution.getParentId(); + if (StringUtils.isBlank(parentId)) { + //娌℃湁鐖惰妭鐐� 浠h〃娌℃湁骞惰浠诲姟 + return true; + } + // 鑾峰彇鎵�鏈夊厔寮熸墽琛� + List<Execution> siblingExecutions = runtimeService.createExecutionQuery() + .parentId(parentId) + .list(); + + for (Execution siblingExecution : siblingExecutions) { + if (!siblingExecution.getId().equals(execution.getId())) { + //闈炶嚜韬殑鍏勫紵鑺傜偣 + long count = runtimeService.createActivityInstanceQuery().executionId(siblingExecution.getId()).unfinished().count(); + if (count > 0) { + return false; + } + } + } + return true; } /** * 鑾峰彇涓嬩竴涓妭鐐逛俊鎭�,娴佺▼瀹氫箟涓婄殑鑺傜偣淇℃伅 + * * @param taskId 褰撳墠鑺傜偣id * @param values 娴佺▼鍙橀噺 * @return 濡傛灉杩斿洖null锛岃〃绀烘病鏈変笅涓�涓妭鐐癸紝娴佺▼缁撴潫 */ - public FlowNextDto getNextFlowNode(String taskId, Map<String, Object> values) { + public List<FlowNextDto> getNextFlowNode(String taskId, Map<String, Object> values) { //褰撳墠鑺傜偣 Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); if (Objects.nonNull(task)) { // 涓嬩釜浠诲姟鑺傜偣 List<UserTask> nextUserTask = FindNextNodeUtil.getNextUserTasks(repositoryService, task, values); if (CollectionUtils.isNotEmpty(nextUserTask)) { - FlowNextDto flowNextDto = new FlowNextDto(); + List<FlowNextDto> nextDtoList = Lists.newArrayList(); + FlowNextDto flowNextDto; for (UserTask userTask : nextUserTask) { + flowNextDto = new FlowNextDto(); flowNextDto.setUserTask(userTask); //寰呭姙浜哄憳 List<SysUser> sysUserFromTask = this.getSysUserFromTask(userTask); flowNextDto.setUserList(sysUserFromTask); - - MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics(); - if (Objects.nonNull(multiInstance)) { - // 浼氱 澶氬疄渚� - String collectionString = multiInstance.getInputDataItem(); - Object colObj = values.get(collectionString); - List<String> userNameList = null; - if(colObj!=null){ - userNameList = (List) colObj; - } - if (CollUtil.isNotEmpty(userNameList)){ - // 寰呭姙浜哄憳浠庡彉閲忎腑鑾峰彇 鍚﹀垯灏辨槸鑺傜偣涓厤缃殑鐢ㄦ埛 sysUserFromTask - List<SysUser> userList = Lists.newArrayList(); - for (String username : userNameList) { - SysUser userByUsername = iFlowThirdService.getUserByUsername(username); - if (userByUsername==null){ - throw new CustomException(username + " 鐢ㄦ埛鍚嶆湭鎵惧埌"); - } else { - userList.add(userByUsername); - } + //澶氫换鍔″苟琛� + Object colObj = values.get(userTask.getId()); + if (Objects.nonNull(colObj)) { + List<String> userNameList = (List) colObj; + // 寰呭姙浜哄憳浠庡彉閲忎腑鑾峰彇 鍚﹀垯灏辨槸鑺傜偣涓厤缃殑鐢ㄦ埛 sysUserFromTask + List<SysUser> userList = Lists.newArrayList(); + for (String username : userNameList) { + SysUser userByUsername = iFlowThirdService.getUserByUsername(username); + if (userByUsername == null) { + throw new CustomException(username + " 鐢ㄦ埛鍚嶆湭鎵惧埌"); + } else { + userList.add(userByUsername); } - flowNextDto.setUserList(userList); - } else { - // 鍙橀噺涓病鏈変紶鍏ワ紝鍐欏叆鑺傜偣涓厤缃殑鐢ㄦ埛 - List<String> collect_username = sysUserFromTask.stream().map(SysUser::getUsername).collect(Collectors.toList()); - values.put(collectionString,collect_username); } + flowNextDto.setUserList(userList); } else { - // todo 璇诲彇鑷畾涔夎妭鐐瑰睘鎬у仛浜涘暐锛� - //String dataType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_DATA_TYPE); - String userType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_USER_TYPE); + // 鍙橀噺涓病鏈変紶鍏ワ紝鍐欏叆鑺傜偣涓厤缃殑鐢ㄦ埛 + List<String> collect_username = sysUserFromTask.stream().map(SysUser::getUsername).collect(Collectors.toList()); + values.put(userTask.getId(), collect_username); } + nextDtoList.add(flowNextDto); } - return flowNextDto; + return nextDtoList; } } return null; } + public List<SysUser> getSysUserFromTask(UserTask userTask) { String assignee = userTask.getAssignee(); - if (StrUtil.isNotBlank(assignee)){ + if (StrUtil.isNotBlank(assignee)) { // 鎸囧畾鍗曚汉 SysUser userByUsername = iFlowThirdService.getUserByUsername(assignee); return Lists.newArrayList(userByUsername); } List<String> candidateUsers = userTask.getCandidateUsers(); - if (CollUtil.isNotEmpty(candidateUsers)){ + if (CollUtil.isNotEmpty(candidateUsers)) { // 鎸囧畾澶氫汉 List<SysUser> list = iFlowThirdService.getAllUser(); - return list.stream().filter(o->candidateUsers.contains(o.getUsername())).collect(Collectors.toList()); + return list.stream().filter(o -> candidateUsers.contains(o.getUsername())).collect(Collectors.toList()); } List<String> candidateGroups = userTask.getCandidateGroups(); - if (CollUtil.isNotEmpty(candidateGroups)){ - // 鎸囧畾澶氱粍 + if (CollUtil.isNotEmpty(candidateGroups)) { + // 鎸囧畾澶氱粍 List<SysUser> userList = Lists.newArrayList(); for (String candidateGroup : candidateGroups) { List<SysUser> usersByRoleId = iFlowThirdService.getUsersByRoleId(candidateGroup); @@ -1465,6 +1580,7 @@ } return Lists.newArrayList(); } + /** * 娴佺▼瀹屾垚鏃堕棿澶勭悊 * -- Gitblit v1.9.3