@Override\npublic Map<String, Object> queryCarUsersByCoachIdByPage(QueryRequest queryRequest, Coach coach) {\n Map<String, Object> map = new HashMap<>();\n\n QueryWrapper queryWrapper = new QueryWrapper<>();\n queryWrapper.like("coach_id", coach.getCoachId());\n queryWrapper.last("order by case when study_status = 1 then 1 else 2 end,SUBSTR(CONVERT(real_name USING gbk), 1, 1) asc"); //按照名字首字母排序(学习中最前面)\n List carUsers = carUserMapper.selectList(queryWrapper);\n\n // Fetch course data in parallel\n List courseDtos = courseInfoService.queryCourseByCoachIdAndUserId(coach.getCoachId(), carUsers.stream().map(CarUser::getUserId).collect(Collectors.toList()));\n\n List carUserDtoList = carUsers.parallelStream().map(carUser -> {\n CarUserDto carUserDto = new CarUserDto();\n BeanUtils.copyProperties(carUser, carUserDto);\n\n // 1. Calculate study days\n Date today = RcqtUtils.getDay();\n long days = RcqtUtils.getDaysBetweenDates(carUser.getStartTime(), today);\n if (!Objects.equals(carUser.getStudyTime(), String.valueOf(days))) {\n carUserDto.setStudyTime(String.valueOf(days));\n }\n\n // 2. Calculate training count\n List userCourseDtos = courseDtos.parallelStream().filter(courseDto -> Objects.equals(courseDto.getUserId(), carUser.getUserId())).collect(Collectors.toList());\n\n userCourseDtos.parallelStream().forEach(courseDto -> {\n if (courseDto.getTrainingStatus() != 3) {\n if (courseDto.getCourseDate().after(today)) {\n courseDto.setTrainingStatus(0);\n } else if (courseDto.getCourseDate().before(today)) {\n courseDto.setTrainingStatus(2);\n } else if (courseDto.getCourseDate().equals(today)) {\n if (LocalTime.now().isAfter(courseDto.getEndReservationTime().toLocalTime())) {\n courseDto.setTrainingStatus(2);\n } else if (LocalTime.now().isAfter(courseDto.getStartReservationTime().toLocalTime()) && LocalTime.now().isBefore(courseDto.getEndReservationTime().toLocalTime())) {\n courseDto.setTrainingStatus(1);\n } else if (LocalTime.now().isBefore(courseDto.getStartReservationTime().toLocalTime())) {\n courseDto.setTrainingStatus(0);\n }\n }\n }\n });\n\n int count = (int) userCourseDtos.parallelStream().filter(courseDto -> courseDto.getTrainingStatus() == 2).count();\n carUserDto.setDrivingCount(count);\n return carUserDto;\n }).collect(Collectors.toList());\n\n // Get the required page of car users\n List carUserList = carUserDtoList.stream()\n .skip((long) (queryRequest.getPageNum() - 1) * queryRequest.getPageSize())\n .limit(queryRequest.getPageSize())\n .collect(Collectors.toList());\n\n map.put("carUsers", carUserList);\n map.put("total", carUsers.size());\n return map;\n}