liujie
2026-04-02 b6e36cdf53b2688f0a0b339b14a33609ac051005
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DeviceUsageServiceImpl.java
@@ -84,7 +84,6 @@
        String startTime = query.getStartTime();
        String endTime = query.getEndTime();
        // 查询在建工程项目(usage_type 表示项目用途类型,假设 0 表示在建工程)
        LambdaQueryWrapper<Project> projectWrapper = new LambdaQueryWrapper<>();
        if (query.getClientId() != null) {
            projectWrapper.eq(Project::getClientId, query.getClientId());
@@ -94,28 +93,22 @@
        }
        switch (query.getCategory()) {
            case 1:
                // 查询在建资产项目
                projectWrapper.eq(Project::getDeleted, false)
                        .ne(Project::getType, 2) // 在建工程
                        .ne(Project::getType, 2)
                        .and(wrapper -> wrapper
                                .eq(Project::getStatus, 1)  // 在建项目
                                .or(w -> w
                                        .eq(Project::getStatus, 2)  // 已完成项目
                                        .between(Project::getSuccessTime, startTime, endTime)  // 完成时间 >= 开始日期// 完成时间 <= 结束日期
                                )
                                .eq(Project::getStatus, 1)
                                .or(w -> w.eq(Project::getStatus, 2))
                        );
                break;
            case 2:
                // 查询固定资产项目
                projectWrapper.eq(Project::getDeleted, false)
                        .eq(Project::getType, 2) // 在建工程
                        .eq(Project::getType, 2)
                        .and(wrapper -> wrapper
                                .eq(Project::getStatus, 1)  // 在建项目
                                .or(w -> w
                                        .eq(Project::getStatus, 2)  // 已完成项目
                                        .between(Project::getSuccessTime, startTime, endTime)  // 完成时间 >= 开始日期// 完成时间 <= 结束日期
                                )
                                .eq(Project::getStatus, 1)
                                .or(w -> w.eq(Project::getStatus, 2))
                        );
                break;
            default:
                break;
        }
