提交 7d0d4347 编写于 作者: F fengyw

增加课程用户学习统计

上级 ca527d0b
......@@ -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<UserStudy> listByUserIdAndCourseIdsForMax(Long userId, List<Long> courseIdList);
/**
* 获取当前学习的课程的最新课时
*
* @param userId
* @param courseId
* @return
*/
UserStudy getByCourseIdForLast(Long userId, Long courseId);
/**
* 获取指定课程的课时进度总和
*
* @param userId
* @param courseIdList
* @return
*/
List<UserStudy> listByUserIdAndCourseIdsForSumProgress(Long userId, List<Long> courseIdList);
List<UserStudy> listByUserIdAndCourseId(Long userId, Long courseId);
/**
* 获取指定课程的课时进度总和
*
* @param courseId
* @param userIdList
* @return
*/
List<UserStudy> listByCourseIdAndUserIdsForSumProgress(Long courseId, List<Long> userIdList);
/**
* 获取集合
*
* @param userId
* @param courseId
* @return
*/
List<UserStudy> listByUserIdAndCourseId(Long userId, Long courseId);
/**
* 删除
*
* @param periodId
* @return
*/
int deleteByPeriodId(Long periodId);
}
......@@ -118,6 +118,15 @@ public class UserStudyDaoImpl extends AbstractBaseJdbc implements UserStudyDao {
return namedParameterJdbcTemplate.query(sql, map, new BeanPropertyRowMapper<>(UserStudy.class));
}
@Override
public List<UserStudy> listByCourseIdAndUserIdsForSumProgress(Long courseId, List<Long> 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<String, Object> map = new HashMap();
map.put("COURSEID", courseId);
map.put("USERIDS", userIdList);
return namedParameterJdbcTemplate.query(sql, map, new BeanPropertyRowMapper<>(UserStudy.class));
}
@Override
public List<UserStudy> listByUserIdAndCourseId(Long userId, Long courseId) {
UserStudyExample example = new UserStudyExample();
......
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<AdminUserCoursePageResp>> 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<UserCourse> page = dao.page(req.getPageCurrent(), req.getPageSize(), example);
Page<AdminUserCoursePageResp> 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<Long> userIdList = respPage.getList().stream().map(item -> item.getUserId()).collect(Collectors.toList());
Map<Long, UsersVO> usersVOMap = feignUsers.listByIds(userIdList);
List<UserStudy> userStudyList = userStudyDao.listByCourseIdAndUserIdsForSumProgress(req.getCourseId(), userIdList);
Map<Long, BigDecimal> 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);
}
......
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;
/**
* <p>
......@@ -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;
......
......@@ -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;
}
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<Long, UsersVO> listByIds(@RequestBody List<Long> userIdList);
}
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;
/**
* <p>
* ADMIN-用户信息
* </p>
*
* @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;
}
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<Long, UsersVO> listByIds(@RequestBody List<Long> userIdList) {
return biz.listByIds(userIdList);
}
}
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<Long, UsersVO> listByIds(List<Long> userIdList) {
List<Users> 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<>();
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册