代码优化的关键是减少数据库查询次数和减少循环中的计算操作。以下是对代码进行优化的建议:

  1. 将查询约课记录的操作移到查询教练的操作之前,避免每个学员都单独查询约课记录。可以使用IN子查询或者JOIN操作来一次性查询所有学员的约课记录。

  2. 使用批量更新的方式,减少对数据库的访问次数。将所有需要修改的课程数据一次性更新到数据库,而不是在循环中逐个更新。

  3. 使用Stream API的方式进行集合的分页操作,避免手动计算偏移量和限制数量。

修改后的代码如下:

public Map<String, Object> queryCarUsersByCoachIdByPage(QueryRequest queryRequest, Coach coach) {
    Map<String, Object> map = new HashMap<>();

    QueryWrapper<CarUser> queryWrapper = new QueryWrapper<>();
    queryWrapper.like("coach_id", coach.getCoachId());
    queryWrapper.last("order by case when study_status = 1 then 1 else 2 end,SUBSTR(CONVERT(real_name USING gbk), 1, 1) asc");//按照名字首字母排序(学习中最前面)
    List<CarUser> carUsers = carUserMapper.selectList(queryWrapper);

    if (!CollectionUtils.isEmpty(carUsers)) {
        // 查询约课记录
        List<CourseDto> courseDtos = courseInfoService.queryCourseByCoachIdAndUserId(coach.getCoachId(), carUsers.stream().map(CarUser::getUserId).collect(Collectors.toList()));

        // 存放要修改的课程数据
        List<CourseInfo> courseInfoList = new ArrayList<>();

        for (CarUser carUser : carUsers) {
            // 1.计算学车天数
            Date today = RcqtUtils.getDay();
            long days = RcqtUtils.getDaysBetweenDates(carUser.getStartTime(), today);
            if (!Objects.equals(carUser.getStudyTime(), String.valueOf(days))) {
                carUser.setStudyTime(String.valueOf(days));
            }

            // 2.计算学车次数(2表示已训练的)
            List<CourseDto> userCourseDtos = courseDtos.stream().filter(courseDto -> Objects.equals(courseDto.getUserId(), carUser.getUserId())).collect(Collectors.toList());

            for (CourseDto courseDto : userCourseDtos) {
                // 查询周几
                String week = RcqtUtils.getDayOfWeek(DateUtils.getTime(courseDto.getCourseDate()));
                courseDto.setWeek(week);

                if (courseDto.getTrainingStatus() != 3) {
                    if (courseDto.getCourseDate().after(today)) {
                        courseDto.setTrainingStatus(0);
                        // 修改数据库状态
                        CourseInfo courseInfo = courseInfoService.getById(courseDto.getCourseId());
                        courseInfo.setTrainingStatus(0);
                        courseInfoList.add(courseInfo);
                    } else if (courseDto.getCourseDate().before(today)) {
                        courseDto.setTrainingStatus(2);
                        // 修改数据库状态
                        CourseInfo courseInfo = courseInfoService.getById(courseDto.getCourseId());
                        courseInfo.setTrainingStatus(2);
                        courseInfoList.add(courseInfo);
                    } else if (courseDto.getCourseDate().equals(today)) {
                        if (LocalTime.now().isAfter(courseDto.getEndReservationTime().toLocalTime())) {
                            courseDto.setTrainingStatus(2);
                            // 修改数据库状态
                            CourseInfo courseInfo = courseInfoService.getById(courseDto.getCourseId());
                            courseInfo.setTrainingStatus(2);
                            courseInfoList.add(courseInfo);
                        } else if (LocalTime.now().isAfter(courseDto.getStartReservationTime().toLocalTime()) && LocalTime.now().isBefore(courseDto.getEndReservationTime().toLocalTime())) {
                            courseDto.setTrainingStatus(1);
                            // 修改数据库状态
                            CourseInfo courseInfo = courseInfoService.getById(courseDto.getCourseId());
                            courseInfo.setTrainingStatus(1);
                            courseInfoList.add(courseInfo);
                        } else if (LocalTime.now().isBefore(courseDto.getStartReservationTime().toLocalTime())) {
                            courseDto.setTrainingStatus(0);
                            // 修改数据库状态
                            CourseInfo courseInfo = courseInfoService.getById(courseDto.getCourseId());
                            courseInfo.setTrainingStatus(0);
                            courseInfoList.add(courseInfo);
                        }
                    }
                }
            }

            int count = (int) userCourseDtos.stream().filter(courseDto -> courseDto.getTrainingStatus() == 2).count();
            carUser.setDrivingCount(count);
        }

        if (!courseInfoList.isEmpty()) {
            courseInfoService.updateBatchById(courseInfoList);
        }

        carUserService.updateBatchById(carUsers);
    }

    List<CarUser> carUserList = carUsers.stream()
            .skip((long) (queryRequest.getPageNum() - 1) * queryRequest.getPageSize())
            .limit(queryRequest.getPageSize())
            .toList();

    map.put("carUsers", carUserList);
    map.put("total", carUsers.size());
    return map;
}

注意:以上代码只是对原始代码进行了优化,仍然可能存在其他潜在的性能问题。具体的性能优化还需要根据实际情况进行分析和调整

public MapString Object queryCarUsersByCoachIdByPageQueryRequest queryRequest Coach coach MapString Object map = new HashMap; QueryWrapperCarUser queryWrapper = new QueryWrapper;

原文地址: https://www.cveoy.top/t/topic/il0s 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录