@@ -127,31 +120,34 @@
        query.setProjectIds(projectIds);
        Map<Integer, String> categoryMap = calculateProjectCategoryMap(projects, query);
        // 查询检查任务
        LambdaQueryWrapper<Task> taskWrapper = new LambdaQueryWrapper<>();
        taskWrapper.in(Task::getProjectId, projectIds)
                .eq(Task::getDeleted, false);
        List<Task> taskList = taskMapper.selectList(taskWrapper);
        Map<Integer, Task> latestCheckedTaskMap = taskList.stream()
                .filter(task -> task.getProjectId() != null)
                .collect(Collectors.groupingBy(Task::getProjectId))
                .entrySet()
                .stream()
                .map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(),
                        findLatestCheckedTask(entry.getValue(), startTime, endTime)))
                .filter(entry -> entry.getValue() != null)
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
        if (StringUtils.hasLength(startTime) || StringUtils.hasLength(endTime)) {
            List<Integer> checkedProjectIds = new ArrayList<>(latestCheckedTaskMap.keySet());
            if (checkedProjectIds.isEmpty()) {
                checkedProjectIds.add(-1);
            }
            query.setProjectIds(checkedProjectIds);
        }
        List<EntrustProjectVo> deviceList = this.baseMapper.projectList(page, query);
        for (EntrustProjectVo deviceListVo : deviceList) {
            deviceListVo.setRisk(formatProjectCategory(categoryMap.get(deviceListVo.getId())));
            List<Task> tasks = taskList.stream().filter(e -> e.getProjectId().equals(deviceListVo.getId())).toList();
//            List<Task> tasks = taskMap.get(deviceListVo.getId());
            if (tasks != null && !tasks.isEmpty()) {
                Task task1 = tasks.stream().filter(e -> e.getDate().getYear() == LocalDateTime.now().getYear() && e.getDate().getMonth().getValue() == LocalDateTime.now().getMonth().getValue()).findFirst().orElse(null);
//                List<Record> recordList = records.stream().filter(e -> taskIds.contains(e.getCheckTaskId())).toList();
//                Record record = recordList.stream().max(Comparator.comparing(Record::getCreateTime)).orElse(null);
                if (task1 != null && (task1.getState() == 3 || Integer.valueOf(5).equals(task1.getState()) ||
                        Integer.valueOf(6).equals(task1.getState()) || Integer.valueOf(7).equals(task1.getState()))) {
                    deviceListVo.setCheckTime(task1.getDate().atStartOfDay());
                    deviceListVo.setCheckResult("已检查");
                } else {
                    deviceListVo.setCheckTime(null);
                    deviceListVo.setCheckResult("未检查");
                    deviceListVo.setRisk(null);
                }
            Task checkedTask = latestCheckedTaskMap.get(deviceListVo.getId());
            if (checkedTask != null) {
                deviceListVo.setCheckTime(checkedTask.getDate().atStartOfDay());
                deviceListVo.setCheckResult("已检查");
            } else {
                deviceListVo.setCheckTime(null);
                deviceListVo.setCheckResult("未检查");
@@ -160,7 +156,6 @@
        }
        return deviceList;
    }
    private Map<Integer, String> calculateProjectCategoryMap(List<Project> projects, EntrustListQuery query) {
        if (projects.isEmpty() || query.getClientId() == null || query.getCategory() == null) {
            return Collections.emptyMap();
@@ -213,6 +208,54 @@
        return category + "类";
    }
    private Task findLatestCheckedTask(List<Task> tasks, String startTime, String endTime) {
        LocalDate startDate = parseQueryDate(startTime);
        LocalDate endDate = parseQueryDate(endTime);
        return tasks.stream()
                .filter(this::isCheckedTask)
                .filter(task -> matchesCheckDate(task.getDate(), startDate, endDate))
                .max(Comparator.comparing(Task::getDate))
                .orElse(null);
    }
    private boolean isCheckedTask(Task task) {
        if (task == null || task.getDate() == null) {
            return false;
        }
        Integer state = task.getState();
        return Integer.valueOf(3).equals(state)
                || Integer.valueOf(5).equals(state)
                || Integer.valueOf(6).equals(state)
                || Integer.valueOf(7).equals(state);
    }
    private boolean matchesCheckDate(LocalDate taskDate, LocalDate startDate, LocalDate endDate) {
        if (taskDate == null) {
            return false;
        }
        if (startDate == null && endDate == null) {
            LocalDate currentDate = LocalDate.now();
            return taskDate.getYear() == currentDate.getYear()
                    && taskDate.getMonthValue() == currentDate.getMonthValue();
        }
        return (startDate == null || !taskDate.isBefore(startDate))
                && (endDate == null || !taskDate.isAfter(endDate));
    }
    private LocalDate parseQueryDate(String dateText) {
        if (!StringUtils.hasLength(dateText)) {
            return null;
        }
        String normalizedDateText = normalizeDateText(dateText);
        int separatorIndex = normalizedDateText.indexOf(' ');
        if (separatorIndex < 0) {
            separatorIndex = normalizedDateText.indexOf('T');
        }
        if (separatorIndex > 0) {
            normalizedDateText = normalizedDateText.substring(0, separatorIndex);
        }
        return LocalDate.parse(normalizedDateText);
    }
    @Override
    public List<EntrustProjectReportVo> projectReport(Page<EntrustProjectReportVo> page, ProjectReportListQuery query) {
        List<EntrustProjectReportVo> entrustProjectReportVoList = this.baseMapper.projectReport(page, query);
@@ -271,7 +314,6 @@
        }
        return deviceList;
    }
    @Override
    public List<ErrorListVo> errorList(Page<ErrorListVo> page, ErrorListQuery query) throws ParseException {
        String startTime=query.getStartTime();