public MapString Object queryCarUsersByCoachIdByPageQueryRequest queryRequest Coach coach MapString Object map = new HashMap; QueryWrapperCarUser queryWrapper = new QueryWrapper;
代码优化的关键是减少数据库查询次数和减少循环中的计算操作。以下是对代码进行优化的建议:
-
将查询约课记录的操作移到查询教练的操作之前,避免每个学员都单独查询约课记录。可以使用IN子查询或者JOIN操作来一次性查询所有学员的约课记录。
-
使用批量更新的方式,减少对数据库的访问次数。将所有需要修改的课程数据一次性更新到数据库,而不是在循环中逐个更新。
-
使用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;
}
注意:以上代码只是对原始代码进行了优化,仍然可能存在其他潜在的性能问题。具体的性能优化还需要根据实际情况进行分析和调整
原文地址: https://www.cveoy.top/t/topic/il0s 著作权归作者所有。请勿转载和采集!