Commit 101b2ce6 authored by liuyang's avatar liuyang

update

parent bb915ade
...@@ -30,9 +30,13 @@ public class CourseConsumeRecordPO { ...@@ -30,9 +30,13 @@ public class CourseConsumeRecordPO {
private Long userId; private Long userId;
/** /**
* 观看时长(秒) * 本次观看时长(秒)
*/ */
private Integer watchTime; private Long watchTime;
/**
* 观看到视频的时间
*/
private Long videoTime;
/** /**
* 课程ID * 课程ID
...@@ -50,6 +54,8 @@ public class CourseConsumeRecordPO { ...@@ -50,6 +54,8 @@ public class CourseConsumeRecordPO {
@ApiModelProperty(example = "1619423186000") @ApiModelProperty(example = "1619423186000")
@TableField(fill = FieldFill.INSERT_UPDATE) @TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime; private LocalDateTime updateTime;
@TableLogic
private Boolean isDel;
} }
package com.qkdata.biz.management.mapper; package com.qkdata.biz.management.mapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qkdata.biz.management.entity.CourseConsumeRecordPO; import com.qkdata.biz.management.entity.CourseConsumeRecordPO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qkdata.biz.web.vo.CourseConsumeRecordModel;
import com.qkdata.biz.web.vo.QueryConsumeRecordModel;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/** /**
* <p> * <p>
...@@ -15,4 +21,7 @@ import org.apache.ibatis.annotations.Mapper; ...@@ -15,4 +21,7 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface CourseConsumeRecordMapper extends BaseMapper<CourseConsumeRecordPO> { public interface CourseConsumeRecordMapper extends BaseMapper<CourseConsumeRecordPO> {
CourseConsumeRecordModel queryUserCourseRecord(@Param("userId") Long userId, @Param("courseId") Long courseId);
List<CourseConsumeRecordModel> queryUserRecordPage(Page page, @Param("p") QueryConsumeRecordModel model);
} }
...@@ -5,6 +5,7 @@ import com.qkdata.biz.management.entity.OrgSurplusPO; ...@@ -5,6 +5,7 @@ import com.qkdata.biz.management.entity.OrgSurplusPO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qkdata.biz.web.vo.OrgCourseSurplusModel; import com.qkdata.biz.web.vo.OrgCourseSurplusModel;
import com.qkdata.biz.web.vo.QueryOrgCourseSurplusModel; import com.qkdata.biz.web.vo.QueryOrgCourseSurplusModel;
import com.qkdata.common.base.model.Result;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
...@@ -22,4 +23,6 @@ import java.util.List; ...@@ -22,4 +23,6 @@ import java.util.List;
public interface OrgSurplusMapper extends BaseMapper<OrgSurplusPO> { public interface OrgSurplusMapper extends BaseMapper<OrgSurplusPO> {
List<OrgCourseSurplusModel> queryCourseSurplusPageList(Page page, @Param("p") QueryOrgCourseSurplusModel model); List<OrgCourseSurplusModel> queryCourseSurplusPageList(Page page, @Param("p") QueryOrgCourseSurplusModel model);
OrgCourseSurplusModel queryCourseSurplus(@Param("orgId") Long orgId, @Param("courseId") Long courseId);
} }
package com.qkdata.biz.management.service; package com.qkdata.biz.management.service;
import cn.hutool.core.util.StrUtil;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.vod.model.v20170321.GetVideoInfoResponse;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qkdata.aliyun.service.AliyunService;
import com.qkdata.biz.management.entity.CourseChapterPO;
import com.qkdata.biz.management.entity.CourseConsumeRecordPO; import com.qkdata.biz.management.entity.CourseConsumeRecordPO;
import com.qkdata.biz.management.entity.CoursePO;
import com.qkdata.biz.management.entity.ResourcePO;
import com.qkdata.biz.management.mapper.CourseChapterMapper;
import com.qkdata.biz.management.mapper.CourseConsumeRecordMapper; import com.qkdata.biz.management.mapper.CourseConsumeRecordMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qkdata.biz.web.vo.CourseConsumeRecordModel;
import com.qkdata.biz.web.vo.QueryConsumeRecordModel;
import com.qkdata.biz.web.vo.SaveConsumeRecord;
import com.qkdata.common.base.enums.CodeEnum;
import com.qkdata.common.base.model.PageResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
/** /**
* <p> * <p>
* $!{table.comment} 服务类 * $!{table.comment} 服务类
...@@ -13,7 +34,85 @@ import org.springframework.stereotype.Service; ...@@ -13,7 +34,85 @@ import org.springframework.stereotype.Service;
* @author liuyang * @author liuyang
* @since 2021-06-09 * @since 2021-06-09
*/ */
@Slf4j
@Service @Service
public class CourseConsumeRecordService extends ServiceImpl<CourseConsumeRecordMapper, CourseConsumeRecordPO> { public class CourseConsumeRecordService extends ServiceImpl<CourseConsumeRecordMapper, CourseConsumeRecordPO> {
@Autowired
private AliyunService aliyunService;
@Autowired
@Qualifier("objectRedisTemplate")
private RedisTemplate redisTemplate;
@Autowired
private CourseService courseService;
@Autowired
private CourseChapterMapper chapterMapper;
@Autowired
private ResourceService resourceService;
public void removeBatch(List<Long> ids) {
for (Long id : ids){
CourseConsumeRecordPO po = getById(id);
if (po != null){
remove(Wrappers.<CourseConsumeRecordPO>lambdaQuery()
.eq(CourseConsumeRecordPO::getUserId,po.getUserId())
.eq(CourseConsumeRecordPO::getCourseId,po.getCourseId())
.eq(CourseConsumeRecordPO::getChapterId,po.getChapterId()));
}
}
}
public CourseConsumeRecordModel findUserCourseRecord(Long userId, Long courseId) {
//先从缓存取用户观看记录
String key = "record_"+userId+"_"+courseId;
CourseConsumeRecordModel model = null;
if (redisTemplate.hasKey(key)){
SaveConsumeRecord userRecord = (SaveConsumeRecord) redisTemplate.opsForValue().get(key);
model = new CourseConsumeRecordModel();
model.setId(userRecord.getUuid());
model.setUserId(userId);
model.setCourseId(courseId);
model.setChapterId(userRecord.getChaperId());
model.setWatchTime(userRecord.getLearnDuration());
model.setVideoTime(userRecord.getVideoDuration());
model.setUpdateTime(userRecord.getStartTime());
CoursePO coursePO = courseService.getById(courseId);
model.setCourseName(coursePO.getName());
model.setCourseStatus(coursePO.getStatus());
CourseChapterPO chapterPO = chapterMapper.selectById(userRecord.getChaperId());
model.setChapterId(chapterPO.getId());
model.setChapterName(chapterPO.getName());
ResourcePO resourcePO = resourceService.getById(chapterPO.getResourceId());
model.setVideoId(resourcePO.getVideoId());
model.setUpdateTime(userRecord.getStartTime());
appendChapterShapshot(model);
}else {
model = baseMapper.queryUserCourseRecord(userId,courseId);
appendChapterShapshot(model);
}
return model;
}
private void appendChapterShapshot(CourseConsumeRecordModel model) {
String videoId = model.getVideoId();
if (StrUtil.isNotBlank(videoId)){
try {
GetVideoInfoResponse response = aliyunService.getVideoInfo(videoId);
String url = response.getVideo().getCoverURL();
model.setLogoUrl(url);
} catch (ClientException e) {
log.error(e.getMessage(),e);
}
}
}
public PageResult<CourseConsumeRecordModel> queryUserRecordPageList(QueryConsumeRecordModel model) {
Page page = new Page(model.getPageIndex(),model.getPageSize());
List<CourseConsumeRecordModel> list = baseMapper.queryUserRecordPage(page,model);
for (CourseConsumeRecordModel record : list){
appendChapterShapshot(record);
}
return PageResult.<CourseConsumeRecordModel>builder().code(CodeEnum.SUCCESS.getCode()).count(page.getTotal()).data(list).build();
}
} }
\ No newline at end of file
...@@ -11,6 +11,7 @@ import com.qkdata.biz.web.vo.QueryOrgCourseSurplusModel; ...@@ -11,6 +11,7 @@ import com.qkdata.biz.web.vo.QueryOrgCourseSurplusModel;
import com.qkdata.common.base.enums.CodeEnum; import com.qkdata.common.base.enums.CodeEnum;
import com.qkdata.common.base.exception.BusinessException; import com.qkdata.common.base.exception.BusinessException;
import com.qkdata.common.base.model.PageResult; import com.qkdata.common.base.model.PageResult;
import com.qkdata.common.base.model.Result;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
...@@ -77,4 +78,8 @@ public class OrgSurplusService extends ServiceImpl<OrgSurplusMapper, OrgSurplusP ...@@ -77,4 +78,8 @@ public class OrgSurplusService extends ServiceImpl<OrgSurplusMapper, OrgSurplusP
.eq(OrgSurplusPO::getCourseId,courseId) .eq(OrgSurplusPO::getCourseId,courseId)
.eq(OrgSurplusPO::getProductType,ProductTypeEnum.ENTERPRISE_COURSE_BUY)); .eq(OrgSurplusPO::getProductType,ProductTypeEnum.ENTERPRISE_COURSE_BUY));
} }
public OrgCourseSurplusModel findCourseSurplus(Long orgId, Long courseId) {
return baseMapper.queryCourseSurplus(orgId,courseId);
}
} }
\ No newline at end of file
...@@ -30,7 +30,7 @@ public class TimeTaskService { ...@@ -30,7 +30,7 @@ public class TimeTaskService {
/** /**
* 每30分钟执行一次 * 每30分钟执行一次
*/ */
@Scheduled(cron = "0 */30 * * * ?") @Scheduled(cron = "0 */5 * * * ?")
public void saveConsumeRecord(){ public void saveConsumeRecord(){
log.debug("TimeTaskService saveConsumeRecord excute start================="); log.debug("TimeTaskService saveConsumeRecord excute start=================");
Set<String> keys = redisTemplate.opsForHash().keys(BizConstants.CACHE_KE_CONSUME_RECORD); Set<String> keys = redisTemplate.opsForHash().keys(BizConstants.CACHE_KE_CONSUME_RECORD);
......
...@@ -16,6 +16,10 @@ public class MemberListModel { ...@@ -16,6 +16,10 @@ public class MemberListModel {
* 用户帐号 * 用户帐号
*/ */
private String username; private String username;
/**
* 姓名
*/
private String name;
/** /**
* 用户昵称 * 用户昵称
*/ */
......
...@@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.RequestMapping; ...@@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;
@Api(tags = "课程消耗记录") @Api(tags = "课程消耗记录")
@RestController @RestController
...@@ -33,10 +34,13 @@ public class CourseConsumeRecordController { ...@@ -33,10 +34,13 @@ public class CourseConsumeRecordController {
@RequiresRoles(value = {BizConstants.ROLE_USER,BizConstants.ROLE_ENTERPRISE_ADMIN},logical = Logical.OR) @RequiresRoles(value = {BizConstants.ROLE_USER,BizConstants.ROLE_ENTERPRISE_ADMIN},logical = Logical.OR)
@SysLog("记录课程消耗记录") @SysLog("记录课程消耗记录")
public Result<String> save(@RequestBody SaveConsumeRecord model){ public Result<String> save(@RequestBody SaveConsumeRecord model){
//缓存用户观看记录
redisTemplate.opsForValue().set("record_"+UserContext.getUserId()+"_"+model.getCourseId(),model, 5,TimeUnit.MINUTES);
//缓存课程观看记录
if(redisTemplate.opsForHash().hasKey(BizConstants.CACHE_KE_CONSUME_RECORD,model.getUuid())){ if(redisTemplate.opsForHash().hasKey(BizConstants.CACHE_KE_CONSUME_RECORD,model.getUuid())){
CourseConsumeRecordPO cacheModel = (CourseConsumeRecordPO) redisTemplate.opsForHash().get(BizConstants.CACHE_KE_CONSUME_RECORD,model.getUuid()); CourseConsumeRecordPO cacheModel = (CourseConsumeRecordPO) redisTemplate.opsForHash().get(BizConstants.CACHE_KE_CONSUME_RECORD,model.getUuid());
cacheModel.setWatchTime(model.getLearnDuration()); cacheModel.setWatchTime(model.getLearnDuration());
cacheModel.setVideoTime(model.getVideoDuration());
redisTemplate.opsForHash().put(BizConstants.CACHE_KE_CONSUME_RECORD,cacheModel.getId(),cacheModel); redisTemplate.opsForHash().put(BizConstants.CACHE_KE_CONSUME_RECORD,cacheModel.getId(),cacheModel);
}else { }else {
CourseConsumeRecordPO po = new CourseConsumeRecordPO(); CourseConsumeRecordPO po = new CourseConsumeRecordPO();
...@@ -45,9 +49,11 @@ public class CourseConsumeRecordController { ...@@ -45,9 +49,11 @@ public class CourseConsumeRecordController {
po.setCourseId(model.getCourseId()); po.setCourseId(model.getCourseId());
po.setChapterId(model.getChaperId()); po.setChapterId(model.getChaperId());
po.setWatchTime(model.getLearnDuration()); po.setWatchTime(model.getLearnDuration());
po.setCreateTime(LocalDateTime.now()); po.setVideoTime(model.getVideoDuration());
po.setCreateTime(model.getStartTime());
redisTemplate.opsForHash().put(BizConstants.CACHE_KE_CONSUME_RECORD,po.getId(),po); redisTemplate.opsForHash().put(BizConstants.CACHE_KE_CONSUME_RECORD,po.getId(),po);
} }
return Result.succeed("ok"); return Result.succeed("ok");
} }
......
...@@ -94,6 +94,15 @@ public class MyEnterpriseController { ...@@ -94,6 +94,15 @@ public class MyEnterpriseController {
model.setOrgId(orgId); model.setOrgId(orgId);
return orgSurplusService.queryCourseSurplusPageList(model); return orgSurplusService.queryCourseSurplusPageList(model);
} }
@ApiOperation("获取企业购买的单个课程余额")
@GetMapping("/orgCourseSurplus")
@RequiresRoles(value = {BizConstants.ROLE_USER,BizConstants.ROLE_ENTERPRISE_ADMIN},logical = Logical.OR)
@SysLog("获取企业购买的单个课程余额")
public Result<OrgCourseSurplusModel> orgCourseSurplus(@RequestParam Long courseId){
Long orgId = userService.getUserEnterpriesId(UserContext.getUserId());
OrgCourseSurplusModel model = orgSurplusService.findCourseSurplus(orgId,courseId);
return Result.succeed(model);
}
@ApiOperation("企业成员领取会员") @ApiOperation("企业成员领取会员")
@GetMapping("/receiveVIP") @GetMapping("/receiveVIP")
...@@ -104,10 +113,10 @@ public class MyEnterpriseController { ...@@ -104,10 +113,10 @@ public class MyEnterpriseController {
return Result.succeed("ok"); return Result.succeed("ok");
} }
@ApiOperation("企业成员领取企业购买课程") @ApiOperation("企业成员领取企业购买课程")
@GetMapping("/receiveCourse/{courseId}") @GetMapping("/receiveCourse")
@RequiresRoles(value = {BizConstants.ROLE_USER,BizConstants.ROLE_ENTERPRISE_ADMIN},logical = Logical.OR) @RequiresRoles(value = {BizConstants.ROLE_USER,BizConstants.ROLE_ENTERPRISE_ADMIN},logical = Logical.OR)
@SysLog("领取企业购买课程") @SysLog("领取企业购买课程")
public Result<String> receiveCourse(@PathVariable Long courseId){ public Result<String> receiveCourse(@RequestParam Long courseId){
userService.receiveOrgCourse(courseId); userService.receiveOrgCourse(courseId);
return Result.succeed("ok"); return Result.succeed("ok");
} }
...@@ -157,12 +166,10 @@ public class MyEnterpriseController { ...@@ -157,12 +166,10 @@ public class MyEnterpriseController {
return Result.succeed(memberInfo); return Result.succeed(memberInfo);
} }
@ApiOperation("企业成员领取记录") @ApiOperation("企业成员领取记录")
@GetMapping("/member/receive/record") @PostMapping("/member/receive/record")
@RequiresRoles(value = BizConstants.ROLE_ENTERPRISE_ADMIN) @RequiresRoles(value = BizConstants.ROLE_ENTERPRISE_ADMIN)
@SysLog("企业成员领取记录") @SysLog("企业成员领取记录")
public PageResult<OrgUserReceiveRecordModel> memberReceiveRecord(@RequestParam Long memberId){ public PageResult<OrgUserReceiveRecordModel> memberReceiveRecord(@RequestBody QueryReceiveHistoryModel query){
QueryReceiveHistoryModel query = new QueryReceiveHistoryModel();
query.setUserId(memberId);
return orgUserReceiveRecordService.queryPageList(query); return orgUserReceiveRecordService.queryPageList(query);
} }
...@@ -214,11 +221,16 @@ public class MyEnterpriseController { ...@@ -214,11 +221,16 @@ public class MyEnterpriseController {
public Result<String> addMember(@RequestBody @Validated AddMemberModel model){ public Result<String> addMember(@RequestBody @Validated AddMemberModel model){
Long orgId = userService.getUserEnterpriesId(UserContext.getUserId()); Long orgId = userService.getUserEnterpriesId(UserContext.getUserId());
MemberInfoModel memberInfo = new MemberInfoModel(); MemberInfoModel memberInfo = new MemberInfoModel();
memberInfo.setUsername(model.getMobile()); memberInfo.setUsername(model.getUsername());
memberInfo.setName(model.getName()); memberInfo.setName(model.getName());
memberInfo.setEnterpriseId(orgId); memberInfo.setEnterpriseId(orgId);
memberInfo.setType(AccountTypeEnum.ENTERPRISE_VIP); memberInfo.setType(AccountTypeEnum.ENTERPRISE_VIP);
List<String> roleCodeList = Lists.newArrayList(BizConstants.ROLE_USER); List<String> roleCodeList = Lists.newArrayList();
if (model.isManager()){
roleCodeList.add(BizConstants.ROLE_ENTERPRISE_ADMIN);
}else {
roleCodeList.add(BizConstants.ROLE_USER);
}
memberInfo.setRoleCodeList(roleCodeList); memberInfo.setRoleCodeList(roleCodeList);
memberService.save(memberInfo); memberService.save(memberInfo);
return Result.succeed("ok"); return Result.succeed("ok");
...@@ -235,7 +247,7 @@ public class MyEnterpriseController { ...@@ -235,7 +247,7 @@ public class MyEnterpriseController {
memberService.remove(userId); memberService.remove(userId);
return Result.succeed("ok"); return Result.succeed("ok");
} }
@ApiOperation("修改成员信息") @ApiOperation("修改企业成员信息")
@PostMapping("/member/modify") @PostMapping("/member/modify")
@RequiresRoles(value = {BizConstants.ROLE_ENTERPRISE_ADMIN}) @RequiresRoles(value = {BizConstants.ROLE_ENTERPRISE_ADMIN})
@SysLog("修改成员信息") @SysLog("修改成员信息")
......
package com.qkdata.biz.web.controller; package com.qkdata.biz.web.controller;
import com.aliyuncs.vod.model.v20170321.GetVideoPlayAuthResponse; import com.aliyuncs.vod.model.v20170321.GetVideoPlayAuthResponse;
import com.google.common.collect.Lists;
import com.qkdata.biz.common.BizConstants; import com.qkdata.biz.common.BizConstants;
import com.qkdata.biz.management.service.CourseConsumeRecordService;
import com.qkdata.biz.management.service.CourseService; import com.qkdata.biz.management.service.CourseService;
import com.qkdata.biz.management.service.ProductOrderService; import com.qkdata.biz.management.service.ProductOrderService;
import com.qkdata.biz.management.vo.ProductOrderModel; import com.qkdata.biz.management.vo.ProductOrderModel;
...@@ -35,6 +37,8 @@ public class UserCenterController { ...@@ -35,6 +37,8 @@ public class UserCenterController {
private CourseService courseService; private CourseService courseService;
@Autowired @Autowired
private ProductOrderService orderService; private ProductOrderService orderService;
@Autowired
private CourseConsumeRecordService courseConsumeRecordService;
@ApiOperation("获取个人信息") @ApiOperation("获取个人信息")
@GetMapping("/userInfo") @GetMapping("/userInfo")
...@@ -118,4 +122,29 @@ public class UserCenterController { ...@@ -118,4 +122,29 @@ public class UserCenterController {
return orderService.queryPageList(model); return orderService.queryPageList(model);
} }
@ApiOperation("用户观看记录列表")
@PostMapping("/consumeRecord/list")
@RequiresRoles(value = {BizConstants.ROLE_USER,BizConstants.ROLE_ENTERPRISE_ADMIN},logical = Logical.OR)
@SysLog("用户观看记录列表")
public PageResult<CourseConsumeRecordModel> consumeRecordList(@RequestBody QueryConsumeRecordModel model){
model.setUserId(UserContext.getUserId());
return courseConsumeRecordService.queryUserRecordPageList(model);
}
@ApiOperation("删除观看记录列表")
@PostMapping("/consumeRecord/delete")
@RequiresRoles(value = {BizConstants.ROLE_USER,BizConstants.ROLE_ENTERPRISE_ADMIN},logical = Logical.OR)
@SysLog("删除观看记录列表")
public Result<String> consumeRecordList(@RequestBody List<Long> ids){
courseConsumeRecordService.removeBatch(ids);
return Result.succeed("ok");
}
@ApiOperation("用户观看某课程的记录")
@GetMapping("/user/consumeRecord")
@RequiresRoles(value = {BizConstants.ROLE_USER,BizConstants.ROLE_ENTERPRISE_ADMIN},logical = Logical.OR)
@SysLog("用户观看某课程的记录")
public Result<CourseConsumeRecordModel> consumeRecordList(@RequestParam Long courseId){
CourseConsumeRecordModel model = courseConsumeRecordService.findUserCourseRecord(UserContext.getUserId(),courseId);
return Result.succeed(model);
}
} }
...@@ -10,6 +10,7 @@ import javax.validation.constraints.Pattern; ...@@ -10,6 +10,7 @@ import javax.validation.constraints.Pattern;
public class AddMemberModel { public class AddMemberModel {
@NotBlank(message = "手机号不能为空") @NotBlank(message = "手机号不能为空")
@Pattern(regexp = ValidatorPattern.MOBILE_PATTERN, message = "手机号格式不正确") @Pattern(regexp = ValidatorPattern.MOBILE_PATTERN, message = "手机号格式不正确")
private String mobile; private String username;
private String name; private String name;
private boolean manager;
} }
package com.qkdata.biz.web.vo;
import com.qkdata.biz.enums.CourseStatusEnum;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class CourseConsumeRecordModel {
/**
* 记录ID
*/
private String id;
/**
* 用户ID
*/
private Long userId;
/**
* 课程ID
*/
private Long courseId;
/**
* 课程名称
*/
private String courseName;
/**
* 章节ID
*/
private Long chapterId;
/**
* 章节名称
*/
private String chapterName;
/**
* 本次看时长(秒)
*/
private Long watchTime;
/**
* 观看到视频的时间(秒)
*/
private Long videoTime;
/**
* 课程状态
*/
private CourseStatusEnum courseStatus;
/**
* 视频快照url
*/
private String logoUrl;
/**
* 最后观看时间
*/
private LocalDateTime updateTime;
/**
* 视频ID
*/
private String videoId;
}
package com.qkdata.biz.web.vo;
import com.qkdata.common.constants.Constants;
import lombok.Data;
@Data
public class QueryConsumeRecordModel {
private int pageIndex = Constants.DEFAULT_PAGE;
private int pageSize = Constants.DEFAULT_PAGE_SIZE;
private Long userId;
}
...@@ -22,9 +22,13 @@ public class SaveConsumeRecord { ...@@ -22,9 +22,13 @@ public class SaveConsumeRecord {
*/ */
private Long chaperId; private Long chaperId;
/** /**
* 本次观看累记时长 * 本次观看累记时长(秒)
*/ */
private int learnDuration; private Long learnDuration;
/**
* 视频观看到的时间(秒)
*/
private Long videoDuration;
/** /**
* 开始观看时间 * 开始观看时间
*/ */
......
ALTER TABLE `course_consume_record`
ADD COLUMN `is_del` tinyint(1) NULL AFTER `update_time`;
\ No newline at end of file
ALTER TABLE `course_consume_record`
MODIFY COLUMN `watch_time` bigint(20) NULL DEFAULT NULL COMMENT '本次观看时长(秒)' AFTER `user_id`,
ADD COLUMN `video_time` bigint(20) NULL COMMENT '观看到视频的时间' AFTER `watch_time`;
\ No newline at end of file
ALTER TABLE `course_consume_record`
MODIFY COLUMN `is_del` tinyint(1) NULL DEFAULT 0 AFTER `update_time`;
\ No newline at end of file
...@@ -2,4 +2,51 @@ ...@@ -2,4 +2,51 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qkdata.biz.management.mapper.CourseConsumeRecordMapper"> <mapper namespace="com.qkdata.biz.management.mapper.CourseConsumeRecordMapper">
<select id="queryUserCourseRecord" resultType="com.qkdata.biz.web.vo.CourseConsumeRecordModel">
SELECT r.id,
r.user_id,
r.course_id,
c.`name` course_name,
r.chapter_id,
chapter.`name` chapter_name,
r.watch_time,
r.video_time,
c.`status` course_status,
r.update_time,
res.video_id
from course_consume_record r
INNER JOIN course c on r.course_id = c.id
INNER JOIN course_chapter chapter on chapter.id = r.chapter_id
INNER JOIN resource res ON res.id = chapter.resource_id
WHERE r.is_del = 0
and r.user_id = #{userId}
and r.course_id = #{courseId}
ORDER BY c.update_time DESC
LIMIT 1
</select>
<select id="queryUserRecordPage" resultType="com.qkdata.biz.web.vo.CourseConsumeRecordModel">
SELECT r.id,
r.user_id,
r.course_id,
c.`name` course_name,
r.chapter_id,
chapter.`name` chapter_name,
r.watch_time,
r.video_time,
c.`status` course_status,
r.update_time,
res.video_id
FROM (
SELECT *
from course_consume_record
GROUP BY user_id,course_id
HAVING MAX(update_time)
) r
INNER JOIN course c on r.course_id = c.id
INNER JOIN course_chapter chapter on chapter.id = r.chapter_id
INNER JOIN resource res ON res.id = chapter.resource_id
WHERE r.is_del = 0
and r.user_id = #{p.userId}
ORDER BY r.update_time DESC
</select>
</mapper> </mapper>
...@@ -11,4 +11,14 @@ ...@@ -11,4 +11,14 @@
INNER JOIN course c ON s.course_id = c.id INNER JOIN course c ON s.course_id = c.id
WHERE s.org_id = #{p.orgId} WHERE s.org_id = #{p.orgId}
</select> </select>
<select id="queryCourseSurplus" resultType="com.qkdata.biz.web.vo.OrgCourseSurplusModel">
SELECT c.id course_id,
c.`name` course_name,
c.logo_url,
s.count
from org_surplus s
INNER JOIN course c ON s.course_id = c.id
WHERE s.org_id = #{orgId}
and s.course_id = #{courseId}
</select>
</mapper> </mapper>
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
u.create_time, u.create_time,
u.`status`, u.`status`,
e.type, e.type,
e.`name`,
e.enterprise_id, e.enterprise_id,
o.`name` enterprise_name, o.`name` enterprise_name,
u.last_login_time, u.last_login_time,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment