fuliqi
2025-02-11 4cb27d670be4437d5cbfbf6676e1f8387cd1e5d2
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -159,6 +159,7 @@
                .set(ProjectProcess::getProcessInsId, processInsId)
                .set(ProjectProcess::getDataLaunch, project.getCreateBy())
                .update();
        return Result.ok("流程变更成功");
    }
@@ -207,7 +208,8 @@
        SysUser sysUser = SecurityUtils.getLoginUser().getUser();
        identityService.setAuthenticatedUserId(sysUser.getUserId().toString());
        variables.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId());
        //测试容缺
        variables.put("miss",true);
        // 将该项目的申请人(业主方)作为流程中某些环节的处理人
        variables.put(ProcessConstants.DATA_LAUNCH, createBy);
        ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, projectId + "", variables);
@@ -649,7 +651,8 @@
                .active()
                .processInstanceId(processInsId)
                .includeProcessVariables()
                .orderByTaskCreateTime().desc();
                .orderByTaskCreateTime()
                .desc();
        if (StringUtils.isNotBlank(taskName)) {
            taskQuery.processDefinitionNameLike(taskName);
@@ -921,11 +924,11 @@
                taskVO.setHandlerType(HandlerTypeEnum.USER);
                SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
                if (Objects.nonNull(sysUser)) {
                    handlerIds.add(sysUser.getUserId());
                    handlerNames.add(sysUser.getNickName());
                    taskVO.getHandlerId().add(sysUser.getUserId());
                    taskVO.getHandlerName().add(sysUser.getNickName());
                    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());
                    }
                }
                // 绑定的是角色或者部门
@@ -937,16 +940,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(Long.parseLong(identityLink.getGroupId()));
                        handlerUnitNames.add(role.getRoleName());
                        taskVO.getHandlerUnitId().add(Long.parseLong(identityLink.getGroupId()));
                        taskVO.getHandlerUnitName().add(role.getRoleName());
                    }
                }
            }
