From cde5e6335dd02db4d2137ba6d5f330544e764b3d Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期三, 26 三月 2025 04:13:26 +0800 Subject: [PATCH] 任务统计bug --- business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java | 916 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 802 insertions(+), 114 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 87cfdd1..b6ed61c 100644 --- a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java +++ b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java @@ -3,7 +3,6 @@ import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; @@ -19,6 +18,7 @@ import com.ycl.domain.entity.*; import com.ycl.domain.form.*; import com.ycl.domain.json.*; +import com.ycl.domain.query.ProcessLogQuery; import com.ycl.domain.vo.*; import com.ycl.event.event.TaskLogEvent; import com.ycl.mapper.ProjectEngineeringMapper; @@ -29,6 +29,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.domain.query.ProjectProcessQuery; import com.ycl.service.common.TaskCommonService; +import com.ycl.system.domain.base.AbsQuery; import com.ycl.system.service.ISysDeptService; import com.ycl.system.service.ISysDictTypeService; import com.ycl.system.service.ISysRoleService; @@ -50,6 +51,7 @@ import org.flowable.task.api.Task; import org.flowable.task.api.TaskQuery; import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.api.history.HistoricTaskInstanceQuery; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; @@ -303,14 +305,53 @@ taskStatistics.setTimelyFinishedTaskNum(this.getTimelyTaskNum(projectProcess.getProcessInsId())); taskStatistics.setOvertimeTaskNum(this.getOvertimeTaskNum(projectProcess.getProcessInsId())); taskStatistics.setWillOvertimeTaskNum(this.getWillOvertimeTaskNum(projectProcess.getProcessInsId())); -// taskStatistics.setCurrentTask(this.getCurrentNodeTaskList(projectProcess.getProcessInstanceId())); + taskStatistics.setWaitTaskNum(this.getWaitTaskNum(projectProcess.getProcessInsId())); + taskStatistics.setJumpTaskNum(this.getJumpTaskNum(projectProcess.getProcessInsId())); detail.setStatistics(taskStatistics); Result result = Result.ok(); - // 浠e姙浠诲姟 - this.getTodoTaskList(projectProcess.getProjectId(), projectProcess.getProcessInsId(), "", 5, 1, result); +// // 浠e姙浠诲姟 +// this.getTodoTaskList(projectProcess.getProjectId(), projectProcess.getProcessInsId(), "", 5, 1, result); return result.data(detail); + } + + /** + * 瀹圭己浠诲姟璁℃暟 + * @param processInsId + * @return + */ + private Long getWaitTaskNum(String processInsId){ + // 鏌ュ嚭瀹圭己杩囩殑浠诲姟 + List<ProcessLog> allWaitTaskList = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) + .eq(ProcessLog::getProcessInsId, processInsId) + .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.WAIT) + .orderByDesc(ProcessLog::getGmtCreate) + .list(); + // 鎺掗櫎瀹圭己鍚庡張瀹屾垚鐨勪换鍔� + List<ProcessLog> finishedTaskList = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) + .eq(ProcessLog::getProcessInsId, processInsId) + .in(ProcessLog::getEventType, ProcessLogEventTypeEnum.FINISHED, ProcessLogEventTypeEnum.REJECT) + .list(); + List<String> finishedTaskIds = finishedTaskList.stream().map(ProcessLog::getTaskId).distinct().collect(Collectors.toList()); + // 寰楀埌鏈畬鎴愮殑瀹圭己浠诲姟 + List<String> waitTaskIds = allWaitTaskList.stream().filter(log -> !finishedTaskIds.contains(log.getTaskId())).map(ProcessLog::getTaskId).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(waitTaskIds)) { + return 0L; + } + // 瀹圭己鐨勪换鍔¢兘灞炰簬鍘嗗彶浠诲姟锛屽彧鏄渶瑕佽ˉ琛ㄥ崟鏁版嵁 + List<HistoricTaskInstance> hisTaskList = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(processInsId) + .taskIds(waitTaskIds) + .includeIdentityLinks() + .orderByHistoricTaskInstanceStartTime() + .desc() + .list(); + hisTaskList = this.distinctHisTask(hisTaskList); + // 鎺掗櫎杩愯鏃朵换鍔� + List<String> runTaskKeys = taskService.createTaskQuery().processInstanceId(processInsId).list().stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList()); + hisTaskList = hisTaskList.stream().filter(his -> !runTaskKeys.contains(his.getTaskDefinitionKey())).collect(Collectors.toList()); + return Long.valueOf(hisTaskList.size()); } @Override @@ -332,7 +373,11 @@ this.getTodoTaskList(query.getProjectId(), projectProcess.getProcessInsId(), query.getTaskName(), (int) query.getPageSize(), (int) query.getCurrentPage(), ok); ok.data(ok.get("taskList")); break; - case TaskTypeConstant.CURRENT: + case TaskTypeConstant.WAIT: + this.getWaitTask(query.getProjectId(), query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName(), (int) query.getCurrentPage(), (int) query.getPageSize(), ok); + break; + case TaskTypeConstant.JUMP: + this.getJumpTask(query.getProjectId(), query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName(), (int) query.getCurrentPage(), (int) query.getPageSize(), ok); break; case TaskTypeConstant.REMAINING: this.getRemainingTask(query.getProjectId(), query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName(), (int) query.getCurrentPage(), (int) query.getPageSize(), ok); @@ -378,7 +423,50 @@ .endOr(); } result.total(taskQuery.count()); - List<Task> taskList = taskQuery.listPage(pageSize * (pageNum - 1), pageSize); + List<Task> allTodoList = taskQuery.list(); + List<TaskOrderVO> orderList = new ArrayList<>(); + allTodoList.stream().forEach(task -> { + TaskOrderVO order = new TaskOrderVO(); + order.setTaskId(task.getId()); + // 璁$畻鍔炵悊鏃堕棿锛岃秴鏃剁殑鎺掑墠闈紝娌¤秴鏃剁殑鐢变綆鍒伴珮鎺掑簭锛屾病瓒呮椂鏃堕棿鐨勬帓鏈�鍚� + ProcessCoding processCoding = processCodingService.getByTaskId(task.getId(), task.getProcessInstanceId()); + if (Objects.nonNull(processCoding)) { + if (StringUtils.isNotBlank(processCoding.getRedTime())) { + Long overtime = getTime(processCoding.getRedTime()); + long durationTime = 0l; + if (Objects.nonNull(processCoding.getStartTaskTime())) { + durationTime = ((new Date()).getTime() - processCoding.getStartTaskTime().getTime()) / 1000; + } + if (overtime > durationTime) { + order.setNum((overtime - durationTime) / 3600); + } else { + order.setNum(-2000000L); + } + } else { + order.setNum(2000000L); + } + } else { + order.setNum(2000000L); + } + orderList.add(order); + }); + // 鍗囧簭鎺掑垪 + Collections.sort(orderList, Comparator.comparingLong(TaskOrderVO::getNum)); + int startNum = pageSize * (pageNum - 1); + int endNum = startNum + pageSize; + if (startNum >= orderList.size()) { + result.data(new ArrayList<>()).total(0L); + return; + } + int end = Math.min(endNum, orderList.size()); + List<String> targetTaskIds = orderList.subList(startNum, end).stream().map(TaskOrderVO::getTaskId).collect(Collectors.toList()); + List<Task> taskList = targetTaskIds.stream().map(taskId -> { + List<Task> list = allTodoList.stream().filter(task -> task.getId().equals(taskId)).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(list)) { + return null; + } + return list.get(0); + }).filter(Objects::nonNull).collect(Collectors.toList()); List<IndexCustomerTaskVO> vos = new ArrayList<>(); for (Task task : taskList) { IndexCustomerTaskVO taskVO = new IndexCustomerTaskVO(); @@ -399,13 +487,28 @@ taskVO.setTaskDefinitionKey(task.getTaskDefinitionKey()); // 娴佺▼椤圭洰淇℃伅 - ProjectInfo project = baseMapper.getProjectInfo(task.getProcessInstanceId()); - if (Objects.nonNull(project)) { - taskVO.setProjectId(project.getId()); - taskVO.setProjectName(project.getProjectName()); - } else { - continue; + ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(baseMapper) + .eq(ProjectProcess::getProcessInsId, task.getProcessInstanceId()) + .one(); + String projectId = ""; + String projectName = ""; + if (Objects.nonNull(projectProcess)) { + if (projectProcess.getProjectType().equals(ProjectProcessTypeEnum.PROJECT)) { + ProjectInfo project = projectInfoMapper.selectById(projectProcess.getProjectId()); + if (Objects.nonNull(project)) { + projectId = projectProcess.getProjectId(); + projectName = project.getProjectName(); + } + } else if (projectProcess.getProjectType().equals(ProjectProcessTypeEnum.ENGINEERING)) { + ProjectEngineering engineering = projectEngineeringMapper.selectById(projectProcess.getProjectId()); + if (Objects.nonNull(engineering)) { + projectId = projectProcess.getProjectId(); + projectName = engineering.getProjectName(); + } + } } + taskVO.setProjectId(projectId); + taskVO.setProjectName(projectName); // 娴佺▼鍙戣捣浜轰俊鎭� this.setPromoterInfo(taskVO); @@ -468,15 +571,13 @@ } // 璁$畻鍔炵悊鏃堕棿 - ProcessCoding processCoding = processCodingService.getByTaskId(task.getId()); - if (processCoding != null) { - if (StringUtils.isNotBlank(processCoding.getOvertime())) { - Long overtime = getTime(processCoding.getOvertime()); + ProcessCoding processCoding = processCodingService.getByTaskId(task.getId(), task.getProcessInstanceId()); + if (Objects.nonNull(processCoding)) { + if (StringUtils.isNotBlank(processCoding.getRedTime())) { + Long overtime = getTime(processCoding.getRedTime()); long durationTime = 0l; if (Objects.nonNull(processCoding.getStartTaskTime())) { durationTime = ((new Date()).getTime() - processCoding.getStartTaskTime().getTime()) / 1000; - } else { - taskVO.setRemainingTime("鏈缃姙鐞嗘椂闂�"); } if (overtime > durationTime) { taskVO.setRemainingTime((overtime - durationTime) / 3600 + "灏忔椂"); @@ -486,6 +587,8 @@ } else { taskVO.setRemainingTime("-"); } + } else { + taskVO.setRemainingTime("-"); } this.distinctVo(taskVO); vos.add(taskVO); @@ -723,7 +826,36 @@ } } // 瀹屾垚浠诲姟 - flowTaskService.completeSubmitForm(form.getTaskId(), data); + flowTaskService.completeSubmitForm(form.getTaskId(), data, Boolean.FALSE); + } + return Result.ok("鎿嶄綔鎴愬姛"); + } + + @Override + public Result taskWait(TaskWaitForm form) { + Task task = taskService.createTaskQuery().taskId(form.getTaskId()).processInstanceId(form.getProcessInsId()).singleResult(); + if (Objects.nonNull(task)) { + // 娣诲姞瀹圭己鏃ュ織 + publisher.publishEvent(new TaskLogEvent(this, + null, + SecurityUtils.getUserId(), + form.getProjectId(), + form.getProcessInsId(), + task.getId(), + task.getTaskDefinitionKey(), + task.getName(), + ProcessLogEventTypeEnum.WAIT, + new WaitData(form.getDesc()))); + // 鏌ュ嚭璇ヤ换鍔$粦瀹氱殑琛ㄥ崟 + Map<String, Object> data = new HashMap<>(1); + if (StringUtils.isNotBlank(task.getFormKey())) { + SysForm sysForm = formService.selectSysFormById(Long.parseLong(task.getFormKey())); + if (Objects.nonNull(sysForm)) { + data.put(ProcessConstants.TASK_FORM_KEY, JSONObject.parseObject(sysForm.getFormContent())); + } + } + // 瀹屾垚浠诲姟 + flowTaskService.completeSubmitForm(form.getTaskId(), data, Boolean.FALSE); } return Result.ok("鎿嶄綔鎴愬姛"); } @@ -746,7 +878,7 @@ ProcessLog processLog = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) .eq(ProcessLog::getTaskId, form.getTaskId()) .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.SUPERVISE) - .eq(ProcessLog::getProcessInsId, form.getProcessInsId()) + .eq(ProcessLog::getProcessInsId, task.getProcessInstanceId()) .one(); List<SuperviseData> dataList; if (processLog != null) { @@ -763,7 +895,7 @@ processLog.getId(), processLog.getUserId(), form.getProjectId(), - form.getProcessInsId(), + task.getProcessInstanceId(), form.getTaskId(), task.getTaskDefinitionKey(), task.getName(), @@ -879,6 +1011,37 @@ return Result.ok("鎿嶄綔鎴愬姛"); } + @Override + public Result getProcessMsg(AbsQuery q) { + // 鏌ヨ嚜宸辩殑鏃ュ織 + ProcessLogQuery query = new ProcessLogQuery(); + if (! SecurityUtils.isAdmin(SecurityUtils.getUserId())) { + query.setUserId(SecurityUtils.getUserId()); + } + query.setEventTypeList(Arrays.asList(ProcessLogEventTypeEnum.DELEGATE.getValue(), + ProcessLogEventTypeEnum.REJECT.getValue(), + ProcessLogEventTypeEnum.JUMP.getValue(), + ProcessLogEventTypeEnum.FINISHED.getValue(), + ProcessLogEventTypeEnum.WAIT.getValue())); + query.setCurrentPage(q.getCurrentPage()); + query.setPageSize(q.getPageSize()); + Result result = processLogService.projectProcessLogPage(query); + List<ProcessLogVO> logs = (List<ProcessLogVO>) result.get("data"); + + logs.stream().forEach(log -> { + if (ProcessLogEventTypeEnum.FINISHED.equals(log.getEventType())) { + log.setContent("鎮ㄥ畬鎴愪簡浠诲姟锛�" + log.getTaskName()); + } else if (ProcessLogEventTypeEnum.REJECT.equals(log.getEventType())) { + log.setContent("鎮ㄩ┏鍥炰簡浠诲姟锛�" + log.getTaskName()); + } else if (ProcessLogEventTypeEnum.WAIT.equals(log.getEventType())) { + log.setContent("鎮ㄥ缂轰簡浠诲姟锛�" + log.getTaskName()); + } else if (ProcessLogEventTypeEnum.JUMP.equals(log.getEventType())) { + log.setContent("鎮ㄨ烦杩囦簡浠诲姟锛�" + log.getTaskName()); + } + }); + return Result.ok().data(logs).total((Long) result.get("total")); + } + /** * 鏌ヨ寰呭姙浠诲姟 * @@ -890,6 +1053,7 @@ * @param result */ public void getTodoTaskList(String projectId, String processInsId, String taskName, int pageSize, int pageNum, Result result) { + TaskQuery taskQuery = taskService.createTaskQuery() .active() .processInstanceId(processInsId) @@ -993,11 +1157,11 @@ vo.setHandlerType(HandlerTypeEnum.USER); SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee())); if (Objects.nonNull(sysUser)) { - handlerIds.add(sysUser.getUserId()); - handlerNames.add(this.getUserShowName(sysUser)); + vo.getHandlerId().add(sysUser.getUserId()); + vo.getHandlerName().add(this.getUserShowName(sysUser)); if (Objects.nonNull(sysUser.getDept())) { - handlerUnitIds.add(sysUser.getDept().getDeptId()); - handlerUnitNames.add(sysUser.getDept().getDeptName()); + vo.getHandlerUnitId().add(sysUser.getDept().getDeptId()); + vo.getHandlerUnitName().add(sysUser.getDept().getDeptName()); } } } else if (CollectionUtil.isNotEmpty(userTask.getCandidateGroups())) { @@ -1014,17 +1178,17 @@ // 閮ㄩ棬 SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); if (Objects.nonNull(dept)) { - handlerUnitIds.add(dept.getDeptId()); - handlerUnitNames.add(dept.getDeptName()); - handlerNames.add(this.getDeptLeaderShowName(dept)); + vo.getHandlerUnitId().add(dept.getDeptId()); + vo.getHandlerUnitName().add(dept.getDeptName()); + vo.getHandlerName().add(this.getDeptLeaderShowName(dept)); } } } else { vo.setHandlerType(HandlerTypeEnum.ROLE); SysRole role = sysRoleService.selectRoleById(Long.parseLong(groupId)); if (Objects.nonNull(role)) { - handlerUnitIds.add(role.getRoleId()); - handlerUnitNames.add(role.getRoleName()); + vo.getHandlerUnitId().add(role.getRoleId()); + vo.getHandlerUnitName().add(role.getRoleName()); } } } @@ -1038,18 +1202,19 @@ vo.setCreateTime(historicTasks.get(0).getStartTime()); // 鏌ヨ瀹為檯澶勭悊浜� - long handlerUserId = Long.parseLong(historicTasks.get(0).getAssignee()); - SysUser handlerUser = sysUserService.selectUserById(handlerUserId); - if (Objects.nonNull(handlerUser)) { - handlerIds.add(handlerUserId); - handlerNames.add(this.getUserShowName(handlerUser)); - if (Objects.nonNull(handlerUser.getDept())) { - handlerUnitNames.add(handlerUser.getDept().getDeptName()); - handlerUnitIds.add(handlerUser.getDept().getDeptId()); + if (StringUtils.isNotBlank(historicTasks.get(0).getAssignee())) { + long handlerUserId = Long.parseLong(historicTasks.get(0).getAssignee()); + SysUser handlerUser = sysUserService.selectUserById(handlerUserId); + if (Objects.nonNull(handlerUser)) { + vo.getHandlerId().add(handlerUserId); + vo.getHandlerName().add(this.getUserShowName(handlerUser)); + if (Objects.nonNull(handlerUser.getDept())) { + vo.getHandlerUnitName().add(handlerUser.getDept().getDeptName()); + vo.getHandlerUnitId().add(handlerUser.getDept().getDeptId()); + } } } vo.setTaskDefinitionKey(historicTasks.get(0).getTaskDefinitionKey()); - this.setPromoterAndHandler(vo, historicTasks.get(0).getIdentityLinks()); } } else { vo.setTaskStatus(TaskStatusEnum.TODO); @@ -1058,7 +1223,7 @@ vo.setCreateTime(task.getCreateTime()); vo.setTaskDefinitionKey(task.getTaskDefinitionKey()); - this.setPromoterAndHandler(vo, null); + this.setHandler(vo, null); this.setRuntimeTaskInfo(task, vo, projectId); } this.distinctVo(vo); @@ -1113,25 +1278,29 @@ .orderByHistoricTaskInstanceStartTime() .desc() .list(); - - vo.setTaskStatus(TaskStatusEnum.FINISHED); - // 濡傛灉鏄凡瀹屾垚鐨勶紝淇℃伅闇�瑕佸崟鐙祴鍊� - vo.setTaskId(hisTaskList.get(0).getId()); - vo.setExecutionId(hisTaskList.get(0).getExecutionId()); - vo.setCreateTime(hisTaskList.get(0).getStartTime()); - // 鏌ヨ瀹為檯澶勭悊浜� - long handlerUserId = Long.parseLong(hisTaskList.get(0).getAssignee()); - SysUser handlerUser = sysUserService.selectUserById(handlerUserId); - if (Objects.nonNull(handlerUser)) { - - vo.setActualHandlerUserId(hisTaskList.get(0).getAssignee()); - vo.setActualHandlerUserName(handlerUser.getNickName()); + // 濡傛灉鏈壘鍒板巻鍙蹭换鍔★紝璇存槑杩欎釜浠诲姟鍙兘澶勪簬鏌愪釜浜掓枼缃戝叧涓嬶紝瀹為檯骞舵湭鎵ц + if (CollectionUtils.isEmpty(hisTaskList)) { + vo.setTaskStatus(TaskStatusEnum.NOT_START); + } else { + vo.setTaskStatus(TaskStatusEnum.FINISHED); + // 濡傛灉鏄凡瀹屾垚鐨勶紝淇℃伅闇�瑕佸崟鐙祴鍊� + vo.setTaskId(hisTaskList.get(0).getId()); + vo.setExecutionId(hisTaskList.get(0).getExecutionId()); + vo.setCreateTime(hisTaskList.get(0).getStartTime()); + // 鏌ヨ瀹為檯澶勭悊浜� + if (StringUtils.isNotBlank(hisTaskList.get(0).getAssignee())) { + long handlerUserId = Long.parseLong(hisTaskList.get(0).getAssignee()); + SysUser handlerUser = sysUserService.selectUserById(handlerUserId); + if (Objects.nonNull(handlerUser)) { + vo.setActualHandlerUserId(hisTaskList.get(0).getAssignee()); + vo.setActualHandlerUserName(handlerUser.getNickName()); + } + } + vo.setTaskDefinitionKey(hisTaskList.get(0).getTaskDefinitionKey()); + this.setHandler(vo, hisTaskList.get(0).getIdentityLinks()); } - vo.setTaskDefinitionKey(hisTaskList.get(0).getTaskDefinitionKey()); - this.setPromoterAndHandler(vo, hisTaskList.get(0).getIdentityLinks()); - return vo; - }).collect(Collectors.toList()); + }).filter(Objects::nonNull).collect(Collectors.toList()); return vos; } @@ -1200,7 +1369,14 @@ taskVO.getHandlerUnitId().add(sysUser.getDept().getDeptId()); taskVO.getHandlerUnitName().add(sysUser.getDept().getDeptName()); taskVO.getPromoterName().add(this.getUserShowName(sysUser)); - taskVO.getPromoterUnitName().add(sysUser.getDept().getDeptName()); +// if (sysUser.getDept().getAncestors()) + String[] str = sysUser.getDept().getAncestors().split(","); + if (str.length >= 4){ + taskVO.getPromoterUnitName().add(sysUser.getDept().getParentName() +"-"+sysUser.getDept().getDeptName()); + }else { + taskVO.getPromoterUnitName().add(sysUser.getDept().getDeptName()); + } + } } // 缁戝畾鐨勬槸瑙掕壊鎴栬�呴儴闂� @@ -1215,7 +1391,7 @@ taskVO.getHandlerUnitId().add(dept.getDeptId()); taskVO.getHandlerUnitName().add(dept.getDeptName()); taskVO.getPromoterName().add(this.getDeptLeaderShowName(dept)); - taskVO.getPromoterUnitName().add(dept.getDeptName()); + taskVO.getPromoterUnitName().add(this.setDeptNameWithParentName(dept)); } } } else { @@ -1239,15 +1415,25 @@ */ private Long getTimelyTaskNum(String processInsId) { // 鏌ュ嚭宸插畬鎴愮殑浠诲姟key - List<HistoricTaskInstance> hisTaskList = historyService.createHistoricTaskInstanceQuery() + HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery() .processInstanceId(processInsId) .finished() - .list(); - hisTaskList = this.distinctHisTask(hisTaskList); + .includeIdentityLinks() + .orderByTaskCreateTime() + .desc(); + List<HistoricTaskInstance> hisTaskList = query.list(); if (CollectionUtils.isEmpty(hisTaskList)) { return 0L; } - + hisTaskList = this.distinctHisTask(hisTaskList); + // 鎺掗櫎璺宠繃銆佸缂虹殑浠诲姟锛屽洜涓鸿繖涓や釜鎿嶄綔閮戒細瀹屾垚浠诲姟鑰屼骇鐢熷巻鍙蹭换鍔� + List<String> jumpAndWaitTaskKeys = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) + .eq(ProcessLog::getProcessInsId, processInsId) + .in(ProcessLog::getEventType, ProcessLogEventTypeEnum.JUMP, ProcessLogEventTypeEnum.WAIT) // TODO 濡傛灉杩愯鏃朵换鍔℃濂芥槸琚┏鍥炵殑锛岄渶瑕佹兂鍔炴硶鎺掗櫎璋冭椹冲洖鐨勪换鍔★紝涓嶈兘鐩存帴鍦ㄨ繖鍔� ProcessLogEventTypeEnum.REJECT + .list().stream().map(ProcessLog::getTaskDefKey).collect(Collectors.toList()); + List<String> runtimeTaskKey = taskService.createTaskQuery().processInstanceId(processInsId).list().stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList()); + jumpAndWaitTaskKeys.addAll(runtimeTaskKey); + hisTaskList = hisTaskList.stream().filter(hisTask -> jumpAndWaitTaskKeys.indexOf(hisTask.getTaskDefinitionKey()) == -1).collect(Collectors.toList()); List<String> hisTaskKeys = hisTaskList.stream().map(HistoricTaskInstance::getTaskDefinitionKey).distinct().collect(Collectors.toList()); Map<String, HistoricTaskInstance> hisTaskMap = hisTaskList.stream().collect(Collectors.toMap(HistoricTaskInstance::getTaskDefinitionKey, his -> his)); // 鏌ュ嚭鏃堕棿姝e父鐨勪换鍔ey @@ -1290,21 +1476,32 @@ int endNum = startNum + pageSize; // 鏌ュ嚭宸插畬鎴愮殑浠诲姟key - List<HistoricTaskInstance> hisTaskList = historyService.createHistoricTaskInstanceQuery() + HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery() .processInstanceId(processInsId) .finished() - .taskNameLike(taskName) .includeIdentityLinks() .orderByTaskCreateTime() - .desc() - .list(); + .desc(); + if (StringUtils.isNotBlank(taskName)) { + query.taskNameLike(taskName); + } + List<HistoricTaskInstance> hisTaskList = query.list(); if (CollectionUtils.isEmpty(hisTaskList)) { result.total(0); return new ArrayList<>(); } - + hisTaskList = this.distinctHisTask(hisTaskList); + // 鎺掗櫎璺宠繃銆佸缂虹殑浠诲姟锛屽洜涓鸿繖涓や釜鎿嶄綔閮戒細瀹屾垚浠诲姟鑰屼骇鐢熷巻鍙蹭换鍔� + List<String> jumpAndWaitTaskKeys = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) + .eq(ProcessLog::getProcessInsId, processInsId) + .eq(ProcessLog::getProjectId, projectId) + .in(ProcessLog::getEventType, ProcessLogEventTypeEnum.JUMP, ProcessLogEventTypeEnum.WAIT) + .list().stream().map(ProcessLog::getTaskDefKey).collect(Collectors.toList()); + List<String> runtimeTaskKey = taskService.createTaskQuery().processInstanceId(processInsId).list().stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList()); + jumpAndWaitTaskKeys.addAll(runtimeTaskKey); + hisTaskList = hisTaskList.stream().filter(hisTask -> jumpAndWaitTaskKeys.indexOf(hisTask.getTaskDefinitionKey()) == -1).collect(Collectors.toList()); List<String> hisTaskKeys = hisTaskList.stream().map(HistoricTaskInstance::getTaskDefinitionKey).distinct().collect(Collectors.toList()); - Map<String, HistoricTaskInstance> hisTaskMap = this.distinctHisTask(hisTaskList).stream().collect(Collectors.toMap(HistoricTaskInstance::getTaskDefinitionKey, his -> his)); + Map<String, HistoricTaskInstance> hisTaskMap = hisTaskList.stream().collect(Collectors.toMap(HistoricTaskInstance::getTaskDefinitionKey, his -> his)); // 鏌ュ嚭鏃堕棿姝e父鐨勪换鍔ey List<ProcessCoding> codeList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) .eq(ProcessCoding::getProcessInsId, processInsId) @@ -1387,14 +1584,19 @@ vo.setCreateTime(hisTask.getStartTime()); // 鏌ヨ瀹為檯澶勭悊浜� - long handlerUserId = Long.parseLong(hisTask.getAssignee()); - SysUser handlerUser = sysUserService.selectUserById(handlerUserId); - if (Objects.nonNull(handlerUser)) { - vo.getHandlerId().add(handlerUserId); - vo.getHandlerName().add(this.getUserShowName(handlerUser)); + if (StringUtils.isNotBlank(hisTask.getAssignee())) { + long handlerUserId = Long.parseLong(hisTask.getAssignee()); + SysUser handlerUser = sysUserService.selectUserById(handlerUserId); + if (Objects.nonNull(handlerUser)) { + vo.getHandlerId().add(handlerUserId); + vo.getHandlerName().add(this.getUserShowName(handlerUser)); + if (Objects.nonNull(handlerUser.getDept())) { + vo.getHandlerUnitId().add(handlerUser.getDept().getDeptId()); + vo.getHandlerUnitName().add(handlerUser.getDept().getDeptName()); + } + } } vo.setTaskDefinitionKey(hisTask.getTaskDefinitionKey()); - this.setPromoterAndHandler(vo, hisTask.getIdentityLinks()); } this.distinctVo(vo); @@ -1598,6 +1800,8 @@ return Long.valueOf(tList.size()); } + + /** * 鏌ヨ鍗冲皢瓒呮椂鐨勪换鍔� * @@ -1673,6 +1877,477 @@ return vos; } + @Override + public void getIndexWaitTask(String s, int pageSize, int pageNum, Result result) { + // 鏌ュ嚭瀹圭己杩囩殑浠诲姟 + List<ProcessLog> allWaitTaskList = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) + .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.WAIT) + .orderByDesc(ProcessLog::getGmtCreate) + .list(); + // 鎺掗櫎瀹圭己鍚庡張瀹屾垚鐨勪换鍔� + List<ProcessLog> finishedTaskList = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) + .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.FINISHED) + .list(); + List<String> finishedTaskIds = finishedTaskList.stream().map(ProcessLog::getTaskId).distinct().collect(Collectors.toList()); + // 寰楀埌鏈畬鎴愮殑瀹圭己浠诲姟 + List<String> waitTaskIds = allWaitTaskList.stream().filter(log -> !finishedTaskIds.contains(log.getTaskId())).map(ProcessLog::getTaskId).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(waitTaskIds)) { + result.total(0l); + result.data(new ArrayList<>()); + return; + } + List<HistoricTaskInstance> hisTasks = waitTaskIds.stream().map(waitTaskId -> { + List<ProcessLog> logs = allWaitTaskList.stream().filter(item -> item.getTaskId().equals(waitTaskId)).collect(Collectors.toList()); + HistoricTaskInstance hisTask = null; + if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(logs)) { + // 瀹圭己鐨勪换鍔¢兘灞炰簬鍘嗗彶浠诲姟锛屽彧鏄渶瑕佽ˉ琛ㄥ崟鏁版嵁 + HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(logs.get(0).getProcessInsId()) + .taskId(waitTaskId) + .includeIdentityLinks() + .orderByHistoricTaskInstanceStartTime() + .desc(); + if (!SecurityUtils.getLoginUser().getUser().isAdmin()) { + query + .or() + .taskCandidateGroupIn(taskCommonService.getCurrentUserGroups()) + .taskCandidateUser(SecurityUtils.getUserId() + "") + .taskAssignee(SecurityUtils.getUserId() + "") + .endOr(); + } + List<HistoricTaskInstance> hisTaskList = query.list(); + hisTaskList = this.distinctHisTask(hisTaskList); + if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(hisTaskList)) { + hisTask = hisTaskList.get(0); + } + } + return hisTask; + }).filter(Objects::nonNull).collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(hisTasks)) { + result.total(0l); + result.data(new ArrayList<>()); + return; + } + int startNum = pageSize * (pageNum - 1); + int endNum = startNum + pageSize; + if (startNum >= hisTasks.size()) { + result.total(0l); + // 濡傛灉璧峰绱㈠紩瓒呭嚭浜嗗垪琛ㄧ殑澶у皬锛岃繑鍥炰竴涓┖鍒楄〃 + result.data(new ArrayList<>()); + return; + } + result.total(hisTasks.size()); + int end = Math.min(endNum, hisTasks.size()); + List<HistoricTaskInstance> targetTask = hisTasks.subList(startNum, end); + + // 杞崲鎴怴O + List<IndexCustomerTaskVO> vos = targetTask.stream().map(userTask -> { + IndexCustomerTaskVO vo = new IndexCustomerTaskVO(); + vo.setProcessInsId(userTask.getProcessInstanceId()); + vo.setProcessDefId(userTask.getProcessDefinitionId()); + + // 鏌ュ嚭娴佺▼ + ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(userTask.getProcessInstanceId()).singleResult(); + String deployId = ""; + String processName = ""; + if (Objects.nonNull(process)) { + deployId = process.getDeploymentId(); + processName = process.getProcessDefinitionName(); + } else { + HistoricProcessInstance hisProcess = historyService.createHistoricProcessInstanceQuery().processInstanceId(userTask.getProcessInstanceId()).singleResult(); + deployId = hisProcess.getDeploymentId(); + processName = hisProcess.getProcessDefinitionName(); + } + + String finalDeployId = deployId; + String finalProcessName = processName; + + vo.setDeployId(finalDeployId); + vo.setTaskName(userTask.getName()); + vo.setProcessName(finalProcessName); + + // 涓�涓换鍔″彲鑳芥湁澶氫釜鍊欓�変汉/缁勶紝鎵�浠ラ渶瑕佷娇鐢╨ist + List<Long> handlerIds = new ArrayList<>(2); + List<String> handlerNames = new ArrayList<>(2); + List<Long> handlerUnitIds = new ArrayList<>(2); + List<String> handlerUnitNames = new ArrayList<>(2); + List<String> promoterNames = new ArrayList<>(2); + List<String> promoterUnitNames = new ArrayList<>(2); + vo.setHandlerId(handlerIds); + vo.setHandlerName(handlerNames); + vo.setHandlerUnitId(handlerUnitIds); + vo.setHandlerUnitName(handlerUnitNames); + vo.setPromoterName(promoterNames); + vo.setPromoterUnitName(promoterUnitNames); + + ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(baseMapper) + .eq(ProjectProcess::getProcessInsId, userTask.getProcessInstanceId()) + .one(); + if (Objects.isNull(projectProcess)) { + throw new RuntimeException("椤圭洰娴佺▼鏈惎鍔�"); + } + String projectId = ""; + String projectName = ""; + if (Objects.nonNull(projectProcess)) { + if (projectProcess.getProjectType().equals(ProjectProcessTypeEnum.PROJECT)) { + ProjectInfo project = projectInfoMapper.selectById(projectProcess.getProjectId()); + if (Objects.nonNull(project)) { + projectId = projectProcess.getProjectId(); + projectName = project.getProjectName(); + } + } else if (projectProcess.getProjectType().equals(ProjectProcessTypeEnum.ENGINEERING)) { + ProjectEngineering engineering = projectEngineeringMapper.selectById(projectProcess.getProjectId()); + if (Objects.nonNull(engineering)) { + projectId = projectProcess.getProjectId(); + projectName = engineering.getProjectName(); + } + } + } + vo.setProjectId(projectId); + vo.setProjectName(projectName); + List<UserTask> uTaskList = this.getAllUserTaskElement(userTask.getProcessDefinitionId()).stream().filter(item -> item.getId().equals(userTask.getTaskDefinitionKey())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(uTaskList)) { + throw new RuntimeException("鏈壘鍒版祦绋嬩换鍔¤璁�"); + } + this.setCandidateInfo(uTaskList.get(0), vo, projectProcess.getProjectId(), userTask.getProcessInstanceId()); + + vo.setTaskStatus(TaskStatusEnum.WAIT); + // 濡傛灉鏄凡瀹屾垚鐨勶紝淇℃伅闇�瑕佸崟鐙祴鍊� + vo.setTaskId(userTask.getId()); + vo.setExecutionId(userTask.getExecutionId()); + vo.setCreateTime(userTask.getStartTime()); + + vo.setTaskDefinitionKey(userTask.getTaskDefinitionKey()); + + this.distinctVo(vo); + return vo; + }).collect(Collectors.toList()); + result.data(vos); + } + + /** + * 鑾峰彇璺宠繃浠诲姟 + * + * @param processInsId + * @return + */ + private Long getJumpTaskNum(String processInsId) { + // 鏌ュ嚭璺宠繃鐨勪换鍔� + List<ProcessLog> allJumpTaskList = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) + .eq(ProcessLog::getProcessInsId, processInsId) + .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.JUMP) + .orderByDesc(ProcessLog::getGmtCreate) + .list(); + // 鎺掗櫎椹冲洖鐨� + List<String> rejectTaskIds = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) + .select(ProcessLog::getTaskId) + .eq(ProcessLog::getProcessInsId, processInsId) + .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.REJECT) + .orderByDesc(ProcessLog::getGmtCreate) + .list().stream().map(ProcessLog::getTaskId).collect(Collectors.toList()); + + List<String> jumpTaskIds = allJumpTaskList.stream().map(ProcessLog::getTaskId).collect(Collectors.toList()); + jumpTaskIds.removeAll(rejectTaskIds); + if(CollectionUtils.isEmpty(jumpTaskIds)) { + return 0L; + } + List<HistoricTaskInstance> hisTaskList = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(processInsId) + .finished() + .taskIds(jumpTaskIds) + .includeIdentityLinks() + .orderByHistoricTaskInstanceStartTime() + .desc() + .list(); + hisTaskList = this.distinctHisTask(hisTaskList); + // 鎺掗櫎杩愯鏃朵换鍔� + List<String> runTaskKeys = taskService.createTaskQuery().processInstanceId(processInsId).list().stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList()); + hisTaskList = hisTaskList.stream().filter(his -> !runTaskKeys.contains(his.getTaskDefinitionKey())).collect(Collectors.toList()); + return Long.valueOf(hisTaskList.size()); + } + + /** + * 鑾峰彇璺宠繃浠诲姟 + * + * @param projectId + * @param processDefinitionId + * @param processInsId + * @param taskName + * @param pageNum + * @param pageSize + * @param result + * @return + */ + private List<CustomerTaskVO> getJumpTask(String projectId, + String processDefinitionId, + String processInsId, + String taskName, + Integer pageNum, + Integer pageSize, + Result result) { + // 鏌ュ嚭璺宠繃鐨勪换鍔� + List<ProcessLog> allJumpTaskList = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) + .eq(ProcessLog::getProcessInsId, processInsId) + .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.JUMP) + .like(StringUtils.isNotBlank(taskName), ProcessLog::getTaskName, taskName) + .orderByDesc(ProcessLog::getGmtCreate) + .list(); + // 鎺掗櫎椹冲洖鐨� + List<String> rejectTaskIds = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) + .select(ProcessLog::getTaskId) + .eq(ProcessLog::getProcessInsId, processInsId) + .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.REJECT) + .like(StringUtils.isNotBlank(taskName), ProcessLog::getTaskName, taskName) + .orderByDesc(ProcessLog::getGmtCreate) + .list().stream().map(ProcessLog::getTaskId).collect(Collectors.toList()); + + List<String> jumpTaskIds = allJumpTaskList.stream().map(ProcessLog::getTaskId).collect(Collectors.toList()); + jumpTaskIds.removeAll(rejectTaskIds); + if(CollectionUtils.isEmpty(jumpTaskIds)) { + result.total(0l); + return new ArrayList<>(); + } + List<HistoricTaskInstance> hisTaskList = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(processInsId) + .finished() + .taskIds(jumpTaskIds) + .includeIdentityLinks() + .orderByHistoricTaskInstanceStartTime() + .desc() + .list(); + hisTaskList = this.distinctHisTask(hisTaskList); + // 鎺掗櫎杩愯鏃朵换鍔� + List<String> runTaskKeys = taskService.createTaskQuery().processInstanceId(processInsId).list().stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList()); + hisTaskList = hisTaskList.stream().filter(his -> !runTaskKeys.contains(his.getTaskDefinitionKey())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(hisTaskList)) { + result.total(0l); + return new ArrayList<>(); + } + int startNum = pageSize * (pageNum - 1); + int endNum = startNum + pageSize; + if (startNum >= hisTaskList.size()) { + result.total(0l); + // 濡傛灉璧峰绱㈠紩瓒呭嚭浜嗗垪琛ㄧ殑澶у皬锛岃繑鍥炰竴涓┖鍒楄〃 + return new ArrayList<>(); + } + result.total(hisTaskList.size()); + int end = Math.min(endNum, hisTaskList.size()); + List<HistoricTaskInstance> targetTaskList = hisTaskList.subList(startNum, end); + + // 杞崲鎴怴O + // 寰楀埌鐩爣浠诲姟瀵瑰簲鐨勫畾涔� + List<String> taskDefs = targetTaskList.stream().map(HistoricTaskInstance::getTaskDefinitionKey).collect(Collectors.toList()); + Map<String, HistoricTaskInstance> keyMap = targetTaskList.stream().collect(Collectors.toMap(HistoricTaskInstance::getTaskDefinitionKey, his -> his)); + List<UserTask> finishedUserTaskElement = this.getAllUserTaskElement(processDefinitionId).stream().filter(el -> taskDefs.contains(el.getId())).collect(Collectors.toList()); + + // 鏌ュ嚭娴佺▼ + ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(processInsId).singleResult(); + String deployId = ""; + String processName = ""; + if (Objects.nonNull(process)) { + deployId = process.getDeploymentId(); + processName = process.getProcessDefinitionName(); + } else { + HistoricProcessInstance hisProcess = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInsId).singleResult(); + deployId = hisProcess.getDeploymentId(); + processName = hisProcess.getProcessDefinitionName(); + } + + String finalDeployId = deployId; + String finalProcessName = processName; + List<CustomerTaskVO> vos = finishedUserTaskElement.stream().map(userTask -> { + CustomerTaskVO vo = new CustomerTaskVO(); + vo.setProcessInsId(processInsId); + vo.setProcessDefId(processDefinitionId); + vo.setDeployId(finalDeployId); + vo.setTaskName(userTask.getName()); + vo.setProcessName(finalProcessName); + + // 涓�涓换鍔″彲鑳芥湁澶氫釜鍊欓�変汉/缁勶紝鎵�浠ラ渶瑕佷娇鐢╨ist + List<Long> handlerIds = new ArrayList<>(2); + List<String> handlerNames = new ArrayList<>(2); + List<Long> handlerUnitIds = new ArrayList<>(2); + List<String> handlerUnitNames = new ArrayList<>(2); + List<String> promoterNames = new ArrayList<>(2); + List<String> promoterUnitNames = new ArrayList<>(2); + vo.setHandlerId(handlerIds); + vo.setHandlerName(handlerNames); + vo.setHandlerUnitId(handlerUnitIds); + vo.setHandlerUnitName(handlerUnitNames); + vo.setPromoterName(promoterNames); + vo.setPromoterUnitName(promoterUnitNames); + + this.setCandidateInfo(userTask, vo, projectId, processInsId); + HistoricTaskInstance hisTask = keyMap.get(userTask.getId()); + if (Objects.nonNull(hisTask)) { + vo.setTaskStatus(TaskStatusEnum.JUMP); + // 濡傛灉鏄凡瀹屾垚鐨勶紝淇℃伅闇�瑕佸崟鐙祴鍊� + vo.setTaskId(hisTask.getId()); + vo.setExecutionId(hisTask.getExecutionId()); + vo.setCreateTime(hisTask.getStartTime()); + + // 鏌ヨ瀹為檯澶勭悊浜� + if (StringUtils.isNotBlank(hisTask.getAssignee())) { + long handlerUserId = Long.parseLong(hisTask.getAssignee()); + SysUser handlerUser = sysUserService.selectUserById(handlerUserId); + if (Objects.nonNull(handlerUser)) { + vo.getHandlerId().add(handlerUserId); + vo.getHandlerName().add(this.getUserShowName(handlerUser)); + if (Objects.nonNull(handlerUser.getDept())) { + vo.getHandlerUnitId().add(handlerUser.getDept().getDeptId()); + vo.getHandlerUnitName().add(handlerUser.getDept().getDeptName()); + } + } + } + this.setHandler(vo, hisTask.getIdentityLinks()); + vo.setTaskDefinitionKey(hisTask.getTaskDefinitionKey()); + } + this.distinctVo(vo); + return vo; + }).collect(Collectors.toList()); + result.data(vos); + return vos; + } + + /** + * 瀹圭己浠诲姟鍒嗛〉 + * + * @param projectId + * @param processDefinitionId + * @param processInsId + * @param taskName + * @param pageNum + * @param pageSize + * @param result + * @return + */ + private List<CustomerTaskVO> getWaitTask(String projectId, + String processDefinitionId, + String processInsId, + String taskName, + Integer pageNum, + Integer pageSize, + Result result) { + + // 鏌ュ嚭瀹圭己杩囩殑浠诲姟 + List<ProcessLog> allWaitTaskList = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) + .eq(ProcessLog::getProcessInsId, processInsId) + .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.WAIT) + .like(StringUtils.isNotBlank(taskName), ProcessLog::getTaskName, taskName) + .orderByDesc(ProcessLog::getGmtCreate) + .list(); + // 鎺掗櫎瀹圭己鍚庡張瀹屾垚鐨勪换鍔� + List<ProcessLog> finishedTaskList = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) + .eq(ProcessLog::getProcessInsId, processInsId) + .in(ProcessLog::getEventType, ProcessLogEventTypeEnum.FINISHED, ProcessLogEventTypeEnum.REJECT) + .list(); + List<String> finishedTaskIds = finishedTaskList.stream().map(ProcessLog::getTaskId).distinct().collect(Collectors.toList()); + // 寰楀埌鏈畬鎴愮殑瀹圭己浠诲姟 + List<String> waitTaskIds = allWaitTaskList.stream().filter(log -> !finishedTaskIds.contains(log.getTaskId())).map(ProcessLog::getTaskId).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(waitTaskIds)) { + result.total(0l); + return new ArrayList<>(); + } + // 瀹圭己鐨勪换鍔¢兘灞炰簬鍘嗗彶浠诲姟锛屽彧鏄渶瑕佽ˉ琛ㄥ崟鏁版嵁 + List<HistoricTaskInstance> hisTaskList = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(processInsId) + .taskIds(waitTaskIds) + .includeIdentityLinks() + .orderByHistoricTaskInstanceStartTime() + .desc() + .list(); + hisTaskList = this.distinctHisTask(hisTaskList); + // 鎺掗櫎杩愯鏃朵换鍔� + List<String> runTaskKeys = taskService.createTaskQuery().processInstanceId(processInsId).list().stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList()); + hisTaskList = hisTaskList.stream().filter(his -> !runTaskKeys.contains(his.getTaskDefinitionKey())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(hisTaskList)) { + result.total(0l); + return new ArrayList<>(); + } + int startNum = pageSize * (pageNum - 1); + int endNum = startNum + pageSize; + if (startNum >= hisTaskList.size()) { + result.total(0l); + // 濡傛灉璧峰绱㈠紩瓒呭嚭浜嗗垪琛ㄧ殑澶у皬锛岃繑鍥炰竴涓┖鍒楄〃 + return new ArrayList<>(); + } + result.total(hisTaskList.size()); + int end = Math.min(endNum, hisTaskList.size()); + List<HistoricTaskInstance> targetTask = hisTaskList.subList(startNum, end); + + // 杞崲鎴怴O + // 寰楀埌鐩爣浠诲姟瀵瑰簲鐨勫畾涔� + List<String> taskDefs = targetTask.stream().map(HistoricTaskInstance::getTaskDefinitionKey).collect(Collectors.toList()); + Map<String, HistoricTaskInstance> keyMap = targetTask.stream().collect(Collectors.toMap(HistoricTaskInstance::getTaskDefinitionKey, his -> his)); + List<UserTask> finishedUserTaskElement = this.getAllUserTaskElement(processDefinitionId).stream().filter(el -> taskDefs.contains(el.getId())).collect(Collectors.toList()); + // 鏌ュ嚭娴佺▼ + ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(processInsId).singleResult(); + String deployId = ""; + String processName = ""; + if (Objects.nonNull(process)) { + deployId = process.getDeploymentId(); + processName = process.getProcessDefinitionName(); + } else { + HistoricProcessInstance hisProcess = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInsId).singleResult(); + deployId = hisProcess.getDeploymentId(); + processName = hisProcess.getProcessDefinitionName(); + } + + String finalDeployId = deployId; + String finalProcessName = processName; + List<CustomerTaskVO> vos = finishedUserTaskElement.stream().map(userTask -> { + CustomerTaskVO vo = new CustomerTaskVO(); + vo.setProcessInsId(processInsId); + vo.setProcessDefId(processDefinitionId); + vo.setDeployId(finalDeployId); + vo.setTaskName(userTask.getName()); + vo.setProcessName(finalProcessName); + + // 涓�涓换鍔″彲鑳芥湁澶氫釜鍊欓�変汉/缁勶紝鎵�浠ラ渶瑕佷娇鐢╨ist + List<Long> handlerIds = new ArrayList<>(2); + List<String> handlerNames = new ArrayList<>(2); + List<Long> handlerUnitIds = new ArrayList<>(2); + List<String> handlerUnitNames = new ArrayList<>(2); + List<String> promoterNames = new ArrayList<>(2); + List<String> promoterUnitNames = new ArrayList<>(2); + vo.setHandlerId(handlerIds); + vo.setHandlerName(handlerNames); + vo.setHandlerUnitId(handlerUnitIds); + vo.setHandlerUnitName(handlerUnitNames); + vo.setPromoterName(promoterNames); + vo.setPromoterUnitName(promoterUnitNames); + + this.setCandidateInfo(userTask, vo, projectId, processInsId); + HistoricTaskInstance hisTask = keyMap.get(userTask.getId()); + if (Objects.nonNull(hisTask)) { + vo.setTaskStatus(TaskStatusEnum.WAIT); + // 濡傛灉鏄凡瀹屾垚鐨勶紝淇℃伅闇�瑕佸崟鐙祴鍊� + vo.setTaskId(hisTask.getId()); + vo.setExecutionId(hisTask.getExecutionId()); + vo.setCreateTime(hisTask.getStartTime()); + + // 鏌ヨ瀹為檯澶勭悊浜� + if (StringUtils.isNotBlank(hisTask.getAssignee())) { + long handlerUserId = Long.parseLong(hisTask.getAssignee()); + SysUser handlerUser = sysUserService.selectUserById(handlerUserId); + if (Objects.nonNull(handlerUser)) { + vo.getHandlerId().add(handlerUserId); + if (Objects.nonNull(handlerUser.getDept())) { + vo.getHandlerUnitId().add(handlerUser.getDept().getDeptId()); + } + } + } + this.setHandler(vo, hisTask.getIdentityLinks()); + vo.setTaskDefinitionKey(hisTask.getTaskDefinitionKey()); + } + this.distinctVo(vo); + return vo; + }).collect(Collectors.toList()); + result.data(vos); + return vos; + } + /** * 鏌ヨ鍓╀綑浜嬮」锛堟湭寮�濮嬬殑浠诲姟锛� * @@ -1707,8 +2382,14 @@ // 鎺掗櫎杩涜涓殑浠诲姟鍜屽凡瀹屾垚鐨勪换鍔� List<String> runTaskKeyList = taskService.createTaskQuery().processInstanceId(processInsId).list().stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList()); - List<String> finishedTaskKeyList = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInsId).finished().list().stream().map(HistoricTaskInstance::getTaskDefinitionKey).distinct().collect(Collectors.toList()); - allUserTaskElement = allUserTaskElement.stream().filter(el -> !runTaskKeyList.contains(el.getId()) && !finishedTaskKeyList.contains(el.getId())).collect(Collectors.toList()); + List<String> finishedTaskKeyList = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) + .select(ProcessLog::getTaskDefKey) + .eq(ProcessLog::getProcessInsId, processInsId) + .in(ProcessLog::getEventType, ProcessLogEventTypeEnum.FINISHED, ProcessLogEventTypeEnum.JUMP, ProcessLogEventTypeEnum.WAIT) + .list().stream().map(ProcessLog::getTaskDefKey).collect(Collectors.toList()); + finishedTaskKeyList.addAll(runTaskKeyList); +// List<String> finishedTaskKeyList = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInsId).finished().list().stream().map(HistoricTaskInstance::getTaskDefinitionKey).distinct().collect(Collectors.toList()); + allUserTaskElement = allUserTaskElement.stream().filter(el -> finishedTaskKeyList.indexOf(el.getId()) == -1).collect(Collectors.toList()); // 妯℃嫙妯$硦鏌ヨ if (StringUtils.isNotBlank(taskName)) { allUserTaskElement = allUserTaskElement.stream().filter(taskEl -> taskEl.getName().contains(taskName)).collect(Collectors.toList()); @@ -1865,14 +2546,18 @@ // 杩愯鏃舵湭鎵惧埌娴佺▼锛岃鏄庢祦绋嬪凡缁忕粨鏉熶簡 return 0L; } - // 鏌ュ嚭宸插畬鎴愮殑浠诲姟锛岀敤鎬讳换鍔℃暟-宸插畬鎴愮殑灏卞緱鍒板墿浣欎簨椤� - List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery() - .processInstanceId(process.getProcessInstanceId()) - .finished() - .list(); - long num = list.stream().map(HistoricTaskInstance::getTaskDefinitionKey).distinct().count(); + List<UserTask> allUserTaskElement = this.getAllUserTaskElement(processDefinitionId); - return totalNum - num; + // 鎺掗櫎杩涜涓殑浠诲姟鍜屽凡瀹屾垚鐨勪换鍔� + List<String> runTaskKeyList = taskService.createTaskQuery().processInstanceId(processInsId).list().stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList()); + List<String> finishedTaskKeyList = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) + .select(ProcessLog::getTaskDefKey) + .eq(ProcessLog::getProcessInsId, processInsId) + .in(ProcessLog::getEventType, ProcessLogEventTypeEnum.FINISHED, ProcessLogEventTypeEnum.JUMP, ProcessLogEventTypeEnum.WAIT) + .list().stream().map(ProcessLog::getTaskDefKey).collect(Collectors.toList()); + finishedTaskKeyList.addAll(runTaskKeyList); + allUserTaskElement = allUserTaskElement.stream().filter(el -> finishedTaskKeyList.indexOf(el.getId()) == -1).collect(Collectors.toList()); + return Long.valueOf(allUserTaskElement.size()); } /** @@ -1885,6 +2570,7 @@ */ private void setCandidateInfo(UserTask userTask, CustomerTaskVO vo, String projectId, String processInsId) { if (StringUtils.isNotBlank(userTask.getAssignee())) { + vo.setHandlerType(HandlerTypeEnum.USER); SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee())); if (Objects.nonNull(sysUser)) { if (Objects.nonNull(sysUser.getDept())) { @@ -1907,7 +2593,7 @@ // 閮ㄩ棬 SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); if (Objects.nonNull(dept)) { - vo.getPromoterUnitName().add(dept.getDeptName()); + vo.getPromoterUnitName().add(this.setDeptNameWithParentName(dept)); vo.getPromoterName().add(this.getDeptLeaderShowName(dept)); } } @@ -1923,23 +2609,25 @@ } /** + * 璁剧疆閮ㄩ棬鍚嶇О鏃跺甫涓婁笂绾ч儴闂ㄥ悕绉� + * @param dept + */ + private String setDeptNameWithParentName(SysDept dept) { + String[] str = dept.getAncestors().split(","); + if (str.length >= 4){ + return dept.getParentName() + " / " + dept.getDeptName(); + }else { + return dept.getDeptName(); + } + } + + /** * 璁剧疆浠诲姟鐨勫彂璧蜂汉&澶勭悊浜� 鍙湁寰呭姙浠诲姟鍜屽凡瀹屾垚浠诲姟鎵嶄細鎺夎繖涓柟娉� * * @param taskVO * @param identityLinkInfos 濡傛灉鏄凡瀹屾垚鐨勪换鍔★紝鐢ㄨ繖涓幓鍙栧叧鑱旂殑鐢ㄦ埛/鐢ㄦ埛缁� */ - private void setPromoterAndHandler(CustomerTaskVO taskVO, List<? extends IdentityLinkInfo> identityLinkInfos) { -// this.setPromoterInfo(taskVO); - - // 涓�涓换鍔″彲鑳芥湁澶氫釜鍊欓�変汉/缁勶紝鎵�浠ラ渶瑕佷娇鐢╨ist - List<Long> handlerIds = new ArrayList<>(2); - List<String> handlerNames = new ArrayList<>(2); - List<Long> handlerUnitIds = new ArrayList<>(2); - List<String> handlerUnitNames = new ArrayList<>(2); - taskVO.setHandlerId(handlerIds); - taskVO.setHandlerName(handlerNames); - taskVO.setHandlerUnitId(handlerUnitIds); - taskVO.setHandlerUnitName(handlerUnitNames); + private void setHandler(CustomerTaskVO taskVO, List<? extends IdentityLinkInfo> identityLinkInfos) { // 娴佺▼澶勭悊浜轰俊鎭� if (TaskStatusEnum.TODO.equals(taskVO.getTaskStatus())) { @@ -1953,11 +2641,11 @@ SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); if (Objects.nonNull(sysUser)) { taskVO.setHandlerType(HandlerTypeEnum.USER); - handlerIds.add(sysUser.getUserId()); - handlerNames.add(this.getUserShowName(sysUser)); + taskVO.getHandlerId().add(sysUser.getUserId()); + taskVO.getHandlerName().add(this.getUserShowName(sysUser)); if (Objects.nonNull(sysUser.getDept())) { - handlerUnitIds.add(sysUser.getDept().getDeptId()); - handlerUnitNames.add(sysUser.getDept().getDeptName()); + taskVO.getHandlerUnitId().add(sysUser.getDept().getDeptId()); + taskVO.getHandlerUnitName().add(sysUser.getDept().getDeptName()); } } // 缁戝畾鐨勬槸瑙掕壊鎴栬�呮槸閮ㄩ棬锛岄渶瑕佹牴鎹甶d鍒ゆ柇 @@ -1969,32 +2657,32 @@ // 閮ㄩ棬 SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); if (Objects.nonNull(dept)) { - handlerUnitIds.add(dept.getDeptId()); - handlerUnitNames.add(dept.getDeptName()); + taskVO.getHandlerUnitId().add(dept.getDeptId()); + taskVO.getHandlerUnitName().add(dept.getDeptName()); } } } else { taskVO.setHandlerType(HandlerTypeEnum.ROLE); SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); if (Objects.nonNull(role)) { - handlerUnitIds.add(role.getRoleId()); - handlerUnitNames.add(role.getRoleName()); + taskVO.getHandlerUnitId().add(role.getRoleId()); + taskVO.getHandlerUnitName().add(role.getRoleName()); } } } } - } else if (TaskStatusEnum.FINISHED.equals(taskVO.getTaskStatus())) { + } else if (TaskStatusEnum.FINISHED.equals(taskVO.getTaskStatus()) || TaskStatusEnum.WAIT.equals(taskVO.getTaskStatus())) { for (IdentityLinkInfo identityLink : identityLinkInfos) { // 缁戝畾鐨勬槸鐢ㄦ埛锛屾煡鍑虹敤鎴峰鍚嶃�侀儴闂� if (StringUtils.isNotBlank(identityLink.getUserId())) { taskVO.setHandlerType(HandlerTypeEnum.USER); SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); if (Objects.nonNull(sysUser)) { - handlerIds.add(sysUser.getUserId()); - handlerNames.add(this.getUserShowName(sysUser)); + taskVO.getHandlerId().add(sysUser.getUserId()); + taskVO.getHandlerName().add(this.getUserShowName(sysUser)); if (Objects.nonNull(sysUser.getDept())) { - handlerUnitIds.add(sysUser.getDept().getDeptId()); - handlerUnitNames.add(sysUser.getDept().getDeptName()); + taskVO.getHandlerUnitId().add(sysUser.getDept().getDeptId()); + taskVO.getHandlerUnitName().add(sysUser.getDept().getDeptName()); } } // 缁戝畾鐨勬槸瑙掕壊锛屾煡鍑鸿鑹插悕绉� @@ -2006,16 +2694,16 @@ // 閮ㄩ棬 SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); if (Objects.nonNull(dept)) { - handlerUnitIds.add(dept.getDeptId()); - handlerUnitNames.add(dept.getDeptName()); + taskVO.getHandlerUnitId().add(dept.getDeptId()); + taskVO.getHandlerUnitName().add(dept.getDeptName()); } } } else { taskVO.setHandlerType(HandlerTypeEnum.ROLE); SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); if (Objects.nonNull(role)) { - handlerUnitIds.add(role.getRoleId()); - handlerUnitNames.add(role.getRoleName()); + taskVO.getHandlerUnitId().add(role.getRoleId()); + taskVO.getHandlerUnitName().add(role.getRoleName()); } } } -- Gitblit v1.8.0