From 1ea92f7b715e9fcc6bbf8e0b34395d05385b1aaf Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期五, 29 十一月 2024 21:39:55 +0800 Subject: [PATCH] 流程跟进列表返回流程是否挂起 --- business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java | 189 +++++++++++++++++++++++++++++++++++++++------- 1 files changed, 159 insertions(+), 30 deletions(-) diff --git a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java index ab53566..03743a5 100644 --- a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java +++ b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java @@ -81,56 +81,81 @@ public Result page(ProjectProcessQuery query) { IPage<ProjectProcessVO> page = PageUtil.getPage(query, ProjectProcessVO.class); baseMapper.getPage(page, query); + for (ProjectProcessVO vo : page.getRecords()) { + if (Objects.nonNull(vo.getProcessDefId())) { + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(vo.getProcessDefId()).singleResult(); + if (Objects.nonNull(processDefinition)) { + vo.setSuspended(processDefinition.isSuspended()); + } + } + } return Result.ok().data(page.getRecords()).total(page.getTotal()); } @Override + @Transactional(rollbackFor = Exception.class) public Result projectSetProcess(ProjectProcessForm form) { // 鏌ヨ璇ラ」鐩槸鍚﹀凡缁忕粦瀹氳繃娴佺▼浜嗭紝妫�鏌ョ粦瀹氱殑娴佺▼鏄惁鍦ㄨ繍琛岋紝鍦ㄨ繍琛屽氨鍒犱簡 ProjectProcess pp = new LambdaQueryChainWrapper<>(baseMapper) .eq(ProjectProcess::getProjectId, form.getProjectId()) .one(); - if (Objects.nonNull(pp)) { - // TODO 澶勭悊涔嬪墠缁戝畾杩囩殑娴佺▼鏁版嵁 - new LambdaUpdateChainWrapper<>(baseMapper) - .eq(ProjectProcess::getProjectId, form.getProjectId()) - .set(ProjectProcess::getProcessDefId, form.getProcessDefId()) - .update(); - } else { - ProjectProcess entity = ProjectProcessForm.getEntityByForm(form, null); - baseMapper.insert(entity); + if (Objects.isNull(pp)) { + throw new RuntimeException("璇ラ」鐩湭缁戝畾娴佺▼"); } + if (Objects.nonNull(pp.getProcessInsId())) { + HistoricProcessInstance historicProcessInstance = + historyService.createHistoricProcessInstanceQuery().processInstanceId(pp.getProcessInsId()).singleResult(); + // 鍒犻櫎涔嬪墠娴佺▼鐨勬暟鎹� + if (historicProcessInstance.getEndTime() != null) { + historyService.deleteHistoricProcessInstance(historicProcessInstance.getId()); + } else { + // 鍒犻櫎娴佺▼瀹炰緥 + runtimeService.deleteProcessInstance(pp.getProcessInsId(), ""); + // 鍒犻櫎鍘嗗彶娴佺▼瀹炰緥 + historyService.deleteHistoricProcessInstance(pp.getProcessInsId()); + } + } + String processInsId = this.startPro(form.getProjectId(), form.getProcessDefId()); + new LambdaUpdateChainWrapper<>(baseMapper) + .eq(ProjectProcess::getProjectId, form.getProjectId()) + .set(ProjectProcess::getProcessDefId, form.getProcessDefId()) + .set(ProjectProcess::getProcessInsId, processInsId) + .update(); return Result.ok("娴佺▼鍙樻洿鎴愬姛"); } @Override @Transactional(rollbackFor = Exception.class) - public Result startProcess(String projectId, String processDefId) { + public Result startProcess(Long projectId, String processDefId) { + String processInsId = this.startPro(projectId, processDefId); + ProjectProcess entity = new ProjectProcess(); + entity.setProjectId(projectId); + entity.setProcessDefId(processDefId); + entity.setProcessInsId(processInsId); + baseMapper.insert(entity); + return Result.ok("娴佺▼鍚姩鎴愬姛"); + } + + /** + * 鍚姩娴佺▼ + * + * @param projectId + * @param processDefId + * @return + */ + private String startPro(Long projectId, String processDefId) { ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefId) .latestVersion().singleResult(); if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) { - return Result.error("璇ユ祦绋嬪凡琚寕璧�,璇峰厛婵�娲绘祦绋�"); + throw new RuntimeException("璇ユ祦绋嬪凡琚寕璧�,璇峰厛婵�娲绘祦绋�"); } Map<String, Object> variables = new HashMap<>(2); // 璁剧疆娴佺▼鍙戣捣浜篒d鍒版祦绋嬩腑 SysUser sysUser = SecurityUtils.getLoginUser().getUser(); identityService.setAuthenticatedUserId(sysUser.getUserId().toString()); variables.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId()); - ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, projectId, variables); -// // 娴佺▼鍙戣捣鏃� 璺宠繃鍙戣捣浜鸿妭鐐� -// // 缁欑涓�姝ョ敵璇蜂汉鑺傜偣璁剧疆浠诲姟鎵ц浜哄拰鎰忚 -// Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult(); -// if (Objects.nonNull(task)) { -// taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.NORMAL.getType(), sysUser.getNickName() + "鍙戣捣娴佺▼鐢宠"); -// taskService.complete(task.getId(), variables); -// } - // 椤圭洰娴佺▼鍏宠仈娴佺▼瀹炰緥id - new LambdaUpdateChainWrapper<>(baseMapper) - .eq(ProjectProcess::getProjectId, projectId) - .eq(ProjectProcess::getProcessDefId, processDefId) - .set(ProjectProcess::getProcessInsId, processInstance.getProcessInstanceId()) - .update(); - return Result.ok("娴佺▼鍚姩鎴愬姛"); + ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, projectId + "", variables); + return processInstance.getId(); } /** @@ -167,6 +192,7 @@ // 鐘舵�佺粺璁� taskStatistics.setTotalTaskNum(this.getTotalTaskNum(processDefId)); taskStatistics.setTodoTaskNum(this.getTodoTaskNum(projectProcess.getProcessInsId())); + taskStatistics.setRemainingTaskNum(this.getRemainingTaskNum(processDefId, projectProcess.getProcessInsId())); // taskStatistics.setCurrentTask(this.getCurrentNodeTaskList(projectProcess.getProcessInstanceId())); taskStatistics.setRemainingTaskNum(this.getNotFinishedTaskNum(projectProcess.getProcessInsId())); detail.setStatistics(taskStatistics); @@ -192,19 +218,32 @@ switch (query.getTaskType()) { case TaskTypeConstant.ALL: this.getAllUserTask(query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName (), (int)query.getCurrentPage(), (int)query.getPageSize(), ok); + break; case TaskTypeConstant.TODO: this.getTodoTaskList(projectProcess.getProcessInsId(), query.getTaskName(), (int)query.getPageSize(), (int)query.getCurrentPage(), ok); + ok.data(ok.get("taskList")); + break; case TaskTypeConstant.CURRENT: - + break; case TaskTypeConstant.REMAINING: - + this.getRemainingTask(query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName (), (int)query.getCurrentPage(), (int)query.getPageSize(), ok); + break; default: - + break; } return ok; } + /** + * 鏌ヨ寰呭姙浠诲姟 + * + * @param processInsId + * @param taskName + * @param pageSize + * @param pageNum + * @param result + */ private void getTodoTaskList(String processInsId, String taskName, int pageSize, int pageNum, Result result) { TaskQuery taskQuery = taskService.createTaskQuery() .active() @@ -212,7 +251,6 @@ .includeProcessVariables() .orderByTaskCreateTime().desc(); -// TODO 浼犲叆鍚嶇О鏌ヨ涓嶅埌鏁版嵁? if (StringUtils.isNotBlank(taskName)) { taskQuery.processDefinitionNameLike(taskName); } @@ -349,12 +387,103 @@ } /** + * 鏌ヨ鍓╀綑浜嬮」锛堟湭寮�濮嬬殑浠诲姟锛� + * + * @param processDefinitionId + * @param processInsId + * @param taskName + * @param pageNum + * @param pageSize + * @param result + * @return + */ + private List<CustomerTaskVO> getRemainingTask(String processDefinitionId, String processInsId, String taskName, Integer pageNum, Integer pageSize, Result result) { + int startNum = pageSize * (pageNum - 1); + int endNum = startNum + pageSize; + List<UserTask> allUserTaskElement = this.getAllUserTaskElement(processDefinitionId); + result.total(allUserTaskElement.size()); + if (startNum >= allUserTaskElement.size()) { + // 濡傛灉璧峰绱㈠紩瓒呭嚭浜嗗垪琛ㄧ殑澶у皬锛岃繑鍥炰竴涓┖鍒楄〃 + return new ArrayList<>(); + } + if (StringUtils.isNotBlank(taskName)) { + // 妯℃嫙妯$硦鏌ヨ + allUserTaskElement = allUserTaskElement.stream().filter(taskEl -> taskEl.getName().contains(taskName)).collect(Collectors.toList()); + } + int end = Math.min(endNum, allUserTaskElement.size()); + List<UserTask> userTasks = allUserTaskElement.subList(startNum, end); + // 鏌ュ嚭娴佺▼ + ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(processInsId).singleResult(); + // 鍒ゆ柇浠诲姟鐘舵�� + List<CustomerTaskVO> vos = userTasks.stream().map(userTask -> { + CustomerTaskVO vo = new CustomerTaskVO(); + vo.setProcessInsId(process.getId()); + vo.setProcessDefId(processDefinitionId); + vo.setDeployId(process.getDeploymentId()); + vo.setTaskName(userTask.getName()); + vo.setProcessName(process.getProcessDefinitionName()); + Task task = taskService.createTaskQuery().processInstanceId(process.getId()).taskDefinitionKey(userTask.getId()).singleResult(); + if (Objects.isNull(task)) { + // 濡傛灉浠诲姟鍦ㄨ繍琛屾椂娌℃壘鍒帮紝閭d箞鍙兘涓烘湭寮�濮嬫垨鑰呭凡瀹屾垚锛屽彧鏌ヨ鏈紑濮嬬殑 + HistoricTaskInstance historicTask = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(process.getProcessInstanceId()) + .taskDefinitionKey(userTask.getId()) + .includeIdentityLinks() + .singleResult(); + if (Objects.isNull(historicTask)) { + vo.setTaskStatus(TaskStatusEnum.NOT_START); + return vo; + } else { + return null; + } + } else { + return null; + } + }).filter(Objects::nonNull).collect(Collectors.toList()); + result.data(vos); + return vos; + } + + /** + * 鏌ヨ鍓╀綑浜嬮」锛堟湭寮�濮嬬殑浠诲姟锛夋暟閲� + * + * @param processDefinitionId 娴佺▼瀹氫箟id + * @param processInsId 娴佺▼瀹炰緥id + * @return + */ + private Long getRemainingTaskNum(String processDefinitionId, String processInsId) { + + List<UserTask> allUserTaskElement = this.getAllUserTaskElement(processDefinitionId); + // 鏌ュ嚭娴佺▼ + ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(processInsId).singleResult(); + long num = 0L; + // 鍒ゆ柇浠诲姟鐘舵�� + for (UserTask userTask : allUserTaskElement) { + Task task = taskService.createTaskQuery().processInstanceId(process.getId()).taskDefinitionKey(userTask.getId()).singleResult(); + if (Objects.isNull(task)) { + // 濡傛灉浠诲姟鍦ㄨ繍琛屾椂娌℃壘鍒帮紝閭d箞鍙兘涓烘湭寮�濮嬫垨鑰呭凡瀹屾垚锛屽彧鏌ヨ鏈紑濮嬬殑 + HistoricTaskInstance historicTask = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(process.getProcessInstanceId()) + .taskDefinitionKey(userTask.getId()) + .includeIdentityLinks() + .singleResult(); + if (Objects.isNull(historicTask)) { + num++; + } + } + } + return num; + } + + + /** * 璁剧疆浠诲姟鐨勫彂璧蜂汉&澶勭悊浜� * * @param taskVO * @param identityLinkInfos 濡傛灉鏄凡瀹屾垚鐨勪换鍔★紝鐢ㄨ繖涓幓鍙栧叧鑱旂殑鐢ㄦ埛/鐢ㄦ埛缁� */ private void setPromoterAndHandler(CustomerTaskVO taskVO, List<? extends IdentityLinkInfo> identityLinkInfos) { + // TODO 鍙戣捣浜烘槸鍚﹀簲涓轰笂涓�鑺傜偣鐨勫鐞嗕汉 // 娴佺▼鍙戣捣浜轰俊鎭� HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(taskVO.getProcessInsId()) -- Gitblit v1.8.0