@@ -962,24 +965,36 @@
     * @return
     */
    private Long getTimelyTaskNum(String processInsId) {
        // 查出时间正常的任务id
        List<String> taskKeyList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                .select(ProcessCoding::getTaskDefKey)
                .eq(ProcessCoding::getProcessInsId, processInsId)
                .eq(ProcessCoding::getOvertimeStatus, ProcessOverTimeConstants.NORMAL)
                .list()
                .stream()
                .map(ProcessCoding::getTaskDefKey)
                .collect(Collectors.toList());
        if (CollectionUtils.isEmpty(taskKeyList)) {
            return 0L;
        }
        // 查出所有已完成的任务
        return historyService.createHistoricTaskInstanceQuery()
        // 查出已完成的任务key
        List<HistoricTaskInstance> hisTaskList = historyService.createHistoricTaskInstanceQuery()
                .processInstanceId(processInsId)
                .finished()
                .caseDefinitionKeyIn(taskKeyList)
                .count();
                .includeIdentityLinks()
                .list();
        if (CollectionUtils.isEmpty(hisTaskList)) {
            return 0L;
        }
        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));
        // 查出时间正常的任务key
        List<ProcessCoding> taskList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                .eq(ProcessCoding::getProcessInsId, processInsId)
                .in(ProcessCoding::getTaskDefKey, hisTaskKeys)
                .list();
        Map<String, ProcessCoding> codingMap = taskList.stream().collect(Collectors.toMap(ProcessCoding::getTaskDefKey, pro -> pro));
        List<HistoricTaskInstance> finishedTaskList = new ArrayList<>();
        // 判断
        for (String key : hisTaskMap.keySet()) {
            ProcessCoding processCoding = codingMap.get(key);
            // 如果已完成的任务没从数据库查找出来,说明该任务没配置赋码等时间,直接设置为按时完成
            if (Objects.isNull(processCoding)) {
                finishedTaskList.add(hisTaskMap.get(key));
            } else if (ProcessOverTimeConstants.NORMAL.equals(processCoding.getOvertimeStatus()) || StringUtils.isBlank(processCoding.getOvertimeStatus())) {
                finishedTaskList.add(hisTaskMap.get(key));
            }
        }
        return Long.valueOf(finishedTaskList.size());
    }
    /**
@@ -997,26 +1012,38 @@
        int startNum = pageSize * (pageNum - 1);
        int endNum = startNum + pageSize;
        // 查出时间正常的任务id
        List<String> taskKeyList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                .select(ProcessCoding::getTaskDefKey)
                .eq(ProcessCoding::getProcessInsId, processInsId)
                .eq(ProcessCoding::getOvertimeStatus, ProcessOverTimeConstants.NORMAL)
                .list()
                .stream()
                .map(ProcessCoding::getTaskDefKey)
                .collect(Collectors.toList());
        // 查出已完成的任务key
        List<HistoricTaskInstance> hisTaskList = historyService.createHistoricTaskInstanceQuery()
                .processInstanceId(processInsId)
                .finished()
                .taskNameLike(taskName)
                .includeIdentityLinks()
                .orderByTaskCreateTime()
                .desc()
                .list();
        if (CollectionUtils.isEmpty(hisTaskList)) {
            result.total(0);
            return new ArrayList<>();
        }
        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));
        // 查出时间正常的任务key
        List<ProcessCoding> taskList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                .eq(ProcessCoding::getProcessInsId, processInsId)
                .in(ProcessCoding::getTaskDefKey, hisTaskKeys)
                .list();
        Map<String, ProcessCoding> codingMap = taskList.stream().collect(Collectors.toMap(ProcessCoding::getTaskDefKey, pro -> pro));
        List<HistoricTaskInstance> finishedTaskList = new ArrayList<>();
        if (! CollectionUtils.isEmpty(taskKeyList)) {
            // 查出所有已完成的任务
            finishedTaskList = historyService.createHistoricTaskInstanceQuery()
                    .processInstanceId(processInsId)
                    .finished()
                    .taskNameLike(taskName)
                    .caseDefinitionKeyIn(taskKeyList)
                    .includeIdentityLinks()
                    .list();
        // 判断
        for (String key : hisTaskMap.keySet()) {
            ProcessCoding processCoding = codingMap.get(key);
            // 如果已完成的任务没从数据库查找出来,说明该任务没配置赋码等时间,直接设置为按时完成
            if (Objects.isNull(processCoding)) {
                finishedTaskList.add(hisTaskMap.get(key));
            } else if (ProcessOverTimeConstants.NORMAL.equals(processCoding.getOvertimeStatus()) || StringUtils.isBlank(processCoding.getOvertimeStatus())) {
                finishedTaskList.add(hisTaskMap.get(key));
            }
        }
        if (startNum >= finishedTaskList.size()) {
@@ -1077,8 +1104,8 @@
                long handlerUserId = Long.parseLong(hisTask.getAssignee());
                SysUser handlerUser = sysUserService.selectUserById(handlerUserId);
                if (Objects.nonNull(handlerUser)) {
                    handlerIds.add(handlerUserId);
                    handlerNames.add(handlerUser.getNickName());
                    vo.getHandlerId().add(handlerUserId);
                    vo.getHandlerName().add(handlerUser.getNickName());
                    vo.setActualHandlerUserId(hisTask.getAssignee());
                    vo.setActualHandlerUserName(handlerUser.getNickName());
                }
@@ -1101,23 +1128,31 @@
     * @return
     */
    private Long getOvertimeTaskNum(String processInsId) {
        // 查出时间正常的任务id
        List<String> taskKeyList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                .select(ProcessCoding::getTaskDefKey)
                .eq(ProcessCoding::getProcessInsId, processInsId)
                .eq(ProcessCoding::getOvertimeStatus, ProcessOverTimeConstants.OVERTIME)
                .list()
                .stream()
                .map(ProcessCoding::getTaskDefKey)
                .collect(Collectors.toList());
        if (CollectionUtils.isEmpty(taskKeyList)) {
        // 查出运行在的任务key
        List<Task> taskList = taskService.createTaskQuery().processInstanceId(processInsId).list();
        if (CollectionUtils.isEmpty(taskList)) {
            return 0L;
        }
        // 查出所有已完成的任务
        return taskService.createTaskQuery()
                .processInstanceId(processInsId)
                .caseDefinitionKeyIn(taskKeyList)
                .count();
        List<String> taskKeys = taskList.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList());
        Map<String, Task> taskMap = taskList.stream().collect(Collectors.toMap(Task::getTaskDefinitionKey, his -> his));
        // 查出数据库的任务key
        List<ProcessCoding> databaseTaskList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                .eq(ProcessCoding::getProcessInsId, processInsId)
                .in(ProcessCoding::getTaskDefKey, taskKeys)
                .list();
        Map<String, ProcessCoding> codingMap = databaseTaskList.stream().collect(Collectors.toMap(ProcessCoding::getTaskDefKey, pro -> pro));
        List<Task> tList = new ArrayList<>();
        // 判断
        for (String key : taskMap.keySet()) {
            ProcessCoding processCoding = codingMap.get(key);
            // 如果运行中的任务没从数据库查找出来,说明该任务没配置赋码等时间,不算超时
            if (Objects.nonNull(processCoding) && ProcessOverTimeConstants.OVERTIME.equals(processCoding.getOvertimeStatus())) {
                tList.add(taskMap.get(key));
            }
        }
        return Long.valueOf(taskList.size());
    }
    /**
@@ -1136,33 +1171,42 @@
        int startNum = pageSize * (pageNum - 1);
        int endNum = startNum + pageSize;
        // 查出即将超时的任务
        List<String> taskKeyList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                .select(ProcessCoding::getTaskDefKey)
        // 查出运行在的任务key
        List<Task> taskList = new ArrayList<>(12);
        if (StringUtils.isNotBlank(taskName)) {
            taskList = taskService.createTaskQuery().processInstanceId(processInsId).taskNameLike(taskName).orderByTaskCreateTime().desc().list();
        } else {
            taskList = taskService.createTaskQuery().processInstanceId(processInsId).orderByTaskCreateTime().desc().list();
        }
        if (CollectionUtils.isEmpty(taskList)) {
            result.total(0);
            return new ArrayList<>();
        }
        List<String> taskKeys = taskList.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList());
        Map<String, Task> taskMap = taskList.stream().collect(Collectors.toMap(Task::getTaskDefinitionKey, his -> his));
        // 查出数据库的任务key
        List<ProcessCoding> databaseTaskList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                .eq(ProcessCoding::getProcessInsId, processInsId)
                .eq(ProcessCoding::getOvertimeStatus, ProcessOverTimeConstants.OVERTIME)
                .list()
                .stream()
                .map(ProcessCoding::getTaskDefKey)
                .collect(Collectors.toList());
        List<Task> taskList = new ArrayList<>();
        // 查出所有正在处理(运行时)的任务
        if (! CollectionUtils.isEmpty(taskKeyList)) {
            taskList = taskService.createTaskQuery()
                    .processInstanceId(processInsId)
                    .taskNameLike(taskName)
                    .caseDefinitionKeyIn(taskKeyList)
                    .list();
                .in(ProcessCoding::getTaskDefKey, taskKeys)
                .list();
        Map<String, ProcessCoding> codingMap = databaseTaskList.stream().collect(Collectors.toMap(ProcessCoding::getTaskDefKey, pro -> pro));
        List<Task> tList = new ArrayList<>();
        // 判断
        for (String key : taskMap.keySet()) {
            ProcessCoding processCoding = codingMap.get(key);
            // 如果运行中的任务没从数据库查找出来,说明该任务没配置赋码等时间,不算超时
            if (Objects.nonNull(processCoding) && ProcessOverTimeConstants.OVERTIME.equals(processCoding.getOvertimeStatus())) {
                tList.add(taskMap.get(key));
            }
        }
        if (startNum >= taskList.size()) {
        if (startNum >= tList.size()) {
            // 如果起始索引超出了列表的大小,返回一个空列表
            return new ArrayList<>();
        }
        result.total(taskList.size());
        int end = Math.min(endNum, taskList.size());
        List<Task> pageTaskList = taskList.subList(startNum, end);
        result.total(tList.size());
        int end = Math.min(endNum, tList.size());
        List<Task> pageTaskList = tList.subList(startNum, end);
        List<String> taskDefs = pageTaskList.stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList());
        Map<String, Task> keyMap = pageTaskList.stream().collect(Collectors.toMap(Task::getTaskDefinitionKey, his -> his));
@@ -1187,23 +1231,29 @@
     * @return
     */
    private Long getWillOvertimeTaskNum(String processInsId) {
        // 查出时间正常的任务id
        List<String> taskKeyList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                .select(ProcessCoding::getTaskDefKey)
                .eq(ProcessCoding::getProcessInsId, processInsId)
                .eq(ProcessCoding::getOvertimeStatus, ProcessOverTimeConstants.WILLOVERTIME)
                .list()
                .stream()
                .map(ProcessCoding::getTaskDefKey)
                .collect(Collectors.toList());
        if (CollectionUtils.isEmpty(taskKeyList)) {
        // 查出运行在的任务key
        List<Task> taskList = taskService.createTaskQuery().processInstanceId(processInsId).list();
        if (CollectionUtils.isEmpty(taskList)) {
            return 0L;
        }
        // 查出所有已完成的任务
        return taskService.createTaskQuery()
                .processInstanceId(processInsId)
                .caseDefinitionKeyIn(taskKeyList)
                .count();
        List<String> taskKeys = taskList.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList());
        Map<String, Task> taskMap = taskList.stream().collect(Collectors.toMap(Task::getTaskDefinitionKey, his -> his));
        // 查出数据库的任务key
        List<ProcessCoding> databaseTaskList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                .eq(ProcessCoding::getProcessInsId, processInsId)
                .in(ProcessCoding::getTaskDefKey, taskKeys)
                .list();
        Map<String, ProcessCoding> codingMap = databaseTaskList.stream().collect(Collectors.toMap(ProcessCoding::getTaskDefKey, pro -> pro));
        List<Task> tList = new ArrayList<>();
        // 判断
        for (String key : taskMap.keySet()) {
            ProcessCoding processCoding = codingMap.get(key);
            // 如果运行中的任务没从数据库查找出来,说明该任务没配置赋码等时间,不算即将超时
            if (Objects.nonNull(processCoding) && ProcessOverTimeConstants.WILLOVERTIME.equals(processCoding.getOvertimeStatus())) {
                tList.add(taskMap.get(key));
            }
        }
        return Long.valueOf(tList.size());
    }
    /**
@@ -1222,33 +1272,42 @@
        int startNum = pageSize * (pageNum - 1);
        int endNum = startNum + pageSize;
        // 查出即将超时的任务
        List<String> taskKeyList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                .select(ProcessCoding::getTaskDefKey)
        // 查出运行在的任务key
        List<Task> taskList = new ArrayList<>(12);
        if (StringUtils.isNotBlank(taskName)) {
            taskList = taskService.createTaskQuery().processInstanceId(processInsId).taskNameLike(taskName).orderByTaskCreateTime().desc().list();
        } else {
            taskList = taskService.createTaskQuery().processInstanceId(processInsId).orderByTaskCreateTime().desc().list();
        }
        if (CollectionUtils.isEmpty(taskList)) {
            result.total(0);
            return new ArrayList<>();
        }
        List<String> taskKeys = taskList.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList());
        Map<String, Task> taskMap = taskList.stream().collect(Collectors.toMap(Task::getTaskDefinitionKey, his -> his));
        // 查出数据库的任务key
        List<ProcessCoding> databaseTaskList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                .eq(ProcessCoding::getProcessInsId, processInsId)
                .eq(ProcessCoding::getOvertimeStatus, ProcessOverTimeConstants.WILLOVERTIME)
                .list()
                .stream()
                .map(ProcessCoding::getTaskDefKey)
                .collect(Collectors.toList());
        List<Task> taskList = new ArrayList<>();
        // 查出所有正在处理(运行时)的任务
        if (! CollectionUtils.isEmpty(taskKeyList)) {
            taskList = taskService.createTaskQuery()
                    .processInstanceId(processInsId)
                    .taskNameLike(taskName)
                    .caseDefinitionKeyIn(taskKeyList)
                    .list();
                .in(ProcessCoding::getTaskDefKey, taskKeys)
                .list();
        Map<String, ProcessCoding> codingMap = databaseTaskList.stream().collect(Collectors.toMap(ProcessCoding::getTaskDefKey, pro -> pro));
        List<Task> tList = new ArrayList<>();
        // 判断
        for (String key : taskMap.keySet()) {
            ProcessCoding processCoding = codingMap.get(key);
            // 如果运行中的任务没从数据库查找出来,说明该任务没配置赋码等时间,不算即将超时
            if (Objects.nonNull(processCoding) && ProcessOverTimeConstants.WILLOVERTIME.equals(processCoding.getOvertimeStatus())) {
                tList.add(taskMap.get(key));
            }
        }
        if (startNum >= taskList.size()) {
        if (startNum >= tList.size()) {
            // 如果起始索引超出了列表的大小,返回一个空列表
            return new ArrayList<>();
        }
        result.total(taskList.size());
        int end = Math.min(endNum, taskList.size());
        List<Task> pageTaskList = taskList.subList(startNum, end);
        result.total(tList.size());
        int end = Math.min(endNum, tList.size());
        List<Task> pageTaskList = tList.subList(startNum, end);
        List<String> taskDefs = pageTaskList.stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList());
        Map<String, Task> keyMap = pageTaskList.stream().collect(Collectors.toMap(Task::getTaskDefinitionKey, his -> his));
@@ -1348,11 +1407,11 @@
                }
                SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee()));
                if (Objects.nonNull(sysUser)) {
                    handlerIds.add(sysUser.getUserId());
                    handlerNames.add(sysUser.getNickName());
                    vo.getHandlerId().add(sysUser.getUserId());
                    vo.getHandlerName().add(sysUser.getNickName());
                    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())) {
@@ -1365,17 +1424,16 @@
                            // 部门
                            SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1]));
                            if (Objects.nonNull(dept)) {
                                handlerUnitIds.add(dept.getDeptId());
                                handlerUnitNames.add(dept.getDeptName());
                                vo.getHandlerUnitId().add(dept.getDeptId());
                                vo.getHandlerUnitName().add(dept.getDeptName());
                            }
                        }
                    } 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());
                        }
                    }
                }