diff --git a/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/dao/UserStudyDao.java b/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/dao/UserStudyDao.java index ea422067a93aa884e51d347f97ad6284226800b5..bb96ea67aa70883ab50fa57526bf5af44f4dcca0 100644 --- a/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/dao/UserStudyDao.java +++ b/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/dao/UserStudyDao.java @@ -72,10 +72,17 @@ public interface UserStudyDao { */ int countByExample(UserStudyExample example); + /** + * 获取 + * + * @param periodId + * @param userId + * @return + */ UserStudy getByPeriodIdAndUserId(Long periodId, Long userId); /** - * 获取当前课程的最新学习课时记录 + * 获取指定课程的最新学习课时记录 * * @param userId * @param courseIdList @@ -83,11 +90,49 @@ public interface UserStudyDao { */ List listByUserIdAndCourseIdsForMax(Long userId, List courseIdList); + /** + * 获取当前学习的课程的最新课时 + * + * @param userId + * @param courseId + * @return + */ UserStudy getByCourseIdForLast(Long userId, Long courseId); + /** + * 获取指定课程的课时进度总和 + * + * @param userId + * @param courseIdList + * @return + */ List listByUserIdAndCourseIdsForSumProgress(Long userId, List courseIdList); - List listByUserIdAndCourseId(Long userId, Long courseId); + /** + * 获取指定课程的课时进度总和 + * + * @param courseId + * @param userIdList + * @return + */ + List listByCourseIdAndUserIdsForSumProgress(Long courseId, List userIdList); + + /** + * 获取集合 + * + * @param userId + * @param courseId + * @return + */ + List listByUserIdAndCourseId(Long userId, Long courseId); + /** + * 删除 + * + * @param periodId + * @return + */ int deleteByPeriodId(Long periodId); + + } diff --git a/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/dao/impl/UserStudyDaoImpl.java b/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/dao/impl/UserStudyDaoImpl.java index a81050bed04764b634f76b44d2547669bacff678..53c746ea6efc802651fdfd7d12b1560750a8ec7b 100644 --- a/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/dao/impl/UserStudyDaoImpl.java +++ b/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/dao/impl/UserStudyDaoImpl.java @@ -118,6 +118,15 @@ public class UserStudyDaoImpl extends AbstractBaseJdbc implements UserStudyDao { return namedParameterJdbcTemplate.query(sql, map, new BeanPropertyRowMapper<>(UserStudy.class)); } + @Override + public List listByCourseIdAndUserIdsForSumProgress(Long courseId, List userIdList) { + String sql = "select user_id, sum(progress) as progress from user_study where course_id=:COURSEID and user_id in (:USERIDS) GROUP BY user_id"; + Map map = new HashMap(); + map.put("COURSEID", courseId); + map.put("USERIDS", userIdList); + return namedParameterJdbcTemplate.query(sql, map, new BeanPropertyRowMapper<>(UserStudy.class)); + } + @Override public List listByUserIdAndCourseId(Long userId, Long courseId) { UserStudyExample example = new UserStudyExample(); diff --git a/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/admin/biz/AdminUserCourseBiz.java b/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/admin/biz/AdminUserCourseBiz.java index 111404fbb48d8a022ed9efe8802c13ec366c24d4..4151e6766fd6feca7c4ce21ba4ff659c1d1ccd29 100644 --- a/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/admin/biz/AdminUserCourseBiz.java +++ b/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/admin/biz/AdminUserCourseBiz.java @@ -1,23 +1,36 @@ package com.roncoo.education.course.service.admin.biz; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import com.roncoo.education.common.core.base.Page; import com.roncoo.education.common.core.base.PageUtil; import com.roncoo.education.common.core.base.Result; import com.roncoo.education.common.core.tools.BeanUtil; import com.roncoo.education.common.service.BaseBiz; +import com.roncoo.education.course.dao.CourseChapterPeriodDao; import com.roncoo.education.course.dao.UserCourseDao; +import com.roncoo.education.course.dao.UserStudyDao; +import com.roncoo.education.course.dao.impl.mapper.entity.CourseChapterPeriodExample; import com.roncoo.education.course.dao.impl.mapper.entity.UserCourse; import com.roncoo.education.course.dao.impl.mapper.entity.UserCourseExample; import com.roncoo.education.course.dao.impl.mapper.entity.UserCourseExample.Criteria; +import com.roncoo.education.course.dao.impl.mapper.entity.UserStudy; import com.roncoo.education.course.service.admin.req.AdminUserCourseEditReq; import com.roncoo.education.course.service.admin.req.AdminUserCoursePageReq; import com.roncoo.education.course.service.admin.req.AdminUserCourseSaveReq; import com.roncoo.education.course.service.admin.resp.AdminUserCoursePageResp; import com.roncoo.education.course.service.admin.resp.AdminUserCourseViewResp; +import com.roncoo.education.user.feign.interfaces.IFeignUsers; +import com.roncoo.education.user.feign.interfaces.vo.UsersVO; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * ADMIN-课程用户关联表 @@ -28,8 +41,16 @@ import javax.validation.constraints.NotNull; @RequiredArgsConstructor public class AdminUserCourseBiz extends BaseBiz { + @NotNull + private final IFeignUsers feignUsers; + @NotNull private final UserCourseDao dao; + @NotNull + private final CourseChapterPeriodDao courseChapterPeriodDao; + @NotNull + private final UserStudyDao userStudyDao; + /** * 课程用户关联表分页 @@ -40,8 +61,42 @@ public class AdminUserCourseBiz extends BaseBiz { public Result> page(AdminUserCoursePageReq req) { UserCourseExample example = new UserCourseExample(); Criteria c = example.createCriteria(); + if (req.getCourseId() != null) { + c.andCourseIdEqualTo(req.getCourseId()); + } + if (req.getUserId() != null) { + c.andUserIdEqualTo(req.getUserId()); + } Page page = dao.page(req.getPageCurrent(), req.getPageSize(), example); Page respPage = PageUtil.transform(page, AdminUserCoursePageResp.class); + if (CollUtil.isNotEmpty(respPage.getList())) { + CourseChapterPeriodExample courseChapterPeriodExample = new CourseChapterPeriodExample(); + courseChapterPeriodExample.createCriteria().andCourseIdEqualTo(req.getCourseId()); + int periods = courseChapterPeriodDao.countByExample(courseChapterPeriodExample); + + List userIdList = respPage.getList().stream().map(item -> item.getUserId()).collect(Collectors.toList()); + Map usersVOMap = feignUsers.listByIds(userIdList); + + List userStudyList = userStudyDao.listByCourseIdAndUserIdsForSumProgress(req.getCourseId(), userIdList); + Map userStudySumMap = new HashMap<>(); + if (CollUtil.isNotEmpty(userStudyList)) { + userStudySumMap = userStudyList.stream().collect(Collectors.toMap(item -> item.getUserId(), item -> item.getProgress())); + } + + for (AdminUserCoursePageResp auc : respPage.getList()) { + UsersVO usersVO = usersVOMap.get(auc.getUserId()); + if (ObjectUtil.isNotEmpty(usersVO)) { + auc.setMobile(usersVO.getMobile()); + auc.setNickname(usersVO.getNickname()); + } + + BigDecimal progress = userStudySumMap.get(auc.getUserId()); + if (ObjectUtil.isNotEmpty(progress)) { + // 课程进度 + auc.setCourseProgress(progress.divide(BigDecimal.valueOf(periods), BigDecimal.ROUND_UP)); + } + } + } return Result.success(respPage); } diff --git a/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/admin/req/AdminUserCoursePageReq.java b/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/admin/req/AdminUserCoursePageReq.java index 0ebb0b3374bd4a7394f5711ee7ca0770d44d99ca..d8d548818f114aa458e2221a04f9b702f7de5d70 100644 --- a/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/admin/req/AdminUserCoursePageReq.java +++ b/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/admin/req/AdminUserCoursePageReq.java @@ -1,13 +1,11 @@ package com.roncoo.education.course.service.admin.req; -import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; -import java.time.LocalDateTime; /** *

@@ -23,15 +21,6 @@ public class AdminUserCoursePageReq implements Serializable { private static final long serialVersionUID = 1L; - @ApiModelProperty(value = "主键") - private Long id; - - @ApiModelProperty(value = "状态(1:正常,0:禁用)") - private Integer statusId; - - @ApiModelProperty(value = "排序") - private Integer sort; - @ApiModelProperty(value = "用户ID") private Long userId; diff --git a/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/admin/resp/AdminUserCoursePageResp.java b/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/admin/resp/AdminUserCoursePageResp.java index 0bcc7f61957729c76fe0b7f7e799d3caa6e04793..ed60169b3e33f4d8416099a34d304d8426e95621 100644 --- a/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/admin/resp/AdminUserCoursePageResp.java +++ b/roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/admin/resp/AdminUserCoursePageResp.java @@ -7,6 +7,7 @@ import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; +import java.math.BigDecimal; import java.time.LocalDateTime; /** @@ -48,4 +49,13 @@ public class AdminUserCoursePageResp implements Serializable { @ApiModelProperty(value = "购买类型(1支付,2免费)") private Integer buyType; + + @ApiModelProperty(value = "手机号码") + private String mobile; + + @ApiModelProperty(value = "昵称") + private String nickname; + + @ApiModelProperty(value = "该课程总进度") + private BigDecimal courseProgress = BigDecimal.ZERO; } diff --git a/roncoo-education-user/roncoo-education-user-feign/src/main/java/com/roncoo/education/user/feign/interfaces/IFeignUsers.java b/roncoo-education-user/roncoo-education-user-feign/src/main/java/com/roncoo/education/user/feign/interfaces/IFeignUsers.java new file mode 100644 index 0000000000000000000000000000000000000000..8484ae6c31da0c7c0e1c068f99230bf9d8f221a9 --- /dev/null +++ b/roncoo-education-user/roncoo-education-user-feign/src/main/java/com/roncoo/education/user/feign/interfaces/IFeignUsers.java @@ -0,0 +1,38 @@ +package com.roncoo.education.user.feign.interfaces; + +import com.roncoo.education.user.feign.interfaces.vo.UsersVO; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; +import java.util.Map; + +/** + * 讲师信息 接口 + * + * @author wujing + * @date 2022-08-27 + */ +@FeignClient(value = "user-service", path = "/user/users") +public interface IFeignUsers { + /** + * 根据ID获取信息 + * + * @param id 主键ID + * @return 讲师信息 + */ + @GetMapping(value = "/get/{id}") + UsersVO getById(@PathVariable(value = "id") Long id); + + /** + * 根据ID集合获取集合 + * + * @param userIdList + * @return + */ + @PostMapping(value = "/listByIds") + Map listByIds(@RequestBody List userIdList); +} diff --git a/roncoo-education-user/roncoo-education-user-feign/src/main/java/com/roncoo/education/user/feign/interfaces/vo/UsersVO.java b/roncoo-education-user/roncoo-education-user-feign/src/main/java/com/roncoo/education/user/feign/interfaces/vo/UsersVO.java new file mode 100644 index 0000000000000000000000000000000000000000..842e24016d000bec20f806c303c67a36e26755b6 --- /dev/null +++ b/roncoo-education-user/roncoo-education-user-feign/src/main/java/com/roncoo/education/user/feign/interfaces/vo/UsersVO.java @@ -0,0 +1,57 @@ +package com.roncoo.education.user.feign.interfaces.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * ADMIN-用户信息 + *

+ * + * @author wujing + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "AdminUsersViewResp", description = "ADMIN-用户信息查看") +public class UsersVO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Long id; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间") + private LocalDateTime gmtCreate; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "修改时间") + private LocalDateTime gmtModified; + + @ApiModelProperty(value = "状态(1:正常,0:禁用)") + private Integer statusId; + + @ApiModelProperty(value = "手机号码") + private String mobile; + + @ApiModelProperty(value = "昵称") + private String nickname; + + @ApiModelProperty(value = "用户性别(1男,2女,3保密)") + private Integer userSex; + + @ApiModelProperty(value = "用户年龄") + private Integer userAge; + + @ApiModelProperty(value = "用户头像") + private String userHead; + + @ApiModelProperty(value = "备注") + private String remark; +} diff --git a/roncoo-education-user/roncoo-education-user-service/src/main/java/com/roncoo/education/user/feign/FeignUsersController.java b/roncoo-education-user/roncoo-education-user-service/src/main/java/com/roncoo/education/user/feign/FeignUsersController.java new file mode 100644 index 0000000000000000000000000000000000000000..29ef022f38d2d3e2eed5c140a9f5e9e3cf343b17 --- /dev/null +++ b/roncoo-education-user/roncoo-education-user-service/src/main/java/com/roncoo/education/user/feign/FeignUsersController.java @@ -0,0 +1,40 @@ +package com.roncoo.education.user.feign; + +import com.roncoo.education.common.service.BaseController; +import com.roncoo.education.user.feign.biz.FeignUsersBiz; +import com.roncoo.education.user.feign.interfaces.IFeignUsers; +import com.roncoo.education.user.feign.interfaces.vo.UsersVO; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.Map; + +/** + * 讲师信息 + * + * @author wujing + * @date 2022-08-27 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/user/lecturer") +public class FeignUsersController extends BaseController implements IFeignUsers { + + @NotNull + private final FeignUsersBiz biz; + + @Override + public UsersVO getById(@PathVariable(value = "id") Long id) { + return biz.getById(id); + } + + @Override + public Map listByIds(@RequestBody List userIdList) { + return biz.listByIds(userIdList); + } +} diff --git a/roncoo-education-user/roncoo-education-user-service/src/main/java/com/roncoo/education/user/feign/biz/FeignUsersBiz.java b/roncoo-education-user/roncoo-education-user-service/src/main/java/com/roncoo/education/user/feign/biz/FeignUsersBiz.java new file mode 100644 index 0000000000000000000000000000000000000000..38b67a66a2b79723cdca59bcc22e3eadad568abd --- /dev/null +++ b/roncoo-education-user/roncoo-education-user-service/src/main/java/com/roncoo/education/user/feign/biz/FeignUsersBiz.java @@ -0,0 +1,43 @@ +package com.roncoo.education.user.feign.biz; + + +import cn.hutool.core.collection.CollUtil; +import com.roncoo.education.common.core.tools.BeanUtil; +import com.roncoo.education.common.service.BaseBiz; +import com.roncoo.education.user.dao.UsersDao; +import com.roncoo.education.user.dao.impl.mapper.entity.Users; +import com.roncoo.education.user.feign.interfaces.vo.UsersVO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import javax.validation.constraints.NotNull; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 讲师信息 + * + * @author wujing + */ +@Component +@RequiredArgsConstructor +public class FeignUsersBiz extends BaseBiz { + + @NotNull + private final UsersDao dao; + + public UsersVO getById(Long id) { + Users record = dao.getById(id); + return BeanUtil.copyProperties(record, UsersVO.class); + } + + public Map listByIds(List userIdList) { + List usersList = dao.listByIds(userIdList); + if (CollUtil.isNotEmpty(usersList)) { + return usersList.stream().collect(Collectors.toMap(item -> item.getId(), item -> BeanUtil.copyProperties(item, UsersVO.class))); + } + return new HashMap<>(); + } +}