diff --git a/src/main/java/xyz/playedu/api/controller/ExceptionController.java b/src/main/java/xyz/playedu/api/controller/ExceptionController.java index 5bc268b..f530d3b 100644 --- a/src/main/java/xyz/playedu/api/controller/ExceptionController.java +++ b/src/main/java/xyz/playedu/api/controller/ExceptionController.java @@ -37,11 +37,11 @@ import java.util.List; @Slf4j public class ExceptionController { - @ExceptionHandler(Exception.class) - public JsonResponse exceptionHandler(Exception e) { - log.error(e.getMessage()); - return JsonResponse.error("系统错误", 500); - } +// @ExceptionHandler(Exception.class) +// public JsonResponse exceptionHandler(Exception e) { +// log.error(e.getMessage()); +// return JsonResponse.error("系统错误", 500); +// } @ExceptionHandler(ServiceException.class) public JsonResponse serviceExceptionHandler(ServiceException e) { diff --git a/src/main/java/xyz/playedu/api/controller/backend/CourseUserController.java b/src/main/java/xyz/playedu/api/controller/backend/CourseUserController.java index 8c89e44..289db8e 100644 --- a/src/main/java/xyz/playedu/api/controller/backend/CourseUserController.java +++ b/src/main/java/xyz/playedu/api/controller/backend/CourseUserController.java @@ -29,8 +29,8 @@ import xyz.playedu.api.request.backend.CourseUserDestroyRequest; import xyz.playedu.api.service.UserCourseRecordService; import xyz.playedu.api.service.UserService; import xyz.playedu.api.types.JsonResponse; -import xyz.playedu.api.types.paginate.CourseUserPaginateFilter; import xyz.playedu.api.types.paginate.PaginationResult; +import xyz.playedu.api.types.paginate.UserCourseRecordPaginateFilter; import java.util.ArrayList; import java.util.HashMap; @@ -64,7 +64,7 @@ public class CourseUserController { String email = MapUtils.getString(params, "email"); String idCard = MapUtils.getString(params, "id_card"); - CourseUserPaginateFilter filter = new CourseUserPaginateFilter(); + UserCourseRecordPaginateFilter filter = new UserCourseRecordPaginateFilter(); filter.setCourseId(courseId); filter.setName(name); filter.setEmail(email); diff --git a/src/main/java/xyz/playedu/api/controller/backend/UserController.java b/src/main/java/xyz/playedu/api/controller/backend/UserController.java index e18a288..e92ae5c 100644 --- a/src/main/java/xyz/playedu/api/controller/backend/UserController.java +++ b/src/main/java/xyz/playedu/api/controller/backend/UserController.java @@ -15,6 +15,7 @@ */ package xyz.playedu.api.controller.backend; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.MapUtils; @@ -28,19 +29,18 @@ import xyz.playedu.api.BCtx; import xyz.playedu.api.constant.BPermissionConstant; import xyz.playedu.api.constant.CConfig; import xyz.playedu.api.constant.SystemConstant; -import xyz.playedu.api.domain.Department; -import xyz.playedu.api.domain.User; -import xyz.playedu.api.domain.UserDepartment; +import xyz.playedu.api.domain.*; import xyz.playedu.api.event.UserDestroyEvent; import xyz.playedu.api.exception.NotFoundException; import xyz.playedu.api.middleware.BackendPermissionMiddleware; import xyz.playedu.api.request.backend.UserImportRequest; import xyz.playedu.api.request.backend.UserRequest; -import xyz.playedu.api.service.DepartmentService; -import xyz.playedu.api.service.UserService; +import xyz.playedu.api.service.*; import xyz.playedu.api.service.internal.UserDepartmentService; import xyz.playedu.api.types.JsonResponse; import xyz.playedu.api.types.paginate.PaginationResult; +import xyz.playedu.api.types.paginate.UserCourseHourRecordPaginateFilter; +import xyz.playedu.api.types.paginate.UserCourseRecordPaginateFilter; import xyz.playedu.api.types.paginate.UserPaginateFilter; import xyz.playedu.api.util.HelperUtil; @@ -65,6 +65,14 @@ public class UserController { @Autowired private ApplicationContext context; + @Autowired private UserCourseHourRecordService userCourseHourRecordService; + + @Autowired private UserCourseRecordService userCourseRecordService; + + @Autowired private CourseHourService courseHourService; + + @Autowired private CourseService courseService; + @BackendPermissionMiddleware(slug = BPermissionConstant.USER_INDEX) @GetMapping("/index") public JsonResponse index(@RequestParam HashMap params) { @@ -352,4 +360,85 @@ public class UserController { return JsonResponse.success(); } + + @GetMapping("/{id}/latest-learn-hours") + @SneakyThrows + public JsonResponse latestLearnHours( + @PathVariable(name = "id") Integer id, @RequestParam HashMap params) { + Integer page = MapUtils.getInteger(params, "page", 1); + Integer size = MapUtils.getInteger(params, "size", 10); + String sortField = MapUtils.getString(params, "sort_field"); + String sortAlgo = MapUtils.getString(params, "sort_algo"); + Integer isFinished = MapUtils.getInteger(params, "is_finished"); + + UserCourseHourRecordPaginateFilter filter = new UserCourseHourRecordPaginateFilter(); + filter.setSortAlgo(sortAlgo); + filter.setSortField(sortField); + filter.setUserId(id); + filter.setIsFinished(isFinished); + + PaginationResult result = + userCourseHourRecordService.paginate(page, size, filter); + + HashMap data = new HashMap<>(); + data.put("data", result.getData()); + data.put("total", result.getTotal()); + data.put( + "hours", + courseHourService + .chunk( + result.getData().stream() + .map(UserCourseHourRecord::getHourId) + .toList()) + .stream() + .collect(Collectors.groupingBy(CourseHour::getId))); + + return JsonResponse.data(data); + } + + @GetMapping("/{id}/latest-learn-courses") + public JsonResponse latestLearnCourses( + @PathVariable(name = "id") Integer id, @RequestParam HashMap params) { + Integer page = MapUtils.getInteger(params, "page", 1); + Integer size = MapUtils.getInteger(params, "size", 10); + String sortField = MapUtils.getString(params, "sort_field"); + String sortAlgo = MapUtils.getString(params, "sort_algo"); + Integer isFinished = MapUtils.getInteger(params, "is_finished"); + + UserCourseRecordPaginateFilter filter = new UserCourseRecordPaginateFilter(); + filter.setSortAlgo(sortAlgo); + filter.setSortField(sortField); + filter.setUserId(id); + filter.setIsFinished(isFinished); + + PaginationResult result = + userCourseRecordService.paginate(page, size, filter); + + HashMap data = new HashMap<>(); + data.put("data", result.getData()); + data.put("total", result.getTotal()); + data.put( + "courses", + courseService + .chunks( + result.getData().stream() + .map(UserCourseRecord::getCourseId) + .toList()) + .stream() + .collect(Collectors.groupingBy(Course::getId))); + + return JsonResponse.data(data); + } + + @GetMapping("/{id}/learn-stats") + @SneakyThrows + public JsonResponse learn(@PathVariable(name = "id") Integer id) { + User user = userService.findOrFail(id); + + // 学习时长统计 + // 今天、昨天、本周、本月 + // 最近一个月的每天学习时长 + + return JsonResponse.data(null); + } } diff --git a/src/main/java/xyz/playedu/api/mapper/UserCourseHourRecordMapper.java b/src/main/java/xyz/playedu/api/mapper/UserCourseHourRecordMapper.java index ab2a18c..e3072cd 100644 --- a/src/main/java/xyz/playedu/api/mapper/UserCourseHourRecordMapper.java +++ b/src/main/java/xyz/playedu/api/mapper/UserCourseHourRecordMapper.java @@ -21,6 +21,7 @@ import org.apache.ibatis.annotations.Mapper; import xyz.playedu.api.domain.UserCourseHourRecord; import xyz.playedu.api.types.mapper.UserCourseHourRecordCountMapper; +import xyz.playedu.api.types.paginate.UserCourseHourRecordPaginateFilter; import java.util.List; @@ -35,4 +36,8 @@ public interface UserCourseHourRecordMapper extends BaseMapper getUserCourseHourCount( Integer userId, List courseIds, Integer isFinished); + + List paginate(UserCourseHourRecordPaginateFilter filter); + + Long paginateCount(UserCourseHourRecordPaginateFilter filter); } diff --git a/src/main/java/xyz/playedu/api/mapper/UserCourseRecordMapper.java b/src/main/java/xyz/playedu/api/mapper/UserCourseRecordMapper.java index 094b195..f5a574f 100644 --- a/src/main/java/xyz/playedu/api/mapper/UserCourseRecordMapper.java +++ b/src/main/java/xyz/playedu/api/mapper/UserCourseRecordMapper.java @@ -20,7 +20,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import xyz.playedu.api.domain.UserCourseRecord; -import xyz.playedu.api.types.paginate.CourseUserPaginateFilter; +import xyz.playedu.api.types.paginate.UserCourseRecordPaginateFilter; import java.util.List; @@ -31,7 +31,7 @@ import java.util.List; */ @Mapper public interface UserCourseRecordMapper extends BaseMapper { - List paginate(CourseUserPaginateFilter filter); + List paginate(UserCourseRecordPaginateFilter filter); - long paginateTotal(CourseUserPaginateFilter filter); + long paginateTotal(UserCourseRecordPaginateFilter filter); } diff --git a/src/main/java/xyz/playedu/api/service/UserCourseHourRecordService.java b/src/main/java/xyz/playedu/api/service/UserCourseHourRecordService.java index 2a6a030..91e59c9 100644 --- a/src/main/java/xyz/playedu/api/service/UserCourseHourRecordService.java +++ b/src/main/java/xyz/playedu/api/service/UserCourseHourRecordService.java @@ -19,6 +19,8 @@ import com.baomidou.mybatisplus.extension.service.IService; import xyz.playedu.api.domain.UserCourseHourRecord; import xyz.playedu.api.types.mapper.UserCourseHourRecordCountMapper; +import xyz.playedu.api.types.paginate.PaginationResult; +import xyz.playedu.api.types.paginate.UserCourseHourRecordPaginateFilter; import java.util.List; @@ -49,4 +51,7 @@ public interface UserCourseHourRecordService extends IService getUserCourseHourCount( Integer userId, List courseIds, Integer isFinished); + + PaginationResult paginate( + int page, int size, UserCourseHourRecordPaginateFilter filter); } diff --git a/src/main/java/xyz/playedu/api/service/UserCourseRecordService.java b/src/main/java/xyz/playedu/api/service/UserCourseRecordService.java index fa3c71b..24edec6 100644 --- a/src/main/java/xyz/playedu/api/service/UserCourseRecordService.java +++ b/src/main/java/xyz/playedu/api/service/UserCourseRecordService.java @@ -18,8 +18,8 @@ package xyz.playedu.api.service; import com.baomidou.mybatisplus.extension.service.IService; import xyz.playedu.api.domain.UserCourseRecord; -import xyz.playedu.api.types.paginate.CourseUserPaginateFilter; import xyz.playedu.api.types.paginate.PaginationResult; +import xyz.playedu.api.types.paginate.UserCourseRecordPaginateFilter; import java.util.List; @@ -37,7 +37,7 @@ public interface UserCourseRecordService extends IService { List chunk(Integer userId, List courseIds); PaginationResult paginate( - int page, int size, CourseUserPaginateFilter filter); + int page, int size, UserCourseRecordPaginateFilter filter); void destroy(Integer courseId, List ids); diff --git a/src/main/java/xyz/playedu/api/service/impl/CourseServiceImpl.java b/src/main/java/xyz/playedu/api/service/impl/CourseServiceImpl.java index 1510370..4040eb5 100644 --- a/src/main/java/xyz/playedu/api/service/impl/CourseServiceImpl.java +++ b/src/main/java/xyz/playedu/api/service/impl/CourseServiceImpl.java @@ -43,9 +43,11 @@ import java.util.stream.Collectors; @Service public class CourseServiceImpl extends ServiceImpl implements CourseService { - @Autowired private CourseDepartmentService courseDepartmentService; + @Autowired + private CourseDepartmentService courseDepartmentService; - @Autowired private ResourceCourseCategoryService courseCategoryService; + @Autowired + private ResourceCourseCategoryService courseCategoryService; @Override public PaginationResult paginate(int page, int size, CoursePaginateFiler filter) { @@ -201,6 +203,9 @@ public class CourseServiceImpl extends ServiceImpl impleme @Override public List chunks(List ids) { + if (ids == null || ids.size() == 0) { + return new ArrayList<>(); + } return list(query().getWrapper().in("id", ids)); } diff --git a/src/main/java/xyz/playedu/api/service/impl/UserCourseHourRecordServiceImpl.java b/src/main/java/xyz/playedu/api/service/impl/UserCourseHourRecordServiceImpl.java index 113c5d6..1d8c46a 100644 --- a/src/main/java/xyz/playedu/api/service/impl/UserCourseHourRecordServiceImpl.java +++ b/src/main/java/xyz/playedu/api/service/impl/UserCourseHourRecordServiceImpl.java @@ -26,6 +26,8 @@ import xyz.playedu.api.event.UserCourseHourFinishedEvent; import xyz.playedu.api.mapper.UserCourseHourRecordMapper; import xyz.playedu.api.service.UserCourseHourRecordService; import xyz.playedu.api.types.mapper.UserCourseHourRecordCountMapper; +import xyz.playedu.api.types.paginate.PaginationResult; +import xyz.playedu.api.types.paginate.UserCourseHourRecordPaginateFilter; import java.util.ArrayList; import java.util.Date; @@ -137,4 +139,18 @@ public class UserCourseHourRecordServiceImpl public void remove(Integer userId, Integer courseId) { remove(query().getWrapper().eq("user_id", userId).eq("course_id", courseId)); } + + @Override + public PaginationResult paginate( + int page, int size, UserCourseHourRecordPaginateFilter filter) { + int pageStart = (page - 1) * size; + filter.setPageStart(pageStart); + filter.setPageSize(size); + + PaginationResult pageResult = new PaginationResult<>(); + pageResult.setData(getBaseMapper().paginate(filter)); + pageResult.setTotal(getBaseMapper().paginateCount(filter)); + + return pageResult; + } } diff --git a/src/main/java/xyz/playedu/api/service/impl/UserCourseRecordServiceImpl.java b/src/main/java/xyz/playedu/api/service/impl/UserCourseRecordServiceImpl.java index b8c5ee4..082813b 100644 --- a/src/main/java/xyz/playedu/api/service/impl/UserCourseRecordServiceImpl.java +++ b/src/main/java/xyz/playedu/api/service/impl/UserCourseRecordServiceImpl.java @@ -22,8 +22,8 @@ import org.springframework.stereotype.Service; import xyz.playedu.api.domain.UserCourseRecord; import xyz.playedu.api.mapper.UserCourseRecordMapper; import xyz.playedu.api.service.UserCourseRecordService; -import xyz.playedu.api.types.paginate.CourseUserPaginateFilter; import xyz.playedu.api.types.paginate.PaginationResult; +import xyz.playedu.api.types.paginate.UserCourseRecordPaginateFilter; import java.util.ArrayList; import java.util.Date; @@ -98,7 +98,7 @@ public class UserCourseRecordServiceImpl @Override public PaginationResult paginate( - int page, int size, CourseUserPaginateFilter filter) { + int page, int size, UserCourseRecordPaginateFilter filter) { Integer pageStart = (page - 1) * size; filter.setPageStart(pageStart); filter.setPageSize(size); diff --git a/src/main/java/xyz/playedu/api/types/paginate/UserCourseHourRecordPaginateFilter.java b/src/main/java/xyz/playedu/api/types/paginate/UserCourseHourRecordPaginateFilter.java new file mode 100644 index 0000000..a0a0592 --- /dev/null +++ b/src/main/java/xyz/playedu/api/types/paginate/UserCourseHourRecordPaginateFilter.java @@ -0,0 +1,33 @@ +/* + * Copyright 2023 杭州白书科技有限公司 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package xyz.playedu.api.types.paginate; + +import lombok.Data; + +/** + * @Author 杭州白书科技有限公司 + * + * @create 2023/4/17 17:10 + */ +@Data +public class UserCourseHourRecordPaginateFilter { + private Integer userId; + private Integer pageStart; + private Integer pageSize; + private String sortField; + private String sortAlgo; + private Integer isFinished; +} diff --git a/src/main/java/xyz/playedu/api/types/paginate/CourseUserPaginateFilter.java b/src/main/java/xyz/playedu/api/types/paginate/UserCourseRecordPaginateFilter.java similarity index 90% rename from src/main/java/xyz/playedu/api/types/paginate/CourseUserPaginateFilter.java rename to src/main/java/xyz/playedu/api/types/paginate/UserCourseRecordPaginateFilter.java index 31163ed..e372264 100644 --- a/src/main/java/xyz/playedu/api/types/paginate/CourseUserPaginateFilter.java +++ b/src/main/java/xyz/playedu/api/types/paginate/UserCourseRecordPaginateFilter.java @@ -23,7 +23,7 @@ import lombok.Data; * @create 2023/3/24 16:10 */ @Data -public class CourseUserPaginateFilter { +public class UserCourseRecordPaginateFilter { private Integer courseId; private String email; private String name; @@ -32,4 +32,6 @@ public class CourseUserPaginateFilter { private String sortAlgo; private Integer pageStart; private Integer pageSize; + private Integer userId; + private Integer isFinished; } diff --git a/src/main/resources/mapper/UserCourseHourRecordMapper.xml b/src/main/resources/mapper/UserCourseHourRecordMapper.xml index ffcbe03..106ec63 100644 --- a/src/main/resources/mapper/UserCourseHourRecordMapper.xml +++ b/src/main/resources/mapper/UserCourseHourRecordMapper.xml @@ -19,8 +19,7 @@ - id - ,user_id,course_id, + id,user_id,course_id, hour_id,total_duration,finished_duration, real_duration,is_finished,finished_at, created_at,updated_at @@ -51,4 +50,69 @@ GROUP BY `course_id`; + + + + diff --git a/src/main/resources/mapper/UserCourseRecordMapper.xml b/src/main/resources/mapper/UserCourseRecordMapper.xml index 5bde160..0273eb8 100644 --- a/src/main/resources/mapper/UserCourseRecordMapper.xml +++ b/src/main/resources/mapper/UserCourseRecordMapper.xml @@ -31,6 +31,12 @@ AND `user_course_records`.`course_id` = #{courseId} + + AND `user_course_records`.`is_finished` = #{isFinished} + + + AND `user_course_records`.`user_id` = #{userId} + AND `users`.`name` LIKE concat('%',#{name},'%') @@ -50,6 +56,12 @@ AND `user_course_records`.`course_id` = #{courseId} + + AND `user_course_records`.`is_finished` = #{isFinished} + + + AND `user_course_records`.`user_id` = #{userId} + AND `users`.`name` LIKE concat('%',#{name},'%')